[
  {
    "path": "Builds/BaseLibrary/Editor/Shaders/DefaultShader.shader",
    "content": "﻿Shader \"SPEditor/DefaultShader\"\r\n{\r\n\tSubShader {\r\n\t\tPass {\r\n\t\t\tBindChannels{\r\n\t\t\t\tBind \"Color\", color\r\n\t\t\t}\r\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha\r\n\t\t\tZWrite Off\r\n\t\t\tCull Off\r\n\t\t\tFog { Mode Off }\r\n\t\t\tColor(1, 1, 1, 1)\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Builds/BaseLibrary/Editor/Shaders/DefaultShader.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 74100f29a6376b840b08443c31390238\ntimeCreated: 1456266554\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Builds/BaseLibrary/Editor/Shaders/LineShader.shader",
    "content": "﻿Shader \"SPEditor/LineShader\"\n{\n\tSubShader {\n\t\tPass {\n\t\t\tBindChannels {\n\t\t\t\tBind \"Color\", color\n\t\t\t}\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha\n\t\t\tZWrite Off\n\t\t\tCull Off\n\t\t\tFog { Mode Off }\n\t\t}\n\t}\n}"
  },
  {
    "path": "Builds/BaseLibrary/Editor/Shaders/LineShader.shader.meta",
    "content": "fileFormatVersion: 2\nguid: b866cfca3124ac24db28c589ed538231\ntimeCreated: 1456266573\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Builds/FullLibrary/Editor/Shaders/DefaultShader.shader",
    "content": "﻿Shader \"SPEditor/DefaultShader\"\r\n{\r\n\tSubShader {\r\n\t\tPass {\r\n\t\t\tBindChannels{\r\n\t\t\t\tBind \"Color\", color\r\n\t\t\t}\r\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha\r\n\t\t\tZWrite Off\r\n\t\t\tCull Off\r\n\t\t\tFog { Mode Off }\r\n\t\t\tColor(1, 1, 1, 1)\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Builds/FullLibrary/Editor/Shaders/DefaultShader.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 74100f29a6376b840b08443c31390238\ntimeCreated: 1456266554\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Builds/FullLibrary/Editor/Shaders/LineShader.shader",
    "content": "﻿Shader \"SPEditor/LineShader\"\n{\n\tSubShader {\n\t\tPass {\n\t\t\tBindChannels {\n\t\t\t\tBind \"Color\", color\n\t\t\t}\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha\n\t\t\tZWrite Off\n\t\t\tCull Off\n\t\t\tFog { Mode Off }\n\t\t}\n\t}\n}"
  },
  {
    "path": "Builds/FullLibrary/Editor/Shaders/LineShader.shader.meta",
    "content": "fileFormatVersion: 2\nguid: b866cfca3124ac24db28c589ed538231\ntimeCreated: 1456266573\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Builds/FullLibrary/Editor/Shaders/VisualAspectShader.shader",
    "content": "﻿Shader \"SPEditor/VisualAspectShader\"\r\n{\r\n    SubShader\r\n    {\r\n\t\tBlend SrcAlpha OneMinusSrcAlpha\r\n\t\tZTest Off\r\n\t\tZWrite Off\r\n\t\tPass\r\n\t\t{\r\n\t\t\tCGPROGRAM\r\n\t\t\t\r\n\t\t\t#pragma vertex vert\r\n\t\t\t#pragma fragment frag\r\n\t\t\t\r\n\t\t\t#include \"UnityCG.cginc\"\r\n\t\r\n\t\t\tfloat4 _colorSolid;\r\n\t\t\tfloat _colorAlpha;\r\n\t\t\t\r\n\t\t\tstruct vert_out\r\n\t\t\t{\r\n\t\t\t\tfloat4 position : POSITION;\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tvert_out vert(appdata_base v)\r\n\t\t\t{\r\n\t\t\t\tvert_out tOut;\r\n\t\t\t\ttOut.position = mul(UNITY_MATRIX_MVP, v.vertex);\r\n\t\t\t\t\r\n\t\t\t\treturn tOut;\r\n\t\t\t}\r\n\t\r\n\t\t\tfloat4 frag(vert_out f) : COLOR\r\n\t\t\t{\r\n\t\t\t\treturn float4(_colorSolid.rgb, _colorAlpha);\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\tENDCG\r\n\t\t}\r\n\r\n\t\tBlend One Zero\r\n\t\tZTest LEqual\r\n\t\tPass\r\n\t\t{\r\n\t\t\tCGPROGRAM\r\n\t\t\t\r\n\t\t\t#pragma vertex vert\r\n\t\t\t#pragma fragment frag\r\n\t\t\t\r\n\t\t\t#include \"UnityCG.cginc\"\r\n\t\r\n\t\t\tfloat4 _colorSolid;\r\n\t\t\t\r\n\t\t\tstruct vert_out\r\n\t\t\t{\r\n\t\t\t\tfloat4 position : POSITION;\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tvert_out vert(appdata_base v)\r\n\t\t\t{\r\n\t\t\t\tvert_out tOut;\r\n\t\t\t\ttOut.position = mul(UNITY_MATRIX_MVP, v.vertex);\r\n\t\t\t\t\r\n\t\t\t\treturn tOut;\r\n\t\t\t}\r\n\t\r\n\t\t\tfloat4 frag(vert_out f) : COLOR\r\n\t\t\t{\r\n\t\t\t\treturn _colorSolid;\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\tENDCG\r\n\t\t}\r\n    }\r\n    FallBack \"Diffuse\"\r\n}\r\n"
  },
  {
    "path": "Builds/FullLibrary/Editor/Shaders/VisualAspectShader.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 2ebf07ea708244e4f8588d9b32abfbbb\nShaderImporter:\n  defaultTextures: []\n  userData: \n"
  },
  {
    "path": "Builds/FullLibrary/Editor/Shaders/VisualSensorArcShader.shader",
    "content": "﻿Shader \"SPEditor/VisualSensorArcShader\"\r\n{\r\n    SubShader\r\n    {\r\n\t\tBlend SrcAlpha OneMinusSrcAlpha\r\n\t\tPass\r\n\t\t{\r\n\t\t\tCGPROGRAM\r\n\t\t\t\r\n\t\t\t#pragma vertex vert\r\n\t\t\t#pragma fragment frag\r\n\t\t\t\r\n\t\t\t#include \"UnityCG.cginc\"\r\n\t\t\t\r\n\t\t\tfloat4 _Color;\r\n\r\n\t\t\tfloat _angle;\r\n\t\t\tfloat _tiltAngle;\r\n\t\t\t\r\n\t\t\tstruct vert_out\r\n\t\t\t{\r\n\t\t\t\tfloat4 position : POSITION;\r\n\t\t\t\tfloat4 texcoord : TEXCOORD0;\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tvert_out vert(appdata_base v)\r\n\t\t\t{\r\n\t\t\t\tfloat tBackAngle = 3.14159265 * 2 * (v.texcoord.y - 0.5);\r\n\t\t\t\tfloat tForwardAngle = 3.14159265 * 2 * (v.texcoord.y - 0.5) * _angle;\r\n\t\t\t\t\r\n\t\t\t\tfloat4x4 tBackRotation = float4x4(cos(-tBackAngle), 0, sin(-tBackAngle), 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  0, 1, 0, 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  -sin(-tBackAngle), 0, cos(-tBackAngle), 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  0, 0, 0, 1);\r\n\t\t\t\tfloat4x4 tTiltRotation = float4x4(1, 0, 0, 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  0, cos(_tiltAngle), -sin(_tiltAngle), 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  0, sin(_tiltAngle), cos(_tiltAngle), 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  0, 0, 0, 1);\r\n\t\t\t\tfloat4x4 tForwardRotation = float4x4(cos(tForwardAngle), 0, sin(tForwardAngle), 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t 0, 1, 0, 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t -sin(tForwardAngle), 0, cos(tForwardAngle), 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t 0, 0, 0, 1);\r\n\t\t\t\t\r\n\t\t\t\tvert_out tOut;\r\n\t\t\t\ttOut.position = mul(UNITY_MATRIX_MVP, mul(tForwardRotation, mul(tTiltRotation, mul(tBackRotation, v.vertex))));\r\n\t\t\t\ttOut.texcoord = v.texcoord;\r\n\t\t\t\t\r\n\t\t\t\treturn tOut;\r\n\t\t\t}\r\n\t\r\n\t\t\tfloat4 frag(vert_out f) : COLOR\r\n\t\t\t{\r\n\t\t\t\treturn _Color;\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\tENDCG\r\n\t\t}\r\n    }\r\n    FallBack \"Diffuse\"\r\n}\r\n"
  },
  {
    "path": "Builds/FullLibrary/Editor/Shaders/VisualSensorArcShader.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 168a36d19fe1a4f43acab1e8045678b5\nShaderImporter:\n  defaultTextures: []\n  userData: \n"
  },
  {
    "path": "Builds/FullLibrary/Editor/Shaders/VisualSensorLineShader.shader",
    "content": "﻿Shader \"SPEditor/VisualSensorLineShader\"\r\n{\r\n    SubShader\r\n    {\r\n\t\tBlend SrcAlpha OneMinusSrcAlpha\r\n\t\tPass\r\n\t\t{\r\n\t\t\tCGPROGRAM\r\n// Upgrade NOTE: excluded shader from OpenGL ES 2.0 because it does not contain a surface program or both vertex and fragment programs.\n#pragma exclude_renderers gles\n\r\n\t\t\t#pragma fragment frag\r\n\t\t\t\r\n\t\t\t#include \"UnityCG.cginc\"\r\n\t\t\t\r\n\t\t\tfloat4 _Color;\r\n\r\n\t\t\tfloat4 frag() : COLOR\r\n\t\t\t{\r\n\t\t\t\treturn _Color;\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\tENDCG\r\n\t\t}\r\n    }\r\n    FallBack \"Diffuse\"\r\n}\r\n"
  },
  {
    "path": "Builds/FullLibrary/Editor/Shaders/VisualSensorLineShader.shader.meta",
    "content": "fileFormatVersion: 2\nguid: ee588280453a76b4eabd4518ada346fb\nShaderImporter:\n  defaultTextures: []\n  userData: \n"
  },
  {
    "path": "README.md",
    "content": "# TODO OBSOLETE - See Spacepuppy Unity Framework 4.0\nhttps://github.com/lordofduct/spacepuppy-unity-framework-4.0\n\nThis version of spacepuppy is now obsolete. We've moved to a newer version of Unity that supports the newer C# versions in the compiler.\n\nThis framework will remain for posterity sake.\n\n# spacepuppy-unity-framework\nA framework of reusable objects with the Unity game engine version 5.x.\n\nThis project is intended to be compiled in Visual Studio and then place the compiled dll's into the project. When compiling you will need to ensure you reference the UnityEngine and UnityEditor dll's for your version of unity. I include a version list in the Resources folder for the version of unity I'm currently using.\n\n# Quick Import\n\nSelect the latest stable version from the builds section of the git page. Or if you want the bleeding edge build locate the files in the Builds/OpenSource directory of the repo.\n\nDrag the contents of this into a folder anywhere in your project and it'll work out of the box, I prefer the 'Assets/3rdParty/SpacepuppyUnityFramework' folder. The included meta file configures the scripts execution order automatically. Caution, this meta file's guid is what controls the references to scripts in the library, deleting or modifying it will ruin any script references.\n\nOnce added make sure to go to \"Spacepuppy->Settings->Sync TagData\".\n\nThis will add the required 'MultiTag' and 'Root' tags, as well as sync any of your existing tags to a resource that can be read at runtime. Any time you add new tags you must sync the tag data again by either clicking this same menu item, or going into /Assets/Resources/TagData and clicking \"Sync TagData\" in the inspector there.\n\nEarlier version (1.0 and earlier) will require adding these tags manually before syncing.\n\n# Custom Building\n\nYou'll need to create a folder in Assets for the dll's, I personally use Assets/3rdParty/SpaceuppyUnityFramework. The SpacepuppyUnityFramework dll and .pdb go in there (a .mdb will also be generated by unity, this will allow for code stepping when debugging). I then create a folder Assets/3rdParty/SpaceuppyUnityFramework/Editor and place the SpacepuppyUnityFrameworkEditor dll and .pdb there.\n\nYou will also want to go to the PlayerSettings and set the Api compatability level to .Net 2.0, and not 2.0 subset.\n\nNext you'll want to set the execution order of 3 classes in the framework. Of course, if you have meta files turned on, you could just include the supplied SpacepuppyUnityFramework.dll.meta file instead (found in the Resources folder, just place in the same folder as the dll). Those 3 classes are:\n\ncom.spacepuppy.GameLoopEntry : -32000\n\ncom.spacepuppy.Hooks.EarlyExecutionUpdateEventHooks : -31990\n\ncom.spacepuppy.Utils.SpecializedCoponents.EarlyParentSetter : -31980\n\ncom.spacepuppy.Hooks.TardyExecutionUpdateEventHooks : 32000\n\ncom.spacepuppy.SPEntity: 32000\n\nLastly, make sure to go to \"Spacepuppy->Settings->Sync TagData\".\n\nThis will add the required 'MultiTag' and 'Root' tags, as well as sync any of your existing tags to a resource that can be read at runtime. Any time you add new tags you must sync the tag data again by either clicking this same menu item, or going into /Assets/Resources/TagData and clicking \"Sync TagData\" in the inspector there.\n\nNow you're fully set up.\n\n# License\nCopyright (c) 2015, Dylan Engelman, Jupiter Lighthouse Studio\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Resources/Shaders/DefaultShader.shader",
    "content": "﻿Shader \"SPEditor/DefaultShader\"\r\n{\r\n\tSubShader {\r\n\t\tPass {\r\n\t\t\tBindChannels{\r\n\t\t\t\tBind \"Color\", color\r\n\t\t\t}\r\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha\r\n\t\t\tZWrite Off\r\n\t\t\tCull Off\r\n\t\t\tFog { Mode Off }\r\n\t\t\tColor(1, 1, 1, 1)\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Resources/Shaders/DefaultShader.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 74100f29a6376b840b08443c31390238\ntimeCreated: 1456266554\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources/Shaders/LineShader.shader",
    "content": "﻿Shader \"SPEditor/LineShader\"\n{\n\tSubShader {\n\t\tPass {\n\t\t\tBindChannels {\n\t\t\t\tBind \"Color\", color\n\t\t\t}\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha\n\t\t\tZWrite Off\n\t\t\tCull Off\n\t\t\tFog { Mode Off }\n\t\t}\n\t}\n}"
  },
  {
    "path": "Resources/Shaders/LineShader.shader.meta",
    "content": "fileFormatVersion: 2\nguid: b866cfca3124ac24db28c589ed538231\ntimeCreated: 1456266573\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources/Shaders/VisualAspectShader.shader",
    "content": "﻿Shader \"SPEditor/VisualAspectShader\"\r\n{\r\n    SubShader\r\n    {\r\n\t\tBlend SrcAlpha OneMinusSrcAlpha\r\n\t\tZTest Off\r\n\t\tZWrite Off\r\n\t\tPass\r\n\t\t{\r\n\t\t\tCGPROGRAM\r\n\t\t\t\r\n\t\t\t#pragma vertex vert\r\n\t\t\t#pragma fragment frag\r\n\t\t\t\r\n\t\t\t#include \"UnityCG.cginc\"\r\n\t\r\n\t\t\tfloat4 _colorSolid;\r\n\t\t\tfloat _colorAlpha;\r\n\t\t\t\r\n\t\t\tstruct vert_out\r\n\t\t\t{\r\n\t\t\t\tfloat4 position : POSITION;\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tvert_out vert(appdata_base v)\r\n\t\t\t{\r\n\t\t\t\tvert_out tOut;\r\n\t\t\t\ttOut.position = UnityObjectToClipPos(v.vertex);\r\n\t\t\t\t\r\n\t\t\t\treturn tOut;\r\n\t\t\t}\r\n\t\r\n\t\t\tfloat4 frag(vert_out f) : COLOR\r\n\t\t\t{\r\n\t\t\t\treturn float4(_colorSolid.rgb, _colorAlpha);\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\tENDCG\r\n\t\t}\r\n\r\n\t\tBlend One Zero\r\n\t\tZTest LEqual\r\n\t\tPass\r\n\t\t{\r\n\t\t\tCGPROGRAM\r\n\t\t\t\r\n\t\t\t#pragma vertex vert\r\n\t\t\t#pragma fragment frag\r\n\t\t\t\r\n\t\t\t#include \"UnityCG.cginc\"\r\n\t\r\n\t\t\tfloat4 _colorSolid;\r\n\t\t\t\r\n\t\t\tstruct vert_out\r\n\t\t\t{\r\n\t\t\t\tfloat4 position : POSITION;\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tvert_out vert(appdata_base v)\r\n\t\t\t{\r\n\t\t\t\tvert_out tOut;\r\n\t\t\t\ttOut.position = UnityObjectToClipPos(v.vertex);\r\n\t\t\t\t\r\n\t\t\t\treturn tOut;\r\n\t\t\t}\r\n\t\r\n\t\t\tfloat4 frag(vert_out f) : COLOR\r\n\t\t\t{\r\n\t\t\t\treturn _colorSolid;\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\tENDCG\r\n\t\t}\r\n    }\r\n    FallBack \"Diffuse\"\r\n}\r\n"
  },
  {
    "path": "Resources/Shaders/VisualAspectShader.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 2ebf07ea708244e4f8588d9b32abfbbb\nShaderImporter:\n  defaultTextures: []\n  userData: \n"
  },
  {
    "path": "Resources/Shaders/VisualSensorArcShader.shader",
    "content": "﻿Shader \"SPEditor/VisualSensorArcShader\"\r\n{\r\n    SubShader\r\n    {\r\n\t\tBlend SrcAlpha OneMinusSrcAlpha\r\n\t\tPass\r\n\t\t{\r\n\t\t\tCGPROGRAM\r\n\t\t\t\r\n\t\t\t#pragma vertex vert\r\n\t\t\t#pragma fragment frag\r\n\t\t\t\r\n\t\t\t#include \"UnityCG.cginc\"\r\n\t\t\t\r\n\t\t\tfloat4 _Color;\r\n\r\n\t\t\tfloat _angle;\r\n\t\t\tfloat _tiltAngle;\r\n\t\t\t\r\n\t\t\tstruct vert_out\r\n\t\t\t{\r\n\t\t\t\tfloat4 position : POSITION;\r\n\t\t\t\tfloat4 texcoord : TEXCOORD0;\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tvert_out vert(appdata_base v)\r\n\t\t\t{\r\n\t\t\t\tfloat tBackAngle = 3.14159265 * 2 * (v.texcoord.y - 0.5);\r\n\t\t\t\tfloat tForwardAngle = 3.14159265 * 2 * (v.texcoord.y - 0.5) * _angle;\r\n\t\t\t\t\r\n\t\t\t\tfloat4x4 tBackRotation = float4x4(cos(-tBackAngle), 0, sin(-tBackAngle), 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  0, 1, 0, 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  -sin(-tBackAngle), 0, cos(-tBackAngle), 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  0, 0, 0, 1);\r\n\t\t\t\tfloat4x4 tTiltRotation = float4x4(1, 0, 0, 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  0, cos(_tiltAngle), -sin(_tiltAngle), 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  0, sin(_tiltAngle), cos(_tiltAngle), 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  0, 0, 0, 1);\r\n\t\t\t\tfloat4x4 tForwardRotation = float4x4(cos(tForwardAngle), 0, sin(tForwardAngle), 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t 0, 1, 0, 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t -sin(tForwardAngle), 0, cos(tForwardAngle), 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t 0, 0, 0, 1);\r\n\t\t\t\t\r\n\t\t\t\tvert_out tOut;\r\n\t\t\t\ttOut.position = UnityObjectToClipPos(mul(tForwardRotation, mul(tTiltRotation, mul(tBackRotation, v.vertex))));\r\n\t\t\t\ttOut.texcoord = v.texcoord;\r\n\t\t\t\t\r\n\t\t\t\treturn tOut;\r\n\t\t\t}\r\n\t\r\n\t\t\tfloat4 frag(vert_out f) : COLOR\r\n\t\t\t{\r\n\t\t\t\treturn _Color;\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\tENDCG\r\n\t\t}\r\n    }\r\n    FallBack \"Diffuse\"\r\n}\r\n"
  },
  {
    "path": "Resources/Shaders/VisualSensorArcShader.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 168a36d19fe1a4f43acab1e8045678b5\nShaderImporter:\n  defaultTextures: []\n  userData: \n"
  },
  {
    "path": "Resources/Shaders/VisualSensorLineShader.shader",
    "content": "﻿Shader \"SPEditor/VisualSensorLineShader\"\r\n{\r\n    SubShader\r\n    {\r\n\t\tBlend SrcAlpha OneMinusSrcAlpha\r\n\t\tPass\r\n\t\t{\r\n\t\t\tCGPROGRAM\r\n// Upgrade NOTE: excluded shader from OpenGL ES 2.0 because it does not contain a surface program or both vertex and fragment programs.\n#pragma exclude_renderers gles\n\r\n\t\t\t#pragma fragment frag\r\n\t\t\t\r\n\t\t\t#include \"UnityCG.cginc\"\r\n\t\t\t\r\n\t\t\tfloat4 _Color;\r\n\r\n\t\t\tfloat4 frag() : COLOR\r\n\t\t\t{\r\n\t\t\t\treturn _Color;\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\tENDCG\r\n\t\t}\r\n    }\r\n    FallBack \"Diffuse\"\r\n}\r\n"
  },
  {
    "path": "Resources/Shaders/VisualSensorLineShader.shader.meta",
    "content": "fileFormatVersion: 2\nguid: ee588280453a76b4eabd4518ada346fb\nShaderImporter:\n  defaultTextures: []\n  userData: \n"
  },
  {
    "path": "Resources/SpacepuppyUnityFramework.dll.meta",
    "content": "fileFormatVersion: 2\nguid: 4654fa4c6e0ce3e4f9e580c4c5bbd96e\ntimeCreated: 1444445433\nlicenseType: Free\nPluginImporter:\n  serializedVersion: 1\n  iconMap: {}\n  executionOrder:\n    com.spacepuppy.Anim.SPAnimationController: -31980\n    com.spacepuppy.GameInputManager: -31990\n    com.spacepuppy.GameLoopEntry: -32000\n    com.spacepuppy.Hooks.EarlyExecutionUpdateEventHooks: -31900\n    com.spacepuppy.Hooks.TardyExecutionUpdateEventHooks: 32000\n    com.spacepuppy.SPEntity: 31990\n    com.spacepuppy.Scenario.t_OnEnable: 31901\n    com.spacepuppy.Scenario.t_OnStart: 31900\n    com.spacepuppy.Utils.SpecializedComponents.EarlyParentSetter: -31995\n  isPreloaded: 0\n  platformData:\n    Any:\n      enabled: 1\n      settings: {}\n    Editor:\n      enabled: 0\n      settings:\n        DefaultValueInitialized: true\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources/SpacepuppyUnityFrameworkEditor.dll.meta",
    "content": "fileFormatVersion: 2\nguid: c2d46f1ef5af61847af07e235c40ae5d\ntimeCreated: 1481267707\nlicenseType: Free\nPluginImporter:\n  serializedVersion: 1\n  iconMap: {}\n  executionOrder: {}\n  isPreloaded: 0\n  platformData:\n    Any:\n      enabled: 0\n      settings: {}\n    Editor:\n      enabled: 1\n      settings:\n        DefaultValueInitialized: true\n    WindowsStoreApps:\n      enabled: 0\n      settings:\n        CPU: AnyCPU\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources/UnityEditor.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n<doc>\n  <members>\n    <assembly>\n      <name>UnityEditor</name>\n    </assembly>\n    <member name=\"T:UnityEditor.ActionOnDotNetUnhandledException\">\n      <summary>\n        <para>The behavior in case of unhandled .NET exception.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ActionOnDotNetUnhandledException.Crash\">\n      <summary>\n        <para>Crash in case of unhandled .NET exception (Crash Report will be generated).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ActionOnDotNetUnhandledException.SilentExit\">\n      <summary>\n        <para>Silent exit in case of unhandled .NET exception (no Crash Report generated).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Advertisements.AdvertisementSettings\">\n      <summary>\n        <para>Editor API for the Unity Services editor feature. Normally UnityAds is enabled from the Services window, but if writing your own editor extension, this API can be used.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Advertisements.AdvertisementSettings.enabled\">\n      <summary>\n        <para>Global boolean for enabling or disabling the advertisement feature.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Advertisements.AdvertisementSettings.initializeOnStartup\">\n      <summary>\n        <para>Controls if the advertisement system should be initialized immediately on startup.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Advertisements.AdvertisementSettings.testMode\">\n      <summary>\n        <para>Controls if testing advertisements are used instead of production advertisements.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Advertisements.AdvertisementSettings.GetGameId(UnityEngine.RuntimePlatform)\">\n      <summary>\n        <para>Gets the game identifier specified for a runtime platform.</para>\n      </summary>\n      <param name=\"platform\"></param>\n      <returns>\n        <para>The platform specific game identifier.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Advertisements.AdvertisementSettings.GetPlatformGameId(System.String)\">\n      <summary>\n        <para>Gets the game identifier specified for a runtime platform.</para>\n      </summary>\n      <param name=\"platformName\"></param>\n      <returns>\n        <para>The platform specific game identifier.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Advertisements.AdvertisementSettings.IsPlatformEnabled(UnityEngine.RuntimePlatform)\">\n      <summary>\n        <para>Returns if a specific platform is enabled.</para>\n      </summary>\n      <param name=\"platform\"></param>\n      <returns>\n        <para>Boolean for the platform.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Advertisements.AdvertisementSettings.SetGameId(UnityEngine.RuntimePlatform,System.String)\">\n      <summary>\n        <para>Sets the game identifier for the specified platform.</para>\n      </summary>\n      <param name=\"platform\"></param>\n      <param name=\"gameId\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Advertisements.AdvertisementSettings.SetPlatformEnabled(UnityEngine.RuntimePlatform,System.Boolean)\">\n      <summary>\n        <para>Enable the specific platform.</para>\n      </summary>\n      <param name=\"platform\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Advertisements.AdvertisementSettings.SetPlatformGameId(System.String,System.String)\">\n      <summary>\n        <para>Sets the game identifier for the specified platform.</para>\n      </summary>\n      <param name=\"platformName\"></param>\n      <param name=\"gameId\"></param>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshBuilder\">\n      <summary>\n        <para>Navigation mesh builder interface.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AI.NavMeshBuilder.isRunning\">\n      <summary>\n        <para>Returns true if an asynchronous build is still running.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AI.NavMeshBuilder.BuildNavMesh\">\n      <summary>\n        <para>Build the Navmesh.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AI.NavMeshBuilder.BuildNavMeshAsync\">\n      <summary>\n        <para>Build the Navmesh Asyncronously.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AI.NavMeshBuilder.BuildNavMeshForMultipleScenes(System.String[])\">\n      <summary>\n        <para>Builds the combined navmesh for the contents of multiple scenes.</para>\n      </summary>\n      <param name=\"paths\">Array of paths to scenes that are used for building the navmesh.</param>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshBuilder.Cancel(UnityEngine.AI.NavMeshData)\">\n      <summary>\n        <para>Cancels an asynchronous update of the specified NavMesh data. See Also: UpdateNavMeshDataAsync.</para>\n      </summary>\n      <param name=\"data\">The data associated with asynchronous updating.</param>\n    </member>\n    <member name=\"M:UnityEditor.AI.NavMeshBuilder.ClearAllNavMeshes\">\n      <summary>\n        <para>Clear all Navmeshes.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AI.NavMeshEditorHelpers\">\n      <summary>\n        <para>NavMesh utility functionality effective only in the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AI.NavMeshEditorHelpers.DrawBuildDebug(UnityEngine.AI.NavMeshData,UnityEngine.AI.NavMeshBuildDebugFlags)\">\n      <summary>\n        <para>Displays in the Editor the precise intermediate data used during the build process of the specified NavMesh.</para>\n      </summary>\n      <param name=\"navMeshData\">NavMesh object for which debug data has been deliberately collected during the build process.</param>\n      <param name=\"flags\">Bitmask that designates the types of data to show at one time.</param>\n    </member>\n    <member name=\"T:UnityEditor.AI.NavMeshVisualizationSettings\">\n      <summary>\n        <para>Represents the visualization state of the navigation debug graphics.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AI.NavMeshVisualizationSettings.showNavigation\">\n      <summary>\n        <para>A count of how many users requesting navigation debug graphics to be enabled.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AlphabeticalSort\">\n      <summary>\n        <para>Hierarchy sort method to allow for items and their children to be sorted alphabetically.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AlphabeticalSort.content\">\n      <summary>\n        <para>Content to visualize the alphabetical sorting method.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Analytics.AnalyticsSettings\">\n      <summary>\n        <para>Editor API for the Unity Services editor feature. Normally Analytics is enabled from the Services window, but if writing your own editor extension, this API can be used.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Analytics.AnalyticsSettings.enabled\">\n      <summary>\n        <para>This Boolean field will cause the Analytics feature in Unity to be enabled if true, or disabled if false.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Analytics.AnalyticsSettings.testMode\">\n      <summary>\n        <para>Set to true for testing Analytics integration only within the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Analytics.PerformanceReportingSettings\">\n      <summary>\n        <para>Normally performance reporting is enabled from the Services window, but if writing your own editor extension, this API can be used.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Analytics.PerformanceReportingSettings.enabled\">\n      <summary>\n        <para>This Boolean field causes the performance reporting feature in Unity to be enabled if true, or disabled if false.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.Android.IPostGenerateGradleAndroidProject\">\n      <summary>\n        <para>Implement this interface to receive a callback after the Android Gradle project is generated. Inherited from UnityEditor.Build.IOrderedCallback.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Android.IPostGenerateGradleAndroidProject.OnPostGenerateGradleAndroidProject(System.String)\">\n      <summary>\n        <para>Implement this function to receive a callback after the Android Gradle project is generated and before building begins. It is not called when doing an Internal build.</para>\n      </summary>\n      <param name=\"path\">The path to the root of the Gradle project. Note: when exporting the project, this parameter holds the path to the folder specified for export.</param>\n    </member>\n    <member name=\"T:UnityEditor.AndroidArchitecture\">\n      <summary>\n        <para>Android CPU architecture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidArchitecture.All\">\n      <summary>\n        <para>All architectures.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidArchitecture.ARM64\">\n      <summary>\n        <para>64-bit ARM architecture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidArchitecture.ARMv7\">\n      <summary>\n        <para>32-bit ARM architecture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidArchitecture.None\">\n      <summary>\n        <para>Invalid architecture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidArchitecture.X86\">\n      <summary>\n        <para>32-bit Intel architecture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AndroidBlitType\">\n      <summary>\n        <para>Describes the method for how content is displayed on the screen.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidBlitType.Always\">\n      <summary>\n        <para>Always render offscreen and blit to the backbuffer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidBlitType.Auto\">\n      <summary>\n        <para>Automatically determine the most appropriate method for drawing to the screen.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidBlitType.Never\">\n      <summary>\n        <para>Never render offscreen and blit to the backbuffer. Note: Does not work with linear colorspace, MSAA or non-native resolutions.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AndroidBuildSystem\">\n      <summary>\n        <para>Type of Android build system.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidBuildSystem.ADT\">\n      <summary>\n        <para>Export ADT (legacy) project. This option is obsolete and no longer supported - please use AndroidBuildSystem.Gradle export instead.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidBuildSystem.Gradle\">\n      <summary>\n        <para>Build APK using Gradle or export Gradle project.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidBuildSystem.Internal\">\n      <summary>\n        <para>Build APK using internal build system.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AndroidBuildType\">\n      <summary>\n        <para>Build configurations for the generated project.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidBuildType.Debug\">\n      <summary>\n        <para>Build configuration set to Debug for the generated project.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidBuildType.Development\">\n      <summary>\n        <para>Build configuration set to Development for the generated project.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidBuildType.Release\">\n      <summary>\n        <para>Build configuration set to Release for the generated project.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AndroidETC2Fallback\">\n      <summary>\n        <para>This enumeration has values for different qualities to decompress ETC2 textures on Android devices that don't support the ETC2 texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidETC2Fallback.Quality16Bit\">\n      <summary>\n        <para>Textures are decompressed to a suitable 16-bit format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidETC2Fallback.Quality32Bit\">\n      <summary>\n        <para>Textures are decompressed to the TextureFormat.RGBA32 format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidETC2Fallback.Quality32BitDownscaled\">\n      <summary>\n        <para>Textures are decompressed to the TextureFormat.RGBA32 format and downscaled to half of the original texture width and height.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AndroidETC2FallbackOverride\">\n      <summary>\n        <para>This enumeration has values for different qualities to decompress an ETC2 texture on Android devices that don't support the ETC2 texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidETC2FallbackOverride.Quality16Bit\">\n      <summary>\n        <para>Texture is decompressed to a suitable 16-bit format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidETC2FallbackOverride.Quality32Bit\">\n      <summary>\n        <para>Texture is decompressed to the TextureFormat.RGBA32 format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidETC2FallbackOverride.Quality32BitDownscaled\">\n      <summary>\n        <para>Texture is decompressed to the TextureFormat.RGBA32 format and downscaled to half of the original texture width and height.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidETC2FallbackOverride.UseBuildSettings\">\n      <summary>\n        <para>Use the value defined in Player build settings.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AndroidGamepadSupportLevel\">\n      <summary>\n        <para>Gamepad support level for Android TV.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidGamepadSupportLevel.RequiresGamepad\">\n      <summary>\n        <para>Requires a gamepad for gameplay.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidGamepadSupportLevel.SupportsDPad\">\n      <summary>\n        <para>Game is fully operational with a D-pad, no gamepad needed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidGamepadSupportLevel.SupportsGamepad\">\n      <summary>\n        <para>Works with a gamepad, but does not require it.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AndroidMinification\">\n      <summary>\n        <para>How to minify the java code of your binary.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidMinification.Gradle\">\n      <summary>\n        <para>Use experimental internal gradle minification.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidMinification.None\">\n      <summary>\n        <para>Use no minification.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidMinification.Proguard\">\n      <summary>\n        <para>Use proguard minification.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AndroidPreferredInstallLocation\">\n      <summary>\n        <para>Preferred application install location.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidPreferredInstallLocation.Auto\">\n      <summary>\n        <para>Let the OS decide, app doesn't have any preferences.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidPreferredInstallLocation.ForceInternal\">\n      <summary>\n        <para>Force installation into internal memory. Needed for things like Live Wallpapers.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidPreferredInstallLocation.PreferExternal\">\n      <summary>\n        <para>Prefer external, if possible. Install to internal otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AndroidSdkVersions\">\n      <summary>\n        <para>Supported Android SDK versions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidSdkVersions.AndroidApiLevel16\">\n      <summary>\n        <para>Android 4.1, \"Jelly Bean\", API level 16.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidSdkVersions.AndroidApiLevel17\">\n      <summary>\n        <para>Android 4.2, \"Jelly Bean\", API level 17.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidSdkVersions.AndroidApiLevel18\">\n      <summary>\n        <para>Android 4.3, \"Jelly Bean\", API level 18.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidSdkVersions.AndroidApiLevel19\">\n      <summary>\n        <para>Android 4.4, \"KitKat\", API level 19.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidSdkVersions.AndroidApiLevel21\">\n      <summary>\n        <para>Android 5.0, \"Lollipop\", API level 21.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidSdkVersions.AndroidApiLevel22\">\n      <summary>\n        <para>Android 5.1, \"Lollipop\", API level 22.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidSdkVersions.AndroidApiLevel23\">\n      <summary>\n        <para>Android 6.0, \"Marshmallow\", API level 23.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidSdkVersions.AndroidApiLevel24\">\n      <summary>\n        <para>Android 7.0, \"Nougat\", API level 24.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidSdkVersions.AndroidApiLevel25\">\n      <summary>\n        <para>Android 7.1, \"Nougat\", API level 25.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidSdkVersions.AndroidApiLevel26\">\n      <summary>\n        <para>Android 8.0, \"Oreo\", API level 26.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidSdkVersions.AndroidApiLevel27\">\n      <summary>\n        <para>Android 8.1, \"Oreo\", API level 27.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidSdkVersions.AndroidApiLevelAuto\">\n      <summary>\n        <para>Sets the target API level automatically, according to the latest installed SDK on your computer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AndroidShowActivityIndicatorOnLoading\">\n      <summary>\n        <para>Application should show ActivityIndicator when loading.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidShowActivityIndicatorOnLoading.DontShow\">\n      <summary>\n        <para>Don't Show.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidShowActivityIndicatorOnLoading.InversedLarge\">\n      <summary>\n        <para>Inversed Large.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidShowActivityIndicatorOnLoading.InversedSmall\">\n      <summary>\n        <para>Inversed Small.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidShowActivityIndicatorOnLoading.Large\">\n      <summary>\n        <para>Large.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidShowActivityIndicatorOnLoading.Small\">\n      <summary>\n        <para>Small.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AndroidSplashScreenScale\">\n      <summary>\n        <para>Android splash screen scale modes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidSplashScreenScale.Center\">\n      <summary>\n        <para>Center.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidSplashScreenScale.ScaleToFill\">\n      <summary>\n        <para>Scale to fill.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidSplashScreenScale.ScaleToFit\">\n      <summary>\n        <para>Scale to fit.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AndroidTargetDevice\">\n      <summary>\n        <para>Target Android device architecture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidTargetDevice.x86\">\n      <summary>\n        <para>Intel only.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidTargetDevice.ARMv7\">\n      <summary>\n        <para>ARMv7 only.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AndroidTargetDevice.FAT\">\n      <summary>\n        <para>All supported architectures.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AnimatedValues.AnimBool\">\n      <summary>\n        <para>Lerp from 0 - 1.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AnimatedValues.AnimBool.faded\">\n      <summary>\n        <para>Retuns the float value of the tween.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.AnimBool.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"value\">Start Value.</param>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.AnimBool.#ctor(System.Boolean)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"value\">Start Value.</param>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.AnimBool.#ctor(UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"value\">Start Value.</param>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.AnimBool.#ctor(System.Boolean,UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"value\">Start Value.</param>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.AnimBool.Fade(System.Single,System.Single)\">\n      <summary>\n        <para>Returns a value between from and to depending on the current value of the bools animation.</para>\n      </summary>\n      <param name=\"from\">Value to lerp from.</param>\n      <param name=\"to\">Value to lerp to.</param>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.AnimBool.GetValue\">\n      <summary>\n        <para>Type specific implementation of BaseAnimValue_1.GetValue.</para>\n      </summary>\n      <returns>\n        <para>Current value.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.AnimatedValues.AnimFloat\">\n      <summary>\n        <para>An animated float value.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.AnimFloat.#ctor(System.Single)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"value\">Start Value.</param>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.AnimFloat.#ctor(System.Single,UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"value\">Start Value.</param>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.AnimFloat.GetValue\">\n      <summary>\n        <para>Type specific implementation of BaseAnimValue_1.GetValue.</para>\n      </summary>\n      <returns>\n        <para>Current Value.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.AnimatedValues.AnimQuaternion\">\n      <summary>\n        <para>An animated Quaternion value.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.AnimQuaternion.#ctor(UnityEngine.Quaternion)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"value\">Start Value.</param>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.AnimQuaternion.#ctor(UnityEngine.Quaternion,UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"value\">Start Value.</param>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.AnimQuaternion.GetValue\">\n      <summary>\n        <para>Type specific implementation of BaseAnimValue_1.GetValue.</para>\n      </summary>\n      <returns>\n        <para>Current Value.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.AnimatedValues.AnimVector3\">\n      <summary>\n        <para>An animated Vector3 value.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.AnimVector3.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"value\">Start Value.</param>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.AnimVector3.#ctor(UnityEngine.Vector3)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"value\">Start Value.</param>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.AnimVector3.#ctor(UnityEngine.Vector3,UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"value\">Start Value.</param>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.AnimVector3.GetValue\">\n      <summary>\n        <para>Type specific implementation of BaseAnimValue_1.GetValue.</para>\n      </summary>\n      <returns>\n        <para>Current Value.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.AnimatedValues.BaseAnimValue`1\">\n      <summary>\n        <para>Abstract base class for Animated Values.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AnimatedValues.BaseAnimValue_1.isAnimating\">\n      <summary>\n        <para>Is the value currently animating.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AnimatedValues.BaseAnimValue_1.speed\">\n      <summary>\n        <para>Speed of the tween.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AnimatedValues.BaseAnimValue_1.target\">\n      <summary>\n        <para>Target to tween towards.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AnimatedValues.BaseAnimValue_1.value\">\n      <summary>\n        <para>Current value of the animation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AnimatedValues.BaseAnimValue_1.valueChanged\">\n      <summary>\n        <para>Callback while the value is changing.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.BaseAnimValue_1.BeginAnimating(T,T)\">\n      <summary>\n        <para>Begin an animation moving from the start value to the target value.</para>\n      </summary>\n      <param name=\"newTarget\">Target value.</param>\n      <param name=\"newStart\">Start value.</param>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.BaseAnimValue_1.GetValue\">\n      <summary>\n        <para>Abstract function to be overridden in derived types. Should return the current value of the animated value.</para>\n      </summary>\n      <returns>\n        <para>Current Value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AnimatedValues.BaseAnimValue_1.StopAnim(T)\">\n      <summary>\n        <para>Stop the animation and assign the given value.</para>\n      </summary>\n      <param name=\"newValue\">Value to assign.</param>\n    </member>\n    <member name=\"T:UnityEditor.AnimationClipCurveData\">\n      <summary>\n        <para>An AnimationClipCurveData object contains all the information needed to identify a specific curve in an AnimationClip. The curve animates a specific property of a component  material attached to a game object  animated bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AnimationClipCurveData.curve\">\n      <summary>\n        <para>The actual animation curve.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AnimationClipCurveData.path\">\n      <summary>\n        <para>The path of the game object / bone being animated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AnimationClipCurveData.propertyName\">\n      <summary>\n        <para>The name of the property being animated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AnimationClipCurveData.type\">\n      <summary>\n        <para>The type of the component / material being animated.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AnimationMode\">\n      <summary>\n        <para>AnimationMode is used by the AnimationWindow to store properties modified\n      by the AnimationClip playback.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AnimationMode.animatedPropertyColor\">\n      <summary>\n        <para>The color used to show that a property is currently being animated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AnimationMode.candidatePropertyColor\">\n      <summary>\n        <para>The color used to show that an animated property has been modified.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AnimationMode.recordedPropertyColor\">\n      <summary>\n        <para>The color used to show that an animated property automatically records changes in the animation clip.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AnimationMode.AddPropertyModification(UnityEditor.EditorCurveBinding,UnityEditor.PropertyModification,System.Boolean)\">\n      <summary>\n        <para>Marks a property as currently being animated.</para>\n      </summary>\n      <param name=\"binding\">Description of the animation clip curve being modified.</param>\n      <param name=\"modification\">Object property being modified.</param>\n      <param name=\"keepPrefabOverride\">Indicates whether to retain modifications when the targeted object is an instance of prefab.</param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationMode.BeginSampling\">\n      <summary>\n        <para>Initialise the start of the animation clip sampling.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AnimationMode.EndSampling\">\n      <summary>\n        <para>Finish the sampling of the animation clip.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AnimationMode.InAnimationMode\">\n      <summary>\n        <para>Are we currently in AnimationMode?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AnimationMode.IsPropertyAnimated(UnityEngine.Object,System.String)\">\n      <summary>\n        <para>Is the specified property currently in animation mode and being animated?</para>\n      </summary>\n      <param name=\"target\">The object to determine if it contained the animation.</param>\n      <param name=\"propertyPath\">The name of the animation to search for.</param>\n      <returns>\n        <para>Whether the property search is found or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AnimationMode.SampleAnimationClip(UnityEngine.GameObject,UnityEngine.AnimationClip,System.Single)\">\n      <summary>\n        <para>Samples an AnimationClip on the object and also records any modified\n        properties in AnimationMode.</para>\n      </summary>\n      <param name=\"gameObject\"></param>\n      <param name=\"clip\"></param>\n      <param name=\"time\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationMode.StartAnimationMode\">\n      <summary>\n        <para>Starts the animation mode.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AnimationMode.StopAnimationMode\">\n      <summary>\n        <para>Stops Animation mode, reverts all properties that were animated in animation mode.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Animations.AnimatorCondition\">\n      <summary>\n        <para>Condition that is used to determine if a transition must be taken.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorCondition.mode\">\n      <summary>\n        <para>The mode of the condition.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorCondition.parameter\">\n      <summary>\n        <para>The name of the parameter used in the condition.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorCondition.threshold\">\n      <summary>\n        <para>The AnimatorParameter's threshold value for the condition to be true.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Animations.AnimatorConditionMode\">\n      <summary>\n        <para>The mode of the condition.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.AnimatorConditionMode.Equals\">\n      <summary>\n        <para>The condition is true when parameter value is equal to the threshold.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.AnimatorConditionMode.Greater\">\n      <summary>\n        <para>The condition is true when parameter value is greater than the threshold.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.AnimatorConditionMode.If\">\n      <summary>\n        <para>The condition is true when the parameter value is true.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.AnimatorConditionMode.IfNot\">\n      <summary>\n        <para>The condition is true when the parameter value is false.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.AnimatorConditionMode.Less\">\n      <summary>\n        <para>The condition is true when the parameter value is less than the threshold.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.AnimatorConditionMode.NotEqual\">\n      <summary>\n        <para>The condition is true when the parameter value is not equal to the threshold.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Animations.AnimatorController\">\n      <summary>\n        <para>The Animator Controller controls animation through layers with state machines, controlled by parameters.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorController.layers\">\n      <summary>\n        <para>The layers in the controller.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorController.parameters\">\n      <summary>\n        <para>Parameters are used to communicate between scripting and the controller. They are used to drive transitions and blendtrees for example.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.AddEffectiveStateMachineBehaviour(System.Type,UnityEditor.Animations.AnimatorState,System.Int32)\">\n      <summary>\n        <para>Adds a state machine behaviour class of type stateMachineBehaviourType to the AnimatorState for layer layerIndex. This function should be used when you are dealing with synchronized layer and would like to add a state machine behaviour on a synchronized layer. C# Users can use a generic version.</para>\n      </summary>\n      <param name=\"stateMachineBehaviourType\"></param>\n      <param name=\"state\"></param>\n      <param name=\"layerIndex\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.AddEffectiveStateMachineBehaviour(UnityEditor.Animations.AnimatorState,System.Int32)\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n      <param name=\"state\"></param>\n      <param name=\"layerIndex\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.AddLayer(System.String)\">\n      <summary>\n        <para>Utility function to add a layer to the controller.</para>\n      </summary>\n      <param name=\"name\">The name of the Layer.</param>\n      <param name=\"layer\">The layer to add.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.AddLayer(UnityEditor.Animations.AnimatorControllerLayer)\">\n      <summary>\n        <para>Utility function to add a layer to the controller.</para>\n      </summary>\n      <param name=\"name\">The name of the Layer.</param>\n      <param name=\"layer\">The layer to add.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.AddMotion(UnityEngine.Motion)\">\n      <summary>\n        <para>Utility function that creates a new state  with the motion in it.</para>\n      </summary>\n      <param name=\"motion\">The Motion that will be in the AnimatorState.</param>\n      <param name=\"layerIndex\">The layer where the Motion will be added.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.AddMotion(UnityEngine.Motion,System.Int32)\">\n      <summary>\n        <para>Utility function that creates a new state  with the motion in it.</para>\n      </summary>\n      <param name=\"motion\">The Motion that will be in the AnimatorState.</param>\n      <param name=\"layerIndex\">The layer where the Motion will be added.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.AddParameter(System.String,UnityEngine.AnimatorControllerParameterType)\">\n      <summary>\n        <para>Utility function to add a parameter to the controller.</para>\n      </summary>\n      <param name=\"name\">The name of the parameter.</param>\n      <param name=\"type\">The type of the parameter.</param>\n      <param name=\"paramater\">The parameter to add.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.AddParameter(UnityEngine.AnimatorControllerParameter)\">\n      <summary>\n        <para>Utility function to add a parameter to the controller.</para>\n      </summary>\n      <param name=\"name\">The name of the parameter.</param>\n      <param name=\"type\">The type of the parameter.</param>\n      <param name=\"paramater\">The parameter to add.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.CreateAnimatorControllerAtPath(System.String)\">\n      <summary>\n        <para>Creates an AnimatorController at the given path.</para>\n      </summary>\n      <param name=\"path\">The path where the AnimatorController asset will be created.</param>\n      <returns>\n        <para>The created AnimationController or null if an error occured.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.CreateAnimatorControllerAtPathWithClip(System.String,UnityEngine.AnimationClip)\">\n      <summary>\n        <para>Creates an AnimatorController at the given path, and automatically create an AnimatorLayer  with an AnimatorStateMachine that will add a State with the AnimationClip in it.</para>\n      </summary>\n      <param name=\"path\">The path where the AnimatorController will be created.</param>\n      <param name=\"clip\">The default clip that will be played by the AnimatorController.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.CreateBlendTreeInController(System.String,UnityEditor.Animations.BlendTree&amp;)\">\n      <summary>\n        <para>Creates a BlendTree in a new AnimatorState.</para>\n      </summary>\n      <param name=\"name\">The name of the BlendTree.</param>\n      <param name=\"tree\">The created BlendTree.</param>\n      <param name=\"layerIndex\">The index where the BlendTree will be created.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.CreateBlendTreeInController(System.String,UnityEditor.Animations.BlendTree&amp;,System.Int32)\">\n      <summary>\n        <para>Creates a BlendTree in a new AnimatorState.</para>\n      </summary>\n      <param name=\"name\">The name of the BlendTree.</param>\n      <param name=\"tree\">The created BlendTree.</param>\n      <param name=\"layerIndex\">The index where the BlendTree will be created.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.CreateStateMachineBehaviour(UnityEditor.MonoScript)\">\n      <summary>\n        <para>This function will create a StateMachineBehaviour instance based on the class define in this script.</para>\n      </summary>\n      <param name=\"script\">MonoScript class to instantiate.</param>\n      <returns>\n        <para>Returns instance id of created object, returns 0 if something is not valid.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.FindStateMachineBehaviourContext(UnityEngine.StateMachineBehaviour)\">\n      <summary>\n        <para>Use this function to retrieve the owner of this behaviour.</para>\n      </summary>\n      <param name=\"behaviour\">The State Machine Behaviour to get context for.</param>\n      <returns>\n        <para>Returns the State Machine Behaviour edition context.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.GetBehaviours\">\n      <summary>\n        <para>Returns all StateMachineBehaviour that match type T or are derived from T.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.GetStateEffectiveBehaviours(UnityEditor.Animations.AnimatorState,System.Int32)\">\n      <summary>\n        <para>Gets the effective state machine behaviour list for the AnimatorState. Behaviours are either stored in the AnimatorStateMachine or in the AnimatorLayer's ovverrides. Use this function to get Behaviour list that is effectively used.</para>\n      </summary>\n      <param name=\"state\">The AnimatorState which we want the Behaviour list.</param>\n      <param name=\"layerIndex\">The layer that is queried.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.GetStateEffectiveMotion(UnityEditor.Animations.AnimatorState)\">\n      <summary>\n        <para>Gets the effective Motion for the AnimatorState. The Motion is either stored in the AnimatorStateMachine or in the AnimatorLayer's ovverrides. Use this function to get the Motion that is effectively used.</para>\n      </summary>\n      <param name=\"state\">The AnimatorState which we want the Motion.</param>\n      <param name=\"layerIndex\">The layer that is queried.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.GetStateEffectiveMotion(UnityEditor.Animations.AnimatorState,System.Int32)\">\n      <summary>\n        <para>Gets the effective Motion for the AnimatorState. The Motion is either stored in the AnimatorStateMachine or in the AnimatorLayer's ovverrides. Use this function to get the Motion that is effectively used.</para>\n      </summary>\n      <param name=\"state\">The AnimatorState which we want the Motion.</param>\n      <param name=\"layerIndex\">The layer that is queried.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.MakeUniqueLayerName(System.String)\">\n      <summary>\n        <para>Creates a unique name for the layers.</para>\n      </summary>\n      <param name=\"name\">The desired name of the AnimatorLayer.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.MakeUniqueParameterName(System.String)\">\n      <summary>\n        <para>Creates a unique name for the parameter.</para>\n      </summary>\n      <param name=\"name\">The desired name of the AnimatorParameter.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.RemoveLayer(System.Int32)\">\n      <summary>\n        <para>Utility function to remove a layer from the controller.</para>\n      </summary>\n      <param name=\"index\">The index of the AnimatorLayer.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.RemoveParameter(System.Int32)\">\n      <summary>\n        <para>Utility function to remove a parameter from the controller.</para>\n      </summary>\n      <param name=\"index\">The index of the AnimatorParameter.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.SetStateEffectiveBehaviours\">\n      <summary>\n        <para>Sets the effective state machine Behaviour list for the AnimatorState. The Behaviour list is either stored in the AnimatorStateMachine or in the AnimatorLayer's ovverrides. Use this function to set the Behaviour list that is effectively used.</para>\n      </summary>\n      <param name=\"state\">The AnimatorState which we want to set the Behaviour list.</param>\n      <param name=\"layerIndex\">The layer to set the Behaviour list.</param>\n      <param name=\"behaviours\">The Behaviour list that will be set.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.SetStateEffectiveMotion(UnityEditor.Animations.AnimatorState,UnityEngine.Motion)\">\n      <summary>\n        <para>Sets the effective Motion for the AnimatorState. The Motion is either stored in the AnimatorStateMachine or in the AnimatorLayer's ovverrides. Use this function to set the Motion that is effectively used.</para>\n      </summary>\n      <param name=\"state\">The AnimatorState which we want to set the Motion.</param>\n      <param name=\"motion\">The Motion that will be set.</param>\n      <param name=\"layerIndex\">The layer to set the Motion.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorController.SetStateEffectiveMotion(UnityEditor.Animations.AnimatorState,UnityEngine.Motion,System.Int32)\">\n      <summary>\n        <para>Sets the effective Motion for the AnimatorState. The Motion is either stored in the AnimatorStateMachine or in the AnimatorLayer's ovverrides. Use this function to set the Motion that is effectively used.</para>\n      </summary>\n      <param name=\"state\">The AnimatorState which we want to set the Motion.</param>\n      <param name=\"motion\">The Motion that will be set.</param>\n      <param name=\"layerIndex\">The layer to set the Motion.</param>\n    </member>\n    <member name=\"T:UnityEditor.Animations.AnimatorControllerLayer\">\n      <summary>\n        <para>The Animation Layer contains a state machine that controls animations of a model or part of it.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorControllerLayer.avatarMask\">\n      <summary>\n        <para>The AvatarMask that is used to mask the animation on the given layer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorControllerLayer.blendingMode\">\n      <summary>\n        <para>The blending mode used by the layer. It is not taken into account for the first layer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorControllerLayer.defaultWeight\">\n      <summary>\n        <para>The default blending weight that the layers has. It is not taken into account for the first layer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorControllerLayer.iKPass\">\n      <summary>\n        <para>When active, the layer will have an IK pass when evaluated. It will trigger an OnAnimatorIK callback.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorControllerLayer.name\">\n      <summary>\n        <para>The name of the layer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorControllerLayer.stateMachine\">\n      <summary>\n        <para>The state machine for the layer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorControllerLayer.syncedLayerAffectsTiming\">\n      <summary>\n        <para>When active, the layer will take control of the duration of the Synced Layer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorControllerLayer.syncedLayerIndex\">\n      <summary>\n        <para>Specifies the index of the Synced Layer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorControllerLayer.GetOverrideBehaviours(UnityEditor.Animations.AnimatorState)\">\n      <summary>\n        <para>Gets the override behaviour list for the state on the given layer.</para>\n      </summary>\n      <param name=\"state\">The state which we want to get the behaviour list.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorControllerLayer.GetOverrideMotion(UnityEditor.Animations.AnimatorState)\">\n      <summary>\n        <para>Gets the override motion for the state on the given layer.</para>\n      </summary>\n      <param name=\"state\">The state which we want to get the motion.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorControllerLayer.SetOverrideBehaviours\">\n      <summary>\n        <para>Sets the override behaviour list for the state on the given layer.</para>\n      </summary>\n      <param name=\"state\">The state which we want to set the behaviour list.</param>\n      <param name=\"behaviours\">The behaviour list that will be set.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorControllerLayer.SetOverrideMotion(UnityEditor.Animations.AnimatorState,UnityEngine.Motion)\">\n      <summary>\n        <para>Sets the override motion for the state on the given layer.</para>\n      </summary>\n      <param name=\"state\">The state which we want to set the motion.</param>\n      <param name=\"motion\">The motion that will be set.</param>\n    </member>\n    <member name=\"T:UnityEditor.Animations.AnimatorLayerBlendingMode\">\n      <summary>\n        <para>Specifies how the layer is blended with the previous layers.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.AnimatorLayerBlendingMode.Additive\">\n      <summary>\n        <para>Animations are added to the previous layers.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.AnimatorLayerBlendingMode.Override\">\n      <summary>\n        <para>Animations overrides to the previous layers.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Animations.AnimatorState\">\n      <summary>\n        <para>States are the basic building blocks of a state machine. Each state contains a Motion ( AnimationClip or BlendTree) which will play while the character is in that state. When an event in the game triggers a state transition, the character will be left in a new state whose animation sequence will then take over.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorState.behaviours\">\n      <summary>\n        <para>The Behaviour list assigned to this state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorState.cycleOffset\">\n      <summary>\n        <para>Offset at which the animation loop starts. Useful for synchronizing looped animations.\nUnits is normalized time.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorState.cycleOffsetParameter\">\n      <summary>\n        <para>The animator controller parameter that drives the cycle offset value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorState.cycleOffsetParameterActive\">\n      <summary>\n        <para>Define if the cycle offset value is driven by an Animator controller parameter or by the value set in the editor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorState.iKOnFeet\">\n      <summary>\n        <para>Should Foot IK be respected for this state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorState.mirror\">\n      <summary>\n        <para>Should the state be mirrored.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorState.mirrorParameter\">\n      <summary>\n        <para>The animator controller parameter that drives the mirror value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorState.mirrorParameterActive\">\n      <summary>\n        <para>Define if the mirror value is driven by an Animator controller parameter or by the value set in the editor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorState.motion\">\n      <summary>\n        <para>The motion assigned to this state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorState.nameHash\">\n      <summary>\n        <para>The hashed name of the state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorState.speed\">\n      <summary>\n        <para>The default speed of the motion.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorState.speedParameter\">\n      <summary>\n        <para>The animator controller parameter that drives the speed value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorState.speedParameterActive\">\n      <summary>\n        <para>Define if the speed value is driven by an Animator controller parameter or by the value set in the editor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorState.tag\">\n      <summary>\n        <para>A tag can be used to identify a state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorState.timeParameter\">\n      <summary>\n        <para>If timeParameterActive is true, the value of this Parameter will be used instead of normalized time.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorState.timeParameterActive\">\n      <summary>\n        <para>If true, use value of given Parameter as normalized time.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorState.transitions\">\n      <summary>\n        <para>The transitions that are going out of the state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorState.writeDefaultValues\">\n      <summary>\n        <para>Whether or not the AnimatorStates writes back the default values for properties that are not animated by its Motion.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorState.AddExitTransition\">\n      <summary>\n        <para>Utility function to add an outgoing transition to the exit of the state's parent state machine.</para>\n      </summary>\n      <param name=\"defaultExitTime\">If true, the exit time will be the equivalent of 0.25 second.</param>\n      <returns>\n        <para>The Animations.AnimatorStateTransition that was added.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorState.AddExitTransition(System.Boolean)\">\n      <summary>\n        <para>Utility function to add an outgoing transition to the exit of the state's parent state machine.</para>\n      </summary>\n      <param name=\"defaultExitTime\">If true, the exit time will be the equivalent of 0.25 second.</param>\n      <returns>\n        <para>The Animations.AnimatorStateTransition that was added.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorState.AddStateMachineBehaviour(System.Type)\">\n      <summary>\n        <para>Adds a state machine behaviour class of type stateMachineBehaviourType to the AnimatorState. C# Users can use a generic version.</para>\n      </summary>\n      <param name=\"stateMachineBehaviourType\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorState.AddStateMachineBehaviour\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorState.AddTransition(UnityEditor.Animations.AnimatorState)\">\n      <summary>\n        <para>Utility function to add an outgoing transition to the destination state.</para>\n      </summary>\n      <param name=\"defaultExitTime\">If true, the exit time will be the equivalent of 0.25 second.</param>\n      <param name=\"destinationState\">The destination state.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorState.AddTransition(UnityEditor.Animations.AnimatorState,System.Boolean)\">\n      <summary>\n        <para>Utility function to add an outgoing transition to the destination state.</para>\n      </summary>\n      <param name=\"defaultExitTime\">If true, the exit time will be the equivalent of 0.25 second.</param>\n      <param name=\"destinationState\">The destination state.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorState.AddTransition(UnityEditor.Animations.AnimatorStateMachine)\">\n      <summary>\n        <para>Utility function to add an outgoing transition to the destination state machine.</para>\n      </summary>\n      <param name=\"defaultExitTime\">If true, the exit time will be the equivalent of 0.25 second.</param>\n      <param name=\"destinationStateMachine\">The destination state machine.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorState.AddTransition(UnityEditor.Animations.AnimatorStateMachine,System.Boolean)\">\n      <summary>\n        <para>Utility function to add an outgoing transition to the destination state machine.</para>\n      </summary>\n      <param name=\"defaultExitTime\">If true, the exit time will be the equivalent of 0.25 second.</param>\n      <param name=\"destinationStateMachine\">The destination state machine.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorState.AddTransition(UnityEditor.Animations.AnimatorStateTransition)\">\n      <summary>\n        <para>Utility function to add an outgoing transition.</para>\n      </summary>\n      <param name=\"transition\">The transition to add.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorState.RemoveTransition(UnityEditor.Animations.AnimatorStateTransition)\">\n      <summary>\n        <para>Utility function to remove a transition from the state.</para>\n      </summary>\n      <param name=\"transition\">Transition to remove.</param>\n    </member>\n    <member name=\"T:UnityEditor.Animations.AnimatorStateMachine\">\n      <summary>\n        <para>A graph controlling the interaction of states. Each state references a motion.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorStateMachine.anyStatePosition\">\n      <summary>\n        <para>The position of the AnyState node.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorStateMachine.anyStateTransitions\">\n      <summary>\n        <para>The list of AnyState transitions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorStateMachine.behaviours\">\n      <summary>\n        <para>The Behaviour list assigned to this state machine.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorStateMachine.defaultState\">\n      <summary>\n        <para>The state that the state machine will be in when it starts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorStateMachine.entryPosition\">\n      <summary>\n        <para>The position of the entry node.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorStateMachine.entryTransitions\">\n      <summary>\n        <para>The list of entry transitions in the state machine.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorStateMachine.exitPosition\">\n      <summary>\n        <para>The position of the exit node.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorStateMachine.parentStateMachinePosition\">\n      <summary>\n        <para>The position of the parent state machine node. Only valid when in a hierachic state machine.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorStateMachine.stateMachines\">\n      <summary>\n        <para>The list of sub state machines.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorStateMachine.states\">\n      <summary>\n        <para>The list of states.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.AddAnyStateTransition(UnityEditor.Animations.AnimatorState)\">\n      <summary>\n        <para>Utility function to add an AnyState transition to the specified state or statemachine.</para>\n      </summary>\n      <param name=\"destinationState\">The destination state.</param>\n      <param name=\"destinationStateMachine\">The destination statemachine.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.AddAnyStateTransition(UnityEditor.Animations.AnimatorStateMachine)\">\n      <summary>\n        <para>Utility function to add an AnyState transition to the specified state or statemachine.</para>\n      </summary>\n      <param name=\"destinationState\">The destination state.</param>\n      <param name=\"destinationStateMachine\">The destination statemachine.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.AddEntryTransition(UnityEditor.Animations.AnimatorState)\">\n      <summary>\n        <para>Utility function to add an incoming transition to the exit of it's parent state machine.</para>\n      </summary>\n      <param name=\"destinationState\">The destination Animations.AnimatorState state.</param>\n      <param name=\"destinationStateMachine\">The destination Animations.AnimatorStateMachine state machine.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.AddEntryTransition(UnityEditor.Animations.AnimatorStateMachine)\">\n      <summary>\n        <para>Utility function to add an incoming transition to the exit of it's parent state machine.</para>\n      </summary>\n      <param name=\"destinationState\">The destination Animations.AnimatorState state.</param>\n      <param name=\"destinationStateMachine\">The destination Animations.AnimatorStateMachine state machine.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.AddState(System.String)\">\n      <summary>\n        <para>Utility function to add a state to the state machine.</para>\n      </summary>\n      <param name=\"name\">The name of the new state.</param>\n      <param name=\"position\">The position of the state node.</param>\n      <returns>\n        <para>The AnimatorState that was created for this state.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.AddState(System.String,UnityEngine.Vector3)\">\n      <summary>\n        <para>Utility function to add a state to the state machine.</para>\n      </summary>\n      <param name=\"name\">The name of the new state.</param>\n      <param name=\"position\">The position of the state node.</param>\n      <returns>\n        <para>The AnimatorState that was created for this state.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.AddState(UnityEditor.Animations.AnimatorState,UnityEngine.Vector3)\">\n      <summary>\n        <para>Utility function to add a state to the state machine.</para>\n      </summary>\n      <param name=\"state\">The state to add.</param>\n      <param name=\"position\">The position of the state node.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.AddStateMachine(System.String)\">\n      <summary>\n        <para>Utility function to add a state machine to the state machine.</para>\n      </summary>\n      <param name=\"name\">The name of the new state machine.</param>\n      <param name=\"position\">The position of the state machine node.</param>\n      <returns>\n        <para>The newly created Animations.AnimatorStateMachine state machine.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.AddStateMachine(System.String,UnityEngine.Vector3)\">\n      <summary>\n        <para>Utility function to add a state machine to the state machine.</para>\n      </summary>\n      <param name=\"name\">The name of the new state machine.</param>\n      <param name=\"position\">The position of the state machine node.</param>\n      <returns>\n        <para>The newly created Animations.AnimatorStateMachine state machine.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.AddStateMachine(UnityEditor.Animations.AnimatorStateMachine,UnityEngine.Vector3)\">\n      <summary>\n        <para>Utility function to add a state machine to the state machine.</para>\n      </summary>\n      <param name=\"stateMachine\">The state machine to add.</param>\n      <param name=\"position\">The position of the state machine node.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.AddStateMachineBehaviour(System.Type)\">\n      <summary>\n        <para>Adds a state machine behaviour class of type stateMachineBehaviourType to the AnimatorStateMachine. C# Users can use a generic version.</para>\n      </summary>\n      <param name=\"stateMachineBehaviourType\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.AddStateMachineBehaviour\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.AddStateMachineExitTransition(UnityEditor.Animations.AnimatorStateMachine)\">\n      <summary>\n        <para>Utility function to add an outgoing transition from the source state machine to the exit of it's parent state machine.</para>\n      </summary>\n      <param name=\"sourceStateMachine\">The source state machine.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.AddStateMachineTransition(UnityEditor.Animations.AnimatorStateMachine)\">\n      <summary>\n        <para>Utility function to add an outgoing transition from the source state machine to the destination.</para>\n      </summary>\n      <param name=\"sourceStateMachine\">The source state machine.</param>\n      <param name=\"destinationStateMachine\">The destination state machine.</param>\n      <param name=\"destinationState\">The destination state.</param>\n      <returns>\n        <para>The Animations.AnimatorTransition transition that was created.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.AddStateMachineTransition(UnityEditor.Animations.AnimatorStateMachine,UnityEditor.Animations.AnimatorStateMachine)\">\n      <summary>\n        <para>Utility function to add an outgoing transition from the source state machine to the destination.</para>\n      </summary>\n      <param name=\"sourceStateMachine\">The source state machine.</param>\n      <param name=\"destinationStateMachine\">The destination state machine.</param>\n      <param name=\"destinationState\">The destination state.</param>\n      <returns>\n        <para>The Animations.AnimatorTransition transition that was created.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.AddStateMachineTransition(UnityEditor.Animations.AnimatorStateMachine,UnityEditor.Animations.AnimatorState)\">\n      <summary>\n        <para>Utility function to add an outgoing transition from the source state machine to the destination.</para>\n      </summary>\n      <param name=\"sourceStateMachine\">The source state machine.</param>\n      <param name=\"destinationStateMachine\">The destination state machine.</param>\n      <param name=\"destinationState\">The destination state.</param>\n      <returns>\n        <para>The Animations.AnimatorTransition transition that was created.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.GetStateMachineTransitions(UnityEditor.Animations.AnimatorStateMachine)\">\n      <summary>\n        <para>Gets the list of all outgoing state machine transitions from given state machine.</para>\n      </summary>\n      <param name=\"sourceStateMachine\">The source state machine.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.MakeUniqueStateMachineName(System.String)\">\n      <summary>\n        <para>Makes a unique state machine name in the context of the parent state machine.</para>\n      </summary>\n      <param name=\"name\">Desired name for the state machine.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.MakeUniqueStateName(System.String)\">\n      <summary>\n        <para>Makes a unique state name in the context of the parent state machine.</para>\n      </summary>\n      <param name=\"name\">Desired name for the state.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.RemoveAnyStateTransition(UnityEditor.Animations.AnimatorStateTransition)\">\n      <summary>\n        <para>Utility function to remove an AnyState transition from the state machine.</para>\n      </summary>\n      <param name=\"transition\">The AnyStat transition to remove.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.RemoveEntryTransition(UnityEditor.Animations.AnimatorTransition)\">\n      <summary>\n        <para>Utility function to remove an entry transition from the state machine.</para>\n      </summary>\n      <param name=\"transition\">The transition to remove.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.RemoveState(UnityEditor.Animations.AnimatorState)\">\n      <summary>\n        <para>Utility function to remove a state from the state machine.</para>\n      </summary>\n      <param name=\"state\">The state to remove.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.RemoveStateMachine(UnityEditor.Animations.AnimatorStateMachine)\">\n      <summary>\n        <para>Utility function to remove a state machine from its parent state machine.</para>\n      </summary>\n      <param name=\"stateMachine\">The state machine to remove.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.RemoveStateMachineTransition(UnityEditor.Animations.AnimatorStateMachine,UnityEditor.Animations.AnimatorTransition)\">\n      <summary>\n        <para>Utility function to remove an outgoing transition from source state machine.</para>\n      </summary>\n      <param name=\"transition\">The transition to remove.</param>\n      <param name=\"sourceStateMachine\">The source state machine.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateMachine.SetStateMachineTransitions(UnityEditor.Animations.AnimatorStateMachine,UnityEditor.Animations.AnimatorTransition[])\">\n      <summary>\n        <para>Sets the list of all outgoing state machine transitions from given state machine.</para>\n      </summary>\n      <param name=\"stateMachine\">The source state machine.</param>\n      <param name=\"transitions\">The outgoing transitions.</param>\n      <param name=\"sourceStateMachine\"></param>\n    </member>\n    <member name=\"T:UnityEditor.Animations.AnimatorStateTransition\">\n      <summary>\n        <para>Transitions define when and how the state machine switch from one state to another. AnimatorStateTransition always originate from an Animator State (or AnyState) and have timing parameters.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorStateTransition.canTransitionToSelf\">\n      <summary>\n        <para>Set to true to allow or disallow transition to self during AnyState transition.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorStateTransition.duration\">\n      <summary>\n        <para>The duration of the transition.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorStateTransition.exitTime\">\n      <summary>\n        <para>If AnimatorStateTransition.hasExitTime is true, exitTime represents the exact time at which the transition can take effect.\n\nThis is represented in normalized time, so for example an exit time of 0.75 means that on the first frame where 75% of the animation has played, the Exit Time condition will be true. On the next frame, the condition will be false.\n\nFor looped animations, transitions with exit times smaller than 1 will be evaluated every loop, so you can use this to time your transition with the proper timing in the animation, every loop.\n\nTransitions with exit times greater than one will be evaluated only once, so they can be used to exit at a specific time, after a fixed number of loops. For example, a transition with an exit time of 3.5 will be evaluated once, after three and a half loops.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorStateTransition.hasExitTime\">\n      <summary>\n        <para>When active the transition will have an exit time condition.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorStateTransition.hasFixedDuration\">\n      <summary>\n        <para>Determines whether the duration of the transition is reported in a fixed duration in seconds or as a normalized time.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorStateTransition.interruptionSource\">\n      <summary>\n        <para>Which AnimatorState transitions can interrupt the Transition.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorStateTransition.offset\">\n      <summary>\n        <para>The time at which the destination state will start.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorStateTransition.orderedInterruption\">\n      <summary>\n        <para>The Transition can be interrupted by a transition that has a higher priority.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorStateTransition.#ctor\">\n      <summary>\n        <para>Creates a new animator state transition.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Animations.AnimatorTransition\">\n      <summary>\n        <para>Transitions define when and how the state machine switch from on state to another. AnimatorTransition always originate from a StateMachine or a StateMachine entry. They do not define timing parameters.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorTransition.#ctor\">\n      <summary>\n        <para>Creates a new animator transition.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Animations.AnimatorTransitionBase\">\n      <summary>\n        <para>Base class for animator transitions. Transitions define when and how the state machine switches from one state to another.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorTransitionBase.conditions\">\n      <summary>\n        <para>Animations.AnimatorCondition conditions that need to be met for a transition to happen.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorTransitionBase.destinationState\">\n      <summary>\n        <para>The destination state of the transition.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorTransitionBase.destinationStateMachine\">\n      <summary>\n        <para>The destination state machine of the transition.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorTransitionBase.isExit\">\n      <summary>\n        <para>Is the transition destination the exit of the current state machine.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorTransitionBase.mute\">\n      <summary>\n        <para>Mutes the transition. The transition will never occur.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.AnimatorTransitionBase.solo\">\n      <summary>\n        <para>Mutes all other transitions in the source state.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorTransitionBase.AddCondition(UnityEditor.Animations.AnimatorConditionMode,System.Single,System.String)\">\n      <summary>\n        <para>Utility function to add a condition to a transition.</para>\n      </summary>\n      <param name=\"mode\">The Animations.AnimatorCondition mode of the condition.</param>\n      <param name=\"threshold\">The threshold value of the condition.</param>\n      <param name=\"parameter\">The name of the parameter.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.AnimatorTransitionBase.RemoveCondition(UnityEditor.Animations.AnimatorCondition)\">\n      <summary>\n        <para>Utility function to remove a condition from the transition.</para>\n      </summary>\n      <param name=\"condition\">The condition to remove.</param>\n    </member>\n    <member name=\"T:UnityEditor.Animations.BlendTree\">\n      <summary>\n        <para>Blend trees are used to blend continuously animation between their childs. They can either be 1D or 2D.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.BlendTree.blendParameter\">\n      <summary>\n        <para>Parameter that is used to compute the blending weight of the childs in 1D blend trees or on the X axis of a 2D blend tree.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.BlendTree.blendParameterY\">\n      <summary>\n        <para>Parameter that is used to compute the blending weight of the childs on the Y axis of a 2D blend tree.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.BlendTree.blendType\">\n      <summary>\n        <para>The Blending type can be either 1D or different types of 2D.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.BlendTree.children\">\n      <summary>\n        <para>A copy of the list of the blend tree child motions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.BlendTree.maxThreshold\">\n      <summary>\n        <para>Sets the maximum threshold that will be used by the ChildMotion. Only used when useAutomaticThresholds is true.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.BlendTree.minThreshold\">\n      <summary>\n        <para>Sets the minimum threshold that will be used by the ChildMotion. Only used when useAutomaticThresholds is true.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.BlendTree.useAutomaticThresholds\">\n      <summary>\n        <para>When active, the children's thresholds are automatically spread between 0 and 1.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Animations.BlendTree.AddChild(UnityEngine.Motion)\">\n      <summary>\n        <para>Utility function to add a child motion to a blend trees.</para>\n      </summary>\n      <param name=\"motion\">The motion to add as child.</param>\n      <param name=\"position\">The position of the child. When using 2D blend trees.</param>\n      <param name=\"threshold\">The threshold of the child. When using 1D blend trees.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.BlendTree.AddChild(UnityEngine.Motion,UnityEngine.Vector2)\">\n      <summary>\n        <para>Utility function to add a child motion to a blend trees.</para>\n      </summary>\n      <param name=\"motion\">The motion to add as child.</param>\n      <param name=\"position\">The position of the child. When using 2D blend trees.</param>\n      <param name=\"threshold\">The threshold of the child. When using 1D blend trees.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.BlendTree.AddChild(UnityEngine.Motion,System.Single)\">\n      <summary>\n        <para>Utility function to add a child motion to a blend trees.</para>\n      </summary>\n      <param name=\"motion\">The motion to add as child.</param>\n      <param name=\"position\">The position of the child. When using 2D blend trees.</param>\n      <param name=\"threshold\">The threshold of the child. When using 1D blend trees.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.BlendTree.CreateBlendTreeChild(System.Single)\">\n      <summary>\n        <para>Utility function to add a child blend tree to a blend tree.</para>\n      </summary>\n      <param name=\"position\">The position of the child. When using 2D blend trees.</param>\n      <param name=\"threshold\">The threshold of the child. When using 1D blend trees.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.BlendTree.CreateBlendTreeChild(UnityEngine.Vector2)\">\n      <summary>\n        <para>Utility function to add a child blend tree to a blend tree.</para>\n      </summary>\n      <param name=\"position\">The position of the child. When using 2D blend trees.</param>\n      <param name=\"threshold\">The threshold of the child. When using 1D blend trees.</param>\n    </member>\n    <member name=\"M:UnityEditor.Animations.BlendTree.RemoveChild(System.Int32)\">\n      <summary>\n        <para>Utility function to remove the child of a blend tree.</para>\n      </summary>\n      <param name=\"index\">The index of the blend tree to remove.</param>\n    </member>\n    <member name=\"T:UnityEditor.Animations.BlendTreeType\">\n      <summary>\n        <para>The type of blending algorithm that the blend tree uses.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.BlendTreeType.Direct\">\n      <summary>\n        <para>Direct control of blending weight for each node.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.BlendTreeType.FreeformCartesian2D\">\n      <summary>\n        <para>Best used when your motions do not represent different directions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.BlendTreeType.FreeformDirectional2D\">\n      <summary>\n        <para>This blend type is used when your motions represent different directions, however you can have multiple motions in the same direction, for example \"walk forward\" and \"run forward\".</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.BlendTreeType.Simple1D\">\n      <summary>\n        <para>Basic blending using a single parameter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.BlendTreeType.SimpleDirectional2D\">\n      <summary>\n        <para>Best used when your motions represent different directions, such as \"walk forward\", \"walk backward\", \"walk left\", and \"walk right\", or \"aim up\", \"aim down\", \"aim left\", and \"aim right\".</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Animations.ChildAnimatorState\">\n      <summary>\n        <para>Structure that represents a state in the context of its parent state machine.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.ChildAnimatorState.position\">\n      <summary>\n        <para>The position the the state node in the context of its parent state machine.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.ChildAnimatorState.state\">\n      <summary>\n        <para>The state.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Animations.ChildAnimatorStateMachine\">\n      <summary>\n        <para>Structure that represents a state machine in the context of its parent state machine.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.ChildAnimatorStateMachine.position\">\n      <summary>\n        <para>The position the the state machine node in the context of its parent state machine.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.ChildAnimatorStateMachine.stateMachine\">\n      <summary>\n        <para>The state machine.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Animations.ChildMotion\">\n      <summary>\n        <para>Structure that represents a motion in the context of its parent blend tree.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.ChildMotion.cycleOffset\">\n      <summary>\n        <para>Normalized time offset of the child.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.ChildMotion.directBlendParameter\">\n      <summary>\n        <para>The parameter used by the child when used in a BlendTree of type BlendTreeType.Direct.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.ChildMotion.mirror\">\n      <summary>\n        <para>Mirror of the child.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.ChildMotion.motion\">\n      <summary>\n        <para>The motion itself.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.ChildMotion.position\">\n      <summary>\n        <para>The position of the child. Used in 2D blend trees.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.ChildMotion.threshold\">\n      <summary>\n        <para>The threshold of the child. Used in 1D blend trees.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Animations.ChildMotion.timeScale\">\n      <summary>\n        <para>The relative speed of the child.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Animations.StateMachineBehaviourContext\">\n      <summary>\n        <para>This class contains all the owner's information for this State Machine Behaviour.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.StateMachineBehaviourContext.animatorController\">\n      <summary>\n        <para>The Animations.AnimatorController that owns this state machine behaviour.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.StateMachineBehaviourContext.animatorObject\">\n      <summary>\n        <para>The object that owns this state machine behaviour. Could be an Animations.AnimatorState or Animations.AnimatorStateMachine.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.StateMachineBehaviourContext.layerIndex\">\n      <summary>\n        <para>The animator's layer index that owns this state machine behaviour.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Animations.TransitionInterruptionSource\">\n      <summary>\n        <para>Which AnimatorState transitions can interrupt the Transition.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.TransitionInterruptionSource.Destination\">\n      <summary>\n        <para>The Transition can be interrupted by transitions in the destination AnimatorState.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.TransitionInterruptionSource.DestinationThenSource\">\n      <summary>\n        <para>The Transition can be interrupted by transitions in the source or the destination AnimatorState.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.TransitionInterruptionSource.None\">\n      <summary>\n        <para>The Transition cannot be interrupted. Formely know as Atomic.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.TransitionInterruptionSource.Source\">\n      <summary>\n        <para>The Transition can be interrupted by transitions in the source AnimatorState.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Animations.TransitionInterruptionSource.SourceThenDestination\">\n      <summary>\n        <para>The Transition can be interrupted by transitions in the source or the destination AnimatorState.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AnimationUtility\">\n      <summary>\n        <para>Editor utility functions for modifying animation clips.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AnimationUtility.onCurveWasModified\">\n      <summary>\n        <para>Triggered when an animation curve inside an animation clip has been modified.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.CalculateTransformPath(UnityEngine.Transform,UnityEngine.Transform)\">\n      <summary>\n        <para>Calculates path from root transform to target transform.</para>\n      </summary>\n      <param name=\"targetTransform\"></param>\n      <param name=\"root\"></param>\n    </member>\n    <member name=\"T:UnityEditor.AnimationUtility.CurveModifiedType\">\n      <summary>\n        <para>Describes the type of modification that caused OnCurveWasModified to fire.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.GetAllCurves(UnityEngine.AnimationClip)\">\n      <summary>\n        <para>Retrieves all curves from a specific animation clip.</para>\n      </summary>\n      <param name=\"clip\"></param>\n      <param name=\"includeCurveData\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.GetAllCurves(UnityEngine.AnimationClip,System.Boolean)\">\n      <summary>\n        <para>Retrieves all curves from a specific animation clip.</para>\n      </summary>\n      <param name=\"clip\"></param>\n      <param name=\"includeCurveData\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.GetAnimatableBindings(UnityEngine.GameObject,UnityEngine.GameObject)\">\n      <summary>\n        <para>Returns all the animatable bindings that a specific game object has.</para>\n      </summary>\n      <param name=\"targetObject\"></param>\n      <param name=\"root\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.GetAnimatedObject(UnityEngine.GameObject,UnityEditor.EditorCurveBinding)\">\n      <summary>\n        <para>Returns the animated object that the binding is pointing to.</para>\n      </summary>\n      <param name=\"root\"></param>\n      <param name=\"binding\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.GetAnimationClips(UnityEngine.Animation)\">\n      <summary>\n        <para>Returns the array of AnimationClips that are referenced in the Animation component.</para>\n      </summary>\n      <param name=\"component\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.GetAnimationEvents(UnityEngine.AnimationClip)\">\n      <summary>\n        <para>Retrieves all animation events associated with the animation clip.</para>\n      </summary>\n      <param name=\"clip\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.GetCurveBindings(UnityEngine.AnimationClip)\">\n      <summary>\n        <para>Returns all the float curve bindings currently stored in the clip.</para>\n      </summary>\n      <param name=\"clip\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.GetEditorCurve(UnityEngine.AnimationClip,System.String,System.Type,System.String)\">\n      <summary>\n        <para>Return the float curve that the binding is pointing to.</para>\n      </summary>\n      <param name=\"clip\"></param>\n      <param name=\"relativePath\"></param>\n      <param name=\"type\"></param>\n      <param name=\"propertyName\"></param>\n      <param name=\"binding\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.GetEditorCurve(UnityEngine.AnimationClip,UnityEditor.EditorCurveBinding)\">\n      <summary>\n        <para>Return the float curve that the binding is pointing to.</para>\n      </summary>\n      <param name=\"clip\"></param>\n      <param name=\"relativePath\"></param>\n      <param name=\"type\"></param>\n      <param name=\"propertyName\"></param>\n      <param name=\"binding\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.GetFloatValue(UnityEngine.GameObject,System.String,System.Type,System.String,System.Single&amp;)\">\n      <summary>\n        <para>Retrieves the current float value by sampling a curve value on a specific game object.</para>\n      </summary>\n      <param name=\"root\"></param>\n      <param name=\"relativePath\"></param>\n      <param name=\"type\"></param>\n      <param name=\"propertyName\"></param>\n      <param name=\"data\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.GetGenerateMotionCurves(UnityEngine.AnimationClip)\">\n      <summary>\n        <para>Returns whether the animation clip is set to generate root motion curves.</para>\n      </summary>\n      <param name=\"clip\">AnimationClip to query.</param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.GetKeyBroken(UnityEngine.AnimationCurve,System.Int32)\">\n      <summary>\n        <para>Retrieve the specified keyframe broken tangent flag.</para>\n      </summary>\n      <param name=\"curve\">Curve to query.</param>\n      <param name=\"index\">Keyframe index.</param>\n      <returns>\n        <para>Broken flag at specified index.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.GetKeyLeftTangentMode(UnityEngine.AnimationCurve,System.Int32)\">\n      <summary>\n        <para>Retrieve the left tangent mode of the keyframe at specified index.</para>\n      </summary>\n      <param name=\"curve\">Curve to query.</param>\n      <param name=\"index\">Keyframe index.</param>\n      <returns>\n        <para>Tangent mode at specified index.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.GetKeyRightTangentMode(UnityEngine.AnimationCurve,System.Int32)\">\n      <summary>\n        <para>Retrieve the right tangent mode of the keyframe at specified index.</para>\n      </summary>\n      <param name=\"curve\">Curve to query.</param>\n      <param name=\"index\">Keyframe index.</param>\n      <returns>\n        <para>Tangent mode at specified index.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.GetObjectReferenceCurve(UnityEngine.AnimationClip,UnityEditor.EditorCurveBinding)\">\n      <summary>\n        <para>Return the object reference curve that the binding is pointing to.</para>\n      </summary>\n      <param name=\"clip\"></param>\n      <param name=\"binding\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.GetObjectReferenceCurveBindings(UnityEngine.AnimationClip)\">\n      <summary>\n        <para>Returns all the object reference curve bindings currently stored in the clip.</para>\n      </summary>\n      <param name=\"clip\"></param>\n    </member>\n    <member name=\"T:UnityEditor.AnimationUtility.OnCurveWasModified\">\n      <summary>\n        <para>Triggered when an animation curve inside an animation clip has been modified.</para>\n      </summary>\n      <param name=\"clip\"></param>\n      <param name=\"binding\"></param>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.SetAdditiveReferencePose(UnityEngine.AnimationClip,UnityEngine.AnimationClip,System.Single)\">\n      <summary>\n        <para>Set the additive reference pose from referenceClip at time for animation clip clip.</para>\n      </summary>\n      <param name=\"clip\">The animation clip to be used.</param>\n      <param name=\"referenceClip\">The animation clip containing the reference pose.</param>\n      <param name=\"time\">Time that defines the reference pose in referenceClip.</param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.SetAnimationClips(UnityEngine.Animation,UnityEngine.AnimationClip[])\">\n      <summary>\n        <para>Sets the array of AnimationClips to be referenced in the Animation component.</para>\n      </summary>\n      <param name=\"animation\"></param>\n      <param name=\"clips\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.SetAnimationEvents(UnityEngine.AnimationClip,UnityEngine.AnimationEvent[])\">\n      <summary>\n        <para>Replaces all animation events in the animation clip.</para>\n      </summary>\n      <param name=\"clip\"></param>\n      <param name=\"events\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.SetEditorCurve(UnityEngine.AnimationClip,UnityEditor.EditorCurveBinding,UnityEngine.AnimationCurve)\">\n      <summary>\n        <para>Adds, modifies or removes an editor float curve in a given clip.</para>\n      </summary>\n      <param name=\"clip\">The animation clip to which the curve will be added.</param>\n      <param name=\"binding\">The bindings which defines the path and the property of the curve.</param>\n      <param name=\"curve\">The curve to add. Setting this to null will remove the curve.</param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.SetGenerateMotionCurves(UnityEngine.AnimationClip,System.Boolean)\">\n      <summary>\n        <para>Sets whether the animation clip generates root motion curves.</para>\n      </summary>\n      <param name=\"clip\">AnimationClip to change.</param>\n      <param name=\"value\">Set to true to enable generation of root motion curves.</param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.SetKeyBroken(UnityEngine.AnimationCurve,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Change the specified keyframe broken tangent flag.</para>\n      </summary>\n      <param name=\"curve\">The curve to modify.</param>\n      <param name=\"index\">Keyframe index.</param>\n      <param name=\"broken\">Broken flag.</param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.SetKeyLeftTangentMode(UnityEngine.AnimationCurve,System.Int32,UnityEditor.AnimationUtility/TangentMode)\">\n      <summary>\n        <para>Change the specified keyframe tangent mode.</para>\n      </summary>\n      <param name=\"curve\">The curve to modify.</param>\n      <param name=\"index\">Keyframe index.</param>\n      <param name=\"tangentMode\">Tangent mode.</param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.SetKeyRightTangentMode(UnityEngine.AnimationCurve,System.Int32,UnityEditor.AnimationUtility/TangentMode)\">\n      <summary>\n        <para>Change the specified keyframe tangent mode.</para>\n      </summary>\n      <param name=\"curve\">The curve to modify.</param>\n      <param name=\"index\">Keyframe index.</param>\n      <param name=\"tangentMode\">Tangent mode.</param>\n    </member>\n    <member name=\"M:UnityEditor.AnimationUtility.SetObjectReferenceCurve(UnityEngine.AnimationClip,UnityEditor.EditorCurveBinding,UnityEditor.ObjectReferenceKeyframe[])\">\n      <summary>\n        <para>Adds, modifies or removes an object reference curve in a given clip.</para>\n      </summary>\n      <param name=\"keyframes\">Setting this to null will remove the curve.</param>\n      <param name=\"clip\"></param>\n      <param name=\"binding\"></param>\n    </member>\n    <member name=\"T:UnityEditor.AnimationUtility.TangentMode\">\n      <summary>\n        <para>Tangent constraints on Keyframe.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AnimationUtility.TangentMode.Auto\">\n      <summary>\n        <para>The tangents are automatically set to make the curve go smoothly through the key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AnimationUtility.TangentMode.ClampedAuto\">\n      <summary>\n        <para>The tangents are automatically set to make the curve go smoothly through the key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AnimationUtility.TangentMode.Constant\">\n      <summary>\n        <para>The curve retains a constant value between two keys.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AnimationUtility.TangentMode.Free\">\n      <summary>\n        <para>The tangent can be freely set by dragging the tangent handle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AnimationUtility.TangentMode.Linear\">\n      <summary>\n        <para>The tangent points towards the neighboring key.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ApiCompatibilityLevel\">\n      <summary>\n        <para>.NET API compatibility level.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ApiCompatibilityLevel.NET_2_0\">\n      <summary>\n        <para>.NET 2.0.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ApiCompatibilityLevel.NET_2_0_Subset\">\n      <summary>\n        <para>.NET 2.0 Subset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ApiCompatibilityLevel.NET_4_6\">\n      <summary>\n        <para>.NET 4.6.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ApiCompatibilityLevel.NET_Micro\">\n      <summary>\n        <para>Micro profile, used by Mono scripting backend on iOS, tvOS, and Android if stripping level is set to \"Use micro mscorlib\".</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ApiCompatibilityLevel.NET_Standard_2_0\">\n      <summary>\n        <para>Profile that targets the .NET Standard 2.0.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ApiCompatibilityLevel.NET_Web\">\n      <summary>\n        <para>Web profile, formerly used only by Samsung TV.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ArrayUtility\">\n      <summary>\n        <para>Helpers for builtin arrays ...</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.ArrayUtility.Add(T[]&amp;,T)\">\n      <summary>\n        <para>Appends item to the end of array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"item\"></param>\n    </member>\n    <member name=\"M:UnityEditor.ArrayUtility.AddRange(T[]&amp;,T[])\">\n      <summary>\n        <para>Appends items to the end of array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"items\"></param>\n    </member>\n    <member name=\"M:UnityEditor.ArrayUtility.ArrayEquals(T[],T[])\">\n      <summary>\n        <para>Compares two arrays.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n      <returns>\n        <para>True if both have the same number of elements and the contents are equal.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ArrayUtility.ArrayReferenceEquals(T[],T[])\">\n      <summary>\n        <para>Compares two array references.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n      <returns>\n        <para>True if both have the same number of elements and are the same instances.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ArrayUtility.Clear(T[]&amp;)\">\n      <summary>\n        <para>Clears the array.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEditor.ArrayUtility.Contains(T[],T)\">\n      <summary>\n        <para>Determines if the array contains the item.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"item\"></param>\n      <returns>\n        <para>True if item is in array, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ArrayUtility.FindIndex(T[],System.Predicate`1&lt;T&gt;)\">\n      <summary>\n        <para>Find the index of the first element that satisfies the predicate.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"match\"></param>\n      <returns>\n        <para>The zero-based index of the first occurrence of the element, if found; otherwise, �1.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ArrayUtility.IndexOf(T[],T)\">\n      <summary>\n        <para>Index of first element with value value.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"value\"></param>\n      <returns>\n        <para>The zero-based index of the element, if found; otherwise -1.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ArrayUtility.Insert(T[]&amp;,System.Int32,T)\">\n      <summary>\n        <para>Inserts item item at position index.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n      <param name=\"item\"></param>\n    </member>\n    <member name=\"M:UnityEditor.ArrayUtility.LastIndexOf(T[],T)\">\n      <summary>\n        <para>Index of the last element with value value.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"value\"></param>\n      <returns>\n        <para>The zero-based index of the element, if found; otherwise -1.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ArrayUtility.Remove(T[]&amp;,T)\">\n      <summary>\n        <para>Removes item from array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"item\"></param>\n    </member>\n    <member name=\"M:UnityEditor.ArrayUtility.RemoveAt(T[]&amp;,System.Int32)\">\n      <summary>\n        <para>Remove element at position index.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"T:UnityEditor.AscentCalculationMode\">\n      <summary>\n        <para>Method used for calculating a font's ascent.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AscentCalculationMode.FaceAscender\">\n      <summary>\n        <para>Ascender method.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AscentCalculationMode.FaceBoundingBox\">\n      <summary>\n        <para>Bounding box method.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AscentCalculationMode.Legacy2x\">\n      <summary>\n        <para>Legacy bounding box method.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AspectRatio\">\n      <summary>\n        <para>Aspect ratio.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AspectRatio.Aspect16by10\">\n      <summary>\n        <para>16:10 aspect ratio.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AspectRatio.Aspect16by9\">\n      <summary>\n        <para>16:9 aspect ratio.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AspectRatio.Aspect4by3\">\n      <summary>\n        <para>4:3 aspect ratio.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AspectRatio.Aspect5by4\">\n      <summary>\n        <para>5:4 aspect ratio.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AspectRatio.AspectOthers\">\n      <summary>\n        <para>Undefined aspect ratios.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AssemblyReloadEvents\">\n      <summary>\n        <para>This class has event dispatchers for assembly reload events.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.AssemblyReloadEvents.afterAssemblyReload(UnityEditor.AssemblyReloadEvents/AssemblyReloadCallback)\">\n      <summary>\n        <para>This event is dispatched just after Unity have reloaded all assemblies.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEditor.AssemblyReloadEvents.beforeAssemblyReload(UnityEditor.AssemblyReloadEvents/AssemblyReloadCallback)\">\n      <summary>\n        <para>This event is dispatched just before Unity reloads all assemblies.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"T:UnityEditor.AssemblyReloadEvents.AssemblyReloadCallback\">\n      <summary>\n        <para>Delegate used for assembly reload events.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AssetBundleBuild\">\n      <summary>\n        <para>AssetBundle building map entry.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AssetBundleBuild.addressableNames\">\n      <summary>\n        <para>Addressable name used to load an asset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AssetBundleBuild.assetBundleName\">\n      <summary>\n        <para>AssetBundle name.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AssetBundleBuild.assetBundleVariant\">\n      <summary>\n        <para>AssetBundle variant.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AssetBundleBuild.assetNames\">\n      <summary>\n        <para>Asset names which belong to the given AssetBundle.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AssetDatabase\">\n      <summary>\n        <para>An Interface for accessing assets and performing operations on assets.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.AssetDatabase.importPackageCancelled(UnityEditor.AssetDatabase/ImportPackageCallback)\">\n      <summary>\n        <para>Callback raised whenever a package import is cancelled by the user.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEditor.AssetDatabase.importPackageCompleted(UnityEditor.AssetDatabase/ImportPackageCallback)\">\n      <summary>\n        <para>Callback raised whenever a package import successfully completes.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEditor.AssetDatabase.importPackageFailed(UnityEditor.AssetDatabase/ImportPackageFailedCallback)\">\n      <summary>\n        <para>Callback raised whenever a package import failed.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEditor.AssetDatabase.importPackageStarted(UnityEditor.AssetDatabase/ImportPackageCallback)\">\n      <summary>\n        <para>Callback raised whenever a package import starts.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.AddObjectToAsset(UnityEngine.Object,System.String)\">\n      <summary>\n        <para>Adds objectToAdd to an existing asset at path.</para>\n      </summary>\n      <param name=\"objectToAdd\">Object to add to the existing asset.</param>\n      <param name=\"path\">Filesystem path to the asset.</param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.AddObjectToAsset(UnityEngine.Object,UnityEngine.Object)\">\n      <summary>\n        <para>Adds objectToAdd to an existing asset identified by assetObject.</para>\n      </summary>\n      <param name=\"objectToAdd\"></param>\n      <param name=\"assetObject\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.AssetPathToGUID(System.String)\">\n      <summary>\n        <para>Get the GUID for the asset at path.</para>\n      </summary>\n      <param name=\"path\">Filesystem path for the asset.</param>\n      <returns>\n        <para>GUID</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.ClearLabels(UnityEngine.Object)\">\n      <summary>\n        <para>Removes all labels attached to an asset.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.Contains(UnityEngine.Object)\">\n      <summary>\n        <para>Is object an asset?</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"instanceID\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.Contains(System.Int32)\">\n      <summary>\n        <para>Is object an asset?</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"instanceID\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.CopyAsset(System.String,System.String)\">\n      <summary>\n        <para>Duplicates the asset at path and stores it at newPath.</para>\n      </summary>\n      <param name=\"path\">Filesystem path of the source asset.</param>\n      <param name=\"newPath\">Filesystem path of the new asset to create.</param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.CreateAsset(UnityEngine.Object,System.String)\">\n      <summary>\n        <para>Creates a new asset at path.</para>\n      </summary>\n      <param name=\"asset\">Object to use in creating the asset.</param>\n      <param name=\"path\">Filesystem path for the new asset.</param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.CreateFolder(System.String,System.String)\">\n      <summary>\n        <para>Create a new folder.</para>\n      </summary>\n      <param name=\"parentFolder\">The name of the parent folder.</param>\n      <param name=\"newFolderName\">The name of the new folder.</param>\n      <returns>\n        <para>The GUID of the newly created folder.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.DeleteAsset(System.String)\">\n      <summary>\n        <para>Deletes the asset file at path.</para>\n      </summary>\n      <param name=\"path\">Filesystem path of the asset to be deleted.</param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.ExportPackage(System.String[],System.String)\">\n      <summary>\n        <para>Exports the assets identified by assetPathNames to a unitypackage file in fileName.</para>\n      </summary>\n      <param name=\"assetPathNames\"></param>\n      <param name=\"fileName\"></param>\n      <param name=\"flags\"></param>\n      <param name=\"assetPathName\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.ExportPackage(System.String,System.String)\">\n      <summary>\n        <para>Exports the assets identified by assetPathNames to a unitypackage file in fileName.</para>\n      </summary>\n      <param name=\"assetPathNames\"></param>\n      <param name=\"fileName\"></param>\n      <param name=\"flags\"></param>\n      <param name=\"assetPathName\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.ExportPackage(System.String,System.String,UnityEditor.ExportPackageOptions)\">\n      <summary>\n        <para>Exports the assets identified by assetPathNames to a unitypackage file in fileName.</para>\n      </summary>\n      <param name=\"assetPathNames\"></param>\n      <param name=\"fileName\"></param>\n      <param name=\"flags\"></param>\n      <param name=\"assetPathName\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.ExportPackage(System.String[],System.String,UnityEditor.ExportPackageOptions)\">\n      <summary>\n        <para>Exports the assets identified by assetPathNames to a unitypackage file in fileName.</para>\n      </summary>\n      <param name=\"assetPathNames\"></param>\n      <param name=\"fileName\"></param>\n      <param name=\"flags\"></param>\n      <param name=\"assetPathName\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.ExtractAsset(UnityEngine.Object,System.String)\">\n      <summary>\n        <para>Creates an external Asset from an object (such as a Material) by extracting it from within an imported asset (such as an FBX file).</para>\n      </summary>\n      <param name=\"asset\">The sub-asset to extract.</param>\n      <param name=\"newPath\">The file path of the new Asset.</param>\n      <returns>\n        <para>An empty string if Unity has successfully extracted the Asset, or an error message if not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.FindAssets(System.String)\">\n      <summary>\n        <para>Search the asset database using the search filter string.</para>\n      </summary>\n      <param name=\"filter\">The filter string can contain search data.  See below for\n        details about this string.</param>\n      <param name=\"searchInFolders\">The folders where the search will start.</param>\n      <returns>\n        <para>Array of matching asset. Note that GUIDs will be returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.FindAssets(System.String,System.String[])\">\n      <summary>\n        <para>Search the asset database using the search filter string.</para>\n      </summary>\n      <param name=\"filter\">The filter string can contain search data.  See below for\n        details about this string.</param>\n      <param name=\"searchInFolders\">The folders where the search will start.</param>\n      <returns>\n        <para>Array of matching asset. Note that GUIDs will be returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.ForceReserializeAssets\">\n      <summary>\n        <para>Forcibly load and re-serialize the given assets, flushing any outstanding data changes to disk.</para>\n      </summary>\n      <param name=\"assetPaths\">The paths to the assets that should be reserialized. If omitted, will reserialize all assets in the project.</param>\n      <param name=\"options\">Specify whether you want to reserialize the assets themselves, their .meta files, or both. If omitted, defaults to both.</param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.ForceReserializeAssets\">\n      <summary>\n        <para>Forcibly load and re-serialize the given assets, flushing any outstanding data changes to disk.</para>\n      </summary>\n      <param name=\"assetPaths\">The paths to the assets that should be reserialized. If omitted, will reserialize all assets in the project.</param>\n      <param name=\"options\">Specify whether you want to reserialize the assets themselves, their .meta files, or both. If omitted, defaults to both.</param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.ForceReserializeAssets\">\n      <summary>\n        <para>Forcibly load and re-serialize the given assets, flushing any outstanding data changes to disk.</para>\n      </summary>\n      <param name=\"assetPaths\">The paths to the assets that should be reserialized. If omitted, will reserialize all assets in the project.</param>\n      <param name=\"options\">Specify whether you want to reserialize the assets themselves, their .meta files, or both. If omitted, defaults to both.</param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GenerateUniqueAssetPath(System.String)\">\n      <summary>\n        <para>Creates a new unique path for an asset.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetAllAssetBundleNames\">\n      <summary>\n        <para>Return all the AssetBundle names in the asset database.</para>\n      </summary>\n      <returns>\n        <para>Array of asset bundle names.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetAssetBundleDependencies(System.String,System.Boolean)\">\n      <summary>\n        <para>Given an assetBundleName, returns the list of AssetBundles that it depends on.</para>\n      </summary>\n      <param name=\"assetBundleName\">The name of the AssetBundle for which dependencies are required.</param>\n      <param name=\"recursive\">If false, returns only AssetBundles which are direct dependencies of the input; if true, includes all indirect dependencies of the input.</param>\n      <returns>\n        <para>The names of all AssetBundles that the input depends on.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetAssetDependencyHash(System.String)\">\n      <summary>\n        <para>Returns the hash of all the dependencies of an asset.</para>\n      </summary>\n      <param name=\"path\">Path to the asset.</param>\n      <returns>\n        <para>Aggregate hash.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetAssetOrScenePath(UnityEngine.Object)\">\n      <summary>\n        <para>Returns the path name relative to the project folder where the asset is stored.</para>\n      </summary>\n      <param name=\"assetObject\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetAssetPath(System.Int32)\">\n      <summary>\n        <para>Returns the path name relative to the project folder where the asset is stored.</para>\n      </summary>\n      <param name=\"instanceID\">The instance ID of the asset.</param>\n      <param name=\"assetObject\">A reference to the asset.</param>\n      <returns>\n        <para>The asset path name, or null, or an empty string if the asset does not exist.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetAssetPath(UnityEngine.Object)\">\n      <summary>\n        <para>Returns the path name relative to the project folder where the asset is stored.</para>\n      </summary>\n      <param name=\"instanceID\">The instance ID of the asset.</param>\n      <param name=\"assetObject\">A reference to the asset.</param>\n      <returns>\n        <para>The asset path name, or null, or an empty string if the asset does not exist.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetAssetPathFromTextMetaFilePath(System.String)\">\n      <summary>\n        <para>Gets the path to the asset file associated with a text .meta file.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetAssetPathsFromAssetBundle(System.String)\">\n      <summary>\n        <para>Get the paths of the assets which have been marked with the given assetBundle name.</para>\n      </summary>\n      <param name=\"assetBundleName\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetAssetPathsFromAssetBundleAndAssetName(System.String,System.String)\">\n      <summary>\n        <para>Get the Asset paths for all Assets tagged with assetBundleName and\n                named assetName.</para>\n      </summary>\n      <param name=\"assetBundleName\"></param>\n      <param name=\"assetName\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetCachedIcon(System.String)\">\n      <summary>\n        <para>Retrieves an icon for the asset at the given asset path.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetCurrentCacheServerIp\">\n      <summary>\n        <para>Gets the IP address of the Cache Server currently in use by the Editor.</para>\n      </summary>\n      <returns>\n        <para>Returns a string representation of the current Cache Server IP address.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetDependencies(System.String)\">\n      <summary>\n        <para>Given a pathName, returns the list of all assets that it depends on.</para>\n      </summary>\n      <param name=\"pathName\">The path to the asset for which dependencies are required.</param>\n      <param name=\"recursive\">If false, return only assets which are direct dependencies of the input; if true, include all indirect dependencies of the input. Defaults to true.</param>\n      <returns>\n        <para>The paths of all assets that the input depends on.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetDependencies(System.String,System.Boolean)\">\n      <summary>\n        <para>Given a pathName, returns the list of all assets that it depends on.</para>\n      </summary>\n      <param name=\"pathName\">The path to the asset for which dependencies are required.</param>\n      <param name=\"recursive\">If false, return only assets which are direct dependencies of the input; if true, include all indirect dependencies of the input. Defaults to true.</param>\n      <returns>\n        <para>The paths of all assets that the input depends on.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetDependencies(System.String[])\">\n      <summary>\n        <para>Given an array of pathNames, returns the list of all assets that the input depend on.</para>\n      </summary>\n      <param name=\"pathNames\">The path to the assets for which dependencies are required.</param>\n      <param name=\"recursive\">If false, return only assets which are direct dependencies of the input; if true, include all indirect dependencies of the input. Defaults to true.</param>\n      <returns>\n        <para>The paths of all assets that the input depends on.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetDependencies(System.String[],System.Boolean)\">\n      <summary>\n        <para>Given an array of pathNames, returns the list of all assets that the input depend on.</para>\n      </summary>\n      <param name=\"pathNames\">The path to the assets for which dependencies are required.</param>\n      <param name=\"recursive\">If false, return only assets which are direct dependencies of the input; if true, include all indirect dependencies of the input. Defaults to true.</param>\n      <returns>\n        <para>The paths of all assets that the input depends on.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetImplicitAssetBundleName(System.String)\">\n      <summary>\n        <para>Returns the name of the AssetBundle that a given asset belongs to.</para>\n      </summary>\n      <param name=\"assetPath\">The asset's path.</param>\n      <returns>\n        <para>Returns the name of the AssetBundle that a given asset belongs to. See the method description for more details.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetImplicitAssetBundleVariantName(System.String)\">\n      <summary>\n        <para>Returns the name of the AssetBundle Variant that a given asset belongs to.</para>\n      </summary>\n      <param name=\"assetPath\">The asset's path.</param>\n      <returns>\n        <para>Returns the name of the AssetBundle Variant that a given asset belongs to. See the method description for more details.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetLabels(UnityEngine.Object)\">\n      <summary>\n        <para>Returns all labels attached to a given asset.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetMainAssetTypeAtPath(System.String)\">\n      <summary>\n        <para>Returns the type of the main asset object at assetPath.</para>\n      </summary>\n      <param name=\"assetPath\">Filesystem path of the asset to load.</param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetSubFolders(System.String)\">\n      <summary>\n        <para>Given a path to a directory in the Assets folder, relative to the project folder, this method will return an array of all its subdirectories.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetTextMetaDataPathFromAssetPath(System.String)\">\n      <summary>\n        <para>Gets the path to the text .meta file associated with an asset.</para>\n      </summary>\n      <param name=\"path\">The path to the asset.</param>\n      <returns>\n        <para>The path to the .meta text file or empty string if the file does not exist.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetTextMetaFilePathFromAssetPath(System.String)\">\n      <summary>\n        <para>Gets the path to the text .meta file associated with an asset.</para>\n      </summary>\n      <param name=\"path\">The path to the asset.</param>\n      <returns>\n        <para>The path to the .meta text file or empty string if the file does not exist.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GetUnusedAssetBundleNames\">\n      <summary>\n        <para>Return all the unused assetBundle names in the asset database.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.GUIDToAssetPath(System.String)\">\n      <summary>\n        <para>Translate a GUID to its current asset path.</para>\n      </summary>\n      <param name=\"guid\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.ImportAsset(System.String)\">\n      <summary>\n        <para>Import asset at path.</para>\n      </summary>\n      <param name=\"path\"></param>\n      <param name=\"options\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.ImportAsset(System.String,UnityEditor.ImportAssetOptions)\">\n      <summary>\n        <para>Import asset at path.</para>\n      </summary>\n      <param name=\"path\"></param>\n      <param name=\"options\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.ImportPackage(System.String,System.Boolean)\">\n      <summary>\n        <para>Imports package at packagePath into the current project.</para>\n      </summary>\n      <param name=\"packagePath\"></param>\n      <param name=\"interactive\"></param>\n    </member>\n    <member name=\"T:UnityEditor.AssetDatabase.ImportPackageCallback\">\n      <summary>\n        <para>Delegate to be called from AssetDatabase.ImportPackage callbacks. packageName is the name of the package that raised the callback.</para>\n      </summary>\n      <param name=\"packageName\"></param>\n    </member>\n    <member name=\"T:UnityEditor.AssetDatabase.ImportPackageFailedCallback\">\n      <summary>\n        <para>Delegate to be called from AssetDatabase.ImportPackage callbacks. packageName is the name of the package that raised the callback. errorMessage is the reason for the failure.</para>\n      </summary>\n      <param name=\"packageName\"></param>\n      <param name=\"errorMessage\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsForeignAsset(UnityEngine.Object)\">\n      <summary>\n        <para>Determines whether the Asset is a foreign Asset.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"instanceID\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsForeignAsset(System.Int32)\">\n      <summary>\n        <para>Determines whether the Asset is a foreign Asset.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"instanceID\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsMainAsset(UnityEngine.Object)\">\n      <summary>\n        <para>Is asset a main asset in the project window?</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"instanceID\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsMainAsset(System.Int32)\">\n      <summary>\n        <para>Is asset a main asset in the project window?</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"instanceID\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsMainAssetAtPathLoaded(System.String)\">\n      <summary>\n        <para>Returns true if the main asset object at assetPath is loaded in memory.</para>\n      </summary>\n      <param name=\"assetPath\">Filesystem path of the asset to load.</param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsMetaFileOpenForEdit(UnityEngine.Object,UnityEditor.StatusQueryOptions)\">\n      <summary>\n        <para>Query whether an asset's metadata (.meta) file is open for edit in version control.</para>\n      </summary>\n      <param name=\"assetObject\">Object representing the asset whose metadata status you wish to query.</param>\n      <param name=\"message\">Returns a reason for the asset metadata not being open for edit.</param>\n      <param name=\"StatusQueryOptions\">Options for how the version control system should be queried. These options can effect the speed and accuracy of the query.</param>\n      <param name=\"statusOptions\"></param>\n      <returns>\n        <para>True if the asset's metadata is considered open for edit by the selected version control system.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsMetaFileOpenForEdit(UnityEngine.Object,System.String&amp;,UnityEditor.StatusQueryOptions)\">\n      <summary>\n        <para>Query whether an asset's metadata (.meta) file is open for edit in version control.</para>\n      </summary>\n      <param name=\"assetObject\">Object representing the asset whose metadata status you wish to query.</param>\n      <param name=\"message\">Returns a reason for the asset metadata not being open for edit.</param>\n      <param name=\"StatusQueryOptions\">Options for how the version control system should be queried. These options can effect the speed and accuracy of the query.</param>\n      <param name=\"statusOptions\"></param>\n      <returns>\n        <para>True if the asset's metadata is considered open for edit by the selected version control system.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsMetaFileOpenForEdit(UnityEngine.Object)\">\n      <summary>\n        <para>Query whether an asset's metadata (.meta) file is open for edit in version control.</para>\n      </summary>\n      <param name=\"assetObject\">Object representing the asset whose metadata status you wish to query.</param>\n      <param name=\"message\">Returns a reason for the asset metadata not being open for edit.</param>\n      <param name=\"StatusQueryOptions\">Options for how the version control system should be queried. These options can effect the speed and accuracy of the query.</param>\n      <param name=\"statusOptions\"></param>\n      <returns>\n        <para>True if the asset's metadata is considered open for edit by the selected version control system.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsMetaFileOpenForEdit(UnityEngine.Object,System.String&amp;)\">\n      <summary>\n        <para>Query whether an asset's metadata (.meta) file is open for edit in version control.</para>\n      </summary>\n      <param name=\"assetObject\">Object representing the asset whose metadata status you wish to query.</param>\n      <param name=\"message\">Returns a reason for the asset metadata not being open for edit.</param>\n      <param name=\"StatusQueryOptions\">Options for how the version control system should be queried. These options can effect the speed and accuracy of the query.</param>\n      <param name=\"statusOptions\"></param>\n      <returns>\n        <para>True if the asset's metadata is considered open for edit by the selected version control system.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsNativeAsset(UnityEngine.Object)\">\n      <summary>\n        <para>Determines whether the Asset is a native Asset.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"instanceID\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsNativeAsset(System.Int32)\">\n      <summary>\n        <para>Determines whether the Asset is a native Asset.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"instanceID\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsOpenForEdit(UnityEngine.Object,UnityEditor.StatusQueryOptions)\">\n      <summary>\n        <para>Query whether an asset file is open for edit in version control.</para>\n      </summary>\n      <param name=\"assetObject\">Object representing the asset whose status you wish to query.</param>\n      <param name=\"assetOrMetaFilePath\">Path to the asset file or its .meta file on disk, relative to project folder.</param>\n      <param name=\"message\">Returns a reason for the asset not being open for edit.</param>\n      <param name=\"StatusQueryOptions\">Options for how the version control system should be queried. These options can effect the speed and accuracy of the query.</param>\n      <param name=\"statusOptions\"></param>\n      <returns>\n        <para>True if the asset is considered open for edit by the selected version control system.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsOpenForEdit(System.String,UnityEditor.StatusQueryOptions)\">\n      <summary>\n        <para>Query whether an asset file is open for edit in version control.</para>\n      </summary>\n      <param name=\"assetObject\">Object representing the asset whose status you wish to query.</param>\n      <param name=\"assetOrMetaFilePath\">Path to the asset file or its .meta file on disk, relative to project folder.</param>\n      <param name=\"message\">Returns a reason for the asset not being open for edit.</param>\n      <param name=\"StatusQueryOptions\">Options for how the version control system should be queried. These options can effect the speed and accuracy of the query.</param>\n      <param name=\"statusOptions\"></param>\n      <returns>\n        <para>True if the asset is considered open for edit by the selected version control system.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsOpenForEdit(UnityEngine.Object,System.String&amp;,UnityEditor.StatusQueryOptions)\">\n      <summary>\n        <para>Query whether an asset file is open for edit in version control.</para>\n      </summary>\n      <param name=\"assetObject\">Object representing the asset whose status you wish to query.</param>\n      <param name=\"assetOrMetaFilePath\">Path to the asset file or its .meta file on disk, relative to project folder.</param>\n      <param name=\"message\">Returns a reason for the asset not being open for edit.</param>\n      <param name=\"StatusQueryOptions\">Options for how the version control system should be queried. These options can effect the speed and accuracy of the query.</param>\n      <param name=\"statusOptions\"></param>\n      <returns>\n        <para>True if the asset is considered open for edit by the selected version control system.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsOpenForEdit(System.String,System.String&amp;,UnityEditor.StatusQueryOptions)\">\n      <summary>\n        <para>Query whether an asset file is open for edit in version control.</para>\n      </summary>\n      <param name=\"assetObject\">Object representing the asset whose status you wish to query.</param>\n      <param name=\"assetOrMetaFilePath\">Path to the asset file or its .meta file on disk, relative to project folder.</param>\n      <param name=\"message\">Returns a reason for the asset not being open for edit.</param>\n      <param name=\"StatusQueryOptions\">Options for how the version control system should be queried. These options can effect the speed and accuracy of the query.</param>\n      <param name=\"statusOptions\"></param>\n      <returns>\n        <para>True if the asset is considered open for edit by the selected version control system.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsOpenForEdit(UnityEngine.Object)\">\n      <summary>\n        <para>Query whether an asset file is open for edit in version control.</para>\n      </summary>\n      <param name=\"assetObject\">Object representing the asset whose status you wish to query.</param>\n      <param name=\"assetOrMetaFilePath\">Path to the asset file or its .meta file on disk, relative to project folder.</param>\n      <param name=\"message\">Returns a reason for the asset not being open for edit.</param>\n      <param name=\"StatusQueryOptions\">Options for how the version control system should be queried. These options can effect the speed and accuracy of the query.</param>\n      <param name=\"statusOptions\"></param>\n      <returns>\n        <para>True if the asset is considered open for edit by the selected version control system.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsOpenForEdit(System.String)\">\n      <summary>\n        <para>Query whether an asset file is open for edit in version control.</para>\n      </summary>\n      <param name=\"assetObject\">Object representing the asset whose status you wish to query.</param>\n      <param name=\"assetOrMetaFilePath\">Path to the asset file or its .meta file on disk, relative to project folder.</param>\n      <param name=\"message\">Returns a reason for the asset not being open for edit.</param>\n      <param name=\"StatusQueryOptions\">Options for how the version control system should be queried. These options can effect the speed and accuracy of the query.</param>\n      <param name=\"statusOptions\"></param>\n      <returns>\n        <para>True if the asset is considered open for edit by the selected version control system.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsOpenForEdit(UnityEngine.Object,System.String&amp;)\">\n      <summary>\n        <para>Query whether an asset file is open for edit in version control.</para>\n      </summary>\n      <param name=\"assetObject\">Object representing the asset whose status you wish to query.</param>\n      <param name=\"assetOrMetaFilePath\">Path to the asset file or its .meta file on disk, relative to project folder.</param>\n      <param name=\"message\">Returns a reason for the asset not being open for edit.</param>\n      <param name=\"StatusQueryOptions\">Options for how the version control system should be queried. These options can effect the speed and accuracy of the query.</param>\n      <param name=\"statusOptions\"></param>\n      <returns>\n        <para>True if the asset is considered open for edit by the selected version control system.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsOpenForEdit(System.String,System.String&amp;)\">\n      <summary>\n        <para>Query whether an asset file is open for edit in version control.</para>\n      </summary>\n      <param name=\"assetObject\">Object representing the asset whose status you wish to query.</param>\n      <param name=\"assetOrMetaFilePath\">Path to the asset file or its .meta file on disk, relative to project folder.</param>\n      <param name=\"message\">Returns a reason for the asset not being open for edit.</param>\n      <param name=\"StatusQueryOptions\">Options for how the version control system should be queried. These options can effect the speed and accuracy of the query.</param>\n      <param name=\"statusOptions\"></param>\n      <returns>\n        <para>True if the asset is considered open for edit by the selected version control system.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsSubAsset(UnityEngine.Object)\">\n      <summary>\n        <para>Does the asset form part of another asset?</para>\n      </summary>\n      <param name=\"obj\">The asset Object to query.</param>\n      <param name=\"instanceID\">Instance ID of the asset Object to query.</param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsSubAsset(System.Int32)\">\n      <summary>\n        <para>Does the asset form part of another asset?</para>\n      </summary>\n      <param name=\"obj\">The asset Object to query.</param>\n      <param name=\"instanceID\">Instance ID of the asset Object to query.</param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.IsValidFolder(System.String)\">\n      <summary>\n        <para>Given a path to a folder, returns true if it exists, false otherwise.</para>\n      </summary>\n      <param name=\"path\">The path to the folder.</param>\n      <returns>\n        <para>Returns true if the folder exists.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.LoadAllAssetRepresentationsAtPath(System.String)\">\n      <summary>\n        <para>Returns all sub Assets at assetPath.</para>\n      </summary>\n      <param name=\"assetPath\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.LoadAllAssetsAtPath(System.String)\">\n      <summary>\n        <para>Returns an array of all Assets at assetPath.</para>\n      </summary>\n      <param name=\"assetPath\">Filesystem path to the asset.</param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.LoadAssetAtPath(System.String,System.Type)\">\n      <summary>\n        <para>Returns the first asset object of type type at given path assetPath.</para>\n      </summary>\n      <param name=\"assetPath\">Path of the asset to load.</param>\n      <param name=\"type\">Data type of the asset.</param>\n      <returns>\n        <para>The asset matching the parameters.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.LoadMainAssetAtPath(System.String)\">\n      <summary>\n        <para>Returns the main asset object at assetPath.</para>\n      </summary>\n      <param name=\"assetPath\">Filesystem path of the asset to load.</param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.MoveAsset(System.String,System.String)\">\n      <summary>\n        <para>Move an asset file (or folder) from one folder to another.</para>\n      </summary>\n      <param name=\"oldPath\">The path where the asset currently resides.</param>\n      <param name=\"newPath\">The path which the asset should be moved to.</param>\n      <returns>\n        <para>An empty string if the asset has been successfully moved, otherwise an error message.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.MoveAssetToTrash(System.String)\">\n      <summary>\n        <para>Moves the asset at path to the trash.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.OpenAsset(System.Int32)\">\n      <summary>\n        <para>Opens the asset with associated application.</para>\n      </summary>\n      <param name=\"instanceID\"></param>\n      <param name=\"lineNumber\"></param>\n      <param name=\"target\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.OpenAsset(System.Int32,System.Int32)\">\n      <summary>\n        <para>Opens the asset with associated application.</para>\n      </summary>\n      <param name=\"instanceID\"></param>\n      <param name=\"lineNumber\"></param>\n      <param name=\"target\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.OpenAsset(UnityEngine.Object)\">\n      <summary>\n        <para>Opens the asset with associated application.</para>\n      </summary>\n      <param name=\"instanceID\"></param>\n      <param name=\"lineNumber\"></param>\n      <param name=\"target\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.OpenAsset(UnityEngine.Object,System.Int32)\">\n      <summary>\n        <para>Opens the asset with associated application.</para>\n      </summary>\n      <param name=\"instanceID\"></param>\n      <param name=\"lineNumber\"></param>\n      <param name=\"target\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.OpenAsset(UnityEngine.Object[])\">\n      <summary>\n        <para>Opens the asset(s) with associated application(s).</para>\n      </summary>\n      <param name=\"objects\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.Refresh()\">\n      <summary>\n        <para>Import any changed assets.</para>\n      </summary>\n      <param name=\"options\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.Refresh(UnityEditor.ImportAssetOptions)\">\n      <summary>\n        <para>Import any changed assets.</para>\n      </summary>\n      <param name=\"options\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.ReleaseCachedFileHandles\">\n      <summary>\n        <para>Calling this function will release file handles internally cached by Unity. This allows modifying asset or meta files safely thus avoiding potential file sharing IO errors.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.RemoveAssetBundleName(System.String,System.Boolean)\">\n      <summary>\n        <para>Remove the assetBundle name from the asset database. The forceRemove flag is used to indicate if you want to remove it even it's in use.</para>\n      </summary>\n      <param name=\"assetBundleName\">The assetBundle name you want to remove.</param>\n      <param name=\"forceRemove\">Flag to indicate if you want to remove the assetBundle name even it's in use.</param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.RemoveUnusedAssetBundleNames\">\n      <summary>\n        <para>Remove all the unused assetBundle names in the asset database.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.RenameAsset(System.String,System.String)\">\n      <summary>\n        <para>Rename an asset file.</para>\n      </summary>\n      <param name=\"pathName\">The path where the asset currently resides.</param>\n      <param name=\"newName\">The new name which should be given to the asset.</param>\n      <returns>\n        <para>An empty string, if the asset has been successfully renamed, otherwise an error message.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.SaveAssets\">\n      <summary>\n        <para>Writes all unsaved asset changes to disk.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.SetLabels(UnityEngine.Object,System.String[])\">\n      <summary>\n        <para>Replaces that list of labels on an asset.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"labels\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.SetMainObject(UnityEngine.Object,System.String)\">\n      <summary>\n        <para>Specifies which object in the asset file should become the main object after the next import.</para>\n      </summary>\n      <param name=\"mainObject\">The object to become the main object.</param>\n      <param name=\"assetPath\">Path to the asset file.</param>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.StartAssetEditing\">\n      <summary>\n        <para>Begin Asset importing. This lets you group several asset imports together into one larger import.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.StopAssetEditing\">\n      <summary>\n        <para>Stop Asset importing. This lets you group several asset imports together into one larger import.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.TryGetGUIDAndLocalFileIdentifier(UnityEngine.Object,System.String&amp;,System.Int32&amp;)\">\n      <summary>\n        <para>Warning Use the overload with a long localId parameter. Using the overload with an integer localId parameter can cause an integer overflow in localId. This can happen when the object passed to the API is part of a Prefab.\n\nGet the GUID and local file id from an object instance id.</para>\n      </summary>\n      <param name=\"instanceID\">InstanceID of the object to retrieve information for.</param>\n      <param name=\"obj\">The object to retrieve GUID and File Id for.</param>\n      <param name=\"guid\">The GUID of the asset.</param>\n      <param name=\"localId\">The local file identifier of this asset.</param>\n      <returns>\n        <para>True if the guid and file id were successfully found, false if not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.TryGetGUIDAndLocalFileIdentifier(System.Int32,System.String&amp;,System.Int32&amp;)\">\n      <summary>\n        <para>Warning Use the overload with a long localId parameter. Using the overload with an integer localId parameter can cause an integer overflow in localId. This can happen when the object passed to the API is part of a Prefab.\n\nGet the GUID and local file id from an object instance id.</para>\n      </summary>\n      <param name=\"instanceID\">InstanceID of the object to retrieve information for.</param>\n      <param name=\"obj\">The object to retrieve GUID and File Id for.</param>\n      <param name=\"guid\">The GUID of the asset.</param>\n      <param name=\"localId\">The local file identifier of this asset.</param>\n      <returns>\n        <para>True if the guid and file id were successfully found, false if not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.TryGetGUIDAndLocalFileIdentifier(UnityEngine.Object,System.String&amp;,System.Int64&amp;)\">\n      <summary>\n        <para>Warning Use the overload with a long localId parameter. Using the overload with an integer localId parameter can cause an integer overflow in localId. This can happen when the object passed to the API is part of a Prefab.\n\nGet the GUID and local file id from an object instance id.</para>\n      </summary>\n      <param name=\"instanceID\">InstanceID of the object to retrieve information for.</param>\n      <param name=\"obj\">The object to retrieve GUID and File Id for.</param>\n      <param name=\"guid\">The GUID of the asset.</param>\n      <param name=\"localId\">The local file identifier of this asset.</param>\n      <returns>\n        <para>True if the guid and file id were successfully found, false if not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.TryGetGUIDAndLocalFileIdentifier(System.Int32,System.String&amp;,System.Int64&amp;)\">\n      <summary>\n        <para>Warning Use the overload with a long localId parameter. Using the overload with an integer localId parameter can cause an integer overflow in localId. This can happen when the object passed to the API is part of a Prefab.\n\nGet the GUID and local file id from an object instance id.</para>\n      </summary>\n      <param name=\"instanceID\">InstanceID of the object to retrieve information for.</param>\n      <param name=\"obj\">The object to retrieve GUID and File Id for.</param>\n      <param name=\"guid\">The GUID of the asset.</param>\n      <param name=\"localId\">The local file identifier of this asset.</param>\n      <returns>\n        <para>True if the guid and file id were successfully found, false if not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.ValidateMoveAsset(System.String,System.String)\">\n      <summary>\n        <para>Checks if an asset file can be moved from one folder to another. (Without actually moving the file).</para>\n      </summary>\n      <param name=\"oldPath\">The path where the asset currently resides.</param>\n      <param name=\"newPath\">The path which the asset should be moved to.</param>\n      <returns>\n        <para>An empty string if the asset can be moved, otherwise an error message.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetDatabase.WriteImportSettingsIfDirty(System.String)\">\n      <summary>\n        <para>Writes the import settings to disk.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"T:UnityEditor.AssetDeleteResult\">\n      <summary>\n        <para>Result of Asset delete operation</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AssetDeleteResult.DidDelete\">\n      <summary>\n        <para>Tells Unity that the asset was deleted by the callback. Unity will not try to delete the asset, but will delete the cached version and preview file.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AssetDeleteResult.DidNotDelete\">\n      <summary>\n        <para>Tells the internal implementation that the callback did not delete the asset. The asset will be delete by the internal implementation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AssetDeleteResult.FailedDelete\">\n      <summary>\n        <para>Tells Unity that the file cannot be deleted and Unity should leave it alone.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AssetImporter\">\n      <summary>\n        <para>Base class from which asset importers for specific asset types derive.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AssetImporter.assetBundleName\">\n      <summary>\n        <para>Get or set the AssetBundle name.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AssetImporter.assetBundleVariant\">\n      <summary>\n        <para>Get or set the AssetBundle variant.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AssetImporter.assetPath\">\n      <summary>\n        <para>The path name of the asset for this importer. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AssetImporter.importSettingsMissing\">\n      <summary>\n        <para>The value is true when no meta file is provided with the imported asset.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AssetImporter.userData\">\n      <summary>\n        <para>Get or set any user data.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AssetImporter.AddRemap(UnityEditor.AssetImporter/SourceAssetIdentifier,UnityEngine.Object)\">\n      <summary>\n        <para>Map a sub-asset from an imported asset (such as an FBX file) to an external Asset of the same type.</para>\n      </summary>\n      <param name=\"identifier\">The identifier of the sub-asset.</param>\n      <param name=\"externalObject\">The object to be mapped to the internal object. Can belong to another Prefab or Asset, but not the Asset that is being changed.</param>\n    </member>\n    <member name=\"M:UnityEditor.AssetImporter.GetAtPath(System.String)\">\n      <summary>\n        <para>Retrieves the asset importer for the asset at path.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetImporter.GetExternalObjectMap\">\n      <summary>\n        <para>Gets a copy of the external object map used by the AssetImporter.</para>\n      </summary>\n      <returns>\n        <para>The map between a sub-asset and an external Asset.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetImporter.RemoveRemap(UnityEditor.AssetImporter/SourceAssetIdentifier)\">\n      <summary>\n        <para>Removes an item from the map of external objects.</para>\n      </summary>\n      <param name=\"identifier\">The identifier of the sub-asset.</param>\n      <returns>\n        <para>Returns true if an element was removed, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AssetImporter.SaveAndReimport\">\n      <summary>\n        <para>Save asset importer settings if asset importer is dirty.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AssetImporter.SetAssetBundleNameAndVariant(System.String,System.String)\">\n      <summary>\n        <para>Set the AssetBundle name and variant.</para>\n      </summary>\n      <param name=\"assetBundleName\">AssetBundle name.</param>\n      <param name=\"assetBundleVariant\">AssetBundle variant.</param>\n    </member>\n    <member name=\"T:UnityEditor.AssetImporter.SourceAssetIdentifier\">\n      <summary>\n        <para>Represents a unique identifier for a sub-asset embedded in an imported Asset (such as an FBX file).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AssetImporter.SourceAssetIdentifier.name\">\n      <summary>\n        <para>The name of the Asset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AssetImporter.SourceAssetIdentifier.type\">\n      <summary>\n        <para>The type of the Asset.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AssetImporter.SourceAssetIdentifier.#ctor(UnityEngine.Object)\">\n      <summary>\n        <para>Constructs a SourceAssetIdentifier.</para>\n      </summary>\n      <param name=\"asset\">The the sub-asset embedded in the imported Asset.</param>\n      <param name=\"type\">The type of the sub-asset embedded in the imported Asset.</param>\n      <param name=\"name\">The name of the sub-asset embedded in the imported Asset.</param>\n    </member>\n    <member name=\"M:UnityEditor.AssetImporter.SourceAssetIdentifier.#ctor(System.Type,System.String)\">\n      <summary>\n        <para>Constructs a SourceAssetIdentifier.</para>\n      </summary>\n      <param name=\"asset\">The the sub-asset embedded in the imported Asset.</param>\n      <param name=\"type\">The type of the sub-asset embedded in the imported Asset.</param>\n      <param name=\"name\">The name of the sub-asset embedded in the imported Asset.</param>\n    </member>\n    <member name=\"T:UnityEditor.AssetModificationProcessor\">\n      <summary>\n        <para>AssetModificationProcessor lets you hook into saving of serialized assets and\n      scenes which are edited inside Unity.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AssetMoveResult\">\n      <summary>\n        <para>Result of Asset move</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AssetMoveResult.DidMove\">\n      <summary>\n        <para>Tells the internal implementation that the script moved the asset physically on disk.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AssetMoveResult.DidNotMove\">\n      <summary>\n        <para>Tells the internal implementation that the asset was not moved physically on disk by the script.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AssetMoveResult.FailedMove\">\n      <summary>\n        <para>Tells the internal implementation that the script could not move the assets.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AssetPostprocessor\">\n      <summary>\n        <para>AssetPostprocessor lets you hook into the import pipeline and run scripts prior or after importing assets.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AssetPostprocessor.assetImporter\">\n      <summary>\n        <para>Reference to the asset importer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AssetPostprocessor.assetPath\">\n      <summary>\n        <para>The path name of the asset being imported.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AssetPostprocessor.context\">\n      <summary>\n        <para>The import context.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AssetPostprocessor.GetPostprocessOrder\">\n      <summary>\n        <para>Override the order in which importers are processed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AssetPostprocessor.GetVersion\">\n      <summary>\n        <para>Returns the version of the asset postprocessor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AssetPostprocessor.LogError(System.String)\">\n      <summary>\n        <para>Logs an import error message to the console.</para>\n      </summary>\n      <param name=\"warning\"></param>\n      <param name=\"context\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetPostprocessor.LogError(System.String,UnityEngine.Object)\">\n      <summary>\n        <para>Logs an import error message to the console.</para>\n      </summary>\n      <param name=\"warning\"></param>\n      <param name=\"context\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetPostprocessor.LogWarning(System.String)\">\n      <summary>\n        <para>Logs an import warning to the console.</para>\n      </summary>\n      <param name=\"warning\"></param>\n      <param name=\"context\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetPostprocessor.LogWarning(System.String,UnityEngine.Object)\">\n      <summary>\n        <para>Logs an import warning to the console.</para>\n      </summary>\n      <param name=\"warning\"></param>\n      <param name=\"context\"></param>\n    </member>\n    <member name=\"T:UnityEditor.AssetPreview\">\n      <summary>\n        <para>Utility for fetching asset previews by instance ID of assets, See AssetPreview.GetAssetPreview. Since previews are loaded asynchronously methods are provided for requesting if all previews have been fully loaded, see AssetPreview.IsLoadingAssetPreviews. Loaded previews are stored in a cache, the size of the cache can be controlled by calling [AssetPreview.SetPreviewTextureCacheSize].</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AssetPreview.GetAssetPreview(UnityEngine.Object)\">\n      <summary>\n        <para>Returns a preview texture for an asset.</para>\n      </summary>\n      <param name=\"asset\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetPreview.GetAssetPreview\">\n      <summary>\n        <para>Returns a preview texture for an instanceID of an asset.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AssetPreview.GetMiniThumbnail(UnityEngine.Object)\">\n      <summary>\n        <para>Returns the thumbnail for an object (like the ones you see in the project view).</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetPreview.GetMiniTypeThumbnail(System.Type)\">\n      <summary>\n        <para>Returns the thumbnail for the type.</para>\n      </summary>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEditor.AssetPreview.GetMiniTypeThumbnail\">\n      <summary>\n        <para>Returns the thumbnail for the object's type.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AssetPreview.IsLoadingAssetPreview(System.Int32)\">\n      <summary>\n        <para>Loading previews is asynchronous so it is useful to know if a specific asset preview is in the process of being loaded so client code e.g can repaint while waiting for the loading to finish.</para>\n      </summary>\n      <param name=\"instanceID\">InstanceID of the assset that a preview has been requested for by: AssetPreview.GetAssetPreview().</param>\n    </member>\n    <member name=\"M:UnityEditor.AssetPreview.IsLoadingAssetPreviews\">\n      <summary>\n        <para>Loading previews is asynchronous so it is useful to know if any requested previews are in the process of being loaded so client code e.g can repaint while waiting.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AssetPreview.SetPreviewTextureCacheSize(System.Int32)\">\n      <summary>\n        <para>Set the asset preview cache to a size that can hold all visible previews on the screen at once.</para>\n      </summary>\n      <param name=\"size\">The number of previews that can be loaded into the cache before the least used previews are being unloaded.</param>\n    </member>\n    <member name=\"T:UnityEditor.AudioCurveRendering\">\n      <summary>\n        <para>Antialiased curve rendering functionality used by audio tools in the editor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AudioCurveRendering.AudioCurveAndColorEvaluator\">\n      <summary>\n        <para>Curve evaluation function that allows simultaneous evaluation of the curve y-value and a color of the curve at that point.</para>\n      </summary>\n      <param name=\"x\">Normalized x-position in the range [0; 1] at which the curve should be evaluated.</param>\n      <param name=\"col\">Color of the curve at the evaluated point.</param>\n    </member>\n    <member name=\"T:UnityEditor.AudioCurveRendering.AudioCurveEvaluator\">\n      <summary>\n        <para>Curve evaluation function used to evaluate the curve y-value and at the specified point.</para>\n      </summary>\n      <param name=\"x\">Normalized x-position in the range [0; 1] at which the curve should be evaluated.</param>\n    </member>\n    <member name=\"T:UnityEditor.AudioCurveRendering.AudioMinMaxCurveAndColorEvaluator\">\n      <summary>\n        <para>Curve evaluation function that allows simultaneous evaluation of the min- and max-curves. The returned minValue and maxValue values are expected to be in the range [-1; 1] and a value of 0 corresponds to the vertical center of the rectangle that is drawn into. Values outside of this range will be clamped. Additionally the color of the curve at this point is evaluated.</para>\n      </summary>\n      <param name=\"x\">Normalized x-position in the range [0; 1] at which the min- and max-curves should be evaluated.</param>\n      <param name=\"col\">Color of the curve at the specified evaluation point.</param>\n      <param name=\"minValue\">Returned value of the minimum curve. Clamped to [-1; 1].</param>\n      <param name=\"maxValue\">Returned value of the maximum curve. Clamped to [-1; 1].</param>\n    </member>\n    <member name=\"M:UnityEditor.AudioCurveRendering.DrawCurve(UnityEngine.Rect,UnityEditor.AudioCurveRendering/AudioCurveEvaluator,UnityEngine.Color)\">\n      <summary>\n        <para>Renders a thin curve determined by the curve evaluation function. The solid color of the curve is set by the curveColor argument.</para>\n      </summary>\n      <param name=\"r\">Rectangle determining the size of the graph.</param>\n      <param name=\"eval\">Curve evaluation function.</param>\n      <param name=\"curveColor\">Solid fill color of the curve. The alpha-channel determines the amount of opacity.</param>\n    </member>\n    <member name=\"M:UnityEditor.AudioCurveRendering.DrawFilledCurve(UnityEngine.Rect,UnityEditor.AudioCurveRendering/AudioCurveEvaluator,UnityEngine.Color)\">\n      <summary>\n        <para>Fills the area between the curve evaluated by the AudioCurveAndColorEvaluator provided and the bottom of the rectngle with smooth gradients along the edges.</para>\n      </summary>\n      <param name=\"r\">Rectangle determining the size of the graph.</param>\n      <param name=\"eval\">Normalized x-position in the range [0; 1] at which the curve should be evaluated. The returned value is expected to be in the range [-1; 1] and a value of 0 corresponds to the vertical center of the rectangle that is drawn into. Values outside of this range will be clamped.</param>\n      <param name=\"curveColor\">Solid fill color of the curve. The alpha-channel determines the amount of opacity.</param>\n    </member>\n    <member name=\"M:UnityEditor.AudioCurveRendering.DrawFilledCurve(UnityEngine.Rect,UnityEditor.AudioCurveRendering/AudioCurveAndColorEvaluator)\">\n      <summary>\n        <para>Fills the area between the curve evaluated by the AudioCurveAndColorEvaluator provided and the bottom of the rectngle with smooth gradients along the edges.</para>\n      </summary>\n      <param name=\"r\">Rectangle determining the size of the graph.</param>\n      <param name=\"eval\">Normalized x-position in the range [0; 1] at which the curve should be evaluated. The returned value is expected to be in the range [-1; 1] and a value of 0 corresponds to the vertical center of the rectangle that is drawn into. Values outside of this range will be clamped.</param>\n      <param name=\"curveColor\">Solid fill color of the curve. The alpha-channel determines the amount of opacity.</param>\n    </member>\n    <member name=\"M:UnityEditor.AudioCurveRendering.DrawMinMaxFilledCurve(UnityEngine.Rect,UnityEditor.AudioCurveRendering/AudioMinMaxCurveAndColorEvaluator)\">\n      <summary>\n        <para>Fills the area between the two curves evaluated by the AudioMinMaxCurveAndColorEvaluator provided with smooth gradients along the edges.</para>\n      </summary>\n      <param name=\"r\">Rectangle determining the size of the graph.</param>\n      <param name=\"eval\">Normalized x-position in the range [0; 1] at which the min- and max-curves should be evaluated. The returned minValue and maxValue values are expected to be in the range [-1; 1] and a value of 0 corresponds to the vertical center of the rectangle that is drawn into. Values outside of this range will be clamped.</param>\n    </member>\n    <member name=\"M:UnityEditor.AudioCurveRendering.DrawSymmetricFilledCurve(UnityEngine.Rect,UnityEditor.AudioCurveRendering/AudioCurveAndColorEvaluator)\">\n      <summary>\n        <para>Fills the area between the curve evaluated by the AudioCurveAndColorEvaluator provided and its vertical mirror image with smooth gradients along the edges. Useful for drawing amplitude plots of audio signals.</para>\n      </summary>\n      <param name=\"r\">Rectangle determining the size of the graph.</param>\n      <param name=\"eval\">Normalized x-position in the range [0; 1] at which the curve should be evaluated. The returned value is expected to be in the range [0; 1] and a value of 0 corresponds to the vertical center of the rectangle that is drawn into. Values outside of this range will be clamped.</param>\n    </member>\n    <member name=\"T:UnityEditor.AudioImporter\">\n      <summary>\n        <para>Audio importer lets you modify AudioClip import settings from editor scripts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AudioImporter.ambisonic\">\n      <summary>\n        <para>When this flag is set, the audio clip will be treated as being ambisonic.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AudioImporter.compressionBitrate\">\n      <summary>\n        <para>Compression bitrate.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AudioImporter.defaultSampleSettings\">\n      <summary>\n        <para>The default sample settings for the AudioClip importer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AudioImporter.forceToMono\">\n      <summary>\n        <para>Force this clip to mono?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AudioImporter.loadInBackground\">\n      <summary>\n        <para>Corresponding to the \"Load In Background\" flag in the AudioClip inspector, when this flag is set, the loading of the clip will happen delayed without blocking the main thread.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.AudioImporter.preloadAudioData\">\n      <summary>\n        <para>Preloads audio data of the clip when the clip asset is loaded. When this flag is off, scripts have to call AudioClip.LoadAudioData() to load the data before the clip can be played. Properties like length, channels and format are available before the audio data has been loaded.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.AudioImporter.ClearSampleSettingOverride(System.String)\">\n      <summary>\n        <para>Clears the sample settings override for the given platform.</para>\n      </summary>\n      <param name=\"platform\">The platform to clear the overrides for.</param>\n      <returns>\n        <para>Returns true if any overrides were actually cleared.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AudioImporter.ContainsSampleSettingsOverride(System.String)\">\n      <summary>\n        <para>Returns whether a given build target has its sample settings currently overridden.</para>\n      </summary>\n      <param name=\"platform\">The platform to query if this AudioImporter has an override for.</param>\n      <returns>\n        <para>Returns true if the platform is currently overriden in this AudioImporter.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AudioImporter.GetOverrideSampleSettings(System.String)\">\n      <summary>\n        <para>Return the current override settings for the given platform.</para>\n      </summary>\n      <param name=\"platform\">The platform to get the override settings for.</param>\n      <returns>\n        <para>The override sample settings for the given platform.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.AudioImporter.SetOverrideSampleSettings(System.String,UnityEditor.AudioImporterSampleSettings)\">\n      <summary>\n        <para>Sets the override sample settings for the given platform.</para>\n      </summary>\n      <param name=\"platform\">The platform which will have the sample settings overridden.</param>\n      <param name=\"settings\">The override settings for the given platform.</param>\n      <returns>\n        <para>Returns true if the settings were successfully overriden. Some setting overrides are not possible for the given platform, in which case false is returned and the settings are not registered.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.AudioImporterSampleSettings\">\n      <summary>\n        <para>This structure contains a collection of settings used to define how an AudioClip should be imported.\n\nThis  structure is used with the AudioImporter to define how the AudioClip should be imported and treated during loading within the scene.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AudioImporterSampleSettings.compressionFormat\">\n      <summary>\n        <para>CompressionFormat defines the compression type that the audio file is encoded to. Different compression types have different performance and audio artifact characteristics.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AudioImporterSampleSettings.loadType\">\n      <summary>\n        <para>LoadType defines how the imported AudioClip data should be loaded.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AudioImporterSampleSettings.quality\">\n      <summary>\n        <para>Audio compression quality (0-1)\n\nAmount of compression. The value roughly corresponds to the ratio between the resulting and the source file sizes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AudioImporterSampleSettings.sampleRateOverride\">\n      <summary>\n        <para>Target sample rate to convert to when samplerateSetting is set to OverrideSampleRate.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AudioImporterSampleSettings.sampleRateSetting\">\n      <summary>\n        <para>Defines how the sample rate is modified (if at all) of the importer audio file.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.AudioSampleRateSetting\">\n      <summary>\n        <para>The sample rate setting used within the AudioImporter. This defines the sample rate conversion of audio on import.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AudioSampleRateSetting.OptimizeSampleRate\">\n      <summary>\n        <para>Let Unity deduce the optimal sample rate for the AudioClip being imported. The audio file will be analysed and a minimal sample rate chosen while still preserving audio quality.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AudioSampleRateSetting.OverrideSampleRate\">\n      <summary>\n        <para>Override the sample rate of the imported audio file with a custom value.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.AudioSampleRateSetting.PreserveSampleRate\">\n      <summary>\n        <para>Do not change the sample rate of the imported audio file. The sample rate will be preserved for the imported AudioClip.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.BaseHierarchySort\">\n      <summary>\n        <para>The base class used to create new sorting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.BaseHierarchySort.content\">\n      <summary>\n        <para>The content to display to quickly identify the hierarchy's mode.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.BaseHierarchySort.Compare(UnityEngine.GameObject,UnityEngine.GameObject)\">\n      <summary>\n        <para>The sorting method used to determine the order of GameObjects.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"T:UnityEditor.Build.BuildFailedException\">\n      <summary>\n        <para>An exception class that represents a failed build.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.BuildFailedException.#ctor(System.String)\">\n      <summary>\n        <para>Constructs a BuildFailedException object.</para>\n      </summary>\n      <param name=\"message\">A string of text describing the error that caused the build to fail.</param>\n      <param name=\"innerException\">The exception that caused the build to fail.</param>\n    </member>\n    <member name=\"M:UnityEditor.Build.BuildFailedException.#ctor(System.Exception)\">\n      <summary>\n        <para>Constructs a BuildFailedException object.</para>\n      </summary>\n      <param name=\"message\">A string of text describing the error that caused the build to fail.</param>\n      <param name=\"innerException\">The exception that caused the build to fail.</param>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.AssetBundleInfo\">\n      <summary>\n        <para>Container for holding asset loading information for an AssetBundle to be built.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.AssetBundleInfo.bundleAssets\">\n      <summary>\n        <para>List of asset loading information for an AssetBundle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.AssetBundleInfo.bundleName\">\n      <summary>\n        <para>Friendly AssetBundle name.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.AssetBundleInfo.#ctor\">\n      <summary>\n        <para>Default constructor for an empty AssetBundleInfo.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.AssetLoadInfo\">\n      <summary>\n        <para>Container for holding preload information for a given serialized Asset.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.AssetLoadInfo.address\">\n      <summary>\n        <para>Friendly name used to load the built asset.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.AssetLoadInfo.asset\">\n      <summary>\n        <para>GUID for the given asset.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.AssetLoadInfo.includedObjects\">\n      <summary>\n        <para>List of objects that an asset contains in its source file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.AssetLoadInfo.referencedObjects\">\n      <summary>\n        <para>List of objects that an asset references.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.AssetLoadInfo.#ctor\">\n      <summary>\n        <para>Default constructor for an empty AssetLoadInfo.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.BuildCompression\">\n      <summary>\n        <para>Struct containing settings that control the compression method of content.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.BuildCompression.blockSize\">\n      <summary>\n        <para>Block size to use for chunk based compression.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.BuildCompression.compression\">\n      <summary>\n        <para>Compression type to use.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.BuildCompression.level\">\n      <summary>\n        <para>Compression level to use.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.BuildCompression.DefaultLZ4\">\n      <summary>\n        <para>Returns a BuildCompression struct set with the default values used for Lz4HC compression.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.BuildCompression.DefaultLZMA\">\n      <summary>\n        <para>Returns a BuildCompression struct set with the default values used for LZMA compression.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.BuildCompression.DefaultUncompressed\">\n      <summary>\n        <para>Returns a BuildCompression struct set with the default values used for uncompressed.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.BuildReferenceMap\">\n      <summary>\n        <para>Container for holding information about where objects will be serialized in a build.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildReferenceMap.AddMapping(System.String,System.Int64,UnityEditor.Build.Content.ObjectIdentifier,System.Boolean)\">\n      <summary>\n        <para>Adds a mapping for a single Object to where it will be serialized out to the build.</para>\n      </summary>\n      <param name=\"internalFileName\"></param>\n      <param name=\"serializationIndex\"></param>\n      <param name=\"objectID\"></param>\n      <param name=\"overwrite\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildReferenceMap.AddMappings(System.String,UnityEditor.Build.Content.SerializationInfo[])\">\n      <summary>\n        <para>Adds mappings for a set of Objects to where they will be serialized out to the build.</para>\n      </summary>\n      <param name=\"internalFileName\"></param>\n      <param name=\"objectIDs\"></param>\n      <param name=\"overwrite\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildReferenceMap.AddMappings(System.String,UnityEditor.Build.Content.SerializationInfo[],System.Boolean)\">\n      <summary>\n        <para>Adds mappings for a set of Objects to where they will be serialized out to the build.</para>\n      </summary>\n      <param name=\"internalFileName\"></param>\n      <param name=\"objectIDs\"></param>\n      <param name=\"overwrite\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildReferenceMap.#ctor\">\n      <summary>\n        <para>Default constructor for an empty BuildReferenceMap.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildReferenceMap.Dispose\">\n      <summary>\n        <para>Dispose the BuildReferenceMap destroying all internal state.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildReferenceMap.Equals(System.Object)\">\n      <summary>\n        <para>Returns true if the objects are equal.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildReferenceMap.GetHash128\">\n      <summary>\n        <para>Gets the hash for the BuildReferenceMap.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildReferenceMap.GetHashCode\">\n      <summary>\n        <para>Gets the hash code for the BuildReferenceMap.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildReferenceMap.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n      <summary>\n        <para>ISerializable method for serialization support outside of Unity's internal serialization system.</para>\n      </summary>\n      <param name=\"info\"></param>\n      <param name=\"context\"></param>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.BuildSettings\">\n      <summary>\n        <para>Struct containing information on how to build content.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.BuildSettings.buildFlags\">\n      <summary>\n        <para>Specific build options to use when building content.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.BuildSettings.group\">\n      <summary>\n        <para>Platform group for which content will be built.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.BuildSettings.target\">\n      <summary>\n        <para>Platform target for which content will be built.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.BuildSettings.typeDB\">\n      <summary>\n        <para>Type information to use for building content.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.BuildUsageCache\">\n      <summary>\n        <para>Caching object for the Scriptable Build Pipeline.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildUsageCache.#ctor\">\n      <summary>\n        <para>Default contructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildUsageCache.Dispose\">\n      <summary>\n        <para>Dispose the BuildUsageCache destroying all internal state.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.BuildUsageTagGlobal\">\n      <summary>\n        <para>Container for holding information about lighting information being used in a build.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.Build.Content.BuildUsageTagGlobal.op_BitwiseOr(UnityEditor.Build.Content.BuildUsageTagGlobal,UnityEditor.Build.Content.BuildUsageTagGlobal)\">\n      <summary>\n        <para>Combines the usage data from another BuildUsageTagGlobal with this BuildUsageTagGlobal.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.BuildUsageTagSet\">\n      <summary>\n        <para>Container for holding information about how objects are being used in a build.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildUsageTagSet.#ctor\">\n      <summary>\n        <para>Default constructor for an empty BuildUsageTagSet.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildUsageTagSet.Dispose\">\n      <summary>\n        <para>Dispose the BuildUsageTagSet destroying all internal state.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildUsageTagSet.Equals(System.Object)\">\n      <summary>\n        <para>Returns true if the objects are equal.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildUsageTagSet.GetHash128\">\n      <summary>\n        <para>Gets the hash for the BuildReferenceMap.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildUsageTagSet.GetHashCode\">\n      <summary>\n        <para>Gets the hash code for the BuildUsageTagSet.</para>\n      </summary>\n      <returns>\n        <para>The hash code of the BuildUsageTagSet.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildUsageTagSet.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n      <summary>\n        <para>ISerializable method for serialization support outside of Unity's internal serialization system.</para>\n      </summary>\n      <param name=\"info\"></param>\n      <param name=\"context\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildUsageTagSet.GetObjectIdentifiers\">\n      <summary>\n        <para>Returns an array of ObjectIdentifiers that this BuildUsageTagSet contains usage information about.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.BuildUsageTagSet.UnionWith(UnityEditor.Build.Content.BuildUsageTagSet)\">\n      <summary>\n        <para>Adds the Object usage information from another BuildUsageTagSet to this BuildUsageTagSet.</para>\n      </summary>\n      <param name=\"other\">Object usage information to be added to this BuildUsageTagSet.</param>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.CompressionLevel\">\n      <summary>\n        <para>Enum to indicate if compression should emphasize speed or size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.CompressionLevel.Fast\">\n      <summary>\n        <para>Content should be compressed as fast.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.CompressionLevel.Fastest\">\n      <summary>\n        <para>Content should be compressed as fast as possible.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.CompressionLevel.High\">\n      <summary>\n        <para>Content should be compressed small.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.CompressionLevel.Maximum\">\n      <summary>\n        <para>Content should be compressed as small as possible.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.CompressionLevel.None\">\n      <summary>\n        <para>None. Defaults to Normal.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.CompressionLevel.Normal\">\n      <summary>\n        <para>Content should be ballanced between size and speed.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.CompressionType\">\n      <summary>\n        <para>Enum containing the types of compression supported for built content.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.CompressionType.Lz4\">\n      <summary>\n        <para>Chunk-based content compression.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.CompressionType.Lz4HC\">\n      <summary>\n        <para>Chunk-based content compression using the high compression variant.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.CompressionType.Lzma\">\n      <summary>\n        <para>Single stream content compression.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.CompressionType.None\">\n      <summary>\n        <para>Uncompressed content.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.ContentBuildFlags\">\n      <summary>\n        <para>Build options for content.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.ContentBuildFlags.DisableWriteTypeTree\">\n      <summary>\n        <para>Do not include type information within the built content.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.ContentBuildFlags.None\">\n      <summary>\n        <para>Build content with no additional options.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.ContentBuildInterface\">\n      <summary>\n        <para>Low level interface for building content for Unity.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ContentBuildInterface.ArchiveAndCompress(UnityEditor.Build.Content.ResourceFile[],System.String,UnityEditor.Build.Content.BuildCompression)\">\n      <summary>\n        <para>Combines resource files into a single archive and compresses them based on the passed in options.</para>\n      </summary>\n      <param name=\"resourceFiles\"></param>\n      <param name=\"outputBundlePath\"></param>\n      <param name=\"compression\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ContentBuildInterface.CalculateBuildUsageTags(UnityEditor.Build.Content.ObjectIdentifier[],UnityEditor.Build.Content.ObjectIdentifier[],UnityEditor.Build.Content.BuildUsageTagGlobal,UnityEditor.Build.Content.BuildUsageTagSet)\">\n      <summary>\n        <para>Calculates the build usage of a set of objects.</para>\n      </summary>\n      <param name=\"objectIDs\">Objects that will have their build usage calculated.</param>\n      <param name=\"dependentObjectIDs\">Objects that reference the Objects being calculated.</param>\n      <param name=\"globalUsage\">Lighting information used by the build.</param>\n      <param name=\"usageSet\">The BuildUsageTagSet where the calculated usage information will be stored.</param>\n      <param name=\"usageCache\">Optional cache object to use for improving performance with multiple calls to this api.</param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ContentBuildInterface.CalculateBuildUsageTags(UnityEditor.Build.Content.ObjectIdentifier[],UnityEditor.Build.Content.ObjectIdentifier[],UnityEditor.Build.Content.BuildUsageTagGlobal,UnityEditor.Build.Content.BuildUsageTagSet,UnityEditor.Build.Content.BuildUsageCache)\">\n      <summary>\n        <para>Calculates the build usage of a set of objects.</para>\n      </summary>\n      <param name=\"objectIDs\">Objects that will have their build usage calculated.</param>\n      <param name=\"dependentObjectIDs\">Objects that reference the Objects being calculated.</param>\n      <param name=\"globalUsage\">Lighting information used by the build.</param>\n      <param name=\"usageSet\">The BuildUsageTagSet where the calculated usage information will be stored.</param>\n      <param name=\"usageCache\">Optional cache object to use for improving performance with multiple calls to this api.</param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ContentBuildInterface.GenerateAssetBundleBuilds\">\n      <summary>\n        <para>Returns an array of AssetBundleBuild structs that detail the current asset bundle layout set in the AssetDatabase.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ContentBuildInterface.GetPlayerDependenciesForObject(UnityEditor.Build.Content.ObjectIdentifier,UnityEditor.BuildTarget,UnityEditor.Build.Player.TypeDB)\">\n      <summary>\n        <para>Returns a list of objects referenced by an object.</para>\n      </summary>\n      <param name=\"objectID\"></param>\n      <param name=\"target\"></param>\n      <param name=\"typeDB\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ContentBuildInterface.GetPlayerDependenciesForObjects(UnityEditor.Build.Content.ObjectIdentifier[],UnityEditor.BuildTarget,UnityEditor.Build.Player.TypeDB)\">\n      <summary>\n        <para>Returns a list of objects referenced by a set of objects.</para>\n      </summary>\n      <param name=\"objectIDs\"></param>\n      <param name=\"target\"></param>\n      <param name=\"typeDB\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ContentBuildInterface.GetPlayerObjectIdentifiersInAsset(UnityEditor.GUID,UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Returns a list of objects directly contained inside of an asset.</para>\n      </summary>\n      <param name=\"asset\"></param>\n      <param name=\"target\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ContentBuildInterface.GetTypeForObject(UnityEditor.Build.Content.ObjectIdentifier)\">\n      <summary>\n        <para>Gets the type of an object specified by an ObjectIdentifier.</para>\n      </summary>\n      <param name=\"objectID\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ContentBuildInterface.GetTypeForObjects(UnityEditor.Build.Content.ObjectIdentifier[])\">\n      <summary>\n        <para>Gets the types of all the objects specified by ObjectIdentifiers.</para>\n      </summary>\n      <param name=\"objectIDs\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ContentBuildInterface.PrepareScene(System.String,UnityEditor.Build.Content.BuildSettings,UnityEditor.Build.Content.BuildUsageTagSet,System.String)\">\n      <summary>\n        <para>Calculates the scene dependency information and writes a post processed scene to disk.</para>\n      </summary>\n      <param name=\"usageCache\">Optional cache object to use for improving performance with multiple calls to this api.</param>\n      <param name=\"scenePath\">Input path of the scene to prepare.</param>\n      <param name=\"settings\">Settings to use for preparing the scene.</param>\n      <param name=\"usageSet\">Output usage information generated from preparing the scene.</param>\n      <param name=\"outputFolder\">Output location where the post prepared scene will be saved.</param>\n      <returns>\n        <para>Dependency information for the scene.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ContentBuildInterface.PrepareScene(System.String,UnityEditor.Build.Content.BuildSettings,UnityEditor.Build.Content.BuildUsageTagSet,UnityEditor.Build.Content.BuildUsageCache,System.String)\">\n      <summary>\n        <para>Calculates the scene dependency information and writes a post processed scene to disk.</para>\n      </summary>\n      <param name=\"usageCache\">Optional cache object to use for improving performance with multiple calls to this api.</param>\n      <param name=\"scenePath\">Input path of the scene to prepare.</param>\n      <param name=\"settings\">Settings to use for preparing the scene.</param>\n      <param name=\"usageSet\">Output usage information generated from preparing the scene.</param>\n      <param name=\"outputFolder\">Output location where the post prepared scene will be saved.</param>\n      <returns>\n        <para>Dependency information for the scene.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ContentBuildInterface.WriteSceneSerializedFile(System.String,System.String,System.String,UnityEditor.Build.Content.WriteCommand,UnityEditor.Build.Content.BuildSettings,UnityEditor.Build.Content.BuildUsageTagGlobal,UnityEditor.Build.Content.BuildUsageTagSet,UnityEditor.Build.Content.BuildReferenceMap)\">\n      <summary>\n        <para>Writes scene objects to a serialized file on disk.</para>\n      </summary>\n      <param name=\"outputFolder\"></param>\n      <param name=\"scenePath\"></param>\n      <param name=\"processedScene\"></param>\n      <param name=\"writeCommand\"></param>\n      <param name=\"settings\"></param>\n      <param name=\"globalUsage\"></param>\n      <param name=\"usageSet\"></param>\n      <param name=\"referenceMap\"></param>\n      <param name=\"preloadInfo\"></param>\n      <param name=\"sceneBundleInfo\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ContentBuildInterface.WriteSceneSerializedFile(System.String,System.String,System.String,UnityEditor.Build.Content.WriteCommand,UnityEditor.Build.Content.BuildSettings,UnityEditor.Build.Content.BuildUsageTagGlobal,UnityEditor.Build.Content.BuildUsageTagSet,UnityEditor.Build.Content.BuildReferenceMap,UnityEditor.Build.Content.PreloadInfo)\">\n      <summary>\n        <para>Writes scene objects to a serialized file on disk.</para>\n      </summary>\n      <param name=\"outputFolder\"></param>\n      <param name=\"scenePath\"></param>\n      <param name=\"processedScene\"></param>\n      <param name=\"writeCommand\"></param>\n      <param name=\"settings\"></param>\n      <param name=\"globalUsage\"></param>\n      <param name=\"usageSet\"></param>\n      <param name=\"referenceMap\"></param>\n      <param name=\"preloadInfo\"></param>\n      <param name=\"sceneBundleInfo\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ContentBuildInterface.WriteSceneSerializedFile(System.String,System.String,System.String,UnityEditor.Build.Content.WriteCommand,UnityEditor.Build.Content.BuildSettings,UnityEditor.Build.Content.BuildUsageTagGlobal,UnityEditor.Build.Content.BuildUsageTagSet,UnityEditor.Build.Content.BuildReferenceMap,UnityEditor.Build.Content.PreloadInfo,UnityEditor.Build.Content.SceneBundleInfo)\">\n      <summary>\n        <para>Writes scene objects to a serialized file on disk.</para>\n      </summary>\n      <param name=\"outputFolder\"></param>\n      <param name=\"scenePath\"></param>\n      <param name=\"processedScene\"></param>\n      <param name=\"writeCommand\"></param>\n      <param name=\"settings\"></param>\n      <param name=\"globalUsage\"></param>\n      <param name=\"usageSet\"></param>\n      <param name=\"referenceMap\"></param>\n      <param name=\"preloadInfo\"></param>\n      <param name=\"sceneBundleInfo\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ContentBuildInterface.WriteSerializedFile(System.String,UnityEditor.Build.Content.WriteCommand,UnityEditor.Build.Content.BuildSettings,UnityEditor.Build.Content.BuildUsageTagGlobal,UnityEditor.Build.Content.BuildUsageTagSet,UnityEditor.Build.Content.BuildReferenceMap)\">\n      <summary>\n        <para>Writes objects to a serialized file on disk.</para>\n      </summary>\n      <param name=\"outputFolder\"></param>\n      <param name=\"writeCommand\"></param>\n      <param name=\"settings\"></param>\n      <param name=\"globalUsage\"></param>\n      <param name=\"usageSet\"></param>\n      <param name=\"referenceMap\"></param>\n      <param name=\"bundleInfo\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ContentBuildInterface.WriteSerializedFile(System.String,UnityEditor.Build.Content.WriteCommand,UnityEditor.Build.Content.BuildSettings,UnityEditor.Build.Content.BuildUsageTagGlobal,UnityEditor.Build.Content.BuildUsageTagSet,UnityEditor.Build.Content.BuildReferenceMap,UnityEditor.Build.Content.AssetBundleInfo)\">\n      <summary>\n        <para>Writes objects to a serialized file on disk.</para>\n      </summary>\n      <param name=\"outputFolder\"></param>\n      <param name=\"writeCommand\"></param>\n      <param name=\"settings\"></param>\n      <param name=\"globalUsage\"></param>\n      <param name=\"usageSet\"></param>\n      <param name=\"referenceMap\"></param>\n      <param name=\"bundleInfo\"></param>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.FileType\">\n      <summary>\n        <para>Enum description of the type of file an object comes from.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.FileType.DeprecatedCachedAssetType\">\n      <summary>\n        <para>Object is contained in a very old format. Currently unused.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.FileType.MetaAssetType\">\n      <summary>\n        <para>Object is contained in the imported asset meta data located in the Library folder.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.FileType.NonAssetType\">\n      <summary>\n        <para>Object is contained in file not currently tracked by the AssetDatabase.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Content.FileType.SerializedAssetType\">\n      <summary>\n        <para>Object is contained in a standard asset file type located in the Assets folder.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.ObjectIdentifier\">\n      <summary>\n        <para>Struct that identifies a specific object project wide.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.ObjectIdentifier.filePath\">\n      <summary>\n        <para>The file path on disk that contains this object. (Only used for objects not known by the AssetDatabase).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.ObjectIdentifier.fileType\">\n      <summary>\n        <para>Type of file that contains this object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.ObjectIdentifier.guid\">\n      <summary>\n        <para>The specific asset that contains this object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.ObjectIdentifier.localIdentifierInFile\">\n      <summary>\n        <para>The index of the object inside a serialized file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ObjectIdentifier.Equals(System.Object)\">\n      <summary>\n        <para>Returns true if the objects are equal.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ObjectIdentifier.GetHashCode\">\n      <summary>\n        <para>Gets the hash code for the ObjectIdentifier.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.Build.Content.ObjectIdentifier.op_Equal(UnityEditor.Build.Content.ObjectIdentifier,UnityEditor.Build.Content.ObjectIdentifier)\">\n      <summary>\n        <para>Returns true if the ObjectIdentifiers are the same.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"?:UnityEditor.Build.Content.ObjectIdentifier.op_GreaterThan(UnityEditor.Build.Content.ObjectIdentifier,UnityEditor.Build.Content.ObjectIdentifier)\">\n      <summary>\n        <para>Returns true if the first ObjectIdentifier is greater than the second ObjectIdentifier.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"?:UnityEditor.Build.Content.ObjectIdentifier.op_LessThan(UnityEditor.Build.Content.ObjectIdentifier,UnityEditor.Build.Content.ObjectIdentifier)\">\n      <summary>\n        <para>Returns true if the first ObjectIdentifier is less than the second ObjectIdentifier.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"?:UnityEditor.Build.Content.ObjectIdentifier.op_NotEqual(UnityEditor.Build.Content.ObjectIdentifier,UnityEditor.Build.Content.ObjectIdentifier)\">\n      <summary>\n        <para>Returns true if the ObjectIdentifiers are different.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.ObjectIdentifier.ToString\">\n      <summary>\n        <para>Returns a nicely formatted string for this ObjectIdentifier.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.ObjectSerializedInfo\">\n      <summary>\n        <para>Struct containing details about how an object was serialized.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.ObjectSerializedInfo.header\">\n      <summary>\n        <para>Serialized object header information.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.ObjectSerializedInfo.rawData\">\n      <summary>\n        <para>Raw byte data of the object if it was serialized seperately from the header.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.ObjectSerializedInfo.serializedObject\">\n      <summary>\n        <para>Object that was serialized.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.PreloadInfo\">\n      <summary>\n        <para>Container for holding a list of preload objects for a scene to be built.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.PreloadInfo.preloadObjects\">\n      <summary>\n        <para>List of Objects for a serialized scene that need to be preloaded.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.PreloadInfo.#ctor\">\n      <summary>\n        <para>Default constructor for an empty PreloadInfo.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.ResourceFile\">\n      <summary>\n        <para>Details about a specific file written by the ContentBuildInterface.WriteSerializedFile or ContentBuildInterface.WriteSceneSerializedFile APIs.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.ResourceFile.fileAlias\">\n      <summary>\n        <para>Internal name used by the loading system for a resource file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.ResourceFile.fileName\">\n      <summary>\n        <para>Path to the resource file on disk.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.ResourceFile.serializedFile\">\n      <summary>\n        <para>Bool to determine if this resource file represents serialized Unity objects (serialized file) or binary resource data.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.SceneBundleInfo\">\n      <summary>\n        <para>Container for holding asset loading information for a streamed scene AssetBundle to be built.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.SceneBundleInfo.bundleName\">\n      <summary>\n        <para>Friendly AssetBundle name.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.SceneBundleInfo.bundleScenes\">\n      <summary>\n        <para>List of scene loading information for an AssetBundle.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.SceneBundleInfo.#ctor\">\n      <summary>\n        <para>Default constructor for an empty SceneBundleInfo.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.SceneDependencyInfo\">\n      <summary>\n        <para>Scene dependency information generated from the ContentBuildInterface.PrepareScene API.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.SceneDependencyInfo.globalUsage\">\n      <summary>\n        <para>Lighting information used by the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.SceneDependencyInfo.processedScene\">\n      <summary>\n        <para>Path to the post processed version of the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.SceneDependencyInfo.referencedObjects\">\n      <summary>\n        <para>List of objects referenced by the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.SceneDependencyInfo.scene\">\n      <summary>\n        <para>Scene's original asset path.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.SceneLoadInfo\">\n      <summary>\n        <para>Container for holding preload information for a given serialized scene in an AssetBundle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.SceneLoadInfo.address\">\n      <summary>\n        <para>Friendly name used to load the built scene from an asset bundle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.SceneLoadInfo.asset\">\n      <summary>\n        <para>GUID for the given scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.SceneLoadInfo.internalName\">\n      <summary>\n        <para>Internal name used to load the built scene from an asset bundle.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.SceneLoadInfo.#ctor\">\n      <summary>\n        <para>Default constructor for an empty SceneLoadInfo.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.SerializationInfo\">\n      <summary>\n        <para>Container for holding object serialization order information for a build.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.SerializationInfo.serializationIndex\">\n      <summary>\n        <para>Order in which the object will be serialized to disk.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.SerializationInfo.serializationObject\">\n      <summary>\n        <para>Source object to be serialzied to disk.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.SerializationInfo.#ctor\">\n      <summary>\n        <para>Default constructor for an empty SerializationInfo.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.SerializedLocation\">\n      <summary>\n        <para>Struct containing information about where an object was serialized.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.SerializedLocation.fileName\">\n      <summary>\n        <para>File path on disk where the object was serialized.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.SerializedLocation.offset\">\n      <summary>\n        <para>Byte offset for the start of the object's data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.SerializedLocation.size\">\n      <summary>\n        <para>Size of the object's data.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.WriteCommand\">\n      <summary>\n        <para>Container for holding information about a serialized file to be written.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.WriteCommand.fileName\">\n      <summary>\n        <para>Final file name on disk of the serialized file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.WriteCommand.internalName\">\n      <summary>\n        <para>Internal name used by the loading system for a serialized file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.WriteCommand.serializeObjects\">\n      <summary>\n        <para>List of objects and their order contained inside a serialized file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Content.WriteCommand.#ctor\">\n      <summary>\n        <para>Default constructor for an empty WriteCommand.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Content.WriteResult\">\n      <summary>\n        <para>Struct containing the results from the ContentBuildPipeline.WriteSerialziedFile and ContentBuildPipeline.WriteSceneSerialziedFile APIs.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.WriteResult.includedTypes\">\n      <summary>\n        <para>Types that were included in the serialized file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.WriteResult.resourceFiles\">\n      <summary>\n        <para>Collection of files written by the ContentBuildInterface.WriteSerializedFile or ContentBuildInterface.WriteSceneSerializedFile APIs.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Content.WriteResult.serializedObjects\">\n      <summary>\n        <para>Collection of objects written to the serialized file.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.Build.IActiveBuildTargetChanged\">\n      <summary>\n        <para>Implement this interface to receive a callback after the active build platform has changed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.IActiveBuildTargetChanged.OnActiveBuildTargetChanged(UnityEditor.BuildTarget,UnityEditor.BuildTarget)\">\n      <summary>\n        <para>This function is called automatically when the active build platform has changed.</para>\n      </summary>\n      <param name=\"previousTarget\">The build target before the change.</param>\n      <param name=\"newTarget\">The new active build target.</param>\n    </member>\n    <member name=\"?:UnityEditor.Build.IFilterBuildAssemblies\">\n      <summary>\n        <para>Implement this interface to receive a callback to filter assemblies away from the build.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.IFilterBuildAssemblies.OnFilterAssemblies(UnityEditor.BuildOptions,System.String[])\">\n      <summary>\n        <para>Will be called after building script assemblies, but makes it possible to filter away unwanted scripts to be included.</para>\n      </summary>\n      <param name=\"buildOptions\">The current build options.</param>\n      <param name=\"assemblies\">The list of assemblies that will be included.</param>\n      <returns>\n        <para>Returns the filtered list of assemblies that are included in the build.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEditor.Build.IOrderedCallback\">\n      <summary>\n        <para>Interface that provides control over callback order.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.IOrderedCallback.callbackOrder\">\n      <summary>\n        <para>Returns the relative callback order for callbacks.  Callbacks with lower values are called before ones with higher values.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.Build.IPostBuildPlayerScriptDLLs\">\n      <summary>\n        <para>Implement this interface to receive a callback just after the player scripts have been compiled.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.IPostBuildPlayerScriptDLLs.OnPostBuildPlayerScriptDLLs(UnityEditor.Build.Reporting.BuildReport)\">\n      <summary>\n        <para>Implement this interface to receive a callback just after the player scripts have been compiled.</para>\n      </summary>\n      <param name=\"report\">A report containing information about the build, such as its target platform and output path.</param>\n    </member>\n    <member name=\"?:UnityEditor.Build.IPostprocessBuild\">\n      <summary>\n        <para>Implement this interface to receive a callback after the build is complete.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.IPostprocessBuild.OnPostprocessBuild(UnityEditor.BuildTarget,System.String)\">\n      <summary>\n        <para>Implement this function to receive a callback after the build is complete.</para>\n      </summary>\n      <param name=\"target\"></param>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"?:UnityEditor.Build.IPostprocessBuildWithReport\">\n      <summary>\n        <para>Implement this interface to receive a callback after the build is complete.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.IPostprocessBuildWithReport.OnPostprocessBuild(UnityEditor.Build.Reporting.BuildReport)\">\n      <summary>\n        <para>Implement this function to receive a callback after the build is complete.</para>\n      </summary>\n      <param name=\"report\">A BuildReport containing information about the build, such as the target platform and output path.</param>\n    </member>\n    <member name=\"?:UnityEditor.Build.IPreprocessBuild\">\n      <summary>\n        <para>Implement this interface to receive a callback before the build is started.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.IPreprocessBuild.OnPreprocessBuild(UnityEditor.BuildTarget,System.String)\">\n      <summary>\n        <para>Implement this function to receive a callback before the build is started.</para>\n      </summary>\n      <param name=\"target\"></param>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"?:UnityEditor.Build.IPreprocessBuildWithReport\">\n      <summary>\n        <para>Implement this interface to receive a callback before the build is started.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.IPreprocessBuildWithReport.OnPreprocessBuild(UnityEditor.Build.Reporting.BuildReport)\">\n      <summary>\n        <para>Implement this function to receive a callback before the build is started.</para>\n      </summary>\n      <param name=\"report\">A report containing information about the build, such as its target platform and output path.</param>\n    </member>\n    <member name=\"?:UnityEditor.Build.IPreprocessShaders\">\n      <summary>\n        <para>Implement this interface to receive a callback before a shader is compiled.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.IPreprocessShaders.OnProcessShader(UnityEngine.Shader,UnityEditor.Rendering.ShaderSnippetData,System.Collections.Generic.IList`1&lt;UnityEditor.Rendering.ShaderCompilerData&gt;)\">\n      <summary>\n        <para>Implement this interface to receive a callback before a shader snippet is compiled.</para>\n      </summary>\n      <param name=\"shader\">Shader that is being compiled.</param>\n      <param name=\"snippet\">Details about the specific shader code being compiled.</param>\n      <param name=\"data\">List of variants to be compiled for the specific shader code.</param>\n    </member>\n    <member name=\"?:UnityEditor.Build.IProcessScene\">\n      <summary>\n        <para>Implement this interface to receive a callback for each Scene during the build.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.IProcessScene.OnProcessScene(UnityEngine.SceneManagement.Scene)\">\n      <summary>\n        <para>Implement this function to receive a callback for each Scene during the build.</para>\n      </summary>\n      <param name=\"scene\">The current Scene being processed.</param>\n    </member>\n    <member name=\"?:UnityEditor.Build.IProcessSceneWithReport\">\n      <summary>\n        <para>Implement this interface to receive a callback for each Scene during the build.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.IProcessSceneWithReport.OnProcessScene(UnityEngine.SceneManagement.Scene,UnityEditor.Build.Reporting.BuildReport)\">\n      <summary>\n        <para>Implement this function to receive a callback for each Scene during the build.</para>\n      </summary>\n      <param name=\"scene\">The current Scene being processed.</param>\n      <param name=\"report\">A report containing information about the current build. When this callback is invoked for scene loading during Editor playmode, this parameter will be null.</param>\n    </member>\n    <member name=\"T:UnityEditor.Build.Player.PlayerBuildInterface\">\n      <summary>\n        <para>Low level interface for building scripts for Unity.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Player.PlayerBuildInterface.CompilePlayerScripts(UnityEditor.Build.Player.ScriptCompilationSettings,System.String)\">\n      <summary>\n        <para>Compiles user scripts into one or more assemblies.</para>\n      </summary>\n      <param name=\"input\"></param>\n      <param name=\"outputFolder\"></param>\n    </member>\n    <member name=\"T:UnityEditor.Build.Player.ScriptCompilationOptions\">\n      <summary>\n        <para>Script compilation options.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Player.ScriptCompilationOptions.Assertions\">\n      <summary>\n        <para>Include assertions in the compiled scripts. By default, the assertions are only included in development builds.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Player.ScriptCompilationOptions.DevelopmentBuild\">\n      <summary>\n        <para>Build a development version of the scripts.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Player.ScriptCompilationOptions.None\">\n      <summary>\n        <para>Compiled the scripts without any special settings.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Player.ScriptCompilationResult\">\n      <summary>\n        <para>Struct with result information returned from the PlayerBuildInterface.CompilePlayerScripts API.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Player.ScriptCompilationResult.assemblies\">\n      <summary>\n        <para>Collection of assemblies compiled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Player.ScriptCompilationResult.typeDB\">\n      <summary>\n        <para>Type information generated by the script compilation call.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Player.ScriptCompilationSettings\">\n      <summary>\n        <para>Struct containing information on how to build scripts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Player.ScriptCompilationSettings.group\">\n      <summary>\n        <para>Platform group for which scripts will be compiled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Player.ScriptCompilationSettings.options\">\n      <summary>\n        <para>Specific compiler options to use when compiling scripts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Player.ScriptCompilationSettings.target\">\n      <summary>\n        <para>Platform group for which scripts will be compiled.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Player.TypeDB\">\n      <summary>\n        <para>Container for holding information about script type and property data.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Player.TypeDB.Dispose\">\n      <summary>\n        <para>Dispose the TypeDB destroying all internal state.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Player.TypeDB.Equals(System.Object)\">\n      <summary>\n        <para>Returns true if the objects are equal.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Build.Player.TypeDB.GetHash128\">\n      <summary>\n        <para>Gets the hash for the BuildReferenceMap.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Player.TypeDB.GetHashCode\">\n      <summary>\n        <para>Gets the hash code for the TypeDB.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Player.TypeDB.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n      <summary>\n        <para>ISerializable method for serialization support outside of Unity's internal serialization system.</para>\n      </summary>\n      <param name=\"info\"></param>\n      <param name=\"context\"></param>\n    </member>\n    <member name=\"T:UnityEditor.Build.Reporting.BuildFile\">\n      <summary>\n        <para>Contains information about a single file produced by the build process.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildFile.path\">\n      <summary>\n        <para>The absolute path of the file produced by the build process.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildFile.role\">\n      <summary>\n        <para>The role the file plays in the build output.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildFile.size\">\n      <summary>\n        <para>The total size of the file, in bytes.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Reporting.BuildReport\">\n      <summary>\n        <para>The BuildReport API gives you information about the Unity build process.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildReport.files\">\n      <summary>\n        <para>An array of all the files output by the build process.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildReport.steps\">\n      <summary>\n        <para>An array of all the BuildSteps that took place during the build process.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildReport.strippingInfo\">\n      <summary>\n        <para>The StrippingInfo object for the build.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildReport.summary\">\n      <summary>\n        <para>A BuildSummary containing overall statistics and data about the build process.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Reporting.BuildResult\">\n      <summary>\n        <para>Describes the outcome of the build process.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Reporting.BuildResult.Cancelled\">\n      <summary>\n        <para>Indicates that the build was cancelled by the user.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Reporting.BuildResult.Failed\">\n      <summary>\n        <para>Indicates that the build failed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Reporting.BuildResult.Succeeded\">\n      <summary>\n        <para>Indicates that the build completed successfully.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Build.Reporting.BuildResult.Unknown\">\n      <summary>\n        <para>Indicates that the outcome of the build is in an unknown state.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Reporting.BuildStep\">\n      <summary>\n        <para>Contains information about a single step in the build process.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildStep.depth\">\n      <summary>\n        <para>The nesting depth of the build step.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildStep.duration\">\n      <summary>\n        <para>The total duration for this build step.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildStep.messages\">\n      <summary>\n        <para>All log messages recorded during this build step, in the order of which they occurred.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildStep.name\">\n      <summary>\n        <para>The name of this build step.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Reporting.BuildStepMessage\">\n      <summary>\n        <para>Contains information about a single log message recorded during the build process.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildStepMessage.content\">\n      <summary>\n        <para>The text content of the log message.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildStepMessage.type\">\n      <summary>\n        <para>The LogType of the log message.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Reporting.BuildSummary\">\n      <summary>\n        <para>Contains overall summary information about a build.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildSummary.buildEndedAt\">\n      <summary>\n        <para>The time the build ended.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildSummary.buildStartedAt\">\n      <summary>\n        <para>The time the build was started.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildSummary.guid\">\n      <summary>\n        <para>The Application.buildGUID of the build.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildSummary.options\">\n      <summary>\n        <para>The BuildOptions used for the build, as passed to BuildPipeline.BuildPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildSummary.outputPath\">\n      <summary>\n        <para>The output path for the build, as provided to BuildPipeline.BuildPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildSummary.platform\">\n      <summary>\n        <para>The platform that the build was created for.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildSummary.platformGroup\">\n      <summary>\n        <para>The platform group the build was created for.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildSummary.result\">\n      <summary>\n        <para>The outcome of the build.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildSummary.totalErrors\">\n      <summary>\n        <para>The total number of errors and exceptions recorded during the build process.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildSummary.totalSize\">\n      <summary>\n        <para>The total size of the build output, in bytes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildSummary.totalTime\">\n      <summary>\n        <para>The total time taken by the build process.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.BuildSummary.totalWarnings\">\n      <summary>\n        <para>The total number of warnings recorded during the build process.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Reporting.CommonRoles\">\n      <summary>\n        <para>This class provides constant values for some of the common roles used by files in the build. The role of each file in the build is available in BuildFile.role.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.appInfo\">\n      <summary>\n        <para>The BuildFile.role value of the file that provides config information used in Low Integrity mode on Windows.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.assetBundle\">\n      <summary>\n        <para>The BuildFile.role value of built AssetBundle files.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.assetBundleTextManifest\">\n      <summary>\n        <para>The BuildFile.role value of an AssetBundle manifest file, produced during the build process, that contains information about the bundle and its dependencies.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.bootConfig\">\n      <summary>\n        <para>The BuildFile.role value of the file that contains configuration information for the very early stages of engine startup.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.builtInResources\">\n      <summary>\n        <para>The BuildFile.role value of the file that contains built-in resources for the engine.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.builtInShaders\">\n      <summary>\n        <para>The BuildFile.role value of the file that contains Unity's built-in shaders, such as the Standard shader.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.crashHandler\">\n      <summary>\n        <para>The BuildFile.role value of the executable that is used to capture crashes from the player.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.debugInfo\">\n      <summary>\n        <para>The BuildFile.role value of files that contain information for debuggers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.dependentManagedLibrary\">\n      <summary>\n        <para>The BuildFile.role value of a managed library that is present in the build due to being a dependency of a CommonRoles.managedLibrary.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.engineLibrary\">\n      <summary>\n        <para>The BuildFile.role value of the main Unity runtime when it is built as a separate library.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.executable\">\n      <summary>\n        <para>The BuildFile.role value of an executable - the file that will actually be launched on the target device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.globalGameManagers\">\n      <summary>\n        <para>The BuildFile.role value of the file that contains global Project Settings data for the player.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.managedEngineApi\">\n      <summary>\n        <para>The BuildFile.role value of files that provide the managed API for Unity.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.managedLibrary\">\n      <summary>\n        <para>The BuildFile.role value of a managed assembly, containing compiled script code.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.manifestAssetBundle\">\n      <summary>\n        <para>The BuildFile.role value of a manifest AssetBundle, which is an AssetBundle that contains information about other AssetBundles and their dependencies.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.monoConfig\">\n      <summary>\n        <para>The BuildFile.role value of files that are used as configuration data by the Mono runtime.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.monoRuntime\">\n      <summary>\n        <para>The BuildFile.role value of files that make up the Mono runtime itself.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.resourcesFile\">\n      <summary>\n        <para>The BuildFile.role value of the file that contains the contents of the project's \"Resources\" folder, packed into a single file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.scene\">\n      <summary>\n        <para>The BuildFile.role value of a file that contains the packed content of a Scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.sharedAssets\">\n      <summary>\n        <para>The BuildFile.role value of a file that contains asset objects which are shared between scenes. Examples of asset objects are textures, models, and audio.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.streamingAsset\">\n      <summary>\n        <para>The BuildFile.role value of files that have been copied into the build without modification from the StreamingAssets folder in the project.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.CommonRoles.streamingResourceFile\">\n      <summary>\n        <para>The BuildFile.role value of a file that contains streaming resource data.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Build.Reporting.StrippingInfo\">\n      <summary>\n        <para>The StrippingInfo object contains information about which native code modules in the engine are still present in the build, and the reasons why they are still present.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Build.Reporting.StrippingInfo.includedModules\">\n      <summary>\n        <para>The native engine modules that were included in the build.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Build.Reporting.StrippingInfo.GetReasonsForIncluding(System.String)\">\n      <summary>\n        <para>Returns the list of dependencies or reasons that caused the given entity to be included in the build.</para>\n      </summary>\n      <param name=\"entityName\">The name of an engine module, class, or other entity present in the build.</param>\n      <returns>\n        <para>A list of modules, classes, or other entities that caused the provided entity to be included in the build.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.BuildAssetBundleOptions\">\n      <summary>\n        <para>Asset Bundle building options.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildAssetBundleOptions.AppendHashToAssetBundleName\">\n      <summary>\n        <para>Append the hash to the assetBundle name.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildAssetBundleOptions.ChunkBasedCompression\">\n      <summary>\n        <para>Use chunk-based LZ4 compression when creating the AssetBundle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildAssetBundleOptions.CollectDependencies\">\n      <summary>\n        <para>Includes all dependencies.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildAssetBundleOptions.CompleteAssets\">\n      <summary>\n        <para>Forces inclusion of the entire asset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildAssetBundleOptions.DeterministicAssetBundle\">\n      <summary>\n        <para>Builds an asset bundle using a hash for the id of the object stored in the asset bundle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildAssetBundleOptions.DisableLoadAssetByFileName\">\n      <summary>\n        <para>Disables Asset Bundle LoadAsset by file name.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildAssetBundleOptions.DisableLoadAssetByFileNameWithExtension\">\n      <summary>\n        <para>Disables Asset Bundle LoadAsset by file name with extension.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildAssetBundleOptions.DisableWriteTypeTree\">\n      <summary>\n        <para>Do not include type information within the AssetBundle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildAssetBundleOptions.DryRunBuild\">\n      <summary>\n        <para>Do a dry run build.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildAssetBundleOptions.ForceRebuildAssetBundle\">\n      <summary>\n        <para>Force rebuild the assetBundles.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildAssetBundleOptions.IgnoreTypeTreeChanges\">\n      <summary>\n        <para>Ignore the type tree changes when doing the incremental build check.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildAssetBundleOptions.None\">\n      <summary>\n        <para>Build assetBundle without any special option.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildAssetBundleOptions.StrictMode\">\n      <summary>\n        <para>Do not allow the build to succeed if any errors are reporting during it.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildAssetBundleOptions.UncompressedAssetBundle\">\n      <summary>\n        <para>Don't compress the data when creating the asset bundle.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.BuildOptions\">\n      <summary>\n        <para>Building options. Multiple options can be combined together.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.AcceptExternalModificationsToPlayer\">\n      <summary>\n        <para>Used when building Xcode (iOS) or Eclipse (Android) projects.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.AllowDebugging\">\n      <summary>\n        <para>Allow script debuggers to attach to the player remotely.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.AutoRunPlayer\">\n      <summary>\n        <para>Run the built player.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.BuildAdditionalStreamedScenes\">\n      <summary>\n        <para>Build a compressed asset bundle that contains streamed scenes loadable with the UnityWebRequest class.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.BuildScriptsOnly\">\n      <summary>\n        <para>Build only the scripts of a project.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.CompressWithLz4\">\n      <summary>\n        <para>Use chunk-based LZ4 compression when building the Player.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.CompressWithLz4HC\">\n      <summary>\n        <para>Use chunk-based LZ4 high-compression when building the Player.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.ConnectToHost\">\n      <summary>\n        <para>Sets the Player to connect to the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.ConnectWithProfiler\">\n      <summary>\n        <para>Start the player with a connection to the profiler in the editor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.Development\">\n      <summary>\n        <para>Build a development version of the player.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.EnableHeadlessMode\">\n      <summary>\n        <para>Build headless Linux standalone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.ForceEnableAssertions\">\n      <summary>\n        <para>Include assertions in the build. By default, the assertions are only included in development builds.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.ForceOptimizeScriptCompilation\">\n      <summary>\n        <para>Force full optimizations for script complilation in Development builds.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.IncludeTestAssemblies\">\n      <summary>\n        <para>Build will include Assemblies for testing.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.None\">\n      <summary>\n        <para>Perform the specified build without any special settings or extra tasks.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.NoUniqueIdentifier\">\n      <summary>\n        <para>Will force the buildGUID to all zeros.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.ShowBuiltPlayer\">\n      <summary>\n        <para>Show the built player.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.StrictMode\">\n      <summary>\n        <para>Do not allow the build to succeed if any errors are reporting during it.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.SymlinkLibraries\">\n      <summary>\n        <para>Symlink runtime libraries when generating iOS Xcode project. (Faster iteration time).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.UncompressedAssetBundle\">\n      <summary>\n        <para>Don't compress the data when creating the asset bundle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildOptions.WebPlayerOfflineDeployment\">\n      <summary>\n        <para>Copy UnityObject.js alongside Web Player so it wouldn't have to be downloaded from internet.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.BuildPipeline\">\n      <summary>\n        <para>Lets you programmatically build players or AssetBundles which can be loaded from the web.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.BuildPipeline.isBuildingPlayer\">\n      <summary>\n        <para>Is a player currently being built?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildAssetBundle\">\n      <summary>\n        <para>Builds an asset bundle.</para>\n      </summary>\n      <param name=\"mainAsset\">Lets you specify a specific object that can be conveniently retrieved using AssetBundle.mainAsset.</param>\n      <param name=\"assets\">An array of assets to write into the bundle.</param>\n      <param name=\"pathName\">The filename where to write the compressed asset bundle.</param>\n      <param name=\"assetBundleOptions\">Automatically include dependencies or always include complete assets instead of just the exact referenced objects.</param>\n      <param name=\"targetPlatform\">The platform to build the bundle for.</param>\n      <param name=\"crc\">The optional crc output parameter can be used to get a CRC checksum for the generated AssetBundle, which can be used to verify content when downloading AssetBundles using UnityWebRequestAssetBundle.GetAssetBundle.</param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildAssetBundle\">\n      <summary>\n        <para>Builds an asset bundle.</para>\n      </summary>\n      <param name=\"mainAsset\">Lets you specify a specific object that can be conveniently retrieved using AssetBundle.mainAsset.</param>\n      <param name=\"assets\">An array of assets to write into the bundle.</param>\n      <param name=\"pathName\">The filename where to write the compressed asset bundle.</param>\n      <param name=\"assetBundleOptions\">Automatically include dependencies or always include complete assets instead of just the exact referenced objects.</param>\n      <param name=\"targetPlatform\">The platform to build the bundle for.</param>\n      <param name=\"crc\">The optional crc output parameter can be used to get a CRC checksum for the generated AssetBundle, which can be used to verify content when downloading AssetBundles using UnityWebRequestAssetBundle.GetAssetBundle.</param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildAssetBundle\">\n      <summary>\n        <para>Builds an asset bundle.</para>\n      </summary>\n      <param name=\"mainAsset\">Lets you specify a specific object that can be conveniently retrieved using AssetBundle.mainAsset.</param>\n      <param name=\"assets\">An array of assets to write into the bundle.</param>\n      <param name=\"pathName\">The filename where to write the compressed asset bundle.</param>\n      <param name=\"assetBundleOptions\">Automatically include dependencies or always include complete assets instead of just the exact referenced objects.</param>\n      <param name=\"targetPlatform\">The platform to build the bundle for.</param>\n      <param name=\"crc\">The optional crc output parameter can be used to get a CRC checksum for the generated AssetBundle, which can be used to verify content when downloading AssetBundles using UnityWebRequestAssetBundle.GetAssetBundle.</param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildAssetBundle\">\n      <summary>\n        <para>Builds an asset bundle.</para>\n      </summary>\n      <param name=\"mainAsset\">Lets you specify a specific object that can be conveniently retrieved using AssetBundle.mainAsset.</param>\n      <param name=\"assets\">An array of assets to write into the bundle.</param>\n      <param name=\"pathName\">The filename where to write the compressed asset bundle.</param>\n      <param name=\"assetBundleOptions\">Automatically include dependencies or always include complete assets instead of just the exact referenced objects.</param>\n      <param name=\"targetPlatform\">The platform to build the bundle for.</param>\n      <param name=\"crc\">The optional crc output parameter can be used to get a CRC checksum for the generated AssetBundle, which can be used to verify content when downloading AssetBundles using UnityWebRequestAssetBundle.GetAssetBundle.</param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildAssetBundle(UnityEngine.Object,UnityEngine.Object[],System.String,UnityEditor.BuildAssetBundleOptions,UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Builds an asset bundle.</para>\n      </summary>\n      <param name=\"mainAsset\">Lets you specify a specific object that can be conveniently retrieved using AssetBundle.mainAsset.</param>\n      <param name=\"assets\">An array of assets to write into the bundle.</param>\n      <param name=\"pathName\">The filename where to write the compressed asset bundle.</param>\n      <param name=\"assetBundleOptions\">Automatically include dependencies or always include complete assets instead of just the exact referenced objects.</param>\n      <param name=\"targetPlatform\">The platform to build the bundle for.</param>\n      <param name=\"crc\">The optional crc output parameter can be used to get a CRC checksum for the generated AssetBundle, which can be used to verify content when downloading AssetBundles using UnityWebRequestAssetBundle.GetAssetBundle.</param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildAssetBundle(UnityEngine.Object,UnityEngine.Object[],System.String,System.UInt32&amp;,UnityEditor.BuildAssetBundleOptions,UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Builds an asset bundle.</para>\n      </summary>\n      <param name=\"mainAsset\">Lets you specify a specific object that can be conveniently retrieved using AssetBundle.mainAsset.</param>\n      <param name=\"assets\">An array of assets to write into the bundle.</param>\n      <param name=\"pathName\">The filename where to write the compressed asset bundle.</param>\n      <param name=\"assetBundleOptions\">Automatically include dependencies or always include complete assets instead of just the exact referenced objects.</param>\n      <param name=\"targetPlatform\">The platform to build the bundle for.</param>\n      <param name=\"crc\">The optional crc output parameter can be used to get a CRC checksum for the generated AssetBundle, which can be used to verify content when downloading AssetBundles using UnityWebRequestAssetBundle.GetAssetBundle.</param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildAssetBundleExplicitAssetNames\">\n      <summary>\n        <para>Builds an asset bundle, with custom names for the assets.</para>\n      </summary>\n      <param name=\"assets\">A collection of assets to be built into the asset bundle. Asset bundles can contain any asset found in the project folder.</param>\n      <param name=\"assetNames\">An array of strings of the same size as the number of assets.\nThese will be used as asset names, which you can then pass to AssetBundle.Load to load a specific asset. Use BuildAssetBundle to just use the asset's path names instead.</param>\n      <param name=\"pathName\">The location where the compressed asset bundle will be written to.</param>\n      <param name=\"assetBundleOptions\">Automatically include dependencies or always include complete assets instead of just the exact referenced objects.</param>\n      <param name=\"targetPlatform\">The platform where the asset bundle will be used.</param>\n      <param name=\"crc\">An optional output parameter used to get a CRC checksum for the generated AssetBundle. (Used to verify content when downloading AssetBundles using UnityWebRequestAssetBundle.GetAssetBundle().)</param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildAssetBundleExplicitAssetNames\">\n      <summary>\n        <para>Builds an asset bundle, with custom names for the assets.</para>\n      </summary>\n      <param name=\"assets\">A collection of assets to be built into the asset bundle. Asset bundles can contain any asset found in the project folder.</param>\n      <param name=\"assetNames\">An array of strings of the same size as the number of assets.\nThese will be used as asset names, which you can then pass to AssetBundle.Load to load a specific asset. Use BuildAssetBundle to just use the asset's path names instead.</param>\n      <param name=\"pathName\">The location where the compressed asset bundle will be written to.</param>\n      <param name=\"assetBundleOptions\">Automatically include dependencies or always include complete assets instead of just the exact referenced objects.</param>\n      <param name=\"targetPlatform\">The platform where the asset bundle will be used.</param>\n      <param name=\"crc\">An optional output parameter used to get a CRC checksum for the generated AssetBundle. (Used to verify content when downloading AssetBundles using UnityWebRequestAssetBundle.GetAssetBundle().)</param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildAssetBundleExplicitAssetNames\">\n      <summary>\n        <para>Builds an asset bundle, with custom names for the assets.</para>\n      </summary>\n      <param name=\"assets\">A collection of assets to be built into the asset bundle. Asset bundles can contain any asset found in the project folder.</param>\n      <param name=\"assetNames\">An array of strings of the same size as the number of assets.\nThese will be used as asset names, which you can then pass to AssetBundle.Load to load a specific asset. Use BuildAssetBundle to just use the asset's path names instead.</param>\n      <param name=\"pathName\">The location where the compressed asset bundle will be written to.</param>\n      <param name=\"assetBundleOptions\">Automatically include dependencies or always include complete assets instead of just the exact referenced objects.</param>\n      <param name=\"targetPlatform\">The platform where the asset bundle will be used.</param>\n      <param name=\"crc\">An optional output parameter used to get a CRC checksum for the generated AssetBundle. (Used to verify content when downloading AssetBundles using UnityWebRequestAssetBundle.GetAssetBundle().)</param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildAssetBundleExplicitAssetNames\">\n      <summary>\n        <para>Builds an asset bundle, with custom names for the assets.</para>\n      </summary>\n      <param name=\"assets\">A collection of assets to be built into the asset bundle. Asset bundles can contain any asset found in the project folder.</param>\n      <param name=\"assetNames\">An array of strings of the same size as the number of assets.\nThese will be used as asset names, which you can then pass to AssetBundle.Load to load a specific asset. Use BuildAssetBundle to just use the asset's path names instead.</param>\n      <param name=\"pathName\">The location where the compressed asset bundle will be written to.</param>\n      <param name=\"assetBundleOptions\">Automatically include dependencies or always include complete assets instead of just the exact referenced objects.</param>\n      <param name=\"targetPlatform\">The platform where the asset bundle will be used.</param>\n      <param name=\"crc\">An optional output parameter used to get a CRC checksum for the generated AssetBundle. (Used to verify content when downloading AssetBundles using UnityWebRequestAssetBundle.GetAssetBundle().)</param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildAssetBundleExplicitAssetNames(UnityEngine.Object[],System.String[],System.String,UnityEditor.BuildAssetBundleOptions,UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Builds an asset bundle, with custom names for the assets.</para>\n      </summary>\n      <param name=\"assets\">A collection of assets to be built into the asset bundle. Asset bundles can contain any asset found in the project folder.</param>\n      <param name=\"assetNames\">An array of strings of the same size as the number of assets.\nThese will be used as asset names, which you can then pass to AssetBundle.Load to load a specific asset. Use BuildAssetBundle to just use the asset's path names instead.</param>\n      <param name=\"pathName\">The location where the compressed asset bundle will be written to.</param>\n      <param name=\"assetBundleOptions\">Automatically include dependencies or always include complete assets instead of just the exact referenced objects.</param>\n      <param name=\"targetPlatform\">The platform where the asset bundle will be used.</param>\n      <param name=\"crc\">An optional output parameter used to get a CRC checksum for the generated AssetBundle. (Used to verify content when downloading AssetBundles using UnityWebRequestAssetBundle.GetAssetBundle().)</param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildAssetBundleExplicitAssetNames(UnityEngine.Object[],System.String[],System.String,System.UInt32&amp;,UnityEditor.BuildAssetBundleOptions,UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Builds an asset bundle, with custom names for the assets.</para>\n      </summary>\n      <param name=\"assets\">A collection of assets to be built into the asset bundle. Asset bundles can contain any asset found in the project folder.</param>\n      <param name=\"assetNames\">An array of strings of the same size as the number of assets.\nThese will be used as asset names, which you can then pass to AssetBundle.Load to load a specific asset. Use BuildAssetBundle to just use the asset's path names instead.</param>\n      <param name=\"pathName\">The location where the compressed asset bundle will be written to.</param>\n      <param name=\"assetBundleOptions\">Automatically include dependencies or always include complete assets instead of just the exact referenced objects.</param>\n      <param name=\"targetPlatform\">The platform where the asset bundle will be used.</param>\n      <param name=\"crc\">An optional output parameter used to get a CRC checksum for the generated AssetBundle. (Used to verify content when downloading AssetBundles using UnityWebRequestAssetBundle.GetAssetBundle().)</param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildAssetBundles(System.String,UnityEditor.BuildAssetBundleOptions,UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Build all AssetBundles specified in the editor.</para>\n      </summary>\n      <param name=\"outputPath\">Output path for the AssetBundles.</param>\n      <param name=\"assetBundleOptions\">AssetBundle building options.</param>\n      <param name=\"targetPlatform\">Chosen target build platform.</param>\n      <returns>\n        <para>The manifest listing all AssetBundles included in this build.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildAssetBundles(System.String,UnityEditor.AssetBundleBuild[],UnityEditor.BuildAssetBundleOptions,UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Build AssetBundles from a building map.</para>\n      </summary>\n      <param name=\"outputPath\">Output path for the AssetBundles.</param>\n      <param name=\"builds\">AssetBundle building map.</param>\n      <param name=\"assetBundleOptions\">AssetBundle building options.</param>\n      <param name=\"targetPlatform\">Target build platform.</param>\n      <returns>\n        <para>The manifest listing all AssetBundles included in this build.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildPlayer(UnityEditor.BuildPlayerOptions)\">\n      <summary>\n        <para>Builds a player.</para>\n      </summary>\n      <param name=\"buildPlayerOptions\">Provide various options to control the behavior of BuildPipeline.BuildPlayer.</param>\n      <returns>\n        <para>An error message if an error occurred.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildPlayer(System.String[],System.String,UnityEditor.BuildTarget,UnityEditor.BuildOptions)\">\n      <summary>\n        <para>Builds a player. These overloads are still supported, but will be replaced. Please use BuildPlayer (BuildPlayerOptions buildPlayerOptions)  instead.</para>\n      </summary>\n      <param name=\"levels\">The scenes to be included in the build. If empty, the currently open scene will be built. Paths are relative to the project folder (AssetsMyLevelsMyScene.unity).</param>\n      <param name=\"locationPathName\">The path where the application will be built.</param>\n      <param name=\"target\">The BuildTarget to build.</param>\n      <param name=\"options\">Additional BuildOptions, like whether to run the built player.</param>\n      <returns>\n        <para>An error message if an error occurred.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildPlayer(UnityEditor.EditorBuildSettingsScene[],System.String,UnityEditor.BuildTarget,UnityEditor.BuildOptions)\">\n      <summary>\n        <para>Builds a player. These overloads are still supported, but will be replaced. Please use BuildPlayer (BuildPlayerOptions buildPlayerOptions)  instead.</para>\n      </summary>\n      <param name=\"levels\">The scenes to be included in the build. If empty, the currently open scene will be built. Paths are relative to the project folder (AssetsMyLevelsMyScene.unity).</param>\n      <param name=\"locationPathName\">The path where the application will be built.</param>\n      <param name=\"target\">The BuildTarget to build.</param>\n      <param name=\"options\">Additional BuildOptions, like whether to run the built player.</param>\n      <returns>\n        <para>An error message if an error occurred.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildStreamedSceneAssetBundle(System.String[],System.String,UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Builds one or more scenes and all their dependencies into a compressed asset bundle.</para>\n      </summary>\n      <param name=\"levels\">Pathnames of levels to include in the asset bundle.</param>\n      <param name=\"locationPath\">Pathname for the output asset bundle.</param>\n      <param name=\"target\">Runtime platform on which the asset bundle will be used.</param>\n      <param name=\"crc\">Output parameter to receive CRC checksum of generated assetbundle.</param>\n      <param name=\"options\">Build options. See BuildOptions for possible values.</param>\n      <returns>\n        <para>String with an error message, empty on success.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildStreamedSceneAssetBundle(System.String[],System.String,UnityEditor.BuildTarget,System.UInt32&amp;)\">\n      <summary>\n        <para>Builds one or more scenes and all their dependencies into a compressed asset bundle.</para>\n      </summary>\n      <param name=\"levels\">Pathnames of levels to include in the asset bundle.</param>\n      <param name=\"locationPath\">Pathname for the output asset bundle.</param>\n      <param name=\"target\">Runtime platform on which the asset bundle will be used.</param>\n      <param name=\"crc\">Output parameter to receive CRC checksum of generated assetbundle.</param>\n      <param name=\"options\">Build options. See BuildOptions for possible values.</param>\n      <returns>\n        <para>String with an error message, empty on success.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildStreamedSceneAssetBundle(System.String[],System.String,UnityEditor.BuildTarget,UnityEditor.BuildOptions)\">\n      <summary>\n        <para>Builds one or more scenes and all their dependencies into a compressed asset bundle.</para>\n      </summary>\n      <param name=\"levels\">Pathnames of levels to include in the asset bundle.</param>\n      <param name=\"locationPath\">Pathname for the output asset bundle.</param>\n      <param name=\"target\">Runtime platform on which the asset bundle will be used.</param>\n      <param name=\"crc\">Output parameter to receive CRC checksum of generated assetbundle.</param>\n      <param name=\"options\">Build options. See BuildOptions for possible values.</param>\n      <returns>\n        <para>String with an error message, empty on success.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.BuildStreamedSceneAssetBundle(System.String[],System.String,UnityEditor.BuildTarget,System.UInt32&amp;,UnityEditor.BuildOptions)\">\n      <summary>\n        <para>Builds one or more scenes and all their dependencies into a compressed asset bundle.</para>\n      </summary>\n      <param name=\"levels\">Pathnames of levels to include in the asset bundle.</param>\n      <param name=\"locationPath\">Pathname for the output asset bundle.</param>\n      <param name=\"target\">Runtime platform on which the asset bundle will be used.</param>\n      <param name=\"crc\">Output parameter to receive CRC checksum of generated assetbundle.</param>\n      <param name=\"options\">Build options. See BuildOptions for possible values.</param>\n      <returns>\n        <para>String with an error message, empty on success.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.GetCRCForAssetBundle(System.String,System.UInt32&amp;)\">\n      <summary>\n        <para>Extract the crc checksum for the given AssetBundle.</para>\n      </summary>\n      <param name=\"targetPath\"></param>\n      <param name=\"crc\"></param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.GetHashForAssetBundle(System.String,UnityEngine.Hash128&amp;)\">\n      <summary>\n        <para>Extract the hash for the given AssetBundle.</para>\n      </summary>\n      <param name=\"targetPath\"></param>\n      <param name=\"hash\"></param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.IsBuildTargetSupported(UnityEditor.BuildTargetGroup,UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Returns true if the specified build target is currently available in the Editor.</para>\n      </summary>\n      <param name=\"buildTargetGroup\">build target group</param>\n      <param name=\"target\">build target</param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.PopAssetDependencies\">\n      <summary>\n        <para>Lets you manage cross-references and dependencies between different asset bundles and player builds.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.BuildPipeline.PushAssetDependencies\">\n      <summary>\n        <para>Lets you manage cross-references and dependencies between different asset bundles and player builds.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.BuildPlayerOptions\">\n      <summary>\n        <para>Provide various options to control the behavior of BuildPipeline.BuildPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.BuildPlayerOptions.assetBundleManifestPath\">\n      <summary>\n        <para>The path to an manifest file describing all of the asset bundles used in the build (optional).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.BuildPlayerOptions.locationPathName\">\n      <summary>\n        <para>The path where the application will be built.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.BuildPlayerOptions.options\">\n      <summary>\n        <para>Additional BuildOptions, like whether to run the built player.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.BuildPlayerOptions.scenes\">\n      <summary>\n        <para>The scenes to be included in the build. If empty, the currently open scene will be built. Paths are relative to the project folder (AssetsMyLevelsMyScene.unity).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.BuildPlayerOptions.target\">\n      <summary>\n        <para>The BuildTarget to build.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.BuildPlayerOptions.targetGroup\">\n      <summary>\n        <para>The BuildTargetGroup to build.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.BuildPlayerWindow\">\n      <summary>\n        <para>The default build settings window.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.BuildPlayerWindow.BuildMethodException\">\n      <summary>\n        <para>Exceptions used to indicate abort or failure in the callbacks registered via BuildPlayerWindow.RegisterBuildPlayerHandler and BuildPlayerWindow.RegisterGetBuildPlayerOptionsHandler.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.BuildPlayerWindow.BuildMethodException.#ctor\">\n      <summary>\n        <para>Create a new BuildMethodException.</para>\n      </summary>\n      <param name=\"message\">Display this message as an error in the editor log.</param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPlayerWindow.BuildMethodException.#ctor(System.String)\">\n      <summary>\n        <para>Create a new BuildMethodException.</para>\n      </summary>\n      <param name=\"message\">Display this message as an error in the editor log.</param>\n    </member>\n    <member name=\"T:UnityEditor.BuildPlayerWindow.DefaultBuildMethods\">\n      <summary>\n        <para>Default build methods for the BuildPlayerWindow.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.BuildPlayerWindow.DefaultBuildMethods.BuildPlayer(UnityEditor.BuildPlayerOptions)\">\n      <summary>\n        <para>The built-in, default handler for executing a player build. Can be used to provide default functionality in a custom build player window.</para>\n      </summary>\n      <param name=\"options\">The options to build with.</param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPlayerWindow.DefaultBuildMethods.GetBuildPlayerOptions(UnityEditor.BuildPlayerOptions)\">\n      <summary>\n        <para>The built-in, default handler for calculating build player options. Can be used to provide default functionality in a custom build player window.</para>\n      </summary>\n      <param name=\"defaultBuildPlayerOptions\">Default options.</param>\n      <returns>\n        <para>The calculated BuildPlayerOptions.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.BuildPlayerWindow.RegisterBuildPlayerHandler(System.Action`1&lt;UnityEditor.BuildPlayerOptions&gt;)\">\n      <summary>\n        <para>Register a delegate to intercept or override the build process executed with the \"Build\" and \"Build and Run\" buttons. Registering a null value will restore default behavior, which is the equivalent of calling BuildPlayerWindow.DefaultBuildMethods.BuildPlayer.</para>\n      </summary>\n      <param name=\"func\">Delegate System.Action that takes a BuildPipeline.BuildPlayerOptions parameter.</param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPlayerWindow.RegisterGetBuildPlayerOptionsHandler(System.Func`2&lt;UnityEditor.BuildPlayerOptions,UnityEditor.BuildPlayerOptions&gt;)\">\n      <summary>\n        <para>Register a delegate method to calculate BuildPlayerOptions that are passed to the build player handler. Registering a null value will restore default behavior, which is the equivalent of calling BuildPlayerWindow.DefaultBuildMethods.GetBuildPlayerOptions.</para>\n      </summary>\n      <param name=\"func\">Delegate System.Func that takes a BuildPlayerOptions parameter. The value passed into the delegate will represent default options. The return value will be passed to the default build player handler, or to a custom handler set with BuildPlayerWindow.RegisterBuildPlayerHandler.</param>\n    </member>\n    <member name=\"M:UnityEditor.BuildPlayerWindow.ShowBuildPlayerWindow\">\n      <summary>\n        <para>Open the build settings window.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.BuildTarget\">\n      <summary>\n        <para>Target build platform.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.iOS\">\n      <summary>\n        <para>Build an iOS player.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.iPhone\">\n      <summary>\n        <para>OBSOLETE: Use iOS. Build an iOS player.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.tvOS\">\n      <summary>\n        <para>Build to Apple's tvOS platform.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.Android\">\n      <summary>\n        <para>Build an Android .apk standalone app.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.N3DS\">\n      <summary>\n        <para>Build to Nintendo 3DS platform.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.PS4\">\n      <summary>\n        <para>Build a PS4 Standalone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.PSP2\">\n      <summary>\n        <para>Build a PS Vita Standalone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.StandaloneLinux\">\n      <summary>\n        <para>Build a Linux standalone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.StandaloneLinux64\">\n      <summary>\n        <para>Build a Linux 64-bit standalone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.StandaloneLinuxUniversal\">\n      <summary>\n        <para>Build a Linux universal standalone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.StandaloneOSX\">\n      <summary>\n        <para>Build a macOS standalone (Intel 64-bit).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.StandaloneOSXIntel\">\n      <summary>\n        <para>Build a macOS Intel 32-bit standalone. (This build target is deprecated)</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.StandaloneOSXIntel64\">\n      <summary>\n        <para>Build a macOS Intel 64-bit standalone. (This build target is deprecated)</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.StandaloneWindows\">\n      <summary>\n        <para>Build a Windows standalone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.StandaloneWindows64\">\n      <summary>\n        <para>Build a Windows 64-bit standalone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.Switch\">\n      <summary>\n        <para>Build a Nintendo Switch player.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.WebGL\">\n      <summary>\n        <para>WebGL.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.WebPlayer\">\n      <summary>\n        <para>Build a web player. (This build target is deprecated. Building for web player will no longer be supported in future versions of Unity.)</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.WebPlayerStreamed\">\n      <summary>\n        <para>Build a streamed web player.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.WSAPlayer\">\n      <summary>\n        <para>Build an Windows Store Apps player.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTarget.XboxOne\">\n      <summary>\n        <para>Build a Xbox One Standalone.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.BuildTargetGroup\">\n      <summary>\n        <para>Build target group.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTargetGroup.iOS\">\n      <summary>\n        <para>Apple iOS target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTargetGroup.iPhone\">\n      <summary>\n        <para>OBSOLETE: Use iOS. Apple iOS target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTargetGroup.tvOS\">\n      <summary>\n        <para>Apple's tvOS target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTargetGroup.Android\">\n      <summary>\n        <para>Android target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTargetGroup.Facebook\">\n      <summary>\n        <para>Facebook target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTargetGroup.N3DS\">\n      <summary>\n        <para>Nintendo 3DS target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTargetGroup.PS4\">\n      <summary>\n        <para>Sony Playstation 4 target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTargetGroup.PSP2\">\n      <summary>\n        <para>Sony PS Vita target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTargetGroup.Standalone\">\n      <summary>\n        <para>Mac/PC standalone target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTargetGroup.Switch\">\n      <summary>\n        <para>Nintendo Switch target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTargetGroup.Unknown\">\n      <summary>\n        <para>Unknown target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTargetGroup.WebGL\">\n      <summary>\n        <para>WebGL.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTargetGroup.WebPlayer\">\n      <summary>\n        <para>Mac/PC webplayer target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTargetGroup.WSA\">\n      <summary>\n        <para>Windows Store Apps target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.BuildTargetGroup.XboxOne\">\n      <summary>\n        <para>Microsoft Xbox One target.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.CallbackOrderAttribute\">\n      <summary>\n        <para>Base class for Attributes that require a callback index.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Callbacks.DidReloadScripts\">\n      <summary>\n        <para>Add this attribute to a method to get a notification after scripts have been reloaded.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Callbacks.DidReloadScripts.#ctor\">\n      <summary>\n        <para>DidReloadScripts attribute.</para>\n      </summary>\n      <param name=\"callbackOrder\">Order in which separate attributes will be processed.</param>\n    </member>\n    <member name=\"M:UnityEditor.Callbacks.DidReloadScripts.#ctor(System.Int32)\">\n      <summary>\n        <para>DidReloadScripts attribute.</para>\n      </summary>\n      <param name=\"callbackOrder\">Order in which separate attributes will be processed.</param>\n    </member>\n    <member name=\"T:UnityEditor.Callbacks.OnOpenAssetAttribute\">\n      <summary>\n        <para>Callback attribute for opening an asset in Unity (e.g the callback is fired when double clicking an asset in the Project Browser).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Callbacks.PostProcessBuildAttribute\">\n      <summary>\n        <para>Add this attribute to a method to get a notification just after building the player.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Callbacks.PostProcessSceneAttribute\">\n      <summary>\n        <para>Add this attribute to a method to get a notification just after building the scene.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.CameraEditor\">\n      <summary>\n        <para>Unity Camera Editor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.settings\">\n      <summary>\n        <para>Settings for the camera editor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.OnDestroy\">\n      <summary>\n        <para>See ScriptableObject.OnDestroy.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.OnEnable\">\n      <summary>\n        <para>See ScriptableObject.OnEnable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.OnInspectorGUI\">\n      <summary>\n        <para>See Editor.OnInspectorGUI.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.OnSceneGUI\">\n      <summary>\n        <para>See Editor.OnSceneGUI.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.CameraEditor.Settings\">\n      <summary>\n        <para>Contains all drawable elements of the CameraEditor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.allowDynamicResolution\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.allowMSAA\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.backgroundColor\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.clearFlags\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.cullingMask\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.depth\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.farClippingPlane\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.fieldOfView\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.focalLength\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.lensShift\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.nearClippingPlane\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.normalizedViewPortRect\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.occlusionCulling\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.orthographic\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.orthographicSize\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.renderingPath\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.sensorSize\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.stereoConvergence\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.stereoSeparation\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.targetDisplay\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.targetEye\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.targetTexture\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.ApplyModifiedProperties\">\n      <summary>\n        <para>See SerializedObject.ApplyModifiedProperties.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.DrawBackgroundColor\">\n      <summary>\n        <para>Draws the default [[CameraEditor] background color widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.DrawClearFlags\">\n      <summary>\n        <para>Draws the default [[CameraEditor] clear flags widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.DrawClippingPlanes\">\n      <summary>\n        <para>Draws the default [[CameraEditor] clipping planes widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.DrawCullingMask\">\n      <summary>\n        <para>Draws the default [[CameraEditor] culling mask widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.DrawDepth\">\n      <summary>\n        <para>Draws the default [[CameraEditor] depth widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.DrawDynamicResolution\">\n      <summary>\n        <para>Draws the default [[CameraEditor] dynamic resolution widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.DrawHDR\">\n      <summary>\n        <para>Draws the default [[CameraEditor] HDR widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.DrawMSAA\">\n      <summary>\n        <para>Draws the default [[CameraEditor] MSAA widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.DrawMultiDisplay\">\n      <summary>\n        <para>Draws the default [[CameraEditor] muliple display widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.DrawNormalizedViewPort\">\n      <summary>\n        <para>Draws the default [[CameraEditor] viewport widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.DrawOcclusionCulling\">\n      <summary>\n        <para>Draws the default [[CameraEditor] occlusion culling widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.DrawProjection\">\n      <summary>\n        <para>Draws the default [[CameraEditor] projection widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.DrawRenderingPath\">\n      <summary>\n        <para>Draws the default [[CameraEditor] rendering path widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.DrawTargetEye\">\n      <summary>\n        <para>Draws the default [[CameraEditor] target eye widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.DrawTargetTexture(System.Boolean)\">\n      <summary>\n        <para>Draws the default [[CameraEditor] target texture widget.</para>\n      </summary>\n      <param name=\"deferred\"></param>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.DrawVR\">\n      <summary>\n        <para>Draws the default [[CameraEditor] VR widget.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditor.Settings.HDR\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Camera.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.OnEnable\">\n      <summary>\n        <para>Populate the settings object with data linked to the Camera SerializedObject.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditor.Settings.Update\">\n      <summary>\n        <para>See SerializedObject.Update.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.CameraEditorUtils\">\n      <summary>\n        <para>Utilities for cameras.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditorUtils.DrawFrustumGizmo(UnityEngine.Camera)\">\n      <summary>\n        <para>Draw the frustrum gizmo of a camera.</para>\n      </summary>\n      <param name=\"camera\">The camera to use.</param>\n    </member>\n    <member name=\"P:UnityEditor.CameraEditorUtils.GameViewAspectRatio\">\n      <summary>\n        <para>The aspect ratio of the game view.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditorUtils.GetFrustumAspectRatio(UnityEngine.Camera)\">\n      <summary>\n        <para>Calculate the frustrum aspect ratio of a camera.</para>\n      </summary>\n      <param name=\"camera\">Camera to use.</param>\n      <returns>\n        <para>The frustrum aspect ratio of the provided camera.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditorUtils.GetFrustumPlaneAt(UnityEngine.Matrix4x4,UnityEngine.Vector3,System.Single,UnityEngine.Vector3[])\">\n      <summary>\n        <para>Calculate the points of the frustrum plane facing the viewer at a specific distance.\n\nThe points array will be filled with the calculated points in the following order: left bottom, left top, right top and right bottom.</para>\n      </summary>\n      <param name=\"clipToWorld\">Clip space to world space matrix.</param>\n      <param name=\"viewPosition\">View position in world space.</param>\n      <param name=\"distance\">Distance from the view position of the plane.</param>\n      <param name=\"points\">Calculated points.  (A minimum size of 4 elements is required).</param>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditorUtils.HandleFrustum(UnityEngine.Camera)\">\n      <summary>\n        <para>Draw the frustrum handles for a camera.</para>\n      </summary>\n      <param name=\"c\">The camera to use.</param>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditorUtils.IsViewportRectValidToRender(UnityEngine.Rect)\">\n      <summary>\n        <para>Check whether a viewport is valid.</para>\n      </summary>\n      <param name=\"normalizedViewPortRect\">Viewport to check.</param>\n      <returns>\n        <para>Whether the viewport is valid.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditorUtils.PerspectiveClipToWorld(UnityEngine.Matrix4x4,UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Calculate the world space position of a point in clip space.\n\nThe z component will be used to get the point at the distance z from the viewer.</para>\n      </summary>\n      <param name=\"clipToWorld\">Clip to world matrix to use.</param>\n      <param name=\"viewPositionWS\">The viewer's position in world space.</param>\n      <param name=\"positionCS\">The position in clip space.</param>\n      <returns>\n        <para>The corresponding world space position.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.CameraEditorUtils.TryGetFrustum(UnityEngine.Camera,UnityEngine.Vector3[],UnityEngine.Vector3[],System.Single&amp;)\">\n      <summary>\n        <para>Calculate the frustrum corners.\n\nCorners are calculated in this order: left bottom, left top, right top, right bottom.</para>\n      </summary>\n      <param name=\"camera\">Camera to use.</param>\n      <param name=\"near\">The corners of the near plane. (A minimum size of 4 elements is required).</param>\n      <param name=\"far\">The corners of the far plane. (A minimum size of 4 elements is required).</param>\n      <param name=\"frustumAspect\">The aspect ratio of the frustrum.</param>\n      <returns>\n        <para>Whether the frustrum was calculated.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.CanEditMultipleObjects\">\n      <summary>\n        <para>Attribute used to make a custom editor support multi-object editing.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ClipAnimationInfoCurve\">\n      <summary>\n        <para>Stores a curve and its name that will be used to create additionnal curves during the import process.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ClipAnimationInfoCurve.curve\">\n      <summary>\n        <para>The animation curve.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ClipAnimationInfoCurve.name\">\n      <summary>\n        <para>The name of the animation curve.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ClipAnimationMaskType\">\n      <summary>\n        <para>AnimationClip mask options for ModelImporterClipAnimation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ClipAnimationMaskType.CopyFromOther\">\n      <summary>\n        <para>Use a mask from your project to specify which transforms animation should be imported.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ClipAnimationMaskType.CreateFromThisModel\">\n      <summary>\n        <para>A mask containing all the transform in the file will be created internally.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ClipAnimationMaskType.None\">\n      <summary>\n        <para>No Mask. All the animation will be imported.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.CloudProjectSettings\">\n      <summary>\n        <para>Use this class to retrieve information about the currently selected project and the current Unity ID that is logged in.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CloudProjectSettings.organizationId\">\n      <summary>\n        <para>The ID of the organization that this project belongs to. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CloudProjectSettings.organizationName\">\n      <summary>\n        <para>The name of the organization that this project belongs to. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CloudProjectSettings.projectId\">\n      <summary>\n        <para>A unique cloud project identifier. It is unique for every project (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CloudProjectSettings.projectName\">\n      <summary>\n        <para>The name of the project entry in the dashboard associated with this project (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CloudProjectSettings.userId\">\n      <summary>\n        <para>The user ID of the currently logged-in Unity ID account (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CloudProjectSettings.userName\">\n      <summary>\n        <para>The user name of the currently logged in Unity ID account (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ColorPickerHDRConfig\">\n      <summary>\n        <para>Used as input to ColorField to configure the HDR color ranges in the ColorPicker.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ColorPickerHDRConfig.maxBrightness\">\n      <summary>\n        <para>Maximum allowed color component value when using the ColorPicker.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ColorPickerHDRConfig.maxExposureValue\">\n      <summary>\n        <para>Maximum exposure value allowed in the Color Picker.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ColorPickerHDRConfig.minBrightness\">\n      <summary>\n        <para>Minimum allowed color component value when using the ColorPicker.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ColorPickerHDRConfig.minExposureValue\">\n      <summary>\n        <para>Minimum exposure value allowed in the Color Picker.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.ColorPickerHDRConfig.#ctor(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"minBrightness\">Minimum brightness value allowed when using the Color Picker.</param>\n      <param name=\"maxBrightness\">Maximum brightness value allowed when using the Color Picker.</param>\n      <param name=\"minExposureValue\">Minimum exposure value used in the tonemapping section of the Color Picker.</param>\n      <param name=\"maxExposureValue\">Maximum exposure value used in the tonemapping section of the Color Picker.</param>\n    </member>\n    <member name=\"T:UnityEditor.Compilation.AssembliesType\">\n      <summary>\n        <para>Flags for Assembly.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Compilation.AssembliesType.Editor\">\n      <summary>\n        <para>Selects assemblies compiled for the editor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Compilation.AssembliesType.Player\">\n      <summary>\n        <para>Selects assemblies compiled for the player.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Compilation.Assembly\">\n      <summary>\n        <para>Class that represents an assembly compiled by Unity.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.Assembly.allReferences\">\n      <summary>\n        <para>Returns Assembly.assemblyReferences and Assembly.compiledAssemblyReferences combined.\n\nThis returns all assemblies that are passed to the compiler when building this assembly,.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.Assembly.assemblyReferences\">\n      <summary>\n        <para>Assembly references used to build this assembly.\n\nThe references are also assemblies built as part of the Unity project.\n\nSee Also: Assembly.compiledAssemblyReferences and Assembly.allReferences.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.Assembly.compiledAssemblyReferences\">\n      <summary>\n        <para>Assembly references to pre-compiled assemblies that used to build this assembly.\n\nSee Also: Assembly.assemblyReferences and Assembly.allReferences.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.Assembly.compilerOptions\">\n      <summary>\n        <para>Compiler options used to compile the assembly.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.Assembly.defines\">\n      <summary>\n        <para>The defines used to compile this assembly.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.Assembly.flags\">\n      <summary>\n        <para>Flags for the assembly.\n\nSee Also: AssemblyFlags.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.Assembly.name\">\n      <summary>\n        <para>The name of the assembly.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.Assembly.outputPath\">\n      <summary>\n        <para>The full output file path of this assembly.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.Assembly.sourceFiles\">\n      <summary>\n        <para>All the souce files used to compile this assembly.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Compilation.Assembly.#ctor(System.String,System.String,System.String[],System.String[],UnityEditor.Compilation.Assembly[],System.String[],UnityEditor.Compilation.AssemblyFlags)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"name\">Assembly name.</param>\n      <param name=\"outputPath\">Assembly output.</param>\n      <param name=\"sourceFiles\">Assembliy source files.</param>\n      <param name=\"defines\">Assembly defines.</param>\n      <param name=\"assemblyReferences\">Assembly references.</param>\n      <param name=\"compiledAssemblyReferences\">Compiled assembly references.</param>\n      <param name=\"flags\">Assembly flags.</param>\n    </member>\n    <member name=\"T:UnityEditor.Compilation.AssemblyBuilder\">\n      <summary>\n        <para>Compiles scripts outside the Assets folder into a managed assembly that can be used inside the Assets folder.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.AssemblyBuilder.additionalDefines\">\n      <summary>\n        <para>Additional #define directives passed to compilation of the assembly.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.AssemblyBuilder.additionalReferences\">\n      <summary>\n        <para>Additional assembly references passed to compilation of the assembly.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.AssemblyBuilder.assemblyPath\">\n      <summary>\n        <para>Output path of the assembly to build. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.Compilation.AssemblyBuilder.buildFinished(System.Action`2&lt;System.String,UnityEditor.Compilation.CompilerMessage[]&gt;)\">\n      <summary>\n        <para>Event that is invoked on the main thread when the assembly build finishes.</para>\n      </summary>\n      <param name=\"value\">First parameter is the output assembly path. Second parameter are the compiler messages.</param>\n    </member>\n    <member name=\"?:UnityEditor.Compilation.AssemblyBuilder.buildStarted(System.Action`1&lt;System.String&gt;)\">\n      <summary>\n        <para>Event that is invoked on the main thread when the assembly build starts.</para>\n      </summary>\n      <param name=\"value\">Parameter is the output assembly path.</param>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.AssemblyBuilder.buildTarget\">\n      <summary>\n        <para>BuildTarget for the assembly build.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.AssemblyBuilder.buildTargetGroup\">\n      <summary>\n        <para>BuildTargetGroup for the assembly build.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.AssemblyBuilder.compilerOptions\">\n      <summary>\n        <para>Compiler options to use when building the assembly.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.AssemblyBuilder.defaultDefines\">\n      <summary>\n        <para>Default defines used when compiling the assembly.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.AssemblyBuilder.defaultReferences\">\n      <summary>\n        <para>Default references used when compiling the assembly.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.AssemblyBuilder.excludeReferences\">\n      <summary>\n        <para>References to exclude when compiling the assembly.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.AssemblyBuilder.flags\">\n      <summary>\n        <para>Flags to control the assembly build.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.AssemblyBuilder.scriptPaths\">\n      <summary>\n        <para>Array of script paths used as input for assembly build. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.AssemblyBuilder.status\">\n      <summary>\n        <para>Current status of assembly build. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Compilation.AssemblyBuilder.Build\">\n      <summary>\n        <para>Starts the build of the assembly.\n\nWhile building, the small progress icon in the lower right corner of Unity's main window will spin and EditorApplication.isCompiling will return true.</para>\n      </summary>\n      <returns>\n        <para>Returns true if build was started. Returns false if the build was not started due to the editor currently compiling scripts in the Assets folder.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Compilation.AssemblyBuilder.#ctor(System.String,System.String[])\">\n      <summary>\n        <para>AssemblyBuilder constructor.</para>\n      </summary>\n      <param name=\"assemblyPath\">Path of the output assembly. Relative to project root.</param>\n      <param name=\"scriptPaths\">Array of script paths to be compiled into the output assembly. Relative to project root.</param>\n    </member>\n    <member name=\"T:UnityEditor.Compilation.AssemblyBuilderFlags\">\n      <summary>\n        <para>Flags used by  AssemblyBuilder to control assembly build.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Compilation.AssemblyBuilderFlags.DevelopmentBuild\">\n      <summary>\n        <para>Defines whether the output assembly is an development build.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Compilation.AssemblyBuilderFlags.EditorAssembly\">\n      <summary>\n        <para>Defines whether the output assembly is an editor assembly.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Compilation.AssemblyBuilderFlags.None\">\n      <summary>\n        <para>None value. Default.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Compilation.AssemblyBuilderStatus\">\n      <summary>\n        <para>Status of the AssemblyBuilder build.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Compilation.AssemblyBuilderStatus.Finished\">\n      <summary>\n        <para>Indicates the AssemblyBuilder build has finished.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Compilation.AssemblyBuilderStatus.IsCompiling\">\n      <summary>\n        <para>Indicates the AssemblyBuilder build is compiling.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Compilation.AssemblyBuilderStatus.NotStarted\">\n      <summary>\n        <para>Indicates the AssemblyBuilder build has not been started.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Compilation.AssemblyDefinitionException\">\n      <summary>\n        <para>An exception throw for Assembly Definition Files errors.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.AssemblyDefinitionException.filePaths\">\n      <summary>\n        <para>File paths of the assembly definition files that caused the exception.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Compilation.AssemblyDefinitionException.#ctor(System.String,System.String[])\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"message\">Exception message.</param>\n      <param name=\"filePaths\">File paths for assembly definition files.</param>\n    </member>\n    <member name=\"T:UnityEditor.Compilation.AssemblyDefinitionPlatform\">\n      <summary>\n        <para>Contains information about a platform supported by the assembly definition files.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.AssemblyDefinitionPlatform.BuildTarget\">\n      <summary>\n        <para>BuildTarget for the AssemblyDefinitionPlatform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.AssemblyDefinitionPlatform.DisplayName\">\n      <summary>\n        <para>Display name for the platform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.AssemblyDefinitionPlatform.Name\">\n      <summary>\n        <para>Name used in assembly definition files.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Compilation.AssemblyFlags\">\n      <summary>\n        <para>Flags for Assembly.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Compilation.AssemblyFlags.EditorAssembly\">\n      <summary>\n        <para>Indicates whether this assembly is an editor only assembly.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Compilation.AssemblyFlags.None\">\n      <summary>\n        <para>None value. Default.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Compilation.CompilationPipeline\">\n      <summary>\n        <para>Methods and properties for script compilation pipeline.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.Compilation.CompilationPipeline.assemblyCompilationFinished(System.Action`2&lt;System.String,UnityEditor.Compilation.CompilerMessage[]&gt;)\">\n      <summary>\n        <para>An event that is invoked on the main thread when compilation of an assembly finishes.</para>\n      </summary>\n      <param name=\"value\">First parameter is the output assembly path. Second parameter are the compiler messages.</param>\n    </member>\n    <member name=\"?:UnityEditor.Compilation.CompilationPipeline.assemblyCompilationStarted(System.Action`1&lt;System.String&gt;)\">\n      <summary>\n        <para>Event that is invoked on the main thread when the assembly build starts.</para>\n      </summary>\n      <param name=\"value\">Parameter is the output assembly path.</param>\n    </member>\n    <member name=\"M:UnityEditor.Compilation.CompilationPipeline.GetAssemblies(UnityEditor.Compilation.AssembliesType)\">\n      <summary>\n        <para>Get all script assemblies compiled by Unity filtered by AssembliesType.</para>\n      </summary>\n      <param name=\"assembliesType\"></param>\n      <returns>\n        <para>Array of script assemblies compiled by Unity.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Compilation.CompilationPipeline.GetAssemblyDefinitionFilePathFromAssemblyName(System.String)\">\n      <summary>\n        <para>Returns the assembly definition file path from an assembly name. Returns null if there is no assembly definition file for the given assembly name.</para>\n      </summary>\n      <param name=\"assemblyName\">Assembly name.</param>\n      <returns>\n        <para>File path of assembly definition file.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Compilation.CompilationPipeline.GetAssemblyDefinitionFilePathFromScriptPath(System.String)\">\n      <summary>\n        <para>Returns the assembly definition file path for a source (script) path. Returns null if there is no assembly definition file for the given script path.</para>\n      </summary>\n      <param name=\"sourceFilePath\">Source (script) file path.</param>\n      <returns>\n        <para>File path of assembly definition file.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Compilation.CompilationPipeline.GetAssemblyDefinitionPlatforms\">\n      <summary>\n        <para>Returns all the platforms supported by assembly definition files.\n\nSee Also: AssemblyDefinitionPlatform.</para>\n      </summary>\n      <returns>\n        <para>Platforms supported by assembly definition files.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Compilation.CompilationPipeline.GetAssemblyNameFromScriptPath(System.String)\">\n      <summary>\n        <para>Returns the assembly name for a source (script) path. Returns null if there is no assembly name for the given script path.</para>\n      </summary>\n      <param name=\"sourceFilePath\">Source (script) path.</param>\n      <returns>\n        <para>Assembly name.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Compilation.CompilerMessage\">\n      <summary>\n        <para>Compiler Message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Compilation.CompilerMessage.column\">\n      <summary>\n        <para>Line column for the message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Compilation.CompilerMessage.file\">\n      <summary>\n        <para>File for the message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Compilation.CompilerMessage.line\">\n      <summary>\n        <para>File line for the message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Compilation.CompilerMessage.message\">\n      <summary>\n        <para>Compiler message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Compilation.CompilerMessage.type\">\n      <summary>\n        <para>Message type.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Compilation.CompilerMessageType\">\n      <summary>\n        <para>Compiler message type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Compilation.CompilerMessageType.Error\">\n      <summary>\n        <para>Error message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Compilation.CompilerMessageType.Warning\">\n      <summary>\n        <para>Warning message.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Compilation.ScriptCompilerOptions\">\n      <summary>\n        <para>Compiler options passed to the script compiler.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Compilation.ScriptCompilerOptions.AllowUnsafeCode\">\n      <summary>\n        <para>Allow 'unsafe' code when compiling scripts.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Compilation.ScriptCompilerOptions.#ctor\">\n      <summary>\n        <para>Creates ScriptCompilerOptions with default values used for script compilation.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.CrashReporting.CrashReportingSettings\">\n      <summary>\n        <para>Editor API for the Unity Services editor feature. Normally CrashReporting is enabled from the Services window, but if writing your own editor extension, this API can be used.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CrashReporting.CrashReportingSettings.captureEditorExceptions\">\n      <summary>\n        <para>This Boolean field will cause the CrashReporting feature in Unity to capture exceptions that occur in the editor while running in Play mode if true, or ignore those errors if false.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CrashReporting.CrashReportingSettings.enabled\">\n      <summary>\n        <para>This Boolean field will cause the CrashReporting feature in Unity to be enabled if true, or disabled if false.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.CustomEditor\">\n      <summary>\n        <para>Tells an Editor class which run-time type it's an editor for.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.CustomEditor.isFallback\">\n      <summary>\n        <para>If true, match this editor only if all non-fallback editors do not match. Defaults to false.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CustomEditor.#ctor(System.Type)\">\n      <summary>\n        <para>Defines which object type the custom editor class can edit.</para>\n      </summary>\n      <param name=\"inspectedType\">Type that this editor can edit.</param>\n      <param name=\"editorForChildClasses\">If true, child classes of inspectedType will also show this editor. Defaults to false.</param>\n    </member>\n    <member name=\"M:UnityEditor.CustomEditor.#ctor(System.Type,System.Boolean)\">\n      <summary>\n        <para>Defines which object type the custom editor class can edit.</para>\n      </summary>\n      <param name=\"inspectedType\">Type that this editor can edit.</param>\n      <param name=\"editorForChildClasses\">If true, child classes of inspectedType will also show this editor. Defaults to false.</param>\n    </member>\n    <member name=\"T:UnityEditor.CustomEditorForRenderPipelineAttribute\">\n      <summary>\n        <para>Tells an Editor class which run-time type it's an editor for when the given RenderPipeline is activated.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CustomEditorForRenderPipelineAttribute.#ctor(System.Type,System.Type)\">\n      <summary>\n        <para>Defines which object type the custom editor class can edit.</para>\n      </summary>\n      <param name=\"inspectedType\">Type that this editor can edit.</param>\n      <param name=\"renderPipeline\">Type of RenderPipelineAsset that that should be active for this inspector to be used.</param>\n      <param name=\"editorForChildClasses\">If true, child classes of inspectedType will also show this editor. Defaults to false.</param>\n    </member>\n    <member name=\"M:UnityEditor.CustomEditorForRenderPipelineAttribute.#ctor(System.Type,System.Type,System.Boolean)\">\n      <summary>\n        <para>Defines which object type the custom editor class can edit.</para>\n      </summary>\n      <param name=\"inspectedType\">Type that this editor can edit.</param>\n      <param name=\"renderPipeline\">Type of RenderPipelineAsset that that should be active for this inspector to be used.</param>\n      <param name=\"editorForChildClasses\">If true, child classes of inspectedType will also show this editor. Defaults to false.</param>\n    </member>\n    <member name=\"T:UnityEditor.CustomPreviewAttribute\">\n      <summary>\n        <para>Adds an extra preview in the Inspector for the specified type.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CustomPreviewAttribute.#ctor(System.Type)\">\n      <summary>\n        <para>Tells a DefaultPreview which class it's a preview for.</para>\n      </summary>\n      <param name=\"type\">The type you want to create a custom preview for.</param>\n    </member>\n    <member name=\"T:UnityEditor.CustomPropertyDrawer\">\n      <summary>\n        <para>Tells a custom PropertyDrawer or DecoratorDrawer which run-time Serializable class or PropertyAttribute it's a drawer for.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.CustomPropertyDrawer.#ctor(System.Type)\">\n      <summary>\n        <para>Tells a PropertyDrawer or DecoratorDrawer class which run-time class or attribute it's a drawer for.</para>\n      </summary>\n      <param name=\"type\">If the drawer is for a custom Serializable class, the type should be that class. If the drawer is for script variables with a specific PropertyAttribute, the type should be that attribute.</param>\n      <param name=\"useForChildren\">If true, the drawer will be used for any children of the specified class unless they define their own drawer.</param>\n    </member>\n    <member name=\"M:UnityEditor.CustomPropertyDrawer.#ctor(System.Type,System.Boolean)\">\n      <summary>\n        <para>Tells a PropertyDrawer or DecoratorDrawer class which run-time class or attribute it's a drawer for.</para>\n      </summary>\n      <param name=\"type\">If the drawer is for a custom Serializable class, the type should be that class. If the drawer is for script variables with a specific PropertyAttribute, the type should be that attribute.</param>\n      <param name=\"useForChildren\">If true, the drawer will be used for any children of the specified class unless they define their own drawer.</param>\n    </member>\n    <member name=\"T:UnityEditor.D3D11FullscreenMode\">\n      <summary>\n        <para>Direct3D 11 fullscreen mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.D3D11FullscreenMode.ExclusiveMode\">\n      <summary>\n        <para>Exclusive mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.D3D11FullscreenMode.FullscreenWindow\">\n      <summary>\n        <para>Fullscreen window.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.D3D9FullscreenMode\">\n      <summary>\n        <para>Direct3D 9 fullscreen mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.D3D9FullscreenMode.ExclusiveMode\">\n      <summary>\n        <para>Exclusive mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.D3D9FullscreenMode.FullscreenWindow\">\n      <summary>\n        <para>Fullscreen window.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.DDSImporter\">\n      <summary>\n        <para>Texture importer lets you modify Texture2D import settings for DDS textures from editor scripts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.DDSImporter.isReadable\">\n      <summary>\n        <para>Is texture data readable from scripts.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.DecoratorDrawer\">\n      <summary>\n        <para>Base class to derive custom decorator drawers from.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.DecoratorDrawer.attribute\">\n      <summary>\n        <para>The PropertyAttribute for the decorator. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.DecoratorDrawer.CanCacheInspectorGUI\">\n      <summary>\n        <para>Override this method to determine whether the inspector GUI for your decorator can be cached.</para>\n      </summary>\n      <returns>\n        <para>Whether the inspector GUI for your decorator can be cached.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.DecoratorDrawer.GetHeight\">\n      <summary>\n        <para>Override this method to specify how tall the GUI for this decorator is in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.DecoratorDrawer.OnGUI(UnityEngine.Rect)\">\n      <summary>\n        <para>Override this method to make your own GUI for the decorator.\nSee DecoratorDrawer for an example of how to use this.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the decorator GUI.</param>\n    </member>\n    <member name=\"T:UnityEditor.DefaultAsset\">\n      <summary>\n        <para>DefaultAsset is used for assets that do not have a specific type (yet).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.DragAndDrop\">\n      <summary>\n        <para>Editor drag &amp; drop operations.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.DragAndDrop.activeControlID\">\n      <summary>\n        <para>Get or set ID of currently active drag and drop control.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.DragAndDrop.objectReferences\">\n      <summary>\n        <para>References to Object|objects being dragged.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.DragAndDrop.paths\">\n      <summary>\n        <para>The file names being dragged.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.DragAndDrop.visualMode\">\n      <summary>\n        <para>The visual indication of the drag.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.DragAndDrop.AcceptDrag\">\n      <summary>\n        <para>Accept a drag operation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.DragAndDrop.GetGenericData(System.String)\">\n      <summary>\n        <para>Get data associated with current drag and drop operation.</para>\n      </summary>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEditor.DragAndDrop.PrepareStartDrag\">\n      <summary>\n        <para>Clears drag &amp; drop data.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.DragAndDrop.SetGenericData(System.String,System.Object)\">\n      <summary>\n        <para>Set data associated with current drag and drop operation.</para>\n      </summary>\n      <param name=\"type\"></param>\n      <param name=\"data\"></param>\n    </member>\n    <member name=\"M:UnityEditor.DragAndDrop.StartDrag(System.String)\">\n      <summary>\n        <para>Start a drag operation.</para>\n      </summary>\n      <param name=\"title\"></param>\n    </member>\n    <member name=\"T:UnityEditor.DragAndDropVisualMode\">\n      <summary>\n        <para>Visual indication mode for Drag &amp; Drop operation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DragAndDropVisualMode.Copy\">\n      <summary>\n        <para>Copy dragged objects.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DragAndDropVisualMode.Generic\">\n      <summary>\n        <para>Generic drag operation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DragAndDropVisualMode.Link\">\n      <summary>\n        <para>Link dragged objects to target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DragAndDropVisualMode.Move\">\n      <summary>\n        <para>Move dragged objects.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DragAndDropVisualMode.None\">\n      <summary>\n        <para>No indication (drag should not be performed).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DragAndDropVisualMode.Rejected\">\n      <summary>\n        <para>Rejected drag operation.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.DrawCameraMode\">\n      <summary>\n        <para>Drawing modes for Handles.DrawCamera.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.Albedo\">\n      <summary>\n        <para>Draw objects with the albedo component only. This value has been deprecated. Please use DrawCameraMode.RealtimeAlbedo.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.AlphaChannel\">\n      <summary>\n        <para>The camera is set to display the alpha channel of the rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.Baked\">\n      <summary>\n        <para>Draw objects with baked GI only. This value has been deprecated. Please use DrawCameraMode.BakedLightmap.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.BakedAlbedo\">\n      <summary>\n        <para>Draw objects with the baked albedo component only.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.BakedCharting\">\n      <summary>\n        <para>Draw objects with different colors for each baked chart (UV island).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.BakedDirectionality\">\n      <summary>\n        <para>Draw objects with the baked directionality component only.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.BakedEmissive\">\n      <summary>\n        <para>Draw objects with the baked emission component only.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.BakedIndices\">\n      <summary>\n        <para>Draw objects with baked indices only.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.BakedLightmap\">\n      <summary>\n        <para>Draw objects with the baked lightmap only.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.BakedTexelValidity\">\n      <summary>\n        <para>Draw objects with baked texel validity only.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.BakedUVOverlap\">\n      <summary>\n        <para>Draw objects with overlapping lightmap texels highlighted.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.Charting\">\n      <summary>\n        <para>Draw objects with different colors for each real-time chart (UV island).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.Clustering\">\n      <summary>\n        <para>Draw with different colors for each cluster.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.DeferredDiffuse\">\n      <summary>\n        <para>Draw diffuse color of Deferred Shading g-buffer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.DeferredNormal\">\n      <summary>\n        <para>Draw world space normal of Deferred Shading g-buffer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.DeferredSmoothness\">\n      <summary>\n        <para>Draw smoothness value of Deferred Shading g-buffer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.DeferredSpecular\">\n      <summary>\n        <para>Draw specular color of Deferred Shading g-buffer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.Directionality\">\n      <summary>\n        <para>Draw objects with directionality for real-time GI. This value has been deprecated. Please use DrawCameraMode.RealtimeDirectionality.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.Emissive\">\n      <summary>\n        <para>Draw objects with the emission component only. This value has been deprecated. Please use DrawCameraMode.RealtimeEmissive.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.Irradiance\">\n      <summary>\n        <para>Draw objects with real-time GI only. This value has been deprecated. Please use DrawCameraMode.RealtimeIndirect.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.LightOverlap\">\n      <summary>\n        <para>The camera is set to show in red static lights that fall back to 'static' because more than four light volumes are overlapping.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.LitClustering\">\n      <summary>\n        <para>Draw lit clusters.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.Mipmaps\">\n      <summary>\n        <para>The camera is set to display the texture resolution, with a red tint indicating resolution that is too high, and a blue tint indicating texture sizes that could be higher.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.Normal\">\n      <summary>\n        <para>Draw the camera like it would be drawn in-game. This uses the clear flags of the camera.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.Overdraw\">\n      <summary>\n        <para>The camera is set to display Scene overdraw, with brighter colors indicating more overdraw.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.RealtimeAlbedo\">\n      <summary>\n        <para>Draw objects with the real-time GI albedo component only.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.RealtimeCharting\">\n      <summary>\n        <para>Draw objects with different colors for each real-time chart (UV island).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.RealtimeDirectionality\">\n      <summary>\n        <para>Draw objects with the real-time GI directionality component only.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.RealtimeEmissive\">\n      <summary>\n        <para>Draw objects with the real-time GI emission component only.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.RealtimeIndirect\">\n      <summary>\n        <para>Draw objects with the real-time GI indirect light only.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.RenderPaths\">\n      <summary>\n        <para>The camera is set to draw color coded render paths.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.ShadowCascades\">\n      <summary>\n        <para>The camera is set to draw directional light shadow map cascades.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.ShadowMasks\">\n      <summary>\n        <para>The camera is set to display colored ShadowMasks, coloring light gizmo with the same color.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.SpriteMask\">\n      <summary>\n        <para>The camera is set to display SpriteMask and SpriteRenderer with SpriteRenderer.maskInteraction set.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.Systems\">\n      <summary>\n        <para>Draw objects with different color for each GI system.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.Textured\">\n      <summary>\n        <para>Draw the camera textured with selection wireframe and no background clearing.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.TexturedWire\">\n      <summary>\n        <para>Draw the camera where all objects have a wireframe overlay. and no background clearing.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.TextureStreaming\">\n      <summary>\n        <para>The camera is set to run in texture streaming debug mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.UserDefined\">\n      <summary>\n        <para>A custom mode defined by the user.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.ValidateAlbedo\">\n      <summary>\n        <para>The camera is set to draw a physically based, albedo validated rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.ValidateMetalSpecular\">\n      <summary>\n        <para>The camera is set to draw a physically based, metal or specular validated rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.DrawCameraMode.Wireframe\">\n      <summary>\n        <para>Draw the camera in wireframe and no background clearing.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.DrawGizmo\">\n      <summary>\n        <para>The DrawGizmo attribute allows you to supply a gizmo renderer for any Component.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.DrawGizmo.#ctor(UnityEditor.GizmoType)\">\n      <summary>\n        <para>Defines when the gizmo should be invoked for drawing.</para>\n      </summary>\n      <param name=\"gizmo\">Flags to denote when the gizmo should be drawn.</param>\n    </member>\n    <member name=\"M:UnityEditor.DrawGizmo.#ctor(UnityEditor.GizmoType,System.Type)\">\n      <summary>\n        <para>Same as above. drawnGizmoType determines of what type the object we are drawing the gizmo of has to be.</para>\n      </summary>\n      <param name=\"gizmo\">Flags to denote when the gizmo should be drawn.</param>\n      <param name=\"drawnGizmoType\">Type of object for which the gizmo should be drawn.</param>\n    </member>\n    <member name=\"T:UnityEditor.Editor\">\n      <summary>\n        <para>Base class to derive custom Editors from. Use this to create your own custom inspectors and editors for your objects.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.Editor.finishedDefaultHeaderGUI(System.Action`1&lt;UnityEditor.Editor&gt;)\">\n      <summary>\n        <para>An event raised while drawing the header of the Inspector window, after the default header items have been drawn.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEditor.Editor.serializedObject\">\n      <summary>\n        <para>A SerializedObject representing the object or objects being inspected.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Editor.target\">\n      <summary>\n        <para>The object being inspected.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Editor.targets\">\n      <summary>\n        <para>An array of all the object being inspected.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Editor.CreateCachedEditor(UnityEngine.Object,System.Type,UnityEditor.Editor&amp;)\">\n      <summary>\n        <para>On return previousEditor is an editor for targetObject or targetObjects. The function either returns if the editor is already tracking the objects, or Destroys the previous editor and creates a new one.</para>\n      </summary>\n      <param name=\"obj\">The object the editor is tracking.</param>\n      <param name=\"editorType\">The requested editor type. null for the default editor for the object.</param>\n      <param name=\"previousEditor\">The previous editor for the object. Once CreateCachedEditor returns previousEditor is an editor for the targetObject or targetObjects.</param>\n      <param name=\"objects\">The objects the editor is tracking.</param>\n      <param name=\"targetObject\"></param>\n      <param name=\"targetObjects\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Editor.CreateCachedEditor(UnityEngine.Object[],System.Type,UnityEditor.Editor&amp;)\">\n      <summary>\n        <para>On return previousEditor is an editor for targetObject or targetObjects. The function either returns if the editor is already tracking the objects, or Destroys the previous editor and creates a new one.</para>\n      </summary>\n      <param name=\"obj\">The object the editor is tracking.</param>\n      <param name=\"editorType\">The requested editor type. null for the default editor for the object.</param>\n      <param name=\"previousEditor\">The previous editor for the object. Once CreateCachedEditor returns previousEditor is an editor for the targetObject or targetObjects.</param>\n      <param name=\"objects\">The objects the editor is tracking.</param>\n      <param name=\"targetObject\"></param>\n      <param name=\"targetObjects\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Editor.CreateCachedEditorWithContext(UnityEngine.Object,UnityEngine.Object,System.Type,UnityEditor.Editor&amp;)\">\n      <summary>\n        <para>Creates a cached editor using a context object.</para>\n      </summary>\n      <param name=\"targetObject\"></param>\n      <param name=\"context\"></param>\n      <param name=\"editorType\"></param>\n      <param name=\"previousEditor\"></param>\n      <param name=\"targetObjects\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Editor.CreateCachedEditorWithContext(UnityEngine.Object[],UnityEngine.Object,System.Type,UnityEditor.Editor&amp;)\">\n      <summary>\n        <para>Creates a cached editor using a context object.</para>\n      </summary>\n      <param name=\"targetObject\"></param>\n      <param name=\"context\"></param>\n      <param name=\"editorType\"></param>\n      <param name=\"previousEditor\"></param>\n      <param name=\"targetObjects\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Editor.CreateEditor(UnityEngine.Object)\">\n      <summary>\n        <para>Make a custom editor for targetObject or targetObjects.</para>\n      </summary>\n      <param name=\"objects\">All objects must be of same exact type.</param>\n      <param name=\"targetObject\"></param>\n      <param name=\"editorType\"></param>\n      <param name=\"targetObjects\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Editor.CreateEditor(UnityEngine.Object,System.Type)\">\n      <summary>\n        <para>Make a custom editor for targetObject or targetObjects.</para>\n      </summary>\n      <param name=\"objects\">All objects must be of same exact type.</param>\n      <param name=\"targetObject\"></param>\n      <param name=\"editorType\"></param>\n      <param name=\"targetObjects\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Editor.CreateEditor(UnityEngine.Object[])\">\n      <summary>\n        <para>Make a custom editor for targetObject or targetObjects.</para>\n      </summary>\n      <param name=\"objects\">All objects must be of same exact type.</param>\n      <param name=\"targetObject\"></param>\n      <param name=\"editorType\"></param>\n      <param name=\"targetObjects\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Editor.CreateEditor(UnityEngine.Object[],System.Type)\">\n      <summary>\n        <para>Make a custom editor for targetObject or targetObjects.</para>\n      </summary>\n      <param name=\"objects\">All objects must be of same exact type.</param>\n      <param name=\"targetObject\"></param>\n      <param name=\"editorType\"></param>\n      <param name=\"targetObjects\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Editor.CreateEditorWithContext(UnityEngine.Object[],UnityEngine.Object,System.Type)\">\n      <summary>\n        <para>Make a custom editor for targetObject or targetObjects with a context object.</para>\n      </summary>\n      <param name=\"targetObjects\"></param>\n      <param name=\"context\"></param>\n      <param name=\"editorType\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Editor.DrawDefaultInspector\">\n      <summary>\n        <para>Draw the built-in inspector.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Editor.DrawHeader\">\n      <summary>\n        <para>Call this function to draw the header of the editor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Editor.DrawPreview(UnityEngine.Rect)\">\n      <summary>\n        <para>The first entry point for Preview Drawing.</para>\n      </summary>\n      <param name=\"previewPosition\">The available area to draw the preview.</param>\n      <param name=\"previewArea\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Editor.GetInfoString\">\n      <summary>\n        <para>Implement this method to show asset information on top of the asset preview.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Editor.GetPreviewTitle\">\n      <summary>\n        <para>Override this method if you want to change the label of the Preview area.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Editor.HasPreviewGUI\">\n      <summary>\n        <para>Override this method in subclasses if you implement OnPreviewGUI.</para>\n      </summary>\n      <returns>\n        <para>True if this component can be Previewed in its current state.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Editor.OnInspectorGUI\">\n      <summary>\n        <para>Implement this function to make a custom inspector.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Editor.OnInteractivePreviewGUI(UnityEngine.Rect,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Implement to create your own interactive custom preview. Interactive custom previews are used in the preview area of the inspector and the object selector.</para>\n      </summary>\n      <param name=\"r\">Rectangle in which to draw the preview.</param>\n      <param name=\"background\">Background image.</param>\n    </member>\n    <member name=\"M:UnityEditor.Editor.OnPreviewGUI(UnityEngine.Rect,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Implement to create your own custom preview for the preview area of the inspector, primary editor headers and the object selector.</para>\n      </summary>\n      <param name=\"r\">Rectangle in which to draw the preview.</param>\n      <param name=\"background\">Background image.</param>\n    </member>\n    <member name=\"M:UnityEditor.Editor.OnPreviewSettings\">\n      <summary>\n        <para>Override this method if you want to show custom controls in the preview header.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Editor.RenderStaticPreview(System.String,UnityEngine.Object[],System.Int32,System.Int32)\">\n      <summary>\n        <para>Override this method if you want to render a static preview that shows.</para>\n      </summary>\n      <param name=\"assetPath\"></param>\n      <param name=\"subAssets\"></param>\n      <param name=\"width\"></param>\n      <param name=\"height\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Editor.Repaint\">\n      <summary>\n        <para>Repaint any inspectors that shows this editor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Editor.RequiresConstantRepaint\">\n      <summary>\n        <para>Does this edit require to be repainted constantly in its current state?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Editor.ShouldHideOpenButton\">\n      <summary>\n        <para>Returns the visibility setting of the \"open\" button in the Inspector.</para>\n      </summary>\n      <returns>\n        <para>Return true if the button should be hidden.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Editor.UseDefaultMargins\">\n      <summary>\n        <para>Override this method in subclasses to return false if you don't want default margins.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.EditorAnalytics\">\n      <summary>\n        <para>Editor API for the EditorAnalytics feature.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorAnalytics.enabled\">\n      <summary>\n        <para>Returns true when EditorAnalytics is enabled.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorAnalytics.RegisterEventWithLimit(System.String,System.Int32,System.Int32,System.String)\">\n      <summary>\n        <para>This API is used for registering an Editor Analytics event. It is meant for internal use only and is likely to change in the future. User code should never use this API.</para>\n      </summary>\n      <param name=\"eventName\">Name of the event.</param>\n      <param name=\"ver\">Event version number.</param>\n      <param name=\"maxEventPerHour\">Hourly limit for this event name.</param>\n      <param name=\"maxItems\">Maximum number of items in this event.</param>\n      <param name=\"vendorKey\">Vendor key name.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorAnalytics.RegisterEventWithLimit(System.String,System.Int32,System.Int32,System.String,System.Int32)\">\n      <summary>\n        <para>This API is used for registering an Editor Analytics event. It is meant for internal use only and is likely to change in the future. User code should never use this API.</para>\n      </summary>\n      <param name=\"eventName\">Name of the event.</param>\n      <param name=\"ver\">Event version number.</param>\n      <param name=\"maxEventPerHour\">Hourly limit for this event name.</param>\n      <param name=\"maxItems\">Maximum number of items in this event.</param>\n      <param name=\"vendorKey\">Vendor key name.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorAnalytics.SendEventWithLimit(System.String,System.Object)\">\n      <summary>\n        <para>This API is used to send an Editor Analytics event. It is meant for internal use only and is likely to change in the future. User code should never use this API.</para>\n      </summary>\n      <param name=\"eventName\">Name of the event.</param>\n      <param name=\"parameters\">Additional event data.</param>\n      <param name=\"ver\">Event version number.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorAnalytics.SendEventWithLimit(System.String,System.Object,System.Int32)\">\n      <summary>\n        <para>This API is used to send an Editor Analytics event. It is meant for internal use only and is likely to change in the future. User code should never use this API.</para>\n      </summary>\n      <param name=\"eventName\">Name of the event.</param>\n      <param name=\"parameters\">Additional event data.</param>\n      <param name=\"ver\">Event version number.</param>\n    </member>\n    <member name=\"T:UnityEditor.EditorAnalyticsSessionInfo\">\n      <summary>\n        <para>Accesses for EditorAnalytics session information.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorAnalyticsSessionInfo.activeElapsedTime\">\n      <summary>\n        <para>Returns total time there was user iteraction in the Editor since the beginning of a session.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorAnalyticsSessionInfo.elapsedTime\">\n      <summary>\n        <para>Returns session time since startup of the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorAnalyticsSessionInfo.focusedElapsedTime\">\n      <summary>\n        <para>Returns total time the Editor was in focus since the beginning of a session.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorAnalyticsSessionInfo.id\">\n      <summary>\n        <para>Returns session id used for tracking the Editor session.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorAnalyticsSessionInfo.playbackElapsedTime\">\n      <summary>\n        <para>Returns total time the Editor was in playmode since the beginning of a session.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorAnalyticsSessionInfo.userId\">\n      <summary>\n        <para>The userId is random GUID and is persisted across Editor session.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.EditorApplication\">\n      <summary>\n        <para>Main Application class.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorApplication.applicationContentsPath\">\n      <summary>\n        <para>Path to the Unity editor contents folder. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorApplication.applicationPath\">\n      <summary>\n        <para>Returns the path to the Unity editor application. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.EditorApplication.contextualPropertyMenu\">\n      <summary>\n        <para>Callback raised whenever the user contex-clicks on a property in an Inspector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorApplication.currentScene\">\n      <summary>\n        <para>The path of the scene that the user has currently open (Will be an empty string if no scene is currently open). (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.EditorApplication.delayCall\">\n      <summary>\n        <para>Delegate which is called once after all inspectors update.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.EditorApplication.hierarchyChanged(System.Action)\">\n      <summary>\n        <para>Event that is raised when an object or group of objects in the hierarchy changes.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"F:UnityEditor.EditorApplication.hierarchyWindowChanged\">\n      <summary>\n        <para>A callback to be raised when an object in the hierarchy changes.\n\nEach time an object is (or a group of objects are) created, renamed, parented, unparented or destroyed this callback is raised.\n</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.EditorApplication.hierarchyWindowItemOnGUI\">\n      <summary>\n        <para>Delegate for OnGUI events for every visible list item in the HierarchyWindow.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorApplication.isCompiling\">\n      <summary>\n        <para>Is editor currently compiling scripts? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorApplication.isPaused\">\n      <summary>\n        <para>Is editor currently paused?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorApplication.isPlaying\">\n      <summary>\n        <para>Is editor currently in play mode?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode\">\n      <summary>\n        <para>Is editor either currently in play mode, or about to switch to it? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorApplication.isRemoteConnected\">\n      <summary>\n        <para>Is editor currently connected to Unity Remote 4 client app.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorApplication.isSceneDirty\">\n      <summary>\n        <para>Is true if the currently open scene in the editor contains unsaved modifications.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorApplication.isTemporaryProject\">\n      <summary>\n        <para>Returns true if the current project was created as a temporary project.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorApplication.isUpdating\">\n      <summary>\n        <para>True if the Editor is currently refreshing the AssetDatabase.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.EditorApplication.modifierKeysChanged\">\n      <summary>\n        <para>Delegate for changed keyboard modifier keys.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.EditorApplication.pauseStateChanged(System.Action`1&lt;UnityEditor.PauseState&gt;)\">\n      <summary>\n        <para>Event that is raised whenever the Editor's pause state changes.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEditor.EditorApplication.playModeStateChanged(System.Action`1&lt;UnityEditor.PlayModeStateChange&gt;)\">\n      <summary>\n        <para>Event that is raised whenever the Editor's play mode state changes.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEditor.EditorApplication.projectChanged(System.Action)\">\n      <summary>\n        <para>Event that is raised whenever the state of the project changes.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"F:UnityEditor.EditorApplication.projectWindowChanged\">\n      <summary>\n        <para>Callback raised whenever the state of the Project window changes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.EditorApplication.projectWindowItemOnGUI\">\n      <summary>\n        <para>Delegate for OnGUI events for every visible list item in the ProjectWindow.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.EditorApplication.quitting(System.Action)\">\n      <summary>\n        <para>Unity raises this event when the editor application is quitting.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEditor.EditorApplication.scriptingRuntimeVersion\">\n      <summary>\n        <para>Returns the scripting runtime version currently used by the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.EditorApplication.searchChanged\">\n      <summary>\n        <para>Callback raised whenever the contents of a window's search box are changed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorApplication.timeSinceStartup\">\n      <summary>\n        <para>The time since the editor was started. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.EditorApplication.update\">\n      <summary>\n        <para>Delegate for generic updates.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.EditorApplication.wantsToQuit(System.Func`1&lt;System.Boolean&gt;)\">\n      <summary>\n        <para>Unity raises this event when the editor application wants to quit.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.Beep\">\n      <summary>\n        <para>Plays system beep sound.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.EditorApplication.CallbackFunction\">\n      <summary>\n        <para>Delegate to be called from EditorApplication callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.DirtyHierarchyWindowSorting\">\n      <summary>\n        <para>Set the hierarchy sorting method as dirty.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.ExecuteMenuItem(System.String)\">\n      <summary>\n        <para>Invokes the menu item in the specified path.</para>\n      </summary>\n      <param name=\"menuItemPath\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.Exit(System.Int32)\">\n      <summary>\n        <para>Exit the Unity editor application.</para>\n      </summary>\n      <param name=\"returnValue\"></param>\n    </member>\n    <member name=\"T:UnityEditor.EditorApplication.HierarchyWindowItemCallback\">\n      <summary>\n        <para>Delegate to be called for every visible list item in the HierarchyWindow on every OnGUI event.</para>\n      </summary>\n      <param name=\"instanceID\"></param>\n      <param name=\"selectionRect\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.LoadLevelAdditiveAsyncInPlayMode(System.String)\">\n      <summary>\n        <para>Load the given level additively in play mode asynchronously</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.LoadLevelAdditiveInPlayMode(System.String)\">\n      <summary>\n        <para>Load the given level additively in play mode.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.LoadLevelAsyncInPlayMode(System.String)\">\n      <summary>\n        <para>Load the given level in play mode asynchronously.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.LoadLevelInPlayMode(System.String)\">\n      <summary>\n        <para>Load the given level in play mode.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.LockReloadAssemblies\">\n      <summary>\n        <para>Prevents loading of assemblies when it is inconvenient.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.MarkSceneDirty\">\n      <summary>\n        <para>Explicitly mark the current opened scene as modified.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.NewEmptyScene\">\n      <summary>\n        <para>Create a new absolutely empty scene.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.NewScene\">\n      <summary>\n        <para>Create a new scene.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.OpenProject(System.String,System.String[])\">\n      <summary>\n        <para>Open another project.</para>\n      </summary>\n      <param name=\"projectPath\">The path of a project to open.</param>\n      <param name=\"args\">Arguments to pass to command line.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.OpenScene(System.String)\">\n      <summary>\n        <para>Opens the scene at path.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.OpenSceneAdditive(System.String)\">\n      <summary>\n        <para>Opens the scene at path additively.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"T:UnityEditor.EditorApplication.ProjectWindowItemCallback\">\n      <summary>\n        <para>Delegate to be called for every visible list item in the ProjectWindow on every OnGUI event.</para>\n      </summary>\n      <param name=\"guid\"></param>\n      <param name=\"selectionRect\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.QueuePlayerLoopUpdate\">\n      <summary>\n        <para>Normally, a player loop update will occur in the editor when the scene has been modified. This method allows you to queue a player loop update regardless of whether the scene has been modified.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.RepaintHierarchyWindow\">\n      <summary>\n        <para>Can be used to ensure repaint of the HierarchyWindow.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.RepaintProjectWindow\">\n      <summary>\n        <para>Can be used to ensure repaint of the ProjectWindow.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.SaveAssets\">\n      <summary>\n        <para>Saves all serializable assets that have not yet been written to disk (eg. Materials).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.SaveCurrentSceneIfUserWantsTo\">\n      <summary>\n        <para>Ask the user if they want to save the open scene.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.SaveScene\">\n      <summary>\n        <para>Save the open scene.</para>\n      </summary>\n      <param name=\"path\">The file path to save at. If empty, the current open scene will be overwritten, or if never saved before, a save dialog is shown.</param>\n      <param name=\"saveAsCopy\">If set to true, the scene will be saved without changing the currentScene and without clearing the unsaved changes marker.</param>\n      <returns>\n        <para>True if the save succeeded, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.SaveScene(System.String)\">\n      <summary>\n        <para>Save the open scene.</para>\n      </summary>\n      <param name=\"path\">The file path to save at. If empty, the current open scene will be overwritten, or if never saved before, a save dialog is shown.</param>\n      <param name=\"saveAsCopy\">If set to true, the scene will be saved without changing the currentScene and without clearing the unsaved changes marker.</param>\n      <returns>\n        <para>True if the save succeeded, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.SaveScene(System.String,System.Boolean)\">\n      <summary>\n        <para>Save the open scene.</para>\n      </summary>\n      <param name=\"path\">The file path to save at. If empty, the current open scene will be overwritten, or if never saved before, a save dialog is shown.</param>\n      <param name=\"saveAsCopy\">If set to true, the scene will be saved without changing the currentScene and without clearing the unsaved changes marker.</param>\n      <returns>\n        <para>True if the save succeeded, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.EditorApplication.SerializedPropertyCallbackFunction\">\n      <summary>\n        <para>Delegate to be called from EditorApplication contextual inspector callbacks.</para>\n      </summary>\n      <param name=\"menu\">The contextual menu which is about to be shown to the user.</param>\n      <param name=\"property\">The property for which the contextual menu is shown.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.SetTemporaryProjectKeepPath(System.String)\">\n      <summary>\n        <para>Sets the path that Unity should store the current temporary project at, when the project is closed.</para>\n      </summary>\n      <param name=\"path\">The path that the current temporary project should be relocated to when closing it.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.Step\">\n      <summary>\n        <para>Perform a single frame step.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorApplication.UnlockReloadAssemblies\">\n      <summary>\n        <para>Must be called after LockReloadAssemblies, to reenable loading of assemblies.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.EditorBuildSettings\">\n      <summary>\n        <para>This class allows you to modify the Editor for an example of how to use this class.\n\nSee Also: EditorBuildSettingsScene, EditorBuildSettings.scenes.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.EditorBuildSettings.sceneListChanged(System.Action)\">\n      <summary>\n        <para>A delegate called whenever EditorBuildSettings.scenes is set.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEditor.EditorBuildSettings.scenes\">\n      <summary>\n        <para>The list of Scenes that should be included in the build.\nThis is the same list of Scenes that is shown in the window. You can modify this list to set up which Scenes should be included in the build.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorBuildSettings.AddConfigObject(System.String,UnityEngine.Object,System.Boolean)\">\n      <summary>\n        <para>Store a reference to a config object by name.  The object must be an asset in the project, otherwise it will not be saved when the editor is restarted or scripts are reloaded.  To avoid name conflicts with other packages, it is recommended that names are qualified by a namespace, i.e. \"company.package.name\".</para>\n      </summary>\n      <param name=\"name\">The name of the object reference in string format. This string name must be unique within your project or the overwrite parameter must be set to true.</param>\n      <param name=\"obj\">Object reference to be stored.  This object must be persisted and not null.</param>\n      <param name=\"overwrite\">Boolean parameter used to specify that you want to overwrite an entry with the same name if one already exists.</param>\n      <returns>\n        <para>Throws an exception if the object is null, not persisted, or if there is a name conflict and the overwrite parameter is set to false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorBuildSettings.GetConfigObjectNames\">\n      <summary>\n        <para>Return a string array containing the names of all stored config object references.</para>\n      </summary>\n      <returns>\n        <para>Returns an array of strings containing the names of all stored references.  If there are no references, an empty array will be returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorBuildSettings.RemoveConfigObject(System.String)\">\n      <summary>\n        <para>Remove a config object reference by name.</para>\n      </summary>\n      <param name=\"name\">The name in string format of the config object reference to be removed. This is the name given to the object when the reference is first created. Note: This may be different than the object name as an object can be added multiple times with different names.</param>\n      <returns>\n        <para>Returns true if the reference was found and removed, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorBuildSettings.TryGetConfigObject(System.String,T&amp;)\">\n      <summary>\n        <para>Retrieve a config object reference by name.</para>\n      </summary>\n      <param name=\"name\">The name in string format of the config object reference to be fetched.</param>\n      <param name=\"result\">The config object reference where the returned object will be stored. This must be an object of type Object.</param>\n      <returns>\n        <para>Returns true if the config object reference was found and the type matched the result parameter.  Returns false if the entry is not found, the config object reference is null, or if the type requested does not match the type stored.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.EditorBuildSettingsScene\">\n      <summary>\n        <para>This class is used for entries in the Scenes list, as displayed in the window. This class contains the scene path of a scene and an enabled flag that indicates wether the scene is enabled in the BuildSettings window or not.\n\nYou can use this class in combination with EditorBuildSettings.scenes to populate the list of Scenes included in the build via script. This is useful when creating custom editor scripts to automate your build pipeline.\n\nSee EditorBuildSettings.scenes for an example script.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorBuildSettingsScene.enabled\">\n      <summary>\n        <para>Whether this scene is enabled in the for an example of how to use this class.\n\nSee Also: EditorBuildSettingsScene, EditorBuildSettings.scenes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorBuildSettingsScene.path\">\n      <summary>\n        <para>The file path of the scene as listed in the Editor for an example of how to use this class.\n\nSee Also: EditorBuildSettingsScene, EditorBuildSettings.scenes.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.EditorCurveBinding\">\n      <summary>\n        <para>Defines how a curve is attached to an object that it controls.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.EditorCurveBinding.path\">\n      <summary>\n        <para>The transform path of the object that is animated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.EditorCurveBinding.propertyName\">\n      <summary>\n        <para>The name of the property to be animated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorCurveBinding.type\">\n      <summary>\n        <para>The type of the property to be animated.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorCurveBinding.DiscreteCurve(System.String,System.Type,System.String)\">\n      <summary>\n        <para>Creates a preconfigured binding for a curve where values should not be interpolated.</para>\n      </summary>\n      <param name=\"inPath\">The transform path to the object to animate.</param>\n      <param name=\"inType\">The type of the object to animate.</param>\n      <param name=\"inPropertyName\">The name of the property to animate on the object.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorCurveBinding.FloatCurve(System.String,System.Type,System.String)\">\n      <summary>\n        <para>Creates a preconfigured binding for a float curve.</para>\n      </summary>\n      <param name=\"inPath\">The transform path to the object to animate.</param>\n      <param name=\"inType\">The type of the object to animate.</param>\n      <param name=\"inPropertyName\">The name of the property to animate on the object.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorCurveBinding.PPtrCurve(System.String,System.Type,System.String)\">\n      <summary>\n        <para>Creates a preconfigured binding for a curve that points to an Object.</para>\n      </summary>\n      <param name=\"inPath\">The transform path to the object to animate.</param>\n      <param name=\"inType\">The type of the object to animate.</param>\n      <param name=\"inPropertyName\">The name of the property to animate on the object.</param>\n    </member>\n    <member name=\"T:UnityEditor.EditorGUI\">\n      <summary>\n        <para>These work pretty much like the normal GUI functions - and also have matching implementations in EditorGUILayout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUI.actionKey\">\n      <summary>\n        <para>Is the platform-dependent \"action\" modifier key held down? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUI.indentLevel\">\n      <summary>\n        <para>The indent level of the field labels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUI.showMixedValue\">\n      <summary>\n        <para>Makes the following controls give the appearance of editing multiple different values.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.BeginChangeCheck\">\n      <summary>\n        <para>Check if any control was changed inside a block of code.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.BeginDisabledGroup(System.Boolean)\">\n      <summary>\n        <para>Create a group of controls that can be disabled.</para>\n      </summary>\n      <param name=\"disabled\">Boolean specifying if the controls inside the group should be disabled.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.BeginProperty(UnityEngine.Rect,UnityEngine.GUIContent,UnityEditor.SerializedProperty)\">\n      <summary>\n        <para>Create a Property wrapper, useful for making regular GUI controls work with SerializedProperty.</para>\n      </summary>\n      <param name=\"totalPosition\">Rectangle on the screen to use for the control, including label if applicable.</param>\n      <param name=\"label\">Optional label in front of the slider. Use null to use the name from the SerializedProperty. Use GUIContent.none to not display a label.</param>\n      <param name=\"property\">The SerializedProperty to use for the control.</param>\n      <returns>\n        <para>The actual label to use for the control.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.BoundsField(UnityEngine.Rect,UnityEngine.Bounds)\">\n      <summary>\n        <para>Make Center &amp; Extents field for entering a Bounds.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.BoundsField(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.Bounds)\">\n      <summary>\n        <para>Make Center &amp; Extents field for entering a Bounds.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.BoundsIntField(UnityEngine.Rect,UnityEngine.BoundsInt)\">\n      <summary>\n        <para>Make Position &amp; Size field for entering a BoundsInt.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.BoundsIntField(UnityEngine.Rect,System.String,UnityEngine.BoundsInt)\">\n      <summary>\n        <para>Make Position &amp; Size field for entering a BoundsInt.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.BoundsIntField(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.BoundsInt)\">\n      <summary>\n        <para>Make Position &amp; Size field for entering a BoundsInt.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.CanCacheInspectorGUI(UnityEditor.SerializedProperty)\">\n      <summary>\n        <para>Get whether a SerializedProperty's inspector GUI can be cached.</para>\n      </summary>\n      <param name=\"property\">The SerializedProperty in question.</param>\n      <returns>\n        <para>Whether the property's inspector GUI can be cached.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.EditorGUI.ChangeCheckScope\">\n      <summary>\n        <para>Check if any control was changed inside a block of code.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUI.ChangeCheckScope.changed\">\n      <summary>\n        <para>True if GUI.changed was set to true, otherwise false.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ChangeCheckScope.#ctor\">\n      <summary>\n        <para>Begins a ChangeCheckScope.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ColorField(UnityEngine.Rect,UnityEngine.Color)\">\n      <summary>\n        <para>Make a field for selecting a Color.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The color to edit.</param>\n      <param name=\"showEyedropper\">If true, the color picker should show the eyedropper control. If false, don't show it.</param>\n      <param name=\"showAlpha\">If true, allow the user to set an alpha value for the color. If false, hide the alpha component.</param>\n      <param name=\"hdr\">If true, treat the color as an HDR value. If false, treat it as a standard LDR value.</param>\n      <param name=\"hdrConfig\"></param>\n      <returns>\n        <para>The color selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ColorField(UnityEngine.Rect,System.String,UnityEngine.Color)\">\n      <summary>\n        <para>Make a field for selecting a Color.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The color to edit.</param>\n      <param name=\"showEyedropper\">If true, the color picker should show the eyedropper control. If false, don't show it.</param>\n      <param name=\"showAlpha\">If true, allow the user to set an alpha value for the color. If false, hide the alpha component.</param>\n      <param name=\"hdr\">If true, treat the color as an HDR value. If false, treat it as a standard LDR value.</param>\n      <param name=\"hdrConfig\"></param>\n      <returns>\n        <para>The color selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ColorField(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.Color)\">\n      <summary>\n        <para>Make a field for selecting a Color.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The color to edit.</param>\n      <param name=\"showEyedropper\">If true, the color picker should show the eyedropper control. If false, don't show it.</param>\n      <param name=\"showAlpha\">If true, allow the user to set an alpha value for the color. If false, hide the alpha component.</param>\n      <param name=\"hdr\">If true, treat the color as an HDR value. If false, treat it as a standard LDR value.</param>\n      <param name=\"hdrConfig\"></param>\n      <returns>\n        <para>The color selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ColorField(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.Color,System.Boolean,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Make a field for selecting a Color.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The color to edit.</param>\n      <param name=\"showEyedropper\">If true, the color picker should show the eyedropper control. If false, don't show it.</param>\n      <param name=\"showAlpha\">If true, allow the user to set an alpha value for the color. If false, hide the alpha component.</param>\n      <param name=\"hdr\">If true, treat the color as an HDR value. If false, treat it as a standard LDR value.</param>\n      <param name=\"hdrConfig\"></param>\n      <returns>\n        <para>The color selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ColorField(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.Color,System.Boolean,System.Boolean,System.Boolean,UnityEditor.ColorPickerHDRConfig)\">\n      <summary>\n        <para>Make a field for selecting a Color.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The color to edit.</param>\n      <param name=\"showEyedropper\">If true, the color picker should show the eyedropper control. If false, don't show it.</param>\n      <param name=\"showAlpha\">If true, allow the user to set an alpha value for the color. If false, hide the alpha component.</param>\n      <param name=\"hdr\">If true, treat the color as an HDR value. If false, treat it as a standard LDR value.</param>\n      <param name=\"hdrConfig\"></param>\n      <returns>\n        <para>The color selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.CurveField(UnityEngine.Rect,UnityEngine.AnimationCurve)\">\n      <summary>\n        <para>Make a field for editing an AnimationCurve.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The curve to edit.</param>\n      <param name=\"color\">The color to show the curve with.</param>\n      <param name=\"ranges\">Optional rectangle that the curve is restrained within.</param>\n      <returns>\n        <para>The curve edited by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.CurveField(UnityEngine.Rect,System.String,UnityEngine.AnimationCurve)\">\n      <summary>\n        <para>Make a field for editing an AnimationCurve.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The curve to edit.</param>\n      <param name=\"color\">The color to show the curve with.</param>\n      <param name=\"ranges\">Optional rectangle that the curve is restrained within.</param>\n      <returns>\n        <para>The curve edited by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.CurveField(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.AnimationCurve)\">\n      <summary>\n        <para>Make a field for editing an AnimationCurve.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The curve to edit.</param>\n      <param name=\"color\">The color to show the curve with.</param>\n      <param name=\"ranges\">Optional rectangle that the curve is restrained within.</param>\n      <returns>\n        <para>The curve edited by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.CurveField(UnityEngine.Rect,UnityEngine.AnimationCurve,UnityEngine.Color,UnityEngine.Rect)\">\n      <summary>\n        <para>Make a field for editing an AnimationCurve.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The curve to edit.</param>\n      <param name=\"color\">The color to show the curve with.</param>\n      <param name=\"ranges\">Optional rectangle that the curve is restrained within.</param>\n      <returns>\n        <para>The curve edited by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.CurveField(UnityEngine.Rect,System.String,UnityEngine.AnimationCurve,UnityEngine.Color,UnityEngine.Rect)\">\n      <summary>\n        <para>Make a field for editing an AnimationCurve.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The curve to edit.</param>\n      <param name=\"color\">The color to show the curve with.</param>\n      <param name=\"ranges\">Optional rectangle that the curve is restrained within.</param>\n      <returns>\n        <para>The curve edited by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.CurveField(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.AnimationCurve,UnityEngine.Color,UnityEngine.Rect)\">\n      <summary>\n        <para>Make a field for editing an AnimationCurve.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The curve to edit.</param>\n      <param name=\"color\">The color to show the curve with.</param>\n      <param name=\"ranges\">Optional rectangle that the curve is restrained within.</param>\n      <returns>\n        <para>The curve edited by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.CurveField(UnityEngine.Rect,UnityEditor.SerializedProperty,UnityEngine.Color,UnityEngine.Rect)\">\n      <summary>\n        <para>Make a field for editing an AnimationCurve.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"property\">The curve to edit.</param>\n      <param name=\"color\">The color to show the curve with.</param>\n      <param name=\"ranges\">Optional rectangle that the curve is restrained within.</param>\n      <param name=\"label\">Optional label to display in front of the field. Pass [[GUIContent.none] to hide the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.CurveField(UnityEngine.Rect,UnityEditor.SerializedProperty,UnityEngine.Color,UnityEngine.Rect,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a field for editing an AnimationCurve.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"property\">The curve to edit.</param>\n      <param name=\"color\">The color to show the curve with.</param>\n      <param name=\"ranges\">Optional rectangle that the curve is restrained within.</param>\n      <param name=\"label\">Optional label to display in front of the field. Pass [[GUIContent.none] to hide the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DelayedDoubleField(UnityEngine.Rect,System.Double,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a delayed text field for entering doubles.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the double field.</param>\n      <param name=\"label\">Optional label to display in front of the double field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the double field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DelayedDoubleField(UnityEngine.Rect,System.String,System.Double,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a delayed text field for entering doubles.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the double field.</param>\n      <param name=\"label\">Optional label to display in front of the double field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the double field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DelayedDoubleField(UnityEngine.Rect,UnityEngine.GUIContent,System.Double,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a delayed text field for entering doubles.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the double field.</param>\n      <param name=\"label\">Optional label to display in front of the double field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the double field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DelayedDoubleField\">\n      <summary>\n        <para>Make a delayed text field for entering doubles.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the double field.</param>\n      <param name=\"property\">The double property to edit.</param>\n      <param name=\"label\">Optional label to display in front of the double field. Pass GUIContent.none to hide label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DelayedFloatField(UnityEngine.Rect,System.Single,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a delayed text field for entering floats.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the float field.</param>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the float field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DelayedFloatField(UnityEngine.Rect,System.String,System.Single,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a delayed text field for entering floats.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the float field.</param>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the float field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DelayedFloatField(UnityEngine.Rect,UnityEngine.GUIContent,System.Single,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a delayed text field for entering floats.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the float field.</param>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the float field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DelayedFloatField(UnityEngine.Rect,UnityEditor.SerializedProperty,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a delayed text field for entering floats.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the float field.</param>\n      <param name=\"property\">The float property to edit.</param>\n      <param name=\"label\">Optional label to display in front of the float field. Pass GUIContent.none to hide label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DelayedIntField(UnityEngine.Rect,System.Int32,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a delayed text field for entering integers.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the int field.</param>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the int field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DelayedIntField(UnityEngine.Rect,System.String,System.Int32,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a delayed text field for entering integers.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the int field.</param>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the int field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DelayedIntField(UnityEngine.Rect,UnityEngine.GUIContent,System.Int32,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a delayed text field for entering integers.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the int field.</param>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the int field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DelayedIntField(UnityEngine.Rect,UnityEditor.SerializedProperty,UnityEngine.GUIContent)\">\n      <summary>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the int field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the int field.</param>\n      <param name=\"property\">The int property to edit.</param>\n      <param name=\"label\">Optional label to display in front of the int field. Pass GUIContent.none to hide label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DelayedTextField(UnityEngine.Rect,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a delayed text field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"text\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the text field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DelayedTextField(UnityEngine.Rect,System.String,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a delayed text field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"text\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the text field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DelayedTextField(UnityEngine.Rect,UnityEngine.GUIContent,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a delayed text field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"text\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the text field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DelayedTextField(UnityEngine.Rect,UnityEditor.SerializedProperty,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a delayed text field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"property\">The text property to edit.</param>\n      <param name=\"label\">Optional label to display in front of the int field. Pass GUIContent.none to hide label.</param>\n    </member>\n    <member name=\"T:UnityEditor.EditorGUI.DisabledGroupScope\">\n      <summary>\n        <para>Create a group of controls that can be disabled.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DisabledGroupScope.#ctor(System.Boolean)\">\n      <summary>\n        <para>Create a new DisabledGroupScope and begin the corresponding group.</para>\n      </summary>\n      <param name=\"disabled\">Boolean specifying if the controls inside the group should be disabled.</param>\n    </member>\n    <member name=\"T:UnityEditor.EditorGUI.DisabledScope\">\n      <summary>\n        <para>Create a group of controls that can be disabled.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DisabledScope.#ctor(System.Boolean)\">\n      <summary>\n        <para>Create a new DisabledScope and begin the corresponding group.</para>\n      </summary>\n      <param name=\"disabled\">Boolean specifying if the controls inside the group should be disabled.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DoubleField(UnityEngine.Rect,System.Double,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field for entering doubles.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the double field.</param>\n      <param name=\"label\">Optional label to display in front of the double field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DoubleField(UnityEngine.Rect,System.String,System.Double,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field for entering doubles.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the double field.</param>\n      <param name=\"label\">Optional label to display in front of the double field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DoubleField(UnityEngine.Rect,UnityEngine.GUIContent,System.Double,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field for entering doubles.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the double field.</param>\n      <param name=\"label\">Optional label to display in front of the double field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DrawPreviewTexture(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.Material,UnityEngine.ScaleMode,System.Single,System.Single)\">\n      <summary>\n        <para>Draws the texture within a rectangle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to draw the texture within.</param>\n      <param name=\"image\">Texture to display.</param>\n      <param name=\"mat\">Material to be used when drawing the texture.</param>\n      <param name=\"scaleMode\">How to scale the image when the aspect ratio of it doesn't fit the aspect ratio to be drawn within.</param>\n      <param name=\"imageAspect\">Aspect ratio to use for the source image. If 0 (the default), the aspect ratio from the image is used.</param>\n      <param name=\"mipLevel\">The mip-level to sample. If negative, the texture is sampled normally.\nSets material _Mip property.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DrawPreviewTexture(UnityEngine.Rect,UnityEngine.Texture)\">\n      <summary>\n        <para>Draws the texture within a rectangle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to draw the texture within.</param>\n      <param name=\"image\">Texture to display.</param>\n      <param name=\"mat\">Material to be used when drawing the texture.</param>\n      <param name=\"scaleMode\">How to scale the image when the aspect ratio of it doesn't fit the aspect ratio to be drawn within.</param>\n      <param name=\"imageAspect\">Aspect ratio to use for the source image. If 0 (the default), the aspect ratio from the image is used.</param>\n      <param name=\"mipLevel\">The mip-level to sample. If negative, the texture is sampled normally.\nSets material _Mip property.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DrawPreviewTexture(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.Material)\">\n      <summary>\n        <para>Draws the texture within a rectangle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to draw the texture within.</param>\n      <param name=\"image\">Texture to display.</param>\n      <param name=\"mat\">Material to be used when drawing the texture.</param>\n      <param name=\"scaleMode\">How to scale the image when the aspect ratio of it doesn't fit the aspect ratio to be drawn within.</param>\n      <param name=\"imageAspect\">Aspect ratio to use for the source image. If 0 (the default), the aspect ratio from the image is used.</param>\n      <param name=\"mipLevel\">The mip-level to sample. If negative, the texture is sampled normally.\nSets material _Mip property.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DrawPreviewTexture(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.Material,UnityEngine.ScaleMode)\">\n      <summary>\n        <para>Draws the texture within a rectangle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to draw the texture within.</param>\n      <param name=\"image\">Texture to display.</param>\n      <param name=\"mat\">Material to be used when drawing the texture.</param>\n      <param name=\"scaleMode\">How to scale the image when the aspect ratio of it doesn't fit the aspect ratio to be drawn within.</param>\n      <param name=\"imageAspect\">Aspect ratio to use for the source image. If 0 (the default), the aspect ratio from the image is used.</param>\n      <param name=\"mipLevel\">The mip-level to sample. If negative, the texture is sampled normally.\nSets material _Mip property.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DrawPreviewTexture(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.Material,UnityEngine.ScaleMode,System.Single)\">\n      <summary>\n        <para>Draws the texture within a rectangle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to draw the texture within.</param>\n      <param name=\"image\">Texture to display.</param>\n      <param name=\"mat\">Material to be used when drawing the texture.</param>\n      <param name=\"scaleMode\">How to scale the image when the aspect ratio of it doesn't fit the aspect ratio to be drawn within.</param>\n      <param name=\"imageAspect\">Aspect ratio to use for the source image. If 0 (the default), the aspect ratio from the image is used.</param>\n      <param name=\"mipLevel\">The mip-level to sample. If negative, the texture is sampled normally.\nSets material _Mip property.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DrawRect(UnityEngine.Rect,UnityEngine.Color)\">\n      <summary>\n        <para>Draws a filled rectangle of color at the specified position and size within the current editor window.</para>\n      </summary>\n      <param name=\"rect\">The position and size of the rectangle to draw.</param>\n      <param name=\"color\">The color of the rectange.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DrawTextureAlpha(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.ScaleMode,System.Single,System.Single)\">\n      <summary>\n        <para>Draws the alpha channel of a texture within a rectangle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to draw the texture within.</param>\n      <param name=\"image\">Texture to display.</param>\n      <param name=\"scaleMode\">How to scale the image when the aspect ratio of it doesn't fit the aspect ratio to be drawn within.</param>\n      <param name=\"imageAspect\">Aspect ratio to use for the source image. If 0 (the default), the aspect ratio from the image is used.</param>\n      <param name=\"mipLevel\">What mip-level to sample. If negative, texture will be sampled normally.\nIt sets material _Mip property.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DrawTextureAlpha(UnityEngine.Rect,UnityEngine.Texture)\">\n      <summary>\n        <para>Draws the alpha channel of a texture within a rectangle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to draw the texture within.</param>\n      <param name=\"image\">Texture to display.</param>\n      <param name=\"scaleMode\">How to scale the image when the aspect ratio of it doesn't fit the aspect ratio to be drawn within.</param>\n      <param name=\"imageAspect\">Aspect ratio to use for the source image. If 0 (the default), the aspect ratio from the image is used.</param>\n      <param name=\"mipLevel\">What mip-level to sample. If negative, texture will be sampled normally.\nIt sets material _Mip property.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DrawTextureAlpha(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.ScaleMode)\">\n      <summary>\n        <para>Draws the alpha channel of a texture within a rectangle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to draw the texture within.</param>\n      <param name=\"image\">Texture to display.</param>\n      <param name=\"scaleMode\">How to scale the image when the aspect ratio of it doesn't fit the aspect ratio to be drawn within.</param>\n      <param name=\"imageAspect\">Aspect ratio to use for the source image. If 0 (the default), the aspect ratio from the image is used.</param>\n      <param name=\"mipLevel\">What mip-level to sample. If negative, texture will be sampled normally.\nIt sets material _Mip property.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DrawTextureAlpha(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.ScaleMode,System.Single)\">\n      <summary>\n        <para>Draws the alpha channel of a texture within a rectangle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to draw the texture within.</param>\n      <param name=\"image\">Texture to display.</param>\n      <param name=\"scaleMode\">How to scale the image when the aspect ratio of it doesn't fit the aspect ratio to be drawn within.</param>\n      <param name=\"imageAspect\">Aspect ratio to use for the source image. If 0 (the default), the aspect ratio from the image is used.</param>\n      <param name=\"mipLevel\">What mip-level to sample. If negative, texture will be sampled normally.\nIt sets material _Mip property.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DropdownButton(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.FocusType)\">\n      <summary>\n        <para>Make a button that reacts to mouse down, for displaying your own dropdown content.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"focusType\">Whether the button should be selectable by keyboard or not.</param>\n      <param name=\"style\">Optional style to use.</param>\n      <returns>\n        <para>true when the user clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DropdownButton(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.FocusType,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a button that reacts to mouse down, for displaying your own dropdown content.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"focusType\">Whether the button should be selectable by keyboard or not.</param>\n      <param name=\"style\">Optional style to use.</param>\n      <returns>\n        <para>true when the user clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DropShadowLabel(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>Draws a label with a drop shadow.</para>\n      </summary>\n      <param name=\"position\">Where to show the label.</param>\n      <param name=\"content\">Text to show\n@style style to use.</param>\n      <param name=\"text\"></param>\n      <param name=\"style\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DropShadowLabel(UnityEngine.Rect,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Draws a label with a drop shadow.</para>\n      </summary>\n      <param name=\"position\">Where to show the label.</param>\n      <param name=\"content\">Text to show\n@style style to use.</param>\n      <param name=\"text\"></param>\n      <param name=\"style\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DropShadowLabel(UnityEngine.Rect,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Draws a label with a drop shadow.</para>\n      </summary>\n      <param name=\"position\">Where to show the label.</param>\n      <param name=\"content\">Text to show\n@style style to use.</param>\n      <param name=\"text\"></param>\n      <param name=\"style\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.DropShadowLabel(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Draws a label with a drop shadow.</para>\n      </summary>\n      <param name=\"position\">Where to show the label.</param>\n      <param name=\"content\">Text to show\n@style style to use.</param>\n      <param name=\"text\"></param>\n      <param name=\"style\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EndChangeCheck\">\n      <summary>\n        <para>Ends a change check started with BeginChangeCheck ().</para>\n      </summary>\n      <returns>\n        <para>True if GUI.changed was set to true, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EndDisabledGroup\">\n      <summary>\n        <para>Ends a disabled group started with BeginDisabledGroup.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EndProperty\">\n      <summary>\n        <para>Ends a Property wrapper started with BeginProperty.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumFlagsField(UnityEngine.Rect,System.Enum)\">\n      <summary>\n        <para>Displays a menu with an option for every value of the enum type when clicked. An option for the value 0 with name \"Nothing\" and an option for the value ~0 (that is, all bits set) with the name \"Everything\" are always displayed at the top of the menu. The names for the values 0 and ~0 can be overriden by defining these values in the enum type.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the enum flags field.</param>\n      <param name=\"label\">Optional label to display in front of the enum flags field.</param>\n      <param name=\"enumValue\">Enum flags value (Only supports enum values for enum types with int as the underlying type).</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The enum flags value modified by the user. This is a selection BitMask where each bit represents an Enum value index. (Note this returned value is not itself an Enum).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumFlagsField(UnityEngine.Rect,System.Enum,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Displays a menu with an option for every value of the enum type when clicked. An option for the value 0 with name \"Nothing\" and an option for the value ~0 (that is, all bits set) with the name \"Everything\" are always displayed at the top of the menu. The names for the values 0 and ~0 can be overriden by defining these values in the enum type.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the enum flags field.</param>\n      <param name=\"label\">Optional label to display in front of the enum flags field.</param>\n      <param name=\"enumValue\">Enum flags value (Only supports enum values for enum types with int as the underlying type).</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The enum flags value modified by the user. This is a selection BitMask where each bit represents an Enum value index. (Note this returned value is not itself an Enum).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumFlagsField(UnityEngine.Rect,System.String,System.Enum)\">\n      <summary>\n        <para>Displays a menu with an option for every value of the enum type when clicked. An option for the value 0 with name \"Nothing\" and an option for the value ~0 (that is, all bits set) with the name \"Everything\" are always displayed at the top of the menu. The names for the values 0 and ~0 can be overriden by defining these values in the enum type.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the enum flags field.</param>\n      <param name=\"label\">Optional label to display in front of the enum flags field.</param>\n      <param name=\"enumValue\">Enum flags value (Only supports enum values for enum types with int as the underlying type).</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The enum flags value modified by the user. This is a selection BitMask where each bit represents an Enum value index. (Note this returned value is not itself an Enum).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumFlagsField(UnityEngine.Rect,System.String,System.Enum,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Displays a menu with an option for every value of the enum type when clicked. An option for the value 0 with name \"Nothing\" and an option for the value ~0 (that is, all bits set) with the name \"Everything\" are always displayed at the top of the menu. The names for the values 0 and ~0 can be overriden by defining these values in the enum type.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the enum flags field.</param>\n      <param name=\"label\">Optional label to display in front of the enum flags field.</param>\n      <param name=\"enumValue\">Enum flags value (Only supports enum values for enum types with int as the underlying type).</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The enum flags value modified by the user. This is a selection BitMask where each bit represents an Enum value index. (Note this returned value is not itself an Enum).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumFlagsField(UnityEngine.Rect,UnityEngine.GUIContent,System.Enum)\">\n      <summary>\n        <para>Displays a menu with an option for every value of the enum type when clicked. An option for the value 0 with name \"Nothing\" and an option for the value ~0 (that is, all bits set) with the name \"Everything\" are always displayed at the top of the menu. The names for the values 0 and ~0 can be overriden by defining these values in the enum type.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the enum flags field.</param>\n      <param name=\"label\">Optional label to display in front of the enum flags field.</param>\n      <param name=\"enumValue\">Enum flags value (Only supports enum values for enum types with int as the underlying type).</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The enum flags value modified by the user. This is a selection BitMask where each bit represents an Enum value index. (Note this returned value is not itself an Enum).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumFlagsField(UnityEngine.Rect,UnityEngine.GUIContent,System.Enum,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Displays a menu with an option for every value of the enum type when clicked. An option for the value 0 with name \"Nothing\" and an option for the value ~0 (that is, all bits set) with the name \"Everything\" are always displayed at the top of the menu. The names for the values 0 and ~0 can be overriden by defining these values in the enum type.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the enum flags field.</param>\n      <param name=\"label\">Optional label to display in front of the enum flags field.</param>\n      <param name=\"enumValue\">Enum flags value (Only supports enum values for enum types with int as the underlying type).</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The enum flags value modified by the user. This is a selection BitMask where each bit represents an Enum value index. (Note this returned value is not itself an Enum).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumMaskField(UnityEngine.Rect,System.Enum)\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUI.EnumFlagsField instead.\n\nMake a field for enum based masks.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for this control.</param>\n      <param name=\"label\">Caption/label for the control.</param>\n      <param name=\"enumValue\">Enum to use for the flags.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>A selection BitMask where each bit represents an Enum value index. (Note this returned value is not itself an Enum).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumMaskField(UnityEngine.Rect,System.String,System.Enum)\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUI.EnumFlagsField instead.\n\nMake a field for enum based masks.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for this control.</param>\n      <param name=\"label\">Caption/label for the control.</param>\n      <param name=\"enumValue\">Enum to use for the flags.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>A selection BitMask where each bit represents an Enum value index. (Note this returned value is not itself an Enum).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumMaskField(UnityEngine.Rect,UnityEngine.GUIContent,System.Enum)\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUI.EnumFlagsField instead.\n\nMake a field for enum based masks.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for this control.</param>\n      <param name=\"label\">Caption/label for the control.</param>\n      <param name=\"enumValue\">Enum to use for the flags.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>A selection BitMask where each bit represents an Enum value index. (Note this returned value is not itself an Enum).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumMaskField(UnityEngine.Rect,System.Enum,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUI.EnumFlagsField instead.\n\nMake a field for enum based masks.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for this control.</param>\n      <param name=\"label\">Caption/label for the control.</param>\n      <param name=\"enumValue\">Enum to use for the flags.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>A selection BitMask where each bit represents an Enum value index. (Note this returned value is not itself an Enum).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumMaskField(UnityEngine.Rect,System.String,System.Enum,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUI.EnumFlagsField instead.\n\nMake a field for enum based masks.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for this control.</param>\n      <param name=\"label\">Caption/label for the control.</param>\n      <param name=\"enumValue\">Enum to use for the flags.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>A selection BitMask where each bit represents an Enum value index. (Note this returned value is not itself an Enum).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumMaskField(UnityEngine.Rect,UnityEngine.GUIContent,System.Enum,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUI.EnumFlagsField instead.\n\nMake a field for enum based masks.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for this control.</param>\n      <param name=\"label\">Caption/label for the control.</param>\n      <param name=\"enumValue\">Enum to use for the flags.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>A selection BitMask where each bit represents an Enum value index. (Note this returned value is not itself an Enum).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumMaskPopup(UnityEngine.Rect,System.String,System.Enum)\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUI.EnumFlagsField instead.\n\nMake an enum popup selection field for a bitmask.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum options the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The enum options that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumMaskPopup(UnityEngine.Rect,System.String,System.Enum,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUI.EnumFlagsField instead.\n\nMake an enum popup selection field for a bitmask.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum options the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The enum options that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumMaskPopup(UnityEngine.Rect,UnityEngine.GUIContent,System.Enum)\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUI.EnumFlagsField instead.\n\nMake an enum popup selection field for a bitmask.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum options the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The enum options that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumMaskPopup(UnityEngine.Rect,UnityEngine.GUIContent,System.Enum,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUI.EnumFlagsField instead.\n\nMake an enum popup selection field for a bitmask.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum options the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The enum options that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumPopup(UnityEngine.Rect,System.Enum)\">\n      <summary>\n        <para>Make an enum popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum option the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The enum option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumPopup(UnityEngine.Rect,System.String,System.Enum)\">\n      <summary>\n        <para>Make an enum popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum option the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The enum option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumPopup(UnityEngine.Rect,UnityEngine.GUIContent,System.Enum)\">\n      <summary>\n        <para>Make an enum popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum option the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The enum option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumPopup(UnityEngine.Rect,System.Enum,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make an enum popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum option the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The enum option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumPopup(UnityEngine.Rect,System.String,System.Enum,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make an enum popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum option the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The enum option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.EnumPopup(UnityEngine.Rect,UnityEngine.GUIContent,System.Enum,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make an enum popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum option the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The enum option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.FloatField(UnityEngine.Rect,System.Single,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field for entering floats.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the float field.</param>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.FloatField(UnityEngine.Rect,System.String,System.Single,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field for entering floats.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the float field.</param>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.FloatField(UnityEngine.Rect,UnityEngine.GUIContent,System.Single,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field for entering floats.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the float field.</param>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.FocusTextInControl(System.String)\">\n      <summary>\n        <para>Move keyboard focus to a named text field and begin editing of the content.</para>\n      </summary>\n      <param name=\"name\">Name set using GUI.SetNextControlName.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Foldout(UnityEngine.Rect,System.Boolean,System.String)\">\n      <summary>\n        <para>Make a label with a foldout arrow to the left of it.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the arrow and label.</param>\n      <param name=\"foldout\">The shown foldout state.</param>\n      <param name=\"content\">The label to show.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"toggleOnLabelClick\">Should the label be a clickable part of the control?</param>\n      <returns>\n        <para>The foldout state selected by the user. If true, you should render sub-objects.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Foldout(UnityEngine.Rect,System.Boolean,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a label with a foldout arrow to the left of it.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the arrow and label.</param>\n      <param name=\"foldout\">The shown foldout state.</param>\n      <param name=\"content\">The label to show.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"toggleOnLabelClick\">Should the label be a clickable part of the control?</param>\n      <returns>\n        <para>The foldout state selected by the user. If true, you should render sub-objects.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Foldout(UnityEngine.Rect,System.Boolean,System.String,System.Boolean)\">\n      <summary>\n        <para>Make a label with a foldout arrow to the left of it.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the arrow and label.</param>\n      <param name=\"foldout\">The shown foldout state.</param>\n      <param name=\"content\">The label to show.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"toggleOnLabelClick\">Should the label be a clickable part of the control?</param>\n      <returns>\n        <para>The foldout state selected by the user. If true, you should render sub-objects.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Foldout(UnityEngine.Rect,System.Boolean,UnityEngine.GUIContent,System.Boolean)\">\n      <summary>\n        <para>Make a label with a foldout arrow to the left of it.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the arrow and label.</param>\n      <param name=\"foldout\">The shown foldout state.</param>\n      <param name=\"content\">The label to show.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"toggleOnLabelClick\">Should the label be a clickable part of the control?</param>\n      <returns>\n        <para>The foldout state selected by the user. If true, you should render sub-objects.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Foldout(UnityEngine.Rect,System.Boolean,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label with a foldout arrow to the left of it.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the arrow and label.</param>\n      <param name=\"foldout\">The shown foldout state.</param>\n      <param name=\"content\">The label to show.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"toggleOnLabelClick\">Should the label be a clickable part of the control?</param>\n      <returns>\n        <para>The foldout state selected by the user. If true, you should render sub-objects.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Foldout(UnityEngine.Rect,System.Boolean,System.String,System.Boolean,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label with a foldout arrow to the left of it.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the arrow and label.</param>\n      <param name=\"foldout\">The shown foldout state.</param>\n      <param name=\"content\">The label to show.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"toggleOnLabelClick\">Should the label be a clickable part of the control?</param>\n      <returns>\n        <para>The foldout state selected by the user. If true, you should render sub-objects.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Foldout(UnityEngine.Rect,System.Boolean,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label with a foldout arrow to the left of it.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the arrow and label.</param>\n      <param name=\"foldout\">The shown foldout state.</param>\n      <param name=\"content\">The label to show.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"toggleOnLabelClick\">Should the label be a clickable part of the control?</param>\n      <returns>\n        <para>The foldout state selected by the user. If true, you should render sub-objects.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Foldout(UnityEngine.Rect,System.Boolean,UnityEngine.GUIContent,System.Boolean,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label with a foldout arrow to the left of it.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the arrow and label.</param>\n      <param name=\"foldout\">The shown foldout state.</param>\n      <param name=\"content\">The label to show.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"toggleOnLabelClick\">Should the label be a clickable part of the control?</param>\n      <returns>\n        <para>The foldout state selected by the user. If true, you should render sub-objects.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.GetPropertyHeight(UnityEditor.SerializedProperty,System.Boolean)\">\n      <summary>\n        <para>Get the height needed for a PropertyField control.</para>\n      </summary>\n      <param name=\"property\">Height of the property area.</param>\n      <param name=\"label\">Descriptive text or image.</param>\n      <param name=\"includeChildren\">Should the returned height include the height of child properties?</param>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.GetPropertyHeight(UnityEditor.SerializedPropertyType,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Get the height needed for a PropertyField control.</para>\n      </summary>\n      <param name=\"property\">Height of the property area.</param>\n      <param name=\"label\">Descriptive text or image.</param>\n      <param name=\"includeChildren\">Should the returned height include the height of child properties?</param>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.GetPropertyHeight(UnityEditor.SerializedProperty)\">\n      <summary>\n        <para>Get the height needed for a PropertyField control.</para>\n      </summary>\n      <param name=\"property\">Height of the property area.</param>\n      <param name=\"label\">Descriptive text or image.</param>\n      <param name=\"includeChildren\">Should the returned height include the height of child properties?</param>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.GetPropertyHeight(UnityEditor.SerializedProperty,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Get the height needed for a PropertyField control.</para>\n      </summary>\n      <param name=\"property\">Height of the property area.</param>\n      <param name=\"label\">Descriptive text or image.</param>\n      <param name=\"includeChildren\">Should the returned height include the height of child properties?</param>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.GetPropertyHeight(UnityEditor.SerializedProperty,UnityEngine.GUIContent,System.Boolean)\">\n      <summary>\n        <para>Get the height needed for a PropertyField control.</para>\n      </summary>\n      <param name=\"property\">Height of the property area.</param>\n      <param name=\"label\">Descriptive text or image.</param>\n      <param name=\"includeChildren\">Should the returned height include the height of child properties?</param>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.HandlePrefixLabel(UnityEngine.Rect,UnityEngine.Rect,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a label for some control.</para>\n      </summary>\n      <param name=\"totalPosition\">Rectangle on the screen to use in total for both the label and the control.</param>\n      <param name=\"labelPosition\">Rectangle on the screen to use for the label.</param>\n      <param name=\"label\">Label to show for the control.</param>\n      <param name=\"id\">The unique ID of the control. If none specified, the ID of the following control is used.</param>\n      <param name=\"style\">Optional GUIStyle to use for the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.HandlePrefixLabel(UnityEngine.Rect,UnityEngine.Rect,UnityEngine.GUIContent,System.Int32)\">\n      <summary>\n        <para>Make a label for some control.</para>\n      </summary>\n      <param name=\"totalPosition\">Rectangle on the screen to use in total for both the label and the control.</param>\n      <param name=\"labelPosition\">Rectangle on the screen to use for the label.</param>\n      <param name=\"label\">Label to show for the control.</param>\n      <param name=\"id\">The unique ID of the control. If none specified, the ID of the following control is used.</param>\n      <param name=\"style\">Optional GUIStyle to use for the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.HandlePrefixLabel(UnityEngine.Rect,UnityEngine.Rect,UnityEngine.GUIContent,System.Int32,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label for some control.</para>\n      </summary>\n      <param name=\"totalPosition\">Rectangle on the screen to use in total for both the label and the control.</param>\n      <param name=\"labelPosition\">Rectangle on the screen to use for the label.</param>\n      <param name=\"label\">Label to show for the control.</param>\n      <param name=\"id\">The unique ID of the control. If none specified, the ID of the following control is used.</param>\n      <param name=\"style\">Optional GUIStyle to use for the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.HelpBox(UnityEngine.Rect,System.String,UnityEditor.MessageType)\">\n      <summary>\n        <para>Make a help box with a message to the user.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to draw the help box within.</param>\n      <param name=\"message\">The message text.</param>\n      <param name=\"type\">The type of message.</param>\n    </member>\n    <member name=\"T:UnityEditor.EditorGUI.IndentLevelScope\">\n      <summary>\n        <para>Scope for managing the indent level of the field labels.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IndentLevelScope.#ctor\">\n      <summary>\n        <para>Creates an IndentLevelScope and increases the EditorGUI indent level.</para>\n      </summary>\n      <param name=\"increment\">The EditorGUI indent level will be increased by this amount inside the scope.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IndentLevelScope.#ctor(System.Int32)\">\n      <summary>\n        <para>Creates an IndentLevelScope and increases the EditorGUI indent level.</para>\n      </summary>\n      <param name=\"increment\">The EditorGUI indent level will be increased by this amount inside the scope.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.InspectorTitlebar\">\n      <summary>\n        <para>Make an inspector-window-like titlebar.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the titlebar.</param>\n      <param name=\"foldout\">The foldout state shown with the arrow.</param>\n      <param name=\"targetObj\">The object (for example a component) that the titlebar is for.</param>\n      <param name=\"targetObjs\">The objects that the titlebar is for.</param>\n      <param name=\"expandable\">Whether this editor should display a foldout arrow in order to toggle the display of its properties.</param>\n      <returns>\n        <para>The foldout state selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.InspectorTitlebar\">\n      <summary>\n        <para>Make an inspector-window-like titlebar.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the titlebar.</param>\n      <param name=\"foldout\">The foldout state shown with the arrow.</param>\n      <param name=\"targetObj\">The object (for example a component) that the titlebar is for.</param>\n      <param name=\"targetObjs\">The objects that the titlebar is for.</param>\n      <param name=\"expandable\">Whether this editor should display a foldout arrow in order to toggle the display of its properties.</param>\n      <returns>\n        <para>The foldout state selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.InspectorTitlebar(UnityEngine.Rect,System.Boolean,UnityEngine.Object,System.Boolean)\">\n      <summary>\n        <para>Make an inspector-window-like titlebar.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the titlebar.</param>\n      <param name=\"foldout\">The foldout state shown with the arrow.</param>\n      <param name=\"targetObj\">The object (for example a component) that the titlebar is for.</param>\n      <param name=\"targetObjs\">The objects that the titlebar is for.</param>\n      <param name=\"expandable\">Whether this editor should display a foldout arrow in order to toggle the display of its properties.</param>\n      <returns>\n        <para>The foldout state selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.InspectorTitlebar(UnityEngine.Rect,System.Boolean,UnityEngine.Object[],System.Boolean)\">\n      <summary>\n        <para>Make an inspector-window-like titlebar.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the titlebar.</param>\n      <param name=\"foldout\">The foldout state shown with the arrow.</param>\n      <param name=\"targetObj\">The object (for example a component) that the titlebar is for.</param>\n      <param name=\"targetObjs\">The objects that the titlebar is for.</param>\n      <param name=\"expandable\">Whether this editor should display a foldout arrow in order to toggle the display of its properties.</param>\n      <returns>\n        <para>The foldout state selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntField(UnityEngine.Rect,System.Int32)\">\n      <summary>\n        <para>Make a text field for entering integers.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the int field.</param>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntField(UnityEngine.Rect,System.String,System.Int32)\">\n      <summary>\n        <para>Make a text field for entering integers.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the int field.</param>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntField(UnityEngine.Rect,UnityEngine.GUIContent,System.Int32)\">\n      <summary>\n        <para>Make a text field for entering integers.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the int field.</param>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntField(UnityEngine.Rect,System.Int32,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field for entering integers.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the int field.</param>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntField(UnityEngine.Rect,System.String,System.Int32,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field for entering integers.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the int field.</param>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntField(UnityEngine.Rect,UnityEngine.GUIContent,System.Int32,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field for entering integers.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the int field.</param>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntPopup(UnityEngine.Rect,System.Int32,System.String[],System.Int32[])\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedValue\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option. If optionValues a direct mapping of selectedValue to displayedOptions is assumed.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntPopup(UnityEngine.Rect,System.Int32,UnityEngine.GUIContent[],System.Int32[])\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedValue\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option. If optionValues a direct mapping of selectedValue to displayedOptions is assumed.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntPopup(UnityEngine.Rect,System.Int32,System.String[],System.Int32[],UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedValue\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option. If optionValues a direct mapping of selectedValue to displayedOptions is assumed.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntPopup(UnityEngine.Rect,System.Int32,UnityEngine.GUIContent[],System.Int32[],UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedValue\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option. If optionValues a direct mapping of selectedValue to displayedOptions is assumed.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntPopup(UnityEngine.Rect,System.String,System.Int32,System.String[],System.Int32[],UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedValue\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option. If optionValues a direct mapping of selectedValue to displayedOptions is assumed.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntPopup(UnityEngine.Rect,System.String,System.Int32,System.String[],System.Int32[])\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedValue\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option. If optionValues a direct mapping of selectedValue to displayedOptions is assumed.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntPopup(UnityEngine.Rect,UnityEngine.GUIContent,System.Int32,UnityEngine.GUIContent[],System.Int32[],UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedValue\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option. If optionValues a direct mapping of selectedValue to displayedOptions is assumed.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntPopup(UnityEngine.Rect,UnityEngine.GUIContent,System.Int32,UnityEngine.GUIContent[],System.Int32[])\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedValue\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option. If optionValues a direct mapping of selectedValue to displayedOptions is assumed.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntPopup(UnityEngine.Rect,UnityEditor.SerializedProperty,UnityEngine.GUIContent[],System.Int32[])\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"property\">The SerializedProperty to use for the control.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option. If optionValues a direct   mapping of selectedValue to displayedOptions is assumed.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntPopup(UnityEngine.Rect,UnityEditor.SerializedProperty,UnityEngine.GUIContent[],System.Int32[],UnityEngine.GUIContent)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"property\">The SerializedProperty to use for the control.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option. If optionValues a direct   mapping of selectedValue to displayedOptions is assumed.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntSlider(UnityEngine.Rect,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Make a slider the user can drag to change an integer value between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntSlider(UnityEngine.Rect,System.String,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Make a slider the user can drag to change an integer value between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntSlider(UnityEngine.Rect,UnityEngine.GUIContent,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Make a slider the user can drag to change an integer value between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntSlider(UnityEngine.Rect,UnityEditor.SerializedProperty,System.Int32,System.Int32)\">\n      <summary>\n        <para>Make a slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"property\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntSlider(UnityEngine.Rect,UnityEditor.SerializedProperty,System.Int32,System.Int32,System.String)\">\n      <summary>\n        <para>Make a slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"property\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.IntSlider(UnityEngine.Rect,UnityEditor.SerializedProperty,System.Int32,System.Int32,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"property\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LabelField(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>Make a label field. (Useful for showing read-only info.)</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the label field.</param>\n      <param name=\"label\">Label in front of the label field.</param>\n      <param name=\"label2\">The label to show to the right.</param>\n      <param name=\"style\">Style information (color, etc) for displaying the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LabelField(UnityEngine.Rect,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a label field. (Useful for showing read-only info.)</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the label field.</param>\n      <param name=\"label\">Label in front of the label field.</param>\n      <param name=\"label2\">The label to show to the right.</param>\n      <param name=\"style\">Style information (color, etc) for displaying the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LabelField(UnityEngine.Rect,System.String,System.String)\">\n      <summary>\n        <para>Make a label field. (Useful for showing read-only info.)</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the label field.</param>\n      <param name=\"label\">Label in front of the label field.</param>\n      <param name=\"label2\">The label to show to the right.</param>\n      <param name=\"style\">Style information (color, etc) for displaying the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LabelField(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a label field. (Useful for showing read-only info.)</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the label field.</param>\n      <param name=\"label\">Label in front of the label field.</param>\n      <param name=\"label2\">The label to show to the right.</param>\n      <param name=\"style\">Style information (color, etc) for displaying the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LabelField(UnityEngine.Rect,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label field. (Useful for showing read-only info.)</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the label field.</param>\n      <param name=\"label\">Label in front of the label field.</param>\n      <param name=\"label2\">The label to show to the right.</param>\n      <param name=\"style\">Style information (color, etc) for displaying the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LabelField(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label field. (Useful for showing read-only info.)</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the label field.</param>\n      <param name=\"label\">Label in front of the label field.</param>\n      <param name=\"label2\">The label to show to the right.</param>\n      <param name=\"style\">Style information (color, etc) for displaying the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LabelField(UnityEngine.Rect,System.String,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label field. (Useful for showing read-only info.)</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the label field.</param>\n      <param name=\"label\">Label in front of the label field.</param>\n      <param name=\"label2\">The label to show to the right.</param>\n      <param name=\"style\">Style information (color, etc) for displaying the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LabelField(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label field. (Useful for showing read-only info.)</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the label field.</param>\n      <param name=\"label\">Label in front of the label field.</param>\n      <param name=\"label2\">The label to show to the right.</param>\n      <param name=\"style\">Style information (color, etc) for displaying the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LayerField(UnityEngine.Rect,System.Int32)\">\n      <summary>\n        <para>Make a layer selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"layer\">The layer shown in the field.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The layer selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LayerField(UnityEngine.Rect,System.String,System.Int32)\">\n      <summary>\n        <para>Make a layer selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"layer\">The layer shown in the field.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The layer selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LayerField(UnityEngine.Rect,UnityEngine.GUIContent,System.Int32)\">\n      <summary>\n        <para>Make a layer selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"layer\">The layer shown in the field.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The layer selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LayerField(UnityEngine.Rect,System.Int32,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a layer selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"layer\">The layer shown in the field.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The layer selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LayerField(UnityEngine.Rect,System.String,System.Int32,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a layer selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"layer\">The layer shown in the field.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The layer selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LayerField(UnityEngine.Rect,UnityEngine.GUIContent,System.Int32,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a layer selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"layer\">The layer shown in the field.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The layer selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LongField(UnityEngine.Rect,System.Int64)\">\n      <summary>\n        <para>Make a text field for entering long integers.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the long field.</param>\n      <param name=\"label\">Optional label to display in front of the long field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LongField(UnityEngine.Rect,System.String,System.Int64)\">\n      <summary>\n        <para>Make a text field for entering long integers.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the long field.</param>\n      <param name=\"label\">Optional label to display in front of the long field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LongField(UnityEngine.Rect,UnityEngine.GUIContent,System.Int64)\">\n      <summary>\n        <para>Make a text field for entering long integers.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the long field.</param>\n      <param name=\"label\">Optional label to display in front of the long field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LongField(UnityEngine.Rect,System.String,System.Int64,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field for entering long integers.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the long field.</param>\n      <param name=\"label\">Optional label to display in front of the long field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.LongField(UnityEngine.Rect,UnityEngine.GUIContent,System.Int64,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field for entering long integers.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the long field.</param>\n      <param name=\"label\">Optional label to display in front of the long field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.MaskField(UnityEngine.Rect,System.Int32,System.String[])\">\n      <summary>\n        <para>Make a field for masks.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for this control.</param>\n      <param name=\"label\">Label for the field.</param>\n      <param name=\"mask\">The current mask to display.</param>\n      <param name=\"displayedOption\">A string array containing the labels for each flag.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"displayedOptions\">A string array containing the labels for each flag.</param>\n      <returns>\n        <para>The value modified by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.MaskField(UnityEngine.Rect,System.String,System.Int32,System.String[])\">\n      <summary>\n        <para>Make a field for masks.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for this control.</param>\n      <param name=\"label\">Label for the field.</param>\n      <param name=\"mask\">The current mask to display.</param>\n      <param name=\"displayedOption\">A string array containing the labels for each flag.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"displayedOptions\">A string array containing the labels for each flag.</param>\n      <returns>\n        <para>The value modified by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.MaskField(UnityEngine.Rect,UnityEngine.GUIContent,System.Int32,System.String[])\">\n      <summary>\n        <para>Make a field for masks.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for this control.</param>\n      <param name=\"label\">Label for the field.</param>\n      <param name=\"mask\">The current mask to display.</param>\n      <param name=\"displayedOption\">A string array containing the labels for each flag.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"displayedOptions\">A string array containing the labels for each flag.</param>\n      <returns>\n        <para>The value modified by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.MaskField(UnityEngine.Rect,UnityEngine.GUIContent,System.Int32,System.String[],UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a field for masks.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for this control.</param>\n      <param name=\"label\">Label for the field.</param>\n      <param name=\"mask\">The current mask to display.</param>\n      <param name=\"displayedOption\">A string array containing the labels for each flag.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"displayedOptions\">A string array containing the labels for each flag.</param>\n      <returns>\n        <para>The value modified by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.MaskField(UnityEngine.Rect,System.String,System.Int32,System.String[],UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a field for masks.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for this control.</param>\n      <param name=\"label\">Label for the field.</param>\n      <param name=\"mask\">The current mask to display.</param>\n      <param name=\"displayedOption\">A string array containing the labels for each flag.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"displayedOptions\">A string array containing the labels for each flag.</param>\n      <returns>\n        <para>The value modified by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.MaskField(UnityEngine.Rect,System.Int32,System.String[],UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a field for masks.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for this control.</param>\n      <param name=\"label\">Label for the field.</param>\n      <param name=\"mask\">The current mask to display.</param>\n      <param name=\"displayedOption\">A string array containing the labels for each flag.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"displayedOptions\">A string array containing the labels for each flag.</param>\n      <returns>\n        <para>The value modified by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.MinMaxSlider(UnityEngine.GUIContent,UnityEngine.Rect,System.Single&amp;,System.Single&amp;,System.Single,System.Single)\">\n      <summary>\n        <para>Make a special slider the user can use to specify a range between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"minValue\">The lower value of the range the slider shows, passed by reference.</param>\n      <param name=\"maxValue\">The upper value at the range the slider shows, passed by reference.</param>\n      <param name=\"minLimit\">The limit at the left end of the slider.</param>\n      <param name=\"maxLimit\">The limit at the right end of the slider.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.MinMaxSlider(UnityEngine.Rect,System.Single&amp;,System.Single&amp;,System.Single,System.Single)\">\n      <summary>\n        <para>Make a special slider the user can use to specify a range between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"minValue\">The lower value of the range the slider shows, passed by reference.</param>\n      <param name=\"maxValue\">The upper value at the range the slider shows, passed by reference.</param>\n      <param name=\"minLimit\">The limit at the left end of the slider.</param>\n      <param name=\"maxLimit\">The limit at the right end of the slider.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.MinMaxSlider(UnityEngine.Rect,System.String,System.Single&amp;,System.Single&amp;,System.Single,System.Single)\">\n      <summary>\n        <para>Make a special slider the user can use to specify a range between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"minValue\">The lower value of the range the slider shows, passed by reference.</param>\n      <param name=\"maxValue\">The upper value at the range the slider shows, passed by reference.</param>\n      <param name=\"minLimit\">The limit at the left end of the slider.</param>\n      <param name=\"maxLimit\">The limit at the right end of the slider.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.MinMaxSlider(UnityEngine.Rect,UnityEngine.GUIContent,System.Single&amp;,System.Single&amp;,System.Single,System.Single)\">\n      <summary>\n        <para>Make a special slider the user can use to specify a range between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"minValue\">The lower value of the range the slider shows, passed by reference.</param>\n      <param name=\"maxValue\">The upper value at the range the slider shows, passed by reference.</param>\n      <param name=\"minLimit\">The limit at the left end of the slider.</param>\n      <param name=\"maxLimit\">The limit at the right end of the slider.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.MultiFloatField(UnityEngine.Rect,UnityEngine.GUIContent[],System.Single[])\">\n      <summary>\n        <para>Make a multi-control with text fields for entering multiple floats in the same line.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the float field.</param>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"subLabels\">Array with small labels to show in front of each float field. There is room for one letter per field only.</param>\n      <param name=\"values\">Array with the values to edit.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.MultiFloatField(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.GUIContent[],System.Single[])\">\n      <summary>\n        <para>Make a multi-control with text fields for entering multiple floats in the same line.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the float field.</param>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"subLabels\">Array with small labels to show in front of each float field. There is room for one letter per field only.</param>\n      <param name=\"values\">Array with the values to edit.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.MultiIntField(UnityEngine.Rect,UnityEngine.GUIContent[],System.Int32[])\">\n      <summary>\n        <para>Make a multi-control with text fields for entering multiple integers in the same line.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the integer field.</param>\n      <param name=\"subLabels\">Array with small labels to show in front of each int field. There is room for one letter per field only.</param>\n      <param name=\"values\">Array with the values to edit.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.MultiPropertyField(UnityEngine.Rect,UnityEngine.GUIContent[],UnityEditor.SerializedProperty,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a multi-control with several property fields in the same line.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the multi-property field.</param>\n      <param name=\"valuesIterator\">The SerializedProperty of the first property to make a control for.</param>\n      <param name=\"label\">Optional label to use. If not specified the label of the property itself is used. Use GUIContent.none to not display a label at all.</param>\n      <param name=\"subLabels\">Array with small labels to show in front of each float field. There is room for one letter per field only.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.MultiPropertyField(UnityEngine.Rect,UnityEngine.GUIContent[],UnityEditor.SerializedProperty)\">\n      <summary>\n        <para>Make a multi-control with several property fields in the same line.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the multi-property field.</param>\n      <param name=\"valuesIterator\">The SerializedProperty of the first property to make a control for.</param>\n      <param name=\"label\">Optional label to use. If not specified the label of the property itself is used. Use GUIContent.none to not display a label at all.</param>\n      <param name=\"subLabels\">Array with small labels to show in front of each float field. There is room for one letter per field only.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ObjectField(UnityEngine.Rect,UnityEngine.Object,System.Type)\">\n      <summary>\n        <para>Make an object field. You can assign objects either by drag and drop objects or by selecting an object using the Object Picker.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"obj\">The object the field shows.</param>\n      <param name=\"objType\">The type of the objects that can be assigned.</param>\n      <param name=\"allowSceneObjects\">Allow assigning scene objects. See Description for more info.</param>\n      <returns>\n        <para>The object that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ObjectField(UnityEngine.Rect,System.String,UnityEngine.Object,System.Type)\">\n      <summary>\n        <para>Make an object field. You can assign objects either by drag and drop objects or by selecting an object using the Object Picker.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"obj\">The object the field shows.</param>\n      <param name=\"objType\">The type of the objects that can be assigned.</param>\n      <param name=\"allowSceneObjects\">Allow assigning scene objects. See Description for more info.</param>\n      <returns>\n        <para>The object that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ObjectField(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.Object,System.Type)\">\n      <summary>\n        <para>Make an object field. You can assign objects either by drag and drop objects or by selecting an object using the Object Picker.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"obj\">The object the field shows.</param>\n      <param name=\"objType\">The type of the objects that can be assigned.</param>\n      <param name=\"allowSceneObjects\">Allow assigning scene objects. See Description for more info.</param>\n      <returns>\n        <para>The object that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ObjectField(UnityEngine.Rect,UnityEngine.Object,System.Type,System.Boolean)\">\n      <summary>\n        <para>Make an object field. You can assign objects either by drag and drop objects or by selecting an object using the Object Picker.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"obj\">The object the field shows.</param>\n      <param name=\"objType\">The type of the objects that can be assigned.</param>\n      <param name=\"allowSceneObjects\">Allow assigning scene objects. See Description for more info.</param>\n      <returns>\n        <para>The object that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ObjectField(UnityEngine.Rect,System.String,UnityEngine.Object,System.Type,System.Boolean)\">\n      <summary>\n        <para>Make an object field. You can assign objects either by drag and drop objects or by selecting an object using the Object Picker.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"obj\">The object the field shows.</param>\n      <param name=\"objType\">The type of the objects that can be assigned.</param>\n      <param name=\"allowSceneObjects\">Allow assigning scene objects. See Description for more info.</param>\n      <returns>\n        <para>The object that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ObjectField(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.Object,System.Type,System.Boolean)\">\n      <summary>\n        <para>Make an object field. You can assign objects either by drag and drop objects or by selecting an object using the Object Picker.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"obj\">The object the field shows.</param>\n      <param name=\"objType\">The type of the objects that can be assigned.</param>\n      <param name=\"allowSceneObjects\">Allow assigning scene objects. See Description for more info.</param>\n      <returns>\n        <para>The object that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ObjectField(UnityEngine.Rect,UnityEditor.SerializedProperty)\">\n      <summary>\n        <para>Make an object field. You can assign objects either by drag and drop objects or by selecting an object using the Object Picker.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"property\">The object reference property the field shows.</param>\n      <param name=\"objType\">The type of the objects that can be assigned.</param>\n      <param name=\"label\">Optional label to display in front of the field. Pass GUIContent.none to hide the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ObjectField(UnityEngine.Rect,UnityEditor.SerializedProperty,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make an object field. You can assign objects either by drag and drop objects or by selecting an object using the Object Picker.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"property\">The object reference property the field shows.</param>\n      <param name=\"objType\">The type of the objects that can be assigned.</param>\n      <param name=\"label\">Optional label to display in front of the field. Pass GUIContent.none to hide the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ObjectField(UnityEngine.Rect,UnityEditor.SerializedProperty,System.Type)\">\n      <summary>\n        <para>Make an object field. You can assign objects either by drag and drop objects or by selecting an object using the Object Picker.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"property\">The object reference property the field shows.</param>\n      <param name=\"objType\">The type of the objects that can be assigned.</param>\n      <param name=\"label\">Optional label to display in front of the field. Pass GUIContent.none to hide the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ObjectField(UnityEngine.Rect,UnityEditor.SerializedProperty,System.Type,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make an object field. You can assign objects either by drag and drop objects or by selecting an object using the Object Picker.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"property\">The object reference property the field shows.</param>\n      <param name=\"objType\">The type of the objects that can be assigned.</param>\n      <param name=\"label\">Optional label to display in front of the field. Pass GUIContent.none to hide the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.PasswordField(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the password field.</param>\n      <param name=\"label\">Optional label to display in front of the password field.</param>\n      <param name=\"password\">The password to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The password entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.PasswordField(UnityEngine.Rect,System.String,System.String)\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the password field.</param>\n      <param name=\"label\">Optional label to display in front of the password field.</param>\n      <param name=\"password\">The password to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The password entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.PasswordField(UnityEngine.Rect,UnityEngine.GUIContent,System.String)\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the password field.</param>\n      <param name=\"label\">Optional label to display in front of the password field.</param>\n      <param name=\"password\">The password to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The password entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.PasswordField(UnityEngine.Rect,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the password field.</param>\n      <param name=\"label\">Optional label to display in front of the password field.</param>\n      <param name=\"password\">The password to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The password entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.PasswordField(UnityEngine.Rect,System.String,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the password field.</param>\n      <param name=\"label\">Optional label to display in front of the password field.</param>\n      <param name=\"password\">The password to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The password entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.PasswordField(UnityEngine.Rect,UnityEngine.GUIContent,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the password field.</param>\n      <param name=\"label\">Optional label to display in front of the password field.</param>\n      <param name=\"password\">The password to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The password entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Popup(UnityEngine.Rect,System.Int32,System.String[])\">\n      <summary>\n        <para>Make a generic popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedIndex\">The index of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the options shown in the popup.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The index of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Popup(UnityEngine.Rect,System.Int32,UnityEngine.GUIContent[])\">\n      <summary>\n        <para>Make a generic popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedIndex\">The index of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the options shown in the popup.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The index of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Popup(UnityEngine.Rect,System.String,System.Int32,System.String[])\">\n      <summary>\n        <para>Make a generic popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedIndex\">The index of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the options shown in the popup.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The index of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Popup(UnityEngine.Rect,UnityEngine.GUIContent,System.Int32,UnityEngine.GUIContent[])\">\n      <summary>\n        <para>Make a generic popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedIndex\">The index of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the options shown in the popup.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The index of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Popup(UnityEngine.Rect,System.Int32,System.String[],UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a generic popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedIndex\">The index of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the options shown in the popup.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The index of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Popup(UnityEngine.Rect,System.Int32,UnityEngine.GUIContent[],UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a generic popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedIndex\">The index of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the options shown in the popup.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The index of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Popup(UnityEngine.Rect,System.String,System.Int32,System.String[],UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a generic popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedIndex\">The index of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the options shown in the popup.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The index of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Popup(UnityEngine.Rect,UnityEngine.GUIContent,System.Int32,UnityEngine.GUIContent[],UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a generic popup selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedIndex\">The index of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the options shown in the popup.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The index of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.PrefixLabel(UnityEngine.Rect,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a label in front of some control.</para>\n      </summary>\n      <param name=\"totalPosition\">Rectangle on the screen to use in total for both the label and the control.</param>\n      <param name=\"id\">The unique ID of the control. If none specified, the ID of the following control is used.</param>\n      <param name=\"label\">Label to show in front of the control.</param>\n      <param name=\"style\">Style to use for the label.</param>\n      <returns>\n        <para>Rectangle on the screen to use just for the control itself.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.PrefixLabel(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label in front of some control.</para>\n      </summary>\n      <param name=\"totalPosition\">Rectangle on the screen to use in total for both the label and the control.</param>\n      <param name=\"id\">The unique ID of the control. If none specified, the ID of the following control is used.</param>\n      <param name=\"label\">Label to show in front of the control.</param>\n      <param name=\"style\">Style to use for the label.</param>\n      <returns>\n        <para>Rectangle on the screen to use just for the control itself.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.PrefixLabel(UnityEngine.Rect,System.Int32,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a label in front of some control.</para>\n      </summary>\n      <param name=\"totalPosition\">Rectangle on the screen to use in total for both the label and the control.</param>\n      <param name=\"id\">The unique ID of the control. If none specified, the ID of the following control is used.</param>\n      <param name=\"label\">Label to show in front of the control.</param>\n      <param name=\"style\">Style to use for the label.</param>\n      <returns>\n        <para>Rectangle on the screen to use just for the control itself.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.PrefixLabel(UnityEngine.Rect,System.Int32,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label in front of some control.</para>\n      </summary>\n      <param name=\"totalPosition\">Rectangle on the screen to use in total for both the label and the control.</param>\n      <param name=\"id\">The unique ID of the control. If none specified, the ID of the following control is used.</param>\n      <param name=\"label\">Label to show in front of the control.</param>\n      <param name=\"style\">Style to use for the label.</param>\n      <returns>\n        <para>Rectangle on the screen to use just for the control itself.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ProgressBar(UnityEngine.Rect,System.Single,System.String)\">\n      <summary>\n        <para>Make a progress bar.</para>\n      </summary>\n      <param name=\"totalPosition\">Rectangle on the screen to use in total for both the control.</param>\n      <param name=\"value\">Value that is shown.</param>\n      <param name=\"position\"></param>\n      <param name=\"text\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.PropertyField(UnityEngine.Rect,UnityEditor.SerializedProperty,System.Boolean)\">\n      <summary>\n        <para>Use this to make a field for a SerializedProperty in the Editor.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the property field.</param>\n      <param name=\"property\">The SerializedProperty to make a field for.</param>\n      <param name=\"label\">Optional label to use. If not specified the label of the property itself is used. Use GUIContent.none to not display a label at all.</param>\n      <param name=\"includeChildren\">If true the property including children is drawn; otherwise only the control itself (such as only a foldout but nothing below it).</param>\n      <returns>\n        <para>True if the property has children and is expanded and includeChildren was set to false; otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.PropertyField(UnityEngine.Rect,UnityEditor.SerializedProperty,UnityEngine.GUIContent,System.Boolean)\">\n      <summary>\n        <para>Use this to make a field for a SerializedProperty in the Editor.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the property field.</param>\n      <param name=\"property\">The SerializedProperty to make a field for.</param>\n      <param name=\"label\">Optional label to use. If not specified the label of the property itself is used. Use GUIContent.none to not display a label at all.</param>\n      <param name=\"includeChildren\">If true the property including children is drawn; otherwise only the control itself (such as only a foldout but nothing below it).</param>\n      <returns>\n        <para>True if the property has children and is expanded and includeChildren was set to false; otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.EditorGUI.PropertyScope\">\n      <summary>\n        <para>Create a Property wrapper, useful for making regular GUI controls work with SerializedProperty.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUI.PropertyScope.content\">\n      <summary>\n        <para>The actual label to use for the control.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.PropertyScope.#ctor(UnityEngine.Rect,UnityEngine.GUIContent,UnityEditor.SerializedProperty)\">\n      <summary>\n        <para>Create a new PropertyScope and begin the corresponding property.</para>\n      </summary>\n      <param name=\"totalPosition\">Rectangle on the screen to use for the control, including label if applicable.</param>\n      <param name=\"label\">Label in front of the slider. Use null to use the name from the SerializedProperty. Use GUIContent.none to not display a label.</param>\n      <param name=\"property\">The SerializedProperty to use for the control.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.RectField(UnityEngine.Rect,UnityEngine.Rect)\">\n      <summary>\n        <para>Make an X, Y, W &amp; H field for entering a Rect.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.RectField(UnityEngine.Rect,System.String,UnityEngine.Rect)\">\n      <summary>\n        <para>Make an X, Y, W &amp; H field for entering a Rect.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.RectField(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.Rect)\">\n      <summary>\n        <para>Make an X, Y, W &amp; H field for entering a Rect.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.RectField\">\n      <summary>\n        <para>Make an X, Y, W &amp; H for Rect using SerializedProperty (not public).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.RectIntField(UnityEngine.Rect,UnityEngine.RectInt)\">\n      <summary>\n        <para>Make an X, Y, W &amp; H field for entering a RectInt.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.RectIntField(UnityEngine.Rect,System.String,UnityEngine.RectInt)\">\n      <summary>\n        <para>Make an X, Y, W &amp; H field for entering a RectInt.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.RectIntField(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.RectInt)\">\n      <summary>\n        <para>Make an X, Y, W &amp; H field for entering a RectInt.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.SelectableLabel(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>Make a selectable label field. (Useful for showing read-only info that can be copy-pasted.)</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the label.</param>\n      <param name=\"text\">The text to show.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.SelectableLabel(UnityEngine.Rect,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a selectable label field. (Useful for showing read-only info that can be copy-pasted.)</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the label.</param>\n      <param name=\"text\">The text to show.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Slider(UnityEngine.Rect,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Make a slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Slider(UnityEngine.Rect,System.String,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Make a slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Slider(UnityEngine.Rect,UnityEngine.GUIContent,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Make a slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Slider(UnityEngine.Rect,UnityEditor.SerializedProperty,System.Single,System.Single)\">\n      <summary>\n        <para>Make a slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"property\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Slider(UnityEngine.Rect,UnityEditor.SerializedProperty,System.Single,System.Single,System.String)\">\n      <summary>\n        <para>Make a slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"property\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Slider(UnityEngine.Rect,UnityEditor.SerializedProperty,System.Single,System.Single,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"property\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.TagField(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>Make a tag selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"tag\">The tag the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The tag selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.TagField(UnityEngine.Rect,System.String,System.String)\">\n      <summary>\n        <para>Make a tag selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"tag\">The tag the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The tag selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.TagField(UnityEngine.Rect,UnityEngine.GUIContent,System.String)\">\n      <summary>\n        <para>Make a tag selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"tag\">The tag the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The tag selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.TagField(UnityEngine.Rect,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a tag selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"tag\">The tag the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The tag selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.TagField(UnityEngine.Rect,System.String,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a tag selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"tag\">The tag the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The tag selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.TagField(UnityEngine.Rect,UnityEngine.GUIContent,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a tag selection field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"tag\">The tag the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The tag selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.TextArea(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>Make a text area.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The text entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.TextArea(UnityEngine.Rect,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text area.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The text entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.TextField(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>Make a text field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"label\">Optional label to display in front of the text field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The text entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.TextField(UnityEngine.Rect,System.String,System.String)\">\n      <summary>\n        <para>Make a text field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"label\">Optional label to display in front of the text field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The text entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.TextField(UnityEngine.Rect,UnityEngine.GUIContent,System.String)\">\n      <summary>\n        <para>Make a text field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"label\">Optional label to display in front of the text field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The text entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.TextField(UnityEngine.Rect,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"label\">Optional label to display in front of the text field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The text entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.TextField(UnityEngine.Rect,System.String,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"label\">Optional label to display in front of the text field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The text entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.TextField(UnityEngine.Rect,UnityEngine.GUIContent,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"label\">Optional label to display in front of the text field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The text entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Toggle(UnityEngine.Rect,System.Boolean)\">\n      <summary>\n        <para>Make a toggle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the toggle.</param>\n      <param name=\"label\">Optional label in front of the toggle.</param>\n      <param name=\"value\">The shown state of the toggle.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The selected state of the toggle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Toggle(UnityEngine.Rect,System.String,System.Boolean)\">\n      <summary>\n        <para>Make a toggle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the toggle.</param>\n      <param name=\"label\">Optional label in front of the toggle.</param>\n      <param name=\"value\">The shown state of the toggle.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The selected state of the toggle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Toggle(UnityEngine.Rect,System.Boolean,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a toggle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the toggle.</param>\n      <param name=\"label\">Optional label in front of the toggle.</param>\n      <param name=\"value\">The shown state of the toggle.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The selected state of the toggle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Toggle(UnityEngine.Rect,System.String,System.Boolean,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a toggle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the toggle.</param>\n      <param name=\"label\">Optional label in front of the toggle.</param>\n      <param name=\"value\">The shown state of the toggle.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The selected state of the toggle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Toggle(UnityEngine.Rect,UnityEngine.GUIContent,System.Boolean)\">\n      <summary>\n        <para>Make a toggle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the toggle.</param>\n      <param name=\"label\">Optional label in front of the toggle.</param>\n      <param name=\"value\">The shown state of the toggle.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The selected state of the toggle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Toggle(UnityEngine.Rect,UnityEngine.GUIContent,System.Boolean,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a toggle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the toggle.</param>\n      <param name=\"label\">Optional label in front of the toggle.</param>\n      <param name=\"value\">The shown state of the toggle.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <returns>\n        <para>The selected state of the toggle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ToggleLeft(UnityEngine.Rect,System.String,System.Boolean)\">\n      <summary>\n        <para>Make a toggle field where the toggle is to the left and the label immediately to the right of it.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the toggle.</param>\n      <param name=\"label\">Label to display next to the toggle.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"labelStyle\">Optional GUIStyle to use for the label.</param>\n      <returns>\n        <para>The value set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ToggleLeft(UnityEngine.Rect,System.String,System.Boolean,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a toggle field where the toggle is to the left and the label immediately to the right of it.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the toggle.</param>\n      <param name=\"label\">Label to display next to the toggle.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"labelStyle\">Optional GUIStyle to use for the label.</param>\n      <returns>\n        <para>The value set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ToggleLeft(UnityEngine.Rect,UnityEngine.GUIContent,System.Boolean)\">\n      <summary>\n        <para>Make a toggle field where the toggle is to the left and the label immediately to the right of it.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the toggle.</param>\n      <param name=\"label\">Label to display next to the toggle.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"labelStyle\">Optional GUIStyle to use for the label.</param>\n      <returns>\n        <para>The value set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.ToggleLeft(UnityEngine.Rect,UnityEngine.GUIContent,System.Boolean,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a toggle field where the toggle is to the left and the label immediately to the right of it.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the toggle.</param>\n      <param name=\"label\">Label to display next to the toggle.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"labelStyle\">Optional GUIStyle to use for the label.</param>\n      <returns>\n        <para>The value set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Vector2Field(UnityEngine.Rect,System.String,UnityEngine.Vector2)\">\n      <summary>\n        <para>Make an X &amp; Y field for entering a Vector2.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Vector2Field(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.Vector2)\">\n      <summary>\n        <para>Make an X &amp; Y field for entering a Vector2.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Vector2IntField(UnityEngine.Rect,System.String,UnityEngine.Vector2Int)\">\n      <summary>\n        <para>Make an X &amp; Y integer field for entering a Vector2Int.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Vector2IntField(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.Vector2Int)\">\n      <summary>\n        <para>Make an X &amp; Y integer field for entering a Vector2Int.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Vector3Field(UnityEngine.Rect,System.String,UnityEngine.Vector3)\">\n      <summary>\n        <para>Make an X, Y &amp; Z field for entering a Vector3.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Vector3Field(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.Vector3)\">\n      <summary>\n        <para>Make an X, Y &amp; Z field for entering a Vector3.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Vector3IntField(UnityEngine.Rect,System.String,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Make an X, Y &amp; Z integer field for entering a Vector3Int.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Vector3IntField(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Make an X, Y &amp; Z integer field for entering a Vector3Int.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUI.Vector4Field(UnityEngine.Rect,System.String,UnityEngine.Vector4)\">\n      <summary>\n        <para>Make an X, Y, Z &amp; W field for entering a Vector4.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the field.</param>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.EditorGUILayout\">\n      <summary>\n        <para>Auto-layouted version of EditorGUI.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BeginFadeGroup(System.Single)\">\n      <summary>\n        <para>Begins a group that can be be hidden/shown and the transition will be animated.</para>\n      </summary>\n      <param name=\"value\">A value between 0 and 1, 0 being hidden, and 1 being fully visible.</param>\n      <returns>\n        <para>If the group is visible or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BeginHorizontal(UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin a horizontal group and get its rect back.</para>\n      </summary>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout\n        properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BeginHorizontal(UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin a horizontal group and get its rect back.</para>\n      </summary>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout\n        properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BeginScrollView(UnityEngine.Vector2,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin an automatically layouted scrollview.</para>\n      </summary>\n      <param name=\"scrollPosition\">The position to use display.</param>\n      <param name=\"alwayShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwayShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when content inside the ScrollView is taller than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"alwaysShowHorizontal\"></param>\n      <param name=\"alwaysShowVertical\"></param>\n      <param name=\"background\"></param>\n      <returns>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BeginScrollView(UnityEngine.Vector2,System.Boolean,System.Boolean,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin an automatically layouted scrollview.</para>\n      </summary>\n      <param name=\"scrollPosition\">The position to use display.</param>\n      <param name=\"alwayShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwayShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when content inside the ScrollView is taller than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"alwaysShowHorizontal\"></param>\n      <param name=\"alwaysShowVertical\"></param>\n      <param name=\"background\"></param>\n      <returns>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BeginScrollView(UnityEngine.Vector2,UnityEngine.GUIStyle,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin an automatically layouted scrollview.</para>\n      </summary>\n      <param name=\"scrollPosition\">The position to use display.</param>\n      <param name=\"alwayShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwayShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when content inside the ScrollView is taller than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"alwaysShowHorizontal\"></param>\n      <param name=\"alwaysShowVertical\"></param>\n      <param name=\"background\"></param>\n      <returns>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BeginScrollView\">\n      <summary>\n        <para>Begin an automatically layouted scrollview.</para>\n      </summary>\n      <param name=\"scrollPosition\">The position to use display.</param>\n      <param name=\"alwayShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwayShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when content inside the ScrollView is taller than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"alwaysShowHorizontal\"></param>\n      <param name=\"alwaysShowVertical\"></param>\n      <param name=\"background\"></param>\n      <returns>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BeginScrollView(UnityEngine.Vector2,System.Boolean,System.Boolean,UnityEngine.GUIStyle,UnityEngine.GUIStyle,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin an automatically layouted scrollview.</para>\n      </summary>\n      <param name=\"scrollPosition\">The position to use display.</param>\n      <param name=\"alwayShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwayShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when content inside the ScrollView is taller than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"alwaysShowHorizontal\"></param>\n      <param name=\"alwaysShowVertical\"></param>\n      <param name=\"background\"></param>\n      <returns>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BeginToggleGroup(System.String,System.Boolean)\">\n      <summary>\n        <para>Begin a vertical group with a toggle to enable or disable all the controls within at once.</para>\n      </summary>\n      <param name=\"label\">Label to show above the toggled controls.</param>\n      <param name=\"toggle\">Enabled state of the toggle group.</param>\n      <returns>\n        <para>The enabled state selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BeginToggleGroup(UnityEngine.GUIContent,System.Boolean)\">\n      <summary>\n        <para>Begin a vertical group with a toggle to enable or disable all the controls within at once.</para>\n      </summary>\n      <param name=\"label\">Label to show above the toggled controls.</param>\n      <param name=\"toggle\">Enabled state of the toggle group.</param>\n      <returns>\n        <para>The enabled state selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BeginVertical(UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin a vertical group and get its rect back.</para>\n      </summary>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties.\n        Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BeginVertical(UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin a vertical group and get its rect back.</para>\n      </summary>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties.\n        Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BeginVertical\">\n      <summary>\n        <para>Begin a vertical group and get its rect back.</para>\n      </summary>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties.\n        Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BoundsField(UnityEngine.Bounds,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make Center &amp; Extents field for entering a Bounds.</para>\n      </summary>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BoundsField(System.String,UnityEngine.Bounds,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make Center &amp; Extents field for entering a Bounds.</para>\n      </summary>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BoundsField(UnityEngine.GUIContent,UnityEngine.Bounds,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make Center &amp; Extents field for entering a Bounds.</para>\n      </summary>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BoundsIntField(UnityEngine.BoundsInt,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make Position &amp; Size field for entering a BoundsInt.</para>\n      </summary>\n      <param name=\"label\">Make Position &amp; Size field for entering a Bounds.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BoundsIntField(System.String,UnityEngine.BoundsInt,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make Position &amp; Size field for entering a BoundsInt.</para>\n      </summary>\n      <param name=\"label\">Make Position &amp; Size field for entering a Bounds.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.BoundsIntField(UnityEngine.GUIContent,UnityEngine.BoundsInt,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make Position &amp; Size field for entering a BoundsInt.</para>\n      </summary>\n      <param name=\"label\">Make Position &amp; Size field for entering a Bounds.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ColorField(UnityEngine.Color,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for selecting a Color.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The color to edit.</param>\n      <param name=\"showEyedropper\">If true, the color picker should show the eyedropper control. If false, don't show it.</param>\n      <param name=\"showAlpha\">If true, allow the user to set an alpha value for the color. If false, hide the alpha component.</param>\n      <param name=\"hdr\">If true, treat the color as an HDR value. If false, treat it as a standard LDR value.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"hdrConfig\"></param>\n      <returns>\n        <para>The color selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ColorField(System.String,UnityEngine.Color,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for selecting a Color.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The color to edit.</param>\n      <param name=\"showEyedropper\">If true, the color picker should show the eyedropper control. If false, don't show it.</param>\n      <param name=\"showAlpha\">If true, allow the user to set an alpha value for the color. If false, hide the alpha component.</param>\n      <param name=\"hdr\">If true, treat the color as an HDR value. If false, treat it as a standard LDR value.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"hdrConfig\"></param>\n      <returns>\n        <para>The color selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ColorField(UnityEngine.GUIContent,UnityEngine.Color,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for selecting a Color.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The color to edit.</param>\n      <param name=\"showEyedropper\">If true, the color picker should show the eyedropper control. If false, don't show it.</param>\n      <param name=\"showAlpha\">If true, allow the user to set an alpha value for the color. If false, hide the alpha component.</param>\n      <param name=\"hdr\">If true, treat the color as an HDR value. If false, treat it as a standard LDR value.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"hdrConfig\"></param>\n      <returns>\n        <para>The color selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ColorField(UnityEngine.GUIContent,UnityEngine.Color,System.Boolean,System.Boolean,System.Boolean,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for selecting a Color.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The color to edit.</param>\n      <param name=\"showEyedropper\">If true, the color picker should show the eyedropper control. If false, don't show it.</param>\n      <param name=\"showAlpha\">If true, allow the user to set an alpha value for the color. If false, hide the alpha component.</param>\n      <param name=\"hdr\">If true, treat the color as an HDR value. If false, treat it as a standard LDR value.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"hdrConfig\"></param>\n      <returns>\n        <para>The color selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ColorField(UnityEngine.GUIContent,UnityEngine.Color,System.Boolean,System.Boolean,System.Boolean,UnityEditor.ColorPickerHDRConfig,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for selecting a Color.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The color to edit.</param>\n      <param name=\"showEyedropper\">If true, the color picker should show the eyedropper control. If false, don't show it.</param>\n      <param name=\"showAlpha\">If true, allow the user to set an alpha value for the color. If false, hide the alpha component.</param>\n      <param name=\"hdr\">If true, treat the color as an HDR value. If false, treat it as a standard LDR value.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"hdrConfig\"></param>\n      <returns>\n        <para>The color selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.CurveField(UnityEngine.AnimationCurve,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for editing an AnimationCurve.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The curve to edit.</param>\n      <param name=\"color\">The color to show the curve with.</param>\n      <param name=\"ranges\">Optional rectangle that the curve is restrained within.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The curve edited by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.CurveField(System.String,UnityEngine.AnimationCurve,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for editing an AnimationCurve.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The curve to edit.</param>\n      <param name=\"color\">The color to show the curve with.</param>\n      <param name=\"ranges\">Optional rectangle that the curve is restrained within.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The curve edited by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.CurveField(UnityEngine.GUIContent,UnityEngine.AnimationCurve,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for editing an AnimationCurve.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The curve to edit.</param>\n      <param name=\"color\">The color to show the curve with.</param>\n      <param name=\"ranges\">Optional rectangle that the curve is restrained within.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The curve edited by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.CurveField(UnityEngine.AnimationCurve,UnityEngine.Color,UnityEngine.Rect,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for editing an AnimationCurve.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The curve to edit.</param>\n      <param name=\"color\">The color to show the curve with.</param>\n      <param name=\"ranges\">Optional rectangle that the curve is restrained within.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The curve edited by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.CurveField(System.String,UnityEngine.AnimationCurve,UnityEngine.Color,UnityEngine.Rect,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for editing an AnimationCurve.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The curve to edit.</param>\n      <param name=\"color\">The color to show the curve with.</param>\n      <param name=\"ranges\">Optional rectangle that the curve is restrained within.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The curve edited by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.CurveField(UnityEngine.GUIContent,UnityEngine.AnimationCurve,UnityEngine.Color,UnityEngine.Rect,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for editing an AnimationCurve.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the field.</param>\n      <param name=\"value\">The curve to edit.</param>\n      <param name=\"color\">The color to show the curve with.</param>\n      <param name=\"ranges\">Optional rectangle that the curve is restrained within.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The curve edited by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.CurveField(UnityEditor.SerializedProperty,UnityEngine.Color,UnityEngine.Rect,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for editing an AnimationCurve.</para>\n      </summary>\n      <param name=\"property\">The curve to edit.</param>\n      <param name=\"color\">The color to show the curve with.</param>\n      <param name=\"ranges\">Optional rectangle that the curve is restrained within.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"label\">Optional label to display in front of the field. Pass [[GUIContent.none] to hide the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.CurveField(UnityEditor.SerializedProperty,UnityEngine.Color,UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for editing an AnimationCurve.</para>\n      </summary>\n      <param name=\"property\">The curve to edit.</param>\n      <param name=\"color\">The color to show the curve with.</param>\n      <param name=\"ranges\">Optional rectangle that the curve is restrained within.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"label\">Optional label to display in front of the field. Pass [[GUIContent.none] to hide the label.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedDoubleField(System.Double,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering doubles.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the double field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">\n          An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\n          See Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\n          GUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.\n        </param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the double field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedDoubleField(System.Double,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering doubles.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the double field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">\n          An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\n          See Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\n          GUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.\n        </param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the double field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedDoubleField(System.String,System.Double,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering doubles.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the double field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">\n          An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\n          See Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\n          GUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.\n        </param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the double field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedDoubleField(System.String,System.Double,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering doubles.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the double field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">\n          An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\n          See Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\n          GUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.\n        </param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the double field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedDoubleField(UnityEngine.GUIContent,System.Double,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering doubles.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the double field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">\n          An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\n          See Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\n          GUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.\n        </param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the double field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedDoubleField(UnityEngine.GUIContent,System.Double,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering doubles.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the double field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">\n          An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\n          See Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\n          GUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.\n        </param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the double field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedDoubleField\">\n      <summary>\n        <para>Make a delayed text field for entering doubles.</para>\n      </summary>\n      <param name=\"property\">The double property to edit.</param>\n      <param name=\"label\">Optional label to display in front of the double field. Pass GUIContent.none to hide label.</param>\n      <param name=\"options\">\n          An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\n          See Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\n          GUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.\n        </param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedDoubleField\">\n      <summary>\n        <para>Make a delayed text field for entering doubles.</para>\n      </summary>\n      <param name=\"property\">The double property to edit.</param>\n      <param name=\"label\">Optional label to display in front of the double field. Pass GUIContent.none to hide label.</param>\n      <param name=\"options\">\n          An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\n          See Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\n          GUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.\n        </param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedFloatField(System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering floats.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the float field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedFloatField(System.Single,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering floats.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the float field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedFloatField(System.String,System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering floats.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the float field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedFloatField(System.String,System.Single,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering floats.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the float field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedFloatField(UnityEngine.GUIContent,System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering floats.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the float field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedFloatField(UnityEngine.GUIContent,System.Single,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering floats.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the float field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedFloatField(UnityEditor.SerializedProperty,UnityEngine.GUIContent,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering floats.</para>\n      </summary>\n      <param name=\"property\">The float property to edit.</param>\n      <param name=\"label\">Optional label to display in front of the float field. Pass GUIContent.none to hide label.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedFloatField(UnityEditor.SerializedProperty,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering floats.</para>\n      </summary>\n      <param name=\"property\">The float property to edit.</param>\n      <param name=\"label\">Optional label to display in front of the float field. Pass GUIContent.none to hide label.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedIntField(System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering integers.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the int field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedIntField(System.Int32,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering integers.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the int field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedIntField(System.String,System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering integers.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the int field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedIntField(System.String,System.Int32,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering integers.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the int field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedIntField(UnityEngine.GUIContent,System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering integers.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the int field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedIntField(UnityEngine.GUIContent,System.Int32,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering integers.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the int field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedIntField(UnityEditor.SerializedProperty,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering integers.</para>\n      </summary>\n      <param name=\"property\">The int property to edit.</param>\n      <param name=\"label\">Optional label to display in front of the int field. Pass GUIContent.none to hide label.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedIntField(UnityEditor.SerializedProperty,UnityEngine.GUIContent,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field for entering integers.</para>\n      </summary>\n      <param name=\"property\">The int property to edit.</param>\n      <param name=\"label\">Optional label to display in front of the int field. Pass GUIContent.none to hide label.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedTextField(System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the text field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedTextField(System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the text field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedTextField(System.String,System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the text field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedTextField(System.String,System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the text field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedTextField(UnityEngine.GUIContent,System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the text field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedTextField(UnityEngine.GUIContent,System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user. Note that the return value will not change until the user has pressed enter or focus is moved away from the text field.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedTextField(UnityEditor.SerializedProperty,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field.</para>\n      </summary>\n      <param name=\"property\">The text property to edit.</param>\n      <param name=\"label\">Optional label to display in front of the int field. Pass GUIContent.none to hide label.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DelayedTextField(UnityEditor.SerializedProperty,UnityEngine.GUIContent,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a delayed text field.</para>\n      </summary>\n      <param name=\"property\">The text property to edit.</param>\n      <param name=\"label\">Optional label to display in front of the int field. Pass GUIContent.none to hide label.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DoubleField(System.Double,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering double values.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the double field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DoubleField(System.Double,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering double values.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the double field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DoubleField(System.String,System.Double,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering double values.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the double field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DoubleField(System.String,System.Double,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering double values.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the double field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DoubleField(UnityEngine.GUIContent,System.Double,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering double values.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the double field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DoubleField(UnityEngine.GUIContent,System.Double,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering double values.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the double field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DropdownButton(UnityEngine.GUIContent,UnityEngine.FocusType,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a button that reacts to mouse down, for displaying your own dropdown content.</para>\n      </summary>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"focusType\">Whether the button should be selectable by keyboard or not.</param>\n      <param name=\"style\">Optional style to use.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>true when the user clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.DropdownButton(UnityEngine.GUIContent,UnityEngine.FocusType,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a button that reacts to mouse down, for displaying your own dropdown content.</para>\n      </summary>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"focusType\">Whether the button should be selectable by keyboard or not.</param>\n      <param name=\"style\">Optional style to use.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>true when the user clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EndFadeGroup\">\n      <summary>\n        <para>Closes a group started with BeginFadeGroup.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EndHorizontal\">\n      <summary>\n        <para>Close a group started with BeginHorizontal.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EndScrollView\">\n      <summary>\n        <para>Ends a scrollview started with a call to BeginScrollView.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EndToggleGroup\">\n      <summary>\n        <para>Close a group started with BeginToggleGroup.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EndVertical\">\n      <summary>\n        <para>Close a group started with BeginVertical.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumFlagsField(System.Enum,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Displays a menu with an option for every value of the enum type when clicked. An option for the value 0 with name \"Nothing\" and an option for the value ~0 (that is, all bits set) with the name \"Everything\" are always displayed at the top of the menu. The names for the values 0 and ~0 can be overriden by defining these values in the enum type.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the enum flags field.</param>\n      <param name=\"enumValue\">Enum flags value.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The enum flags value modified by the user. This is a selection BitMask where each bit represents an Enum value index. (Note this returned value is not itself an Enum).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumFlagsField(System.Enum,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Displays a menu with an option for every value of the enum type when clicked. An option for the value 0 with name \"Nothing\" and an option for the value ~0 (that is, all bits set) with the name \"Everything\" are always displayed at the top of the menu. The names for the values 0 and ~0 can be overriden by defining these values in the enum type.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the enum flags field.</param>\n      <param name=\"enumValue\">Enum flags value.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The enum flags value modified by the user. This is a selection BitMask where each bit represents an Enum value index. (Note this returned value is not itself an Enum).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumFlagsField(System.String,System.Enum,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Displays a menu with an option for every value of the enum type when clicked. An option for the value 0 with name \"Nothing\" and an option for the value ~0 (that is, all bits set) with the name \"Everything\" are always displayed at the top of the menu. The names for the values 0 and ~0 can be overriden by defining these values in the enum type.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the enum flags field.</param>\n      <param name=\"enumValue\">Enum flags value.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The enum flags value modified by the user. This is a selection BitMask where each bit represents an Enum value index. (Note this returned value is not itself an Enum).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumFlagsField(System.String,System.Enum,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Displays a menu with an option for every value of the enum type when clicked. An option for the value 0 with name \"Nothing\" and an option for the value ~0 (that is, all bits set) with the name \"Everything\" are always displayed at the top of the menu. The names for the values 0 and ~0 can be overriden by defining these values in the enum type.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the enum flags field.</param>\n      <param name=\"enumValue\">Enum flags value.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The enum flags value modified by the user. This is a selection BitMask where each bit represents an Enum value index. (Note this returned value is not itself an Enum).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumFlagsField(UnityEngine.GUIContent,System.Enum,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Displays a menu with an option for every value of the enum type when clicked. An option for the value 0 with name \"Nothing\" and an option for the value ~0 (that is, all bits set) with the name \"Everything\" are always displayed at the top of the menu. The names for the values 0 and ~0 can be overriden by defining these values in the enum type.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the enum flags field.</param>\n      <param name=\"enumValue\">Enum flags value.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The enum flags value modified by the user. This is a selection BitMask where each bit represents an Enum value index. (Note this returned value is not itself an Enum).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumFlagsField(UnityEngine.GUIContent,System.Enum,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Displays a menu with an option for every value of the enum type when clicked. An option for the value 0 with name \"Nothing\" and an option for the value ~0 (that is, all bits set) with the name \"Everything\" are always displayed at the top of the menu. The names for the values 0 and ~0 can be overriden by defining these values in the enum type.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the enum flags field.</param>\n      <param name=\"enumValue\">Enum flags value.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The enum flags value modified by the user. This is a selection BitMask where each bit represents an Enum value index. (Note this returned value is not itself an Enum).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumMaskField(UnityEngine.GUIContent,System.Enum,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUILayout.EnumFlagsField instead.\n\nMake a field for enum based masks.</para>\n      </summary>\n      <param name=\"label\">Prefix label for this field.</param>\n      <param name=\"enumValue\">Enum to use for the flags.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value modified by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumMaskField(System.String,System.Enum,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUILayout.EnumFlagsField instead.\n\nMake a field for enum based masks.</para>\n      </summary>\n      <param name=\"label\">Prefix label for this field.</param>\n      <param name=\"enumValue\">Enum to use for the flags.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value modified by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumMaskField(UnityEngine.GUIContent,System.Enum,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUILayout.EnumFlagsField instead.\n\nMake a field for enum based masks.</para>\n      </summary>\n      <param name=\"label\">Prefix label for this field.</param>\n      <param name=\"enumValue\">Enum to use for the flags.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value modified by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumMaskField(System.String,System.Enum,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUILayout.EnumFlagsField instead.\n\nMake a field for enum based masks.</para>\n      </summary>\n      <param name=\"label\">Prefix label for this field.</param>\n      <param name=\"enumValue\">Enum to use for the flags.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value modified by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumMaskField(System.Enum,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUILayout.EnumFlagsField instead.\n\nMake a field for enum based masks.</para>\n      </summary>\n      <param name=\"label\">Prefix label for this field.</param>\n      <param name=\"enumValue\">Enum to use for the flags.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value modified by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumMaskField(System.Enum,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUILayout.EnumFlagsField instead.\n\nMake a field for enum based masks.</para>\n      </summary>\n      <param name=\"label\">Prefix label for this field.</param>\n      <param name=\"enumValue\">Enum to use for the flags.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value modified by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumMaskPopup(System.String,System.Enum,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUILayout.EnumFlagsField instead.\n\nMake an enum popup selection field for a bitmask.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum options the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">Optional layout options.</param>\n      <returns>\n        <para>The enum options that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumMaskPopup(System.String,System.Enum,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUILayout.EnumFlagsField instead.\n\nMake an enum popup selection field for a bitmask.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum options the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">Optional layout options.</param>\n      <returns>\n        <para>The enum options that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumMaskPopup(UnityEngine.GUIContent,System.Enum,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUILayout.EnumFlagsField instead.\n\nMake an enum popup selection field for a bitmask.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum options the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">Optional layout options.</param>\n      <returns>\n        <para>The enum options that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumMaskPopup(UnityEngine.GUIContent,System.Enum,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>This method is obsolete. Use EditorGUILayout.EnumFlagsField instead.\n\nMake an enum popup selection field for a bitmask.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum options the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">Optional layout options.</param>\n      <returns>\n        <para>The enum options that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumPopup(System.Enum,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an enum popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum option the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The enum option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumPopup(System.Enum,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an enum popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum option the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The enum option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumPopup(System.String,System.Enum,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an enum popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum option the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The enum option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumPopup(System.String,System.Enum,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an enum popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum option the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The enum option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumPopup(UnityEngine.GUIContent,System.Enum,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an enum popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum option the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The enum option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.EnumPopup(UnityEngine.GUIContent,System.Enum,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an enum popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selected\">The enum option the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The enum option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.EditorGUILayout.FadeGroupScope\">\n      <summary>\n        <para>Begins a group that can be be hidden/shown and the transition will be animated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUILayout.FadeGroupScope.visible\">\n      <summary>\n        <para>Whether the group is visible.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.FadeGroupScope.#ctor(System.Single)\">\n      <summary>\n        <para>Create a new FadeGroupScope and begin the corresponding group.</para>\n      </summary>\n      <param name=\"value\">A value between 0 and 1, 0 being hidden, and 1 being fully visible.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.FloatField(System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering float values.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.FloatField(System.Single,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering float values.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.FloatField(System.String,System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering float values.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.FloatField(System.String,System.Single,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering float values.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.FloatField(UnityEngine.GUIContent,System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering float values.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.FloatField(UnityEngine.GUIContent,System.Single,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering float values.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the float field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Foldout(System.Boolean,System.String)\">\n      <summary>\n        <para>Make a label with a foldout arrow to the left of it.</para>\n      </summary>\n      <param name=\"foldout\">The shown foldout state.</param>\n      <param name=\"content\">The label to show.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"toggleOnLabelClick\">Whether to toggle the foldout state when the label is clicked.</param>\n      <returns>\n        <para>The foldout state selected by the user. If true, you should render sub-objects.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Foldout(System.Boolean,System.String,System.Boolean,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label with a foldout arrow to the left of it.</para>\n      </summary>\n      <param name=\"foldout\">The shown foldout state.</param>\n      <param name=\"content\">The label to show.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"toggleOnLabelClick\">Whether to toggle the foldout state when the label is clicked.</param>\n      <returns>\n        <para>The foldout state selected by the user. If true, you should render sub-objects.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Foldout(System.Boolean,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a label with a foldout arrow to the left of it.</para>\n      </summary>\n      <param name=\"foldout\">The shown foldout state.</param>\n      <param name=\"content\">The label to show.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"toggleOnLabelClick\">Whether to toggle the foldout state when the label is clicked.</param>\n      <returns>\n        <para>The foldout state selected by the user. If true, you should render sub-objects.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Foldout(System.Boolean,UnityEngine.GUIContent,System.Boolean,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label with a foldout arrow to the left of it.</para>\n      </summary>\n      <param name=\"foldout\">The shown foldout state.</param>\n      <param name=\"content\">The label to show.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"toggleOnLabelClick\">Whether to toggle the foldout state when the label is clicked.</param>\n      <returns>\n        <para>The foldout state selected by the user. If true, you should render sub-objects.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Foldout(System.Boolean,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label with a foldout arrow to the left of it.</para>\n      </summary>\n      <param name=\"foldout\">The shown foldout state.</param>\n      <param name=\"content\">The label to show.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"toggleOnLabelClick\">Whether to toggle the foldout state when the label is clicked.</param>\n      <returns>\n        <para>The foldout state selected by the user. If true, you should render sub-objects.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Foldout(System.Boolean,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label with a foldout arrow to the left of it.</para>\n      </summary>\n      <param name=\"foldout\">The shown foldout state.</param>\n      <param name=\"content\">The label to show.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"toggleOnLabelClick\">Whether to toggle the foldout state when the label is clicked.</param>\n      <returns>\n        <para>The foldout state selected by the user. If true, you should render sub-objects.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.GetControlRect(UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Get a rect for an Editor control.</para>\n      </summary>\n      <param name=\"hasLabel\">Optional boolean to specify if the control has a label. Default is true.</param>\n      <param name=\"height\">The height in pixels of the control. Default is EditorGUIUtility.singleLineHeight.</param>\n      <param name=\"style\">Optional GUIStyle to use for the control.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.GetControlRect(System.Boolean,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Get a rect for an Editor control.</para>\n      </summary>\n      <param name=\"hasLabel\">Optional boolean to specify if the control has a label. Default is true.</param>\n      <param name=\"height\">The height in pixels of the control. Default is EditorGUIUtility.singleLineHeight.</param>\n      <param name=\"style\">Optional GUIStyle to use for the control.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.GetControlRect(System.Boolean,System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Get a rect for an Editor control.</para>\n      </summary>\n      <param name=\"hasLabel\">Optional boolean to specify if the control has a label. Default is true.</param>\n      <param name=\"height\">The height in pixels of the control. Default is EditorGUIUtility.singleLineHeight.</param>\n      <param name=\"style\">Optional GUIStyle to use for the control.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.GetControlRect(System.Boolean,System.Single,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Get a rect for an Editor control.</para>\n      </summary>\n      <param name=\"hasLabel\">Optional boolean to specify if the control has a label. Default is true.</param>\n      <param name=\"height\">The height in pixels of the control. Default is EditorGUIUtility.singleLineHeight.</param>\n      <param name=\"style\">Optional GUIStyle to use for the control.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.HelpBox(System.String,UnityEditor.MessageType)\">\n      <summary>\n        <para>Make a help box with a message to the user.</para>\n      </summary>\n      <param name=\"message\">The message text.</param>\n      <param name=\"type\">The type of message.</param>\n      <param name=\"wide\">If true, the box will cover the whole width of the window; otherwise it will cover the controls part only.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.HelpBox(System.String,UnityEditor.MessageType,System.Boolean)\">\n      <summary>\n        <para>Make a help box with a message to the user.</para>\n      </summary>\n      <param name=\"message\">The message text.</param>\n      <param name=\"type\">The type of message.</param>\n      <param name=\"wide\">If true, the box will cover the whole width of the window; otherwise it will cover the controls part only.</param>\n    </member>\n    <member name=\"T:UnityEditor.EditorGUILayout.HorizontalScope\">\n      <summary>\n        <para>Disposable helper class for managing BeginHorizontal / EndHorizontal.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUILayout.HorizontalScope.rect\">\n      <summary>\n        <para>The rect of the horizontal group.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.HorizontalScope.#ctor(UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new HorizontalScope and begin the corresponding horizontal group.</para>\n      </summary>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.HorizontalScope.#ctor(UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new HorizontalScope and begin the corresponding horizontal group.</para>\n      </summary>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.InspectorTitlebar(System.Boolean,UnityEngine.Object)\">\n      <summary>\n        <para>Make an inspector-window-like titlebar.</para>\n      </summary>\n      <param name=\"foldout\">The foldout state shown with the arrow.</param>\n      <param name=\"targetObj\">The object (for example a component) or objects that the titlebar is for.</param>\n      <param name=\"targetObjs\"></param>\n      <returns>\n        <para>The foldout state selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.InspectorTitlebar(System.Boolean,UnityEngine.Object[])\">\n      <summary>\n        <para>Make an inspector-window-like titlebar.</para>\n      </summary>\n      <param name=\"foldout\">The foldout state shown with the arrow.</param>\n      <param name=\"targetObj\">The object (for example a component) or objects that the titlebar is for.</param>\n      <param name=\"targetObjs\"></param>\n      <returns>\n        <para>The foldout state selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntField(System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering integers.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntField(System.Int32,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering integers.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntField(System.String,System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering integers.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntField(System.String,System.Int32,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering integers.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntField(UnityEngine.GUIContent,System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering integers.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntField(UnityEngine.GUIContent,System.Int32,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering integers.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the int field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntPopup(System.Int32,System.String[],System.Int32[],UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedValue\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntPopup(System.Int32,System.String[],System.Int32[],UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedValue\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntPopup(System.Int32,UnityEngine.GUIContent[],System.Int32[],UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedValue\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntPopup(System.Int32,UnityEngine.GUIContent[],System.Int32[],UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedValue\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntPopup(System.String,System.Int32,System.String[],System.Int32[],UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedValue\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntPopup(System.String,System.Int32,System.String[],System.Int32[],UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedValue\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntPopup(UnityEngine.GUIContent,System.Int32,UnityEngine.GUIContent[],System.Int32[],UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedValue\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntPopup(UnityEngine.GUIContent,System.Int32,UnityEngine.GUIContent[],System.Int32[],UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedValue\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntPopup(UnityEditor.SerializedProperty,UnityEngine.GUIContent[],System.Int32[],UnityEngine.GUIContent,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"property\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"style\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntPopup(UnityEditor.SerializedProperty,UnityEngine.GUIContent[],System.Int32[],UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"property\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"style\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntPopup(UnityEditor.SerializedProperty,UnityEngine.GUIContent[],System.Int32[],UnityEngine.GUIContent,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an integer popup selection field.</para>\n      </summary>\n      <param name=\"property\">The value of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the displayed options the user can choose from.</param>\n      <param name=\"optionValues\">An array with the values for each option.</param>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"style\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntSlider(System.Int32,System.Int32,System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a slider the user can drag to change an integer value between a min and a max.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntSlider(System.String,System.Int32,System.Int32,System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a slider the user can drag to change an integer value between a min and a max.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntSlider(UnityEngine.GUIContent,System.Int32,System.Int32,System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a slider the user can drag to change an integer value between a min and a max.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntSlider(UnityEditor.SerializedProperty,System.Int32,System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a slider the user can drag to change an integer value between a min and a max.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"property\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntSlider(UnityEditor.SerializedProperty,System.Int32,System.Int32,System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a slider the user can drag to change an integer value between a min and a max.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"property\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.IntSlider(UnityEditor.SerializedProperty,System.Int32,System.Int32,UnityEngine.GUIContent,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a slider the user can drag to change an integer value between a min and a max.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"property\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LabelField(System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a label field. (Useful for showing read-only info.)</para>\n      </summary>\n      <param name=\"label\">Label in front of the label field.</param>\n      <param name=\"label2\">The label to show to the right.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"style\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LabelField(System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a label field. (Useful for showing read-only info.)</para>\n      </summary>\n      <param name=\"label\">Label in front of the label field.</param>\n      <param name=\"label2\">The label to show to the right.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"style\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LabelField(UnityEngine.GUIContent,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a label field. (Useful for showing read-only info.)</para>\n      </summary>\n      <param name=\"label\">Label in front of the label field.</param>\n      <param name=\"label2\">The label to show to the right.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"style\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LabelField(UnityEngine.GUIContent,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a label field. (Useful for showing read-only info.)</para>\n      </summary>\n      <param name=\"label\">Label in front of the label field.</param>\n      <param name=\"label2\">The label to show to the right.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"style\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LabelField(System.String,System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a label field. (Useful for showing read-only info.)</para>\n      </summary>\n      <param name=\"label\">Label in front of the label field.</param>\n      <param name=\"label2\">The label to show to the right.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"style\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LabelField(System.String,System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a label field. (Useful for showing read-only info.)</para>\n      </summary>\n      <param name=\"label\">Label in front of the label field.</param>\n      <param name=\"label2\">The label to show to the right.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"style\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LabelField(UnityEngine.GUIContent,UnityEngine.GUIContent,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a label field. (Useful for showing read-only info.)</para>\n      </summary>\n      <param name=\"label\">Label in front of the label field.</param>\n      <param name=\"label2\">The label to show to the right.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"style\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LabelField(UnityEngine.GUIContent,UnityEngine.GUIContent,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a label field. (Useful for showing read-only info.)</para>\n      </summary>\n      <param name=\"label\">Label in front of the label field.</param>\n      <param name=\"label2\">The label to show to the right.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"style\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LayerField(System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a layer selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"layer\">The layer shown in the field.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The layer selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LayerField(System.Int32,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a layer selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"layer\">The layer shown in the field.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The layer selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LayerField(System.String,System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a layer selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"layer\">The layer shown in the field.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The layer selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LayerField(System.String,System.Int32,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a layer selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"layer\">The layer shown in the field.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The layer selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LayerField(UnityEngine.GUIContent,System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a layer selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"layer\">The layer shown in the field.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The layer selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LayerField(UnityEngine.GUIContent,System.Int32,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a layer selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"layer\">The layer shown in the field.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The layer selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LongField(System.Int64,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering long integers.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the long field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LongField(System.Int64,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering long integers.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the long field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LongField(System.String,System.Int64,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering long integers.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the long field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LongField(System.String,System.Int64,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering long integers.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the long field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LongField(UnityEngine.GUIContent,System.Int64,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering long integers.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the long field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.LongField(UnityEngine.GUIContent,System.Int64,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field for entering long integers.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the long field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.MaskField(UnityEngine.GUIContent,System.Int32,System.String[],UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for masks.</para>\n      </summary>\n      <param name=\"label\">Prefix label of the field.</param>\n      <param name=\"mask\">The current mask to display.</param>\n      <param name=\"displayedOption\">A string array containing the labels for each flag.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"displayedOptions\"></param>\n      <param name=\"style\"></param>\n      <returns>\n        <para>The value modified by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.MaskField(System.String,System.Int32,System.String[],UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for masks.</para>\n      </summary>\n      <param name=\"label\">Prefix label of the field.</param>\n      <param name=\"mask\">The current mask to display.</param>\n      <param name=\"displayedOption\">A string array containing the labels for each flag.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"displayedOptions\"></param>\n      <param name=\"style\"></param>\n      <returns>\n        <para>The value modified by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.MaskField(UnityEngine.GUIContent,System.Int32,System.String[],UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for masks.</para>\n      </summary>\n      <param name=\"label\">Prefix label of the field.</param>\n      <param name=\"mask\">The current mask to display.</param>\n      <param name=\"displayedOption\">A string array containing the labels for each flag.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"displayedOptions\"></param>\n      <param name=\"style\"></param>\n      <returns>\n        <para>The value modified by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.MaskField(System.String,System.Int32,System.String[],UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for masks.</para>\n      </summary>\n      <param name=\"label\">Prefix label of the field.</param>\n      <param name=\"mask\">The current mask to display.</param>\n      <param name=\"displayedOption\">A string array containing the labels for each flag.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"displayedOptions\"></param>\n      <param name=\"style\"></param>\n      <returns>\n        <para>The value modified by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.MaskField(System.Int32,System.String[],UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for masks.</para>\n      </summary>\n      <param name=\"label\">Prefix label of the field.</param>\n      <param name=\"mask\">The current mask to display.</param>\n      <param name=\"displayedOption\">A string array containing the labels for each flag.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"displayedOptions\"></param>\n      <param name=\"style\"></param>\n      <returns>\n        <para>The value modified by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.MaskField(System.Int32,System.String[],UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for masks.</para>\n      </summary>\n      <param name=\"label\">Prefix label of the field.</param>\n      <param name=\"mask\">The current mask to display.</param>\n      <param name=\"displayedOption\">A string array containing the labels for each flag.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"displayedOptions\"></param>\n      <param name=\"style\"></param>\n      <returns>\n        <para>The value modified by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.MinMaxSlider(System.Single&amp;,System.Single&amp;,System.Single,System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a special slider the user can use to specify a range between a min and a max.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"minValue\">The lower value of the range the slider shows, passed by reference.</param>\n      <param name=\"maxValue\">The upper value at the range the slider shows, passed by reference.</param>\n      <param name=\"minLimit\">The limit at the left end of the slider.</param>\n      <param name=\"maxLimit\">The limit at the right end of the slider.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.MinMaxSlider(System.String,System.Single&amp;,System.Single&amp;,System.Single,System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a special slider the user can use to specify a range between a min and a max.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"minValue\">The lower value of the range the slider shows, passed by reference.</param>\n      <param name=\"maxValue\">The upper value at the range the slider shows, passed by reference.</param>\n      <param name=\"minLimit\">The limit at the left end of the slider.</param>\n      <param name=\"maxLimit\">The limit at the right end of the slider.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.MinMaxSlider(UnityEngine.GUIContent,System.Single&amp;,System.Single&amp;,System.Single,System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a special slider the user can use to specify a range between a min and a max.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"minValue\">The lower value of the range the slider shows, passed by reference.</param>\n      <param name=\"maxValue\">The upper value at the range the slider shows, passed by reference.</param>\n      <param name=\"minLimit\">The limit at the left end of the slider.</param>\n      <param name=\"maxLimit\">The limit at the right end of the slider.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ObjectField(UnityEngine.Object,System.Type,System.Boolean,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field to receive any object type.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"obj\">The object the field shows.</param>\n      <param name=\"objType\">The type of the objects that can be assigned.</param>\n      <param name=\"allowSceneObjects\">Allow assigning scene objects. See Description for more info.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The object that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ObjectField(System.String,UnityEngine.Object,System.Type,System.Boolean,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field to receive any object type.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"obj\">The object the field shows.</param>\n      <param name=\"objType\">The type of the objects that can be assigned.</param>\n      <param name=\"allowSceneObjects\">Allow assigning scene objects. See Description for more info.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The object that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ObjectField(UnityEngine.GUIContent,UnityEngine.Object,System.Type,System.Boolean,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field to receive any object type.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"obj\">The object the field shows.</param>\n      <param name=\"objType\">The type of the objects that can be assigned.</param>\n      <param name=\"allowSceneObjects\">Allow assigning scene objects. See Description for more info.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The object that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ObjectField(UnityEditor.SerializedProperty,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field to receive any object type.</para>\n      </summary>\n      <param name=\"property\">The object reference property the field shows.</param>\n      <param name=\"objType\">The type of the objects that can be assigned.</param>\n      <param name=\"label\">Optional label in front of the field. Pass GUIContent.none to hide the label.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ObjectField(UnityEditor.SerializedProperty,UnityEngine.GUIContent,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field to receive any object type.</para>\n      </summary>\n      <param name=\"property\">The object reference property the field shows.</param>\n      <param name=\"objType\">The type of the objects that can be assigned.</param>\n      <param name=\"label\">Optional label in front of the field. Pass GUIContent.none to hide the label.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ObjectField(UnityEditor.SerializedProperty,System.Type,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field to receive any object type.</para>\n      </summary>\n      <param name=\"property\">The object reference property the field shows.</param>\n      <param name=\"objType\">The type of the objects that can be assigned.</param>\n      <param name=\"label\">Optional label in front of the field. Pass GUIContent.none to hide the label.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ObjectField(UnityEditor.SerializedProperty,System.Type,UnityEngine.GUIContent,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field to receive any object type.</para>\n      </summary>\n      <param name=\"property\">The object reference property the field shows.</param>\n      <param name=\"objType\">The type of the objects that can be assigned.</param>\n      <param name=\"label\">Optional label in front of the field. Pass GUIContent.none to hide the label.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.PasswordField(System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the password field.</param>\n      <param name=\"password\">The password to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The password entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.PasswordField(System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the password field.</param>\n      <param name=\"password\">The password to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The password entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.PasswordField(System.String,System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the password field.</param>\n      <param name=\"password\">The password to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The password entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.PasswordField(System.String,System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the password field.</param>\n      <param name=\"password\">The password to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The password entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.PasswordField(UnityEngine.GUIContent,System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the password field.</param>\n      <param name=\"password\">The password to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The password entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.PasswordField(UnityEngine.GUIContent,System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the password field.</param>\n      <param name=\"password\">The password to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The password entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Popup(System.Int32,System.String[],UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a generic popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedIndex\">The index of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the options shown in the popup.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The index of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Popup(System.Int32,System.String[],UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a generic popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedIndex\">The index of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the options shown in the popup.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The index of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Popup(System.Int32,UnityEngine.GUIContent[],UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a generic popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedIndex\">The index of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the options shown in the popup.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The index of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Popup(System.Int32,UnityEngine.GUIContent[],UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a generic popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedIndex\">The index of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the options shown in the popup.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The index of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Popup(System.String,System.Int32,System.String[],UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a generic popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedIndex\">The index of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the options shown in the popup.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The index of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Popup(System.String,System.Int32,System.String[],UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a generic popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedIndex\">The index of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the options shown in the popup.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The index of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Popup(UnityEngine.GUIContent,System.Int32,UnityEngine.GUIContent[],UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a generic popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedIndex\">The index of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the options shown in the popup.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The index of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Popup(UnityEngine.GUIContent,System.Int32,UnityEngine.GUIContent[],UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a generic popup selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"selectedIndex\">The index of the option the field shows.</param>\n      <param name=\"displayedOptions\">An array with the options shown in the popup.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The index of the option that has been selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.PrefixLabel(System.String)\">\n      <summary>\n        <para>Make a label in front of some control.</para>\n      </summary>\n      <param name=\"label\">Label to show to the left of the control.</param>\n      <param name=\"followingStyle\"></param>\n      <param name=\"labelStyle\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.PrefixLabel(UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a label in front of some control.</para>\n      </summary>\n      <param name=\"label\">Label to show to the left of the control.</param>\n      <param name=\"followingStyle\"></param>\n      <param name=\"labelStyle\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.PrefixLabel(System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label in front of some control.</para>\n      </summary>\n      <param name=\"label\">Label to show to the left of the control.</param>\n      <param name=\"followingStyle\"></param>\n      <param name=\"labelStyle\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.PrefixLabel(System.String,UnityEngine.GUIStyle,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label in front of some control.</para>\n      </summary>\n      <param name=\"label\">Label to show to the left of the control.</param>\n      <param name=\"followingStyle\"></param>\n      <param name=\"labelStyle\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.PrefixLabel(UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label in front of some control.</para>\n      </summary>\n      <param name=\"label\">Label to show to the left of the control.</param>\n      <param name=\"followingStyle\"></param>\n      <param name=\"labelStyle\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.PrefixLabel(UnityEngine.GUIContent,UnityEngine.GUIStyle,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a label in front of some control.</para>\n      </summary>\n      <param name=\"label\">Label to show to the left of the control.</param>\n      <param name=\"followingStyle\"></param>\n      <param name=\"labelStyle\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.PropertyField(UnityEditor.SerializedProperty,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for SerializedProperty.</para>\n      </summary>\n      <param name=\"property\">The SerializedProperty to make a field for.</param>\n      <param name=\"label\">Optional label to use. If not specified the label of the property itself is used. Use GUIContent.none to not display a label at all.</param>\n      <param name=\"includeChildren\">If true the property including children is drawn; otherwise only the control itself (such as only a foldout but nothing below it).</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>True if the property has children and is expanded and includeChildren was set to false; otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.PropertyField(UnityEditor.SerializedProperty,UnityEngine.GUIContent,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for SerializedProperty.</para>\n      </summary>\n      <param name=\"property\">The SerializedProperty to make a field for.</param>\n      <param name=\"label\">Optional label to use. If not specified the label of the property itself is used. Use GUIContent.none to not display a label at all.</param>\n      <param name=\"includeChildren\">If true the property including children is drawn; otherwise only the control itself (such as only a foldout but nothing below it).</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>True if the property has children and is expanded and includeChildren was set to false; otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.PropertyField(UnityEditor.SerializedProperty,System.Boolean,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for SerializedProperty.</para>\n      </summary>\n      <param name=\"property\">The SerializedProperty to make a field for.</param>\n      <param name=\"label\">Optional label to use. If not specified the label of the property itself is used. Use GUIContent.none to not display a label at all.</param>\n      <param name=\"includeChildren\">If true the property including children is drawn; otherwise only the control itself (such as only a foldout but nothing below it).</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>True if the property has children and is expanded and includeChildren was set to false; otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.PropertyField(UnityEditor.SerializedProperty,UnityEngine.GUIContent,System.Boolean,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a field for SerializedProperty.</para>\n      </summary>\n      <param name=\"property\">The SerializedProperty to make a field for.</param>\n      <param name=\"label\">Optional label to use. If not specified the label of the property itself is used. Use GUIContent.none to not display a label at all.</param>\n      <param name=\"includeChildren\">If true the property including children is drawn; otherwise only the control itself (such as only a foldout but nothing below it).</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>True if the property has children and is expanded and includeChildren was set to false; otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.RectField(UnityEngine.Rect,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an X, Y, W &amp; H field for entering a Rect.</para>\n      </summary>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.RectField(System.String,UnityEngine.Rect,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an X, Y, W &amp; H field for entering a Rect.</para>\n      </summary>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.RectField(UnityEngine.GUIContent,UnityEngine.Rect,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an X, Y, W &amp; H field for entering a Rect.</para>\n      </summary>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.RectIntField(UnityEngine.RectInt,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an X, Y, W &amp; H field for entering a RectInt.</para>\n      </summary>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.RectIntField(System.String,UnityEngine.RectInt,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an X, Y, W &amp; H field for entering a RectInt.</para>\n      </summary>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.RectIntField(UnityEngine.GUIContent,UnityEngine.RectInt,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an X, Y, W &amp; H field for entering a RectInt.</para>\n      </summary>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.EditorGUILayout.ScrollViewScope\">\n      <summary>\n        <para>Disposable helper class for managing BeginScrollView / EndScrollView.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUILayout.ScrollViewScope.handleScrollWheel\">\n      <summary>\n        <para>Whether this ScrollView should handle scroll wheel events. (default: true).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUILayout.ScrollViewScope.scrollPosition\">\n      <summary>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ScrollViewScope.#ctor(UnityEngine.Vector2,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new ScrollViewScope and begin the corresponding ScrollView.</para>\n      </summary>\n      <param name=\"scrollPosition\">The scroll position to use.</param>\n      <param name=\"alwaysShowHorizontal\">Whether to always show the horizontal scrollbar. If false, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwaysShowVertical\">Whether to always show the vertical scrollbar. If false, it is only shown when the content inside the ScrollView is higher than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"style\"></param>\n      <param name=\"background\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ScrollViewScope.#ctor(UnityEngine.Vector2,System.Boolean,System.Boolean,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new ScrollViewScope and begin the corresponding ScrollView.</para>\n      </summary>\n      <param name=\"scrollPosition\">The scroll position to use.</param>\n      <param name=\"alwaysShowHorizontal\">Whether to always show the horizontal scrollbar. If false, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwaysShowVertical\">Whether to always show the vertical scrollbar. If false, it is only shown when the content inside the ScrollView is higher than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"style\"></param>\n      <param name=\"background\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ScrollViewScope.#ctor(UnityEngine.Vector2,UnityEngine.GUIStyle,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new ScrollViewScope and begin the corresponding ScrollView.</para>\n      </summary>\n      <param name=\"scrollPosition\">The scroll position to use.</param>\n      <param name=\"alwaysShowHorizontal\">Whether to always show the horizontal scrollbar. If false, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwaysShowVertical\">Whether to always show the vertical scrollbar. If false, it is only shown when the content inside the ScrollView is higher than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"style\"></param>\n      <param name=\"background\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ScrollViewScope.#ctor(UnityEngine.Vector2,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new ScrollViewScope and begin the corresponding ScrollView.</para>\n      </summary>\n      <param name=\"scrollPosition\">The scroll position to use.</param>\n      <param name=\"alwaysShowHorizontal\">Whether to always show the horizontal scrollbar. If false, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwaysShowVertical\">Whether to always show the vertical scrollbar. If false, it is only shown when the content inside the ScrollView is higher than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"style\"></param>\n      <param name=\"background\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ScrollViewScope.#ctor(UnityEngine.Vector2,System.Boolean,System.Boolean,UnityEngine.GUIStyle,UnityEngine.GUIStyle,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new ScrollViewScope and begin the corresponding ScrollView.</para>\n      </summary>\n      <param name=\"scrollPosition\">The scroll position to use.</param>\n      <param name=\"alwaysShowHorizontal\">Whether to always show the horizontal scrollbar. If false, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwaysShowVertical\">Whether to always show the vertical scrollbar. If false, it is only shown when the content inside the ScrollView is higher than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"style\"></param>\n      <param name=\"background\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.SelectableLabel(System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a selectable label field. (Useful for showing read-only info that can be copy-pasted.)</para>\n      </summary>\n      <param name=\"text\">The text to show.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.SelectableLabel(System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a selectable label field. (Useful for showing read-only info that can be copy-pasted.)</para>\n      </summary>\n      <param name=\"text\">The text to show.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Slider(System.Single,System.Single,System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Slider(System.String,System.Single,System.Single,System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Slider(UnityEngine.GUIContent,System.Single,System.Single,System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Slider(UnityEditor.SerializedProperty,System.Single,System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"property\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Slider(UnityEditor.SerializedProperty,System.Single,System.Single,System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"property\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Slider(UnityEditor.SerializedProperty,System.Single,System.Single,UnityEngine.GUIContent,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the slider.</param>\n      <param name=\"property\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Space\">\n      <summary>\n        <para>Make a small space between the previous control and the following.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.TagField(System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a tag selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"tag\">The tag the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The tag selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.TagField(System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a tag selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"tag\">The tag the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The tag selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.TagField(System.String,System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a tag selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"tag\">The tag the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The tag selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.TagField(System.String,System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a tag selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"tag\">The tag the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The tag selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.TagField(UnityEngine.GUIContent,System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a tag selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"tag\">The tag the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The tag selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.TagField(UnityEngine.GUIContent,System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a tag selection field.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the field.</param>\n      <param name=\"tag\">The tag the field shows.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The tag selected by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.TextArea(System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text area.</para>\n      </summary>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The text entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.TextArea(System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text area.</para>\n      </summary>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The text entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.TextField(System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the text field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The text entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.TextField(System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the text field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The text entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.TextField(System.String,System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the text field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The text entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.TextField(System.String,System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the text field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The text entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.TextField(UnityEngine.GUIContent,System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the text field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The text entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.TextField(UnityEngine.GUIContent,System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field.</para>\n      </summary>\n      <param name=\"label\">Optional label to display in front of the text field.</param>\n      <param name=\"text\">The text to edit.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The text entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Toggle(System.Boolean,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toggle.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the toggle.</param>\n      <param name=\"value\">The shown state of the toggle.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout\n        properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\n\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The selected state of the toggle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Toggle(System.String,System.Boolean,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toggle.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the toggle.</param>\n      <param name=\"value\">The shown state of the toggle.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout\n        properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\n\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The selected state of the toggle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Toggle(UnityEngine.GUIContent,System.Boolean,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toggle.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the toggle.</param>\n      <param name=\"value\">The shown state of the toggle.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout\n        properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\n\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The selected state of the toggle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Toggle(System.Boolean,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toggle.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the toggle.</param>\n      <param name=\"value\">The shown state of the toggle.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout\n        properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\n\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The selected state of the toggle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Toggle(System.String,System.Boolean,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toggle.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the toggle.</param>\n      <param name=\"value\">The shown state of the toggle.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout\n        properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\n\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The selected state of the toggle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Toggle(UnityEngine.GUIContent,System.Boolean,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toggle.</para>\n      </summary>\n      <param name=\"label\">Optional label in front of the toggle.</param>\n      <param name=\"value\">The shown state of the toggle.</param>\n      <param name=\"style\">Optional GUIStyle.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout\n        properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\n\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The selected state of the toggle.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.EditorGUILayout.ToggleGroupScope\">\n      <summary>\n        <para>Begin a vertical group with a toggle to enable or disable all the controls within at once.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUILayout.ToggleGroupScope.enabled\">\n      <summary>\n        <para>The enabled state selected by the user.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ToggleGroupScope.#ctor(System.String,System.Boolean)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"label\">Label to show above the toggled controls.</param>\n      <param name=\"toggle\">Enabled state of the toggle group.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ToggleGroupScope.#ctor(UnityEngine.GUIContent,System.Boolean)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"label\">Label to show above the toggled controls.</param>\n      <param name=\"toggle\">Enabled state of the toggle group.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ToggleLeft(System.String,System.Boolean,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toggle field where the toggle is to the left and the label immediately to the right of it.</para>\n      </summary>\n      <param name=\"label\">Label to display next to the toggle.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"labelStyle\">Optional GUIStyle to use for the label.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ToggleLeft(UnityEngine.GUIContent,System.Boolean,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toggle field where the toggle is to the left and the label immediately to the right of it.</para>\n      </summary>\n      <param name=\"label\">Label to display next to the toggle.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"labelStyle\">Optional GUIStyle to use for the label.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ToggleLeft(System.String,System.Boolean,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toggle field where the toggle is to the left and the label immediately to the right of it.</para>\n      </summary>\n      <param name=\"label\">Label to display next to the toggle.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"labelStyle\">Optional GUIStyle to use for the label.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.ToggleLeft(UnityEngine.GUIContent,System.Boolean,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toggle field where the toggle is to the left and the label immediately to the right of it.</para>\n      </summary>\n      <param name=\"label\">Label to display next to the toggle.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"labelStyle\">Optional GUIStyle to use for the label.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Vector2Field(System.String,UnityEngine.Vector2,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an X &amp; Y field for entering a Vector2.</para>\n      </summary>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\n</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Vector2Field(UnityEngine.GUIContent,UnityEngine.Vector2,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an X &amp; Y field for entering a Vector2.</para>\n      </summary>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\n</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Vector2IntField(System.String,UnityEngine.Vector2Int,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an X &amp; Y integer field for entering a Vector2Int.</para>\n      </summary>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Vector2IntField(UnityEngine.GUIContent,UnityEngine.Vector2Int,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an X &amp; Y integer field for entering a Vector2Int.</para>\n      </summary>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Vector3Field(System.String,UnityEngine.Vector3,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an X, Y &amp; Z field for entering a Vector3.</para>\n      </summary>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout\n        properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Vector3Field(UnityEngine.GUIContent,UnityEngine.Vector3,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an X, Y &amp; Z field for entering a Vector3.</para>\n      </summary>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout\n        properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Vector3IntField(System.String,UnityEngine.Vector3Int,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an X, Y &amp; Z integer field for entering a Vector3Int.</para>\n      </summary>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Vector3IntField(UnityEngine.GUIContent,UnityEngine.Vector3Int,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an X, Y &amp; Z integer field for entering a Vector3Int.</para>\n      </summary>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.Vector4Field(System.String,UnityEngine.Vector4,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an X, Y, Z &amp; W field for entering a Vector4.</para>\n      </summary>\n      <param name=\"label\">Label to display above the field.</param>\n      <param name=\"value\">The value to edit.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The value entered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.EditorGUILayout.VerticalScope\">\n      <summary>\n        <para>Disposable helper class for managing BeginVertical / EndVertical.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUILayout.VerticalScope.rect\">\n      <summary>\n        <para>The rect of the vertical group.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.VerticalScope.#ctor(UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new VerticalScope and begin the corresponding vertical group.</para>\n      </summary>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUILayout.VerticalScope.#ctor(UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new VerticalScope and begin the corresponding vertical group.</para>\n      </summary>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"T:UnityEditor.EditorGUIUtility\">\n      <summary>\n        <para>Miscellaneous helper stuff for EditorGUI.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUIUtility.currentViewWidth\">\n      <summary>\n        <para>The width of the GUI area for the current EditorWindow or other view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUIUtility.editingTextField\">\n      <summary>\n        <para>Is a text field currently editing text?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUIUtility.fieldWidth\">\n      <summary>\n        <para>The minimum width in pixels reserved for the fields of Editor GUI controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUIUtility.hierarchyMode\">\n      <summary>\n        <para>Is the Editor GUI is hierarchy mode?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUIUtility.isProSkin\">\n      <summary>\n        <para>Is the user currently using the pro skin? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUIUtility.labelWidth\">\n      <summary>\n        <para>The width in pixels reserved for labels of Editor GUI controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUIUtility.pixelsPerPoint\">\n      <summary>\n        <para>The scale of GUI points relative to screen pixels for the current view\n\nThis value is the number of screen pixels per point of interface space. For instance, 2.0 on retina displays. Note that the value may differ from one view to the next if the views are on monitors with different UI scales.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUIUtility.singleLineHeight\">\n      <summary>\n        <para>Get the height used for a single Editor control such as a one-line EditorGUI.TextField or EditorGUI.Popup.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUIUtility.standardVerticalSpacing\">\n      <summary>\n        <para>Get the height used by default for vertical spacing between controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUIUtility.systemCopyBuffer\">\n      <summary>\n        <para>The system copy buffer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUIUtility.whiteTexture\">\n      <summary>\n        <para>Get a white texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorGUIUtility.wideMode\">\n      <summary>\n        <para>Is the Editor GUI currently in wide mode?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.AddCursorRect(UnityEngine.Rect,UnityEditor.MouseCursor)\">\n      <summary>\n        <para>Add a custom mouse pointer to a control.</para>\n      </summary>\n      <param name=\"position\">The rectangle the control should be shown within.</param>\n      <param name=\"mouse\">The mouse cursor to use.</param>\n      <param name=\"controlID\">ID of a target control.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.AddCursorRect(UnityEngine.Rect,UnityEditor.MouseCursor,System.Int32)\">\n      <summary>\n        <para>Add a custom mouse pointer to a control.</para>\n      </summary>\n      <param name=\"position\">The rectangle the control should be shown within.</param>\n      <param name=\"mouse\">The mouse cursor to use.</param>\n      <param name=\"controlID\">ID of a target control.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.CommandEvent(System.String)\">\n      <summary>\n        <para>Creates an event that can be sent to another window.</para>\n      </summary>\n      <param name=\"commandName\">The command to be sent.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.DrawColorSwatch(UnityEngine.Rect,UnityEngine.Color)\">\n      <summary>\n        <para>Draw a color swatch.</para>\n      </summary>\n      <param name=\"position\">The rectangle to draw the color swatch within.</param>\n      <param name=\"color\">The color to draw.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.DrawCurveSwatch(UnityEngine.Rect,UnityEngine.AnimationCurve,UnityEditor.SerializedProperty,UnityEngine.Color,UnityEngine.Color)\">\n      <summary>\n        <para>Draw a curve swatch.</para>\n      </summary>\n      <param name=\"position\">The rectangle to draw the color swatch within.</param>\n      <param name=\"curve\">The curve to draw.</param>\n      <param name=\"property\">The curve to draw as a SerializedProperty.</param>\n      <param name=\"color\">The color to draw the curve with.</param>\n      <param name=\"bgColor\">The color to draw the background with.</param>\n      <param name=\"curveRanges\">Optional parameter to specify the range of the curve which should be included in swatch.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.DrawCurveSwatch(UnityEngine.Rect,UnityEngine.AnimationCurve,UnityEditor.SerializedProperty,UnityEngine.Color,UnityEngine.Color,UnityEngine.Rect)\">\n      <summary>\n        <para>Draw a curve swatch.</para>\n      </summary>\n      <param name=\"position\">The rectangle to draw the color swatch within.</param>\n      <param name=\"curve\">The curve to draw.</param>\n      <param name=\"property\">The curve to draw as a SerializedProperty.</param>\n      <param name=\"color\">The color to draw the curve with.</param>\n      <param name=\"bgColor\">The color to draw the background with.</param>\n      <param name=\"curveRanges\">Optional parameter to specify the range of the curve which should be included in swatch.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.DrawRegionSwatch(UnityEngine.Rect,UnityEditor.SerializedProperty,UnityEditor.SerializedProperty,UnityEngine.Color,UnityEngine.Color,UnityEngine.Rect)\">\n      <summary>\n        <para>Draw swatch with a filled region between two SerializedProperty curves.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"property\"></param>\n      <param name=\"property2\"></param>\n      <param name=\"color\"></param>\n      <param name=\"bgColor\"></param>\n      <param name=\"curveRanges\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.DrawRegionSwatch(UnityEngine.Rect,UnityEngine.AnimationCurve,UnityEngine.AnimationCurve,UnityEngine.Color,UnityEngine.Color,UnityEngine.Rect)\">\n      <summary>\n        <para>Draw swatch with a filled region between two curves.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"curve\"></param>\n      <param name=\"curve2\"></param>\n      <param name=\"color\"></param>\n      <param name=\"bgColor\"></param>\n      <param name=\"curveRanges\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.FindTexture(System.String)\">\n      <summary>\n        <para>Get a texture from its source filename.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.GetBuiltinSkin(UnityEditor.EditorSkin)\">\n      <summary>\n        <para>Get one of the built-in GUI skins, which can be the game view, inspector or scene view skin as chosen by the parameter.</para>\n      </summary>\n      <param name=\"skin\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.GetFlowLayoutedRects(UnityEngine.Rect,UnityEngine.GUIStyle,System.Single,System.Single,System.Collections.Generic.List`1&lt;System.String&gt;)\">\n      <summary>\n        <para>Layout list of string items left to right, top to bottom in the given area.</para>\n      </summary>\n      <param name=\"rect\">Area where to layout the items.</param>\n      <param name=\"style\">Style for the items.</param>\n      <param name=\"horizontalSpacing\">Extra horizontal spacing between successive items.</param>\n      <param name=\"verticalSpacing\">Extra vertical spacing between item rows.</param>\n      <param name=\"items\">Strings to layout.</param>\n      <returns>\n        <para>List of rectangles for the passed items.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.GetIconSize\">\n      <summary>\n        <para>Get the size that has been set using SetIconSize.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.GetObjectPickerControlID\">\n      <summary>\n        <para>The controlID of the currently showing object picker.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.GetObjectPickerObject\">\n      <summary>\n        <para>The object currently selected in the object picker.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.HasObjectThumbnail(System.Type)\">\n      <summary>\n        <para>Does a given class have per-object thumbnails?</para>\n      </summary>\n      <param name=\"objType\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.IconContent(System.String)\">\n      <summary>\n        <para>Fetch the GUIContent from the Unity builtin resources with the given name.</para>\n      </summary>\n      <param name=\"name\">Name of the desired icon.</param>\n      <param name=\"text\">Tooltip for hovering over the icon.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.IconContent(System.String,System.String)\">\n      <summary>\n        <para>Fetch the GUIContent from the Unity builtin resources with the given name.</para>\n      </summary>\n      <param name=\"name\">Name of the desired icon.</param>\n      <param name=\"text\">Tooltip for hovering over the icon.</param>\n    </member>\n    <member name=\"T:UnityEditor.EditorGUIUtility.IconSizeScope\">\n      <summary>\n        <para>Disposable scope helper for GetIconSize / SetIconSize.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.IconSizeScope.#ctor(UnityEngine.Vector2)\">\n      <summary>\n        <para>Begin an IconSizeScope.</para>\n      </summary>\n      <param name=\"iconSizeWithinScope\">Size to be used for icons rendered as GUIContent within this scope.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.IsDisplayReferencedByCameras(System.Int32)\">\n      <summary>\n        <para>Check if any enabled camera can render to a particular display.</para>\n      </summary>\n      <param name=\"displayIndex\">Display index.</param>\n      <returns>\n        <para>True if a camera will render to the display.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.Load(System.String)\">\n      <summary>\n        <para>Load a built-in resource.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.LoadRequired(System.String)\">\n      <summary>\n        <para>Load a required built-in resource.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.LookLikeControls\">\n      <summary>\n        <para>Make all EditorGUI look like regular controls.</para>\n      </summary>\n      <param name=\"labelWidth\">Width to use for prefixed labels.</param>\n      <param name=\"fieldWidth\">Width of text entries.</param>\n      <param name=\"_labelWidth\"></param>\n      <param name=\"_fieldWidth\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.LookLikeControls\">\n      <summary>\n        <para>Make all EditorGUI look like regular controls.</para>\n      </summary>\n      <param name=\"labelWidth\">Width to use for prefixed labels.</param>\n      <param name=\"fieldWidth\">Width of text entries.</param>\n      <param name=\"_labelWidth\"></param>\n      <param name=\"_fieldWidth\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.LookLikeControls(System.Single,System.Single)\">\n      <summary>\n        <para>Make all EditorGUI look like regular controls.</para>\n      </summary>\n      <param name=\"labelWidth\">Width to use for prefixed labels.</param>\n      <param name=\"fieldWidth\">Width of text entries.</param>\n      <param name=\"_labelWidth\"></param>\n      <param name=\"_fieldWidth\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.LookLikeInspector\">\n      <summary>\n        <para>Make all EditorGUI look like simplified outline view controls.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.ObjectContent(UnityEngine.Object,System.Type)\">\n      <summary>\n        <para>Return a GUIContent object with the name and icon of an Object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.PingObject(UnityEngine.Object)\">\n      <summary>\n        <para>Ping an object in the Scene like clicking it in an inspector.</para>\n      </summary>\n      <param name=\"obj\">The object to be pinged.</param>\n      <param name=\"targetInstanceID\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.PingObject(System.Int32)\">\n      <summary>\n        <para>Ping an object in the Scene like clicking it in an inspector.</para>\n      </summary>\n      <param name=\"obj\">The object to be pinged.</param>\n      <param name=\"targetInstanceID\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.PixelsToPoints(UnityEngine.Vector2)\">\n      <summary>\n        <para>Convert a position from pixel to point space.</para>\n      </summary>\n      <param name=\"position\">A GUI position in pixel space.</param>\n      <returns>\n        <para>A vector representing the same position in point space.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.PixelsToPoints(UnityEngine.Rect)\">\n      <summary>\n        <para>Convert a Rect from pixel space to point space.</para>\n      </summary>\n      <param name=\"rect\">A GUI rect measured in pixels.</param>\n      <returns>\n        <para>A rect representing the same area in points.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.PointsToPixels(UnityEngine.Vector2)\">\n      <summary>\n        <para>Convert a Rect from point space to pixel space.</para>\n      </summary>\n      <param name=\"position\">A GUI rect measured in points.</param>\n      <returns>\n        <para>A rect representing the same area in pixels.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.PointsToPixels(UnityEngine.Rect)\">\n      <summary>\n        <para>Converts a position from point to pixel space.</para>\n      </summary>\n      <param name=\"rect\">A GUI position in point space.</param>\n      <returns>\n        <para>The same position in pixel space.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.QueueGameViewInputEvent(UnityEngine.Event)\">\n      <summary>\n        <para>Send an input event into the game.</para>\n      </summary>\n      <param name=\"evt\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.RenderGameViewCameras(UnityEngine.Rect,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Render all ingame cameras.</para>\n      </summary>\n      <param name=\"cameraRect\">The device coordinates to render all game cameras into.</param>\n      <param name=\"gizmos\">Show gizmos as well.</param>\n      <param name=\"gui\"></param>\n      <param name=\"statsRect\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.RenderGameViewCameras(UnityEngine.Rect,UnityEngine.Rect,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Render all ingame cameras.</para>\n      </summary>\n      <param name=\"cameraRect\">The device coordinates to render all game cameras into.</param>\n      <param name=\"gizmos\">Show gizmos as well.</param>\n      <param name=\"gui\"></param>\n      <param name=\"statsRect\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.SetIconSize(UnityEngine.Vector2)\">\n      <summary>\n        <para>Set icons rendered as part of GUIContent to be rendered at a specific size.</para>\n      </summary>\n      <param name=\"size\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorGUIUtility.ShowObjectPicker(UnityEngine.Object,System.Boolean,System.String,System.Int32)\">\n      <summary>\n        <para>Show the object picker from code.</para>\n      </summary>\n      <param name=\"obj\">The object to be selected by default.</param>\n      <param name=\"allowSceneObjects\">Is selection of scene objects allowed, or should it only show assets.</param>\n      <param name=\"searchFilter\">Default search filter to apply.</param>\n      <param name=\"controlID\">The id of the control to set. This is useful if you are showing more than one of these. You can get the value at a later time.</param>\n    </member>\n    <member name=\"T:UnityEditor.EditorJsonUtility\">\n      <summary>\n        <para>Utility functions for working with JSON data and engine objects.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorJsonUtility.FromJsonOverwrite(System.String,System.Object)\">\n      <summary>\n        <para>Overwrite data in an object by reading from its JSON representation.</para>\n      </summary>\n      <param name=\"json\">The JSON representation of the object.</param>\n      <param name=\"objectToOverwrite\">The object to overwrite.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorJsonUtility.ToJson(System.Object)\">\n      <summary>\n        <para>Generate a JSON representation of an object.</para>\n      </summary>\n      <param name=\"obj\">The object to convert to JSON form.</param>\n      <param name=\"prettyPrint\">If true, format the output for readability. If false, format the output for minimum size. Default is false.</param>\n      <returns>\n        <para>The object's data in JSON format.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorJsonUtility.ToJson(System.Object,System.Boolean)\">\n      <summary>\n        <para>Generate a JSON representation of an object.</para>\n      </summary>\n      <param name=\"obj\">The object to convert to JSON form.</param>\n      <param name=\"prettyPrint\">If true, format the output for readability. If false, format the output for minimum size. Default is false.</param>\n      <returns>\n        <para>The object's data in JSON format.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.EditorPrefs\">\n      <summary>\n        <para>Stores and accesses Unity editor preferences.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorPrefs.DeleteAll\">\n      <summary>\n        <para>Removes all keys and values from the preferences. Use with caution.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorPrefs.DeleteKey(System.String)\">\n      <summary>\n        <para>Removes key and its corresponding value from the preferences.</para>\n      </summary>\n      <param name=\"key\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorPrefs.GetBool(System.String)\">\n      <summary>\n        <para>Returns the value corresponding to key in the preference file if it exists.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"defaultValue\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorPrefs.GetBool(System.String,System.Boolean)\">\n      <summary>\n        <para>Returns the value corresponding to key in the preference file if it exists.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"defaultValue\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorPrefs.GetFloat(System.String)\">\n      <summary>\n        <para>Returns the float value corresponding to key if it exists in the preference file.</para>\n      </summary>\n      <param name=\"key\">Name of key to read float from.</param>\n      <param name=\"defaultValue\">Float value to return if the key is not in the storage.</param>\n      <returns>\n        <para>The float value stored in the preference file or the defaultValue id the\n        requested float does not exist.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorPrefs.GetFloat(System.String,System.Single)\">\n      <summary>\n        <para>Returns the float value corresponding to key if it exists in the preference file.</para>\n      </summary>\n      <param name=\"key\">Name of key to read float from.</param>\n      <param name=\"defaultValue\">Float value to return if the key is not in the storage.</param>\n      <returns>\n        <para>The float value stored in the preference file or the defaultValue id the\n        requested float does not exist.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorPrefs.GetInt(System.String)\">\n      <summary>\n        <para>Returns the value corresponding to key in the preference file if it exists.</para>\n      </summary>\n      <param name=\"key\">Name of key to read integer from.</param>\n      <param name=\"defaultValue\">Integer value to return if the key is not in the storage.</param>\n      <returns>\n        <para>The value stored in the preference file.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorPrefs.GetInt(System.String,System.Int32)\">\n      <summary>\n        <para>Returns the value corresponding to key in the preference file if it exists.</para>\n      </summary>\n      <param name=\"key\">Name of key to read integer from.</param>\n      <param name=\"defaultValue\">Integer value to return if the key is not in the storage.</param>\n      <returns>\n        <para>The value stored in the preference file.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorPrefs.GetString(System.String)\">\n      <summary>\n        <para>Returns the value corresponding to key in the preference file if it exists.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"defaultValue\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorPrefs.GetString(System.String,System.String)\">\n      <summary>\n        <para>Returns the value corresponding to key in the preference file if it exists.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"defaultValue\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorPrefs.HasKey(System.String)\">\n      <summary>\n        <para>Returns true if key exists in the preferences file.</para>\n      </summary>\n      <param name=\"key\">Name of key to check for.</param>\n      <returns>\n        <para>The existence or not of the key.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorPrefs.SetBool(System.String,System.Boolean)\">\n      <summary>\n        <para>Sets the value of the preference identified by key.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorPrefs.SetFloat(System.String,System.Single)\">\n      <summary>\n        <para>Sets the float value of the preference identified by key.</para>\n      </summary>\n      <param name=\"key\">Name of key to write float into.</param>\n      <param name=\"value\">Float value to write into the storage.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorPrefs.SetInt(System.String,System.Int32)\">\n      <summary>\n        <para>Sets the value of the preference identified by key as an integer.</para>\n      </summary>\n      <param name=\"key\">Name of key to write integer to.</param>\n      <param name=\"value\">Value of the integer to write into the storage.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorPrefs.SetString(System.String,System.String)\">\n      <summary>\n        <para>Sets the value of the preference identified by key. Note that EditorPrefs does not support null strings and will store an empty string instead.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"T:UnityEditor.EditorSelectedRenderState\">\n      <summary>\n        <para>The editor selected render mode for Scene View selection.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.EditorSelectedRenderState.Hidden\">\n      <summary>\n        <para>The Renderer has no selection highlight or wireframe in the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.EditorSelectedRenderState.Highlight\">\n      <summary>\n        <para>The Renderer has selection highlight but no wireframe in the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.EditorSelectedRenderState.Wireframe\">\n      <summary>\n        <para>The Renderer has wireframe but not selection highlight in the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.EditorSkin\">\n      <summary>\n        <para>Enum that selects which skin to return from EditorGUIUtility.GetBuiltinSkin.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.EditorSkin.Game\">\n      <summary>\n        <para>The skin used for game views.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.EditorSkin.Inspector\">\n      <summary>\n        <para>The skin used for inspectors.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.EditorSkin.Scene\">\n      <summary>\n        <para>The skin used for scene views.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.EditorStyles\">\n      <summary>\n        <para>Common GUIStyles used for EditorGUI controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.boldFont\">\n      <summary>\n        <para>Bold font.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.boldLabel\">\n      <summary>\n        <para>Style for bold label.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.centeredGreyMiniLabel\">\n      <summary>\n        <para>Style for label with small font which is centered and grey.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.colorField\">\n      <summary>\n        <para>Style used for headings for Color fields.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.foldout\">\n      <summary>\n        <para>Style used for headings for EditorGUI.Foldout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.foldoutPreDrop\">\n      <summary>\n        <para>Style used for headings for EditorGUI.Foldout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.helpBox\">\n      <summary>\n        <para>Style used for background box for EditorGUI.HelpBox.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.inspectorDefaultMargins\">\n      <summary>\n        <para>Wrap content in a vertical group with this style to get the default margins used in the Inspector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.inspectorFullWidthMargins\">\n      <summary>\n        <para>Wrap content in a vertical group with this style to get full width margins in the Inspector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.label\">\n      <summary>\n        <para>Style used for the labelled on all EditorGUI overloads that take a prefix label.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.largeLabel\">\n      <summary>\n        <para>Style for label with large font.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.layerMaskField\">\n      <summary>\n        <para>Style used for headings for Layer masks.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.miniBoldFont\">\n      <summary>\n        <para>Mini Bold font.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.miniBoldLabel\">\n      <summary>\n        <para>Style for mini bold label.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.miniButton\">\n      <summary>\n        <para>Style used for a standalone small button.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.miniButtonLeft\">\n      <summary>\n        <para>Style used for the leftmost button in a horizontal button group.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.miniButtonMid\">\n      <summary>\n        <para>Style used for the middle buttons in a horizontal group.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.miniButtonRight\">\n      <summary>\n        <para>Style used for the rightmost button in a horizontal group.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.miniFont\">\n      <summary>\n        <para>Mini font.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.miniLabel\">\n      <summary>\n        <para>Style for label with small font.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.miniTextField\">\n      <summary>\n        <para>Smaller text field.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.numberField\">\n      <summary>\n        <para>Style used for field editors for numbers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.objectField\">\n      <summary>\n        <para>Style used for headings for object fields.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.objectFieldMiniThumb\">\n      <summary>\n        <para>Style used for object fields that have a thumbnail (e.g Textures). </para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.objectFieldThumb\">\n      <summary>\n        <para>Style used for headings for the Select button in object fields.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.popup\">\n      <summary>\n        <para>Style used for EditorGUI.Popup, EditorGUI.EnumPopup,.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.radioButton\">\n      <summary>\n        <para>Style used for a radio button.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.standardFont\">\n      <summary>\n        <para>Standard font.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.textArea\">\n      <summary>\n        <para>Style used for EditorGUI.TextArea.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.textField\">\n      <summary>\n        <para>Style used for EditorGUI.TextField.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.toggle\">\n      <summary>\n        <para>Style used for headings for EditorGUI.Toggle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.toggleGroup\">\n      <summary>\n        <para>Style used for headings for EditorGUILayout.BeginToggleGroup.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.toolbar\">\n      <summary>\n        <para>Toolbar background from top of windows.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.toolbarButton\">\n      <summary>\n        <para>Style for Button and Toggles in toolbars.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.toolbarDropDown\">\n      <summary>\n        <para>Toolbar Dropdown.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.toolbarPopup\">\n      <summary>\n        <para>Toolbar Popup.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.toolbarTextField\">\n      <summary>\n        <para>Toolbar text field.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.whiteBoldLabel\">\n      <summary>\n        <para>Style for white bold label.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.whiteLabel\">\n      <summary>\n        <para>Style for white label.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.whiteLargeLabel\">\n      <summary>\n        <para>Style for white large label.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.whiteMiniLabel\">\n      <summary>\n        <para>Style for white mini label.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.wordWrappedLabel\">\n      <summary>\n        <para>Style for word wrapped label.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorStyles.wordWrappedMiniLabel\">\n      <summary>\n        <para>Style for word wrapped mini label.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.EditorUserBuildSettings\">\n      <summary>\n        <para>User build settings for the Editor</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.activeBuildTarget\">\n      <summary>\n        <para>The currently active build target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.EditorUserBuildSettings.activeBuildTargetChanged\">\n      <summary>\n        <para>Triggered in response to SwitchActiveBuildTarget.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.activeScriptCompilationDefines\">\n      <summary>\n        <para>DEFINE directives for the compiler.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.allowDebugging\">\n      <summary>\n        <para>Enable source-level debuggers to connect.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.androidBuildSubtarget\">\n      <summary>\n        <para>Android platform options.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.androidBuildSystem\">\n      <summary>\n        <para>Set which build system to use for building the Android package.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.androidETC2Fallback\">\n      <summary>\n        <para>ETC2 texture decompression fallback on Android devices that don't support ETC2.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.buildScriptsOnly\">\n      <summary>\n        <para>Is build script only enabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.compressFilesInPackage\">\n      <summary>\n        <para>Compress files in package.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.compressWithPsArc\">\n      <summary>\n        <para>Build data compressed with PSArc.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.connectProfiler\">\n      <summary>\n        <para>Start the player with a connection to the profiler.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.development\">\n      <summary>\n        <para>Enables a development build.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.enableHeadlessMode\">\n      <summary>\n        <para>Enables a Linux headless build.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.explicitArrayBoundsChecks\">\n      <summary>\n        <para>Are array bounds actively validated?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.explicitDivideByZeroChecks\">\n      <summary>\n        <para>Are divide by zero's actively validated?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.explicitNullChecks\">\n      <summary>\n        <para>Are null references actively validated?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.exportAsGoogleAndroidProject\">\n      <summary>\n        <para>Export Android Project for use with Android Studio/Gradle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.forceInstallation\">\n      <summary>\n        <para>Force installation of package, even if error.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.forceOptimizeScriptCompilation\">\n      <summary>\n        <para>Force full optimizations for script complilation in Development builds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.installInBuildFolder\">\n      <summary>\n        <para>Place the built player in the build folder.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.iOSBuildConfigType\">\n      <summary>\n        <para>Scheme with which the project will be run in Xcode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.movePackageToDiscOuterEdge\">\n      <summary>\n        <para>Places the package on the outer edge of the disk.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.n3dsCreateCIAFile\">\n      <summary>\n        <para>Create a .cia \"download image\" for deploying to test kits (3DS).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.needSubmissionMaterials\">\n      <summary>\n        <para>Build submission materials.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.ps4BuildSubtarget\">\n      <summary>\n        <para>PS4 Build Subtarget.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.ps4HardwareTarget\">\n      <summary>\n        <para>Specifies which version of PS4 hardware to target.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.psp2BuildSubtarget\">\n      <summary>\n        <para>PS Vita Build subtarget.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.selectedBuildTargetGroup\">\n      <summary>\n        <para>The currently selected build target group.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.selectedStandaloneTarget\">\n      <summary>\n        <para>The currently selected target for a standalone build.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.streamingInstallLaunchRange\">\n      <summary>\n        <para>When building an Xbox One Streaming Install package (makepkg.exe) The layout generation code in Unity will assign each scene and associated assets to individual chunks. Unity will mark scene 0 as being part of the launch range, IE the set of chunks required to launch the game, you may include additional scenes in this launch range if you desire, this specifies a range of scenes (starting at 0) to be included in the launch set. </para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.symlinkLibraries\">\n      <summary>\n        <para>Symlink runtime libraries with an iOS Xcode project.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.webGLUsePreBuiltUnityEngine\">\n      <summary>\n        <para>Use prebuilt JavaScript version of Unity engine.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.wsaGenerateReferenceProjects\">\n      <summary>\n        <para>Generate and reference C# projects from your main solution.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.wsaHolographicRemoting\">\n      <summary>\n        <para>Enable an application to connect to a remote HoloLens device and stream holographic content.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.wsaSubtarget\">\n      <summary>\n        <para>Sets and gets target device type for the application to run on when building to Windows Store platform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.wsaUWPSDK\">\n      <summary>\n        <para>Sets and gets target UWP SDK to build Windows Store application against.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.wsaUWPVisualStudioVersion\">\n      <summary>\n        <para>Sets and gets Visual Studio version to build Windows Store application with.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.xboxBuildSubtarget\">\n      <summary>\n        <para>Xbox Build subtarget.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.xboxOneDeployDrive\">\n      <summary>\n        <para>The currently selected Xbox One Deploy Drive.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.xboxOneDeployMethod\">\n      <summary>\n        <para>The currently selected Xbox One Deploy Method.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.xboxOneNetworkSharePath\">\n      <summary>\n        <para>Network shared folder path e.g.\nMYCOMPUTER\\SHAREDFOLDER\\.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.xboxOneRebootIfDeployFailsAndRetry\">\n      <summary>\n        <para>Sets the XBox to reboot and redeploy when the deployment fails.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUserBuildSettings.xboxOneUsername\">\n      <summary>\n        <para>Windows account username associated with PC share folder.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorUserBuildSettings.GetBuildLocation(UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Get the current location for the build.</para>\n      </summary>\n      <param name=\"target\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUserBuildSettings.GetPlatformSettings(System.String,System.String)\">\n      <summary>\n        <para>Returns value for platform specifc Editor setting.</para>\n      </summary>\n      <param name=\"platformName\">The name of the platform.</param>\n      <param name=\"name\">The name of the setting.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUserBuildSettings.GetWSADotNetNative(UnityEditor.WSABuildType)\">\n      <summary>\n        <para>Is .NET Native enabled for specific build configuration.\nMore information - https:msdn.microsoft.comen-uslibrary/dn584397(v=vs.110).aspx.</para>\n      </summary>\n      <param name=\"config\">Build configuration.</param>\n      <returns>\n        <para>True if .NET Native is enabled for the specific build configuration.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorUserBuildSettings.SetBuildLocation(UnityEditor.BuildTarget,System.String)\">\n      <summary>\n        <para>Set a new location for the build.</para>\n      </summary>\n      <param name=\"target\"></param>\n      <param name=\"location\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUserBuildSettings.SetPlatformSettings(System.String,System.String,System.String)\">\n      <summary>\n        <para>Set platform specifc Editor setting.</para>\n      </summary>\n      <param name=\"platformName\">The name of the platform.</param>\n      <param name=\"name\">The name of the setting.</param>\n      <param name=\"value\">Setting value.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUserBuildSettings.SetWSADotNetNative(UnityEditor.WSABuildType,System.Boolean)\">\n      <summary>\n        <para>Enables or Disables .NET Native for specific build configuration.\nMore information - https:msdn.microsoft.comen-uslibrary/dn584397(v=vs.110).aspx.</para>\n      </summary>\n      <param name=\"config\">Build configuration.</param>\n      <param name=\"enabled\">Is enabled?</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUserBuildSettings.SwitchActiveBuildTarget(UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Select a new build target to be active.</para>\n      </summary>\n      <param name=\"target\">Target build platform.</param>\n      <param name=\"targetGroup\">Build target group.</param>\n      <returns>\n        <para>True if the build target was successfully switched, false otherwise (for example, if license checks fail, files are missing, or if the user has cancelled the operation via the UI).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorUserBuildSettings.SwitchActiveBuildTarget(UnityEditor.BuildTargetGroup,UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Select a new build target to be active.</para>\n      </summary>\n      <param name=\"target\">Target build platform.</param>\n      <param name=\"targetGroup\">Build target group.</param>\n      <returns>\n        <para>True if the build target was successfully switched, false otherwise (for example, if license checks fail, files are missing, or if the user has cancelled the operation via the UI).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorUserBuildSettings.SwitchActiveBuildTargetAsync(UnityEditor.BuildTargetGroup,UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Select a new build target to be active during the next Editor update.</para>\n      </summary>\n      <param name=\"targetGroup\">Target build platform.</param>\n      <param name=\"target\">Build target group.</param>\n      <returns>\n        <para>True if the build target was successfully switched, false otherwise (for example, if license checks fail, files are missing, or if the user has cancelled the operation via the UI).</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.EditorUtility\">\n      <summary>\n        <para>Editor utility functions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorUtility.scriptCompilationFailed\">\n      <summary>\n        <para>True if there are any compilation error messages in the log.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.ClearProgressBar\">\n      <summary>\n        <para>Removes progress bar.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.CollectDeepHierarchy(UnityEngine.Object[])\">\n      <summary>\n        <para>Collect all objects in the hierarchy rooted at each of the given objects.</para>\n      </summary>\n      <param name=\"roots\">Array of objects where the search will start.</param>\n      <returns>\n        <para>Array of objects heirarchically attached to the search array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.CollectDependencies(UnityEngine.Object[])\">\n      <summary>\n        <para>Calculates and returns a list of all assets the assets listed in roots depend on.</para>\n      </summary>\n      <param name=\"roots\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.CompressCubemapTexture(UnityEngine.Cubemap,UnityEngine.TextureFormat,System.Int32)\">\n      <summary>\n        <para>Compress a cubemap texture.</para>\n      </summary>\n      <param name=\"texture\"></param>\n      <param name=\"format\"></param>\n      <param name=\"quality\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.CompressCubemapTexture(UnityEngine.Cubemap,UnityEngine.TextureFormat,UnityEngine.TextureCompressionQuality)\">\n      <summary>\n        <para>Compress a cubemap texture.</para>\n      </summary>\n      <param name=\"texture\"></param>\n      <param name=\"format\"></param>\n      <param name=\"quality\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.CompressTexture(UnityEngine.Texture2D,UnityEngine.TextureFormat,System.Int32)\">\n      <summary>\n        <para>Compress a texture.</para>\n      </summary>\n      <param name=\"texture\"></param>\n      <param name=\"format\"></param>\n      <param name=\"quality\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.CompressTexture(UnityEngine.Texture2D,UnityEngine.TextureFormat,UnityEngine.TextureCompressionQuality)\">\n      <summary>\n        <para>Compress a texture.</para>\n      </summary>\n      <param name=\"texture\"></param>\n      <param name=\"format\"></param>\n      <param name=\"quality\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.CopySerialized(UnityEngine.Object,UnityEngine.Object)\">\n      <summary>\n        <para>Copy all settings of a Unity Object.</para>\n      </summary>\n      <param name=\"source\"></param>\n      <param name=\"dest\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.CopySerializedIfDifferent(UnityEngine.Object,UnityEngine.Object)\">\n      <summary>\n        <para>Copy all settings of a Unity Object to a second Object if they differ.</para>\n      </summary>\n      <param name=\"source\"></param>\n      <param name=\"dest\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.CreateGameObjectWithHideFlags(System.String,UnityEngine.HideFlags,System.Type[])\">\n      <summary>\n        <para>Creates a game object with HideFlags and specified components.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"flags\"></param>\n      <param name=\"components\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.DisplayCancelableProgressBar(System.String,System.String,System.Single)\">\n      <summary>\n        <para>Displays or updates a progress bar that has a cancel button.</para>\n      </summary>\n      <param name=\"title\"></param>\n      <param name=\"info\"></param>\n      <param name=\"progress\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.DisplayDialog(System.String,System.String,System.String)\">\n      <summary>\n        <para>Displays a modal dialog.</para>\n      </summary>\n      <param name=\"title\">The title of the message box.</param>\n      <param name=\"message\">The text of the message.</param>\n      <param name=\"ok\">Label displayed on the OK dialog button.</param>\n      <param name=\"cancel\">Label displayed on the Cancel dialog button.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.DisplayDialog(System.String,System.String,System.String,System.String)\">\n      <summary>\n        <para>Displays a modal dialog.</para>\n      </summary>\n      <param name=\"title\">The title of the message box.</param>\n      <param name=\"message\">The text of the message.</param>\n      <param name=\"ok\">Label displayed on the OK dialog button.</param>\n      <param name=\"cancel\">Label displayed on the Cancel dialog button.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.DisplayDialogComplex(System.String,System.String,System.String,System.String,System.String)\">\n      <summary>\n        <para>Displays a modal dialog with three buttons.</para>\n      </summary>\n      <param name=\"title\">Title for dialog.</param>\n      <param name=\"message\">Purpose for the dialog.</param>\n      <param name=\"ok\">Dialog function chosen.</param>\n      <param name=\"cancel\">Close dialog with no operation.</param>\n      <param name=\"alt\">Choose alternative dialog purpose.</param>\n      <returns>\n        <para>The id of the chosen button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.DisplayPopupMenu(UnityEngine.Rect,System.String,UnityEditor.MenuCommand)\">\n      <summary>\n        <para>Displays a popup menu.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"menuItemPath\"></param>\n      <param name=\"command\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.DisplayProgressBar(System.String,System.String,System.Single)\">\n      <summary>\n        <para>Displays or updates a progress bar.</para>\n      </summary>\n      <param name=\"title\"></param>\n      <param name=\"info\"></param>\n      <param name=\"progress\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.ExtractOggFile(UnityEngine.Object,System.String)\">\n      <summary>\n        <para>Saves an AudioClip or MovieTexture to a file.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.FocusProjectWindow\">\n      <summary>\n        <para>Brings the project window to the front and focuses it.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.FormatBytes(System.Int32)\">\n      <summary>\n        <para>Returns a text for a number of bytes.</para>\n      </summary>\n      <param name=\"bytes\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.GetObjectEnabled(UnityEngine.Object)\">\n      <summary>\n        <para>Is the object enabled (0 disabled, 1 enabled, -1 has no enabled button).</para>\n      </summary>\n      <param name=\"target\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.InstanceIDToObject(System.Int32)\">\n      <summary>\n        <para>Translates an instance ID to a reference to an object.</para>\n      </summary>\n      <param name=\"instanceID\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.IsPersistent(UnityEngine.Object)\">\n      <summary>\n        <para>Determines if an object is stored on disk.</para>\n      </summary>\n      <param name=\"target\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.NaturalCompare(System.String,System.String)\">\n      <summary>\n        <para>Human-like sorting.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.OpenFilePanel(System.String,System.String,System.String)\">\n      <summary>\n        <para>Displays the \"open file\" dialog and returns the selected path name.</para>\n      </summary>\n      <param name=\"title\"></param>\n      <param name=\"directory\"></param>\n      <param name=\"extension\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.OpenFilePanelWithFilters(System.String,System.String,System.String[])\">\n      <summary>\n        <para>Displays the \"open file\" dialog and returns the selected path name.</para>\n      </summary>\n      <param name=\"title\">Title for dialog.</param>\n      <param name=\"directory\">Default directory.</param>\n      <param name=\"filters\">File extensions in form { \"Image files\", \"png,jpg,jpeg\", \"All files\", \"*\" }.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.OpenFolderPanel(System.String,System.String,System.String)\">\n      <summary>\n        <para>Displays the \"open folder\" dialog and returns the selected path name.</para>\n      </summary>\n      <param name=\"title\"></param>\n      <param name=\"folder\"></param>\n      <param name=\"defaultName\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.SaveFilePanel(System.String,System.String,System.String,System.String)\">\n      <summary>\n        <para>Displays the \"save file\" dialog and returns the selected path name.</para>\n      </summary>\n      <param name=\"title\"></param>\n      <param name=\"directory\"></param>\n      <param name=\"defaultName\"></param>\n      <param name=\"extension\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.SaveFilePanelInProject(System.String,System.String,System.String,System.String)\">\n      <summary>\n        <para>Displays the \"save file\" dialog in the Assets folder of the project and returns the selected path name.</para>\n      </summary>\n      <param name=\"title\"></param>\n      <param name=\"defaultName\"></param>\n      <param name=\"extension\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.SaveFolderPanel(System.String,System.String,System.String)\">\n      <summary>\n        <para>Displays the \"save folder\" dialog and returns the selected path name.</para>\n      </summary>\n      <param name=\"title\"></param>\n      <param name=\"folder\"></param>\n      <param name=\"defaultName\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.SetCameraAnimateMaterials(UnityEngine.Camera,System.Boolean)\">\n      <summary>\n        <para>Sets this camera to allow animation of materials in the Editor.</para>\n      </summary>\n      <param name=\"camera\"></param>\n      <param name=\"animate\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.SetCameraAnimateMaterialsTime(UnityEngine.Camera,System.Single)\">\n      <summary>\n        <para>Sets the global time for this camera to use when rendering.</para>\n      </summary>\n      <param name=\"camera\"></param>\n      <param name=\"time\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.SetDirty(UnityEngine.Object)\">\n      <summary>\n        <para>Marks target object as dirty. (Only suitable for non-scene objects).</para>\n      </summary>\n      <param name=\"target\">The object to mark as dirty.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.SetObjectEnabled(UnityEngine.Object,System.Boolean)\">\n      <summary>\n        <para>Set the enabled state of the object.</para>\n      </summary>\n      <param name=\"target\"></param>\n      <param name=\"enabled\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.SetSelectedRenderState(UnityEngine.Renderer,UnityEditor.EditorSelectedRenderState)\">\n      <summary>\n        <para>Set the Scene View selected display mode for this Renderer.</para>\n      </summary>\n      <param name=\"renderer\"></param>\n      <param name=\"renderState\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.SetSelectedWireframeHidden(UnityEngine.Renderer,System.Boolean)\">\n      <summary>\n        <para>Sets whether the selected Renderer's wireframe will be hidden when the GameObject it is attached to is selected.</para>\n      </summary>\n      <param name=\"renderer\"></param>\n      <param name=\"enabled\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.UnloadUnusedAssetsImmediate\">\n      <summary>\n        <para>Unloads assets that are not used.</para>\n      </summary>\n      <param name=\"ignoreReferencesFromScript\">When true delete assets even if linked in scripts.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.UnloadUnusedAssetsImmediate\">\n      <summary>\n        <para>Unloads assets that are not used.</para>\n      </summary>\n      <param name=\"ignoreReferencesFromScript\">When true delete assets even if linked in scripts.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorUtility.UpdateGlobalShaderProperties(System.Single)\">\n      <summary>\n        <para>Updates the global shader properties to use when rendering.</para>\n      </summary>\n      <param name=\"time\">Time to use. -1 to disable.</param>\n    </member>\n    <member name=\"T:UnityEditor.EditorWindow\">\n      <summary>\n        <para>Derive from this class to create an editor window.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorWindow.autoRepaintOnSceneChange\">\n      <summary>\n        <para>Does the window automatically repaint whenever the scene has changed?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorWindow.focusedWindow\">\n      <summary>\n        <para>The EditorWindow which currently has keyboard focus. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorWindow.maximized\">\n      <summary>\n        <para>Is this window maximized?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorWindow.maxSize\">\n      <summary>\n        <para>The maximum size of this window.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorWindow.minSize\">\n      <summary>\n        <para>The minimum size of this window.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorWindow.mouseOverWindow\">\n      <summary>\n        <para>The EditorWindow currently under the mouse cursor. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorWindow.position\">\n      <summary>\n        <para>The desired position of the window in screen space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorWindow.title\">\n      <summary>\n        <para>The title of this window.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorWindow.titleContent\">\n      <summary>\n        <para>The GUIContent used for drawing the title of EditorWindows.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorWindow.wantsMouseEnterLeaveWindow\">\n      <summary>\n        <para>Checks whether MouseEnterWindow and MouseLeaveWindow events are received in the GUI in this Editor window.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.EditorWindow.wantsMouseMove\">\n      <summary>\n        <para>Checks whether MouseMove events are received in the GUI in this Editor window.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.BeginWindows\">\n      <summary>\n        <para>Mark the beginning area of all popup windows.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.Close\">\n      <summary>\n        <para>Close the editor window.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.EndWindows\">\n      <summary>\n        <para>Close a window group started with EditorWindow.BeginWindows.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.Focus\">\n      <summary>\n        <para>Moves keyboard focus to another EditorWindow.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.FocusWindowIfItsOpen(System.Type)\">\n      <summary>\n        <para>Focuses the first found EditorWindow of specified type if it is open.</para>\n      </summary>\n      <param name=\"t\">The type of the window. Must derive from EditorWindow.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.FocusWindowIfItsOpen\">\n      <summary>\n        <para>Focuses the first found EditorWindow of type T if it is open.</para>\n      </summary>\n      <param name=\"T\">The type of the window. Must derive from EditorWindow.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindow(System.Type)\">\n      <summary>\n        <para>Returns the first EditorWindow of type t which is currently on the screen.</para>\n      </summary>\n      <param name=\"t\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"utility\">Set this to true, to create a floating utility window, false to create a normal window.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n      <param name=\"focus\">Whether to give the window focus, if it already exists. (If GetWindow creates a new window, it will always get focus).</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindow(System.Type,System.Boolean)\">\n      <summary>\n        <para>Returns the first EditorWindow of type t which is currently on the screen.</para>\n      </summary>\n      <param name=\"t\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"utility\">Set this to true, to create a floating utility window, false to create a normal window.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n      <param name=\"focus\">Whether to give the window focus, if it already exists. (If GetWindow creates a new window, it will always get focus).</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindow(System.Type,System.Boolean,System.String)\">\n      <summary>\n        <para>Returns the first EditorWindow of type t which is currently on the screen.</para>\n      </summary>\n      <param name=\"t\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"utility\">Set this to true, to create a floating utility window, false to create a normal window.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n      <param name=\"focus\">Whether to give the window focus, if it already exists. (If GetWindow creates a new window, it will always get focus).</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindow(System.Type,System.Boolean,System.String,System.Boolean)\">\n      <summary>\n        <para>Returns the first EditorWindow of type t which is currently on the screen.</para>\n      </summary>\n      <param name=\"t\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"utility\">Set this to true, to create a floating utility window, false to create a normal window.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n      <param name=\"focus\">Whether to give the window focus, if it already exists. (If GetWindow creates a new window, it will always get focus).</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindow\">\n      <summary>\n        <para>Returns the first EditorWindow of type T which is currently on the screen.</para>\n      </summary>\n      <param name=\"T\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"utility\">Set this to true, to create a floating utility window, false to create a normal window.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n      <param name=\"focus\">Whether to give the window focus, if it already exists. (If GetWindow creates a new window, it will always get focus).</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindow(System.Boolean)\">\n      <summary>\n        <para>Returns the first EditorWindow of type T which is currently on the screen.</para>\n      </summary>\n      <param name=\"T\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"utility\">Set this to true, to create a floating utility window, false to create a normal window.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n      <param name=\"focus\">Whether to give the window focus, if it already exists. (If GetWindow creates a new window, it will always get focus).</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindow(System.Boolean,System.String)\">\n      <summary>\n        <para>Returns the first EditorWindow of type T which is currently on the screen.</para>\n      </summary>\n      <param name=\"T\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"utility\">Set this to true, to create a floating utility window, false to create a normal window.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n      <param name=\"focus\">Whether to give the window focus, if it already exists. (If GetWindow creates a new window, it will always get focus).</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindow(System.String)\">\n      <summary>\n        <para>Returns the first EditorWindow of type T which is currently on the screen.</para>\n      </summary>\n      <param name=\"T\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"utility\">Set this to true, to create a floating utility window, false to create a normal window.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n      <param name=\"focus\">Whether to give the window focus, if it already exists. (If GetWindow creates a new window, it will always get focus).</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindow(System.String,System.Boolean)\">\n      <summary>\n        <para>Returns the first EditorWindow of type T which is currently on the screen.</para>\n      </summary>\n      <param name=\"T\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"utility\">Set this to true, to create a floating utility window, false to create a normal window.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n      <param name=\"focus\">Whether to give the window focus, if it already exists. (If GetWindow creates a new window, it will always get focus).</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindow(System.Boolean,System.String,System.Boolean)\">\n      <summary>\n        <para>Returns the first EditorWindow of type T which is currently on the screen.</para>\n      </summary>\n      <param name=\"T\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"utility\">Set this to true, to create a floating utility window, false to create a normal window.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n      <param name=\"focus\">Whether to give the window focus, if it already exists. (If GetWindow creates a new window, it will always get focus).</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindow(System.Type[])\">\n      <summary>\n        <para>Returns the first EditorWindow of type T which is currently on the screen.</para>\n      </summary>\n      <param name=\"T\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n      <param name=\"desiredDockNextTo\">An array of EditorWindow types that the window will attempt to dock onto.</param>\n      <param name=\"focus\">Whether to give the window focus, if it already exists. (If GetWindow creates a new window, it will always get focus).</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindow(System.String,System.Type[])\">\n      <summary>\n        <para>Returns the first EditorWindow of type T which is currently on the screen.</para>\n      </summary>\n      <param name=\"T\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n      <param name=\"desiredDockNextTo\">An array of EditorWindow types that the window will attempt to dock onto.</param>\n      <param name=\"focus\">Whether to give the window focus, if it already exists. (If GetWindow creates a new window, it will always get focus).</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindow(System.String,System.Boolean,System.Type[])\">\n      <summary>\n        <para>Returns the first EditorWindow of type T which is currently on the screen.</para>\n      </summary>\n      <param name=\"T\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n      <param name=\"desiredDockNextTo\">An array of EditorWindow types that the window will attempt to dock onto.</param>\n      <param name=\"focus\">Whether to give the window focus, if it already exists. (If GetWindow creates a new window, it will always get focus).</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindowWithRect(System.Type,UnityEngine.Rect)\">\n      <summary>\n        <para>Returns the first EditorWindow of type t which is currently on the screen.</para>\n      </summary>\n      <param name=\"t\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"rect\">The position on the screen where a newly created window will show.</param>\n      <param name=\"utility\">Set this to true, to create a floating utility window, false to create a normal window.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindowWithRect(System.Type,UnityEngine.Rect,System.Boolean)\">\n      <summary>\n        <para>Returns the first EditorWindow of type t which is currently on the screen.</para>\n      </summary>\n      <param name=\"t\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"rect\">The position on the screen where a newly created window will show.</param>\n      <param name=\"utility\">Set this to true, to create a floating utility window, false to create a normal window.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindowWithRect(System.Type,UnityEngine.Rect,System.Boolean,System.String)\">\n      <summary>\n        <para>Returns the first EditorWindow of type t which is currently on the screen.</para>\n      </summary>\n      <param name=\"t\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"rect\">The position on the screen where a newly created window will show.</param>\n      <param name=\"utility\">Set this to true, to create a floating utility window, false to create a normal window.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindowWithRect(UnityEngine.Rect)\">\n      <summary>\n        <para>Returns the first EditorWindow of type t which is currently on the screen.</para>\n      </summary>\n      <param name=\"t\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"rect\">The position on the screen where a newly created window will show.</param>\n      <param name=\"utility\">Set this to true, to create a floating utility window, false to create a normal window.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n      <param name=\"focus\">Whether to give the window focus, if it already exists. (If GetWindow creates a new window, it will always get focus).</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindowWithRect(UnityEngine.Rect,System.Boolean)\">\n      <summary>\n        <para>Returns the first EditorWindow of type t which is currently on the screen.</para>\n      </summary>\n      <param name=\"t\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"rect\">The position on the screen where a newly created window will show.</param>\n      <param name=\"utility\">Set this to true, to create a floating utility window, false to create a normal window.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n      <param name=\"focus\">Whether to give the window focus, if it already exists. (If GetWindow creates a new window, it will always get focus).</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindowWithRect(UnityEngine.Rect,System.Boolean,System.String)\">\n      <summary>\n        <para>Returns the first EditorWindow of type t which is currently on the screen.</para>\n      </summary>\n      <param name=\"t\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"rect\">The position on the screen where a newly created window will show.</param>\n      <param name=\"utility\">Set this to true, to create a floating utility window, false to create a normal window.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n      <param name=\"focus\">Whether to give the window focus, if it already exists. (If GetWindow creates a new window, it will always get focus).</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.GetWindowWithRect(UnityEngine.Rect,System.Boolean,System.String,System.Boolean)\">\n      <summary>\n        <para>Returns the first EditorWindow of type t which is currently on the screen.</para>\n      </summary>\n      <param name=\"t\">The type of the window. Must derive from EditorWindow.</param>\n      <param name=\"rect\">The position on the screen where a newly created window will show.</param>\n      <param name=\"utility\">Set this to true, to create a floating utility window, false to create a normal window.</param>\n      <param name=\"title\">If GetWindow creates a new window, it will get this title. If this value is null, use the class name as title.</param>\n      <param name=\"focus\">Whether to give the window focus, if it already exists. (If GetWindow creates a new window, it will always get focus).</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.RemoveNotification\">\n      <summary>\n        <para>Stop showing notification message.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.Repaint\">\n      <summary>\n        <para>Make the window repaint.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.SendEvent(UnityEngine.Event)\">\n      <summary>\n        <para>Sends an Event to a window.</para>\n      </summary>\n      <param name=\"e\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.Show\">\n      <summary>\n        <para>Show the EditorWindow window.</para>\n      </summary>\n      <param name=\"immediateDisplay\">Immediately display Show.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.Show(System.Boolean)\">\n      <summary>\n        <para>Show the EditorWindow window.</para>\n      </summary>\n      <param name=\"immediateDisplay\">Immediately display Show.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.ShowAsDropDown(UnityEngine.Rect,UnityEngine.Vector2)\">\n      <summary>\n        <para>Shows a window with dropdown behaviour and styling.</para>\n      </summary>\n      <param name=\"buttonRect\">The button from which the position of the window will be determined (see description).</param>\n      <param name=\"windowSize\">The initial size of the window.</param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.ShowAuxWindow\">\n      <summary>\n        <para>Show the editor window in the auxiliary window.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.ShowNotification(UnityEngine.GUIContent)\">\n      <summary>\n        <para>Show a notification message.</para>\n      </summary>\n      <param name=\"notification\"></param>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.ShowPopup\">\n      <summary>\n        <para>Shows an Editor window using popup-style framing.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.EditorWindow.ShowUtility\">\n      <summary>\n        <para>Show the EditorWindow as a floating utility window.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Events.UnityEventTools\">\n      <summary>\n        <para>Editor tools for working with persistent UnityEvents.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.AddBoolPersistentListener(UnityEngine.Events.UnityEventBase,UnityEngine.Events.UnityAction`1&lt;System.Boolean&gt;,System.Boolean)\">\n      <summary>\n        <para>Adds a persistent, preset call to the listener.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"call\">Function to call.</param>\n      <param name=\"argument\">Argument to use when invoking.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.AddFloatPersistentListener(UnityEngine.Events.UnityEventBase,UnityEngine.Events.UnityAction`1&lt;System.Single&gt;,System.Single)\">\n      <summary>\n        <para>Adds a persistent, preset call to the listener.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"call\">Function to call.</param>\n      <param name=\"argument\">Argument to use when invoking.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.AddIntPersistentListener(UnityEngine.Events.UnityEventBase,UnityEngine.Events.UnityAction`1&lt;System.Int32&gt;,System.Int32)\">\n      <summary>\n        <para>Adds a persistent, preset call to the listener.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"call\">Function to call.</param>\n      <param name=\"argument\">Argument to use when invoking.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.AddObjectPersistentListener(UnityEngine.Events.UnityEventBase,UnityEngine.Events.UnityAction`1&lt;T&gt;,T)\">\n      <summary>\n        <para>Adds a persistent, preset call to the listener.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"call\">Function to call.</param>\n      <param name=\"argument\">Argument to use when invoking.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.AddPersistentListener(UnityEngine.Events.UnityEventBase)\">\n      <summary>\n        <para>Adds a persistent, call to the listener. Will be invoked with the arguments as defined by the Event and sent from the call location.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"call\">Function to call.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.AddPersistentListener(UnityEngine.Events.UnityEvent,UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Adds a persistent, call to the listener. Will be invoked with the arguments as defined by the Event and sent from the call location.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"call\">Function to call.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.AddPersistentListener(UnityEngine.Events.UnityEvent`1&lt;T0&gt;,UnityEngine.Events.UnityAction`1&lt;T0&gt;)\">\n      <summary>\n        <para>Adds a persistent, call to the listener. Will be invoked with the arguments as defined by the Event and sent from the call location.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"call\">Function to call.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.AddPersistentListener(UnityEngine.Events.UnityEvent`2&lt;T0,T1&gt;,UnityEngine.Events.UnityAction`2&lt;T0,T1&gt;)\">\n      <summary>\n        <para>Adds a persistent, call to the listener. Will be invoked with the arguments as defined by the Event and sent from the call location.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"call\">Function to call.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.AddPersistentListener(UnityEngine.Events.UnityEvent`3&lt;T0,T1,T2&gt;,UnityEngine.Events.UnityAction`3&lt;T0,T1,T2&gt;)\">\n      <summary>\n        <para>Adds a persistent, call to the listener. Will be invoked with the arguments as defined by the Event and sent from the call location.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"call\">Function to call.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.AddPersistentListener(UnityEngine.Events.UnityEvent`4&lt;T0,T1,T2,T3&gt;,UnityEngine.Events.UnityAction`4&lt;T0,T1,T2,T3&gt;)\">\n      <summary>\n        <para>Adds a persistent, call to the listener. Will be invoked with the arguments as defined by the Event and sent from the call location.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"call\">Function to call.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.AddStringPersistentListener(UnityEngine.Events.UnityEventBase,UnityEngine.Events.UnityAction`1&lt;System.String&gt;,System.String)\">\n      <summary>\n        <para>Adds a persistent, preset call to the listener.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"call\">Function to call.</param>\n      <param name=\"argument\">Argument to use when invoking.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.AddVoidPersistentListener(UnityEngine.Events.UnityEventBase,UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Adds a persistent, preset call to the listener.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"call\">Function to call.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.RegisterBoolPersistentListener(UnityEngine.Events.UnityEventBase,System.Int32,UnityEngine.Events.UnityAction`1&lt;System.Boolean&gt;,System.Boolean)\">\n      <summary>\n        <para>Modifies the event at the given index.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"index\">Index to modify.</param>\n      <param name=\"call\">Function to call.</param>\n      <param name=\"argument\">Argument to use when invoking.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.RegisterFloatPersistentListener(UnityEngine.Events.UnityEventBase,System.Int32,UnityEngine.Events.UnityAction`1&lt;System.Single&gt;,System.Single)\">\n      <summary>\n        <para>Modifies the event at the given index.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"index\">Index to modify.</param>\n      <param name=\"call\">Function to call.</param>\n      <param name=\"argument\">Argument to use when invoking.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.RegisterIntPersistentListener(UnityEngine.Events.UnityEventBase,System.Int32,UnityEngine.Events.UnityAction`1&lt;System.Int32&gt;,System.Int32)\">\n      <summary>\n        <para>Modifies the event at the given index.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"index\">Index to modify.</param>\n      <param name=\"call\">Function to call.</param>\n      <param name=\"argument\">Argument to use when invoking.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.RegisterObjectPersistentListener(UnityEngine.Events.UnityEventBase,System.Int32,UnityEngine.Events.UnityAction`1&lt;T&gt;,T)\">\n      <summary>\n        <para>Modifies the event at the given index.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"index\">Index to modify.</param>\n      <param name=\"call\">Function to call.</param>\n      <param name=\"argument\">Argument to use when invoking.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.RegisterPersistentListener(UnityEngine.Events.UnityEvent,System.Int32,UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Modifies the event at the given index.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"index\">Index to modify.</param>\n      <param name=\"call\">Function to call.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.RegisterPersistentListener(UnityEngine.Events.UnityEvent`1&lt;T0&gt;,System.Int32,UnityEngine.Events.UnityAction`1&lt;T0&gt;)\">\n      <summary>\n        <para>Modifies the event at the given index.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"index\">Index to modify.</param>\n      <param name=\"call\">Function to call.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.RegisterPersistentListener(UnityEngine.Events.UnityEvent`2&lt;T0,T1&gt;,System.Int32,UnityEngine.Events.UnityAction`2&lt;T0,T1&gt;)\">\n      <summary>\n        <para>Modifies the event at the given index.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"index\">Index to modify.</param>\n      <param name=\"call\">Function to call.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.RegisterPersistentListener(UnityEngine.Events.UnityEvent`3&lt;T0,T1,T2&gt;,System.Int32,UnityEngine.Events.UnityAction`3&lt;T0,T1,T2&gt;)\">\n      <summary>\n        <para>Modifies the event at the given index.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"index\">Index to modify.</param>\n      <param name=\"call\">Function to call.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.RegisterPersistentListener(UnityEngine.Events.UnityEvent`4&lt;T0,T1,T2,T3&gt;,System.Int32,UnityEngine.Events.UnityAction`4&lt;T0,T1,T2,T3&gt;)\">\n      <summary>\n        <para>Modifies the event at the given index.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"index\">Index to modify.</param>\n      <param name=\"call\">Function to call.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.RegisterStringPersistentListener(UnityEngine.Events.UnityEventBase,System.Int32,UnityEngine.Events.UnityAction`1&lt;System.String&gt;,System.String)\">\n      <summary>\n        <para>Modifies the event at the given index.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"index\">Index to modify.</param>\n      <param name=\"call\">Function to call.</param>\n      <param name=\"argument\">Argument to use when invoking.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.RegisterVoidPersistentListener(UnityEngine.Events.UnityEventBase,System.Int32,UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Modifies the event at the given index.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"index\">Index to modify.</param>\n      <param name=\"call\">Function to call.</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.RemovePersistentListener(UnityEngine.Events.UnityEventBase,System.Int32)\">\n      <summary>\n        <para>Removes the given function from the event.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"index\">Index to remove (if specified).</param>\n      <param name=\"call\">Function to remove (if specified).</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.RemovePersistentListener(UnityEngine.Events.UnityEventBase,UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Removes the given function from the event.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"index\">Index to remove (if specified).</param>\n      <param name=\"call\">Function to remove (if specified).</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.RemovePersistentListener(UnityEngine.Events.UnityEventBase,UnityEngine.Events.UnityAction`1&lt;T0&gt;)\">\n      <summary>\n        <para>Removes the given function from the event.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"index\">Index to remove (if specified).</param>\n      <param name=\"call\">Function to remove (if specified).</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.RemovePersistentListener(UnityEngine.Events.UnityEventBase,UnityEngine.Events.UnityAction`2&lt;T0,T1&gt;)\">\n      <summary>\n        <para>Removes the given function from the event.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"index\">Index to remove (if specified).</param>\n      <param name=\"call\">Function to remove (if specified).</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.RemovePersistentListener(UnityEngine.Events.UnityEventBase,UnityEngine.Events.UnityAction`3&lt;T0,T1,T2&gt;)\">\n      <summary>\n        <para>Removes the given function from the event.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"index\">Index to remove (if specified).</param>\n      <param name=\"call\">Function to remove (if specified).</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.RemovePersistentListener(UnityEngine.Events.UnityEventBase,UnityEngine.Events.UnityAction`4&lt;T0,T1,T2,T3&gt;)\">\n      <summary>\n        <para>Removes the given function from the event.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"index\">Index to remove (if specified).</param>\n      <param name=\"call\">Function to remove (if specified).</param>\n    </member>\n    <member name=\"M:UnityEditor.Events.UnityEventTools.UnregisterPersistentListener(UnityEngine.Events.UnityEventBase,System.Int32)\">\n      <summary>\n        <para>Unregisters the given listener at the specified index.</para>\n      </summary>\n      <param name=\"unityEvent\">Event to modify.</param>\n      <param name=\"index\">Index to unregister.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.Animations.GameObjectRecorder\">\n      <summary>\n        <para>Records the changing properties of a GameObject as the Scene runs and saves the information into an AnimationClip.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.Animations.GameObjectRecorder.currentTime\">\n      <summary>\n        <para>Returns the current time of the recording. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.Animations.GameObjectRecorder.isRecording\">\n      <summary>\n        <para>Returns true when the recorder is recording. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.Animations.GameObjectRecorder.root\">\n      <summary>\n        <para>The GameObject root of the animated hierarchy. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.Animations.GameObjectRecorder.Bind(UnityEditor.EditorCurveBinding)\">\n      <summary>\n        <para>Binds a GameObject's property as defined by EditorCurveBinding.</para>\n      </summary>\n      <param name=\"binding\">The binding definition.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.Animations.GameObjectRecorder.BindAll(UnityEngine.GameObject,System.Boolean)\">\n      <summary>\n        <para>Adds bindings for all of target's properties, and also for all the target's children if recursive is true.</para>\n      </summary>\n      <param name=\"target\">.root or any of its children.</param>\n      <param name=\"recursive\">Binds also all the target's children properties when set to true.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.Animations.GameObjectRecorder.BindComponent(UnityEngine.Component)\">\n      <summary>\n        <para>Adds bindings for all the properties of component.</para>\n      </summary>\n      <param name=\"component\">The component to bind.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.Animations.GameObjectRecorder.BindComponent(UnityEngine.GameObject,System.Type,System.Boolean)\">\n      <summary>\n        <para>TODO.</para>\n      </summary>\n      <param name=\"target\"></param>\n      <param name=\"componentType\"></param>\n      <param name=\"recursive\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.Animations.GameObjectRecorder.BindComponent(UnityEngine.GameObject,System.Boolean)\">\n      <summary>\n        <para>TODO.</para>\n      </summary>\n      <param name=\"target\"></param>\n      <param name=\"componentType\"></param>\n      <param name=\"recursive\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.Animations.GameObjectRecorder.BindComponentsOfType(UnityEngine.GameObject,System.Boolean)\">\n      <summary>\n        <para>Adds bindings for all the properties of the first component of type T found in target, and also for all the target's children if recursive is true.</para>\n      </summary>\n      <param name=\"target\">.root or any of its children.</param>\n      <param name=\"recursive\">Binds also the target's children transform properties when set to true.</param>\n      <param name=\"componentType\">Type of the component.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.Animations.GameObjectRecorder.BindComponentsOfType(UnityEngine.GameObject,System.Type,System.Boolean)\">\n      <summary>\n        <para>Adds bindings for all the properties of the first component of type T found in target, and also for all the target's children if recursive is true.</para>\n      </summary>\n      <param name=\"target\">.root or any of its children.</param>\n      <param name=\"recursive\">Binds also the target's children transform properties when set to true.</param>\n      <param name=\"componentType\">Type of the component.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.Animations.GameObjectRecorder.#ctor(UnityEngine.GameObject)\">\n      <summary>\n        <para>Create a new GameObjectRecorder.</para>\n      </summary>\n      <param name=\"root\">The root GameObject for the animated hierarchy.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.Animations.GameObjectRecorder.#ctor\">\n      <summary>\n        <para>TODO.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.Animations.GameObjectRecorder.GetBindings\">\n      <summary>\n        <para>Returns an array of all the bindings added to the recorder.</para>\n      </summary>\n      <returns>\n        <para>Array of bindings.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.Animations.GameObjectRecorder.ResetRecording\">\n      <summary>\n        <para>Reset the recording.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.Animations.GameObjectRecorder.SaveToClip(UnityEngine.AnimationClip)\">\n      <summary>\n        <para>Saves the recorded animation into clip.</para>\n      </summary>\n      <param name=\"clip\">Destination clip.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.Animations.GameObjectRecorder.TakeSnapshot(System.Single)\">\n      <summary>\n        <para>Forwards the animation by dt seconds, then record the values of the added bindings.</para>\n      </summary>\n      <param name=\"dt\">Delta time.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.AssetImporters.AssetImportContext\">\n      <summary>\n        <para>Defines the import context for scripted importers during an import event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.AssetImportContext.assetPath\">\n      <summary>\n        <para>The path of the source asset file to be imported.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.AssetImportContext.mainObject\">\n      <summary>\n        <para>The main object set on the AssetImportContext.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.AssetImportContext.selectedBuildTarget\">\n      <summary>\n        <para>This indicates what platform the import event is targeting.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImportContext.AddObjectToAsset(System.String,UnityEngine.Object)\">\n      <summary>\n        <para>Adds an object to the result of the import operation.</para>\n      </summary>\n      <param name=\"identifier\">A unique identifier associated to this object.</param>\n      <param name=\"obj\">The Unity Object to add to the asset.</param>\n      <param name=\"thumbnail\">An optional 2D texture to use as the thumbnail for this object.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImportContext.AddObjectToAsset(System.String,UnityEngine.Object,UnityEngine.Texture2D)\">\n      <summary>\n        <para>Adds an object to the result of the import operation.</para>\n      </summary>\n      <param name=\"identifier\">A unique identifier associated to this object.</param>\n      <param name=\"obj\">The Unity Object to add to the asset.</param>\n      <param name=\"thumbnail\">An optional 2D texture to use as the thumbnail for this object.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImportContext.DependsOnSourceAsset(System.String)\">\n      <summary>\n        <para>Creates dependency between the asset and a source asset.</para>\n      </summary>\n      <param name=\"path\">The path of the source dependency.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImportContext.GetObjects(System.Collections.Generic.List`1&lt;UnityEngine.Object&gt;)\">\n      <summary>\n        <para>Gets the list of objects set on the AssetImportContext.</para>\n      </summary>\n      <param name=\"objects\">The list of objects to be filled by the context.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImportContext.LogImportError(System.String,UnityEngine.Object)\">\n      <summary>\n        <para>Logs an error message encountered during import.</para>\n      </summary>\n      <param name=\"msg\">The error message.</param>\n      <param name=\"obj\">Optional Object that is targeted by the error.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImportContext.LogImportWarning(System.String,UnityEngine.Object)\">\n      <summary>\n        <para>Logs a warning message encountered during import.</para>\n      </summary>\n      <param name=\"msg\">The warning message.</param>\n      <param name=\"obj\">Optional Object that is targeted by the warning.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImportContext.SetMainObject(UnityEngine.Object)\">\n      <summary>\n        <para>Sets the main object for import.</para>\n      </summary>\n      <param name=\"obj\">The object to be set as the main object. This object must already be added with the AddObjectToAsset method.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.AssetImporters.AssetImporterEditor\">\n      <summary>\n        <para>Default editor for all asset importer settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.AssetImporterEditor.showImportedObject\">\n      <summary>\n        <para>Should imported object be shown as a separate editor?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.AssetImporterEditor.useAssetDrawPreview\">\n      <summary>\n        <para>Determines if the asset preview is handled by the AssetEditor or the Importer DrawPreview</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImporterEditor.Apply\">\n      <summary>\n        <para>Saves any changes from the Editor's control into the asset's import settings object.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImporterEditor.ApplyButton\">\n      <summary>\n        <para>Implements the 'Apply' button of the inspector.</para>\n      </summary>\n      <param name=\"buttonText\">Text to display on button.</param>\n      <returns>\n        <para>Returns true if the new settings were successfully applied</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImporterEditor.ApplyButton(System.String)\">\n      <summary>\n        <para>Implements the 'Apply' button of the inspector.</para>\n      </summary>\n      <param name=\"buttonText\">Text to display on button.</param>\n      <returns>\n        <para>Returns true if the new settings were successfully applied</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImporterEditor.ApplyRevertGUI\">\n      <summary>\n        <para>Add's the 'Apply' and 'Revert' buttons to the editor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImporterEditor.Awake\">\n      <summary>\n        <para>This function is called when the Editor script is started.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImporterEditor.HasModified\">\n      <summary>\n        <para>Determine if the import settings have been modified.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImporterEditor.OnApplyRevertGUI\">\n      <summary>\n        <para>Process the 'Apply' and 'Revert' buttons.</para>\n      </summary>\n      <returns>\n        <para>Returns true if the new settings were successfully applied.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImporterEditor.OnDisable\">\n      <summary>\n        <para>This function is called when the editor object goes out of scope.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImporterEditor.OnEnable\">\n      <summary>\n        <para>This function is called when the object is loaded.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImporterEditor.ResetValues\">\n      <summary>\n        <para>Reset the import settings to their last saved values.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImporterEditor.RevertButton\">\n      <summary>\n        <para>Implements the 'Revert' button of the inspector.</para>\n      </summary>\n      <param name=\"buttonText\">Text to display on button.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.AssetImporterEditor.RevertButton(System.String)\">\n      <summary>\n        <para>Implements the 'Revert' button of the inspector.</para>\n      </summary>\n      <param name=\"buttonText\">Text to display on button.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.AssetImporters.ScriptedImporter\">\n      <summary>\n        <para>Abstract base class for custom Asset importers.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.ScriptedImporter.OnImportAsset(UnityEditor.Experimental.AssetImporters.AssetImportContext)\">\n      <summary>\n        <para>This method must by overriden by the derived class and is called by the Asset pipeline to import files.</para>\n      </summary>\n      <param name=\"ctx\">This argument contains all the contextual information needed to process the import event and is also used by the custom importer to store the resulting Unity Asset.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.AssetImporters.ScriptedImporterAttribute\">\n      <summary>\n        <para>Class attribute used to register a custom asset importer derived from ScriptedImporter with Unity's Asset import pipeline.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.ScriptedImporterAttribute.fileExtensions\">\n      <summary>\n        <para>List of file extensions, without leading period character, that the scripted importer handles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.ScriptedImporterAttribute.importQueuePriority\">\n      <summary>\n        <para>Gives control over ordering of asset import based on types. Positive values delay the processing of source asset files while Negative values place them earlier in the import process.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.ScriptedImporterAttribute.version\">\n      <summary>\n        <para>Importer version number that is used by the import layer to detect new version of the importer and trigger re-imports when such events occur, to apply latest changes made to the scripted imrpoter.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.ScriptedImporterAttribute.#ctor(System.Int32,System.String[])\">\n      <summary>\n        <para>Use the ScriptedImporter attribute to register a custom importer derived from ScriptedImporter with Unity's Asset import pipeline.\n\nIt is best practice to always increment a scripted importer's version number whenever the script is changed. This forces assets imported with lower version numbers to be re-imported.\n\nIf the Unity Editor setting \"Auto-Update\" is set to enabled, editing a script outside of the editor and saving it will trigger both a re-import of the script and all assets of the corresponding type.</para>\n      </summary>\n      <param name=\"version\">A number that is used by the import pipeline to detect new versions of the importer script. Changing this number will trigger a re-import of all assets matching the listed extensions.</param>\n      <param name=\"exts\">List of file extensions (without leading period character) that the scripted importer handles.</param>\n      <param name=\"ext\">Single file extension (without leading period character) that the scripted importer handles.</param>\n      <param name=\"importQueueOffset\">Gives control over ordering of asset import based on types. Positive values delay the processing of source asset files while negative values place them earlier in the import process.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.ScriptedImporterAttribute.#ctor(System.Int32,System.String)\">\n      <summary>\n        <para>Use the ScriptedImporter attribute to register a custom importer derived from ScriptedImporter with Unity's Asset import pipeline.\n\nIt is best practice to always increment a scripted importer's version number whenever the script is changed. This forces assets imported with lower version numbers to be re-imported.\n\nIf the Unity Editor setting \"Auto-Update\" is set to enabled, editing a script outside of the editor and saving it will trigger both a re-import of the script and all assets of the corresponding type.</para>\n      </summary>\n      <param name=\"version\">A number that is used by the import pipeline to detect new versions of the importer script. Changing this number will trigger a re-import of all assets matching the listed extensions.</param>\n      <param name=\"exts\">List of file extensions (without leading period character) that the scripted importer handles.</param>\n      <param name=\"ext\">Single file extension (without leading period character) that the scripted importer handles.</param>\n      <param name=\"importQueueOffset\">Gives control over ordering of asset import based on types. Positive values delay the processing of source asset files while negative values place them earlier in the import process.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.ScriptedImporterAttribute.#ctor(System.Int32,System.String[],System.Int32)\">\n      <summary>\n        <para>Use the ScriptedImporter attribute to register a custom importer derived from ScriptedImporter with Unity's Asset import pipeline.\n\nIt is best practice to always increment a scripted importer's version number whenever the script is changed. This forces assets imported with lower version numbers to be re-imported.\n\nIf the Unity Editor setting \"Auto-Update\" is set to enabled, editing a script outside of the editor and saving it will trigger both a re-import of the script and all assets of the corresponding type.</para>\n      </summary>\n      <param name=\"version\">A number that is used by the import pipeline to detect new versions of the importer script. Changing this number will trigger a re-import of all assets matching the listed extensions.</param>\n      <param name=\"exts\">List of file extensions (without leading period character) that the scripted importer handles.</param>\n      <param name=\"ext\">Single file extension (without leading period character) that the scripted importer handles.</param>\n      <param name=\"importQueueOffset\">Gives control over ordering of asset import based on types. Positive values delay the processing of source asset files while negative values place them earlier in the import process.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.ScriptedImporterAttribute.#ctor(System.Int32,System.String,System.Int32)\">\n      <summary>\n        <para>Use the ScriptedImporter attribute to register a custom importer derived from ScriptedImporter with Unity's Asset import pipeline.\n\nIt is best practice to always increment a scripted importer's version number whenever the script is changed. This forces assets imported with lower version numbers to be re-imported.\n\nIf the Unity Editor setting \"Auto-Update\" is set to enabled, editing a script outside of the editor and saving it will trigger both a re-import of the script and all assets of the corresponding type.</para>\n      </summary>\n      <param name=\"version\">A number that is used by the import pipeline to detect new versions of the importer script. Changing this number will trigger a re-import of all assets matching the listed extensions.</param>\n      <param name=\"exts\">List of file extensions (without leading period character) that the scripted importer handles.</param>\n      <param name=\"ext\">Single file extension (without leading period character) that the scripted importer handles.</param>\n      <param name=\"importQueueOffset\">Gives control over ordering of asset import based on types. Positive values delay the processing of source asset files while negative values place them earlier in the import process.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.AssetImporters.ScriptedImporterEditor\">\n      <summary>\n        <para>Default editor for source assets handled by Scripted Importers.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.ScriptedImporterEditor.OnInspectorGUI\">\n      <summary>\n        <para>Implement this method to customize how Unity's Asset inspector is drawn for an Asset managed by a ScriptedImporter.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.AssetImporters.SourceTextureInformation\">\n      <summary>\n        <para>Original texture data information.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.SourceTextureInformation.containsAlpha\">\n      <summary>\n        <para>Determines if alpha channel is present in image data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.SourceTextureInformation.hdr\">\n      <summary>\n        <para>Determines if image has HDR data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.SourceTextureInformation.height\">\n      <summary>\n        <para>Height of the image data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.SourceTextureInformation.width\">\n      <summary>\n        <para>Width of the image data.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.AssetImporters.SpriteImportData\">\n      <summary>\n        <para>Struct that represents how Sprite asset should be generated when calling TextureGenerator.GenerateTexture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.SpriteImportData.alignment\">\n      <summary>\n        <para>Pivot value represented by SpriteAlignment.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.SpriteImportData.border\">\n      <summary>\n        <para>Border value for the generated Sprite.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.SpriteImportData.name\">\n      <summary>\n        <para>Name for the generated Sprite.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.SpriteImportData.outline\">\n      <summary>\n        <para>Sprite Asset creation uses this outline when it generates the Mesh for the Sprite. If this is not given, SpriteImportData.tesselationDetail will be used to determine the mesh detail.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.SpriteImportData.pivot\">\n      <summary>\n        <para>Pivot value represented in Vector2.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.SpriteImportData.rect\">\n      <summary>\n        <para>Position and size of the Sprite in a given texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.SpriteImportData.spriteID\">\n      <summary>\n        <para>An identifier given to a Sprite. Use this to identify which data was used to generate that Sprite.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.SpriteImportData.tessellationDetail\">\n      <summary>\n        <para>Controls mesh generation detail. This value will be ignored if SpriteImportData.ouline is provided.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.AssetImporters.TextureGenerationOutput\">\n      <summary>\n        <para>Structure that represents the result from calling TextureGenerator.GenerateTexture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.TextureGenerationOutput.importInspectorWarnings\">\n      <summary>\n        <para>Warnings that should be shown in Inspector after generating a Texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.TextureGenerationOutput.importWarnings\">\n      <summary>\n        <para>TextureGenerator.GenerateTexture reports warnings when you generate a Texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.TextureGenerationOutput.sprites\">\n      <summary>\n        <para>Sprites that are generated by TextureGenerator.GenerateTexture from TextureGenerationSettings.spriteSheetData.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.TextureGenerationOutput.texture\">\n      <summary>\n        <para>This is a Texture2D generated by TextureGenerator.GenerateTexture from TextureGenerationSettings.imageData.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.TextureGenerationOutput.thumbNail\">\n      <summary>\n        <para>Thumbnail version of the generated texture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.AssetImporters.TextureGenerationSettings\">\n      <summary>\n        <para>Represents how a texture should be generated from calling TextureGenerator.GenerateTexture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.TextureGenerationSettings.assetPath\">\n      <summary>\n        <para>Path where the Asset will be placed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.TextureGenerationSettings.enablePostProcessor\">\n      <summary>\n        <para>When set to true, AssetPostprocessor hooks will be called during texture generation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.TextureGenerationSettings.platformSettings\">\n      <summary>\n        <para>Platform settings for generating the texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.TextureGenerationSettings.qualifyForSpritePacking\">\n      <summary>\n        <para>Indicates if the Sprite generated can be used for atlas packing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.TextureGenerationSettings.sourceTextureInformation\">\n      <summary>\n        <para>Texture format for the image data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.TextureGenerationSettings.spriteImportData\">\n      <summary>\n        <para>Sprite Asset generation data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.TextureGenerationSettings.spritePackingTag\">\n      <summary>\n        <para>Tag used for Sprite packing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.AssetImporters.TextureGenerationSettings.textureImporterSettings\">\n      <summary>\n        <para>Settings for generating texture.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.TextureGenerationSettings.#ctor(UnityEditor.TextureImporterType)\">\n      <summary>\n        <para>The Constructor initializes to most common value based on the TetureImporterType you pass in.</para>\n      </summary>\n      <param name=\"type\">Texture type.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.AssetImporters.TextureGenerator\">\n      <summary>\n        <para>Experimental utilities for generating Texture2D.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.AssetImporters.TextureGenerator.GenerateTexture(UnityEditor.Experimental.AssetImporters.TextureGenerationSettings,Unity.Collections.NativeArray`1&lt;UnityEngine.Color32&gt;)\">\n      <summary>\n        <para>Generates Texture2D and Sprite Assets based on the settings provided.</para>\n      </summary>\n      <param name=\"settings\">Settings use for generating Texture2D and Sprite.</param>\n      <param name=\"colorBuffer\">Color buffer for generating Texture2D and Sprite.</param>\n      <returns>\n        <para>Result of the generation.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.Lightmapping\">\n      <summary>\n        <para>Experimental lightmapping features.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.Lightmapping.probesIgnoreDirectEnvironment\">\n      <summary>\n        <para>If enabled ignores the direct contribution from the environment lighting in baked probes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.Lightmapping.GetCustomBakeResults(UnityEngine.Vector4[])\">\n      <summary>\n        <para>Retrieve the custom bake results.</para>\n      </summary>\n      <param name=\"results\">The unnormalized amount of sky visibility for the input points (in xyz). The w component is the fraction of rays that strike backfaces.</param>\n      <returns>\n        <para>True if the results were retrieved. False if there is no data available or the results array does not match the number of points in the bake.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.Lightmapping.SetCustomBakeInputs(UnityEngine.Vector4[],System.Int32)\">\n      <summary>\n        <para>Set the custom bake inputs.</para>\n      </summary>\n      <param name=\"inputData\">The positions (xyz) of the points for which the amount of sky visibility is calculated. The w component is an offset that will be applied to the ray originating at the position.</param>\n      <param name=\"sampleCount\">The number of samples on the upper hemisphere used to calculate the sky visibility.</param>\n    </member>\n    <member name=\"?:UnityEditor.Experimental.U2D.ISpriteBoneDataProvider\">\n      <summary>\n        <para>Data Provider interface that deals with Sprite Bone data.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteBoneDataProvider.GetBones(UnityEditor.GUID)\">\n      <summary>\n        <para>Returns the list of SpriteBone for the corresponding Sprite ID.</para>\n      </summary>\n      <param name=\"guid\">Sprite ID.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteBoneDataProvider.SetBones(UnityEditor.GUID,System.Collections.Generic.List`1&lt;UnityEngine.Experimental.U2D.SpriteBone&gt;)\">\n      <summary>\n        <para>Sets a new set of SpriteBone for the corresponding Sprite ID.</para>\n      </summary>\n      <param name=\"guid\">Sprite ID.</param>\n      <param name=\"bones\"></param>\n    </member>\n    <member name=\"?:UnityEditor.Experimental.U2D.ISpriteEditor\">\n      <summary>\n        <para>Interface that defines the functionality available for classes that inherits SpriteEditorModuleBase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.U2D.ISpriteEditor.editingDisabled\">\n      <summary>\n        <para>Indicates that if Sprite data editing should be disabled; for example when the Editor is in Play Mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.U2D.ISpriteEditor.enableMouseMoveEvent\">\n      <summary>\n        <para>Indicates if ISpriteEditor should be interested in mouse move events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.U2D.ISpriteEditor.selectedSpriteRect\">\n      <summary>\n        <para>The current selected Sprite rect data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.U2D.ISpriteEditor.spriteRects\">\n      <summary>\n        <para>Sets current available Sprite rects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.U2D.ISpriteEditor.windowDimension\">\n      <summary>\n        <para>Property that defines the window's current screen position and size.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteEditor.ApplyOrRevertModification(System.Boolean)\">\n      <summary>\n        <para>The method will inform current active SpriteEditorModuleBase to apply or revert any data changes.</para>\n      </summary>\n      <param name=\"apply\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteEditor.GetDataProvider\">\n      <summary>\n        <para>Gets data provider that is supported by the current selected Assets's importer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteEditor.GetMainVisualContainer\">\n      <summary>\n        <para>Returns a VisualElement for attaching child VisualElement onto the main view of a ISpriteEditor.</para>\n      </summary>\n      <returns>\n        <para>Root VisualElement for the main view.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteEditor.HandleSpriteSelection\">\n      <summary>\n        <para>The method updates ISpriteEditor.selectedSpriteRect based on current mouse down event and ISpriteEditor.spriteRects available.</para>\n      </summary>\n      <returns>\n        <para>Returns true when ISpriteEditor.selectedSpriteRect is changed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteEditor.RequestRepaint\">\n      <summary>\n        <para>Request to repaint the current view.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteEditor.SetDataModified\">\n      <summary>\n        <para>Indicates that there has been a change of data. In Sprite Editor Window, this enables the 'Apply' and 'Revert' button.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteEditor.SetPreviewTexture(UnityEngine.Texture2D,System.Int32,System.Int32)\">\n      <summary>\n        <para>Sets a custom texture to be used by the ISpriteEditor during setup of the editing space.</para>\n      </summary>\n      <param name=\"texture\">The custom preview texture.</param>\n      <param name=\"width\">The width dimension to render the preview texture.</param>\n      <param name=\"height\">The height dimension to render the preview texture.</param>\n    </member>\n    <member name=\"?:UnityEditor.Experimental.U2D.ISpriteEditorDataProvider\">\n      <summary>\n        <para>An interface that allows Sprite Editor Window to edit Sprite data for user custom importer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.U2D.ISpriteEditorDataProvider.pixelsPerUnit\">\n      <summary>\n        <para>The number of pixels in the sprite that correspond to one unit in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.U2D.ISpriteEditorDataProvider.spriteImportMode\">\n      <summary>\n        <para>SpriteImportMode to indicate how Sprite data will be imported.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.U2D.ISpriteEditorDataProvider.targetObject\">\n      <summary>\n        <para>The object that this data provider is acquiring its data from.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteEditorDataProvider.Apply\">\n      <summary>\n        <para>Applying any changed data.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteEditorDataProvider.GetDataProvider\">\n      <summary>\n        <para>Gets other data providers that might be supported by ISpriteEditorDataProvider.targetObject.</para>\n      </summary>\n      <returns>\n        <para>Data provider type.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteEditorDataProvider.GetSpriteRects\">\n      <summary>\n        <para>Returns an array of SpriteRect representing Sprite data the provider has.</para>\n      </summary>\n      <returns>\n        <para>Array of SpriteRect.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteEditorDataProvider.HasDataProvider(System.Type)\">\n      <summary>\n        <para>Queries if ISpriteEditorDataProvider.targetObject supports the data provider type.</para>\n      </summary>\n      <param name=\"type\">Data provider type.</param>\n      <returns>\n        <para>True if supports, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteEditorDataProvider.InitSpriteEditorDataProvider\">\n      <summary>\n        <para>Allows the data provider to initialize any data if needed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteEditorDataProvider.SetSpriteRects(UnityEditor.SpriteRect[])\">\n      <summary>\n        <para>Sets the data provider's current SpriteRect.</para>\n      </summary>\n      <param name=\"spriteRects\">Updated array of SpriteRect.</param>\n    </member>\n    <member name=\"?:UnityEditor.Experimental.U2D.ISpriteMeshDataProvider\">\n      <summary>\n        <para>Data Provider interface that deals with Sprite mesh data.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteMeshDataProvider.GetEdges(UnityEditor.GUID)\">\n      <summary>\n        <para>Returns the list of mesh edges for the corresponding Sprite ID.</para>\n      </summary>\n      <param name=\"guid\">Sprite ID.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteMeshDataProvider.GetIndices(UnityEditor.GUID)\">\n      <summary>\n        <para>Returns the list of mesh index for the corresponding Sprite ID.</para>\n      </summary>\n      <param name=\"guid\">Sprite ID.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteMeshDataProvider.GetVertices(UnityEditor.GUID)\">\n      <summary>\n        <para>Returns the list of vertex datas for the corresponding Sprite ID.</para>\n      </summary>\n      <param name=\"guid\">Sprite ID.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteMeshDataProvider.SetEdges(UnityEditor.GUID,UnityEngine.Vector2Int[])\">\n      <summary>\n        <para>Sets a new list of edges for the corresponding Sprite ID.</para>\n      </summary>\n      <param name=\"guid\">Sprite ID.</param>\n      <param name=\"edges\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteMeshDataProvider.SetIndices(UnityEditor.GUID,System.Int32[])\">\n      <summary>\n        <para>Sets a new list of indices for the corresponding Sprite ID.</para>\n      </summary>\n      <param name=\"guid\">Sprite ID.</param>\n      <param name=\"indices\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteMeshDataProvider.SetVertices(UnityEditor.GUID,UnityEditor.Experimental.U2D.Vertex2DMetaData[])\">\n      <summary>\n        <para>Sets a new list of vertices for the corresponding Sprite ID.</para>\n      </summary>\n      <param name=\"guid\">Sprite ID.</param>\n      <param name=\"vertices\"></param>\n    </member>\n    <member name=\"?:UnityEditor.Experimental.U2D.ISpriteOutlineDataProvider\">\n      <summary>\n        <para>Data provider that provides the outline data for SpriteRect.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteOutlineDataProvider.GetOutlines(UnityEditor.GUID)\">\n      <summary>\n        <para>Given a GUID, returns the outline data used for tessellating the SpriteRect.</para>\n      </summary>\n      <param name=\"guid\">GUID of the SpriteRect.</param>\n      <returns>\n        <para>Outline data for the SpriteRect.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteOutlineDataProvider.GetTessellationDetail(UnityEditor.GUID)\">\n      <summary>\n        <para>Given a GUID, returns the tessellation detail. Tessellation value should be between 0 to 1.</para>\n      </summary>\n      <param name=\"guid\">GUID of the SpriteRect.</param>\n      <returns>\n        <para>The tessellation value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteOutlineDataProvider.SetOutlines(UnityEditor.GUID,System.Collections.Generic.List`1&lt;UnityEngine.Vector2[]&gt;)\">\n      <summary>\n        <para>Given a GUID, sets the outline data used for tessellating the SpriteRect.</para>\n      </summary>\n      <param name=\"guid\">GUID of the SpriteRect.</param>\n      <param name=\"data\">Outline data for the SpriteRect.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpriteOutlineDataProvider.SetTessellationDetail(UnityEditor.GUID,System.Single)\">\n      <summary>\n        <para>Given a GUID, sets the tessellation detail. Tessellation value should be between 0 to 1.</para>\n      </summary>\n      <param name=\"guid\">GUID of the SpriteRect.</param>\n      <param name=\"value\">The tessellation value.</param>\n    </member>\n    <member name=\"?:UnityEditor.Experimental.U2D.ISpritePhysicsOutlineDataProvider\">\n      <summary>\n        <para>Data provider that provides the Physics outline data for SpriteRect.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpritePhysicsOutlineDataProvider.GetOutlines(UnityEditor.GUID)\">\n      <summary>\n        <para>Given a GUID, returns the Physics outline data used for the SpriteRect.</para>\n      </summary>\n      <param name=\"guid\">GUID of the SpriteRect.</param>\n      <returns>\n        <para>Physics outline data for the SpriteRect.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpritePhysicsOutlineDataProvider.GetTessellationDetail(UnityEditor.GUID)\">\n      <summary>\n        <para>Given a GUID, returns the tessellation detail. Tessellation value should be between 0 to 1.</para>\n      </summary>\n      <param name=\"guid\">GUID of the SpriteRect.</param>\n      <returns>\n        <para>The tessellation value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpritePhysicsOutlineDataProvider.SetOutlines(UnityEditor.GUID,System.Collections.Generic.List`1&lt;UnityEngine.Vector2[]&gt;)\">\n      <summary>\n        <para>Given a GUID, sets the Physics outline data used for the SpriteRect.</para>\n      </summary>\n      <param name=\"guid\">GUID of the SpriteRect.</param>\n      <param name=\"data\">Physics outline data for the SpriteRect.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ISpritePhysicsOutlineDataProvider.SetTessellationDetail(UnityEditor.GUID,System.Single)\">\n      <summary>\n        <para>Given a GUID, sets the tessellation detail. Tessellation value should be between 0 to 1.</para>\n      </summary>\n      <param name=\"guid\">GUID of the SpriteRect.</param>\n      <param name=\"value\">The tessellation value.</param>\n    </member>\n    <member name=\"?:UnityEditor.Experimental.U2D.ITextureDataProvider\">\n      <summary>\n        <para>Data provider that provides texture data needed for Sprite Editor Window.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.U2D.ITextureDataProvider.previewTexture\">\n      <summary>\n        <para>Texture2D that represents the preview for ITextureDataProvider.texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.U2D.ITextureDataProvider.texture\">\n      <summary>\n        <para>Texture2D representation of the data provider.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ITextureDataProvider.GetReadableTexture2D\">\n      <summary>\n        <para>Readable version of ITextureProvider.texture.</para>\n      </summary>\n      <returns>\n        <para>Texture2D that is readable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.ITextureDataProvider.GetTextureActualWidthAndHeight(System.Int32&amp;,System.Int32&amp;)\">\n      <summary>\n        <para>The actual width and height of the texture data.</para>\n      </summary>\n      <param name=\"width\">Out value for width.</param>\n      <param name=\"height\">Out value for height.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.U2D.RequireSpriteDataProviderAttribute\">\n      <summary>\n        <para>Use this attribute on a class that inherits from SpriteEditorModuleBase to indicate what data provider it needs.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.RequireSpriteDataProviderAttribute.#ctor(System.Type[])\">\n      <summary>\n        <para>Use the attribute to indicate the custom data provider that SpriteEditorBaseModule needs.</para>\n      </summary>\n      <param name=\"types\">Data provider type.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.U2D.SpriteEditorExtension\">\n      <summary>\n        <para>Sprite extension methods that are accessible in Editor only.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.SpriteEditorExtension.GetSpriteID(UnityEngine.Sprite)\">\n      <summary>\n        <para>Gets the Sprite's GUID.</para>\n      </summary>\n      <param name=\"sprite\">The Sprite to query.</param>\n      <returns>\n        <para>GUID stored in the Sprite.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.SpriteEditorExtension.SetSpriteID(UnityEngine.Sprite,UnityEditor.GUID)\">\n      <summary>\n        <para>Sets a Sprite's Global Unique Identifier (GUID) for easy identification later.</para>\n      </summary>\n      <param name=\"sprite\">The Sprite to set.</param>\n      <param name=\"guid\">The GUID to set for the Sprite.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.U2D.SpriteEditorModuleBase\">\n      <summary>\n        <para>Base class the Sprite Editor Window custom module inherits from.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.U2D.SpriteEditorModuleBase.moduleName\">\n      <summary>\n        <para>The module name to display in Sprite Editor Window.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.U2D.SpriteEditorModuleBase.spriteEditor\">\n      <summary>\n        <para>The ISpriteEditor instance that instantiated the module.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.SpriteEditorModuleBase.ApplyRevert(System.Boolean)\">\n      <summary>\n        <para>This is called when user clicks on the Apply or Revert button in Sprite Editor Window.</para>\n      </summary>\n      <param name=\"apply\">True when user wants to apply the data, false when user wants to revert.</param>\n      <returns>\n        <para>Return true to trigger a reimport.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.SpriteEditorModuleBase.CanBeActivated\">\n      <summary>\n        <para>Indicates if the module can be activated with the current ISpriteEditor state.</para>\n      </summary>\n      <returns>\n        <para>Return true if the module can be activated.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.SpriteEditorModuleBase.DoMainGUI\">\n      <summary>\n        <para>Implement this to draw on the Sprite Editor Window.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.SpriteEditorModuleBase.DoPostGUI\">\n      <summary>\n        <para>Implement this to draw widgets in Sprite Editor Window.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.SpriteEditorModuleBase.DoToolbarGUI(UnityEngine.Rect)\">\n      <summary>\n        <para>Implement this to create a custom toolbar.</para>\n      </summary>\n      <param name=\"drawArea\">Area for drawing tool bar.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.SpriteEditorModuleBase.OnModuleActivate\">\n      <summary>\n        <para>This is called when the user activates the module.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.U2D.SpriteEditorModuleBase.OnModuleDeactivate\">\n      <summary>\n        <para>This is called when user switches to another module.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.U2D.Vertex2DMetaData\">\n      <summary>\n        <para>A structure that contains meta data about vertices in a Sprite.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.U2D.Vertex2DMetaData.boneWeight\">\n      <summary>\n        <para>The BoneWeight of the vertex.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.U2D.Vertex2DMetaData.position\">\n      <summary>\n        <para>The position of the vertex.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.BaseCompoundField_1.BaseCompoundFieldUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.BaseValueField_1.BaseValueFieldUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.BoundsField\">\n      <summary>\n        <para>A Bounds editor field.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.BoundsField.BoundsFieldFactory\">\n      <summary>\n        <para>Instantiates a BoundsField using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.BoundsField.BoundsFieldFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.BoundsField.BoundsFieldUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the BoundsField.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.BoundsField.BoundsFieldUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for BoundsField properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.BoundsField.BoundsFieldUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.BoundsField.BoundsFieldUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize BoundsField properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.ColorField\">\n      <summary>\n        <para>Makes a field for selecting a color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.ColorField.hdr\">\n      <summary>\n        <para>If true, treats the color as an HDR value. If false, treats the color as a standard LDR value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.ColorField.showAlpha\">\n      <summary>\n        <para>If true, allows the user to set an alpha value for the color. If false, hides the alpha component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.ColorField.showEyeDropper\">\n      <summary>\n        <para>If true, the color picker will show the eyedropper control. If false, the color picker won't show the eyedropper control.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.ColorField.value\">\n      <summary>\n        <para>The color currently being exposed by the field.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.ColorField.ColorFieldFactory\">\n      <summary>\n        <para>Instantiates a ColorField using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.ColorField.ColorFieldFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.ColorField.ColorFieldUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the ColorField.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.ColorField.ColorFieldUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for ColorField properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.ColorField.ColorFieldUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.ColorField.ColorFieldUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize ColorField properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.ColorField.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.ColorField.SetValueAndNotify(UnityEngine.Color)\">\n      <summary>\n        <para>Set the value and, if different, notifies registers callbacks with a ChangeEvent&lt;Color&gt;</para>\n      </summary>\n      <param name=\"newValue\">The new value to be set.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.CurveField\">\n      <summary>\n        <para>Makes a field for editing an AnimationCurve.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.CurveField.ranges\">\n      <summary>\n        <para>Optional rectangle that the curve is restrained within. If the range width or height is &lt; 0 then CurveField computes an automatic range, which encompasses the whole curve.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.CurveField.renderMode\">\n      <summary>\n        <para>The RenderMode of CurveField. The default is RenderMode.Default.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.CurveField.value\">\n      <summary>\n        <para>The AnimationCurve currently being exposed by the field.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.CurveField.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.CurveField.CurveFieldFactory\">\n      <summary>\n        <para>Instantiates a CurveField using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.CurveField.CurveFieldFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.CurveField.CurveFieldUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the CurveField.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.CurveField.CurveFieldUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.CurveField.RenderMode\">\n      <summary>\n        <para>Render mode of CurveFields</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.CurveField.RenderMode.Default\">\n      <summary>\n        <para>Renders the curve with the default mode. Currently Texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.CurveField.RenderMode.Mesh\">\n      <summary>\n        <para>Renders the curve with an anti-aliased mesh.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.CurveField.RenderMode.Texture\">\n      <summary>\n        <para>Renders the curve with a generated texture, like with Unity’s Immediate Mode GUI system (IMGUI).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.CurveField.SetValueAndNotify(UnityEngine.AnimationCurve)\">\n      <summary>\n        <para>Sets the value of the curve and, if different from the previous value, notifies the OnValueChanged event callback with a  ChangeEvent&lt;AnimationCurve&gt;</para>\n      </summary>\n      <param name=\"newValue\">The new value to be set.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.DeltaSpeed\">\n      <summary>\n        <para>Speed at which the value changes for a given input device delta.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.DeltaSpeed.Fast\">\n      <summary>\n        <para>The value changes at four times the normal rate.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.DeltaSpeed.Normal\">\n      <summary>\n        <para>The value changes at the normal rate.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.DeltaSpeed.Slow\">\n      <summary>\n        <para>The value changes at one quarter of its normal rate.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.DoubleField\">\n      <summary>\n        <para>Makes a text field for entering doubles.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.DoubleField.ApplyInputDeviceDelta(UnityEngine.Vector3,UnityEditor.Experimental.UIElements.DeltaSpeed,System.Double)\">\n      <summary>\n        <para>Modify the value using a 3D delta and a speed, typically coming from an input device.</para>\n      </summary>\n      <param name=\"delta\">A vector used to compute the value change.</param>\n      <param name=\"speed\">A multiplier for the value change.</param>\n      <param name=\"startValue\">The start value.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.DoubleField.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"maxLength\">Maximum number of characters the field can take.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.DoubleField.#ctor(System.Int32)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"maxLength\">Maximum number of characters the field can take.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.DoubleField.DoubleFieldFactory\">\n      <summary>\n        <para>Instantiates a DoubleField using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.DoubleField.DoubleFieldFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.DoubleField.DoubleFieldUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the DoubleField.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.DoubleField.DoubleFieldUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for DoubleField properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.DoubleField.DoubleFieldUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.DoubleField.DoubleFieldUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize DoubleField properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.DoubleField.StringToValue(System.String)\">\n      <summary>\n        <para>Converts the given string to a double.</para>\n      </summary>\n      <param name=\"str\">The string to convert.</param>\n      <returns>\n        <para>The double parsed from the string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.DoubleField.ValueToString(System.Double)\">\n      <summary>\n        <para>Converts the given double to a string.</para>\n      </summary>\n      <param name=\"v\">The double to be converted to string.</param>\n      <returns>\n        <para>The double as string.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.EnumField\">\n      <summary>\n        <para>Makes a dropdown for switching between enum values.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.EnumField.value\">\n      <summary>\n        <para>Current selected enum value.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.EnumField.#ctor(System.Enum)\">\n      <summary>\n        <para>Construct an EnumField.</para>\n      </summary>\n      <param name=\"defaultValue\">Initial value. Also used to detect Enum type.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.EnumField.EnumFieldFactory\">\n      <summary>\n        <para>Instantiates an EnumField using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.EnumField.EnumFieldFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.EnumField.EnumFieldUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the EnumField.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.EnumField.EnumFieldUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for EnumField properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.EnumField.EnumFieldUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.EnumField.EnumFieldUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize EnumField properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.EnumField.Init(System.Enum)\">\n      <summary>\n        <para>Initialize the EnumField with a default value. This also initializes its underlying type.</para>\n      </summary>\n      <param name=\"defaultValue\">Your typed enum value.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.EnumField.SetValueAndNotify(System.Enum)\">\n      <summary>\n        <para>Set the value and, if different, notifies registers callbacks with a ChangeEvent&lt;Enum&gt;</para>\n      </summary>\n      <param name=\"newValue\">The new value to be set.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.FieldMouseDragger`1\">\n      <summary>\n        <para>Allows dragging on a numeric field's label to change the value.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.FieldMouseDragger_1.dragging\">\n      <summary>\n        <para>Is dragging.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.FieldMouseDragger_1.startValue\">\n      <summary>\n        <para>Start value before drag.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.FieldMouseDragger_1.#ctor(UnityEditor.Experimental.UIElements.IValueField`1&lt;T&gt;)\">\n      <summary>\n        <para>FieldMouseDragger's constructor.</para>\n      </summary>\n      <param name=\"drivenField\">The field.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.FieldMouseDragger_1.SetDragZone(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Set drag zone.</para>\n      </summary>\n      <param name=\"dragElement\">The drag element (like the label).</param>\n      <param name=\"hotZone\">The rectangle that contains the drag zone.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.FieldMouseDragger_1.SetDragZone(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Rect)\">\n      <summary>\n        <para>Set drag zone.</para>\n      </summary>\n      <param name=\"dragElement\">The drag element (like the label).</param>\n      <param name=\"hotZone\">The rectangle that contains the drag zone.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.FloatField\">\n      <summary>\n        <para>Makes a text field for entering a float.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.FloatField.ApplyInputDeviceDelta(UnityEngine.Vector3,UnityEditor.Experimental.UIElements.DeltaSpeed,System.Single)\">\n      <summary>\n        <para>Modify the value using a 3D delta and a speed, typically coming from an input device.</para>\n      </summary>\n      <param name=\"delta\">A vector used to compute the value change.</param>\n      <param name=\"speed\">A multiplier for the value change.</param>\n      <param name=\"startValue\">The start value.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.FloatField.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"maxLength\">Maximum number of characters the field can take.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.FloatField.#ctor(System.Int32)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"maxLength\">Maximum number of characters the field can take.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.FloatField.FloatFieldFactory\">\n      <summary>\n        <para>Instantiates a FloatField using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.FloatField.FloatFieldFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.FloatField.FloatFieldUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the FloatField.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.FloatField.FloatFieldUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for FloatField properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.FloatField.FloatFieldUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.FloatField.FloatFieldUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize FloatField properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.FloatField.StringToValue(System.String)\">\n      <summary>\n        <para>Converts the given string to a float.</para>\n      </summary>\n      <param name=\"str\">The string to convert.</param>\n      <returns>\n        <para>The float parsed from the string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.FloatField.ValueToString(System.Single)\">\n      <summary>\n        <para>Converts the given float to a string.</para>\n      </summary>\n      <param name=\"v\">The float to be converted to string.</param>\n      <returns>\n        <para>The float as string.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GradientField\">\n      <summary>\n        <para>Makes a field for editing an Gradient.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GradientField.value\">\n      <summary>\n        <para>The Gradient currently being exposed by the field.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GradientField.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GradientField.GradientFieldFactory\">\n      <summary>\n        <para>Instantiates a GradientField using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GradientField.GradientFieldFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GradientField.GradientFieldUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the GradientField.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GradientField.GradientFieldUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GradientField.SetValueAndNotify(UnityEngine.Gradient)\">\n      <summary>\n        <para>Sets the value of the gradient and, if different from the previous value, notifies the OnValueChanged event callback with a  ChangeEvent&lt;Gradient&gt;</para>\n      </summary>\n      <param name=\"newValue\">The new value to be set.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.Attacher\">\n      <summary>\n        <para>Helper object that attaches a visual element next to its target, regarless of their respective location in the visual tree hierarchy.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Attacher.alignment\">\n      <summary>\n        <para>Relative alignment between the attached element and the target.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Attacher.distance\">\n      <summary>\n        <para>The distance between the attached element and the target.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Attacher.element\">\n      <summary>\n        <para>The element that is attached to the target element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Attacher.offset\">\n      <summary>\n        <para>An absolute offset added to the element position after placement.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Attacher.target\">\n      <summary>\n        <para>The target element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Attacher.#ctor(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.SpriteAlignment)\">\n      <summary>\n        <para>Attaches a visual element next to its target, regarless of their respective locations in the visual tree hierarchy.</para>\n      </summary>\n      <param name=\"anchored\">The element that will be positioned alongside the target.</param>\n      <param name=\"target\">The target element.</param>\n      <param name=\"alignment\">Relative alignment between the attached element and the target.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Attacher.Detach\">\n      <summary>\n        <para>Stop monitoring the target element and postioning the attached element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Attacher.Reattach\">\n      <summary>\n        <para>Starts monitoring target element position changes and places the attached element accordingly.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.Blackboard\">\n      <summary>\n        <para>GraphElement that enables user to dynamically define members of a Graph (such as fields/properties) grouped by sections (BlackboardSection).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Blackboard.addItemRequested\">\n      <summary>\n        <para>Called when user clicks on the Add button of this Blackboard.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Blackboard.contentContainer\">\n      <summary>\n        <para>The content container of this Blackboard.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Blackboard.editTextRequested\">\n      <summary>\n        <para>Called when user has edited the text of this BlackboardField.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Blackboard.moveItemRequested\">\n      <summary>\n        <para>Called when user has dragged and dropped a BlackboardField to a new location inside its BlackboardSection.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Blackboard.scrollable\">\n      <summary>\n        <para>Indicates whether the content of this Blackboard can be vertically scrolled by user. It is false by default.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Blackboard.subTitle\">\n      <summary>\n        <para>The subtitle of this Blackboard.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Blackboard.title\">\n      <summary>\n        <para>The title of this Blackboard.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Blackboard.#ctor\">\n      <summary>\n        <para>Constructs a Blackboard.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.BlackboardField\">\n      <summary>\n        <para>GraphElement that represents a field of a Graph.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.BlackboardField.icon\">\n      <summary>\n        <para>The icon of this BlackboardField.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.BlackboardField.text\">\n      <summary>\n        <para>The text of this BlackboardField.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.BlackboardField.typeText\">\n      <summary>\n        <para>The text that displays the data type of this BlackboardField.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.BlackboardField.#ctor\">\n      <summary>\n        <para>Constructs a BlackboardField.</para>\n      </summary>\n      <param name=\"icon\">The icon of this BlackboardField.</param>\n      <param name=\"text\">The text of this BlackboardField.</param>\n      <param name=\"typeText\">The text that displays the data type of this BlackboardField.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.BlackboardField.#ctor(UnityEngine.Texture,System.String,System.String)\">\n      <summary>\n        <para>Constructs a BlackboardField.</para>\n      </summary>\n      <param name=\"icon\">The icon of this BlackboardField.</param>\n      <param name=\"text\">The text of this BlackboardField.</param>\n      <param name=\"typeText\">The text that displays the data type of this BlackboardField.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.BlackboardField.OnSelected\">\n      <summary>\n        <para>Called when the BlackboardField is selected.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.BlackboardField.OnUnselected\">\n      <summary>\n        <para>Called when the BlackboardField is unselected.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.BlackboardField.OpenTextEditor\">\n      <summary>\n        <para>Opens a TextField to edit the text in a BlackboardField.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.BlackboardRow\">\n      <summary>\n        <para>Collapsible GraphElement that represents a row in a BlackboardSection.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.BlackboardRow.expanded\">\n      <summary>\n        <para>Indicates whether the BlackboardRow is expanded.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.BlackboardRow.#ctor(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Constructs a BlackboardRow from a VisualElement and its associated property view. The VisualElement is usually a BlackboardField.</para>\n      </summary>\n      <param name=\"item\">The item that fills the content of this BlackboardRow.</param>\n      <param name=\"propertyView\">The property view related to the content of this BlackboardRow.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.BlackboardSection\">\n      <summary>\n        <para>GraphElement that represents a section of members in a Blackboard.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.BlackboardSection.contentContainer\">\n      <summary>\n        <para>The content container of this BlackboardSection.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.BlackboardSection.headerVisible\">\n      <summary>\n        <para>Indicates whether the header of the BlackboardSection is visible.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.BlackboardSection.title\">\n      <summary>\n        <para>The title of this BlackboardSection.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.BlackboardSection.CanAcceptDrop(System.Collections.Generic.List`1&lt;UnityEditor.Experimental.UIElements.GraphView.ISelectable&gt;)\">\n      <summary>\n        <para>Indicates whether this BlackboardSection accepts the current drop event.</para>\n      </summary>\n      <param name=\"selection\">The list of selected objects.</param>\n      <returns>\n        <para>Returns true when rows are reordered by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.BlackboardSection.#ctor\">\n      <summary>\n        <para>Constructs a BlackboardSection.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.Capabilities\">\n      <summary>\n        <para>Capabilities used by Manipulators to easily determine valid actions on a GraphElement.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.Capabilities.Ascendable\">\n      <summary>\n        <para>GraphElement will be brought to the front of its layer when it is selected.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.Capabilities.Collapsible\">\n      <summary>\n        <para>GraphElement can be collapsed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.Capabilities.Deletable\">\n      <summary>\n        <para>GraphElement can be deleted.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.Capabilities.Droppable\">\n      <summary>\n        <para>GraphElement can be dragged and dropped (using the Drag&amp;Drop events).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.Capabilities.Movable\">\n      <summary>\n        <para>GraphElement is movable.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.Capabilities.Resizable\">\n      <summary>\n        <para>GraphElement is resizable.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.Capabilities.Selectable\">\n      <summary>\n        <para>GraphElement is selectable.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.ClickSelector\">\n      <summary>\n        <para>Selects element on single click.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ClickSelector.#ctor\">\n      <summary>\n        <para>Constructor for ClickSelector.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ClickSelector.OnMouseDown(UnityEngine.Experimental.UIElements.MouseDownEvent)\">\n      <summary>\n        <para>Called on mouse down event.</para>\n      </summary>\n      <param name=\"e\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ClickSelector.RegisterCallbacksOnTarget\">\n      <summary>\n        <para>Called to register click event callbacks on the target element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ClickSelector.UnregisterCallbacksFromTarget\">\n      <summary>\n        <para>Called to unregister event callbacks from the target element.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.ContentDragger\">\n      <summary>\n        <para>Manipulator that allows mouse-dragging of one or more elements.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.ContentDragger.clampToParentEdges\">\n      <summary>\n        <para>If true, it does not allow the dragged element to exit the parent's edges.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.ContentDragger.panSpeed\">\n      <summary>\n        <para>When elements are dragged near the edges of the Graph, panning occurs. This controls the speed for said panning.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ContentDragger.CalculatePosition(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Calculate new position of the dragged element.</para>\n      </summary>\n      <param name=\"x\">New x position.</param>\n      <param name=\"y\">New y position.</param>\n      <param name=\"width\">Element width.</param>\n      <param name=\"height\">Element height.</param>\n      <returns>\n        <para>Calculated and validated position.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ContentDragger.#ctor\">\n      <summary>\n        <para>ContentDragger constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ContentDragger.OnMouseDown(UnityEngine.Experimental.UIElements.MouseDownEvent)\">\n      <summary>\n        <para>Called on mouse down event.</para>\n      </summary>\n      <param name=\"e\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ContentDragger.OnMouseMove(UnityEngine.Experimental.UIElements.MouseMoveEvent)\">\n      <summary>\n        <para>Called on mouse move event.</para>\n      </summary>\n      <param name=\"e\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ContentDragger.OnMouseUp(UnityEngine.Experimental.UIElements.MouseUpEvent)\">\n      <summary>\n        <para>Called on mouse up event.</para>\n      </summary>\n      <param name=\"e\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ContentDragger.RegisterCallbacksOnTarget\">\n      <summary>\n        <para>Called to register click event callbacks on the target element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ContentDragger.UnregisterCallbacksFromTarget\">\n      <summary>\n        <para>Called to unregister event callbacks from the target element.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.ContentZoomer\">\n      <summary>\n        <para>Manipulator that allows zooming in GraphView.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.ContentZoomer.keepPixelCacheOnZoom\">\n      <summary>\n        <para>Optimization option to keep the old pixel cache while zooming and only updating it when zooming is finished (based on a timer).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.ContentZoomer.maxScale\">\n      <summary>\n        <para>Max zoom level.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.ContentZoomer.minScale\">\n      <summary>\n        <para>Min zoom level.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.ContentZoomer.referenceScale\">\n      <summary>\n        <para>Reference zoom level.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.ContentZoomer.scaleStep\">\n      <summary>\n        <para>Zoom step: percentage of variation between a zoom level and the next. For example, with a value of 0.15, which represents 15%, a zoom level of 200% will become 230% when zooming in.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ContentZoomer.#ctor\">\n      <summary>\n        <para>ContentZoomer constructor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.ContentZoomer.DefaultMaxScale\">\n      <summary>\n        <para>Default max zoom level.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.ContentZoomer.DefaultMinScale\">\n      <summary>\n        <para>Default min zoom level.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.ContentZoomer.DefaultReferenceScale\">\n      <summary>\n        <para>Default reference zoom level.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.ContentZoomer.DefaultScaleStep\">\n      <summary>\n        <para>Default zoom step.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ContentZoomer.RegisterCallbacksOnTarget\">\n      <summary>\n        <para>Called to register click event callbacks on the target element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ContentZoomer.UnregisterCallbacksFromTarget\">\n      <summary>\n        <para>Called to unregister event callbacks from the target element.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.Direction\">\n      <summary>\n        <para>Port direction (in or out).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.Direction.Input\">\n      <summary>\n        <para>Port is an input port.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.Direction.Output\">\n      <summary>\n        <para>Port is an output port.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.Dragger\">\n      <summary>\n        <para>Base manipulator for mouse-dragging elements.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Dragger.clampToParentEdges\">\n      <summary>\n        <para>If true, it does not allow the dragged element to exit the parent's edges.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Dragger.panSpeed\">\n      <summary>\n        <para>When elements are dragged near the edges of the Graph, panning occurs. This controls the speed for said panning.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Dragger.CalculatePosition(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Calculate new position of the dragged element.</para>\n      </summary>\n      <param name=\"x\">New x position.</param>\n      <param name=\"y\">New y position.</param>\n      <param name=\"width\">Element width.</param>\n      <param name=\"height\">Element height.</param>\n      <returns>\n        <para>Calculated and validated position.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Dragger.#ctor\">\n      <summary>\n        <para>Dragger constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Dragger.OnMouseDown(UnityEngine.Experimental.UIElements.MouseDownEvent)\">\n      <summary>\n        <para>Called on mouse down event.</para>\n      </summary>\n      <param name=\"e\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Dragger.OnMouseMove(UnityEngine.Experimental.UIElements.MouseMoveEvent)\">\n      <summary>\n        <para>Called on mouse move event.</para>\n      </summary>\n      <param name=\"e\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Dragger.OnMouseUp(UnityEngine.Experimental.UIElements.MouseUpEvent)\">\n      <summary>\n        <para>Called on mouse up event.</para>\n      </summary>\n      <param name=\"e\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Dragger.RegisterCallbacksOnTarget\">\n      <summary>\n        <para>Called to register click event callbacks on the target element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Dragger.UnregisterCallbacksFromTarget\">\n      <summary>\n        <para>Called to unregister event callbacks from the target element.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.Edge\">\n      <summary>\n        <para>The GraphView edge element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Edge.candidatePosition\">\n      <summary>\n        <para>The edge's end position while it's being created.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Edge.defaultColor\">\n      <summary>\n        <para>Default edge color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Edge.edgeControl\">\n      <summary>\n        <para>The VisualElement child of Edge that draws the lines and does the hit detection.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Edge.edgeWidth\">\n      <summary>\n        <para>Edge width.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Edge.ghostColor\">\n      <summary>\n        <para>The color of the ghost edge, which is the edge that appears snapped to a nearby port while an edge is being created.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Edge.input\">\n      <summary>\n        <para>Connected input port.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Edge.isGhostEdge\">\n      <summary>\n        <para>Is this edge a ghost edge, which is the edge that appears snapped to a nearby port while an edge is being created.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Edge.output\">\n      <summary>\n        <para>Connected output port.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Edge.selectedColor\">\n      <summary>\n        <para>Color of edge while selected.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Edge.ContainsPoint(UnityEngine.Vector2)\">\n      <summary>\n        <para>Checks if point is on top of edge.</para>\n      </summary>\n      <param name=\"localPoint\">Point position.</param>\n      <returns>\n        <para>True if point is on top of edge. False otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Edge.CreateEdgeControl\">\n      <summary>\n        <para>Create the EdgeControl.</para>\n      </summary>\n      <returns>\n        <para>The created EdgeControl.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Edge.#ctor\">\n      <summary>\n        <para>Edge's constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Edge.DoRepaint\">\n      <summary>\n        <para>Repaint the edge element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Edge.DrawEdge\">\n      <summary>\n        <para>Draw the edge's lines.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Edge.OnPortChanged(System.Boolean)\">\n      <summary>\n        <para>Called when a port on the edge is changed.</para>\n      </summary>\n      <param name=\"isInput\">True if the input port was changed. False if the output port was changed.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Edge.OnStyleResolved(UnityEngine.Experimental.UIElements.StyleSheets.ICustomStyle)\">\n      <summary>\n        <para>Called when the style was updated.</para>\n      </summary>\n      <param name=\"styles\">The new style.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Edge.Overlaps(UnityEngine.Rect)\">\n      <summary>\n        <para>Check if edge overlaps rectangle.</para>\n      </summary>\n      <param name=\"rectangle\">The rectangle.</param>\n      <returns>\n        <para>True if edge overlaps the rectangle.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Edge.PointsAndTangents\">\n      <summary>\n        <para>The edge's points and tangents.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Edge.UpdateEdgeControl\">\n      <summary>\n        <para>Update the edge's EdgeControl.</para>\n      </summary>\n      <returns>\n        <para>False if it failed to update the control. True if it succeeded.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.EdgeConnector\">\n      <summary>\n        <para>Manipulator for creating new edges.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeConnector.edgeDragHelper\">\n      <summary>\n        <para>Reference to the edge drag helper.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.EdgeConnector`1\">\n      <summary>\n        <para>Manipulator for creating new edges.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeConnector_1.edgeDragHelper\">\n      <summary>\n        <para>Reference to the edge drag helper.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeConnector_1.#ctor(UnityEditor.Experimental.UIElements.GraphView.IEdgeConnectorListener)\">\n      <summary>\n        <para>EdgeConnector's constructor.</para>\n      </summary>\n      <param name=\"listener\">The IEdgeConnectorListener that will finalize the edges.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeConnector_1.OnMouseDown(UnityEngine.Experimental.UIElements.MouseDownEvent)\">\n      <summary>\n        <para>Called on mouse down event.</para>\n      </summary>\n      <param name=\"e\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeConnector_1.OnMouseMove(UnityEngine.Experimental.UIElements.MouseMoveEvent)\">\n      <summary>\n        <para>Called on mouse move event.</para>\n      </summary>\n      <param name=\"e\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeConnector_1.OnMouseUp(UnityEngine.Experimental.UIElements.MouseUpEvent)\">\n      <summary>\n        <para>Called on mouse up event.</para>\n      </summary>\n      <param name=\"e\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeConnector_1.RegisterCallbacksOnTarget\">\n      <summary>\n        <para>Called to register click event callbacks on the target element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeConnector_1.UnregisterCallbacksFromTarget\">\n      <summary>\n        <para>Called to unregister event callbacks from the target element.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.EdgeControl\">\n      <summary>\n        <para>VisualElement that draws the edge lines and detects if mouse is on top of edge.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.capRadius\">\n      <summary>\n        <para>Radius of the edge's end caps.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.controlPoints\">\n      <summary>\n        <para>Edge's control points.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.drawFromCap\">\n      <summary>\n        <para>Whether or not to draw the From Cap.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.drawToCap\">\n      <summary>\n        <para>Whether or not to draw the To Cap.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.edgeColor\">\n      <summary>\n        <para>Edge's color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.edgeWidth\">\n      <summary>\n        <para>Edge's visible width.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.from\">\n      <summary>\n        <para>Edge's From postion.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.fromCapColor\">\n      <summary>\n        <para>The color of the cap color at the \"from\" end of the edge.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.inputColor\">\n      <summary>\n        <para>Color on the edge's input.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.inputOrientation\">\n      <summary>\n        <para>Edge input port orientation (vertical/horizontal).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.interceptWidth\">\n      <summary>\n        <para>Width that will be used for mouse hit detection.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.k_MinEdgeWidth\">\n      <summary>\n        <para>Min edge width.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.outputColor\">\n      <summary>\n        <para>Color on the edge's output.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.outputOrientation\">\n      <summary>\n        <para>Edge output port orientation (vertical/horizontal).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.to\">\n      <summary>\n        <para>Edge's To postion.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.toCapColor\">\n      <summary>\n        <para>The color of the cap color at the \"to\" end of the edge.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.ComputeControlPoints\">\n      <summary>\n        <para>Compute the edge's control points.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.ContainsPoint(UnityEngine.Vector2)\">\n      <summary>\n        <para>Check if point is on top of edge.</para>\n      </summary>\n      <param name=\"localPoint\">The point's position.</param>\n      <returns>\n        <para>True if the point is on top of the edge.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.#ctor\">\n      <summary>\n        <para>EdgeControl's constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.DoRepaint\">\n      <summary>\n        <para>Repaint the edge.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.DrawEdge\">\n      <summary>\n        <para>Draw the edge lines.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.Overlaps(UnityEngine.Rect)\">\n      <summary>\n        <para>Check if edge overlaps rectangle.</para>\n      </summary>\n      <param name=\"rect\">The rectangle.</param>\n      <returns>\n        <para>True if the edge overlaps the rectangle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.PointsChanged\">\n      <summary>\n        <para>Check if the edge points have changed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.UpdateLayout\">\n      <summary>\n        <para>Update the edge layout.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeControl.UpdateRenderPoints\">\n      <summary>\n        <para>Update the edge's render points.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.EdgeDragHelper\">\n      <summary>\n        <para>EdgeDragHelper's constructor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeDragHelper.draggedPort\">\n      <summary>\n        <para>The port the edge is being dragged from.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeDragHelper.edgeCandidate\">\n      <summary>\n        <para>The edge being dragged.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeDragHelper.HandleMouseDown(UnityEngine.Experimental.UIElements.MouseDownEvent)\">\n      <summary>\n        <para>Handle mouse down event.</para>\n      </summary>\n      <param name=\"evt\">The event.</param>\n      <returns>\n        <para>True if the drag has been started. False otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeDragHelper.HandleMouseMove(UnityEngine.Experimental.UIElements.MouseMoveEvent)\">\n      <summary>\n        <para>Handle mouse move event.</para>\n      </summary>\n      <param name=\"evt\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeDragHelper.HandleMouseUp(UnityEngine.Experimental.UIElements.MouseUpEvent)\">\n      <summary>\n        <para>Handle mouse up event.</para>\n      </summary>\n      <param name=\"evt\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeDragHelper.Reset(System.Boolean)\">\n      <summary>\n        <para>Reset the state of the drag helper.</para>\n      </summary>\n      <param name=\"didConnect\">Whether the connection was successful or not. View will not reset in this case.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.EdgeDragHelper`1\">\n      <summary>\n        <para>Edge drag helper class.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeDragHelper_1.draggedPort\">\n      <summary>\n        <para>The port the edge is being dragged from.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeDragHelper_1.edgeCandidate\">\n      <summary>\n        <para>The edge being dragged.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.EdgeDragHelper_1.resetPositionOnPan\">\n      <summary>\n        <para>True if it should reset position on pan if nothing is connected.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeDragHelper_1.#ctor(UnityEditor.Experimental.UIElements.GraphView.IEdgeConnectorListener)\">\n      <summary>\n        <para>EdgeDragHelper's constructor.</para>\n      </summary>\n      <param name=\"listener\">The edge connector listener.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeDragHelper_1.HandleMouseDown(UnityEngine.Experimental.UIElements.MouseDownEvent)\">\n      <summary>\n        <para>Handle mouse down event.</para>\n      </summary>\n      <param name=\"evt\">The event.</param>\n      <returns>\n        <para>True if the drag has been started. False otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeDragHelper_1.HandleMouseMove(UnityEngine.Experimental.UIElements.MouseMoveEvent)\">\n      <summary>\n        <para>Handle mouse move event.</para>\n      </summary>\n      <param name=\"evt\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeDragHelper_1.HandleMouseUp(UnityEngine.Experimental.UIElements.MouseUpEvent)\">\n      <summary>\n        <para>Handle mouse up event.</para>\n      </summary>\n      <param name=\"evt\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeDragHelper_1.Reset(System.Boolean)\">\n      <summary>\n        <para>Reset the state of the drag helper.</para>\n      </summary>\n      <param name=\"didConnect\">Whether the connection was successful or not. View will not reset in this case.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.EdgeManipulator\">\n      <summary>\n        <para>Edge manipulator used to drag edges off ports and reconnect them elsewhere.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeManipulator.#ctor\">\n      <summary>\n        <para>EdgeManipulator's constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeManipulator.OnKeyDown(UnityEngine.Experimental.UIElements.KeyDownEvent)\">\n      <summary>\n        <para>Handle key down event.</para>\n      </summary>\n      <param name=\"evt\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeManipulator.OnMouseDown(UnityEngine.Experimental.UIElements.MouseDownEvent)\">\n      <summary>\n        <para>Handle mouse down event.</para>\n      </summary>\n      <param name=\"evt\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeManipulator.OnMouseMove(UnityEngine.Experimental.UIElements.MouseMoveEvent)\">\n      <summary>\n        <para>Handle mouse move event.</para>\n      </summary>\n      <param name=\"evt\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeManipulator.OnMouseUp(UnityEngine.Experimental.UIElements.MouseUpEvent)\">\n      <summary>\n        <para>Handle mouse up event.</para>\n      </summary>\n      <param name=\"evt\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeManipulator.RegisterCallbacksOnTarget\">\n      <summary>\n        <para>Called to register click event callbacks on the target element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.EdgeManipulator.UnregisterCallbacksFromTarget\">\n      <summary>\n        <para>Called to unregister event callbacks from the target element.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.FreehandSelector\">\n      <summary>\n        <para>Freehand selection tool.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.FreehandSelector.#ctor\">\n      <summary>\n        <para>FreehandSelector constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.FreehandSelector.RegisterCallbacksOnTarget\">\n      <summary>\n        <para>Register callbacks on target VisualElement.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.FreehandSelector.UnregisterCallbacksFromTarget\">\n      <summary>\n        <para>Unregister callbacks on target VisualElement.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.GraphElement\">\n      <summary>\n        <para>Base class for main GraphView VisualElements.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphElement.capabilities\">\n      <summary>\n        <para>Graph element's capabilities.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphElement.elementTypeColor\">\n      <summary>\n        <para>Color used for the MiniMap view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphElement.layer\">\n      <summary>\n        <para>Element's layer in the graph.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphElement.selected\">\n      <summary>\n        <para>True if element is currently selected.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphElement.GetGlobalCenter\">\n      <summary>\n        <para>Get the element's center point.</para>\n      </summary>\n      <returns>\n        <para>The center point.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphElement.GetPosition\">\n      <summary>\n        <para>Get element position.</para>\n      </summary>\n      <returns>\n        <para>The position and size rect.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphElement.HitTest(UnityEngine.Vector2)\">\n      <summary>\n        <para>See if point is over element.</para>\n      </summary>\n      <param name=\"localPoint\">The point.</param>\n      <returns>\n        <para>True if over element.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphElement.IsAscendable\">\n      <summary>\n        <para>Checks if the Element is automatically brought to front when selected.</para>\n      </summary>\n      <returns>\n        <para>Returns true if the GraphElement is automatically brought to front when selected. Returns false otherwise</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphElement.IsDroppable\">\n      <summary>\n        <para>Element is drag&amp;droppable.</para>\n      </summary>\n      <returns>\n        <para>True if droppable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphElement.IsMovable\">\n      <summary>\n        <para>Element is movable.</para>\n      </summary>\n      <returns>\n        <para>True if movable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphElement.IsResizable\">\n      <summary>\n        <para>Element is resizable.</para>\n      </summary>\n      <returns>\n        <para>True if resizable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphElement.IsSelectable\">\n      <summary>\n        <para>Element is selectable.</para>\n      </summary>\n      <returns>\n        <para>True if selectable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphElement.IsSelected(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Element is currently selected in specific container.</para>\n      </summary>\n      <param name=\"selectionContainer\">The container.</param>\n      <returns>\n        <para>True if selected.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphElement.OnSelected\">\n      <summary>\n        <para>Called when element is selected.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphElement.OnUnselected\">\n      <summary>\n        <para>Called when element is unselected.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphElement.ResetLayer\">\n      <summary>\n        <para>Reset the element to its original layer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphElement.Select(UnityEngine.Experimental.UIElements.VisualElement,System.Boolean)\">\n      <summary>\n        <para>Select element.</para>\n      </summary>\n      <param name=\"selectionContainer\">Container in which element is being selected.</param>\n      <param name=\"additive\">True if selection is additive, false otherwise.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphElement.SetPosition(UnityEngine.Rect)\">\n      <summary>\n        <para>Set element position.</para>\n      </summary>\n      <param name=\"newPos\">New position.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphElement.Unselect(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Deselect element.</para>\n      </summary>\n      <param name=\"selectionContainer\">Container in which element was selected.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.GraphElementScopeExtensions\">\n      <summary>\n        <para>Set of extension methods useful for Scope.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphElementScopeExtensions.GetContainingScope(UnityEditor.Experimental.UIElements.GraphView.GraphElement)\">\n      <summary>\n        <para>Returns the scope containing the specified GraphElement.</para>\n      </summary>\n      <param name=\"element\"></param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.GraphView\">\n      <summary>\n        <para>Main GraphView class.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.canPasteSerializedData\">\n      <summary>\n        <para>Ask whether or not the serialized data can be pasted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.contentViewContainer\">\n      <summary>\n        <para>Main content container.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.deleteSelection\">\n      <summary>\n        <para>Delete selection callback.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.edges\">\n      <summary>\n        <para>All edges in the graph.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.elementAddedToGroup\">\n      <summary>\n        <para>Callback for when a GraphElement is added to the group.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.elementInsertedToStackNode\">\n      <summary>\n        <para>Callback for when a GraphElement is inserted into a StackNode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.elementRemovedFromGroup\">\n      <summary>\n        <para>Callback for when a GraphElement is removed from the group.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.elementRemovedFromStackNode\">\n      <summary>\n        <para>Callback for when a GraphElement is removed from a StackNode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.elementResized\">\n      <summary>\n        <para>Element resized callback.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.graphElements\">\n      <summary>\n        <para>All GraphElements in the graph.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.graphViewChanged\">\n      <summary>\n        <para>Callback for when certain changes have occured in the graph. See GraphViewChange.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.groupTitleChanged\">\n      <summary>\n        <para>Callback for when a group title is changed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.isReframable\">\n      <summary>\n        <para>Whether or not the selection is reframable.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.maxScale\">\n      <summary>\n        <para>Max zoom level.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.minScale\">\n      <summary>\n        <para>Min zoom level.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.nodeCreationRequest\">\n      <summary>\n        <para>Callback for when the user requests to display the node creation window.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.nodes\">\n      <summary>\n        <para>All nodes currently in the graph.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.GraphView.ports\">\n      <summary>\n        <para>All ports currently in the graph.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.referenceScale\">\n      <summary>\n        <para>Reference zoom level.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.scale\">\n      <summary>\n        <para>Current graph zoom level.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.scaleStep\">\n      <summary>\n        <para>Zoom step. See Experimental.UIElements.GraphView.ContentZoomer._scaleStep for details.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.selection\">\n      <summary>\n        <para>All currently selected elements in the graph.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.serializeGraphElements\">\n      <summary>\n        <para>Callback for serializing graph elements for copy/paste and other actions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.unserializeAndPaste\">\n      <summary>\n        <para>Callback for unserializing graph elements and adding them to the graph.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.viewport\">\n      <summary>\n        <para>The graph's viewport. This is currently just itself.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.viewTransform\">\n      <summary>\n        <para>Graph's view transform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.viewTransformChanged\">\n      <summary>\n        <para>View transform changed callback.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.GraphView.zoomerMaxElementCountWithPixelCacheRegen\">\n      <summary>\n        <para>Number of elements in the graph above which the zoom manipulator will turn off pixel cache regeneration on each tick to avoid performance drops.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.AddElement(UnityEditor.Experimental.UIElements.GraphView.GraphElement)\">\n      <summary>\n        <para>Add new GraphElement. Should use this instead of Add() for adding GraphElements.</para>\n      </summary>\n      <param name=\"graphElement\">The element to add.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.AddLayer(System.Int32)\">\n      <summary>\n        <para>Adds a new layer to the GraphView.</para>\n      </summary>\n      <param name=\"index\">the index of the new layer.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.AddToSelection(UnityEditor.Experimental.UIElements.GraphView.ISelectable)\">\n      <summary>\n        <para>Add element to selection.</para>\n      </summary>\n      <param name=\"selectable\">Element to add to selection.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.GraphView.AskUser\">\n      <summary>\n        <para>Whether or not to ask the user for certain actions like deleting selection.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.GraphView.AskUser.AskUser\">\n      <summary>\n        <para>Ask the user before doing certain actions like deleting selection.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.GraphView.AskUser.DontAskUser\">\n      <summary>\n        <para>Don't ask the user before doing certain actions like deleting selection.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.BuildContextualMenu(UnityEngine.Experimental.UIElements.ContextualMenuPopulateEvent)\">\n      <summary>\n        <para>Add menu items to the contextual menu.</para>\n      </summary>\n      <param name=\"evt\">The event holding the menu to populate.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.CalculateFrameTransform(UnityEngine.Rect,UnityEngine.Rect,System.Int32,UnityEngine.Vector3&amp;,UnityEngine.Vector3&amp;)\">\n      <summary>\n        <para>Calculate the view transform based on zoom level and the size of the window or parent.</para>\n      </summary>\n      <param name=\"rectToFit\">Rectangle to fit.</param>\n      <param name=\"clientRect\">Parent rectangle.</param>\n      <param name=\"border\">Border size.</param>\n      <param name=\"frameTranslation\">Calculated translation.</param>\n      <param name=\"frameScaling\">Calculated scaling.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.CalculateRectToFitAll(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Calculate the rectangle size and position to fit all elements in graph.</para>\n      </summary>\n      <param name=\"container\">This should be the view container.</param>\n      <returns>\n        <para>The calculated rectangle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.CanPasteSerializedData(System.String)\">\n      <summary>\n        <para>Default method for checking if serialized data can be pasted.</para>\n      </summary>\n      <param name=\"data\">Serialized graph element.</param>\n      <returns>\n        <para>True if it can be pasted.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.GraphView.CanPasteSerializedDataDelegate\">\n      <summary>\n        <para>Delegate for checking if serialized data can be pasted.</para>\n      </summary>\n      <param name=\"data\">Serialized graph element.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.ClearSelection\">\n      <summary>\n        <para>Clear selection.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.DeleteElements(System.Collections.Generic.IEnumerable`1&lt;UnityEditor.Experimental.UIElements.GraphView.GraphElement&gt;)\">\n      <summary>\n        <para>Remove elements from the graph view.</para>\n      </summary>\n      <param name=\"elementsToRemove\">Elements to remove.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.DeleteSelection\">\n      <summary>\n        <para>Delete selected elements.</para>\n      </summary>\n      <returns>\n        <para>Stop if no elements were selected. Continue otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.GraphView.DeleteSelectionDelegate\">\n      <summary>\n        <para>Delegate for deleting selection.</para>\n      </summary>\n      <param name=\"operationName\">Name of operation for undo/redo labels.</param>\n      <param name=\"askUser\">Whether or not to ask the user.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.DeleteSelectionOperation(System.String,UnityEditor.Experimental.UIElements.GraphView.GraphView/AskUser)\">\n      <summary>\n        <para>Default method for deleting selection.</para>\n      </summary>\n      <param name=\"operationName\">Name of operation for undo/redo labels.</param>\n      <param name=\"askUser\">Whether or not to ask the user.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.GraphView.ElementResized\">\n      <summary>\n        <para>Element resized delegate.</para>\n      </summary>\n      <param name=\"visualElement\">Resized element.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.FrameAll\">\n      <summary>\n        <para>Focus view all elements in the graph.</para>\n      </summary>\n      <returns>\n        <para>Should always be Stop.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.FrameNext\">\n      <summary>\n        <para>Focus view on the next element after the one currently selected.</para>\n      </summary>\n      <param name=\"predicate\">The predicate used to sort the list of all existing graph element.</param>\n      <returns>\n        <para>Continue if no elements in graph, Stop otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.FrameNext(System.Func`2&lt;UnityEditor.Experimental.UIElements.GraphView.GraphElement,System.Boolean&gt;)\">\n      <summary>\n        <para>Focus view on the next element after the one currently selected.</para>\n      </summary>\n      <param name=\"predicate\">The predicate used to sort the list of all existing graph element.</param>\n      <returns>\n        <para>Continue if no elements in graph, Stop otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.FrameOrigin\">\n      <summary>\n        <para>Focus view on the graph's origin.</para>\n      </summary>\n      <returns>\n        <para>Always returns Stop.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.FramePrev\">\n      <summary>\n        <para>Focus view on the previous element before the one currently selected.</para>\n      </summary>\n      <param name=\"predicate\">The predicate used to sort the list of all existing graph element.</param>\n      <returns>\n        <para>Continue if no elements in graph, Stop otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.FramePrev(System.Func`2&lt;UnityEditor.Experimental.UIElements.GraphView.GraphElement,System.Boolean&gt;)\">\n      <summary>\n        <para>Focus view on the previous element before the one currently selected.</para>\n      </summary>\n      <param name=\"predicate\">The predicate used to sort the list of all existing graph element.</param>\n      <returns>\n        <para>Continue if no elements in graph, Stop otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.FrameSelection\">\n      <summary>\n        <para>Focus view on currently selected elements.</para>\n      </summary>\n      <returns>\n        <para>Continue if no elements selected, Stop otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.GraphView.FrameType\">\n      <summary>\n        <para>Type of framing.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.GraphView.FrameType.All\">\n      <summary>\n        <para>Focus view on all elements.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.GraphView.FrameType.Origin\">\n      <summary>\n        <para>Focus view on origin.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.GraphView.FrameType.Selection\">\n      <summary>\n        <para>Focus view on selection.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.GetCompatiblePorts(UnityEditor.Experimental.UIElements.GraphView.Port,UnityEditor.Experimental.UIElements.GraphView.NodeAdapter)\">\n      <summary>\n        <para>Get all ports compatible with given port.</para>\n      </summary>\n      <param name=\"startPort\">Start port to validate against.</param>\n      <param name=\"nodeAdapter\">Node adapter.</param>\n      <returns>\n        <para>List of compatible ports.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.GetEdgeByGuid(System.String)\">\n      <summary>\n        <para>Get edge by its GUID.</para>\n      </summary>\n      <param name=\"guid\">The GUID.</param>\n      <returns>\n        <para>The first edge with given GUID. Null if none found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.GetElementByGuid(System.String)\">\n      <summary>\n        <para>Get any element with a given GUID.</para>\n      </summary>\n      <param name=\"guid\">The GUID.</param>\n      <returns>\n        <para>The first element with the given GUID. Null if none found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.GetNodeByGuid(System.String)\">\n      <summary>\n        <para>Get node with a given GUID.</para>\n      </summary>\n      <param name=\"guid\">The GUID.</param>\n      <returns>\n        <para>The first node with the given GUID. Null if none found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.GetPortByGuid(System.String)\">\n      <summary>\n        <para>Get port by its GUID.</para>\n      </summary>\n      <param name=\"guid\">The GUID.</param>\n      <returns>\n        <para>The first port found with given GUID. Null if none found.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.GraphView.GraphViewChanged\">\n      <summary>\n        <para>Delegate used to indicate a change in GraphView usualy done by a Manipulator.</para>\n      </summary>\n      <param name=\"graphViewChange\">The change struct.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.OnPersistentDataReady\">\n      <summary>\n        <para>Called when persistent data, such as zoom level and selection, is ready to be retrieved and restored.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.RemoveElement(UnityEditor.Experimental.UIElements.GraphView.GraphElement)\">\n      <summary>\n        <para>Remove element from the graph.</para>\n      </summary>\n      <param name=\"graphElement\">Element to remove.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.RemoveFromSelection(UnityEditor.Experimental.UIElements.GraphView.ISelectable)\">\n      <summary>\n        <para>Remove element from selection.</para>\n      </summary>\n      <param name=\"selectable\">Element to remove from selection.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.SerializeGraphElements(System.Collections.Generic.IEnumerable`1&lt;UnityEditor.Experimental.UIElements.GraphView.GraphElement&gt;)\">\n      <summary>\n        <para>Default method for serializing graph elements.</para>\n      </summary>\n      <param name=\"elements\">Elements to serialize.</param>\n      <returns>\n        <para>Serialized data.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.GraphView.SerializeGraphElementsDelegate\">\n      <summary>\n        <para>Delegate for serializing graph elements.</para>\n      </summary>\n      <param name=\"elements\">Elements to serialize.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.SetupZoom(System.Single,System.Single)\">\n      <summary>\n        <para>Setup zoom properties.</para>\n      </summary>\n      <param name=\"minScaleSetup\">Min zoom level.</param>\n      <param name=\"maxScaleSetup\">Max zoom level.</param>\n      <param name=\"scaleStepSetup\">Zoom step.</param>\n      <param name=\"referenceScaleSetup\">Reference zoom level.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.SetupZoom(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Setup zoom properties.</para>\n      </summary>\n      <param name=\"minScaleSetup\">Min zoom level.</param>\n      <param name=\"maxScaleSetup\">Max zoom level.</param>\n      <param name=\"scaleStepSetup\">Zoom step.</param>\n      <param name=\"referenceScaleSetup\">Reference zoom level.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.GraphView.UnserializeAndPasteDelegate\">\n      <summary>\n        <para>Delegate for unserializing and pasting elements.</para>\n      </summary>\n      <param name=\"operationName\">Name of operation for undo/redo labels.</param>\n      <param name=\"data\">Serialized data.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.UnserializeAndPasteOperation(System.String,System.String)\">\n      <summary>\n        <para>Default method for unserializing elements and pasting.</para>\n      </summary>\n      <param name=\"operationName\">Name of operation for undo/redo labels.</param>\n      <param name=\"data\">Serialized data.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.UpdateViewTransform(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Update the viewport transform.</para>\n      </summary>\n      <param name=\"newPosition\">New position.</param>\n      <param name=\"newScale\">New scale.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GraphView.ValidateTransform\">\n      <summary>\n        <para>Validate the view transform.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.GraphView.ViewTransformChanged\">\n      <summary>\n        <para>View transform changed (zoom) delegate.</para>\n      </summary>\n      <param name=\"graphView\">GraphView reference.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.GraphViewChange\">\n      <summary>\n        <para>Set of changes in the graph that can be intercepted.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.GraphViewChange.edgesToCreate\">\n      <summary>\n        <para>Edges about to be created.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.GraphViewChange.elementsToRemove\">\n      <summary>\n        <para>Elements about to be removed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.GraphViewChange.movedElements\">\n      <summary>\n        <para>Elements already moved.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.GridBackground\">\n      <summary>\n        <para>Default GraphView background.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GridBackground.#ctor\">\n      <summary>\n        <para>GridBackground's constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GridBackground.DoRepaint\">\n      <summary>\n        <para>Repaint the background.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.GridBackground.OnStyleResolved(UnityEngine.Experimental.UIElements.StyleSheets.ICustomStyle)\">\n      <summary>\n        <para>Recompute styles on the background.</para>\n      </summary>\n      <param name=\"elementStyle\">New style.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.Group\">\n      <summary>\n        <para>Allows interactive insertion of elements in a named scope.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Group.title\">\n      <summary>\n        <para>Title of the group.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Group.AcceptsElement(UnityEditor.Experimental.UIElements.GraphView.GraphElement,System.String&amp;)\">\n      <summary>\n        <para>Whether an element can be added to this group.</para>\n      </summary>\n      <param name=\"element\">The element to add.</param>\n      <param name=\"reasonWhyNotAccepted\">The reason that indicates why the element is not accepted.</param>\n      <returns>\n        <para>Returns false if the specified element is a scope or group. Otherwise returns true.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Group.#ctor\">\n      <summary>\n        <para>Group constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Group.OnElementAdded(UnityEditor.Experimental.UIElements.GraphView.GraphElement)\">\n      <summary>\n        <para>Called when an element is added to this group.</para>\n      </summary>\n      <param name=\"element\">The added element.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Group.OnElementRemoved(UnityEditor.Experimental.UIElements.GraphView.GraphElement)\">\n      <summary>\n        <para>Called when an element is removed from this group.</para>\n      </summary>\n      <param name=\"element\">The removed element.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.IconBadge\">\n      <summary>\n        <para>A rectangular badge, usually attached to another visual element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.IconBadge.alignment\">\n      <summary>\n        <para>Relative alignment between the badge and its target. The alignment will influence icon and tip position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.IconBadge.badgeText\">\n      <summary>\n        <para>Text displayed next to the badge on mouse hover.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.IconBadge.distance\">\n      <summary>\n        <para>Distance between the badge and its target element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.IconBadge.target\">\n      <summary>\n        <para>Target element to which this badge is attached.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.IconBadge.AttachTo(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.SpriteAlignment)\">\n      <summary>\n        <para>Attaches this badge to another element.</para>\n      </summary>\n      <param name=\"target\">The target element to attach this badge to.</param>\n      <param name=\"align\">Relative alignement of the badge.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.IconBadge.CreateComment(System.String)\">\n      <summary>\n        <para>Creates an IconBadge with the \"comment\" visual style.</para>\n      </summary>\n      <param name=\"message\">Displayed comment message.</param>\n      <returns>\n        <para>The created badge.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.IconBadge.CreateError(System.String)\">\n      <summary>\n        <para>Creates an IconBadge with the \"error\" visual style.</para>\n      </summary>\n      <param name=\"message\">Displayed error message.</param>\n      <returns>\n        <para>The created badge.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.IconBadge.#ctor\">\n      <summary>\n        <para>Creates a basic comment badge.</para>\n      </summary>\n      <param name=\"template\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.IconBadge.#ctor(UnityEngine.Experimental.UIElements.VisualTreeAsset)\">\n      <summary>\n        <para>Creates a basic comment badge.</para>\n      </summary>\n      <param name=\"template\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.IconBadge.Detach\">\n      <summary>\n        <para>Detaches this badge from its target.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.Experimental.UIElements.GraphView.IDroppable\">\n      <summary>\n        <para>Droppable interface.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.IDroppable.IsDroppable\">\n      <summary>\n        <para>Check if element is droppable.</para>\n      </summary>\n      <returns>\n        <para>True if droppable. False otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEditor.Experimental.UIElements.GraphView.IDropTarget\">\n      <summary>\n        <para>Drop target interface.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.IDropTarget.CanAcceptDrop(System.Collections.Generic.List`1&lt;UnityEditor.Experimental.UIElements.GraphView.ISelectable&gt;)\">\n      <summary>\n        <para>Check if we can drop on this target.</para>\n      </summary>\n      <param name=\"selection\">Selected elements.</param>\n      <returns>\n        <para>True if we can drop. False otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.IDropTarget.DragExited\">\n      <summary>\n        <para>Called when drag exits target.</para>\n      </summary>\n      <returns>\n        <para>Event propagation.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.IDropTarget.DragPerform\">\n      <summary>\n        <para>Called when drag is performed.</para>\n      </summary>\n      <param name=\"evt\">The event.</param>\n      <param name=\"selection\">The selected elements.</param>\n      <param name=\"dropTarget\">The drop target.</param>\n      <returns>\n        <para>Event propagation.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.IDropTarget.DragUpdated\">\n      <summary>\n        <para>Called when drag is updated.</para>\n      </summary>\n      <param name=\"evt\">The event.</param>\n      <param name=\"selection\">The selected elements.</param>\n      <param name=\"dropTarget\">The drop target.</param>\n      <returns>\n        <para>Event propagation.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEditor.Experimental.UIElements.GraphView.IEdgeConnectorListener\">\n      <summary>\n        <para>Used by EdgeConnector manipulator to finish the actual edge creation. Its an interface the user can override and create edges in a different way.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.IEdgeConnectorListener.OnDrop(UnityEditor.Experimental.UIElements.GraphView.GraphView,UnityEditor.Experimental.UIElements.GraphView.Edge)\">\n      <summary>\n        <para>Called when a new edge is dropped on a port.</para>\n      </summary>\n      <param name=\"graphView\">Reference to the GraphView.</param>\n      <param name=\"edge\">The edge being created.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.IEdgeConnectorListener.OnDropOutsidePort(UnityEditor.Experimental.UIElements.GraphView.Edge,UnityEngine.Vector2)\">\n      <summary>\n        <para>Called when edge is dropped in empty space.</para>\n      </summary>\n      <param name=\"edge\">The edge being dropped.</param>\n      <param name=\"position\">The position in empty space the edge is dropped on.</param>\n    </member>\n    <member name=\"?:UnityEditor.Experimental.UIElements.GraphView.ISearchWindowProvider\">\n      <summary>\n        <para>This interface describes methods to manage a search session for graph nodes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ISearchWindowProvider.CreateSearchTree(UnityEditor.Experimental.UIElements.GraphView.SearchWindowContext)\">\n      <summary>\n        <para>Generates data to populate the search window.</para>\n      </summary>\n      <param name=\"context\">Contextual data initially passed the window when first created.</param>\n      <returns>\n        <para>Returns the list of SearchTreeEntry objects displayed in the search window.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ISearchWindowProvider.OnSelectEntry(UnityEditor.Experimental.UIElements.GraphView.SearchTreeEntry,UnityEditor.Experimental.UIElements.GraphView.SearchWindowContext)\">\n      <summary>\n        <para>Selects an entry in the search tree list.</para>\n      </summary>\n      <param name=\"SearchTreeEntry\">The selected entry.</param>\n      <param name=\"context\">Contextual data to pass to the search window when it is first created.</param>\n    </member>\n    <member name=\"?:UnityEditor.Experimental.UIElements.GraphView.ISelectable\">\n      <summary>\n        <para>Selectable interface.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ISelectable.HitTest(UnityEngine.Vector2)\">\n      <summary>\n        <para>See if point is on target.</para>\n      </summary>\n      <param name=\"localPoint\">The point.</param>\n      <returns>\n        <para>True if on target.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ISelectable.IsSelectable\">\n      <summary>\n        <para>Check if element is selectable.</para>\n      </summary>\n      <returns>\n        <para>True if selectable. False otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ISelectable.IsSelected(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Check if element is selected.</para>\n      </summary>\n      <param name=\"selectionContainer\">Container in which the selection is tracked.</param>\n      <returns>\n        <para>True if selected. False otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ISelectable.Overlaps(UnityEngine.Rect)\">\n      <summary>\n        <para>Check if selection overlaps rectangle.</para>\n      </summary>\n      <param name=\"rectangle\">Rectangle to check.</param>\n      <returns>\n        <para>True if it overlaps. False otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ISelectable.Select(UnityEngine.Experimental.UIElements.VisualElement,System.Boolean)\">\n      <summary>\n        <para>Select element.</para>\n      </summary>\n      <param name=\"selectionContainer\">Container in which selection is tracked.</param>\n      <param name=\"additive\">True if selection is additive. False otherwise.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ISelectable.Unselect(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Deselect element.</para>\n      </summary>\n      <param name=\"selectionContainer\">Container in which selection is tracked.</param>\n    </member>\n    <member name=\"?:UnityEditor.Experimental.UIElements.GraphView.ISelection\">\n      <summary>\n        <para>Selection interface.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.ISelection.selection\">\n      <summary>\n        <para>Get the selection.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ISelection.AddToSelection(UnityEditor.Experimental.UIElements.GraphView.ISelectable)\">\n      <summary>\n        <para>Add element to selection.</para>\n      </summary>\n      <param name=\"selectable\">Selectable element to add.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ISelection.ClearSelection\">\n      <summary>\n        <para>Clear selection.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ISelection.RemoveFromSelection(UnityEditor.Experimental.UIElements.GraphView.ISelectable)\">\n      <summary>\n        <para>Remove element from selection.</para>\n      </summary>\n      <param name=\"selectable\">Selectable element to remove.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.MiniMap\">\n      <summary>\n        <para>MiniMap.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.MiniMap.anchored\">\n      <summary>\n        <para>True if the map is pinned or achored (non-movable). False if you can drag and move it around.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.MiniMap.maxHeight\">\n      <summary>\n        <para>Max height.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.MiniMap.maxWidth\">\n      <summary>\n        <para>Max width.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.MiniMap.BuildContextualMenu(UnityEngine.Experimental.UIElements.ContextualMenuPopulateEvent)\">\n      <summary>\n        <para>Add menu items to the mini map contextual menu.</para>\n      </summary>\n      <param name=\"evt\">The event holding the menu to populate.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.MiniMap.#ctor\">\n      <summary>\n        <para>MiniMap's constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.MiniMap.DoRepaint\">\n      <summary>\n        <para>Repaint the MiniMap.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.Node\">\n      <summary>\n        <para>Main GraphView node class.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Node.expanded\">\n      <summary>\n        <para>Is node expanded.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Node.extensionContainer\">\n      <summary>\n        <para>Empty container used to display custom elements. After adding elements, call RefreshExpandedState in order to toggle this container visibility.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Node.inputContainer\">\n      <summary>\n        <para>Input container used for input ports.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Node.mainContainer\">\n      <summary>\n        <para>Main container that includes all other containers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Node.outputContainer\">\n      <summary>\n        <para>Outputs container, used for output ports.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Node.title\">\n      <summary>\n        <para>Node's title element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Node.titleContainer\">\n      <summary>\n        <para>Title bar container.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Node.topContainer\">\n      <summary>\n        <para>Entire top area containing input and output containers.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Node.BuildContextualMenu(UnityEngine.Experimental.UIElements.ContextualMenuPopulateEvent)\">\n      <summary>\n        <para>Add menu items to the node contextual menu.</para>\n      </summary>\n      <param name=\"evt\">The event holding the menu to populate.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Node.#ctor\">\n      <summary>\n        <para>Node's constructor.</para>\n      </summary>\n      <param name=\"nodeOrientation\">The orientation.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Node.#ctor\">\n      <summary>\n        <para>Node's constructor.</para>\n      </summary>\n      <param name=\"nodeOrientation\">The orientation.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Node.InstantiatePort\">\n      <summary>\n        <para>Create a new port specific to this node.</para>\n      </summary>\n      <param name=\"orientation\">Port's orientation.</param>\n      <param name=\"direction\">Port's direction.</param>\n      <param name=\"type\">Port's type.</param>\n      <param name=\"newPres\">(obsolete).</param>\n      <returns>\n        <para>The new port.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Node.InstantiatePort\">\n      <summary>\n        <para>Create a new port specific to this node.</para>\n      </summary>\n      <param name=\"orientation\">Port's orientation.</param>\n      <param name=\"direction\">Port's direction.</param>\n      <param name=\"type\">Port's type.</param>\n      <param name=\"newPres\">(obsolete).</param>\n      <returns>\n        <para>The new port.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Node.OnPortRemoved(UnityEditor.Experimental.UIElements.GraphView.Port)\">\n      <summary>\n        <para>Called when port is remove.</para>\n      </summary>\n      <param name=\"port\">The removed port.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Node.RefreshExpandedState\">\n      <summary>\n        <para>After adding custom elements to the extensionContainer, call this method in order for them to become visible.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Node.RefreshPorts\">\n      <summary>\n        <para>Refresh the layout of the ports.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Node.SetPosition(UnityEngine.Rect)\">\n      <summary>\n        <para>Set node position.</para>\n      </summary>\n      <param name=\"newPos\">New position.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Node.ToggleCollapse\">\n      <summary>\n        <para>Toggle node's collapse state.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Node.UseDefaultStyling\">\n      <summary>\n        <para>Applies the default styling of Node. This must be explicitly called by Node subclasses that use their own uxml files.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.NodeCreationContext\">\n      <summary>\n        <para>This struct represents the context when the user initiates creating a graph node.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.NodeCreationContext.index\">\n      <summary>\n        <para>The index where the created node will be inserted.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.NodeCreationContext.screenMousePosition\">\n      <summary>\n        <para>Position of the click that initiated the request to create a node, in the coordinate space of the screen.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.NodeCreationContext.target\">\n      <summary>\n        <para>The VisualElement where the created node will be added.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.Orientation\">\n      <summary>\n        <para>Graph element orientation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.Orientation.Horizontal\">\n      <summary>\n        <para>Horizontal orientation used for nodes and connections flowing to the left or right.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.Orientation.Vertical\">\n      <summary>\n        <para>Vertical orientation used for nodes and connections flowing up or down.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.Pill\">\n      <summary>\n        <para>The Pill class includes methods for creating and managing a VisualElement that resembles a capsule. The Pill class includes text, an icon, and two optional child VisualElements: one to the left of the pill, and one to the right of the pill.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Pill.highlighted\">\n      <summary>\n        <para>Returns whether the pill is highlighted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Pill.icon\">\n      <summary>\n        <para>The icon of the pill.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Pill.left\">\n      <summary>\n        <para>The VisualElement to the left of the pill.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Pill.right\">\n      <summary>\n        <para>The VisualElement to the right of the pill.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Pill.text\">\n      <summary>\n        <para>The text of the pill.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Pill.#ctor\">\n      <summary>\n        <para>Constructs a pill with its optional left and right child VisualElements.</para>\n      </summary>\n      <param name=\"left\"></param>\n      <param name=\"right\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Pill.#ctor(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Constructs a pill with its optional left and right child VisualElements.</para>\n      </summary>\n      <param name=\"left\"></param>\n      <param name=\"right\"></param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.Pill.PillFactory\">\n      <summary>\n        <para>Instantiates a Pill using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Pill.PillFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.Pill.PillUxmTraits\">\n      <summary>\n        <para>UxmlTraits for the Pill.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Pill.PillUxmTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for Pill properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Pill.PillUxmTraits.uxmlChildElementsDescription\">\n      <summary>\n        <para>Returns an empty enumerable, as pill elements do not have children.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Pill.PillUxmTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Pill.PillUxmTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize Pill properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.Port\">\n      <summary>\n        <para>GraphView Port class.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Port.capacity\">\n      <summary>\n        <para>Specify how many edges a port can have connected.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Port.collapsed\">\n      <summary>\n        <para>Port's collapsed state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Port.connected\">\n      <summary>\n        <para>Port's connected state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Port.connections\">\n      <summary>\n        <para>All the port's current connections.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Port.direction\">\n      <summary>\n        <para>Port's direction.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Port.disabledPortColor\">\n      <summary>\n        <para>The color of the port when disabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Port.edgeConnector\">\n      <summary>\n        <para>Reference to the edge connector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Port.highlight\">\n      <summary>\n        <para>Is the port highlighted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Port.node\">\n      <summary>\n        <para>Port's node.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Port.orientation\">\n      <summary>\n        <para>Port's orientation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Port.portCapLit\">\n      <summary>\n        <para>Is the port cap lit or not.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Port.portColor\">\n      <summary>\n        <para>The color of the port.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Port.portName\">\n      <summary>\n        <para>Port name.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Port.portType\">\n      <summary>\n        <para>Port type.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Port.source\">\n      <summary>\n        <para>Port's source.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Port.visualClass\">\n      <summary>\n        <para>The name of the uss class to use to style the port.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.Port.Capacity\">\n      <summary>\n        <para>Specify how many edges a port can have connected.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.Port.Capacity.Multi\">\n      <summary>\n        <para>Port can have multiple connections.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.Port.Capacity.Single\">\n      <summary>\n        <para>Port can only have a single connection.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Port.Connect(UnityEditor.Experimental.UIElements.GraphView.Edge)\">\n      <summary>\n        <para>Connect and edge to the port.</para>\n      </summary>\n      <param name=\"edge\">The edge.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Port.ConnectTo(UnityEditor.Experimental.UIElements.GraphView.Port)\">\n      <summary>\n        <para>Creates an edge between this port and the 'other' port.</para>\n      </summary>\n      <param name=\"other\">Other port to connect to.</param>\n      <returns>\n        <para>Newly created edge.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Port.ConnectTo(UnityEditor.Experimental.UIElements.GraphView.Port)\">\n      <summary>\n        <para>Creates an edge between this port and the 'other' port.</para>\n      </summary>\n      <param name=\"other\">Other port to connect to.</param>\n      <returns>\n        <para>Newly created edge.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Port.ContainsPoint(UnityEngine.Vector2)\">\n      <summary>\n        <para>Check if point is on top of port. Used for selection and hover.</para>\n      </summary>\n      <param name=\"localPoint\">The point.</param>\n      <returns>\n        <para>True if the point is over the port.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Port.Create(UnityEditor.Experimental.UIElements.GraphView.Orientation,UnityEditor.Experimental.UIElements.GraphView.Direction,UnityEditor.Experimental.UIElements.GraphView.Port/Capacity,System.Type)\">\n      <summary>\n        <para>Factory method for creating a port.</para>\n      </summary>\n      <param name=\"presenter\">(obsolete).</param>\n      <param name=\"orientation\">Orientation.</param>\n      <param name=\"direction\">Direction.</param>\n      <param name=\"capacity\">Multi vs. Single.</param>\n      <param name=\"type\">Port data type.</param>\n      <returns>\n        <para>The new port.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Port.Create\">\n      <summary>\n        <para>Factory method for creating a port.</para>\n      </summary>\n      <param name=\"presenter\">(obsolete).</param>\n      <param name=\"orientation\">Orientation.</param>\n      <param name=\"direction\">Direction.</param>\n      <param name=\"capacity\">Multi vs. Single.</param>\n      <param name=\"type\">Port data type.</param>\n      <returns>\n        <para>The new port.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Port.Disconnect(UnityEditor.Experimental.UIElements.GraphView.Edge)\">\n      <summary>\n        <para>Disconnect edge from port.</para>\n      </summary>\n      <param name=\"edge\">The edge to disconnect.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Port.DisconnectAll\">\n      <summary>\n        <para>Disconnect all edges from port.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Port.GetGlobalCenter\">\n      <summary>\n        <para>Get the port's center.</para>\n      </summary>\n      <returns>\n        <para>The center point.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.PortSource`1\">\n      <summary>\n        <para>Port source.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.PortSource_1.#ctor\">\n      <summary>\n        <para>Port source constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.RectangleSelector\">\n      <summary>\n        <para>Rectangle selection box manipulator.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.RectangleSelector.ComputeAxisAlignedBound(UnityEngine.Rect,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Computer the axis-aligned bound rectangle.</para>\n      </summary>\n      <param name=\"position\">Rectangle to bound.</param>\n      <param name=\"transform\">Transform.</param>\n      <returns>\n        <para>The axis-aligned bound.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.RectangleSelector.#ctor\">\n      <summary>\n        <para>RectangleSelector's constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.RectangleSelector.RegisterCallbacksOnTarget\">\n      <summary>\n        <para>Called to register click event callbacks on the target element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.RectangleSelector.UnregisterCallbacksFromTarget\">\n      <summary>\n        <para>Called to unregister event callbacks from the target element.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.RectUtils\">\n      <summary>\n        <para>Utilities for rectangle selections.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.RectUtils.#ctor\">\n      <summary>\n        <para>RectUtils' constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.RectUtils.Encompass(UnityEngine.Rect,UnityEngine.Rect)\">\n      <summary>\n        <para>Create rectangle that encompasses two rectangles.</para>\n      </summary>\n      <param name=\"a\">Rect a.</param>\n      <param name=\"b\">Rect b.</param>\n      <returns>\n        <para>New rectangle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.RectUtils.Inflate(UnityEngine.Rect,System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Creates and returns an enlarged copy of the specified rectangle. The copy is enlarged by the specified amounts.</para>\n      </summary>\n      <param name=\"a\">The original rectangle.</param>\n      <param name=\"left\">The amount to inflate the rectangle towards the left.</param>\n      <param name=\"top\">The amount to inflate the rectangle towards the top.</param>\n      <param name=\"right\">The amount to inflate the rectangle towards the right.</param>\n      <param name=\"bottom\">The amount to inflate the rectangle towards the bottom.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.RectUtils.IntersectsSegment(UnityEngine.Rect,UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Check if a line segment overlaps a rectangle.</para>\n      </summary>\n      <param name=\"rect\">Rectangle to check.</param>\n      <param name=\"p1\">Line segment point 1.</param>\n      <param name=\"p2\">Line segment point 2.</param>\n      <returns>\n        <para>True if line segment overlaps rectangle. False otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.Resizer\">\n      <summary>\n        <para>Resizer manipulator element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Resizer.activateButton\">\n      <summary>\n        <para>Mouse button to activate the resizer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Resizer.#ctor\">\n      <summary>\n        <para>Resizer's constructor.</para>\n      </summary>\n      <param name=\"minimumSize\">Minimum element size.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Resizer.#ctor(UnityEngine.Vector2)\">\n      <summary>\n        <para>Resizer's constructor.</para>\n      </summary>\n      <param name=\"minimumSize\">Minimum element size.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Resizer.DoRepaint\">\n      <summary>\n        <para>Repaint resizer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.Scope\">\n      <summary>\n        <para>This class allows for nodes to be grouped into a common area, or Scope. This class includes methods that automatically resize and position the Scope to encompass the group of nodes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Scope.autoUpdateGeometry\">\n      <summary>\n        <para>Enables or disables the automatic resizing and positioning of the Scope.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Scope.containedElements\">\n      <summary>\n        <para>The list of GraphElements contained by the Scope.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Scope.containedElementsRect\">\n      <summary>\n        <para>The rect containing the GraphElements encompassed by the Scope. The rect is expressed in local coordinates.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.Scope.headerContainer\">\n      <summary>\n        <para>Returns the header container for the Scope. Use this header container to customizer the header of the Scope.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Scope.AcceptsElement(UnityEditor.Experimental.UIElements.GraphView.GraphElement,System.String&amp;)\">\n      <summary>\n        <para>Whether the GraphElement can be added to this scope.</para>\n      </summary>\n      <param name=\"element\">The element to add.</param>\n      <param name=\"reasonWhyNotAccepted\">The reason why the specified element cannot be added to the Scope.</param>\n      <returns>\n        <para>Returns true if the specified element is accepted by the Scope. Returns false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Scope.AddElement(UnityEditor.Experimental.UIElements.GraphView.GraphElement)\">\n      <summary>\n        <para>Adds a GraphElement to the Scope.</para>\n      </summary>\n      <param name=\"element\">The element to add.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Scope.ContainsElement(UnityEditor.Experimental.UIElements.GraphView.GraphElement)\">\n      <summary>\n        <para>Determines if the Scope contains the specified GraphElement.</para>\n      </summary>\n      <param name=\"element\">The element.</param>\n      <returns>\n        <para>Returns true if the Scope contains the specified element. Returns false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Scope.#ctor\">\n      <summary>\n        <para>Scope constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Scope.GetPosition\">\n      <summary>\n        <para>Returns the geometry of the Scope.</para>\n      </summary>\n      <returns>\n        <para>The geometry.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Scope.HitTest(UnityEngine.Vector2)\">\n      <summary>\n        <para>Determines whether the specified point is within the selectable area of the Scope.</para>\n      </summary>\n      <param name=\"localPoint\">The point in local coordinates.</param>\n      <returns>\n        <para>Returns true if the point is within the selectable area of the Scope. Returns false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Scope.OnElementAdded(UnityEditor.Experimental.UIElements.GraphView.GraphElement)\">\n      <summary>\n        <para>Called when a GraphElement is added to the Scope.</para>\n      </summary>\n      <param name=\"element\">The added element.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Scope.OnElementRemoved(UnityEditor.Experimental.UIElements.GraphView.GraphElement)\">\n      <summary>\n        <para>Called when a GraphElement is removed from the Scope.</para>\n      </summary>\n      <param name=\"element\">The removed element.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Scope.Overlaps(UnityEngine.Rect)\">\n      <summary>\n        <para>Determines whether the specified rect overlaps the Scope.</para>\n      </summary>\n      <param name=\"rectangle\">The rect.</param>\n      <returns>\n        <para>Returns true when the specified rect overlaps the Scope.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Scope.RemoveElement(UnityEditor.Experimental.UIElements.GraphView.GraphElement)\">\n      <summary>\n        <para>Removes an element from the Scope.</para>\n      </summary>\n      <param name=\"element\">The element to remove.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Scope.ScheduleUpdateGeometryFromContent\">\n      <summary>\n        <para>Schedules the update of the size and position of the Scope based on its contents.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Scope.SetPosition(UnityEngine.Rect)\">\n      <summary>\n        <para>Sets the geometry of the Scope.</para>\n      </summary>\n      <param name=\"newPos\">The new geometry.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.Scope.UpdateGeometryFromContent\">\n      <summary>\n        <para>Updates the size and position of the Scope based on its on its contents.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.SearchTreeEntry\">\n      <summary>\n        <para>This class describes a search tree entry. The search window displays search tree entries in the GraphView.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.SearchTreeEntry.content\">\n      <summary>\n        <para>The text and icon of the search entry.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.SearchTreeEntry.level\">\n      <summary>\n        <para>The level of the entry in the search tree.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.SearchTreeEntry.name\">\n      <summary>\n        <para>The string used for string comparison against the user filter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Experimental.UIElements.GraphView.SearchTreeEntry.userData\">\n      <summary>\n        <para>A user specified object for attaching application specific data to a search tree entry.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.SearchTreeEntry.#ctor(UnityEngine.GUIContent)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"content\">The text and icon of the item.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.SearchTreeGroupEntry\">\n      <summary>\n        <para>This class describes group entries in the search tree. The search tree is displayed in the search window.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.SearchTreeGroupEntry.#ctor(UnityEngine.GUIContent,System.Int32)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"content\">The text and icon of the group entry.</param>\n      <param name=\"level\">The level of the group entry.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.SearchWindow\">\n      <summary>\n        <para>This subclass displays a searchable menu of available graph nodes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.SearchWindow.Open(UnityEditor.Experimental.UIElements.GraphView.SearchWindowContext,T)\">\n      <summary>\n        <para>Opens the search window above the Graph.</para>\n      </summary>\n      <param name=\"context\">Structure of parameters that configure the search window.</param>\n      <param name=\"provider\">Reference to the object that provides the search results.</param>\n      <returns>\n        <para>Returns true if the window opens successfully. Returns false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.SearchWindowContext\">\n      <summary>\n        <para>This structure includes parameters for configuring the search window.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.SearchWindowContext.requestedHeight\">\n      <summary>\n        <para>Requested height of the window. Set to 0.0f to use the default height.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.SearchWindowContext.requestedWidth\">\n      <summary>\n        <para>Requested width of the window. Set to 0.0f to use the default width.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.SearchWindowContext.screenMousePosition\">\n      <summary>\n        <para>The initial mouse event position that triggered opening the window, in the coordinate space of the screen.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.SearchWindowContext.#ctor(UnityEngine.Vector2,System.Single,System.Single)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"requestedHeight\">Requested height of the window. Set to 0.0f to use the default height.</param>\n      <param name=\"requestedWidth\">Requested width of the window. Set to 0.0f to use the default width.</param>\n      <param name=\"screenMousePosition\">The initial mouse event position that triggered opening the window, in the coordinate space of the screen.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.SelectionDragger\">\n      <summary>\n        <para>Selection dragger manipulator.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.SelectionDragger.#ctor\">\n      <summary>\n        <para>SelectionDragger's constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.SelectionDragger.OnMouseDown(UnityEngine.Experimental.UIElements.MouseDownEvent)\">\n      <summary>\n        <para>Called on mouse down event.</para>\n      </summary>\n      <param name=\"e\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.SelectionDragger.OnMouseMove(UnityEngine.Experimental.UIElements.MouseMoveEvent)\">\n      <summary>\n        <para>Called on mouse move event.</para>\n      </summary>\n      <param name=\"e\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.SelectionDragger.OnMouseUp(UnityEngine.Experimental.UIElements.MouseUpEvent)\">\n      <summary>\n        <para>Called on mouse up event.</para>\n      </summary>\n      <param name=\"e\">The event.</param>\n      <param name=\"evt\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.SelectionDragger.RegisterCallbacksOnTarget\">\n      <summary>\n        <para>Called to register click event callbacks on the target element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.SelectionDragger.UnregisterCallbacksFromTarget\">\n      <summary>\n        <para>Called to unregister event callbacks from the target element.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.SelectionDropper\">\n      <summary>\n        <para>Selection drag&amp;drop manipulator.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.SelectionDropper.activateButton\">\n      <summary>\n        <para>Mouse button used to activate the manipulator.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.SelectionDropper.clampToParentEdges\">\n      <summary>\n        <para>Clamp element being dragged to the parent's (usually the graph) edges.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.SelectionDropper.panSpeed\">\n      <summary>\n        <para>When elements are dragged near the edges of the Graph, panning occurs. This controls the speed for said panning.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.SelectionDropper.#ctor\">\n      <summary>\n        <para>SelectionDropper's constructor.</para>\n      </summary>\n      <param name=\"handler\">The drop event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.SelectionDropper.OnMouseDown(UnityEngine.Experimental.UIElements.MouseDownEvent)\">\n      <summary>\n        <para>Called on mouse down event.</para>\n      </summary>\n      <param name=\"e\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.SelectionDropper.OnMouseMove(UnityEngine.Experimental.UIElements.MouseMoveEvent)\">\n      <summary>\n        <para>Called on mouse move event.</para>\n      </summary>\n      <param name=\"e\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.SelectionDropper.OnMouseUp(UnityEngine.Experimental.UIElements.MouseUpEvent)\">\n      <summary>\n        <para>Called on mouse up event.</para>\n      </summary>\n      <param name=\"e\">The event.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.SelectionDropper.RegisterCallbacksOnTarget\">\n      <summary>\n        <para>Called to register click event callbacks on the target element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.SelectionDropper.UnregisterCallbacksFromTarget\">\n      <summary>\n        <para>Called to unregister event callbacks from the target element.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.ShortcutDelegate\">\n      <summary>\n        <para>Shortcut event delegate.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.ShortcutHandler\">\n      <summary>\n        <para>Shortcut handler.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ShortcutHandler.#ctor(System.Collections.Generic.Dictionary`2&lt;UnityEngine.Event,UnityEditor.Experimental.UIElements.GraphView.ShortcutDelegate&gt;)\">\n      <summary>\n        <para>ShortcutHandler's constructor.</para>\n      </summary>\n      <param name=\"dictionary\">Dictionary of shortcuts and their actions.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ShortcutHandler.RegisterCallbacksOnTarget\">\n      <summary>\n        <para>Called to register click event callbacks on the target element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.ShortcutHandler.UnregisterCallbacksFromTarget\">\n      <summary>\n        <para>Called to unregister event callbacks from the target element.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.StackNode\">\n      <summary>\n        <para>Use this class to customize StackNodes and to manage dragging GraphElements over StackNodes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.StackNode.contentContainer\">\n      <summary>\n        <para>The content container of this StackNode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.StackNode.dropPreviewTemplate\">\n      <summary>\n        <para>Use this property to customize the preview that appears when GraphElements are dragged over the StackNode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.StackNode.headerContainer\">\n      <summary>\n        <para>Use this property to customize the header for this StackNode.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.StackNode.AcceptsElement(UnityEditor.Experimental.UIElements.GraphView.GraphElement,System.Int32&amp;,System.Int32)\">\n      <summary>\n        <para>Checks whether the specified GraphElement can be added to this StackNode.</para>\n      </summary>\n      <param name=\"element\">The element to add.</param>\n      <param name=\"proposedIndex\">The index where the element would be added. This index can be overwritten.</param>\n      <param name=\"maxIndex\">The maximum value of the index.</param>\n      <returns>\n        <para>Returns true if the specified GraphElement can be added. Returns false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.StackNode.AddElement(UnityEditor.Experimental.UIElements.GraphView.GraphElement)\">\n      <summary>\n        <para>Adds the specified GraphElement to the StackNode.</para>\n      </summary>\n      <param name=\"element\">The GraphElement to add.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.StackNode.CanAcceptDrop(System.Collections.Generic.List`1&lt;UnityEditor.Experimental.UIElements.GraphView.ISelectable&gt;)\">\n      <summary>\n        <para>Indicates whether this StackNode accepts the current drop event.</para>\n      </summary>\n      <param name=\"selection\">\"The selected GraphElements to be checked.</param>\n      <returns>\n        <para>Returns true if this StackNode accepts the current drop event. Returns false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.StackNode.#ctor\">\n      <summary>\n        <para>StackNode constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.StackNode.DragExited\">\n      <summary>\n        <para>This method is automatically called when a drag exit event occurs.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.StackNode.DragPerform(UnityEngine.Experimental.UIElements.DragPerformEvent,System.Collections.Generic.IEnumerable`1&lt;UnityEditor.Experimental.UIElements.GraphView.ISelectable&gt;,UnityEditor.Experimental.UIElements.GraphView.IDropTarget)\">\n      <summary>\n        <para>This method is automatically called when a drop event occurs.</para>\n      </summary>\n      <param name=\"evt\">The event.</param>\n      <param name=\"selection\">The selected elements.</param>\n      <param name=\"dropTarget\">The drop target.</param>\n      <returns>\n        <para>Returns event propagation.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.StackNode.DragUpdated(UnityEngine.Experimental.UIElements.DragUpdatedEvent,System.Collections.Generic.IEnumerable`1&lt;UnityEditor.Experimental.UIElements.GraphView.ISelectable&gt;,UnityEditor.Experimental.UIElements.GraphView.IDropTarget)\">\n      <summary>\n        <para>This method is automatically called when a drag updated event occurs.</para>\n      </summary>\n      <param name=\"evt\">The event.</param>\n      <param name=\"selection\">The selected elements.</param>\n      <param name=\"dropTarget\">The drop target.</param>\n      <returns>\n        <para>Returns event propagation.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.StackNode.InsertElement(System.Int32,UnityEditor.Experimental.UIElements.GraphView.GraphElement)\">\n      <summary>\n        <para>Inserts the specified GraphElement at the specified index in this StackNode.</para>\n      </summary>\n      <param name=\"index\">The index where the specified GraphElement will be inserted.</param>\n      <param name=\"element\">The GraphElement to insert.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.StackNode.OnStyleResolved(UnityEngine.Experimental.UIElements.StyleSheets.ICustomStyle)\">\n      <summary>\n        <para>This method is automatically called when the style is updated.</para>\n      </summary>\n      <param name=\"styles\">The new style.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.StackNode.RemoveElement(UnityEditor.Experimental.UIElements.GraphView.GraphElement)\">\n      <summary>\n        <para>Removes the specified GraphElement from this StackNode.</para>\n      </summary>\n      <param name=\"element\">The GraphElement to remove.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.GraphView.TokenNode\">\n      <summary>\n        <para>The TokenNode class includes methods for creating and managing a Node that resembles a capsule. The TokenNode class includes a title, an icon, one input Port, and one output Port.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.TokenNode.icon\">\n      <summary>\n        <para>The icon of the TokenNode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.TokenNode.input\">\n      <summary>\n        <para>The input Port of the TokenNode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.GraphView.TokenNode.output\">\n      <summary>\n        <para>The output Port of the TokenNode.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.TokenNode.#ctor(UnityEditor.Experimental.UIElements.GraphView.Port,UnityEditor.Experimental.UIElements.GraphView.Port)\">\n      <summary>\n        <para>Constructs a TokenNode with both input and output Ports.</para>\n      </summary>\n      <param name=\"input\"></param>\n      <param name=\"output\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.TokenNode.OnSelected\">\n      <summary>\n        <para>Called when the TokenNode is selected.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.GraphView.TokenNode.OnUnselected\">\n      <summary>\n        <para>Called when the TokenNode is unselected.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.IntegerField\">\n      <summary>\n        <para>Makes a text field for entering an integer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.IntegerField.ApplyInputDeviceDelta(UnityEngine.Vector3,UnityEditor.Experimental.UIElements.DeltaSpeed,System.Int32)\">\n      <summary>\n        <para>Modify the value using a 3D delta and a speed, typically coming from an input device.</para>\n      </summary>\n      <param name=\"delta\">A vector used to compute the value change.</param>\n      <param name=\"speed\">A multiplier for the value change.</param>\n      <param name=\"startValue\">The start value.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.IntegerField.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"maxLength\">Maximum number of characters the field can take.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.IntegerField.#ctor(System.Int32)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"maxLength\">Maximum number of characters the field can take.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.IntegerField.IntegerFieldFactory\">\n      <summary>\n        <para>Instantiates an IntegerField using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.IntegerField.IntegerFieldFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.IntegerField.IntegerFieldUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the IntegerField.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.IntegerField.IntegerFieldUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for IntegerField properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.IntegerField.IntegerFieldUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.IntegerField.IntegerFieldUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize IntegerField properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.IntegerField.StringToValue(System.String)\">\n      <summary>\n        <para>Converts the given string to an integer.</para>\n      </summary>\n      <param name=\"str\">The string to convert.</param>\n      <returns>\n        <para>The integer parsed from the string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.IntegerField.ValueToString(System.Int32)\">\n      <summary>\n        <para>Converts the given integer to a string.</para>\n      </summary>\n      <param name=\"v\">The integer to be converted to string.</param>\n      <returns>\n        <para>The integer as string.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEditor.Experimental.UIElements.IValueField_1\">\n      <summary>\n        <para>Base interface for UIElements text value fields.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.IValueField_1.value\">\n      <summary>\n        <para>The value of the field.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.IValueField_1.ApplyInputDeviceDelta(UnityEngine.Vector3,UnityEditor.Experimental.UIElements.DeltaSpeed,T)\">\n      <summary>\n        <para>Modify the value using a 3D delta and a speed, typically coming from an input device.</para>\n      </summary>\n      <param name=\"delta\">A vector used to compute the value change.</param>\n      <param name=\"speed\">A multiplier for the value change.</param>\n      <param name=\"startValue\">The start value.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.LongField\">\n      <summary>\n        <para>Makes a text field for entering long integers.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.LongField.ApplyInputDeviceDelta(UnityEngine.Vector3,UnityEditor.Experimental.UIElements.DeltaSpeed,System.Int64)\">\n      <summary>\n        <para>Modify the value using a 3D delta and a speed, typically coming from an input device.</para>\n      </summary>\n      <param name=\"delta\">A vector used to compute the value change.</param>\n      <param name=\"speed\">A multiplier for the value change.</param>\n      <param name=\"startValue\">The start value.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.LongField.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"maxLength\">Maximum number of characters the field can take.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.LongField.#ctor(System.Int32)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"maxLength\">Maximum number of characters the field can take.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.LongField.LongFieldFactory\">\n      <summary>\n        <para>Instantiates a LongField using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.LongField.LongFieldFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.LongField.LongFieldUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the LongField.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.LongField.LongFieldUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for LongField properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.LongField.LongFieldUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.LongField.LongFieldUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize LongField properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.LongField.StringToValue(System.String)\">\n      <summary>\n        <para>Converts the given string to a long integer.</para>\n      </summary>\n      <param name=\"str\">The string to convert.</param>\n      <returns>\n        <para>The long integer parsed from the string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.LongField.ValueToString(System.Int64)\">\n      <summary>\n        <para>Converts the given long integer to a string.</para>\n      </summary>\n      <param name=\"v\">The long integer to be converted to string.</param>\n      <returns>\n        <para>The long integer as string.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.ObjectField\">\n      <summary>\n        <para>Makes a field to receive any object type.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.ObjectField.allowSceneObjects\">\n      <summary>\n        <para>Allows scene objects to be assigned to the field.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.ObjectField.objectType\">\n      <summary>\n        <para>The type of the objects that can be assigned.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.ObjectField.value\">\n      <summary>\n        <para>The object currently being exposed by the field.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.ObjectField.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.ObjectField.ObjectFieldFactory\">\n      <summary>\n        <para>Instantiates an ObjectField using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.ObjectField.ObjectFieldFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.ObjectField.ObjectFieldUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the ObjectField.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.ObjectField.ObjectFieldUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for ObjectField properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.ObjectField.ObjectFieldUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.ObjectField.ObjectFieldUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize ObjectField properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.ObjectField.SetValueAndNotify(UnityEngine.Object)\">\n      <summary>\n        <para>Set the value and, if different, notifies registers callbacks with a ChangeEvent&lt;Object&gt;</para>\n      </summary>\n      <param name=\"newValue\">The new value to be set.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.PopupField`1\">\n      <summary>\n        <para>Generic popup selection field.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.PopupField_1.index\">\n      <summary>\n        <para>The currently selected index in the popup menu.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.PopupField_1.value\">\n      <summary>\n        <para>The currently selected value in the popup menu.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.PopupField_1.#ctor(System.Collections.Generic.List`1&lt;T&gt;,T)\">\n      <summary>\n        <para>Construct a PopupField.</para>\n      </summary>\n      <param name=\"choices\"></param>\n      <param name=\"defaultValue\"></param>\n      <param name=\"defaultIndex\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.PopupField_1.#ctor(System.Collections.Generic.List`1&lt;T&gt;,System.Int32)\">\n      <summary>\n        <para>Construct a PopupField.</para>\n      </summary>\n      <param name=\"choices\"></param>\n      <param name=\"defaultValue\"></param>\n      <param name=\"defaultIndex\"></param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.RectField\">\n      <summary>\n        <para>A Rect editor field.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.RectField.RectFieldFactory\">\n      <summary>\n        <para>Instantiates a RectField using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.RectField.RectFieldFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.RectField.RectFieldUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the RectField.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.RectField.RectFieldUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for RectField properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.RectField.RectFieldUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.RectField.RectFieldUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize RectField properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.TextValueField`1\">\n      <summary>\n        <para>Base class for text fields.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.TextValueField_1.allowedCharacters\">\n      <summary>\n        <para>A string containing all characters allowed by the field.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.TextValueField_1.formatString\">\n      <summary>\n        <para>The format string for the value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.TextValueField_1.value\">\n      <summary>\n        <para>The value held by the field.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.TextValueField_1.ApplyInputDeviceDelta(UnityEngine.Vector3,UnityEditor.Experimental.UIElements.DeltaSpeed,T)\">\n      <summary>\n        <para>Modify the value using a 3D delta and a speed, typically coming from an input device.</para>\n      </summary>\n      <param name=\"delta\">A vector used to compute the value change.</param>\n      <param name=\"speed\">A multiplier for the value change.</param>\n      <param name=\"startValue\">The start value.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.TextValueField_1.SetValueAndNotify(T)\">\n      <summary>\n        <para>Set the value and, if different, notifies registers callbacks with a ChangeEvent.</para>\n      </summary>\n      <param name=\"newValue\">The new value to be set.</param>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.TextValueField_1.StringToValue(System.String)\">\n      <summary>\n        <para>Converts the given string to a value type.</para>\n      </summary>\n      <param name=\"str\">The string to convert.</param>\n      <returns>\n        <para>The value parsed from the string.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.TextValueField`1.TextValueFieldUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the TextValueField.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.TextValueField_1.TextValueFieldUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.TextValueField_1.ValueToString(T)\">\n      <summary>\n        <para>Converts the given value to a string.</para>\n      </summary>\n      <param name=\"value\">The value to be converted to string.</param>\n      <returns>\n        <para>The value as a string.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.UIElementsEditorUtility\">\n      <summary>\n        <para>Editor helper functions for UIElements.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.UIElementsEditorUtility.CreateDefaultCursorStyle(UnityEditor.MouseCursor)\">\n      <summary>\n        <para>Creates a default CursorStyle property from the given MouseCursor.</para>\n      </summary>\n      <param name=\"mouseCursor\">Default editor mouse cursor.</param>\n      <returns>\n        <para>A cursor style property.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.UxmlNamespacePrefixAttribute\">\n      <summary>\n        <para>Attribute that can be used on an assembly to define an XML namespace prefix for a namespace.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.UxmlNamespacePrefixAttribute.ns\">\n      <summary>\n        <para>The namespace name.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.UxmlNamespacePrefixAttribute.prefix\">\n      <summary>\n        <para>The namespace prefix.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.UxmlNamespacePrefixAttribute.#ctor(System.String,System.String)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"ns\">The XML/C# namespace to which a prefix will be associated.</param>\n      <param name=\"prefix\">The prefix to associate to the namespace.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.Vector2Field\">\n      <summary>\n        <para>A Vector2 editor field.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.Vector2Field.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.Vector2Field.Vector2FieldFactory\">\n      <summary>\n        <para>Instantiates a Vector2Field using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.Vector2Field.Vector2FieldFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.Vector2Field.Vector2FieldUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the Vector2Field.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.Vector2Field.Vector2FieldUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for Vector2Field properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.Vector2Field.Vector2FieldUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.Vector2Field.Vector2FieldUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize Vector2Field properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.Vector3Field\">\n      <summary>\n        <para>A Vector3 editor field.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.Vector3Field.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.Vector3Field.Vector3FieldFactory\">\n      <summary>\n        <para>Instantiates a Vector3Field using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.Vector3Field.Vector3FieldFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.Vector3Field.Vector3FieldUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the Vetor3Field.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.Vector3Field.Vector3FieldUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for Vector3Field properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.Vector3Field.Vector3FieldUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.Vector3Field.Vector3FieldUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize Vector3Field properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.Vector4Field\">\n      <summary>\n        <para>A Vector4 editor field.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.Vector4Field.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.Vector4Field.Vector4FieldFactory\">\n      <summary>\n        <para>Instantiates a Vector4Field using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.Vector4Field.Vector4FieldFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.UIElements.Vector4Field.Vector4FieldUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the Vector4Field.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.UIElements.Vector4Field.Vector4FieldUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for Vector4Field properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.Vector4Field.Vector4FieldUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Experimental.UIElements.Vector4Field.Vector4FieldUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize Vector4Field properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\"></param>\n    </member>\n    <member name=\"T:UnityEditor.ExportPackageOptions\">\n      <summary>\n        <para>Export package option. Multiple options can be combined together using the | operator.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ExportPackageOptions.Default\">\n      <summary>\n        <para>Default mode. Will not include dependencies or subdirectories nor include Library assets unless specifically included in the asset list.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ExportPackageOptions.IncludeDependencies\">\n      <summary>\n        <para>In addition to the assets paths listed, all dependent assets will be included as well.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ExportPackageOptions.IncludeLibraryAssets\">\n      <summary>\n        <para>The exported package will include all library assets, ie. the project settings located in the Library folder of the project.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ExportPackageOptions.Interactive\">\n      <summary>\n        <para>The export operation will be run asynchronously and reveal the exported package file in a file browser window after the export is finished.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ExportPackageOptions.Recurse\">\n      <summary>\n        <para>Will recurse through any subdirectories listed and include all assets inside them.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ExpressionEvaluator\">\n      <summary>\n        <para>Evaluates simple math expressions; supports int  float and operators: + - *  % ^ ( ).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.ExpressionEvaluator.Evaluate(System.String)\">\n      <summary>\n        <para>Evaluates a math expression and returns the result as a float or int.</para>\n      </summary>\n      <param name=\"expression\">A string containing a mathematical expression (e.g. \"4 + 3\").</param>\n      <returns>\n        <para>The result of the evaluation (0 for invalid expressions).</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.FileUtil\">\n      <summary>\n        <para>Lets you do move, copy, delete operations over files or directories.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.FileUtil.CopyFileOrDirectory(System.String,System.String)\">\n      <summary>\n        <para>Copies a file or a directory.</para>\n      </summary>\n      <param name=\"source\"></param>\n      <param name=\"dest\"></param>\n    </member>\n    <member name=\"M:UnityEditor.FileUtil.CopyFileOrDirectoryFollowSymlinks(System.String,System.String)\">\n      <summary>\n        <para>Copies the file or directory.</para>\n      </summary>\n      <param name=\"source\"></param>\n      <param name=\"dest\"></param>\n    </member>\n    <member name=\"M:UnityEditor.FileUtil.DeleteFileOrDirectory(System.String)\">\n      <summary>\n        <para>Deletes a file or a directory given a path.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEditor.FileUtil.GetUniqueTempPathInProject\">\n      <summary>\n        <para>Returns a unique path in the Temp folder within your current project.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.FileUtil.MoveFileOrDirectory(System.String,System.String)\">\n      <summary>\n        <para>Moves a file or a directory from a given path to another path.</para>\n      </summary>\n      <param name=\"source\"></param>\n      <param name=\"dest\"></param>\n    </member>\n    <member name=\"M:UnityEditor.FileUtil.ReplaceDirectory(System.String,System.String)\">\n      <summary>\n        <para>Replaces a directory.</para>\n      </summary>\n      <param name=\"src\"></param>\n      <param name=\"dst\"></param>\n    </member>\n    <member name=\"M:UnityEditor.FileUtil.ReplaceFile(System.String,System.String)\">\n      <summary>\n        <para>Replaces a file.</para>\n      </summary>\n      <param name=\"src\"></param>\n      <param name=\"dst\"></param>\n    </member>\n    <member name=\"T:UnityEditor.FontRenderingMode\">\n      <summary>\n        <para>Font rendering mode constants for TrueTypeFontImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.FontRenderingMode.HintedRaster\">\n      <summary>\n        <para>Use hinted font rendering without anti-aliasing. This is the crispest font rendering option, and may be most readable for small font sizes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.FontRenderingMode.HintedSmooth\">\n      <summary>\n        <para>Use Anti-Aliased Font rendering with hinting. This forces character lines to run along pixel boundaries.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.FontRenderingMode.OSDefault\">\n      <summary>\n        <para>Use the OS default font rendering mode. This mode is only available for dynamic fonts, as static fonts are generated at build time.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.FontRenderingMode.Smooth\">\n      <summary>\n        <para>Use Anti-Aliased Font rendering. When using dynamic fonts, this is the mode which is fastest in rendering font textures.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.FontTextureCase\">\n      <summary>\n        <para>Texture case constants for TrueTypeFontImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.FontTextureCase.ASCII\">\n      <summary>\n        <para>Import basic ASCII character set.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.FontTextureCase.ASCIILowerCase\">\n      <summary>\n        <para>Only import lower case ASCII character set.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.FontTextureCase.ASCIIUpperCase\">\n      <summary>\n        <para>Only import upper case ASCII character set.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.FontTextureCase.CustomSet\">\n      <summary>\n        <para>Custom set of characters.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.FontTextureCase.Dynamic\">\n      <summary>\n        <para>Render characters into font texture at runtime as needed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.FontTextureCase.Unicode\">\n      <summary>\n        <para>Import a set of Unicode characters common for latin scripts.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ForceReserializeAssetsOptions\">\n      <summary>\n        <para>Options for AssetDatabase.ForceReserializeAssets.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ForceReserializeAssetsOptions.ReserializeAssets\">\n      <summary>\n        <para>Specifies that AssetDatabase.ForceReserializeAssets should load, upgrade, and save the assets at the paths passed to the function, but not their accompanying .meta files.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ForceReserializeAssetsOptions.ReserializeAssetsAndMetadata\">\n      <summary>\n        <para>Specifies that AssetDatabase.ForceReserializeAssets should load, upgrade, and save both the assets at the paths passed to the function, and also their accompanying .meta files.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ForceReserializeAssetsOptions.ReserializeMetadata\">\n      <summary>\n        <para>Specifies that AssetDatabase.ForceReserializeAssets should load, upgrade, and save the .meta files for the assets at the paths passed to the function, but not the assets themselves.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.GameObjectUtility\">\n      <summary>\n        <para>GameObject utility functions.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.GameObjectUtility.AreStaticEditorFlagsSet(UnityEngine.GameObject,UnityEditor.StaticEditorFlags)\">\n      <summary>\n        <para>Returns true if the passed in StaticEditorFlags are set on the GameObject specified.</para>\n      </summary>\n      <param name=\"go\">The GameObject to check.</param>\n      <param name=\"flags\">The flags you want to check.</param>\n      <returns>\n        <para>Whether the GameObject's static flags match the flags specified.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.GameObjectUtility.GetNavMeshArea(UnityEngine.GameObject)\">\n      <summary>\n        <para>Get the navmesh area index for the GameObject.</para>\n      </summary>\n      <param name=\"go\">GameObject to query.</param>\n      <returns>\n        <para>NavMesh area index.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.GameObjectUtility.GetNavMeshAreaFromName(System.String)\">\n      <summary>\n        <para>Get the navmesh area index from the area name.</para>\n      </summary>\n      <param name=\"name\">NavMesh area name to query.</param>\n      <returns>\n        <para>The NavMesh area index. If there is no NavMesh area with the requested name, the return value is -1.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.GameObjectUtility.GetNavMeshAreaNames\">\n      <summary>\n        <para>Get all the navmesh area names.</para>\n      </summary>\n      <returns>\n        <para>Names of all the NavMesh areas.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.GameObjectUtility.GetNavMeshLayer(UnityEngine.GameObject)\">\n      <summary>\n        <para>Get the navmesh layer for the GameObject.</para>\n      </summary>\n      <param name=\"go\">The GameObject to check.</param>\n      <returns>\n        <para>The navmesh layer for the GameObject specified.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.GameObjectUtility.GetNavMeshLayerFromName(System.String)\">\n      <summary>\n        <para>Get the navmesh layer from the layer name.</para>\n      </summary>\n      <param name=\"name\">The name of the navmesh layer.</param>\n      <returns>\n        <para>The layer number of the navmesh layer name specified.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.GameObjectUtility.GetNavMeshLayerNames\">\n      <summary>\n        <para>Get all the navmesh layer names.</para>\n      </summary>\n      <returns>\n        <para>An array of the names of all navmesh layers.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.GameObjectUtility.GetStaticEditorFlags(UnityEngine.GameObject)\">\n      <summary>\n        <para>Gets the StaticEditorFlags of the GameObject specified.</para>\n      </summary>\n      <param name=\"go\">The GameObject whose flags you are interested in.</param>\n      <returns>\n        <para>The static editor flags of the GameObject specified.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.GameObjectUtility.GetUniqueNameForSibling(UnityEngine.Transform,System.String)\">\n      <summary>\n        <para>Get unique name for a new GameObject compared to existing siblings. Useful when trying to avoid duplicate naming. When duplicate(s) are found, uses incremental a number after the base name.</para>\n      </summary>\n      <param name=\"parent\">Target parent for a new GameObject. Null means root level.</param>\n      <param name=\"name\">Requested name for a new GameObject.</param>\n      <returns>\n        <para>Unique name for a new GameObject.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.GameObjectUtility.SetNavMeshArea(UnityEngine.GameObject,System.Int32)\">\n      <summary>\n        <para>Set the navmesh area for the gameobject.</para>\n      </summary>\n      <param name=\"go\">GameObject to modify.</param>\n      <param name=\"areaIndex\">NavMesh area index to set.</param>\n    </member>\n    <member name=\"M:UnityEditor.GameObjectUtility.SetNavMeshLayer(UnityEngine.GameObject,System.Int32)\">\n      <summary>\n        <para>Set the navmesh layer for the GameObject.</para>\n      </summary>\n      <param name=\"go\">The GameObject on which to set the navmesh layer.</param>\n      <param name=\"areaIndex\">The layer number you want to set.</param>\n    </member>\n    <member name=\"M:UnityEditor.GameObjectUtility.SetParentAndAlign(UnityEngine.GameObject,UnityEngine.GameObject)\">\n      <summary>\n        <para>Sets the parent and gives the child the same layer and position.</para>\n      </summary>\n      <param name=\"child\">The GameObject that should have a new parent set.</param>\n      <param name=\"parent\">The GameObject that the child should get as a parent and have position and layer copied from. If null, this function does nothing.</param>\n    </member>\n    <member name=\"M:UnityEditor.GameObjectUtility.SetStaticEditorFlags(UnityEngine.GameObject,UnityEditor.StaticEditorFlags)\">\n      <summary>\n        <para>Sets the static editor flags on the specified GameObject.</para>\n      </summary>\n      <param name=\"go\">The GameObject whose static editor flags you want to set.</param>\n      <param name=\"flags\">The flags to set on the GameObject.</param>\n    </member>\n    <member name=\"T:UnityEditor.GenericMenu\">\n      <summary>\n        <para>GenericMenu lets you create custom context menus and dropdown menus.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.GenericMenu.allowDuplicateNames\">\n      <summary>\n        <para>Allow the menu to have multiple items with the same name.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.GenericMenu.AddDisabledItem(UnityEngine.GUIContent)\">\n      <summary>\n        <para>Add a disabled item to the menu.</para>\n      </summary>\n      <param name=\"content\">The GUIContent to display as a disabled menu item.</param>\n    </member>\n    <member name=\"M:UnityEditor.GenericMenu.AddDisabledItem(UnityEngine.GUIContent,System.Boolean)\">\n      <summary>\n        <para>Add a disabled item to the menu.</para>\n      </summary>\n      <param name=\"content\">The GUIContent to display as a disabled menu item.</param>\n      <param name=\"on\">Specifies whether to show that the item is currently activated (i.e. a tick next to the item in the menu).</param>\n    </member>\n    <member name=\"M:UnityEditor.GenericMenu.AddItem(UnityEngine.GUIContent,System.Boolean,UnityEditor.GenericMenu/MenuFunction)\">\n      <summary>\n        <para>Add an item to the menu.</para>\n      </summary>\n      <param name=\"content\">The GUIContent to add as a menu item.</param>\n      <param name=\"on\">Specifies whether to show the item is currently activated (i.e. a tick next to the item in the menu).</param>\n      <param name=\"func\">The function to call when the menu item is selected.</param>\n    </member>\n    <member name=\"M:UnityEditor.GenericMenu.AddItem(UnityEngine.GUIContent,System.Boolean,UnityEditor.GenericMenu/MenuFunction2,System.Object)\">\n      <summary>\n        <para>Add an item to the menu.</para>\n      </summary>\n      <param name=\"content\">The GUIContent to add as a menu item.</param>\n      <param name=\"on\">Specifies whether to show the item is currently activated (i.e. a tick next to the item in the menu).</param>\n      <param name=\"func\">The function to call when the menu item is selected.</param>\n      <param name=\"userData\">The data to pass to the function called when the item is selected.</param>\n    </member>\n    <member name=\"M:UnityEditor.GenericMenu.AddSeparator(System.String)\">\n      <summary>\n        <para>Add a seperator item to the menu.</para>\n      </summary>\n      <param name=\"path\">The path to the submenu, if adding a separator to a submenu. When adding a separator to the top level of a menu, use an empty string as the path.</param>\n    </member>\n    <member name=\"M:UnityEditor.GenericMenu.DropDown(UnityEngine.Rect)\">\n      <summary>\n        <para>Show the menu at the given screen rect.</para>\n      </summary>\n      <param name=\"position\">The position at which to show the menu.</param>\n    </member>\n    <member name=\"M:UnityEditor.GenericMenu.GetItemCount\">\n      <summary>\n        <para>Get number of items in the menu.</para>\n      </summary>\n      <returns>\n        <para>The number of items in the menu.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.GenericMenu.MenuFunction\">\n      <summary>\n        <para>Callback function, called when a menu item is selected.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.GenericMenu.MenuFunction2\">\n      <summary>\n        <para>Callback function with user data, called when a menu item is selected.</para>\n      </summary>\n      <param name=\"userData\">The data to pass through to the callback function.</param>\n    </member>\n    <member name=\"M:UnityEditor.GenericMenu.ShowAsContext\">\n      <summary>\n        <para>Show the menu under the mouse when right-clicked.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.GizmoType\">\n      <summary>\n        <para>Determines how a gizmo is drawn or picked in the Unity editor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.GizmoType.Active\">\n      <summary>\n        <para>Draw the gizmo if it is active (shown in the inspector).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.GizmoType.InSelectionHierarchy\">\n      <summary>\n        <para>Draw the gizmo if it is selected or it is a child/descendent of the selected.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.GizmoType.NonSelected\">\n      <summary>\n        <para>Draw the gizmo if it is not selected.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.GizmoType.NotInSelectionHierarchy\">\n      <summary>\n        <para>Draw the gizmo if it is not selected and also no parent/ancestor is selected.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.GizmoType.Pickable\">\n      <summary>\n        <para>The gizmo can be picked in the editor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.GizmoType.Selected\">\n      <summary>\n        <para>Draw the gizmo if it is selected.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.GraphicsJobMode\">\n      <summary>\n        <para>Enum used to specify the graphics jobs mode to use.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.GraphicsJobMode.Legacy\">\n      <summary>\n        <para>Legacy graphics jobs.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.GraphicsJobMode.Native\">\n      <summary>\n        <para>Native graphics jobs.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.GridBrush\">\n      <summary>\n        <para>Default built-in brush for painting or erasing tiles and/or gamobjects on a grid.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.GridBrush.cellCount\">\n      <summary>\n        <para>Number of brush cells in the brush.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.GridBrush.cells\">\n      <summary>\n        <para>All the brush cells the brush holds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.GridBrush.pivot\">\n      <summary>\n        <para>Pivot of the brush.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.GridBrush.size\">\n      <summary>\n        <para>Size of the brush in cells.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.BoxErase(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.BoundsInt)\">\n      <summary>\n        <para>Erases tiles and GameObjects from given bounds within the selected layers.</para>\n      </summary>\n      <param name=\"gridLayout\">Grid to erase data from.</param>\n      <param name=\"brushTarget\">Target of the erase operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">The bounds to erase data from.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.BoxFill(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.BoundsInt)\">\n      <summary>\n        <para>Box fills tiles and GameObjects into given bounds within the selected layers.</para>\n      </summary>\n      <param name=\"gridLayout\">Grid to box fill data to.</param>\n      <param name=\"brushTarget\">Target of the box fill operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">The bounds to box fill data into.</param>\n    </member>\n    <member name=\"T:UnityEditor.GridBrush.BrushCell\">\n      <summary>\n        <para>Brush Cell stores the data to be painted in a grid cell.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.GridBrush.BrushCell.color\">\n      <summary>\n        <para>Color to tint the tile when painting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.GridBrush.BrushCell.matrix\">\n      <summary>\n        <para>The transform matrix of the brush cell.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.GridBrush.BrushCell.tile\">\n      <summary>\n        <para>Tile to be placed when painting.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.Erase(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Erases tiles and GameObjects in a given position within the selected layers.</para>\n      </summary>\n      <param name=\"gridLayout\">Grid used for layout.</param>\n      <param name=\"brushTarget\">Target of the erase operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">The coordinates of the cell to erase data from.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.Flip(UnityEngine.GridBrushBase/FlipAxis,UnityEngine.GridLayout/CellLayout)\">\n      <summary>\n        <para>Flips the brush in the given axis.</para>\n      </summary>\n      <param name=\"flip\">Axis to flip by.</param>\n      <param name=\"layout\">Cell Layout for flipping.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.FloodFill(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Flood fills tiles and GameObjects starting from a given position within the selected layers.</para>\n      </summary>\n      <param name=\"gridLayout\">Grid used for layout.</param>\n      <param name=\"brushTarget\">Target of the flood fill operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">Starting position of the flood fill.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.GetCellIndex(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the index to the GridBrush.BrushCell based on the position of the BrushCell.</para>\n      </summary>\n      <param name=\"brushPosition\">Position of the BrushCell.</param>\n      <param name=\"x\">X Position of the BrushCell.</param>\n      <param name=\"y\">Y Position of the BrushCell.</param>\n      <param name=\"z\">Z Position of the BrushCell.</param>\n      <param name=\"sizex\">X Size of Brush.</param>\n      <param name=\"sizey\">Y Size of Brush.</param>\n      <param name=\"sizez\">Z Size of Brush.</param>\n      <returns>\n        <para>Index to the BrushCell.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.GetCellIndex(System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Gets the index to the GridBrush.BrushCell based on the position of the BrushCell.</para>\n      </summary>\n      <param name=\"brushPosition\">Position of the BrushCell.</param>\n      <param name=\"x\">X Position of the BrushCell.</param>\n      <param name=\"y\">Y Position of the BrushCell.</param>\n      <param name=\"z\">Z Position of the BrushCell.</param>\n      <param name=\"sizex\">X Size of Brush.</param>\n      <param name=\"sizey\">Y Size of Brush.</param>\n      <param name=\"sizez\">Z Size of Brush.</param>\n      <returns>\n        <para>Index to the BrushCell.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.GetCellIndex(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Gets the index to the GridBrush.BrushCell based on the position of the BrushCell.</para>\n      </summary>\n      <param name=\"brushPosition\">Position of the BrushCell.</param>\n      <param name=\"x\">X Position of the BrushCell.</param>\n      <param name=\"y\">Y Position of the BrushCell.</param>\n      <param name=\"z\">Z Position of the BrushCell.</param>\n      <param name=\"sizex\">X Size of Brush.</param>\n      <param name=\"sizey\">Y Size of Brush.</param>\n      <param name=\"sizez\">Z Size of Brush.</param>\n      <returns>\n        <para>Index to the BrushCell.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.GetCellIndexWrapAround(System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Gets the index to the GridBrush.BrushCell based on the position of the BrushCell. Wraps each coordinate if it is larger than the size of the GridBrush.</para>\n      </summary>\n      <param name=\"x\">X Position of the BrushCell.</param>\n      <param name=\"y\">Y Position of the BrushCell.</param>\n      <param name=\"z\">Z Position of the BrushCell.</param>\n      <returns>\n        <para>Index to the BrushCell.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.Init(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Initializes the content of the GridBrush.</para>\n      </summary>\n      <param name=\"size\">Size of the GridBrush.</param>\n      <param name=\"pivot\">Pivot point of the GridBrush.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.Init(UnityEngine.Vector3Int,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Initializes the content of the GridBrush.</para>\n      </summary>\n      <param name=\"size\">Size of the GridBrush.</param>\n      <param name=\"pivot\">Pivot point of the GridBrush.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.MoveEnd(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.BoundsInt)\">\n      <summary>\n        <para>MoveEnd is called when user has ended the move of the area previously selected with the selection marquee.</para>\n      </summary>\n      <param name=\"gridLayout\">Grid used for layout.</param>\n      <param name=\"brushTarget\">Target of the move operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">Position where the move operation has ended.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.MoveStart(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.BoundsInt)\">\n      <summary>\n        <para>MoveEnd is called when user starts moving the area previously selected with the selection marquee.</para>\n      </summary>\n      <param name=\"gridLayout\">Grid used for layout.</param>\n      <param name=\"brushTarget\">Target of the move operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">Position where the move operation has started.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.Paint(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Paints tiles and GameObjects into a given position within the selected layers.</para>\n      </summary>\n      <param name=\"gridLayout\">Grid used for layout.</param>\n      <param name=\"brushTarget\">Target of the paint operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">The coordinates of the cell to paint data to.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.Pick(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.BoundsInt,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Picks tiles from selected Tilemap|tile maps and child GameObjects, given the coordinates of the cells.</para>\n      </summary>\n      <param name=\"gridLayout\">Grid to pick data from.</param>\n      <param name=\"brushTarget\">Target of the picking operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">The coordinates of the cells to paint data from.</param>\n      <param name=\"pickStart\">Pivot of the picking brush.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.Reset\">\n      <summary>\n        <para>Clear all data of the brush.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.Rotate(UnityEngine.GridBrushBase/RotationDirection,UnityEngine.GridLayout/CellLayout)\">\n      <summary>\n        <para>Rotates the brush by 90 degrees in the given direction.</para>\n      </summary>\n      <param name=\"direction\">Direction to rotate by.</param>\n      <param name=\"layout\">Cell Layout for rotating.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.SetColor(UnityEngine.Vector3Int,UnityEngine.Color)\">\n      <summary>\n        <para>Sets a tint color at the position in the brush.</para>\n      </summary>\n      <param name=\"position\">Position to set the color in the brush.</param>\n      <param name=\"color\">Tint color to set in the brush.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.SetMatrix(UnityEngine.Vector3Int,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Sets a transform matrix at the position in the brush. This matrix is used specifically for tiles on a Tilemap and not GameObjects of the brush cell.</para>\n      </summary>\n      <param name=\"position\">Position to set the transform matrix in the brush.</param>\n      <param name=\"matrix\">Transform matrix to set in the brush.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.SetTile(UnityEngine.Vector3Int,UnityEngine.Tilemaps.TileBase)\">\n      <summary>\n        <para>Sets a Tile at the position in the brush.</para>\n      </summary>\n      <param name=\"position\">Position to set the tile in the brush.</param>\n      <param name=\"tile\">Tile to set in the brush.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrush.UpdateSizeAndPivot(UnityEngine.Vector3Int,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Updates the size, pivot and the number of layers of the brush.</para>\n      </summary>\n      <param name=\"size\">New size of the brush.</param>\n      <param name=\"pivot\">New pivot of the brush.</param>\n    </member>\n    <member name=\"T:UnityEditor.GridBrushEditor\">\n      <summary>\n        <para>Editor for GridBrush.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.GridBrushEditor.brush\">\n      <summary>\n        <para>The GridBrush that is the target for this editor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.GridBrushEditor.validTargets\">\n      <summary>\n        <para>Returns all valid targets that the brush can edit.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.GridBrushEditor.BoxFillPreview(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.BoundsInt)\">\n      <summary>\n        <para>Does a preview of what happens when a GridBrush.BoxFill is done with the same parameters.</para>\n      </summary>\n      <param name=\"gridLayout\">Grid to box fill data to.</param>\n      <param name=\"brushTarget\">Target of box fill operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">The bounds to box fill data to.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrushEditor.ClearPreview\">\n      <summary>\n        <para>Clears any preview drawn previously by the GridBrushEditor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.GridBrushEditor.FloodFillPreview(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Does a preview of what happens when a GridBrush.FloodFill is done with the same parameters.</para>\n      </summary>\n      <param name=\"gridLayout\">Grid to paint data to.</param>\n      <param name=\"brushTarget\">Target of the flood fill operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">The coordinates of the cell to flood fill data to.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrushEditor.OnPaintSceneGUI(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.BoundsInt,UnityEngine.GridBrushBase/Tool,System.Boolean)\">\n      <summary>\n        <para>Callback for painting the GUI for the GridBrush in the Scene View.</para>\n      </summary>\n      <param name=\"gridLayout\">Grid that the brush is being used on.</param>\n      <param name=\"brushTarget\">Target of the GridBrushBase.Tool operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">Current selected location of the brush.</param>\n      <param name=\"tool\">Current GridBrushBase.Tool selected.</param>\n      <param name=\"executing\">Whether brush is being used.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrushEditor.OnSelectionInspectorGUI\">\n      <summary>\n        <para>Callback for drawing the Inspector GUI when there is an active GridSelection made in a Tilemap.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.GridBrushEditor.PaintPreview(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Paints preview data into a cell of a grid given the coordinates of the cell.</para>\n      </summary>\n      <param name=\"gridLayout\">Grid to paint data to.</param>\n      <param name=\"brushTarget\">Target of the paint operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">The coordinates of the cell to paint data to.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrushEditor.RegisterUndo(UnityEngine.GameObject,UnityEngine.GridBrushBase/Tool)\">\n      <summary>\n        <para>Callback for registering an Undo action before the GridBrushBase does the current GridBrushBase.Tool action.</para>\n      </summary>\n      <param name=\"brushTarget\">Target of the GridBrushBase.Tool operation. By default the currently selected GameObject.</param>\n      <param name=\"tool\">Current GridBrushBase.Tool selected.</param>\n    </member>\n    <member name=\"T:UnityEditor.GridBrushEditorBase\">\n      <summary>\n        <para>Base class for Grid Brush Editor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.GridBrushEditorBase.validTargets\">\n      <summary>\n        <para>Returns all valid targets that the brush can edit.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.GridBrushEditorBase.OnMouseEnter\">\n      <summary>\n        <para>Callback when the mouse cursor enters a paintable region.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.GridBrushEditorBase.OnMouseLeave\">\n      <summary>\n        <para>Callback when the mouse cursor leaves a paintable region.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.GridBrushEditorBase.OnPaintInspectorGUI\">\n      <summary>\n        <para>Callback for painting the inspector GUI for the GridBrush in the tilemap palette.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.GridBrushEditorBase.OnPaintSceneGUI(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.BoundsInt,UnityEngine.GridBrushBase/Tool,System.Boolean)\">\n      <summary>\n        <para>Callback for painting the GUI for the GridBrush in the Scene view.</para>\n      </summary>\n      <param name=\"gridLayout\">Grid that the brush is being used on.</param>\n      <param name=\"brushTarget\">Target of the GridBrushBase.Tool operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">Current selected location of the brush.</param>\n      <param name=\"tool\">Current GridBrushBase.Tool selected.</param>\n      <param name=\"executing\">Whether is brush is being used.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrushEditorBase.OnSelectionInspectorGUI\">\n      <summary>\n        <para>Callback for drawing the Inspector GUI when there is an active GridSelection made in a GridLayout.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.GridBrushEditorBase.OnToolActivated(UnityEngine.GridBrushBase/Tool)\">\n      <summary>\n        <para>Callback when a GridBrushBase.Tool is activated.</para>\n      </summary>\n      <param name=\"tool\">Tool that is activated.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrushEditorBase.OnToolDeactivated(UnityEngine.GridBrushBase/Tool)\">\n      <summary>\n        <para>Callback when a GridBrushBase.Tool is deactivated.</para>\n      </summary>\n      <param name=\"tool\">Tool that is deactivated.</param>\n    </member>\n    <member name=\"M:UnityEditor.GridBrushEditorBase.RegisterUndo(UnityEngine.GameObject,UnityEngine.GridBrushBase/Tool)\">\n      <summary>\n        <para>Callback for registering an Undo action before the GridBrushBase does the current GridBrushBase.Tool action.</para>\n      </summary>\n      <param name=\"brushTarget\">Target of the GridBrushBase.Tool operation. By default the currently selected GameObject.</param>\n      <param name=\"tool\">Current GridBrushBase.Tool selected.</param>\n    </member>\n    <member name=\"T:UnityEditor.GridPalette\">\n      <summary>\n        <para>GridPalette stores settings for Palette assets when shown in the Palette window.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.GridPalette.cellSizing\">\n      <summary>\n        <para>Determines the sizing of cells for a Palette.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.GridPalette.CellSizing\">\n      <summary>\n        <para>Controls the sizing of cells for a Palette.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.GridPalette.CellSizing.Automatic\">\n      <summary>\n        <para>Automatically resizes the Palette cells by the size of Sprites in the Palette.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.GridPalette.CellSizing.Manual\">\n      <summary>\n        <para>Size of Palette cells will be changed manually by the user.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.GridSelection\">\n      <summary>\n        <para>Stores the selection made on a GridLayout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.GridSelection.active\">\n      <summary>\n        <para>Whether there is an active GridSelection made on a GridLayout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.GridSelection.grid\">\n      <summary>\n        <para>The Grid of the target of the active GridSelection.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.GridSelection.gridSelectionChanged(System.Action)\">\n      <summary>\n        <para>Callback for when the active GridSelection has changed.</para>\n      </summary>\n      <param name=\"value\">Callback.</param>\n    </member>\n    <member name=\"P:UnityEditor.GridSelection.position\">\n      <summary>\n        <para>The cell coordinates of the active GridSelection made on the GridLayout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.GridSelection.target\">\n      <summary>\n        <para>The GameObject of the GridLayout where the active GridSelection was made.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.GridSelection.Clear\">\n      <summary>\n        <para>Clears the active GridSelection.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.GridSelection.Select(UnityEngine.Object,UnityEngine.BoundsInt)\">\n      <summary>\n        <para>Creates a new GridSelection and sets it as the active GridSelection.</para>\n      </summary>\n      <param name=\"target\">The target GameObject for the GridSelection.</param>\n      <param name=\"bounds\">The cell coordinates of selection made.</param>\n    </member>\n    <member name=\"T:UnityEditor.GUIDrawer\">\n      <summary>\n        <para>Base class for PropertyDrawer and DecoratorDrawer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Handles\">\n      <summary>\n        <para>Custom 3D GUI controls and drawing in the scene view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Handles.centerColor\">\n      <summary>\n        <para>Color to use for handles that represent the center of something.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Handles.color\">\n      <summary>\n        <para>Colors of the handles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Handles.currentCamera\">\n      <summary>\n        <para>Setup viewport and stuff for a current camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Handles.inverseMatrix\">\n      <summary>\n        <para>The inverse of the matrix for all handle operations.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Handles.lighting\">\n      <summary>\n        <para>Are handles lit?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Handles.matrix\">\n      <summary>\n        <para>Matrix for all handle operations.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Handles.preselectionColor\">\n      <summary>\n        <para>Color to use to highlight an unselected handle currently under the mouse pointer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Handles.secondaryColor\">\n      <summary>\n        <para>Soft color to use for for general things.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Handles.selectedColor\">\n      <summary>\n        <para>Color to use for the currently active handle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Handles.xAxisColor\">\n      <summary>\n        <para>Color to use for handles that manipulates the X coordinate of something.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Handles.yAxisColor\">\n      <summary>\n        <para>Color to use for handles that manipulates the Y coordinate of something.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Handles.zAxisColor\">\n      <summary>\n        <para>Color to use for handles that manipulates the Z coordinate of something.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Handles.zTest\">\n      <summary>\n        <para>zTest of the handles.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Handles.ArrowHandleCap(System.Int32,UnityEngine.Vector3,UnityEngine.Quaternion,System.Single,UnityEngine.EventType)\">\n      <summary>\n        <para>Draw an arrow like those used by the move tool.</para>\n      </summary>\n      <param name=\"controlID\">The control ID for the handle.</param>\n      <param name=\"position\">The position of the handle in the space of Handles.matrix.</param>\n      <param name=\"rotation\">The rotation of the handle in the space of Handles.matrix.</param>\n      <param name=\"size\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"eventType\">Event type for the handle to act upon. By design it handles EventType.Layout and EventType.Repaint events.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.BeginGUI\">\n      <summary>\n        <para>Begin a 2D GUI block inside the 3D handle GUI.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Handles.Button(UnityEngine.Vector3,UnityEngine.Quaternion,System.Single,System.Single,UnityEditor.Handles/CapFunction)\">\n      <summary>\n        <para>Make a 3D Button.</para>\n      </summary>\n      <param name=\"position\">The position to draw the button in the space of Handles.matrix.</param>\n      <param name=\"direction\">The rotation of the button in the space of Handles.matrix.</param>\n      <param name=\"size\">The visual size of the handle. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"pickSize\">The size of the button for the purpose of detecting a click. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"capFunction\">The draw style of the button.</param>\n      <returns>\n        <para>True when the user clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Handles.CapFunction\">\n      <summary>\n        <para>The function to use for drawing the handle e.g. Handles.RectangleCap.</para>\n      </summary>\n      <param name=\"controlID\">The control ID for the handle.</param>\n      <param name=\"position\">The position of the handle in the space of Handles.matrix.</param>\n      <param name=\"rotation\">The rotation of the handle in the space of Handles.matrix.</param>\n      <param name=\"size\">The size of the handle in world-space units.</param>\n      <param name=\"eventType\">Event type for the handle to act upon. By design it handles EventType.Layout and EventType.Repaint events.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.CircleHandleCap(System.Int32,UnityEngine.Vector3,UnityEngine.Quaternion,System.Single,UnityEngine.EventType)\">\n      <summary>\n        <para>Draw a circle handle. Pass this into handle functions.</para>\n      </summary>\n      <param name=\"controlID\">The control ID for the handle.</param>\n      <param name=\"position\">The position of the handle in the space of Handles.matrix.</param>\n      <param name=\"rotation\">The rotation of the handle in the space of Handles.matrix.</param>\n      <param name=\"size\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"eventType\">Event type for the handle to act upon. By design it handles EventType.Layout and EventType.Repaint events.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.ClearCamera(UnityEngine.Rect,UnityEngine.Camera)\">\n      <summary>\n        <para>Clears the camera.</para>\n      </summary>\n      <param name=\"position\">Where in the Scene to clear.</param>\n      <param name=\"camera\">The camera to clear.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.ConeHandleCap(System.Int32,UnityEngine.Vector3,UnityEngine.Quaternion,System.Single,UnityEngine.EventType)\">\n      <summary>\n        <para>Draw a cone handle. Pass this into handle functions.</para>\n      </summary>\n      <param name=\"controlID\">The control ID for the handle.</param>\n      <param name=\"position\">The position of the handle in the space of Handles.matrix.</param>\n      <param name=\"rotation\">The rotation of the handle in the space of Handles.matrix.</param>\n      <param name=\"size\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"eventType\">Event type for the handle to act upon. By design it handles EventType.Layout and EventType.Repaint events.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.CubeHandleCap(System.Int32,UnityEngine.Vector3,UnityEngine.Quaternion,System.Single,UnityEngine.EventType)\">\n      <summary>\n        <para>Draw a cube handle. Pass this into handle functions.</para>\n      </summary>\n      <param name=\"controlID\">The control ID for the handle.</param>\n      <param name=\"position\">The position of the handle in the space of Handles.matrix.</param>\n      <param name=\"rotation\">The rotation of the handle in the space of Handles.matrix.</param>\n      <param name=\"size\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"eventType\">Event type for the handle to act upon. By design it handles EventType.Layout and EventType.Repaint events.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.CylinderHandleCap(System.Int32,UnityEngine.Vector3,UnityEngine.Quaternion,System.Single,UnityEngine.EventType)\">\n      <summary>\n        <para>Draw a cylinder handle. Pass this into handle functions.</para>\n      </summary>\n      <param name=\"controlID\">The control ID for the handle.</param>\n      <param name=\"position\">The position of the handle in the space of Handles.matrix.</param>\n      <param name=\"rotation\">The rotation of the handle in the space of Handles.matrix.</param>\n      <param name=\"size\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"eventType\">Event type for the handle to act upon. By design it handles EventType.Layout and EventType.Repaint events.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.Disc(System.Int32,UnityEngine.Quaternion,UnityEngine.Vector3,UnityEngine.Vector3,System.Single,System.Boolean,System.Single)\">\n      <summary>\n        <para>Make a 3D disc that can be dragged with the mouse.\nNote: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</para>\n      </summary>\n      <param name=\"id\">Control id of the handle.</param>\n      <param name=\"rotation\">The rotation of the disc.</param>\n      <param name=\"position\">The center of the disc.</param>\n      <param name=\"axis\">The axis to rotate around.</param>\n      <param name=\"size\">The size of the disc in world space See Also:HandleUtility.GetHandleSize.</param>\n      <param name=\"cutoffPlane\">If true, only the front-facing half of the circle is draw / draggable. This is useful when you have many overlapping rotation axes (like in the default rotate tool) to avoid clutter.</param>\n      <param name=\"snap\">The grid size to snap to.</param>\n      <returns>\n        <para>The new rotation value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the same value as you passed into the function.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.Disc(UnityEngine.Quaternion,UnityEngine.Vector3,UnityEngine.Vector3,System.Single,System.Boolean,System.Single)\">\n      <summary>\n        <para>Make a 3D disc that can be dragged with the mouse.\nNote: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</para>\n      </summary>\n      <param name=\"id\">Control id of the handle.</param>\n      <param name=\"rotation\">The rotation of the disc.</param>\n      <param name=\"position\">The center of the disc.</param>\n      <param name=\"axis\">The axis to rotate around.</param>\n      <param name=\"size\">The size of the disc in world space See Also:HandleUtility.GetHandleSize.</param>\n      <param name=\"cutoffPlane\">If true, only the front-facing half of the circle is draw / draggable. This is useful when you have many overlapping rotation axes (like in the default rotate tool) to avoid clutter.</param>\n      <param name=\"snap\">The grid size to snap to.</param>\n      <returns>\n        <para>The new rotation value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the same value as you passed into the function.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DotHandleCap(System.Int32,UnityEngine.Vector3,UnityEngine.Quaternion,System.Single,UnityEngine.EventType)\">\n      <summary>\n        <para>Draw a dot handle. Pass this into handle functions.</para>\n      </summary>\n      <param name=\"controlID\">The control ID for the handle.</param>\n      <param name=\"position\">The position of the handle in the space of Handles.matrix.</param>\n      <param name=\"rotation\">The rotation of the handle in the space of Handles.matrix.</param>\n      <param name=\"size\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"eventType\">Event type for the handle to act upon. By design it handles EventType.Layout and EventType.Repaint events.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawAAConvexPolygon(UnityEngine.Vector3[])\">\n      <summary>\n        <para>Draw anti-aliased convex polygon specified with point array.</para>\n      </summary>\n      <param name=\"points\">List of points describing the convex polygon.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawAAPolyLine(UnityEngine.Vector3[])\">\n      <summary>\n        <para>Draw anti-aliased line specified with point array and width.</para>\n      </summary>\n      <param name=\"lineTex\">The AA texture used for rendering. To get an anti-aliased effect use a texture that is 1x2 pixels with one transparent white pixel and one opaque white pixel.</param>\n      <param name=\"width\">The width of the line. Note: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</param>\n      <param name=\"points\">List of points to build the line from.</param>\n      <param name=\"actualNumberOfPoints\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawAAPolyLine(System.Single,UnityEngine.Vector3[])\">\n      <summary>\n        <para>Draw anti-aliased line specified with point array and width.</para>\n      </summary>\n      <param name=\"lineTex\">The AA texture used for rendering. To get an anti-aliased effect use a texture that is 1x2 pixels with one transparent white pixel and one opaque white pixel.</param>\n      <param name=\"width\">The width of the line. Note: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</param>\n      <param name=\"points\">List of points to build the line from.</param>\n      <param name=\"actualNumberOfPoints\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawAAPolyLine(UnityEngine.Texture2D,UnityEngine.Vector3[])\">\n      <summary>\n        <para>Draw anti-aliased line specified with point array and width.</para>\n      </summary>\n      <param name=\"lineTex\">The AA texture used for rendering. To get an anti-aliased effect use a texture that is 1x2 pixels with one transparent white pixel and one opaque white pixel.</param>\n      <param name=\"width\">The width of the line. Note: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</param>\n      <param name=\"points\">List of points to build the line from.</param>\n      <param name=\"actualNumberOfPoints\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawAAPolyLine(System.Single,System.Int32,UnityEngine.Vector3[])\">\n      <summary>\n        <para>Draw anti-aliased line specified with point array and width.</para>\n      </summary>\n      <param name=\"lineTex\">The AA texture used for rendering. To get an anti-aliased effect use a texture that is 1x2 pixels with one transparent white pixel and one opaque white pixel.</param>\n      <param name=\"width\">The width of the line. Note: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</param>\n      <param name=\"points\">List of points to build the line from.</param>\n      <param name=\"actualNumberOfPoints\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawAAPolyLine(UnityEngine.Texture2D,System.Single,UnityEngine.Vector3[])\">\n      <summary>\n        <para>Draw anti-aliased line specified with point array and width.</para>\n      </summary>\n      <param name=\"lineTex\">The AA texture used for rendering. To get an anti-aliased effect use a texture that is 1x2 pixels with one transparent white pixel and one opaque white pixel.</param>\n      <param name=\"width\">The width of the line. Note: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</param>\n      <param name=\"points\">List of points to build the line from.</param>\n      <param name=\"actualNumberOfPoints\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawBezier(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Color,UnityEngine.Texture2D,System.Single)\">\n      <summary>\n        <para>Draw textured bezier line through start and end points with the given tangents.  To get an anti-aliased effect use a texture that is 1x2 pixels with one transparent white pixel and one opaque white pixel.  The bezier curve will be swept using this texture.</para>\n      </summary>\n      <param name=\"startPosition\">The start point of the bezier line.</param>\n      <param name=\"endPosition\">The end point of the bezier line.</param>\n      <param name=\"startTangent\">The start tangent of the bezier line.</param>\n      <param name=\"endTangent\">The end tangent of the bezier line.</param>\n      <param name=\"color\">The color to use for the bezier line.</param>\n      <param name=\"texture\">The texture to use for drawing the bezier line.</param>\n      <param name=\"width\">The width of the bezier line.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawCamera\">\n      <summary>\n        <para>Draws a camera inside a rectangle.</para>\n      </summary>\n      <param name=\"position\">The area to draw the camera within in GUI coordinates.</param>\n      <param name=\"camera\">The camera to draw.</param>\n      <param name=\"drawMode\">How the camera is drawn (textured, wireframe, etc).</param>\n      <param name=\"gridParam\">Parameters of grid drawing (can be omitted).</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawCamera(UnityEngine.Rect,UnityEngine.Camera)\">\n      <summary>\n        <para>Draws a camera inside a rectangle.</para>\n      </summary>\n      <param name=\"position\">The area to draw the camera within in GUI coordinates.</param>\n      <param name=\"camera\">The camera to draw.</param>\n      <param name=\"drawMode\">How the camera is drawn (textured, wireframe, etc.).</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawCamera(UnityEngine.Rect,UnityEngine.Camera,UnityEditor.DrawCameraMode)\">\n      <summary>\n        <para>Draws a camera inside a rectangle.</para>\n      </summary>\n      <param name=\"position\">The area to draw the camera within in GUI coordinates.</param>\n      <param name=\"camera\">The camera to draw.</param>\n      <param name=\"drawMode\">How the camera is drawn (textured, wireframe, etc.).</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawDottedLine(UnityEngine.Vector3,UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Draw a dotted line from p1 to p2.</para>\n      </summary>\n      <param name=\"p1\">The start point.</param>\n      <param name=\"p2\">The end point.</param>\n      <param name=\"screenSpaceSize\">The size in pixels for the lengths of the line segments and the gaps between them.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawDottedLines(UnityEngine.Vector3[],System.Single)\">\n      <summary>\n        <para>Draw a list of dotted line segments.</para>\n      </summary>\n      <param name=\"lineSegments\">A list of pairs of points that represent the start and end of line segments.</param>\n      <param name=\"screenSpaceSize\">The size in pixels for the lengths of the line segments and the gaps between them.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawDottedLines(UnityEngine.Vector3[],System.Int32[],System.Single)\">\n      <summary>\n        <para>Draw a list of indexed dotted line segments.</para>\n      </summary>\n      <param name=\"points\">A list of points.</param>\n      <param name=\"segmentIndices\">A list of pairs of indices to the start and end points of the line segments.</param>\n      <param name=\"screenSpaceSize\">The size in pixels for the lengths of the line segments and the gaps between them.</param>\n    </member>\n    <member name=\"T:UnityEditor.Handles.DrawingScope\">\n      <summary>\n        <para>Disposable helper struct for automatically setting and reverting Handles.color and/or Handles.matrix.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Handles.DrawingScope.originalColor\">\n      <summary>\n        <para>The value of Handles.color at the time this DrawingScope was created.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Handles.DrawingScope.originalMatrix\">\n      <summary>\n        <para>The value of Handles.matrix at the time this DrawingScope was created.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawingScope.#ctor(UnityEngine.Color)\">\n      <summary>\n        <para>Create a new DrawingScope and set Handles.color and/or Handles.matrix to the specified values.</para>\n      </summary>\n      <param name=\"matrix\">The matrix to use for displaying Handles inside the scope block.</param>\n      <param name=\"color\">The color to use for displaying Handles inside the scope block.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawingScope.#ctor(UnityEngine.Color,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Create a new DrawingScope and set Handles.color and/or Handles.matrix to the specified values.</para>\n      </summary>\n      <param name=\"matrix\">The matrix to use for displaying Handles inside the scope block.</param>\n      <param name=\"color\">The color to use for displaying Handles inside the scope block.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawingScope.#ctor(UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Create a new DrawingScope and set Handles.color and/or Handles.matrix to the specified values.</para>\n      </summary>\n      <param name=\"matrix\">The matrix to use for displaying Handles inside the scope block.</param>\n      <param name=\"color\">The color to use for displaying Handles inside the scope block.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawingScope.Dispose\">\n      <summary>\n        <para>Automatically reverts Handles.color and Handles.matrix to their values prior to entering the scope, when the scope is exited. You do not need to call this method manually.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawLine(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Draw a line from p1 to p2.</para>\n      </summary>\n      <param name=\"p1\"></param>\n      <param name=\"p2\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawLines(UnityEngine.Vector3[])\">\n      <summary>\n        <para>Draw a list of line segments.</para>\n      </summary>\n      <param name=\"lineSegments\">A list of pairs of points that represent the start and end of line segments.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawLines(UnityEngine.Vector3[],System.Int32[])\">\n      <summary>\n        <para>Draw a list of indexed line segments.</para>\n      </summary>\n      <param name=\"points\">A list of points.</param>\n      <param name=\"segmentIndices\">A list of pairs of indices to the start and end points of the line segments.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawPolyLine(UnityEngine.Vector3[])\">\n      <summary>\n        <para>Draw a line going through the list of all points.</para>\n      </summary>\n      <param name=\"points\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawSelectionFrame(System.Int32,UnityEngine.Vector3,UnityEngine.Quaternion,System.Single,UnityEngine.EventType)\">\n      <summary>\n        <para>Draw a camera facing selection frame.</para>\n      </summary>\n      <param name=\"controlID\"></param>\n      <param name=\"position\"></param>\n      <param name=\"rotation\"></param>\n      <param name=\"size\"></param>\n      <param name=\"eventType\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawSolidArc(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,System.Single,System.Single)\">\n      <summary>\n        <para>Draw a circular sector (pie piece) in 3D space.</para>\n      </summary>\n      <param name=\"center\">The center of the circle.</param>\n      <param name=\"normal\">The normal of the circle.</param>\n      <param name=\"from\">The direction of the point on the circumference, relative to the center, where the sector begins.</param>\n      <param name=\"angle\">The angle of the sector, in degrees.</param>\n      <param name=\"radius\">The radius of the circle\n\nNote: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawSolidDisc(UnityEngine.Vector3,UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Draw a solid flat disc in 3D space.</para>\n      </summary>\n      <param name=\"center\">The center of the dics.</param>\n      <param name=\"normal\">The normal of the disc.</param>\n      <param name=\"radius\">The radius of the dics\n\nNote: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawSolidRectangleWithOutline(UnityEngine.Vector3[],UnityEngine.Color,UnityEngine.Color)\">\n      <summary>\n        <para>Draw a solid outlined rectangle in 3D space.</para>\n      </summary>\n      <param name=\"verts\">The 4 vertices of the rectangle in world coordinates.</param>\n      <param name=\"faceColor\">The color of the rectangle's face.</param>\n      <param name=\"outlineColor\">The outline color of the rectangle.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawWireArc(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,System.Single,System.Single)\">\n      <summary>\n        <para>Draw a circular arc in 3D space.</para>\n      </summary>\n      <param name=\"center\">The center of the circle.</param>\n      <param name=\"normal\">The normal of the circle.</param>\n      <param name=\"from\">The direction of the point on the circle circumference, relative to the center, where the arc begins.</param>\n      <param name=\"angle\">The angle of the arc, in degrees.</param>\n      <param name=\"radius\">The radius of the circle\n\nNote: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawWireCube(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Draw a wireframe box with center and size.</para>\n      </summary>\n      <param name=\"center\"></param>\n      <param name=\"size\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.DrawWireDisc(UnityEngine.Vector3,UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Draw the outline of a flat disc in 3D space.</para>\n      </summary>\n      <param name=\"center\">The center of the dics.</param>\n      <param name=\"normal\">The normal of the disc.</param>\n      <param name=\"radius\">The radius of the dics\n\nNote: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.EndGUI\">\n      <summary>\n        <para>End a 2D GUI block and get back to the 3D handle GUI.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Handles.FreeMoveHandle(UnityEngine.Vector3,UnityEngine.Quaternion,System.Single,UnityEngine.Vector3,UnityEditor.Handles/CapFunction)\">\n      <summary>\n        <para>Make an unconstrained movement handle.</para>\n      </summary>\n      <param name=\"position\">The position of the handle in the space of Handles.matrix.</param>\n      <param name=\"rotation\">The rotation of the handle in the space of Handles.matrix.</param>\n      <param name=\"size\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"snap\">The snap increment on all axes. See Handles.SnapValue.</param>\n      <param name=\"capFunction\">The function to call for doing the actual drawing.</param>\n      <param name=\"controlID\">The control ID for the handle.</param>\n      <returns>\n        <para>The new value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the same value as you passed into the function.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.FreeMoveHandle(System.Int32,UnityEngine.Vector3,UnityEngine.Quaternion,System.Single,UnityEngine.Vector3,UnityEditor.Handles/CapFunction)\">\n      <summary>\n        <para>Make an unconstrained movement handle.</para>\n      </summary>\n      <param name=\"position\">The position of the handle in the space of Handles.matrix.</param>\n      <param name=\"rotation\">The rotation of the handle in the space of Handles.matrix.</param>\n      <param name=\"size\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"snap\">The snap increment on all axes. See Handles.SnapValue.</param>\n      <param name=\"capFunction\">The function to call for doing the actual drawing.</param>\n      <param name=\"controlID\">The control ID for the handle.</param>\n      <returns>\n        <para>The new value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the same value as you passed into the function.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.FreeMoveHandle(UnityEngine.Vector3,UnityEngine.Quaternion,System.Single,UnityEngine.Vector3,UnityEditor.Handles/DrawCapFunction)\">\n      <summary>\n        <para>TODO.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"rotation\"></param>\n      <param name=\"size\"></param>\n      <param name=\"snap\"></param>\n      <param name=\"capFunc\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.FreeRotateHandle(System.Int32,UnityEngine.Quaternion,UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Make an unconstrained rotation handle.</para>\n      </summary>\n      <param name=\"id\">Control id of the handle.</param>\n      <param name=\"rotation\">Orientation of the handle.</param>\n      <param name=\"position\">Center of the handle in 3D space.</param>\n      <param name=\"size\">The size of the handle.\n\nNote: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</param>\n      <returns>\n        <para>The new rotation value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the same value as you passed into the function.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.FreeRotateHandle(UnityEngine.Quaternion,UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Make an unconstrained rotation handle.</para>\n      </summary>\n      <param name=\"id\">Control id of the handle.</param>\n      <param name=\"rotation\">Orientation of the handle.</param>\n      <param name=\"position\">Center of the handle in 3D space.</param>\n      <param name=\"size\">The size of the handle.\n\nNote: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</param>\n      <returns>\n        <para>The new rotation value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the same value as you passed into the function.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.GetMainGameViewSize\">\n      <summary>\n        <para>Get the width and height of the main game view.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Handles.Label(UnityEngine.Vector3,System.String)\">\n      <summary>\n        <para>Make a text label positioned in 3D space.</para>\n      </summary>\n      <param name=\"position\">Position in 3D space as seen from the current handle camera.</param>\n      <param name=\"text\">Text to display on the label.</param>\n      <param name=\"image\">Texture to display on the label.</param>\n      <param name=\"content\">Text, image and tooltip for this label.</param>\n      <param name=\"style\">The style to use. If left out, the label style from the current GUISkin is used.\n\nNote: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.Label(UnityEngine.Vector3,UnityEngine.Texture)\">\n      <summary>\n        <para>Make a text label positioned in 3D space.</para>\n      </summary>\n      <param name=\"position\">Position in 3D space as seen from the current handle camera.</param>\n      <param name=\"text\">Text to display on the label.</param>\n      <param name=\"image\">Texture to display on the label.</param>\n      <param name=\"content\">Text, image and tooltip for this label.</param>\n      <param name=\"style\">The style to use. If left out, the label style from the current GUISkin is used.\n\nNote: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.Label(UnityEngine.Vector3,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a text label positioned in 3D space.</para>\n      </summary>\n      <param name=\"position\">Position in 3D space as seen from the current handle camera.</param>\n      <param name=\"text\">Text to display on the label.</param>\n      <param name=\"image\">Texture to display on the label.</param>\n      <param name=\"content\">Text, image and tooltip for this label.</param>\n      <param name=\"style\">The style to use. If left out, the label style from the current GUISkin is used.\n\nNote: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.Label(UnityEngine.Vector3,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text label positioned in 3D space.</para>\n      </summary>\n      <param name=\"position\">Position in 3D space as seen from the current handle camera.</param>\n      <param name=\"text\">Text to display on the label.</param>\n      <param name=\"image\">Texture to display on the label.</param>\n      <param name=\"content\">Text, image and tooltip for this label.</param>\n      <param name=\"style\">The style to use. If left out, the label style from the current GUISkin is used.\n\nNote: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.Label(UnityEngine.Vector3,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text label positioned in 3D space.</para>\n      </summary>\n      <param name=\"position\">Position in 3D space as seen from the current handle camera.</param>\n      <param name=\"text\">Text to display on the label.</param>\n      <param name=\"image\">Texture to display on the label.</param>\n      <param name=\"content\">Text, image and tooltip for this label.</param>\n      <param name=\"style\">The style to use. If left out, the label style from the current GUISkin is used.\n\nNote: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.MakeBezierPoints(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,System.Int32)\">\n      <summary>\n        <para>Retuns an array of points to representing the bezier curve. See Handles.DrawBezier.</para>\n      </summary>\n      <param name=\"startPosition\"></param>\n      <param name=\"endPosition\"></param>\n      <param name=\"startTangent\"></param>\n      <param name=\"endTangent\"></param>\n      <param name=\"division\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.PositionHandle(UnityEngine.Vector3,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Make a position handle.</para>\n      </summary>\n      <param name=\"position\">Center of the handle in 3D space.</param>\n      <param name=\"rotation\">Orientation of the handle in 3D space.</param>\n      <returns>\n        <para>The new value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the same value as you passed into the function.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.RadiusHandle(UnityEngine.Quaternion,UnityEngine.Vector3,System.Single,System.Boolean)\">\n      <summary>\n        <para>Make a Scene view radius handle.</para>\n      </summary>\n      <param name=\"rotation\">Orientation of the handle.</param>\n      <param name=\"position\">Center of the handle in 3D space.</param>\n      <param name=\"radius\">Radius to modify.</param>\n      <param name=\"handlesOnly\">Whether to omit the circular outline of the radius and only draw the point handles.</param>\n      <returns>\n        <para>The new value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the same value as you passed into the function.\n\nNote: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.RadiusHandle(UnityEngine.Quaternion,UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Make a Scene view radius handle.</para>\n      </summary>\n      <param name=\"rotation\">Orientation of the handle.</param>\n      <param name=\"position\">Center of the handle in 3D space.</param>\n      <param name=\"radius\">Radius to modify.</param>\n      <param name=\"handlesOnly\">Whether to omit the circular outline of the radius and only draw the point handles.</param>\n      <returns>\n        <para>The new value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the same value as you passed into the function.\n\nNote: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.RectangleHandleCap(System.Int32,UnityEngine.Vector3,UnityEngine.Quaternion,System.Single,UnityEngine.EventType)\">\n      <summary>\n        <para>Draw a rectangle handle. Pass this into handle functions.</para>\n      </summary>\n      <param name=\"controlID\">The control ID for the handle.</param>\n      <param name=\"position\">The position of the handle in the space of Handles.matrix.</param>\n      <param name=\"rotation\">The rotation of the handle in the space of Handles.matrix.</param>\n      <param name=\"size\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"eventType\">Event type for the handle to act upon. By design it handles EventType.Layout and EventType.Repaint events.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.RotationHandle(UnityEngine.Quaternion,UnityEngine.Vector3)\">\n      <summary>\n        <para>Make a Scene view rotation handle.</para>\n      </summary>\n      <param name=\"rotation\">Orientation of the handle.</param>\n      <param name=\"position\">Center of the handle in 3D space.</param>\n      <returns>\n        <para>The new rotation value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the same value as you passed into the function.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.ScaleHandle(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Quaternion,System.Single)\">\n      <summary>\n        <para>Make a Scene view scale handle.\n\nNote: Use HandleUtility.GetHandleSize where you might want to have constant screen-sized handles.</para>\n      </summary>\n      <param name=\"scale\">Scale to modify.</param>\n      <param name=\"position\">The position of the handle.</param>\n      <param name=\"rotation\">The rotation of the handle.</param>\n      <param name=\"size\">Allows you to scale the size of the handle on-scren.</param>\n      <returns>\n        <para>The new value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the same value as you passed into the function.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.ScaleSlider(System.Single,UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Quaternion,System.Single,System.Single)\">\n      <summary>\n        <para>Make a directional scale slider.</para>\n      </summary>\n      <param name=\"scale\">The value the user can modify.</param>\n      <param name=\"position\">The position of the handle in the space of Handles.matrix.</param>\n      <param name=\"direction\">The direction of the handle in the space of Handles.matrix.</param>\n      <param name=\"rotation\">The rotation of the handle in the space of Handles.matrix.</param>\n      <param name=\"size\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"snap\">The snap increment. See Handles.SnapValue.</param>\n      <returns>\n        <para>The new value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the same value as you passed into the function.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.ScaleValueHandle(System.Single,UnityEngine.Vector3,UnityEngine.Quaternion,System.Single,UnityEditor.Handles/CapFunction,System.Single)\">\n      <summary>\n        <para>Make a 3D handle that scales a single float.</para>\n      </summary>\n      <param name=\"value\">The value the user can modify.</param>\n      <param name=\"position\">The position of the handle in the space of Handles.matrix.</param>\n      <param name=\"rotation\">The rotation of the handle in the space of Handles.matrix.</param>\n      <param name=\"size\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"snap\">The snap increment. See Handles.SnapValue.</param>\n      <param name=\"capFunction\">The function to call for doing the actual drawing.</param>\n      <returns>\n        <para>The new value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the same value as you passed into the function.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.SetCamera(UnityEngine.Camera)\">\n      <summary>\n        <para>Set the current camera so all Handles and Gizmos are draw with its settings.</para>\n      </summary>\n      <param name=\"camera\"></param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.SetCamera(UnityEngine.Rect,UnityEngine.Camera)\">\n      <summary>\n        <para>Set the current camera so all Handles and Gizmos are draw with its settings.</para>\n      </summary>\n      <param name=\"camera\"></param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"T:UnityEditor.Handles.SizeFunction\">\n      <summary>\n        <para>A delegate type for getting a handle's size based on its current position.</para>\n      </summary>\n      <param name=\"position\">The current position of the handle in the space of Handles.matrix.</param>\n    </member>\n    <member name=\"M:UnityEditor.Handles.Slider(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Make a 3D slider that moves along one axis.</para>\n      </summary>\n      <param name=\"position\">The position of the current point in the space of Handles.matrix.</param>\n      <param name=\"direction\">The direction axis of the slider in the space of Handles.matrix.</param>\n      <param name=\"size\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"snap\">The snap increment. See Handles.SnapValue.</param>\n      <param name=\"capFunction\">The function to call for doing the actual drawing. By default it is Handles.ArrowHandleCap, but any function that has the same signature can be used.</param>\n      <returns>\n        <para>The new value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the position value passed into the function.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.Slider(UnityEngine.Vector3,UnityEngine.Vector3,System.Single,UnityEditor.Handles/CapFunction,System.Single)\">\n      <summary>\n        <para>Make a 3D slider that moves along one axis.</para>\n      </summary>\n      <param name=\"position\">The position of the current point in the space of Handles.matrix.</param>\n      <param name=\"direction\">The direction axis of the slider in the space of Handles.matrix.</param>\n      <param name=\"size\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"snap\">The snap increment. See Handles.SnapValue.</param>\n      <param name=\"capFunction\">The function to call for doing the actual drawing. By default it is Handles.ArrowHandleCap, but any function that has the same signature can be used.</param>\n      <returns>\n        <para>The new value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the position value passed into the function.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.Slider2D(System.Int32,UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,System.Single,UnityEditor.Handles/CapFunction,UnityEngine.Vector2,System.Boolean)\">\n      <summary>\n        <para>Make a 3D slider that moves along a plane defined by two axes.</para>\n      </summary>\n      <param name=\"id\">(optional) override the default ControlID for this Slider2D instance.</param>\n      <param name=\"handlePos\">The position of the current point in the space of Handles.matrix.</param>\n      <param name=\"offset\">(optional) renders the Slider2D at handlePos, but treats the Slider2D's origin as handlePos + offset. Useful for Slider2D instances that are placed/rendered relative to another object or handle.</param>\n      <param name=\"handleDir\">The direction of the handle in the space of Handles.matrix, only used for rendering of the handle.</param>\n      <param name=\"slideDir1\">The first axis of the slider's plane of movement in the space of Handles.matrix.</param>\n      <param name=\"slideDir2\">The second axis of the slider's plane of movement in the space of Handles.matrix.</param>\n      <param name=\"handleSize\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"snap\">(float or Vector2) The snap increment along both axes, either uniform or per-axis. See Handles.SnapValue.</param>\n      <param name=\"drawHelper\">(default: false) render a rectangle around the handle when dragging.</param>\n      <param name=\"capFunction\">The function to call for doing the actual drawing.</param>\n      <returns>\n        <para>The new value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the position value passed into the function.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.Slider2D(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,System.Single,UnityEditor.Handles/CapFunction,System.Single,System.Boolean)\">\n      <summary>\n        <para>Make a 3D slider that moves along a plane defined by two axes.</para>\n      </summary>\n      <param name=\"id\">(optional) override the default ControlID for this Slider2D instance.</param>\n      <param name=\"handlePos\">The position of the current point in the space of Handles.matrix.</param>\n      <param name=\"offset\">(optional) renders the Slider2D at handlePos, but treats the Slider2D's origin as handlePos + offset. Useful for Slider2D instances that are placed/rendered relative to another object or handle.</param>\n      <param name=\"handleDir\">The direction of the handle in the space of Handles.matrix, only used for rendering of the handle.</param>\n      <param name=\"slideDir1\">The first axis of the slider's plane of movement in the space of Handles.matrix.</param>\n      <param name=\"slideDir2\">The second axis of the slider's plane of movement in the space of Handles.matrix.</param>\n      <param name=\"handleSize\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"snap\">(float or Vector2) The snap increment along both axes, either uniform or per-axis. See Handles.SnapValue.</param>\n      <param name=\"drawHelper\">(default: false) render a rectangle around the handle when dragging.</param>\n      <param name=\"capFunction\">The function to call for doing the actual drawing.</param>\n      <returns>\n        <para>The new value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the position value passed into the function.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.Slider2D(System.Int32,UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,System.Single,UnityEditor.Handles/CapFunction,UnityEngine.Vector2,System.Boolean)\">\n      <summary>\n        <para>Make a 3D slider that moves along a plane defined by two axes.</para>\n      </summary>\n      <param name=\"id\">(optional) override the default ControlID for this Slider2D instance.</param>\n      <param name=\"handlePos\">The position of the current point in the space of Handles.matrix.</param>\n      <param name=\"offset\">(optional) renders the Slider2D at handlePos, but treats the Slider2D's origin as handlePos + offset. Useful for Slider2D instances that are placed/rendered relative to another object or handle.</param>\n      <param name=\"handleDir\">The direction of the handle in the space of Handles.matrix, only used for rendering of the handle.</param>\n      <param name=\"slideDir1\">The first axis of the slider's plane of movement in the space of Handles.matrix.</param>\n      <param name=\"slideDir2\">The second axis of the slider's plane of movement in the space of Handles.matrix.</param>\n      <param name=\"handleSize\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"snap\">(float or Vector2) The snap increment along both axes, either uniform or per-axis. See Handles.SnapValue.</param>\n      <param name=\"drawHelper\">(default: false) render a rectangle around the handle when dragging.</param>\n      <param name=\"capFunction\">The function to call for doing the actual drawing.</param>\n      <returns>\n        <para>The new value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the position value passed into the function.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.Slider2D(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,System.Single,UnityEditor.Handles/CapFunction,UnityEngine.Vector2,System.Boolean)\">\n      <summary>\n        <para>Make a 3D slider that moves along a plane defined by two axes.</para>\n      </summary>\n      <param name=\"id\">(optional) override the default ControlID for this Slider2D instance.</param>\n      <param name=\"handlePos\">The position of the current point in the space of Handles.matrix.</param>\n      <param name=\"offset\">(optional) renders the Slider2D at handlePos, but treats the Slider2D's origin as handlePos + offset. Useful for Slider2D instances that are placed/rendered relative to another object or handle.</param>\n      <param name=\"handleDir\">The direction of the handle in the space of Handles.matrix, only used for rendering of the handle.</param>\n      <param name=\"slideDir1\">The first axis of the slider's plane of movement in the space of Handles.matrix.</param>\n      <param name=\"slideDir2\">The second axis of the slider's plane of movement in the space of Handles.matrix.</param>\n      <param name=\"handleSize\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"snap\">(float or Vector2) The snap increment along both axes, either uniform or per-axis. See Handles.SnapValue.</param>\n      <param name=\"drawHelper\">(default: false) render a rectangle around the handle when dragging.</param>\n      <param name=\"capFunction\">The function to call for doing the actual drawing.</param>\n      <returns>\n        <para>The new value modified by the user's interaction with the handle. If the user has not moved the handle, it will return the position value passed into the function.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.SnapValue(System.Single,System.Single)\">\n      <summary>\n        <para>Rounds the value val to the closest multiple of snap (snap can only be positive).</para>\n      </summary>\n      <param name=\"val\"></param>\n      <param name=\"snap\"></param>\n      <returns>\n        <para>The rounded value, if snap is positive, and val otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Handles.SphereHandleCap(System.Int32,UnityEngine.Vector3,UnityEngine.Quaternion,System.Single,UnityEngine.EventType)\">\n      <summary>\n        <para>Draw a sphere handle. Pass this into handle functions.</para>\n      </summary>\n      <param name=\"controlID\">The control ID for the handle.</param>\n      <param name=\"position\">The position of the handle in the space of Handles.matrix.</param>\n      <param name=\"rotation\">The rotation of the handle in the space of Handles.matrix.</param>\n      <param name=\"eventType\">Event type for the handle to act upon. By design it handles EventType.Layout and EventType.Repaint events.</param>\n      <param name=\"size\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n    </member>\n    <member name=\"T:UnityEditor.HandleUtility\">\n      <summary>\n        <para>Helper functions for Scene View style 3D GUI.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.HandleUtility.acceleration\">\n      <summary>\n        <para>Get standard acceleration for dragging values (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.HandleUtility.niceMouseDelta\">\n      <summary>\n        <para>Get nice mouse delta to use for dragging a float value (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.HandleUtility.niceMouseDeltaZoom\">\n      <summary>\n        <para>Get nice mouse delta to use for zooming (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.AddControl(System.Int32,System.Single)\">\n      <summary>\n        <para>Record a distance measurement from a handle.</para>\n      </summary>\n      <param name=\"controlId\"></param>\n      <param name=\"distance\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.AddDefaultControl(System.Int32)\">\n      <summary>\n        <para>Add the ID for a default control. This will be picked if nothing else is.</para>\n      </summary>\n      <param name=\"controlId\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.CalcLineTranslation(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Map a mouse drag onto a movement along a line in 3D space.</para>\n      </summary>\n      <param name=\"src\">The source point of the drag.</param>\n      <param name=\"dest\">The destination point of the drag.</param>\n      <param name=\"srcPosition\">The 3D position the dragged object had at src ray.</param>\n      <param name=\"constraintDir\">3D direction of constrained movement.</param>\n      <returns>\n        <para>The distance travelled along constraintDir.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.ClosestPointToArc(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,System.Single,System.Single)\">\n      <summary>\n        <para>Get the point on an arc (in 3D space) which is closest to the current mouse position.</para>\n      </summary>\n      <param name=\"center\"></param>\n      <param name=\"normal\"></param>\n      <param name=\"from\"></param>\n      <param name=\"angle\"></param>\n      <param name=\"radius\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.ClosestPointToDisc(UnityEngine.Vector3,UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Get the point on an disc (in 3D space) which is closest to the current mouse position.</para>\n      </summary>\n      <param name=\"center\"></param>\n      <param name=\"normal\"></param>\n      <param name=\"radius\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.ClosestPointToPolyLine(UnityEngine.Vector3[])\">\n      <summary>\n        <para>Get the point on a polyline (in 3D space) which is closest to the current mouse position.</para>\n      </summary>\n      <param name=\"vertices\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.DistancePointBezier(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Calculate distance between a point and a Bezier curve.</para>\n      </summary>\n      <param name=\"point\"></param>\n      <param name=\"startPosition\"></param>\n      <param name=\"endPosition\"></param>\n      <param name=\"startTangent\"></param>\n      <param name=\"endTangent\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.DistancePointLine(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Calculate distance between a point and a line.</para>\n      </summary>\n      <param name=\"point\"></param>\n      <param name=\"lineStart\"></param>\n      <param name=\"lineEnd\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.DistancePointToLine(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Distance from a point p in 2d to a line defined by two points a and b.</para>\n      </summary>\n      <param name=\"p\"></param>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.DistancePointToLineSegment(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Distance from a point p in 2d to a line segment defined by two points a and b.</para>\n      </summary>\n      <param name=\"p\"></param>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.DistanceToArc(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,System.Single,System.Single)\">\n      <summary>\n        <para>Pixel distance from mouse pointer to a 3D section of a disc.</para>\n      </summary>\n      <param name=\"center\"></param>\n      <param name=\"normal\"></param>\n      <param name=\"from\"></param>\n      <param name=\"angle\"></param>\n      <param name=\"radius\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.DistanceToCircle(UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Pixel distance from mouse pointer to camera facing circle.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"radius\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.DistanceToDisc(UnityEngine.Vector3,UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Pixel distance from mouse pointer to a 3D disc.</para>\n      </summary>\n      <param name=\"center\"></param>\n      <param name=\"normal\"></param>\n      <param name=\"radius\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.DistanceToLine(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Pixel distance from mouse pointer to line.</para>\n      </summary>\n      <param name=\"p1\"></param>\n      <param name=\"p2\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.DistanceToPolyLine(UnityEngine.Vector3[])\">\n      <summary>\n        <para>Pixel distance from mouse pointer to a polyline.</para>\n      </summary>\n      <param name=\"points\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.DistanceToRectangle(UnityEngine.Vector3,UnityEngine.Quaternion,System.Single)\">\n      <summary>\n        <para>Pixel distance from mouse pointer to a rectangle on screen.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"rotation\"></param>\n      <param name=\"size\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.GetHandleSize(UnityEngine.Vector3)\">\n      <summary>\n        <para>Get world space size of a manipulator handle at given position.</para>\n      </summary>\n      <param name=\"position\">The position of the handle in 3d space.</param>\n      <returns>\n        <para>A constant screen-size for the handle, based on the distance between from the supplied handle's position to the camera.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.GUIPointToScreenPixelCoordinate(UnityEngine.Vector2)\">\n      <summary>\n        <para>Converts a 2D GUI position to screen pixel coordinates.</para>\n      </summary>\n      <param name=\"guiPoint\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.GUIPointToWorldRay(UnityEngine.Vector2)\">\n      <summary>\n        <para>Convert 2D GUI position to a world space ray.</para>\n      </summary>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.PickGameObject(UnityEngine.Vector2,System.Boolean)\">\n      <summary>\n        <para>Pick game object closest to specified position.</para>\n      </summary>\n      <param name=\"selectPrefabRoot\">Select prefab.</param>\n      <param name=\"materialIndex\">Returns index into material array of the Renderer component that is closest to specified position.</param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.PickGameObject(UnityEngine.Vector2,System.Int32&amp;)\">\n      <summary>\n        <para>Pick game object closest to specified position.</para>\n      </summary>\n      <param name=\"selectPrefabRoot\">Select prefab.</param>\n      <param name=\"materialIndex\">Returns index into material array of the Renderer component that is closest to specified position.</param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.PickRectObjects(UnityEngine.Rect)\">\n      <summary>\n        <para>Pick GameObjects that lie within a specified screen rectangle.</para>\n      </summary>\n      <param name=\"rect\">An screen rectangle specified with pixel coordinates.</param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.PickRectObjects(UnityEngine.Rect,System.Boolean)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"rect\"></param>\n      <param name=\"selectPrefabRootsOnly\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.PointOnLineParameter(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Returns the parameter for the projection of the point on the given line.</para>\n      </summary>\n      <param name=\"point\"></param>\n      <param name=\"linePoint\"></param>\n      <param name=\"lineDirection\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.PopCamera(UnityEngine.Camera)\">\n      <summary>\n        <para>Retrieve all camera settings.</para>\n      </summary>\n      <param name=\"camera\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.ProjectPointLine(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Project point onto a line.</para>\n      </summary>\n      <param name=\"point\"></param>\n      <param name=\"lineStart\"></param>\n      <param name=\"lineEnd\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.PushCamera(UnityEngine.Camera)\">\n      <summary>\n        <para>Store all camera settings.</para>\n      </summary>\n      <param name=\"camera\"></param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.RaySnap(UnityEngine.Ray)\">\n      <summary>\n        <para>Casts ray against the scene and report if an object lies in its path.</para>\n      </summary>\n      <param name=\"ray\"></param>\n      <returns>\n        <para>A boxed RaycastHit, null if nothing hit it.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.Repaint\">\n      <summary>\n        <para>Repaint the current view.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.WorldPointToSizedRect(UnityEngine.Vector3,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Calculate a rectangle to display a 2D GUI element near a projected point in 3D space.</para>\n      </summary>\n      <param name=\"position\">The world-space position to use.</param>\n      <param name=\"content\">The content to make room for.</param>\n      <param name=\"style\">The style to use. The style's alignment.</param>\n    </member>\n    <member name=\"M:UnityEditor.HandleUtility.WorldToGUIPoint(UnityEngine.Vector3)\">\n      <summary>\n        <para>Convert world space point to a 2D GUI position.</para>\n      </summary>\n      <param name=\"world\">Point in world space.</param>\n    </member>\n    <member name=\"T:UnityEditor.Help\">\n      <summary>\n        <para>Helper class to access Unity documentation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Help.BrowseURL(System.String)\">\n      <summary>\n        <para>Open url in the default web browser.</para>\n      </summary>\n      <param name=\"url\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Help.GetHelpURLForObject(UnityEngine.Object)\">\n      <summary>\n        <para>Get the URL for this object's documentation.</para>\n      </summary>\n      <param name=\"obj\">The object to retrieve documentation for.</param>\n      <returns>\n        <para>The documentation URL for the object. Note that this could use the http: or file: schemas.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Help.HasHelpForObject(UnityEngine.Object)\">\n      <summary>\n        <para>Is there a help page for this object?</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Help.ShowHelpForObject(UnityEngine.Object)\">\n      <summary>\n        <para>Show help page for this object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Help.ShowHelpPage(System.String)\">\n      <summary>\n        <para>Show a help page.</para>\n      </summary>\n      <param name=\"page\"></param>\n    </member>\n    <member name=\"T:UnityEditor.Highlighter\">\n      <summary>\n        <para>Use this class to highlight elements in the editor for use in in-editor tutorials and similar.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Highlighter.active\">\n      <summary>\n        <para>Is there currently an active highlight?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Highlighter.activeRect\">\n      <summary>\n        <para>The rect in screenspace of the current active highlight.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Highlighter.activeText\">\n      <summary>\n        <para>The text of the current active highlight.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Highlighter.activeVisible\">\n      <summary>\n        <para>Is the current active highlight visible yet?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Highlighter.Highlight(System.String,System.String)\">\n      <summary>\n        <para>Highlights an element in the editor.</para>\n      </summary>\n      <param name=\"windowTitle\">The title of the window the element is inside.</param>\n      <param name=\"text\">The text to identify the element with.</param>\n      <param name=\"mode\">Optional mode to specify how to search for the element.</param>\n      <returns>\n        <para>true if the requested element was found; otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Highlighter.Highlight(System.String,System.String,UnityEditor.HighlightSearchMode)\">\n      <summary>\n        <para>Highlights an element in the editor.</para>\n      </summary>\n      <param name=\"windowTitle\">The title of the window the element is inside.</param>\n      <param name=\"text\">The text to identify the element with.</param>\n      <param name=\"mode\">Optional mode to specify how to search for the element.</param>\n      <returns>\n        <para>true if the requested element was found; otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Highlighter.HighlightIdentifier(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>Call this method to create an identifiable rect that the Highlighter can find.</para>\n      </summary>\n      <param name=\"position\">The position to make highlightable.</param>\n      <param name=\"identifier\">The identifier text of the rect.</param>\n    </member>\n    <member name=\"M:UnityEditor.Highlighter.Stop\">\n      <summary>\n        <para>Stops the active highlight.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.HighlightSearchMode\">\n      <summary>\n        <para>Used to specify how to find a given element in the editor to highlight.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.HighlightSearchMode.Auto\">\n      <summary>\n        <para>Highlights the first element found using any of the search modes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.HighlightSearchMode.Content\">\n      <summary>\n        <para>Highlights an element containing text using the text as identifier.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.HighlightSearchMode.Identifier\">\n      <summary>\n        <para>Highlights an element with a given identifier text.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.HighlightSearchMode.None\">\n      <summary>\n        <para>Highlights nothing.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.HighlightSearchMode.PrefixLabel\">\n      <summary>\n        <para>Highlights an entire editor control using its label text as identifier.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.IconKind\">\n      <summary>\n        <para>Icon kind.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IconKind.Any\">\n      <summary>\n        <para>This icon can be used for any purpose in an application.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IconKind.Application\">\n      <summary>\n        <para>This icon is used for the main application icons.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IconKind.Notification\">\n      <summary>\n        <para>This icon is used for push notifications.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IconKind.Settings\">\n      <summary>\n        <para>This icon is used for settings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IconKind.Spotlight\">\n      <summary>\n        <para>This icon is used for Spotlight searches. (iOS only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IconKind.Store\">\n      <summary>\n        <para>This icon is used by the iOS App Store.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.IHasCustomMenu\">\n      <summary>\n        <para>Defines a method to add custom menu items to an Editor Window.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IHasCustomMenu.AddItemsToMenu(UnityEditor.GenericMenu)\">\n      <summary>\n        <para>Adds your custom menu items to an Editor Window.</para>\n      </summary>\n      <param name=\"menu\"></param>\n    </member>\n    <member name=\"T:UnityEditor.IHVImageFormatImporter\">\n      <summary>\n        <para>Use IHVImageFormatImporter to modify Texture2D import settings for Textures in IHV (Independent Hardware Vendor) formats such as .DDS and .PVR from Editor scripts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IHVImageFormatImporter.filterMode\">\n      <summary>\n        <para>Filtering mode of the texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IHVImageFormatImporter.isReadable\">\n      <summary>\n        <para>Is texture data readable from scripts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IHVImageFormatImporter.streamingMipmaps\">\n      <summary>\n        <para>Enable mipmap streaming for this texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IHVImageFormatImporter.streamingMipmapsPriority\">\n      <summary>\n        <para>Relative priority for this texture when reducing memory size in order to hit the memory budget.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IHVImageFormatImporter.wrapMode\">\n      <summary>\n        <para>Texture coordinate wrapping mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IHVImageFormatImporter.wrapModeU\">\n      <summary>\n        <para>Texture U coordinate wrapping mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IHVImageFormatImporter.wrapModeV\">\n      <summary>\n        <para>Texture V coordinate wrapping mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IHVImageFormatImporter.wrapModeW\">\n      <summary>\n        <para>Texture W coordinate wrapping mode for Texture3D.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Il2CppCompilerConfiguration\">\n      <summary>\n        <para>C++ compiler configuration used when compiling IL2CPP generated code.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Il2CppCompilerConfiguration.Debug\">\n      <summary>\n        <para>Debug configuration turns off all optimizations, which makes the code quicker to build but slower to run.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Il2CppCompilerConfiguration.Release\">\n      <summary>\n        <para>Release configuration enables optimizations, so the compiled code runs faster and the binary size is smaller but it takes longer to compile.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.ArcHandle\">\n      <summary>\n        <para>A class for a compound handle to edit an angle and a radius in the Scene view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.ArcHandle.angle\">\n      <summary>\n        <para>Returns or specifies the angle of the arc for the handle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.ArcHandle.angleHandleColor\">\n      <summary>\n        <para>Returns or specifies the color of the angle control handle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.ArcHandle.angleHandleDrawFunction\">\n      <summary>\n        <para>The Handles.CapFunction to use when displaying the angle control handle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.ArcHandle.angleHandleSizeFunction\">\n      <summary>\n        <para>The Handles.SizeFunction to specify how large the angle control handle should be.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.ArcHandle.fillColor\">\n      <summary>\n        <para>Returns or specifies the color of the arc shape.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.ArcHandle.radius\">\n      <summary>\n        <para>Returns or specifies the radius of the arc for the handle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.ArcHandle.radiusHandleColor\">\n      <summary>\n        <para>Returns or specifies the color of the radius control handle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.ArcHandle.radiusHandleDrawFunction\">\n      <summary>\n        <para>The Handles.CapFunction to use when displaying the radius control handle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.ArcHandle.radiusHandleSizeFunction\">\n      <summary>\n        <para>The Handles.SizeFunction to specify how large the angle control handle should be.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.ArcHandle.wireframeColor\">\n      <summary>\n        <para>Returns or specifies the color of the curved line along the outside of the arc.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.ArcHandle.#ctor\">\n      <summary>\n        <para>Creates a new instance of the ArcHandle class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.ArcHandle.DefaultAngleHandleDrawFunction(System.Int32,UnityEngine.Vector3,UnityEngine.Quaternion,System.Single,UnityEngine.EventType)\">\n      <summary>\n        <para>A Handles.CapFunction that draws a line terminated with Handles.CylinderHandleCap.</para>\n      </summary>\n      <param name=\"controlID\">The control ID for the handle.</param>\n      <param name=\"position\">The position of the handle in the space of Handles.matrix.</param>\n      <param name=\"rotation\">The rotation of the handle in the space of Handles.matrix.</param>\n      <param name=\"size\">The size of the handle in the space of Handles.matrix. Use HandleUtility.GetHandleSize if you want a constant screen-space size.</param>\n      <param name=\"eventType\">Event type for the handle to act upon. By design it handles EventType.Layout and EventType.Repaint events.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.ArcHandle.DefaultAngleHandleSizeFunction(UnityEngine.Vector3)\">\n      <summary>\n        <para>A Handles.SizeFunction that returns a fixed screen-space size.</para>\n      </summary>\n      <param name=\"position\">The current position of the handle in the space of Handles.matrix.</param>\n      <returns>\n        <para>The size to use for a handle at the specified position.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.ArcHandle.DefaultRadiusHandleSizeFunction(UnityEngine.Vector3)\">\n      <summary>\n        <para>A Handles.SizeFunction that returns a fixed screen-space size.</para>\n      </summary>\n      <param name=\"position\">The current position of the handle in the space of Handles.matrix.</param>\n      <returns>\n        <para>The size to use for a handle at the specified position.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.ArcHandle.DrawHandle\">\n      <summary>\n        <para>A function to display this instance in the current handle camera using its current configuration.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.ArcHandle.SetColorWithoutRadiusHandle(UnityEngine.Color,System.Single)\">\n      <summary>\n        <para>Sets angleHandleColor, wireframeColor, and fillColor to the same value, where fillColor will have the specified alpha value. radiusHandleColor will be set to Color.clear and the radius handle will be disabled.</para>\n      </summary>\n      <param name=\"color\">The color to use for the angle control handle and the fill shape.</param>\n      <param name=\"fillColorAlpha\">The alpha value to use for fillColor.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.ArcHandle.SetColorWithRadiusHandle(UnityEngine.Color,System.Single)\">\n      <summary>\n        <para>Sets angleHandleColor, radiusHandleColor, wireframeColor, and fillColor to the same value, where fillColor will have the specified alpha value.</para>\n      </summary>\n      <param name=\"color\">The color to use for the angle and radius control handles and the fill shape.</param>\n      <param name=\"fillColorAlpha\">The alpha value to use for fillColor.</param>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.BoxBoundsHandle\">\n      <summary>\n        <para>A compound handle to edit a box-shaped bounding volume in the Scene view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.BoxBoundsHandle.size\">\n      <summary>\n        <para>Returns or specifies the size of the bounding box.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.BoxBoundsHandle.#ctor\">\n      <summary>\n        <para>Create a new instance of the BoxBoundsHandle class.</para>\n      </summary>\n      <param name=\"controlIDHint\">An integer value used to generate consistent control IDs for each control handle on this instance. Avoid using the same value for all of your BoxBoundsHandle instances.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.BoxBoundsHandle.#ctor(System.Int32)\">\n      <summary>\n        <para>Create a new instance of the BoxBoundsHandle class.</para>\n      </summary>\n      <param name=\"controlIDHint\">An integer value used to generate consistent control IDs for each control handle on this instance. Avoid using the same value for all of your BoxBoundsHandle instances.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.BoxBoundsHandle.DrawWireframe\">\n      <summary>\n        <para>Draw a wireframe box for this instance.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.CapsuleBoundsHandle\">\n      <summary>\n        <para>A compound handle to edit a capsule-shaped bounding volume in the Scene view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.CapsuleBoundsHandle.height\">\n      <summary>\n        <para>Returns or specifies the height of the capsule bounding volume.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.CapsuleBoundsHandle.heightAxis\">\n      <summary>\n        <para>Returns or specifies the axis in the handle's space to which height maps. The radius maps to the remaining axes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.CapsuleBoundsHandle.radius\">\n      <summary>\n        <para>Returns or specifies the radius of the capsule bounding volume.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.CapsuleBoundsHandle.#ctor\">\n      <summary>\n        <para>Create a new instance of the CapsuleBoundsHandle class.</para>\n      </summary>\n      <param name=\"controlIDHint\">An integer value used to generate consistent control IDs for each control handle on this instance. Avoid using the same value for all of your CapsuleBoundsHandle instances.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.CapsuleBoundsHandle.#ctor(System.Int32)\">\n      <summary>\n        <para>Create a new instance of the CapsuleBoundsHandle class.</para>\n      </summary>\n      <param name=\"controlIDHint\">An integer value used to generate consistent control IDs for each control handle on this instance. Avoid using the same value for all of your CapsuleBoundsHandle instances.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.CapsuleBoundsHandle.DrawWireframe\">\n      <summary>\n        <para>Draw a wireframe capsule for this instance.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.CapsuleBoundsHandle.HeightAxis\">\n      <summary>\n        <para>An enumeration for specifying which axis on a CapsuleBoundsHandle object maps to the CapsuleBoundsHandle.height parameter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.CapsuleBoundsHandle.HeightAxis.X\">\n      <summary>\n        <para>X-axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.CapsuleBoundsHandle.HeightAxis.Y\">\n      <summary>\n        <para>Y-axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.CapsuleBoundsHandle.HeightAxis.Z\">\n      <summary>\n        <para>Z-axis.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.CapsuleBoundsHandle.OnHandleChanged(UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle/HandleDirection,UnityEngine.Bounds,UnityEngine.Bounds)\">\n      <summary>\n        <para>A callback for when a control handle was dragged in the scene.</para>\n      </summary>\n      <param name=\"handle\">The handle that was dragged.</param>\n      <param name=\"boundsOnClick\">The raw Bounds for this instance's volume at the time the control handle was clicked.</param>\n      <param name=\"newBounds\">The raw Bounds for this instance's volume based on the updated handle position.</param>\n      <returns>\n        <para>The bounds that should be applied to this instance, with any necessary modifications applied.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.JointAngularLimitHandle\">\n      <summary>\n        <para>A class for a compound handle to edit multiaxial angular motion limits in the Scene view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.angleHandleDrawFunction\">\n      <summary>\n        <para>The Handles.CapFunction to use when displaying the angle control handle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.angleHandleSizeFunction\">\n      <summary>\n        <para>The Handles.SizeFunction to specify how large the angle control handle should be.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.fillAlpha\">\n      <summary>\n        <para>Returns or specifies the opacity to use when rendering fill shapes for the range of motion for each axis. Defaults to 0.1.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.radius\">\n      <summary>\n        <para>Returns or specifies the radius of the arc for the handle. Defaults to 1.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.wireframeAlpha\">\n      <summary>\n        <para>Returns or specifies the opacity to use for the curved lines along the outside of the arcs of motion. Defaults to 1.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.xHandleColor\">\n      <summary>\n        <para>Returns or specifies the color to use for the handle limiting motion around the x-axis. Defaults to Handles.xAxisColor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.xMax\">\n      <summary>\n        <para>Returns or specifies the maximum angular motion about the x-axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.xMin\">\n      <summary>\n        <para>Returns or specifies the minimum angular motion about the x-axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.xMotion\">\n      <summary>\n        <para>Returns or specifies how angular motion is limited about the x-axis. Defaults to ConfigurableJointMotion.Limited.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.xRange\">\n      <summary>\n        <para>Returns or specifies the range of valid values for angular motion about the x-axis. Defaults to [-180.0, 180.0].</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.yHandleColor\">\n      <summary>\n        <para>Returns or specifies the color to use for the handle limiting motion around the y-axis. Defaults to Handles.yAxisColor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.yMax\">\n      <summary>\n        <para>Returns or specifies the maximum angular motion about the y-axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.yMin\">\n      <summary>\n        <para>Returns or specifies the minimum angular motion about the y-axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.yMotion\">\n      <summary>\n        <para>Returns or specifies how angular motion is limited about the y-axis. Defaults to ConfigurableJointMotion.Limited.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.yRange\">\n      <summary>\n        <para>Returns or specifies the range of valid values for angular motion about the y-axis. Defaults to [-180.0, 180.0].</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.zHandleColor\">\n      <summary>\n        <para>Returns or specifies the color to use for the handle limiting motion around the z-axis. Defaults to Handles.zAxisColor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.zMax\">\n      <summary>\n        <para>Returns or specifies the maximum angular motion about the z-axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.zMin\">\n      <summary>\n        <para>Returns or specifies the minimum angular motion about the z-axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.zMotion\">\n      <summary>\n        <para>Returns or specifies how angular motion is limited about the z-axis. Defaults to ConfigurableJointMotion.Limited.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.zRange\">\n      <summary>\n        <para>Returns or specifies the range of valid values for angular motion about the z-axis. Defaults to [-180.0, 180.0].</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.#ctor\">\n      <summary>\n        <para>Creates a new instance of the JointAngularLimitHandle class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.JointAngularLimitHandle.DrawHandle\">\n      <summary>\n        <para>A function to display this instance in the current handle camera using its current configuration.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.MultiColumnHeader\">\n      <summary>\n        <para>The MultiColumnHeader is a general purpose class that e.g can be used with the TreeView to create multi-column tree views and list views.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.MultiColumnHeader.canSort\">\n      <summary>\n        <para>Use this property to control whether sorting is enabled for all the columns.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.MultiColumnHeader.height\">\n      <summary>\n        <para>Customizable height of the multi column header.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.MultiColumnHeader.sortedColumnIndex\">\n      <summary>\n        <para>The index of the column that is set to be the primary sorting column. This is the column that shows the sorting arrow above the header text.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.IMGUI.Controls.MultiColumnHeader.sortingChanged(UnityEditor.IMGUI.Controls.MultiColumnHeader/HeaderCallback)\">\n      <summary>\n        <para>Subscribe to this event to get notified when sorting has changed.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.MultiColumnHeader.state\">\n      <summary>\n        <para>This is the state of the MultiColumnHeader.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.IMGUI.Controls.MultiColumnHeader.visibleColumnsChanged(UnityEditor.IMGUI.Controls.MultiColumnHeader/HeaderCallback)\">\n      <summary>\n        <para>Subscribe to this event to get notified when the number of visible columns has changed.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.AddColumnHeaderContextMenuItems(UnityEditor.GenericMenu)\">\n      <summary>\n        <para>Override this method to extend the default context menu items shown when context clicking the header area.</para>\n      </summary>\n      <param name=\"menu\">Context menu shown.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.ColumnHeaderClicked(UnityEditor.IMGUI.Controls.MultiColumnHeaderState/Column,System.Int32)\">\n      <summary>\n        <para>Override to customize the behavior when clicking a column header.</para>\n      </summary>\n      <param name=\"column\">Column clicked.</param>\n      <param name=\"columnIndex\">Column index clicked.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.ColumnHeaderGUI(UnityEditor.IMGUI.Controls.MultiColumnHeaderState/Column,UnityEngine.Rect,System.Int32)\">\n      <summary>\n        <para>Override to customize the GUI of a single column header.</para>\n      </summary>\n      <param name=\"column\">Column header data.</param>\n      <param name=\"headerRect\">Rect for column header.</param>\n      <param name=\"columnIndex\">Column index.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.#ctor(UnityEditor.IMGUI.Controls.MultiColumnHeaderState)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"state\">Column header state and Column state.</param>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.MultiColumnHeader.DefaultGUI\">\n      <summary>\n        <para>Default GUI methods and properties for the MultiColumnHeader class.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.MultiColumnHeader.DefaultGUI.columnContentMargin\">\n      <summary>\n        <para>Margin that can be used by clients of the MultiColumnHeader to control spacing between content in multiple columns.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.MultiColumnHeader.DefaultGUI.defaultHeight\">\n      <summary>\n        <para>Default height of the header.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.MultiColumnHeader.DefaultGUI.minimumHeight\">\n      <summary>\n        <para>This height is the minium height the header can have and can only be used if sorting is disabled.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.MultiColumnHeader.DefaultStyles\">\n      <summary>\n        <para>Default styles used by the MultiColumnHeader class.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.MultiColumnHeader.DefaultStyles.background\">\n      <summary>\n        <para>Style used for rendering the background of the header.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.MultiColumnHeader.DefaultStyles.columnHeader\">\n      <summary>\n        <para>Style used for left aligned header text.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.MultiColumnHeader.DefaultStyles.columnHeaderCenterAligned\">\n      <summary>\n        <para>Style used for centered header text.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.MultiColumnHeader.DefaultStyles.columnHeaderRightAligned\">\n      <summary>\n        <para>Style used for right aligned header text.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.GetCellRect(System.Int32,UnityEngine.Rect)\">\n      <summary>\n        <para>Calculates a cell rect for a column and row using the visibleColumnIndex and rowRect parameters.</para>\n      </summary>\n      <param name=\"visibleColumnIndex\"></param>\n      <param name=\"rowRect\"></param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.GetColumn(System.Int32)\">\n      <summary>\n        <para>Returns the column data for a given column index.</para>\n      </summary>\n      <param name=\"columnIndex\">Column index.</param>\n      <returns>\n        <para>Column data.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.GetColumnRect(System.Int32)\">\n      <summary>\n        <para>Returns the header column Rect for a given visible column index.</para>\n      </summary>\n      <param name=\"visibleColumnIndex\">Index of a visible column.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.GetVisibleColumnIndex(System.Int32)\">\n      <summary>\n        <para>Convert from column index to visible column index.</para>\n      </summary>\n      <param name=\"columnIndex\">Column index.</param>\n      <returns>\n        <para>Visible column index.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.MultiColumnHeader.HeaderCallback\">\n      <summary>\n        <para>Delegate used for events from the MultiColumnHeader.</para>\n      </summary>\n      <param name=\"multiColumnHeader\">The MultiColumnHeader that dispatched this event.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.IsColumnVisible(System.Int32)\">\n      <summary>\n        <para>Check if a column is currently visible in the MultiColumnHeader.</para>\n      </summary>\n      <param name=\"columnIndex\">Column index.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.IsSortedAscending(System.Int32)\">\n      <summary>\n        <para>Check the sorting order state for a column.</para>\n      </summary>\n      <param name=\"columnIndex\">Column index.</param>\n      <returns>\n        <para>True if sorted ascending.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.OnGUI(UnityEngine.Rect,System.Single)\">\n      <summary>\n        <para>Render and handle input for the MultiColumnHeader at the given rect.</para>\n      </summary>\n      <param name=\"xScroll\">Horizontal scroll offset.</param>\n      <param name=\"rect\">Rect where the MultiColumnHeader is drawn in.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.OnSortingChanged\">\n      <summary>\n        <para>Called when sorting changes and dispatches the sortingChanged event.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.OnVisibleColumnsChanged\">\n      <summary>\n        <para>Called when the number of visible column changes and dispatches the visibleColumnsChanged event.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.Repaint\">\n      <summary>\n        <para>Requests the window which contains the MultiColumnHeader to repaint.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.ResizeToFit\">\n      <summary>\n        <para>Resizes the column widths of the columns that have auto-resize enabled to make all the columns fit to the width of the MultiColumnHeader render rect.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.SetSortDirection(System.Int32,System.Boolean)\">\n      <summary>\n        <para>Change sort direction for a given column.</para>\n      </summary>\n      <param name=\"columnIndex\">Column index.</param>\n      <param name=\"sortAscending\">Direction of the sorting.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.SetSorting(System.Int32,System.Boolean)\">\n      <summary>\n        <para>Sets the primary sorting column and its sorting order.</para>\n      </summary>\n      <param name=\"columnIndex\">Column to sort.</param>\n      <param name=\"sortAscending\">Sorting order for the column specified.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.SetSortingColumns(System.Int32[],System.Boolean[])\">\n      <summary>\n        <para>Sets multiple sorting columns and the associated sorting orders.</para>\n      </summary>\n      <param name=\"columnIndices\">Column indices of the sorted columns.</param>\n      <param name=\"sortAscending\">Sorting order for the column indices specified.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.SortingButton(UnityEditor.IMGUI.Controls.MultiColumnHeaderState/Column,UnityEngine.Rect,System.Int32)\">\n      <summary>\n        <para>Provides the button logic for a column header and the rendering of the sorting arrow (if visible).</para>\n      </summary>\n      <param name=\"column\">Column data.</param>\n      <param name=\"headerRect\">Column header rect.</param>\n      <param name=\"columnIndex\">Column index.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeader.ToggleVisibility(System.Int32)\">\n      <summary>\n        <para>Method for toggling the visibility of a column.</para>\n      </summary>\n      <param name=\"columnIndex\">Toggle visibility for this column.</param>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.MultiColumnHeaderState\">\n      <summary>\n        <para>State used by the MultiColumnHeader.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.columns\">\n      <summary>\n        <para>The array of column states used by the MultiColumnHeader class.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.maximumNumberOfSortedColumns\">\n      <summary>\n        <para>This property controls the maximum number of columns returned by the sortedColumns property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.sortedColumnIndex\">\n      <summary>\n        <para>This property holds the index to the primary sorted column.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.sortedColumns\">\n      <summary>\n        <para>The array of column indices for multiple column sorting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.visibleColumns\">\n      <summary>\n        <para>This is the array of currently visible column indices.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.widthOfAllVisibleColumns\">\n      <summary>\n        <para>Returns the sum of all the widths of the visible columns in the visibleColumns array.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.CanOverwriteSerializedFields(UnityEditor.IMGUI.Controls.MultiColumnHeaderState,UnityEditor.IMGUI.Controls.MultiColumnHeaderState)\">\n      <summary>\n        <para>Checks if the source state can transfer its serialized data to the destination state.</para>\n      </summary>\n      <param name=\"source\">State that have serialized data to be transfered to the destination state.</param>\n      <param name=\"destination\">Destination state.</param>\n      <returns>\n        <para>Returns true if the source state have the same number of columns as the destination state.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.Column\">\n      <summary>\n        <para>Column state.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.Column.allowToggleVisibility\">\n      <summary>\n        <para>Option to allow/disallow hiding the column from the context menu.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.Column.autoResize\">\n      <summary>\n        <para>Option to allow the column to resize automatically when resizing the entire MultiColumnHeader.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.Column.canSort\">\n      <summary>\n        <para>Is sorting enabled for this column. If false, left-clicking this column header has no effect.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.Column.contextMenuText\">\n      <summary>\n        <para>If this is set then it is used for the context menu for toggling visibility, if not set then the ::headerContent is used.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.Column.headerContent\">\n      <summary>\n        <para>This is the GUIContent that will be rendered in the column header.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.Column.headerTextAlignment\">\n      <summary>\n        <para>Alignment of the header content.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.Column.maxWidth\">\n      <summary>\n        <para>Maximum width of the column.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.Column.minWidth\">\n      <summary>\n        <para>Minimum width of the column.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.Column.sortedAscending\">\n      <summary>\n        <para>Value that controls if this column is sorted ascending or descending.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.Column.sortingArrowAlignment\">\n      <summary>\n        <para>Alignment of the sorting arrow.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.Column.width\">\n      <summary>\n        <para>The width of the column.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.#ctor(UnityEditor.IMGUI.Controls.MultiColumnHeaderState/Column[])\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"columns\">Column data.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.MultiColumnHeaderState.OverwriteSerializedFields(UnityEditor.IMGUI.Controls.MultiColumnHeaderState,UnityEditor.IMGUI.Controls.MultiColumnHeaderState)\">\n      <summary>\n        <para>Overwrites the seralized fields from the source state to the destination state.</para>\n      </summary>\n      <param name=\"source\">State that have serialized data to be transfered to the destination state.</param>\n      <param name=\"destination\">Destination state.</param>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle\">\n      <summary>\n        <para>Base class for a compound handle to edit a bounding volume in the Scene view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.axes\">\n      <summary>\n        <para>Flags specifying which axes should display control handles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.center\">\n      <summary>\n        <para>Returns or specifies the center of the bounding volume for the handle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.handleColor\">\n      <summary>\n        <para>Returns or specifies the color of the control handles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.midpointHandleDrawFunction\">\n      <summary>\n        <para>An optional Handles.CapFunction to use when displaying the control handles. Defaults to Handles.DotHandleCap if no value is specified.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.midpointHandleSizeFunction\">\n      <summary>\n        <para>The Handles.SizeFunction to specify how large the midpoint control handles should be.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.wireframeColor\">\n      <summary>\n        <para>Returns or specifies the color of the wireframe shape.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.Axes\">\n      <summary>\n        <para>A flag enumeration for specifying which axes on a PrimitiveBoundsHandle object should be enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.Axes.All\">\n      <summary>\n        <para>All axes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.Axes.None\">\n      <summary>\n        <para>No axes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.Axes.X\">\n      <summary>\n        <para>X-axis (bit 0).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.Axes.Y\">\n      <summary>\n        <para>Y-axis (bit 1).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.Axes.Z\">\n      <summary>\n        <para>Z-axis (bit 2).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.#ctor\">\n      <summary>\n        <para>Create a new instance of the PrimitiveBoundsHandle class.</para>\n      </summary>\n      <param name=\"controlIDHint\">An integer value used to generate consistent control IDs for each control handle on this instance. Avoid using the same value for all of your PrimitiveBoundsHandle instances.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.#ctor(System.Int32)\">\n      <summary>\n        <para>Create a new instance of the PrimitiveBoundsHandle class.</para>\n      </summary>\n      <param name=\"controlIDHint\">An integer value used to generate consistent control IDs for each control handle on this instance. Avoid using the same value for all of your PrimitiveBoundsHandle instances.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.DefaultMidpointHandleSizeFunction(UnityEngine.Vector3)\">\n      <summary>\n        <para>A Handles.SizeFunction that returns a fixed screen-space size.</para>\n      </summary>\n      <param name=\"position\">The current position of the handle in the space of Handles.matrix.</param>\n      <returns>\n        <para>The size to use for a handle at the specified position.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.DrawHandle\">\n      <summary>\n        <para>A function to display this instance in the current handle camera using its current configuration.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.DrawWireframe\">\n      <summary>\n        <para>Draw a wireframe shape for this instance. Subclasses must implement this method.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.GetSize\">\n      <summary>\n        <para>Gets the current size of the bounding volume for this instance.</para>\n      </summary>\n      <returns>\n        <para>The current size of the bounding volume for this instance.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.HandleDirection\">\n      <summary>\n        <para>An enumeration of directions the handle moves in.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.HandleDirection.NegativeX\">\n      <summary>\n        <para>This value corresponds to the handle moving in a negative direction away from PrimitiveBoundsHandle.center along the x-axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.HandleDirection.NegativeY\">\n      <summary>\n        <para>This value corresponds to the handle moving in a negative direction away from PrimitiveBoundsHandle.center along the y-axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.HandleDirection.NegativeZ\">\n      <summary>\n        <para>This value corresponds to the handle moving in a negative direction away from PrimitiveBoundsHandle.center along the z-axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.HandleDirection.PositiveX\">\n      <summary>\n        <para>This value corresponds to the handle moving in a positive direction away from PrimitiveBoundsHandle.center along the x-axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.HandleDirection.PositiveY\">\n      <summary>\n        <para>This value corresponds to the handle moving in a positive direction away from PrimitiveBoundsHandle.center along the y-axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.HandleDirection.PositiveZ\">\n      <summary>\n        <para>This value corresponds to the handle moving in a positive direction away from PrimitiveBoundsHandle.center along the z-axis.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.IsAxisEnabled(UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle/Axes)\">\n      <summary>\n        <para>Gets a value indicating whether the specified axis is enabled for the current instance.</para>\n      </summary>\n      <param name=\"axis\">An Axes.</param>\n      <param name=\"vector3Axis\">An integer corresponding to an axis on a Vector3. For example, 0 is x, 1 is y, and 2 is z.</param>\n      <returns>\n        <para>true if the specified axis is enabled; otherwise, false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.IsAxisEnabled(System.Int32)\">\n      <summary>\n        <para>Gets a value indicating whether the specified axis is enabled for the current instance.</para>\n      </summary>\n      <param name=\"axis\">An Axes.</param>\n      <param name=\"vector3Axis\">An integer corresponding to an axis on a Vector3. For example, 0 is x, 1 is y, and 2 is z.</param>\n      <returns>\n        <para>true if the specified axis is enabled; otherwise, false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.OnHandleChanged(UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle/HandleDirection,UnityEngine.Bounds,UnityEngine.Bounds)\">\n      <summary>\n        <para>A callback for when a control handle was dragged in the scene.</para>\n      </summary>\n      <param name=\"handle\">The handle that was dragged.</param>\n      <param name=\"boundsOnClick\">The raw Bounds for this instance's volume at the time the control handle was clicked.</param>\n      <param name=\"newBounds\">The raw Bounds for this instance's volume based on the updated handle position.</param>\n      <returns>\n        <para>The bounds that should be applied to this instance, with any necessary modifications applied.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.SetColor(UnityEngine.Color)\">\n      <summary>\n        <para>Sets handleColor and wireframeColor to the same value.</para>\n      </summary>\n      <param name=\"color\">The color to use for the control handles and the wireframe shape.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle.SetSize(UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the current size of the bounding volume for this instance.</para>\n      </summary>\n      <param name=\"size\">A Vector3 specifying how large the bounding volume is along all of its axes.</param>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.SearchField\">\n      <summary>\n        <para>The SearchField control creates a text field for a user to input text that can be used for searching.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.SearchField.autoSetFocusOnFindCommand\">\n      <summary>\n        <para>Changes the keyboard focus to the search field when the user presses ‘Ctrl/Cmd + F’ when set to true. It is true by default.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.IMGUI.Controls.SearchField.downOrUpArrowKeyPressed(UnityEditor.IMGUI.Controls.SearchField/SearchFieldCallback)\">\n      <summary>\n        <para>This event is dispatched when the focused search field detects that the down or up key is pressed and can be used to change keyboard focus to another control, such as the TreeView.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.SearchField.searchFieldControlID\">\n      <summary>\n        <para>This is the controlID used for the text field to obtain keyboard focus.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.SearchField.HasFocus\">\n      <summary>\n        <para>This function returns true if the search field has keyboard focus.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.SearchField.OnGUI(System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>This function displays the search field with the default UI style and uses the GUILayout class to automatically calculate the position and size of the Rect it is rendered to. Pass an optional list to specify extra layout properties.</para>\n      </summary>\n      <param name=\"text\">Text string to display in the search field.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. &lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The text entered in the search field. The original input string is returned instead if the search field text was not changed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.SearchField.OnGUI(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>This function displays the search field with the default UI style in the given Rect.</para>\n      </summary>\n      <param name=\"rect\">Rectangle to use for the search field.</param>\n      <param name=\"text\">Text string to display in the search field.</param>\n      <returns>\n        <para>The text entered in the search field. The original input string is returned instead if the search field text was not changed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.SearchField.OnGUI(UnityEngine.Rect,System.String,UnityEngine.GUIStyle,UnityEngine.GUIStyle,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>This function displays a search text field with the given Rect and UI style parameters.</para>\n      </summary>\n      <param name=\"rect\">Rectangle to use for the search field.</param>\n      <param name=\"text\">Text string to display in the search field.</param>\n      <param name=\"style\">The text field style.</param>\n      <param name=\"cancelButtonStyle\">The cancel button style used when there is text in the search field.</param>\n      <param name=\"emptyCancelButtonStyle\">The cancel button style used when there is no text in the search field.</param>\n      <returns>\n        <para>The text entered in the SearchField. The original input string is returned instead if the search field text was not changed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.SearchField.OnToolbarGUI(System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>This function displays the search field with the toolbar UI style and uses the GUILayout class to automatically calculate the position and size of the Rect it is rendered to. Pass an optional list to specify extra layout properties.</para>\n      </summary>\n      <param name=\"text\">Text string to display in the search field.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layout properties. &lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The text entered in the search field. The original input string is returned instead if the search field text was not changed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.SearchField.OnToolbarGUI(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>This function displays the search field with a toolbar style in the given Rect.</para>\n      </summary>\n      <param name=\"rect\">Rectangle to use for the search field.</param>\n      <param name=\"text\">Text string to display in the search field.</param>\n      <returns>\n        <para>The text entered in the search field. The original input string is returned instead if the search field text was not changed.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.SearchField.SearchFieldCallback\">\n      <summary>\n        <para>This is a generic callback delegate for SearchField events and does not take any parameters.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.SearchField.SetFocus\">\n      <summary>\n        <para>This function changes keyboard focus to the search field so a user can start typing.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.SphereBoundsHandle\">\n      <summary>\n        <para>A compound handle to edit a sphere-shaped bounding volume in the Scene view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.SphereBoundsHandle.radius\">\n      <summary>\n        <para>Returns or specifies the radius of the capsule bounding volume.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.SphereBoundsHandle.#ctor\">\n      <summary>\n        <para>Create a new instance of the SphereBoundsHandle class.</para>\n      </summary>\n      <param name=\"controlIDHint\">An integer value used to generate consistent control IDs for each control handle on this instance. Avoid using the same value for all of your SphereBoundsHandle instances.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.SphereBoundsHandle.#ctor(System.Int32)\">\n      <summary>\n        <para>Create a new instance of the SphereBoundsHandle class.</para>\n      </summary>\n      <param name=\"controlIDHint\">An integer value used to generate consistent control IDs for each control handle on this instance. Avoid using the same value for all of your SphereBoundsHandle instances.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.SphereBoundsHandle.DrawWireframe\">\n      <summary>\n        <para>Draw a wireframe sphere for this instance.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.SphereBoundsHandle.OnHandleChanged(UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle/HandleDirection,UnityEngine.Bounds,UnityEngine.Bounds)\">\n      <summary>\n        <para>A callback for when a control handle was dragged in the scene.</para>\n      </summary>\n      <param name=\"handle\">The handle that was dragged.</param>\n      <param name=\"boundsOnClick\">The raw Bounds for this instance's volume at the time the control handle was clicked.</param>\n      <param name=\"newBounds\">The raw Bounds for this instance's volume based on the updated handle position.</param>\n      <returns>\n        <para>The bounds that should be applied to this instance, with any necessary modifications applied.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.TreeView\">\n      <summary>\n        <para>The TreeView is an IMGUI control that lets you create tree views, list views and multi-column tables for Editor tools.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.baseIndent\">\n      <summary>\n        <para>Indent used for all rows before the tree foldout arrows and content.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.cellMargin\">\n      <summary>\n        <para>When using a MultiColumnHeader this value adjusts the cell rects provided for all columns except the tree foldout column.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.columnIndexForTreeFoldouts\">\n      <summary>\n        <para>When using a MultiColumnHeader this value should be set to the column index in which the foldout arrows should appear.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.customFoldoutYOffset\">\n      <summary>\n        <para>Custom vertical offset of the foldout arrow.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.depthIndentWidth\">\n      <summary>\n        <para>Value that returns how far the foldouts are indented for each increasing depth value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.extraSpaceBeforeIconAndLabel\">\n      <summary>\n        <para>Value to control the spacing before the default icon and label. Can be used e.g for placing a toggle button to the left of the content.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.foldoutWidth\">\n      <summary>\n        <para>Width of the built-in foldout arrow.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.getNewSelectionOverride\">\n      <summary>\n        <para>Register a callback to this field to override how the TreeView handles selection changes in response to keys and mouse clicks.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.hasSearch\">\n      <summary>\n        <para>The current search state of the TreeView.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.isDragging\">\n      <summary>\n        <para>True if the user is currently dragging one or more items in the TreeView, and false otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.isInitialized\">\n      <summary>\n        <para>The TreeView is initialized by calling Reload(). Therefore returns false until Reload() is called the first time.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.multiColumnHeader\">\n      <summary>\n        <para>Get the MultiColumnHeader of the TreeView. Can be null if the TreeView was created without a MultiColumnHeader.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.rootItem\">\n      <summary>\n        <para>The hidden root item of the TreeView (it is never rendered).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.rowHeight\">\n      <summary>\n        <para>The fixed height used for each row in the TreeView if GetCustomRowHeight have not been overridden.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.searchString\">\n      <summary>\n        <para>Current search string of the TreeView.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.showAlternatingRowBackgrounds\">\n      <summary>\n        <para>Enable this to show alternating row background colors.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.showBorder\">\n      <summary>\n        <para>Enable this to show a border around the TreeView.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.showingHorizontalScrollBar\">\n      <summary>\n        <para>Returns true if the horizontal scroll bar is showing, otherwise false.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.showingVerticalScrollBar\">\n      <summary>\n        <para>Returns true if the vertical scroll bar is showing, otherwise false.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.state\">\n      <summary>\n        <para>The state of the TreeView (expanded state, selection, scroll etc.)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.totalHeight\">\n      <summary>\n        <para>Returns the sum of the TreeView row heights, the MultiColumnHeader height (if used) and the border (if used).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.treeViewControlID\">\n      <summary>\n        <para>The controlID used by the TreeView to obtain keyboard control focus.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.treeViewRect\">\n      <summary>\n        <para>The Rect the TreeView is being rendered to.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeView.useScrollView\">\n      <summary>\n        <para>When drawing the TreeView contents, will it be enclosed within a ScrollView?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.AddExpandedRows(UnityEditor.IMGUI.Controls.TreeViewItem,System.Collections.Generic.IList`1&lt;UnityEditor.IMGUI.Controls.TreeViewItem&gt;)\">\n      <summary>\n        <para>Adds the expanded rows of the full tree to the input list. Only use this method if a full tree was built in BuildRoot.</para>\n      </summary>\n      <param name=\"root\">Root of the TreeView.</param>\n      <param name=\"rows\">Rows that will be refilled using the expanded state of TreeView.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.AfterRowsGUI\">\n      <summary>\n        <para>This is called after all rows have their RowGUI called.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.BeforeRowsGUI\">\n      <summary>\n        <para>This is called before any rows have their RowGUI called.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.BeginRename(UnityEditor.IMGUI.Controls.TreeViewItem)\">\n      <summary>\n        <para>Shows the rename overlay for a TreeViewItem.</para>\n      </summary>\n      <param name=\"item\">Item to rename.</param>\n      <param name=\"delay\">Delay in seconds until the rename overlay shows.</param>\n      <returns>\n        <para>Returns true if renaming was started. Returns false if renaming was already active.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.BeginRename(UnityEditor.IMGUI.Controls.TreeViewItem,System.Single)\">\n      <summary>\n        <para>Shows the rename overlay for a TreeViewItem.</para>\n      </summary>\n      <param name=\"item\">Item to rename.</param>\n      <param name=\"delay\">Delay in seconds until the rename overlay shows.</param>\n      <returns>\n        <para>Returns true if renaming was started. Returns false if renaming was already active.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.BuildRoot\">\n      <summary>\n        <para>Abstract method that is required to be implemented. By default this method should create the full tree of TreeViewItems and return the root.</para>\n      </summary>\n      <returns>\n        <para>The root of the tree. This item can later be accessed by 'rootItem'.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.BuildRows(UnityEditor.IMGUI.Controls.TreeViewItem)\">\n      <summary>\n        <para>Override this method to take control of how the rows are generated.</para>\n      </summary>\n      <param name=\"root\">Root item that was created in the BuildRoot method.</param>\n      <returns>\n        <para>The rows list shown in the TreeView. Can later be accessed using GetRows().</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.CanBeParent(UnityEditor.IMGUI.Controls.TreeViewItem)\">\n      <summary>\n        <para>Override this method to control which items are allowed to be parents.</para>\n      </summary>\n      <param name=\"item\">Can this item be a parent?</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.CanChangeExpandedState(UnityEditor.IMGUI.Controls.TreeViewItem)\">\n      <summary>\n        <para>Override this method to control whether an item can be expanded or collapsed by key or mouse.</para>\n      </summary>\n      <param name=\"item\">Can this item be expanded/collapsed.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.CanMultiSelect(UnityEditor.IMGUI.Controls.TreeViewItem)\">\n      <summary>\n        <para>Override this method to control whether the item can be part of a multiselection.</para>\n      </summary>\n      <param name=\"item\">Can this item be part of a multiselection.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.CanRename(UnityEditor.IMGUI.Controls.TreeViewItem)\">\n      <summary>\n        <para>Override this method to control whether the item can be renamed using a keyboard shortcut or when clicking an already selected item.</para>\n      </summary>\n      <param name=\"item\">Can this item be renamed?</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.CanStartDrag(UnityEditor.IMGUI.Controls.TreeView/CanStartDragArgs)\">\n      <summary>\n        <para>This function is called whenever a TreeViewItem is clicked and dragged. It returns false by default.</para>\n      </summary>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.TreeView.CanStartDragArgs\">\n      <summary>\n        <para>Method arguments for the CanStartDrag virtual method.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.CanStartDragArgs.draggedItem\">\n      <summary>\n        <para>Item about to be dragged.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.CanStartDragArgs.draggedItemIDs\">\n      <summary>\n        <para>The multi-selection about to be dragged.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.CenterRectUsingSingleLineHeight(UnityEngine.Rect&amp;)\">\n      <summary>\n        <para>Modifies the input rect so it is centered and have a height equal to EditorGUIUtility.singleLineHeight.</para>\n      </summary>\n      <param name=\"rect\">Rect to be modified and centered.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.CollapseAll\">\n      <summary>\n        <para>Collapse all expanded items in the TreeView.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.CommandEventHandling\">\n      <summary>\n        <para>This function is called automatically and handles the ExecuteCommand events for “SelectAll” and “FrameSelection”. Override this function to extend or avoid Command events.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.ContextClicked\">\n      <summary>\n        <para>Override this method to handle context clicks outside any items (but still in the TreeView rect).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.ContextClickedItem(System.Int32)\">\n      <summary>\n        <para>Override this method to handle a context click on an item with ID TreeViewItem.id.</para>\n      </summary>\n      <param name=\"id\">TreeViewItem id.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.CreateChildListForCollapsedParent\">\n      <summary>\n        <para>Creates a dummy TreeViewItem list. Useful when overriding BuildRows to prevent building a full tree of items.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.#ctor(UnityEditor.IMGUI.Controls.TreeViewState)\">\n      <summary>\n        <para>The TreeView is always constructed with a state object and optionally a multi-column header object if a header is needed.</para>\n      </summary>\n      <param name=\"state\">TreeView state (expanded items, selection etc.)</param>\n      <param name=\"multiColumnHeader\">Multi-column header for the TreeView.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.#ctor(UnityEditor.IMGUI.Controls.TreeViewState,UnityEditor.IMGUI.Controls.MultiColumnHeader)\">\n      <summary>\n        <para>The TreeView is always constructed with a state object and optionally a multi-column header object if a header is needed.</para>\n      </summary>\n      <param name=\"state\">TreeView state (expanded items, selection etc.)</param>\n      <param name=\"multiColumnHeader\">Multi-column header for the TreeView.</param>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.TreeView.DefaultGUI\">\n      <summary>\n        <para>Default GUI methods and properties for the TreeView class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.DefaultGUI.BoldLabel(UnityEngine.Rect,System.String,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Draws a bold label that have correct text color when selected and/or focused.</para>\n      </summary>\n      <param name=\"rect\">Rect to render the text in.</param>\n      <param name=\"label\">Label to render.</param>\n      <param name=\"selected\">Selected state used for determining text color.</param>\n      <param name=\"focused\">Focused state used for determining text color.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.DefaultGUI.BoldLabelRightAligned(UnityEngine.Rect,System.String,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Draws a bold right aligned label that have correct text color when selected and/or focused.</para>\n      </summary>\n      <param name=\"rect\">Rect to render the text in.</param>\n      <param name=\"label\">Label to render.</param>\n      <param name=\"selected\">Selected state used for determining text color.</param>\n      <param name=\"focused\">Focused state used for determining text color.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.DefaultGUI.FoldoutLabel(UnityEngine.Rect,System.String,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Draws a foldout label that have correct text color when selected and/or focused.</para>\n      </summary>\n      <param name=\"rect\">Rect to render the text in.</param>\n      <param name=\"label\">Label to render.</param>\n      <param name=\"selected\">Selected state used for determining text color.</param>\n      <param name=\"focused\">Focused state used for determining text color.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.DefaultGUI.Label(UnityEngine.Rect,System.String,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Draws a label that have correct text color when selected and/or focused.</para>\n      </summary>\n      <param name=\"rect\">Rect to render the text in.</param>\n      <param name=\"label\">Label to render.</param>\n      <param name=\"selected\">Selected state used for determining text color.</param>\n      <param name=\"focused\">Focused state used for determining text color.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.DefaultGUI.LabelRightAligned(UnityEngine.Rect,System.String,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Draws a right aligned label that have correct text color when selected and/or focused.</para>\n      </summary>\n      <param name=\"rect\">Rect to render the text in.</param>\n      <param name=\"label\">Label to render.</param>\n      <param name=\"selected\">Selected state used for determining text color.</param>\n      <param name=\"focused\">Focused state used for determining text color.</param>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.TreeView.DefaultStyles\">\n      <summary>\n        <para>Default styles used by the TreeView class.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.DefaultStyles.backgroundEven\">\n      <summary>\n        <para>Background style used for alternating row background colors when enabling TreeView.showAlternatingRowBackgrounds.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.DefaultStyles.backgroundOdd\">\n      <summary>\n        <para>Background style used for alternating row background colors when enabling TreeView.showAlternatingRowBackgrounds.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.DefaultStyles.boldLabel\">\n      <summary>\n        <para>Bold label with alternative text color when selected and/or focused.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.DefaultStyles.boldLabelRightAligned\">\n      <summary>\n        <para>Right aligned bold label with alternative text color when selected and/or focused.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.DefaultStyles.foldoutLabel\">\n      <summary>\n        <para>The label that is used for foldout label with alternative text color when selected and/or focused.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.DefaultStyles.label\">\n      <summary>\n        <para>Left aligned label with alternative text color when selected and/or focused.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.DefaultStyles.labelRightAligned\">\n      <summary>\n        <para>Right aligend label with alternative text color when selected and/or focused.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.DoesItemMatchSearch(UnityEditor.IMGUI.Controls.TreeViewItem,System.String)\">\n      <summary>\n        <para>Override this function to extend or change the search behavior.</para>\n      </summary>\n      <param name=\"item\">Item used for matching against the search string.</param>\n      <param name=\"search\">The search string of the TreeView.</param>\n      <returns>\n        <para>True if item matches search string, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.DoubleClickedItem(System.Int32)\">\n      <summary>\n        <para>Override this method to handle double click events on an item.</para>\n      </summary>\n      <param name=\"id\">ID of TreeViewItem that was double clicked.</param>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.TreeView.DragAndDropArgs\">\n      <summary>\n        <para>Method arguments for the HandleDragAndDrop virtual method.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.DragAndDropArgs.dragAndDropPosition\">\n      <summary>\n        <para>When dragging items the current drag can have the following 3 positions relative to the items: Upon an item, Between two items or Outside items.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.DragAndDropArgs.insertAtIndex\">\n      <summary>\n        <para>This index refers to the index in the children list of the parentItem where the current drag is positioned.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.DragAndDropArgs.parentItem\">\n      <summary>\n        <para>The parent item is set if the drag is either upon this item or between two of its children.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.DragAndDropArgs.performDrop\">\n      <summary>\n        <para>This value is false as long as the mouse button is down, when the mouse button is released it is true.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.TreeView.DragAndDropPosition\">\n      <summary>\n        <para>Enum describing the possible positions a drag can have relative to the items: upon a item, between two items or outside items.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.DragAndDropPosition.BetweenItems\">\n      <summary>\n        <para>This value is used when dragging between two items.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.DragAndDropPosition.OutsideItems\">\n      <summary>\n        <para>This value is used when dragging outside all items.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.DragAndDropPosition.UponItem\">\n      <summary>\n        <para>This value is used when the drag is upon a item.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.EndRename\">\n      <summary>\n        <para>Ends renaming if the rename overlay is shown. If called while the rename overlay is not being shown, this method does nothing.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.ExpandAll\">\n      <summary>\n        <para>Expand all collapsed items in the TreeView.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.ExpandedStateChanged\">\n      <summary>\n        <para>Override to get notified when items are expanded or collapsed. This is a general notification that the expanded state has changed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.FindItem(System.Int32,UnityEditor.IMGUI.Controls.TreeViewItem)\">\n      <summary>\n        <para>Finds a TreeViewItem by an ID.</para>\n      </summary>\n      <param name=\"id\">Find the TreeViewItem with this ID.</param>\n      <param name=\"searchFromThisItem\">Sets the search to start from an item. Use 'rootItem' to search the entire tree.</param>\n      <returns>\n        <para>This search method returns the TreeViewItem found and returns null if not found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.FindRows(System.Collections.Generic.IList`1&lt;System.Int32&gt;)\">\n      <summary>\n        <para>Useful for converting from TreeViewItem IDs to TreeViewItems using the current rows.</para>\n      </summary>\n      <param name=\"ids\">TreeViewItem IDs.</param>\n      <returns>\n        <para>TreeViewItems.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.FrameItem(System.Int32)\">\n      <summary>\n        <para>This will reveal the item with ID id (by expanding the ancestors of that item) and will make sure it is visible in the ScrollView.</para>\n      </summary>\n      <param name=\"id\">TreeViewItem ID.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.GetAncestors(System.Int32)\">\n      <summary>\n        <para>This method is e.g. used for revealing items that are currently under a collapsed item.</para>\n      </summary>\n      <param name=\"id\">TreeViewItem ID.</param>\n      <returns>\n        <para>List of all the ancestors of a given item with ID id.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.GetCellRectForTreeFoldouts(UnityEngine.Rect)\">\n      <summary>\n        <para>Utility for multi column setups. This method will clip the input rowRect against the column rect defined by columnIndexForTreeFoldouts to get the cell rect where the the foldout arrows appear.</para>\n      </summary>\n      <param name=\"rowRect\">Rect for a row.</param>\n      <returns>\n        <para>Cell rect in a multi column setup.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.GetContentIndent(UnityEditor.IMGUI.Controls.TreeViewItem)\">\n      <summary>\n        <para>Returns the horizontal content offset for an item. This is where the content should begin (after the foldout arrow).</para>\n      </summary>\n      <param name=\"item\">Item used to determine the indent.</param>\n      <returns>\n        <para>Indent.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.GetCustomRowHeight(System.Int32,UnityEditor.IMGUI.Controls.TreeViewItem)\">\n      <summary>\n        <para>Override to control individual row heights.</para>\n      </summary>\n      <param name=\"row\">Row index.</param>\n      <param name=\"item\">Item for given row.</param>\n      <returns>\n        <para>Height of row.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.GetDescendantsThatHaveChildren(System.Int32)\">\n      <summary>\n        <para>Returns all descendants for the item with ID id that have children.</para>\n      </summary>\n      <param name=\"id\">TreeViewItem ID.</param>\n      <returns>\n        <para>Descendants that have children.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.GetExpanded\">\n      <summary>\n        <para>Returns a list of TreeViewItem IDs that are currently expanded in the TreeView.</para>\n      </summary>\n      <returns>\n        <para>TreeViewItem IDs.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.GetFirstAndLastVisibleRows(System.Int32&amp;,System.Int32&amp;)\">\n      <summary>\n        <para>Returns the first and the last indices of the rows that are visible in the scroll view of the TreeView.</para>\n      </summary>\n      <param name=\"firstRowVisible\">First row visible.</param>\n      <param name=\"lastRowVisible\">Last row visible.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.GetFoldoutIndent(UnityEditor.IMGUI.Controls.TreeViewItem)\">\n      <summary>\n        <para>Returns the horizontal foldout offset for an item. This is where the foldout arrow is rendered.</para>\n      </summary>\n      <param name=\"item\">Item used to determine the indent.</param>\n      <returns>\n        <para>Indent for the foldout arrow.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.TreeView.GetNewSelectionFunction\">\n      <summary>\n        <para>A callback which determines how TreeView handles selection changes in response to keys and mouse clicks.</para>\n      </summary>\n      <param name=\"clickedItem\">The item clicked, or selected via keyboard.</param>\n      <param name=\"keepMultiSelection\">Should existing selection be kept? This is used to support dragging or right-clicking one item in a multi-selection.</param>\n      <param name=\"useShiftAsActionKey\">Should the action key be treated like the shift key? If so, the action key also indicates a range selection.</param>\n      <param name=\"useActionKeyAsShift\"></param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.GetRenameRect(UnityEngine.Rect,System.Int32,UnityEditor.IMGUI.Controls.TreeViewItem)\">\n      <summary>\n        <para>Override this method if custom GUI handling are used in RowGUI. This method for controls where the rename overlay appears.</para>\n      </summary>\n      <param name=\"rowRect\">Row rect for the item currently being renamed.</param>\n      <param name=\"row\">Row index for the item currently being renamed.</param>\n      <param name=\"item\">TreeViewItem that are currently being renamed.</param>\n      <returns>\n        <para>The rect where the rename overlay should appear.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.GetRowRect(System.Int32)\">\n      <summary>\n        <para>Get the rect for a row.</para>\n      </summary>\n      <param name=\"row\">Row index.</param>\n      <returns>\n        <para>Row rect.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.GetRows\">\n      <summary>\n        <para>This is the list of TreeViewItems that have been built in BuildRows.</para>\n      </summary>\n      <returns>\n        <para>Rows.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.GetSelection\">\n      <summary>\n        <para>Returns the list of TreeViewItem IDs that are currently selected.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.HandleDragAndDrop(UnityEditor.IMGUI.Controls.TreeView/DragAndDropArgs)\">\n      <summary>\n        <para>Override this function to control the drag and drop behavior of the TreeView.</para>\n      </summary>\n      <param name=\"args\">Drag and drop arguments.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.HasFocus\">\n      <summary>\n        <para>Returns true if the TreeView and its EditorWindow have keyboard focus.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.HasSelection\">\n      <summary>\n        <para>Returns true if the TreeView has a selection.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.IsChildListForACollapsedParent(System.Collections.Generic.IList`1&lt;UnityEditor.IMGUI.Controls.TreeViewItem&gt;)\">\n      <summary>\n        <para>Utility method for checking if the childList is identical to the one returned by the CreateChildListForCollapsedParent method.</para>\n      </summary>\n      <param name=\"childList\">Children list of a TreeViewItem.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.IsExpanded(System.Int32)\">\n      <summary>\n        <para>Returns true if the TreeViewItem with ID id is currently expanded.</para>\n      </summary>\n      <param name=\"id\">TreeViewItem ID.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.IsSelected(System.Int32)\">\n      <summary>\n        <para>Returns true if the TreeViewItem with ID id is currently selected.</para>\n      </summary>\n      <param name=\"id\">TreeViewItem ID.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.KeyEvent\">\n      <summary>\n        <para>Override this method to handle events when the TreeView has keyboard focus.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.OnGUI(UnityEngine.Rect)\">\n      <summary>\n        <para>This is the main GUI method of the TreeView, where the TreeViewItems are processed and drawn.</para>\n      </summary>\n      <param name=\"rect\">Rect where the TreeView is rendered.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.RefreshCustomRowHeights\">\n      <summary>\n        <para>Refreshes the cache of custom row rects based on the heights returned by GetCustomRowHeight.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.Reload\">\n      <summary>\n        <para>Call this to force the TreeView to reload its data. This in turn causes BuildRoot and BuildRows to be called.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.RenameEnded(UnityEditor.IMGUI.Controls.TreeView/RenameEndedArgs)\">\n      <summary>\n        <para>Called when rename ends either by the user completing the renaming process, when the rename overlay loses focus or is closed using  EndRename.</para>\n      </summary>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.TreeView.RenameEndedArgs\">\n      <summary>\n        <para>Method arguments for the virtual method RenameEnded.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.RenameEndedArgs.acceptedRename\">\n      <summary>\n        <para>Is true if the rename is accepted.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.RenameEndedArgs.itemID\">\n      <summary>\n        <para>Item with ID that are being renamed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.RenameEndedArgs.newName\">\n      <summary>\n        <para>Name entered in the rename overlay.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.RenameEndedArgs.originalName\">\n      <summary>\n        <para>The original name when starting the rename.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.Repaint\">\n      <summary>\n        <para>Request a repaint of the window that the TreeView is rendered in.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.RowGUI(UnityEditor.IMGUI.Controls.TreeView/RowGUIArgs)\">\n      <summary>\n        <para>Override this method to add custom GUI content for the rows in the TreeView.</para>\n      </summary>\n      <param name=\"args\">Row data.</param>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.TreeView.RowGUIArgs\">\n      <summary>\n        <para>Method arguments for the virtual method RowGUI.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.RowGUIArgs.focused\">\n      <summary>\n        <para>This value is true only when the TreeView has keyboard focus and the TreeView's window has focus.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.RowGUIArgs.isRenaming\">\n      <summary>\n        <para>This value is true when the ::item is currently being renamed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.RowGUIArgs.item\">\n      <summary>\n        <para>Item for the current row being handled in TreeView.RowGUI.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.RowGUIArgs.label\">\n      <summary>\n        <para>Label used for text rendering of the item displayName. Note this is an empty string when isRenaming == true.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.RowGUIArgs.row\">\n      <summary>\n        <para>Row index into the list of current rows.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.RowGUIArgs.rowRect\">\n      <summary>\n        <para>Row rect for the current row being handled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.RowGUIArgs.selected\">\n      <summary>\n        <para>This value is true when the current row's item is part of the current selection.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.RowGUIArgs.GetCellRect(System.Int32)\">\n      <summary>\n        <para>If using a MultiColumnHeader for the TreeView this method can be used to get the cell rects of a row using the visible columns of the MultiColumnHeader.</para>\n      </summary>\n      <param name=\"visibleColumnIndex\">Index into the list of visible columns of the multi column header.</param>\n      <returns>\n        <para>Cell rect defined by the intersection between the row rect and the rect of the visible column.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.RowGUIArgs.GetColumn(System.Int32)\">\n      <summary>\n        <para>If using a MultiColumnHeader for the TreeView this method can be used to convert an index from the visible columns list to a index into the actual columns in the MultiColumnHeaderState.</para>\n      </summary>\n      <param name=\"visibleColumnIndex\">This index is the index into the current visible columns.</param>\n      <returns>\n        <para>Column index into the columns array in MultiColumnHeaderState.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.RowGUIArgs.GetNumVisibleColumns\">\n      <summary>\n        <para>If using a MultiColumnHeader for the TreeView use this method to get the number of visible columns currently being shown in the MultiColumnHeader.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.SearchChanged(System.String)\">\n      <summary>\n        <para>Override the method to get notified of search string changes.</para>\n      </summary>\n      <param name=\"newSearch\"></param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.SelectAllRows\">\n      <summary>\n        <para>Selects all rows in the TreeView.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.SelectionChanged(System.Collections.Generic.IList`1&lt;System.Int32&gt;)\">\n      <summary>\n        <para>Override the method to get notified of selection changes.</para>\n      </summary>\n      <param name=\"selectedIds\">TreeViewItem IDs.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.SelectionClick(UnityEditor.IMGUI.Controls.TreeViewItem,System.Boolean)\">\n      <summary>\n        <para>Use this method in RowGUI to peform the logic of a mouse click.</para>\n      </summary>\n      <param name=\"item\">TreeViewItem clicked.</param>\n      <param name=\"keepMultiSelection\">If true then keeps the multiselection when clicking on a item already part of the selection. If false then clears the selection before selecting the item clicked. For left button clicks this is usually false. For context clicks it is usually true so a context opereration can operate on the multiselection.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.SetExpanded(System.Int32,System.Boolean)\">\n      <summary>\n        <para>Set a single TreeViewItem to be expanded or collapsed.</para>\n      </summary>\n      <param name=\"id\">TreeViewItem ID.</param>\n      <param name=\"expanded\">True expands item. False collapses item.</param>\n      <returns>\n        <para>True if item changed expanded state, false if item already had the expanded state.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.SetExpanded(System.Collections.Generic.IList`1&lt;System.Int32&gt;)\">\n      <summary>\n        <para>Set the current expanded TreeViewItems of the TreeView. This will overwrite the previous expanded state.</para>\n      </summary>\n      <param name=\"ids\">List of item IDs that should be expanded.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.SetExpandedRecursive(System.Int32,System.Boolean)\">\n      <summary>\n        <para>Expand or collapse all items under item with id.</para>\n      </summary>\n      <param name=\"id\">TreeViewItem ID.</param>\n      <param name=\"expanded\">Expanded state: true expands, false collapses.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.SetFocus\">\n      <summary>\n        <para>Calling this function changes the keyboard focus to the TreeView.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.SetFocusAndEnsureSelectedItem\">\n      <summary>\n        <para>Calling this function changes the keyboard focus to the TreeView and ensures an item is selected. Use this function to enable key navigation of the TreeView.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.SetSelection(System.Collections.Generic.IList`1&lt;System.Int32&gt;)\">\n      <summary>\n        <para>Set the selected items of the TreeView.</para>\n      </summary>\n      <param name=\"selectedIDs\">TreeViewItem IDs.</param>\n      <param name=\"options\">Options for extra logic performed after the selection. See TreeViewSelectionOptions.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.SetSelection(System.Collections.Generic.IList`1&lt;System.Int32&gt;,UnityEditor.IMGUI.Controls.TreeViewSelectionOptions)\">\n      <summary>\n        <para>Set the selected items of the TreeView.</para>\n      </summary>\n      <param name=\"selectedIDs\">TreeViewItem IDs.</param>\n      <param name=\"options\">Options for extra logic performed after the selection. See TreeViewSelectionOptions.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.SetupDepthsFromParentsAndChildren(UnityEditor.IMGUI.Controls.TreeViewItem)\">\n      <summary>\n        <para>Utility method using the depth of the input TreeViewItem to set the correct depths for all its descendant TreeViewItems.</para>\n      </summary>\n      <param name=\"root\">TreeViewItem from which the descendentans should have their depth updated.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.SetupDragAndDrop(UnityEditor.IMGUI.Controls.TreeView/SetupDragAndDropArgs)\">\n      <summary>\n        <para>This function is called when CanStartDrag returns true.</para>\n      </summary>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.TreeView.SetupDragAndDropArgs\">\n      <summary>\n        <para>Method arguments to the virtual method SetupDragAndDrop.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeView.SetupDragAndDropArgs.draggedItemIDs\">\n      <summary>\n        <para>TreeViewItem IDs being dragged.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.SetupParentsAndChildrenFromDepths(UnityEditor.IMGUI.Controls.TreeViewItem,System.Collections.Generic.IList`1&lt;UnityEditor.IMGUI.Controls.TreeViewItem&gt;)\">\n      <summary>\n        <para>Utility method for initializing all the parent and children properties of the rows using the order and the depths values that have been set.</para>\n      </summary>\n      <param name=\"root\">The hidden root item.</param>\n      <param name=\"rows\">TreeViewItems where only the depth property have been set.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.SingleClickedItem(System.Int32)\">\n      <summary>\n        <para>Override this method to handle single click events on an item.</para>\n      </summary>\n      <param name=\"id\">ID of TreeViewItem that was single clicked.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeView.SortItemIDsInRowOrder(System.Collections.Generic.IList`1&lt;System.Int32&gt;)\">\n      <summary>\n        <para>Returns a list sorted in the order in which they are shown in the TreeView.</para>\n      </summary>\n      <param name=\"ids\">TreeViewItem IDs.</param>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.TreeViewItem\">\n      <summary>\n        <para>The TreeViewItem is used to build the tree representation of a tree data structure.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeViewItem.children\">\n      <summary>\n        <para>The list of child items of this TreeViewItem.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeViewItem.depth\">\n      <summary>\n        <para>The depth refers to how many ancestors this item has, and corresponds to the number of horizontal ‘indents’ this item has.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeViewItem.displayName\">\n      <summary>\n        <para>Name shown for this item when rendered.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeViewItem.hasChildren\">\n      <summary>\n        <para>Returns true if children has any items.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeViewItem.icon\">\n      <summary>\n        <para>If set, this icon will be rendered to the left of the displayName. The icon is rendered at 16x16 points by default.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeViewItem.id\">\n      <summary>\n        <para>Unique ID for an item.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeViewItem.parent\">\n      <summary>\n        <para>The parent of this TreeViewItem. If it is null then it is considered the root of the TreeViewItem tree.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeViewItem.AddChild(UnityEditor.IMGUI.Controls.TreeViewItem)\">\n      <summary>\n        <para>Helper method that adds the child TreeViewItem to the children list and sets the parent property on the child.</para>\n      </summary>\n      <param name=\"child\">TreeViewItem to be added to the children list.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeViewItem.#ctor(System.Int32)\">\n      <summary>\n        <para>TreeViewItem constructor.</para>\n      </summary>\n      <param name=\"id\">Unique ID to identify this TreeViewItem with among all TreeViewItems of the TreeView. See Also id.</param>\n      <param name=\"depth\">Depth of this TreeViewItem. See Also depth.</param>\n      <param name=\"displayName\">Rendered name of this TreeViewItem. See Also displayName.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeViewItem.#ctor(System.Int32,System.Int32)\">\n      <summary>\n        <para>TreeViewItem constructor.</para>\n      </summary>\n      <param name=\"id\">Unique ID to identify this TreeViewItem with among all TreeViewItems of the TreeView. See Also id.</param>\n      <param name=\"depth\">Depth of this TreeViewItem. See Also depth.</param>\n      <param name=\"displayName\">Rendered name of this TreeViewItem. See Also displayName.</param>\n    </member>\n    <member name=\"M:UnityEditor.IMGUI.Controls.TreeViewItem.#ctor(System.Int32,System.Int32,System.String)\">\n      <summary>\n        <para>TreeViewItem constructor.</para>\n      </summary>\n      <param name=\"id\">Unique ID to identify this TreeViewItem with among all TreeViewItems of the TreeView. See Also id.</param>\n      <param name=\"depth\">Depth of this TreeViewItem. See Also depth.</param>\n      <param name=\"displayName\">Rendered name of this TreeViewItem. See Also displayName.</param>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.TreeViewSelectionOptions\">\n      <summary>\n        <para>Enum used by the TreeView.SetSelection method.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeViewSelectionOptions.FireSelectionChanged\">\n      <summary>\n        <para>If this flag is passed to TreeView.SetSelection then the TreeView will call the its TreeView.SelectionChanged method.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeViewSelectionOptions.None\">\n      <summary>\n        <para>If this flag is passed to TreeView.SetSelection no extra logic is be performed after setting selection.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeViewSelectionOptions.RevealAndFrame\">\n      <summary>\n        <para>If this flag is passed to TreeView.SetSelection then the TreeView will make sure the last item in the input selection list is visible on screen.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.IMGUI.Controls.TreeViewState\">\n      <summary>\n        <para>The TreeViewState contains serializable state information for the TreeView.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeViewState.expandedIDs\">\n      <summary>\n        <para>This is the list of currently expanded TreeViewItem IDs.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeViewState.lastClickedID\">\n      <summary>\n        <para>The ID for the TreeViewItem that currently is being used for multi selection and key navigation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.IMGUI.Controls.TreeViewState.scrollPos\">\n      <summary>\n        <para>The current scroll values of the TreeView's scroll view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeViewState.searchString\">\n      <summary>\n        <para>Search string state that can be used in the TreeView to filter the tree data when creating the TreeViewItems.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.IMGUI.Controls.TreeViewState.selectedIDs\">\n      <summary>\n        <para>Selected TreeViewItem IDs. Use of the SetSelection and IsSelected API will access this state.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ImportAssetOptions\">\n      <summary>\n        <para>Asset importing options.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ImportAssetOptions.Default\">\n      <summary>\n        <para>Default import options.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ImportAssetOptions.DontDownloadFromCacheServer\">\n      <summary>\n        <para>Force a full reimport but don't download the assets from the cache server.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ImportAssetOptions.ForceSynchronousImport\">\n      <summary>\n        <para>Import all assets synchronously.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ImportAssetOptions.ForceUncompressedImport\">\n      <summary>\n        <para>Forces asset import as uncompressed for edition facilities.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ImportAssetOptions.ForceUpdate\">\n      <summary>\n        <para>User initiated asset import.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ImportAssetOptions.ImportRecursive\">\n      <summary>\n        <para>When a folder is imported, import all its contents as well.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.InitializeOnLoadAttribute\">\n      <summary>\n        <para>Allow an editor class to be initialized when Unity loads without action from the user.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.InitializeOnLoadMethodAttribute\">\n      <summary>\n        <para>Allow an editor class method to be initialized when Unity loads without action from the user.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.iOSAppInBackgroundBehavior\">\n      <summary>\n        <para>Application behavior when entering background.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSAppInBackgroundBehavior.Custom\">\n      <summary>\n        <para>Custom background behavior, see iOSBackgroundMode for specific background modes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSAppInBackgroundBehavior.Exit\">\n      <summary>\n        <para>Application should exit when entering background.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSAppInBackgroundBehavior.Suspend\">\n      <summary>\n        <para>Application should suspend execution when entering background.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.iOSBackgroundMode\">\n      <summary>\n        <para>Background modes supported by the application corresponding to project settings in Xcode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSBackgroundMode.Audio\">\n      <summary>\n        <para>Audio, AirPlay and Picture in Picture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSBackgroundMode.BluetoothCentral\">\n      <summary>\n        <para>Uses Bluetooth LE accessories.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSBackgroundMode.BluetoothPeripheral\">\n      <summary>\n        <para>Acts as a Bluetooth LE accessory.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSBackgroundMode.ExternalAccessory\">\n      <summary>\n        <para>External accessory communication.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSBackgroundMode.Fetch\">\n      <summary>\n        <para>Background fetch.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSBackgroundMode.Location\">\n      <summary>\n        <para>Location updates.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSBackgroundMode.NewsstandContent\">\n      <summary>\n        <para>Newsstand downloads.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSBackgroundMode.None\">\n      <summary>\n        <para>No background modes supported.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSBackgroundMode.RemoteNotification\">\n      <summary>\n        <para>Remote notifications.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSBackgroundMode.VOIP\">\n      <summary>\n        <para>Voice over IP.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.iOSBuildType\">\n      <summary>\n        <para>Build configurations for the generated Xcode project.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSBuildType.Debug\">\n      <summary>\n        <para>Build configuration set to Debug for the generated Xcode project.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSBuildType.Release\">\n      <summary>\n        <para>Build configuration set to Release for the generated Xcode project with optimization enabled.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.iOSDeviceRequirement\">\n      <summary>\n        <para>A device requirement description used for configuration of App Slicing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.iOSDeviceRequirement.values\">\n      <summary>\n        <para>The values of the device requirement description.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.iOSDeviceRequirement.#ctor\">\n      <summary>\n        <para>Constructs new device requirement description.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.iOSLaunchScreenImageType\">\n      <summary>\n        <para>iOS launch screen settings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSLaunchScreenImageType.iPadImage\">\n      <summary>\n        <para>Launch screen image on the iPad.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSLaunchScreenImageType.iPhoneLandscapeImage\">\n      <summary>\n        <para>Landscape oriented launch screen image on the iPhone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSLaunchScreenImageType.iPhonePortraitImage\">\n      <summary>\n        <para>Portrait oriented launch screen image on the iPhone.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.iOSLaunchScreenType\">\n      <summary>\n        <para>iOS launch screen settings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSLaunchScreenType.CustomXib\">\n      <summary>\n        <para>Use a specified custom Interface Builder (.xib) file in Player Settings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSLaunchScreenType.Default\">\n      <summary>\n        <para>Use the default launch screen (dark blue background).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSLaunchScreenType.ImageAndBackgroundConstant\">\n      <summary>\n        <para>Use a custom launch screen image specified in the iOS Player Settings or with PlayerSettings.iOS.SetLaunchScreenImage and use its original dimensions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSLaunchScreenType.ImageAndBackgroundRelative\">\n      <summary>\n        <para>Use a custom launch screen image specified in the iOS Player Settings or with PlayerSettings.iOS.SetLaunchScreenImage which will be scaled across the entire screen.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSLaunchScreenType.None\">\n      <summary>\n        <para>Generate the Xcode project without any custom launch screens.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.iOSSdkVersion\">\n      <summary>\n        <para>Supported iOS SDK versions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSSdkVersion.DeviceSDK\">\n      <summary>\n        <para>Device SDK.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSSdkVersion.SimulatorSDK\">\n      <summary>\n        <para>Simulator SDK.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.iOSShowActivityIndicatorOnLoading\">\n      <summary>\n        <para>Activity Indicator on loading.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSShowActivityIndicatorOnLoading.DontShow\">\n      <summary>\n        <para>Don't Show.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSShowActivityIndicatorOnLoading.Gray\">\n      <summary>\n        <para>Gray.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSShowActivityIndicatorOnLoading.White\">\n      <summary>\n        <para>White.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSShowActivityIndicatorOnLoading.WhiteLarge\">\n      <summary>\n        <para>White Large.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.iOSStatusBarStyle\">\n      <summary>\n        <para>iOS status bar style.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSStatusBarStyle.Default\">\n      <summary>\n        <para>Default.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSStatusBarStyle.LightContent\">\n      <summary>\n        <para>A light status bar, intended for use on dark backgrounds.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.iOSTargetDevice\">\n      <summary>\n        <para>Target iOS device.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSTargetDevice.iPadOnly\">\n      <summary>\n        <para>iPad Only.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSTargetDevice.iPhoneAndiPad\">\n      <summary>\n        <para>Universal : iPhone/iPod + iPad.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSTargetDevice.iPhoneOnly\">\n      <summary>\n        <para>iPhone/iPod Only.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.iOSTargetOSVersion\">\n      <summary>\n        <para>Supported iOS deployment versions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSTargetOSVersion.iOS_4_0\">\n      <summary>\n        <para>iOS 4.0.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSTargetOSVersion.iOS_4_1\">\n      <summary>\n        <para>iOS 4.1.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSTargetOSVersion.iOS_4_2\">\n      <summary>\n        <para>iOS 4.2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSTargetOSVersion.iOS_4_3\">\n      <summary>\n        <para>iOS 4.3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSTargetOSVersion.iOS_5_0\">\n      <summary>\n        <para>iOS 5.0.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSTargetOSVersion.iOS_5_1\">\n      <summary>\n        <para>iOS 5.1.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSTargetOSVersion.iOS_6_0\">\n      <summary>\n        <para>iOS 6.0.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSTargetOSVersion.iOS_7_0\">\n      <summary>\n        <para>iOS 7.0.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSTargetOSVersion.iOS_7_1\">\n      <summary>\n        <para>iOS 7.1.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSTargetOSVersion.iOS_8_0\">\n      <summary>\n        <para>iOS 8.0.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSTargetOSVersion.iOS_8_1\">\n      <summary>\n        <para>iOS 8.1.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.iOSTargetOSVersion.Unknown\">\n      <summary>\n        <para>Unknown iOS version, managed by user.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.LightEditor\">\n      <summary>\n        <para>The class used to render the Light Editor when a Light is selected in the Unity Editor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.settings\">\n      <summary>\n        <para>The settings helper that can be used for rendering a custom LightEditor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.OnDestroy\">\n      <summary>\n        <para>See ScriptableObject.OnDestroy.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.OnEnable\">\n      <summary>\n        <para>See ScriptableObject.OnEnable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.OnInspectorGUI\">\n      <summary>\n        <para>See Editor.OnInspectorGUI.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.OnSceneGUI\">\n      <summary>\n        <para>See Editor.OnSceneGUI.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.LightEditor.Settings\">\n      <summary>\n        <para>Contains all drawable elements of the LightEditor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.areaSizeX\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.areaSizeY\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.bakedShadowAngleProp\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.bakedShadowRadiusProp\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.bounceIntensity\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.color\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.colorTemperature\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.cookie\">\n      <summary>\n        <para>The light cookie texture used by the light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.cookieProp\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.cookieSize\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.cullingMask\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.flare\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.halo\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.intensity\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.isBakedOrMixed\">\n      <summary>\n        <para>Is the current light baked or mixed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.isCompletelyBaked\">\n      <summary>\n        <para>Is the light completely baked.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.isMixed\">\n      <summary>\n        <para>Is the current light mixed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.isRealtime\">\n      <summary>\n        <para>Is the light realtime?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.light\">\n      <summary>\n        <para>The light being inspected.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.lightmapping\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.lightType\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.range\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.renderMode\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.shadowsBias\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.shadowsNearPlane\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.shadowsNormalBias\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.shadowsResolution\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.shadowsStrength\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.shadowsType\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.spotAngle\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightEditor.Settings.useColorTemperature\">\n      <summary>\n        <para>Exposed SerializedProperty for the inspected Light.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.ApplyModifiedProperties\">\n      <summary>\n        <para>See SerializedObject.ApplyModifiedProperties.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.DrawArea\">\n      <summary>\n        <para>Draws the default [[LightEditor] area widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.DrawBakedShadowAngle\">\n      <summary>\n        <para>Draws the default [[LightEditor] baked shadow angle widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.DrawBakedShadowRadius\">\n      <summary>\n        <para>Draws the default [[LightEditor] baked shadow radius widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.DrawBounceIntensity\">\n      <summary>\n        <para>Draws the default [[LightEditor] bounce intensity widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.DrawColor\">\n      <summary>\n        <para>Draws the default [[LightEditor] color widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.DrawCookie\">\n      <summary>\n        <para>Draws the default [[LightEditor] cookie widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.DrawCookieSize\">\n      <summary>\n        <para>Draws the default [[LightEditor] cookie size widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.DrawCullingMask\">\n      <summary>\n        <para>Draws the default [[LightEditor] culling mask widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.DrawFlare\">\n      <summary>\n        <para>Draws the default [[LightEditor] flare widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.DrawHalo\">\n      <summary>\n        <para>Draws the default [[LightEditor] halo widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.DrawIntensity\">\n      <summary>\n        <para>Draws the default [[LightEditor] intensity widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.DrawLightmapping\">\n      <summary>\n        <para>Draws the default [[LightEditor] lightmapping widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.DrawLightType\">\n      <summary>\n        <para>Draws the default [[LightEditor] light type widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.DrawRange(System.Boolean)\">\n      <summary>\n        <para>Draws the default [[LightEditor] range widget.</para>\n      </summary>\n      <param name=\"showAreaOptions\"></param>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.DrawRenderMode\">\n      <summary>\n        <para>Draws the default [[LightEditor] render mode widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.DrawRuntimeShadow\">\n      <summary>\n        <para>Draws the default [[LightEditor] runtime shadows widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.DrawShadowsType\">\n      <summary>\n        <para>Draws the default [[LightEditor] shadows type widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.DrawSpotAngle\">\n      <summary>\n        <para>Draws the default [[LightEditor] spot angle widget.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.OnDestroy\">\n      <summary>\n        <para>Cleanup internal settings state.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.OnEnable\">\n      <summary>\n        <para>Populate the settings from the referenced SerializedObject.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LightEditor.Settings.Update\">\n      <summary>\n        <para>See SerializedObject.Update.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.LightingDataAsset\">\n      <summary>\n        <para>The lighting data asset used by the active scene.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.LightmapBakeQuality\">\n      <summary>\n        <para>Bake quality setting for LightmapEditorSettings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.LightmapBakeQuality.High\">\n      <summary>\n        <para>High quality bake for final renderings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.LightmapBakeQuality.Low\">\n      <summary>\n        <para>Low quality bake for preview renderings.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.LightmapEditorSettings\">\n      <summary>\n        <para>Various settings for the bake.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.aoExponentDirect\">\n      <summary>\n        <para>Ambient occlusion (AO) for direct lighting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.aoExponentIndirect\">\n      <summary>\n        <para>Ambient occlusion (AO) for indirect lighting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.aoMaxDistance\">\n      <summary>\n        <para>Beyond this distance a ray is considered to be unoccluded.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.bakeResolution\">\n      <summary>\n        <para>Specifies the resolution of the Baked lightmap in texels per world unit. Specifying higher resolutions can significantly increase the time it takes to bake the lightmap. The default value is one texel per world unit. The minimum value is 0.0001.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.bounces\">\n      <summary>\n        <para>Specifies the maximum number of bounces the lightmapper computes for indirect light. The default value is one. The range is 0 to 4.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.directSampleCount\">\n      <summary>\n        <para>Specifies the number of samples the Progressive lightmapper uses for direct lighting calculations. The default value is 32. The minimum value is 1.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.enableAmbientOcclusion\">\n      <summary>\n        <para>Enable baked ambient occlusion (AO).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.filteringAtrousPositionSigmaAO\">\n      <summary>\n        <para>Specifies the threshold the Progressive lightmapper uses to filter ambient occlusion stored in the lightmap when using A-Trous filter. The default value is 1. The value range is 0 to 2.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.filteringAtrousPositionSigmaDirect\">\n      <summary>\n        <para>Specifies the threshold the Progressive lightmapper uses to filter direct light stored in the lightmap when using A-Trous filter. The default value is 0.5. The value range is 0 to 2.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.filteringAtrousPositionSigmaIndirect\">\n      <summary>\n        <para>Specifies the threshold the Progressive lightmapper uses to filter indirect light stored in the lightmap when using A-Trous filter. The default value is 2. The value range is 0 to 2.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.filteringGaussRadiusAO\">\n      <summary>\n        <para>Specifies the radius the Progressive lightmapper uses to filter for ambient occlusion in the lightmap when using Gaussian filter. The default value is 2. The value range is 0 to 5.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.filteringGaussRadiusDirect\">\n      <summary>\n        <para>Specifies the radius the Progressive lightmapper uses to filter for direct light stored in the lightmap when using Gaussian filter. The default value is one. The value range is 0 to 5.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.filteringGaussRadiusIndirect\">\n      <summary>\n        <para>Specifies the radius the Progressive lightmapper used to filter for indirect light stored in the lightmap when using Gaussian filter. The default value is 5. The value range is 0 to 5.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.filteringMode\">\n      <summary>\n        <para>Specifies the method used by the Progressive lightmapper to reduce noise in baked lightmaps.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.filterTypeAO\">\n      <summary>\n        <para>Configure a filter kernel for the ambient occlusion target.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.filterTypeDirect\">\n      <summary>\n        <para>Configure a filter kernel for the direct light target.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.filterTypeIndirect\">\n      <summary>\n        <para>Configure a filter kernel for the indirect light target.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.giPathTracerFilter\">\n      <summary>\n        <para>Determines the filtering kernel for the Progressive Lightmapper.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.indirectSampleCount\">\n      <summary>\n        <para>Specifies the number of samples the Progressive lightmapper uses for indirect lighting calculations. The default value is 500. The minimum value is 10.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.lightmapper\">\n      <summary>\n        <para>Determines which backend to use for baking lightmaps.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.lightmapsMode\">\n      <summary>\n        <para>Non-directional, Directional or Directional Specular lightmaps rendering mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.maxAtlasHeight\">\n      <summary>\n        <para>This property is now obsolete. Use maxAtlasSize instead.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.maxAtlasSize\">\n      <summary>\n        <para>The maximum size of an individual lightmap texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.maxAtlasWidth\">\n      <summary>\n        <para>This property is now obsolete. Use maxAtlasSize instead.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.mixedBakeMode\">\n      <summary>\n        <para>Indicates the Mixed mode that is used to bake the LightmapBakeType.Mixed lights, irrelevant for realtime and baked lights.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.padding\">\n      <summary>\n        <para>Texel separation between shapes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.prioritizeView\">\n      <summary>\n        <para>Specifies whether the Progressive lightmapper should prioritize baking texels within the scene view. The default value is true.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.realtimeResolution\">\n      <summary>\n        <para>Lightmap resolution in texels per world unit. Defines the resolution of Realtime GI if enabled. If Baked GI is enabled, this defines the resolution used for indirect lighting. Higher resolution may take a long time to bake.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.reflectionCubemapCompression\">\n      <summary>\n        <para>Determines how Unity will compress baked reflection cubemap.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.sampling\">\n      <summary>\n        <para>Determines which sampling strategy to use for baking lightmaps with the Progressive Lightmapper.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapEditorSettings.textureCompression\">\n      <summary>\n        <para>Whether to use texture compression on the generated lightmaps.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.LightmapEditorSettings.FilterMode\">\n      <summary>\n        <para>The available filtering modes for the Progressive Lightmapper.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.LightmapEditorSettings.FilterMode.Advanced\">\n      <summary>\n        <para>Enables the advanced filtering mode for the Progressive Lightmapper.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.LightmapEditorSettings.FilterMode.Auto\">\n      <summary>\n        <para>The filtering is configured automatically.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.LightmapEditorSettings.FilterMode.None\">\n      <summary>\n        <para>Turn filtering off.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.LightmapEditorSettings.FilterType\">\n      <summary>\n        <para>The available filter kernels for the Progressive Lightmapper.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.LightmapEditorSettings.FilterType.ATrous\">\n      <summary>\n        <para>Use an A-Trous filter for a GI texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.LightmapEditorSettings.FilterType.Gaussian\">\n      <summary>\n        <para>Use a Gaussian filter for a GI texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.LightmapEditorSettings.FilterType.None\">\n      <summary>\n        <para>Do not filter GI texture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.LightmapEditorSettings.Lightmapper\">\n      <summary>\n        <para>Backends available for baking lightmaps.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.LightmapEditorSettings.Lightmapper.Enlighten\">\n      <summary>\n        <para>Backend for baking lightmaps with the Enlighten radiosity middleware.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.LightmapEditorSettings.Lightmapper.ProgressiveCPU\">\n      <summary>\n        <para>Backend for baking lightmaps using progressive path tracing.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.LightmapEditorSettings.Sampling\">\n      <summary>\n        <para>Available sampling strategies for baking lightmaps with the Progressive Lightmapper.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.LightmapEditorSettings.Sampling.Auto\">\n      <summary>\n        <para>Auto will automatically select the sampling settings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.LightmapEditorSettings.Sampling.Fixed\">\n      <summary>\n        <para>Fixed sampling uses a fixed number of samples per texel. This can be used when the other strategies fail to use enough samples in some areas. It will typically be slow.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.LightmapParameters\">\n      <summary>\n        <para>A collection of parameters that impact lightmap and realtime GI computations.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapParameters.antiAliasingSamples\">\n      <summary>\n        <para>The maximum number of times to supersample a texel to reduce aliasing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapParameters.backFaceTolerance\">\n      <summary>\n        <para>The percentage of rays shot from a ray origin that must hit front faces to be considered usable.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapParameters.bakedLightmapTag\">\n      <summary>\n        <para>BakedLightmapTag is an integer that affects the assignment to baked lightmaps. Objects with different values for bakedLightmapTag are guaranteed to not be assigned to the same lightmap even if the other baking parameters are the same.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapParameters.blurRadius\">\n      <summary>\n        <para>The radius (in texels) of the post-processing filter that blurs baked direct lighting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapParameters.clusterResolution\">\n      <summary>\n        <para>Controls the resolution at which Enlighten stores and can transfer input light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapParameters.directLightQuality\">\n      <summary>\n        <para>The number of rays used for lights with an area. Allows for accurate soft shadowing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapParameters.irradianceBudget\">\n      <summary>\n        <para>The amount of data used for realtime GI texels. Specifies how detailed view of the scene a texel has. Small values mean more averaged out lighting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapParameters.irradianceQuality\">\n      <summary>\n        <para>The number of rays to cast for computing irradiance form factors.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapParameters.isTransparent\">\n      <summary>\n        <para>If enabled, the object appears transparent during GlobalIllumination lighting calculations.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapParameters.modellingTolerance\">\n      <summary>\n        <para>Maximum size of gaps that can be ignored for GI (multiplier on pixel size).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapParameters.resolution\">\n      <summary>\n        <para>The texel resolution per meter used for realtime lightmaps. This value is multiplied by LightmapEditorSettings.resolution.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapParameters.stitchEdges\">\n      <summary>\n        <para>Whether pairs of edges should be stitched together.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapParameters.systemTag\">\n      <summary>\n        <para>System tag is an integer identifier. It lets you force an object into a different Enlighten system even though all the other parameters are the same.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapParameters.AOAntiAliasingSamples\">\n      <summary>\n        <para>The maximum number of times to supersample a texel to reduce aliasing in AO.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.LightmapParameters.AOQuality\">\n      <summary>\n        <para>The number of rays to cast for computing ambient occlusion.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Lightmapping\">\n      <summary>\n        <para>Allows to control the lightmapping job.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Lightmapping.bakedGI\">\n      <summary>\n        <para>Is baked GI enabled?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Lightmapping.bounceBoost\">\n      <summary>\n        <para>Boost the albedo.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Lightmapping.buildProgress\">\n      <summary>\n        <para>Returns the current lightmapping build progress or 0 if Lightmapping.isRunning is false.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Lightmapping.completed\">\n      <summary>\n        <para>Delegate which is called when bake job is completed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Lightmapping.giWorkflowMode\">\n      <summary>\n        <para>The lightmap baking workflow mode used. Iterative mode is default, but you can switch to on demand mode which bakes only when the user presses the bake button.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Lightmapping.indirectOutputScale\">\n      <summary>\n        <para>Scale for indirect lighting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Lightmapping.isRunning\">\n      <summary>\n        <para>Returns true when the bake job is running, false otherwise (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Lightmapping.lightingDataAsset\">\n      <summary>\n        <para>The lighting data asset used by the active scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Lightmapping.realtimeGI\">\n      <summary>\n        <para>Is realtime GI enabled?</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.Lightmapping.started(UnityEditor.Lightmapping/OnStartedFunction)\">\n      <summary>\n        <para>Delegate which is called when bake job is started.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Lightmapping.Bake\">\n      <summary>\n        <para>Stars a synchronous bake job.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Lightmapping.BakeAsync\">\n      <summary>\n        <para>Starts an asynchronous bake job.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Lightmapping.BakeLightProbesOnly\">\n      <summary>\n        <para>Starts a synchronous bake job, but only bakes light probes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Lightmapping.BakeLightProbesOnlyAsync\">\n      <summary>\n        <para>Starts an asynchronous bake job, but only bakes light probes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Lightmapping.BakeMultipleScenes(System.String[])\">\n      <summary>\n        <para>Bakes an array of scenes.</para>\n      </summary>\n      <param name=\"paths\">The path of the scenes that should be baked.</param>\n    </member>\n    <member name=\"M:UnityEditor.Lightmapping.BakeReflectionProbe(UnityEngine.ReflectionProbe,System.String)\">\n      <summary>\n        <para>Starts a synchronous bake job for the probe.</para>\n      </summary>\n      <param name=\"probe\">Target probe.</param>\n      <param name=\"path\">The location where cubemap will be saved.</param>\n      <returns>\n        <para>Returns true if baking was succesful.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Lightmapping.BakeSelected\">\n      <summary>\n        <para>Starts a synchronous bake job for the selected objects.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Lightmapping.BakeSelectedAsync\">\n      <summary>\n        <para>Starts an asynchronous bake job for the selected objects.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Lightmapping.Cancel\">\n      <summary>\n        <para>Cancels the currently running asynchronous bake job.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Lightmapping.Clear\">\n      <summary>\n        <para>Deletes all lightmap assets and makes all lights behave as if they weren't baked yet.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Lightmapping.ClearDiskCache\">\n      <summary>\n        <para>Clears the cache used by lightmaps, reflection probes and default reflection.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Lightmapping.ClearLightingDataAsset\">\n      <summary>\n        <para>Remove the lighting data asset used by the current scene.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Lightmapping.ForceStop\">\n      <summary>\n        <para>Force the Progressive Path Tracer to stop baking and use the computed results as they are.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Lightmapping.GetTerrainGIChunks(UnityEngine.Terrain,System.Int32&amp;,System.Int32&amp;)\">\n      <summary>\n        <para>Get how many chunks the terrain is divided into for GI baking.</para>\n      </summary>\n      <param name=\"terrain\">The terrain.</param>\n      <param name=\"numChunksX\">Number of chunks in terrain width.</param>\n      <param name=\"numChunksY\">Number of chunks in terrain length.</param>\n    </member>\n    <member name=\"T:UnityEditor.Lightmapping.GIWorkflowMode\">\n      <summary>\n        <para>Workflow mode for lightmap baking. Default is Iterative.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Lightmapping.GIWorkflowMode.Iterative\">\n      <summary>\n        <para>Always run lightmapping, changes to the scene are detected automatically.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Lightmapping.GIWorkflowMode.Legacy\">\n      <summary>\n        <para>Deprecated 4.x lightmapping support.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Lightmapping.GIWorkflowMode.OnDemand\">\n      <summary>\n        <para>Run lightmapping only when the user presses the bake button.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Lightmapping.OnCompletedFunction\">\n      <summary>\n        <para>Delegate used by Lightmapping.completed callback.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Lightmapping.OnStartedFunction\">\n      <summary>\n        <para>Delegate used by Lightmapping.started callback.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Lightmapping.Tetrahedralize(UnityEngine.Vector3[],System.Int32[]&amp;,UnityEngine.Vector3[]&amp;)\">\n      <summary>\n        <para>Calculates a Delaunay Tetrahedralization of the 'positions' point set - the same way the lightmapper.</para>\n      </summary>\n      <param name=\"positions\"></param>\n      <param name=\"outIndices\"></param>\n      <param name=\"outPositions\"></param>\n    </member>\n    <member name=\"T:UnityEditor.LODUtility\">\n      <summary>\n        <para>LOD Utility Helpers.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.LODUtility.CalculateLODGroupBoundingBox(UnityEngine.LODGroup)\">\n      <summary>\n        <para>Recalculate the bounding region for the given LODGroup.</para>\n      </summary>\n      <param name=\"group\"></param>\n    </member>\n    <member name=\"T:UnityEditor.MacFullscreenMode\">\n      <summary>\n        <para>Mac fullscreen mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MacFullscreenMode.FullscreenWindow\">\n      <summary>\n        <para>Fullscreen window.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MacFullscreenMode.FullscreenWindowWithDockAndMenuBar\">\n      <summary>\n        <para>Fullscreen window with Dock and Menu bar.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.MaterialEditor\">\n      <summary>\n        <para>The Unity Material Editor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MaterialEditor.isVisible\">\n      <summary>\n        <para>Is the current material expanded.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MaterialEditor.kMiniTextureFieldLabelIndentLevel\">\n      <summary>\n        <para>Useful for indenting shader properties that need the same indent as mini texture field.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.ApplyMaterialPropertyDrawers(UnityEngine.Material)\">\n      <summary>\n        <para>Apply initial MaterialPropertyDrawer values.</para>\n      </summary>\n      <param name=\"material\"></param>\n      <param name=\"targets\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.ApplyMaterialPropertyDrawers(UnityEngine.Object[])\">\n      <summary>\n        <para>Apply initial MaterialPropertyDrawer values.</para>\n      </summary>\n      <param name=\"material\"></param>\n      <param name=\"targets\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.Awake\">\n      <summary>\n        <para>Called when the Editor is woken up.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.BeginAnimatedCheck(UnityEngine.Rect,UnityEditor.MaterialProperty)\">\n      <summary>\n        <para>Creates a Property wrapper, useful for making regular GUI controls work with MaterialProperty.</para>\n      </summary>\n      <param name=\"totalPosition\">Rectangle on the screen to use for the control, including label if applicable.</param>\n      <param name=\"prop\">The MaterialProperty to use for the control.</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.BeginAnimatedCheck(UnityEditor.MaterialProperty)\">\n      <summary>\n        <para>Creates a Property wrapper, useful for making regular GUI controls work with MaterialProperty.</para>\n      </summary>\n      <param name=\"totalPosition\">Rectangle on the screen to use for the control, including label if applicable.</param>\n      <param name=\"prop\">The MaterialProperty to use for the control.</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.ColorProperty(UnityEngine.Rect,UnityEditor.MaterialProperty,System.String)\">\n      <summary>\n        <para>Draw a property field for a color shader property.</para>\n      </summary>\n      <param name=\"label\">Label for the property.</param>\n      <param name=\"position\"></param>\n      <param name=\"prop\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.ColorProperty(UnityEditor.MaterialProperty,System.String)\">\n      <summary>\n        <para>Draw a property field for a color shader property.</para>\n      </summary>\n      <param name=\"label\">Label for the property.</param>\n      <param name=\"position\"></param>\n      <param name=\"prop\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.DefaultPreviewGUI(UnityEngine.Rect,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Default handling of preview area for materials.</para>\n      </summary>\n      <param name=\"r\"></param>\n      <param name=\"background\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.DefaultPreviewSettingsGUI\">\n      <summary>\n        <para>Default toolbar for material preview area.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.DefaultShaderProperty(UnityEditor.MaterialProperty,System.String)\">\n      <summary>\n        <para>Handles UI for one shader property ignoring any custom drawers.</para>\n      </summary>\n      <param name=\"prop\"></param>\n      <param name=\"label\"></param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.DefaultShaderProperty(UnityEngine.Rect,UnityEditor.MaterialProperty,System.String)\">\n      <summary>\n        <para>Handles UI for one shader property ignoring any custom drawers.</para>\n      </summary>\n      <param name=\"prop\"></param>\n      <param name=\"label\"></param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.DoubleSidedGIField\">\n      <summary>\n        <para>Display UI for editing a material's Double Sided Global Illumination setting.\nReturns true if the UI is indeed displayed i.e. the material supports the Double Sided Global Illumination setting.\n+See Also: Material.doubleSidedGI.</para>\n      </summary>\n      <returns>\n        <para>True if the UI is displayed, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.EmissionEnabledProperty\">\n      <summary>\n        <para>This function will draw the UI for controlling whether emission is enabled or not on a material.</para>\n      </summary>\n      <returns>\n        <para>Returns true if enabled, or false if disabled or mixed due to multi-editing.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.EnableInstancingField\">\n      <summary>\n        <para>Display UI for editing material's render queue setting.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.EnableInstancingField(UnityEngine.Rect)\">\n      <summary>\n        <para>Display UI for editing material's render queue setting within the specified rect.</para>\n      </summary>\n      <param name=\"r\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.EndAnimatedCheck\">\n      <summary>\n        <para>Ends a Property wrapper started with BeginAnimatedCheck.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.FixupEmissiveFlag(UnityEngine.Color,UnityEngine.MaterialGlobalIlluminationFlags)\">\n      <summary>\n        <para>Returns a properly set global illlumination flag based on the passed in flag and the given color.</para>\n      </summary>\n      <param name=\"col\">Emission color.</param>\n      <param name=\"flags\">Current global illumination flag.</param>\n      <returns>\n        <para>The fixed up flag.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.FixupEmissiveFlag(UnityEngine.Material)\">\n      <summary>\n        <para>Properly sets up the globalIllumination flag on the given Material depending on the current flag's state and the material's emission property.</para>\n      </summary>\n      <param name=\"mat\">The material to be fixed up.</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.FloatProperty(UnityEditor.MaterialProperty,System.String)\">\n      <summary>\n        <para>Draw a property field for a float shader property.</para>\n      </summary>\n      <param name=\"label\">Label for the property.</param>\n      <param name=\"prop\"></param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.FloatProperty(UnityEngine.Rect,UnityEditor.MaterialProperty,System.String)\">\n      <summary>\n        <para>Draw a property field for a float shader property.</para>\n      </summary>\n      <param name=\"label\">Label for the property.</param>\n      <param name=\"prop\"></param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.GetDefaultPropertyHeight(UnityEditor.MaterialProperty)\">\n      <summary>\n        <para>Calculate height needed for the property, ignoring custom drawers.</para>\n      </summary>\n      <param name=\"prop\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.GetFlexibleRectBetweenFieldAndRightEdge(UnityEngine.Rect)\">\n      <summary>\n        <para>Utility method for GUI layouting ShaderGUI. Used e.g for the rect after a left aligned Color field.</para>\n      </summary>\n      <param name=\"r\">Field Rect.</param>\n      <returns>\n        <para>A sub rect of the input Rect.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.GetFlexibleRectBetweenLabelAndField(UnityEngine.Rect)\">\n      <summary>\n        <para>Utility method for GUI layouting ShaderGUI.</para>\n      </summary>\n      <param name=\"r\">Field Rect.</param>\n      <returns>\n        <para>A sub rect of the input Rect.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.GetLeftAlignedFieldRect(UnityEngine.Rect)\">\n      <summary>\n        <para>Utility method for GUI layouting ShaderGUI.</para>\n      </summary>\n      <param name=\"r\">Field Rect.</param>\n      <returns>\n        <para>A sub rect of the input Rect.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.GetMaterialProperties(UnityEngine.Object[])\">\n      <summary>\n        <para>Get shader property information of the passed materials.</para>\n      </summary>\n      <param name=\"mats\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.GetMaterialProperty(UnityEngine.Object[],System.String)\">\n      <summary>\n        <para>Get information about a single shader property.</para>\n      </summary>\n      <param name=\"mats\">Selected materials.</param>\n      <param name=\"name\">Property name.</param>\n      <param name=\"propertyIndex\">Property index.</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.GetMaterialProperty(UnityEngine.Object[],System.Int32)\">\n      <summary>\n        <para>Get information about a single shader property.</para>\n      </summary>\n      <param name=\"mats\">Selected materials.</param>\n      <param name=\"name\">Property name.</param>\n      <param name=\"propertyIndex\">Property index.</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.GetPropertyHeight(UnityEditor.MaterialProperty)\">\n      <summary>\n        <para>Calculate height needed for the property.</para>\n      </summary>\n      <param name=\"prop\"></param>\n      <param name=\"label\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.GetPropertyHeight(UnityEditor.MaterialProperty,System.String)\">\n      <summary>\n        <para>Calculate height needed for the property.</para>\n      </summary>\n      <param name=\"prop\"></param>\n      <param name=\"label\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.GetRectAfterLabelWidth(UnityEngine.Rect)\">\n      <summary>\n        <para>Utility method for GUI layouting ShaderGUI. This is the rect after the label which can be used for multiple properties. The input rect can be fetched by calling: EditorGUILayout.GetControlRect.</para>\n      </summary>\n      <param name=\"r\">Line Rect.</param>\n      <returns>\n        <para>A sub rect of the input Rect.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.GetRightAlignedFieldRect(UnityEngine.Rect)\">\n      <summary>\n        <para>Utility method for GUI layouting ShaderGUI.</para>\n      </summary>\n      <param name=\"r\">Field Rect.</param>\n      <returns>\n        <para>A sub rect of the input Rect.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.GetTextureOffset(System.String,System.Boolean&amp;,System.Boolean&amp;)\">\n      <summary>\n        <para>Get the value of a given texture offset for a given texture property.</para>\n      </summary>\n      <param name=\"propertyName\">Name of the texture property that you wish to examine the offset of.</param>\n      <param name=\"hasMixedValueX\">Does the x offset have multiple values?</param>\n      <param name=\"hasMixedValueY\">Does the y offset have multiple values?</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.GetTexturePropertyCustomArea(UnityEngine.Rect)\">\n      <summary>\n        <para>Returns the free rect below the label and before the large thumb object field. Is used for e.g. tiling and offset properties.</para>\n      </summary>\n      <param name=\"position\">The total rect of the texture property.</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.GetTextureScale(System.String,System.Boolean&amp;,System.Boolean&amp;)\">\n      <summary>\n        <para>Get the value of a given texture scale for a given texture property.</para>\n      </summary>\n      <param name=\"propertyName\">Name of the texture property that you wish to examine the scale of.</param>\n      <param name=\"hasMixedValueX\">Does the x scale have multiple values?</param>\n      <param name=\"hasMixedValueY\">Does the y scale have multiple values?</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.HasPreviewGUI\">\n      <summary>\n        <para>Can this component be Previewed in its current state?</para>\n      </summary>\n      <returns>\n        <para>True if this component can be Previewed in its current state.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.HelpBoxWithButton(UnityEngine.GUIContent,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a help box with a message and button. Returns true, if button was pressed.</para>\n      </summary>\n      <param name=\"messageContent\">The message text.</param>\n      <param name=\"buttonContent\">The button text.</param>\n      <returns>\n        <para>Returns true, if button was pressed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.LightmapEmissionFlagsProperty(System.Int32,System.Boolean)\">\n      <summary>\n        <para>Draws the UI for setting the global illumination flag of a material.</para>\n      </summary>\n      <param name=\"indent\">Level of indentation for the property.</param>\n      <param name=\"enabled\">True if emission is enabled for the material, false otherwise.</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.LightmapEmissionProperty\">\n      <summary>\n        <para>This function will draw the UI for the lightmap emission property. (None, Realtime, baked)\n\nSee Also: MaterialLightmapFlags.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.LightmapEmissionProperty\">\n      <summary>\n        <para>This function will draw the UI for the lightmap emission property. (None, Realtime, baked)\n\nSee Also: MaterialLightmapFlags.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.LightmapEmissionProperty\">\n      <summary>\n        <para>This function will draw the UI for the lightmap emission property. (None, Realtime, baked)\n\nSee Also: MaterialLightmapFlags.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.OnDisable\">\n      <summary>\n        <para>Called when the editor is disabled, if overridden please call the base OnDisable() to ensure that the material inspector is set up properly.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.OnEnable\">\n      <summary>\n        <para>Called when the editor is enabled, if overridden please call the base OnEnable() to ensure that the material inspector is set up properly.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.OnInspectorGUI\">\n      <summary>\n        <para>Implement specific MaterialEditor GUI code here. If you want to simply extend the existing editor call the base OnInspectorGUI () before doing any custom GUI code.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.OnPreviewGUI(UnityEngine.Rect,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Custom preview for Image component.</para>\n      </summary>\n      <param name=\"r\">Rectangle in which to draw the preview.</param>\n      <param name=\"background\">Background image.</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.OnShaderChanged\">\n      <summary>\n        <para>A callback that is invoked when a Material's Shader is changed in the Inspector.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.PropertiesChanged\">\n      <summary>\n        <para>Whenever a material property is changed call this function. This will rebuild the inspector and validate the properties.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.PropertiesDefaultGUI(UnityEditor.MaterialProperty[])\">\n      <summary>\n        <para>Default rendering of shader properties.</para>\n      </summary>\n      <param name=\"props\">Array of material properties.</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.PropertiesGUI\">\n      <summary>\n        <para>Render the standard material properties. This method will either render properties using a IShaderGUI instance if found otherwise it uses PropertiesDefaultGUI.</para>\n      </summary>\n      <returns>\n        <para>Returns true if any value was changed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.RangeProperty(UnityEditor.MaterialProperty,System.String)\">\n      <summary>\n        <para>Draw a range slider for a range shader property.</para>\n      </summary>\n      <param name=\"label\">Label for the property.</param>\n      <param name=\"prop\">The property to edit.</param>\n      <param name=\"position\">Position and size of the range slider control.</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.RangeProperty(UnityEngine.Rect,UnityEditor.MaterialProperty,System.String)\">\n      <summary>\n        <para>Draw a range slider for a range shader property.</para>\n      </summary>\n      <param name=\"label\">Label for the property.</param>\n      <param name=\"prop\">The property to edit.</param>\n      <param name=\"position\">Position and size of the range slider control.</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.RegisterPropertyChangeUndo(System.String)\">\n      <summary>\n        <para>Call this when you change a material property. It will add an undo for the action.</para>\n      </summary>\n      <param name=\"label\">Undo Label.</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.RenderQueueField\">\n      <summary>\n        <para>Display UI for editing material's render queue setting.</para>\n      </summary>\n      <param name=\"r\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.RenderQueueField(UnityEngine.Rect)\">\n      <summary>\n        <para>Display UI for editing material's render queue setting.</para>\n      </summary>\n      <param name=\"r\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.RequiresConstantRepaint\">\n      <summary>\n        <para>Does this edit require to be repainted constantly in its current state?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.SetDefaultGUIWidths\">\n      <summary>\n        <para>Set EditorGUIUtility.fieldWidth and labelWidth to the default values that PropertiesGUI uses.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.SetShader(UnityEngine.Shader)\">\n      <summary>\n        <para>Set the shader of the material.</para>\n      </summary>\n      <param name=\"shader\">Shader to set.</param>\n      <param name=\"registerUndo\">Should undo be registered.</param>\n      <param name=\"newShader\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.SetShader(UnityEngine.Shader,System.Boolean)\">\n      <summary>\n        <para>Set the shader of the material.</para>\n      </summary>\n      <param name=\"shader\">Shader to set.</param>\n      <param name=\"registerUndo\">Should undo be registered.</param>\n      <param name=\"newShader\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.SetTextureOffset(System.String,UnityEngine.Vector2,System.Int32)\">\n      <summary>\n        <para>Set the offset of a given texture property.</para>\n      </summary>\n      <param name=\"propertyName\">Name of the texture property that you wish to modify the offset of.</param>\n      <param name=\"value\">Scale to set.</param>\n      <param name=\"coord\">Set the x or y component of the offset (0 for x, 1 for y).</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.SetTextureScale(System.String,UnityEngine.Vector2,System.Int32)\">\n      <summary>\n        <para>Set the scale of a given texture property.</para>\n      </summary>\n      <param name=\"propertyName\">Name of the texture property that you wish to modify the scale of.</param>\n      <param name=\"value\">Scale to set.</param>\n      <param name=\"coord\">Set the x or y component of the scale (0 for x, 1 for y).</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.ShaderProperty(UnityEditor.MaterialProperty,System.String)\">\n      <summary>\n        <para>Handes UI for one shader property.</para>\n      </summary>\n      <param name=\"prop\"></param>\n      <param name=\"label\"></param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.ShaderProperty(UnityEngine.Rect,UnityEditor.MaterialProperty,System.String)\">\n      <summary>\n        <para>Handes UI for one shader property.</para>\n      </summary>\n      <param name=\"prop\"></param>\n      <param name=\"label\"></param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.TextureCompatibilityWarning(UnityEditor.MaterialProperty)\">\n      <summary>\n        <para>Checks if particular property has incorrect type of texture specified by the material, displays appropriate warning and suggests the user to automatically fix the problem.</para>\n      </summary>\n      <param name=\"prop\">The texture property to check and display warning for, if necessary.</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.TextureProperty(UnityEditor.MaterialProperty,System.String)\">\n      <summary>\n        <para>Draw a property field for a texture shader property.</para>\n      </summary>\n      <param name=\"label\">Label for the field.</param>\n      <param name=\"scaleOffset\">Draw scale / offset.</param>\n      <param name=\"prop\"></param>\n      <param name=\"position\"></param>\n      <param name=\"tooltip\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.TextureProperty(UnityEditor.MaterialProperty,System.String,System.Boolean)\">\n      <summary>\n        <para>Draw a property field for a texture shader property.</para>\n      </summary>\n      <param name=\"label\">Label for the field.</param>\n      <param name=\"scaleOffset\">Draw scale / offset.</param>\n      <param name=\"prop\"></param>\n      <param name=\"position\"></param>\n      <param name=\"tooltip\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.TextureProperty(UnityEngine.Rect,UnityEditor.MaterialProperty,System.String)\">\n      <summary>\n        <para>Draw a property field for a texture shader property.</para>\n      </summary>\n      <param name=\"label\">Label for the field.</param>\n      <param name=\"scaleOffset\">Draw scale / offset.</param>\n      <param name=\"prop\"></param>\n      <param name=\"position\"></param>\n      <param name=\"tooltip\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.TextureProperty(UnityEngine.Rect,UnityEditor.MaterialProperty,System.String,System.Boolean)\">\n      <summary>\n        <para>Draw a property field for a texture shader property.</para>\n      </summary>\n      <param name=\"label\">Label for the field.</param>\n      <param name=\"scaleOffset\">Draw scale / offset.</param>\n      <param name=\"prop\"></param>\n      <param name=\"position\"></param>\n      <param name=\"tooltip\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.TextureProperty(UnityEngine.Rect,UnityEditor.MaterialProperty,System.String,System.String,System.Boolean)\">\n      <summary>\n        <para>Draw a property field for a texture shader property.</para>\n      </summary>\n      <param name=\"label\">Label for the field.</param>\n      <param name=\"scaleOffset\">Draw scale / offset.</param>\n      <param name=\"prop\"></param>\n      <param name=\"position\"></param>\n      <param name=\"tooltip\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.TexturePropertyMiniThumbnail(UnityEngine.Rect,UnityEditor.MaterialProperty,System.String,System.String)\">\n      <summary>\n        <para>Draw a property field for a texture shader property that only takes up a single line height.</para>\n      </summary>\n      <param name=\"position\">Rect that this control should be rendered in.</param>\n      <param name=\"label\">Label for the field.</param>\n      <param name=\"prop\"></param>\n      <param name=\"tooltip\"></param>\n      <returns>\n        <para>Returns total height used by this control.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.TexturePropertySingleLine(UnityEngine.GUIContent,UnityEditor.MaterialProperty)\">\n      <summary>\n        <para>Method for showing a texture property control with additional inlined properites.</para>\n      </summary>\n      <param name=\"label\">The label used for the texture property.</param>\n      <param name=\"textureProp\">The texture property.</param>\n      <param name=\"extraProperty1\">First optional property inlined after the texture property.</param>\n      <param name=\"extraProperty2\">Second optional property inlined after the extraProperty1.</param>\n      <returns>\n        <para>Returns the Rect used.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.TexturePropertySingleLine(UnityEngine.GUIContent,UnityEditor.MaterialProperty,UnityEditor.MaterialProperty)\">\n      <summary>\n        <para>Method for showing a texture property control with additional inlined properites.</para>\n      </summary>\n      <param name=\"label\">The label used for the texture property.</param>\n      <param name=\"textureProp\">The texture property.</param>\n      <param name=\"extraProperty1\">First optional property inlined after the texture property.</param>\n      <param name=\"extraProperty2\">Second optional property inlined after the extraProperty1.</param>\n      <returns>\n        <para>Returns the Rect used.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.TexturePropertySingleLine(UnityEngine.GUIContent,UnityEditor.MaterialProperty,UnityEditor.MaterialProperty,UnityEditor.MaterialProperty)\">\n      <summary>\n        <para>Method for showing a texture property control with additional inlined properites.</para>\n      </summary>\n      <param name=\"label\">The label used for the texture property.</param>\n      <param name=\"textureProp\">The texture property.</param>\n      <param name=\"extraProperty1\">First optional property inlined after the texture property.</param>\n      <param name=\"extraProperty2\">Second optional property inlined after the extraProperty1.</param>\n      <returns>\n        <para>Returns the Rect used.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.TexturePropertyTwoLines(UnityEngine.GUIContent,UnityEditor.MaterialProperty,UnityEditor.MaterialProperty,UnityEngine.GUIContent,UnityEditor.MaterialProperty)\">\n      <summary>\n        <para>Method for showing a compact layout of properties.</para>\n      </summary>\n      <param name=\"label\">The label used for the texture property.</param>\n      <param name=\"textureProp\">The texture property.</param>\n      <param name=\"extraProperty1\">First extra property inlined after the texture property.</param>\n      <param name=\"label2\">Label for the second extra property (on a new line and indented).</param>\n      <param name=\"extraProperty2\">Second property on a new line below the texture.</param>\n      <returns>\n        <para>Returns the Rect used.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.TexturePropertyWithHDRColor(UnityEngine.GUIContent,UnityEditor.MaterialProperty,UnityEditor.MaterialProperty,System.Boolean)\">\n      <summary>\n        <para>Method for showing a texture property control with a HDR color field and its color brightness float field.</para>\n      </summary>\n      <param name=\"label\">The label used for the texture property.</param>\n      <param name=\"textureProp\">The texture property.</param>\n      <param name=\"colorProperty\">The color property (will be treated as a HDR color).</param>\n      <param name=\"showAlpha\">If false then the alpha channel information will be hidden in the GUI.</param>\n      <param name=\"hdrConfig\"></param>\n      <returns>\n        <para>Return the Rect used.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.TexturePropertyWithHDRColor(UnityEngine.GUIContent,UnityEditor.MaterialProperty,UnityEditor.MaterialProperty,UnityEditor.ColorPickerHDRConfig,System.Boolean)\">\n      <summary>\n        <para>Method for showing a texture property control with a HDR color field and its color brightness float field.</para>\n      </summary>\n      <param name=\"label\">The label used for the texture property.</param>\n      <param name=\"textureProp\">The texture property.</param>\n      <param name=\"colorProperty\">The color property (will be treated as a HDR color).</param>\n      <param name=\"showAlpha\">If false then the alpha channel information will be hidden in the GUI.</param>\n      <param name=\"hdrConfig\"></param>\n      <returns>\n        <para>Return the Rect used.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.TextureScaleOffsetProperty(UnityEngine.Rect,UnityEditor.MaterialProperty)\">\n      <summary>\n        <para>Draws tiling and offset properties for a texture.</para>\n      </summary>\n      <param name=\"position\">Rect to draw this control in.</param>\n      <param name=\"property\">Property to draw.</param>\n      <param name=\"partOfTexturePropertyControl\">If this control should be rendered under large texture property control use 'true'. If this control should be shown seperately use 'false'.</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.TextureScaleOffsetProperty(UnityEngine.Rect,UnityEditor.MaterialProperty,System.Boolean)\">\n      <summary>\n        <para>Draws tiling and offset properties for a texture.</para>\n      </summary>\n      <param name=\"position\">Rect to draw this control in.</param>\n      <param name=\"property\">Property to draw.</param>\n      <param name=\"partOfTexturePropertyControl\">If this control should be rendered under large texture property control use 'true'. If this control should be shown seperately use 'false'.</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.TextureScaleOffsetProperty(UnityEngine.Rect,UnityEngine.Vector4)\">\n      <summary>\n        <para>TODO.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"scaleOffset\"></param>\n      <param name=\"partOfTexturePropertyControl\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.TextureScaleOffsetProperty(UnityEngine.Rect,UnityEngine.Vector4,System.Boolean)\">\n      <summary>\n        <para>TODO.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"scaleOffset\"></param>\n      <param name=\"partOfTexturePropertyControl\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.VectorProperty(UnityEditor.MaterialProperty,System.String)\">\n      <summary>\n        <para>Draw a property field for a vector shader property.</para>\n      </summary>\n      <param name=\"label\">Label for the field.</param>\n      <param name=\"prop\"></param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialEditor.VectorProperty(UnityEngine.Rect,UnityEditor.MaterialProperty,System.String)\">\n      <summary>\n        <para>Draw a property field for a vector shader property.</para>\n      </summary>\n      <param name=\"label\">Label for the field.</param>\n      <param name=\"prop\"></param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"T:UnityEditor.MaterialProperty\">\n      <summary>\n        <para>Describes information and value of a single shader property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MaterialProperty.colorValue\">\n      <summary>\n        <para>Color value of the property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MaterialProperty.displayName\">\n      <summary>\n        <para>Display name of the property (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MaterialProperty.flags\">\n      <summary>\n        <para>Flags that control how property is displayed (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MaterialProperty.floatValue\">\n      <summary>\n        <para>Float vaue of the property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MaterialProperty.hasMixedValue\">\n      <summary>\n        <para>Does this property have multiple different values? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MaterialProperty.name\">\n      <summary>\n        <para>Name of the property (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MaterialProperty.rangeLimits\">\n      <summary>\n        <para>Min/max limits of a ranged float property (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MaterialProperty.targets\">\n      <summary>\n        <para>Material objects being edited by this property (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MaterialProperty.textureDimension\">\n      <summary>\n        <para>Texture dimension (2D, Cubemap etc.) of the property (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MaterialProperty.textureValue\">\n      <summary>\n        <para>Texture value of the property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MaterialProperty.type\">\n      <summary>\n        <para>Type of the property (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MaterialProperty.vectorValue\">\n      <summary>\n        <para>Vector value of the property.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.MaterialProperty.PropFlags\">\n      <summary>\n        <para>Flags that control how a MaterialProperty is displayed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MaterialProperty.PropFlags.Gamma\">\n      <summary>\n        <para>Signifies that values of this property are in gamma space and should not be gamma corrected.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MaterialProperty.PropFlags.HDR\">\n      <summary>\n        <para>Signifies that values of this property contain High Dynamic Range (HDR) data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MaterialProperty.PropFlags.HideInInspector\">\n      <summary>\n        <para>Do not show the property in the Inspector.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MaterialProperty.PropFlags.None\">\n      <summary>\n        <para>No flags are set.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MaterialProperty.PropFlags.NonModifiableTextureData\">\n      <summary>\n        <para>Do not allow this texture property to be edited in the Inspector.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MaterialProperty.PropFlags.Normal\">\n      <summary>\n        <para>Signifies that values of this property contain Normal (normalized vector) data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MaterialProperty.PropFlags.NoScaleOffset\">\n      <summary>\n        <para>Do not show UV scale/offset fields next to a texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MaterialProperty.PropFlags.PerRendererData\">\n      <summary>\n        <para>Texture value for this property will be queried from renderer's MaterialPropertyBlock, instead of from the material. This corresponds to the \"[PerRendererData]\" attribute in front of a property in the shader code.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.MaterialProperty.PropType\">\n      <summary>\n        <para>Material property type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MaterialProperty.PropType.Color\">\n      <summary>\n        <para>Color property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MaterialProperty.PropType.Float\">\n      <summary>\n        <para>Float property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MaterialProperty.PropType.Range\">\n      <summary>\n        <para>Ranged float (with min/max values) property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MaterialProperty.PropType.Texture\">\n      <summary>\n        <para>Texture property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MaterialProperty.PropType.Vector\">\n      <summary>\n        <para>Vector property.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.MaterialPropertyDrawer\">\n      <summary>\n        <para>Base class to derive custom material property drawers from.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MaterialPropertyDrawer.Apply(UnityEditor.MaterialProperty)\">\n      <summary>\n        <para>Apply extra initial values to the material.</para>\n      </summary>\n      <param name=\"prop\">The MaterialProperty to apply values for.</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialPropertyDrawer.GetPropertyHeight(UnityEditor.MaterialProperty,System.String,UnityEditor.MaterialEditor)\">\n      <summary>\n        <para>Override this method to specify how tall the GUI for this property is in pixels.</para>\n      </summary>\n      <param name=\"prop\">The MaterialProperty to make the custom GUI for.</param>\n      <param name=\"label\">The label of this property.</param>\n      <param name=\"editor\">Current material editor.</param>\n    </member>\n    <member name=\"M:UnityEditor.MaterialPropertyDrawer.OnGUI(UnityEngine.Rect,UnityEditor.MaterialProperty,System.String,UnityEditor.MaterialEditor)\">\n      <summary>\n        <para>Override this method to make your own GUI for the property.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the property GUI.</param>\n      <param name=\"prop\">The MaterialProperty to make the custom GUI for.</param>\n      <param name=\"label\">The label of this property.</param>\n      <param name=\"editor\">Current material editor.</param>\n    </member>\n    <member name=\"T:UnityEditor.Media.AudioTrackAttributes\">\n      <summary>\n        <para>Descriptor for audio track format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Media.AudioTrackAttributes.channelCount\">\n      <summary>\n        <para>Number of channels.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Media.AudioTrackAttributes.language\">\n      <summary>\n        <para>Dialogue language, if applicable.  Can be empty.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Media.AudioTrackAttributes.sampleRate\">\n      <summary>\n        <para>Audio sampling rate.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Media.MediaEncoder\">\n      <summary>\n        <para>Encodes images and audio samples into an audio or movie file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Media.MediaEncoder.AddFrame(UnityEngine.Texture2D)\">\n      <summary>\n        <para>Appends a frame to the file's video track.</para>\n      </summary>\n      <param name=\"texture\">Texture containing the pixels to be written into the track for the current frame.</param>\n      <returns>\n        <para>True if the operation succeeded. False otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Media.MediaEncoder.AddSamples(System.UInt16,Unity.Collections.NativeArray`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Appends sample frames to the specified audio track.</para>\n      </summary>\n      <param name=\"trackIndex\">Index of the track to which sample frames will be added.</param>\n      <param name=\"interleavedSamples\">Sample frames to add.  Samples are expected to be interleaved.</param>\n      <returns>\n        <para>True if the operation succeeded. False otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Media.MediaEncoder.AddSamples(Unity.Collections.NativeArray`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Appends sample frames to the specified audio track.</para>\n      </summary>\n      <param name=\"trackIndex\">Index of the track to which sample frames will be added.</param>\n      <param name=\"interleavedSamples\">Sample frames to add.  Samples are expected to be interleaved.</param>\n      <returns>\n        <para>True if the operation succeeded. False otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Media.MediaEncoder.#ctor(System.String,UnityEditor.Media.VideoTrackAttributes,UnityEditor.Media.AudioTrackAttributes[])\">\n      <summary>\n        <para>Create a new encoder with various track arrangements.</para>\n      </summary>\n      <param name=\"filePath\">Path fo the media file to be written.</param>\n      <param name=\"videoAttrs\">Attributes for the file's video track, if any.</param>\n      <param name=\"audioAttrs\">Attributes for the file's audio tracks, if any.</param>\n    </member>\n    <member name=\"M:UnityEditor.Media.MediaEncoder.#ctor(System.String,UnityEditor.Media.VideoTrackAttributes,UnityEditor.Media.AudioTrackAttributes)\">\n      <summary>\n        <para>Create a new encoder with various track arrangements.</para>\n      </summary>\n      <param name=\"filePath\">Path fo the media file to be written.</param>\n      <param name=\"videoAttrs\">Attributes for the file's video track, if any.</param>\n      <param name=\"audioAttrs\">Attributes for the file's audio tracks, if any.</param>\n    </member>\n    <member name=\"M:UnityEditor.Media.MediaEncoder.#ctor(System.String,UnityEditor.Media.VideoTrackAttributes)\">\n      <summary>\n        <para>Create a new encoder with various track arrangements.</para>\n      </summary>\n      <param name=\"filePath\">Path fo the media file to be written.</param>\n      <param name=\"videoAttrs\">Attributes for the file's video track, if any.</param>\n      <param name=\"audioAttrs\">Attributes for the file's audio tracks, if any.</param>\n    </member>\n    <member name=\"M:UnityEditor.Media.MediaEncoder.#ctor(System.String,UnityEditor.Media.AudioTrackAttributes[])\">\n      <summary>\n        <para>Create a new encoder with various track arrangements.</para>\n      </summary>\n      <param name=\"filePath\">Path fo the media file to be written.</param>\n      <param name=\"videoAttrs\">Attributes for the file's video track, if any.</param>\n      <param name=\"audioAttrs\">Attributes for the file's audio tracks, if any.</param>\n    </member>\n    <member name=\"M:UnityEditor.Media.MediaEncoder.#ctor(System.String,UnityEditor.Media.AudioTrackAttributes)\">\n      <summary>\n        <para>Create a new encoder with various track arrangements.</para>\n      </summary>\n      <param name=\"filePath\">Path fo the media file to be written.</param>\n      <param name=\"videoAttrs\">Attributes for the file's video track, if any.</param>\n      <param name=\"audioAttrs\">Attributes for the file's audio tracks, if any.</param>\n    </member>\n    <member name=\"M:UnityEditor.Media.MediaEncoder.Dispose\">\n      <summary>\n        <para>Finishes writing all tracks and closes the file being written.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Media.MediaRational\">\n      <summary>\n        <para>Rational number useful for expressing fractions precisely.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Media.MediaRational.denominator\">\n      <summary>\n        <para>Fraction denominator.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Media.MediaRational.numerator\">\n      <summary>\n        <para>Fraction numerator.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Media.MediaRational.#ctor(System.Int32)\">\n      <summary>\n        <para>Constructs a rational number whose denominator is 1.</para>\n      </summary>\n      <param name=\"num\">Numerator. Will also become the rational value as the denominator is set to 1.</param>\n    </member>\n    <member name=\"T:UnityEditor.Media.VideoTrackAttributes\">\n      <summary>\n        <para>Descriptor for audio track format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Media.VideoTrackAttributes.bitRateMode\">\n      <summary>\n        <para>VideoBitrateMode for the encoded video.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Media.VideoTrackAttributes.frameRate\">\n      <summary>\n        <para>Frames per second.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Media.VideoTrackAttributes.height\">\n      <summary>\n        <para>Image height in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Media.VideoTrackAttributes.includeAlpha\">\n      <summary>\n        <para>True if the track is to include the alpha channel found in the texture passed to AddFrame. False otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Media.VideoTrackAttributes.width\">\n      <summary>\n        <para>Image width in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.MemoryProfiler.Connection\">\n      <summary>\n        <para>A pair of from and to indices describing what thing keeps what other thing alive.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.Connection.from\">\n      <summary>\n        <para>Index into a virtual list of all GC handles, followed by all native objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.Connection.to\">\n      <summary>\n        <para>Index into a virtual list of all GC handles, followed by all native objects.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.MemoryProfiler.FieldDescription\">\n      <summary>\n        <para>Description of a field of a managed type.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.FieldDescription.isStatic\">\n      <summary>\n        <para>Is this field static?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.FieldDescription.name\">\n      <summary>\n        <para>Name of this field.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.FieldDescription.offset\">\n      <summary>\n        <para>Offset of this field.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.FieldDescription.typeIndex\">\n      <summary>\n        <para>The typeindex into PackedMemorySnapshot.typeDescriptions of the type this field belongs to.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.MemoryProfiler.MemorySection\">\n      <summary>\n        <para>A dump of a piece of memory from the player that's being profiled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.MemorySection.bytes\">\n      <summary>\n        <para>The actual bytes of the memory dump.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.MemorySection.startAddress\">\n      <summary>\n        <para>The start address of this piece of memory.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.MemoryProfiler.MemorySnapshot\">\n      <summary>\n        <para>MemorySnapshot is a profiling tool to help diagnose memory usage.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.MemoryProfiler.MemorySnapshot.OnSnapshotReceived(System.Action`1&lt;UnityEditor.MemoryProfiler.PackedMemorySnapshot&gt;)\">\n      <summary>\n        <para>Event that will be fired when a new memory snapshot comes in through the profiler connection. Its argument will be a PackedMemorySnapshot.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MemoryProfiler.MemorySnapshot.RequestNewSnapshot\">\n      <summary>\n        <para>Requests a new snapshot from the currently connected target of the profiler. Memory snapshots are supported on IL2CPP and Mono .NET 3.5 scripting backends.\n\n\nNOTE: Each snapshot consists of approximately one managed object per recorded managed object. Snapshots taken from the editor will contain the objects in all previous snapshots that have not yet been garbage-collected. Therefore, repeated snapshots of the editor may grow exponentially. If you no longer need an old snapshot it is therefore advisable to null all references to it and call GC.Collect() before taking another one.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.MemoryProfiler.PackedGCHandle\">\n      <summary>\n        <para>A description of a GC handle used by the virtual machine.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedGCHandle.target\">\n      <summary>\n        <para>The address of the managed object that the GC handle is referencing.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.MemoryProfiler.PackedMemorySnapshot\">\n      <summary>\n        <para>PackedMemorySnapshot is a compact representation of a memory snapshot that a player has sent through the profiler connection.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedMemorySnapshot.connections\">\n      <summary>\n        <para>Connections is an array of from,to pairs that describe which things are keeping which other things alive.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedMemorySnapshot.gcHandles\">\n      <summary>\n        <para>All GC handles in use in the memorysnapshot.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedMemorySnapshot.managedHeapSections\">\n      <summary>\n        <para>Array of actual managed heap memory sections.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedMemorySnapshot.nativeObjects\">\n      <summary>\n        <para>All native C++ objects that were loaded at time of the snapshot.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedMemorySnapshot.nativeTypes\">\n      <summary>\n        <para>Descriptions of all the C++ unity types the profiled player knows about.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedMemorySnapshot.typeDescriptions\">\n      <summary>\n        <para>Descriptions of all the managed types that were known to the virtual machine when the snapshot was taken.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedMemorySnapshot.virtualMachineInformation\">\n      <summary>\n        <para>Information about the virtual machine running executing the managade code inside the player.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.MemoryProfiler.PackedNativeType\">\n      <summary>\n        <para>A description of a C++ unity type.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedNativeType.name\">\n      <summary>\n        <para>Name of this C++ unity type.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedNativeType.nativeBaseTypeArrayIndex\">\n      <summary>\n        <para>The index used to obtain the native C++ base class description from the PackedMemorySnapshot.nativeTypes array.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.MemoryProfiler.PackedNativeUnityEngineObject\">\n      <summary>\n        <para>Description of a C++ unity object in memory.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedNativeUnityEngineObject.hideFlags\">\n      <summary>\n        <para>The hideFlags this native object has.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedNativeUnityEngineObject.instanceId\">\n      <summary>\n        <para>InstanceId of this object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedNativeUnityEngineObject.isDontDestroyOnLoad\">\n      <summary>\n        <para>Has this object has been marked as DontDestroyOnLoad?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedNativeUnityEngineObject.isManager\">\n      <summary>\n        <para>Is this native object an internal Unity manager object?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedNativeUnityEngineObject.isPersistent\">\n      <summary>\n        <para>Is this object persistent? (Assets are persistent, objects stored in scenes are persistent,  dynamically created objects are not)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedNativeUnityEngineObject.name\">\n      <summary>\n        <para>Name of this object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedNativeUnityEngineObject.nativeObjectAddress\">\n      <summary>\n        <para>The memory address of the native C++ object. This matches the \"m_CachedPtr\" field of UnityEngine.Object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedNativeUnityEngineObject.nativeTypeArrayIndex\">\n      <summary>\n        <para>The index used to obtain the native C++ type description from the PackedMemorySnapshot.nativeTypes array.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.PackedNativeUnityEngineObject.size\">\n      <summary>\n        <para>Size in bytes of this object.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.MemoryProfiler.TypeDescription\">\n      <summary>\n        <para>Description of a managed type.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.TypeDescription.arrayRank\">\n      <summary>\n        <para>If this is an arrayType, this will return the rank of the array. (1 for a 1-dimensional array, 2 for a 2-dimensional array, etc)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.TypeDescription.assembly\">\n      <summary>\n        <para>Name of the assembly this type was loaded from.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.TypeDescription.baseOrElementTypeIndex\">\n      <summary>\n        <para>The base type for this type, pointed to by an index into PackedMemorySnapshot.typeDescriptions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.TypeDescription.fields\">\n      <summary>\n        <para>An array containing descriptions of all fields of this type.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.TypeDescription.isArray\">\n      <summary>\n        <para>Is this type an array?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.TypeDescription.isValueType\">\n      <summary>\n        <para>Is this type a value type? (if it's not a value type, it's a reference type)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.TypeDescription.name\">\n      <summary>\n        <para>Name of this type.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.TypeDescription.size\">\n      <summary>\n        <para>Size in bytes of an instance of this type. If this type is an arraytype, this describes the amount of bytes a single element in the array will take up.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.TypeDescription.staticFieldBytes\">\n      <summary>\n        <para>The actual contents of the bytes that store this types static fields, at the point of time when the snapshot was taken.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.TypeDescription.typeIndex\">\n      <summary>\n        <para>The typeIndex of this type.  This index is an index into the PackedMemorySnapshot.typeDescriptions array.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.TypeDescription.typeInfoAddress\">\n      <summary>\n        <para>The address in memory that contains the description of this type inside the virtual machine. This can be used to match managed objects in the heap to their corresponding TypeDescription,  as the first pointer of a managed object points to its type description.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.MemoryProfiler.VirtualMachineInformation\">\n      <summary>\n        <para>Information about a virtual machine that provided a memory snapshot.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.VirtualMachineInformation.allocationGranularity\">\n      <summary>\n        <para>Allocation granularity in bytes used by the virtual machine allocator.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.VirtualMachineInformation.arrayBoundsOffsetInHeader\">\n      <summary>\n        <para>Offset in bytes inside the object header of an array object where the bounds of the array is stored.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.VirtualMachineInformation.arrayHeaderSize\">\n      <summary>\n        <para>Size in bytes of the header of an array object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.VirtualMachineInformation.arraySizeOffsetInHeader\">\n      <summary>\n        <para>Offset in bytes inside the object header of an array object where the size of the array is stored.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.VirtualMachineInformation.heapFormatVersion\">\n      <summary>\n        <para>A version number that will change when the object layout inside the managed heap will change.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.VirtualMachineInformation.objectHeaderSize\">\n      <summary>\n        <para>Size in bytes of the header of each managed object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MemoryProfiler.VirtualMachineInformation.pointerSize\">\n      <summary>\n        <para>Size in bytes of a pointer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Menu\">\n      <summary>\n        <para>Menu class to manipulate the menu item.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Menu.#ctor\">\n      <summary>\n        <para>Default constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Menu.GetChecked(System.String)\">\n      <summary>\n        <para>Get the check status of the given menu.</para>\n      </summary>\n      <param name=\"menuPath\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Menu.SetChecked(System.String,System.Boolean)\">\n      <summary>\n        <para>Set the check status of the given menu.</para>\n      </summary>\n      <param name=\"menuPath\"></param>\n      <param name=\"isChecked\"></param>\n    </member>\n    <member name=\"T:UnityEditor.MenuCommand\">\n      <summary>\n        <para>Used to extract the context for a MenuItem.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MenuCommand.context\">\n      <summary>\n        <para>Context is the object that is the target of a menu command.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MenuCommand.userData\">\n      <summary>\n        <para>An integer for passing custom information to a menu item.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MenuCommand.#ctor(UnityEngine.Object,System.Int32)\">\n      <summary>\n        <para>Creates a new MenuCommand object.</para>\n      </summary>\n      <param name=\"inContext\"></param>\n      <param name=\"inUserData\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MenuCommand.#ctor(UnityEngine.Object)\">\n      <summary>\n        <para>Creates a new MenuCommand object.</para>\n      </summary>\n      <param name=\"inContext\"></param>\n    </member>\n    <member name=\"T:UnityEditor.MenuItem\">\n      <summary>\n        <para>The MenuItem attribute allows you to add menu items to the main menu and inspector context menus.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MenuItem.#ctor(System.String)\">\n      <summary>\n        <para>Creates a menu item and invokes the static function following it, when the menu item is selected.</para>\n      </summary>\n      <param name=\"itemName\">The itemName is the menu item represented like a pathname.\n        For example the menu item could be \"GameObject/Do Something\".</param>\n      <param name=\"isValidateFunction\">If isValidateFunction is true, this is a validation\n        function and will be called before invoking the menu function with the same itemName.</param>\n      <param name=\"priority\">The order by which the menu items are displayed.</param>\n    </member>\n    <member name=\"M:UnityEditor.MenuItem.#ctor(System.String,System.Boolean)\">\n      <summary>\n        <para>Creates a menu item and invokes the static function following it, when the menu item is selected.</para>\n      </summary>\n      <param name=\"itemName\">The itemName is the menu item represented like a pathname.\n        For example the menu item could be \"GameObject/Do Something\".</param>\n      <param name=\"isValidateFunction\">If isValidateFunction is true, this is a validation\n        function and will be called before invoking the menu function with the same itemName.</param>\n      <param name=\"priority\">The order by which the menu items are displayed.</param>\n    </member>\n    <member name=\"M:UnityEditor.MenuItem.#ctor(System.String,System.Boolean,System.Int32)\">\n      <summary>\n        <para>Creates a menu item and invokes the static function following it, when the menu item is selected.</para>\n      </summary>\n      <param name=\"itemName\">The itemName is the menu item represented like a pathname.\n        For example the menu item could be \"GameObject/Do Something\".</param>\n      <param name=\"isValidateFunction\">If isValidateFunction is true, this is a validation\n        function and will be called before invoking the menu function with the same itemName.</param>\n      <param name=\"priority\">The order by which the menu items are displayed.</param>\n    </member>\n    <member name=\"T:UnityEditor.MeshUtility\">\n      <summary>\n        <para>Various utilities for mesh manipulation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MeshUtility.GetMeshCompression(UnityEngine.Mesh)\">\n      <summary>\n        <para>Returns the mesh compression setting for a Mesh.</para>\n      </summary>\n      <param name=\"mesh\">The mesh to get information on.</param>\n    </member>\n    <member name=\"M:UnityEditor.MeshUtility.Optimize(UnityEngine.Mesh)\">\n      <summary>\n        <para>Optimizes the mesh for GPU access.</para>\n      </summary>\n      <param name=\"mesh\"></param>\n    </member>\n    <member name=\"M:UnityEditor.MeshUtility.SetMeshCompression(UnityEngine.Mesh,UnityEditor.ModelImporterMeshCompression)\">\n      <summary>\n        <para>Change the mesh compression setting for a mesh.</para>\n      </summary>\n      <param name=\"mesh\">The mesh to set the compression mode for.</param>\n      <param name=\"compression\">The compression mode to set.</param>\n    </member>\n    <member name=\"M:UnityEditor.MeshUtility.SetPerTriangleUV2(UnityEngine.Mesh,UnityEngine.Vector2[])\">\n      <summary>\n        <para>Will insert per-triangle uv2 in mesh and handle vertex splitting etc.</para>\n      </summary>\n      <param name=\"src\"></param>\n      <param name=\"triUV\"></param>\n    </member>\n    <member name=\"T:UnityEditor.MessageType\">\n      <summary>\n        <para>User message types.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MessageType.Error\">\n      <summary>\n        <para>Error message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MessageType.Info\">\n      <summary>\n        <para>Info message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MessageType.None\">\n      <summary>\n        <para>Neutral message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MessageType.Warning\">\n      <summary>\n        <para>Warning message.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.MobileTextureSubtarget\">\n      <summary>\n        <para>Compressed texture format for target build platform.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MobileTextureSubtarget.ASTC\">\n      <summary>\n        <para>ASTC texture compression.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MobileTextureSubtarget.DXT\">\n      <summary>\n        <para>S3 texture compression. Supported on devices with NVidia Tegra, Vivante and Intel GPUs.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MobileTextureSubtarget.ETC\">\n      <summary>\n        <para>ETC1 texture compression (or ETC2 for textures with alpha). ETC1 is supported by all devices. ETC2 is available on devices which support OpenGL ES 3.0; on OpenGL ES 2 devices the texture is decompressed on CPU.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MobileTextureSubtarget.ETC2\">\n      <summary>\n        <para>ETC2 texture compression. Available on devices which support OpenGL ES 3.0; on OpenGL ES 2 devices the texture is decompressed on CPU.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MobileTextureSubtarget.Generic\">\n      <summary>\n        <para>Don't override texture compression.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MobileTextureSubtarget.PVRTC\">\n      <summary>\n        <para>PowerVR texture compression. Available on devices with PowerVR GPU.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ModelImporter\">\n      <summary>\n        <para>Model importer lets you modify import settings from editor scripts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.addCollider\">\n      <summary>\n        <para>Add to imported meshes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.animationCompression\">\n      <summary>\n        <para>Animation compression setting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.animationPositionError\">\n      <summary>\n        <para>Allowed error of animation position compression.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.animationRotationError\">\n      <summary>\n        <para>Allowed error of animation rotation compression.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.animationScaleError\">\n      <summary>\n        <para>Allowed error of animation scale compression.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.animationType\">\n      <summary>\n        <para>Animator generation mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.animationWrapMode\">\n      <summary>\n        <para>The default wrap mode for the generated animation clips.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.bakeIK\">\n      <summary>\n        <para>Bake Inverse Kinematics (IK) when importing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.clipAnimations\">\n      <summary>\n        <para>Animation clips to split animation into. See Also: ModelImporterClipAnimation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.defaultClipAnimations\">\n      <summary>\n        <para>Generate a list of all default animation clip based on TakeInfo.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.extraExposedTransformPaths\">\n      <summary>\n        <para>Animation optimization setting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.extraUserProperties\">\n      <summary>\n        <para>Additional properties to treat as user properties.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.generateAnimations\">\n      <summary>\n        <para>Animation generation options.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.generateMaterials\">\n      <summary>\n        <para>Material generation options.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.generateSecondaryUV\">\n      <summary>\n        <para>Generate secondary UV set for lightmapping.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.globalScale\">\n      <summary>\n        <para>Global scale factor for importing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.humanDescription\">\n      <summary>\n        <para>The human description that is used to generate an Avatar during the import process.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.humanoidOversampling\">\n      <summary>\n        <para>Controls how much oversampling is used when importing humanoid animations for retargeting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.importAnimatedCustomProperties\">\n      <summary>\n        <para>Import animated custom properties from file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.importAnimation\">\n      <summary>\n        <para>Import animation from file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.importBlendShapes\">\n      <summary>\n        <para>Controls import of BlendShapes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.importCameras\">\n      <summary>\n        <para>Controls import of cameras. Basic properties like field of view, near plane distance and far plane distance can be animated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.importConstraints\">\n      <summary>\n        <para>Import animation constraints.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.importedTakeInfos\">\n      <summary>\n        <para>Generates the list of all imported take.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.importLights\">\n      <summary>\n        <para>Controls import of lights. Note that because light are defined differently in DCC tools, some light types or properties may not be exported. Basic properties like color and intensity can be animated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.importMaterials\">\n      <summary>\n        <para>Import materials from file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.importNormals\">\n      <summary>\n        <para>Vertex normal import options.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.importTangents\">\n      <summary>\n        <para>Vertex tangent import options.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.importVisibility\">\n      <summary>\n        <para>Use visibility properties to enable or disable MeshRenderer components.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.indexFormat\">\n      <summary>\n        <para>Format of the imported mesh index buffer data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.isBakeIKSupported\">\n      <summary>\n        <para>Is Bake Inverse Kinematics (IK) supported by this importer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.isFileScaleUsed\">\n      <summary>\n        <para>Is FileScale used when importing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.isReadable\">\n      <summary>\n        <para>Are mesh vertices and indices accessible from script?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.isTangentImportSupported\">\n      <summary>\n        <para>Is import of tangents supported by this importer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.isUseFileUnitsSupported\">\n      <summary>\n        <para>Is useFileUnits supported for this asset.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.keepQuads\">\n      <summary>\n        <para>If this is true, any quad faces that exist in the mesh data before it is imported are kept as quads instead of being split into two triangles, for the purposes of tessellation. Set this to false to disable this behavior.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.materialLocation\">\n      <summary>\n        <para>Material import location options.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.materialName\">\n      <summary>\n        <para>Material naming setting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.materialSearch\">\n      <summary>\n        <para>Existing material search setting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.meshCompression\">\n      <summary>\n        <para>Mesh compression setting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.motionNodeName\">\n      <summary>\n        <para>The path of the transform used to generation the motion of the animation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.normalCalculationMode\">\n      <summary>\n        <para>Normal generation options for ModelImporter.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.normalImportMode\">\n      <summary>\n        <para>Normals import mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.normalSmoothingAngle\">\n      <summary>\n        <para>Smoothing angle (in degrees) for calculating normals.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.optimizeGameObjects\">\n      <summary>\n        <para>Animation optimization setting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.optimizeMesh\">\n      <summary>\n        <para>Vertex optimization setting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.preserveHierarchy\">\n      <summary>\n        <para>If true, always create an explicit prefab root. Otherwise, if the model has a single root, it is reused as the prefab root.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.referencedClips\">\n      <summary>\n        <para>Generates the list of all imported Animations.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.resampleCurves\">\n      <summary>\n        <para>If set to false, the importer will not resample curves when possible.\nRead more about.\n\nNotes:\n\n- Some unsupported FBX features (such as PreRotation or PostRotation on transforms) will override this setting. In these situations, animation curves will still be resampled even if the setting is disabled. For best results, avoid using PreRotation, PostRotation and GetRotationPivot.\n\n- This option was introduced in Version 5.3. Prior to this version, Unity's import behaviour was as if this option was always enabled. Therefore enabling the option gives the same behaviour as pre-5.3 animation import.\n</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.secondaryUVAngleDistortion\">\n      <summary>\n        <para>Threshold for angle distortion (in degrees) when generating secondary UV.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.secondaryUVAreaDistortion\">\n      <summary>\n        <para>Threshold for area distortion when generating secondary UV.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.secondaryUVHardAngle\">\n      <summary>\n        <para>Hard angle (in degrees) for generating secondary UV.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.secondaryUVPackMargin\">\n      <summary>\n        <para>Margin to be left between charts when packing secondary UV.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.sourceAvatar\">\n      <summary>\n        <para>Imports the HumanDescription from the given Avatar.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.splitTangentsAcrossSeams\">\n      <summary>\n        <para>Should tangents be split across UV seams.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.swapUVChannels\">\n      <summary>\n        <para>Swap primary and secondary UV channels when importing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.tangentImportMode\">\n      <summary>\n        <para>Tangents import mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.transformPaths\">\n      <summary>\n        <para>Generates the list of all imported Transforms.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.useFileScale\">\n      <summary>\n        <para>Use FileScale when importing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.useFileUnits\">\n      <summary>\n        <para>Detect file units and import as 1FileUnit=1UnityUnit, otherwise it will import as 1cm=1UnityUnit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporter.weldVertices\">\n      <summary>\n        <para>Combine vertices that share the same position in space.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.ModelImporter.CreateDefaultMaskForClip(UnityEditor.ModelImporterClipAnimation)\">\n      <summary>\n        <para>Creates a mask that matches the model hierarchy, and applies it to the provided ModelImporterClipAnimation.</para>\n      </summary>\n      <param name=\"clip\">Clip to which the mask will be applied.</param>\n    </member>\n    <member name=\"M:UnityEditor.ModelImporter.ExtractTextures(System.String)\">\n      <summary>\n        <para>Extracts the embedded textures from a model file (such as FBX or SketchUp).</para>\n      </summary>\n      <param name=\"folderPath\">The directory where the textures will be extracted.</param>\n      <returns>\n        <para>Returns true if the textures are extracted successfully, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ModelImporter.SearchAndRemapMaterials(UnityEditor.ModelImporterMaterialName,UnityEditor.ModelImporterMaterialSearch)\">\n      <summary>\n        <para>Search the project for matching materials and use them instead of the internal materials.</para>\n      </summary>\n      <param name=\"nameOption\">The name matching option.</param>\n      <param name=\"searchOption\">The search type option.</param>\n      <returns>\n        <para>Returns true if the materials have been successfly remapped, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.ModelImporterAnimationCompression\">\n      <summary>\n        <para>Animation compression options for ModelImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterAnimationCompression.KeyframeReduction\">\n      <summary>\n        <para>Perform keyframe reduction.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterAnimationCompression.KeyframeReductionAndCompression\">\n      <summary>\n        <para>Perform keyframe reduction and compression.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterAnimationCompression.Off\">\n      <summary>\n        <para>No animation compression.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterAnimationCompression.Optimal\">\n      <summary>\n        <para>Perform keyframe reduction and choose the best animation curve representation at runtime to reduce memory footprint (default).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ModelImporterAnimationType\">\n      <summary>\n        <para>Animation mode for ModelImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterAnimationType.Generic\">\n      <summary>\n        <para>Generate a generic animator.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterAnimationType.Human\">\n      <summary>\n        <para>Generate a human animator.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterAnimationType.Legacy\">\n      <summary>\n        <para>Generate a legacy animation type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterAnimationType.None\">\n      <summary>\n        <para>Generate no animation data.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ModelImporterClipAnimation\">\n      <summary>\n        <para>Animation clips to split animation into.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.additiveReferencePoseFrame\">\n      <summary>\n        <para>The additive reference pose frame.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.curves\">\n      <summary>\n        <para>Additionnal curves that will be that will be added during the import process.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.cycleOffset\">\n      <summary>\n        <para>Offset to the cycle of a looping animation, if a different time in it is desired to be the start.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.events\">\n      <summary>\n        <para>AnimationEvents that will be added during the import process.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.firstFrame\">\n      <summary>\n        <para>First frame of the clip.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.hasAdditiveReferencePose\">\n      <summary>\n        <para>Enable to defines an additive reference pose.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.heightFromFeet\">\n      <summary>\n        <para>Keeps the feet aligned with the root transform position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.heightOffset\">\n      <summary>\n        <para>Offset to the vertical root position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.keepOriginalOrientation\">\n      <summary>\n        <para>Keeps the vertical position as it is authored in the source file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.keepOriginalPositionXZ\">\n      <summary>\n        <para>Keeps the vertical position as it is authored in the source file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.keepOriginalPositionY\">\n      <summary>\n        <para>Keeps the vertical position as it is authored in the source file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.lastFrame\">\n      <summary>\n        <para>Last frame of the clip.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.lockRootHeightY\">\n      <summary>\n        <para>Enable to make vertical root motion be baked into the movement of the bones. Disable to make vertical root motion be stored as root motion.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.lockRootPositionXZ\">\n      <summary>\n        <para>Enable to make horizontal root motion be baked into the movement of the bones. Disable to make horizontal root motion be stored as root motion.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.lockRootRotation\">\n      <summary>\n        <para>Enable to make root rotation be baked into the movement of the bones. Disable to make root rotation be stored as root motion.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.loop\">\n      <summary>\n        <para>Is the clip a looping animation?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.loopPose\">\n      <summary>\n        <para>Enable to make the motion loop seamlessly.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.loopTime\">\n      <summary>\n        <para>Enable to make the clip loop.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.maskNeedsUpdating\">\n      <summary>\n        <para>Returns true when the source AvatarMask has changed. This only happens when  ModelImporterClipAnimation.maskType is set to ClipAnimationMaskType.CopyFromOther\nTo force a reload of the mask, simply set  ModelImporterClipAnimation.maskSource to the desired AvatarMask.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.maskSource\">\n      <summary>\n        <para>The AvatarMask used to mask transforms during the import process.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.maskType\">\n      <summary>\n        <para>Define mask type.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.mirror\">\n      <summary>\n        <para>Mirror left and right in this clip.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.name\">\n      <summary>\n        <para>Clip name.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.rotationOffset\">\n      <summary>\n        <para>Offset in degrees to the root rotation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.takeName\">\n      <summary>\n        <para>Take name.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ModelImporterClipAnimation.wrapMode\">\n      <summary>\n        <para>The wrap mode of the animation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.ModelImporterClipAnimation.ConfigureClipFromMask(UnityEngine.AvatarMask)\">\n      <summary>\n        <para>Copy the mask settings from an AvatarMask to the clip configuration.</para>\n      </summary>\n      <param name=\"mask\">AvatarMask from which the mask settings will be imported.</param>\n    </member>\n    <member name=\"M:UnityEditor.ModelImporterClipAnimation.ConfigureMaskFromClip(UnityEngine.AvatarMask&amp;)\">\n      <summary>\n        <para>Copy the current masking settings from the clip to an AvatarMask.</para>\n      </summary>\n      <param name=\"mask\">AvatarMask to which the masking values will be saved.</param>\n    </member>\n    <member name=\"T:UnityEditor.ModelImporterGenerateAnimations\">\n      <summary>\n        <para>Animation generation options for ModelImporter. These options relate to the legacy Animation system, they should only be used when ModelImporter.animationType==ModelImporterAnimationType.Legacy.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterGenerateAnimations.GenerateAnimations\">\n      <summary>\n        <para>Default animation import mode (All animations are stored in the root object).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterGenerateAnimations.InNodes\">\n      <summary>\n        <para>Generate animations in the objects that animate.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterGenerateAnimations.InOriginalRoots\">\n      <summary>\n        <para>Generate animations in the root objects of the animation package.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterGenerateAnimations.InRoot\">\n      <summary>\n        <para>Generate animations in the transform root objects.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterGenerateAnimations.None\">\n      <summary>\n        <para>Do not generate animations.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ModelImporterGenerateMaterials\">\n      <summary>\n        <para>Material generation options for ModelImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterGenerateMaterials.None\">\n      <summary>\n        <para>Do not generate materials.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterGenerateMaterials.PerSourceMaterial\">\n      <summary>\n        <para>Generate a material for each material in the source asset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterGenerateMaterials.PerTexture\">\n      <summary>\n        <para>Generate a material for each texture used.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ModelImporterHumanoidOversampling\">\n      <summary>\n        <para>Humanoid Oversampling available multipliers.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterHumanoidOversampling.X1\">\n      <summary>\n        <para>Default Humanoid Oversampling multiplier = 1 which is equivalent to no oversampling.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterHumanoidOversampling.X2\">\n      <summary>\n        <para>Humanoid Oversampling samples at 2 times the sampling rate found in the imported file.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterHumanoidOversampling.X4\">\n      <summary>\n        <para>Humanoid Oversampling samples at 4 times the sampling rate found in the imported file.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterHumanoidOversampling.X8\">\n      <summary>\n        <para>Humanoid Oversampling samples at 8 times the sampling rate found in the imported file.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ModelImporterIndexFormat\">\n      <summary>\n        <para>Format of the imported mesh index buffer data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterIndexFormat.Auto\">\n      <summary>\n        <para>Use 16 or 32 bit index buffer depending on mesh size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterIndexFormat.UInt16\">\n      <summary>\n        <para>Use 16 bit index buffer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterIndexFormat.UInt32\">\n      <summary>\n        <para>Use 32 bit index buffer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ModelImporterMaterialLocation\">\n      <summary>\n        <para>Material import options for ModelImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterMaterialLocation.External\">\n      <summary>\n        <para>Extract the materials and textures from the model.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterMaterialLocation.InPrefab\">\n      <summary>\n        <para>Unity imports materials as sub-assets.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ModelImporterMaterialName\">\n      <summary>\n        <para>Material naming options for ModelImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterMaterialName.BasedOnMaterialName\">\n      <summary>\n        <para>Use a material name of the form &lt;materialName&gt;.mat.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterMaterialName.BasedOnModelNameAndMaterialName\">\n      <summary>\n        <para>Use material names in the form &lt;modelFileName&gt;-&lt;materialName&gt;.mat.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterMaterialName.BasedOnTextureName\">\n      <summary>\n        <para>Use material names in the form &lt;textureName&gt;.mat.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterMaterialName.BasedOnTextureName_Or_ModelNameAndMaterialName\">\n      <summary>\n        <para>&lt;textureName&gt;.mat or &lt;modelFileName&gt;-&lt;materialName&gt;.mat material name.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ModelImporterMaterialSearch\">\n      <summary>\n        <para>Material search options for ModelImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterMaterialSearch.Everywhere\">\n      <summary>\n        <para>Search in all project.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterMaterialSearch.Local\">\n      <summary>\n        <para>Search in local Materials folder.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterMaterialSearch.RecursiveUp\">\n      <summary>\n        <para>Recursive-up search in Materials folders.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ModelImporterMeshCompression\">\n      <summary>\n        <para>Mesh compression options for ModelImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterMeshCompression.High\">\n      <summary>\n        <para>High amount of mesh compression.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterMeshCompression.Low\">\n      <summary>\n        <para>Low amount of mesh compression.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterMeshCompression.Medium\">\n      <summary>\n        <para>Medium amount of mesh compression.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterMeshCompression.Off\">\n      <summary>\n        <para>No mesh compression (default).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ModelImporterNormalCalculationMode\">\n      <summary>\n        <para>Normal generation options for ModelImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterNormalCalculationMode.AngleWeighted\">\n      <summary>\n        <para>The normals are weighted by the vertex angle on each face.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterNormalCalculationMode.AreaAndAngleWeighted\">\n      <summary>\n        <para>The normals are weighted by both the face area and the vertex angle on each face.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterNormalCalculationMode.AreaWeighted\">\n      <summary>\n        <para>The normals are weighted by the face area.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterNormalCalculationMode.Unweighted\">\n      <summary>\n        <para>The normals are not weighted.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterNormalCalculationMode.Unweighted_Legacy\">\n      <summary>\n        <para>The normals are unweighted. This option uses the legacy algorithm for handling hard edges.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ModelImporterNormals\">\n      <summary>\n        <para>Vertex normal generation options for ModelImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterNormals.Calculate\">\n      <summary>\n        <para>Calculate vertex normals.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterNormals.Import\">\n      <summary>\n        <para>Import vertex normals from model file (default).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterNormals.None\">\n      <summary>\n        <para>Do not import vertex normals.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ModelImporterTangents\">\n      <summary>\n        <para>Vertex tangent generation options for ModelImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterTangents.CalculateLegacy\">\n      <summary>\n        <para>Calculate tangents with legacy algorithm.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterTangents.CalculateLegacyWithSplitTangents\">\n      <summary>\n        <para>Calculate tangents with legacy algorithm, with splits across UV charts.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterTangents.CalculateMikk\">\n      <summary>\n        <para>Calculate tangents using MikkTSpace (default).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterTangents.Import\">\n      <summary>\n        <para>Import vertex tangents from model file.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterTangents.None\">\n      <summary>\n        <para>Do not import vertex tangents.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ModelImporterTangentSpaceMode\">\n      <summary>\n        <para>Tangent space generation options for ModelImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterTangentSpaceMode.Calculate\">\n      <summary>\n        <para>Calculate tangents.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterTangentSpaceMode.Import\">\n      <summary>\n        <para>Import normals/tangents from file.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ModelImporterTangentSpaceMode.None\">\n      <summary>\n        <para>Strip normals/tangents.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.MonoScript\">\n      <summary>\n        <para>Representation of Script assets.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.MonoScript.FromMonoBehaviour(UnityEngine.MonoBehaviour)\">\n      <summary>\n        <para>Returns the MonoScript object containing specified MonoBehaviour.</para>\n      </summary>\n      <param name=\"behaviour\">The MonoBehaviour whose MonoScript should be returned.</param>\n    </member>\n    <member name=\"M:UnityEditor.MonoScript.FromScriptableObject(UnityEngine.ScriptableObject)\">\n      <summary>\n        <para>Returns the MonoScript object containing specified ScriptableObject.</para>\n      </summary>\n      <param name=\"scriptableObject\">The ScriptableObject whose MonoScript should be returned.</param>\n    </member>\n    <member name=\"M:UnityEditor.MonoScript.GetClass\">\n      <summary>\n        <para>Returns the System.Type object of the class implemented by this script.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.MouseCursor\">\n      <summary>\n        <para>Custom mouse cursor shapes used with EditorGUIUtility.AddCursorRect.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.Arrow\">\n      <summary>\n        <para>Normal pointer arrow.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.ArrowMinus\">\n      <summary>\n        <para>Arrow with the minus symbol next to it.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.ArrowPlus\">\n      <summary>\n        <para>Arrow with the plus symbol next to it.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.CustomCursor\">\n      <summary>\n        <para>The current user defined cursor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.FPS\">\n      <summary>\n        <para>Cursor with an eye and stylized arrow keys for FPS navigation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.Link\">\n      <summary>\n        <para>Arrow with a Link badge (for assigning pointers).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.MoveArrow\">\n      <summary>\n        <para>Arrow with the move symbol next to it for the sceneview.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.Orbit\">\n      <summary>\n        <para>Cursor with an eye for orbit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.Pan\">\n      <summary>\n        <para>Cursor with a dragging hand for pan.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.ResizeHorizontal\">\n      <summary>\n        <para>Horizontal resize arrows.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.ResizeUpLeft\">\n      <summary>\n        <para>Resize up-Left for window edges.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.ResizeUpRight\">\n      <summary>\n        <para>Resize up-right for window edges.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.ResizeVertical\">\n      <summary>\n        <para>Vertical resize arrows.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.RotateArrow\">\n      <summary>\n        <para>Arrow with the rotate symbol next to it for the sceneview.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.ScaleArrow\">\n      <summary>\n        <para>Arrow with the scale symbol next to it for the sceneview.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.SlideArrow\">\n      <summary>\n        <para>Arrow with small arrows for indicating sliding at number fields.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.SplitResizeLeftRight\">\n      <summary>\n        <para>Left-Right resize arrows for window splitters.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.SplitResizeUpDown\">\n      <summary>\n        <para>Up-Down resize arrows for window splitters.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.Text\">\n      <summary>\n        <para>Text cursor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.MouseCursor.Zoom\">\n      <summary>\n        <para>Cursor with a magnifying glass for zoom.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.MovieImporter\">\n      <summary>\n        <para>AssetImporter for importing MovieTextures.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MovieImporter.duration\">\n      <summary>\n        <para>Duration of the Movie to be imported in seconds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MovieImporter.linearTexture\">\n      <summary>\n        <para>Is the movie texture storing non-color data?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.MovieImporter.quality\">\n      <summary>\n        <para>Quality setting to use when importing the movie. This is a float value from 0 to 1.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Networking.PlayerConnection.ConnectedPlayer\">\n      <summary>\n        <para>Information of the connected player.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Networking.PlayerConnection.ConnectedPlayer.name\">\n      <summary>\n        <para>The name of the connected player.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Networking.PlayerConnection.ConnectedPlayer.playerId\">\n      <summary>\n        <para>The ID of the player connected.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Networking.PlayerConnection.EditorConnection\">\n      <summary>\n        <para>Handles the connection from the Editor to the Player.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Networking.PlayerConnection.EditorConnection.ConnectedPlayers\">\n      <summary>\n        <para>A list of the connected players.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Networking.PlayerConnection.EditorConnection.DisconnectAll\">\n      <summary>\n        <para>This disconnects all of the active connections.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Networking.PlayerConnection.EditorConnection.Initialize\">\n      <summary>\n        <para>Initializes the EditorConnection.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Networking.PlayerConnection.EditorConnection.Register(System.Guid,UnityEngine.Events.UnityAction`1&lt;UnityEngine.Networking.PlayerConnection.MessageEventArgs&gt;)\">\n      <summary>\n        <para>Registers a callback on a certain message ID.</para>\n      </summary>\n      <param name=\"messageId\">The message ID that invokes the callback when received by the Editor.</param>\n      <param name=\"callback\">Action that is executed when a message with ID messageId is received by the Editor.\nThe callback includes the data that is sent from the Player, and the Player's ID.\nThe Player ID is used to distinguish between multiple Players connected to the same Editor.</param>\n    </member>\n    <member name=\"M:UnityEditor.Networking.PlayerConnection.EditorConnection.RegisterConnection(UnityEngine.Events.UnityAction`1&lt;System.Int32&gt;)\">\n      <summary>\n        <para>Registers a callback, executed when a new Player connects to the Editor.</para>\n      </summary>\n      <param name=\"callback\">Action called when a new Player connects, with the Player ID of the Player.</param>\n    </member>\n    <member name=\"M:UnityEditor.Networking.PlayerConnection.EditorConnection.RegisterDisconnection(UnityEngine.Events.UnityAction`1&lt;System.Int32&gt;)\">\n      <summary>\n        <para>Registers a callback on a Player when that Player disconnects.</para>\n      </summary>\n      <param name=\"callback\">The Action that is called when the Player with the given Player ID disconnects.</param>\n    </member>\n    <member name=\"M:UnityEditor.Networking.PlayerConnection.EditorConnection.Send(System.Guid,System.Byte[],System.Int32)\">\n      <summary>\n        <para>Sends data to multiple or single Player(s).</para>\n      </summary>\n      <param name=\"messageId\">Type ID of the message to send to the Player(s).</param>\n      <param name=\"playerId\">If set, the message will only send to the Player with this ID.</param>\n      <param name=\"data\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Networking.PlayerConnection.EditorConnection.Send(System.Guid,System.Byte[])\">\n      <summary>\n        <para>Sends data to multiple or single Player(s).</para>\n      </summary>\n      <param name=\"messageId\">Type ID of the message to send to the Player(s).</param>\n      <param name=\"playerId\">If set, the message will only send to the Player with this ID.</param>\n      <param name=\"data\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Networking.PlayerConnection.EditorConnection.Unregister(System.Guid,UnityEngine.Events.UnityAction`1&lt;UnityEngine.Networking.PlayerConnection.MessageEventArgs&gt;)\">\n      <summary>\n        <para>Deregisters a registered callback.</para>\n      </summary>\n      <param name=\"messageId\">Message ID associated with the callback that you wish to deregister.</param>\n      <param name=\"callback\">The Action callback you wish to deregister.</param>\n    </member>\n    <member name=\"T:UnityEditor.ObjectFactory\">\n      <summary>\n        <para>Use the DefaultObject to create a new UnityEngine.Object in the editor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.ObjectFactory.AddComponent(UnityEngine.GameObject,System.Type)\">\n      <summary>\n        <para>Creates a new component and adds it to the specified GameObject.</para>\n      </summary>\n      <param name=\"gameObject\">The GameObject to add the new component to.</param>\n      <param name=\"type\">The type of component to create and add to the GameObject.</param>\n      <returns>\n        <para>Returns the component that was created and added to the GameObject.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ObjectFactory.AddComponent(UnityEngine.GameObject)\">\n      <summary>\n        <para>Creates a new component and adds it to the specified GameObject.</para>\n      </summary>\n      <param name=\"gameObject\">The GameObject to add the new component to.</param>\n      <param name=\"type\">The type of component to create and add to the GameObject.</param>\n      <returns>\n        <para>Returns the component that was created and added to the GameObject.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ObjectFactory.CreateGameObject(System.String,System.Type[])\">\n      <summary>\n        <para>Creates a new GameObject.</para>\n      </summary>\n      <param name=\"name\">Name of the GameObject.</param>\n      <param name=\"types\">The optional types to add to the GameObject when created.</param>\n    </member>\n    <member name=\"M:UnityEditor.ObjectFactory.CreateInstance(System.Type)\">\n      <summary>\n        <para>Create a new instance of the given type.</para>\n      </summary>\n      <param name=\"type\">The type of instance to create.</param>\n    </member>\n    <member name=\"M:UnityEditor.ObjectFactory.CreateInstance\">\n      <summary>\n        <para>Create a new instance of the given type.</para>\n      </summary>\n      <param name=\"type\">The type of instance to create.</param>\n    </member>\n    <member name=\"M:UnityEditor.ObjectFactory.CreatePrimitive(UnityEngine.PrimitiveType)\">\n      <summary>\n        <para>Creates a GameObject primitive.</para>\n      </summary>\n      <param name=\"type\">The type of primitive to create.</param>\n    </member>\n    <member name=\"T:UnityEditor.ObjectNames\">\n      <summary>\n        <para>Helper class for constructing displayable names for objects.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.ObjectNames.GetClassName(UnityEngine.Object)\">\n      <summary>\n        <para>Class name of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEditor.ObjectNames.GetDragAndDropTitle(UnityEngine.Object)\">\n      <summary>\n        <para>Drag and drop title for an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEditor.ObjectNames.GetInspectorTitle(UnityEngine.Object)\">\n      <summary>\n        <para>Inspector title for an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEditor.ObjectNames.GetUniqueName(System.String[],System.String)\">\n      <summary>\n        <para>Make a unique name using the provided name as a base.\n\nIf the target name is in the provided list of existing names, a unique name is generated by appending the next available numerical increment.</para>\n      </summary>\n      <param name=\"existingNames\">A list of pre-existing names.</param>\n      <param name=\"name\">Desired name to be used as is, or as a base.</param>\n      <returns>\n        <para>A name not found in the list of pre-existing names.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ObjectNames.NicifyVariableName(System.String)\">\n      <summary>\n        <para>Make a displayable name for a variable.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEditor.ObjectNames.SetNameSmart(UnityEngine.Object,System.String)\">\n      <summary>\n        <para>Sets the name of an Object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"T:UnityEditor.ObjectPreview\">\n      <summary>\n        <para>Base Class to derive from when creating Custom Previews.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ObjectPreview.target\">\n      <summary>\n        <para>The object currently being previewed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.ObjectPreview.DrawPreview(UnityEngine.Rect)\">\n      <summary>\n        <para>This is the first entry point for Preview Drawing.</para>\n      </summary>\n      <param name=\"previewArea\">The available area to draw the preview.</param>\n    </member>\n    <member name=\"M:UnityEditor.ObjectPreview.GetInfoString\">\n      <summary>\n        <para>Implement this method to show object information on top of the object preview.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.ObjectPreview.GetPreviewTitle\">\n      <summary>\n        <para>Override this method if you want to change the label of the Preview area.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.ObjectPreview.HasPreviewGUI\">\n      <summary>\n        <para>Can this component be Previewed in its current state?</para>\n      </summary>\n      <returns>\n        <para>True if this component can be Previewed in its current state.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ObjectPreview.Initialize(UnityEngine.Object[])\">\n      <summary>\n        <para>Called when the Preview gets created with the objects being previewed.</para>\n      </summary>\n      <param name=\"targets\">The objects being previewed.</param>\n    </member>\n    <member name=\"M:UnityEditor.ObjectPreview.MoveNextTarget\">\n      <summary>\n        <para>Called to iterate through the targets, this will be used when previewing more than one target.</para>\n      </summary>\n      <returns>\n        <para>True if there is another target available.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ObjectPreview.OnInteractivePreviewGUI(UnityEngine.Rect,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Implement to create your own interactive custom preview. Interactive custom previews are used in the preview area of the inspector and the object selector.</para>\n      </summary>\n      <param name=\"r\">Rectangle in which to draw the preview.</param>\n      <param name=\"background\">Background image.</param>\n    </member>\n    <member name=\"M:UnityEditor.ObjectPreview.OnPreviewGUI(UnityEngine.Rect,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Implement to create your own custom preview for the preview area of the inspector, primary editor headers and the object selector.</para>\n      </summary>\n      <param name=\"r\">Rectangle in which to draw the preview.</param>\n      <param name=\"background\">Background image.</param>\n    </member>\n    <member name=\"M:UnityEditor.ObjectPreview.OnPreviewSettings\">\n      <summary>\n        <para>Override this method if you want to show custom controls in the preview header.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.ObjectPreview.ResetTarget\">\n      <summary>\n        <para>Called to Reset the target before iterating through them.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PackageManager.BuildUtilities\">\n      <summary>\n        <para>Utility class that allows packages to register build callbacks with the Unity Package Manager.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PackageManager.BuildUtilities.RegisterShouldIncludeInBuildCallback(UnityEditor.PackageManager.IShouldIncludeInBuildCallback)\">\n      <summary>\n        <para>Register a callback object for a package.</para>\n      </summary>\n      <param name=\"cb\">Object of a class that implements the IShouldIncludeInBuildCallback interface.</param>\n    </member>\n    <member name=\"T:UnityEditor.PackageManager.Client\">\n      <summary>\n        <para>Unity Package Manager client class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PackageManager.Client.Add(System.String)\">\n      <summary>\n        <para>Adds a package dependency to the project.</para>\n      </summary>\n      <param name=\"packageIdOrName\">The name or ID of the package to add.  If only the name is specified, the latest version of the package is installed.</param>\n      <returns>\n        <para>An AddRequest instance, which you can use to monitor the asynchronous operation, and when complete, get the result.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PackageManager.Client.List()\">\n      <summary>\n        <para>Lists the packages the project depends on.</para>\n      </summary>\n      <param name=\"offlineMode\">Specifies whether or not the Package Manager requests the latest information about the project's packages from the remote Unity package registry. When offlineMode is true, the PackageInfo objects in the PackageCollection returned by the Package Manager contain information obtained from the local package cache, which could be out of date.</param>\n      <returns>\n        <para>A ListRequest instance, which you can use to monitor the asynchronous operation, and when complete, get the result.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PackageManager.Client.Remove(System.String)\">\n      <summary>\n        <para>Removes a previously added package from the project.</para>\n      </summary>\n      <param name=\"packageIdOrName\">The name or the ID of the package to remove from the project.  If only the name is specified, the package is removed regardless of the installed version.</param>\n      <returns>\n        <para>A RemoveRequest instance, which you can use to monitor the status of the asynchronous operation.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PackageManager.Client.ResetToEditorDefaults\">\n      <summary>\n        <para>Resets the list of packages installed for this project to the editor's default configuration. This operation will clear all packages added to the project and keep only the packages set for the current editor default configuration.</para>\n      </summary>\n      <returns>\n        <para>A ResetToEditorDefaultsRequest instance, which you can use to monitor the status of the asynchronous operation.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PackageManager.Client.Search(System.String)\">\n      <summary>\n        <para>Searches the Unity package registry for the given package.</para>\n      </summary>\n      <param name=\"packageIdOrName\">The name or ID of the package.</param>\n      <returns>\n        <para>A SearchRequest instance, which you can use to monitor the asynchronous operation, and when complete, get the result.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PackageManager.Client.SearchAll\">\n      <summary>\n        <para>Searches the Unity package registry for all packages compatible with the current Unity version.</para>\n      </summary>\n      <returns>\n        <para>A SearchRequest instance, which you can use to monitor the asynchronous operation, and when complete, get the result.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.PackageManager.DependencyInfo\">\n      <summary>\n        <para>Structure describing dependencies to other packages in PackageInfo.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.DependencyInfo.name\">\n      <summary>\n        <para>The name of the dependency.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.DependencyInfo.version\">\n      <summary>\n        <para>The version of the dependency.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PackageManager.Error\">\n      <summary>\n        <para>Structure describing the error of a package operation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.Error.errorCode\">\n      <summary>\n        <para>Numerical error code.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.Error.message\">\n      <summary>\n        <para>Error message or description.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PackageManager.ErrorCode\">\n      <summary>\n        <para>Package operation Error.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.ErrorCode.Conflict\">\n      <summary>\n        <para>Conflicting package versions were found.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.ErrorCode.Forbidden\">\n      <summary>\n        <para>Operation was not allowed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.ErrorCode.InvalidParameter\">\n      <summary>\n        <para>Operation had invalid parameters.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.ErrorCode.NotFound\">\n      <summary>\n        <para>A package required to fulfill the operation was not found.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.ErrorCode.Unknown\">\n      <summary>\n        <para>Operation resulted in an unknown error.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.PackageManager.IShouldIncludeInBuildCallback\">\n      <summary>\n        <para>Interface used by the Package Manager to request build information about packages.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.IShouldIncludeInBuildCallback.PackageName\">\n      <summary>\n        <para>The package name.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PackageManager.IShouldIncludeInBuildCallback.ShouldIncludeInBuild(System.String)\">\n      <summary>\n        <para>Defines the signature for the function invoked by the Package Manager to determine whether a package file should be included or excluded from a project build.</para>\n      </summary>\n      <param name=\"path\">The absolute path of the file to be included or excluded.</param>\n      <returns>\n        <para>Return true if the file given by path should be included in the build; otherwise, return false.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.PackageManager.PackageCollection\">\n      <summary>\n        <para>A collection of PackageInfo objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.PackageCollection.error\">\n      <summary>\n        <para>The error associated with the package collection.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PackageManager.PackageInfo\">\n      <summary>\n        <para>Structure describing a Unity Package.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.PackageInfo.assetPath\">\n      <summary>\n        <para>The asset path of the package in the AssetDatabase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.PackageInfo.category\">\n      <summary>\n        <para>Category of the package.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.PackageInfo.dependencies\">\n      <summary>\n        <para>An array of DependencyInfos listing all the packages this package directly depends on.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.PackageInfo.description\">\n      <summary>\n        <para>Detailed description of the package.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.PackageInfo.displayName\">\n      <summary>\n        <para>Friendly display name of the package.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.PackageInfo.errors\">\n      <summary>\n        <para>The errors associated with the package.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.PackageInfo.keywords\">\n      <summary>\n        <para>An array of keywords associated with the package.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.PackageInfo.name\">\n      <summary>\n        <para>Unique name of the package.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.PackageInfo.packageId\">\n      <summary>\n        <para>Identifier of the package.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.PackageInfo.resolvedDependencies\">\n      <summary>\n        <para>An array of DependencyInfos listing all the packages this package directly or indirectly depends to and the versions they resolved to.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.PackageInfo.resolvedPath\">\n      <summary>\n        <para>The local path of the project on disk.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.PackageInfo.source\">\n      <summary>\n        <para>Source of the package contents.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.PackageInfo.status\">\n      <summary>\n        <para>The status of the package.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.PackageInfo.version\">\n      <summary>\n        <para>Version of the package.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.PackageInfo.versions\">\n      <summary>\n        <para>A VersionsInfo instance containing information about the available versions of the package.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PackageManager.PackageSource\">\n      <summary>\n        <para>Source of packages.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.PackageSource.BuiltIn\">\n      <summary>\n        <para>The package is built-in and part of Unity.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.PackageSource.Embedded\">\n      <summary>\n        <para>The package is embedded in the Unity project.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.PackageSource.Git\">\n      <summary>\n        <para>The package is referenced directly by a Git URL.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.PackageSource.Local\">\n      <summary>\n        <para>The package is referenced by a local path.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.PackageSource.Registry\">\n      <summary>\n        <para>The package is from a registry.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.PackageSource.Unknown\">\n      <summary>\n        <para>The package source is unknown.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PackageManager.PackageStatus\">\n      <summary>\n        <para>Unity Package Manager package status.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.PackageStatus.Available\">\n      <summary>\n        <para>The package and its dependencies are available on the local file system.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.PackageStatus.Error\">\n      <summary>\n        <para>An error occurred while transfering the package or one of its dependencies to the local file system.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.PackageStatus.InProgress\">\n      <summary>\n        <para>The package is being transferred into the local file system.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.PackageStatus.Unavailable\">\n      <summary>\n        <para>The package or one of its dependencies cannot be found on the local file system.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.PackageStatus.Unknown\">\n      <summary>\n        <para>The status of the package is unknown.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PackageManager.Requests.AddRequest\">\n      <summary>\n        <para>Represents an asynchronous request to add a package to the project.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PackageManager.Requests.ListRequest\">\n      <summary>\n        <para>Represents an asynchronous request to list the packages in the project.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PackageManager.Requests.RemoveRequest\">\n      <summary>\n        <para>Represents an asynchronous request to remove a package from the project.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.Requests.RemoveRequest.PackageIdOrName\">\n      <summary>\n        <para>The package being removed by this request.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PackageManager.Requests.Request\">\n      <summary>\n        <para>Tracks the state of an asynchronous Unity Package Manager (Upm) server operation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.Requests.Request.Error\">\n      <summary>\n        <para>The error returned by the request, if any.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.Requests.Request.IsCompleted\">\n      <summary>\n        <para>Whether the request is complete.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.Requests.Request.Status\">\n      <summary>\n        <para>The request status.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PackageManager.Requests.Request`1\">\n      <summary>\n        <para>Tracks the state of an asynchronous Unity Package Manager (Upm) server operation that returns a non-empty response.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.Requests.Request_1.Result\">\n      <summary>\n        <para>The response to the request.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PackageManager.Requests.ResetToEditorDefaultsRequest\">\n      <summary>\n        <para>Represents an asynchronous request to reset the project packages to the current Editor default configuration.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PackageManager.Requests.SearchRequest\">\n      <summary>\n        <para>Represents an asynchronous request to find a package.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.Requests.SearchRequest.PackageIdOrName\">\n      <summary>\n        <para>The package id or name used in this search operation.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PackageManager.StatusCode\">\n      <summary>\n        <para>Unity Package Manager operation status.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.StatusCode.Failure\">\n      <summary>\n        <para>Package manager operation failed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.StatusCode.InProgress\">\n      <summary>\n        <para>Package manager operation is in progress.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PackageManager.StatusCode.Success\">\n      <summary>\n        <para>Package manager operation completed successfully.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PackageManager.VersionsInfo\">\n      <summary>\n        <para>Identifies the available versions of a package and which are the compatible, latest, and recommended versions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.VersionsInfo.all\">\n      <summary>\n        <para>All available versions of the package.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.VersionsInfo.compatible\">\n      <summary>\n        <para>Versions of the package compatible with the current version of Unity.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.VersionsInfo.latest\">\n      <summary>\n        <para>Latest version of the package.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.VersionsInfo.latestCompatible\">\n      <summary>\n        <para>Latest version of the package compatible with the current version of Unity.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PackageManager.VersionsInfo.recommended\">\n      <summary>\n        <para>The recommended version of the package.  If the recommended version is not available, then this property is an empty string.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PauseState\">\n      <summary>\n        <para>Enumeration specifying the current pause state of the Editor.\n\nSee Also: PlayModeStateChange, EditorApplication.pauseStateChanged, EditorApplication.isPaused.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PauseState.Paused\">\n      <summary>\n        <para>Occurs as soon as the Editor is paused, which may occur during either edit mode or play mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PauseState.Unpaused\">\n      <summary>\n        <para>Occurs as soon as the Editor is unpaused, which may occur during either edit mode or play mode.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PhysicsDebugWindow\">\n      <summary>\n        <para>Displays the Physics Debug Visualization options.\n\nThe Physics Debug Visualization is only displayed if this window is visible.\n\nSee Also: PhysicsVisualizationSettings.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PhysicsVisualizationSettings\">\n      <summary>\n        <para>This class contains the settings controlling the Physics Debug Visualization.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PhysicsVisualizationSettings.baseAlpha\">\n      <summary>\n        <para>Alpha amount used for transparency blending.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PhysicsVisualizationSettings.colorVariance\">\n      <summary>\n        <para>Used to disinguish neighboring Colliders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PhysicsVisualizationSettings.devOptions\">\n      <summary>\n        <para>Shows extra options used to develop and debug the physics visualization.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PhysicsVisualizationSettings.dirtyCount\">\n      <summary>\n        <para>Dirty marker used for refreshing the GUI.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PhysicsVisualizationSettings.enableMouseSelect\">\n      <summary>\n        <para>Enables the mouse-over highlighting and mouse selection modes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PhysicsVisualizationSettings.filterWorkflow\">\n      <summary>\n        <para>See PhysicsVisualizationSettings.FilterWorkflow.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PhysicsVisualizationSettings.forceOverdraw\">\n      <summary>\n        <para>Forcing the drawing of Colliders on top of any other geometry, regardless of depth.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PhysicsVisualizationSettings.kinematicColor\">\n      <summary>\n        <para>Color for kinematic Rigidbodies.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PhysicsVisualizationSettings.rigidbodyColor\">\n      <summary>\n        <para>Color for Rigidbodies, primarily active ones.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PhysicsVisualizationSettings.showCollisionGeometry\">\n      <summary>\n        <para>Should the PhysicsDebugWindow display the collision geometry.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PhysicsVisualizationSettings.sleepingBodyColor\">\n      <summary>\n        <para>Color for Rigidbodies that are controlled by the physics simulator, but are not currently being simulated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PhysicsVisualizationSettings.staticColor\">\n      <summary>\n        <para>Color for Colliders that do not have a Rigidbody component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PhysicsVisualizationSettings.terrainTilesMax\">\n      <summary>\n        <para>Maximum number of mesh tiles available to draw all Terrain Colliders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PhysicsVisualizationSettings.triggerColor\">\n      <summary>\n        <para>Color for Colliders that are Triggers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PhysicsVisualizationSettings.useSceneCam\">\n      <summary>\n        <para>Controls whether the SceneView or the GameView camera is used. Not shown in the UI.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PhysicsVisualizationSettings.viewDistance\">\n      <summary>\n        <para>Colliders within this distance will be displayed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.ClearMouseHighlight\">\n      <summary>\n        <para>Clears the highlighted Collider.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.DeinitDebugDraw\">\n      <summary>\n        <para>Deinitializes the physics debug visualization system and tracking of changes Colliders.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PhysicsVisualizationSettings.FilterWorkflow\">\n      <summary>\n        <para>Decides whether the Workflow in the Physics Debug window should be inclusive\n (&lt;a href=\"PhysicsVisualizationSettings.FilterWorkflow.ShowSelectedItems.html\"&gt;ShowSelectedItems&lt;a&gt;) or exclusive (&lt;a href=\"PhysicsVisualizationSettings.FilterWorkflow.HideSelectedItems.html\"&gt;HideSelectedItems&lt;a&gt;).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PhysicsVisualizationSettings.FilterWorkflow.HideSelectedItems\">\n      <summary>\n        <para>With HideSelectedItems you can hide selected filter items in order to easily discard uninteresting Collider properties thereby making overview and navigation easier.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PhysicsVisualizationSettings.FilterWorkflow.ShowSelectedItems\">\n      <summary>\n        <para>With ShowSelectedItems and the Select None button is it easy to monitor very specific Colliders.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.GetShowBoxColliders(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow)\">\n      <summary>\n        <para>Should BoxColliders be shown.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.GetShowCapsuleColliders(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow)\">\n      <summary>\n        <para>Should CapsuleColliders be shown.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.GetShowCollisionLayer(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow,System.Int32)\">\n      <summary>\n        <para>Should the given layer for the given filterWorkflow be considered by the display filter.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n      <param name=\"layer\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.GetShowCollisionLayerMask(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow)\">\n      <summary>\n        <para>Should the mask representing the layers for the given filterWorkflow be considered by the display filter.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.GetShowKinematicBodies(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow)\">\n      <summary>\n        <para>Should the kinematic Rigidbodies for the given filterWorkflow be considered by the display filter.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.GetShowMeshColliders(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow,UnityEditor.PhysicsVisualizationSettings/MeshColliderType)\">\n      <summary>\n        <para>Should MeshColliders be shown.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n      <param name=\"colliderType\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.GetShowRigidbodies(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow)\">\n      <summary>\n        <para>Should any Rigidbodies for the given filterWorkflow be considered by the display filter.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.GetShowSleepingBodies(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow)\">\n      <summary>\n        <para>Should the sleeping Rigidbodies for the given filterWorkflow be considered by the display filter.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.GetShowSphereColliders(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow)\">\n      <summary>\n        <para>Should SphereColliders be shown.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.GetShowStaticColliders(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow)\">\n      <summary>\n        <para>Should the Colliders without a Rigidbody component be considered by the display filter for the given filterWorkflow.</para>\n      </summary>\n      <param name=\"filterWorkFlow\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.GetShowTerrainColliders(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow)\">\n      <summary>\n        <para>Should TerrainColliders be shown.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.GetShowTriggers(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow)\">\n      <summary>\n        <para>Should the triggers for the given filterWorkflow be considered by the display filter.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.HasMouseHighlight\">\n      <summary>\n        <para>Returns true if there currently is any kind of physics object highlighted.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.InitDebugDraw\">\n      <summary>\n        <para>Initializes the physics debug visualization system. The system must be initialized for any physics objects to be visualized. It is normally initialized by the PhysicsDebugWindow.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PhysicsVisualizationSettings.MeshColliderType\">\n      <summary>\n        <para>Is a MeshCollider convex.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PhysicsVisualizationSettings.MeshColliderType.Convex\">\n      <summary>\n        <para>Corresponds to MeshCollider.convex is true.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PhysicsVisualizationSettings.MeshColliderType.NonConvex\">\n      <summary>\n        <para>Corresponds to MeshCollider.convex is false.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.Reset\">\n      <summary>\n        <para>Resets the visualization options to their default state.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.SetShowBoxColliders(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow,System.Boolean)\">\n      <summary>\n        <para>Should BoxColliders be shown.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n      <param name=\"show\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.SetShowCapsuleColliders(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow,System.Boolean)\">\n      <summary>\n        <para>Should CapsuleColliders be shown.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n      <param name=\"show\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.SetShowCollisionLayer(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Should the given layer for the given filterWorkflow be considered by the display filter.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n      <param name=\"layer\"></param>\n      <param name=\"show\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.SetShowCollisionLayerMask(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow,System.Int32)\">\n      <summary>\n        <para>Should the mask representing the layers for the given filterWorkflow be considered by the display filter.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n      <param name=\"mask\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.SetShowForAllFilters(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow,System.Boolean)\">\n      <summary>\n        <para>Enables or disables all filtering items for the current filterWorkflow.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n      <param name=\"selected\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.SetShowKinematicBodies(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow,System.Boolean)\">\n      <summary>\n        <para>Should the kinematic Rigidbodies for the given filterWorkflow be considered by the display filter.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n      <param name=\"show\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.SetShowMeshColliders(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow,UnityEditor.PhysicsVisualizationSettings/MeshColliderType,System.Boolean)\">\n      <summary>\n        <para>Should MeshColliders be shown.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n      <param name=\"colliderType\"></param>\n      <param name=\"show\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.SetShowRigidbodies(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow,System.Boolean)\">\n      <summary>\n        <para>Should any Rigidbodies for the given filterWorkflow be considered by the display filter.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n      <param name=\"show\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.SetShowSleepingBodies(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow,System.Boolean)\">\n      <summary>\n        <para>Should the sleeping Rigidbodies for the given filterWorkflow be considered by the display filter.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n      <param name=\"show\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.SetShowSphereColliders(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow,System.Boolean)\">\n      <summary>\n        <para>Should SphereColliders be shown.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n      <param name=\"show\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.SetShowStaticColliders(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow,System.Boolean)\">\n      <summary>\n        <para>Should the Colliders without a Rigidbody component be considered by the display filter for the given filterWorkflow.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n      <param name=\"show\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.SetShowTerrainColliders(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow,System.Boolean)\">\n      <summary>\n        <para>Should TerrainColliders be shown.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n      <param name=\"show\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.SetShowTriggers(UnityEditor.PhysicsVisualizationSettings/FilterWorkflow,System.Boolean)\">\n      <summary>\n        <para>Should the triggers for the given filterWorkflow be considered by the display filter.</para>\n      </summary>\n      <param name=\"filterWorkflow\"></param>\n      <param name=\"show\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PhysicsVisualizationSettings.UpdateMouseHighlight(UnityEngine.Vector2)\">\n      <summary>\n        <para>Updates the mouse-over highlight at the given mouse position in screen space.</para>\n      </summary>\n      <param name=\"screenPos\"></param>\n    </member>\n    <member name=\"T:UnityEditor.PivotMode\">\n      <summary>\n        <para>Where is the tool handle placed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PivotMode.Center\">\n      <summary>\n        <para>The tool handle is at the graphical center of the selection.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PivotMode.Pivot\">\n      <summary>\n        <para>The tool handle is on the pivot point of the active object.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PivotRotation\">\n      <summary>\n        <para>How is the tool handle oriented.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PivotRotation.Global\">\n      <summary>\n        <para>The tool handle is aligned along the global axes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PivotRotation.Local\">\n      <summary>\n        <para>The tool handle is oriented from the active object.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlatformIcon\">\n      <summary>\n        <para>Icon slot container.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlatformIcon.height\">\n      <summary>\n        <para>The height of the icon in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlatformIcon.kind\">\n      <summary>\n        <para>The PlatformIconKind is specific to the target platform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlatformIcon.layerCount\">\n      <summary>\n        <para>The number of texture layers the icon slot currently contains.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlatformIcon.maxLayerCount\">\n      <summary>\n        <para>The maximum number of texture layers required by the icon slot.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlatformIcon.minLayerCount\">\n      <summary>\n        <para>The minimum number of texture layers required by the icon slot.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlatformIcon.width\">\n      <summary>\n        <para>The width of the icon in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PlatformIcon.GetTexture(System.Int32)\">\n      <summary>\n        <para>Retrieve the texture which is currently assigned to the specified layer.</para>\n      </summary>\n      <param name=\"layer\">Cannot be larger than PlatformIcon.maxLayerCount.</param>\n    </member>\n    <member name=\"M:UnityEditor.PlatformIcon.GetTextures\">\n      <summary>\n        <para>Retrieve an array of all textures which are currently assigned to the icon slot.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PlatformIcon.SetTexture(UnityEngine.Texture2D,System.Int32)\">\n      <summary>\n        <para>Assign a texture to the specified layer.</para>\n      </summary>\n      <param name=\"layer\">Cannot be larger than PlatformIcon.maxLayerCount.</param>\n      <param name=\"texture\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlatformIcon.SetTextures(UnityEngine.Texture2D[])\">\n      <summary>\n        <para>Assign all available icon layers.</para>\n      </summary>\n      <param name=\"textures\">Must be an array of size PlatformIcon.maxLayerCount.</param>\n    </member>\n    <member name=\"T:UnityEditor.PlatformIconKind\">\n      <summary>\n        <para>Icon kind wrapper.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Playables.Utility\">\n      <summary>\n        <para>Editor utility functions for the Playable graph and its nodes.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.Playables.Utility.destroyingGraph(System.Action`1&lt;UnityEngine.Playables.PlayableGraph&gt;)\">\n      <summary>\n        <para>Event triggered whenever a PlayableGraph is being destroyed.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEditor.Playables.Utility.graphCreated(System.Action`1&lt;UnityEngine.Playables.PlayableGraph&gt;)\">\n      <summary>\n        <para>Event triggered whenever a new PlayableGraph is created.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Playables.Utility.GetAllGraphs\">\n      <summary>\n        <para>Returns all existing PlayableGraphs.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings\">\n      <summary>\n        <para>Player Settings is where you define various parameters for the final game that you will build in Unity. Some of these values are used in the Resolution Dialog that launches when you open a standalone game.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.accelerometerFrequency\">\n      <summary>\n        <para>Accelerometer update frequency.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.actionOnDotNetUnhandledException\">\n      <summary>\n        <para>Sets the crash behavior on .NET unhandled exception.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.advancedLicense\">\n      <summary>\n        <para>Is the advanced version being used?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.allowedAutorotateToLandscapeLeft\">\n      <summary>\n        <para>Is auto-rotation to landscape left supported?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.allowedAutorotateToLandscapeRight\">\n      <summary>\n        <para>Is auto-rotation to landscape right supported?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.allowedAutorotateToPortrait\">\n      <summary>\n        <para>Is auto-rotation to portrait supported?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.allowedAutorotateToPortraitUpsideDown\">\n      <summary>\n        <para>Is auto-rotation to portrait upside-down supported?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.allowFullscreenSwitch\">\n      <summary>\n        <para>If enabled, allows the user to switch between full screen and windowed mode using OS specific keyboard short cuts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.allowUnsafeCode\">\n      <summary>\n        <para>Allow 'unsafe' C# code code to be compiled for predefined assemblies.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.aotOptions\">\n      <summary>\n        <para>Additional AOT compilation options. Shared by AOT platforms.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.apiCompatibilityLevel\">\n      <summary>\n        <para>Deprecated. Use PlayerSettings.GetApiCompatibilityLevel and PlayerSettings.SetApiCompatibilityLevel instead.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.applicationIdentifier\">\n      <summary>\n        <para>The application identifier for the currently selected build target.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.bakeCollisionMeshes\">\n      <summary>\n        <para>Pre bake collision meshes on player build.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.bundleVersion\">\n      <summary>\n        <para>Application bundle version shared between iOS &amp; Android platforms.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.captureSingleScreen\">\n      <summary>\n        <para>Defines if fullscreen games should darken secondary displays.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.cloudProjectId\">\n      <summary>\n        <para>A unique cloud project identifier. It is unique for every project (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.colorSpace\">\n      <summary>\n        <para>Set the rendering color space for the current project.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.companyName\">\n      <summary>\n        <para>The name of your company.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.cursorHotspot\">\n      <summary>\n        <para>Default cursor's click position in pixels from the top left corner of the cursor image.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.d3d11FullscreenMode\">\n      <summary>\n        <para>Define how to handle fullscreen mode in Windows standalones (Direct3D 11 mode).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.d3d9FullscreenMode\">\n      <summary>\n        <para>Define how to handle fullscreen mode in Windows standalones (Direct3D 9 mode).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.defaultCursor\">\n      <summary>\n        <para>The default cursor for your application.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.defaultInterfaceOrientation\">\n      <summary>\n        <para>Default screen orientation for mobiles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.defaultIsFullScreen\">\n      <summary>\n        <para>If enabled, the game will default to fullscreen mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.defaultScreenHeight\">\n      <summary>\n        <para>Default vertical dimension of stand-alone player window.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.defaultScreenWidth\">\n      <summary>\n        <para>Default horizontal dimension of stand-alone player window.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.defaultWebScreenHeight\">\n      <summary>\n        <para>Default vertical dimension of web player window.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.defaultWebScreenWidth\">\n      <summary>\n        <para>Default horizontal dimension of web player window.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.displayResolutionDialog\">\n      <summary>\n        <para>Defines the behaviour of the Resolution Dialog on product launch.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.enable360StereoCapture\">\n      <summary>\n        <para>Enable 360 Stereo Capture support on the current build target.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.enableCrashReportAPI\">\n      <summary>\n        <para>Enables CrashReport API.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.enableInternalProfiler\">\n      <summary>\n        <para>Enables internal profiler.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.enableMetalAPIValidation\">\n      <summary>\n        <para>Enables Metal API validation in the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.firstStreamedLevelWithResources\">\n      <summary>\n        <para>First level to have access to all Resources.Load assets in Streamed Web Players.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.forceSingleInstance\">\n      <summary>\n        <para>Restrict standalone players to a single concurrent running instance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.fullScreenMode\">\n      <summary>\n        <para>Platform agnostic setting to define fullscreen behavior. Not all platforms support all modes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.gpuSkinning\">\n      <summary>\n        <para>Enable GPU skinning on capable platforms.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.graphicsJobMode\">\n      <summary>\n        <para>Selects the graphics job mode to use on platforms that support both Native and Legacy graphics jobs.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.graphicsJobs\">\n      <summary>\n        <para>Enable graphics jobs (multi threaded rendering).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iPhoneBundleIdentifier\">\n      <summary>\n        <para>The bundle identifier of the iPhone application.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.keyaliasPass\">\n      <summary>\n        <para>Password for the key used for signing an Android application.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.keystorePass\">\n      <summary>\n        <para>Password used for interacting with the Android Keystore.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.locationUsageDescription\">\n      <summary>\n        <para>Describes the reason for access to the user's location data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.logObjCUncaughtExceptions\">\n      <summary>\n        <para>Are ObjC uncaught exceptions logged?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.macFullscreenMode\">\n      <summary>\n        <para>Define how to handle fullscreen mode in macOS standalones.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.macRetinaSupport\">\n      <summary>\n        <para>Enable Retina support for macOS.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.muteOtherAudioSources\">\n      <summary>\n        <para>Stops or allows audio from other applications to play in the background while your Unity application is running.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.preserveFramebufferAlpha\">\n      <summary>\n        <para>When enabled, preserves the alpha value in the framebuffer to support rendering over native UI on Android.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.productName\">\n      <summary>\n        <para>The name of your product.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.protectGraphicsMemory\">\n      <summary>\n        <para>Protect graphics memory.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.renderingPath\">\n      <summary>\n        <para>Which rendering path is enabled?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.resizableWindow\">\n      <summary>\n        <para>Use resizable window in standalone player builds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.resolutionDialogBanner\">\n      <summary>\n        <para>The image to display in the Resolution Dialog window.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.runInBackground\">\n      <summary>\n        <para>If enabled, your game will continue to run after lost focus.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.scriptingRuntimeVersion\">\n      <summary>\n        <para>The scripting runtime version setting. Change this to set the version the Editor uses and restart the Editor to apply the change.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.showUnitySplashScreen\">\n      <summary>\n        <para>Should the builtin Unity splash screen be shown?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.singlePassStereoRendering\">\n      <summary>\n        <para>Should Unity support single-pass stereo rendering?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.splashScreenStyle\">\n      <summary>\n        <para>The style to use for the builtin Unity splash screen.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.statusBarHidden\">\n      <summary>\n        <para>Returns if status bar should be hidden. Supported on iOS only; on Android, the status bar is always hidden.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.stereoRenderingPath\">\n      <summary>\n        <para>Active stereo rendering path</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.stereoscopic3D\">\n      <summary>\n        <para>Should player render in stereoscopic 3d on supported hardware?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.stripEngineCode\">\n      <summary>\n        <para>Remove unused Engine code from your build (IL2CPP-only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.strippingLevel\">\n      <summary>\n        <para>Managed code stripping level.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.stripUnusedMeshComponents\">\n      <summary>\n        <para>Should unused Mesh components be excluded from game build?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.use32BitDisplayBuffer\">\n      <summary>\n        <para>32-bit Display Buffer is used.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.useAnimatedAutorotation\">\n      <summary>\n        <para>Let the OS autorotate the screen as the device orientation changes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.useDirect3D11\">\n      <summary>\n        <para>Should Direct3D 11 be used when available?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.useHDRDisplay\">\n      <summary>\n        <para>Switch display to HDR mode (if available).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.useMacAppStoreValidation\">\n      <summary>\n        <para>Enable receipt validation for the Mac App Store.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.usePlayerLog\">\n      <summary>\n        <para>Write a log file with debugging information.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.virtualRealitySplashScreen\">\n      <summary>\n        <para>Virtual Reality specific splash screen.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.virtualRealitySupported\">\n      <summary>\n        <para>Enable Virtual Reality support on the current build target.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.visibleInBackground\">\n      <summary>\n        <para>On Windows, show the application in the background if Fullscreen Windowed mode is used.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.vulkanEnableSetSRGBWrite\">\n      <summary>\n        <para>Enables Graphics.SetSRGBWrite() on Vulkan renderer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.vulkanUseSWCommandBuffers\">\n      <summary>\n        <para>Use software command buffers for building rendering commands on Vulkan.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.xboxEnableAvatar\">\n      <summary>\n        <para>Xbox 360 Avatars.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.Android\">\n      <summary>\n        <para>Android specific player settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.androidIsGame\">\n      <summary>\n        <para>Publish the build as a game rather than a regular application. This option affects devices running Android 5.0 Lollipop and later</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.androidTVCompatibility\">\n      <summary>\n        <para>Provide a build that is Android TV compatible.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.blitType\">\n      <summary>\n        <para>Choose how content is drawn to the screen.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.buildApkPerCpuArchitecture\">\n      <summary>\n        <para>Create a separate APK for each CPU architecture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.bundleVersionCode\">\n      <summary>\n        <para>Android bundle version code.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.disableDepthAndStencilBuffers\">\n      <summary>\n        <para>Disable Depth and Stencil Buffers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.forceInternetPermission\">\n      <summary>\n        <para>Force internet permission flag.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.forceSDCardPermission\">\n      <summary>\n        <para>Force SD card permission.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.keyaliasName\">\n      <summary>\n        <para>Android key alias name.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.keyaliasPass\">\n      <summary>\n        <para>Android key alias password.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.keystoreName\">\n      <summary>\n        <para>Android keystore name.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.keystorePass\">\n      <summary>\n        <para>Android keystore password.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.licenseVerification\">\n      <summary>\n        <para>License verification flag.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.maxAspectRatio\">\n      <summary>\n        <para>Maximum aspect ratio which is supported by the application.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.minSdkVersion\">\n      <summary>\n        <para>The minimum API level required for your application to run.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.preferredInstallLocation\">\n      <summary>\n        <para>Preferred application install location.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.showActivityIndicatorOnLoading\">\n      <summary>\n        <para>Application should show ActivityIndicator when loading.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.splashScreenScale\">\n      <summary>\n        <para>Android splash screen scale mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.targetArchitectures\">\n      <summary>\n        <para>A set of CPU architectures for the Android build target.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.targetDevice\">\n      <summary>\n        <para>Android target device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.targetSdkVersion\">\n      <summary>\n        <para>The target API level of your application.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.use24BitDepthBuffer\">\n      <summary>\n        <para>24-bit Depth Buffer is used.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.useAPKExpansionFiles\">\n      <summary>\n        <para>Use APK Expansion Files.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Android.ARCoreEnabled\">\n      <summary>\n        <para>Enable support for Google ARCore on supported devices.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.Facebook\">\n      <summary>\n        <para>Facebook specific Player settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.Facebook.sdkVersion\">\n      <summary>\n        <para>Version of Facebook SDK to use for this project.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetAdditionalIl2CppArgs\">\n      <summary>\n        <para>IL2CPP build arguments.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetApiCompatibilityLevel(UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Gets .NET API compatibility level for specified BuildTargetGroup.</para>\n      </summary>\n      <param name=\"buildTargetGroup\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetApplicationIdentifier(UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Get the application identifier for the specified platform.</para>\n      </summary>\n      <param name=\"targetGroup\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetArchitecture(UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Gets the BuildTargetPlatformGroup architecture.</para>\n      </summary>\n      <param name=\"targetGroup\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetAvailableVirtualRealitySDKs(UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Returns a list of the available Virtual Reality SDKs that are supported on a given BuildTargetGroup.</para>\n      </summary>\n      <param name=\"targetGroup\">The BuildTargetGroup to return the list for.</param>\n      <returns>\n        <para>List of available Virtual Reality SDKs.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetDefaultScriptingBackend(UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Returns the default ScriptingImplementation used for the given platform group.</para>\n      </summary>\n      <param name=\"targetGroup\">The platform group to retrieve the scripting backend for.</param>\n      <returns>\n        <para>A ScriptingImplementation object that describes the default scripting backend used on that platform.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetGraphicsAPIs(UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Get graphics APIs to be used on a build platform.</para>\n      </summary>\n      <param name=\"platform\">Platform to get APIs for.</param>\n      <returns>\n        <para>Array of graphics APIs.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetIconsForTargetGroup(UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Returns the list of assigned icons for the specified platform.</para>\n      </summary>\n      <param name=\"platform\"></param>\n      <param name=\"kind\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetIconsForTargetGroup(UnityEditor.BuildTargetGroup,UnityEditor.IconKind)\">\n      <summary>\n        <para>Returns the list of assigned icons for the specified platform.</para>\n      </summary>\n      <param name=\"platform\"></param>\n      <param name=\"kind\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetIconSizesForTargetGroup(UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Returns a list of icon sizes for the specified platform.</para>\n      </summary>\n      <param name=\"platform\"></param>\n      <param name=\"kind\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetIconSizesForTargetGroup(UnityEditor.BuildTargetGroup,UnityEditor.IconKind)\">\n      <summary>\n        <para>Returns a list of icon sizes for the specified platform.</para>\n      </summary>\n      <param name=\"platform\"></param>\n      <param name=\"kind\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetIl2CppCompilerConfiguration(UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Gets compiler configuration used when compiling generated C++ code for a particular BuildTargetGroup.</para>\n      </summary>\n      <param name=\"targetGroup\">Build target group.</param>\n      <returns>\n        <para>Compiler configuration.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetIncrementalIl2CppBuild(UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Does IL2CPP platform use incremental build?</para>\n      </summary>\n      <param name=\"targetGroup\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetMobileMTRendering(UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Check if multithreaded rendering option for mobile platform is enabled.</para>\n      </summary>\n      <param name=\"targetGroup\">Mobile platform (Only iOS, tvOS and Android).</param>\n      <returns>\n        <para>Return true if multithreaded rendering option for targetGroup platform is enabled.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetPlatformIcons(UnityEditor.BuildTargetGroup,UnityEditor.PlatformIconKind)\">\n      <summary>\n        <para>Returns the list of available icon slots for the specified platform and  PlatformIconKind|kind.</para>\n      </summary>\n      <param name=\"platform\">The full list of platforms that support this API and the supported icon kinds can be found in PlatformIconKind|icon kinds.</param>\n      <param name=\"kind\">Each platform supports a different set of PlatformIconKind|icon kinds. These can be found in the specific platform namespace (for example iOSPlatformIconKind.</param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetPlatformVuforiaEnabled(UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Gets the current value of the Vuforia AR checkbox in the Player Settings for the specified buildTargetGroup.</para>\n      </summary>\n      <param name=\"targetGroup\">The BuildTargetGroup you wish to get the value for.</param>\n      <returns>\n        <para>True if Vuforia AR is enabled, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetPreloadedAssets\">\n      <summary>\n        <para>Returns the assets that will be loaded at start up in the player and be kept alive until the player terminates.</para>\n      </summary>\n      <returns>\n        <para>The assets to be preloaded.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetPropertyBool(System.String,UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Returns a PlayerSettings named bool property (with an optional build target it should apply to).</para>\n      </summary>\n      <param name=\"name\">Name of the property.</param>\n      <param name=\"target\">BuildTarget for which the property should apply (use default value BuildTargetGroup.Unknown to apply to all targets).</param>\n      <returns>\n        <para>The current value of the property.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetPropertyInt(System.String,UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Returns a PlayerSettings named int property (with an optional build target it should apply to).</para>\n      </summary>\n      <param name=\"name\">Name of the property.</param>\n      <param name=\"target\">BuildTarget for which the property should apply (use default value BuildTargetGroup.Unknown to apply to all targets).</param>\n      <returns>\n        <para>The current value of the property.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetPropertyOptionalBool(System.String,System.Boolean&amp;,UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Searches for property and assigns it's value to given variable.</para>\n      </summary>\n      <param name=\"name\">Name of the property.</param>\n      <param name=\"value\">Variable, to which to store the value of the property, if set.</param>\n      <param name=\"target\">An optional build target group, to which the property applies.</param>\n      <returns>\n        <para>True if property was set and it's value assigned to given variable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetPropertyOptionalInt(System.String,System.Int32&amp;,UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Searches for property and assigns it's value to given variable.</para>\n      </summary>\n      <param name=\"name\">Name of the property.</param>\n      <param name=\"value\">Variable, to which to store the value of the property, if set.</param>\n      <param name=\"target\">An optional build target group, to which the property applies.</param>\n      <returns>\n        <para>True if property was set and it's value assigned to given variable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetPropertyOptionalString(System.String,System.String&amp;,UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Searches for property and assigns it's value to given variable.</para>\n      </summary>\n      <param name=\"name\">Name of the property.</param>\n      <param name=\"value\">Variable, to which to store the value of the property, if set.</param>\n      <param name=\"target\">An optional build target group, to which the property applies.</param>\n      <returns>\n        <para>True if property was set and it's value assigned to given variable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetPropertyString(System.String,UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Returns a PlayerSettings named string property (with an optional build target it should apply to).</para>\n      </summary>\n      <param name=\"name\">Name of the property.</param>\n      <param name=\"target\">BuildTarget for which the property should apply (use default value BuildTargetGroup.Unknown to apply to all targets).</param>\n      <returns>\n        <para>The current value of the property.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetScriptingBackend(UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Gets the scripting framework for a BuildTargetPlatformGroup.</para>\n      </summary>\n      <param name=\"targetGroup\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetScriptingDefineSymbolsForGroup(UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Get user-specified symbols for script compilation for the given build target group.</para>\n      </summary>\n      <param name=\"targetGroup\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetStackTraceLogType(UnityEngine.LogType)\">\n      <summary>\n        <para>Get stack trace logging options.</para>\n      </summary>\n      <param name=\"logType\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetSupportedIconKindsForPlatform(UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Retrieve all icon kinds supported by the specified platform.</para>\n      </summary>\n      <param name=\"platform\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetUseDefaultGraphicsAPIs(UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Is a build platform using automatic graphics API choice?</para>\n      </summary>\n      <param name=\"platform\">Platform to get the flag for.</param>\n      <returns>\n        <para>Should best available graphics API be used.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetVirtualRealitySDKs(UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Get the List of Virtual Reality SDKs for a given BuildTargetGroup.</para>\n      </summary>\n      <param name=\"targetGroup\">The BuildTargetGroup to return the SDK list for.</param>\n      <returns>\n        <para>Ordered list of Virtual Reality SDKs.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.GetVirtualRealitySupported(UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Returns whether or not Virtual Reality Support is enabled for a given BuildTargetGroup.</para>\n      </summary>\n      <param name=\"targetGroup\">The BuildTargetGroup to return the value for.</param>\n      <returns>\n        <para>True if Virtual Reality Support is enabled.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.HasAspectRatio(UnityEditor.AspectRatio)\">\n      <summary>\n        <para>Returns whether or not the specified aspect ratio is enabled.</para>\n      </summary>\n      <param name=\"aspectRatio\"></param>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.iOS\">\n      <summary>\n        <para>iOS specific player settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.allowHTTPDownload\">\n      <summary>\n        <para>Should insecure HTTP downloads be allowed?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.appInBackgroundBehavior\">\n      <summary>\n        <para>Application behavior when entering background.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.appleDeveloperTeamID\">\n      <summary>\n        <para>Set this property with your Apple Developer Team ID. You can find this on the Apple Developer website under &lt;a href=\"https:developer.apple.comaccount#membership\"&gt; Account &gt; Membership &lt;/a&gt; . This sets the Team ID for the generated Xcode project, allowing developers to use the Build and Run functionality. An Apple Developer Team ID must be set here for automatic signing of your app.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.appleEnableAutomaticSigning\">\n      <summary>\n        <para>Set this property to true for Xcode to attempt to automatically sign your app based on your appleDeveloperTeamID.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.applicationDisplayName\">\n      <summary>\n        <para>iOS application display name.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.backgroundModes\">\n      <summary>\n        <para>Supported background execution modes (when appInBackgroundBehavior is set to iOSAppInBackgroundBehavior.Custom).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.buildNumber\">\n      <summary>\n        <para>The build number of the bundle</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.cameraUsageDescription\">\n      <summary>\n        <para>Describes the reason for access to the user's camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.deferSystemGesturesMode\">\n      <summary>\n        <para>Defer system gestures until the second swipe on specific edges.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.deferSystemGesturesMode\">\n      <summary>\n        <para>Defer system gestures until the second swipe on specific edges.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.disableDepthAndStencilBuffers\">\n      <summary>\n        <para>Disable Depth and Stencil Buffers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.exitOnSuspend\">\n      <summary>\n        <para>Application should exit when suspended to background.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.forceHardShadowsOnMetal\">\n      <summary>\n        <para>Should hard shadows be enforced when running on (mobile) Metal.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.hideHomeButton\">\n      <summary>\n        <para>Specifies whether the home button should be hidden in the iOS build of this application.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.iOSManualProvisioningProfileID\">\n      <summary>\n        <para>A provisioning profile Universally Unique Identifier (UUID) that Xcode will use to build your iOS app in Manual Signing mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.iOSManualProvisioningProfileType\">\n      <summary>\n        <para>A ProvisioningProfileType that will be set when building an iOS Xcode project.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.locationUsageDescription\">\n      <summary>\n        <para>Describes the reason for access to the user's location data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.microphoneUsageDescription\">\n      <summary>\n        <para>Describes the reason for access to the user's microphone.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.overrideIPodMusic\">\n      <summary>\n        <para>Determines iPod playing behavior.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.prerenderedIcon\">\n      <summary>\n        <para>Icon is prerendered.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.requiresFullScreen\">\n      <summary>\n        <para>RequiresFullScreen maps to Apple's plist build setting UIRequiresFullScreen, which is used to opt out of being eligible to participate in Slide Over and Split View for iOS 9.0 multitasking.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.requiresPersistentWiFi\">\n      <summary>\n        <para>Application requires persistent WiFi.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.scriptCallOptimization\">\n      <summary>\n        <para>Script calling optimization.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.sdkVersion\">\n      <summary>\n        <para>Active iOS SDK version used for build.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.showActivityIndicatorOnLoading\">\n      <summary>\n        <para>Application should show ActivityIndicator when loading.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.statusBarStyle\">\n      <summary>\n        <para>Status bar style.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.targetDevice\">\n      <summary>\n        <para>Targeted device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.targetOSVersion\">\n      <summary>\n        <para>Deployment minimal version of iOS.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.targetOSVersionString\">\n      <summary>\n        <para>Deployment minimal version of iOS.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.tvOSManualProvisioningProfileID\">\n      <summary>\n        <para>A provisioning profile Universally Unique Identifier (UUID) that Xcode will use to build your tvOS app in Manual Signing mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.tvOSManualProvisioningProfileType\">\n      <summary>\n        <para>A ProvisioningProfileType that will be set when building a tvOS Xcode project.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.iOS.useOnDemandResources\">\n      <summary>\n        <para>Indicates whether application will use On Demand Resources (ODR) API.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.iOS.SetiPadLaunchScreenType(UnityEditor.iOSLaunchScreenType)\">\n      <summary>\n        <para>Sets the mode which will be used to generate the app's launch screen Interface Builder (.xib) file for iPad.</para>\n      </summary>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.iOS.SetiPhoneLaunchScreenType(UnityEditor.iOSLaunchScreenType)\">\n      <summary>\n        <para>Sets the mode which will be used to generate the app's launch screen Interface Builder (.xib) file for iPhone.</para>\n      </summary>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.iOS.SetLaunchScreenImage(UnityEngine.Texture2D,UnityEditor.iOSLaunchScreenImageType)\">\n      <summary>\n        <para>Sets the image to display on screen when the game launches for the specified iOS device.</para>\n      </summary>\n      <param name=\"image\"></param>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.MTRendering\">\n      <summary>\n        <para>Is multi-threaded rendering enabled?</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.N3DS\">\n      <summary>\n        <para>Nintendo 3DS player settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.N3DS.applicationId\">\n      <summary>\n        <para>The unique ID of the application, issued by Nintendo.  (0x00300 -&gt; 0xf7fff)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.N3DS.compressStaticMem\">\n      <summary>\n        <para>Specify true to enable static memory compression or false to disable it.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.N3DS.disableDepthAndStencilBuffers\">\n      <summary>\n        <para>Disable depth/stencil buffers, to free up memory.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.N3DS.disableStereoscopicView\">\n      <summary>\n        <para>Disable sterescopic (3D) view on the upper screen.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.N3DS.enableSharedListOpt\">\n      <summary>\n        <para>Enable shared L/R command list, for increased performance with stereoscopic rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.N3DS.enableVSync\">\n      <summary>\n        <para>Enable vsync.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.N3DS.extSaveDataNumber\">\n      <summary>\n        <para>Specify the expanded save data number using 20 bits.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.N3DS.logoStyle\">\n      <summary>\n        <para>Application Logo Style.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.N3DS.mediaSize\">\n      <summary>\n        <para>Distribution media size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.N3DS.productCode\">\n      <summary>\n        <para>Specifies the product code, or the add-on content code.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.N3DS.region\">\n      <summary>\n        <para>Specifies the title region settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.N3DS.stackSize\">\n      <summary>\n        <para>Specify the stack size of the main thread, in bytes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.N3DS.targetPlatform\">\n      <summary>\n        <para>The 3DS target platform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.N3DS.title\">\n      <summary>\n        <para>The title of the application.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.N3DS.useExtSaveData\">\n      <summary>\n        <para>Specify true when using expanded save data.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.N3DS.LogoStyle\">\n      <summary>\n        <para>Nintendo 3DS logo style specification.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.N3DS.LogoStyle.iQue\">\n      <summary>\n        <para>For Chinese region titles.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.N3DS.LogoStyle.Distributed\">\n      <summary>\n        <para>For titles for which Nintendo purchased the publishing license from the software manufacturer, etc.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.N3DS.LogoStyle.Licensed\">\n      <summary>\n        <para>For all other titles.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.N3DS.LogoStyle.Nintendo\">\n      <summary>\n        <para>For Nintendo first-party titles.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.N3DS.MediaSize\">\n      <summary>\n        <para>Nintendo 3DS distribution media size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.N3DS.MediaSize.128MB\">\n      <summary>\n        <para>128MB</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.N3DS.MediaSize.1GB\">\n      <summary>\n        <para>1GB</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.N3DS.MediaSize.256MB\">\n      <summary>\n        <para>256MB</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.N3DS.MediaSize.2GB\">\n      <summary>\n        <para>2GB</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.N3DS.MediaSize.512MB\">\n      <summary>\n        <para>512MB</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.N3DS.Region\">\n      <summary>\n        <para>Nintendo 3DS Title region.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.N3DS.Region.All\">\n      <summary>\n        <para>For all regions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.N3DS.Region.America\">\n      <summary>\n        <para>For the American region.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.N3DS.Region.China\">\n      <summary>\n        <para>For the Chinese region.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.N3DS.Region.Europe\">\n      <summary>\n        <para>For the European region.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.N3DS.Region.Japan\">\n      <summary>\n        <para>For the Japanese region.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.N3DS.Region.Korea\">\n      <summary>\n        <para>For the Korean region.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.N3DS.Region.Taiwan\">\n      <summary>\n        <para>For the Taiwanese region.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.N3DS.TargetPlatform\">\n      <summary>\n        <para>Nintendo 3DS target platform.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.N3DS.TargetPlatform.NewNintendo3DS\">\n      <summary>\n        <para>Target the New Nintendo 3DS platform.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.N3DS.TargetPlatform.Nintendo3DS\">\n      <summary>\n        <para>Target the Nintendo 3DS platform.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.PS4.PS4AppCategory\">\n      <summary>\n        <para>PS4 application category.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PS4.PS4AppCategory.Application\">\n      <summary>\n        <para>Application.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.PS4.PS4EnterButtonAssignment\">\n      <summary>\n        <para>PS4 enter button assignment.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PS4.PS4EnterButtonAssignment.CircleButton\">\n      <summary>\n        <para>Circle button.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PS4.PS4EnterButtonAssignment.CrossButton\">\n      <summary>\n        <para>Cross button.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.PS4.PS4RemotePlayKeyAssignment\">\n      <summary>\n        <para>Remote Play key assignment.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PS4.PS4RemotePlayKeyAssignment.None\">\n      <summary>\n        <para>No Remote play key assignment.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PS4.PS4RemotePlayKeyAssignment.PatternA\">\n      <summary>\n        <para>Remote Play key layout configuration A.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PS4.PS4RemotePlayKeyAssignment.PatternB\">\n      <summary>\n        <para>Remote Play key layout configuration B.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PS4.PS4RemotePlayKeyAssignment.PatternC\">\n      <summary>\n        <para>Remote Play key layout configuration C.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PS4.PS4RemotePlayKeyAssignment.PatternD\">\n      <summary>\n        <para>Remote Play key layout configuration D.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PS4.PS4RemotePlayKeyAssignment.PatternE\">\n      <summary>\n        <para>Remote Play key layout configuration E.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PS4.PS4RemotePlayKeyAssignment.PatternF\">\n      <summary>\n        <para>Remote Play key layout configuration F.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PS4.PS4RemotePlayKeyAssignment.PatternG\">\n      <summary>\n        <para>Remote Play key layout configuration G.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PS4.PS4RemotePlayKeyAssignment.PatternH\">\n      <summary>\n        <para>Remote Play key layout configuration H.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.PSVita\">\n      <summary>\n        <para>PS Vita specific player settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.acquireBGM\">\n      <summary>\n        <para>Aquire PS Vita background music.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.appVersion\">\n      <summary>\n        <para>The PS Vita application version.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.category\">\n      <summary>\n        <para>The package build category.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.contentID\">\n      <summary>\n        <para>The applications content ID.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.drmType\">\n      <summary>\n        <para>PS Vita DRM Type.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.enterButtonAssignment\">\n      <summary>\n        <para>Specifies whether circle or cross will be used as the default enter button.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.healthWarning\">\n      <summary>\n        <para>Specifies whether or not a health warning will be added to the software manual.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.infoBarColor\">\n      <summary>\n        <para>Specifies the color of the PS Vita information bar, true = white, false = black.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.infoBarOnStartup\">\n      <summary>\n        <para>Specifies whether or not to show the PS Vita information bar when the application starts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.keystoneFile\">\n      <summary>\n        <para>Keystone file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.liveAreaBackroundPath\">\n      <summary>\n        <para>PS Vita Live area background image.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.liveAreaGatePath\">\n      <summary>\n        <para>PS Vita Live area gate image.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.liveAreaPath\">\n      <summary>\n        <para>PS Vita Live area path.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.liveAreaTrialPath\">\n      <summary>\n        <para>PS Vita Live area trial path.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.manualPath\">\n      <summary>\n        <para>PS Vita sofware manual.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.masterVersion\">\n      <summary>\n        <para>PS Vita content master version.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.mediaCapacity\">\n      <summary>\n        <para>Should always = 01.00.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.memoryExpansionMode\">\n      <summary>\n        <para>PS Vita memory expansion mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.npAgeRating\">\n      <summary>\n        <para>PSN Age rating.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.npCommsPassphrase\">\n      <summary>\n        <para>PS Vita NP Passphrase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.npCommsSig\">\n      <summary>\n        <para>PS Vita NP Signature.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.npCommunicationsID\">\n      <summary>\n        <para>PS Vita NP Communications ID.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.npSupportGBMorGJP\">\n      <summary>\n        <para>Support Game Boot Message or Game Joining Presence.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.npTitleDatPath\">\n      <summary>\n        <para>PS Vita NP Title Data File.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.npTrophyPackPath\">\n      <summary>\n        <para>Path specifying wher to copy a trophy pack from.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.packagePassword\">\n      <summary>\n        <para>32 character password for use if you want to access the contents of a package.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.paramSfxPath\">\n      <summary>\n        <para>Path specifying where to copy the package parameter file (param.sfx) from.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.parentalLevel\">\n      <summary>\n        <para>PS Vita parental level.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.patchChangeInfoPath\">\n      <summary>\n        <para>For cumlative patch packages.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.patchOriginalPackage\">\n      <summary>\n        <para>For building cumulative patch packages.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.powerMode\">\n      <summary>\n        <para>PS Vita power mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.saveDataQuota\">\n      <summary>\n        <para>Save data quota.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.scriptOptimizationLevel\">\n      <summary>\n        <para>Indicates the IL2CPP scripts' optimization level in a range of 0 to 2. 0 indicates no optimization and 2 indicates maximum optimization.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.shortTitle\">\n      <summary>\n        <para>The applications short title.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.storageType\">\n      <summary>\n        <para>PS Vita media type.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.tvBootMode\">\n      <summary>\n        <para>PS Vita TV boot mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.tvDisableEmu\">\n      <summary>\n        <para>PS Vita TV Disable Emu flag.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.upgradable\">\n      <summary>\n        <para>Indicates that this is an upgradable (trial) type application which can be converted to a full application by purchasing an upgrade.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.useLibLocation\">\n      <summary>\n        <para>Support for the PS Vita location library was removed by SCE in SDK 3.570.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.PSVita.AllowTwitterDialog\">\n      <summary>\n        <para>Support for the PS Vita twitter dialog was removed by SCE in SDK 3.570.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.PSVita.PSVitaAppCategory\">\n      <summary>\n        <para>Application package category enum.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PSVita.PSVitaAppCategory.Application\">\n      <summary>\n        <para>An application package.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PSVita.PSVitaAppCategory.ApplicationPatch\">\n      <summary>\n        <para>Application patch package.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.PSVita.PSVitaDRMType\">\n      <summary>\n        <para>DRM type enum.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PSVita.PSVitaDRMType.Free\">\n      <summary>\n        <para>Free content.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PSVita.PSVitaDRMType.PaidFor\">\n      <summary>\n        <para>Paid for content.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.PSVita.PSVitaEnterButtonAssignment\">\n      <summary>\n        <para>Enter button assignment enum.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PSVita.PSVitaEnterButtonAssignment.CircleButton\">\n      <summary>\n        <para>Circle button.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PSVita.PSVitaEnterButtonAssignment.CrossButton\">\n      <summary>\n        <para>Cross button.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PSVita.PSVitaEnterButtonAssignment.Default\">\n      <summary>\n        <para>Default.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.PSVita.PSVitaMemoryExpansionMode\">\n      <summary>\n        <para>Memory expansion mode enum.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PSVita.PSVitaMemoryExpansionMode.ExpandBy109MB\">\n      <summary>\n        <para>Enable 109MB memory expansion mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PSVita.PSVitaMemoryExpansionMode.ExpandBy29MB\">\n      <summary>\n        <para>Enable 29MB memory expansion mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PSVita.PSVitaMemoryExpansionMode.ExpandBy77MB\">\n      <summary>\n        <para>Enable 77MB memory expansion mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PSVita.PSVitaMemoryExpansionMode.None\">\n      <summary>\n        <para>Memory expansion disabled.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.PSVita.PSVitaPowerMode\">\n      <summary>\n        <para>Power mode enum.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PSVita.PSVitaPowerMode.ModeA\">\n      <summary>\n        <para>Mode A - default.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PSVita.PSVitaPowerMode.ModeB\">\n      <summary>\n        <para>Mode B - GPU High - No WLAN or COM.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PSVita.PSVitaPowerMode.ModeC\">\n      <summary>\n        <para>Mode C - GPU High - No Camera, OLED Low brightness.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.PSVita.PSVitaTvBootMode\">\n      <summary>\n        <para>PS Vita TV boot mode enum.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PSVita.PSVitaTvBootMode.Default\">\n      <summary>\n        <para>Default (Managed by System Software) (SCEE or SCEA).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PSVita.PSVitaTvBootMode.PSVitaBootablePSVitaTvBootable\">\n      <summary>\n        <para>PS Vita Bootable, PS Vita TV Bootable (SCEJ or SCE Asia).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.PSVita.PSVitaTvBootMode.PSVitaBootablePSVitaTvNotBootable\">\n      <summary>\n        <para>PS Vita Bootable, PS Vita TV Not Bootable (SCEJ or SCE Asia).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetAdditionalIl2CppArgs(System.String)\">\n      <summary>\n        <para>IL2CPP build arguments.</para>\n      </summary>\n      <param name=\"additionalArgs\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetApiCompatibilityLevel(UnityEditor.BuildTargetGroup,UnityEditor.ApiCompatibilityLevel)\">\n      <summary>\n        <para>Sets .NET API compatibility level for specified BuildTargetGroup.</para>\n      </summary>\n      <param name=\"buildTargetGroup\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetApplicationIdentifier(UnityEditor.BuildTargetGroup,System.String)\">\n      <summary>\n        <para>Set the application identifier for the specified platform.</para>\n      </summary>\n      <param name=\"targetGroup\"></param>\n      <param name=\"identifier\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetArchitecture(UnityEditor.BuildTargetGroup,System.Int32)\">\n      <summary>\n        <para>Sets the BuildTargetPlatformGroup architecture.</para>\n      </summary>\n      <param name=\"targetGroup\"></param>\n      <param name=\"architecture\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetAspectRatio(UnityEditor.AspectRatio,System.Boolean)\">\n      <summary>\n        <para>Enables the specified aspect ratio.</para>\n      </summary>\n      <param name=\"aspectRatio\"></param>\n      <param name=\"enable\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetGraphicsAPIs(UnityEditor.BuildTarget,UnityEngine.Rendering.GraphicsDeviceType[])\">\n      <summary>\n        <para>Sets the graphics APIs used on a build platform.</para>\n      </summary>\n      <param name=\"platform\">Platform to set APIs for.</param>\n      <param name=\"apis\">Array of graphics APIs.</param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetIconsForTargetGroup(UnityEditor.BuildTargetGroup,UnityEngine.Texture2D[])\">\n      <summary>\n        <para>Assign a list of icons for the specified platform.</para>\n      </summary>\n      <param name=\"platform\"></param>\n      <param name=\"icons\"></param>\n      <param name=\"kind\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetIconsForTargetGroup(UnityEditor.BuildTargetGroup,UnityEngine.Texture2D[],UnityEditor.IconKind)\">\n      <summary>\n        <para>Assign a list of icons for the specified platform.</para>\n      </summary>\n      <param name=\"platform\"></param>\n      <param name=\"icons\"></param>\n      <param name=\"kind\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetIl2CppCompilerConfiguration(UnityEditor.BuildTargetGroup,UnityEditor.Il2CppCompilerConfiguration)\">\n      <summary>\n        <para>Sets compiler configuration used when compiling generated C++ code for a particular BuildTargetGroup.</para>\n      </summary>\n      <param name=\"targetGroup\">Build target group.</param>\n      <param name=\"configuration\">Compiler configuration.</param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetIncrementalIl2CppBuild(UnityEditor.BuildTargetGroup,System.Boolean)\">\n      <summary>\n        <para>Sets incremental build flag.</para>\n      </summary>\n      <param name=\"targetGroup\"></param>\n      <param name=\"enabled\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetMobileMTRendering(UnityEditor.BuildTargetGroup,System.Boolean)\">\n      <summary>\n        <para>Enable or disable multithreaded rendering option for mobile platform.</para>\n      </summary>\n      <param name=\"targetGroup\">Mobile platform (Only iOS, tvOS and Android).</param>\n      <param name=\"enable\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetPlatformIcons(UnityEditor.BuildTargetGroup,UnityEditor.PlatformIconKind,UnityEditor.PlatformIcon[])\">\n      <summary>\n        <para>Assign a list of icons for the specified platform and icon kind.</para>\n      </summary>\n      <param name=\"type\">Each platform supports a different set of PlatformIconKind|icon kinds. These can be found in the specific platform namespace (for example iOSPlatformIconKind).</param>\n      <param name=\"platform\">The full list of platforms that support this API the supported  kinds can be found in PlatformIconKind|icon kinds.</param>\n      <param name=\"icons\">All available PlatformIcon slots must be retrieved with GetPlatformIcons.</param>\n      <param name=\"kind\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetPlatformVuforiaEnabled(UnityEditor.BuildTargetGroup,System.Boolean)\">\n      <summary>\n        <para>Sets the value of the Vuforia AR checkbox in the Player Settings for the specified buildTargetGroup.</para>\n      </summary>\n      <param name=\"targetGroup\">The BuildTargetGroup you wish to set the value for.</param>\n      <param name=\"enabled\">True to enable Vuforia AR, false otherwise.</param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetPreloadedAssets(UnityEngine.Object[])\">\n      <summary>\n        <para>Assigns the assets that will be loaded at start up in the player and be kept alive until the player terminates.</para>\n      </summary>\n      <param name=\"assets\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetPropertyBool(System.String,System.Boolean,UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Sets a PlayerSettings named bool property.</para>\n      </summary>\n      <param name=\"name\">Name of the property.</param>\n      <param name=\"value\">Value of the property (bool).</param>\n      <param name=\"target\">BuildTarget for which the property should apply (use default value BuildTargetGroup.Unknown to apply to all targets).</param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetPropertyInt(System.String,System.Int32,UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Sets a PlayerSettings named int property.</para>\n      </summary>\n      <param name=\"name\">Name of the property.</param>\n      <param name=\"value\">Value of the property (int).</param>\n      <param name=\"target\">BuildTarget for which the property should apply (use default value BuildTargetGroup.Unknown to apply to all targets).</param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetPropertyString(System.String,System.String,UnityEditor.BuildTargetGroup)\">\n      <summary>\n        <para>Sets a PlayerSettings named string property.</para>\n      </summary>\n      <param name=\"name\">Name of the property.</param>\n      <param name=\"value\">Value of the property (string).</param>\n      <param name=\"target\">BuildTarget for which the property should apply (use default value BuildTargetGroup.Unknown to apply to all targets).</param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetScriptingBackend(UnityEditor.BuildTargetGroup,UnityEditor.ScriptingImplementation)\">\n      <summary>\n        <para>Sets the scripting framework for a BuildTargetPlatformGroup.</para>\n      </summary>\n      <param name=\"targetGroup\"></param>\n      <param name=\"backend\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetScriptingDefineSymbolsForGroup(UnityEditor.BuildTargetGroup,System.String)\">\n      <summary>\n        <para>Set user-specified symbols for script compilation for the given build target group.</para>\n      </summary>\n      <param name=\"targetGroup\">The name of the group of devices.</param>\n      <param name=\"defines\">Symbols for this group separated by semicolons.</param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetStackTraceLogType(UnityEngine.LogType,UnityEngine.StackTraceLogType)\">\n      <summary>\n        <para>Set stack trace logging options.\nNote: calling this function will implicitly call Application.SetStackTraceLogType.</para>\n      </summary>\n      <param name=\"logType\"></param>\n      <param name=\"stackTraceType\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetUseDefaultGraphicsAPIs(UnityEditor.BuildTarget,System.Boolean)\">\n      <summary>\n        <para>Should a build platform use automatic graphics API choice.</para>\n      </summary>\n      <param name=\"platform\">Platform to set the flag for.</param>\n      <param name=\"automatic\">Should best available graphics API be used?</param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetVirtualRealitySDKs(UnityEditor.BuildTargetGroup,System.String[])\">\n      <summary>\n        <para>Set the List of Virtual Reality SDKs for a given BuildTargetGroup.</para>\n      </summary>\n      <param name=\"targetGroup\">The BuildTargetGroup to set the SDK list for.</param>\n      <param name=\"sdks\">List of Virtual Reality SDKs.</param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SetVirtualRealitySupported(UnityEditor.BuildTargetGroup,System.Boolean)\">\n      <summary>\n        <para>Sets whether or not Virtual Reality Support is enabled for a given BuildTargetGroup.</para>\n      </summary>\n      <param name=\"targetGroup\">The BuildTargetGroup to set the value for.</param>\n      <param name=\"value\">The value to set, true to enable, false to disable.</param>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.SplashScreen\">\n      <summary>\n        <para>Interface to splash screen player settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.SplashScreen.animationBackgroundZoom\">\n      <summary>\n        <para>The target zoom (from 0 to 1) for the background when it reaches the end of the SplashScreen animation's total duration. Only used when animationMode is PlayerSettings.SplashScreen.AnimationMode.Custom|AnimationMode.Custom.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.SplashScreen.animationLogoZoom\">\n      <summary>\n        <para>The target zoom (from 0 to 1) for the logo when it reaches the end of the logo animation's total duration. Only used when animationMode is PlayerSettings.SplashScreen.AnimationMode.Custom|AnimationMode.Custom.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.SplashScreen.animationMode\">\n      <summary>\n        <para>The type of animation applied during the splash screen.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.SplashScreen.background\">\n      <summary>\n        <para>The background Sprite that is shown in landscape mode. Also shown in portrait mode if backgroundPortrait is null.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.SplashScreen.backgroundColor\">\n      <summary>\n        <para>The background color shown if no background Sprite is assigned. Default is a dark blue RGB(34.44,54).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.SplashScreen.backgroundPortrait\">\n      <summary>\n        <para>The background Sprite that is shown in portrait mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.SplashScreen.drawMode\">\n      <summary>\n        <para>Determines how the Unity logo should be drawn, if it is enabled. If no Unity logo exists in [logos] then the draw mode defaults to PlayerSettings.SplashScreen.DrawMode.UnityLogoBelow|DrawMode.UnityLogoBelow.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.SplashScreen.logos\">\n      <summary>\n        <para>The collection of logos that is shown during the splash screen. Logos are drawn in ascending order, starting from index 0, followed by 1, etc etc.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.SplashScreen.overlayOpacity\">\n      <summary>\n        <para>In order to increase contrast between the background and the logos, an overlay color modifier is applied. The overlay opacity is the strength of this effect. Note: Reducing the value below 0.5 requires a Plus/Pro license.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.SplashScreen.show\">\n      <summary>\n        <para>Set this to true to display the Splash Screen be shown when the application is launched. Set it to false to disable the Splash Screen. Note: Disabling the Splash Screen requires a Plus/Pro license.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.SplashScreen.showUnityLogo\">\n      <summary>\n        <para>Set this to true to show the Unity logo during the Splash Screen. Set it to false to disable the Unity logo. Note: Disabling the Unity logo requires a Plus/Pro license.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.SplashScreen.unityLogoStyle\">\n      <summary>\n        <para>The style to use for the Unity logo during the Splash Screen.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.SplashScreen.AnimationMode\">\n      <summary>\n        <para>The type of animation applied during the Splash Screen.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.SplashScreen.AnimationMode.Custom\">\n      <summary>\n        <para>Animates the Splash Screen using custom values from PlayerSettings.SplashScreen.animationBackgroundZoom and PlayerSettings.SplashScreen.animationLogoZoom.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.SplashScreen.AnimationMode.Dolly\">\n      <summary>\n        <para>Animates the Splash Screen with a simulated dolly effect.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.SplashScreen.AnimationMode.Static\">\n      <summary>\n        <para>No animation is applied to the Splash Screen logo or background.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.SplashScreen.DrawMode\">\n      <summary>\n        <para>Determines how the Unity logo should be drawn, if it is enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.SplashScreen.DrawMode.AllSequential\">\n      <summary>\n        <para>The Unity logo is shown sequentially providing it exists in the PlayerSettings.SplashScreen.logos collection.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.SplashScreen.DrawMode.UnityLogoBelow\">\n      <summary>\n        <para>The Unity logo is drawn in the lower portion of the screen for the duration of the Splash Screen, while the PlayerSettings.SplashScreen.logos are shown in the centre.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.SplashScreen.UnityLogoStyle\">\n      <summary>\n        <para>The style to use for the Unity logo during the Splash Screen.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.SplashScreen.UnityLogoStyle.DarkOnLight\">\n      <summary>\n        <para>A dark Unity logo with a light background.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.SplashScreen.UnityLogoStyle.LightOnDark\">\n      <summary>\n        <para>A white Unity logo with a dark background.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.SplashScreenLogo\">\n      <summary>\n        <para>A single logo that is shown during the Splash Screen. Controls the Sprite that is displayed and its duration.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.SplashScreenLogo.duration\">\n      <summary>\n        <para>The total time in seconds for which the logo is shown. The minimum duration is 2 seconds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.SplashScreenLogo.logo\">\n      <summary>\n        <para>The Sprite that is shown during this logo. If this is null, then no logo will be displayed for the duration.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.SplashScreenLogo.unityLogo\">\n      <summary>\n        <para>The Unity logo Sprite.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SplashScreenLogo.Create(System.Single,UnityEngine.Sprite)\">\n      <summary>\n        <para>Creates a new Splash Screen logo with the provided duration and logo Sprite.</para>\n      </summary>\n      <param name=\"duration\">The total time in seconds that the logo will be shown. Note minimum time is 2 seconds.</param>\n      <param name=\"logo\">The logo Sprite to display.</param>\n      <returns>\n        <para>The new logo.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.SplashScreenLogo.CreateWithUnityLogo(System.Single)\">\n      <summary>\n        <para>Creates a new Splash Screen logo with the provided duration and the unity logo.</para>\n      </summary>\n      <param name=\"duration\">The total time in seconds that the logo will be shown. Note minimum time is 2 seconds.</param>\n      <returns>\n        <para>The new logo.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.tvOS\">\n      <summary>\n        <para>tvOS specific player settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.tvOS.buildNumber\">\n      <summary>\n        <para>The build number of the bundle</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.tvOS.requireExtendedGameController\">\n      <summary>\n        <para>Application requires extended game controller.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.tvOS.sdkVersion\">\n      <summary>\n        <para>Active tvOS SDK version used for build.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.tvOS.targetOSVersion\">\n      <summary>\n        <para>Deployment minimal version of tvOS.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.tvOS.targetOSVersionString\">\n      <summary>\n        <para>Deployment minimal version of tvOS.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.VRCardboard\">\n      <summary>\n        <para>Google Cardboard-specific Player Settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.VRCardboard.depthFormat\">\n      <summary>\n        <para>Set the requested depth format for the Depth and Stencil Buffers. Options are 16bit Depth, 24bit Depth and 24bit Depth + 8bit Stencil.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.VRDaydream\">\n      <summary>\n        <para>Google VR-specific Player Settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.VRDaydream.daydreamIcon\">\n      <summary>\n        <para>Foreground image for the Daydream Launcher Home Screen.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.VRDaydream.daydreamIconBackground\">\n      <summary>\n        <para>Background image for the Daydream Launcher Home Screen.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.VRDaydream.depthFormat\">\n      <summary>\n        <para>Set the requested depth format for the Depth and Stencil Buffers. Options are 16bit Depth, 24bit Depth and 24bit Depth + 8bit Stencil.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.VRDaydream.enableVideoSurface\">\n      <summary>\n        <para>Enable Google VR Asynchronous Video Re-Projection when running in Daydream.\n\nNOTE: Only takes effect if set before initializing VR.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.VRDaydream.enableVideoSurfaceProtectedMemory\">\n      <summary>\n        <para>Enable Protected Memory support when running with Google VR Asynchronous Video Re-Projection (AVR).\n\nProtected memory support is currently an all or nothing feature. When enabled only DRM protected content can be played using AVR. Clear content will fail to play.\n\nNOTE: Only takes effect if set before initializing VR.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.VRDaydream.maximumSupportedHeadTracking\">\n      <summary>\n        <para>Set the highest level of head tracking required to run your application.\n\nSet this property to limit your application to only run on devices that support this maximum level of head tracking. On devices that support higher levels of head tracking, your application is limited to using the maximum level.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.VRDaydream.minimumSupportedHeadTracking\">\n      <summary>\n        <para>Set the lowest level of head tracking required to run your application.\n\nSet this property to limit your application to only run on devices that support this minimum level of head tracking.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.VROculus\">\n      <summary>\n        <para>Class used to access properties of the Oculus VR device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.VROculus.dashSupport\">\n      <summary>\n        <para>Enable Oculus Dash support for the application.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.VROculus.sharedDepthBuffer\">\n      <summary>\n        <para>Enable Shared Depth Buffer support with Oculus.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.WebGL\">\n      <summary>\n        <para>WebGL specific player settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.WebGL.compressionFormat\">\n      <summary>\n        <para>CompressionFormat defines the compression type that the WebGL resources are encoded to.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.WebGL.dataCaching\">\n      <summary>\n        <para>Enables automatic caching of asset data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.WebGL.debugSymbols\">\n      <summary>\n        <para>Enables generation of debug symbols file in the build output directory.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.WebGL.exceptionSupport\">\n      <summary>\n        <para>Exception support for WebGL builds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.WebGL.linkerTarget\">\n      <summary>\n        <para>Allows you to specify the WebGLLinkerTarget|web build format that is used when you build your project.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.WebGL.memorySize\">\n      <summary>\n        <para>Memory size for WebGL builds in MB.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.WebGL.nameFilesAsHashes\">\n      <summary>\n        <para>Enables using MD5 hash of the uncompressed file contents as a filename for each file in the build.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.WebGL.template\">\n      <summary>\n        <para>Path to the WebGL template asset.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.WSA\">\n      <summary>\n        <para>Windows Store Apps specific player settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.WSA.compilationOverrides\">\n      <summary>\n        <para>Specify how to compile C# files when building to Windows Store Apps.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.WSA.enableIndependentInputSource\">\n      <summary>\n        <para>Enable/Disable independent input source feature.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.WSA.enableLowLatencyPresentationAPI\">\n      <summary>\n        <para>Enable/Disable low latency presentation API.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.WSA.inputSource\">\n      <summary>\n        <para>Where Unity gets input from.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.WSA.transparentSwapchain\">\n      <summary>\n        <para>Sets AlphaMode on the swap chain to DXGI_ALPHA_MODE_PREMULTIPLIED.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.WSA.Declarations\">\n      <summary>\n        <para>Windows Store Apps declarations.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.WSA.Declarations.fileTypeAssociations\">\n      <summary>\n        <para>Set information for file type associations.\n\nFor more information - https:msdn.microsoft.comlibrarywindowsappshh779671https:msdn.microsoft.comlibrarywindowsappshh779671.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PlayerSettings.WSA.Declarations.protocolName\">\n      <summary>\n        <para>\n          Registers this application to be a default handler for specified URI scheme name.\n\n          For example: if you specify myunitygame, your application can be run from other applications via the URI scheme myunitygame:. You can also test this using the Windows \"Run\" dialog box (invoked with Windows + R key).\n\n          For more information https:msdn.microsoft.comlibrarywindowsappshh779670https:msdn.microsoft.comlibrarywindowsappshh779670.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.WSA.GetVisualAssetsImage(UnityEditor.PlayerSettings/WSAImageType,UnityEditor.PlayerSettings/WSAImageScale)\">\n      <summary>\n        <para>Get path for image, that will be populated to the Visual Studio solution and the package manifest.</para>\n      </summary>\n      <param name=\"type\"></param>\n      <param name=\"scale\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PlayerSettings.WSA.SetVisualAssetsImage(System.String,UnityEditor.PlayerSettings/WSAImageType,UnityEditor.PlayerSettings/WSAImageScale)\">\n      <summary>\n        <para>Set path for image, that will be populated to the Visual Studio solution and the package manifest.</para>\n      </summary>\n      <param name=\"image\"></param>\n      <param name=\"type\"></param>\n      <param name=\"scale\"></param>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.WSACompilationOverrides\">\n      <summary>\n        <para>Compilation overrides for C# files.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.WSACompilationOverrides.None\">\n      <summary>\n        <para>C# files are compiled using Mono compiler.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.WSACompilationOverrides.UseNetCore\">\n      <summary>\n        <para>C# files are compiled using Microsoft compiler and .NET Core, you can use Windows Runtime API, but classes implemented in C# files aren't accessible from JS or Boo languages.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.WSACompilationOverrides.UseNetCorePartially\">\n      <summary>\n        <para>C# files not located in Plugins, Standard Assets, Pro Standard Assets folders are compiled using Microsoft compiler and .NET Core, all other C# files are compiled using Mono compiler. The advantage is that classes implemented in C# are accessible from JS and Boo languages.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.WSAFileTypeAssociations\">\n      <summary>\n        <para>Describes File Type Association declaration.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.WSAFileTypeAssociations.name\">\n      <summary>\n        <para>Localizable string that will be displayed to the user as associated file handler.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.WSAFileTypeAssociations.supportedFileTypes\">\n      <summary>\n        <para>Supported file types for this association.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.WSAImageScale\">\n      <summary>\n        <para>Various image scales, supported by Windows Store Apps.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.WSAImageType\">\n      <summary>\n        <para>Image types, supported by Windows Store Apps.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.WSAInputSource\">\n      <summary>\n        <para>Where Unity takes input from (subscripbes to events).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.WSAInputSource.CoreWindow\">\n      <summary>\n        <para>Subscribe to CoreWindow events.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.WSAInputSource.IndependentInputSource\">\n      <summary>\n        <para>Create Independent Input Source and receive input from it.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.WSAInputSource.SwapChainPanel\">\n      <summary>\n        <para>Subscribe to SwapChainPanel events.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayerSettings.WSASupportedFileType\">\n      <summary>\n        <para>Describes supported file type for File Type Association declaration.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.WSASupportedFileType.contentType\">\n      <summary>\n        <para>The 'Content Type' value for the file type's MIME content type. For example: 'image/jpeg'. Can also be left blank.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayerSettings.WSASupportedFileType.fileType\">\n      <summary>\n        <para>File type extension. For ex., .myUnityGame</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PlayModeStateChange\">\n      <summary>\n        <para>Enumeration specifying a change in the Editor's play mode state.\n\nSee Also: PauseState, EditorApplication.playModeStateChanged, EditorApplication.isPlaying.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayModeStateChange.EnteredEditMode\">\n      <summary>\n        <para>Occurs during the next update of the Editor application if it is in edit mode and was previously in play mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayModeStateChange.EnteredPlayMode\">\n      <summary>\n        <para>Occurs during the next update of the Editor application if it is in play mode and was previously in edit mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayModeStateChange.ExitingEditMode\">\n      <summary>\n        <para>Occurs when exiting edit mode, before the Editor is in play mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PlayModeStateChange.ExitingPlayMode\">\n      <summary>\n        <para>Occurs when exiting play mode, before the Editor is in edit mode.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PluginImporter\">\n      <summary>\n        <para>Represents plugin importer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PluginImporter.isNativePlugin\">\n      <summary>\n        <para>Is plugin native or managed? Note: C++ libraries with CLR support are treated as native plugins, because Unity cannot load such libraries. You can still access them via P/Invoke.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.ClearSettings\">\n      <summary>\n        <para>Clear all plugin settings and set the compatability with Any Platform to true.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.GetAllImporters\">\n      <summary>\n        <para>Returns all plugin importers for all platforms.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.GetCompatibleWithAnyPlatform\">\n      <summary>\n        <para>Checks whether a plugin is flagged as being compatible with Any Platform.</para>\n      </summary>\n      <returns>\n        <para>True if the plugin is flagged as being compatible with Any Platform, otherwise returns false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.GetCompatibleWithEditor\">\n      <summary>\n        <para>Is plugin compatible with editor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.GetCompatibleWithPlatform(UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Is plugin compatible with specified platform.</para>\n      </summary>\n      <param name=\"platform\">Target platform.</param>\n      <param name=\"platformName\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.GetCompatibleWithPlatform(System.String)\">\n      <summary>\n        <para>Is plugin compatible with specified platform.</para>\n      </summary>\n      <param name=\"platform\">Target platform.</param>\n      <param name=\"platformName\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.GetEditorData(System.String)\">\n      <summary>\n        <para>Returns editor specific data for specified key.</para>\n      </summary>\n      <param name=\"key\">Key value for data.</param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.GetExcludeEditorFromAnyPlatform\">\n      <summary>\n        <para>Is Editor excluded when Any Platform is set to true.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.GetExcludeFromAnyPlatform(System.String)\">\n      <summary>\n        <para>Is platform excluded when Any Platform set to true.</para>\n      </summary>\n      <param name=\"platform\">Target platform.</param>\n      <param name=\"platformName\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.GetExcludeFromAnyPlatform(UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Is platform excluded when Any Platform set to true.</para>\n      </summary>\n      <param name=\"platform\">Target platform.</param>\n      <param name=\"platformName\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.GetImporters(UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Returns all plugin importers for specfied platform.</para>\n      </summary>\n      <param name=\"platform\">Target platform.</param>\n      <param name=\"platformName\">Name of the target platform.</param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.GetImporters(System.String)\">\n      <summary>\n        <para>Returns all plugin importers for specfied platform.</para>\n      </summary>\n      <param name=\"platform\">Target platform.</param>\n      <param name=\"platformName\">Name of the target platform.</param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.GetIsOverridable\">\n      <summary>\n        <para>Identifies whether or not this plugin will be overridden if a plugin of the same name is placed in your project folder.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.GetPlatformData(UnityEditor.BuildTarget,System.String)\">\n      <summary>\n        <para>Get platform specific data.</para>\n      </summary>\n      <param name=\"platform\">Target platform.</param>\n      <param name=\"key\">Key value for data.</param>\n      <param name=\"platformName\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.GetPlatformData(System.String,System.String)\">\n      <summary>\n        <para>Get platform specific data.</para>\n      </summary>\n      <param name=\"platform\">Target platform.</param>\n      <param name=\"key\">Key value for data.</param>\n      <param name=\"platformName\"></param>\n    </member>\n    <member name=\"T:UnityEditor.PluginImporter.IncludeInBuildDelegate\">\n      <summary>\n        <para>Delegate to be used with SetIncludeInBuildDelegate.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.SetCompatibleWithAnyPlatform(System.Boolean)\">\n      <summary>\n        <para>Sets compatibility with Any Platform.</para>\n      </summary>\n      <param name=\"enable\">Determines whether the plugin is compatible with Any Platform.</param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.SetCompatibleWithEditor(System.Boolean)\">\n      <summary>\n        <para>Sets compatibility with any editor.</para>\n      </summary>\n      <param name=\"enable\">Is plugin compatible with editor.</param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.SetCompatibleWithPlatform(UnityEditor.BuildTarget,System.Boolean)\">\n      <summary>\n        <para>Sets compatibility with the specified platform.</para>\n      </summary>\n      <param name=\"platform\">Target platform.</param>\n      <param name=\"enable\">Is plugin compatible with specified platform.</param>\n      <param name=\"platformName\">Target platform.</param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.SetCompatibleWithPlatform(System.String,System.Boolean)\">\n      <summary>\n        <para>Sets compatibility with the specified platform.</para>\n      </summary>\n      <param name=\"platform\">Target platform.</param>\n      <param name=\"enable\">Is plugin compatible with specified platform.</param>\n      <param name=\"platformName\">Target platform.</param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.SetEditorData(System.String,System.String)\">\n      <summary>\n        <para>Sets editor specific data.</para>\n      </summary>\n      <param name=\"key\">Key value for data.</param>\n      <param name=\"value\">Data.</param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.SetExcludeEditorFromAnyPlatform(System.Boolean)\">\n      <summary>\n        <para>Exclude Editor from compatible platforms when Any Platform is set to true.</para>\n      </summary>\n      <param name=\"excludedFromAny\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.SetExcludeFromAnyPlatform(System.String,System.Boolean)\">\n      <summary>\n        <para>Exclude platform from compatible platforms when Any Platform is set to true.</para>\n      </summary>\n      <param name=\"platformName\">Target platform.</param>\n      <param name=\"excludedFromAny\"></param>\n      <param name=\"platform\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.SetExcludeFromAnyPlatform(UnityEditor.BuildTarget,System.Boolean)\">\n      <summary>\n        <para>Exclude platform from compatible platforms when Any Platform is set to true.</para>\n      </summary>\n      <param name=\"platformName\">Target platform.</param>\n      <param name=\"excludedFromAny\"></param>\n      <param name=\"platform\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.SetIncludeInBuildDelegate(UnityEditor.PluginImporter/IncludeInBuildDelegate)\">\n      <summary>\n        <para>Setting the delegate function to be called by ShouldIncludeInBuild.</para>\n      </summary>\n      <param name=\"includeInBuildDelegate\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.SetPlatformData(UnityEditor.BuildTarget,System.String,System.String)\">\n      <summary>\n        <para>Sets platform specific data.</para>\n      </summary>\n      <param name=\"platform\">Target platform.</param>\n      <param name=\"key\">Key value for data.</param>\n      <param name=\"value\">Data.</param>\n      <param name=\"platformName\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.SetPlatformData(System.String,System.String,System.String)\">\n      <summary>\n        <para>Sets platform specific data.</para>\n      </summary>\n      <param name=\"platform\">Target platform.</param>\n      <param name=\"key\">Key value for data.</param>\n      <param name=\"value\">Data.</param>\n      <param name=\"platformName\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PluginImporter.ShouldIncludeInBuild\">\n      <summary>\n        <para>Identifies whether or not this plugin should be included in the current build target.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PopupWindow\">\n      <summary>\n        <para>Class used to display popup windows that inherit from PopupWindowContent.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PopupWindow.Show(UnityEngine.Rect,UnityEditor.PopupWindowContent)\">\n      <summary>\n        <para>Show a popup with the given PopupWindowContent.</para>\n      </summary>\n      <param name=\"activatorRect\">The rect of the button that opens the popup.</param>\n      <param name=\"windowContent\">The content to show in the popup window.</param>\n    </member>\n    <member name=\"T:UnityEditor.PopupWindowContent\">\n      <summary>\n        <para>Class used to implement content for a popup window.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PopupWindowContent.editorWindow\">\n      <summary>\n        <para>The EditorWindow that contains the popup content.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PopupWindowContent.GetWindowSize\">\n      <summary>\n        <para>The size of the popup window.</para>\n      </summary>\n      <returns>\n        <para>The size of the Popup window.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PopupWindowContent.OnClose\">\n      <summary>\n        <para>Callback when the popup window is closed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PopupWindowContent.OnGUI(UnityEngine.Rect)\">\n      <summary>\n        <para>Callback for drawing GUI controls for the popup window.</para>\n      </summary>\n      <param name=\"rect\">The rectangle to draw the GUI inside.</param>\n    </member>\n    <member name=\"M:UnityEditor.PopupWindowContent.OnOpen\">\n      <summary>\n        <para>Callback when the popup window is opened.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PrefabType\">\n      <summary>\n        <para>The type of a prefab object as returned by PrefabUtility.GetPrefabType.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PrefabType.DisconnectedModelPrefabInstance\">\n      <summary>\n        <para>The object is an instance of an imported 3D model, but the connection is broken.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PrefabType.DisconnectedPrefabInstance\">\n      <summary>\n        <para>The object is an instance of a user created prefab, but the connection is broken.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PrefabType.MissingPrefabInstance\">\n      <summary>\n        <para>The object was an instance of a prefab, but the original prefab could not be found.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PrefabType.ModelPrefab\">\n      <summary>\n        <para>The object is an imported 3D model asset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PrefabType.ModelPrefabInstance\">\n      <summary>\n        <para>The object is an instance of an imported 3D model.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PrefabType.None\">\n      <summary>\n        <para>The object is not a prefab nor an instance of a prefab.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PrefabType.Prefab\">\n      <summary>\n        <para>The object is a user created prefab asset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PrefabType.PrefabInstance\">\n      <summary>\n        <para>The object is an instance of a user created prefab.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PrefabUtility\">\n      <summary>\n        <para>Utility class for any prefab related operations.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PrefabUtility.prefabInstanceUpdated\">\n      <summary>\n        <para>Called after prefab instances in the scene have been updated.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.ConnectGameObjectToPrefab(UnityEngine.GameObject,UnityEngine.GameObject)\">\n      <summary>\n        <para>Connects the source prefab to the game object.</para>\n      </summary>\n      <param name=\"go\"></param>\n      <param name=\"sourcePrefab\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.CreateEmptyPrefab(System.String)\">\n      <summary>\n        <para>Creates an empty prefab at given path.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.CreatePrefab(System.String,UnityEngine.GameObject)\">\n      <summary>\n        <para>Creates a prefab from a game object hierarchy.</para>\n      </summary>\n      <param name=\"path\">The path where the prefab is saved.</param>\n      <param name=\"go\">The GameObject that you want to create a prefab from.</param>\n      <param name=\"options\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.CreatePrefab(System.String,UnityEngine.GameObject,UnityEditor.ReplacePrefabOptions)\">\n      <summary>\n        <para>Creates a prefab from a game object hierarchy.</para>\n      </summary>\n      <param name=\"path\">The path where the prefab is saved.</param>\n      <param name=\"go\">The GameObject that you want to create a prefab from.</param>\n      <param name=\"options\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.DisconnectPrefabInstance(UnityEngine.Object)\">\n      <summary>\n        <para>Disconnects the prefab instance from its parent prefab.</para>\n      </summary>\n      <param name=\"targetObject\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.FindPrefabRoot(UnityEngine.GameObject)\">\n      <summary>\n        <para>Helper function to find the prefab root of an object (used for picking niceness).</para>\n      </summary>\n      <param name=\"source\">The object to check.</param>\n      <returns>\n        <para>The prefab root.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.FindRootGameObjectWithSameParentPrefab(UnityEngine.GameObject)\">\n      <summary>\n        <para>Returns the topmost game object that has the same prefab parent as target.</para>\n      </summary>\n      <param name=\"destinationScene\">Scene to instantiate the prefab in.</param>\n      <param name=\"target\"></param>\n      <returns>\n        <para>The GameObject at the root of the prefab.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.FindValidUploadPrefabInstanceRoot(UnityEngine.GameObject)\">\n      <summary>\n        <para>Returns root game object of the prefab instance if that root prefab instance is a parent of the prefab.</para>\n      </summary>\n      <param name=\"target\">GameObject to process.</param>\n      <returns>\n        <para>Return the root game object of the prefab asset.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.GetCorrespondingObjectFromSource(UnityEngine.Object)\">\n      <summary>\n        <para>Returns the corresponding asset object of source, or null if it can't be found.</para>\n      </summary>\n      <param name=\"source\">Instance object for which you want to find the corresponding prefab asset object.</param>\n      <returns>\n        <para>The corresponding asset object or null.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.GetPrefabObject(UnityEngine.Object)\">\n      <summary>\n        <para>Retrieves the enclosing prefab for any object contained within.</para>\n      </summary>\n      <param name=\"targetObject\">An object contained within a prefab object.</param>\n      <returns>\n        <para>The prefab the object is contained in.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.GetPrefabParent(UnityEngine.Object)\">\n      <summary>\n        <para>Returns the parent asset object of source, or null if it can't be found.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.GetPrefabType(UnityEngine.Object)\">\n      <summary>\n        <para>Given an object, returns its prefab type (None, if it's not a prefab).</para>\n      </summary>\n      <param name=\"target\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.GetPropertyModifications(UnityEngine.Object)\">\n      <summary>\n        <para>Extract all modifications that are applied to the prefab instance compared to the parent prefab.</para>\n      </summary>\n      <param name=\"targetPrefab\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.InstantiateAttachedAsset(UnityEngine.Object)\">\n      <summary>\n        <para>Instantiate an asset that is referenced by a prefab and use it on the prefab instance.</para>\n      </summary>\n      <param name=\"targetObject\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.InstantiatePrefab(UnityEngine.Object)\">\n      <summary>\n        <para>Instantiates the given prefab in a given scene.</para>\n      </summary>\n      <param name=\"target\">Prefab asset to instantiate.</param>\n      <param name=\"destinationScene\">Scene to instantiate the prefab in.</param>\n      <returns>\n        <para>The GameObject at the root of the prefab.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.InstantiatePrefab(UnityEngine.Object,UnityEngine.SceneManagement.Scene)\">\n      <summary>\n        <para>Instantiates the given prefab in a given scene.</para>\n      </summary>\n      <param name=\"target\">Prefab asset to instantiate.</param>\n      <param name=\"destinationScene\">Scene to instantiate the prefab in.</param>\n      <returns>\n        <para>The GameObject at the root of the prefab.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.MergeAllPrefabInstances(UnityEngine.Object)\">\n      <summary>\n        <para>Force re-merging all prefab instances of this prefab.</para>\n      </summary>\n      <param name=\"targetObject\"></param>\n    </member>\n    <member name=\"T:UnityEditor.PrefabUtility.PrefabInstanceUpdated\">\n      <summary>\n        <para>Delegate for method that is called after prefab instances in the scene have been updated.</para>\n      </summary>\n      <param name=\"instance\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.ReconnectToLastPrefab(UnityEngine.GameObject)\">\n      <summary>\n        <para>Connects the game object to the prefab that it was last connected to.</para>\n      </summary>\n      <param name=\"go\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.RecordPrefabInstancePropertyModifications(UnityEngine.Object)\">\n      <summary>\n        <para>Causes modifications made to the Prefab instance to be recorded.</para>\n      </summary>\n      <param name=\"targetObject\">Object to process.</param>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.ReplacePrefab(UnityEngine.GameObject,UnityEngine.Object)\">\n      <summary>\n        <para>Replaces the targetPrefab with a copy of the game object hierarchy go.</para>\n      </summary>\n      <param name=\"go\"></param>\n      <param name=\"targetPrefab\"></param>\n      <param name=\"options\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.ReplacePrefab(UnityEngine.GameObject,UnityEngine.Object,UnityEditor.ReplacePrefabOptions)\">\n      <summary>\n        <para>Replaces the targetPrefab with a copy of the game object hierarchy go.</para>\n      </summary>\n      <param name=\"go\"></param>\n      <param name=\"targetPrefab\"></param>\n      <param name=\"options\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.ResetToPrefabState(UnityEngine.Object)\">\n      <summary>\n        <para>Resets the properties of the component or game object to the parent prefab state.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.RevertPrefabInstance(UnityEngine.GameObject)\">\n      <summary>\n        <para>Resets the properties of all objects in the prefab, including child game objects and components that were added to the prefab instance.</para>\n      </summary>\n      <param name=\"go\"></param>\n    </member>\n    <member name=\"M:UnityEditor.PrefabUtility.SetPropertyModifications(UnityEngine.Object,UnityEditor.PropertyModification[])\">\n      <summary>\n        <para>Assigns all modifications that are applied to the prefab instance compared to the parent prefab.</para>\n      </summary>\n      <param name=\"targetPrefab\"></param>\n      <param name=\"modifications\"></param>\n    </member>\n    <member name=\"T:UnityEditor.PreferenceItem\">\n      <summary>\n        <para>The PreferenceItem attribute allows you to add preferences sections to the Preferences Window.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PreferenceItem.#ctor(System.String)\">\n      <summary>\n        <para>Creates a section in the Preferences Window called name and invokes the static function following it for the section's GUI.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"T:UnityEditor.Presets.DefaultPresetSelectorReceiver\">\n      <summary>\n        <para>Basic implementation of the PresetSelectorReceiver.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Presets.DefaultPresetSelectorReceiver.OnSelectionChanged(UnityEditor.Presets.Preset)\">\n      <summary>\n        <para>Applies the Preset to each target. If Preset is null, this method reverts the value of each target.</para>\n      </summary>\n      <param name=\"selection\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Presets.DefaultPresetSelectorReceiver.OnSelectionClosed(UnityEditor.Presets.Preset)\">\n      <summary>\n        <para>Applies the current selection and then destroys itself.</para>\n      </summary>\n      <param name=\"selection\"></param>\n    </member>\n    <member name=\"T:UnityEditor.Presets.Preset\">\n      <summary>\n        <para>A Preset contains default values for an Object.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Presets.Preset.ApplyTo(UnityEngine.Object)\">\n      <summary>\n        <para>Applies this Preset to the target object.</para>\n      </summary>\n      <param name=\"target\">The target object that will be updated with the Preset serialized values.</param>\n      <returns>\n        <para>Returns true if the target object was successfully updated by the Preset, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Presets.Preset.CanBeAppliedTo(UnityEngine.Object)\">\n      <summary>\n        <para>Returns true if this Preset can be applied to the target Object.</para>\n      </summary>\n      <param name=\"target\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Presets.Preset.#ctor(UnityEngine.Object)\">\n      <summary>\n        <para>Constructs a new Preset from a given Object.</para>\n      </summary>\n      <param name=\"source\">Used by the Preset to know its target type and serialized values.</param>\n    </member>\n    <member name=\"M:UnityEditor.Presets.Preset.GetDefaultForObject(UnityEngine.Object)\">\n      <summary>\n        <para>Returns the current default Preset assigned to the same Object type. Returns null if there is no matching default.</para>\n      </summary>\n      <param name=\"target\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Presets.Preset.GetDefaultForPreset(UnityEditor.Presets.Preset)\">\n      <summary>\n        <para>Returns the current default Preset assigned to the same Preset type. Returns null if there is no matching default.</para>\n      </summary>\n      <param name=\"preset\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Presets.Preset.GetTargetFullTypeName\">\n      <summary>\n        <para>Returns a human readable string of this Preset's target fulltype, including namespace.</para>\n      </summary>\n      <returns>\n        <para>Fullname of the Preset's target type.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Presets.Preset.GetTargetTypeName\">\n      <summary>\n        <para>Returns a human readable string of this Preset's target type.</para>\n      </summary>\n      <returns>\n        <para>Fullname of the Preset's target type.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Presets.Preset.IsObjectExcludedFromDefaultPresets(UnityEngine.Object)\">\n      <summary>\n        <para>Returns true if this Object cannot have a default Preset.</para>\n      </summary>\n      <param name=\"target\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Presets.Preset.IsObjectExcludedFromPresets(UnityEngine.Object)\">\n      <summary>\n        <para>Returns true if this Object is not available in the Preset system.</para>\n      </summary>\n      <param name=\"reference\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Presets.Preset.IsPresetExcludedFromDefaultPresets(UnityEditor.Presets.Preset)\">\n      <summary>\n        <para>Returns true if this Preset cannot be set as the default.</para>\n      </summary>\n      <param name=\"preset\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Presets.Preset.IsValid\">\n      <summary>\n        <para>Returns true if the Preset type of this Preset is valid.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Presets.Preset.PropertyModifications\">\n      <summary>\n        <para>Returns a copy of the PropertyModification array owned by this Preset.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Presets.Preset.RemoveFromDefault(UnityEditor.Presets.Preset)\">\n      <summary>\n        <para>Remove the Preset type from having default values in the project.</para>\n      </summary>\n      <param name=\"preset\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Presets.Preset.SetAsDefault(UnityEditor.Presets.Preset)\">\n      <summary>\n        <para>Sets the Preset as the default for its target type in the project.</para>\n      </summary>\n      <param name=\"preset\">The Preset asset to set as the default.</param>\n      <returns>\n        <para>Returns true if the Preset is successfully set as the default, or false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Presets.Preset.UpdateProperties(UnityEngine.Object)\">\n      <summary>\n        <para>Updates this Preset's properties from the given Object's values. The given Object's type must match this Preset's type.</para>\n      </summary>\n      <param name=\"source\">Used by the Preset to get its new serialized values.</param>\n      <returns>\n        <para>Returns true if the Preset was updated, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Presets.PresetSelector\">\n      <summary>\n        <para>This class implements a modal window that selects a Preset asset from the Project.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Presets.PresetSelector.DrawPresetButton(UnityEngine.Rect,UnityEngine.Object[])\">\n      <summary>\n        <para>Draw a Preset button that opens the default PresetSelector using the targets array.</para>\n      </summary>\n      <param name=\"rectangle\">The Rect where the PresetSelector icon is drawn.</param>\n      <param name=\"targets\">List of objects to which the selected Preset is applied.</param>\n    </member>\n    <member name=\"M:UnityEditor.Presets.PresetSelector.ShowSelector(UnityEngine.Object[],UnityEditor.Presets.Preset,System.Boolean)\">\n      <summary>\n        <para>Opens a modal window for selecting a Preset.</para>\n      </summary>\n      <param name=\"targets\">List of objects to which the selected Preset is applied. DefaultPresetSelectorReceiver applies the Preset selection.</param>\n      <param name=\"currentSelection\">The selected Preset when the window is opened. Set to 'null' for no selection.</param>\n      <param name=\"createNewAllowed\">Set to true to show the 'Save current to...' button. Set to false to hide this button.</param>\n      <param name=\"target\">Object that identifies the type of Preset asset being selected. The modal window filters the selector view based on this object.</param>\n      <param name=\"eventReceiver\">The PresetSelectorReceiver instance that the PresetSelector uses to send events.</param>\n    </member>\n    <member name=\"M:UnityEditor.Presets.PresetSelector.ShowSelector(UnityEngine.Object,UnityEditor.Presets.Preset,System.Boolean,UnityEditor.Presets.PresetSelectorReceiver)\">\n      <summary>\n        <para>Opens a modal window for selecting a Preset.</para>\n      </summary>\n      <param name=\"targets\">List of objects to which the selected Preset is applied. DefaultPresetSelectorReceiver applies the Preset selection.</param>\n      <param name=\"currentSelection\">The selected Preset when the window is opened. Set to 'null' for no selection.</param>\n      <param name=\"createNewAllowed\">Set to true to show the 'Save current to...' button. Set to false to hide this button.</param>\n      <param name=\"target\">Object that identifies the type of Preset asset being selected. The modal window filters the selector view based on this object.</param>\n      <param name=\"eventReceiver\">The PresetSelectorReceiver instance that the PresetSelector uses to send events.</param>\n    </member>\n    <member name=\"T:UnityEditor.Presets.PresetSelectorReceiver\">\n      <summary>\n        <para>Implement this class to control the selection change when selecting a Preset in the PresetSelector.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Presets.PresetSelectorReceiver.OnSelectionChanged(UnityEditor.Presets.Preset)\">\n      <summary>\n        <para>When a new Preset is selected in the modal window, this method is called by PresetSelector.</para>\n      </summary>\n      <param name=\"selection\">This parameter is set to null when 'None' is the new selection in the PresetSelector.</param>\n    </member>\n    <member name=\"M:UnityEditor.Presets.PresetSelectorReceiver.OnSelectionClosed(UnityEditor.Presets.Preset)\">\n      <summary>\n        <para>This method is called by the PresetSelector when the modal window is closed.</para>\n      </summary>\n      <param name=\"selection\"></param>\n    </member>\n    <member name=\"T:UnityEditor.PropertyDrawer\">\n      <summary>\n        <para>Base class to derive custom property drawers from. Use this to create custom drawers for your own Serializable classes or for script variables with custom PropertyAttributes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PropertyDrawer.attribute\">\n      <summary>\n        <para>The PropertyAttribute for the property. Not applicable for custom class drawers. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.PropertyDrawer.fieldInfo\">\n      <summary>\n        <para>The reflection FieldInfo for the member this property represents. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.PropertyDrawer.CanCacheInspectorGUI(UnityEditor.SerializedProperty)\">\n      <summary>\n        <para>Override this method to determine whether the inspector GUI for your property can be cached.</para>\n      </summary>\n      <param name=\"property\">The SerializedProperty to make the custom GUI for.</param>\n      <returns>\n        <para>Whether the drawer's UI can be cached.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PropertyDrawer.GetPropertyHeight(UnityEditor.SerializedProperty,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Override this method to specify how tall the GUI for this field is in pixels.</para>\n      </summary>\n      <param name=\"property\">The SerializedProperty to make the custom GUI for.</param>\n      <param name=\"label\">The label of this property.</param>\n      <returns>\n        <para>The height in pixels.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.PropertyDrawer.OnGUI(UnityEngine.Rect,UnityEditor.SerializedProperty,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Override this method to make your own GUI for the property.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the property GUI.</param>\n      <param name=\"property\">The SerializedProperty to make the custom GUI for.</param>\n      <param name=\"label\">The label of this property.</param>\n    </member>\n    <member name=\"T:UnityEditor.PropertyModification\">\n      <summary>\n        <para>Defines a single modified property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PropertyModification.objectReference\">\n      <summary>\n        <para>The value being applied when it is a object reference (which can not be represented as a string).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PropertyModification.propertyPath\">\n      <summary>\n        <para>Property path of the property being modified (Matches as SerializedProperty.propertyPath).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PropertyModification.target\">\n      <summary>\n        <para>Object that will be modified.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PropertyModification.value\">\n      <summary>\n        <para>The value being applied.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ProvisioningProfileType\">\n      <summary>\n        <para>The type of the iOS provisioning profile if manual signing is used.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ProvisioningProfileType.Automatic\">\n      <summary>\n        <para>The provisioning profile type will be determined automatically when building the Xcode project.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ProvisioningProfileType.Development\">\n      <summary>\n        <para>Development provisioning profiles are used to install development apps on test devices.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ProvisioningProfileType.Distribution\">\n      <summary>\n        <para>Distribution provisioning profiles can be used when uploading the app to the App Store or for Ad Hoc and in house distribution.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PS4BuildSubtarget\">\n      <summary>\n        <para>Type of build to generate.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PS4BuildSubtarget.Package\">\n      <summary>\n        <para>Package build for installation on either a dev or test kit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PS4BuildSubtarget.PCHosted\">\n      <summary>\n        <para>Build hosted on a PC, for file serving to a dev or test kit.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.PSP2BuildSubtarget\">\n      <summary>\n        <para>Target PS Vita build type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PSP2BuildSubtarget.Package\">\n      <summary>\n        <para>For building a PS Vita package that can be installed on a PS Vita memory card.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.PSP2BuildSubtarget.PCHosted\">\n      <summary>\n        <para>For general development, creates a build stored on the host PC which the Vita reads from.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Purchasing.PurchasingSettings\">\n      <summary>\n        <para>Editor API for the Unity Services editor feature. Normally Purchasing is enabled from the Services window, but if writing your own editor extension, this API can be used.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Purchasing.PurchasingSettings.enabled\">\n      <summary>\n        <para>This Boolean field will cause the Purchasing feature in Unity to be enabled if true, or disabled if false.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.RemoveAssetOptions\">\n      <summary>\n        <para>Options for removing assets</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.RemoveAssetOptions.DeleteAssets\">\n      <summary>\n        <para>Delete the asset without moving it to the trash.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.RemoveAssetOptions.MoveAssetToTrash\">\n      <summary>\n        <para>The asset should be moved to trash.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Rendering.AlbedoSwatchInfo\">\n      <summary>\n        <para>Contains the custom albedo swatch data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.AlbedoSwatchInfo.color\">\n      <summary>\n        <para>Color of the albedo swatch that is shown in the physically based rendering validator user interface.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.AlbedoSwatchInfo.maxLuminance\">\n      <summary>\n        <para>The maximum luminance value used to validate the albedo for the physically based rendering albedo validator.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.AlbedoSwatchInfo.minLuminance\">\n      <summary>\n        <para>The minimum luminance value used to validate the albedo for the physically based rendering albedo validator.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.AlbedoSwatchInfo.name\">\n      <summary>\n        <para>Name of the albedo swatch to show in the physically based renderer validator user interface.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Rendering.EditorGraphicsSettings\">\n      <summary>\n        <para>Editor-specific script interface for.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Rendering.EditorGraphicsSettings.albedoSwatches\">\n      <summary>\n        <para>Returns an array of Rendering.AlbedoSwatchInfo.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Rendering.EditorGraphicsSettings.GetShaderSettingsForPlatform(UnityEditor.BuildTargetGroup,UnityEngine.Rendering.ShaderHardwareTier)\">\n      <summary>\n        <para>Will return PlatformShaderSettings for given platform and shader hardware tier.</para>\n      </summary>\n      <param name=\"target\"></param>\n      <param name=\"tier\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Rendering.EditorGraphicsSettings.GetTierSettings(UnityEditor.BuildTargetGroup,UnityEngine.Rendering.GraphicsTier)\">\n      <summary>\n        <para>Returns TierSettings for the target build platform and shader hardware tier.</para>\n      </summary>\n      <param name=\"target\"></param>\n      <param name=\"tier\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Rendering.EditorGraphicsSettings.GetTierSettings(UnityEditor.BuildTargetGroup,UnityEngine.Rendering.ShaderHardwareTier)\">\n      <summary>\n        <para>TODO.</para>\n      </summary>\n      <param name=\"target\"></param>\n      <param name=\"tier\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Rendering.EditorGraphicsSettings.SetShaderSettingsForPlatform(UnityEditor.BuildTargetGroup,UnityEngine.Rendering.ShaderHardwareTier,UnityEditor.Rendering.PlatformShaderSettings)\">\n      <summary>\n        <para>Allows you to set the PlatformShaderSettings for the specified platform and shader hardware tier.</para>\n      </summary>\n      <param name=\"target\"></param>\n      <param name=\"tier\"></param>\n      <param name=\"settings\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Rendering.EditorGraphicsSettings.SetTierSettings(UnityEditor.BuildTargetGroup,UnityEngine.Rendering.GraphicsTier,UnityEditor.Rendering.TierSettings)\">\n      <summary>\n        <para>Allows you to set the PlatformShaderSettings for the specified platform and shader hardware tier.</para>\n      </summary>\n      <param name=\"target\"></param>\n      <param name=\"tier\"></param>\n      <param name=\"settings\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Rendering.EditorGraphicsSettings.SetTierSettings(UnityEditor.BuildTargetGroup,UnityEngine.Rendering.ShaderHardwareTier,UnityEditor.Rendering.TierSettings)\">\n      <summary>\n        <para>TODO.</para>\n      </summary>\n      <param name=\"target\"></param>\n      <param name=\"tier\"></param>\n      <param name=\"settings\"></param>\n    </member>\n    <member name=\"T:UnityEditor.Rendering.PlatformShaderSettings\">\n      <summary>\n        <para>Used to set up shader settings, per-platform and per-shader-hardware-tier.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.PlatformShaderSettings.cascadedShadowMaps\">\n      <summary>\n        <para>Allows you to specify whether cascaded shadow maps should be used.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.PlatformShaderSettings.reflectionProbeBlending\">\n      <summary>\n        <para>Allows you to specify whether Reflection Probes Blending should be enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.PlatformShaderSettings.reflectionProbeBoxProjection\">\n      <summary>\n        <para>Allows you to specify whether Reflection Probes Box Projection should be used.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.PlatformShaderSettings.standardShaderQuality\">\n      <summary>\n        <para>Allows you to select Standard Shader Quality.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Rendering.ShaderCompilerData\">\n      <summary>\n        <para>Collection of data used for shader variants generation, including targeted platform data and the keyword set representing a specific shader variant.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Rendering.ShaderCompilerData.graphicsTier\">\n      <summary>\n        <para>Identifier to classify low, medium and high performance hardware.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderCompilerData.platformKeywordSet\">\n      <summary>\n        <para>A collection of Rendering.ShaderKeyword that represents a specific platform shader variant.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Rendering.ShaderCompilerData.shaderCompilerPlatform\">\n      <summary>\n        <para>Shader compiler used to generate player data shader variants.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderCompilerData.shaderKeywordSet\">\n      <summary>\n        <para>A collection of Rendering.ShaderKeyword that represents a specific shader variant.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Rendering.ShaderCompilerData.shaderRequirements\">\n      <summary>\n        <para>Required shader features by a specific shader.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Rendering.ShaderCompilerPlatform\">\n      <summary>\n        <para>Shader compiler used to generate player data shader variants.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderCompilerPlatform.D3D\">\n      <summary>\n        <para>Compiler used with Direct3D 11 and Direct3D 12 graphics API on Windows platforms.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderCompilerPlatform.GLES20\">\n      <summary>\n        <para>Compiler used with OpenGL ES 2.0 and WebGL 1.0 graphics APIs on Android, iOS, Windows and WebGL platforms.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderCompilerPlatform.GLES3x\">\n      <summary>\n        <para>Compiler used with OpenGL ES 3.x and WebGL 2.0 graphics APIs on Android, iOS, Windows and WebGL platforms.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderCompilerPlatform.Metal\">\n      <summary>\n        <para>Compiler used with Metal graphics API on macOS, iOS and tvOS platforms.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderCompilerPlatform.N3DS\">\n      <summary>\n        <para>Compiler used on Nintendo 3DS.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderCompilerPlatform.None\">\n      <summary>\n        <para>Provide a reasonable value for non initialized variables.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderCompilerPlatform.OpenGLCore\">\n      <summary>\n        <para>Compiler used with OpenGL core graphics API on macOS, Linux and Windows platforms.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderCompilerPlatform.PS4\">\n      <summary>\n        <para>Compiler used on PlayStation 4.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderCompilerPlatform.Switch\">\n      <summary>\n        <para>Compiler used on Nintendo Switch.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderCompilerPlatform.Vita\">\n      <summary>\n        <para>Compiler used on PlayStation Vita.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderCompilerPlatform.Vulkan\">\n      <summary>\n        <para>Compiler used with Vulkan graphics API on Android, Linux and Windows platforms.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderCompilerPlatform.XboxOneD3D11\">\n      <summary>\n        <para>Compiler used with Direct3D 11 graphics API on XBox One.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderCompilerPlatform.XboxOneD3D12\">\n      <summary>\n        <para>Compiler used with Direct3D 12 graphics API on XBox One.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Rendering.ShaderQuality\">\n      <summary>\n        <para>Shader quality preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderQuality.High\">\n      <summary>\n        <para>High quality shader preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderQuality.Low\">\n      <summary>\n        <para>Low quality shader preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderQuality.Medium\">\n      <summary>\n        <para>Medium quality shader preset.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Rendering.ShaderRequirements\">\n      <summary>\n        <para>Required shader features for some particular shader. Features are bit flags.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.BaseShaders\">\n      <summary>\n        <para>Indicates that basic shader capability, Shader Model 2.0 level is required.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.Compute\">\n      <summary>\n        <para>\n                    Indicates that compute shader support is required.\n                </para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.CubeArray\">\n      <summary>\n        <para>Indicates the shader requires cubemap array support.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.Derivatives\">\n      <summary>\n        <para>Indicates that derivative (ddx/ddy) instructions support is required in the fragment shader.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.FragCoord\">\n      <summary>\n        <para>Indicates that pixel position (SV_Position) input support is required in the fragment shader.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.FramebufferFetch\">\n      <summary>\n        <para>Indicates the shader must support framebuffer fetch, which is the ability to have in+out fragment shader color params.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.Geometry\">\n      <summary>\n        <para>Indicates that geometry shader support is required.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.Instancing\">\n      <summary>\n        <para>Indicates the shader must support SV_InstanceID shader input.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.Interpolators10\">\n      <summary>\n        <para>Indicates the shader must have 10 interpolators.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.Interpolators15Integers\">\n      <summary>\n        <para>Indicates the shader must have 15 integers and interpolators in total. Unity bundles them together because it is extremely unlikely a GPU/API will ever exist that only has part of that.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.Interpolators32\">\n      <summary>\n        <para>Indicates the shader must have 32 interpolators</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.MRT4\">\n      <summary>\n        <para>Indicates the shader must have multiple render targets (at least 4), as in support a fragment shader that can output up to 4 values.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.MRT8\">\n      <summary>\n        <para>Indicates the shader must have multiple render targets (at least 8), as in support a fragment shader that can output up to 4 values.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.MSAATextureSamples\">\n      <summary>\n        <para>Indicates the shader requires access to MSAA texture samples.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.None\">\n      <summary>\n        <para>No shader requirements.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.RandomWrite\">\n      <summary>\n        <para>Indicates the shader requires have random-write textures (UAVs) support.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.SampleLOD\">\n      <summary>\n        <para>Indicates the shader requires the support of texture sampling in a fragment shader with an explicit mipmap level.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.SparseTexelResident\">\n      <summary>\n        <para>Indicates the shader requires the support of sparse textures with sampling instructions that return residency information.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.TessellationCompute\">\n      <summary>\n        <para>Indicates the shader requires the support of tessellation using a compute shader for control points processing. Metal graphics API requires this feature for tessellation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.TessellationShaders\">\n      <summary>\n        <para>Indicates the shader requires the support of tessellation using the hull and domain shader stages.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderRequirements.Texture2DArray\">\n      <summary>\n        <para>Indicates the shader requires 2D array textures.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Rendering.ShaderSnippetData\">\n      <summary>\n        <para>Collection of properties about the specific shader code being compiled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Rendering.ShaderSnippetData.passName\">\n      <summary>\n        <para>Shader.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Rendering.ShaderSnippetData.passType\">\n      <summary>\n        <para>Shader pass type for Unity's lighting pipeline.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Rendering.ShaderSnippetData.shaderType\">\n      <summary>\n        <para>Shader stage in the rendering the pipeline.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Rendering.ShaderType\">\n      <summary>\n        <para>Identifies the stage in the rendering pipeline.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderType.Domain\">\n      <summary>\n        <para>Identifier for the domain shader stage.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderType.Fragment\">\n      <summary>\n        <para>Identifier for the fragment shader stage.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderType.Geometry\">\n      <summary>\n        <para>Identifier for the geometry shader stage.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderType.Hull\">\n      <summary>\n        <para>Identifier for the hull shader stage.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.ShaderType.Vertex\">\n      <summary>\n        <para>Identifier for the vertex shader stage.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Rendering.TierSettings\">\n      <summary>\n        <para>Used to set up per-platorm per-shader-hardware-tier graphics settings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.TierSettings.cascadedShadowMaps\">\n      <summary>\n        <para>Allows you to specify whether cascaded shadow maps should be used.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.TierSettings.detailNormalMap\">\n      <summary>\n        <para>Allows you to specify whether Detail Normal Map should be sampled if assigned.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.TierSettings.enableLPPV\">\n      <summary>\n        <para>Allows you to specify whether Light Probe Proxy Volume should be used.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.TierSettings.hdr\">\n      <summary>\n        <para>Setting this field to true enables HDR rendering for this tier. Setting it to false disables HDR rendering for this tier.\nSee Also:</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.TierSettings.hdrMode\">\n      <summary>\n        <para>The CameraHDRMode to use for this tier.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.TierSettings.prefer32BitShadowMaps\">\n      <summary>\n        <para>Allows you to specify whether Unity should try to use 32-bit shadow maps, where possible.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.TierSettings.realtimeGICPUUsage\">\n      <summary>\n        <para>The RealtimeGICPUUsage to use for this tier.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.TierSettings.reflectionProbeBlending\">\n      <summary>\n        <para>Allows you to specify whether Reflection Probes Blending should be enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.TierSettings.reflectionProbeBoxProjection\">\n      <summary>\n        <para>Allows you to specify whether Reflection Probes Box Projection should be used.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.TierSettings.renderingPath\">\n      <summary>\n        <para>The rendering path that should be used.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.TierSettings.semitransparentShadows\">\n      <summary>\n        <para>Allows you to specify whether Semitransparent Shadows should be enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Rendering.TierSettings.standardShaderQuality\">\n      <summary>\n        <para>Allows you to select Standard Shader Quality.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ReplacePrefabOptions\">\n      <summary>\n        <para>Flags for the PrefabUtility.ReplacePrefab function.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ReplacePrefabOptions.ConnectToPrefab\">\n      <summary>\n        <para>Connects the passed objects to the prefab after uploading the prefab.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ReplacePrefabOptions.Default\">\n      <summary>\n        <para>Replaces prefabs by matching pre-existing connections to the prefab.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ReplacePrefabOptions.ReplaceNameBased\">\n      <summary>\n        <para>Replaces the prefab using name based lookup in the transform hierarchy.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ResolutionDialogSetting\">\n      <summary>\n        <para>Resolution dialog setting.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ResolutionDialogSetting.Disabled\">\n      <summary>\n        <para>Never show the resolution dialog.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ResolutionDialogSetting.Enabled\">\n      <summary>\n        <para>Show the resolution dialog on first launch.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ResolutionDialogSetting.HiddenByDefault\">\n      <summary>\n        <para>Hide the resolution dialog on first launch.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.SceneAsset\">\n      <summary>\n        <para>SceneAsset is used to reference scene objects in the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.SceneManagement.EditorSceneManager\">\n      <summary>\n        <para>Scene management in the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.SceneManagement.EditorSceneManager.activeSceneChangedInEditMode(UnityEngine.Events.UnityAction`2&lt;UnityEngine.SceneManagement.Scene,UnityEngine.SceneManagement.Scene&gt;)\">\n      <summary>\n        <para>Subscribe to this event to get notified when the active Scene has changed in Edit mode in the Editor.</para>\n      </summary>\n      <param name=\"value\">Previous active scene and the new active scene.</param>\n    </member>\n    <member name=\"P:UnityEditor.SceneManagement.EditorSceneManager.loadedSceneCount\">\n      <summary>\n        <para>The number of loaded Scenes.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.SceneManagement.EditorSceneManager.newSceneCreated(UnityEditor.SceneManagement.EditorSceneManager/NewSceneCreatedCallback)\">\n      <summary>\n        <para>This event is called after a new Scene has been created.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEditor.SceneManagement.EditorSceneManager.playModeStartScene\">\n      <summary>\n        <para>Loads this SceneAsset when you start Play Mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SceneManagement.EditorSceneManager.preventCrossSceneReferences\">\n      <summary>\n        <para>Controls whether cross-Scene references are allowed in the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.SceneManagement.EditorSceneManager.sceneClosed(UnityEditor.SceneManagement.EditorSceneManager/SceneClosedCallback)\">\n      <summary>\n        <para>This event is called after a Scene has been closed in the editor.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEditor.SceneManagement.EditorSceneManager.sceneClosing(UnityEditor.SceneManagement.EditorSceneManager/SceneClosingCallback)\">\n      <summary>\n        <para>This event is called before closing an open Scene after you have requested that the Scene is closed.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEditor.SceneManagement.EditorSceneManager.sceneOpened(UnityEditor.SceneManagement.EditorSceneManager/SceneOpenedCallback)\">\n      <summary>\n        <para>This event is called after a Scene has been opened in the editor.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEditor.SceneManagement.EditorSceneManager.sceneOpening(UnityEditor.SceneManagement.EditorSceneManager/SceneOpeningCallback)\">\n      <summary>\n        <para>This event is called before opening an existing Scene.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEditor.SceneManagement.EditorSceneManager.sceneSaved(UnityEditor.SceneManagement.EditorSceneManager/SceneSavedCallback)\">\n      <summary>\n        <para>This event is called after a Scene has been saved.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEditor.SceneManagement.EditorSceneManager.sceneSaving(UnityEditor.SceneManagement.EditorSceneManager/SceneSavingCallback)\">\n      <summary>\n        <para>This event is called before a Scene is saved disk after you have requested the Scene to be saved.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SceneManagement.EditorSceneManager.ClosePreviewScene(UnityEngine.SceneManagement.Scene)\">\n      <summary>\n        <para>Closes a preview scene created by NewPreviewScene.</para>\n      </summary>\n      <param name=\"scene\">The preview scene to close.</param>\n      <returns>\n        <para>True if the scene was successfully closed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.SceneManagement.EditorSceneManager.CloseScene(UnityEngine.SceneManagement.Scene,System.Boolean)\">\n      <summary>\n        <para>Close the Scene. If removeScene flag is true, the closed Scene will also be removed from EditorSceneManager.</para>\n      </summary>\n      <param name=\"scene\">The Scene to be closed/removed.</param>\n      <param name=\"removeScene\">Bool flag to indicate if the Scene should be removed after closing.</param>\n      <returns>\n        <para>Returns true if the Scene is closed/removed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.SceneManagement.EditorSceneManager.DetectCrossSceneReferences(UnityEngine.SceneManagement.Scene)\">\n      <summary>\n        <para>Detects cross-scene references in a Scene.</para>\n      </summary>\n      <param name=\"scene\">Scene to check for cross-scene references.</param>\n      <returns>\n        <para>Was any cross-scene references found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.SceneManagement.EditorSceneManager.EnsureUntitledSceneHasBeenSaved(System.String)\">\n      <summary>\n        <para>Shows a save dialog if an Untitled scene exists in the current scene manager setup.</para>\n      </summary>\n      <param name=\"dialogContent\">Text shown in the save dialog.</param>\n      <returns>\n        <para>True if the scene is saved or if there is no Untitled scene.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.SceneManagement.EditorSceneManager.GetSceneManagerSetup\">\n      <summary>\n        <para>Returns the current setup of the SceneManager.</para>\n      </summary>\n      <returns>\n        <para>An array of SceneSetup classes - one item for each Scene.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.SceneManagement.EditorSceneManager.MarkAllScenesDirty\">\n      <summary>\n        <para>Mark all the loaded Scenes as modified.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(UnityEngine.SceneManagement.Scene)\">\n      <summary>\n        <para>Mark the specified Scene as modified.</para>\n      </summary>\n      <param name=\"scene\">The Scene to be marked as modified.</param>\n      <returns>\n        <para>Whether the Scene was successfully marked as dirty.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.SceneManagement.EditorSceneManager.MoveSceneAfter(UnityEngine.SceneManagement.Scene,UnityEngine.SceneManagement.Scene)\">\n      <summary>\n        <para>Allows you to reorder the Scenes currently open in the Hierarchy window. Moves the source Scene so it comes after the destination Scene.</para>\n      </summary>\n      <param name=\"src\">The Scene to move.</param>\n      <param name=\"dst\">The Scene which should come directly before the source Scene in the hierarchy.</param>\n    </member>\n    <member name=\"M:UnityEditor.SceneManagement.EditorSceneManager.MoveSceneBefore(UnityEngine.SceneManagement.Scene,UnityEngine.SceneManagement.Scene)\">\n      <summary>\n        <para>Allows you to reorder the Scenes currently open in the Hierarchy window. Moves the source Scene so it comes before the destination Scene.</para>\n      </summary>\n      <param name=\"src\">The Scene to move.</param>\n      <param name=\"dst\">The Scene which should come directly after the source Scene in the hierarchy.</param>\n    </member>\n    <member name=\"M:UnityEditor.SceneManagement.EditorSceneManager.NewPreviewScene\">\n      <summary>\n        <para>Creates a new preview scene.  Any object added to a preview scene will only be rendered in that scene.</para>\n      </summary>\n      <returns>\n        <para>The new preview scene.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.SceneManagement.EditorSceneManager.NewScene(UnityEditor.SceneManagement.NewSceneSetup,UnityEditor.SceneManagement.NewSceneMode)\">\n      <summary>\n        <para>Create a new Scene.</para>\n      </summary>\n      <param name=\"setup\">Whether the new Scene should use the default set of GameObjects.</param>\n      <param name=\"mode\">Whether to keep existing Scenes open.</param>\n      <returns>\n        <para>A reference to the new Scene.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.SceneManagement.EditorSceneManager.NewSceneCreatedCallback\">\n      <summary>\n        <para>Callbacks of this type which have been added to the newSceneCreated event are called after a new Scene has been created.</para>\n      </summary>\n      <param name=\"scene\">The Scene that was created.</param>\n      <param name=\"setup\">The setup mode used when creating the Scene.</param>\n      <param name=\"mode\">The mode used for creating the Scene.</param>\n    </member>\n    <member name=\"M:UnityEditor.SceneManagement.EditorSceneManager.OpenScene(System.String,UnityEditor.SceneManagement.OpenSceneMode)\">\n      <summary>\n        <para>Open a Scene in the Editor.</para>\n      </summary>\n      <param name=\"scenePath\">The path of the Scene. This should be relative to the Project folder; for example, \"AssetsMyScenesMyScene.unity\".</param>\n      <param name=\"mode\">Allows you to select how to open the specified Scene, and whether to keep existing Scenes in the Hierarchy. See SceneManagement.OpenSceneMode for more information about the options.</param>\n      <returns>\n        <para>A reference to the opened Scene.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.SceneManagement.EditorSceneManager.RestoreSceneManagerSetup(UnityEditor.SceneManagement.SceneSetup[])\">\n      <summary>\n        <para>Restore the setup of the SceneManager.</para>\n      </summary>\n      <param name=\"value\">In this array, at least one Scene should be loaded, and there must be one active Scene.</param>\n    </member>\n    <member name=\"M:UnityEditor.SceneManagement.EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo\">\n      <summary>\n        <para>Asks you if you want to save the modified Scene or Scenes.</para>\n      </summary>\n      <returns>\n        <para>This returns true if you chose to save the Scene or Scenes, and returns false if you pressed Cancel.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.SceneManagement.EditorSceneManager.SaveModifiedScenesIfUserWantsTo(UnityEngine.SceneManagement.Scene[])\">\n      <summary>\n        <para>Asks whether the modfied input Scenes should be saved.</para>\n      </summary>\n      <param name=\"scenes\">Scenes that should be saved if they are modified.</param>\n      <returns>\n        <para>Your choice of whether to save or not save the Scenes.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.SceneManagement.EditorSceneManager.SaveOpenScenes\">\n      <summary>\n        <para>Save all open Scenes.</para>\n      </summary>\n      <returns>\n        <para>Returns true if all open Scenes are successfully saved.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.SceneManagement.EditorSceneManager.SaveScene(UnityEngine.SceneManagement.Scene,System.String,System.Boolean)\">\n      <summary>\n        <para>Save a Scene.</para>\n      </summary>\n      <param name=\"scene\">The Scene to be saved.</param>\n      <param name=\"dstScenePath\">The file path to save the Scene to. If the path is empty, the current open Scene is overwritten. If it has not yet been saved at all, a save dialog is shown.</param>\n      <param name=\"saveAsCopy\">If set to true, the Scene is saved without changing the current Scene, and without clearing the unsaved changes marker.</param>\n      <returns>\n        <para>True if the save succeeded, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.SceneManagement.EditorSceneManager.SaveScenes(UnityEngine.SceneManagement.Scene[])\">\n      <summary>\n        <para>Save a list of Scenes.</para>\n      </summary>\n      <param name=\"scenes\">List of Scenes that should be saved.</param>\n      <returns>\n        <para>True if the save succeeded. Otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.SceneManagement.EditorSceneManager.SceneClosedCallback\">\n      <summary>\n        <para>Callbacks of this type which have been added to the sceneClosed event are called immediately after the Scene has been closed.</para>\n      </summary>\n      <param name=\"scene\">The Scene that was closed.</param>\n    </member>\n    <member name=\"T:UnityEditor.SceneManagement.EditorSceneManager.SceneClosingCallback\">\n      <summary>\n        <para>Callbacks of this type which have been added to the sceneClosing event are called just before a Scene is closed.</para>\n      </summary>\n      <param name=\"scene\">The Scene that is going to be closed.</param>\n      <param name=\"removingScene\">Whether or not the Scene is also going to be removed from the Scene Manager after closing. If true the Scene is removed after closing.</param>\n    </member>\n    <member name=\"T:UnityEditor.SceneManagement.EditorSceneManager.SceneOpenedCallback\">\n      <summary>\n        <para>Callbacks of this type which have been added to the sceneOpened event are called after a Scene has been opened.</para>\n      </summary>\n      <param name=\"scene\">The Scene that was opened.</param>\n      <param name=\"mode\">The mode used to open the Scene.</param>\n    </member>\n    <member name=\"T:UnityEditor.SceneManagement.EditorSceneManager.SceneOpeningCallback\">\n      <summary>\n        <para>Callbacks of this type which have been added to the sceneOpening event are called just before opening a Scene.</para>\n      </summary>\n      <param name=\"path\">Path of the Scene to be opened. This is relative to the Project path.</param>\n      <param name=\"mode\">Mode that is used when opening the Scene.</param>\n    </member>\n    <member name=\"T:UnityEditor.SceneManagement.EditorSceneManager.SceneSavedCallback\">\n      <summary>\n        <para>Callbacks of this type which have been added to the sceneSaved event are called after a Scene has been saved.</para>\n      </summary>\n      <param name=\"scene\">The Scene that was saved.</param>\n    </member>\n    <member name=\"T:UnityEditor.SceneManagement.EditorSceneManager.SceneSavingCallback\">\n      <summary>\n        <para>Callbacks of this type which have been added to the sceneSaving event are called just before the Scene is saved.</para>\n      </summary>\n      <param name=\"scene\">The Scene to be saved.</param>\n      <param name=\"path\">The path to which the Scene is saved.</param>\n    </member>\n    <member name=\"T:UnityEditor.SceneManagement.NewSceneMode\">\n      <summary>\n        <para>Used when creating a new scene in the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SceneManagement.NewSceneMode.Additive\">\n      <summary>\n        <para>The newly created scene is added to the current open scenes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SceneManagement.NewSceneMode.Single\">\n      <summary>\n        <para>All current open scenes are closed and the newly created scene are opened.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.SceneManagement.NewSceneSetup\">\n      <summary>\n        <para>Used when creating a new scene in the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SceneManagement.NewSceneSetup.DefaultGameObjects\">\n      <summary>\n        <para>Adds default game objects to the new scene (a light and camera).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SceneManagement.NewSceneSetup.EmptyScene\">\n      <summary>\n        <para>No game objects are added to the new scene.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.SceneManagement.OpenSceneMode\">\n      <summary>\n        <para>Used when opening a scene in the Editor to specify how a scene should be opened.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SceneManagement.OpenSceneMode.Additive\">\n      <summary>\n        <para>Adds a scene to the current open scenes and loads it.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SceneManagement.OpenSceneMode.AdditiveWithoutLoading\">\n      <summary>\n        <para>Adds a scene to the current open scenes without loading it. It will show up as 'unloaded' in the Hierarchy Window.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SceneManagement.OpenSceneMode.Single\">\n      <summary>\n        <para>Closes all current open scenes and loads a scene.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.SceneManagement.SceneSetup\">\n      <summary>\n        <para>The setup information for a scene in the SceneManager. This cannot be used in Play Mode. </para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SceneManagement.SceneSetup.isActive\">\n      <summary>\n        <para>If the scene is active.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SceneManagement.SceneSetup.isLoaded\">\n      <summary>\n        <para>If the scene is loaded.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SceneManagement.SceneSetup.path\">\n      <summary>\n        <para>Path of the scene. Should be relative to the project folder. Like: \"AssetsMyScenesMyScene.unity\".</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SceneView.CameraMode.drawMode\">\n      <summary>\n        <para>The draw mode associated with the CameraMode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SceneView.CameraMode.name\">\n      <summary>\n        <para>The name of the CameraMode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SceneView.CameraMode.section\">\n      <summary>\n        <para>The section the CameraMode belongs to.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ScriptableWizard\">\n      <summary>\n        <para>Derive from this class to create an editor wizard.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ScriptableWizard.createButtonName\">\n      <summary>\n        <para>Allows you to set the text shown on the create button of the wizard.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ScriptableWizard.errorString\">\n      <summary>\n        <para>Allows you to set the error text of the wizard.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ScriptableWizard.helpString\">\n      <summary>\n        <para>Allows you to set the help text of the wizard.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ScriptableWizard.isValid\">\n      <summary>\n        <para>Allows you to enable and disable the wizard create button, so that the user can not click it.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ScriptableWizard.otherButtonName\">\n      <summary>\n        <para>Allows you to set the text shown on the optional other button of the wizard. Leave this parameter out to leave the button out.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.ScriptableWizard.DisplayWizard(System.String)\">\n      <summary>\n        <para>Creates a wizard.</para>\n      </summary>\n      <param name=\"title\">The title shown at the top of the wizard window.</param>\n      <returns>\n        <para>The wizard.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ScriptableWizard.DisplayWizard(System.String,System.String)\">\n      <summary>\n        <para>Creates a wizard.</para>\n      </summary>\n      <param name=\"title\">The title shown at the top of the wizard window.</param>\n      <param name=\"createButtonName\">The text shown on the create button.</param>\n      <param name=\"otherButtonName\">The text shown on the optional other button. Leave this parameter out to leave the button out.</param>\n      <returns>\n        <para>The wizard.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ScriptableWizard.DisplayWizard(System.String,System.String,System.String)\">\n      <summary>\n        <para>Creates a wizard.</para>\n      </summary>\n      <param name=\"title\">The title shown at the top of the wizard window.</param>\n      <param name=\"createButtonName\">The text shown on the create button.</param>\n      <param name=\"otherButtonName\">The text shown on the optional other button. Leave this parameter out to leave the button out.</param>\n      <returns>\n        <para>The wizard.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ScriptableWizard.DisplayWizard(System.String,System.Type,System.String,System.String)\">\n      <summary>\n        <para>Creates a wizard.</para>\n      </summary>\n      <param name=\"title\">The title shown at the top of the wizard window.</param>\n      <param name=\"klass\">The class implementing the wizard. It has to derive from ScriptableWizard.</param>\n      <param name=\"createButtonName\">The text shown on the create button.</param>\n      <param name=\"otherButtonName\">The text shown on the optional other button. Leave this parameter out to leave the button out.</param>\n      <returns>\n        <para>The wizard.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ScriptableWizard.DrawWizardGUI\">\n      <summary>\n        <para>Will be called for drawing contents when the ScriptableWizard needs to update its GUI.</para>\n      </summary>\n      <returns>\n        <para>Returns true if any property has been modified.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.ScriptCallOptimizationLevel\">\n      <summary>\n        <para>Script call optimization level.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ScriptCallOptimizationLevel.FastButNoExceptions\">\n      <summary>\n        <para>Script method call overhead decreased at the expense of limited compatibility.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ScriptCallOptimizationLevel.SlowAndSafe\">\n      <summary>\n        <para>Default setting.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ScriptCompiler\">\n      <summary>\n        <para>Represents different C# compilers that can be used to compile C# scripts.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ScriptCompiler.Mono\">\n      <summary>\n        <para>Mono C# Compiler.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ScriptCompiler.Roslyn\">\n      <summary>\n        <para>Roslyn C# Compiler.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ScriptingImplementation\">\n      <summary>\n        <para>Scripting implementation (backend).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ScriptingImplementation.IL2CPP\">\n      <summary>\n        <para>Unity's .NET runtime.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ScriptingImplementation.Mono2x\">\n      <summary>\n        <para>The standard Mono 2.6 runtime.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ScriptingImplementation.WinRTDotNET\">\n      <summary>\n        <para>Microsoft's .NET runtime.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ScriptingRuntimeVersion\">\n      <summary>\n        <para>Available scripting runtimes to be used by the Editor and Players.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ScriptingRuntimeVersion.Latest\">\n      <summary>\n        <para>Use the most recent version of the scripting runtime available.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ScriptingRuntimeVersion.Legacy\">\n      <summary>\n        <para>Use the stable version of the scripting runtime.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Selection\">\n      <summary>\n        <para>Access to the selection in the editor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Selection.activeContext\">\n      <summary>\n        <para>Returns the current context object, as was set via SetActiveObjectWithContext.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Selection.activeGameObject\">\n      <summary>\n        <para>Returns the active game object. (The one shown in the inspector).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Selection.activeInstanceID\">\n      <summary>\n        <para>Returns the instanceID of the actual object selection. Includes prefabs, non-modifyable objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Selection.activeObject\">\n      <summary>\n        <para>Returns the actual object selection. Includes prefabs, non-modifyable objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Selection.activeTransform\">\n      <summary>\n        <para>Returns the active transform. (The one shown in the inspector).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Selection.assetGUIDs\">\n      <summary>\n        <para>Returns the guids of the selected assets.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Selection.gameObjects\">\n      <summary>\n        <para>Returns the actual game object selection. Includes prefabs, non-modifyable objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Selection.instanceIDs\">\n      <summary>\n        <para>The actual unfiltered selection from the Scene returned as instance ids instead of objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Selection.objects\">\n      <summary>\n        <para>The actual unfiltered selection from the Scene.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Selection.selectionChanged\">\n      <summary>\n        <para>Delegate callback triggered when currently active/selected item has changed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Selection.transforms\">\n      <summary>\n        <para>Returns the top level selection, excluding prefabs.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Selection.Contains(System.Int32)\">\n      <summary>\n        <para>Returns whether an object is contained in the current selection.</para>\n      </summary>\n      <param name=\"instanceID\"></param>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Selection.Contains(UnityEngine.Object)\">\n      <summary>\n        <para>Returns whether an object is contained in the current selection.</para>\n      </summary>\n      <param name=\"instanceID\"></param>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Selection.GetFiltered(System.Type,UnityEditor.SelectionMode)\">\n      <summary>\n        <para>Returns the current selection filtered by type and mode.</para>\n      </summary>\n      <param name=\"type\">Only objects of this type will be retrieved.</param>\n      <param name=\"mode\">Further options to refine the selection.</param>\n    </member>\n    <member name=\"M:UnityEditor.Selection.GetTransforms(UnityEditor.SelectionMode)\">\n      <summary>\n        <para>Allows for fine grained control of the selection type using the SelectionMode bitmask.</para>\n      </summary>\n      <param name=\"mode\">Options for refining the selection.</param>\n    </member>\n    <member name=\"M:UnityEditor.Selection.SetActiveObjectWithContext(UnityEngine.Object,UnityEngine.Object)\">\n      <summary>\n        <para>Selects an object with a context.</para>\n      </summary>\n      <param name=\"obj\">Object being selected (will be equal activeObject).</param>\n      <param name=\"context\">Context object.</param>\n    </member>\n    <member name=\"T:UnityEditor.SelectionMode\">\n      <summary>\n        <para>SelectionMode can be used to tweak the selection returned by Selection.GetTransforms.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SelectionMode.Assets\">\n      <summary>\n        <para>Only return objects that are assets in the Asset directory.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SelectionMode.Deep\">\n      <summary>\n        <para>Return the selection and all child transforms of the selection.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SelectionMode.DeepAssets\">\n      <summary>\n        <para>If the selection contains folders, also include all assets and subfolders within that folder in the file hierarchy.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SelectionMode.Editable\">\n      <summary>\n        <para>Excludes any objects which shall not be modified.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SelectionMode.ExcludePrefab\">\n      <summary>\n        <para>Excludes any prefabs from the selection.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SelectionMode.TopLevel\">\n      <summary>\n        <para>Only return the topmost selected transform. A selected child of another selected transform will be filtered out.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SelectionMode.Unfiltered\">\n      <summary>\n        <para>Return the whole selection.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.SemanticMergeMode\">\n      <summary>\n        <para>Behavior of semantic merge.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SemanticMergeMode.Off\">\n      <summary>\n        <para>Disable use of semantic merging.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.SerializedObject\">\n      <summary>\n        <para>SerializedObject and SerializedProperty are classes for editing properties on objects in a completely generic way that automatically handles undo and styling UI for prefabs.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedObject.context\">\n      <summary>\n        <para>The context used to store and resolve ExposedReference types. This is set by the SerializedObject constructor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedObject.isEditingMultipleObjects\">\n      <summary>\n        <para>Does the serialized object represents multiple objects due to multi-object editing? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedObject.maxArraySizeForMultiEditing\">\n      <summary>\n        <para>Defines the maximum size beyond which arrays cannot be edited when multiple objects are selected.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedObject.targetObject\">\n      <summary>\n        <para>The inspected object (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedObject.targetObjects\">\n      <summary>\n        <para>The inspected objects (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SerializedObject.ApplyModifiedProperties\">\n      <summary>\n        <para>Apply property modifications.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SerializedObject.ApplyModifiedPropertiesWithoutUndo\">\n      <summary>\n        <para>Applies property modifications without registering an undo operation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SerializedObject.CopyFromSerializedProperty(UnityEditor.SerializedProperty)\">\n      <summary>\n        <para>Copies a value from a SerializedProperty to the corresponding serialized property on the serialized object.</para>\n      </summary>\n      <param name=\"prop\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SerializedObject.CopyFromSerializedPropertyIfDifferent(UnityEditor.SerializedProperty)\">\n      <summary>\n        <para>Copies a changed value from a SerializedProperty to the corresponding serialized property on the serialized object.</para>\n      </summary>\n      <param name=\"prop\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SerializedObject.#ctor(UnityEngine.Object)\">\n      <summary>\n        <para>Create SerializedObject for inspected object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SerializedObject.#ctor(UnityEngine.Object[])\">\n      <summary>\n        <para>Create SerializedObject for inspected object.</para>\n      </summary>\n      <param name=\"objs\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SerializedObject.#ctor(UnityEngine.Object,UnityEngine.Object)\">\n      <summary>\n        <para>Create SerializedObject for inspected object by specifying a context to be used to store and resolve ExposedReference types.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"context\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SerializedObject.#ctor(UnityEngine.Object[],UnityEngine.Object)\">\n      <summary>\n        <para>Create SerializedObject for inspected object by specifying a context to be used to store and resolve ExposedReference types.</para>\n      </summary>\n      <param name=\"objs\"></param>\n      <param name=\"context\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SerializedObject.FindProperty(System.String)\">\n      <summary>\n        <para>Find serialized property by name.</para>\n      </summary>\n      <param name=\"propertyPath\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SerializedObject.GetIterator\">\n      <summary>\n        <para>Get the first serialized property.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SerializedObject.SetIsDifferentCacheDirty\">\n      <summary>\n        <para>Update hasMultipleDifferentValues cache on the next Update() call.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SerializedObject.Update\">\n      <summary>\n        <para>Update serialized object's representation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SerializedObject.UpdateIfDirtyOrScript\">\n      <summary>\n        <para>This has been made obsolete. See SerializedObject.UpdateIfRequiredOrScript instead.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SerializedObject.UpdateIfRequiredOrScript\">\n      <summary>\n        <para>Update serialized object's representation, only if the object has been modified since the last call to Update or if it is a script.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.SerializedProperty\">\n      <summary>\n        <para>SerializedProperty and SerializedObject are classes for editing properties on objects in a completely generic way that automatically handles undo and styling UI for prefabs.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.animationCurveValue\">\n      <summary>\n        <para>Value of a animation curve property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.arrayElementType\">\n      <summary>\n        <para>Type name of the element in an array property. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.arraySize\">\n      <summary>\n        <para>The number of elements in the array. If the SerializedObject contains multiple objects it will return the smallest number of elements. So it is always possible to iterate through the SerializedObject and only get properties found in all objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.boolValue\">\n      <summary>\n        <para>Value of a boolean property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.boundsIntValue\">\n      <summary>\n        <para>Value of bounds with integer values property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.boundsValue\">\n      <summary>\n        <para>Value of bounds property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.colorValue\">\n      <summary>\n        <para>Value of a color property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.depth\">\n      <summary>\n        <para>Nesting depth of the property. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.displayName\">\n      <summary>\n        <para>Nice display name of the property. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.doubleValue\">\n      <summary>\n        <para>Value of a float property as a double.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.editable\">\n      <summary>\n        <para>Is this property editable? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.enumDisplayNames\">\n      <summary>\n        <para>Display-friendly names of enumeration of an enum property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.enumNames\">\n      <summary>\n        <para>Names of enumeration of an enum property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.enumValueIndex\">\n      <summary>\n        <para>Enum index of an enum property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.exposedReferenceValue\">\n      <summary>\n        <para>A reference to another Object in the Scene. This reference is resolved in the context of the SerializedObject containing the SerializedProperty.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.fixedBufferSize\">\n      <summary>\n        <para>The number of elements in the fixed buffer. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.floatValue\">\n      <summary>\n        <para>Value of a float property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.hasChildren\">\n      <summary>\n        <para>Does it have child properties? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.hasMultipleDifferentValues\">\n      <summary>\n        <para>Does this property represent multiple different values due to multi-object editing? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.hasVisibleChildren\">\n      <summary>\n        <para>Does it have visible child properties? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.intValue\">\n      <summary>\n        <para>Value of an integer property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.isArray\">\n      <summary>\n        <para>Is this property an array? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.isExpanded\">\n      <summary>\n        <para>Is this property expanded in the inspector?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.isFixedBuffer\">\n      <summary>\n        <para>Is this property a fixed buffer? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.isInstantiatedPrefab\">\n      <summary>\n        <para>Is property part of a prefab instance? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.longValue\">\n      <summary>\n        <para>Value of a integer property as a long.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.name\">\n      <summary>\n        <para>Name of the property. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.objectReferenceValue\">\n      <summary>\n        <para>Value of an object reference property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.prefabOverride\">\n      <summary>\n        <para>Is property's value different from the prefab it belongs to?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.propertyPath\">\n      <summary>\n        <para>Full path of the property. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.propertyType\">\n      <summary>\n        <para>Type of this property (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.quaternionValue\">\n      <summary>\n        <para>Value of a quaternion property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.rectIntValue\">\n      <summary>\n        <para>Value of a rectangle with integer values property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.rectValue\">\n      <summary>\n        <para>Value of a rectangle property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.serializedObject\">\n      <summary>\n        <para>SerializedObject this property belongs to (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.stringValue\">\n      <summary>\n        <para>Value of a string property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.tooltip\">\n      <summary>\n        <para>Tooltip of the property. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.type\">\n      <summary>\n        <para>Type name of the property. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.vector2IntValue\">\n      <summary>\n        <para>Value of a 2D integer vector property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.vector2Value\">\n      <summary>\n        <para>Value of a 2D vector property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.vector3IntValue\">\n      <summary>\n        <para>Value of a 3D integer vector property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.vector3Value\">\n      <summary>\n        <para>Value of a 3D vector property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SerializedProperty.vector4Value\">\n      <summary>\n        <para>Value of a 4D vector property.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.ClearArray\">\n      <summary>\n        <para>Remove all elements from the array.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.Copy\">\n      <summary>\n        <para>Returns a copy of the SerializedProperty iterator in its current state. This is useful if you want to keep a reference to the current property but continue with the iteration.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.CountInProperty\">\n      <summary>\n        <para>Count visible children of this property, including this property itself.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.CountRemaining\">\n      <summary>\n        <para>Count remaining visible properties.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.DeleteArrayElementAtIndex(System.Int32)\">\n      <summary>\n        <para>Delete the element at the specified index in the array.</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.DeleteCommand\">\n      <summary>\n        <para>Deletes the serialized property.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.DuplicateCommand\">\n      <summary>\n        <para>Duplicates the serialized property.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.EqualContents(UnityEditor.SerializedProperty,UnityEditor.SerializedProperty)\">\n      <summary>\n        <para>See if contained serialized properties are equal.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.FindPropertyRelative(System.String)\">\n      <summary>\n        <para>Retrieves the SerializedProperty at a relative path to the current property.</para>\n      </summary>\n      <param name=\"relativePropertyPath\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.GetArrayElementAtIndex(System.Int32)\">\n      <summary>\n        <para>Returns the element at the specified index in the array.</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.GetEndProperty()\">\n      <summary>\n        <para>Retrieves the SerializedProperty that defines the end range of this property.</para>\n      </summary>\n      <param name=\"includeInvisible\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.GetEndProperty(System.Boolean)\">\n      <summary>\n        <para>Retrieves the SerializedProperty that defines the end range of this property.</para>\n      </summary>\n      <param name=\"includeInvisible\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.GetEnumerator\">\n      <summary>\n        <para>Retrieves an iterator that allows you to iterator over the current nexting of a serialized property.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.GetFixedBufferElementAtIndex(System.Int32)\">\n      <summary>\n        <para>Returns the element at the specified index in the fixed buffer.</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.InsertArrayElementAtIndex(System.Int32)\">\n      <summary>\n        <para>Insert an empty element at the specified index in the array.</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.MoveArrayElement(System.Int32,System.Int32)\">\n      <summary>\n        <para>Move an array element from srcIndex to dstIndex.</para>\n      </summary>\n      <param name=\"srcIndex\"></param>\n      <param name=\"dstIndex\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.Next(System.Boolean)\">\n      <summary>\n        <para>Move to next property.</para>\n      </summary>\n      <param name=\"enterChildren\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.NextVisible(System.Boolean)\">\n      <summary>\n        <para>Move to next visible property.</para>\n      </summary>\n      <param name=\"enterChildren\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SerializedProperty.Reset\">\n      <summary>\n        <para>Move to first property of the object.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.SerializedPropertyType\">\n      <summary>\n        <para>Type of a SerializedProperty.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.AnimationCurve\">\n      <summary>\n        <para>AnimationCurve property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.ArraySize\">\n      <summary>\n        <para>Array size property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.Boolean\">\n      <summary>\n        <para>Boolean property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.Bounds\">\n      <summary>\n        <para>Bounds property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.BoundsInt\">\n      <summary>\n        <para>Bounds with Integer values property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.Character\">\n      <summary>\n        <para>Character property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.Color\">\n      <summary>\n        <para>Color property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.Enum\">\n      <summary>\n        <para>Enumeration property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.ExposedReference\">\n      <summary>\n        <para>A reference to another Object in the Scene. This is done via an ExposedReference type and resolves to a reference to an Object that exists in the context of the SerializedObject containing the SerializedProperty.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.FixedBufferSize\">\n      <summary>\n        <para>Fixed buffer size property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.Float\">\n      <summary>\n        <para>Float property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.Gradient\">\n      <summary>\n        <para>Gradient property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.Integer\">\n      <summary>\n        <para>Integer property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.LayerMask\">\n      <summary>\n        <para>LayerMask property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.ObjectReference\">\n      <summary>\n        <para>Reference to another object.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.Quaternion\">\n      <summary>\n        <para>Quaternion property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.Rect\">\n      <summary>\n        <para>Rectangle property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.RectInt\">\n      <summary>\n        <para>Rectangle with Integer values property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.String\">\n      <summary>\n        <para>String property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.Vector2\">\n      <summary>\n        <para>2D vector property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.Vector2Int\">\n      <summary>\n        <para>2D integer vector property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.Vector3\">\n      <summary>\n        <para>3D vector property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.Vector3Int\">\n      <summary>\n        <para>3D integer vector property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SerializedPropertyType.Vector4\">\n      <summary>\n        <para>4D vector property.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.SessionState\">\n      <summary>\n        <para>SessionState is a Key-Value Store intended for storing and retrieving Editor session state that should survive assembly reloading.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SessionState.EraseBool(System.String)\">\n      <summary>\n        <para>Erase a Boolean entry in the key-value store.</para>\n      </summary>\n      <param name=\"key\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SessionState.EraseFloat(System.String)\">\n      <summary>\n        <para>Erase a Float entry in the key-value store.</para>\n      </summary>\n      <param name=\"key\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SessionState.EraseInt(System.String)\">\n      <summary>\n        <para>Erase an Integer entry in the key-value store.</para>\n      </summary>\n      <param name=\"key\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SessionState.EraseIntArray(System.String)\">\n      <summary>\n        <para>Erase an Integer array entry in the key-value store.</para>\n      </summary>\n      <param name=\"key\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SessionState.EraseString(System.String)\">\n      <summary>\n        <para>Erase a String entry in the key-value store.</para>\n      </summary>\n      <param name=\"key\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SessionState.EraseVector3(System.String)\">\n      <summary>\n        <para>Erase a Vector3 entry in the key-value store.</para>\n      </summary>\n      <param name=\"key\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SessionState.GetBool(System.String,System.Boolean)\">\n      <summary>\n        <para>Retrieve a Boolean value.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"defaultValue\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SessionState.GetFloat(System.String,System.Single)\">\n      <summary>\n        <para>Retrieve a Float value.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"defaultValue\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SessionState.GetInt(System.String,System.Int32)\">\n      <summary>\n        <para>Retrieve an Integer value.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"defaultValue\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SessionState.GetIntArray(System.String,System.Int32[])\">\n      <summary>\n        <para>Retrieve an Integer array.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"defaultValue\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SessionState.GetString(System.String,System.String)\">\n      <summary>\n        <para>Retrieve a String value.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"defaultValue\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SessionState.GetVector3(System.String,UnityEngine.Vector3)\">\n      <summary>\n        <para>Retrieve a Vector3.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"defaultValue\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SessionState.SetBool(System.String,System.Boolean)\">\n      <summary>\n        <para>Store a Boolean value.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SessionState.SetFloat(System.String,System.Single)\">\n      <summary>\n        <para>Store a Float value.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SessionState.SetInt(System.String,System.Int32)\">\n      <summary>\n        <para>Store an Integer value.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SessionState.SetIntArray(System.String,System.Int32[])\">\n      <summary>\n        <para>Store an Integer array.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SessionState.SetString(System.String,System.String)\">\n      <summary>\n        <para>Store a String value.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEditor.SessionState.SetVector3(System.String,UnityEngine.Vector3)\">\n      <summary>\n        <para>Store a Vector3.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"T:UnityEditor.ShaderData\">\n      <summary>\n        <para>This class describes a shader.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ShaderData.ActiveSubshader\">\n      <summary>\n        <para>Returns the active subshader or null if none is currently active.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ShaderData.ActiveSubshaderIndex\">\n      <summary>\n        <para>Returns the index of the active subshader or -1 if none is currently active.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.ShaderData.GetSubshader(System.Int32)\">\n      <summary>\n        <para>Get a subshader.</para>\n      </summary>\n      <param name=\"index\">The index of the subshader.</param>\n      <returns>\n        <para>The associated subshader or null if none exists.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.ShaderData.Pass\">\n      <summary>\n        <para>This class describes a pass of a subshader.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ShaderData.Pass.Name\">\n      <summary>\n        <para>The name of this pass (may be empty).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ShaderData.Pass.SourceCode\">\n      <summary>\n        <para>The source code for this pass.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ShaderData.SourceShader\">\n      <summary>\n        <para>The shader attached to this data set.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ShaderData.Subshader\">\n      <summary>\n        <para>This class describes a subshader.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.ShaderData.Subshader.GetPass(System.Int32)\">\n      <summary>\n        <para>Get a pass of a subshader.</para>\n      </summary>\n      <param name=\"passIndex\">The index of the pass.</param>\n      <returns>\n        <para>The specified pass or null, if none exists.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEditor.ShaderData.Subshader.PassCount\">\n      <summary>\n        <para>The number of passes for this subshader.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ShaderData.SubshaderCount\">\n      <summary>\n        <para>The number of subshaders used by this shader.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ShaderGUI\">\n      <summary>\n        <para>Abstract class to derive from for defining custom GUI for shader properties and for extending the material preview.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.ShaderGUI.AssignNewShaderToMaterial(UnityEngine.Material,UnityEngine.Shader,UnityEngine.Shader)\">\n      <summary>\n        <para>This method is called when a new shader has been selected for a Material.</para>\n      </summary>\n      <param name=\"material\">The material the newShader should be assigned to.</param>\n      <param name=\"oldShader\">Previous shader.</param>\n      <param name=\"newShader\">New shader to assign to the material.</param>\n    </member>\n    <member name=\"M:UnityEditor.ShaderGUI.FindProperty(System.String,UnityEditor.MaterialProperty[])\">\n      <summary>\n        <para>Find shader properties.</para>\n      </summary>\n      <param name=\"propertyName\">Name of the material property.</param>\n      <param name=\"properties\">The array of available properties.</param>\n      <param name=\"propertyIsMandatory\">If true then this method will throw an exception if a property with propertyName was not found.</param>\n      <returns>\n        <para>The material property found, otherwise null.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ShaderGUI.FindProperty(System.String,UnityEditor.MaterialProperty[],System.Boolean)\">\n      <summary>\n        <para>Find shader properties.</para>\n      </summary>\n      <param name=\"propertyName\">Name of the material property.</param>\n      <param name=\"properties\">The array of available properties.</param>\n      <param name=\"propertyIsMandatory\">If true then this method will throw an exception if a property with propertyName was not found.</param>\n      <returns>\n        <para>The material property found, otherwise null.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ShaderGUI.OnClosed(UnityEngine.Material)\">\n      <summary>\n        <para>This method is called when the ShaderGUI is being closed.</para>\n      </summary>\n      <param name=\"material\"></param>\n    </member>\n    <member name=\"M:UnityEditor.ShaderGUI.OnGUI(UnityEditor.MaterialEditor,UnityEditor.MaterialProperty[])\">\n      <summary>\n        <para>To define a custom shader GUI use the methods of materialEditor to render controls for the properties array.</para>\n      </summary>\n      <param name=\"materialEditor\">The MaterialEditor that are calling this OnGUI (the 'owner').</param>\n      <param name=\"properties\">Material properties of the current selected shader.</param>\n    </member>\n    <member name=\"M:UnityEditor.ShaderGUI.OnMaterialPreviewGUI(UnityEditor.MaterialEditor,UnityEngine.Rect,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Override for extending the rendering of the Preview area or completly replace the preview (by not calling base.OnMaterialPreviewGUI).</para>\n      </summary>\n      <param name=\"materialEditor\">The MaterialEditor that are calling this method (the 'owner').</param>\n      <param name=\"r\">Preview rect.</param>\n      <param name=\"background\">Style for the background.</param>\n    </member>\n    <member name=\"M:UnityEditor.ShaderGUI.OnMaterialPreviewSettingsGUI(UnityEditor.MaterialEditor)\">\n      <summary>\n        <para>Override for extending the functionality of the toolbar of the preview area or completly replace the toolbar by not calling base.OnMaterialPreviewSettingsGUI.</para>\n      </summary>\n      <param name=\"materialEditor\">The MaterialEditor that are calling this method (the 'owner').</param>\n    </member>\n    <member name=\"T:UnityEditor.ShaderImporter\">\n      <summary>\n        <para>Shader importer lets you modify shader import settings from Editor scripts.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.ShaderImporter.GetDefaultTexture(System.String)\">\n      <summary>\n        <para>Gets the default texture assigned to the shader importer for the shader property with given name.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEditor.ShaderImporter.GetNonModifiableTexture(System.String)\">\n      <summary>\n        <para>Gets the non-modifiable texture assigned to the shader importer for the shader property with given name.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEditor.ShaderImporter.GetShader\">\n      <summary>\n        <para>Gets the reference to the shader imported by this importer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.ShaderImporter.SetDefaultTextures(System.String[],UnityEngine.Texture[])\">\n      <summary>\n        <para>Sets the default textures for each texture material property.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"textures\"></param>\n    </member>\n    <member name=\"M:UnityEditor.ShaderImporter.SetNonModifiableTextures(System.String[],UnityEngine.Texture[])\">\n      <summary>\n        <para>Sets the non-modifiable textures for each texture material property.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"textures\"></param>\n    </member>\n    <member name=\"T:UnityEditor.ShaderIncludePathAttribute\">\n      <summary>\n        <para>Attach this attribute to a static function that returns an array of extra root shader include paths.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ShaderInfo\">\n      <summary>\n        <para>Contains the following information about a shader:\n-If the shader has compilation errors.\n-If the shader is supported on the currently selected platform.\n-The name of the shader.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ShaderInfo.hasErrors\">\n      <summary>\n        <para>True if the shader has compilation errors.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ShaderInfo.name\">\n      <summary>\n        <para>The name of the shader.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ShaderInfo.supported\">\n      <summary>\n        <para>True if the shader is supported on the currently selected platform.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ShaderUtil\">\n      <summary>\n        <para>Utility functions to assist with working with shaders from the editor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.ShaderUtil.hardwareSupportsRectRenderTexture\">\n      <summary>\n        <para>Does the current hardware support render textues.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.ShaderUtil.ClearShaderErrors(UnityEngine.Shader)\">\n      <summary>\n        <para>Clear compile time errors for the given shader.</para>\n      </summary>\n      <param name=\"s\"></param>\n    </member>\n    <member name=\"M:UnityEditor.ShaderUtil.GetAllShaderInfo\">\n      <summary>\n        <para>Returns an array of ShaderInfo of all available shaders. That includes built-in shaders.</para>\n      </summary>\n      <returns>\n        <para>ShaderInfo array of all available shaders.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ShaderUtil.GetPropertyCount(UnityEngine.Shader)\">\n      <summary>\n        <para>Get the number of properties in Shader s.</para>\n      </summary>\n      <param name=\"s\">The shader to check against.</param>\n    </member>\n    <member name=\"M:UnityEditor.ShaderUtil.GetPropertyDescription(UnityEngine.Shader,System.Int32)\">\n      <summary>\n        <para>Get the description of the shader propery at index propertyIdx of Shader s.</para>\n      </summary>\n      <param name=\"s\">The shader to check against.</param>\n      <param name=\"propertyIdx\">The property index to use.</param>\n    </member>\n    <member name=\"M:UnityEditor.ShaderUtil.GetPropertyName(UnityEngine.Shader,System.Int32)\">\n      <summary>\n        <para>Get the name of the shader propery at index propertyIdx of Shader s.</para>\n      </summary>\n      <param name=\"s\">The shader to check against.</param>\n      <param name=\"propertyIdx\">The property index to use.</param>\n    </member>\n    <member name=\"M:UnityEditor.ShaderUtil.GetPropertyType(UnityEngine.Shader,System.Int32)\">\n      <summary>\n        <para>Get the ShaderProperyType of the shader propery at index propertyIdx of Shader s.</para>\n      </summary>\n      <param name=\"s\">The shader to check against.</param>\n      <param name=\"propertyIdx\">The property index to use.</param>\n    </member>\n    <member name=\"M:UnityEditor.ShaderUtil.GetRangeLimits(UnityEngine.Shader,System.Int32,System.Int32)\">\n      <summary>\n        <para>Get Limits for a range property at index propertyIdx of Shader s.</para>\n      </summary>\n      <param name=\"defminmax\">Which value to get: 0 = default, 1 = min, 2 = max.</param>\n      <param name=\"s\">The shader to check against.</param>\n      <param name=\"propertyIdx\">The property index to use.</param>\n    </member>\n    <member name=\"M:UnityEditor.ShaderUtil.GetShaderData(UnityEngine.Shader)\">\n      <summary>\n        <para>Get the shader data for a specific shader.</para>\n      </summary>\n      <param name=\"shader\">The shader to get data from.</param>\n      <returns>\n        <para>The shader data for the provided shader.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ShaderUtil.GetTexDim(UnityEngine.Shader,System.Int32)\">\n      <summary>\n        <para>Gets texture dimension of a shader property.</para>\n      </summary>\n      <param name=\"s\">The shader to get the property from.</param>\n      <param name=\"propertyIdx\">The property index to use.</param>\n      <returns>\n        <para>Texture dimension.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.ShaderUtil.IsShaderPropertyHidden(UnityEngine.Shader,System.Int32)\">\n      <summary>\n        <para>Is the shader propery at index propertyIdx of Shader s hidden?</para>\n      </summary>\n      <param name=\"s\">The shader to check against.</param>\n      <param name=\"propertyIdx\">The property index to use.</param>\n    </member>\n    <member name=\"M:UnityEditor.ShaderUtil.IsShaderPropertyNonModifiableTexureProperty(UnityEngine.Shader,System.Int32)\">\n      <summary>\n        <para>Is the shader propery at index propertyIdx of Shader s a NonModifiableTextureProperty?</para>\n      </summary>\n      <param name=\"s\">The shader to check against.</param>\n      <param name=\"propertyIdx\">The property index to use.</param>\n    </member>\n    <member name=\"M:UnityEditor.ShaderUtil.RegisterShader(UnityEngine.Shader)\">\n      <summary>\n        <para>Register a user created shader.</para>\n      </summary>\n      <param name=\"shader\"></param>\n    </member>\n    <member name=\"T:UnityEditor.ShaderUtil.ShaderPropertyType\">\n      <summary>\n        <para>Type of a given texture property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ShaderUtil.ShaderPropertyType.Color\">\n      <summary>\n        <para>Color Property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ShaderUtil.ShaderPropertyType.Float\">\n      <summary>\n        <para>Float Property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ShaderUtil.ShaderPropertyType.Range\">\n      <summary>\n        <para>Range Property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv\">\n      <summary>\n        <para>Texture Property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ShaderUtil.ShaderPropertyType.Vector\">\n      <summary>\n        <para>Vector Property.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.SketchUpImportCamera\">\n      <summary>\n        <para>Structure to hold camera data extracted from a SketchUp file.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SketchUpImportCamera.aspectRatio\">\n      <summary>\n        <para>Aspect ratio of the camera.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SketchUpImportCamera.fieldOfView\">\n      <summary>\n        <para>Field of view of the camera.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SketchUpImportCamera.isPerspective\">\n      <summary>\n        <para>Indicate if the camera is using a perspective or orthogonal projection.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SketchUpImportCamera.lookAt\">\n      <summary>\n        <para>The position the camera is looking at.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SketchUpImportCamera.orthoSize\">\n      <summary>\n        <para>The orthogonal projection size of the camera. This value only make sense if SketchUpImportCamera.isPerspective is false.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SketchUpImportCamera.position\">\n      <summary>\n        <para>The position of the camera.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SketchUpImportCamera.up\">\n      <summary>\n        <para>Up vector of the camera.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.SketchUpImporter\">\n      <summary>\n        <para>Derives from AssetImporter to handle importing of SketchUp files.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SketchUpImporter.latitude\">\n      <summary>\n        <para>Retrieves the latitude Geo Coordinate imported from the SketchUp file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SketchUpImporter.longitude\">\n      <summary>\n        <para>Retrieves the longitude Geo Coordinate imported from the SketchUp file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SketchUpImporter.northCorrection\">\n      <summary>\n        <para>Retrieves the north correction value imported from the SketchUp file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SketchUpImporter.GetDefaultCamera\">\n      <summary>\n        <para>The default camera or the camera of the active scene which the SketchUp file was saved with.</para>\n      </summary>\n      <returns>\n        <para>The default camera.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.SketchUpImporter.GetScenes\">\n      <summary>\n        <para>The method returns an array of SketchUpImportScene which represents SketchUp scenes.</para>\n      </summary>\n      <returns>\n        <para>Array of scenes extracted from a SketchUp file.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.SketchUpImportScene\">\n      <summary>\n        <para>Structure to hold scene data extracted from a SketchUp file.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SketchUpImportScene.camera\">\n      <summary>\n        <para>The camera data of the SketchUp scene.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SketchUpImportScene.name\">\n      <summary>\n        <para>The name of the SketchUp scene.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.SpeedTreeImporter\">\n      <summary>\n        <para>AssetImportor for importing SpeedTree model assets.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.alphaTestRef\">\n      <summary>\n        <para>Gets and sets a default alpha test reference values.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.animateCrossFading\">\n      <summary>\n        <para>Indicates if the cross-fade LOD transition, applied to the last mesh LOD and the billboard, should be animated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.bestWindQuality\">\n      <summary>\n        <para>Returns the best-possible wind quality on this asset (configured in SpeedTree modeler).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.billboardTransitionCrossFadeWidth\">\n      <summary>\n        <para>Proportion of the last 3D mesh LOD region width which is used for cross-fading to billboard tree.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.castShadows\">\n      <summary>\n        <para>Gets and sets an array of booleans to enable shadow casting for each LOD.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.enableBump\">\n      <summary>\n        <para>Gets and sets an array of booleans to enable normal mapping for each LOD.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.enableHue\">\n      <summary>\n        <para>Gets and sets an array of booleans to enable Hue variation effect for each LOD.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.enableSmoothLODTransition\">\n      <summary>\n        <para>Enables smooth LOD transitions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.fadeOutWidth\">\n      <summary>\n        <para>Proportion of the billboard LOD region width which is used for fading out the billboard.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.hasBillboard\">\n      <summary>\n        <para>Tells if there is a billboard LOD.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.hasImported\">\n      <summary>\n        <para>Tells if the SPM file has been previously imported.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.hueVariation\">\n      <summary>\n        <para>Gets and sets a default Hue variation color and amount (in alpha).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.mainColor\">\n      <summary>\n        <para>Gets and sets a default main color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.materialFolderPath\">\n      <summary>\n        <para>Returns the folder path where generated materials will be placed in.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.receiveShadows\">\n      <summary>\n        <para>Gets and sets an array of booleans to enable shadow receiving for each LOD.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.reflectionProbeUsages\">\n      <summary>\n        <para>Gets and sets an array of Reflection Probe usages for each LOD.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.scaleFactor\">\n      <summary>\n        <para>How much to scale the tree model compared to what is in the .spm file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.shininess\">\n      <summary>\n        <para>Gets and sets a default Shininess value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.specColor\">\n      <summary>\n        <para>Gets and sets a default specular color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.useLightProbes\">\n      <summary>\n        <para>Gets and sets an array of booleans to enable Light Probe lighting for each LOD.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.windQualities\">\n      <summary>\n        <para>Gets and sets an array of integers of the wind qualities on each LOD. Values will be clampped by BestWindQuality internally.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SpeedTreeImporter.windQualityNames\">\n      <summary>\n        <para>Gets an array of name strings for wind quality value.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SpeedTreeImporter.#ctor\">\n      <summary>\n        <para>Construct a new SpeedTreeImporter object.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SpeedTreeImporter.GenerateMaterials\">\n      <summary>\n        <para>Generates all necessary materials under materialFolderPath. If Version Control is enabled please first check out the folder.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpeedTreeImporter.LODHeights\">\n      <summary>\n        <para>Gets and sets an array of floats of each LOD's screen height value.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.SplashScreenStyle\">\n      <summary>\n        <para>The style of builtin splash screen to use.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SplashScreenStyle.Dark\">\n      <summary>\n        <para>Dark background with light logo and text.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SplashScreenStyle.Light\">\n      <summary>\n        <para>White background with dark logo and text.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.SpriteImportMode\">\n      <summary>\n        <para>Texture importer modes for Sprite import.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SpriteImportMode.Multiple\">\n      <summary>\n        <para>Sprites are multiple image sections extracted from the texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SpriteImportMode.None\">\n      <summary>\n        <para>Graphic is not a Sprite.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SpriteImportMode.Polygon\">\n      <summary>\n        <para>Sprite has it own mesh outline defined.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SpriteImportMode.Single\">\n      <summary>\n        <para>Sprite is a single image section extracted automatically from the texture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.SpriteMetaData\">\n      <summary>\n        <para>Editor data used in producing a Sprite.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SpriteMetaData.alignment\">\n      <summary>\n        <para>Edge-relative alignment of the sprite graphic.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SpriteMetaData.border\">\n      <summary>\n        <para>Edge border size for a sprite (in pixels).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SpriteMetaData.name\">\n      <summary>\n        <para>Name of the Sprite.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SpriteMetaData.pivot\">\n      <summary>\n        <para>The pivot point of the Sprite, relative to its bounding rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SpriteMetaData.rect\">\n      <summary>\n        <para>Bounding rectangle of the sprite's graphic within the atlas image.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.SpritePackerMode\">\n      <summary>\n        <para>Sprite Packer mode for the current project.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SpritePackerMode.AlwaysOn\">\n      <summary>\n        <para>Always maintain an up-to-date sprite atlas cache for Sprite with packing tag (legacy).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SpritePackerMode.AlwaysOnAtlas\">\n      <summary>\n        <para>Always pack all the SpriteAtlas.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SpritePackerMode.BuildTimeOnly\">\n      <summary>\n        <para>Updates the sprite atlas cache when the Player or bundles builds containing Sprite with the legacy packing tag.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SpritePackerMode.BuildTimeOnlyAtlas\">\n      <summary>\n        <para>Pack all the SpriteAtlas when building player/bundles.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.SpritePackerMode.Disabled\">\n      <summary>\n        <para>Doesn't pack sprites.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.SpriteRect\">\n      <summary>\n        <para>Abstract class that is used by systems to encapsulate Sprite data representation. Currently this is used by Sprite Editor Window.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpriteRect.alignment\">\n      <summary>\n        <para>SpriteAlignment that represents the pivot value for the Sprite data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpriteRect.border\">\n      <summary>\n        <para>Returns a Vector4 that represents the border of the Sprite data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpriteRect.name\">\n      <summary>\n        <para>The name of the Sprite data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpriteRect.pivot\">\n      <summary>\n        <para>Vector2 value representing the pivot for the Sprite data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpriteRect.rect\">\n      <summary>\n        <para>Rect value that represents the position and size of the Sprite data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.SpriteRect.spriteID\">\n      <summary>\n        <para>GUID to uniquely identify the SpriteRect data. This will be populated to Sprite.spriteID to identify the SpriteRect used to generate the Sprite.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.SpriteRect.GetSpriteIDFromSerializedProperty(UnityEditor.SerializedProperty)\">\n      <summary>\n        <para>Helper method to get SpriteRect.spriteID from a SerializedProperty.</para>\n      </summary>\n      <param name=\"sp\">The SerializedProperty to acquire from.</param>\n      <returns>\n        <para>GUID for the SpriteRect.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEditor.Sprites.AtlasSettings\">\n      <summary>\n        <para>Describes the final atlas texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Sprites.AtlasSettings.allowsAlphaSplitting\">\n      <summary>\n        <para>Marks this atlas so that it contains textures that have been flagged for Alpha splitting when needed (for example ETC1 compression for textures with transparency).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Sprites.AtlasSettings.anisoLevel\">\n      <summary>\n        <para>Anisotropic filtering level of the atlas texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Sprites.AtlasSettings.colorSpace\">\n      <summary>\n        <para>Desired color space of the atlas.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Sprites.AtlasSettings.compressionQuality\">\n      <summary>\n        <para>Quality of atlas texture compression in the range [0..100].</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Sprites.AtlasSettings.enableRotation\">\n      <summary>\n        <para>Allows Sprite Packer to rotate/flip the Sprite to ensure optimal Packing.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Sprites.AtlasSettings.filterMode\">\n      <summary>\n        <para>Filtering mode of the atlas texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Sprites.AtlasSettings.format\">\n      <summary>\n        <para>The format of the atlas texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Sprites.AtlasSettings.generateMipMaps\">\n      <summary>\n        <para>Should sprite atlas textures generate mip maps?</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Sprites.AtlasSettings.maxHeight\">\n      <summary>\n        <para>Maximum height of the atlas texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Sprites.AtlasSettings.maxWidth\">\n      <summary>\n        <para>Maximum width of the atlas texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Sprites.AtlasSettings.paddingPower\">\n      <summary>\n        <para>The amount of extra padding between packed sprites.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEditor.Sprites.IPackerPolicy\">\n      <summary>\n        <para>Sprite packing policy interface. Provide a custom implementation to control which Sprites go into which atlases.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Sprites.IPackerPolicy.AllowSequentialPacking\">\n      <summary>\n        <para>Specifies whether sequential processing of atlas tags is enabled. If enabled, sprite packing tags are processed one by one to reduce memory usage.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Sprites.IPackerPolicy.GetVersion\">\n      <summary>\n        <para>Return the version of your policy. Sprite Packer needs to know if atlas grouping logic changed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Sprites.IPackerPolicy.OnGroupAtlases(UnityEditor.BuildTarget,UnityEditor.Sprites.PackerJob,System.Int32[])\">\n      <summary>\n        <para>Implement custom atlas grouping here.</para>\n      </summary>\n      <param name=\"target\"></param>\n      <param name=\"job\"></param>\n      <param name=\"textureImporterInstanceIDs\"></param>\n    </member>\n    <member name=\"T:UnityEditor.Sprites.Packer\">\n      <summary>\n        <para>Sprite Packer helpers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Sprites.Packer.atlasNames\">\n      <summary>\n        <para>Array of Sprite atlas names found in the current atlas cache.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Sprites.Packer.kDefaultPolicy\">\n      <summary>\n        <para>Name of the default Sprite Packer policy.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Sprites.Packer.Execution\">\n      <summary>\n        <para>Sprite Packer execution mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Sprites.Packer.Execution.ForceRegroup\">\n      <summary>\n        <para>Will always trigger IPackerPolicy.OnGroupAtlases.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Sprites.Packer.Execution.Normal\">\n      <summary>\n        <para>Normal execution. Will not trigger IPackerPolicy.OnGroupAtlases unless IPackerPolicy, IPackerPolicy version or TextureImporter settings have changed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Sprites.Packer.GetAlphaTexturesForAtlas(System.String)\">\n      <summary>\n        <para>Returns all alpha atlas textures generated for the specified atlas.</para>\n      </summary>\n      <param name=\"atlasName\">Name of the atlas.</param>\n    </member>\n    <member name=\"M:UnityEditor.Sprites.Packer.GetAtlasDataForSprite(UnityEngine.Sprite,System.String&amp;,UnityEngine.Texture2D&amp;)\">\n      <summary>\n        <para>Returns atlasing data for the specified Sprite.</para>\n      </summary>\n      <param name=\"sprite\">Sprite to query.</param>\n      <param name=\"atlasName\">Gets set to the name of the atlas containing the specified Sprite.</param>\n      <param name=\"atlasTexture\">Gets set to the Texture containing the specified Sprite.</param>\n    </member>\n    <member name=\"M:UnityEditor.Sprites.Packer.GetTexturesForAtlas(System.String)\">\n      <summary>\n        <para>Returns all atlas textures generated for the specified atlas.</para>\n      </summary>\n      <param name=\"atlasName\">Atlas name.</param>\n    </member>\n    <member name=\"P:UnityEditor.Sprites.Packer.Policies\">\n      <summary>\n        <para>Available Sprite Packer policies for this project.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Sprites.Packer.RebuildAtlasCacheIfNeeded(UnityEditor.BuildTarget,System.Boolean,UnityEditor.Sprites.Packer/Execution)\">\n      <summary>\n        <para>Rebuilds the Sprite atlas cache.</para>\n      </summary>\n      <param name=\"target\"></param>\n      <param name=\"displayProgressBar\"></param>\n      <param name=\"execution\"></param>\n    </member>\n    <member name=\"P:UnityEditor.Sprites.Packer.SelectedPolicy\">\n      <summary>\n        <para>The active Sprite Packer policy for this project.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Sprites.PackerJob\">\n      <summary>\n        <para>Current Sprite Packer job definition.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Sprites.PackerJob.AddAtlas(System.String,UnityEditor.Sprites.AtlasSettings)\">\n      <summary>\n        <para>Registers a new atlas.</para>\n      </summary>\n      <param name=\"atlasName\"></param>\n      <param name=\"settings\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Sprites.PackerJob.AssignToAtlas(System.String,UnityEngine.Sprite,UnityEngine.SpritePackingMode,UnityEngine.SpritePackingRotation)\">\n      <summary>\n        <para>Assigns a Sprite to an already registered atlas.</para>\n      </summary>\n      <param name=\"atlasName\"></param>\n      <param name=\"sprite\"></param>\n      <param name=\"packingMode\"></param>\n      <param name=\"packingRotation\"></param>\n    </member>\n    <member name=\"T:UnityEditor.Sprites.SpriteUtility\">\n      <summary>\n        <para>Helper utilities for accessing Sprite data.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Sprites.SpriteUtility.GetSpriteIndices(UnityEngine.Sprite,System.Boolean)\">\n      <summary>\n        <para>Returns the generated Sprite mesh indices.</para>\n      </summary>\n      <param name=\"sprite\">If Sprite is packed, it is possible to access data as if it was on the atlas texture.</param>\n      <param name=\"getAtlasData\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Sprites.SpriteUtility.GetSpriteMesh(UnityEngine.Sprite,System.Boolean)\">\n      <summary>\n        <para>Returns the generated Sprite mesh positions.</para>\n      </summary>\n      <param name=\"getAtlasData\">If Sprite is packed, it is possible to access data as if it was on the atlas texture.</param>\n      <param name=\"sprite\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Sprites.SpriteUtility.GetSpriteTexture(UnityEngine.Sprite,System.Boolean)\">\n      <summary>\n        <para>Returns the generated Sprite texture. If Sprite is packed, it is possible to query for both source and atlas textures.</para>\n      </summary>\n      <param name=\"getAtlasData\">If Sprite is packed, it is possible to access data as if it was on the atlas texture.</param>\n      <param name=\"sprite\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Sprites.SpriteUtility.GetSpriteUVs(UnityEngine.Sprite,System.Boolean)\">\n      <summary>\n        <para>Returns the generated Sprite mesh uvs.</para>\n      </summary>\n      <param name=\"sprite\">If Sprite is packed, it is possible to access data as if it was on the atlas texture.</param>\n      <param name=\"getAtlasData\"></param>\n    </member>\n    <member name=\"T:UnityEditor.StaticEditorFlags\">\n      <summary>\n        <para>Static Editor Flags.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.StaticEditorFlags.BatchingStatic\">\n      <summary>\n        <para>Consider for static batching.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.StaticEditorFlags.LightmapStatic\">\n      <summary>\n        <para>Considered static for lightmapping.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.StaticEditorFlags.NavigationStatic\">\n      <summary>\n        <para>Considered static for navigation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.StaticEditorFlags.OccludeeStatic\">\n      <summary>\n        <para>Considered static for occlusion.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.StaticEditorFlags.OccluderStatic\">\n      <summary>\n        <para>Considered static for occlusion.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.StaticEditorFlags.OffMeshLinkGeneration\">\n      <summary>\n        <para>Auto-generate OffMeshLink.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.StaticEditorFlags.ReflectionProbeStatic\">\n      <summary>\n        <para>Consider static for reflection probe.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.StaticOcclusionCulling\">\n      <summary>\n        <para>StaticOcclusionCulling lets you perform static occlusion culling operations.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.StaticOcclusionCulling.doesSceneHaveManualPortals\">\n      <summary>\n        <para>Does the scene contain any occlusion portals that were added manually rather than automatically?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.StaticOcclusionCulling.isRunning\">\n      <summary>\n        <para>Used to check if asynchronous generation of static occlusion culling data is still running.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.StaticOcclusionCulling.umbraDataSize\">\n      <summary>\n        <para>Returns the size in bytes that the PVS data is currently taking up in this scene on disk.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.StaticOcclusionCulling.Cancel\">\n      <summary>\n        <para>Used to cancel asynchronous generation of static occlusion culling data.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.StaticOcclusionCulling.Clear\">\n      <summary>\n        <para>Clears the PVS of the opened scene.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.StaticOcclusionCulling.Compute\">\n      <summary>\n        <para>Used to generate static occlusion culling data.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.StaticOcclusionCulling.GenerateInBackground\">\n      <summary>\n        <para>Used to compute static occlusion culling data asynchronously.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.StaticOcclusionCullingVisualization\">\n      <summary>\n        <para>Used to visualize static occlusion culling at development time in scene view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.StaticOcclusionCullingVisualization.showGeometryCulling\">\n      <summary>\n        <para>If set to true, culling of geometry is enabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.StaticOcclusionCullingVisualization.showOcclusionCulling\">\n      <summary>\n        <para>If set to true, visualization of target volumes is enabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.StaticOcclusionCullingVisualization.showPortals\">\n      <summary>\n        <para>If set to true, visualization of portals is enabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.StaticOcclusionCullingVisualization.showPreVisualization\">\n      <summary>\n        <para>If set to true, the visualization lines of the PVS volumes will show all cells rather than cells after culling.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.StaticOcclusionCullingVisualization.showViewVolumes\">\n      <summary>\n        <para>If set to true, visualization of view volumes is enabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.StaticOcclusionCullingVisualization.showVisibilityLines\">\n      <summary>\n        <para>If set to true, visualization of portals is enabled.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.StatusQueryOptions\">\n      <summary>\n        <para>Options for querying the version control system status of a file.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.StatusQueryOptions.ForceUpdate\">\n      <summary>\n        <para>Force a refresh of the version control system status of the file. This is slow but accurate.\n\nSee Also: AssetDatabase.IsOpenForEdit, AssetDatabase.IsMetaFileOpenForEdit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.StatusQueryOptions.UseCachedAsync\">\n      <summary>\n        <para>This option sets the status query to first use the latest valid version control system status of the file and query for a valid status asynchronously if otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.StatusQueryOptions.UseCachedIfPossible\">\n      <summary>\n        <para>This option sets the status query to first use the latest valid version control system status of the file and query for a valid status synchronously if otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.StereoRenderingPath\">\n      <summary>\n        <para>Enum used to specify what stereo rendering path to use.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.StereoRenderingPath.Instancing\">\n      <summary>\n        <para>Single pass VR rendering ( via instanced rendering ).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.StereoRenderingPath.MultiPass\">\n      <summary>\n        <para>Multiple pass VR rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.StereoRenderingPath.SinglePass\">\n      <summary>\n        <para>Single pass VR rendering ( via double-wide render texture ).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.StrippingLevel\">\n      <summary>\n        <para>Managed code stripping level.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.StrippingLevel.Disabled\">\n      <summary>\n        <para>Managed code stripping is disabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.StrippingLevel.StripAssemblies\">\n      <summary>\n        <para>Unused parts of managed code are stripped away.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.StrippingLevel.StripByteCode\">\n      <summary>\n        <para>Managed method bodies are stripped away. AOT platforms only.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.StrippingLevel.UseMicroMSCorlib\">\n      <summary>\n        <para>Lightweight mscorlib version will be used at expense of limited compatibility.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.TakeInfo\">\n      <summary>\n        <para>A Takeinfo object contains all the information needed to describe a take.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TakeInfo.bakeStartTime\">\n      <summary>\n        <para>Start time in second.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TakeInfo.bakeStopTime\">\n      <summary>\n        <para>Stop time in second.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TakeInfo.defaultClipName\">\n      <summary>\n        <para>This is the default clip name for the clip generated for this take.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TakeInfo.name\">\n      <summary>\n        <para>Take name as define from imported file.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TakeInfo.sampleRate\">\n      <summary>\n        <para>Sample rate of the take.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TakeInfo.startTime\">\n      <summary>\n        <para>Start time in second.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TakeInfo.stopTime\">\n      <summary>\n        <para>Stop time in second.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.TextureImporter\">\n      <summary>\n        <para>Texture importer lets you modify Texture2D import settings from editor scripts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.allowAlphaSplitting\">\n      <summary>\n        <para>Allows alpha splitting on relevant platforms for this texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.alphaIsTransparency\">\n      <summary>\n        <para>If the provided alpha channel is transparency, enable this to prefilter the color to avoid filtering artifacts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.alphaSource\">\n      <summary>\n        <para>Select how the alpha of the imported texture is generated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.alphaTestReferenceValue\">\n      <summary>\n        <para>Returns or assigns the alpha test reference value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.androidETC2FallbackOverride\">\n      <summary>\n        <para>ETC2 texture decompression fallback override on Android devices that don't support ETC2.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.anisoLevel\">\n      <summary>\n        <para>Anisotropic filtering level of the texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.borderMipmap\">\n      <summary>\n        <para>Keep texture borders the same when generating mipmaps?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.compressionQuality\">\n      <summary>\n        <para>Quality of Texture Compression in the range [0..100].</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.convertToNormalmap\">\n      <summary>\n        <para>Convert heightmap to normal map?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.crunchedCompression\">\n      <summary>\n        <para>Use crunched compression when available.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.fadeout\">\n      <summary>\n        <para>Fade out mip levels to gray color?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.filterMode\">\n      <summary>\n        <para>Filtering mode of the texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.generateCubemap\">\n      <summary>\n        <para>Cubemap generation mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.generateMipsInLinearSpace\">\n      <summary>\n        <para>Should mip maps be generated with gamma correction?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.grayscaleToAlpha\">\n      <summary>\n        <para>Generate alpha channel from intensity?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.heightmapScale\">\n      <summary>\n        <para>Amount of bumpyness in the heightmap.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.isReadable\">\n      <summary>\n        <para>Set this to true if you want texture data to be readable from scripts. Set it to false to prevent scripts from reading texture data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.lightmap\">\n      <summary>\n        <para>Is this texture a lightmap?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.linearTexture\">\n      <summary>\n        <para>Is texture storing non-color data?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.maxTextureSize\">\n      <summary>\n        <para>Maximum texture size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.mipMapBias\">\n      <summary>\n        <para>Mip map bias of the texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.mipmapEnabled\">\n      <summary>\n        <para>Generate Mip Maps.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.mipmapFadeDistanceEnd\">\n      <summary>\n        <para>Mip level where texture is faded out completely.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.mipmapFadeDistanceStart\">\n      <summary>\n        <para>Mip level where texture begins to fade out.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.mipmapFilter\">\n      <summary>\n        <para>Mipmap filtering mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.mipMapsPreserveCoverage\">\n      <summary>\n        <para>Enables or disables coverage-preserving alpha MIP mapping.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.normalmap\">\n      <summary>\n        <para>Is this texture a normal map?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.normalmapFilter\">\n      <summary>\n        <para>Normal map filtering mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.npotScale\">\n      <summary>\n        <para>Scaling mode for non power of two textures.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.qualifiesForSpritePacking\">\n      <summary>\n        <para>Returns true if this TextureImporter is setup for Sprite packing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.spriteBorder\">\n      <summary>\n        <para>Border sizes of the generated sprites.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.spriteImportMode\">\n      <summary>\n        <para>Selects Single or Manual import mode for Sprite textures.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.spritePackingTag\">\n      <summary>\n        <para>Selects the Sprite packing tag.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.spritePivot\">\n      <summary>\n        <para>The point in the Sprite object's coordinate space where the graphic is located.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.spritePixelsPerUnit\">\n      <summary>\n        <para>The number of pixels in the sprite that correspond to one unit in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.spritePixelsToUnits\">\n      <summary>\n        <para>Scale factor for mapping pixels in the graphic to units in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.spritesheet\">\n      <summary>\n        <para>Array representing the sections of the atlas corresponding to individual sprite graphics.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.sRGBTexture\">\n      <summary>\n        <para>Is texture storing color data?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.streamingMipmaps\">\n      <summary>\n        <para>Enable mipmap streaming for this texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.streamingMipmapsPriority\">\n      <summary>\n        <para>Relative priority for this texture when reducing memory size in order to hit the memory budget.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.textureCompression\">\n      <summary>\n        <para>Compression of imported texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.textureFormat\">\n      <summary>\n        <para>Format of imported texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.textureShape\">\n      <summary>\n        <para>Shape of imported texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.textureType\">\n      <summary>\n        <para>Which type of texture are we dealing with here.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.wrapMode\">\n      <summary>\n        <para>Texture coordinate wrapping mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.wrapModeU\">\n      <summary>\n        <para>Texture U coordinate wrapping mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.wrapModeV\">\n      <summary>\n        <para>Texture V coordinate wrapping mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporter.wrapModeW\">\n      <summary>\n        <para>Texture W coordinate wrapping mode for Texture3D.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporter.ClearPlatformTextureSettings(System.String)\">\n      <summary>\n        <para>Clear specific target platform settings.</para>\n      </summary>\n      <param name=\"platform\">The platform whose settings are to be cleared (see below).</param>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporter.DoesSourceTextureHaveAlpha\">\n      <summary>\n        <para>Does textures source image have alpha channel.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporter.DoesSourceTextureHaveColor\">\n      <summary>\n        <para>Does textures source image have RGB channels.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporter.GetAllowsAlphaSplitting\">\n      <summary>\n        <para>Getter for the flag that allows Alpha splitting on the imported texture when needed (for example ETC1 compression for textures with transparency).</para>\n      </summary>\n      <returns>\n        <para>True if the importer allows alpha split on the imported texture, False otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporter.GetAutomaticFormat(System.String)\">\n      <summary>\n        <para>Returns the TextureImporterFormat that would be automatically chosen for this platform.</para>\n      </summary>\n      <param name=\"platform\"></param>\n      <returns>\n        <para>Format chosen by the system for the provided platform, TextureImporterFormat.Automatic if the platform does not exist.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporter.GetDefaultPlatformTextureSettings\">\n      <summary>\n        <para>Get the default platform specific texture settings.</para>\n      </summary>\n      <returns>\n        <para>A TextureImporterPlatformSettings structure containing the default platform parameters.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporter.GetPlatformTextureSettings(System.String,System.Int32&amp;,UnityEditor.TextureImporterFormat&amp;,System.Int32&amp;,System.Boolean&amp;)\">\n      <summary>\n        <para>Get platform specific texture settings.</para>\n      </summary>\n      <param name=\"platform\">The platform for which settings are required (see options below).</param>\n      <param name=\"maxTextureSize\">Maximum texture width/height in pixels.</param>\n      <param name=\"textureFormat\">Format of the texture for the given platform.</param>\n      <param name=\"compressionQuality\">Value from 0..100, equivalent to the standard JPEG quality setting.</param>\n      <param name=\"etc1AlphaSplitEnabled\">Status of the ETC1 and alpha split flag.</param>\n      <returns>\n        <para>True if the platform override was found, false if no override was found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporter.GetPlatformTextureSettings(System.String,System.Int32&amp;,UnityEditor.TextureImporterFormat&amp;,System.Int32&amp;)\">\n      <summary>\n        <para>Get platform specific texture settings.</para>\n      </summary>\n      <param name=\"platform\">The platform whose settings are required (see below).</param>\n      <param name=\"maxTextureSize\">Maximum texture width/height in pixels.</param>\n      <param name=\"textureFormat\">Format of the texture.</param>\n      <param name=\"compressionQuality\">Value from 0..100, equivalent to the standard JPEG quality setting.</param>\n      <returns>\n        <para>True if the platform override was found, false if no override was found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporter.GetPlatformTextureSettings(System.String,System.Int32&amp;,UnityEditor.TextureImporterFormat&amp;)\">\n      <summary>\n        <para>Get platform specific texture settings.</para>\n      </summary>\n      <param name=\"platform\">The platform whose settings are required (see below).</param>\n      <param name=\"maxTextureSize\">Maximum texture width/height in pixels.</param>\n      <param name=\"textureFormat\">Format of the texture.</param>\n      <returns>\n        <para>True if the platform override was found, false if no override was found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporter.GetPlatformTextureSettings(System.String)\">\n      <summary>\n        <para>Get platform specific texture settings.</para>\n      </summary>\n      <param name=\"platform\">The platform whose settings are required (see below).</param>\n      <returns>\n        <para>A TextureImporterPlatformSettings structure containing the platform parameters.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporter.ReadTextureImportInstructions\">\n      <summary>\n        <para>Reads the active texture output instructions of this TextureImporter.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporter.ReadTextureSettings(UnityEditor.TextureImporterSettings)\">\n      <summary>\n        <para>Read texture settings into TextureImporterSettings class.</para>\n      </summary>\n      <param name=\"dest\"></param>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporter.SetAllowsAlphaSplitting(System.Boolean)\">\n      <summary>\n        <para>Setter for the flag that allows Alpha splitting on the imported texture when needed (for example ETC1 compression for textures with transparency).</para>\n      </summary>\n      <param name=\"flag\"></param>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporter.SetPlatformTextureSettings(System.String,System.Int32,UnityEditor.TextureImporterFormat,System.Boolean)\">\n      <summary>\n        <para>Set specific target platform settings.</para>\n      </summary>\n      <param name=\"platform\">The platforms whose settings are to be changed (see below).</param>\n      <param name=\"maxTextureSize\">Maximum texture width/height in pixels.</param>\n      <param name=\"textureFormat\">Data format for the texture.</param>\n      <param name=\"compressionQuality\">Value from 0..100, with 0, 50 and 100 being respectively Fast, Normal, Best quality options in the texture importer UI. For Crunch texture formats, this roughly corresponds to JPEG quality levels.</param>\n      <param name=\"allowsAlphaSplit\">Allows splitting of imported texture into RGB+A so that ETC1 compression can be applied (Android only, and works only on textures that are a part of some atlas).</param>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporter.SetPlatformTextureSettings(System.String,System.Int32,UnityEditor.TextureImporterFormat,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Set specific target platform settings.</para>\n      </summary>\n      <param name=\"platform\">The platforms whose settings are to be changed (see below).</param>\n      <param name=\"maxTextureSize\">Maximum texture width/height in pixels.</param>\n      <param name=\"textureFormat\">Data format for the texture.</param>\n      <param name=\"compressionQuality\">Value from 0..100, with 0, 50 and 100 being respectively Fast, Normal, Best quality options in the texture importer UI. For Crunch texture formats, this roughly corresponds to JPEG quality levels.</param>\n      <param name=\"allowsAlphaSplit\">Allows splitting of imported texture into RGB+A so that ETC1 compression can be applied (Android only, and works only on textures that are a part of some atlas).</param>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporter.SetPlatformTextureSettings(UnityEditor.TextureImporterPlatformSettings)\">\n      <summary>\n        <para>Set specific target platform settings.</para>\n      </summary>\n      <param name=\"platformSettings\">Structure containing the platform settings.</param>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporter.SetTextureSettings(UnityEditor.TextureImporterSettings)\">\n      <summary>\n        <para>Set texture importers settings from TextureImporterSettings class.</para>\n      </summary>\n      <param name=\"src\"></param>\n    </member>\n    <member name=\"T:UnityEditor.TextureImporterAlphaSource\">\n      <summary>\n        <para>Select how the alpha of the imported texture is generated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterAlphaSource.FromGrayScale\">\n      <summary>\n        <para>Generate Alpha from image gray scale.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterAlphaSource.FromInput\">\n      <summary>\n        <para>Use Alpha from the input texture if one is provided.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterAlphaSource.None\">\n      <summary>\n        <para>No Alpha will be used.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.TextureImporterCompression\">\n      <summary>\n        <para>Select the kind of compression you want for your texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterCompression.Compressed\">\n      <summary>\n        <para>Texture will be compressed using a standard format depending on the platform (DXT, ASTC, ...).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterCompression.CompressedHQ\">\n      <summary>\n        <para>Texture will be compressed using a high quality format depending on the platform and availability (BC7, ASTC4x4, ...).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterCompression.CompressedLQ\">\n      <summary>\n        <para>Texture will be compressed using a low quality but high performance, high compression format depending on the platform and availability (2bpp PVRTC, ASTC8x8, ...).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterCompression.Uncompressed\">\n      <summary>\n        <para>Texture will not be compressed.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.TextureImporterCubemapConvolution\">\n      <summary>\n        <para>Defines Cubemap convolution mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterCubemapConvolution.Diffuse\">\n      <summary>\n        <para>Diffuse convolution (aka irradiance Cubemap).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterCubemapConvolution.None\">\n      <summary>\n        <para>No convolution needed. This Cubemap texture represents mirror reflection or Skybox.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterCubemapConvolution.Specular\">\n      <summary>\n        <para>Specular convolution (aka Prefiltered Environment Map).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.TextureImporterFormat\">\n      <summary>\n        <para>Imported texture format for TextureImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.Alpha8\">\n      <summary>\n        <para>TextureFormat.Alpha8 texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ARGB16\">\n      <summary>\n        <para>TextureFormat.ARGB4444 texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ARGB32\">\n      <summary>\n        <para>TextureFormat.ARGB32 texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ASTC_RGB_10x10\">\n      <summary>\n        <para>ASTC compressed RGB texture format, 10x10 block size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ASTC_RGB_12x12\">\n      <summary>\n        <para>ASTC compressed RGB texture format, 12x12 block size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ASTC_RGB_4x4\">\n      <summary>\n        <para>ASTC compressed RGB texture format, 4x4 block size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ASTC_RGB_5x5\">\n      <summary>\n        <para>ASTC compressed RGB texture format, 5x5 block size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ASTC_RGB_6x6\">\n      <summary>\n        <para>ASTC compressed RGB texture format, 6x6 block size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ASTC_RGB_8x8\">\n      <summary>\n        <para>ASTC compressed RGB texture format, 8x8 block size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ASTC_RGBA_10x10\">\n      <summary>\n        <para>ASTC compressed RGBA texture format, 10x10 block size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ASTC_RGBA_12x12\">\n      <summary>\n        <para>ASTC compressed RGBA texture format, 12x12 block size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ASTC_RGBA_4x4\">\n      <summary>\n        <para>ASTC compressed RGBA texture format, 4x4 block size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ASTC_RGBA_5x5\">\n      <summary>\n        <para>ASTC compressed RGBA texture format, 5x5 block size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ASTC_RGBA_6x6\">\n      <summary>\n        <para>ASTC compressed RGBA texture format, 6x6 block size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ASTC_RGBA_8x8\">\n      <summary>\n        <para>ASTC compressed RGBA texture format, 8x8 block size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.Automatic\">\n      <summary>\n        <para>Choose texture format automatically based on the texture parameters.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.Automatic16bit\">\n      <summary>\n        <para>Choose a 16 bit format automatically.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.AutomaticCompressed\">\n      <summary>\n        <para>Choose a compressed format automatically.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.AutomaticCompressedHDR\">\n      <summary>\n        <para>Choose a compressed HDR format automatically.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.AutomaticCrunched\">\n      <summary>\n        <para>Choose a crunched format automatically.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.AutomaticHDR\">\n      <summary>\n        <para>Choose an HDR format automatically.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.AutomaticTruecolor\">\n      <summary>\n        <para>Choose a Truecolor format automatically.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.BC4\">\n      <summary>\n        <para>TextureFormat.BC4 compressed texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.BC5\">\n      <summary>\n        <para>TextureFormat.BC5 compressed texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.BC6H\">\n      <summary>\n        <para>TextureFormat.BC6H compressed HDR texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.BC7\">\n      <summary>\n        <para>TextureFormat.BC7 compressed texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.DXT1\">\n      <summary>\n        <para>TextureFormat.DXT1 compressed texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.DXT1Crunched\">\n      <summary>\n        <para>DXT1 compressed texture format using Crunch compression for smaller storage sizes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.DXT5\">\n      <summary>\n        <para>TextureFormat.DXT5 compressed texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.DXT5Crunched\">\n      <summary>\n        <para>DXT5 compressed texture format using Crunch compression for smaller storage sizes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.EAC_R\">\n      <summary>\n        <para>ETC2EAC compressed 4 bits  pixel unsigned R texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.EAC_R_SIGNED\">\n      <summary>\n        <para>ETC2EAC compressed 4 bits  pixel signed R texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.EAC_RG\">\n      <summary>\n        <para>ETC2EAC compressed 8 bits  pixel unsigned RG texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.EAC_RG_SIGNED\">\n      <summary>\n        <para>ETC2EAC compressed 4 bits  pixel signed RG texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ETC_RGB4\">\n      <summary>\n        <para>ETC (GLES2.0) 4 bits/pixel compressed RGB texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ETC_RGB4Crunched\">\n      <summary>\n        <para>ETC_RGB4 compressed texture format using Crunch compression for smaller storage sizes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ETC2_RGB4\">\n      <summary>\n        <para>ETC2 compressed 4 bits / pixel RGB texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ETC2_RGB4_PUNCHTHROUGH_ALPHA\">\n      <summary>\n        <para>ETC2 compressed 4 bits / pixel RGB + 1-bit alpha texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ETC2_RGBA8\">\n      <summary>\n        <para>ETC2 compressed 8 bits / pixel RGBA texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.ETC2_RGBA8Crunched\">\n      <summary>\n        <para>ETC2_RGBA8 compressed color with alpha channel texture format using Crunch compression for smaller storage sizes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.PVRTC_RGB2\">\n      <summary>\n        <para>PowerVR/iOS TextureFormat.PVRTC_RGB2 compressed texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.PVRTC_RGB4\">\n      <summary>\n        <para>PowerVR/iOS TextureFormat.PVRTC_RGB4 compressed texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.PVRTC_RGBA2\">\n      <summary>\n        <para>PowerVR/iOS TextureFormat.PVRTC_RGBA2 compressed texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.PVRTC_RGBA4\">\n      <summary>\n        <para>PowerVR/iOS TextureFormat.PVRTC_RGBA4 compressed texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.R8\">\n      <summary>\n        <para>TextureFormat.R8 texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.RGB16\">\n      <summary>\n        <para>TextureFormat.RGB565 texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.RGB24\">\n      <summary>\n        <para>TextureFormat.RGB24 texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.RGBA16\">\n      <summary>\n        <para>TextureFormat.RGBA4444 texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.RGBA32\">\n      <summary>\n        <para>TextureFormat.RGBA32 texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterFormat.RGBAHalf\">\n      <summary>\n        <para>TextureFormat.RGBAHalf floating point texture format.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.TextureImporterGenerateCubemap\">\n      <summary>\n        <para>Cubemap generation mode for TextureImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterGenerateCubemap.AutoCubemap\">\n      <summary>\n        <para>Automatically determine type of cubemap generation from the source image.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterGenerateCubemap.Cylindrical\">\n      <summary>\n        <para>Generate cubemap from cylindrical texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterGenerateCubemap.FullCubemap\">\n      <summary>\n        <para>Generate cubemap from vertical or horizontal cross texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterGenerateCubemap.None\">\n      <summary>\n        <para>Do not generate cubemap (default).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterGenerateCubemap.Spheremap\">\n      <summary>\n        <para>Generate cubemap from spheremap texture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.TextureImporterMipFilter\">\n      <summary>\n        <para>Mip map filter for TextureImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterMipFilter.BoxFilter\">\n      <summary>\n        <para>Box mipmap filter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterMipFilter.KaiserFilter\">\n      <summary>\n        <para>Kaiser mipmap filter.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.TextureImporterNormalFilter\">\n      <summary>\n        <para>Normal map filtering mode for TextureImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterNormalFilter.Sobel\">\n      <summary>\n        <para>Sobel normal map filter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterNormalFilter.Standard\">\n      <summary>\n        <para>Standard normal map filter.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.TextureImporterNPOTScale\">\n      <summary>\n        <para>Scaling mode for non power of two textures in TextureImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterNPOTScale.None\">\n      <summary>\n        <para>Keep non power of two textures as is.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterNPOTScale.ToLarger\">\n      <summary>\n        <para>Scale to larger power of two.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterNPOTScale.ToNearest\">\n      <summary>\n        <para>Scale to nearest power of two.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterNPOTScale.ToSmaller\">\n      <summary>\n        <para>Scale to smaller power of two.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.TextureImporterPlatformSettings\">\n      <summary>\n        <para>Stores platform specifics settings of a TextureImporter.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterPlatformSettings.allowsAlphaSplitting\">\n      <summary>\n        <para>Allows Alpha splitting on the imported texture when needed (for example ETC1 compression for textures with transparency).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterPlatformSettings.androidETC2FallbackOverride\">\n      <summary>\n        <para>Override for ETC2 decompression fallback on Android devices that don't support ETC2.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterPlatformSettings.compressionQuality\">\n      <summary>\n        <para>Quality of texture compression in the range [0..100].</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterPlatformSettings.crunchedCompression\">\n      <summary>\n        <para>Use crunch compression when available.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterPlatformSettings.format\">\n      <summary>\n        <para>Format of imported texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterPlatformSettings.maxTextureSize\">\n      <summary>\n        <para>Maximum texture size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterPlatformSettings.name\">\n      <summary>\n        <para>Name of the build target.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterPlatformSettings.overridden\">\n      <summary>\n        <para>Set to true in order to override the Default platform parameters by those provided in the TextureImporterPlatformSettings structure.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterPlatformSettings.resizeAlgorithm\">\n      <summary>\n        <para>For Texture to be scaled down choose resize algorithm. ( Applyed only when Texture dimension is bigger than Max Size ).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterPlatformSettings.textureCompression\">\n      <summary>\n        <para>Compression of imported texture.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporterPlatformSettings.CopyTo(UnityEditor.TextureImporterPlatformSettings)\">\n      <summary>\n        <para>Copy parameters into another TextureImporterPlatformSettings object.</para>\n      </summary>\n      <param name=\"target\">TextureImporterPlatformSettings object to copy settings to.</param>\n    </member>\n    <member name=\"T:UnityEditor.TextureImporterRGBMMode\">\n      <summary>\n        <para>RGBM encoding mode for HDR textures in TextureImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterRGBMMode.Auto\">\n      <summary>\n        <para>Do RGBM encoding when source data is HDR in TextureImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterRGBMMode.Encoded\">\n      <summary>\n        <para>Source texture is already RGBM encoded in TextureImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterRGBMMode.Off\">\n      <summary>\n        <para>Do not perform RGBM encoding in TextureImporter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterRGBMMode.On\">\n      <summary>\n        <para>Do RGBM encoding in TextureImporter.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.TextureImporterSettings\">\n      <summary>\n        <para>Stores settings of a TextureImporter.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.alphaIsTransparency\">\n      <summary>\n        <para>If the provided alpha channel is transparency, enable this to dilate the color to avoid filtering artifacts on the edges.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.alphaSource\">\n      <summary>\n        <para>Select how the alpha of the imported texture is generated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.alphaTestReferenceValue\">\n      <summary>\n        <para>Returns or assigns the alpha test reference value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.aniso\">\n      <summary>\n        <para>Anisotropic filtering level of the texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.borderMipmap\">\n      <summary>\n        <para>Enable this to avoid colors seeping out to the edge of the lower Mip levels. Used for light cookies.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.convertToNormalMap\">\n      <summary>\n        <para>Convert heightmap to normal map?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.cubemapConvolution\">\n      <summary>\n        <para>Convolution mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.cubemapConvolutionExponent\">\n      <summary>\n        <para>Defines how fast Phong exponent wears off in mip maps. Higher value will apply less blur to high resolution mip maps.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.cubemapConvolutionSteps\">\n      <summary>\n        <para>Defines how many different Phong exponents to store in mip maps. Higher value will give better transition between glossy and rough reflections, but will need higher texture resolution.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.fadeOut\">\n      <summary>\n        <para>Fade out mip levels to gray color?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.filterMode\">\n      <summary>\n        <para>Filtering mode of the texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.generateCubemap\">\n      <summary>\n        <para>Cubemap generation mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.grayscaleToAlpha\">\n      <summary>\n        <para>Generate alpha channel from intensity?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.heightmapScale\">\n      <summary>\n        <para>Amount of bumpyness in the heightmap.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.mipmapBias\">\n      <summary>\n        <para>Mip map bias of the texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.mipmapEnabled\">\n      <summary>\n        <para>Generate mip maps for the texture?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.mipmapFadeDistanceEnd\">\n      <summary>\n        <para>Mip level where texture is faded out to gray completely.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.mipmapFadeDistanceStart\">\n      <summary>\n        <para>Mip level where texture begins to fade out to gray.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.mipmapFilter\">\n      <summary>\n        <para>Mipmap filtering mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.mipMapsPreserveCoverage\">\n      <summary>\n        <para>Enables or disables coverage-preserving alpha MIP mapping.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.normalMapFilter\">\n      <summary>\n        <para>Normal map filtering mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.npotScale\">\n      <summary>\n        <para>Scaling mode for non power of two textures.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.readable\">\n      <summary>\n        <para>Is texture data readable from scripts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.rgbm\">\n      <summary>\n        <para>RGBM encoding mode for HDR textures in TextureImporter.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.singleChannelComponent\">\n      <summary>\n        <para>Color or Alpha component TextureImporterType|Single Channel Textures uses.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.spriteAlignment\">\n      <summary>\n        <para>Edge-relative alignment of the sprite graphic.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.spriteBorder\">\n      <summary>\n        <para>Border sizes of the generated sprites.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.spriteExtrude\">\n      <summary>\n        <para>The number of blank pixels to leave between the edge of the graphic and the mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.spriteGenerateFallbackPhysicsShape\">\n      <summary>\n        <para>Generates a default physics shape for a Sprite if a physics shape has not been set by the user.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.spriteMode\">\n      <summary>\n        <para>Sprite texture import mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.spritePivot\">\n      <summary>\n        <para>Pivot point of the Sprite relative to its graphic's rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.spritePixelsPerUnit\">\n      <summary>\n        <para>The number of pixels in the sprite that correspond to one unit in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.spritePixelsToUnits\">\n      <summary>\n        <para>Scale factor between pixels in the sprite graphic and world space units.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.spriteTessellationDetail\">\n      <summary>\n        <para>The tessellation detail to be used for generating the mesh for the associated sprite if the SpriteMode is set to Single. For Multiple sprites, use the SpriteEditor to specify the value per sprite.\nValid values are in the range [0-1], with higher values generating a tighter mesh. A default of -1 will allow Unity to determine the value automatically.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.sRGBTexture\">\n      <summary>\n        <para>Is texture storing color data?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.streamingMipmaps\">\n      <summary>\n        <para>Enable mipmap streaming for this texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.streamingMipmapsPriority\">\n      <summary>\n        <para>Relative priority for this texture when reducing memory size in order to hit the memory budget.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.textureShape\">\n      <summary>\n        <para>Shape of imported texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.textureType\">\n      <summary>\n        <para>Which type of texture are we dealing with here.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.wrapMode\">\n      <summary>\n        <para>Texture coordinate wrapping mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.wrapModeU\">\n      <summary>\n        <para>Texture U coordinate wrapping mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.wrapModeV\">\n      <summary>\n        <para>Texture V coordinate wrapping mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TextureImporterSettings.wrapModeW\">\n      <summary>\n        <para>Texture W coordinate wrapping mode for Texture3D.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporterSettings.ApplyTextureType(UnityEditor.TextureImporterType,System.Boolean)\">\n      <summary>\n        <para>Configure parameters to import a texture for a purpose of type, as described TextureImporterType|here.</para>\n      </summary>\n      <param name=\"type\">Texture type. See TextureImporterType.</param>\n      <param name=\"applyAll\">If false, change only specific properties. Exactly which, depends on type.</param>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporterSettings.CopyTo(UnityEditor.TextureImporterSettings)\">\n      <summary>\n        <para>Copy parameters into another TextureImporterSettings object.</para>\n      </summary>\n      <param name=\"target\">TextureImporterSettings object to copy settings to.</param>\n    </member>\n    <member name=\"M:UnityEditor.TextureImporterSettings.Equal(UnityEditor.TextureImporterSettings,UnityEditor.TextureImporterSettings)\">\n      <summary>\n        <para>Test texture importer settings for equality.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"T:UnityEditor.TextureImporterShape\">\n      <summary>\n        <para>Select the kind of shape of your texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterShape.Texture2D\">\n      <summary>\n        <para>Texture is 2D.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterShape.TextureCube\">\n      <summary>\n        <para>Texture is a Cubemap.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.TextureImporterSingleChannelComponent\">\n      <summary>\n        <para>Selects which Color/Alpha channel TextureImporterType|Single Channel Textures uses.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterSingleChannelComponent.Alpha\">\n      <summary>\n        <para>Use the Alpha channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterSingleChannelComponent.Red\">\n      <summary>\n        <para>Use the red Color channel.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.TextureImporterType\">\n      <summary>\n        <para>Select this to set basic parameters depending on the purpose of your texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterType.Cookie\">\n      <summary>\n        <para>This sets up your texture with the basic parameters used for the Cookies of your lights.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterType.Cursor\">\n      <summary>\n        <para>Use this if your texture is going to be used as a cursor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterType.Default\">\n      <summary>\n        <para>This is the most common setting used for all the textures in general.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterType.GUI\">\n      <summary>\n        <para>Use this if your texture is going to be used on any HUD/GUI Controls.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterType.Image\">\n      <summary>\n        <para>This is the most common setting used for all the textures in general.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterType.Lightmap\">\n      <summary>\n        <para>This sets up your texture with the parameters used by the lightmap.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterType.NormalMap\">\n      <summary>\n        <para>Select this to turn the color channels into a format suitable for real-time normal mapping.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterType.SingleChannel\">\n      <summary>\n        <para>Use this for texture containing a single channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureImporterType.Sprite\">\n      <summary>\n        <para>Select this if you will be using your texture for Sprite graphics.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.TextureResizeAlgorithm\">\n      <summary>\n        <para>For Texture to be scaled down choose resize algorithm. ( Applyed only when Texture dimension is bigger than Max Size ).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureResizeAlgorithm.Bilinear\">\n      <summary>\n        <para>Might provide better result than Mitchell for some noise textures preserving more sharp details.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.TextureResizeAlgorithm.Mitchell\">\n      <summary>\n        <para>Default high quality resize algorithm.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Tool\">\n      <summary>\n        <para>Which tool is active in the editor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Tool.Move\">\n      <summary>\n        <para>The move tool is active.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Tool.None\">\n      <summary>\n        <para>No tool is active. Set this to implement your own in-inspector toolbar (like the terrain editor does).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Tool.Rect\">\n      <summary>\n        <para>The rect tool is active.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Tool.Rotate\">\n      <summary>\n        <para>The rotate tool is active.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Tool.Scale\">\n      <summary>\n        <para>The scale tool is active.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Tool.Transform\">\n      <summary>\n        <para>The transform tool is active.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Tool.View\">\n      <summary>\n        <para>The view tool is active - Use Tools.viewTool to find out which view tool we're talking about.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Tools\">\n      <summary>\n        <para>Class used to manipulate the tools used in Unity's Scene View.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Tools.current\">\n      <summary>\n        <para>The tool that is currently selected for the Scene View.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Tools.handlePosition\">\n      <summary>\n        <para>The position of the tool handle in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Tools.handleRect\">\n      <summary>\n        <para>The rectangle used for the rect tool.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Tools.handleRectRotation\">\n      <summary>\n        <para>The rotation of the rect tool handle in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Tools.handleRotation\">\n      <summary>\n        <para>The rotation of the tool handle in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Tools.hidden\">\n      <summary>\n        <para>Hides the Tools(Move, Rotate, Resize) on the Scene view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Tools.pivotMode\">\n      <summary>\n        <para>Are we in Center or Pivot mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Tools.pivotRotation\">\n      <summary>\n        <para>What's the rotation of the tool handle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Tools.rectBlueprintMode\">\n      <summary>\n        <para>Is the rect handle in blueprint mode?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Tools.viewTool\">\n      <summary>\n        <para>The option that is currently active for the View tool in the Scene view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Tools.visibleLayers\">\n      <summary>\n        <para>Which layers are visible in the scene view.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.TransformSort\">\n      <summary>\n        <para>Is the default sorting method used by the hierarchy.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TransformSort.content\">\n      <summary>\n        <para>Content to visualize the transform sorting method.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.TransformUtils\">\n      <summary>\n        <para>Editor Transform Utility Class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.TransformUtils.GetInspectorRotation(UnityEngine.Transform)\">\n      <summary>\n        <para>Returns the rotation of a transform as it is shown in the Transform Inspector window.</para>\n      </summary>\n      <param name=\"t\">Transform to get the rotation from.</param>\n      <returns>\n        <para>Rotation as it is shown in the Transform Inspector window.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.TransformUtils.SetInspectorRotation(UnityEngine.Transform,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the rotation of a transform as it would be set by the Transform Inspector window.</para>\n      </summary>\n      <param name=\"t\">Transform to set the rotation on.</param>\n      <param name=\"r\">Rotation as it would be set by the Transform Inspector window.</param>\n    </member>\n    <member name=\"T:UnityEditor.TrueTypeFontImporter\">\n      <summary>\n        <para>AssetImporter for importing Fonts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TrueTypeFontImporter.ascentCalculationMode\">\n      <summary>\n        <para>Calculation mode for determining font's ascent.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TrueTypeFontImporter.characterPadding\">\n      <summary>\n        <para>Border pixels added to character images for padding. This is useful if you want to render text using a shader which needs to render outside of the character area (like an outline shader).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TrueTypeFontImporter.characterSpacing\">\n      <summary>\n        <para>Spacing between character images in the generated texture in pixels. This is useful if you want to render text using a shader which samples pixels outside of the character area (like an outline shader).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TrueTypeFontImporter.customCharacters\">\n      <summary>\n        <para>A custom set of characters to be included in the Font Texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TrueTypeFontImporter.fontNames\">\n      <summary>\n        <para>An array of font names, to be used when includeFontData is set to false.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TrueTypeFontImporter.fontReferences\">\n      <summary>\n        <para>References to other fonts to be used looking for fallbacks.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TrueTypeFontImporter.fontRenderingMode\">\n      <summary>\n        <para>Font rendering mode to use for this font.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TrueTypeFontImporter.fontSize\">\n      <summary>\n        <para>Font size to use for importing the characters.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TrueTypeFontImporter.fontTextureCase\">\n      <summary>\n        <para>Use this to adjust which characters should be imported.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TrueTypeFontImporter.fontTTFName\">\n      <summary>\n        <para>The internal font name of the TTF file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TrueTypeFontImporter.includeFontData\">\n      <summary>\n        <para>If this is enabled, the actual font will be embedded into the asset for Dynamic fonts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.TrueTypeFontImporter.shouldRoundAdvanceValue\">\n      <summary>\n        <para>Set this property to true if you want to round the internal advance width of the font to the nearest integer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.TrueTypeFontImporter.GenerateEditableFont(System.String)\">\n      <summary>\n        <para>Create an editable copy of the font asset at path.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"T:UnityEditor.tvOSSdkVersion\">\n      <summary>\n        <para>Supported tvOS SDK versions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.tvOSSdkVersion.Device\">\n      <summary>\n        <para>Device SDK.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.tvOSSdkVersion.Simulator\">\n      <summary>\n        <para>Simulator SDK.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.tvOSTargetOSVersion\">\n      <summary>\n        <para>Supported tvOS deployment versions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.tvOSTargetOSVersion.tvOS_9_0\">\n      <summary>\n        <para>Target tvOS 9.0.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.tvOSTargetOSVersion.tvOS_9_1\">\n      <summary>\n        <para>Target tvOS 9.1.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.tvOSTargetOSVersion.Unknown\">\n      <summary>\n        <para>Unknown tvOS version, managed by user.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.U2D.SpriteAtlasExtensions\">\n      <summary>\n        <para>Method extensions for SpriteAtlas in Editor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.U2D.SpriteAtlasExtensions.Add(UnityEngine.U2D.SpriteAtlas,UnityEngine.Object[])\">\n      <summary>\n        <para>Add an array of Assets to the packable objects list.</para>\n      </summary>\n      <param name=\"objects\">Array of Object to be packed into the atlas.</param>\n      <param name=\"spriteAtlas\"></param>\n    </member>\n    <member name=\"M:UnityEditor.U2D.SpriteAtlasExtensions.GetPackables(UnityEngine.U2D.SpriteAtlas)\">\n      <summary>\n        <para>Return all the current packed packables in the atlas.</para>\n      </summary>\n      <param name=\"spriteAtlas\"></param>\n    </member>\n    <member name=\"M:UnityEditor.U2D.SpriteAtlasExtensions.GetPackingSettings(UnityEngine.U2D.SpriteAtlas)\">\n      <summary>\n        <para>Current SpriteAtlasPackingSettings to use when packing this SpriteAtlas.</para>\n      </summary>\n      <param name=\"spriteAtlas\"></param>\n    </member>\n    <member name=\"M:UnityEditor.U2D.SpriteAtlasExtensions.GetPlatformSettings(UnityEngine.U2D.SpriteAtlas,System.String)\">\n      <summary>\n        <para>Returns the platform settings of the build target you specify.</para>\n      </summary>\n      <param name=\"buildTarget\">The name of the build target.</param>\n      <param name=\"spriteAtlas\"></param>\n    </member>\n    <member name=\"M:UnityEditor.U2D.SpriteAtlasExtensions.GetTextureSettings(UnityEngine.U2D.SpriteAtlas)\">\n      <summary>\n        <para>Current SpriteAtlasTextureSettings of the packed texture generated by this SpriteAtlas.</para>\n      </summary>\n      <param name=\"spriteAtlas\"></param>\n    </member>\n    <member name=\"M:UnityEditor.U2D.SpriteAtlasExtensions.Remove(UnityEngine.U2D.SpriteAtlas,UnityEngine.Object[])\">\n      <summary>\n        <para>Remove objects from the atlas's packable objects list.</para>\n      </summary>\n      <param name=\"objects\">Object in the array you wish to remove.</param>\n      <param name=\"spriteAtlas\"></param>\n    </member>\n    <member name=\"M:UnityEditor.U2D.SpriteAtlasExtensions.SetIncludeInBuild(UnityEngine.U2D.SpriteAtlas,System.Boolean)\">\n      <summary>\n        <para>Define if this sprite atlas's packed texture is included in the build with the Sprite after packing is done.</para>\n      </summary>\n      <param name=\"spriteAtlas\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEditor.U2D.SpriteAtlasExtensions.SetIsVariant(UnityEngine.U2D.SpriteAtlas,System.Boolean)\">\n      <summary>\n        <para>Sets whether this Sprite Atlas is a variant or not.</para>\n      </summary>\n      <param name=\"spriteAtlas\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEditor.U2D.SpriteAtlasExtensions.SetMasterAtlas(UnityEngine.U2D.SpriteAtlas,UnityEngine.U2D.SpriteAtlas)\">\n      <summary>\n        <para>Set an atlas to be the master atlas.</para>\n      </summary>\n      <param name=\"spriteAtlas\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEditor.U2D.SpriteAtlasExtensions.SetPackingSettings(UnityEngine.U2D.SpriteAtlas,UnityEditor.U2D.SpriteAtlasPackingSettings)\">\n      <summary>\n        <para>Set the SpriteAtlasPackingSettings to use when packing this SpriteAtlas</para>\n      </summary>\n      <param name=\"spriteAtlas\"></param>\n      <param name=\"src\"></param>\n    </member>\n    <member name=\"M:UnityEditor.U2D.SpriteAtlasExtensions.SetPlatformSettings(UnityEngine.U2D.SpriteAtlas,UnityEditor.TextureImporterPlatformSettings)\">\n      <summary>\n        <para>Set the platform specific settings.</para>\n      </summary>\n      <param name=\"spriteAtlas\"></param>\n      <param name=\"src\"></param>\n    </member>\n    <member name=\"M:UnityEditor.U2D.SpriteAtlasExtensions.SetTextureSettings(UnityEngine.U2D.SpriteAtlas,UnityEditor.U2D.SpriteAtlasTextureSettings)\">\n      <summary>\n        <para>Set the SpriteAtlasTextureSettings for the packed texture generated by this SpriteAtlas.</para>\n      </summary>\n      <param name=\"spriteAtlas\"></param>\n      <param name=\"src\"></param>\n    </member>\n    <member name=\"M:UnityEditor.U2D.SpriteAtlasExtensions.SetVariantScale(UnityEngine.U2D.SpriteAtlas,System.Single)\">\n      <summary>\n        <para>Set the value used to downscale the master's texture.</para>\n      </summary>\n      <param name=\"value\">Recommended value is [0.1 ~ 0.99].</param>\n      <param name=\"spriteAtlas\"></param>\n    </member>\n    <member name=\"T:UnityEditor.U2D.SpriteAtlasPackingSettings\">\n      <summary>\n        <para>Settings to use during the packing process for this SpriteAtlas.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.U2D.SpriteAtlasPackingSettings.blockOffset\">\n      <summary>\n        <para>Block offset to use while packing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.U2D.SpriteAtlasPackingSettings.enableRotation\">\n      <summary>\n        <para>Determines if rotating a sprite is possible during packing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.U2D.SpriteAtlasPackingSettings.enableTightPacking\">\n      <summary>\n        <para>Determines if sprites should be packed tightly during packing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.U2D.SpriteAtlasPackingSettings.padding\">\n      <summary>\n        <para>Value to add boundary (padding) to sprites when packing into the atlas.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.U2D.SpriteAtlasTextureSettings\">\n      <summary>\n        <para>Texture settings for the packed texture generated by SpriteAtlas.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.U2D.SpriteAtlasTextureSettings.anisoLevel\">\n      <summary>\n        <para>Packed texture's Anisotropic filtering level.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.U2D.SpriteAtlasTextureSettings.filterMode\">\n      <summary>\n        <para>Filter mode of the packed texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.U2D.SpriteAtlasTextureSettings.generateMipMaps\">\n      <summary>\n        <para>Set whether mipmaps should be generated for the packed texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.U2D.SpriteAtlasTextureSettings.readable\">\n      <summary>\n        <para>Readable state of the packed texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.U2D.SpriteAtlasTextureSettings.sRGB\">\n      <summary>\n        <para>Checks if the packed texture uses sRGB read/write conversions (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.U2D.SpriteAtlasUtility\">\n      <summary>\n        <para>Utility methods to pack atlases in the Project.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.U2D.SpriteAtlasUtility.PackAllAtlases(UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Pack all the SpriteAtlas Assets in the Project for the particular BuildTarget.</para>\n      </summary>\n      <param name=\"target\"></param>\n    </member>\n    <member name=\"M:UnityEditor.U2D.SpriteAtlasUtility.PackAtlases(UnityEngine.U2D.SpriteAtlas[],UnityEditor.BuildTarget)\">\n      <summary>\n        <para>Pack all the provided SpriteAtlas for the particular BuildTarget.</para>\n      </summary>\n      <param name=\"atlases\"></param>\n      <param name=\"target\"></param>\n    </member>\n    <member name=\"T:UnityEditor.UIOrientation\">\n      <summary>\n        <para>Default mobile device orientation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.UIOrientation.AutoRotation\">\n      <summary>\n        <para>Auto Rotation Enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.UIOrientation.LandscapeLeft\">\n      <summary>\n        <para>Landscape : counter-clockwise from Portrait.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.UIOrientation.LandscapeRight\">\n      <summary>\n        <para>Landscape: clockwise from Portrait.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.UIOrientation.Portrait\">\n      <summary>\n        <para>Portrait.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.UIOrientation.PortraitUpsideDown\">\n      <summary>\n        <para>Portrait upside down.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Undo\">\n      <summary>\n        <para>Lets you register undo operations on specific objects you are about to perform changes on.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Undo.undoRedoPerformed\">\n      <summary>\n        <para>Callback that is triggered after an undo or redo was executed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.Undo.willFlushUndoRecord\">\n      <summary>\n        <para>Invoked before the Undo system performs a flush.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Undo.AddComponent(UnityEngine.GameObject,System.Type)\">\n      <summary>\n        <para>Adds a component to the game object and registers an undo operation for this action.</para>\n      </summary>\n      <param name=\"gameObject\">The game object you want to add the component to.</param>\n      <param name=\"type\">The type of component you want to add.</param>\n      <returns>\n        <para>The newly added component.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Undo.AddComponent(UnityEngine.GameObject)\">\n      <summary>\n        <para>Generic version.</para>\n      </summary>\n      <param name=\"gameObject\">The game object you want to add the component to.</param>\n      <returns>\n        <para>The newly added component.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Undo.ClearAll\">\n      <summary>\n        <para>Removes all undo and redo operations from  respectively the undo and redo stacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Undo.ClearUndo(UnityEngine.Object)\">\n      <summary>\n        <para>Removes all Undo operation for the identifier object registered using Undo.RegisterCompleteObjectUndo from the undo stack.</para>\n      </summary>\n      <param name=\"identifier\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Undo.CollapseUndoOperations(System.Int32)\">\n      <summary>\n        <para>Collapses all undo operation up to group index together into one step.</para>\n      </summary>\n      <param name=\"groupIndex\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Undo.DestroyObjectImmediate(UnityEngine.Object)\">\n      <summary>\n        <para>Destroys the object and records an undo operation so that it can be recreated.</para>\n      </summary>\n      <param name=\"objectToUndo\">The object that will be destroyed.</param>\n    </member>\n    <member name=\"M:UnityEditor.Undo.FlushUndoRecordObjects\">\n      <summary>\n        <para>Ensure objects recorded using RecordObject or ::ref:RecordObjects are registered as an undoable action. In most cases there is no reason to invoke FlushUndoRecordObjects since it's automatically done right after mouse-up and certain other events that conventionally marks the end of an action.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Undo.GetCurrentGroup\">\n      <summary>\n        <para>Unity automatically groups undo operations by the current group index.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Undo.GetCurrentGroupName\">\n      <summary>\n        <para>Get the name that will be shown in the UI for the current undo group.</para>\n      </summary>\n      <returns>\n        <para>Name of the current group or an empty string if the current group is empty.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Undo.IncrementCurrentGroup\">\n      <summary>\n        <para>Unity automatically groups undo operations by the current group index.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Undo.MoveGameObjectToScene(UnityEngine.GameObject,UnityEngine.SceneManagement.Scene,System.String)\">\n      <summary>\n        <para>Move a GameObject from its current scene to a new scene.\nIt is required that the GameObject is at the root of its current scene.</para>\n      </summary>\n      <param name=\"go\">GameObject to move.</param>\n      <param name=\"scene\">Scene to move the GameObject into.</param>\n      <param name=\"name\">Name of the undo action.</param>\n    </member>\n    <member name=\"M:UnityEditor.Undo.PerformRedo\">\n      <summary>\n        <para>Perform an Redo operation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Undo.PerformUndo\">\n      <summary>\n        <para>Perform an Undo operation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Undo.RecordObject(UnityEngine.Object,System.String)\">\n      <summary>\n        <para>Records any changes done on the object after the RecordObject function.</para>\n      </summary>\n      <param name=\"objectToUndo\">The reference to the object that you will be modifying.</param>\n      <param name=\"name\">The title of the action to appear in the undo history (i.e. visible in the undo menu).</param>\n    </member>\n    <member name=\"M:UnityEditor.Undo.RecordObjects(UnityEngine.Object[],System.String)\">\n      <summary>\n        <para>Records multiple undoable objects in a single call. This is the same as calling Undo.RecordObject multiple times.</para>\n      </summary>\n      <param name=\"objectsToUndo\"></param>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Undo.RegisterCompleteObjectUndo(UnityEngine.Object,System.String)\">\n      <summary>\n        <para>Stores a copy of the object states on the undo stack.</para>\n      </summary>\n      <param name=\"objectToUndo\">The object whose state changes need to be undone.</param>\n      <param name=\"name\">The name of the undo operation.</param>\n    </member>\n    <member name=\"M:UnityEditor.Undo.RegisterCompleteObjectUndo(UnityEngine.Object[],System.String)\">\n      <summary>\n        <para>This is equivalent to calling the first overload mutiple times, save for the fact that only one undo operation will be generated for this one.</para>\n      </summary>\n      <param name=\"objectsToUndo\">An array of objects whose state changes need to be undone.</param>\n      <param name=\"name\">The name of the undo operation.</param>\n    </member>\n    <member name=\"M:UnityEditor.Undo.RegisterCreatedObjectUndo(UnityEngine.Object,System.String)\">\n      <summary>\n        <para>Register an undo operations for a newly created object.</para>\n      </summary>\n      <param name=\"objectToUndo\">The object that was created.</param>\n      <param name=\"name\">The name of the action to undo. Think \"Undo ....\" in the main menu.</param>\n    </member>\n    <member name=\"M:UnityEditor.Undo.RegisterFullObjectHierarchyUndo(UnityEngine.Object,System.String)\">\n      <summary>\n        <para>Copy the states of a hierarchy of objects onto the undo stack.</para>\n      </summary>\n      <param name=\"objectToUndo\">The object used to determine a hierarchy of objects whose state changes need to be undone.</param>\n      <param name=\"name\">The name of the undo operation.</param>\n    </member>\n    <member name=\"M:UnityEditor.Undo.RegisterFullObjectHierarchyUndo(UnityEngine.Object)\">\n      <summary>\n        <para>This overload is deprecated. Use Undo.RegisterFullObjectHierarchyUndo(Object, string) instead.</para>\n      </summary>\n      <param name=\"objectToUndo\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Undo.RevertAllDownToGroup(System.Int32)\">\n      <summary>\n        <para>Performs all undo operations up to the group index without storing a redo operation in the process.</para>\n      </summary>\n      <param name=\"group\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Undo.RevertAllInCurrentGroup\">\n      <summary>\n        <para>Performs the last undo operation but does not record a redo operation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Undo.SetCurrentGroupName(System.String)\">\n      <summary>\n        <para>Set the name of the current undo group.</para>\n      </summary>\n      <param name=\"name\">New name of the current undo group.</param>\n    </member>\n    <member name=\"M:UnityEditor.Undo.SetTransformParent(UnityEngine.Transform,UnityEngine.Transform,System.String)\">\n      <summary>\n        <para>Sets the parent of transform to the new parent and records an undo operation.</para>\n      </summary>\n      <param name=\"transform\">The Transform component whose parent is to be changed.</param>\n      <param name=\"newParent\">The parent Transform to be assigned.</param>\n      <param name=\"name\">The name of this action, to be stored in the Undo history buffer.</param>\n    </member>\n    <member name=\"T:UnityEditor.Undo.UndoRedoCallback\">\n      <summary>\n        <para>Delegate used for undoRedoPerformed.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Undo.WillFlushUndoRecord\">\n      <summary>\n        <para>Delegate used for willFlushUndoRecord.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.UndoPropertyModification\">\n      <summary>\n        <para>See Also: Undo.postprocessModifications.</para>\n      </summary>\n    </member>\n    <member name=\"A:UnityEditor\">\n      <summary>\n        <para>The UnityEditor assembly implements the editor-specific APIs in Unity. It cannot be referenced by runtime code compiled into players.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.UnwrapParam\">\n      <summary>\n        <para>Unwrapping settings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.UnwrapParam.angleError\">\n      <summary>\n        <para>Maximum allowed angle distortion (0..1).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.UnwrapParam.areaError\">\n      <summary>\n        <para>Maximum allowed area distortion (0..1).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.UnwrapParam.hardAngle\">\n      <summary>\n        <para>This angle (in degrees) or greater between triangles will cause seam to be created.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.UnwrapParam.packMargin\">\n      <summary>\n        <para>How much uv-islands will be padded.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.UnwrapParam.SetDefaults(UnityEditor.UnwrapParam&amp;)\">\n      <summary>\n        <para>Will set default values for params.</para>\n      </summary>\n      <param name=\"param\"></param>\n    </member>\n    <member name=\"T:UnityEditor.Unwrapping\">\n      <summary>\n        <para>This class holds everything you may need in regard to uv-unwrapping.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.Unwrapping.GeneratePerTriangleUV(UnityEngine.Mesh)\">\n      <summary>\n        <para>Will generate per-triangle uv (3 UVs for each triangle) with default settings.</para>\n      </summary>\n      <param name=\"src\">The source mesh to generate UVs for.</param>\n      <returns>\n        <para>The list of UVs generated.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Unwrapping.GeneratePerTriangleUV(UnityEngine.Mesh,UnityEditor.UnwrapParam)\">\n      <summary>\n        <para>Will generate per-triangle uv (3 UVs for each triangle) with provided settings.</para>\n      </summary>\n      <param name=\"src\">The source mesh to generate UVs for.</param>\n      <param name=\"settings\">Allows you to specify custom parameters to control the unwrapping.</param>\n      <returns>\n        <para>The list of UVs generated.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.Unwrapping.GenerateSecondaryUVSet(UnityEngine.Mesh)\">\n      <summary>\n        <para>Will auto generate uv2 with default settings for provided mesh, and fill them in.</para>\n      </summary>\n      <param name=\"src\"></param>\n    </member>\n    <member name=\"M:UnityEditor.Unwrapping.GenerateSecondaryUVSet(UnityEngine.Mesh,UnityEditor.UnwrapParam)\">\n      <summary>\n        <para>Will auto generate uv2 with provided settings for provided mesh, and fill them in.</para>\n      </summary>\n      <param name=\"src\"></param>\n      <param name=\"settings\"></param>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.Asset\">\n      <summary>\n        <para>This class containes information about the version control state of an asset.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Asset.fullName\">\n      <summary>\n        <para>Gets the full name of the asset including extension.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Asset.isFolder\">\n      <summary>\n        <para>Returns true if the asset is a folder.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Asset.isInCurrentProject\">\n      <summary>\n        <para>Returns true if the assets is in the current project.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Asset.isMeta\">\n      <summary>\n        <para>Returns true if the instance of the Asset class actually refers to a .meta file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Asset.locked\">\n      <summary>\n        <para>Returns true if the asset is locked by the version control system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Asset.name\">\n      <summary>\n        <para>Get the name of the asset.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Asset.path\">\n      <summary>\n        <para>Gets the path of the asset.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Asset.readOnly\">\n      <summary>\n        <para>Returns true is the asset is read only.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Asset.state\">\n      <summary>\n        <para>Gets the version control state of the asset.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Asset.Edit\">\n      <summary>\n        <para>Opens the assets in an associated editor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Asset.IsOneOfStates(UnityEditor.VersionControl.Asset/States[])\">\n      <summary>\n        <para>Returns true if the version control state of the assets is one of the input states.</para>\n      </summary>\n      <param name=\"states\">Array of states to test for.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Asset.IsState(UnityEditor.VersionControl.Asset/States)\">\n      <summary>\n        <para>Returns true if the version control state of the asset exactly matches the input state.</para>\n      </summary>\n      <param name=\"state\">State to check for.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Asset.Load\">\n      <summary>\n        <para>Loads the asset to memory.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.Asset.States\">\n      <summary>\n        <para>Describes the various version control states an asset can have.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Asset.States.AddedLocal\">\n      <summary>\n        <para>The was locally added to version control.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Asset.States.AddedRemote\">\n      <summary>\n        <para>Remotely this asset was added to version control.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Asset.States.CheckedOutLocal\">\n      <summary>\n        <para>The asset has been checked out on the local machine.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Asset.States.CheckedOutRemote\">\n      <summary>\n        <para>The asset has been checked out on a remote machine.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Asset.States.Conflicted\">\n      <summary>\n        <para>There is a conflict with the asset that needs to be resolved.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Asset.States.DeletedLocal\">\n      <summary>\n        <para>The asset has been deleted locally.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Asset.States.DeletedRemote\">\n      <summary>\n        <para>The asset has been deleted on a remote machine.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Asset.States.Local\">\n      <summary>\n        <para>The asset is not under version control.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Asset.States.LockedLocal\">\n      <summary>\n        <para>The asset is locked by the local machine.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Asset.States.LockedRemote\">\n      <summary>\n        <para>The asset is locked by a remote machine.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Asset.States.MetaFile\">\n      <summary>\n        <para>This instance of the class actaully refers to a .meta file.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Asset.States.Missing\">\n      <summary>\n        <para>The asset exists in version control but is missing on the local machine.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Asset.States.None\">\n      <summary>\n        <para>The version control state is unknown.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Asset.States.OutOfSync\">\n      <summary>\n        <para>A newer version of the asset is available on the version control server.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Asset.States.ReadOnly\">\n      <summary>\n        <para>The asset is read only.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Asset.States.Synced\">\n      <summary>\n        <para>The asset is up to date.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Asset.States.Updating\">\n      <summary>\n        <para>The state of the asset is currently being queried from the version control server.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.AssetList\">\n      <summary>\n        <para>A list of version control information about assets.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.AssetList.Filter(System.Boolean,UnityEditor.VersionControl.Asset/States[])\">\n      <summary>\n        <para>Based on the current list and the states a new list is returned which only contains the assets with the requested states.</para>\n      </summary>\n      <param name=\"includeFolder\">Whether or not folders should be included.</param>\n      <param name=\"states\">Which states to filter by.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.AssetList.FilterChildren\">\n      <summary>\n        <para>Create an optimised list of assets by removing children of folders in the same list.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.AssetList.FilterCount(System.Boolean,UnityEditor.VersionControl.Asset/States[])\">\n      <summary>\n        <para>Count the list of assets by given a set of states.</para>\n      </summary>\n      <param name=\"includeFolder\">Whether or not to include folders.</param>\n      <param name=\"states\">Which states to include in the count.</param>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.ChangeSet\">\n      <summary>\n        <para>Wrapper around a changeset description and ID.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.ChangeSet.defaultID\">\n      <summary>\n        <para>The ID of  the default changeset.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.ChangeSet.description\">\n      <summary>\n        <para>Description of a changeset.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.ChangeSet.id\">\n      <summary>\n        <para>Version control specific ID of a changeset.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.ChangeSets\">\n      <summary>\n        <para>Simply a list of changetsets.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.CheckoutMode\">\n      <summary>\n        <para>What to checkout when starting the Checkout task through the version control Provider.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.CheckoutMode.Asset\">\n      <summary>\n        <para>Checkout the asset only.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.CheckoutMode.Both\">\n      <summary>\n        <para>Checkout both asset and .meta file.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.CheckoutMode.Exact\">\n      <summary>\n        <para>Checkout.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.CheckoutMode.Meta\">\n      <summary>\n        <para>Checkout .meta file only.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.CompletionAction\">\n      <summary>\n        <para>Different actions a version control task can do upon completion.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.CompletionAction.OnAddedChangeWindow\">\n      <summary>\n        <para>Refresh windows upon task completion.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.CompletionAction.OnChangeContentsPendingWindow\">\n      <summary>\n        <para>Update the content of a pending changeset with the result of the task upon completion.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.CompletionAction.OnChangeSetsPendingWindow\">\n      <summary>\n        <para>Update the pending changesets with the result of the task upon completion.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.CompletionAction.OnCheckoutCompleted\">\n      <summary>\n        <para>Show or update the checkout failure window.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.CompletionAction.OnGotLatestPendingWindow\">\n      <summary>\n        <para>Refreshes the incoming and pensing changes window upon task completion.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.CompletionAction.OnIncomingPendingWindow\">\n      <summary>\n        <para>Update incoming changes window with the result of the task upon completion.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.CompletionAction.OnSubmittedChangeWindow\">\n      <summary>\n        <para>Refresh the submit window with the result of the task upon completion.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.CompletionAction.UpdatePendingWindow\">\n      <summary>\n        <para>Update the list of pending changes when a task completes.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.ConfigField\">\n      <summary>\n        <para>This class describes the.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.ConfigField.description\">\n      <summary>\n        <para>Descrition of the configuration field.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.ConfigField.isPassword\">\n      <summary>\n        <para>This is true if the configuration field is a password field.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.ConfigField.isRequired\">\n      <summary>\n        <para>This is true if the configuration field is required for the version control plugin to function correctly.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.ConfigField.label\">\n      <summary>\n        <para>Label that is displayed next to the configuration field in the editor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.ConfigField.name\">\n      <summary>\n        <para>Name of the configuration field.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.FileMode\">\n      <summary>\n        <para>Mode of the file.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.FileMode.Binary\">\n      <summary>\n        <para>Binary file.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.FileMode.None\">\n      <summary>\n        <para>No mode set.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.FileMode.Text\">\n      <summary>\n        <para>Text file.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.MergeMethod\">\n      <summary>\n        <para>Which method to use when merging.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.MergeMethod.MergeAll\">\n      <summary>\n        <para>Merge all changes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.MergeMethod.MergeNonConflicting\">\n      <summary>\n        <para>Merge non-conflicting changes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.MergeMethod.MergeNone\">\n      <summary>\n        <para>Don't merge any changes.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.Message\">\n      <summary>\n        <para>Messages from the version control system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Message.message\">\n      <summary>\n        <para>The message text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Message.severity\">\n      <summary>\n        <para>The severity of the message.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.Message.Severity\">\n      <summary>\n        <para>Severity of a version control message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Message.Severity.Error\">\n      <summary>\n        <para>Error message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Message.Severity.Info\">\n      <summary>\n        <para>Informational message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Message.Severity.Verbose\">\n      <summary>\n        <para>Verbose message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.Message.Severity.Warning\">\n      <summary>\n        <para>Warning message.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Message.Show\">\n      <summary>\n        <para>Write the message to the console.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.OnlineState\">\n      <summary>\n        <para>Represent the connection state of the version control provider.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.OnlineState.Offline\">\n      <summary>\n        <para>Connection to the version control server could not be established.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.OnlineState.Online\">\n      <summary>\n        <para>Connection to the version control server has been established.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.OnlineState.Updating\">\n      <summary>\n        <para>The version control provider is currently trying to connect to the version control server.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.Plugin\">\n      <summary>\n        <para>The plugin class describes a version control plugin and which configuratin options it has.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Plugin.configFields\">\n      <summary>\n        <para>Configuration fields of the plugin.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.Provider\">\n      <summary>\n        <para>This class provides acces to the version control API.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Provider.activeTask\">\n      <summary>\n        <para>Gets the currently executing task.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Provider.enabled\">\n      <summary>\n        <para>Returns true if the version control provider is enabled and a valid Unity Pro License was found.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Provider.isActive\">\n      <summary>\n        <para>Returns true if a version control plugin has been selected and configured correctly.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Provider.offlineReason\">\n      <summary>\n        <para>Returns the reason for the version control provider being offline (if it is offline).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Provider.onlineState\">\n      <summary>\n        <para>Returns the OnlineState of the version control provider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Provider.requiresNetwork\">\n      <summary>\n        <para>This is true if a network connection is required by the currently selected version control plugin to perform any action.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Add(UnityEditor.VersionControl.AssetList,System.Boolean)\">\n      <summary>\n        <para>Adds an assets or list of assets to version control.</para>\n      </summary>\n      <param name=\"assets\">List of assets to add to version control system.</param>\n      <param name=\"recursive\">Set this true if adding should be done recursively into subfolders.</param>\n      <param name=\"asset\">Single asset to add to version control system.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Add(UnityEditor.VersionControl.Asset,System.Boolean)\">\n      <summary>\n        <para>Adds an assets or list of assets to version control.</para>\n      </summary>\n      <param name=\"assets\">List of assets to add to version control system.</param>\n      <param name=\"recursive\">Set this true if adding should be done recursively into subfolders.</param>\n      <param name=\"asset\">Single asset to add to version control system.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.AddIsValid(UnityEditor.VersionControl.AssetList)\">\n      <summary>\n        <para>Given a list of assets this function returns true if Add is a valid task to perform.</para>\n      </summary>\n      <param name=\"assets\">List of assets to test.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.ChangeSetDescription(UnityEditor.VersionControl.ChangeSet)\">\n      <summary>\n        <para>Given a changeset only containing the changeset ID, this will start a task for quering the description of the changeset.</para>\n      </summary>\n      <param name=\"changeset\">Changeset to query description of.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.ChangeSetMove(UnityEditor.VersionControl.AssetList,UnityEditor.VersionControl.ChangeSet)\">\n      <summary>\n        <para>Move an asset or list of assets from their current changeset to a new changeset.</para>\n      </summary>\n      <param name=\"assets\">List of asset to move to changeset.</param>\n      <param name=\"changeset\">Changeset to move asset to.</param>\n      <param name=\"asset\">Asset to move to changeset.</param>\n      <param name=\"changesetID\">ChangesetID to move asset to.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.ChangeSetMove(UnityEditor.VersionControl.Asset,UnityEditor.VersionControl.ChangeSet)\">\n      <summary>\n        <para>Move an asset or list of assets from their current changeset to a new changeset.</para>\n      </summary>\n      <param name=\"assets\">List of asset to move to changeset.</param>\n      <param name=\"changeset\">Changeset to move asset to.</param>\n      <param name=\"asset\">Asset to move to changeset.</param>\n      <param name=\"changesetID\">ChangesetID to move asset to.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.ChangeSetMove(UnityEditor.VersionControl.AssetList,System.String)\">\n      <summary>\n        <para>Move an asset or list of assets from their current changeset to a new changeset.</para>\n      </summary>\n      <param name=\"assets\">List of asset to move to changeset.</param>\n      <param name=\"changeset\">Changeset to move asset to.</param>\n      <param name=\"asset\">Asset to move to changeset.</param>\n      <param name=\"changesetID\">ChangesetID to move asset to.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.ChangeSetMove(UnityEditor.VersionControl.Asset,System.String)\">\n      <summary>\n        <para>Move an asset or list of assets from their current changeset to a new changeset.</para>\n      </summary>\n      <param name=\"assets\">List of asset to move to changeset.</param>\n      <param name=\"changeset\">Changeset to move asset to.</param>\n      <param name=\"asset\">Asset to move to changeset.</param>\n      <param name=\"changesetID\">ChangesetID to move asset to.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.ChangeSets\">\n      <summary>\n        <para>Get a list of pending changesets owned by the current user.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.ChangeSetStatus(UnityEditor.VersionControl.ChangeSet)\">\n      <summary>\n        <para>Retrieves the list of assets belonging to a changeset.</para>\n      </summary>\n      <param name=\"changeset\">Changeset to query for assets.</param>\n      <param name=\"changesetID\">ChangesetID to query for assets.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.ChangeSetStatus(System.String)\">\n      <summary>\n        <para>Retrieves the list of assets belonging to a changeset.</para>\n      </summary>\n      <param name=\"changeset\">Changeset to query for assets.</param>\n      <param name=\"changesetID\">ChangesetID to query for assets.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Checkout(UnityEditor.VersionControl.AssetList,UnityEditor.VersionControl.CheckoutMode)\">\n      <summary>\n        <para>Checkout an asset or list of asset from the version control system.</para>\n      </summary>\n      <param name=\"assets\">List of assets to checkout.</param>\n      <param name=\"mode\">Tell the Provider to checkout the asset, the .meta file or both.</param>\n      <param name=\"asset\">Asset to checkout.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Checkout(System.String[],UnityEditor.VersionControl.CheckoutMode)\">\n      <summary>\n        <para>Checkout an asset or list of asset from the version control system.</para>\n      </summary>\n      <param name=\"assets\">List of assets to checkout.</param>\n      <param name=\"mode\">Tell the Provider to checkout the asset, the .meta file or both.</param>\n      <param name=\"asset\">Asset to checkout.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Checkout(UnityEngine.Object[],UnityEditor.VersionControl.CheckoutMode)\">\n      <summary>\n        <para>Checkout an asset or list of asset from the version control system.</para>\n      </summary>\n      <param name=\"assets\">List of assets to checkout.</param>\n      <param name=\"mode\">Tell the Provider to checkout the asset, the .meta file or both.</param>\n      <param name=\"asset\">Asset to checkout.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Checkout(UnityEditor.VersionControl.Asset,UnityEditor.VersionControl.CheckoutMode)\">\n      <summary>\n        <para>Checkout an asset or list of asset from the version control system.</para>\n      </summary>\n      <param name=\"assets\">List of assets to checkout.</param>\n      <param name=\"mode\">Tell the Provider to checkout the asset, the .meta file or both.</param>\n      <param name=\"asset\">Asset to checkout.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Checkout(System.String,UnityEditor.VersionControl.CheckoutMode)\">\n      <summary>\n        <para>Checkout an asset or list of asset from the version control system.</para>\n      </summary>\n      <param name=\"assets\">List of assets to checkout.</param>\n      <param name=\"mode\">Tell the Provider to checkout the asset, the .meta file or both.</param>\n      <param name=\"asset\">Asset to checkout.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Checkout(UnityEngine.Object,UnityEditor.VersionControl.CheckoutMode)\">\n      <summary>\n        <para>Checkout an asset or list of asset from the version control system.</para>\n      </summary>\n      <param name=\"assets\">List of assets to checkout.</param>\n      <param name=\"mode\">Tell the Provider to checkout the asset, the .meta file or both.</param>\n      <param name=\"asset\">Asset to checkout.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.CheckoutIsValid(UnityEditor.VersionControl.AssetList)\">\n      <summary>\n        <para>Given an asset or a  list of assets this function returns true if Checkout is a valid task to perform.</para>\n      </summary>\n      <param name=\"assets\">List of assets.</param>\n      <param name=\"asset\">Single asset.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.CheckoutIsValid(UnityEditor.VersionControl.Asset)\">\n      <summary>\n        <para>Given an asset or a  list of assets this function returns true if Checkout is a valid task to perform.</para>\n      </summary>\n      <param name=\"assets\">List of assets.</param>\n      <param name=\"asset\">Single asset.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.ClearCache\">\n      <summary>\n        <para>This will invalidate the cached state information for all assets.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Delete(System.String)\">\n      <summary>\n        <para>This will statt a task for deleting an asset or assets both from disk and from version control system.</para>\n      </summary>\n      <param name=\"assetProjectPath\">Project path of asset.</param>\n      <param name=\"assets\">List of assets to delete.</param>\n      <param name=\"asset\">Asset to delete.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Delete(UnityEditor.VersionControl.AssetList)\">\n      <summary>\n        <para>This will statt a task for deleting an asset or assets both from disk and from version control system.</para>\n      </summary>\n      <param name=\"assetProjectPath\">Project path of asset.</param>\n      <param name=\"assets\">List of assets to delete.</param>\n      <param name=\"asset\">Asset to delete.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Delete(UnityEditor.VersionControl.Asset)\">\n      <summary>\n        <para>This will statt a task for deleting an asset or assets both from disk and from version control system.</para>\n      </summary>\n      <param name=\"assetProjectPath\">Project path of asset.</param>\n      <param name=\"assets\">List of assets to delete.</param>\n      <param name=\"asset\">Asset to delete.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.DeleteChangeSets(UnityEditor.VersionControl.ChangeSets)\">\n      <summary>\n        <para>Starts a task that will attempt to delete the given changeset.</para>\n      </summary>\n      <param name=\"changesets\">List of changetsets.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.DeleteChangeSetsIsValid(UnityEditor.VersionControl.ChangeSets)\">\n      <summary>\n        <para>Test if deleting a changeset is a valid task to perform.</para>\n      </summary>\n      <param name=\"changesets\">Changeset to test.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.DiffHead(UnityEditor.VersionControl.AssetList,System.Boolean)\">\n      <summary>\n        <para>Starts a task for showing a diff of the given assest versus their head revision.</para>\n      </summary>\n      <param name=\"assets\">List of assets.</param>\n      <param name=\"includingMetaFiles\">Whether or not to include .meta.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.DiffIsValid(UnityEditor.VersionControl.AssetList)\">\n      <summary>\n        <para>Return true is starting a Diff task is a valid operation.</para>\n      </summary>\n      <param name=\"assets\">List of assets.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.GetActiveConfigFields\">\n      <summary>\n        <para>Returns the configuration fields for the currently active version control plugin.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.GetActivePlugin\">\n      <summary>\n        <para>Gets the currently user selected verson control plugin.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.GetAssetByGUID(System.String)\">\n      <summary>\n        <para>Returns version control information about an asset.</para>\n      </summary>\n      <param name=\"guid\">GUID of asset.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.GetAssetByPath(System.String)\">\n      <summary>\n        <para>Returns version control information about an asset.</para>\n      </summary>\n      <param name=\"unityPath\">Path to asset.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.GetAssetListFromSelection\">\n      <summary>\n        <para>Return version control information about the currently selected assets.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.GetLatest(UnityEditor.VersionControl.AssetList)\">\n      <summary>\n        <para>Start a task for getting the latest version of an asset from the version control server.</para>\n      </summary>\n      <param name=\"assets\">List of assets to update.</param>\n      <param name=\"asset\">Asset to update.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.GetLatest(UnityEditor.VersionControl.Asset)\">\n      <summary>\n        <para>Start a task for getting the latest version of an asset from the version control server.</para>\n      </summary>\n      <param name=\"assets\">List of assets to update.</param>\n      <param name=\"asset\">Asset to update.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.GetLatestIsValid(UnityEditor.VersionControl.AssetList)\">\n      <summary>\n        <para>Returns true if getting the latest version of an asset is a valid operation.</para>\n      </summary>\n      <param name=\"assets\">List of assets to test.</param>\n      <param name=\"asset\">Asset to test.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.GetLatestIsValid(UnityEditor.VersionControl.Asset)\">\n      <summary>\n        <para>Returns true if getting the latest version of an asset is a valid operation.</para>\n      </summary>\n      <param name=\"assets\">List of assets to test.</param>\n      <param name=\"asset\">Asset to test.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Incoming\">\n      <summary>\n        <para>Start a task for quering the version control server for incoming changes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.IncomingChangeSetAssets(UnityEditor.VersionControl.ChangeSet)\">\n      <summary>\n        <para>Given an incoming changeset this will start a task to query the version control server for which assets are part of the changeset.</para>\n      </summary>\n      <param name=\"changeset\">Incoming changeset.</param>\n      <param name=\"changesetID\">Incoming changesetid.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.IncomingChangeSetAssets(System.String)\">\n      <summary>\n        <para>Given an incoming changeset this will start a task to query the version control server for which assets are part of the changeset.</para>\n      </summary>\n      <param name=\"changeset\">Incoming changeset.</param>\n      <param name=\"changesetID\">Incoming changesetid.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.IsOpenForEdit(UnityEditor.VersionControl.Asset)\">\n      <summary>\n        <para>Returns true if an asset can be edited.</para>\n      </summary>\n      <param name=\"asset\">Asset to test.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Lock(UnityEditor.VersionControl.AssetList,System.Boolean)\">\n      <summary>\n        <para>Attempt to lock an asset for exclusive editing.</para>\n      </summary>\n      <param name=\"assets\">List of assets to lock/unlock.</param>\n      <param name=\"locked\">True to lock assets, false to unlock assets.</param>\n      <param name=\"asset\">Asset to lock/unlock.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Lock(UnityEditor.VersionControl.Asset,System.Boolean)\">\n      <summary>\n        <para>Attempt to lock an asset for exclusive editing.</para>\n      </summary>\n      <param name=\"assets\">List of assets to lock/unlock.</param>\n      <param name=\"locked\">True to lock assets, false to unlock assets.</param>\n      <param name=\"asset\">Asset to lock/unlock.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.LockIsValid(UnityEditor.VersionControl.AssetList)\">\n      <summary>\n        <para>Return true if the task can be executed.</para>\n      </summary>\n      <param name=\"assets\">List of assets to test.</param>\n      <param name=\"asset\">Asset to test.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.LockIsValid(UnityEditor.VersionControl.Asset)\">\n      <summary>\n        <para>Return true if the task can be executed.</para>\n      </summary>\n      <param name=\"assets\">List of assets to test.</param>\n      <param name=\"asset\">Asset to test.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Merge(UnityEditor.VersionControl.AssetList,UnityEditor.VersionControl.MergeMethod)\">\n      <summary>\n        <para>This method will initiate a merge task handle merging of the conflicting assets.</para>\n      </summary>\n      <param name=\"assets\">The list of conflicting assets to be merged.</param>\n      <param name=\"method\">How to merge the assets.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Move(System.String,System.String)\">\n      <summary>\n        <para>Uses the version control plugin to move an asset from one path to another.</para>\n      </summary>\n      <param name=\"from\">Path to source asset.</param>\n      <param name=\"to\">Path to destination.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Resolve(UnityEditor.VersionControl.AssetList,UnityEditor.VersionControl.ResolveMethod)\">\n      <summary>\n        <para>Start a task that will resolve conflicting assets in version control.</para>\n      </summary>\n      <param name=\"assets\">The list of asset to mark as resolved.</param>\n      <param name=\"resolveMethod\">How the assets should be resolved.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.ResolveIsValid(UnityEditor.VersionControl.AssetList)\">\n      <summary>\n        <para>Tests if any of the assets in the list is resolvable.</para>\n      </summary>\n      <param name=\"assets\">The list of asset to be resolved.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Revert(UnityEditor.VersionControl.AssetList,UnityEditor.VersionControl.RevertMode)\">\n      <summary>\n        <para>Reverts the specified assets by undoing any changes done since last time you synced.</para>\n      </summary>\n      <param name=\"assets\">The list of assets to be reverted.</param>\n      <param name=\"mode\">How to revert the assets.</param>\n      <param name=\"asset\">The asset to be reverted.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Revert(UnityEditor.VersionControl.Asset,UnityEditor.VersionControl.RevertMode)\">\n      <summary>\n        <para>Reverts the specified assets by undoing any changes done since last time you synced.</para>\n      </summary>\n      <param name=\"assets\">The list of assets to be reverted.</param>\n      <param name=\"mode\">How to revert the assets.</param>\n      <param name=\"asset\">The asset to be reverted.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.RevertIsValid(UnityEditor.VersionControl.AssetList,UnityEditor.VersionControl.RevertMode)\">\n      <summary>\n        <para>Return true if Revert is a valid task to perform.</para>\n      </summary>\n      <param name=\"assets\">List of assets to test.</param>\n      <param name=\"mode\">Revert mode to test for.</param>\n      <param name=\"asset\">Asset to test.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.RevertIsValid(UnityEditor.VersionControl.Asset,UnityEditor.VersionControl.RevertMode)\">\n      <summary>\n        <para>Return true if Revert is a valid task to perform.</para>\n      </summary>\n      <param name=\"assets\">List of assets to test.</param>\n      <param name=\"mode\">Revert mode to test for.</param>\n      <param name=\"asset\">Asset to test.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Status(UnityEditor.VersionControl.AssetList)\">\n      <summary>\n        <para>Start a task that will fetch the most recent status from revision control system.</para>\n      </summary>\n      <param name=\"assets\">The assets fetch new state for.</param>\n      <param name=\"asset\">The asset path to fetch new state for.</param>\n      <param name=\"recursively\">If any assets specified are folders this flag will get status for all descendants of the folder as well.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Status(UnityEditor.VersionControl.Asset)\">\n      <summary>\n        <para>Start a task that will fetch the most recent status from revision control system.</para>\n      </summary>\n      <param name=\"assets\">The assets fetch new state for.</param>\n      <param name=\"asset\">The asset path to fetch new state for.</param>\n      <param name=\"recursively\">If any assets specified are folders this flag will get status for all descendants of the folder as well.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Status(UnityEditor.VersionControl.AssetList,System.Boolean)\">\n      <summary>\n        <para>Start a task that will fetch the most recent status from revision control system.</para>\n      </summary>\n      <param name=\"assets\">The assets fetch new state for.</param>\n      <param name=\"asset\">The asset path to fetch new state for.</param>\n      <param name=\"recursively\">If any assets specified are folders this flag will get status for all descendants of the folder as well.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Status(UnityEditor.VersionControl.Asset,System.Boolean)\">\n      <summary>\n        <para>Start a task that will fetch the most recent status from revision control system.</para>\n      </summary>\n      <param name=\"assets\">The assets fetch new state for.</param>\n      <param name=\"asset\">The asset path to fetch new state for.</param>\n      <param name=\"recursively\">If any assets specified are folders this flag will get status for all descendants of the folder as well.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Status(System.String[])\">\n      <summary>\n        <para>Start a task that will fetch the most recent status from revision control system.</para>\n      </summary>\n      <param name=\"assets\">The assets fetch new state for.</param>\n      <param name=\"asset\">The asset path to fetch new state for.</param>\n      <param name=\"recursively\">If any assets specified are folders this flag will get status for all descendants of the folder as well.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Status(System.String[],System.Boolean)\">\n      <summary>\n        <para>Start a task that will fetch the most recent status from revision control system.</para>\n      </summary>\n      <param name=\"assets\">The assets fetch new state for.</param>\n      <param name=\"asset\">The asset path to fetch new state for.</param>\n      <param name=\"recursively\">If any assets specified are folders this flag will get status for all descendants of the folder as well.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Status(System.String)\">\n      <summary>\n        <para>Start a task that will fetch the most recent status from revision control system.</para>\n      </summary>\n      <param name=\"assets\">The assets fetch new state for.</param>\n      <param name=\"asset\">The asset path to fetch new state for.</param>\n      <param name=\"recursively\">If any assets specified are folders this flag will get status for all descendants of the folder as well.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Status(System.String,System.Boolean)\">\n      <summary>\n        <para>Start a task that will fetch the most recent status from revision control system.</para>\n      </summary>\n      <param name=\"assets\">The assets fetch new state for.</param>\n      <param name=\"asset\">The asset path to fetch new state for.</param>\n      <param name=\"recursively\">If any assets specified are folders this flag will get status for all descendants of the folder as well.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.Submit(UnityEditor.VersionControl.ChangeSet,UnityEditor.VersionControl.AssetList,System.String,System.Boolean)\">\n      <summary>\n        <para>Start a task that submits the assets to version control.</para>\n      </summary>\n      <param name=\"changeset\">The changeset to submit.</param>\n      <param name=\"list\">The list of assets to submit.</param>\n      <param name=\"description\">The description of the changeset.</param>\n      <param name=\"saveOnly\">If true then only save the changeset to be submitted later.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.SubmitIsValid(UnityEditor.VersionControl.ChangeSet,UnityEditor.VersionControl.AssetList)\">\n      <summary>\n        <para>Returns true if submitting the assets is a valid operation.</para>\n      </summary>\n      <param name=\"changeset\">The changeset to submit.</param>\n      <param name=\"assets\">The asset to submit.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.UnlockIsValid(UnityEditor.VersionControl.AssetList)\">\n      <summary>\n        <para>Returns true if locking the assets is a valid operation.</para>\n      </summary>\n      <param name=\"assets\">The assets to lock.</param>\n      <param name=\"asset\">The asset to lock.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.UnlockIsValid(UnityEditor.VersionControl.Asset)\">\n      <summary>\n        <para>Returns true if locking the assets is a valid operation.</para>\n      </summary>\n      <param name=\"assets\">The assets to lock.</param>\n      <param name=\"asset\">The asset to lock.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Provider.UpdateSettings\">\n      <summary>\n        <para>Start a task that sends the version control settings to the version control system.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.ResolveMethod\">\n      <summary>\n        <para>How assets should be resolved.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.ResolveMethod.UseMerged\">\n      <summary>\n        <para>Use merged version.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.ResolveMethod.UseMine\">\n      <summary>\n        <para>Use \"mine\" (local version).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.ResolveMethod.UseTheirs\">\n      <summary>\n        <para>Use \"theirs\" (other/remote version).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.RevertMode\">\n      <summary>\n        <para>Defines the behaviour of the version control revert methods.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.RevertMode.KeepModifications\">\n      <summary>\n        <para>Revert files but keep locally changed ones.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.RevertMode.Normal\">\n      <summary>\n        <para>Use the version control regular revert approach.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.RevertMode.Unchanged\">\n      <summary>\n        <para>Revert only unchanged files.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.SubmitResult\">\n      <summary>\n        <para>The status of an operation returned by the VCS.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.SubmitResult.ConflictingFiles\">\n      <summary>\n        <para>Files conflicted.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.SubmitResult.Error\">\n      <summary>\n        <para>An error was returned.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.SubmitResult.OK\">\n      <summary>\n        <para>Submission worked.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VersionControl.SubmitResult.UnaddedFiles\">\n      <summary>\n        <para>Files were unable to be added.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VersionControl.Task\">\n      <summary>\n        <para>A UnityEditor.VersionControl.Task is created almost everytime UnityEditor.VersionControl.Provider is ask to perform an action.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Task.assetList\">\n      <summary>\n        <para>The result of some types of tasks.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Task.changeSets\">\n      <summary>\n        <para>List of changesets returned by some tasks.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Task.description\">\n      <summary>\n        <para>A short description of the current task.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Task.messages\">\n      <summary>\n        <para>May contain messages from the version control plugins.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Task.progressPct\">\n      <summary>\n        <para>Progress of current task in precent.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Task.resultCode\">\n      <summary>\n        <para>Some task return result codes, these are stored here.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Task.secondsSpent\">\n      <summary>\n        <para>Total time spent in task since the task was started.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Task.success\">\n      <summary>\n        <para>Get whether or not the task was completed succesfully.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VersionControl.Task.text\">\n      <summary>\n        <para>Will contain the result of the Provider.ChangeSetDescription task.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Task.SetCompletionAction(UnityEditor.VersionControl.CompletionAction)\">\n      <summary>\n        <para>Upon completion of a task a completion task will be performed if it is set.</para>\n      </summary>\n      <param name=\"action\">Which completion action to perform.</param>\n    </member>\n    <member name=\"M:UnityEditor.VersionControl.Task.Wait\">\n      <summary>\n        <para>A blocking wait for the task to complete.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VertexChannelCompressionFlags\">\n      <summary>\n        <para>Use these enum flags to specify which elements of a vertex to compress.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VertexChannelCompressionFlags.Color\">\n      <summary>\n        <para>Color compression enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VertexChannelCompressionFlags.None\">\n      <summary>\n        <para>Vertex compression disabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VertexChannelCompressionFlags.Normal\">\n      <summary>\n        <para>Normal compression enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VertexChannelCompressionFlags.Position\">\n      <summary>\n        <para>Position compression enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VertexChannelCompressionFlags.Tangent\">\n      <summary>\n        <para>Tangent compression enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VertexChannelCompressionFlags.TexCoord0\">\n      <summary>\n        <para>Texture coordinate 0 compression enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VertexChannelCompressionFlags.TexCoord1\">\n      <summary>\n        <para>Texture coordinate 1 compression enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VertexChannelCompressionFlags.TexCoord2\">\n      <summary>\n        <para>Texture coordinate 2 compression enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VertexChannelCompressionFlags.TexCoord3\">\n      <summary>\n        <para>Texture coordinate 3 compression enabled.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VideoBitrateMode\">\n      <summary>\n        <para>Bit rate after the clip is transcoded.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoBitrateMode.High\">\n      <summary>\n        <para>High value, possibly exceeding typical internet connection capabilities.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoBitrateMode.Low\">\n      <summary>\n        <para>Low value, safe for slower internet connections or clips where visual quality is not critical.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoBitrateMode.Medium\">\n      <summary>\n        <para>Typical bit rate supported by internet connections.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VideoClipImporter\">\n      <summary>\n        <para>VideoClipImporter lets you modify Video.VideoClip import settings from Editor scripts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.defaultTargetSettings\">\n      <summary>\n        <para>Default values for the platform-specific import settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.deinterlaceMode\">\n      <summary>\n        <para>Images are deinterlaced during transcode.  This tells the importer how to interpret fields in the source, if any.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.flipHorizontal\">\n      <summary>\n        <para>Apply a horizontal flip during import.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.flipVertical\">\n      <summary>\n        <para>Apply a vertical flip during import.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.frameCount\">\n      <summary>\n        <para>Number of frames in the clip.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.frameRate\">\n      <summary>\n        <para>Frame rate of the clip.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.importAudio\">\n      <summary>\n        <para>Import audio tracks from source file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.isPlayingPreview\">\n      <summary>\n        <para>Whether the preview is currently playing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.keepAlpha\">\n      <summary>\n        <para>Whether to keep the alpha from the source into the transcoded clip.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.linearColor\">\n      <summary>\n        <para>Used in legacy import mode.  Same as MovieImport.linearTexture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.outputFileSize\">\n      <summary>\n        <para>Size in bytes of the file once imported.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.pixelAspectRatioDenominator\">\n      <summary>\n        <para>Denominator of the pixel aspect ratio (num:den).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.pixelAspectRatioNumerator\">\n      <summary>\n        <para>Numerator of the pixel aspect ratio (num:den).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.quality\">\n      <summary>\n        <para>Used in legacy import mode.  Same as MovieImport.quality.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.sourceAudioTrackCount\">\n      <summary>\n        <para>Number of audio tracks in the source file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.sourceFileSize\">\n      <summary>\n        <para>Size in bytes of the file before importing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.sourceHasAlpha\">\n      <summary>\n        <para>True if the source file has a channel for per-pixel transparency.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.transcodeSkipped\">\n      <summary>\n        <para>Returns true if transcoding was skipped during import, false otherwise. (Read Only)\n\nWhen VideoImporterTargetSettings.enableTranscoding is set to true, the resulting transcoding operation done at import time may be quite long, up to many hours depending on source resolution and content duration. An option to skip this process is offered in the asset import progress bar. When skipped, the transcoding instead provides a non-transcoded verision of the asset. However, the importer settings stay intact so this property can be inspected to detect the incoherence with the generated artifact.\n\nRe-importing without stopping the transcode process, or with transcode turned off, causes this property to become false.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.VideoClipImporter.useLegacyImporter\">\n      <summary>\n        <para>True to import a MovieTexture (deprecated), false for a VideoClip (preferred).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.VideoClipImporter.ClearTargetSettings(System.String)\">\n      <summary>\n        <para>Clear the platform-specific import settings for the specified platform, causing them to go back to the default settings.</para>\n      </summary>\n      <param name=\"platform\">Platform name.</param>\n    </member>\n    <member name=\"M:UnityEditor.VideoClipImporter.Equals(UnityEditor.VideoClipImporter)\">\n      <summary>\n        <para>Performs a value comparison with another VideoClipImporter.</para>\n      </summary>\n      <param name=\"rhs\">The importer to compare with.</param>\n      <returns>\n        <para>Returns true if the settings for both VideoClipImporters match. Returns false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.VideoClipImporter.GetPreviewTexture\">\n      <summary>\n        <para>Returns a texture with the transcoded clip's current frame.\nReturns frame 0 when not playing, and frame at current time when playing.</para>\n      </summary>\n      <returns>\n        <para>Texture containing the current frame.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.VideoClipImporter.GetResizeHeight(UnityEditor.VideoResizeMode)\">\n      <summary>\n        <para>Get the resulting height of the resize operation for the specified resize mode.</para>\n      </summary>\n      <param name=\"mode\">Mode for which the height is queried.</param>\n      <returns>\n        <para>Height for the specified resize mode.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.VideoClipImporter.GetResizeModeName(UnityEditor.VideoResizeMode)\">\n      <summary>\n        <para>Get the full name of the resize operation for the specified resize mode.</para>\n      </summary>\n      <param name=\"mode\">Mode for which the width is queried.</param>\n      <returns>\n        <para>Name for the specified resize mode.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.VideoClipImporter.GetResizeWidth(UnityEditor.VideoResizeMode)\">\n      <summary>\n        <para>Get the resulting width of the resize operation for the specified resize mode.</para>\n      </summary>\n      <param name=\"mode\">Mode for which the width is queried.</param>\n      <returns>\n        <para>Width for the specified resize mode.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.VideoClipImporter.GetSourceAudioChannelCount(System.UInt16)\">\n      <summary>\n        <para>Number of audio channels in the specified source track.</para>\n      </summary>\n      <param name=\"audioTrackIdx\">Index of the audio track to query.</param>\n      <returns>\n        <para>Number of channels.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.VideoClipImporter.GetSourceAudioSampleRate(System.UInt16)\">\n      <summary>\n        <para>Sample rate of the specified audio track.</para>\n      </summary>\n      <param name=\"audioTrackIdx\">Index of the audio track to query.</param>\n      <returns>\n        <para>Sample rate in Hertz.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.VideoClipImporter.GetTargetSettings(System.String)\">\n      <summary>\n        <para>Returns the platform-specific import settings for the specified platform.</para>\n      </summary>\n      <param name=\"platform\">Platform name.</param>\n      <returns>\n        <para>The platform-specific import settings.  Throws an exception if the platform is unknown.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEditor.VideoClipImporter.PlayPreview\">\n      <summary>\n        <para>Starts preview playback.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.VideoClipImporter.SetTargetSettings(System.String,UnityEditor.VideoImporterTargetSettings)\">\n      <summary>\n        <para>Sets the platform-specific import settings for the specified platform.</para>\n      </summary>\n      <param name=\"platform\">Platform name.</param>\n      <param name=\"settings\">The new platform-specific import settings.</param>\n    </member>\n    <member name=\"M:UnityEditor.VideoClipImporter.StopPreview\">\n      <summary>\n        <para>Stops preview playback.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VideoCodec\">\n      <summary>\n        <para>Video codec to use when importing video clips.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoCodec.Auto\">\n      <summary>\n        <para>Choose the codec that supports hardware decoding on the target platform.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoCodec.H264\">\n      <summary>\n        <para>Encode video with the H.264 codec.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoCodec.VP8\">\n      <summary>\n        <para>Encode video using the vp8 codec.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VideoDeinterlaceMode\">\n      <summary>\n        <para>Describes how the fields in the image, if any, should be interpreted.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoDeinterlaceMode.Even\">\n      <summary>\n        <para>First field is in the even lines.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoDeinterlaceMode.Odd\">\n      <summary>\n        <para>First field is in the odd lines.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoDeinterlaceMode.Off\">\n      <summary>\n        <para>Clip is not interlaced.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VideoEncodeAspectRatio\">\n      <summary>\n        <para>Methods to compensate for aspect ratio discrepancies between the source resolution and the wanted encoding size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoEncodeAspectRatio.NoScaling\">\n      <summary>\n        <para>Perform no operation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoEncodeAspectRatio.Stretch\">\n      <summary>\n        <para>Stretch the source to fill the target resolution without preserving the aspect ratio.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VideoImporterTargetSettings\">\n      <summary>\n        <para>Importer settings that can have platform-specific values.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoImporterTargetSettings.aspectRatio\">\n      <summary>\n        <para>How the aspect ratio discrepancies, if any, will be handled if the chosen import resolution has a different ratio than the source.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoImporterTargetSettings.bitrateMode\">\n      <summary>\n        <para>Bit rate type for the transcoded clip.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoImporterTargetSettings.codec\">\n      <summary>\n        <para>Codec that the resulting VideoClip will use.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoImporterTargetSettings.customHeight\">\n      <summary>\n        <para>Height of the transcoded clip when the resizeMode is set to custom.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoImporterTargetSettings.customWidth\">\n      <summary>\n        <para>Width of the transcoded clip when the resizeMode is set to custom.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoImporterTargetSettings.enableTranscoding\">\n      <summary>\n        <para>Controls whether the movie file will be transcoded during import. When transcoding is not enabled, the file will be imported in its original format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoImporterTargetSettings.resizeMode\">\n      <summary>\n        <para>How to resize the images when going into the imported clip.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoImporterTargetSettings.spatialQuality\">\n      <summary>\n        <para>Controls an internal image resize, resulting in blurrier images but smaller image dimensions and file size.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEditor.VideoImporterTargetSettings.#ctor\">\n      <summary>\n        <para>Constructs an object with all members initialized with the default value inherent to their type.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VideoResizeMode\">\n      <summary>\n        <para>How the video clip's images will be resized during transcoding.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoResizeMode.CustomSize\">\n      <summary>\n        <para>Resulting size will be driven by VideoClipImporter.customWidth and VideoClipImporter.customHeight.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoResizeMode.HalfRes\">\n      <summary>\n        <para>Half width and height.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoResizeMode.OriginalSize\">\n      <summary>\n        <para>Same width and height as the source.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoResizeMode.QuarterRes\">\n      <summary>\n        <para>Quarter width and height.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoResizeMode.Square1024\">\n      <summary>\n        <para>Fit source in a 1024x1024 rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoResizeMode.Square256\">\n      <summary>\n        <para>Fit source in a 256x256 rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoResizeMode.Square512\">\n      <summary>\n        <para>Fit source in a 512x512 rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoResizeMode.ThreeQuarterRes\">\n      <summary>\n        <para>3/4 width and height.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.VideoSpatialQuality\">\n      <summary>\n        <para>Controls the imported clip's internal resize to save space at the cost of blurrier images.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoSpatialQuality.HighSpatialQuality\">\n      <summary>\n        <para>No resize performed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoSpatialQuality.LowSpatialQuality\">\n      <summary>\n        <para>Scales width and height by 1/2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.VideoSpatialQuality.MediumSpatialQuality\">\n      <summary>\n        <para>Scales width and height by 3/4.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.ViewTool\">\n      <summary>\n        <para>Enum for Tools.viewTool.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ViewTool.FPS\">\n      <summary>\n        <para>The FPS tool is selected.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ViewTool.None\">\n      <summary>\n        <para>View tool is not selected.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ViewTool.Orbit\">\n      <summary>\n        <para>The orbit tool is selected.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ViewTool.Pan\">\n      <summary>\n        <para>The pan tool is selected.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.ViewTool.Zoom\">\n      <summary>\n        <para>The zoom tool is selected.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.WebGLCompressionFormat\">\n      <summary>\n        <para>An enum containing different compression types.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.WebGLCompressionFormat.Brotli\">\n      <summary>\n        <para>WebGL resources are stored using Brotli compression.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.WebGLCompressionFormat.Disabled\">\n      <summary>\n        <para>WebGL resources are uncompressed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.WebGLCompressionFormat.Gzip\">\n      <summary>\n        <para>WebGL resources are stored using Gzip compression.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.WebGLExceptionSupport\">\n      <summary>\n        <para>Options for Exception support in WebGL.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.WebGLExceptionSupport.ExplicitlyThrownExceptionsOnly\">\n      <summary>\n        <para>Enable throw support.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.WebGLExceptionSupport.FullWithoutStacktrace\">\n      <summary>\n        <para>Enable exception support for all exceptions, without stack trace information.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.WebGLExceptionSupport.FullWithStacktrace\">\n      <summary>\n        <para>Enable exception support for all exceptions, including stack trace information.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.WebGLExceptionSupport.None\">\n      <summary>\n        <para>Disable exception support.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.WebGLLinkerTarget\">\n      <summary>\n        <para>The build format options available when building to WebGL.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.WebGLLinkerTarget.Asm\">\n      <summary>\n        <para>Only asm.js output will be generated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.WebGLLinkerTarget.Both\">\n      <summary>\n        <para>Both asm.js and WebAssembly output will be generated. The WebAssembly version of the generated content will be used if supported by the browser, otherwise, the asm.js version will be used.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.WebGLLinkerTarget.Wasm\">\n      <summary>\n        <para>Only WebAssembly output will be generated. This will require a browser with WebAssembly support to run the generated content.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.WSABuildType\">\n      <summary>\n        <para>Build configurations for Windows Store Visual Studio solutions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.WSABuildType.Debug\">\n      <summary>\n        <para>Debug configuation.\nNo optimizations, profiler code enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.WSABuildType.Master\">\n      <summary>\n        <para>Master configuation.\nOptimizations enabled, profiler code disabled. This configuration is used when submitting the application to Windows Store.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.WSABuildType.Release\">\n      <summary>\n        <para>Release configuration.\nOptimization enabled, profiler code enabled.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.WSASubtarget\">\n      <summary>\n        <para>Target device type for a Windows Store application to run on.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.WSASubtarget.AnyDevice\">\n      <summary>\n        <para>The application targets all devices that run Windows Store applications.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.WSASubtarget.HoloLens\">\n      <summary>\n        <para>The application targets HoloLens.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.WSASubtarget.Mobile\">\n      <summary>\n        <para>Application targets mobile devices.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.WSASubtarget.PC\">\n      <summary>\n        <para>Application targets PCs.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.XboxBuildSubtarget\">\n      <summary>\n        <para>Target Xbox build type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.XboxBuildSubtarget.Debug\">\n      <summary>\n        <para>Debug player (for building with source code).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.XboxBuildSubtarget.Development\">\n      <summary>\n        <para>Development player.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.XboxBuildSubtarget.Master\">\n      <summary>\n        <para>Master player (submission-proof).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.XR.Daydream.SupportedHeadTracking\">\n      <summary>\n        <para>Resolution dialog setting.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.XR.Daydream.SupportedHeadTracking.SixDoF\">\n      <summary>\n        <para>Devices that support 6 Degrees of Freedom head tracking.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEditor.XR.Daydream.SupportedHeadTracking.ThreeDoF\">\n      <summary>\n        <para>Devices that support 3 Degrees of Freedom head tracking.</para>\n      </summary>\n    </member>\n  </members>\n</doc>\n"
  },
  {
    "path": "Resources/UnityEngine.UI.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n<doc>\n  <members>\n    <assembly>\n      <name>UnityEngine.UI</name>\n    </assembly>\n    <member name=\"T:UnityEngine.EventSystems.AbstractEventData\">\n      <summary>\n        <para>A class that can be used for sending simple events via the event system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.AbstractEventData.used\">\n      <summary>\n        <para>Is the event used?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.AbstractEventData.Reset\">\n      <summary>\n        <para>Reset the event.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.AbstractEventData.Use\">\n      <summary>\n        <para>Use the event.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.AxisEventData\">\n      <summary>\n        <para>Event Data associated with Axis Events (Controller / Keyboard).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.AxisEventData.moveDir\">\n      <summary>\n        <para>MoveDirection for this event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.AxisEventData.moveVector\">\n      <summary>\n        <para>Raw input vector associated with this event.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.BaseEventData\">\n      <summary>\n        <para>A class that contains the base event data that is common to all event types in the new EventSystem.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.BaseEventData.currentInputModule\">\n      <summary>\n        <para>A reference to the BaseInputModule that sent this event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.BaseEventData.selectedObject\">\n      <summary>\n        <para>The object currently considered selected by the EventSystem.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseEventData.#ctor(UnityEngine.EventSystems.EventSystem)\">\n      <summary>\n        <para>Construct a BaseEventData tied to the passed EventSystem.</para>\n      </summary>\n      <param name=\"eventSystem\"></param>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.BaseInput\">\n      <summary>\n        <para>Interface to the Input system used by the BaseInputModule. With this it is possible to bypass the Input system with your own but still use the same InputModule. For example this can be used to feed fake input into the UI or interface with a different input system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.BaseInput.compositionCursorPos\">\n      <summary>\n        <para>Interface to Input.compositionCursorPos. Can be overridden to provide custom input instead of using the Input class.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.BaseInput.compositionString\">\n      <summary>\n        <para>Interface to Input.compositionString. Can be overridden to provide custom input instead of using the Input class.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.BaseInput.imeCompositionMode\">\n      <summary>\n        <para>Interface to Input.imeCompositionMode. Can be overridden to provide custom input instead of using the Input class.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.BaseInput.mousePosition\">\n      <summary>\n        <para>Interface to Input.mousePosition. Can be overridden to provide custom input instead of using the Input class.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.BaseInput.mousePresent\">\n      <summary>\n        <para>Interface to Input.mousePresent. Can be overridden to provide custom input instead of using the Input class.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.BaseInput.mouseScrollDelta\">\n      <summary>\n        <para>Interface to Input.mouseScrollDelta. Can be overridden to provide custom input instead of using the Input class.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.BaseInput.touchCount\">\n      <summary>\n        <para>Interface to Input.touchCount. Can be overridden to provide custom input instead of using the Input class.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.BaseInput.touchSupported\">\n      <summary>\n        <para>Interface to Input.touchSupported. Can be overridden to provide custom input instead of using the Input class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInput.GetAxisRaw(System.String)\">\n      <summary>\n        <para>Interface to Input.GetAxisRaw. Can be overridden to provide custom input instead of using the Input class.</para>\n      </summary>\n      <param name=\"axisName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInput.GetButtonDown(System.String)\">\n      <summary>\n        <para>Interface to Input.GetButtonDown. Can be overridden to provide custom input instead of using the Input class.</para>\n      </summary>\n      <param name=\"buttonName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInput.GetMouseButton(System.Int32)\">\n      <summary>\n        <para>Interface to Input.GetMouseButton. Can be overridden to provide custom input instead of using the Input class.</para>\n      </summary>\n      <param name=\"button\"></param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInput.GetMouseButtonDown(System.Int32)\">\n      <summary>\n        <para>Interface to Input.GetMouseButtonDown. Can be overridden to provide custom input instead of using the Input class.</para>\n      </summary>\n      <param name=\"button\"></param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInput.GetMouseButtonUp(System.Int32)\">\n      <summary>\n        <para>Interface to Input.GetMouseButtonUp. Can be overridden to provide custom input instead of using the Input class.</para>\n      </summary>\n      <param name=\"button\"></param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInput.GetTouch(System.Int32)\">\n      <summary>\n        <para>Interface to Input.GetTouch. Can be overridden to provide custom input instead of using the Input class.</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.BaseInputModule\">\n      <summary>\n        <para>A base module that raises events and sends them to GameObjects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.BaseInputModule.input\">\n      <summary>\n        <para>The current BaseInput being used by the input module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.BaseInputModule.inputOverride\">\n      <summary>\n        <para>Used to override the default BaseInput for the input module.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInputModule.ActivateModule\">\n      <summary>\n        <para>Called when the module is activated. Override this if you want custom code to execute when you activate your module.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInputModule.DeactivateModule\">\n      <summary>\n        <para>Called when the module is deactivated. Override this if you want custom code to execute when you deactivate your module.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInputModule.DetermineMoveDirection(System.Single,System.Single)\">\n      <summary>\n        <para>Given an input movement, determine the best MoveDirection.</para>\n      </summary>\n      <param name=\"x\">X movement.</param>\n      <param name=\"y\">Y movement.</param>\n      <param name=\"deadZone\">Dead zone.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInputModule.DetermineMoveDirection(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Given an input movement, determine the best MoveDirection.</para>\n      </summary>\n      <param name=\"x\">X movement.</param>\n      <param name=\"y\">Y movement.</param>\n      <param name=\"deadZone\">Dead zone.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInputModule.FindCommonRoot(UnityEngine.GameObject,UnityEngine.GameObject)\">\n      <summary>\n        <para>Given 2 GameObjects, return a common root GameObject (or null).</para>\n      </summary>\n      <param name=\"g1\"></param>\n      <param name=\"g2\"></param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInputModule.FindFirstRaycast(System.Collections.Generic.List`1&lt;UnityEngine.EventSystems.RaycastResult&gt;)\">\n      <summary>\n        <para>Return the first valid RaycastResult.</para>\n      </summary>\n      <param name=\"candidates\"></param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInputModule.GetAxisEventData(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Given some input data generate an AxisEventData that can be used by the event system.</para>\n      </summary>\n      <param name=\"x\">X movement.</param>\n      <param name=\"y\">Y movement.</param>\n      <param name=\"moveDeadZone\">Dead Zone.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInputModule.GetBaseEventData\">\n      <summary>\n        <para>Generate a BaseEventData that can be used by the EventSystem.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInputModule.HandlePointerExitAndEnter(UnityEngine.EventSystems.PointerEventData,UnityEngine.GameObject)\">\n      <summary>\n        <para>Handle sending enter and exit events when a new enter targer is found.</para>\n      </summary>\n      <param name=\"currentPointerData\"></param>\n      <param name=\"newEnterTarget\"></param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInputModule.IsModuleSupported\">\n      <summary>\n        <para>Check to see if the module is supported. Override this if you have a platfrom specific module (eg. TouchInputModule that you do not want to activate on standalone.</para>\n      </summary>\n      <returns>\n        <para>Is the module supported.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInputModule.IsPointerOverGameObject(System.Int32)\">\n      <summary>\n        <para>Is the pointer with the given ID over an EventSystem object?</para>\n      </summary>\n      <param name=\"pointerId\">Pointer ID.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInputModule.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInputModule.OnEnable\">\n      <summary>\n        <para>See MonoBehaviour.OnEnable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInputModule.Process\">\n      <summary>\n        <para>Process the current tick for the module.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInputModule.ShouldActivateModule\">\n      <summary>\n        <para>Should be activated.</para>\n      </summary>\n      <returns>\n        <para>Should the module be activated.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseInputModule.UpdateModule\">\n      <summary>\n        <para>Update the internal state of the Module.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.BaseRaycaster\">\n      <summary>\n        <para>Base class for any RayCaster.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.BaseRaycaster.eventCamera\">\n      <summary>\n        <para>The camera that will generate rays for this raycaster.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.BaseRaycaster.priority\">\n      <summary>\n        <para>Priority of the caster relative to other casters.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.BaseRaycaster.renderOrderPriority\">\n      <summary>\n        <para>Priority of the raycaster based upon render order.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.BaseRaycaster.sortOrderPriority\">\n      <summary>\n        <para>Priority of the raycaster based upon sort order.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseRaycaster.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.BaseRaycaster.Raycast(UnityEngine.EventSystems.PointerEventData,System.Collections.Generic.List`1&lt;UnityEngine.EventSystems.RaycastResult&gt;)\">\n      <summary>\n        <para>Raycast against the scene.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n      <param name=\"resultAppendList\">List of hit Objects.</param>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.EventHandle\">\n      <summary>\n        <para>Enum that tracks event State.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventHandle.Unused\">\n      <summary>\n        <para>Unused.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventHandle.Used\">\n      <summary>\n        <para>Used.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.EventSystem\">\n      <summary>\n        <para>Handles input, raycasting, and sending events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.EventSystem.alreadySelecting\">\n      <summary>\n        <para>Returns true if the EventSystem is already in a SetSelectedGameObject.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.EventSystem.current\">\n      <summary>\n        <para>Return the current EventSystem.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.EventSystem.currentInputModule\">\n      <summary>\n        <para>The currently active EventSystems.BaseInputModule.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.EventSystem.currentSelectedGameObject\">\n      <summary>\n        <para>The GameObject currently considered active by the EventSystem.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.EventSystem.firstSelectedGameObject\">\n      <summary>\n        <para>The GameObject that was selected first.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.EventSystem.isFocused\">\n      <summary>\n        <para>Flag to say weather the EventSystem thinks it should be paused or not based upon focused state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.EventSystem.pixelDragThreshold\">\n      <summary>\n        <para>The soft area for dragging in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.EventSystem.sendNavigationEvents\">\n      <summary>\n        <para>Should the EventSystem allow navigation events (move  submit  cancel).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventSystem.IsPointerOverGameObject\">\n      <summary>\n        <para>Is the pointer with the given ID over an EventSystem object?</para>\n      </summary>\n      <param name=\"pointerId\">Pointer (touch / mouse) ID.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventSystem.IsPointerOverGameObject(System.Int32)\">\n      <summary>\n        <para>Is the pointer with the given ID over an EventSystem object?</para>\n      </summary>\n      <param name=\"pointerId\">Pointer (touch / mouse) ID.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventSystem.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventSystem.RaycastAll(UnityEngine.EventSystems.PointerEventData,System.Collections.Generic.List`1&lt;UnityEngine.EventSystems.RaycastResult&gt;)\">\n      <summary>\n        <para>Raycast into the scene using all configured BaseRaycasters.</para>\n      </summary>\n      <param name=\"eventData\">Current pointer data.</param>\n      <param name=\"raycastResults\">List of 'hits' to populate.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventSystem.SetSelectedGameObject(UnityEngine.GameObject,UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Set the GameObject as selected. Will send an OnDeselect the the old selected object and OnSelect to the new selected object.</para>\n      </summary>\n      <param name=\"selected\">GameObject to select.</param>\n      <param name=\"pointer\">Associated EventData.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventSystem.UpdateModules\">\n      <summary>\n        <para>Recalculate the internal list of BaseInputModules.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.EventTrigger\">\n      <summary>\n        <para>Receives events from the EventSystem and calls registered functions for each event.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTrigger.delegates\">\n      <summary>\n        <para>All the functions registered in this EventTrigger (deprecated).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.EventTrigger.triggers\">\n      <summary>\n        <para>All the functions registered in this EventTrigger.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.EventTrigger.Entry\">\n      <summary>\n        <para>An Entry in the EventSystem delegates list.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTrigger.Entry.callback\">\n      <summary>\n        <para>The desired TriggerEvent to be Invoked.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTrigger.Entry.eventID\">\n      <summary>\n        <para>What type of event is the associated callback listening for.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventTrigger.OnBeginDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Called before a drag is started.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventTrigger.OnCancel(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Called by the EventSystem when a Cancel event occurs.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventTrigger.OnDeselect(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Called by the EventSystem when a new object is being selected.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventTrigger.OnDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Called by the EventSystem every time the pointer is moved during dragging.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventTrigger.OnDrop(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Called by the EventSystem when an object accepts a drop.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventTrigger.OnEndDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Called by the EventSystem once dragging ends.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventTrigger.OnInitializePotentialDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Called by the EventSystem when a drag has been found, but before it is valid to begin the drag.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventTrigger.OnMove(UnityEngine.EventSystems.AxisEventData)\">\n      <summary>\n        <para>Called by the EventSystem when a Move event occurs.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventTrigger.OnPointerClick(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Called by the EventSystem when a Click event occurs.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventTrigger.OnPointerDown(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Called by the EventSystem when a PointerDown event occurs.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventTrigger.OnPointerEnter(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Called by the EventSystem when the pointer enters the object associated with this EventTrigger.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventTrigger.OnPointerExit(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Called by the EventSystem when the pointer exits the object associated with this EventTrigger.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventTrigger.OnPointerUp(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Called by the EventSystem when a PointerUp event occurs.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventTrigger.OnScroll(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Called by the EventSystem when a Scroll event occurs.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventTrigger.OnSelect(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Called by the EventSystem when a Select event occurs.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventTrigger.OnSubmit(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Called by the EventSystem when a Submit event occurs.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.EventTrigger.OnUpdateSelected(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Called by the EventSystem when the object associated with this EventTrigger is updated.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.EventTrigger.TriggerEvent\">\n      <summary>\n        <para>UnityEvent class for Triggers.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.EventTriggerType\">\n      <summary>\n        <para>The type of event the TriggerEvent is intercepting.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTriggerType.BeginDrag\">\n      <summary>\n        <para>Intercepts IBeginDragHandler.OnBeginDrag.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTriggerType.Cancel\">\n      <summary>\n        <para>Intercepts ICancelHandler.OnCancel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTriggerType.Deselect\">\n      <summary>\n        <para>Intercepts a IDeselectHandler.OnDeselect.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTriggerType.Drag\">\n      <summary>\n        <para>Intercepts a IDragHandler.OnDrag.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTriggerType.Drop\">\n      <summary>\n        <para>Intercepts a IDropHandler.OnDrop.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTriggerType.EndDrag\">\n      <summary>\n        <para>Intercepts IEndDragHandler.OnEndDrag.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTriggerType.InitializePotentialDrag\">\n      <summary>\n        <para>Intercepts IInitializePotentialDrag.InitializePotentialDrag.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTriggerType.Move\">\n      <summary>\n        <para>Intercepts a IMoveHandler.OnMove.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTriggerType.PointerClick\">\n      <summary>\n        <para>Intercepts a IPointerClickHandler.OnPointerClick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTriggerType.PointerDown\">\n      <summary>\n        <para>Intercepts a IPointerDownHandler.OnPointerDown.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTriggerType.PointerEnter\">\n      <summary>\n        <para>Intercepts a IPointerEnterHandler.OnPointerEnter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTriggerType.PointerExit\">\n      <summary>\n        <para>Intercepts a IPointerExitHandler.OnPointerExit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTriggerType.PointerUp\">\n      <summary>\n        <para>Intercepts a IPointerUpHandler.OnPointerUp.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTriggerType.Scroll\">\n      <summary>\n        <para>Intercepts a IScrollHandler.OnScroll.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTriggerType.Select\">\n      <summary>\n        <para>Intercepts a ISelectHandler.OnSelect.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTriggerType.Submit\">\n      <summary>\n        <para>Intercepts ISubmitHandler.Submit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.EventTriggerType.UpdateSelected\">\n      <summary>\n        <para>Intercepts a IUpdateSelectedHandler.OnUpdateSelected.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.ExecuteEvents\">\n      <summary>\n        <para>Helper class that can be used to send IEventSystemHandler events to GameObjects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.ExecuteEvents.beginDragHandler\">\n      <summary>\n        <para>IBeginDragHandler execute helper function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.ExecuteEvents.cancelHandler\">\n      <summary>\n        <para>ICancelHandler execute helper function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.ExecuteEvents.deselectHandler\">\n      <summary>\n        <para>IDeselectHandler execute helper function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.ExecuteEvents.dragHandler\">\n      <summary>\n        <para>IDragHandler execute helper function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.ExecuteEvents.dropHandler\">\n      <summary>\n        <para>IDropHandler execute helper function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.ExecuteEvents.endDragHandler\">\n      <summary>\n        <para>IEndDragHandler execute helper function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.ExecuteEvents.initializePotentialDrag\">\n      <summary>\n        <para>IInitializePotentialDragHandler execute helper function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.ExecuteEvents.moveHandler\">\n      <summary>\n        <para>IMoveHandler execute helper function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.ExecuteEvents.pointerClickHandler\">\n      <summary>\n        <para>IPointerClickHandler execute helper function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.ExecuteEvents.pointerDownHandler\">\n      <summary>\n        <para>IPointerDownHandler execute helper function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.ExecuteEvents.pointerEnterHandler\">\n      <summary>\n        <para>IPointerEnterHandler execute helper function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.ExecuteEvents.pointerExitHandler\">\n      <summary>\n        <para>IPointerExitHandler execute helper function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.ExecuteEvents.pointerUpHandler\">\n      <summary>\n        <para>IPointerUpHandler execute helper function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.ExecuteEvents.scrollHandler\">\n      <summary>\n        <para>IScrollHandler execute helper function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.ExecuteEvents.selectHandler\">\n      <summary>\n        <para>ISelectHandler execute helper function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.ExecuteEvents.submitHandler\">\n      <summary>\n        <para>ISubmitHandler execute helper function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.ExecuteEvents.updateSelectedHandler\">\n      <summary>\n        <para>IUpdateSelectedHandler execute helper function.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.ExecuteEvents.CanHandleEvent(UnityEngine.GameObject)\">\n      <summary>\n        <para>Can the given GameObject handle the IEventSystemHandler of type T.</para>\n      </summary>\n      <param name=\"go\">GameObject.</param>\n      <returns>\n        <para>Can Handle.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.ExecuteEvents.EventFunction_1\">\n      <summary>\n        <para>Function definition for an EventFunction that is used to map a given EventInterface into a specific event call.</para>\n      </summary>\n      <param name=\"handler\"></param>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.ExecuteEvents.Execute(UnityEngine.GameObject,UnityEngine.EventSystems.BaseEventData,UnityEngine.EventSystems.ExecuteEvents/EventFunction`1&lt;T&gt;)\">\n      <summary>\n        <para>Execute the event of type T : IEventSystemHandler on  GameObject.</para>\n      </summary>\n      <param name=\"target\">Target GameObject.</param>\n      <param name=\"eventData\">Data associated with the Executing event.</param>\n      <param name=\"functor\">Function to execute on the gameObject components.</param>\n      <returns>\n        <para>Was there a handler for the event.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.ExecuteEvents.ExecuteHierarchy(UnityEngine.GameObject,UnityEngine.EventSystems.BaseEventData,UnityEngine.EventSystems.ExecuteEvents/EventFunction`1&lt;T&gt;)\">\n      <summary>\n        <para>Recurse up the hierarchy calling Execute&lt;T&gt; until there is a GameObject that can handle the event.</para>\n      </summary>\n      <param name=\"root\">Start GameObject.</param>\n      <param name=\"eventData\">Data associated with the Executing event.</param>\n      <param name=\"callbackFunction\">Function to execute on the gameObject components.</param>\n      <returns>\n        <para>GameObject that handled the event.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.ExecuteEvents.GetEventHandler(UnityEngine.GameObject)\">\n      <summary>\n        <para>Traverse the object hierarchy starting at root, and return the GameObject which implements the event handler of type &lt;T&gt;.</para>\n      </summary>\n      <param name=\"root\">Root GameObject.</param>\n      <returns>\n        <para>Handling GameObject.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.ExecuteEvents.ValidateEventData(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Attempt to convert the data to type T. If conversion fails an ArgumentException is thrown.</para>\n      </summary>\n      <param name=\"data\">Data to validate.</param>\n      <returns>\n        <para>Data as T.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.EventSystems.IBeginDragHandler\">\n      <summary>\n        <para>Interface to implement if you wish to receive OnBeginDrag callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.IBeginDragHandler.OnBeginDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Called by a BaseInputModule before a drag is started.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"?:UnityEngine.EventSystems.ICancelHandler\">\n      <summary>\n        <para>Interface to implement if you wish to receive OnCancel callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.ICancelHandler.OnCancel(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Called by a BaseInputModule when a Cancel event occurs.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"?:UnityEngine.EventSystems.IDeselectHandler\">\n      <summary>\n        <para>Interface to implement if you wish to receive OnDeselect callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.IDeselectHandler.OnDeselect(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Called by the EventSystem when a new object is being selected.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"?:UnityEngine.EventSystems.IDragHandler\">\n      <summary>\n        <para>Interface to implement if you wish to receive OnDrag callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.IDragHandler.OnDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>When draging is occuring this will be called every time the cursor is moved.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"?:UnityEngine.EventSystems.IDropHandler\">\n      <summary>\n        <para>Interface to implement if you wish to receive OnDrop callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.IDropHandler.OnDrop(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Called by a BaseInputModule on a target that can accept a drop.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"?:UnityEngine.EventSystems.IEndDragHandler\">\n      <summary>\n        <para>Interface to implement if you wish to receive OnEndDrag callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.IEndDragHandler.OnEndDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Called by a BaseInputModule when a drag is ended.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"?:UnityEngine.EventSystems.IEventSystemHandler\">\n      <summary>\n        <para>Base class that all EventSystem events inherit from.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.EventSystems.IInitializePotentialDragHandler\">\n      <summary>\n        <para>Interface to implement if you wish to receive OnInitializePotentialDrag callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.IInitializePotentialDragHandler.OnInitializePotentialDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Called by a BaseInputModule when a drag has been found but before it is valid to begin the drag.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"?:UnityEngine.EventSystems.IMoveHandler\">\n      <summary>\n        <para>Interface to implement if you wish to receive OnMove callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.IMoveHandler.OnMove(UnityEngine.EventSystems.AxisEventData)\">\n      <summary>\n        <para>Called by a BaseInputModule when a move event occurs.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"?:UnityEngine.EventSystems.IPointerClickHandler\">\n      <summary>\n        <para>Interface to implement if you wish to receive OnPointerClick callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.IPointerClickHandler.OnPointerClick(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Use this callback to detect clicks.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"?:UnityEngine.EventSystems.IPointerDownHandler\">\n      <summary>\n        <para>Interface to implement if you wish to receive OnPointerDown callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.IPointerDownHandler.OnPointerDown(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"?:UnityEngine.EventSystems.IPointerEnterHandler\">\n      <summary>\n        <para>Interface to implement if you wish to receive OnPointerEnter callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.IPointerEnterHandler.OnPointerEnter(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"?:UnityEngine.EventSystems.IPointerExitHandler\">\n      <summary>\n        <para>Interface to implement if you wish to receive OnPointerExit callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.IPointerExitHandler.OnPointerExit(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"?:UnityEngine.EventSystems.IPointerUpHandler\">\n      <summary>\n        <para>Interface to implement if you wish to receive OnPointerUp callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.IPointerUpHandler.OnPointerUp(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"?:UnityEngine.EventSystems.IScrollHandler\">\n      <summary>\n        <para>Interface to implement if you wish to receive OnScroll callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.IScrollHandler.OnScroll(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"?:UnityEngine.EventSystems.ISelectHandler\">\n      <summary>\n        <para>Interface to implement if you wish to receive OnSelect callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.ISelectHandler.OnSelect(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"?:UnityEngine.EventSystems.ISubmitHandler\">\n      <summary>\n        <para>Interface to implement if you wish to receive OnSubmit callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.ISubmitHandler.OnSubmit(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"?:UnityEngine.EventSystems.IUpdateSelectedHandler\">\n      <summary>\n        <para>Interface to implement if you wish to receive OnUpdateSelected callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.IUpdateSelectedHandler.OnUpdateSelected(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Called by the EventSystem when the object associated with this EventTrigger is updated.</para>\n      </summary>\n      <param name=\"eventData\">Current event data.</param>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.MoveDirection\">\n      <summary>\n        <para>This is an 8 direction movement enum.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.MoveDirection.Down\">\n      <summary>\n        <para>The Down State of MoveDirection. Assign functionality for moving in a downward direction.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.MoveDirection.Left\">\n      <summary>\n        <para>This is the Left state of MoveDirection.  Assign functionality for moving to the left.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.MoveDirection.None\">\n      <summary>\n        <para>This is the None state. Assign functionality that stops movement.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.MoveDirection.Right\">\n      <summary>\n        <para>This is the Right state of MoveDirection. Assign functionality for moving to the right.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.MoveDirection.Up\">\n      <summary>\n        <para>This is the Up state of MoveDirection.  Assign functionality for moving in an upward direction.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.Physics2DRaycaster\">\n      <summary>\n        <para>Raycaster for casting against 2D Physics components.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.Physics2DRaycaster.Raycast(UnityEngine.EventSystems.PointerEventData,System.Collections.Generic.List`1&lt;UnityEngine.EventSystems.RaycastResult&gt;)\">\n      <summary>\n        <para>See: BaseRaycaster.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n      <param name=\"resultAppendList\"></param>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.PhysicsRaycaster\">\n      <summary>\n        <para>Raycaster for casting against 3D Physics components.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PhysicsRaycaster.depth\">\n      <summary>\n        <para>Get the depth of the configured camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PhysicsRaycaster.eventCamera\">\n      <summary>\n        <para>Get the camera that is used for this module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PhysicsRaycaster.eventMask\">\n      <summary>\n        <para>Mask of allowed raycast events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PhysicsRaycaster.finalEventMask\">\n      <summary>\n        <para>Logical and of Camera mask and eventMask.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PhysicsRaycaster.maxRayIntersections\">\n      <summary>\n        <para>Max number of ray intersection allowed to be found.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.PhysicsRaycaster.ComputeRayAndDistance(UnityEngine.EventSystems.PointerEventData,UnityEngine.Ray&amp;,System.Single&amp;)\">\n      <summary>\n        <para>Returns a ray going from camera through the event position and the distance between the near and far clipping planes along that ray.</para>\n      </summary>\n      <param name=\"eventData\">The pointer event for which we will cast a ray.</param>\n      <param name=\"ray\">The ray.</param>\n      <param name=\"distanceToClipPlane\">The distance between the near and far clipping planes along the ray.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.PhysicsRaycaster.Raycast(UnityEngine.EventSystems.PointerEventData,System.Collections.Generic.List`1&lt;UnityEngine.EventSystems.RaycastResult&gt;)\">\n      <summary>\n        <para>See: BaseRaycaster.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n      <param name=\"resultAppendList\"></param>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.PointerEventData\">\n      <summary>\n        <para>Event payload associated with pointer (mouse / touch) events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.button\">\n      <summary>\n        <para>The EventSystems.PointerEventData.InputButton for this event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.clickCount\">\n      <summary>\n        <para>Number of clicks in a row.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.clickTime\">\n      <summary>\n        <para>The last time a click event was sent.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.delta\">\n      <summary>\n        <para>Pointer delta since last update.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.dragging\">\n      <summary>\n        <para>Is a drag operation currently occuring.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.enterEventCamera\">\n      <summary>\n        <para>The camera associated with the last OnPointerEnter event.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.PointerEventData.hovered\">\n      <summary>\n        <para>List of objects in the hover stack.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.lastPress\">\n      <summary>\n        <para>The GameObject for the last press event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.pointerCurrentRaycast\">\n      <summary>\n        <para>RaycastResult associated with the current event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.pointerDrag\">\n      <summary>\n        <para>The object that is receiving OnDrag.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.pointerEnter\">\n      <summary>\n        <para>The object that received 'OnPointerEnter'.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.pointerId\">\n      <summary>\n        <para>Id of the pointer (touch id).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.pointerPress\">\n      <summary>\n        <para>The GameObject that received the OnPointerDown.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.pointerPressRaycast\">\n      <summary>\n        <para>RaycastResult associated with the pointer press.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.position\">\n      <summary>\n        <para>Current pointer position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.pressEventCamera\">\n      <summary>\n        <para>The camera associated with the last OnPointerPress event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.pressPosition\">\n      <summary>\n        <para>Position of the press.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.rawPointerPress\">\n      <summary>\n        <para>The object that the press happened on even if it can not handle the press event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.scrollDelta\">\n      <summary>\n        <para>The amount of scroll since the last update.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.PointerEventData.useDragThreshold\">\n      <summary>\n        <para>Should a drag threshold be used?</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.PointerEventData.FramePressState\">\n      <summary>\n        <para>The state of a press for the given frame.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.PointerEventData.FramePressState.NotChanged\">\n      <summary>\n        <para>Same as last frame.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.PointerEventData.FramePressState.Pressed\">\n      <summary>\n        <para>Button was pressed this frame.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.PointerEventData.FramePressState.PressedAndReleased\">\n      <summary>\n        <para>Button was pressed and released this frame.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.PointerEventData.FramePressState.Released\">\n      <summary>\n        <para>Button was released this frame.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.PointerEventData.InputButton\">\n      <summary>\n        <para>Input press tracking.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.PointerEventData.InputButton.Left\">\n      <summary>\n        <para>Left button.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.PointerEventData.InputButton.Middle\">\n      <summary>\n        <para>Middle button.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.PointerEventData.InputButton.Right\">\n      <summary>\n        <para>Right button.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.PointerEventData.IsPointerMoving\">\n      <summary>\n        <para>Is the pointer moving.</para>\n      </summary>\n      <returns>\n        <para>Moving.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.PointerEventData.IsScrolling\">\n      <summary>\n        <para>Is scroll being used on the input device.</para>\n      </summary>\n      <returns>\n        <para>Scrolling.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.PointerInputModule\">\n      <summary>\n        <para>A BaseInputModule for pointer input.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.PointerInputModule.kFakeTouchesId\">\n      <summary>\n        <para>Touch id for when simulating touches on a non touch device.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.PointerInputModule.kMouseLeftId\">\n      <summary>\n        <para>Id of the cached left mouse pointer event.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.PointerInputModule.kMouseMiddleId\">\n      <summary>\n        <para>Id of the cached middle mouse pointer event.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.PointerInputModule.kMouseRightId\">\n      <summary>\n        <para>Id of the cached right mouse pointer event.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.PointerInputModule.ClearSelection\">\n      <summary>\n        <para>Clear all pointers and deselect any selected objects in the EventSystem.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.PointerInputModule.CopyFromTo(UnityEngine.EventSystems.PointerEventData,UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Copy one PointerEventData to another.</para>\n      </summary>\n      <param name=\"from\"></param>\n      <param name=\"to\"></param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.PointerInputModule.DeselectIfSelectionChanged(UnityEngine.GameObject,UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Deselect the current selected GameObject if the currently pointed-at GameObject is different.</para>\n      </summary>\n      <param name=\"currentOverGo\">The GameObject the pointer is currently over.</param>\n      <param name=\"pointerEvent\">Current event data.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.PointerInputModule.GetLastPointerEventData(System.Int32)\">\n      <summary>\n        <para>Return the last PointerEventData for the given touch / mouse id.</para>\n      </summary>\n      <param name=\"id\"></param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.PointerInputModule.GetMousePointerEventData\">\n      <summary>\n        <para>Return the current MouseState.</para>\n      </summary>\n      <param name=\"id\"></param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.PointerInputModule.GetMousePointerEventData(System.Int32)\">\n      <summary>\n        <para>Return the current MouseState.</para>\n      </summary>\n      <param name=\"id\"></param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.PointerInputModule.GetPointerData(System.Int32,UnityEngine.EventSystems.PointerEventData&amp;,System.Boolean)\">\n      <summary>\n        <para>Search the cache for currently active pointers, return true if found.</para>\n      </summary>\n      <param name=\"id\">Touch ID.</param>\n      <param name=\"data\">Found data.</param>\n      <param name=\"create\">If not found should it be created.</param>\n      <returns>\n        <para>True if a pointer is found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.PointerInputModule.GetTouchPointerEventData(UnityEngine.Touch,System.Boolean&amp;,System.Boolean&amp;)\">\n      <summary>\n        <para>Given a touch populate the PointerEventData and return if we are pressed or released.</para>\n      </summary>\n      <param name=\"input\">Processing Touch.</param>\n      <param name=\"pressed\">Are we pressed.</param>\n      <param name=\"released\">Are we released.</param>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.PointerInputModule.MouseButtonEventData\">\n      <summary>\n        <para>Information about a mouse button event.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.PointerInputModule.MouseButtonEventData.buttonData\">\n      <summary>\n        <para>Pointer data associated with the mouse event.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.PointerInputModule.MouseButtonEventData.buttonState\">\n      <summary>\n        <para>The state of the button this frame.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.PointerInputModule.MouseButtonEventData.PressedThisFrame\">\n      <summary>\n        <para>Was the button pressed this frame?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.PointerInputModule.MouseButtonEventData.ReleasedThisFrame\">\n      <summary>\n        <para>Was the button released this frame?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.PointerInputModule.ProcessDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Process the drag for the current frame with the given pointer event.</para>\n      </summary>\n      <param name=\"pointerEvent\"></param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.PointerInputModule.ProcessMove(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Process movement for the current frame with the given pointer event.</para>\n      </summary>\n      <param name=\"pointerEvent\"></param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.PointerInputModule.RemovePointerData(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Remove the PointerEventData from the cache.</para>\n      </summary>\n      <param name=\"data\"></param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.PointerInputModule.StateForMouseButton(System.Int32)\">\n      <summary>\n        <para>Given a mouse button return the current state for the frame.</para>\n      </summary>\n      <param name=\"buttonId\">Mouse Button id.</param>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.RaycastResult\">\n      <summary>\n        <para>A hit result from a BaseRaycaster.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.RaycastResult.depth\">\n      <summary>\n        <para>The relative depth of the element.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.RaycastResult.distance\">\n      <summary>\n        <para>Distance to the hit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.RaycastResult.gameObject\">\n      <summary>\n        <para>The GameObject that was hit by the raycast.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.RaycastResult.index\">\n      <summary>\n        <para>Hit index.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.RaycastResult.isValid\">\n      <summary>\n        <para>Is there an associated module and a hit GameObject.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.RaycastResult.module\">\n      <summary>\n        <para>BaseInputModule that raised the hit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.RaycastResult.screenPosition\">\n      <summary>\n        <para>The screen position from which the raycast was generated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.RaycastResult.sortingLayer\">\n      <summary>\n        <para>The SortingLayer of the hit object.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.RaycastResult.sortingOrder\">\n      <summary>\n        <para>The SortingOrder for the hit object.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.RaycastResult.worldNormal\">\n      <summary>\n        <para>The normal at the hit location of the raycast.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventSystems.RaycastResult.worldPosition\">\n      <summary>\n        <para>The world position of the where the raycast has hit.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.RaycastResult.Clear\">\n      <summary>\n        <para>Reset the result.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.StandaloneInputModule\">\n      <summary>\n        <para>A BaseInputModule designed for mouse  keyboard  controller input.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.StandaloneInputModule.allowActivationOnMobileDevice\">\n      <summary>\n        <para>Is this module allowed to be activated if you are on mobile.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.StandaloneInputModule.cancelButton\">\n      <summary>\n        <para>Input manager name for the 'cancel' button.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.StandaloneInputModule.forceModuleActive\">\n      <summary>\n        <para>Force this module to be active.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.StandaloneInputModule.horizontalAxis\">\n      <summary>\n        <para>Input manager name for the horizontal axis button.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.StandaloneInputModule.inputActionsPerSecond\">\n      <summary>\n        <para>Number of keyboard / controller inputs allowed per second.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.StandaloneInputModule.repeatDelay\">\n      <summary>\n        <para>Delay in seconds before the input actions per second repeat rate takes effect.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.StandaloneInputModule.submitButton\">\n      <summary>\n        <para>Maximum number of input events handled per second.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.StandaloneInputModule.verticalAxis\">\n      <summary>\n        <para>Input manager name for the vertical axis.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.StandaloneInputModule.ActivateModule\">\n      <summary>\n        <para>See BaseInputModule.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.StandaloneInputModule.DeactivateModule\">\n      <summary>\n        <para>See BaseInputModule.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.StandaloneInputModule.IsModuleSupported\">\n      <summary>\n        <para>See BaseInputModule.</para>\n      </summary>\n      <returns>\n        <para>Supported.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.StandaloneInputModule.Process\">\n      <summary>\n        <para>See BaseInputModule.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.StandaloneInputModule.ProcessMouseEvent\">\n      <summary>\n        <para>Iterate through all the different mouse events.</para>\n      </summary>\n      <param name=\"id\">The mouse pointer Event data id to get.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.StandaloneInputModule.ProcessMouseEvent(System.Int32)\">\n      <summary>\n        <para>Iterate through all the different mouse events.</para>\n      </summary>\n      <param name=\"id\">The mouse pointer Event data id to get.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.StandaloneInputModule.ProcessMousePress(UnityEngine.EventSystems.PointerInputModule/MouseButtonEventData)\">\n      <summary>\n        <para>Calculate and process any mouse button state changes.</para>\n      </summary>\n      <param name=\"data\">The data pertaining to the current mouse state.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.StandaloneInputModule.ProcessTouchPress(UnityEngine.EventSystems.PointerEventData,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>This method is called by Unity whenever a touch event is processed. Override this method with a custom implementation to process touch events yourself.</para>\n      </summary>\n      <param name=\"pointerEvent\">Event data relating to the touch event, such as position and ID to be passed to the touch event destination object.</param>\n      <param name=\"pressed\">This is true for the first frame of a touch event, and false thereafter. This can therefore be used to determine the instant a touch event occurred.</param>\n      <param name=\"released\">This is true only for the last frame of a touch event.</param>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.StandaloneInputModule.SendMoveEventToSelectedObject\">\n      <summary>\n        <para>Calculate and send a move event to the current selected object.</para>\n      </summary>\n      <returns>\n        <para>If the move event was used by the selected object.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.StandaloneInputModule.SendSubmitEventToSelectedObject\">\n      <summary>\n        <para>Calculate and send a submit event to the current selected object.</para>\n      </summary>\n      <returns>\n        <para>If the submit event was used by the selected object.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.StandaloneInputModule.SendUpdateEventToSelectedObject\">\n      <summary>\n        <para>Send a update event to the currently selected object.</para>\n      </summary>\n      <returns>\n        <para>If the update event was used by the selected object.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.StandaloneInputModule.ShouldActivateModule\">\n      <summary>\n        <para>See BaseInputModule.</para>\n      </summary>\n      <returns>\n        <para>Should activate.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.StandaloneInputModule.UpdateModule\">\n      <summary>\n        <para>See BaseInputModule.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.TouchInputModule\">\n      <summary>\n        <para>Input module used for touch based input.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.TouchInputModule.allowActivationOnStandalone\">\n      <summary>\n        <para>Can this module be activated on a standalone platform?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EventSystems.TouchInputModule.forceModuleActive\">\n      <summary>\n        <para>Force this module to be active.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.TouchInputModule.DeactivateModule\">\n      <summary>\n        <para>See BaseInputModule.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.TouchInputModule.IsModuleSupported\">\n      <summary>\n        <para>See BaseInputModule.</para>\n      </summary>\n      <returns>\n        <para>Supported.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.TouchInputModule.Process\">\n      <summary>\n        <para>See BaseInputModule.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.TouchInputModule.ShouldActivateModule\">\n      <summary>\n        <para>See BaseInputModule.</para>\n      </summary>\n      <returns>\n        <para>Should activate.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.TouchInputModule.UpdateModule\">\n      <summary>\n        <para>See BaseInputModule.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EventSystems.UIBehaviour\">\n      <summary>\n        <para>Base behaviour that has protected implementations of Unity lifecycle functions.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.UIBehaviour.Awake\">\n      <summary>\n        <para>See MonoBehaviour.Awake.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.UIBehaviour.IsActive\">\n      <summary>\n        <para>Returns true if the GameObject and the Component are active.</para>\n      </summary>\n      <returns>\n        <para>Active.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.UIBehaviour.IsDestroyed\">\n      <summary>\n        <para>Returns true if the native representation of the behaviour has been destroyed.</para>\n      </summary>\n      <returns>\n        <para>True if Destroyed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.UIBehaviour.OnBeforeTransformParentChanged\">\n      <summary>\n        <para>See MonoBehaviour.OnBeforeTransformParentChanged.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.UIBehaviour.OnCanvasGroupChanged\">\n      <summary>\n        <para>See MonoBehaviour.OnCanvasGroupChanged.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.UIBehaviour.OnCanvasHierarchyChanged\">\n      <summary>\n        <para>Called when the state of the parent Canvas is changed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.UIBehaviour.OnDestroy\">\n      <summary>\n        <para>See MonoBehaviour.OnDestroy.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.UIBehaviour.OnDidApplyAnimationProperties\">\n      <summary>\n        <para>See UI.LayoutGroup.OnDidApplyAnimationProperties.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.UIBehaviour.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.UIBehaviour.OnEnable\">\n      <summary>\n        <para>See MonoBehaviour.OnEnable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.UIBehaviour.OnRectTransformDimensionsChange\">\n      <summary>\n        <para>This callback is called if an associated RectTransform has its dimensions changed. The call is also made to all child rect transforms, even if the child transform itself doesn't change - as it could have, depending on its anchoring.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.UIBehaviour.OnTransformParentChanged\">\n      <summary>\n        <para>See MonoBehaviour.OnRectTransformParentChanged.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.UIBehaviour.OnValidate\">\n      <summary>\n        <para>See MonoBehaviour.OnValidate.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.UIBehaviour.Reset\">\n      <summary>\n        <para>See MonoBehaviour.Reset.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EventSystems.UIBehaviour.Start\">\n      <summary>\n        <para>See MonoBehaviour.Start.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.AnimationTriggers\">\n      <summary>\n        <para>Structure to store the state of an animation transition on a Selectable.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.AnimationTriggers.disabledTrigger\">\n      <summary>\n        <para>Trigger to send to animator when entering disabled state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.AnimationTriggers.highlightedTrigger\">\n      <summary>\n        <para>Trigger to send to animator when entering highlighted state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.AnimationTriggers.normalTrigger\">\n      <summary>\n        <para>Trigger to send to animator when entering normal state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.AnimationTriggers.pressedTrigger\">\n      <summary>\n        <para>Trigger to send to animator when entering pressed state.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.AspectRatioFitter\">\n      <summary>\n        <para>Resizes a RectTransform to fit a specified aspect ratio.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.AspectRatioFitter.aspectMode\">\n      <summary>\n        <para>The mode to use to enforce the aspect ratio.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.AspectRatioFitter.aspectRatio\">\n      <summary>\n        <para>The aspect ratio to enforce. This means width divided by height.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.AspectRatioFitter.AspectMode\">\n      <summary>\n        <para>Specifies a mode to use to enforce an aspect ratio.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.AspectRatioFitter.AspectMode.EnvelopeParent\">\n      <summary>\n        <para>Sizes the rectangle such that the parent rectangle is fully contained within.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.AspectRatioFitter.AspectMode.FitInParent\">\n      <summary>\n        <para>Sizes the rectangle such that it's fully contained within the parent rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.AspectRatioFitter.AspectMode.HeightControlsWidth\">\n      <summary>\n        <para>Changes the width of the rectangle to match the aspect ratio.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.AspectRatioFitter.AspectMode.None\">\n      <summary>\n        <para>The aspect ratio is not enforced.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.AspectRatioFitter.AspectMode.WidthControlsHeight\">\n      <summary>\n        <para>Changes the height of the rectangle to match the aspect ratio.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.AspectRatioFitter.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.AspectRatioFitter.SetDirty\">\n      <summary>\n        <para>Mark the AspectRatioFitter as dirty.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.AspectRatioFitter.SetLayoutHorizontal\">\n      <summary>\n        <para>Method called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.AspectRatioFitter.SetLayoutVertical\">\n      <summary>\n        <para>Method called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.BaseMeshEffect\">\n      <summary>\n        <para>Base class for effects that modify the generated Mesh.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.BaseMeshEffect.ModifyMesh(UnityEngine.Mesh)\">\n      <summary>\n        <para>See:IMeshModifier.</para>\n      </summary>\n      <param name=\"mesh\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.BaseMeshEffect.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.BaseVertexEffect\">\n      <summary>\n        <para>Base class for effects that modify the the generated Vertex Buffers.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.BaseVertexEffect.ModifyVertices(System.Collections.Generic.List`1&lt;UnityEngine.UIVertex&gt;)\">\n      <summary>\n        <para>See:IVertexModifier.</para>\n      </summary>\n      <param name=\"vertices\"></param>\n    </member>\n    <member name=\"T:UnityEngine.UI.Button\">\n      <summary>\n        <para>A standard button that can be clicked in order to trigger an event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Button.onClick\">\n      <summary>\n        <para>UnityEvent that is triggered when the button is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Button.ButtonClickedEvent\">\n      <summary>\n        <para>Function definition for a button click event.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Button.OnPointerClick(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Registered IPointerClickHandler callback.</para>\n      </summary>\n      <param name=\"eventData\">Data passed in (Typically by the event system).</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Button.OnSubmit(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Registered ISubmitHandler callback.</para>\n      </summary>\n      <param name=\"eventData\">Data passed in (Typically by the event system).</param>\n    </member>\n    <member name=\"T:UnityEngine.UI.CanvasScaler\">\n      <summary>\n        <para>The Canvas Scaler component is used for controlling the overall scale and pixel density of UI elements in the Canvas. This scaling affects everything under the Canvas, including font sizes and image borders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.CanvasScaler.defaultSpriteDPI\">\n      <summary>\n        <para>The pixels per inch to use for sprites that have a 'Pixels Per Unit' setting that matches the 'Reference Pixels Per Unit' setting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.CanvasScaler.dynamicPixelsPerUnit\">\n      <summary>\n        <para>The amount of pixels per unit to use for dynamically created bitmaps in the UI, such as Text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.CanvasScaler.fallbackScreenDPI\">\n      <summary>\n        <para>The DPI to assume if the screen DPI is not known.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.CanvasScaler.matchWidthOrHeight\">\n      <summary>\n        <para>Setting to scale the Canvas to match the width or height of the reference resolution, or a combination.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.CanvasScaler.physicalUnit\">\n      <summary>\n        <para>The physical unit to specify positions and sizes in.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.CanvasScaler.referencePixelsPerUnit\">\n      <summary>\n        <para>If a sprite has this 'Pixels Per Unit' setting, then one pixel in the sprite will cover one unit in the UI.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.CanvasScaler.referenceResolution\">\n      <summary>\n        <para>The resolution the UI layout is designed for.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.CanvasScaler.scaleFactor\">\n      <summary>\n        <para>Scales all UI elements in the Canvas by this factor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.CanvasScaler.screenMatchMode\">\n      <summary>\n        <para>A mode used to scale the canvas area if the aspect ratio of the current resolution doesn't fit the reference resolution.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.CanvasScaler.uiScaleMode\">\n      <summary>\n        <para>Determines how UI elements in the Canvas are scaled.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.CanvasScaler.Handle\">\n      <summary>\n        <para>Method that handles calculations of canvas scaling.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.CanvasScaler.HandleConstantPhysicalSize\">\n      <summary>\n        <para>Handles canvas scaling for a constant physical size.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.CanvasScaler.HandleConstantPixelSize\">\n      <summary>\n        <para>Handles canvas scaling for a constant pixel size.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.CanvasScaler.HandleScaleWithScreenSize\">\n      <summary>\n        <para>Handles canvas scaling that scales with the screen size.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.CanvasScaler.HandleWorldCanvas\">\n      <summary>\n        <para>Handles canvas scaling for world canvas.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.CanvasScaler.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.CanvasScaler.ScaleMode\">\n      <summary>\n        <para>Determines how UI elements in the Canvas are scaled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.CanvasScaler.ScaleMode.ConstantPhysicalSize\">\n      <summary>\n        <para>Using the Constant Physical Size mode, positions and sizes of UI elements are specified in physical units, such as millimeters, points, or picas.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.CanvasScaler.ScaleMode.ConstantPixelSize\">\n      <summary>\n        <para>Using the Constant Pixel Size mode, positions and sizes of UI elements are specified in pixels on the screen.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.CanvasScaler.ScaleMode.ScaleWithScreenSize\">\n      <summary>\n        <para>Using the Scale With Screen Size mode, positions and sizes can be specified according to the pixels of a specified reference resolution.\nIf the current screen resolution is larger than the reference resolution, the Canvas will keep having only the resolution of the reference resolution, but will scale up in order to fit the screen. If the current screen resolution is smaller than the reference resolution, the Canvas will similarly be scaled down to fit.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.CanvasScaler.ScreenMatchMode\">\n      <summary>\n        <para>Scale the canvas area with the width as reference, the height as reference, or something in between.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.CanvasScaler.ScreenMatchMode.Expand\">\n      <summary>\n        <para>Expand the canvas area either horizontally or vertically, so the size of the canvas will never be smaller than the reference.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.CanvasScaler.ScreenMatchMode.MatchWidthOrHeight\">\n      <summary>\n        <para>Scale the canvas area with the width as reference, the height as reference, or something in between.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.CanvasScaler.ScreenMatchMode.Shrink\">\n      <summary>\n        <para>Crop the canvas area either horizontally or vertically, so the size of the canvas will never be larger than the reference.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.CanvasScaler.SetReferencePixelsPerUnit(System.Single)\">\n      <summary>\n        <para>Sets the referencePixelsPerUnit on the Canvas.</para>\n      </summary>\n      <param name=\"referencePixelsPerUnit\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.CanvasScaler.SetScaleFactor(System.Single)\">\n      <summary>\n        <para>Sets the scale factor on the canvas.</para>\n      </summary>\n      <param name=\"scaleFactor\">The scale factor to use.</param>\n    </member>\n    <member name=\"T:UnityEngine.UI.CanvasScaler.Unit\">\n      <summary>\n        <para>Settings used to specify a physical unit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.CanvasScaler.Unit.Centimeters\">\n      <summary>\n        <para>Use centimeters.\nA centimeter is 1/100 of a meter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.CanvasScaler.Unit.Inches\">\n      <summary>\n        <para>Use inches.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.CanvasScaler.Unit.Millimeters\">\n      <summary>\n        <para>Use millimeters.\nA millimeter is 110 of a centimeter, and 11000 of a meter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.CanvasScaler.Unit.Picas\">\n      <summary>\n        <para>Use picas.\nOne pica is 1/6 of an inch.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.CanvasScaler.Unit.Points\">\n      <summary>\n        <para>Use points.\nOne point is 112 of a pica, and 172 of an inch.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.CanvasScaler.Update\">\n      <summary>\n        <para>Handles per-frame checking if the canvas scaling needs to be updated.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.CanvasUpdate\">\n      <summary>\n        <para>Values of 'update' called on a Canvas update.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.CanvasUpdate.LatePreRender\">\n      <summary>\n        <para>Called late, before render.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.CanvasUpdate.Layout\">\n      <summary>\n        <para>Called for layout.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.CanvasUpdate.MaxUpdateValue\">\n      <summary>\n        <para>Max enum value.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.CanvasUpdate.PostLayout\">\n      <summary>\n        <para>Called after layout.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.CanvasUpdate.Prelayout\">\n      <summary>\n        <para>Called before layout.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.CanvasUpdate.PreRender\">\n      <summary>\n        <para>Called before rendering.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.CanvasUpdateRegistry\">\n      <summary>\n        <para>A place where CanvasElements can register themselves for rebuilding.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.CanvasUpdateRegistry.instance\">\n      <summary>\n        <para>Get the singleton registry.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.CanvasUpdateRegistry.IsRebuildingGraphics\">\n      <summary>\n        <para>Are graphics being rebuild.</para>\n      </summary>\n      <returns>\n        <para>Rebuilding graphics.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.CanvasUpdateRegistry.IsRebuildingLayout\">\n      <summary>\n        <para>Is layout being rebuilt?</para>\n      </summary>\n      <returns>\n        <para>Rebuilding layout.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(UnityEngine.UI.ICanvasElement)\">\n      <summary>\n        <para>Rebuild the graphics of the given element.</para>\n      </summary>\n      <param name=\"element\">Element to rebuild.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.CanvasUpdateRegistry.RegisterCanvasElementForLayoutRebuild(UnityEngine.UI.ICanvasElement)\">\n      <summary>\n        <para>Rebuild the layout of the given element.</para>\n      </summary>\n      <param name=\"element\">Element to rebuild.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.CanvasUpdateRegistry.TryRegisterCanvasElementForGraphicRebuild(UnityEngine.UI.ICanvasElement)\">\n      <summary>\n        <para>Rebuild the layout of the given element.</para>\n      </summary>\n      <param name=\"element\">Element to rebuild.</param>\n      <returns>\n        <para>Was the element scheduled.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.CanvasUpdateRegistry.TryRegisterCanvasElementForLayoutRebuild(UnityEngine.UI.ICanvasElement)\">\n      <summary>\n        <para>Was the element scheduled.</para>\n      </summary>\n      <param name=\"element\">Element to rebuild.</param>\n      <returns>\n        <para>Was the element scheduled.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.CanvasUpdateRegistry.UnRegisterCanvasElementForRebuild(UnityEngine.UI.ICanvasElement)\">\n      <summary>\n        <para>Remove the given element from rebuild.</para>\n      </summary>\n      <param name=\"element\">Element to remove.</param>\n    </member>\n    <member name=\"T:UnityEngine.UI.ClipperRegistry\">\n      <summary>\n        <para>Registry class to keep track of all IClippers that exist in the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ClipperRegistry.instance\">\n      <summary>\n        <para>Singleton instance.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ClipperRegistry.Cull\">\n      <summary>\n        <para>Perform the clipping on all registered IClipper.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ClipperRegistry.Register(UnityEngine.UI.IClipper)\">\n      <summary>\n        <para>Register an IClipper.</para>\n      </summary>\n      <param name=\"c\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.ClipperRegistry.Unregister(UnityEngine.UI.IClipper)\">\n      <summary>\n        <para>Unregister an IClipper.</para>\n      </summary>\n      <param name=\"c\"></param>\n    </member>\n    <member name=\"T:UnityEngine.UI.Clipping\">\n      <summary>\n        <para>Utility class to help when clipping using IClipper.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Clipping.FindCullAndClipWorldRect(System.Collections.Generic.List`1&lt;UnityEngine.UI.RectMask2D&gt;,System.Boolean&amp;)\">\n      <summary>\n        <para>Find the Rect to use for clipping.</para>\n      </summary>\n      <param name=\"rectMaskParents\">RectMasks to build the overlap rect from.</param>\n      <param name=\"validRect\">Was there a valid Rect found.</param>\n      <returns>\n        <para>The compound Rect.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.UI.ColorBlock\">\n      <summary>\n        <para>Structure to store the state of a color transition on a Selectable.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ColorBlock.colorMultiplier\">\n      <summary>\n        <para>Multiplier applied to colors (allows brightening greater then base color).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ColorBlock.defaultColorBlock\">\n      <summary>\n        <para>Simple getter for the default ColorBlock.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ColorBlock.disabledColor\">\n      <summary>\n        <para>Disabled Color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ColorBlock.fadeDuration\">\n      <summary>\n        <para>How long a color transition should take.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ColorBlock.highlightedColor\">\n      <summary>\n        <para>Highlighted Color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ColorBlock.normalColor\">\n      <summary>\n        <para>Normal Color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ColorBlock.pressedColor\">\n      <summary>\n        <para>Pressed Color.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.ContentSizeFitter\">\n      <summary>\n        <para>Resizes a RectTransform to fit the size of its content.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ContentSizeFitter.horizontalFit\">\n      <summary>\n        <para>The fit mode to use to determine the width.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ContentSizeFitter.verticalFit\">\n      <summary>\n        <para>The fit mode to use to determine the height.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.ContentSizeFitter.FitMode\">\n      <summary>\n        <para>The size fit mode to use.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.ContentSizeFitter.FitMode.MinSize\">\n      <summary>\n        <para>Resize to the minimum size of the content.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.ContentSizeFitter.FitMode.PreferredSize\">\n      <summary>\n        <para>Resize to the preferred size of the content.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.ContentSizeFitter.FitMode.Unconstrained\">\n      <summary>\n        <para>Don't perform any resizing.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ContentSizeFitter.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ContentSizeFitter.SetDirty\">\n      <summary>\n        <para>Mark the ContentSizeFitter as dirty.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ContentSizeFitter.SetLayoutHorizontal\">\n      <summary>\n        <para>Method called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ContentSizeFitter.SetLayoutVertical\">\n      <summary>\n        <para>Method called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.DefaultControls\">\n      <summary>\n        <para>Utility class for creating default implementations of builtin UI controls.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.DefaultControls.CreateButton(UnityEngine.UI.DefaultControls/Resources)\">\n      <summary>\n        <para>Create a button.</para>\n      </summary>\n      <param name=\"resources\">Object with resources to use.</param>\n      <returns>\n        <para>The root GameObject of the created element.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.DefaultControls.CreateDropdown(UnityEngine.UI.DefaultControls/Resources)\">\n      <summary>\n        <para>Create a dropdown.</para>\n      </summary>\n      <param name=\"resources\">Object with resources to use.</param>\n      <returns>\n        <para>The root GameObject of the created element.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.DefaultControls.CreateImage(UnityEngine.UI.DefaultControls/Resources)\">\n      <summary>\n        <para>Create an image.</para>\n      </summary>\n      <param name=\"resources\">Object with resources to use.</param>\n      <returns>\n        <para>The root GameObject of the created element.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.DefaultControls.CreateInputField(UnityEngine.UI.DefaultControls/Resources)\">\n      <summary>\n        <para>Create an input field.</para>\n      </summary>\n      <param name=\"resources\">Object with resources to use.</param>\n      <returns>\n        <para>The root GameObject of the created element.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.DefaultControls.CreatePanel(UnityEngine.UI.DefaultControls/Resources)\">\n      <summary>\n        <para>Create a panel.</para>\n      </summary>\n      <param name=\"resources\">Object with resources to use.</param>\n      <returns>\n        <para>The root GameObject of the created element.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.DefaultControls.CreateRawImage(UnityEngine.UI.DefaultControls/Resources)\">\n      <summary>\n        <para>Create a raw image.</para>\n      </summary>\n      <param name=\"resources\">Object with resources to use.</param>\n      <returns>\n        <para>The root GameObject of the created element.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.DefaultControls.CreateScrollbar(UnityEngine.UI.DefaultControls/Resources)\">\n      <summary>\n        <para>Create a scrollbar.</para>\n      </summary>\n      <param name=\"resources\">Object with resources to use.</param>\n      <returns>\n        <para>The root GameObject of the created element.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.DefaultControls.CreateScrollView(UnityEngine.UI.DefaultControls/Resources)\">\n      <summary>\n        <para>Create a scroll view.</para>\n      </summary>\n      <param name=\"resources\">Object with resources to use.</param>\n      <returns>\n        <para>The root GameObject of the created element.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.DefaultControls.CreateSlider(UnityEngine.UI.DefaultControls/Resources)\">\n      <summary>\n        <para>Create a slider.</para>\n      </summary>\n      <param name=\"resources\">Object with resources to use.</param>\n      <returns>\n        <para>The root GameObject of the created element.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.DefaultControls.CreateText(UnityEngine.UI.DefaultControls/Resources)\">\n      <summary>\n        <para>Create a text object.</para>\n      </summary>\n      <param name=\"resources\">C.</param>\n      <returns>\n        <para>The root GameObject of the created element.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.DefaultControls.CreateToggle(UnityEngine.UI.DefaultControls/Resources)\">\n      <summary>\n        <para>Create a toggle.</para>\n      </summary>\n      <param name=\"resources\">Object with resources to use.</param>\n      <returns>\n        <para>The root GameObject of the created element.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.UI.DefaultControls.Resources\">\n      <summary>\n        <para>Object used to pass resources to use for the default controls.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.DefaultControls.Resources.background\">\n      <summary>\n        <para>Sprite used for background elements.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.DefaultControls.Resources.checkmark\">\n      <summary>\n        <para>Sprite used for representation of an \"on\" state when present, such as a checkmark.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.DefaultControls.Resources.dropdown\">\n      <summary>\n        <para>Sprite used to indicate that a button will open a dropdown when clicked.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.DefaultControls.Resources.inputField\">\n      <summary>\n        <para>Sprite used as background for input fields.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.DefaultControls.Resources.knob\">\n      <summary>\n        <para>Sprite used for knobs that can be dragged, such as on a slider.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.DefaultControls.Resources.mask\">\n      <summary>\n        <para>Sprite used for masking purposes, for example to be used for the viewport of a scroll view.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.DefaultControls.Resources.standard\">\n      <summary>\n        <para>The primary sprite to be used for graphical UI elements, used by the button, toggle, and dropdown controls, among others.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Dropdown\">\n      <summary>\n        <para>A standard dropdown that presents a list of options when clicked, of which one can be chosen.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Dropdown.captionImage\">\n      <summary>\n        <para>The Image component to hold the image of the currently selected option.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Dropdown.captionText\">\n      <summary>\n        <para>The Text component to hold the text of the currently selected option.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Dropdown.itemImage\">\n      <summary>\n        <para>The Image component to hold the image of the item.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Dropdown.itemText\">\n      <summary>\n        <para>The Text component to hold the text of the item.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Dropdown.onValueChanged\">\n      <summary>\n        <para>A UnityEvent that is invoked when when a user has clicked one of the options in the dropdown list.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Dropdown.options\">\n      <summary>\n        <para>The list of possible options. A text string and an image can be specified for each option.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Dropdown.template\">\n      <summary>\n        <para>The Rect Transform of the template for the dropdown list.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Dropdown.value\">\n      <summary>\n        <para>The Value is the index number of the current selection in the Dropdown. 0 is the first option in the Dropdown, 1 is the second, and so on.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.AddOptions(System.Collections.Generic.List`1&lt;UnityEngine.UI.Dropdown/OptionData&gt;)\">\n      <summary>\n        <para>Add multiple options to the options of the Dropdown based on a list of OptionData objects.</para>\n      </summary>\n      <param name=\"options\">The list of OptionData to add.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.AddOptions(System.Collections.Generic.List`1&lt;System.String&gt;)\">\n      <summary>\n        <para>Add multiple text-only options to the options of the Dropdown based on a list of strings.</para>\n      </summary>\n      <param name=\"options\">The list of text strings to add.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.AddOptions(System.Collections.Generic.List`1&lt;UnityEngine.Sprite&gt;)\">\n      <summary>\n        <para>Add multiple image-only options to the options of the Dropdown based on a list of Sprites.</para>\n      </summary>\n      <param name=\"options\">The list of Sprites to add.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.ClearOptions\">\n      <summary>\n        <para>Clear the list of options in the Dropdown.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.CreateBlocker(UnityEngine.Canvas)\">\n      <summary>\n        <para>Override this method to implement a different way to obtain a blocker GameObject.</para>\n      </summary>\n      <param name=\"rootCanvas\">The root canvas the dropdown is under.</param>\n      <returns>\n        <para>The obtained blocker.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.CreateDropdownList(UnityEngine.GameObject)\">\n      <summary>\n        <para>Override this method to implement a different way to obtain a dropdown list GameObject.</para>\n      </summary>\n      <param name=\"template\">The template to create the dropdown list from.</param>\n      <returns>\n        <para>The obtained dropdown list.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.CreateItem(UnityEngine.UI.Dropdown/DropdownItem)\">\n      <summary>\n        <para>Override this method to implement a different way to obtain an option item.</para>\n      </summary>\n      <param name=\"itemTemplate\">The template to create the option item from.</param>\n      <returns>\n        <para>The obtained option item.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.DestroyBlocker(UnityEngine.GameObject)\">\n      <summary>\n        <para>Override this method to implement a different way to dispose of a blocker GameObject that blocks clicks to other controls while the dropdown list is open.</para>\n      </summary>\n      <param name=\"blocker\">The blocker to dispose of.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.DestroyDropdownList(UnityEngine.GameObject)\">\n      <summary>\n        <para>Override this method to implement a different way to dispose of a dropdown list GameObject.</para>\n      </summary>\n      <param name=\"dropdownList\">The dropdown list to dispose of.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.DestroyItem(UnityEngine.UI.Dropdown/DropdownItem)\">\n      <summary>\n        <para>Override this method to implement a different way to dispose of an option item.</para>\n      </summary>\n      <param name=\"item\">The option item to dispose of.</param>\n    </member>\n    <member name=\"T:UnityEngine.UI.Dropdown.DropdownEvent\">\n      <summary>\n        <para>UnityEvent callback for when a dropdown current option is changed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.Hide\">\n      <summary>\n        <para>Hide the dropdown list.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.OnCancel(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Called by a BaseInputModule when a Cancel event occurs.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.OnPointerClick(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Handling for when the dropdown is 'clicked'.</para>\n      </summary>\n      <param name=\"eventData\">Current event.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.OnSubmit(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>What to do when the event system sends a submit Event.</para>\n      </summary>\n      <param name=\"eventData\">Current event.</param>\n    </member>\n    <member name=\"T:UnityEngine.UI.Dropdown.OptionData\">\n      <summary>\n        <para>Class to store the text and/or image of a single option in the dropdown list.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Dropdown.OptionData.image\">\n      <summary>\n        <para>The image associated with the option.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Dropdown.OptionData.text\">\n      <summary>\n        <para>The text associated with the option.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.OptionData.#ctor\">\n      <summary>\n        <para>Create an object representing a single option for the dropdown list.</para>\n      </summary>\n      <param name=\"text\">Optional text for the option.</param>\n      <param name=\"image\">Optional image for the option.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.OptionData.#ctor(System.String)\">\n      <summary>\n        <para>Create an object representing a single option for the dropdown list.</para>\n      </summary>\n      <param name=\"text\">Optional text for the option.</param>\n      <param name=\"image\">Optional image for the option.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.OptionData.#ctor(UnityEngine.Sprite)\">\n      <summary>\n        <para>Create an object representing a single option for the dropdown list.</para>\n      </summary>\n      <param name=\"text\">Optional text for the option.</param>\n      <param name=\"image\">Optional image for the option.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.OptionData.#ctor(System.String,UnityEngine.Sprite)\">\n      <summary>\n        <para>Create an object representing a single option for the dropdown list.</para>\n      </summary>\n      <param name=\"text\">Optional text for the option.</param>\n      <param name=\"image\">Optional image for the option.</param>\n    </member>\n    <member name=\"T:UnityEngine.UI.Dropdown.OptionDataList\">\n      <summary>\n        <para>Class used internally to store the list of options for the dropdown list.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Dropdown.OptionDataList.options\">\n      <summary>\n        <para>The list of options for the dropdown list.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.RefreshShownValue\">\n      <summary>\n        <para>Refreshes the text and image (if available) of the currently selected option.\n\nIf you have modified the list of options, you should call this method afterwards to ensure that the visual state of the dropdown corresponds to the updated options.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Dropdown.Show\">\n      <summary>\n        <para>Show the dropdown list.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.FontData\">\n      <summary>\n        <para>Struct for storing Text generation settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.FontData.alignByGeometry\">\n      <summary>\n        <para>Use the extents of glyph geometry to perform horizontal alignment rather than glyph metrics.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.FontData.alignment\">\n      <summary>\n        <para>How is the text aligned.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.FontData.bestFit\">\n      <summary>\n        <para>Is best fit used.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.FontData.defaultFontData\">\n      <summary>\n        <para>Maintain a list of all the FontData features.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.FontData.font\">\n      <summary>\n        <para>Font to use.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.FontData.fontSize\">\n      <summary>\n        <para>Font size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.FontData.fontStyle\">\n      <summary>\n        <para>Font Style.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.FontData.horizontalOverflow\">\n      <summary>\n        <para>Horizontal overflow mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.FontData.lineSpacing\">\n      <summary>\n        <para>Line spacing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.FontData.maxSize\">\n      <summary>\n        <para>Maximum text size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.FontData.minSize\">\n      <summary>\n        <para>Minimum text size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.FontData.richText\">\n      <summary>\n        <para>Should RichText be used?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.FontData.verticalOverflow\">\n      <summary>\n        <para>Vertical overflow mode.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.FontUpdateTracker\">\n      <summary>\n        <para>Utility class that is used to help with Text update.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.FontUpdateTracker.TrackText(UnityEngine.UI.Text)\">\n      <summary>\n        <para>Register a Text element for receiving texture atlas rebuild calls.</para>\n      </summary>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.FontUpdateTracker.UntrackText(UnityEngine.UI.Text)\">\n      <summary>\n        <para>Deregister a Text element from receiving texture atlas rebuild calls.</para>\n      </summary>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"T:UnityEngine.UI.Graphic\">\n      <summary>\n        <para>Base class for all visual UI Component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Graphic.canvas\">\n      <summary>\n        <para>A reference to the Canvas this Graphic is rendering to.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Graphic.canvasRenderer\">\n      <summary>\n        <para>The CanvasRenderer used by this Graphic.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Graphic.color\">\n      <summary>\n        <para>Base color of the Graphic.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Graphic.defaultGraphicMaterial\">\n      <summary>\n        <para>Default material used to draw UI elements if no explicit material was specified.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Graphic.defaultMaterial\">\n      <summary>\n        <para>Returns the default material for the graphic.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Graphic.depth\">\n      <summary>\n        <para>Absolute depth of the graphic in the hierarchy, used by rendering and events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Graphic.mainTexture\">\n      <summary>\n        <para>The graphic's texture. (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Graphic.material\">\n      <summary>\n        <para>The Material set by the user.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Graphic.materialForRendering\">\n      <summary>\n        <para>The material that will be sent for Rendering (Read only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Graphic.raycastTarget\">\n      <summary>\n        <para>Should this graphic be considered a target for raycasting?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Graphic.rectTransform\">\n      <summary>\n        <para>The RectTransform component used by the Graphic.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.CrossFadeAlpha(System.Single,System.Single,System.Boolean)\">\n      <summary>\n        <para>Tweens the alpha of the CanvasRenderer color associated with this Graphic.</para>\n      </summary>\n      <param name=\"alpha\">Target alpha.</param>\n      <param name=\"duration\">Duration of the tween in seconds.</param>\n      <param name=\"ignoreTimeScale\">Should ignore Time.scale?</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.CrossFadeColor(UnityEngine.Color,System.Single,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Tweens the CanvasRenderer color associated with this Graphic.</para>\n      </summary>\n      <param name=\"targetColor\">Target color.</param>\n      <param name=\"duration\">Tween duration.</param>\n      <param name=\"ignoreTimeScale\">Should ignore Time.scale?</param>\n      <param name=\"useAlpha\">Should also Tween the alpha channel?</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.GetPixelAdjustedRect\">\n      <summary>\n        <para>Returns a pixel perfect Rect closest to the Graphic RectTransform.</para>\n      </summary>\n      <returns>\n        <para>Pixel perfect Rect.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.GraphicUpdateComplete\">\n      <summary>\n        <para>See ICanvasElement.GraphicUpdateComplete.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.LayoutComplete\">\n      <summary>\n        <para>See ICanvasElement.LayoutComplete.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.OnCullingChanged\">\n      <summary>\n        <para>Callback function to call when the culling has changed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.OnPopulateMesh(UnityEngine.Mesh)\">\n      <summary>\n        <para>Callback function when a UI element needs to generate vertices.</para>\n      </summary>\n      <param name=\"m\">Mesh to populate with UI data.</param>\n      <param name=\"vh\">VertexHelper utility.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.OnPopulateMesh(UnityEngine.UI.VertexHelper)\">\n      <summary>\n        <para>Callback function when a UI element needs to generate vertices.</para>\n      </summary>\n      <param name=\"m\">Mesh to populate with UI data.</param>\n      <param name=\"vh\">VertexHelper utility.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.OnRebuildRequested\">\n      <summary>\n        <para>Editor-only callback that is issued by Unity if a rebuild of the Graphic is required.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.PixelAdjustPoint(UnityEngine.Vector2)\">\n      <summary>\n        <para>Adjusts the given pixel to be pixel perfect.</para>\n      </summary>\n      <param name=\"point\">Local space point.</param>\n      <returns>\n        <para>Pixel perfect adjusted point.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.Raycast(UnityEngine.Vector2,UnityEngine.Camera)\">\n      <summary>\n        <para>When a GraphicRaycaster is raycasting into the scene it does two things. First it filters the elements using their RectTransform rect. Then it uses this Raycast function to determine the elements hit by the raycast.</para>\n      </summary>\n      <param name=\"sp\">Screen point.</param>\n      <param name=\"eventCamera\">Camera.</param>\n      <returns>\n        <para>True if the provided point is a valid location for GraphicRaycaster raycasts.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.Rebuild(UnityEngine.UI.CanvasUpdate)\">\n      <summary>\n        <para>Rebuilds the graphic geometry and its material on the PreRender cycle.</para>\n      </summary>\n      <param name=\"update\">The current step of the rendering CanvasUpdate cycle.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.RegisterDirtyLayoutCallback(UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Add a listener to receive notification when the graphics layout is dirtied.</para>\n      </summary>\n      <param name=\"action\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.RegisterDirtyMaterialCallback(UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Add a listener to receive notification when the graphics material is dirtied.</para>\n      </summary>\n      <param name=\"action\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.RegisterDirtyVerticesCallback(UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Add a listener to receive notification when the graphics vertices are dirtied.</para>\n      </summary>\n      <param name=\"action\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.SetAllDirty\">\n      <summary>\n        <para>Mark the Graphic as dirty.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.SetLayoutDirty\">\n      <summary>\n        <para>Mark the layout as dirty.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.SetMaterialDirty\">\n      <summary>\n        <para>Mark the Material as dirty.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.SetNativeSize\">\n      <summary>\n        <para>Adjusts the graphic size to make it pixel-perfect.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.SetVerticesDirty\">\n      <summary>\n        <para>Mark the vertices as dirty.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.UnregisterDirtyLayoutCallback(UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Remove a listener from receiving notifications when the graphics layout is dirtied.</para>\n      </summary>\n      <param name=\"action\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.UnregisterDirtyMaterialCallback(UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Remove a listener from receiving notifications when the graphics material is dirtied.</para>\n      </summary>\n      <param name=\"action\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.UnregisterDirtyVerticesCallback(UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Remove a listener from receiving notifications when the graphics vertices are dirtied.</para>\n      </summary>\n      <param name=\"action\">The delegate function to remove.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.UpdateGeometry\">\n      <summary>\n        <para>Call to update the geometry of the Graphic onto the CanvasRenderer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Graphic.UpdateMaterial\">\n      <summary>\n        <para>Call to update the Material of the graphic onto the CanvasRenderer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.GraphicRaycaster\">\n      <summary>\n        <para>A BaseRaycaster to raycast against Graphic elements.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.GraphicRaycaster.blockingObjects\">\n      <summary>\n        <para>Type of objects that will block graphic raycasts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.GraphicRaycaster.eventCamera\">\n      <summary>\n        <para>See: BaseRaycaster.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.GraphicRaycaster.ignoreReversedGraphics\">\n      <summary>\n        <para>Should graphics facing away from the raycaster be considered?</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.GraphicRaycaster.BlockingObjects\">\n      <summary>\n        <para>List of Raycasters to check for canvas blocking elements.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.GraphicRaycaster.BlockingObjects.All\">\n      <summary>\n        <para>Blocked by 2D and 3D.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.GraphicRaycaster.BlockingObjects.None\">\n      <summary>\n        <para>Not blocked.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.GraphicRaycaster.BlockingObjects.ThreeD\">\n      <summary>\n        <para>3D physics blocking.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.GraphicRaycaster.BlockingObjects.TwoD\">\n      <summary>\n        <para>2D physics blocking.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.GraphicRaycaster.Raycast(UnityEngine.EventSystems.PointerEventData,System.Collections.Generic.List`1&lt;UnityEngine.EventSystems.RaycastResult&gt;)\">\n      <summary>\n        <para>Determines if the cursor is over a Graphics element in the Scene. See: BaseRaycaster.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n      <param name=\"resultAppendList\"></param>\n    </member>\n    <member name=\"T:UnityEngine.UI.GraphicRebuildTracker\">\n      <summary>\n        <para>EditorOnly class for tracking all Graphics.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.GraphicRebuildTracker.TrackGraphic(UnityEngine.UI.Graphic)\">\n      <summary>\n        <para>Track a Graphic.</para>\n      </summary>\n      <param name=\"g\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.GraphicRebuildTracker.UnTrackGraphic(UnityEngine.UI.Graphic)\">\n      <summary>\n        <para>Untrack a Graphic.</para>\n      </summary>\n      <param name=\"g\"></param>\n    </member>\n    <member name=\"T:UnityEngine.UI.GraphicRegistry\">\n      <summary>\n        <para>Registry which maps a Graphic to the canvas it belongs to.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.GraphicRegistry.instance\">\n      <summary>\n        <para>Singleton instance.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.GraphicRegistry.GetGraphicsForCanvas(UnityEngine.Canvas)\">\n      <summary>\n        <para>Return a list of Graphics that are registered on the Canvas.</para>\n      </summary>\n      <param name=\"canvas\">Input canvas.</param>\n      <returns>\n        <para>Graphics on the input canvas.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.GraphicRegistry.RegisterGraphicForCanvas(UnityEngine.Canvas,UnityEngine.UI.Graphic)\">\n      <summary>\n        <para>Store a link between the given canvas and graphic in the registry.</para>\n      </summary>\n      <param name=\"c\">Canvas to register.</param>\n      <param name=\"graphic\">Graphic to register.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.GraphicRegistry.UnregisterGraphicForCanvas(UnityEngine.Canvas,UnityEngine.UI.Graphic)\">\n      <summary>\n        <para>Deregister the given Graphic from a Canvas.</para>\n      </summary>\n      <param name=\"c\">Canvas.</param>\n      <param name=\"graphic\">Graphic to deregister.</param>\n    </member>\n    <member name=\"T:UnityEngine.UI.GridLayoutGroup\">\n      <summary>\n        <para>Layout child layout elements in a grid.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.GridLayoutGroup.cellSize\">\n      <summary>\n        <para>The size to use for each cell in the grid.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.GridLayoutGroup.constraint\">\n      <summary>\n        <para>Which constraint to use for the GridLayoutGroup.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.GridLayoutGroup.constraintCount\">\n      <summary>\n        <para>How many cells there should be along the constrained axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.GridLayoutGroup.spacing\">\n      <summary>\n        <para>The spacing to use between layout elements in the grid.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.GridLayoutGroup.startAxis\">\n      <summary>\n        <para>Which axis should cells be placed along first?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.GridLayoutGroup.startCorner\">\n      <summary>\n        <para>Which corner should the first cell be placed in?</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.GridLayoutGroup.Axis\">\n      <summary>\n        <para>An axis that can be horizontal or vertical.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.GridLayoutGroup.Axis.Horizontal\">\n      <summary>\n        <para>Horizontal.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.GridLayoutGroup.Axis.Vertical\">\n      <summary>\n        <para>Vertical.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.GridLayoutGroup.CalculateLayoutInputHorizontal\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.GridLayoutGroup.CalculateLayoutInputVertical\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.GridLayoutGroup.Constraint\">\n      <summary>\n        <para>A constraint on either the number of columns or rows.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.GridLayoutGroup.Constraint.FixedColumnCount\">\n      <summary>\n        <para>Constraint the number of columns to a specified number.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.GridLayoutGroup.Constraint.FixedRowCount\">\n      <summary>\n        <para>Constraint the number of rows to a specified number.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.GridLayoutGroup.Constraint.Flexible\">\n      <summary>\n        <para>Don't constrain the number of rows or columns.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.GridLayoutGroup.Corner\">\n      <summary>\n        <para>One of the four corners in a rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.GridLayoutGroup.Corner.LowerLeft\">\n      <summary>\n        <para>Lower left.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.GridLayoutGroup.Corner.LowerRight\">\n      <summary>\n        <para>Lower right.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.GridLayoutGroup.Corner.UpperLeft\">\n      <summary>\n        <para>Upper left.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.GridLayoutGroup.Corner.UpperRight\">\n      <summary>\n        <para>Upper right.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.GridLayoutGroup.SetLayoutHorizontal\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.GridLayoutGroup.SetLayoutVertical\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.HorizontalLayoutGroup\">\n      <summary>\n        <para>Layout child layout elements side by side.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.HorizontalLayoutGroup.CalculateLayoutInputHorizontal\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.HorizontalLayoutGroup.CalculateLayoutInputVertical\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.HorizontalLayoutGroup.SetLayoutHorizontal\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.HorizontalLayoutGroup.SetLayoutVertical\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.HorizontalOrVerticalLayoutGroup\">\n      <summary>\n        <para>Abstract base class for HorizontalLayoutGroup and VerticalLayoutGroup.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.HorizontalOrVerticalLayoutGroup.childControlHeight\">\n      <summary>\n        <para>Returns true if the Layout Group controls the heights of its children. Returns false if children control their own heights.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.HorizontalOrVerticalLayoutGroup.childControlWidth\">\n      <summary>\n        <para>Returns true if the Layout Group controls the widths of its children. Returns false if children control their own widths.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.HorizontalOrVerticalLayoutGroup.childForceExpandHeight\">\n      <summary>\n        <para>Whether to force the children to expand to fill additional available vertical space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.HorizontalOrVerticalLayoutGroup.childForceExpandWidth\">\n      <summary>\n        <para>Whether to force the children to expand to fill additional available horizontal space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.HorizontalOrVerticalLayoutGroup.spacing\">\n      <summary>\n        <para>The spacing to use between layout elements in the layout group.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.HorizontalOrVerticalLayoutGroup.CalcAlongAxis(System.Int32,System.Boolean)\">\n      <summary>\n        <para>Calculate the layout element properties for this layout element along the given axis.</para>\n      </summary>\n      <param name=\"axis\">The axis to calculate for. 0 is horizontal and 1 is vertical.</param>\n      <param name=\"isVertical\">Is this group a vertical group?</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.HorizontalOrVerticalLayoutGroup.SetChildrenAlongAxis(System.Int32,System.Boolean)\">\n      <summary>\n        <para>Set the positions and sizes of the child layout elements for the given axis.</para>\n      </summary>\n      <param name=\"axis\">The axis to handle. 0 is horizontal and 1 is vertical.</param>\n      <param name=\"isVertical\">Is this group a vertical group?</param>\n    </member>\n    <member name=\"?:UnityEngine.UI.ICanvasElement\">\n      <summary>\n        <para>This is an element that can live on a Canvas.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ICanvasElement.transform\">\n      <summary>\n        <para>Get the transform associated with the ICanvasElement.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ICanvasElement.GraphicUpdateComplete\">\n      <summary>\n        <para>Callback sent when this ICanvasElement has completed Graphic rebuild.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ICanvasElement.IsDestroyed\">\n      <summary>\n        <para>Return true if the element is considered destroyed.\nUsed if the native representation has been destroyed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ICanvasElement.LayoutComplete\">\n      <summary>\n        <para>Callback sent when this ICanvasElement has completed layout.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ICanvasElement.Rebuild(UnityEngine.UI.CanvasUpdate)\">\n      <summary>\n        <para>Rebuild the element for the given stage.</para>\n      </summary>\n      <param name=\"executing\">Stage being rebuild.</param>\n    </member>\n    <member name=\"?:UnityEngine.UI.IClippable\">\n      <summary>\n        <para>Interface for elements that can be clipped if they are under an [[IClipper].</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.IClippable.gameObject\">\n      <summary>\n        <para>GameObject of the IClippable.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.IClippable.rectTransform\">\n      <summary>\n        <para>RectTransform of the clippable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.IClippable.Cull(UnityEngine.Rect,System.Boolean)\">\n      <summary>\n        <para>Clip and cull the IClippable given the clipRect.</para>\n      </summary>\n      <param name=\"clipRect\">Rectangle to clip against.</param>\n      <param name=\"validRect\">Is the Rect valid. If not then the rect has 0 size.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.IClippable.RecalculateClipping\">\n      <summary>\n        <para>Called when the state of a parent IClippable changes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.IClippable.SetClipRect(UnityEngine.Rect,System.Boolean)\">\n      <summary>\n        <para>Set the clip rect for the IClippable.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"validRect\"></param>\n    </member>\n    <member name=\"?:UnityEngine.UI.IClipper\">\n      <summary>\n        <para>Interface that can be used to recieve clipping callbacks as part of the canvas update loop.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.IClipper.PerformClipping\">\n      <summary>\n        <para>Called after layout and before Graphic update of the Canvas update loop.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.UI.ILayoutController\">\n      <summary>\n        <para>Base interface to implement by componets that control the layout of RectTransforms.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ILayoutController.SetLayoutHorizontal\">\n      <summary>\n        <para>Callback invoked by the auto layout system which handles horizontal aspects of the layout.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ILayoutController.SetLayoutVertical\">\n      <summary>\n        <para>Callback invoked by the auto layout system which handles vertical aspects of the layout.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.UI.ILayoutElement\">\n      <summary>\n        <para>A component is treated as a layout element by the auto layout system if it implements ILayoutElement.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ILayoutElement.flexibleHeight\">\n      <summary>\n        <para>The extra relative height this layout element should be allocated if there is additional available space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ILayoutElement.flexibleWidth\">\n      <summary>\n        <para>The extra relative width this layout element should be allocated if there is additional available space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ILayoutElement.layoutPriority\">\n      <summary>\n        <para>The layout priority of this component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ILayoutElement.minHeight\">\n      <summary>\n        <para>The minimum height this layout element may be allocated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ILayoutElement.minWidth\">\n      <summary>\n        <para>The minimum width this layout element may be allocated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ILayoutElement.preferredHeight\">\n      <summary>\n        <para>The preferred height this layout element should be allocated if there is sufficient space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ILayoutElement.preferredWidth\">\n      <summary>\n        <para>The preferred width this layout element should be allocated if there is sufficient space.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ILayoutElement.CalculateLayoutInputHorizontal\">\n      <summary>\n        <para>The minWidth, preferredWidth, and flexibleWidth values may be calculated in this callback.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ILayoutElement.CalculateLayoutInputVertical\">\n      <summary>\n        <para>The minHeight, preferredHeight, and flexibleHeight values may be calculated in this callback.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.UI.ILayoutGroup\">\n      <summary>\n        <para>ILayoutGroup is an ILayoutController that should drive the RectTransforms of its children.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.UI.ILayoutIgnorer\">\n      <summary>\n        <para>A RectTransform will be ignored by the layout system if it has a component which implements ILayoutIgnorer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ILayoutIgnorer.ignoreLayout\">\n      <summary>\n        <para>Should this RectTransform be ignored bvy the layout system?</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.UI.ILayoutSelfController\">\n      <summary>\n        <para>ILayoutSelfController is an ILayoutController that should drive its own RectTransform.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Image\">\n      <summary>\n        <para>Displays a Sprite for the UI System.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.alphaHitTestMinimumThreshold\">\n      <summary>\n        <para>The alpha threshold specifies the minimum alpha a pixel must have for the event to considered a \"hit\" on the Image.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.defaultETC1GraphicMaterial\">\n      <summary>\n        <para>Cache of the default Canvas Ericsson Texture Compression 1 (ETC1) and alpha Material.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.eventAlphaThreshold\">\n      <summary>\n        <para>The alpha threshold specifies the minimum alpha a pixel must have for the event to considered a \"hit\" on the Image.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.fillAmount\">\n      <summary>\n        <para>Amount of the Image shown when the Image.type is set to Image.Type.Filled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.fillCenter\">\n      <summary>\n        <para>Whether or not to render the center of a Tiled or Sliced image.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.fillClockwise\">\n      <summary>\n        <para>Whether the Image should be filled clockwise (true) or counter-clockwise (false).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.fillMethod\">\n      <summary>\n        <para>What type of fill method to use.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.fillOrigin\">\n      <summary>\n        <para>Controls the origin point of the Fill process. Value means different things with each fill method.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.flexibleHeight\">\n      <summary>\n        <para>See ILayoutElement.flexibleHeight.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.flexibleWidth\">\n      <summary>\n        <para>See ILayoutElement.flexibleWidth.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.hasBorder\">\n      <summary>\n        <para>True if the sprite used has borders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.layoutPriority\">\n      <summary>\n        <para>See ILayoutElement.layoutPriority.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.mainTexture\">\n      <summary>\n        <para>The image's texture. (ReadOnly).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.material\">\n      <summary>\n        <para>The specified Material used by this Image. The default Material is used instead if one wasn't specified.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.minHeight\">\n      <summary>\n        <para>See ILayoutElement.minHeight.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.minWidth\">\n      <summary>\n        <para>See ILayoutElement.minWidth.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.overrideSprite\">\n      <summary>\n        <para>Set an override sprite to be used for rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.preferredHeight\">\n      <summary>\n        <para>See ILayoutElement.preferredHeight.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.preferredWidth\">\n      <summary>\n        <para>See ILayoutElement.preferredWidth.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.preserveAspect\">\n      <summary>\n        <para>Whether this image should preserve its Sprite aspect ratio.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.sprite\">\n      <summary>\n        <para>The sprite that is used to render this image.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Image.type\">\n      <summary>\n        <para>How to display the image.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Image.CalculateLayoutInputHorizontal\">\n      <summary>\n        <para>See ILayoutElement.CalculateLayoutInputHorizontal.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Image.CalculateLayoutInputVertical\">\n      <summary>\n        <para>See ILayoutElement.CalculateLayoutInputVertical.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Image.FillMethod\">\n      <summary>\n        <para>Fill method to be used by the UI.Image.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.FillMethod.Horizontal\">\n      <summary>\n        <para>The Image will be filled Horizontally.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.FillMethod.Radial180\">\n      <summary>\n        <para>The Image will be filled Radially with the radial center in one of the edges.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.FillMethod.Radial360\">\n      <summary>\n        <para>The Image will be filled Radially with the radial center at the center.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.FillMethod.Radial90\">\n      <summary>\n        <para>The Image will be filled Radially with the radial center in one of the corners.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.FillMethod.Vertical\">\n      <summary>\n        <para>The Image will be filled Vertically.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Image.IsRaycastLocationValid(UnityEngine.Vector2,UnityEngine.Camera)\">\n      <summary>\n        <para>See:ICanvasRaycastFilter.</para>\n      </summary>\n      <param name=\"screenPoint\"></param>\n      <param name=\"eventCamera\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Image.OnAfterDeserialize\">\n      <summary>\n        <para>Serialization Callback.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Image.OnBeforeSerialize\">\n      <summary>\n        <para>Serialization Callback.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Image.Origin180\">\n      <summary>\n        <para>Origin for the Image.FillMethod.Radial180.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.Origin180.Bottom\">\n      <summary>\n        <para>Center of the radial at the center of the Bottom edge.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.Origin180.Left\">\n      <summary>\n        <para>Center of the radial at the center of the Left edge.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.Origin180.Right\">\n      <summary>\n        <para>Center of the radial at the center of the Right edge.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.Origin180.Top\">\n      <summary>\n        <para>Center of the radial at the center of the Top edge.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Image.Origin360\">\n      <summary>\n        <para>One of the points of the Arc for the Image.FillMethod.Radial360.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.Origin360.Bottom\">\n      <summary>\n        <para>Arc starting at the center of the Bottom edge.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.Origin360.Left\">\n      <summary>\n        <para>Arc starting at the center of the Left edge.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.Origin360.Right\">\n      <summary>\n        <para>Arc starting at the center of the Right edge.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.Origin360.Top\">\n      <summary>\n        <para>Arc starting at the center of the Top edge.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Image.Origin90\">\n      <summary>\n        <para>Origin for the Image.FillMethod.Radial90.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.Origin90.BottomLeft\">\n      <summary>\n        <para>Radial starting at the Bottom Left corner.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.Origin90.BottomRight\">\n      <summary>\n        <para>Radial starting at the Bottom Right corner.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.Origin90.TopLeft\">\n      <summary>\n        <para>Radial starting at the Top Left corner.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.Origin90.TopRight\">\n      <summary>\n        <para>Radial starting at the Top Right corner.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Image.OriginHorizontal\">\n      <summary>\n        <para>Origin for the Image.FillMethod.Horizontal.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.OriginHorizontal.Left\">\n      <summary>\n        <para>Origin at the Left side.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.OriginHorizontal.Right\">\n      <summary>\n        <para>Origin at the Right side.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Image.OriginVertical\">\n      <summary>\n        <para>Origin for the Image.FillMethod.Vertical.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.OriginVertical.Bottom\">\n      <summary>\n        <para>Origin at the Bottom edge.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.OriginVertical.Top\">\n      <summary>\n        <para>Origin at the Top edge.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Image.SetNativeSize\">\n      <summary>\n        <para>Adjusts the image size to make it pixel-perfect.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Image.Type\">\n      <summary>\n        <para>Image Type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.Type.Filled\">\n      <summary>\n        <para>Displays only a portion of the Image.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.Type.Simple\">\n      <summary>\n        <para>Displays the full Image.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.Type.Sliced\">\n      <summary>\n        <para>Displays the Image as a 9-sliced graphic.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Image.Type.Tiled\">\n      <summary>\n        <para>Displays a sliced Sprite with its resizable sections tiled instead of stretched.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.UI.IMask\">\n      <summary>\n        <para>Is this element a mask.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.IMask.rectTransform\">\n      <summary>\n        <para>Return the RectTransform associated with this mask.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.IMask.Enabled\">\n      <summary>\n        <para>Is the mask enabled.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.UI.IMaskable\">\n      <summary>\n        <para>This element is capable of being masked out.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.IMaskable.RecalculateMasking\">\n      <summary>\n        <para>Recalculate masking for this element and all children elements.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.UI.IMaterialModifier\">\n      <summary>\n        <para>Interface which allows for the modification of the Material used to render a Graphic before they are passed to the CanvasRenderer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.IMaterialModifier.GetModifiedMaterial(UnityEngine.Material)\">\n      <summary>\n        <para>Perform material modification in this function.</para>\n      </summary>\n      <param name=\"baseMaterial\">Configured Material.</param>\n      <returns>\n        <para>Modified material.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.UI.IMeshModifier\">\n      <summary>\n        <para>Interface which allows for the modification of verticies in a Graphic before they are passed to the CanvasRenderer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.IMeshModifier.ModifyMesh(UnityEngine.Mesh)\">\n      <summary>\n        <para>Call used to modify mesh.</para>\n      </summary>\n      <param name=\"mesh\"></param>\n    </member>\n    <member name=\"T:UnityEngine.UI.InputField\">\n      <summary>\n        <para>Turn a simple label into a interactable input field.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.asteriskChar\">\n      <summary>\n        <para>The character used for password fields.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.caretBlinkRate\">\n      <summary>\n        <para>The blinking rate of the input caret, defined as the number of times the blink cycle occurs per second.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.caretColor\">\n      <summary>\n        <para>The custom caret color used if customCaretColor is set.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.caretPosition\">\n      <summary>\n        <para>Current InputField caret position (also selection tail).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.caretSelectPosition\">\n      <summary>\n        <para>Current InputField selection head.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.caretWidth\">\n      <summary>\n        <para>The width of the caret in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.characterLimit\">\n      <summary>\n        <para>How many characters the input field is limited to. 0 = infinite.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.characterValidation\">\n      <summary>\n        <para>The type of validation to perform on a character.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.contentType\">\n      <summary>\n        <para>Specifies the type of the input text content.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.customCaretColor\">\n      <summary>\n        <para>Should a custom caret color be used or should the textComponent.color be used.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.inputType\">\n      <summary>\n        <para>The type of input expected. See InputField.InputType.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.isFocused\">\n      <summary>\n        <para>Does the InputField currently have focus and is able to process events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.keyboardType\">\n      <summary>\n        <para>They type of mobile keyboard that will be used.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.lineType\">\n      <summary>\n        <para>The LineType used by the InputField.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.multiLine\">\n      <summary>\n        <para>If the input field supports multiple lines.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.onEndEdit\">\n      <summary>\n        <para>The Unity Event to call when editing has ended.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.onValidateInput\">\n      <summary>\n        <para>The function to call to validate the input characters.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.onValueChange\">\n      <summary>\n        <para>Accessor to the OnChangeEvent.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.onValueChanged\">\n      <summary>\n        <para>Accessor to the OnChangeEvent.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.placeholder\">\n      <summary>\n        <para>This is an optional ‘empty’ graphic to show that the InputField text field is empty. Note that this ‘empty' graphic still displays even when the InputField is selected (that is; when there is focus on it).\n\nA placeholder graphic can be used to show subtle hints or make it more obvious that the control is an InputField.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.readOnly\">\n      <summary>\n        <para>Set the InputField to be read only.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.selectionAnchorPosition\">\n      <summary>\n        <para>The beginning point of the selection.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.selectionColor\">\n      <summary>\n        <para>The color of the highlight to show which characters are selected.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.selectionFocusPosition\">\n      <summary>\n        <para>The end point of the selection.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.shouldHideMobileInput\">\n      <summary>\n        <para>Should the mobile keyboard input be hidden.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.text\">\n      <summary>\n        <para>The current value of the input field.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.textComponent\">\n      <summary>\n        <para>The Text component that is going to be used to render the text to screen.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.touchScreenKeyboard\">\n      <summary>\n        <para>The TouchScreenKeyboard being used to edit the Input Field.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.InputField.wasCanceled\">\n      <summary>\n        <para>If the UI.InputField was canceled and will revert back to the original text upon DeactivateInputField.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.ActivateInputField\">\n      <summary>\n        <para>Function to activate the InputField to begin processing Events.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.Append(System.String)\">\n      <summary>\n        <para>Append a character to the input field.</para>\n      </summary>\n      <param name=\"input\">Character / string to append.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.Append(System.Char)\">\n      <summary>\n        <para>Append a character to the input field.</para>\n      </summary>\n      <param name=\"input\">Character / string to append.</param>\n    </member>\n    <member name=\"T:UnityEngine.UI.InputField.CharacterValidation\">\n      <summary>\n        <para>The type of characters that are allowed to be added to the string.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.CharacterValidation.Alphanumeric\">\n      <summary>\n        <para>Allows letters A-Z, a-z and numbers 0-9.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.CharacterValidation.Decimal\">\n      <summary>\n        <para>Allows decimal numbers (positive or negative).\nCharacters 0-9, . (dot), and - (dash / minus sign) are allowed. The dash is only allowed as the first character. Only one dot in the string is allowed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.CharacterValidation.EmailAddress\">\n      <summary>\n        <para>Allows the characters that are allowed in an email address.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.CharacterValidation.Integer\">\n      <summary>\n        <para>Allow whole numbers (positive or negative).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.CharacterValidation.Name\">\n      <summary>\n        <para>Only allow names and enforces capitalization.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.CharacterValidation.None\">\n      <summary>\n        <para>No validation. Any input is valid.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.ClampPos(System.Int32&amp;)\">\n      <summary>\n        <para>Clamp a value (by reference) between 0 and the current text length.</para>\n      </summary>\n      <param name=\"pos\">The value to be clamped.</param>\n    </member>\n    <member name=\"T:UnityEngine.UI.InputField.ContentType\">\n      <summary>\n        <para>Specifies the type of the input text content.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.ContentType.Alphanumeric\">\n      <summary>\n        <para>Allows letters A-Z, a-z and numbers 0-9.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.ContentType.Autocorrected\">\n      <summary>\n        <para>Allows all input and performs auto-correction on platforms that support it.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.ContentType.Custom\">\n      <summary>\n        <para>Custom types that allows user-defined settings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.ContentType.DecimalNumber\">\n      <summary>\n        <para>Allows decimal numbers (positive or negative).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.ContentType.EmailAddress\">\n      <summary>\n        <para>The input is used for typing in an email address.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.ContentType.IntegerNumber\">\n      <summary>\n        <para>Allow whole numbers (positive or negative).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.ContentType.Name\">\n      <summary>\n        <para>The InputField is used for typing in a name, and enforces capitalization of the first letter of each word. Note that the user can circumvent the first letter capitalization rules by deleting automatically-capitalized letters.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.ContentType.Password\">\n      <summary>\n        <para>Allows all input and hides the typed characters by showing them as asterisks characters.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.ContentType.Pin\">\n      <summary>\n        <para>Allows integer numbers and hides the typed characters by showing them as asterisks characters.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.ContentType.Standard\">\n      <summary>\n        <para>Allows all input.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.DeactivateInputField\">\n      <summary>\n        <para>Function to deactivate the InputField to stop the processing of Events and send OnSubmit if not canceled.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.ForceLabelUpdate\">\n      <summary>\n        <para>Force the label to update immediatly. This will recalculate the positioning of the caret and the visible text.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.GetCharacterIndexFromPosition(UnityEngine.Vector2)\">\n      <summary>\n        <para>The character that is under the mouse.</para>\n      </summary>\n      <param name=\"pos\">Mouse position.</param>\n      <returns>\n        <para>Character index with in value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.GraphicUpdateComplete\">\n      <summary>\n        <para>See ICanvasElement.GraphicUpdateComplete.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.InputField.InputType\">\n      <summary>\n        <para>Type of data expected by the input field.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.InputType.AutoCorrect\">\n      <summary>\n        <para>The mobile autocorrect keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.InputType.Password\">\n      <summary>\n        <para>The mobile password keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.InputType.Standard\">\n      <summary>\n        <para>The standard mobile keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.KeyPressed(UnityEngine.Event)\">\n      <summary>\n        <para>Process the Event and perform the appropriate action for that key.</para>\n      </summary>\n      <param name=\"evt\">The Event that is currently being processed.</param>\n      <returns>\n        <para>If we should continue processing events or we have hit an end condition.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.LayoutComplete\">\n      <summary>\n        <para>See ICanvasElement.LayoutComplete.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.InputField.LineType\">\n      <summary>\n        <para>The LineType is used to describe the behavior of the InputField.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.LineType.MultiLineNewline\">\n      <summary>\n        <para>Is a multiline InputField with vertical scrolling and overflow. Pressing the return key will insert a new line character.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.LineType.MultiLineSubmit\">\n      <summary>\n        <para>Is a multiline InputField with vertical scrolling and overflow. Pressing the return key will submit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.InputField.LineType.SingleLine\">\n      <summary>\n        <para>Only allows 1 line to be entered. Has horizontal scrolling and no word wrap. Pressing enter will submit the InputField.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.MoveTextEnd(System.Boolean)\">\n      <summary>\n        <para>Move the caret index to end of text.</para>\n      </summary>\n      <param name=\"shift\">Only move the selectionPosition.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.MoveTextStart(System.Boolean)\">\n      <summary>\n        <para>Move the caret index to start of text.</para>\n      </summary>\n      <param name=\"shift\">Only move the selectionPosition.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.OnBeginDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Capture the OnBeginDrag callback from the EventSystem and ensure we should listen to the drag events to follow.</para>\n      </summary>\n      <param name=\"eventData\">The data passed by the EventSystem.</param>\n    </member>\n    <member name=\"T:UnityEngine.UI.InputField.OnChangeEvent\">\n      <summary>\n        <para>The callback sent anytime the Inputfield is updated.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.OnDeselect(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>What to do when the event system sends a Deselect Event.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.OnDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>What to do when the event system sends a Drag Event.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.OnEndDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Capture the OnEndDrag callback from the EventSystem and cancel the listening of drag events.</para>\n      </summary>\n      <param name=\"eventData\">The eventData sent by the EventSystem.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.OnFocus\">\n      <summary>\n        <para>Focus the input field initializing properties.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.OnPointerClick(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>What to do when the event system sends a pointer click Event.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.OnPointerDown(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>What to do when the event system sends a pointer down Event.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.OnSubmit(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>What to do when the event system sends a submit Event.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.OnUpdateSelected(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>What to do when the event system sends a Update selected Event.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"T:UnityEngine.UI.InputField.OnValidateInput\">\n      <summary>\n        <para>Custom validation callback.</para>\n      </summary>\n      <param name=\"text\"></param>\n      <param name=\"charIndex\"></param>\n      <param name=\"addedChar\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.ProcessEvent(UnityEngine.Event)\">\n      <summary>\n        <para>Helper function to allow separate events to be processed by the InputField.</para>\n      </summary>\n      <param name=\"e\">The Event to be processed.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.Rebuild(UnityEngine.UI.CanvasUpdate)\">\n      <summary>\n        <para>Rebuild the input fields geometry. (caret and highlight).</para>\n      </summary>\n      <param name=\"update\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.ScreenToLocal(UnityEngine.Vector2)\">\n      <summary>\n        <para>Convert screen space into input field local space.</para>\n      </summary>\n      <param name=\"screen\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.SelectAll\">\n      <summary>\n        <para>Highlight the whole InputField.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.SendOnSubmit\">\n      <summary>\n        <para>Convenience function to make functionality to send the SubmitEvent easier.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.InputField.SubmitEvent\">\n      <summary>\n        <para>Unity Event with a inputfield as a param.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.UpdateLabel\">\n      <summary>\n        <para>Update the Text associated with this input field.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.InputField.Validate(System.String,System.Int32,System.Char)\">\n      <summary>\n        <para>Predefined validation functionality for different characterValidation types.</para>\n      </summary>\n      <param name=\"text\">The whole text string to validate.</param>\n      <param name=\"pos\">The position at which the current character is being inserted.</param>\n      <param name=\"ch\">The character that is being inserted.</param>\n      <returns>\n        <para>The character that should be inserted.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.UI.IVertexModifier\">\n      <summary>\n        <para>Interface which allows for the modification of verticies in a Graphic before they are passed to the CanvasRenderer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.IVertexModifier.ModifyVertices(System.Collections.Generic.List`1&lt;UnityEngine.UIVertex&gt;)\">\n      <summary>\n        <para>Call used to modify vertices.</para>\n      </summary>\n      <param name=\"verts\">To modify.</param>\n    </member>\n    <member name=\"T:UnityEngine.UI.LayoutElement\">\n      <summary>\n        <para>Add this component to a GameObject to make it into a layout element or override values on an existing layout element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.LayoutElement.flexibleHeight\">\n      <summary>\n        <para>The extra relative height this layout element should be allocated if there is additional available space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.LayoutElement.flexibleWidth\">\n      <summary>\n        <para>The extra relative width this layout element should be allocated if there is additional available space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.LayoutElement.ignoreLayout\">\n      <summary>\n        <para>Should this RectTransform be ignored by the layout system?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.LayoutElement.layoutPriority\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.LayoutElement.minHeight\">\n      <summary>\n        <para>The minimum height this layout element may be allocated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.LayoutElement.minWidth\">\n      <summary>\n        <para>The minimum width this layout element may be allocated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.LayoutElement.preferredHeight\">\n      <summary>\n        <para>The preferred height this layout element should be allocated if there is sufficient space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.LayoutElement.preferredWidth\">\n      <summary>\n        <para>The preferred width this layout element should be allocated if there is sufficient space.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutElement.CalculateLayoutInputHorizontal\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutElement.CalculateLayoutInputVertical\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutElement.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutElement.SetDirty\">\n      <summary>\n        <para>Mark the LayoutElement as dirty.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.LayoutGroup\">\n      <summary>\n        <para>Abstract base class to use for layout groups.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.LayoutGroup.childAlignment\">\n      <summary>\n        <para>The alignment to use for the child layout elements in the layout group.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.LayoutGroup.flexibleHeight\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.LayoutGroup.flexibleWidth\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.LayoutGroup.layoutPriority\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.LayoutGroup.minHeight\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.LayoutGroup.minWidth\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.LayoutGroup.padding\">\n      <summary>\n        <para>The padding to add around the child layout elements.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.LayoutGroup.preferredHeight\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.LayoutGroup.preferredWidth\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutGroup.CalculateLayoutInputHorizontal\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutGroup.CalculateLayoutInputVertical\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutGroup.GetAlignmentOnAxis(System.Int32)\">\n      <summary>\n        <para>Returns the alignment on the specified axis as a fraction where 0 is lefttop, 0.5 is middle, and 1 is rightbottom.</para>\n      </summary>\n      <param name=\"axis\">The axis to get alignment along. 0 is horizontal and 1 is vertical.</param>\n      <returns>\n        <para>The alignment as a fraction where 0 is lefttop, 0.5 is middle, and 1 is rightbottom.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutGroup.GetStartOffset(System.Int32,System.Single)\">\n      <summary>\n        <para>Returns the calculated position of the first child layout element along the given axis.</para>\n      </summary>\n      <param name=\"axis\">The axis index. 0 is horizontal and 1 is vertical.</param>\n      <param name=\"requiredSpaceWithoutPadding\">The total space required on the given axis for all the layout elements including spacing and excluding padding.</param>\n      <returns>\n        <para>The position of the first child along the given axis.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutGroup.GetTotalFlexibleSize(System.Int32)\">\n      <summary>\n        <para>The flexible size for the layout group on the given axis.</para>\n      </summary>\n      <param name=\"axis\">The axis index. 0 is horizontal and 1 is vertical.</param>\n      <returns>\n        <para>The flexible size.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutGroup.GetTotalMinSize(System.Int32)\">\n      <summary>\n        <para>The min size for the layout group on the given axis.</para>\n      </summary>\n      <param name=\"axis\">The axis index. 0 is horizontal and 1 is vertical.</param>\n      <returns>\n        <para>The min size.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutGroup.GetTotalPreferredSize(System.Int32)\">\n      <summary>\n        <para>The preferred size for the layout group on the given axis.</para>\n      </summary>\n      <param name=\"axis\">The axis index. 0 is horizontal and 1 is vertical.</param>\n      <returns>\n        <para>The preferred size.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutGroup.OnDidApplyAnimationProperties\">\n      <summary>\n        <para>Callback for when properties have been changed by animation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutGroup.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutGroup.SetChildAlongAxis(UnityEngine.RectTransform,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Set the position and size of a child layout element along the given axis.</para>\n      </summary>\n      <param name=\"rect\">The RectTransform of the child layout element.</param>\n      <param name=\"axis\">The axis to set the position and size along. 0 is horizontal and 1 is vertical.</param>\n      <param name=\"pos\">The position from the left side or top.</param>\n      <param name=\"size\">The size.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutGroup.SetDirty\">\n      <summary>\n        <para>Mark the LayoutGroup as dirty.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutGroup.SetLayoutHorizontal\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutGroup.SetLayoutInputForAxis(System.Single,System.Single,System.Single,System.Int32)\">\n      <summary>\n        <para>Used to set the calculated layout properties for the given axis.</para>\n      </summary>\n      <param name=\"totalMin\">The min size for the layout group.</param>\n      <param name=\"totalPreferred\">The preferred size for the layout group.</param>\n      <param name=\"totalFlexible\">The flexible size for the layout group.</param>\n      <param name=\"axis\">The axis to set sizes for. 0 is horizontal and 1 is vertical.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutGroup.SetLayoutVertical\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutGroup.SetProperty(T&amp;,T)\">\n      <summary>\n        <para>Helper method used to set a given property if it has changed.</para>\n      </summary>\n      <param name=\"currentValue\">A reference to the member value.</param>\n      <param name=\"newValue\">The new value.</param>\n    </member>\n    <member name=\"T:UnityEngine.UI.LayoutRebuilder\">\n      <summary>\n        <para>Wrapper class for managing layout rebuilding of CanvasElement.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.LayoutRebuilder.transform\">\n      <summary>\n        <para>See ICanvasElement.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutRebuilder.Equals\">\n      <summary>\n        <para>Does the passed rebuilder point to the same CanvasElement.</para>\n      </summary>\n      <param name=\"other\">Other.</param>\n      <returns>\n        <para>Equal.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutRebuilder.ForceRebuildLayoutImmediate(UnityEngine.RectTransform)\">\n      <summary>\n        <para>Forces an immediate rebuild of the layout element and child layout elements affected by the calculations.</para>\n      </summary>\n      <param name=\"layoutRoot\">The layout element to perform the layout rebuild on.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutRebuilder.GraphicUpdateComplete\">\n      <summary>\n        <para>See ICanvasElement.GraphicUpdateComplete.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutRebuilder.IsDestroyed\">\n      <summary>\n        <para>Has the native representation of this LayoutRebuilder been destroyed?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutRebuilder.LayoutComplete\">\n      <summary>\n        <para>See ICanvasElement.LayoutComplete.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutRebuilder.MarkLayoutForRebuild(UnityEngine.RectTransform)\">\n      <summary>\n        <para>Mark the given RectTransform as needing it's layout to be recalculated during the next layout pass.</para>\n      </summary>\n      <param name=\"rect\">Rect to rebuild.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutRebuilder.Rebuild(UnityEngine.UI.CanvasUpdate)\">\n      <summary>\n        <para>See ICanvasElement.Rebuild.</para>\n      </summary>\n      <param name=\"executing\"></param>\n    </member>\n    <member name=\"T:UnityEngine.UI.LayoutUtility\">\n      <summary>\n        <para>Utility functions for querying layout elements for their minimum, preferred, and flexible sizes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutUtility.GetFlexibleHeight(UnityEngine.RectTransform)\">\n      <summary>\n        <para>Returns the flexible height of the layout element.</para>\n      </summary>\n      <param name=\"rect\">The RectTransform of the layout element to query.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutUtility.GetFlexibleSize(UnityEngine.RectTransform,System.Int32)\">\n      <summary>\n        <para>Returns the flexible size of the layout element.</para>\n      </summary>\n      <param name=\"rect\">The RectTransform of the layout element to query.</param>\n      <param name=\"axis\">The axis to query. This can be 0 or 1.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutUtility.GetFlexibleWidth(UnityEngine.RectTransform)\">\n      <summary>\n        <para>Returns the flexible width of the layout element.</para>\n      </summary>\n      <param name=\"rect\">The RectTransform of the layout element to query.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutUtility.GetLayoutProperty(UnityEngine.RectTransform,System.Func`2&lt;UnityEngine.UI.ILayoutElement,System.Single&gt;,System.Single)\">\n      <summary>\n        <para>Gets a calculated layout property for the layout element with the given RectTransform.</para>\n      </summary>\n      <param name=\"rect\">The RectTransform of the layout element to get a property for.</param>\n      <param name=\"property\">The property to calculate.</param>\n      <param name=\"defaultValue\">The default value to use if no component on the layout element supplies the given property.</param>\n      <param name=\"source\">Optional out parameter to get the component that supplied the calculated value.</param>\n      <returns>\n        <para>The calculated value of the layout property.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutUtility.GetLayoutProperty(UnityEngine.RectTransform,System.Func`2&lt;UnityEngine.UI.ILayoutElement,System.Single&gt;,System.Single,UnityEngine.UI.ILayoutElement&amp;)\">\n      <summary>\n        <para>Gets a calculated layout property for the layout element with the given RectTransform.</para>\n      </summary>\n      <param name=\"rect\">The RectTransform of the layout element to get a property for.</param>\n      <param name=\"property\">The property to calculate.</param>\n      <param name=\"defaultValue\">The default value to use if no component on the layout element supplies the given property.</param>\n      <param name=\"source\">Optional out parameter to get the component that supplied the calculated value.</param>\n      <returns>\n        <para>The calculated value of the layout property.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutUtility.GetMinHeight(UnityEngine.RectTransform)\">\n      <summary>\n        <para>Returns the minimum height of the layout element.</para>\n      </summary>\n      <param name=\"rect\">The RectTransform of the layout element to query.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutUtility.GetMinSize(UnityEngine.RectTransform,System.Int32)\">\n      <summary>\n        <para>Returns the minimum size of the layout element.</para>\n      </summary>\n      <param name=\"rect\">The RectTransform of the layout element to query.</param>\n      <param name=\"axis\">The axis to query. This can be 0 or 1.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutUtility.GetMinWidth(UnityEngine.RectTransform)\">\n      <summary>\n        <para>Returns the minimum width of the layout element.</para>\n      </summary>\n      <param name=\"rect\">The RectTransform of the layout element to query.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutUtility.GetPreferredHeight(UnityEngine.RectTransform)\">\n      <summary>\n        <para>Returns the preferred height of the layout element.</para>\n      </summary>\n      <param name=\"rect\">The RectTransform of the layout element to query.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutUtility.GetPreferredSize(UnityEngine.RectTransform,System.Int32)\">\n      <summary>\n        <para>Returns the preferred size of the layout element.</para>\n      </summary>\n      <param name=\"rect\">The RectTransform of the layout element to query.</param>\n      <param name=\"axis\">The axis to query. This can be 0 or 1.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.LayoutUtility.GetPreferredWidth(UnityEngine.RectTransform)\">\n      <summary>\n        <para>Returns the preferred width of the layout element.</para>\n      </summary>\n      <param name=\"rect\">The RectTransform of the layout element to query.</param>\n    </member>\n    <member name=\"T:UnityEngine.UI.Mask\">\n      <summary>\n        <para>A component for masking children elements.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Mask.graphic\">\n      <summary>\n        <para>The graphic associated with the Mask.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Mask.rectTransform\">\n      <summary>\n        <para>Cached RectTransform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Mask.showMaskGraphic\">\n      <summary>\n        <para>Show the graphic that is associated with the Mask render area.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Mask.GetModifiedMaterial(UnityEngine.Material)\">\n      <summary>\n        <para>See: IMaterialModifier.</para>\n      </summary>\n      <param name=\"baseMaterial\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Mask.IsRaycastLocationValid(UnityEngine.Vector2,UnityEngine.Camera)\">\n      <summary>\n        <para>See:ICanvasRaycastFilter.</para>\n      </summary>\n      <param name=\"sp\"></param>\n      <param name=\"eventCamera\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Mask.MaskEnabled\">\n      <summary>\n        <para>See:IMask.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Mask.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Mask.OnSiblingGraphicEnabledDisabled\">\n      <summary>\n        <para>See:IGraphicEnabledDisabled.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.MaskableGraphic\">\n      <summary>\n        <para>A Graphic that is capable of being masked out.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.MaskableGraphic.maskable\">\n      <summary>\n        <para>Does this graphic allow masking.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.MaskableGraphic.onCullStateChanged\">\n      <summary>\n        <para>Callback issued when culling changes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.MaskableGraphic.Cull(UnityEngine.Rect,System.Boolean)\">\n      <summary>\n        <para>See IClippable.Cull.</para>\n      </summary>\n      <param name=\"clipRect\"></param>\n      <param name=\"validRect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.MaskableGraphic.GetModifiedMaterial(UnityEngine.Material)\">\n      <summary>\n        <para>See IMaterialModifier.GetModifiedMaterial.</para>\n      </summary>\n      <param name=\"baseMaterial\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.MaskableGraphic.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.MaskableGraphic.ParentMaskStateChanged\">\n      <summary>\n        <para>See: IMaskable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.MaskableGraphic.RecalculateClipping\">\n      <summary>\n        <para>See: IClippable.RecalculateClipping.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.MaskableGraphic.RecalculateMasking\">\n      <summary>\n        <para>See: IMaskable.RecalculateMasking.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.MaskableGraphic.SetClipRect(UnityEngine.Rect,System.Boolean)\">\n      <summary>\n        <para>See IClippable.SetClipRect.</para>\n      </summary>\n      <param name=\"clipRect\"></param>\n      <param name=\"validRect\"></param>\n    </member>\n    <member name=\"T:UnityEngine.UI.MaskUtilities\">\n      <summary>\n        <para>Mask related utility class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.MaskUtilities.FindRootSortOverrideCanvas(UnityEngine.Transform)\">\n      <summary>\n        <para>Find a root Canvas.</para>\n      </summary>\n      <param name=\"start\">Search start.</param>\n      <returns>\n        <para>Canvas transform.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.MaskUtilities.GetRectMaskForClippable(UnityEngine.UI.IClippable)\">\n      <summary>\n        <para>Find the correct RectMask2D for a given IClippable.</para>\n      </summary>\n      <param name=\"transform\">Clippable to search from.</param>\n      <param name=\"clippable\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.MaskUtilities.GetRectMasksForClip(UnityEngine.UI.RectMask2D,System.Collections.Generic.List`1&lt;UnityEngine.UI.RectMask2D&gt;)\">\n      <summary>\n        <para>Search for all RectMask2D that apply to the given RectMask2D (includes self).</para>\n      </summary>\n      <param name=\"clipper\"></param>\n      <param name=\"masks\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.MaskUtilities.GetStencilDepth(UnityEngine.Transform,UnityEngine.Transform)\">\n      <summary>\n        <para>Find the stencil depth for a given element.</para>\n      </summary>\n      <param name=\"transform\"></param>\n      <param name=\"stopAfter\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.MaskUtilities.IsDescendantOrSelf(UnityEngine.Transform,UnityEngine.Transform)\">\n      <summary>\n        <para>Helper function to determine if the child is a descendant of father or is father.</para>\n      </summary>\n      <param name=\"father\">The transform to compare against.</param>\n      <param name=\"child\">The starting transform to search up the hierarchy.</param>\n      <returns>\n        <para>Is child equal to father or is a descendant.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.MaskUtilities.Notify2DMaskStateChanged(UnityEngine.Component)\">\n      <summary>\n        <para>Notify all IClippables under the given component that they need to recalculate clipping.</para>\n      </summary>\n      <param name=\"mask\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.MaskUtilities.NotifyStencilStateChanged(UnityEngine.Component)\">\n      <summary>\n        <para>Notify all IMaskable under the given component that they need to recalculate masking.</para>\n      </summary>\n      <param name=\"mask\"></param>\n    </member>\n    <member name=\"T:UnityEngine.UI.Navigation\">\n      <summary>\n        <para>Structure storing details related to navigation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Navigation.defaultNavigation\">\n      <summary>\n        <para>Return a Navigation with sensible default values.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Navigation.mode\">\n      <summary>\n        <para>Navigation mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Navigation.selectOnDown\">\n      <summary>\n        <para>Specify a Selectable UI GameObject to highlight when the down arrow key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Navigation.selectOnLeft\">\n      <summary>\n        <para>Specify a Selectable UI GameObject to highlight when the left arrow key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Navigation.selectOnRight\">\n      <summary>\n        <para>Specify a Selectable UI GameObject to highlight when the right arrow key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Navigation.selectOnUp\">\n      <summary>\n        <para>Specify a Selectable UI GameObject to highlight when the Up arrow key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Navigation.Mode\">\n      <summary>\n        <para>Navigation mode. Used by Selectable.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Navigation.Mode.Automatic\">\n      <summary>\n        <para>Automatic navigation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Navigation.Mode.Explicit\">\n      <summary>\n        <para>Explicit navigaion.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Navigation.Mode.Horizontal\">\n      <summary>\n        <para>Horizontal Navigation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Navigation.Mode.None\">\n      <summary>\n        <para>No navigation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Navigation.Mode.Vertical\">\n      <summary>\n        <para>Vertical navigation.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Outline\">\n      <summary>\n        <para>Adds an outline to a graphic using IVertexModifier.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.PositionAsUV1\">\n      <summary>\n        <para>An IVertexModifier which sets the raw vertex position into UV1 of the generated verts.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.RawImage\">\n      <summary>\n        <para>Displays a Texture2D for the UI System.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.RawImage.mainTexture\">\n      <summary>\n        <para>The RawImage's texture. (ReadOnly).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.RawImage.texture\">\n      <summary>\n        <para>The RawImage's texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.RawImage.uvRect\">\n      <summary>\n        <para>The RawImage texture coordinates.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.RawImage.SetNativeSize\">\n      <summary>\n        <para>Adjusts the raw image size to make it pixel-perfect.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.RectMask2D\">\n      <summary>\n        <para>A 2D rectangular mask that allows for clipping / masking of areas outside the mask.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.RectMask2D.canvasRect\">\n      <summary>\n        <para>Get the Rect for the mask in canvas space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.RectMask2D.rectTransform\">\n      <summary>\n        <para>Get the RectTransform for the mask.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.RectMask2D.AddClippable(UnityEngine.UI.IClippable)\">\n      <summary>\n        <para>Add a [IClippable]] to be tracked by the mask.</para>\n      </summary>\n      <param name=\"clippable\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.RectMask2D.IsRaycastLocationValid(UnityEngine.Vector2,UnityEngine.Camera)\">\n      <summary>\n        <para>See:ICanvasRaycastFilter.</para>\n      </summary>\n      <param name=\"sp\"></param>\n      <param name=\"eventCamera\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.RectMask2D.PerformClipping\">\n      <summary>\n        <para>See: IClipper.PerformClipping.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.RectMask2D.RemoveClippable(UnityEngine.UI.IClippable)\">\n      <summary>\n        <para>Remove an IClippable from being tracked by the mask.</para>\n      </summary>\n      <param name=\"clippable\"></param>\n    </member>\n    <member name=\"T:UnityEngine.UI.Scrollbar\">\n      <summary>\n        <para>A standard scrollbar with a variable sized handle that can be dragged between 0 and 1.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Scrollbar.direction\">\n      <summary>\n        <para>The direction of the scrollbar from minimum to maximum value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Scrollbar.handleRect\">\n      <summary>\n        <para>The RectTransform to use for the handle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Scrollbar.numberOfSteps\">\n      <summary>\n        <para>The number of steps to use for the value. A value of 0 disables use of steps.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Scrollbar.onValueChanged\">\n      <summary>\n        <para>Handling for when the scrollbar value is changed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Scrollbar.size\">\n      <summary>\n        <para>The size of the scrollbar handle where 1 means it fills the entire scrollbar.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Scrollbar.value\">\n      <summary>\n        <para>The current value of the scrollbar, between 0 and 1.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Scrollbar.ClickRepeat(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Coroutine function for handling continual press during Scrollbar.OnPointerDown.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"T:UnityEngine.UI.Scrollbar.Direction\">\n      <summary>\n        <para>Setting that indicates one of four directions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Scrollbar.Direction.BottomToTop\">\n      <summary>\n        <para>From bottom to top.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Scrollbar.Direction.LeftToRight\">\n      <summary>\n        <para>From left to right.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Scrollbar.Direction.RightToLeft\">\n      <summary>\n        <para>From right to left.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Scrollbar.Direction.TopToBottom\">\n      <summary>\n        <para>From top to bottom.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Scrollbar.FindSelectableOnDown\">\n      <summary>\n        <para>See member in base class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Scrollbar.FindSelectableOnLeft\">\n      <summary>\n        <para>See member in base class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Scrollbar.FindSelectableOnRight\">\n      <summary>\n        <para>See member in base class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Scrollbar.FindSelectableOnUp\">\n      <summary>\n        <para>See member in base class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Scrollbar.GraphicUpdateComplete\">\n      <summary>\n        <para>See ICanvasElement.GraphicUpdateComplete.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Scrollbar.LayoutComplete\">\n      <summary>\n        <para>See ICanvasElement.LayoutComplete.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Scrollbar.OnBeginDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Handling for when the scrollbar value is beginning to be dragged.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Scrollbar.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Scrollbar.OnDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Handling for when the scrollbar value is dragged.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Scrollbar.OnInitializePotentialDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>See: IInitializePotentialDragHandler.OnInitializePotentialDrag.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Scrollbar.OnMove(UnityEngine.EventSystems.AxisEventData)\">\n      <summary>\n        <para>Handling for movement events.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Scrollbar.OnPointerDown(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Event triggered when pointer is pressed down on the scrollbar.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Scrollbar.OnPointerUp(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Event triggered when pointer is released after pressing on the scrollbar.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Scrollbar.Rebuild(UnityEngine.UI.CanvasUpdate)\">\n      <summary>\n        <para>Handling for when the canvas is rebuilt.</para>\n      </summary>\n      <param name=\"executing\"></param>\n    </member>\n    <member name=\"T:UnityEngine.UI.Scrollbar.ScrollEvent\">\n      <summary>\n        <para>UnityEvent callback for when a scrollbar is scrolled.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Scrollbar.SetDirection\">\n      <summary>\n        <para>Set the direction of the scrollbar, optionally setting the layout as well.</para>\n      </summary>\n      <param name=\"direction\">The direction of the scrollbar.</param>\n      <param name=\"includeRectLayouts\">Should the layout be flipped together with the direction?</param>\n    </member>\n    <member name=\"T:UnityEngine.UI.ScrollRect\">\n      <summary>\n        <para>A component for making a child RectTransform scroll.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.content\">\n      <summary>\n        <para>The content that can be scrolled. It should be a child of the GameObject with ScrollRect on it.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.decelerationRate\">\n      <summary>\n        <para>The rate at which movement slows down.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.elasticity\">\n      <summary>\n        <para>The amount of elasticity to use when the content moves beyond the scroll rect.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.flexibleHeight\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.flexibleWidth\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.horizontal\">\n      <summary>\n        <para>Should horizontal scrolling be enabled?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.horizontalNormalizedPosition\">\n      <summary>\n        <para>The horizontal scroll position as a value between 0 and 1, with 0 being at the left.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.horizontalScrollbar\">\n      <summary>\n        <para>Optional Scrollbar object linked to the horizontal scrolling of the ScrollRect.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.horizontalScrollbarSpacing\">\n      <summary>\n        <para>The space between the scrollbar and the viewport.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.horizontalScrollbarVisibility\">\n      <summary>\n        <para>The mode of visibility for the horizontal scrollbar.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.inertia\">\n      <summary>\n        <para>Should movement inertia be enabled?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.layoutPriority\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.minHeight\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.minWidth\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.movementType\">\n      <summary>\n        <para>The behavior to use when the content moves beyond the scroll rect.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.normalizedPosition\">\n      <summary>\n        <para>The scroll position as a Vector2 between (0,0) and (1,1) with (0,0) being the lower left corner.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.onValueChanged\">\n      <summary>\n        <para>Callback executed when the position of the child changes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.preferredHeight\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.preferredWidth\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.scrollSensitivity\">\n      <summary>\n        <para>The sensitivity to scroll wheel and track pad scroll events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.velocity\">\n      <summary>\n        <para>The current velocity of the content.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.vertical\">\n      <summary>\n        <para>Should vertical scrolling be enabled?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.verticalNormalizedPosition\">\n      <summary>\n        <para>The vertical scroll position as a value between 0 and 1, with 0 being at the bottom.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.verticalScrollbar\">\n      <summary>\n        <para>Optional Scrollbar object linked to the vertical scrolling of the ScrollRect.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.verticalScrollbarSpacing\">\n      <summary>\n        <para>The space between the scrollbar and the viewport.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.verticalScrollbarVisibility\">\n      <summary>\n        <para>The mode of visibility for the vertical scrollbar.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ScrollRect.viewport\">\n      <summary>\n        <para>Reference to the viewport RectTransform that is the parent of the content RectTransform.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.CalculateLayoutInputHorizontal\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.CalculateLayoutInputVertical\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.GraphicUpdateComplete\">\n      <summary>\n        <para>See ICanvasElement.GraphicUpdateComplete.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.IsActive\">\n      <summary>\n        <para>See member in base class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.LayoutComplete\">\n      <summary>\n        <para>See ICanvasElement.LayoutComplete.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.ScrollRect.MovementType\">\n      <summary>\n        <para>A setting for which behavior to use when content moves beyond the confines of its container.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.ScrollRect.MovementType.Clamped\">\n      <summary>\n        <para>Clamped movement. The content can not be moved beyond its container.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.ScrollRect.MovementType.Elastic\">\n      <summary>\n        <para>Elastic movement. The content is allowed to temporarily move beyond the container, but is pulled back elastically.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.ScrollRect.MovementType.Unrestricted\">\n      <summary>\n        <para>Unrestricted movement. The content can move forever.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.OnBeginDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Handling for when the content is being dragged.</para>\n      </summary>\n      <param name=\"eventData\">The values used when the drag is started.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.OnDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Handling for when the content is dragged.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.OnEndDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Handling for when the content has finished being dragged.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.OnInitializePotentialDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>See: IInitializePotentialDragHandler.OnInitializePotentialDrag.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.OnScroll(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>See IScrollHandler.OnScroll.</para>\n      </summary>\n      <param name=\"data\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.Rebuild(UnityEngine.UI.CanvasUpdate)\">\n      <summary>\n        <para>Rebuilds the scroll rect data after initialization.</para>\n      </summary>\n      <param name=\"executing\">The current step of the rendering CanvasUpdate cycle.</param>\n    </member>\n    <member name=\"T:UnityEngine.UI.ScrollRect.ScrollbarVisibility\">\n      <summary>\n        <para>Enum for which behavior to use for scrollbar visibility.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.ScrollRect.ScrollbarVisibility.AutoHide\">\n      <summary>\n        <para>Automatically hide the scrollbar when no scrolling is needed on this axis. The viewport rect will not be changed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.ScrollRect.ScrollbarVisibility.AutoHideAndExpandViewport\">\n      <summary>\n        <para>Automatically hide the scrollbar when no scrolling is needed on this axis, and expand the viewport rect accordingly.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.ScrollRect.ScrollbarVisibility.Permanent\">\n      <summary>\n        <para>Always show the scrollbar.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.ScrollRect.ScrollRectEvent\">\n      <summary>\n        <para>Event type used by the ScrollRect.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.SetContentAnchoredPosition(UnityEngine.Vector2)\">\n      <summary>\n        <para>Sets the anchored position of the content.</para>\n      </summary>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.SetDirty\">\n      <summary>\n        <para>Override to alter or add to the code that keeps the appearance of the scroll rect synced with its data.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.SetDirtyCaching\">\n      <summary>\n        <para>Override to alter or add to the code that caches data to avoid repeated heavy operations.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.SetLayoutHorizontal\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.SetLayoutVertical\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.SetNormalizedPosition(System.Single,System.Int32)\">\n      <summary>\n        <para>Set the horizontal or vertical scroll position as a value between 0 and 1, with 0 being at the left or at the bottom.</para>\n      </summary>\n      <param name=\"value\">The position to set, between 0 and 1.</param>\n      <param name=\"axis\">The axis to set: 0 for horizontal, 1 for vertical.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.StopMovement\">\n      <summary>\n        <para>Sets the velocity to zero on both axes so the content stops moving.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.UpdateBounds\">\n      <summary>\n        <para>Calculate the bounds the ScrollRect should be using.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ScrollRect.UpdatePrevData\">\n      <summary>\n        <para>Helper function to update the previous data fields on a ScrollRect. Call this before you change data in the ScrollRect.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Selectable\">\n      <summary>\n        <para>Simple selectable object - derived from to create a selectable control.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Selectable.allSelectables\">\n      <summary>\n        <para>List of all the selectable objects currently active in the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Selectable.animationTriggers\">\n      <summary>\n        <para>The AnimationTriggers for this selectable object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Selectable.animator\">\n      <summary>\n        <para>Convenience function to get the Animator component on the GameObject.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Selectable.colors\">\n      <summary>\n        <para>The ColorBlock for this selectable object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Selectable.image\">\n      <summary>\n        <para>Convenience function that converts the referenced Graphic to a Image, if possible.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Selectable.interactable\">\n      <summary>\n        <para>Use to enable or disable the ability to select a selectable UI element (for example, a Button).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Selectable.navigation\">\n      <summary>\n        <para>The Navigation setting for this selectable object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Selectable.spriteState\">\n      <summary>\n        <para>The SpriteState for this selectable object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Selectable.targetGraphic\">\n      <summary>\n        <para>Graphic that will be transitioned upon.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Selectable.transition\">\n      <summary>\n        <para>The type of transition that will be applied to the targetGraphic when the state changes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.DoStateTransition(UnityEngine.UI.Selectable/SelectionState,System.Boolean)\">\n      <summary>\n        <para>Transition the Selectable to the entered state.</para>\n      </summary>\n      <param name=\"state\">State to transition to.</param>\n      <param name=\"instant\">Should the transition occur instantly.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.FindSelectable(UnityEngine.Vector3)\">\n      <summary>\n        <para>Finds the selectable object next to this one.</para>\n      </summary>\n      <param name=\"dir\">The direction in which to search for a neighbouring Selectable object.</param>\n      <returns>\n        <para>The neighbouring Selectable object. Null if none found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.FindSelectableOnDown\">\n      <summary>\n        <para>Find the selectable object below this one.</para>\n      </summary>\n      <returns>\n        <para>The Selectable object below current.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.FindSelectableOnLeft\">\n      <summary>\n        <para>Find the selectable object to the left of this one.</para>\n      </summary>\n      <returns>\n        <para>The Selectable object to the left of current.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.FindSelectableOnRight\">\n      <summary>\n        <para>Find the selectable object to the right of this one.</para>\n      </summary>\n      <returns>\n        <para>The Selectable object to the right of current.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.FindSelectableOnUp\">\n      <summary>\n        <para>Find the selectable object above this one.</para>\n      </summary>\n      <returns>\n        <para>The Selectable object above current.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.InstantClearState\">\n      <summary>\n        <para>Clear any internal state from the Selectable (used when disabling).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.IsHighlighted(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Returns whether the selectable is currently 'highlighted' or not.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.IsInteractable\">\n      <summary>\n        <para>UI.Selectable.IsInteractable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.IsPressed(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Whether the current selectable is being pressed.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.IsPressed\">\n      <summary>\n        <para>Whether the current selectable is being pressed.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.OnDeselect(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Unset selection and transition to appropriate state.</para>\n      </summary>\n      <param name=\"eventData\">The eventData usually sent by the EventSystem.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.OnMove(UnityEngine.EventSystems.AxisEventData)\">\n      <summary>\n        <para>Determine in which of the 4 move directions the next selectable object should be found.</para>\n      </summary>\n      <param name=\"eventData\">The EventData usually sent by the EventSystem.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.OnPointerDown(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Evaluate current state and transition to pressed state.</para>\n      </summary>\n      <param name=\"eventData\">The EventData usually sent by the EventSystem.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.OnPointerEnter(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Evaluate current state and transition to appropriate state.</para>\n      </summary>\n      <param name=\"eventData\">The EventData usually sent by the EventSystem.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.OnPointerExit(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Evaluate current state and transition to normal state.</para>\n      </summary>\n      <param name=\"eventData\">The EventData usually sent by the EventSystem.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.OnPointerUp(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Evaluate eventData and transition to appropriate state.</para>\n      </summary>\n      <param name=\"eventData\">The EventData usually sent by the EventSystem.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.OnSelect(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Set selection and transition to appropriate state.</para>\n      </summary>\n      <param name=\"eventData\">The EventData usually sent by the EventSystem.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.Select\">\n      <summary>\n        <para>Selects this Selectable.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Selectable.SelectionState\">\n      <summary>\n        <para>An enumeration of selected states of objects.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Selectable.SelectionState.Disabled\">\n      <summary>\n        <para>The UI object cannot be selected.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Selectable.SelectionState.Highlighted\">\n      <summary>\n        <para>The UI object is highlighted.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Selectable.SelectionState.Normal\">\n      <summary>\n        <para>The UI object can be selected.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Selectable.SelectionState.Pressed\">\n      <summary>\n        <para>The UI object is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Selectable.Transition\">\n      <summary>\n        <para>Transition mode for a Selectable.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Selectable.Transition.Animation\">\n      <summary>\n        <para>Use an animation transition.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Selectable.Transition.ColorTint\">\n      <summary>\n        <para>Use an color tint transition.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Selectable.Transition.None\">\n      <summary>\n        <para>No Transition.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Selectable.Transition.SpriteSwap\">\n      <summary>\n        <para>Use a sprite swap transition.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Selectable.UpdateSelectionState(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Internally update the selection state of the Selectable.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"T:UnityEngine.UI.Shadow\">\n      <summary>\n        <para>Adds an outline to a graphic using IVertexModifier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Shadow.effectColor\">\n      <summary>\n        <para>Color for the effect.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Shadow.effectDistance\">\n      <summary>\n        <para>How far is the shadow from the graphic.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Shadow.useGraphicAlpha\">\n      <summary>\n        <para>Should the shadow inherit the alpha from the graphic?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Shadow.ApplyShadow(System.Collections.Generic.List`1&lt;UnityEngine.UIVertex&gt;,UnityEngine.Color32,System.Int32,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Duplicate vertices from start to end and turn them into shadows with the given offset.</para>\n      </summary>\n      <param name=\"verts\">Verts List.</param>\n      <param name=\"color\">Shadow Color.</param>\n      <param name=\"start\">Start Index.</param>\n      <param name=\"end\">End Index.</param>\n      <param name=\"x\">Shadow x offset.</param>\n      <param name=\"y\">Shadow y offset.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Shadow.ModifyMesh\">\n      <summary>\n        <para>See: IMeshModifier.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Slider\">\n      <summary>\n        <para>A standard slider that can be moved between a minimum and maximum value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Slider.direction\">\n      <summary>\n        <para>The direction of the slider, from minimum to maximum value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Slider.fillRect\">\n      <summary>\n        <para>Optional RectTransform to use as fill for the slider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Slider.handleRect\">\n      <summary>\n        <para>Optional RectTransform to use as a handle for the slider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Slider.maxValue\">\n      <summary>\n        <para>The maximum allowed value of the slider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Slider.minValue\">\n      <summary>\n        <para>The minimum allowed value of the slider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Slider.normalizedValue\">\n      <summary>\n        <para>The current value of the slider normalized into a value between 0 and 1.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Slider.onValueChanged\">\n      <summary>\n        <para>Callback executed when the value of the slider is changed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Slider.value\">\n      <summary>\n        <para>The current value of the slider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Slider.wholeNumbers\">\n      <summary>\n        <para>Should the value only be allowed to be whole numbers?</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Slider.Direction\">\n      <summary>\n        <para>Setting that indicates one of four directions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Slider.Direction.BottomToTop\">\n      <summary>\n        <para>From bottom to top.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Slider.Direction.LeftToRight\">\n      <summary>\n        <para>From left to right.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Slider.Direction.RightToLeft\">\n      <summary>\n        <para>From right to left.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Slider.Direction.TopToBottom\">\n      <summary>\n        <para>From top to bottom.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Slider.FindSelectableOnDown\">\n      <summary>\n        <para>See member in base class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Slider.FindSelectableOnLeft\">\n      <summary>\n        <para>See member in base class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Slider.FindSelectableOnRight\">\n      <summary>\n        <para>See member in base class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Slider.FindSelectableOnUp\">\n      <summary>\n        <para>See member in base class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Slider.GraphicUpdateComplete\">\n      <summary>\n        <para>See ICanvasElement.GraphicUpdateComplete.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Slider.LayoutComplete\">\n      <summary>\n        <para>See ICanvasElement.LayoutComplete.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Slider.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Slider.OnDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Handling for when the slider is dragged.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Slider.OnInitializePotentialDrag(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>See: IInitializePotentialDragHandler.OnInitializePotentialDrag.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Slider.OnMove(UnityEngine.EventSystems.AxisEventData)\">\n      <summary>\n        <para>Handling for movement events.</para>\n      </summary>\n      <param name=\"eventData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Slider.Rebuild(UnityEngine.UI.CanvasUpdate)\">\n      <summary>\n        <para>Handling for when the canvas is rebuilt.</para>\n      </summary>\n      <param name=\"executing\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Slider.Set(System.Single,System.Boolean)\">\n      <summary>\n        <para>Set the value of the slider.</para>\n      </summary>\n      <param name=\"input\">The new value for the slider.</param>\n      <param name=\"sendCallback\">If the OnValueChanged callback should be invoked.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Slider.SetDirection\">\n      <summary>\n        <para>Sets the direction of this slider, optionally changing the layout as well.</para>\n      </summary>\n      <param name=\"direction\">The direction of the slider.</param>\n      <param name=\"includeRectLayouts\">Should the layout be flipped together with the slider direction?</param>\n    </member>\n    <member name=\"T:UnityEngine.UI.Slider.SliderEvent\">\n      <summary>\n        <para>Event type used by the UI.Slider.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.SpriteState\">\n      <summary>\n        <para>Structure to store the state of a sprite transition on a Selectable.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.SpriteState.disabledSprite\">\n      <summary>\n        <para>Disabled sprite.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.SpriteState.highlightedSprite\">\n      <summary>\n        <para>Highlighted sprite.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.SpriteState.pressedSprite\">\n      <summary>\n        <para>Pressed sprite.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Text\">\n      <summary>\n        <para>The default Graphic to draw font data to screen.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.alignByGeometry\">\n      <summary>\n        <para>Use the extents of glyph geometry to perform horizontal alignment rather than glyph metrics.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.alignment\">\n      <summary>\n        <para>The positioning of the text reliative to its RectTransform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.cachedTextGenerator\">\n      <summary>\n        <para>The cached TextGenerator used when generating visible Text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.cachedTextGeneratorForLayout\">\n      <summary>\n        <para>The cached TextGenerator used when determine Layout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.flexibleHeight\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.flexibleWidth\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.font\">\n      <summary>\n        <para>The Font used by the text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.fontSize\">\n      <summary>\n        <para>The size that the Font should render at.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.fontStyle\">\n      <summary>\n        <para>FontStyle used by the text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.horizontalOverflow\">\n      <summary>\n        <para>Horizontal overflow mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.layoutPriority\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.lineSpacing\">\n      <summary>\n        <para>Line spacing, specified as a factor of font line height. A value of 1 will produce normal line spacing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.mainTexture\">\n      <summary>\n        <para>The Texture that comes from the Font.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.minHeight\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.minWidth\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.pixelsPerUnit\">\n      <summary>\n        <para>(Read Only) Provides information about how fonts are scale to the screen.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.preferredHeight\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.preferredWidth\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.resizeTextForBestFit\">\n      <summary>\n        <para>Should the text be allowed to auto resized.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.resizeTextMaxSize\">\n      <summary>\n        <para>The maximum size the text is allowed to be. 1 = infinitly large.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.resizeTextMinSize\">\n      <summary>\n        <para>The minimum size the text is allowed to be.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.supportRichText\">\n      <summary>\n        <para>Whether this Text will support rich text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.text\">\n      <summary>\n        <para>The string value this Text displays.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Text.verticalOverflow\">\n      <summary>\n        <para>Vertical overflow mode.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Text.CalculateLayoutInputHorizontal\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Text.CalculateLayoutInputVertical\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Text.FontTextureChanged\">\n      <summary>\n        <para>Called by the [FontUpdateTracker] when the texture associated with a font is modified.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Text.GetGenerationSettings(UnityEngine.Vector2)\">\n      <summary>\n        <para>Convenience function to populate the generation setting for the text.</para>\n      </summary>\n      <param name=\"extents\">The extents the text can draw in.</param>\n      <returns>\n        <para>Generated settings.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.Text.GetTextAnchorPivot(UnityEngine.TextAnchor)\">\n      <summary>\n        <para>Convenience function to determine the vector offset of the anchor.</para>\n      </summary>\n      <param name=\"anchor\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Text.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Toggle\">\n      <summary>\n        <para>A standard toggle that has an on / off state.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Toggle.graphic\">\n      <summary>\n        <para>Graphic affected by the toggle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Toggle.group\">\n      <summary>\n        <para>Group the toggle belongs to.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.Toggle.isOn\">\n      <summary>\n        <para>Return or set whether the Toggle is on or not.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Toggle.onValueChanged\">\n      <summary>\n        <para>Callback executed when the value of the toggle is changed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Toggle.toggleTransition\">\n      <summary>\n        <para>Transition mode for the toggle.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Toggle.GraphicUpdateComplete\">\n      <summary>\n        <para>See ICanvasElement.GraphicUpdateComplete.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Toggle.LayoutComplete\">\n      <summary>\n        <para>See ICanvasElement.LayoutComplete.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Toggle.OnDisable\">\n      <summary>\n        <para>See MonoBehaviour.OnDisable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.Toggle.OnPointerClick(UnityEngine.EventSystems.PointerEventData)\">\n      <summary>\n        <para>Handling for when the toggle is 'clicked'.</para>\n      </summary>\n      <param name=\"eventData\">Current event.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Toggle.OnSubmit(UnityEngine.EventSystems.BaseEventData)\">\n      <summary>\n        <para>Handling for when the submit key is pressed.</para>\n      </summary>\n      <param name=\"eventData\">Current event.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.Toggle.Rebuild(UnityEngine.UI.CanvasUpdate)\">\n      <summary>\n        <para>Handling for when the canvas is rebuilt.</para>\n      </summary>\n      <param name=\"executing\"></param>\n    </member>\n    <member name=\"T:UnityEngine.UI.Toggle.ToggleEvent\">\n      <summary>\n        <para>UnityEvent callback for when a toggle is toggled.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.Toggle.ToggleTransition\">\n      <summary>\n        <para>Display settings for when a toggle is activated or deactivated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Toggle.ToggleTransition.Fade\">\n      <summary>\n        <para>Fade the toggle in / out.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UI.Toggle.ToggleTransition.None\">\n      <summary>\n        <para>Show / hide the toggle instantly.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UI.ToggleGroup\">\n      <summary>\n        <para>A component that represents a group of UI.Toggles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.ToggleGroup.allowSwitchOff\">\n      <summary>\n        <para>Is it allowed that no toggle is switched on?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ToggleGroup.ActiveToggles\">\n      <summary>\n        <para>Returns the toggles in this group that are active.</para>\n      </summary>\n      <returns>\n        <para>The active toggles in the group.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.UI.ToggleGroup.AnyTogglesOn\">\n      <summary>\n        <para>Are any of the toggles on?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ToggleGroup.NotifyToggleOn\">\n      <summary>\n        <para>Notify the group that the given toggle is enabled.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ToggleGroup.RegisterToggle\">\n      <summary>\n        <para>Register a toggle with the group.</para>\n      </summary>\n      <param name=\"toggle\">To register.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.ToggleGroup.SetAllTogglesOff\">\n      <summary>\n        <para>Switch all toggles off.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.ToggleGroup.UnregisterToggle\">\n      <summary>\n        <para>Toggle to unregister.</para>\n      </summary>\n      <param name=\"toggle\">Unregister toggle.</param>\n    </member>\n    <member name=\"T:UnityEngine.UI.VertexHelper\">\n      <summary>\n        <para>A utility class that can aid in the generation of meshes for the UI.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.VertexHelper.currentIndexCount\">\n      <summary>\n        <para>Get the number of indices set on the VertexHelper.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UI.VertexHelper.currentVertCount\">\n      <summary>\n        <para>Current number of vertices in the buffer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.VertexHelper.AddTriangle(System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Add a triangle to the buffer.</para>\n      </summary>\n      <param name=\"idx0\">Index 0.</param>\n      <param name=\"idx1\">Index 1.</param>\n      <param name=\"idx2\">Index 2.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.VertexHelper.AddUIVertexQuad(UnityEngine.UIVertex[])\">\n      <summary>\n        <para>Add a quad to the stream.</para>\n      </summary>\n      <param name=\"verts\">4 Vertices representing the quad.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.VertexHelper.AddUIVertexStream(System.Collections.Generic.List`1&lt;UnityEngine.UIVertex&gt;,System.Collections.Generic.List`1&lt;System.Int32&gt;)\">\n      <summary>\n        <para>Add a stream of custom UIVertex and corresponding indices.</para>\n      </summary>\n      <param name=\"verts\">The custom stream of verts to add to the helpers internal data.</param>\n      <param name=\"indices\">The custom stream of indices to add to the helpers internal data.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.VertexHelper.AddUIVertexTriangleStream(System.Collections.Generic.List`1&lt;UnityEngine.UIVertex&gt;)\">\n      <summary>\n        <para>Add a list of triangles to the stream.</para>\n      </summary>\n      <param name=\"verts\">Vertices to add. Length should be divisible by 3.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.VertexHelper.AddVert(UnityEngine.Vector3,UnityEngine.Color32,UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.Vector3,UnityEngine.Vector4)\">\n      <summary>\n        <para>Add a single vertex to the stream.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"color\"></param>\n      <param name=\"uv0\"></param>\n      <param name=\"uv1\"></param>\n      <param name=\"normal\"></param>\n      <param name=\"tangent\"></param>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.VertexHelper.AddVert(UnityEngine.Vector3,UnityEngine.Color32,UnityEngine.Vector2)\">\n      <summary>\n        <para>Add a single vertex to the stream.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"color\"></param>\n      <param name=\"uv0\"></param>\n      <param name=\"uv1\"></param>\n      <param name=\"normal\"></param>\n      <param name=\"tangent\"></param>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.VertexHelper.AddVert(UnityEngine.UIVertex)\">\n      <summary>\n        <para>Add a single vertex to the stream.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"color\"></param>\n      <param name=\"uv0\"></param>\n      <param name=\"uv1\"></param>\n      <param name=\"normal\"></param>\n      <param name=\"tangent\"></param>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.VertexHelper.Clear\">\n      <summary>\n        <para>Clear all vertices from the stream.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.VertexHelper.Dispose\">\n      <summary>\n        <para>Cleanup allocated memory.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.VertexHelper.FillMesh(UnityEngine.Mesh)\">\n      <summary>\n        <para>Fill the given mesh with the stream data.</para>\n      </summary>\n      <param name=\"mesh\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.VertexHelper.GetUIVertexStream(System.Collections.Generic.List`1&lt;UnityEngine.UIVertex&gt;)\">\n      <summary>\n        <para>Create a stream of UI vertex (in triangles) from the stream.</para>\n      </summary>\n      <param name=\"stream\"></param>\n    </member>\n    <member name=\"M:UnityEngine.UI.VertexHelper.PopulateUIVertex(UnityEngine.UIVertex&amp;,System.Int32)\">\n      <summary>\n        <para>Fill a UIVertex with data from index i of the stream.</para>\n      </summary>\n      <param name=\"vertex\">Vertex to populate.</param>\n      <param name=\"i\">Index to populate from.</param>\n    </member>\n    <member name=\"M:UnityEngine.UI.VertexHelper.SetUIVertex(UnityEngine.UIVertex,System.Int32)\">\n      <summary>\n        <para>Set a UIVertex at the given index.</para>\n      </summary>\n      <param name=\"vertex\"></param>\n      <param name=\"i\"></param>\n    </member>\n    <member name=\"T:UnityEngine.UI.VerticalLayoutGroup\">\n      <summary>\n        <para>Layout child layout elements below each other.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.VerticalLayoutGroup.CalculateLayoutInputHorizontal\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.VerticalLayoutGroup.CalculateLayoutInputVertical\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.VerticalLayoutGroup.SetLayoutHorizontal\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UI.VerticalLayoutGroup.SetLayoutVertical\">\n      <summary>\n        <para>Called by the layout system.</para>\n      </summary>\n    </member>\n  </members>\n</doc>\n"
  },
  {
    "path": "Resources/UnityEngine.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n<doc>\n  <members>\n    <assembly>\n      <name>UnityEngine</name>\n    </assembly>\n    <member name=\"T:UnityEngine.AccelerationEvent\">\n      <summary>\n        <para>Structure describing acceleration status of the device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AccelerationEvent.acceleration\">\n      <summary>\n        <para>Value of acceleration.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AccelerationEvent.deltaTime\">\n      <summary>\n        <para>Amount of time passed since last accelerometer measurement.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Accessibility.VisionUtility\">\n      <summary>\n        <para>A class containing methods to assist with accessibility for users with different vision capabilities.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Accessibility.VisionUtility.GetColorBlindSafePalette(UnityEngine.Color[],System.Single,System.Single)\">\n      <summary>\n        <para>Gets a palette of colors that should be distinguishable for normal vision, deuteranopia, protanopia, and tritanopia.</para>\n      </summary>\n      <param name=\"palette\">An array of colors to populate with a palette.</param>\n      <param name=\"minimumLuminance\">Minimum allowable perceived luminance from 0 to 1. A value of 0.2 or greater is recommended for dark backgrounds.</param>\n      <param name=\"maximumLuminance\">Maximum allowable perceived luminance from 0 to 1. A value of 0.8 or less is recommended for light backgrounds.</param>\n      <returns>\n        <para>The number of unambiguous colors in the palette.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.AddComponentMenu\">\n      <summary>\n        <para>The AddComponentMenu attribute allows you to place a script anywhere in the \"Component\" menu, instead of just the \"Component-&gt;Scripts\" menu.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AddComponentMenu.componentOrder\">\n      <summary>\n        <para>The order of the component in the component menu (lower is higher to the top).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AddComponentMenu.#ctor(System.String)\">\n      <summary>\n        <para>Add an item in the Component menu.</para>\n      </summary>\n      <param name=\"menuName\">The path to the component.</param>\n      <param name=\"order\">Where in the component menu to add the new item.</param>\n    </member>\n    <member name=\"M:UnityEngine.AddComponentMenu.#ctor(System.String,System.Int32)\">\n      <summary>\n        <para>Add an item in the Component menu.</para>\n      </summary>\n      <param name=\"menuName\">The path to the component.</param>\n      <param name=\"order\">Where in the component menu to add the new item.</param>\n    </member>\n    <member name=\"T:UnityEngine.AdditionalCanvasShaderChannels\">\n      <summary>\n        <para>Enum mask of possible shader channel properties that can also be included when the Canvas mesh is created.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AdditionalCanvasShaderChannels.None\">\n      <summary>\n        <para>No additional shader parameters are needed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AdditionalCanvasShaderChannels.Normal\">\n      <summary>\n        <para>Include the normals on the mesh vertices.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AdditionalCanvasShaderChannels.Tangent\">\n      <summary>\n        <para>Include the Tangent on the mesh vertices.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AdditionalCanvasShaderChannels.TexCoord1\">\n      <summary>\n        <para>Include UV1 on the mesh vertices.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AdditionalCanvasShaderChannels.TexCoord2\">\n      <summary>\n        <para>Include UV2 on the mesh vertices.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AdditionalCanvasShaderChannels.TexCoord3\">\n      <summary>\n        <para>Include UV3 on the mesh vertices.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMesh\">\n      <summary>\n        <para>Singleton class to access the baked NavMesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMesh.avoidancePredictionTime\">\n      <summary>\n        <para>Describes how far in the future the agents predict collisions for avoidance.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMesh.onPreUpdate\">\n      <summary>\n        <para>Set a function to be called before the NavMesh is updated during the frame update execution.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMesh.pathfindingIterationsPerFrame\">\n      <summary>\n        <para>The maximum amount of nodes processed each frame in the asynchronous pathfinding process.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.AddLink(UnityEngine.AI.NavMeshLinkData)\">\n      <summary>\n        <para>Adds a link to the NavMesh. The link is described by the NavMeshLinkData struct.</para>\n      </summary>\n      <param name=\"link\">Describing the properties of the link.</param>\n      <returns>\n        <para>Representing the added link.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.AddLink(UnityEngine.AI.NavMeshLinkData,UnityEngine.Vector3,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Adds a link to the NavMesh. The link is described by the NavMeshLinkData struct.</para>\n      </summary>\n      <param name=\"link\">Describing the properties of the link.</param>\n      <param name=\"position\">Translate the link to this position.</param>\n      <param name=\"rotation\">Rotate the link to this orientation.</param>\n      <returns>\n        <para>Representing the added link.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.AddNavMeshData(UnityEngine.AI.NavMeshData)\">\n      <summary>\n        <para>Adds the specified NavMeshData to the game.</para>\n      </summary>\n      <param name=\"navMeshData\">Contains the data for the navmesh.</param>\n      <returns>\n        <para>Representing the added navmesh.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.AddNavMeshData(UnityEngine.AI.NavMeshData,UnityEngine.Vector3,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Adds the specified NavMeshData to the game.</para>\n      </summary>\n      <param name=\"navMeshData\">Contains the data for the navmesh.</param>\n      <param name=\"position\">Translate the navmesh to this position.</param>\n      <param name=\"rotation\">Rotate the navmesh to this orientation.</param>\n      <returns>\n        <para>Representing the added navmesh.</para>\n      </returns>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMesh.AllAreas\">\n      <summary>\n        <para>Area mask constant that includes all NavMesh areas.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.CalculatePath(UnityEngine.Vector3,UnityEngine.Vector3,System.Int32,UnityEngine.AI.NavMeshPath)\">\n      <summary>\n        <para>Calculate a path between two points and store the resulting path.</para>\n      </summary>\n      <param name=\"sourcePosition\">The initial position of the path requested.</param>\n      <param name=\"targetPosition\">The final position of the path requested.</param>\n      <param name=\"areaMask\">A bitfield mask specifying which NavMesh areas can be passed when calculating a path.</param>\n      <param name=\"path\">The resulting path.</param>\n      <returns>\n        <para>True if a either a complete or partial path is found and false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.CalculatePath(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.AI.NavMeshQueryFilter,UnityEngine.AI.NavMeshPath)\">\n      <summary>\n        <para>Calculates a path between two positions mapped to the NavMesh, subject to the constraints and costs defined by the filter argument.</para>\n      </summary>\n      <param name=\"sourcePosition\">The initial position of the path requested.</param>\n      <param name=\"targetPosition\">The final position of the path requested.</param>\n      <param name=\"filter\">A filter specifying the cost of NavMesh areas that can be passed when calculating a path.</param>\n      <param name=\"path\">The resulting path.</param>\n      <returns>\n        <para>True if a either a complete or partial path is found and false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.CalculateTriangulation\">\n      <summary>\n        <para>Calculates triangulation of the current navmesh.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.CreateSettings\">\n      <summary>\n        <para>Creates and returns a new entry of NavMesh build settings available for runtime NavMesh building.</para>\n      </summary>\n      <returns>\n        <para>The created settings.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.FindClosestEdge(UnityEngine.Vector3,UnityEngine.AI.NavMeshHit&amp;,System.Int32)\">\n      <summary>\n        <para>Locate the closest NavMesh edge from a point on the NavMesh.</para>\n      </summary>\n      <param name=\"sourcePosition\">The origin of the distance query.</param>\n      <param name=\"hit\">Holds the properties of the resulting location.</param>\n      <param name=\"areaMask\">A bitfield mask specifying which NavMesh areas can be passed when finding the nearest edge.</param>\n      <returns>\n        <para>True if a nearest edge is found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.FindClosestEdge(UnityEngine.Vector3,UnityEngine.AI.NavMeshHit&amp;,UnityEngine.AI.NavMeshQueryFilter)\">\n      <summary>\n        <para>Locate the closest NavMesh edge from a point on the NavMesh, subject to the constraints of the filter argument.</para>\n      </summary>\n      <param name=\"sourcePosition\">The origin of the distance query.</param>\n      <param name=\"hit\">Holds the properties of the resulting location.</param>\n      <param name=\"filter\">A filter specifying which NavMesh areas can be passed when finding the nearest edge.</param>\n      <returns>\n        <para>True if a nearest edge is found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.GetAreaCost(System.Int32)\">\n      <summary>\n        <para>Gets the cost for path finding over geometry of the area type.</para>\n      </summary>\n      <param name=\"areaIndex\">Index of the area to get.</param>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.GetAreaFromName(System.String)\">\n      <summary>\n        <para>Returns the area index for a named NavMesh area type.</para>\n      </summary>\n      <param name=\"areaName\">Name of the area to look up.</param>\n      <returns>\n        <para>Index if the specified are, or -1 if no area found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.GetLayerCost(System.Int32)\">\n      <summary>\n        <para>Gets the cost for traversing over geometry of the layer type on all agents.</para>\n      </summary>\n      <param name=\"layer\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.GetNavMeshLayerFromName(System.String)\">\n      <summary>\n        <para>Returns the layer index for a named layer.</para>\n      </summary>\n      <param name=\"layerName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.GetSettingsByID(System.Int32)\">\n      <summary>\n        <para>Returns an existing entry of NavMesh build settings.</para>\n      </summary>\n      <param name=\"agentTypeID\">The ID to look for.</param>\n      <returns>\n        <para>The settings found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.GetSettingsByIndex(System.Int32)\">\n      <summary>\n        <para>Returns an existing entry of NavMesh build settings by its ordered index.</para>\n      </summary>\n      <param name=\"index\">The index to retrieve from.</param>\n      <returns>\n        <para>The found settings.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.GetSettingsCount\">\n      <summary>\n        <para>Returns the number of registered NavMesh build settings.</para>\n      </summary>\n      <returns>\n        <para>The number of registered entries.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.GetSettingsNameFromID(System.Int32)\">\n      <summary>\n        <para>Returns the name associated with the NavMesh build settings matching the provided agent type ID.</para>\n      </summary>\n      <param name=\"agentTypeID\">The ID to look for.</param>\n      <returns>\n        <para>The name associated with the ID found.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMesh.OnNavMeshPreUpdate\">\n      <summary>\n        <para>A delegate which can be used to register callback methods to be invoked before the NavMesh system updates.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.Raycast(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.AI.NavMeshHit&amp;,System.Int32)\">\n      <summary>\n        <para>Trace a line between two points on the NavMesh.</para>\n      </summary>\n      <param name=\"sourcePosition\">The origin of the ray.</param>\n      <param name=\"targetPosition\">The end of the ray.</param>\n      <param name=\"hit\">Holds the properties of the ray cast resulting location.</param>\n      <param name=\"areaMask\">A bitfield mask specifying which NavMesh areas can be passed when tracing the ray.</param>\n      <returns>\n        <para>True if the ray is terminated before reaching target position. Otherwise returns false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.Raycast(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.AI.NavMeshHit&amp;,UnityEngine.AI.NavMeshQueryFilter)\">\n      <summary>\n        <para>Traces a line between two positions on the NavMesh, subject to the constraints defined by the filter argument.</para>\n      </summary>\n      <param name=\"sourcePosition\">The origin of the ray.</param>\n      <param name=\"targetPosition\">The end of the ray.</param>\n      <param name=\"hit\">Holds the properties of the ray cast resulting location.</param>\n      <param name=\"filter\">A filter specifying which NavMesh areas can be passed when tracing the ray.</param>\n      <returns>\n        <para>True if the ray is terminated before reaching target position. Otherwise returns false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.RemoveAllNavMeshData\">\n      <summary>\n        <para>Removes all NavMesh surfaces and links from the game.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.RemoveLink(UnityEngine.AI.NavMeshLinkInstance)\">\n      <summary>\n        <para>Removes a link from the NavMesh.</para>\n      </summary>\n      <param name=\"handle\">The instance of a link to remove.</param>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.RemoveNavMeshData(UnityEngine.AI.NavMeshDataInstance)\">\n      <summary>\n        <para>Removes the specified NavMeshDataInstance from the game, making it unavailable for agents and queries.</para>\n      </summary>\n      <param name=\"handle\">The instance of a NavMesh to remove.</param>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.RemoveSettings(System.Int32)\">\n      <summary>\n        <para>Removes the build settings matching the agent type ID.</para>\n      </summary>\n      <param name=\"agentTypeID\">The ID of the entry to remove.</param>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.SamplePosition(UnityEngine.Vector3,UnityEngine.AI.NavMeshHit&amp;,System.Single,System.Int32)\">\n      <summary>\n        <para>Finds the closest point on NavMesh within specified range.</para>\n      </summary>\n      <param name=\"sourcePosition\">The origin of the sample query.</param>\n      <param name=\"hit\">Holds the properties of the resulting location.</param>\n      <param name=\"maxDistance\">Sample within this distance from sourcePosition.</param>\n      <param name=\"areaMask\">A mask specifying which NavMesh areas are allowed when finding the nearest point.</param>\n      <returns>\n        <para>True if a nearest point is found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.SamplePosition(UnityEngine.Vector3,UnityEngine.AI.NavMeshHit&amp;,System.Single,UnityEngine.AI.NavMeshQueryFilter)\">\n      <summary>\n        <para>Samples the position closest to sourcePosition - on any NavMesh built for the agent type specified by the filter.</para>\n      </summary>\n      <param name=\"sourcePosition\">The origin of the sample query.</param>\n      <param name=\"hit\">Holds the properties of the resulting location.</param>\n      <param name=\"maxDistance\">Sample within this distance from sourcePosition.</param>\n      <param name=\"filter\">A filter specifying which NavMesh areas are allowed when finding the nearest point.</param>\n      <returns>\n        <para>True if a nearest point is found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.SetAreaCost(System.Int32,System.Single)\">\n      <summary>\n        <para>Sets the cost for finding path over geometry of the area type on all agents.</para>\n      </summary>\n      <param name=\"areaIndex\">Index of the area to set.</param>\n      <param name=\"cost\">New cost.</param>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMesh.SetLayerCost(System.Int32,System.Single)\">\n      <summary>\n        <para>Sets the cost for traversing over geometry of the layer type on all agents.</para>\n      </summary>\n      <param name=\"layer\"></param>\n      <param name=\"cost\"></param>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshAgent\">\n      <summary>\n        <para>Navigation mesh agent.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.acceleration\">\n      <summary>\n        <para>The maximum acceleration of an agent as it follows a path, given in units / sec^2.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.agentTypeID\">\n      <summary>\n        <para>The type ID for the agent.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.angularSpeed\">\n      <summary>\n        <para>Maximum turning speed in (deg/s) while following a path.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.areaMask\">\n      <summary>\n        <para>Specifies which NavMesh areas are passable. Changing areaMask will make the path stale (see isPathStale).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.autoBraking\">\n      <summary>\n        <para>Should the agent brake automatically to avoid overshooting the destination point?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.autoRepath\">\n      <summary>\n        <para>Should the agent attempt to acquire a new path if the existing path becomes invalid?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.autoTraverseOffMeshLink\">\n      <summary>\n        <para>Should the agent move across OffMeshLinks automatically?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.avoidancePriority\">\n      <summary>\n        <para>The avoidance priority level.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.baseOffset\">\n      <summary>\n        <para>The relative vertical displacement of the owning GameObject.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.currentOffMeshLinkData\">\n      <summary>\n        <para>The current OffMeshLinkData.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.desiredVelocity\">\n      <summary>\n        <para>The desired velocity of the agent including any potential contribution from avoidance. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.destination\">\n      <summary>\n        <para>Gets or attempts to set the destination of the agent in world-space units.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.hasPath\">\n      <summary>\n        <para>Does the agent currently have a path? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.height\">\n      <summary>\n        <para>The height of the agent for purposes of passing under obstacles, etc.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.isOnNavMesh\">\n      <summary>\n        <para>Is the agent currently bound to the navmesh? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.isOnOffMeshLink\">\n      <summary>\n        <para>Is the agent currently positioned on an OffMeshLink? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.isPathStale\">\n      <summary>\n        <para>Is the current path stale. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.isStopped\">\n      <summary>\n        <para>This property holds the stop or resume condition of the NavMesh agent.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.navMeshOwner\">\n      <summary>\n        <para>Returns the owning object of the NavMesh the agent is currently placed on (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.nextOffMeshLinkData\">\n      <summary>\n        <para>The next OffMeshLinkData on the current path.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.nextPosition\">\n      <summary>\n        <para>Gets or sets the simulation position of the navmesh agent.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.obstacleAvoidanceType\">\n      <summary>\n        <para>The level of quality of avoidance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.path\">\n      <summary>\n        <para>Property to get and set the current path.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.pathPending\">\n      <summary>\n        <para>Is a path in the process of being computed but not yet ready? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.pathStatus\">\n      <summary>\n        <para>The status of the current path (complete, partial or invalid).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.radius\">\n      <summary>\n        <para>The avoidance radius for the agent.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.remainingDistance\">\n      <summary>\n        <para>The distance between the agent's position and the destination on the current path. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.speed\">\n      <summary>\n        <para>Maximum movement speed when following a path.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.steeringTarget\">\n      <summary>\n        <para>Get the current steering target along the path. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.stoppingDistance\">\n      <summary>\n        <para>Stop within this distance from the target position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.updatePosition\">\n      <summary>\n        <para>Gets or sets whether the transform position is synchronized with the simulated agent position. The default value is true.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.updateRotation\">\n      <summary>\n        <para>Should the agent update the transform orientation?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.updateUpAxis\">\n      <summary>\n        <para>Allows you to specify whether the agent should be aligned to the up-axis of the NavMesh or link that it is placed on.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.velocity\">\n      <summary>\n        <para>Access the current velocity of the NavMeshAgent component, or set a velocity to control the agent manually.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshAgent.walkableMask\">\n      <summary>\n        <para>Specifies which NavMesh layers are passable (bitfield). Changing walkableMask will make the path stale (see isPathStale).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshAgent.ActivateCurrentOffMeshLink(System.Boolean)\">\n      <summary>\n        <para>Enables or disables the current off-mesh link.</para>\n      </summary>\n      <param name=\"activated\">Is the link activated?</param>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshAgent.CalculatePath(UnityEngine.Vector3,UnityEngine.AI.NavMeshPath)\">\n      <summary>\n        <para>Calculate a path to a specified point and store the resulting path.</para>\n      </summary>\n      <param name=\"targetPosition\">The final position of the path requested.</param>\n      <param name=\"path\">The resulting path.</param>\n      <returns>\n        <para>True if a path is found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshAgent.CompleteOffMeshLink\">\n      <summary>\n        <para>Completes the movement on the current OffMeshLink.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshAgent.FindClosestEdge(UnityEngine.AI.NavMeshHit&amp;)\">\n      <summary>\n        <para>Locate the closest NavMesh edge.</para>\n      </summary>\n      <param name=\"hit\">Holds the properties of the resulting location.</param>\n      <returns>\n        <para>True if a nearest edge is found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshAgent.GetAreaCost(System.Int32)\">\n      <summary>\n        <para>Gets the cost for path calculation when crossing area of a particular type.</para>\n      </summary>\n      <param name=\"areaIndex\">Area Index.</param>\n      <returns>\n        <para>Current cost for specified area index.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshAgent.GetLayerCost(System.Int32)\">\n      <summary>\n        <para>Gets the cost for crossing ground of a particular type.</para>\n      </summary>\n      <param name=\"layer\">Layer index.</param>\n      <returns>\n        <para>Current cost of specified layer.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshAgent.Move(UnityEngine.Vector3)\">\n      <summary>\n        <para>Apply relative movement to current position.</para>\n      </summary>\n      <param name=\"offset\">The relative movement vector.</param>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshAgent.Raycast(UnityEngine.Vector3,UnityEngine.AI.NavMeshHit&amp;)\">\n      <summary>\n        <para>Trace a straight path towards a target postion in the NavMesh without moving the agent.</para>\n      </summary>\n      <param name=\"targetPosition\">The desired end position of movement.</param>\n      <param name=\"hit\">Properties of the obstacle detected by the ray (if any).</param>\n      <returns>\n        <para>True if there is an obstacle between the agent and the target position, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshAgent.ResetPath\">\n      <summary>\n        <para>Clears the current path.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshAgent.Resume\">\n      <summary>\n        <para>Resumes the movement along the current path after a pause.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshAgent.SamplePathPosition(System.Int32,System.Single,UnityEngine.AI.NavMeshHit&amp;)\">\n      <summary>\n        <para>Sample a position along the current path.</para>\n      </summary>\n      <param name=\"areaMask\">A bitfield mask specifying which NavMesh areas can be passed when tracing the path.</param>\n      <param name=\"maxDistance\">Terminate scanning the path at this distance.</param>\n      <param name=\"hit\">Holds the properties of the resulting location.</param>\n      <returns>\n        <para>True if terminated before reaching the position at maxDistance, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshAgent.SetAreaCost(System.Int32,System.Single)\">\n      <summary>\n        <para>Sets the cost for traversing over areas of the area type.</para>\n      </summary>\n      <param name=\"areaIndex\">Area cost.</param>\n      <param name=\"areaCost\">New cost for the specified area index.</param>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshAgent.SetDestination(UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets or updates the destination thus triggering the calculation for a new path.</para>\n      </summary>\n      <param name=\"target\">The target point to navigate to.</param>\n      <returns>\n        <para>True if the destination was requested successfully, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshAgent.SetLayerCost(System.Int32,System.Single)\">\n      <summary>\n        <para>Sets the cost for traversing over geometry of the layer type.</para>\n      </summary>\n      <param name=\"layer\">Layer index.</param>\n      <param name=\"cost\">New cost for the specified layer.</param>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshAgent.SetPath(UnityEngine.AI.NavMeshPath)\">\n      <summary>\n        <para>Assign a new path to this agent.</para>\n      </summary>\n      <param name=\"path\">New path to follow.</param>\n      <returns>\n        <para>True if the path is succesfully assigned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshAgent.Stop\">\n      <summary>\n        <para>Stop movement of this agent along its current path.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshAgent.Warp(UnityEngine.Vector3)\">\n      <summary>\n        <para>Warps agent to the provided position.</para>\n      </summary>\n      <param name=\"newPosition\">New position to warp the agent to.</param>\n      <returns>\n        <para>True if agent is successfully warped, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshBuildDebugFlags\">\n      <summary>\n        <para>Bitmask used for operating with debug data from the NavMesh build process.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshBuildDebugFlags.All\">\n      <summary>\n        <para>All debug data from the NavMesh build process is taken into consideration.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshBuildDebugFlags.InputGeometry\">\n      <summary>\n        <para>The triangles of all the geometry that is used as a base for computing the new NavMesh.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshBuildDebugFlags.None\">\n      <summary>\n        <para>No debug data from the NavMesh build process is taken into consideration.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshBuildDebugFlags.PolygonMeshes\">\n      <summary>\n        <para>Meshes of convex polygons constructed within the unified contours of adjacent regions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshBuildDebugFlags.PolygonMeshesDetail\">\n      <summary>\n        <para>The triangulated meshes with height details that better approximate the source geometry.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshBuildDebugFlags.RawContours\">\n      <summary>\n        <para>The contours that follow precisely the edges of each surface region.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshBuildDebugFlags.Regions\">\n      <summary>\n        <para>The segmentation of the traversable surfaces into smaller areas necessary for producing simple polygons.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshBuildDebugFlags.SimplifiedContours\">\n      <summary>\n        <para>Contours bounding each of the surface regions, described through fewer vertices and straighter edges compared to RawContours.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshBuildDebugFlags.Voxels\">\n      <summary>\n        <para>The voxels produced by rasterizing the source geometry into walkable and unwalkable areas.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshBuildDebugSettings\">\n      <summary>\n        <para>Specify which of the temporary data generated while building the NavMesh should be retained in memory after the process has completed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildDebugSettings.flags\">\n      <summary>\n        <para>Specify which types of debug data to collect when building the NavMesh.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshBuilder\">\n      <summary>\n        <para>Navigation mesh builder interface.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshBuilder.BuildNavMeshData(UnityEngine.AI.NavMeshBuildSettings,System.Collections.Generic.List`1&lt;UnityEngine.AI.NavMeshBuildSource&gt;,UnityEngine.Bounds,UnityEngine.Vector3,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Builds a NavMesh data object from the provided input sources.</para>\n      </summary>\n      <param name=\"buildSettings\">Settings for the bake process, see NavMeshBuildSettings.</param>\n      <param name=\"sources\">List of input geometry used for baking, they describe the surfaces to walk on or obstacles to avoid.</param>\n      <param name=\"localBounds\">Bounding box relative to position and rotation which describes the volume where the NavMesh should be built. Empty bounds is treated as no bounds, i.e. the NavMesh will cover all the inputs.</param>\n      <param name=\"position\">Center of the NavMeshData. This specifies the origin for the NavMesh tiles (See Also: NavMeshBuildSettings.tileSize).</param>\n      <param name=\"rotation\">Orientation of the NavMeshData, you can use this to generate NavMesh with an arbitrary up-vector – e.g. for walkable vertical surfaces.</param>\n      <returns>\n        <para>Returns a newly built NavMeshData, or null if the NavMeshData was empty or an error occurred.\nThe newly built NavMeshData, or null if the NavMeshData was empty or an error occurred.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshBuilder.Cancel(UnityEngine.AI.NavMeshData)\">\n      <summary>\n        <para>Cancels an asynchronous update of the specified NavMesh data. See Also: UpdateNavMeshDataAsync.</para>\n      </summary>\n      <param name=\"data\">The data associated with asynchronous updating.</param>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshBuilder.CollectSources(UnityEngine.Bounds,System.Int32,UnityEngine.AI.NavMeshCollectGeometry,System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.AI.NavMeshBuildMarkup&gt;,System.Collections.Generic.List`1&lt;UnityEngine.AI.NavMeshBuildSource&gt;)\">\n      <summary>\n        <para>Collects renderers or physics colliders, and terrains within a volume.</para>\n      </summary>\n      <param name=\"includedWorldBounds\">The queried objects must overlap these bounds to be included in the results.</param>\n      <param name=\"includedLayerMask\">Specifies which layers are included in the query.</param>\n      <param name=\"geometry\">Which type of geometry to collect - e.g. physics colliders.</param>\n      <param name=\"defaultArea\">Area type to assign to results, unless modified by NavMeshMarkup.</param>\n      <param name=\"markups\">List of markups which allows finer control over how objects are collected.</param>\n      <param name=\"results\">List where results are stored, the list is cleared at the beginning of the call.</param>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshBuilder.CollectSources(UnityEngine.Transform,System.Int32,UnityEngine.AI.NavMeshCollectGeometry,System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.AI.NavMeshBuildMarkup&gt;,System.Collections.Generic.List`1&lt;UnityEngine.AI.NavMeshBuildSource&gt;)\">\n      <summary>\n        <para>Collects renderers or physics colliders, and terrains within a transform hierarchy.</para>\n      </summary>\n      <param name=\"root\">If not null, consider only root and its children in the query; if null, includes everything loaded.</param>\n      <param name=\"includedLayerMask\">Specifies which layers are included in the query.</param>\n      <param name=\"geometry\">Which type of geometry to collect - e.g. physics colliders.</param>\n      <param name=\"defaultArea\">Area type to assign to results, unless modified by NavMeshMarkup.</param>\n      <param name=\"markups\">List of markups which allows finer control over how objects are collected.</param>\n      <param name=\"results\">List where results are stored, the list is cleared at the beginning of the call.</param>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshBuilder.UpdateNavMeshData(UnityEngine.AI.NavMeshData,UnityEngine.AI.NavMeshBuildSettings,System.Collections.Generic.List`1&lt;UnityEngine.AI.NavMeshBuildSource&gt;,UnityEngine.Bounds)\">\n      <summary>\n        <para>Incrementally updates the NavMeshData based on the sources.</para>\n      </summary>\n      <param name=\"data\">The NavMeshData to update.</param>\n      <param name=\"buildSettings\">The build settings which is used to update the NavMeshData. The build settings is also hashed along with the data, so changing settings will cause a full rebuild.</param>\n      <param name=\"sources\">List of input geometry used for baking, they describe the surfaces to walk on or obstacles to avoid.</param>\n      <param name=\"localBounds\">Bounding box relative to position and rotation which describes the volume where the NavMesh should be built. Empty bounds is treated as no-bounds, that is, the NavMesh will cover all the inputs.</param>\n      <returns>\n        <para>Returns true if the update was successful.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshBuilder.UpdateNavMeshDataAsync(UnityEngine.AI.NavMeshData,UnityEngine.AI.NavMeshBuildSettings,System.Collections.Generic.List`1&lt;UnityEngine.AI.NavMeshBuildSource&gt;,UnityEngine.Bounds)\">\n      <summary>\n        <para>Asynchronously and incrementally updates the NavMeshData based on the sources.</para>\n      </summary>\n      <param name=\"data\">The NavMeshData to update.</param>\n      <param name=\"buildSettings\">The build settings which is used to update the NavMeshData. The build settings is also hashed along with the data, so changing settings will likely to cause full rebuild.</param>\n      <param name=\"sources\">List of input geometry used for baking, they describe the surfaces to walk on or obstacles to avoid.</param>\n      <param name=\"localBounds\">Bounding box relative to position and rotation which describes to volume where the NavMesh should be built. Empty bounds is treated as no-bounds, that is, the NavMesh will cover all the inputs.</param>\n      <returns>\n        <para>Can be used to check the progress of the update.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshBuildMarkup\">\n      <summary>\n        <para>The NavMesh build markup allows you to control how certain objects are treated during the NavMesh build process, specifically when collecting sources for building.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildMarkup.area\">\n      <summary>\n        <para>The area type to use when override area is enabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildMarkup.ignoreFromBuild\">\n      <summary>\n        <para>Use this to specify whether the GameObject and its children should be ignored.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildMarkup.overrideArea\">\n      <summary>\n        <para>Use this to specify whether the area type of the GameObject and its children should be overridden by the area type specified in this struct.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildMarkup.root\">\n      <summary>\n        <para>Use this to specify which GameObject (including the GameObject’s children) the markup should be applied to.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshBuildSettings\">\n      <summary>\n        <para>The NavMeshBuildSettings struct allows you to specify a collection of settings which describe the dimensions and limitations of a particular agent type.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildSettings.agentClimb\">\n      <summary>\n        <para>The maximum vertical step size an agent can take.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildSettings.agentHeight\">\n      <summary>\n        <para>The height of the agent for baking in world units.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildSettings.agentRadius\">\n      <summary>\n        <para>The radius of the agent for baking in world units.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildSettings.agentSlope\">\n      <summary>\n        <para>The maximum slope angle which is walkable (angle in degrees).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildSettings.agentTypeID\">\n      <summary>\n        <para>The agent type ID the NavMesh will be baked for.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildSettings.debug\">\n      <summary>\n        <para>Options for collecting debug data during the build process.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildSettings.minRegionArea\">\n      <summary>\n        <para>The approximate minimum area of individual NavMesh regions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildSettings.overrideTileSize\">\n      <summary>\n        <para>Enables overriding the default tile size. See Also: tileSize.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildSettings.overrideVoxelSize\">\n      <summary>\n        <para>Enables overriding the default voxel size. See Also: voxelSize.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildSettings.tileSize\">\n      <summary>\n        <para>Sets the tile size in voxel units.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildSettings.voxelSize\">\n      <summary>\n        <para>Sets the voxel size in world length units.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshBuildSettings.ValidationReport(UnityEngine.Bounds)\">\n      <summary>\n        <para>Validates the properties of NavMeshBuildSettings.</para>\n      </summary>\n      <param name=\"buildBounds\">Describes the volume to build NavMesh for.</param>\n      <returns>\n        <para>The list of violated constraints.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshBuildSource\">\n      <summary>\n        <para>The input to the NavMesh builder is a list of NavMesh build sources.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildSource.area\">\n      <summary>\n        <para>Describes the area type of the NavMesh surface for this object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildSource.component\">\n      <summary>\n        <para>Points to the owning component - if available, otherwise null.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildSource.shape\">\n      <summary>\n        <para>The type of the shape this source describes. See Also: NavMeshBuildSourceShape.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildSource.size\">\n      <summary>\n        <para>Describes the dimensions of the shape.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildSource.sourceObject\">\n      <summary>\n        <para>Describes the object referenced for Mesh and Terrain types of input sources.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshBuildSource.transform\">\n      <summary>\n        <para>Describes the local to world transformation matrix of the build source. That is, position and orientation and scale of the shape.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshBuildSourceShape\">\n      <summary>\n        <para>Used with NavMeshBuildSource to define the shape for building NavMesh.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshBuildSourceShape.Box\">\n      <summary>\n        <para>Describes a box primitive for use with NavMeshBuildSource.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshBuildSourceShape.Capsule\">\n      <summary>\n        <para>Describes a capsule primitive for use with NavMeshBuildSource.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshBuildSourceShape.Mesh\">\n      <summary>\n        <para>Describes a Mesh source for use with NavMeshBuildSource.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshBuildSourceShape.ModifierBox\">\n      <summary>\n        <para>Describes a ModifierBox source for use with NavMeshBuildSource.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshBuildSourceShape.Sphere\">\n      <summary>\n        <para>Describes a sphere primitive for use with NavMeshBuildSource.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshBuildSourceShape.Terrain\">\n      <summary>\n        <para>Describes a TerrainData source for use with NavMeshBuildSource.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshCollectGeometry\">\n      <summary>\n        <para>Used for specifying the type of geometry to collect. Used with NavMeshBuilder.CollectSources.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshCollectGeometry.PhysicsColliders\">\n      <summary>\n        <para>Collect geometry from the 3D physics collision representation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshCollectGeometry.RenderMeshes\">\n      <summary>\n        <para>Collect meshes form the rendered geometry.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshData\">\n      <summary>\n        <para>Contains and represents NavMesh data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshData.position\">\n      <summary>\n        <para>Gets or sets the world space position of the NavMesh data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshData.rotation\">\n      <summary>\n        <para>Gets or sets the orientation of the NavMesh data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshData.sourceBounds\">\n      <summary>\n        <para>Returns the bounding volume of the input geometry used to build this NavMesh (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshData.#ctor\">\n      <summary>\n        <para>Constructs a new object for representing a NavMesh for the default agent type.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshData.#ctor(System.Int32)\">\n      <summary>\n        <para>Constructs a new object representing a NavMesh for the specified agent type.</para>\n      </summary>\n      <param name=\"agentTypeID\">The agent type ID to create a NavMesh for.</param>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshDataInstance\">\n      <summary>\n        <para>The instance is returned when adding NavMesh data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshDataInstance.owner\">\n      <summary>\n        <para>Get or set the owning Object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshDataInstance.valid\">\n      <summary>\n        <para>True if the NavMesh data is added to the navigation system - otherwise false (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshDataInstance.Remove\">\n      <summary>\n        <para>Removes this instance from the NavMesh system.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshHit\">\n      <summary>\n        <para>Result information for NavMesh queries.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshHit.distance\">\n      <summary>\n        <para>Distance to the point of hit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshHit.hit\">\n      <summary>\n        <para>Flag set when hit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshHit.mask\">\n      <summary>\n        <para>Mask specifying NavMesh area at point of hit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshHit.normal\">\n      <summary>\n        <para>Normal at the point of hit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshHit.position\">\n      <summary>\n        <para>Position of hit.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshLinkData\">\n      <summary>\n        <para>Used for runtime manipulation of links connecting polygons of the NavMesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshLinkData.agentTypeID\">\n      <summary>\n        <para>Specifies which agent type this link is available for.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshLinkData.area\">\n      <summary>\n        <para>Area type of the link.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshLinkData.bidirectional\">\n      <summary>\n        <para>If true, the link can be traversed in both directions, otherwise only from start to end position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshLinkData.costModifier\">\n      <summary>\n        <para>If positive, overrides the pathfinder cost to traverse the link.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshLinkData.endPosition\">\n      <summary>\n        <para>End position of the link.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshLinkData.startPosition\">\n      <summary>\n        <para>Start position of the link.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshLinkData.width\">\n      <summary>\n        <para>If positive, the link will be rectangle aligned along the line from start to end.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshLinkInstance\">\n      <summary>\n        <para>An instance representing a link available for pathfinding.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshLinkInstance.owner\">\n      <summary>\n        <para>Get or set the owning Object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshLinkInstance.valid\">\n      <summary>\n        <para>True if the NavMesh link is added to the navigation system - otherwise false (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshLinkInstance.Remove\">\n      <summary>\n        <para>Removes this instance from the game.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshObstacle\">\n      <summary>\n        <para>An obstacle for NavMeshAgents to avoid.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshObstacle.carveOnlyStationary\">\n      <summary>\n        <para>Should this obstacle be carved when it is constantly moving?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshObstacle.carving\">\n      <summary>\n        <para>Should this obstacle make a cut-out in the navmesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshObstacle.carvingMoveThreshold\">\n      <summary>\n        <para>Threshold distance for updating a moving carved hole (when carving is enabled).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshObstacle.carvingTimeToStationary\">\n      <summary>\n        <para>Time to wait until obstacle is treated as stationary (when carving and carveOnlyStationary are enabled).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshObstacle.center\">\n      <summary>\n        <para>The center of the obstacle, measured in the object's local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshObstacle.height\">\n      <summary>\n        <para>Height of the obstacle's cylinder shape.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshObstacle.radius\">\n      <summary>\n        <para>Radius of the obstacle's capsule shape.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshObstacle.shape\">\n      <summary>\n        <para>The shape of the obstacle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshObstacle.size\">\n      <summary>\n        <para>The size of the obstacle, measured in the object's local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshObstacle.velocity\">\n      <summary>\n        <para>Velocity at which the obstacle moves around the NavMesh.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshObstacleShape\">\n      <summary>\n        <para>Shape of the obstacle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshObstacleShape.Box\">\n      <summary>\n        <para>Box shaped obstacle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshObstacleShape.Capsule\">\n      <summary>\n        <para>Capsule shaped obstacle.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshPath\">\n      <summary>\n        <para>A path as calculated by the navigation system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshPath.corners\">\n      <summary>\n        <para>Corner points of the path. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshPath.status\">\n      <summary>\n        <para>Status of the path. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshPath.ClearCorners\">\n      <summary>\n        <para>Erase all corner points from path.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshPath.#ctor\">\n      <summary>\n        <para>NavMeshPath constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshPath.GetCornersNonAlloc(UnityEngine.Vector3[])\">\n      <summary>\n        <para>Calculate the corners for the path.</para>\n      </summary>\n      <param name=\"results\">Array to store path corners.</param>\n      <returns>\n        <para>The number of corners along the path - including start and end points.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshPathStatus\">\n      <summary>\n        <para>Status of path.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshPathStatus.PathComplete\">\n      <summary>\n        <para>The path terminates at the destination.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshPathStatus.PathInvalid\">\n      <summary>\n        <para>The path is invalid.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshPathStatus.PathPartial\">\n      <summary>\n        <para>The path cannot reach the destination.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshQueryFilter\">\n      <summary>\n        <para>Specifies which agent type and areas to consider when searching the NavMesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshQueryFilter.agentTypeID\">\n      <summary>\n        <para>The agent type ID, specifying which navigation meshes to consider for the query functions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshQueryFilter.areaMask\">\n      <summary>\n        <para>A bitmask representing the traversable area types.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshQueryFilter.GetAreaCost(System.Int32)\">\n      <summary>\n        <para>Returns the area cost multiplier for the given area type for this filter.</para>\n      </summary>\n      <param name=\"areaIndex\">Index to retreive the cost for.</param>\n      <returns>\n        <para>The cost multiplier for the supplied area index.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AI.NavMeshQueryFilter.SetAreaCost(System.Int32,System.Single)\">\n      <summary>\n        <para>Sets the pathfinding cost multiplier for this filter for a given area type.</para>\n      </summary>\n      <param name=\"areaIndex\">The area index to set the cost for.</param>\n      <param name=\"cost\">The cost for the supplied area index.</param>\n    </member>\n    <member name=\"T:UnityEngine.AI.NavMeshTriangulation\">\n      <summary>\n        <para>Contains data describing a triangulation of a navmesh.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshTriangulation.areas\">\n      <summary>\n        <para>NavMesh area indices for the navmesh triangulation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshTriangulation.indices\">\n      <summary>\n        <para>Triangle indices for the navmesh triangulation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.NavMeshTriangulation.layers\">\n      <summary>\n        <para>NavMeshLayer values for the navmesh triangulation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.NavMeshTriangulation.vertices\">\n      <summary>\n        <para>Vertices for the navmesh triangulation.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AI.ObstacleAvoidanceType\">\n      <summary>\n        <para>Level of obstacle avoidance.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.ObstacleAvoidanceType.GoodQualityObstacleAvoidance\">\n      <summary>\n        <para>Good avoidance. High performance impact.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.ObstacleAvoidanceType.HighQualityObstacleAvoidance\">\n      <summary>\n        <para>Enable highest precision. Highest performance impact.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.ObstacleAvoidanceType.LowQualityObstacleAvoidance\">\n      <summary>\n        <para>Enable simple avoidance. Low performance impact.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.ObstacleAvoidanceType.MedQualityObstacleAvoidance\">\n      <summary>\n        <para>Medium avoidance. Medium performance impact.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.ObstacleAvoidanceType.NoObstacleAvoidance\">\n      <summary>\n        <para>Disable avoidance.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AI.OffMeshLink\">\n      <summary>\n        <para>Link allowing movement outside the planar navigation mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.OffMeshLink.activated\">\n      <summary>\n        <para>Is link active.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.OffMeshLink.area\">\n      <summary>\n        <para>NavMesh area index for this OffMeshLink component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.OffMeshLink.autoUpdatePositions\">\n      <summary>\n        <para>Automatically update endpoints.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.OffMeshLink.biDirectional\">\n      <summary>\n        <para>Can link be traversed in both directions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.OffMeshLink.costOverride\">\n      <summary>\n        <para>Modify pathfinding cost for the link.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.OffMeshLink.endTransform\">\n      <summary>\n        <para>The transform representing link end position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.OffMeshLink.navMeshLayer\">\n      <summary>\n        <para>NavMeshLayer for this OffMeshLink component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.OffMeshLink.occupied\">\n      <summary>\n        <para>Is link occupied. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.OffMeshLink.startTransform\">\n      <summary>\n        <para>The transform representing link start position.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AI.OffMeshLink.UpdatePositions\">\n      <summary>\n        <para>Explicitly update the link endpoints.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AI.OffMeshLinkData\">\n      <summary>\n        <para>State of OffMeshLink.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.OffMeshLinkData.activated\">\n      <summary>\n        <para>Is link active (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.OffMeshLinkData.endPos\">\n      <summary>\n        <para>Link end world position (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.OffMeshLinkData.linkType\">\n      <summary>\n        <para>Link type specifier (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.OffMeshLinkData.offMeshLink\">\n      <summary>\n        <para>The OffMeshLink if the link type is a manually placed Offmeshlink (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.OffMeshLinkData.startPos\">\n      <summary>\n        <para>Link start world position (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AI.OffMeshLinkData.valid\">\n      <summary>\n        <para>Is link valid (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AI.OffMeshLinkType\">\n      <summary>\n        <para>Link type specifier.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.OffMeshLinkType.LinkTypeDropDown\">\n      <summary>\n        <para>Vertical drop.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.OffMeshLinkType.LinkTypeJumpAcross\">\n      <summary>\n        <para>Horizontal jump.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AI.OffMeshLinkType.LinkTypeManual\">\n      <summary>\n        <para>Manually specified type of link.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Analytics.Analytics\">\n      <summary>\n        <para>Unity Analytics provides insight into your game users e.g. DAU, MAU.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Analytics.Analytics.deviceStatsEnabled\">\n      <summary>\n        <para>Controls whether the sending of device stats at runtime is enabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Analytics.Analytics.enabled\">\n      <summary>\n        <para>Controls whether the Analytics service is enabled at runtime.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Analytics.Analytics.limitUserTracking\">\n      <summary>\n        <para>Controls whether to limit user tracking at runtime.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Analytics.Analytics.CustomEvent(System.String,System.Collections.Generic.IDictionary`2&lt;System.String,System.Object&gt;)\">\n      <summary>\n        <para>Custom Events (optional).</para>\n      </summary>\n      <param name=\"customEventName\">Name of custom event. Name cannot include the prefix \"unity.\" - This is a reserved keyword.</param>\n      <param name=\"eventData\">Additional parameters sent to Unity Analytics at the time the custom event was triggered. Dictionary key cannot include the prefix \"unity.\" - This is a reserved keyword.</param>\n    </member>\n    <member name=\"M:UnityEngine.Analytics.Analytics.CustomEvent(System.String)\">\n      <summary>\n        <para>Custom Events (optional).</para>\n      </summary>\n      <param name=\"customEventName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Analytics.Analytics.CustomEvent(System.String,UnityEngine.Vector3)\">\n      <summary>\n        <para>Custom Events (optional).</para>\n      </summary>\n      <param name=\"customEventName\"></param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Analytics.Analytics.FlushEvents\">\n      <summary>\n        <para>Attempts to flush immediately all queued analytics events to the network and filesystem cache if possible (optional).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Analytics.Analytics.RegisterEvent(System.String,System.Int32,System.Int32,System.String,System.String)\">\n      <summary>\n        <para>This API is used for registering a Runtime Analytics event. It is meant for internal use only and is likely to change in the future. User code should never use this API.</para>\n      </summary>\n      <param name=\"eventName\">Name of the event.</param>\n      <param name=\"maxEventPerHour\">Hourly limit for this event name.</param>\n      <param name=\"maxItems\">Maximum number of items in this event.</param>\n      <param name=\"vendorKey\">Vendor key name.</param>\n      <param name=\"prefix\">Optional event name prefix value.</param>\n      <param name=\"ver\">Event version number.</param>\n    </member>\n    <member name=\"M:UnityEngine.Analytics.Analytics.RegisterEvent(System.String,System.Int32,System.Int32,System.String,System.Int32,System.String)\">\n      <summary>\n        <para>This API is used for registering a Runtime Analytics event. It is meant for internal use only and is likely to change in the future. User code should never use this API.</para>\n      </summary>\n      <param name=\"eventName\">Name of the event.</param>\n      <param name=\"maxEventPerHour\">Hourly limit for this event name.</param>\n      <param name=\"maxItems\">Maximum number of items in this event.</param>\n      <param name=\"vendorKey\">Vendor key name.</param>\n      <param name=\"prefix\">Optional event name prefix value.</param>\n      <param name=\"ver\">Event version number.</param>\n    </member>\n    <member name=\"M:UnityEngine.Analytics.Analytics.SendEvent(System.String,System.Object,System.Int32,System.String)\">\n      <summary>\n        <para>This API is used to send a Runtime Analytics event. It is meant for internal use only and is likely to change in the future. User code should never use this API.</para>\n      </summary>\n      <param name=\"eventName\">Name of the event.</param>\n      <param name=\"ver\">Event version number.</param>\n      <param name=\"prefix\">Optional event name prefix value.</param>\n      <param name=\"parameters\">Additional event data.</param>\n    </member>\n    <member name=\"M:UnityEngine.Analytics.Analytics.SetUserBirthYear(System.Int32)\">\n      <summary>\n        <para>User Demographics (optional).</para>\n      </summary>\n      <param name=\"birthYear\">Birth year of user. Must be 4-digit year format, only.</param>\n    </member>\n    <member name=\"M:UnityEngine.Analytics.Analytics.SetUserGender(UnityEngine.Analytics.Gender)\">\n      <summary>\n        <para>User Demographics (optional).</para>\n      </summary>\n      <param name=\"gender\">Gender of user can be \"Female\", \"Male\", or \"Unknown\".</param>\n    </member>\n    <member name=\"M:UnityEngine.Analytics.Analytics.SetUserId(System.String)\">\n      <summary>\n        <para>User Demographics (optional).</para>\n      </summary>\n      <param name=\"userId\">User id.</param>\n    </member>\n    <member name=\"M:UnityEngine.Analytics.Analytics.Transaction(System.String,System.Decimal,System.String)\">\n      <summary>\n        <para>Tracking Monetization (optional).</para>\n      </summary>\n      <param name=\"productId\">The id of the purchased item.</param>\n      <param name=\"amount\">The price of the item.</param>\n      <param name=\"currency\">Abbreviation of the currency used for the transaction. For example “USD” (United States Dollars). See http:en.wikipedia.orgwikiISO_4217 for a standardized list of currency abbreviations.</param>\n      <param name=\"receiptPurchaseData\">Receipt data (iOS)  receipt ID (android)  for in-app purchases to verify purchases with Apple iTunes / Google Play. Use null in the absence of receipts.</param>\n      <param name=\"signature\">Android receipt signature. If using native Android use the INAPP_DATA_SIGNATURE string containing the signature of the purchase data that was signed with the private key of the developer. The data signature uses the RSASSA-PKCS1-v1_5 scheme. Pass in null in absence of a signature.</param>\n      <param name=\"usingIAPService\">Set to true when using UnityIAP.</param>\n    </member>\n    <member name=\"M:UnityEngine.Analytics.Analytics.Transaction(System.String,System.Decimal,System.String,System.String,System.String)\">\n      <summary>\n        <para>Tracking Monetization (optional).</para>\n      </summary>\n      <param name=\"productId\">The id of the purchased item.</param>\n      <param name=\"amount\">The price of the item.</param>\n      <param name=\"currency\">Abbreviation of the currency used for the transaction. For example “USD” (United States Dollars). See http:en.wikipedia.orgwikiISO_4217 for a standardized list of currency abbreviations.</param>\n      <param name=\"receiptPurchaseData\">Receipt data (iOS)  receipt ID (android)  for in-app purchases to verify purchases with Apple iTunes / Google Play. Use null in the absence of receipts.</param>\n      <param name=\"signature\">Android receipt signature. If using native Android use the INAPP_DATA_SIGNATURE string containing the signature of the purchase data that was signed with the private key of the developer. The data signature uses the RSASSA-PKCS1-v1_5 scheme. Pass in null in absence of a signature.</param>\n      <param name=\"usingIAPService\">Set to true when using UnityIAP.</param>\n    </member>\n    <member name=\"M:UnityEngine.Analytics.Analytics.Transaction(System.String,System.Decimal,System.String,System.String,System.String,System.Boolean)\">\n      <summary>\n        <para>Tracking Monetization (optional).</para>\n      </summary>\n      <param name=\"productId\">The id of the purchased item.</param>\n      <param name=\"amount\">The price of the item.</param>\n      <param name=\"currency\">Abbreviation of the currency used for the transaction. For example “USD” (United States Dollars). See http:en.wikipedia.orgwikiISO_4217 for a standardized list of currency abbreviations.</param>\n      <param name=\"receiptPurchaseData\">Receipt data (iOS)  receipt ID (android)  for in-app purchases to verify purchases with Apple iTunes / Google Play. Use null in the absence of receipts.</param>\n      <param name=\"signature\">Android receipt signature. If using native Android use the INAPP_DATA_SIGNATURE string containing the signature of the purchase data that was signed with the private key of the developer. The data signature uses the RSASSA-PKCS1-v1_5 scheme. Pass in null in absence of a signature.</param>\n      <param name=\"usingIAPService\">Set to true when using UnityIAP.</param>\n    </member>\n    <member name=\"T:UnityEngine.Analytics.AnalyticsResult\">\n      <summary>\n        <para>Analytics API result.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Analytics.AnalyticsResult.AnalyticsDisabled\">\n      <summary>\n        <para>Analytics API result: Analytics is disabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Analytics.AnalyticsResult.InvalidData\">\n      <summary>\n        <para>Analytics API result: Invalid argument value.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Analytics.AnalyticsResult.NotInitialized\">\n      <summary>\n        <para>Analytics API result: Analytics not initialized.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Analytics.AnalyticsResult.Ok\">\n      <summary>\n        <para>Analytics API result: Success.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Analytics.AnalyticsResult.SizeLimitReached\">\n      <summary>\n        <para>Analytics API result: Argument size limit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Analytics.AnalyticsResult.TooManyItems\">\n      <summary>\n        <para>Analytics API result: Too many parameters.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Analytics.AnalyticsResult.TooManyRequests\">\n      <summary>\n        <para>Analytics API result: Too many requests.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Analytics.AnalyticsResult.UnsupportedPlatform\">\n      <summary>\n        <para>Analytics API result: This platform doesn't support Analytics.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Analytics.AnalyticsSessionInfo\">\n      <summary>\n        <para>Accesses for Analytics session information (common for all game instances).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Analytics.AnalyticsSessionInfo.sessionElapsedTime\">\n      <summary>\n        <para>Session time since the begining of player game session.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Analytics.AnalyticsSessionInfo.sessionId\">\n      <summary>\n        <para>Session id is used for tracking player game session.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Analytics.AnalyticsSessionInfo.sessionState\">\n      <summary>\n        <para>Session state.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Analytics.AnalyticsSessionInfo.sessionStateChanged(UnityEngine.Analytics.AnalyticsSessionInfo/SessionStateChanged)\">\n      <summary>\n        <para>This event occurs when a Analytics session state changes.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Analytics.AnalyticsSessionInfo.userId\">\n      <summary>\n        <para>UserId is random GUID to track a player and is persisted across game session.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Analytics.AnalyticsSessionInfo.SessionStateChanged\">\n      <summary>\n        <para>This event occurs when a Analytics session state changes.</para>\n      </summary>\n      <param name=\"sessionState\">Current session state.</param>\n      <param name=\"sessionId\">Current session id.</param>\n      <param name=\"sessionElapsedTime\">Game player current session time.</param>\n      <param name=\"sessionChanged\">Set to true when sessionId has changed.</param>\n    </member>\n    <member name=\"T:UnityEngine.Analytics.AnalyticsSessionState\">\n      <summary>\n        <para>Session tracking states.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Analytics.AnalyticsSessionState.kSessionPaused\">\n      <summary>\n        <para>Session tracking has paused.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Analytics.AnalyticsSessionState.kSessionResumed\">\n      <summary>\n        <para>Session tracking has resumed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Analytics.AnalyticsSessionState.kSessionStarted\">\n      <summary>\n        <para>Session tracking has started.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Analytics.AnalyticsSessionState.kSessionStopped\">\n      <summary>\n        <para>Session tracking has stopped.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Analytics.Gender\">\n      <summary>\n        <para>User Demographics: Gender of a user.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Analytics.Gender.Female\">\n      <summary>\n        <para>User Demographics: Female Gender of a user.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Analytics.Gender.Male\">\n      <summary>\n        <para>User Demographics: Male Gender of a user.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Analytics.Gender.Unknown\">\n      <summary>\n        <para>User Demographics: Unknown Gender of a user.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Analytics.PerformanceReporting\">\n      <summary>\n        <para>Unity Performace provides insight into your game performace.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Analytics.PerformanceReporting.enabled\">\n      <summary>\n        <para>Controls whether the Performance Reporting service is enabled at runtime.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Analytics.PerformanceReporting.graphicsInitializationFinishTime\">\n      <summary>\n        <para>Time taken to initialize graphics in nanoseconds, measured from application startup.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AnchoredJoint2D\">\n      <summary>\n        <para>Parent class for all joints that have anchor points.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnchoredJoint2D.anchor\">\n      <summary>\n        <para>The joint's anchor point on the object that has the joint component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnchoredJoint2D.autoConfigureConnectedAnchor\">\n      <summary>\n        <para>Should the connectedAnchor be calculated automatically?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnchoredJoint2D.connectedAnchor\">\n      <summary>\n        <para>The joint's anchor point on the second object (ie, the one which doesn't have the joint component).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AndroidActivityIndicatorStyle\">\n      <summary>\n        <para>ActivityIndicator Style (Android Specific).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AndroidActivityIndicatorStyle.DontShow\">\n      <summary>\n        <para>Do not show ActivityIndicator.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AndroidActivityIndicatorStyle.InversedLarge\">\n      <summary>\n        <para>Large Inversed (android.R.attr.progressBarStyleLargeInverse).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AndroidActivityIndicatorStyle.InversedSmall\">\n      <summary>\n        <para>Small Inversed (android.R.attr.progressBarStyleSmallInverse).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AndroidActivityIndicatorStyle.Large\">\n      <summary>\n        <para>Large (android.R.attr.progressBarStyleLarge).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AndroidActivityIndicatorStyle.Small\">\n      <summary>\n        <para>Small (android.R.attr.progressBarStyleSmall).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AndroidInput\">\n      <summary>\n        <para>AndroidInput provides support for off-screen touch input, such as a touchpad.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AndroidInput.secondaryTouchEnabled\">\n      <summary>\n        <para>Property indicating whether the system provides secondary touch input.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AndroidInput.secondaryTouchHeight\">\n      <summary>\n        <para>Property indicating the height of the secondary touchpad.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AndroidInput.secondaryTouchWidth\">\n      <summary>\n        <para>Property indicating the width of the secondary touchpad.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AndroidInput.touchCountSecondary\">\n      <summary>\n        <para>Number of secondary touches. Guaranteed not to change throughout the frame. (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AndroidInput.GetSecondaryTouch(System.Int32)\">\n      <summary>\n        <para>Returns object representing status of a specific touch on a secondary touchpad (Does not allocate temporary variables).</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"T:UnityEngine.AndroidJavaClass\">\n      <summary>\n        <para>AndroidJavaClass is the Unity representation of a generic instance of java.lang.Class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaClass.#ctor(System.String)\">\n      <summary>\n        <para>Construct an AndroidJavaClass from the class name.</para>\n      </summary>\n      <param name=\"className\">Specifies the Java class name (e.g. &lt;tt&gt;java.lang.String&lt;/tt&gt;).</param>\n    </member>\n    <member name=\"T:UnityEngine.AndroidJavaObject\">\n      <summary>\n        <para>AndroidJavaObject is the Unity representation of a generic instance of java.lang.Object.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaObject.Call(System.String,System.Object[])\">\n      <summary>\n        <para>Calls a Java method on an object (non-static).</para>\n      </summary>\n      <param name=\"methodName\">Specifies which method to call.</param>\n      <param name=\"args\">An array of parameters passed to the method.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaObject.Call(System.String,System.Object[])\">\n      <summary>\n        <para>Call a Java method on an object.</para>\n      </summary>\n      <param name=\"methodName\">Specifies which method to call.</param>\n      <param name=\"args\">An array of parameters passed to the method.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaObject.CallStatic(System.String,System.Object[])\">\n      <summary>\n        <para>Call a static Java method on a class.</para>\n      </summary>\n      <param name=\"methodName\">Specifies which method to call.</param>\n      <param name=\"args\">An array of parameters passed to the method.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaObject.CallStatic(System.String,System.Object[])\">\n      <summary>\n        <para>Call a static Java method on a class.</para>\n      </summary>\n      <param name=\"methodName\">Specifies which method to call.</param>\n      <param name=\"args\">An array of parameters passed to the method.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaObject.#ctor(System.String,System.Object[])\">\n      <summary>\n        <para>Construct an AndroidJavaObject based on the name of the class.</para>\n      </summary>\n      <param name=\"className\">Specifies the Java class name (e.g. \"&lt;tt&gt;java.lang.String&lt;tt&gt;\" or \"&lt;tt&gt;javalangString&lt;tt&gt;\").</param>\n      <param name=\"args\">An array of parameters passed to the constructor.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaObject.Dispose\">\n      <summary>\n        <para>IDisposable callback.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaObject.Get(System.String)\">\n      <summary>\n        <para>Get the value of a field in an object (non-static).</para>\n      </summary>\n      <param name=\"fieldName\">The name of the field (e.g. int counter; would have fieldName = \"counter\").</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaObject.GetRawClass\">\n      <summary>\n        <para>Retrieves the raw &lt;tt&gt;jclass&lt;/tt&gt; pointer to the Java class.\n\nNote: Using raw JNI functions requires advanced knowledge of the Android Java Native Interface (JNI). Please take note.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaObject.GetRawObject\">\n      <summary>\n        <para>Retrieves the raw &lt;tt&gt;jobject&lt;/tt&gt; pointer to the Java object.\n\nNote: Using raw JNI functions requires advanced knowledge of the Android Java Native Interface (JNI). Please take note.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaObject.GetStatic(System.String)\">\n      <summary>\n        <para>Get the value of a static field in an object type.</para>\n      </summary>\n      <param name=\"fieldName\">The name of the field (e.g. &lt;i&gt;int counter;&lt;/i&gt; would have fieldName = \"counter\").</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaObject.Set(System.String,FieldType)\">\n      <summary>\n        <para>Set the value of a field in an object (non-static).</para>\n      </summary>\n      <param name=\"fieldName\">The name of the field (e.g. int counter; would have fieldName = \"counter\").</param>\n      <param name=\"val\">The value to assign to the field. It has to match the field type.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaObject.SetStatic(System.String,FieldType)\">\n      <summary>\n        <para>Set the value of a static field in an object type.</para>\n      </summary>\n      <param name=\"fieldName\">The name of the field (e.g. int counter; would have fieldName = \"counter\").</param>\n      <param name=\"val\">The value to assign to the field. It has to match the field type.</param>\n    </member>\n    <member name=\"T:UnityEngine.AndroidJavaProxy\">\n      <summary>\n        <para>This class can be used to implement any java interface. Any java vm method invocation matching the interface on the proxy object will automatically be passed to the c# implementation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaProxy.equals(UnityEngine.AndroidJavaObject)\">\n      <summary>\n        <para>The equivalent of the java.lang.Object equals() method.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <returns>\n        <para>Returns true when the objects are equal and false if otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaProxy.hashCode\">\n      <summary>\n        <para>The equivalent of the java.lang.Object hashCode() method.</para>\n      </summary>\n      <returns>\n        <para>Returns the hash code of the java proxy object.</para>\n      </returns>\n    </member>\n    <member name=\"F:UnityEngine.AndroidJavaProxy.javaInterface\">\n      <summary>\n        <para>Java interface implemented by the proxy.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaProxy.toString\">\n      <summary>\n        <para>The equivalent of the java.lang.Object toString() method.</para>\n      </summary>\n      <returns>\n        <para>Returns C# class name + \" &lt;c# proxy java object&gt;\".</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaProxy.#ctor(System.String)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"javaInterface\">Java interface to be implemented by the proxy.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaProxy.#ctor(UnityEngine.AndroidJavaClass)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"javaInterface\">Java interface to be implemented by the proxy.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaProxy.Invoke(System.String,System.Object[])\">\n      <summary>\n        <para>Called by the java vm whenever a method is invoked on the java proxy interface. You can override this to run special code on method invokation, or you can leave the implementation as is, and leave the default behavior which is to look for c# methods matching the signature of the java method.</para>\n      </summary>\n      <param name=\"methodName\">Name of the invoked java method.</param>\n      <param name=\"args\">Arguments passed from the java vm - converted into AndroidJavaObject, AndroidJavaClass or a primitive.</param>\n      <param name=\"javaArgs\">Arguments passed from the java vm - all objects are represented by AndroidJavaObject, int for instance is represented by a java.lang.Integer object.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJavaProxy.Invoke(System.String,UnityEngine.AndroidJavaObject[])\">\n      <summary>\n        <para>Called by the java vm whenever a method is invoked on the java proxy interface. You can override this to run special code on method invokation, or you can leave the implementation as is, and leave the default behavior which is to look for c# methods matching the signature of the java method.</para>\n      </summary>\n      <param name=\"methodName\">Name of the invoked java method.</param>\n      <param name=\"args\">Arguments passed from the java vm - converted into AndroidJavaObject, AndroidJavaClass or a primitive.</param>\n      <param name=\"javaArgs\">Arguments passed from the java vm - all objects are represented by AndroidJavaObject, int for instance is represented by a java.lang.Integer object.</param>\n    </member>\n    <member name=\"T:UnityEngine.AndroidJavaRunnable\">\n      <summary>\n        <para>AndroidJavaRunnable is the Unity representation of a java.lang.Runnable object.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AndroidJNI\">\n      <summary>\n        <para>'Raw' JNI interface to Android Dalvik (Java) VM from Mono (CS/JS).\n\nNote: Using raw JNI functions requires advanced knowledge of the Android Java Native Interface (JNI). Please take note.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.AllocObject(System.IntPtr)\">\n      <summary>\n        <para>Allocates a new Java object without invoking any of the constructors for the object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.AttachCurrentThread\">\n      <summary>\n        <para>Attaches the current thread to a Java (Dalvik) VM.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallBooleanMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Calls an instance (nonstatic) Java method defined by &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallByteMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Calls an instance (nonstatic) Java method defined by &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallCharMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Calls an instance (nonstatic) Java method defined by &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallDoubleMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Calls an instance (nonstatic) Java method defined by &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallFloatMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Calls an instance (nonstatic) Java method defined by &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallIntMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Calls an instance (nonstatic) Java method defined by &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallLongMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Calls an instance (nonstatic) Java method defined by &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallObjectMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Calls an instance (nonstatic) Java method defined by &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallShortMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Calls an instance (nonstatic) Java method defined by &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallStaticBooleanMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Invokes a static method on a Java object, according to the specified &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallStaticByteMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Invokes a static method on a Java object, according to the specified &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallStaticCharMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Invokes a static method on a Java object, according to the specified &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallStaticDoubleMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Invokes a static method on a Java object, according to the specified &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallStaticFloatMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Invokes a static method on a Java object, according to the specified &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallStaticIntMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Invokes a static method on a Java object, according to the specified &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallStaticLongMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Invokes a static method on a Java object, according to the specified &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallStaticObjectMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Invokes a static method on a Java object, according to the specified &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallStaticShortMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Invokes a static method on a Java object, according to the specified &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallStaticStringMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Invokes a static method on a Java object, according to the specified &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallStaticVoidMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Invokes a static method on a Java object, according to the specified &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallStringMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Calls an instance (nonstatic) Java method defined by &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.CallVoidMethod(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Calls an instance (nonstatic) Java method defined by &lt;tt&gt;methodID&lt;tt&gt;, optionally passing an array of arguments (&lt;tt&gt;args&lt;tt&gt;) to the method.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.DeleteGlobalRef(System.IntPtr)\">\n      <summary>\n        <para>Deletes the global reference pointed to by &lt;tt&gt;obj&lt;/tt&gt;.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.DeleteLocalRef(System.IntPtr)\">\n      <summary>\n        <para>Deletes the local reference pointed to by &lt;tt&gt;obj&lt;/tt&gt;.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.DetachCurrentThread\">\n      <summary>\n        <para>Detaches the current thread from a Java (Dalvik) VM.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.EnsureLocalCapacity(System.Int32)\">\n      <summary>\n        <para>Ensures that at least a given number of local references can be created in the current thread.</para>\n      </summary>\n      <param name=\"capacity\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.ExceptionClear\">\n      <summary>\n        <para>Clears any exception that is currently being thrown.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.ExceptionDescribe\">\n      <summary>\n        <para>Prints an exception and a backtrace of the stack to the &lt;tt&gt;logcat&lt;/tt&gt;</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.ExceptionOccurred\">\n      <summary>\n        <para>Determines if an exception is being thrown.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.FatalError(System.String)\">\n      <summary>\n        <para>Raises a fatal error and does not expect the VM to recover. This function does not return.</para>\n      </summary>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.FindClass(System.String)\">\n      <summary>\n        <para>This function loads a locally-defined class.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.FromBooleanArray(System.IntPtr)\">\n      <summary>\n        <para>Convert a Java array of &lt;tt&gt;boolean&lt;/tt&gt; to a managed array of System.Boolean.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.FromByteArray(System.IntPtr)\">\n      <summary>\n        <para>Convert a Java array of &lt;tt&gt;byte&lt;/tt&gt; to a managed array of System.Byte.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.FromCharArray(System.IntPtr)\">\n      <summary>\n        <para>Convert a Java array of &lt;tt&gt;char&lt;/tt&gt; to a managed array of System.Char.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.FromDoubleArray(System.IntPtr)\">\n      <summary>\n        <para>Convert a Java array of &lt;tt&gt;double&lt;/tt&gt; to a managed array of System.Double.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.FromFloatArray(System.IntPtr)\">\n      <summary>\n        <para>Convert a Java array of &lt;tt&gt;float&lt;/tt&gt; to a managed array of System.Single.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.FromIntArray(System.IntPtr)\">\n      <summary>\n        <para>Convert a Java array of &lt;tt&gt;int&lt;/tt&gt; to a managed array of System.Int32.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.FromLongArray(System.IntPtr)\">\n      <summary>\n        <para>Convert a Java array of &lt;tt&gt;long&lt;/tt&gt; to a managed array of System.Int64.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.FromObjectArray(System.IntPtr)\">\n      <summary>\n        <para>Convert a Java array of &lt;tt&gt;java.lang.Object&lt;/tt&gt; to a managed array of System.IntPtr, representing Java objects.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.FromReflectedField(System.IntPtr)\">\n      <summary>\n        <para>Converts a &lt;tt&gt;java.lang.reflect.Field&lt;/tt&gt; to a field ID.</para>\n      </summary>\n      <param name=\"refField\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.FromReflectedMethod(System.IntPtr)\">\n      <summary>\n        <para>Converts a &lt;tt&gt;java.lang.reflect.Method&lt;tt&gt; or &lt;tt&gt;java.lang.reflect.Constructor&lt;tt&gt; object to a method ID.</para>\n      </summary>\n      <param name=\"refMethod\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.FromShortArray(System.IntPtr)\">\n      <summary>\n        <para>Convert a Java array of &lt;tt&gt;short&lt;/tt&gt; to a managed array of System.Int16.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetArrayLength(System.IntPtr)\">\n      <summary>\n        <para>Returns the number of elements in the array.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetBooleanArrayElement(System.IntPtr,System.Int32)\">\n      <summary>\n        <para>Returns the value of one element of a primitive array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetBooleanField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetByteArrayElement(System.IntPtr,System.Int32)\">\n      <summary>\n        <para>Returns the value of one element of a primitive array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetByteField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetCharArrayElement(System.IntPtr,System.Int32)\">\n      <summary>\n        <para>Returns the value of one element of a primitive array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetCharField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetDoubleArrayElement(System.IntPtr,System.Int32)\">\n      <summary>\n        <para>Returns the value of one element of a primitive array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetDoubleField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetFieldID(System.IntPtr,System.String,System.String)\">\n      <summary>\n        <para>Returns the field ID for an instance (nonstatic) field of a class.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"name\"></param>\n      <param name=\"sig\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetFloatArrayElement(System.IntPtr,System.Int32)\">\n      <summary>\n        <para>Returns the value of one element of a primitive array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetFloatField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetIntArrayElement(System.IntPtr,System.Int32)\">\n      <summary>\n        <para>Returns the value of one element of a primitive array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetIntField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetLongArrayElement(System.IntPtr,System.Int32)\">\n      <summary>\n        <para>Returns the value of one element of a primitive array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetLongField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetMethodID(System.IntPtr,System.String,System.String)\">\n      <summary>\n        <para>Returns the method ID for an instance (nonstatic) method of a class or interface.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"name\"></param>\n      <param name=\"sig\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetObjectArrayElement(System.IntPtr,System.Int32)\">\n      <summary>\n        <para>Returns an element of an &lt;tt&gt;Object&lt;/tt&gt; array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetObjectClass(System.IntPtr)\">\n      <summary>\n        <para>Returns the class of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetObjectField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetShortArrayElement(System.IntPtr,System.Int32)\">\n      <summary>\n        <para>Returns the value of one element of a primitive array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetShortField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetStaticBooleanField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetStaticByteField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetStaticCharField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetStaticDoubleField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetStaticFieldID(System.IntPtr,System.String,System.String)\">\n      <summary>\n        <para>Returns the field ID for a static field of a class.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"name\"></param>\n      <param name=\"sig\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetStaticFloatField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetStaticIntField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetStaticLongField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetStaticMethodID(System.IntPtr,System.String,System.String)\">\n      <summary>\n        <para>Returns the method ID for a static method of a class.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"name\"></param>\n      <param name=\"sig\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetStaticObjectField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetStaticShortField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetStaticStringField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetStringField(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function returns the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetStringUTFChars(System.IntPtr)\">\n      <summary>\n        <para>Returns a managed string object representing the string in modified UTF-8 encoding.</para>\n      </summary>\n      <param name=\"str\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetStringUTFLength(System.IntPtr)\">\n      <summary>\n        <para>Returns the length in bytes of the modified UTF-8 representation of a string.</para>\n      </summary>\n      <param name=\"str\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetSuperclass(System.IntPtr)\">\n      <summary>\n        <para>If &lt;tt&gt;clazz&lt;tt&gt; represents any class other than the class &lt;tt&gt;Object&lt;tt&gt;, then this function returns the object that represents the superclass of the class specified by &lt;tt&gt;clazz&lt;/tt&gt;.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.GetVersion\">\n      <summary>\n        <para>Returns the version of the native method interface.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.IsAssignableFrom(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>Determines whether an object of &lt;tt&gt;clazz1&lt;tt&gt; can be safely cast to &lt;tt&gt;clazz2&lt;tt&gt;.</para>\n      </summary>\n      <param name=\"clazz1\"></param>\n      <param name=\"clazz2\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.IsInstanceOf(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>Tests whether an object is an instance of a class.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"clazz\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.IsSameObject(System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>Tests whether two references refer to the same Java object.</para>\n      </summary>\n      <param name=\"obj1\"></param>\n      <param name=\"obj2\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.NewBooleanArray(System.Int32)\">\n      <summary>\n        <para>Construct a new primitive array object.</para>\n      </summary>\n      <param name=\"size\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.NewByteArray(System.Int32)\">\n      <summary>\n        <para>Construct a new primitive array object.</para>\n      </summary>\n      <param name=\"size\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.NewCharArray(System.Int32)\">\n      <summary>\n        <para>Construct a new primitive array object.</para>\n      </summary>\n      <param name=\"size\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.NewDoubleArray(System.Int32)\">\n      <summary>\n        <para>Construct a new primitive array object.</para>\n      </summary>\n      <param name=\"size\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.NewFloatArray(System.Int32)\">\n      <summary>\n        <para>Construct a new primitive array object.</para>\n      </summary>\n      <param name=\"size\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.NewGlobalRef(System.IntPtr)\">\n      <summary>\n        <para>Creates a new global reference to the object referred to by the &lt;tt&gt;obj&lt;/tt&gt; argument.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.NewIntArray(System.Int32)\">\n      <summary>\n        <para>Construct a new primitive array object.</para>\n      </summary>\n      <param name=\"size\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.NewLocalRef(System.IntPtr)\">\n      <summary>\n        <para>Creates a new local reference that refers to the same object as &lt;tt&gt;obj&lt;/tt&gt;.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.NewLongArray(System.Int32)\">\n      <summary>\n        <para>Construct a new primitive array object.</para>\n      </summary>\n      <param name=\"size\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.NewObject(System.IntPtr,System.IntPtr,UnityEngine.jvalue[])\">\n      <summary>\n        <para>Constructs a new Java object. The method ID indicates which constructor method to invoke. This ID must be obtained by calling GetMethodID() with &lt;init&gt; as the method name and void (V) as the return type.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.NewObjectArray(System.Int32,System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>Constructs a new array holding objects in class &lt;tt&gt;clazz&lt;tt&gt;. All elements are initially set to &lt;tt&gt;obj&lt;tt&gt;.</para>\n      </summary>\n      <param name=\"size\"></param>\n      <param name=\"clazz\"></param>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.NewShortArray(System.Int32)\">\n      <summary>\n        <para>Construct a new primitive array object.</para>\n      </summary>\n      <param name=\"size\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.NewStringUTF(System.String)\">\n      <summary>\n        <para>Constructs a new &lt;tt&gt;java.lang.String&lt;/tt&gt; object from an array of characters in modified UTF-8 encoding.</para>\n      </summary>\n      <param name=\"bytes\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.PopLocalFrame(System.IntPtr)\">\n      <summary>\n        <para>Pops off the current local reference frame, frees all the local references, and returns a local reference in the previous local reference frame for the given &lt;tt&gt;result&lt;/tt&gt; object.</para>\n      </summary>\n      <param name=\"ptr\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.PushLocalFrame(System.Int32)\">\n      <summary>\n        <para>Creates a new local reference frame, in which at least a given number of local references can be created.</para>\n      </summary>\n      <param name=\"capacity\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetBooleanArrayElement(System.IntPtr,System.Int32,System.Byte)\">\n      <summary>\n        <para>Sets the value of one element in a primitive array.</para>\n      </summary>\n      <param name=\"array\">The array of native booleans.</param>\n      <param name=\"index\">Index of the array element to set.</param>\n      <param name=\"val\">The value to set - for 'true' use 1, for 'false' use 0.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetBooleanField(System.IntPtr,System.IntPtr,System.Boolean)\">\n      <summary>\n        <para>This function sets the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetByteArrayElement(System.IntPtr,System.Int32,System.SByte)\">\n      <summary>\n        <para>Sets the value of one element in a primitive array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetByteField(System.IntPtr,System.IntPtr,System.Byte)\">\n      <summary>\n        <para>This function sets the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetCharArrayElement(System.IntPtr,System.Int32,System.Char)\">\n      <summary>\n        <para>Sets the value of one element in a primitive array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetCharField(System.IntPtr,System.IntPtr,System.Char)\">\n      <summary>\n        <para>This function sets the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetDoubleArrayElement(System.IntPtr,System.Int32,System.Double)\">\n      <summary>\n        <para>Sets the value of one element in a primitive array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetDoubleField(System.IntPtr,System.IntPtr,System.Double)\">\n      <summary>\n        <para>This function sets the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetFloatArrayElement(System.IntPtr,System.Int32,System.Single)\">\n      <summary>\n        <para>Sets the value of one element in a primitive array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetFloatField(System.IntPtr,System.IntPtr,System.Single)\">\n      <summary>\n        <para>This function sets the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetIntArrayElement(System.IntPtr,System.Int32,System.Int32)\">\n      <summary>\n        <para>Sets the value of one element in a primitive array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetIntField(System.IntPtr,System.IntPtr,System.Int32)\">\n      <summary>\n        <para>This function sets the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetLongArrayElement(System.IntPtr,System.Int32,System.Int64)\">\n      <summary>\n        <para>Sets the value of one element in a primitive array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetLongField(System.IntPtr,System.IntPtr,System.Int64)\">\n      <summary>\n        <para>This function sets the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetObjectArrayElement(System.IntPtr,System.Int32,System.IntPtr)\">\n      <summary>\n        <para>Sets an element of an &lt;tt&gt;Object&lt;/tt&gt; array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetObjectField(System.IntPtr,System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function sets the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetShortArrayElement(System.IntPtr,System.Int32,System.Int16)\">\n      <summary>\n        <para>Sets the value of one element in a primitive array.</para>\n      </summary>\n      <param name=\"array\"></param>\n      <param name=\"index\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetShortField(System.IntPtr,System.IntPtr,System.Int16)\">\n      <summary>\n        <para>This function sets the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetStaticBooleanField(System.IntPtr,System.IntPtr,System.Boolean)\">\n      <summary>\n        <para>This function ets the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetStaticByteField(System.IntPtr,System.IntPtr,System.Byte)\">\n      <summary>\n        <para>This function ets the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetStaticCharField(System.IntPtr,System.IntPtr,System.Char)\">\n      <summary>\n        <para>This function ets the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetStaticDoubleField(System.IntPtr,System.IntPtr,System.Double)\">\n      <summary>\n        <para>This function ets the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetStaticFloatField(System.IntPtr,System.IntPtr,System.Single)\">\n      <summary>\n        <para>This function ets the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetStaticIntField(System.IntPtr,System.IntPtr,System.Int32)\">\n      <summary>\n        <para>This function ets the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetStaticLongField(System.IntPtr,System.IntPtr,System.Int64)\">\n      <summary>\n        <para>This function ets the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetStaticObjectField(System.IntPtr,System.IntPtr,System.IntPtr)\">\n      <summary>\n        <para>This function ets the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetStaticShortField(System.IntPtr,System.IntPtr,System.Int16)\">\n      <summary>\n        <para>This function ets the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetStaticStringField(System.IntPtr,System.IntPtr,System.String)\">\n      <summary>\n        <para>This function ets the value of a static field of an object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.SetStringField(System.IntPtr,System.IntPtr,System.String)\">\n      <summary>\n        <para>This function sets the value of an instance (nonstatic) field of an object.</para>\n      </summary>\n      <param name=\"obj\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"val\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.Throw(System.IntPtr)\">\n      <summary>\n        <para>Causes a &lt;tt&gt;java.lang.Throwable&lt;/tt&gt; object to be thrown.</para>\n      </summary>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.ThrowNew(System.IntPtr,System.String)\">\n      <summary>\n        <para>Constructs an exception object from the specified class with the &lt;tt&gt;message&lt;/tt&gt; specified by message and causes that exception to be thrown.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.ToBooleanArray(System.Boolean[])\">\n      <summary>\n        <para>Convert a managed array of System.Boolean to a Java array of &lt;tt&gt;boolean&lt;/tt&gt;.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.ToByteArray(System.Byte[])\">\n      <summary>\n        <para>Convert a managed array of System.Byte to a Java array of &lt;tt&gt;byte&lt;/tt&gt;.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.ToCharArray(System.Char[])\">\n      <summary>\n        <para>Convert a managed array of System.Char to a Java array of &lt;tt&gt;char&lt;/tt&gt;.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.ToDoubleArray(System.Double[])\">\n      <summary>\n        <para>Convert a managed array of System.Double to a Java array of &lt;tt&gt;double&lt;/tt&gt;.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.ToFloatArray(System.Single[])\">\n      <summary>\n        <para>Convert a managed array of System.Single to a Java array of &lt;tt&gt;float&lt;/tt&gt;.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.ToIntArray(System.Int32[])\">\n      <summary>\n        <para>Convert a managed array of System.Int32 to a Java array of &lt;tt&gt;int&lt;/tt&gt;.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.ToLongArray(System.Int64[])\">\n      <summary>\n        <para>Convert a managed array of System.Int64 to a Java array of &lt;tt&gt;long&lt;/tt&gt;.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.ToObjectArray(System.IntPtr[])\">\n      <summary>\n        <para>Convert a managed array of System.IntPtr, representing Java objects, to a Java array of &lt;tt&gt;java.lang.Object&lt;/tt&gt;.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.ToReflectedField(System.IntPtr,System.IntPtr,System.Boolean)\">\n      <summary>\n        <para>Converts a field ID derived from cls to a &lt;tt&gt;java.lang.reflect.Field&lt;/tt&gt; object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"fieldID\"></param>\n      <param name=\"isStatic\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.ToReflectedMethod(System.IntPtr,System.IntPtr,System.Boolean)\">\n      <summary>\n        <para>Converts a method ID derived from clazz to a &lt;tt&gt;java.lang.reflect.Method&lt;tt&gt; or &lt;tt&gt;java.lang.reflect.Constructor&lt;tt&gt; object.</para>\n      </summary>\n      <param name=\"clazz\"></param>\n      <param name=\"methodID\"></param>\n      <param name=\"isStatic\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNI.ToShortArray(System.Int16[])\">\n      <summary>\n        <para>Convert a managed array of System.Int16 to a Java array of &lt;tt&gt;short&lt;/tt&gt;.</para>\n      </summary>\n      <param name=\"array\"></param>\n    </member>\n    <member name=\"T:UnityEngine.AndroidJNIHelper\">\n      <summary>\n        <para>Helper interface for JNI interaction; signature creation and method lookups.\n\nNote: Using raw JNI functions requires advanced knowledge of the Android Java Native Interface (JNI). Please take note.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AndroidJNIHelper.debug\">\n      <summary>\n        <para>Set debug to true to log calls through the AndroidJNIHelper.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.ConvertFromJNIArray(System.IntPtr)\">\n      <summary>\n        <para>Creates a managed array from a Java array.</para>\n      </summary>\n      <param name=\"array\">Java array object to be converted into a managed array.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.ConvertToJNIArray(System.Array)\">\n      <summary>\n        <para>Creates a Java array from a managed array.</para>\n      </summary>\n      <param name=\"array\">Managed array to be converted into a Java array object.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.CreateJavaProxy(UnityEngine.AndroidJavaProxy)\">\n      <summary>\n        <para>Creates a java proxy object which connects to the supplied proxy implementation.</para>\n      </summary>\n      <param name=\"proxy\">An implementatinon of a java interface in c#.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.CreateJavaRunnable(UnityEngine.AndroidJavaRunnable)\">\n      <summary>\n        <para>Creates a UnityJavaRunnable object (implements java.lang.Runnable).</para>\n      </summary>\n      <param name=\"runnable\">A delegate representing the java.lang.Runnable.</param>\n      <param name=\"jrunnable\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.CreateJNIArgArray(System.Object[])\">\n      <summary>\n        <para>Creates the parameter array to be used as argument list when invoking Java code through CallMethod() in AndroidJNI.</para>\n      </summary>\n      <param name=\"args\">An array of objects that should be converted to Call parameters.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.DeleteJNIArgArray(System.Object[],UnityEngine.jvalue[])\">\n      <summary>\n        <para>Deletes any local jni references previously allocated by CreateJNIArgArray().</para>\n      </summary>\n      <param name=\"args\">The array of arguments used as a parameter to CreateJNIArgArray().</param>\n      <param name=\"jniArgs\">The array returned by CreateJNIArgArray().</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.GetConstructorID(System.IntPtr)\">\n      <summary>\n        <para>Scans a particular Java class for a constructor method matching a signature.</para>\n      </summary>\n      <param name=\"javaClass\">Raw JNI Java class object (obtained by calling AndroidJNI.FindClass).</param>\n      <param name=\"signature\">Constructor method signature (e.g. obtained by calling AndroidJNIHelper.GetSignature).</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.GetConstructorID(System.IntPtr,System.String)\">\n      <summary>\n        <para>Scans a particular Java class for a constructor method matching a signature.</para>\n      </summary>\n      <param name=\"javaClass\">Raw JNI Java class object (obtained by calling AndroidJNI.FindClass).</param>\n      <param name=\"signature\">Constructor method signature (e.g. obtained by calling AndroidJNIHelper.GetSignature).</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.GetConstructorID(System.IntPtr,System.Object[])\">\n      <summary>\n        <para>Get a JNI method ID for a constructor based on calling arguments.</para>\n      </summary>\n      <param name=\"javaClass\">Raw JNI Java class object (obtained by calling AndroidJNI.FindClass).</param>\n      <param name=\"args\">Array with parameters to be passed to the constructor when invoked.</param>\n      <param name=\"jclass\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.GetFieldID(System.IntPtr,System.String)\">\n      <summary>\n        <para>Scans a particular Java class for a field matching a name and a signature.</para>\n      </summary>\n      <param name=\"javaClass\">Raw JNI Java class object (obtained by calling AndroidJNI.FindClass).</param>\n      <param name=\"fieldName\">Name of the field as declared in Java.</param>\n      <param name=\"signature\">Field signature (e.g. obtained by calling AndroidJNIHelper.GetSignature).</param>\n      <param name=\"isStatic\">Set to &lt;tt&gt;true&lt;tt&gt; for static fields; &lt;tt&gt;false&lt;tt&gt; for instance (nonstatic) fields.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.GetFieldID(System.IntPtr,System.String,System.String)\">\n      <summary>\n        <para>Scans a particular Java class for a field matching a name and a signature.</para>\n      </summary>\n      <param name=\"javaClass\">Raw JNI Java class object (obtained by calling AndroidJNI.FindClass).</param>\n      <param name=\"fieldName\">Name of the field as declared in Java.</param>\n      <param name=\"signature\">Field signature (e.g. obtained by calling AndroidJNIHelper.GetSignature).</param>\n      <param name=\"isStatic\">Set to &lt;tt&gt;true&lt;tt&gt; for static fields; &lt;tt&gt;false&lt;tt&gt; for instance (nonstatic) fields.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.GetFieldID(System.IntPtr,System.String,System.String,System.Boolean)\">\n      <summary>\n        <para>Scans a particular Java class for a field matching a name and a signature.</para>\n      </summary>\n      <param name=\"javaClass\">Raw JNI Java class object (obtained by calling AndroidJNI.FindClass).</param>\n      <param name=\"fieldName\">Name of the field as declared in Java.</param>\n      <param name=\"signature\">Field signature (e.g. obtained by calling AndroidJNIHelper.GetSignature).</param>\n      <param name=\"isStatic\">Set to &lt;tt&gt;true&lt;tt&gt; for static fields; &lt;tt&gt;false&lt;tt&gt; for instance (nonstatic) fields.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.GetFieldID(System.IntPtr,System.String,System.Boolean)\">\n      <summary>\n        <para>Get a JNI field ID based on type detection. Generic parameter represents the field type.</para>\n      </summary>\n      <param name=\"javaClass\">Raw JNI Java class object (obtained by calling AndroidJNI.FindClass).</param>\n      <param name=\"fieldName\">Name of the field as declared in Java.</param>\n      <param name=\"isStatic\">Set to &lt;tt&gt;true&lt;tt&gt; for static fields; &lt;tt&gt;false&lt;tt&gt; for instance (nonstatic) fields.</param>\n      <param name=\"jclass\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.GetMethodID(System.IntPtr,System.String)\">\n      <summary>\n        <para>Scans a particular Java class for a method matching a name and a signature.</para>\n      </summary>\n      <param name=\"javaClass\">Raw JNI Java class object (obtained by calling AndroidJNI.FindClass).</param>\n      <param name=\"methodName\">Name of the method as declared in Java.</param>\n      <param name=\"signature\">Method signature (e.g. obtained by calling AndroidJNIHelper.GetSignature).</param>\n      <param name=\"isStatic\">Set to &lt;tt&gt;true&lt;tt&gt; for static methods; &lt;tt&gt;false&lt;tt&gt; for instance (nonstatic) methods.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.GetMethodID(System.IntPtr,System.String,System.String)\">\n      <summary>\n        <para>Scans a particular Java class for a method matching a name and a signature.</para>\n      </summary>\n      <param name=\"javaClass\">Raw JNI Java class object (obtained by calling AndroidJNI.FindClass).</param>\n      <param name=\"methodName\">Name of the method as declared in Java.</param>\n      <param name=\"signature\">Method signature (e.g. obtained by calling AndroidJNIHelper.GetSignature).</param>\n      <param name=\"isStatic\">Set to &lt;tt&gt;true&lt;tt&gt; for static methods; &lt;tt&gt;false&lt;tt&gt; for instance (nonstatic) methods.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.GetMethodID(System.IntPtr,System.String,System.String,System.Boolean)\">\n      <summary>\n        <para>Scans a particular Java class for a method matching a name and a signature.</para>\n      </summary>\n      <param name=\"javaClass\">Raw JNI Java class object (obtained by calling AndroidJNI.FindClass).</param>\n      <param name=\"methodName\">Name of the method as declared in Java.</param>\n      <param name=\"signature\">Method signature (e.g. obtained by calling AndroidJNIHelper.GetSignature).</param>\n      <param name=\"isStatic\">Set to &lt;tt&gt;true&lt;tt&gt; for static methods; &lt;tt&gt;false&lt;tt&gt; for instance (nonstatic) methods.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.GetMethodID(System.IntPtr,System.String,System.Object[],System.Boolean)\">\n      <summary>\n        <para>Get a JNI method ID based on calling arguments.</para>\n      </summary>\n      <param name=\"javaClass\">Raw JNI Java class object (obtained by calling AndroidJNI.FindClass).</param>\n      <param name=\"methodName\">Name of the method as declared in Java.</param>\n      <param name=\"args\">Array with parameters to be passed to the method when invoked.</param>\n      <param name=\"isStatic\">Set to &lt;tt&gt;true&lt;tt&gt; for static methods; &lt;tt&gt;false&lt;tt&gt; for instance (nonstatic) methods.</param>\n      <param name=\"jclass\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.GetMethodID(System.IntPtr,System.String,System.Object[],System.Boolean)\">\n      <summary>\n        <para>Get a JNI method ID based on calling arguments.</para>\n      </summary>\n      <param name=\"javaClass\">Raw JNI Java class object (obtained by calling AndroidJNI.FindClass).</param>\n      <param name=\"methodName\">Name of the method as declared in Java.</param>\n      <param name=\"args\">Array with parameters to be passed to the method when invoked.</param>\n      <param name=\"isStatic\">Set to &lt;tt&gt;true&lt;tt&gt; for static methods; &lt;tt&gt;false&lt;tt&gt; for instance (nonstatic) methods.</param>\n      <param name=\"jclass\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.GetSignature(System.Object)\">\n      <summary>\n        <para>Creates the JNI signature string for particular object type.</para>\n      </summary>\n      <param name=\"obj\">Object for which a signature is to be produced.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.GetSignature(System.Object[])\">\n      <summary>\n        <para>Creates the JNI signature string for an object parameter list.</para>\n      </summary>\n      <param name=\"args\">Array of object for which a signature is to be produced.</param>\n    </member>\n    <member name=\"M:UnityEngine.AndroidJNIHelper.GetSignature(System.Object[])\">\n      <summary>\n        <para>Creates the JNI signature string for an object parameter list.</para>\n      </summary>\n      <param name=\"args\">Array of object for which a signature is to be produced.</param>\n    </member>\n    <member name=\"T:UnityEngine.Animation\">\n      <summary>\n        <para>The animation component is used to play back animations.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animation.animateOnlyIfVisible\">\n      <summary>\n        <para>When turned on, Unity might stop animating if it thinks that the results of the animation won't be visible to the user.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animation.animatePhysics\">\n      <summary>\n        <para>When turned on, animations will be executed in the physics loop. This is only useful in conjunction with kinematic rigidbodies.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animation.clip\">\n      <summary>\n        <para>The default animation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animation.cullingType\">\n      <summary>\n        <para>Controls culling of this Animation component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animation.isPlaying\">\n      <summary>\n        <para>Are we playing any animations?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animation.localBounds\">\n      <summary>\n        <para>AABB of this Animation animation component in local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animation.playAutomatically\">\n      <summary>\n        <para>Should the default animation clip (the Animation.clip property) automatically start playing on startup?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animation.wrapMode\">\n      <summary>\n        <para>How should time beyond the playback range of the clip be treated?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animation.AddClip(UnityEngine.AnimationClip,System.String)\">\n      <summary>\n        <para>Adds a clip to the animation with name newName.</para>\n      </summary>\n      <param name=\"clip\"></param>\n      <param name=\"newName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.AddClip(UnityEngine.AnimationClip,System.String,System.Int32,System.Int32)\">\n      <summary>\n        <para>Adds clip to the only play between firstFrame and lastFrame. The new clip will also be added to the animation with name newName.</para>\n      </summary>\n      <param name=\"addLoopFrame\">Should an extra frame be inserted at the end that matches the first frame? Turn this on if you are making a looping animation.</param>\n      <param name=\"clip\"></param>\n      <param name=\"newName\"></param>\n      <param name=\"firstFrame\"></param>\n      <param name=\"lastFrame\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.AddClip(UnityEngine.AnimationClip,System.String,System.Int32,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Adds clip to the only play between firstFrame and lastFrame. The new clip will also be added to the animation with name newName.</para>\n      </summary>\n      <param name=\"addLoopFrame\">Should an extra frame be inserted at the end that matches the first frame? Turn this on if you are making a looping animation.</param>\n      <param name=\"clip\"></param>\n      <param name=\"newName\"></param>\n      <param name=\"firstFrame\"></param>\n      <param name=\"lastFrame\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.Blend(System.String)\">\n      <summary>\n        <para>Blends the animation named animation towards targetWeight over the next time seconds.</para>\n      </summary>\n      <param name=\"animation\"></param>\n      <param name=\"targetWeight\"></param>\n      <param name=\"fadeLength\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.Blend(System.String,System.Single)\">\n      <summary>\n        <para>Blends the animation named animation towards targetWeight over the next time seconds.</para>\n      </summary>\n      <param name=\"animation\"></param>\n      <param name=\"targetWeight\"></param>\n      <param name=\"fadeLength\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.Blend(System.String,System.Single,System.Single)\">\n      <summary>\n        <para>Blends the animation named animation towards targetWeight over the next time seconds.</para>\n      </summary>\n      <param name=\"animation\"></param>\n      <param name=\"targetWeight\"></param>\n      <param name=\"fadeLength\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.CrossFade(System.String)\">\n      <summary>\n        <para>Fades the animation with name animation in over a period of time seconds and fades other animations out.</para>\n      </summary>\n      <param name=\"animation\"></param>\n      <param name=\"fadeLength\"></param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.CrossFade(System.String,System.Single)\">\n      <summary>\n        <para>Fades the animation with name animation in over a period of time seconds and fades other animations out.</para>\n      </summary>\n      <param name=\"animation\"></param>\n      <param name=\"fadeLength\"></param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.CrossFade(System.String,System.Single,UnityEngine.PlayMode)\">\n      <summary>\n        <para>Fades the animation with name animation in over a period of time seconds and fades other animations out.</para>\n      </summary>\n      <param name=\"animation\"></param>\n      <param name=\"fadeLength\"></param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.CrossFadeQueued(System.String)\">\n      <summary>\n        <para>Cross fades an animation after previous animations has finished playing.</para>\n      </summary>\n      <param name=\"animation\"></param>\n      <param name=\"fadeLength\"></param>\n      <param name=\"queue\"></param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.CrossFadeQueued(System.String,System.Single)\">\n      <summary>\n        <para>Cross fades an animation after previous animations has finished playing.</para>\n      </summary>\n      <param name=\"animation\"></param>\n      <param name=\"fadeLength\"></param>\n      <param name=\"queue\"></param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.CrossFadeQueued(System.String,System.Single,UnityEngine.QueueMode)\">\n      <summary>\n        <para>Cross fades an animation after previous animations has finished playing.</para>\n      </summary>\n      <param name=\"animation\"></param>\n      <param name=\"fadeLength\"></param>\n      <param name=\"queue\"></param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.CrossFadeQueued(System.String,System.Single,UnityEngine.QueueMode,UnityEngine.PlayMode)\">\n      <summary>\n        <para>Cross fades an animation after previous animations has finished playing.</para>\n      </summary>\n      <param name=\"animation\"></param>\n      <param name=\"fadeLength\"></param>\n      <param name=\"queue\"></param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.GetClipCount\">\n      <summary>\n        <para>Get the number of clips currently assigned to this animation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animation.IsPlaying(System.String)\">\n      <summary>\n        <para>Is the animation named name playing?</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.Play()\">\n      <summary>\n        <para>Plays an animation without any blending.</para>\n      </summary>\n      <param name=\"mode\"></param>\n      <param name=\"animation\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.Play(System.String)\">\n      <summary>\n        <para>Plays an animation without any blending.</para>\n      </summary>\n      <param name=\"mode\"></param>\n      <param name=\"animation\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.Play(UnityEngine.PlayMode)\">\n      <summary>\n        <para>Plays an animation without any blending.</para>\n      </summary>\n      <param name=\"mode\"></param>\n      <param name=\"animation\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.Play(System.String,UnityEngine.PlayMode)\">\n      <summary>\n        <para>Plays an animation without any blending.</para>\n      </summary>\n      <param name=\"mode\"></param>\n      <param name=\"animation\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.PlayQueued(System.String)\">\n      <summary>\n        <para>Plays an animation after previous animations has finished playing.</para>\n      </summary>\n      <param name=\"animation\"></param>\n      <param name=\"queue\"></param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.PlayQueued(System.String,UnityEngine.QueueMode)\">\n      <summary>\n        <para>Plays an animation after previous animations has finished playing.</para>\n      </summary>\n      <param name=\"animation\"></param>\n      <param name=\"queue\"></param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.PlayQueued(System.String,UnityEngine.QueueMode,UnityEngine.PlayMode)\">\n      <summary>\n        <para>Plays an animation after previous animations has finished playing.</para>\n      </summary>\n      <param name=\"animation\"></param>\n      <param name=\"queue\"></param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.RemoveClip(UnityEngine.AnimationClip)\">\n      <summary>\n        <para>Remove clip from the animation list.</para>\n      </summary>\n      <param name=\"clip\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.RemoveClip(System.String)\">\n      <summary>\n        <para>Remove clip from the animation list.</para>\n      </summary>\n      <param name=\"clipName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.Rewind(System.String)\">\n      <summary>\n        <para>Rewinds the animation named name.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animation.Rewind\">\n      <summary>\n        <para>Rewinds all animations.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animation.Sample\">\n      <summary>\n        <para>Samples animations at the current state.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animation.Stop\">\n      <summary>\n        <para>Stops all playing animations that were started with this Animation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animation.Stop(System.String)\">\n      <summary>\n        <para>Stops an animation named name.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Animation.this\">\n      <summary>\n        <para>Returns the animation state named name.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AnimationBlendMode\">\n      <summary>\n        <para>Used by Animation.Play function.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimationBlendMode.Additive\">\n      <summary>\n        <para>Animations will be added.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimationBlendMode.Blend\">\n      <summary>\n        <para>Animations will be blended.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AnimationClip\">\n      <summary>\n        <para>Stores keyframe based animations.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationClip.empty\">\n      <summary>\n        <para>Returns true if the animation clip has no curves and no events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationClip.events\">\n      <summary>\n        <para>Animation Events for this animation clip.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationClip.frameRate\">\n      <summary>\n        <para>Frame rate at which keyframes are sampled. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationClip.humanMotion\">\n      <summary>\n        <para>Returns true if the animation contains curve that drives a humanoid rig.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationClip.legacy\">\n      <summary>\n        <para>Set to true if the AnimationClip will be used with the Legacy Animation component ( instead of the Animator ).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationClip.length\">\n      <summary>\n        <para>Animation length in seconds. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationClip.localBounds\">\n      <summary>\n        <para>AABB of this Animation Clip in local space of Animation component that it is attached too.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationClip.wrapMode\">\n      <summary>\n        <para>Sets the default wrap mode used in the animation state.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AnimationClip.AddEvent(UnityEngine.AnimationEvent)\">\n      <summary>\n        <para>Adds an animation event to the clip.</para>\n      </summary>\n      <param name=\"evt\">AnimationEvent to add.</param>\n    </member>\n    <member name=\"M:UnityEngine.AnimationClip.ClearCurves\">\n      <summary>\n        <para>Clears all curves from the clip.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AnimationClip.#ctor\">\n      <summary>\n        <para>Creates a new animation clip.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AnimationClip.EnsureQuaternionContinuity\">\n      <summary>\n        <para>Realigns quaternion keys to ensure shortest interpolation paths.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AnimationClip.SampleAnimation(UnityEngine.GameObject,System.Single)\">\n      <summary>\n        <para>Samples an animation at a given time for any animated properties.</para>\n      </summary>\n      <param name=\"go\">The animated game object.</param>\n      <param name=\"time\">The time to sample an animation.</param>\n    </member>\n    <member name=\"M:UnityEngine.AnimationClip.SetCurve(System.String,System.Type,System.String,UnityEngine.AnimationCurve)\">\n      <summary>\n        <para>Assigns the curve to animate a specific property.</para>\n      </summary>\n      <param name=\"relativePath\">Path to the game object this curve applies to. The relativePath\n        is formatted similar to a pathname, e.g. \"rootspineleftArm\".  If relativePath\n        is empty it refers to the game object the animation clip is attached to.</param>\n      <param name=\"type\">The class type of the component that is animated.</param>\n      <param name=\"propertyName\">The name or path to the property being animated.</param>\n      <param name=\"curve\">The animation curve.</param>\n    </member>\n    <member name=\"T:UnityEngine.AnimationClipPair\">\n      <summary>\n        <para>This class defines a pair of clips used by AnimatorOverrideController.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimationClipPair.originalClip\">\n      <summary>\n        <para>The original clip from the controller.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimationClipPair.overrideClip\">\n      <summary>\n        <para>The override animation clip.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AnimationCullingType\">\n      <summary>\n        <para>This enum controlls culling of Animation component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimationCullingType.AlwaysAnimate\">\n      <summary>\n        <para>Animation culling is disabled - object is animated even when offscreen.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimationCullingType.BasedOnRenderers\">\n      <summary>\n        <para>Animation is disabled when renderers are not visible.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AnimationCurve\">\n      <summary>\n        <para>Store a collection of Keyframes that can be evaluated over time.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationCurve.keys\">\n      <summary>\n        <para>All keys defined in the animation curve.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationCurve.length\">\n      <summary>\n        <para>The number of keys in the curve. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationCurve.postWrapMode\">\n      <summary>\n        <para>The behaviour of the animation after the last keyframe.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationCurve.preWrapMode\">\n      <summary>\n        <para>The behaviour of the animation before the first keyframe.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AnimationCurve.AddKey(System.Single,System.Single)\">\n      <summary>\n        <para>Add a new key to the curve.</para>\n      </summary>\n      <param name=\"time\">The time at which to add the key (horizontal axis in the curve graph).</param>\n      <param name=\"value\">The value for the key (vertical axis in the curve graph).</param>\n      <returns>\n        <para>The index of the added key, or -1 if the key could not be added.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AnimationCurve.AddKey(UnityEngine.Keyframe)\">\n      <summary>\n        <para>Add a new key to the curve.</para>\n      </summary>\n      <param name=\"key\">The key to add to the curve.</param>\n      <returns>\n        <para>The index of the added key, or -1 if the key could not be added.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AnimationCurve.Constant(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Creates a constant \"curve\" starting at timeStart, ending at timeEnd and with the value value.</para>\n      </summary>\n      <param name=\"timeStart\">The start time for the constant curve.</param>\n      <param name=\"timeEnd\">The start time for the constant curve.</param>\n      <param name=\"value\">The value for the constant curve.</param>\n      <returns>\n        <para>The constant curve created from the specified values.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AnimationCurve.#ctor(UnityEngine.Keyframe[])\">\n      <summary>\n        <para>Creates an animation curve from an arbitrary number of keyframes.</para>\n      </summary>\n      <param name=\"keys\">An array of Keyframes used to define the curve.</param>\n    </member>\n    <member name=\"M:UnityEngine.AnimationCurve.#ctor\">\n      <summary>\n        <para>Creates an empty animation curve.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AnimationCurve.EaseInOut(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Creates an ease-in and out curve starting at timeStart, valueStart and ending at timeEnd, valueEnd.</para>\n      </summary>\n      <param name=\"timeStart\">The start time for the ease curve.</param>\n      <param name=\"valueStart\">The start value for the ease curve.</param>\n      <param name=\"timeEnd\">The end time for the ease curve.</param>\n      <param name=\"valueEnd\">The end value for the ease curve.</param>\n      <returns>\n        <para>The ease-in and out curve generated from the specified values.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AnimationCurve.Evaluate(System.Single)\">\n      <summary>\n        <para>Evaluate the curve at time.</para>\n      </summary>\n      <param name=\"time\">The time within the curve you want to evaluate (the horizontal axis in the curve graph).</param>\n      <returns>\n        <para>The value of the curve, at the point in time specified.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AnimationCurve.Linear(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>A straight Line starting at timeStart, valueStart and ending at timeEnd, valueEnd.</para>\n      </summary>\n      <param name=\"timeStart\">The start time for the linear curve.</param>\n      <param name=\"valueStart\">The start value for the linear curve.</param>\n      <param name=\"timeEnd\">The end time for the linear curve.</param>\n      <param name=\"valueEnd\">The end value for the linear curve.</param>\n      <returns>\n        <para>The linear curve created from the specified values.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AnimationCurve.MoveKey(System.Int32,UnityEngine.Keyframe)\">\n      <summary>\n        <para>Removes the keyframe at index and inserts key.</para>\n      </summary>\n      <param name=\"index\">The index of the key to move.</param>\n      <param name=\"key\">The key (with its new time) to insert.</param>\n      <returns>\n        <para>The index of the keyframe after moving it.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AnimationCurve.RemoveKey(System.Int32)\">\n      <summary>\n        <para>Removes a key.</para>\n      </summary>\n      <param name=\"index\">The index of the key to remove.</param>\n    </member>\n    <member name=\"M:UnityEngine.AnimationCurve.SmoothTangents(System.Int32,System.Single)\">\n      <summary>\n        <para>Smooth the in and out tangents of the keyframe at index.</para>\n      </summary>\n      <param name=\"index\">The index of the keyframe to be smoothed.</param>\n      <param name=\"weight\">The smoothing weight to apply to the keyframe's tangents.</param>\n    </member>\n    <member name=\"P:UnityEngine.AnimationCurve.this\">\n      <summary>\n        <para>Retrieves the key at index. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AnimationEvent\">\n      <summary>\n        <para>AnimationEvent lets you call a script function similar to SendMessage as part of playing back an animation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationEvent.animationState\">\n      <summary>\n        <para>The animation state that fired this event (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationEvent.animatorClipInfo\">\n      <summary>\n        <para>The animator clip info related to this event (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationEvent.animatorStateInfo\">\n      <summary>\n        <para>The animator state info related to this event (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationEvent.floatParameter\">\n      <summary>\n        <para>Float parameter that is stored in the event and will be sent to the function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationEvent.functionName\">\n      <summary>\n        <para>The name of the function that will be called.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationEvent.intParameter\">\n      <summary>\n        <para>Int parameter that is stored in the event and will be sent to the function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationEvent.isFiredByAnimator\">\n      <summary>\n        <para>Returns true if this Animation event has been fired by an Animator component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationEvent.isFiredByLegacy\">\n      <summary>\n        <para>Returns true if this Animation event has been fired by an Animation component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationEvent.messageOptions\">\n      <summary>\n        <para>Function call options.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationEvent.objectReferenceParameter\">\n      <summary>\n        <para>Object reference parameter that is stored in the event and will be sent to the function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationEvent.stringParameter\">\n      <summary>\n        <para>String parameter that is stored in the event and will be sent to the function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationEvent.time\">\n      <summary>\n        <para>The time at which the event will be fired off.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AnimationEvent.#ctor\">\n      <summary>\n        <para>Creates a new animation event.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AnimationInfo\">\n      <summary>\n        <para>Information about what animation clips is played and its weight.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationInfo.clip\">\n      <summary>\n        <para>Animation clip that is played.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationInfo.weight\">\n      <summary>\n        <para>The weight of the animation clip.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Animations.AimConstraint\">\n      <summary>\n        <para>Constrains the orientation of an object relative to the position of one or more source objects, such that the object is facing the average position of the sources.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.AimConstraint.aimVector\">\n      <summary>\n        <para>The axis towards which the constrained object orients.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.AimConstraint.constraintActive\">\n      <summary>\n        <para>Activates or deactivates the constraint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.AimConstraint.locked\">\n      <summary>\n        <para>Locks the offset and rotation at rest.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.AimConstraint.rotationAtRest\">\n      <summary>\n        <para>The rotation used when the sources have a total weight of 0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.AimConstraint.rotationAxis\">\n      <summary>\n        <para>The axes affected by the AimConstraint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.AimConstraint.rotationOffset\">\n      <summary>\n        <para>Represents an offset from the constrained orientation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.AimConstraint.sourceCount\">\n      <summary>\n        <para>The number of sources set on the component (read-only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.AimConstraint.upVector\">\n      <summary>\n        <para>The up vector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.AimConstraint.weight\">\n      <summary>\n        <para>The weight of the constraint component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.AimConstraint.worldUpObject\">\n      <summary>\n        <para>The world up object, used to calculate the world up vector when the world up Type is AimConstraint.WorldUpType.ObjectUp or AimConstraint.WorldUpType.ObjectRotationUp.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.AimConstraint.worldUpType\">\n      <summary>\n        <para>The type of the world up vector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.AimConstraint.worldUpVector\">\n      <summary>\n        <para>The world up Vector used when the world up type is AimConstraint.WorldUpType.Vector or AimConstraint.WorldUpType.ObjectRotationUp.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AimConstraint.AddSource(UnityEngine.Animations.ConstraintSource)\">\n      <summary>\n        <para>Adds a constraint source.</para>\n      </summary>\n      <param name=\"source\">The source object and its weight.</param>\n      <returns>\n        <para>Returns the index of the added source.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AimConstraint.GetSource(System.Int32)\">\n      <summary>\n        <para>Gets a constraint source by index.</para>\n      </summary>\n      <param name=\"index\">The index of the source.</param>\n      <returns>\n        <para>The source object and its weight.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AimConstraint.GetSources(System.Collections.Generic.List`1&lt;UnityEngine.Animations.ConstraintSource&gt;)\">\n      <summary>\n        <para>Gets the list of sources.</para>\n      </summary>\n      <param name=\"sources\">The list of sources to be filled by the component.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AimConstraint.RemoveSource(System.Int32)\">\n      <summary>\n        <para>Removes a source from the component.</para>\n      </summary>\n      <param name=\"index\">The index of the source to remove.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AimConstraint.SetSource(System.Int32,UnityEngine.Animations.ConstraintSource)\">\n      <summary>\n        <para>Sets a source at a specified index.</para>\n      </summary>\n      <param name=\"index\">The index of the source to set.</param>\n      <param name=\"source\">The source object and its weight.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AimConstraint.SetSources(System.Collections.Generic.List`1&lt;UnityEngine.Animations.ConstraintSource&gt;)\">\n      <summary>\n        <para>Sets the list of sources on the component.</para>\n      </summary>\n      <param name=\"sources\">The list of sources to set.</param>\n    </member>\n    <member name=\"T:UnityEngine.Animations.AimConstraint.WorldUpType\">\n      <summary>\n        <para>Specifies how the world up vector used by the aim constraint is defined.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Animations.AimConstraint.WorldUpType.None\">\n      <summary>\n        <para>Neither defines nor uses a world up vector.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Animations.AimConstraint.WorldUpType.ObjectRotationUp\">\n      <summary>\n        <para>Uses and defines the world up vector as relative to the local space of the object.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Animations.AimConstraint.WorldUpType.ObjectUp\">\n      <summary>\n        <para>Uses and defines the world up vector as a vector from the constrained object, in the direction of the up object.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Animations.AimConstraint.WorldUpType.SceneUp\">\n      <summary>\n        <para>Uses and defines the world up vector as the Unity scene up vector (the Y axis).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Animations.AimConstraint.WorldUpType.Vector\">\n      <summary>\n        <para>Uses and defines the world up vector as a vector specified by the user.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Animations.AnimationClipPlayable\">\n      <summary>\n        <para>A Playable that controls an AnimationClip.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AnimationClipPlayable.Create(UnityEngine.Playables.PlayableGraph,UnityEngine.AnimationClip)\">\n      <summary>\n        <para>Creates an AnimationClipPlayable in the PlayableGraph.</para>\n      </summary>\n      <param name=\"graph\">The PlayableGraph object that will own the AnimationClipPlayable.</param>\n      <param name=\"clip\">The AnimationClip that will be added in the PlayableGraph.</param>\n      <returns>\n        <para>A AnimationClipPlayable linked to the PlayableGraph.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AnimationClipPlayable.GetAnimationClip\">\n      <summary>\n        <para>Returns the AnimationClip stored in the AnimationClipPlayable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AnimationClipPlayable.GetApplyFootIK\">\n      <summary>\n        <para>Returns the state of the ApplyFootIK flag.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AnimationClipPlayable.GetApplyPlayableIK\">\n      <summary>\n        <para>Returns the state of the ApplyPlayableIK flag.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AnimationClipPlayable.SetApplyFootIK(System.Boolean)\">\n      <summary>\n        <para>Sets the value of the ApplyFootIK flag.</para>\n      </summary>\n      <param name=\"value\">The new value of the ApplyFootIK flag.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AnimationClipPlayable.SetApplyPlayableIK(System.Boolean)\">\n      <summary>\n        <para>Requests OnAnimatorIK to be called on the animated GameObject.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Animations.AnimationLayerMixerPlayable\">\n      <summary>\n        <para>An implementation of IPlayable that controls an animation layer mixer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AnimationLayerMixerPlayable.Create(UnityEngine.Playables.PlayableGraph,System.Int32)\">\n      <summary>\n        <para>Creates an AnimationLayerMixerPlayable in the PlayableGraph.</para>\n      </summary>\n      <param name=\"graph\">The PlayableGraph that will contain the new AnimationLayerMixerPlayable.</param>\n      <param name=\"inputCount\">The number of layers.</param>\n      <returns>\n        <para>A new AnimationLayerMixerPlayable linked to the PlayableGraph.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AnimationLayerMixerPlayable.IsLayerAdditive(System.UInt32)\">\n      <summary>\n        <para>Returns true if the layer is additive, false otherwise.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer index.</param>\n      <returns>\n        <para>True if the layer is additive, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Animations.AnimationLayerMixerPlayable.Null\">\n      <summary>\n        <para>Returns an invalid AnimationLayerMixerPlayable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AnimationLayerMixerPlayable.SetLayerAdditive(System.UInt32,System.Boolean)\">\n      <summary>\n        <para>Specifies whether a layer is additive or not. Additive layers blend with previous layers.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer index.</param>\n      <param name=\"value\">Whether the layer is additive or not. Set to true for an additive blend, or false for a regular blend.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AnimationLayerMixerPlayable.SetLayerMaskFromAvatarMask(System.UInt32,UnityEngine.AvatarMask)\">\n      <summary>\n        <para>Sets the mask for the current layer.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer index.</param>\n      <param name=\"mask\">The AvatarMask used to create the new LayerMask.</param>\n    </member>\n    <member name=\"T:UnityEngine.Animations.AnimationMixerPlayable\">\n      <summary>\n        <para>An implementation of IPlayable that controls an animation mixer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AnimationMixerPlayable.Create(UnityEngine.Playables.PlayableGraph,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Creates an AnimationMixerPlayable in the PlayableGraph.</para>\n      </summary>\n      <param name=\"graph\">The PlayableGraph that will contain the new AnimationMixerPlayable.</param>\n      <param name=\"inputCount\">The number of inputs that the mixer will update.</param>\n      <param name=\"normalizeWeights\">True to force a weight normalization of the inputs.</param>\n      <returns>\n        <para>A new AnimationMixerPlayable linked to the PlayableGraph.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Animations.AnimationPlayableBinding\">\n      <summary>\n        <para>A PlayableBinding that contains information representing an AnimationPlayableOutput.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AnimationPlayableBinding.Create(System.String,UnityEngine.Object)\">\n      <summary>\n        <para>Creates a PlayableBinding that contains information representing an AnimationPlayableOutput.</para>\n      </summary>\n      <param name=\"name\">The name of the AnimationPlayableOutput.</param>\n      <param name=\"key\">A reference to a UnityEngine.Object that acts as a key for this binding.</param>\n      <returns>\n        <para>Returns a PlayableBinding that contains information that is used to create an AnimationPlayableOutput.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Animations.AnimationPlayableOutput\">\n      <summary>\n        <para>A IPlayableOutput implementation that connects the PlayableGraph to an Animator in the scene.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AnimationPlayableOutput.Create(UnityEngine.Playables.PlayableGraph,System.String,UnityEngine.Animator)\">\n      <summary>\n        <para>Creates an AnimationPlayableOutput in the PlayableGraph.</para>\n      </summary>\n      <param name=\"graph\">The PlayableGraph that will contain the AnimationPlayableOutput.</param>\n      <param name=\"name\">The name of the output.</param>\n      <param name=\"target\">The Animator that will process the PlayableGraph.</param>\n      <returns>\n        <para>A new AnimationPlayableOutput attached to the PlayableGraph.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AnimationPlayableOutput.GetTarget\">\n      <summary>\n        <para>Returns the Animator that plays the animation graph.</para>\n      </summary>\n      <returns>\n        <para>The targeted Animator.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AnimationPlayableOutput.SetTarget(UnityEngine.Animator)\">\n      <summary>\n        <para>Sets the Animator that plays the animation graph.</para>\n      </summary>\n      <param name=\"value\">The targeted Animator.</param>\n    </member>\n    <member name=\"T:UnityEngine.Animations.AnimatorControllerPlayable\">\n      <summary>\n        <para>An implementation of IPlayable that controls an animation RuntimeAnimatorController.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animations.AnimatorControllerPlayable.Create(UnityEngine.Playables.PlayableGraph,UnityEngine.RuntimeAnimatorController)\">\n      <summary>\n        <para>Creates an AnimatorControllerPlayable in the PlayableGraph.</para>\n      </summary>\n      <param name=\"graph\">The PlayableGraph object that will own the AnimatorControllerPlayable.</param>\n      <param name=\"controller\">The RuntimeAnimatorController that will be added in the graph.</param>\n      <returns>\n        <para>A AnimatorControllerPlayable.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Animations.AnimatorControllerPlayable.Null\">\n      <summary>\n        <para>Returns an invalid AnimatorControllerPlayable.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Animations.Axis\">\n      <summary>\n        <para>Represents the axes used in 3D space.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Animations.Axis.None\">\n      <summary>\n        <para>Represents the case when no axis is specified.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Animations.Axis.X\">\n      <summary>\n        <para>Represents the X axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Animations.Axis.Y\">\n      <summary>\n        <para>Represents the Y axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Animations.Axis.Z\">\n      <summary>\n        <para>Represents the Z axis.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Animations.ConstraintSource\">\n      <summary>\n        <para>Represents a source for the constraint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ConstraintSource.sourceTransform\">\n      <summary>\n        <para>The transform component of the source object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ConstraintSource.weight\">\n      <summary>\n        <para>The weight of the source in the evaluation of the constraint.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Animations.IConstraint\">\n      <summary>\n        <para>The common interface for constraint components.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.IConstraint.constraintActive\">\n      <summary>\n        <para>Activate or deactivate the constraint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.IConstraint.locked\">\n      <summary>\n        <para>Lock or unlock the offset and position at rest.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.IConstraint.sourceCount\">\n      <summary>\n        <para>Gets the number of sources currently set on the component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.IConstraint.weight\">\n      <summary>\n        <para>The weight of the constraint component.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animations.IConstraint.AddSource(UnityEngine.Animations.ConstraintSource)\">\n      <summary>\n        <para>Add a constraint source.</para>\n      </summary>\n      <param name=\"source\">The source object and its weight.</param>\n      <returns>\n        <para>Returns the index of the added source.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.IConstraint.GetSource(System.Int32)\">\n      <summary>\n        <para>Gets a constraint source by index.</para>\n      </summary>\n      <param name=\"index\">The index of the source.</param>\n      <returns>\n        <para>The source object and its weight.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.IConstraint.GetSources(System.Collections.Generic.List`1&lt;UnityEngine.Animations.ConstraintSource&gt;)\">\n      <summary>\n        <para>Gets the list of sources.</para>\n      </summary>\n      <param name=\"sources\">The list of sources to be filled by the component.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.IConstraint.RemoveSource(System.Int32)\">\n      <summary>\n        <para>Removes a source from the component.</para>\n      </summary>\n      <param name=\"index\">The index of the source to remove.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.IConstraint.SetSource(System.Int32,UnityEngine.Animations.ConstraintSource)\">\n      <summary>\n        <para>Sets a source at a specified index.</para>\n      </summary>\n      <param name=\"index\">The index of the source to set.</param>\n      <param name=\"source\">The source object and its weight.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.IConstraint.SetSources(System.Collections.Generic.List`1&lt;UnityEngine.Animations.ConstraintSource&gt;)\">\n      <summary>\n        <para>Sets the list of sources on the component.</para>\n      </summary>\n      <param name=\"sources\">The list of sources to set.</param>\n    </member>\n    <member name=\"T:UnityEngine.Animations.LookAtConstraint\">\n      <summary>\n        <para>\n                Constrains the orientation of an object relative to the position of one or more source objects, such that the object is facing the average position of the sources.\n                The LookAtConstraint is a simplified Animations.AimConstraint typically used with a Camera.\n            </para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.LookAtConstraint.constraintActive\">\n      <summary>\n        <para>Activates or deactivates the constraint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.LookAtConstraint.locked\">\n      <summary>\n        <para>Locks the offset and rotation at rest.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.LookAtConstraint.roll\">\n      <summary>\n        <para>The rotation angle along the z axis of the object. The constraint uses this property to calculate the world up vector when Animations.LookAtConstraint.UseUpObject is false.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.LookAtConstraint.rotationAtRest\">\n      <summary>\n        <para>The rotation used when the sources have a total weight of 0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.LookAtConstraint.rotationOffset\">\n      <summary>\n        <para>Represents an offset from the constrained orientation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.LookAtConstraint.sourceCount\">\n      <summary>\n        <para>The number of sources set on the component (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.LookAtConstraint.useUpObject\">\n      <summary>\n        <para>Determines how the up vector is calculated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.LookAtConstraint.weight\">\n      <summary>\n        <para>The weight of the constraint component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.LookAtConstraint.worldUpObject\">\n      <summary>\n        <para>The world up object, used to calculate the world up vector when Animations.LookAtConstraint.UseUpObject is true.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animations.LookAtConstraint.AddSource(UnityEngine.Animations.ConstraintSource)\">\n      <summary>\n        <para>Adds a constraint source.</para>\n      </summary>\n      <param name=\"source\">The source object and its weight.</param>\n      <returns>\n        <para>Returns the index of the added source.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.LookAtConstraint.GetSource(System.Int32)\">\n      <summary>\n        <para>Gets a constraint source by index.</para>\n      </summary>\n      <param name=\"index\">The index of the source.</param>\n      <returns>\n        <para>Returns the source object and its weight.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.LookAtConstraint.GetSources(System.Collections.Generic.List`1&lt;UnityEngine.Animations.ConstraintSource&gt;)\">\n      <summary>\n        <para>Gets the list of sources.</para>\n      </summary>\n      <param name=\"sources\">The list of sources to be filled by the component.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.LookAtConstraint.RemoveSource(System.Int32)\">\n      <summary>\n        <para>Removes a source from the component.</para>\n      </summary>\n      <param name=\"index\">The index of the source to remove.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.LookAtConstraint.SetSource(System.Int32,UnityEngine.Animations.ConstraintSource)\">\n      <summary>\n        <para>Sets a source at a specified index.</para>\n      </summary>\n      <param name=\"index\">The index of the source to set.</param>\n      <param name=\"source\">The source object and its weight.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.LookAtConstraint.SetSources(System.Collections.Generic.List`1&lt;UnityEngine.Animations.ConstraintSource&gt;)\">\n      <summary>\n        <para>Sets the list of sources on the component.</para>\n      </summary>\n      <param name=\"sources\">The list of sources to set.</param>\n    </member>\n    <member name=\"T:UnityEngine.Animations.ParentConstraint\">\n      <summary>\n        <para>Constrains the orientation and translation of an object to one or more source objects. The constrained object behaves as if it is in the hierarchy of the sources.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ParentConstraint.constraintActive\">\n      <summary>\n        <para>Activates or deactivates the constraint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ParentConstraint.locked\">\n      <summary>\n        <para>Locks the offsets and position (translation and rotation) at rest.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ParentConstraint.rotationAtRest\">\n      <summary>\n        <para>The rotation used when the sources have a total weight of 0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ParentConstraint.rotationAxis\">\n      <summary>\n        <para>The rotation axes affected by the ParentConstraint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ParentConstraint.rotationOffsets\">\n      <summary>\n        <para>The rotation offsets from the constrained orientation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ParentConstraint.sourceCount\">\n      <summary>\n        <para>The number of sources set on the component (read-only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ParentConstraint.translationAtRest\">\n      <summary>\n        <para>The position of the object in local space, used when the sources have a total weight of 0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ParentConstraint.translationAxis\">\n      <summary>\n        <para>The translation axes affected by the ParentConstraint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ParentConstraint.translationOffsets\">\n      <summary>\n        <para>The translation offsets from the constrained orientation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ParentConstraint.weight\">\n      <summary>\n        <para>The weight of the constraint component.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animations.ParentConstraint.AddSource(UnityEngine.Animations.ConstraintSource)\">\n      <summary>\n        <para>Adds a constraint source.</para>\n      </summary>\n      <param name=\"source\">The source object and its weight.</param>\n      <returns>\n        <para>Returns the index of the added source.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.ParentConstraint.GetRotationOffset(System.Int32)\">\n      <summary>\n        <para>Gets the rotation offset associated with a source by index.</para>\n      </summary>\n      <param name=\"index\">The index of the constraint source.</param>\n      <returns>\n        <para>The rotation offset, as Euler angles.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.ParentConstraint.GetSource(System.Int32)\">\n      <summary>\n        <para>Gets a constraint source by index.</para>\n      </summary>\n      <param name=\"index\">The index of the source.</param>\n      <returns>\n        <para>The source object and its weight.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.ParentConstraint.GetSources(System.Collections.Generic.List`1&lt;UnityEngine.Animations.ConstraintSource&gt;)\">\n      <summary>\n        <para>Gets the list of sources.</para>\n      </summary>\n      <param name=\"sources\">The list of sources filled by the component.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.ParentConstraint.GetTranslationOffset(System.Int32)\">\n      <summary>\n        <para>Gets the rotation offset associated with a source by index.</para>\n      </summary>\n      <param name=\"index\">The index of the constraint source.</param>\n      <returns>\n        <para>The translation offset.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.ParentConstraint.RemoveSource(System.Int32)\">\n      <summary>\n        <para>Removes a source from the component.</para>\n      </summary>\n      <param name=\"index\">The index of the source to remove.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.ParentConstraint.SetRotationOffset(System.Int32,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the rotation offset associated with a source by index.</para>\n      </summary>\n      <param name=\"index\">The index of the constraint source.</param>\n      <param name=\"value\">The new rotation offset.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.ParentConstraint.SetSource(System.Int32,UnityEngine.Animations.ConstraintSource)\">\n      <summary>\n        <para>Sets a source at a specified index.</para>\n      </summary>\n      <param name=\"index\">The index of the source to set.</param>\n      <param name=\"source\">The source object and its weight.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.ParentConstraint.SetSources(System.Collections.Generic.List`1&lt;UnityEngine.Animations.ConstraintSource&gt;)\">\n      <summary>\n        <para>Sets the list of sources on the component.</para>\n      </summary>\n      <param name=\"sources\">The list of sources to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.ParentConstraint.SetTranslationOffset(System.Int32,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the translation offset associated with a source by index.</para>\n      </summary>\n      <param name=\"index\">The index of the constraint source.</param>\n      <param name=\"value\">The new translation offset.</param>\n    </member>\n    <member name=\"T:UnityEngine.Animations.PositionConstraint\">\n      <summary>\n        <para>Constrains the position of an object relative to the position of one or more source objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.PositionConstraint.constraintActive\">\n      <summary>\n        <para>Activates or deactivates the constraint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.PositionConstraint.locked\">\n      <summary>\n        <para>Locks the offset and position at rest.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.PositionConstraint.sourceCount\">\n      <summary>\n        <para>The number of sources set on the component (read-only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.PositionConstraint.translationAtRest\">\n      <summary>\n        <para>The translation used when the sources have a total weight of 0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.PositionConstraint.translationAxis\">\n      <summary>\n        <para>The axes affected by the PositionConstraint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.PositionConstraint.translationOffset\">\n      <summary>\n        <para>The offset from the constrained position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.PositionConstraint.weight\">\n      <summary>\n        <para>The weight of the constraint component.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animations.PositionConstraint.AddSource(UnityEngine.Animations.ConstraintSource)\">\n      <summary>\n        <para>Adds a constraint source.</para>\n      </summary>\n      <param name=\"source\">The source object and its weight.</param>\n      <returns>\n        <para>Returns the index of the added source.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.PositionConstraint.GetSource(System.Int32)\">\n      <summary>\n        <para>Gets a constraint source by index.</para>\n      </summary>\n      <param name=\"index\">The index of the source.</param>\n      <returns>\n        <para>The source object and its weight.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.PositionConstraint.GetSources(System.Collections.Generic.List`1&lt;UnityEngine.Animations.ConstraintSource&gt;)\">\n      <summary>\n        <para>Gets the list of sources.</para>\n      </summary>\n      <param name=\"sources\">The list of sources to be filled by the component.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.PositionConstraint.RemoveSource(System.Int32)\">\n      <summary>\n        <para>Removes a source from the component.</para>\n      </summary>\n      <param name=\"index\">The index of the source to remove.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.PositionConstraint.SetSource(System.Int32,UnityEngine.Animations.ConstraintSource)\">\n      <summary>\n        <para>Sets a source at a specified index.</para>\n      </summary>\n      <param name=\"index\">The index of the source to set.</param>\n      <param name=\"source\">The source object and its weight.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.PositionConstraint.SetSources(System.Collections.Generic.List`1&lt;UnityEngine.Animations.ConstraintSource&gt;)\">\n      <summary>\n        <para>Sets the list of sources on the component.</para>\n      </summary>\n      <param name=\"sources\">The list of sources to set.</param>\n    </member>\n    <member name=\"T:UnityEngine.Animations.RotationConstraint\">\n      <summary>\n        <para>Constrains the rotation of an object relative to the rotation of one or more source objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.RotationConstraint.constraintActive\">\n      <summary>\n        <para>Activates or deactivates the constraint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.RotationConstraint.locked\">\n      <summary>\n        <para>Locks the offset and rotation at rest.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.RotationConstraint.rotationAtRest\">\n      <summary>\n        <para>The rotation used when the sources have a total weight of 0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.RotationConstraint.rotationAxis\">\n      <summary>\n        <para>The axes affected by the RotationConstraint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.RotationConstraint.rotationOffset\">\n      <summary>\n        <para>The offset from the constrained rotation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.RotationConstraint.sourceCount\">\n      <summary>\n        <para>The number of sources set on the component (read-only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.RotationConstraint.weight\">\n      <summary>\n        <para>The weight of the constraint component.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animations.RotationConstraint.AddSource(UnityEngine.Animations.ConstraintSource)\">\n      <summary>\n        <para>Adds a constraint source.</para>\n      </summary>\n      <param name=\"source\">The source object and its weight.</param>\n      <returns>\n        <para>Returns the index of the added source.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.RotationConstraint.GetSource(System.Int32)\">\n      <summary>\n        <para>Gets a constraint source by index.</para>\n      </summary>\n      <param name=\"index\">The index of the source.</param>\n      <returns>\n        <para>The source object and its weight.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.RotationConstraint.GetSources(System.Collections.Generic.List`1&lt;UnityEngine.Animations.ConstraintSource&gt;)\">\n      <summary>\n        <para>Gets the list of sources.</para>\n      </summary>\n      <param name=\"sources\">The list of sources to be filled by the component.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.RotationConstraint.RemoveSource(System.Int32)\">\n      <summary>\n        <para>Removes a source from the component.</para>\n      </summary>\n      <param name=\"index\">The index of the source to remove.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.RotationConstraint.SetSource(System.Int32,UnityEngine.Animations.ConstraintSource)\">\n      <summary>\n        <para>Sets a source at a specified index.</para>\n      </summary>\n      <param name=\"index\">The index of the source to set.</param>\n      <param name=\"source\">The source object and its weight.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.RotationConstraint.SetSources(System.Collections.Generic.List`1&lt;UnityEngine.Animations.ConstraintSource&gt;)\">\n      <summary>\n        <para>Sets the list of sources on the component.</para>\n      </summary>\n      <param name=\"sources\">The list of sources to set.</param>\n    </member>\n    <member name=\"T:UnityEngine.Animations.ScaleConstraint\">\n      <summary>\n        <para>Constrains the scale of an object relative to the scale of one or more source objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ScaleConstraint.constraintActive\">\n      <summary>\n        <para>Activates or deactivates the constraint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ScaleConstraint.locked\">\n      <summary>\n        <para>Locks the offset and scale at rest.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ScaleConstraint.scaleAtRest\">\n      <summary>\n        <para>The scale used when the sources have a total weight of 0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ScaleConstraint.scaleOffset\">\n      <summary>\n        <para>The offset from the constrained scale.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ScaleConstraint.scalingAxis\">\n      <summary>\n        <para>The axes affected by the ScaleConstraint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ScaleConstraint.sourceCount\">\n      <summary>\n        <para>The number of sources set on the component (read-only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animations.ScaleConstraint.weight\">\n      <summary>\n        <para>The weight of the constraint component.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animations.ScaleConstraint.AddSource(UnityEngine.Animations.ConstraintSource)\">\n      <summary>\n        <para>Adds a constraint source.</para>\n      </summary>\n      <param name=\"source\">The source object and its weight.</param>\n      <returns>\n        <para>Returns the index of the added source.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.ScaleConstraint.GetSource(System.Int32)\">\n      <summary>\n        <para>Gets a constraint source by index.</para>\n      </summary>\n      <param name=\"index\">The index of the source.</param>\n      <returns>\n        <para>The source object and its weight.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animations.ScaleConstraint.GetSources(System.Collections.Generic.List`1&lt;UnityEngine.Animations.ConstraintSource&gt;)\">\n      <summary>\n        <para>Gets the list of sources.</para>\n      </summary>\n      <param name=\"sources\">The list of sources to be filled by the component.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.ScaleConstraint.RemoveSource(System.Int32)\">\n      <summary>\n        <para>Removes a source from the component.</para>\n      </summary>\n      <param name=\"index\">The index of the source to remove.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.ScaleConstraint.SetSource(System.Int32,UnityEngine.Animations.ConstraintSource)\">\n      <summary>\n        <para>Sets a source at a specified index.</para>\n      </summary>\n      <param name=\"index\">The index of the source to set.</param>\n      <param name=\"source\">The source object and its weight.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animations.ScaleConstraint.SetSources(System.Collections.Generic.List`1&lt;UnityEngine.Animations.ConstraintSource&gt;)\">\n      <summary>\n        <para>Sets the list of sources on the component.</para>\n      </summary>\n      <param name=\"sources\">The list of sources to set.</param>\n    </member>\n    <member name=\"T:UnityEngine.AnimationState\">\n      <summary>\n        <para>The AnimationState gives full control over animation blending.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationState.blendMode\">\n      <summary>\n        <para>Which blend mode should be used?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationState.clip\">\n      <summary>\n        <para>The clip that is being played by this animation state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationState.enabled\">\n      <summary>\n        <para>Enables / disables the animation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationState.length\">\n      <summary>\n        <para>The length of the animation clip in seconds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationState.name\">\n      <summary>\n        <para>The name of the animation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationState.normalizedSpeed\">\n      <summary>\n        <para>The normalized playback speed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationState.normalizedTime\">\n      <summary>\n        <para>The normalized time of the animation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationState.speed\">\n      <summary>\n        <para>The playback speed of the animation. 1 is normal playback speed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationState.time\">\n      <summary>\n        <para>The current time of the animation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationState.weight\">\n      <summary>\n        <para>The weight of animation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimationState.wrapMode\">\n      <summary>\n        <para>Wrapping mode of the animation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AnimationState.AddMixingTransform(UnityEngine.Transform)\">\n      <summary>\n        <para>Adds a transform which should be animated. This allows you to reduce the number of animations you have to create.</para>\n      </summary>\n      <param name=\"mix\">The transform to animate.</param>\n      <param name=\"recursive\">Whether to also animate all children of the specified transform.</param>\n    </member>\n    <member name=\"M:UnityEngine.AnimationState.AddMixingTransform(UnityEngine.Transform,System.Boolean)\">\n      <summary>\n        <para>Adds a transform which should be animated. This allows you to reduce the number of animations you have to create.</para>\n      </summary>\n      <param name=\"mix\">The transform to animate.</param>\n      <param name=\"recursive\">Whether to also animate all children of the specified transform.</param>\n    </member>\n    <member name=\"M:UnityEngine.AnimationState.RemoveMixingTransform(UnityEngine.Transform)\">\n      <summary>\n        <para>Removes a transform which should be animated.</para>\n      </summary>\n      <param name=\"mix\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Animator\">\n      <summary>\n        <para>Interface to control the Mecanim animation system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.angularVelocity\">\n      <summary>\n        <para>Gets the avatar angular velocity for the last evaluated frame.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.animatePhysics\">\n      <summary>\n        <para>When turned on, animations will be executed in the physics loop. This is only useful in conjunction with kinematic rigidbodies.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.applyRootMotion\">\n      <summary>\n        <para>Should root motion be applied?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.avatar\">\n      <summary>\n        <para>Gets/Sets the current Avatar.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.bodyPosition\">\n      <summary>\n        <para>The position of the body center of mass.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.bodyRotation\">\n      <summary>\n        <para>The rotation of the body center of mass.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.cullingMode\">\n      <summary>\n        <para>Controls culling of this Animator component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.deltaPosition\">\n      <summary>\n        <para>Gets the avatar delta position for the last evaluated frame.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.deltaRotation\">\n      <summary>\n        <para>Gets the avatar delta rotation for the last evaluated frame.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.feetPivotActive\">\n      <summary>\n        <para>Blends pivot point between body center of mass and feet pivot. At 0%, the blending point is body center of mass. At 100%, the blending point is feet pivot.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.fireEvents\">\n      <summary>\n        <para>Sets whether the Animator sends events of type AnimationEvent.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.gravityWeight\">\n      <summary>\n        <para>The current gravity weight based on current animations that are played.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.hasBoundPlayables\">\n      <summary>\n        <para>Returns true if Animator has any playables assigned to it.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.hasRootMotion\">\n      <summary>\n        <para>Returns true if the current rig has root motion.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.hasTransformHierarchy\">\n      <summary>\n        <para>Returns true if the object has a transform hierarchy.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.humanScale\">\n      <summary>\n        <para>Returns the scale of the current Avatar for a humanoid rig, (1 by default if the rig is generic).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.isHuman\">\n      <summary>\n        <para>Returns true if the current rig is humanoid, false if it is generic.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.isInitialized\">\n      <summary>\n        <para>Returns whether the animator is initialized successfully.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.isMatchingTarget\">\n      <summary>\n        <para>If automatic matching is active.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.isOptimizable\">\n      <summary>\n        <para>Returns true if the current rig is optimizable with AnimatorUtility.OptimizeTransformHierarchy.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.keepAnimatorControllerStateOnDisable\">\n      <summary>\n        <para>Controls the behaviour of the Animator component when a GameObject is disabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.layerCount\">\n      <summary>\n        <para>Returns the number of layers in the controller.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.layersAffectMassCenter\">\n      <summary>\n        <para>Additional layers affects the center of mass.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.leftFeetBottomHeight\">\n      <summary>\n        <para>Get left foot bottom height.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.linearVelocityBlending\">\n      <summary>\n        <para>When linearVelocityBlending is set to true, the root motion velocity and angular velocity will be blended linearly.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.parameterCount\">\n      <summary>\n        <para>Returns the number of parameters in the controller.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.parameters\">\n      <summary>\n        <para>The AnimatorControllerParameter list used by the animator. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.pivotPosition\">\n      <summary>\n        <para>Get the current position of the pivot.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.pivotWeight\">\n      <summary>\n        <para>Gets the pivot weight.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.playableGraph\">\n      <summary>\n        <para>The PlayableGraph created by the Animator.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.playbackTime\">\n      <summary>\n        <para>Sets the playback position in the recording buffer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.recorderMode\">\n      <summary>\n        <para>Gets the mode of the Animator recorder.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.recorderStartTime\">\n      <summary>\n        <para>Start time of the first frame of the buffer relative to the frame at which StartRecording was called.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.recorderStopTime\">\n      <summary>\n        <para>End time of the recorded clip relative to when StartRecording was called.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.rightFeetBottomHeight\">\n      <summary>\n        <para>Get right foot bottom height.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.rootPosition\">\n      <summary>\n        <para>The root position, the position of the game object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.rootRotation\">\n      <summary>\n        <para>The root rotation, the rotation of the game object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.runtimeAnimatorController\">\n      <summary>\n        <para>The runtime representation of AnimatorController that controls the Animator.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.speed\">\n      <summary>\n        <para>The playback speed of the Animator. 1 is normal playback speed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.stabilizeFeet\">\n      <summary>\n        <para>Automatic stabilization of feet during transition and blending.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.targetPosition\">\n      <summary>\n        <para>Returns the position of the target specified by SetTarget.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.targetRotation\">\n      <summary>\n        <para>Returns the rotation of the target specified by SetTarget.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.updateMode\">\n      <summary>\n        <para>Specifies the update mode of the Animator.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Animator.velocity\">\n      <summary>\n        <para>Gets the avatar velocity  for the last evaluated frame.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animator.ApplyBuiltinRootMotion\">\n      <summary>\n        <para>Apply the default Root Motion.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animator.CrossFade(System.String,System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Creates a crossfade from the current state to any other state using normalized times.</para>\n      </summary>\n      <param name=\"stateName\">The name of the state.</param>\n      <param name=\"stateHashName\">The hash name of the state.</param>\n      <param name=\"normalizedTransitionDuration\">The duration of the transition (normalized).</param>\n      <param name=\"layer\">The layer where the crossfade occurs.</param>\n      <param name=\"normalizedTimeOffset\">The time of the state (normalized).</param>\n      <param name=\"normalizedTransitionTime\">The time of the transition (normalized).</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.CrossFade(System.Int32,System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Creates a crossfade from the current state to any other state using normalized times.</para>\n      </summary>\n      <param name=\"stateName\">The name of the state.</param>\n      <param name=\"stateHashName\">The hash name of the state.</param>\n      <param name=\"normalizedTransitionDuration\">The duration of the transition (normalized).</param>\n      <param name=\"layer\">The layer where the crossfade occurs.</param>\n      <param name=\"normalizedTimeOffset\">The time of the state (normalized).</param>\n      <param name=\"normalizedTransitionTime\">The time of the transition (normalized).</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.CrossFadeInFixedTime(System.Int32,System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Creates a crossfade from the current state to any other state using times in seconds.</para>\n      </summary>\n      <param name=\"stateName\">The name of the state.</param>\n      <param name=\"stateHashName\">The hash name of the state.</param>\n      <param name=\"fixedTransitionDuration\">The duration of the transition (in seconds).</param>\n      <param name=\"layer\">The layer where the crossfade occurs.</param>\n      <param name=\"fixedTimeOffset\">The time of the state (in seconds).</param>\n      <param name=\"normalizedTransitionTime\">The time of the transition (normalized).</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.CrossFadeInFixedTime(System.String,System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Creates a crossfade from the current state to any other state using times in seconds.</para>\n      </summary>\n      <param name=\"stateName\">The name of the state.</param>\n      <param name=\"stateHashName\">The hash name of the state.</param>\n      <param name=\"fixedTransitionDuration\">The duration of the transition (in seconds).</param>\n      <param name=\"layer\">The layer where the crossfade occurs.</param>\n      <param name=\"fixedTimeOffset\">The time of the state (in seconds).</param>\n      <param name=\"normalizedTransitionTime\">The time of the transition (normalized).</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetAnimatorTransitionInfo(System.Int32)\">\n      <summary>\n        <para>Returns an AnimatorTransitionInfo with the informations on the current transition.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer's index.</param>\n      <returns>\n        <para>An AnimatorTransitionInfo with the informations on the current transition.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetBehaviour\">\n      <summary>\n        <para>Returns the first StateMachineBehaviour that matches type T or is derived from T. Returns null if none are found.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetBehaviours\">\n      <summary>\n        <para>Returns all StateMachineBehaviour that match type T or are derived from T. Returns null if none are found.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetBoneTransform(UnityEngine.HumanBodyBones)\">\n      <summary>\n        <para>Returns Transform mapped to this human bone id.</para>\n      </summary>\n      <param name=\"humanBoneId\">The human bone that is queried, see enum HumanBodyBones for a list of possible values.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetBool(System.String)\">\n      <summary>\n        <para>Returns the value of the given boolean parameter.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n      <returns>\n        <para>The value of the parameter.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetBool(System.Int32)\">\n      <summary>\n        <para>Returns the value of the given boolean parameter.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n      <returns>\n        <para>The value of the parameter.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetCurrentAnimationClipState(System.Int32)\">\n      <summary>\n        <para>Gets the list of AnimatorClipInfo currently played by the current state.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer's index.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetCurrentAnimatorClipInfo(System.Int32)\">\n      <summary>\n        <para>Returns an array of all the AnimatorClipInfo in the current state of the given layer.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer index.</param>\n      <returns>\n        <para>An array of all the AnimatorClipInfo in the current state.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetCurrentAnimatorClipInfo(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.AnimatorClipInfo&gt;)\">\n      <summary>\n        <para>Fills clips with the list of all the AnimatorClipInfo in the current state of the given layer.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer index.</param>\n      <param name=\"clips\">The list of AnimatorClipInfo to fill.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetCurrentAnimatorClipInfoCount(System.Int32)\">\n      <summary>\n        <para>Returns the number of AnimatorClipInfo in the current state.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer index.</param>\n      <returns>\n        <para>The number of AnimatorClipInfo in the current state.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetCurrentAnimatorStateInfo(System.Int32)\">\n      <summary>\n        <para>Returns an AnimatorStateInfo with the information on the current state.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer index.</param>\n      <returns>\n        <para>An AnimatorStateInfo with the information on the current state.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetFloat(System.String)\">\n      <summary>\n        <para>Returns the value of the given float parameter.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n      <returns>\n        <para>The value of the parameter.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetFloat(System.Int32)\">\n      <summary>\n        <para>Returns the value of the given float parameter.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n      <returns>\n        <para>The value of the parameter.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetIKHintPosition(UnityEngine.AvatarIKHint)\">\n      <summary>\n        <para>Gets the position of an IK hint.</para>\n      </summary>\n      <param name=\"hint\">The AvatarIKHint that is queried.</param>\n      <returns>\n        <para>Return the current position of this IK hint in world space.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetIKHintPositionWeight(UnityEngine.AvatarIKHint)\">\n      <summary>\n        <para>Gets the translative weight of an IK Hint (0 = at the original animation before IK, 1 = at the hint).</para>\n      </summary>\n      <param name=\"hint\">The AvatarIKHint that is queried.</param>\n      <returns>\n        <para>Return translative weight.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetIKPosition(UnityEngine.AvatarIKGoal)\">\n      <summary>\n        <para>Gets the position of an IK goal.</para>\n      </summary>\n      <param name=\"goal\">The AvatarIKGoal that is queried.</param>\n      <returns>\n        <para>Return the current position of this IK goal in world space.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetIKPositionWeight(UnityEngine.AvatarIKGoal)\">\n      <summary>\n        <para>Gets the translative weight of an IK goal (0 = at the original animation before IK, 1 = at the goal).</para>\n      </summary>\n      <param name=\"goal\">The AvatarIKGoal that is queried.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetIKRotation(UnityEngine.AvatarIKGoal)\">\n      <summary>\n        <para>Gets the rotation of an IK goal.</para>\n      </summary>\n      <param name=\"goal\">The AvatarIKGoal that is is queried.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetIKRotationWeight(UnityEngine.AvatarIKGoal)\">\n      <summary>\n        <para>Gets the rotational weight of an IK goal (0 = rotation before IK, 1 = rotation at the IK goal).</para>\n      </summary>\n      <param name=\"goal\">The AvatarIKGoal that is queried.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetInteger(System.String)\">\n      <summary>\n        <para>Returns the value of the given integer parameter.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n      <returns>\n        <para>The value of the parameter.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetInteger(System.Int32)\">\n      <summary>\n        <para>Returns the value of the given integer parameter.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n      <returns>\n        <para>The value of the parameter.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetLayerIndex(System.String)\">\n      <summary>\n        <para>Returns the index of the layer with the given name.</para>\n      </summary>\n      <param name=\"layerName\">The layer name.</param>\n      <returns>\n        <para>The layer index.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetLayerName(System.Int32)\">\n      <summary>\n        <para>Returns the layer name.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer index.</param>\n      <returns>\n        <para>The layer name.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetLayerWeight(System.Int32)\">\n      <summary>\n        <para>Returns the weight of the layer at the specified index.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer index.</param>\n      <returns>\n        <para>The layer weight.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetNextAnimationClipState(System.Int32)\">\n      <summary>\n        <para>Gets the list of AnimatorClipInfo currently played by the next state.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer's index.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetNextAnimatorClipInfo(System.Int32)\">\n      <summary>\n        <para>Returns an array of all the AnimatorClipInfo in the next state of the given layer.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer index.</param>\n      <returns>\n        <para>An array of all the AnimatorClipInfo in the next state.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetNextAnimatorClipInfo(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.AnimatorClipInfo&gt;)\">\n      <summary>\n        <para>Fills clips with the list of all the AnimatorClipInfo in the next state of the given layer.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer index.</param>\n      <param name=\"clips\">The list of AnimatorClipInfo to fill.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetNextAnimatorClipInfoCount(System.Int32)\">\n      <summary>\n        <para>Returns the number of AnimatorClipInfo in the next state.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer index.</param>\n      <returns>\n        <para>The number of AnimatorClipInfo in the next state.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetNextAnimatorStateInfo(System.Int32)\">\n      <summary>\n        <para>Returns an AnimatorStateInfo with the information on the next state.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer index.</param>\n      <returns>\n        <para>An AnimatorStateInfo with the information on the next state.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetParameter(System.Int32)\">\n      <summary>\n        <para>See AnimatorController.parameters.</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetQuaternion(System.String)\">\n      <summary>\n        <para>Gets the value of a quaternion parameter.</para>\n      </summary>\n      <param name=\"name\">The name of the parameter.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetQuaternion(System.Int32)\">\n      <summary>\n        <para>Gets the value of a quaternion parameter.</para>\n      </summary>\n      <param name=\"id\">The id of the parameter. The id is generated using Animator::StringToHash.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetVector(System.String)\">\n      <summary>\n        <para>Gets the value of a vector parameter.</para>\n      </summary>\n      <param name=\"name\">The name of the parameter.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.GetVector(System.Int32)\">\n      <summary>\n        <para>Gets the value of a vector parameter.</para>\n      </summary>\n      <param name=\"id\">The id of the parameter. The id is generated using Animator::StringToHash.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.HasState(System.Int32,System.Int32)\">\n      <summary>\n        <para>Returns true if the state exists in this layer, false otherwise.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer index.</param>\n      <param name=\"stateID\">The state ID.</param>\n      <returns>\n        <para>True if the state exists in this layer, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.InterruptMatchTarget\">\n      <summary>\n        <para>Interrupts the automatic target matching.</para>\n      </summary>\n      <param name=\"completeMatch\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.InterruptMatchTarget(System.Boolean)\">\n      <summary>\n        <para>Interrupts the automatic target matching.</para>\n      </summary>\n      <param name=\"completeMatch\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.IsControlled(UnityEngine.Transform)\">\n      <summary>\n        <para>Returns true if the transform is controlled by the Animator\\.</para>\n      </summary>\n      <param name=\"transform\">The transform that is queried.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.IsInTransition(System.Int32)\">\n      <summary>\n        <para>Returns true if there is a transition on the given layer, false otherwise.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer index.</param>\n      <returns>\n        <para>True if there is a transition on the given layer, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.IsParameterControlledByCurve(System.String)\">\n      <summary>\n        <para>Returns true if the parameter is controlled by a curve, false otherwise.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n      <returns>\n        <para>True if the parameter is controlled by a curve, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.IsParameterControlledByCurve(System.Int32)\">\n      <summary>\n        <para>Returns true if the parameter is controlled by a curve, false otherwise.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n      <returns>\n        <para>True if the parameter is controlled by a curve, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Animator.MatchTarget(UnityEngine.Vector3,UnityEngine.Quaternion,UnityEngine.AvatarTarget,UnityEngine.MatchTargetWeightMask,System.Single,System.Single)\">\n      <summary>\n        <para>Automatically adjust the gameobject position and rotation so that the AvatarTarget reaches the matchPosition when the current state is at the specified progress.</para>\n      </summary>\n      <param name=\"matchPosition\">The position we want the body part to reach.</param>\n      <param name=\"matchRotation\">The rotation in which we want the body part to be.</param>\n      <param name=\"targetBodyPart\">The body part that is involved in the match.</param>\n      <param name=\"weightMask\">Structure that contains weights for matching position and rotation.</param>\n      <param name=\"startNormalizedTime\">Start time within the animation clip (0 - beginning of clip, 1 - end of clip).</param>\n      <param name=\"targetNormalizedTime\">End time within the animation clip (0 - beginning of clip, 1 - end of clip), values greater than 1 can be set to trigger a match after a certain number of loops. Ex: 2.3 means at 30% of 2nd loop.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.Play(System.String,System.Int32,System.Single)\">\n      <summary>\n        <para>Plays a state.</para>\n      </summary>\n      <param name=\"stateName\">The state name.</param>\n      <param name=\"stateNameHash\">The state hash name. If statNameHash is 0, it changes the current state time.</param>\n      <param name=\"layer\">The layer index. If layer is -1, it plays the first state with the given state name or hash.</param>\n      <param name=\"normalizedTime\">The time offset (in percentage).</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.Play(System.Int32,System.Int32,System.Single)\">\n      <summary>\n        <para>Plays a state.</para>\n      </summary>\n      <param name=\"stateName\">The state name.</param>\n      <param name=\"stateNameHash\">The state hash name. If statNameHash is 0, it changes the current state time.</param>\n      <param name=\"layer\">The layer index. If layer is -1, it plays the first state with the given state name or hash.</param>\n      <param name=\"normalizedTime\">The time offset (in percentage).</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.PlayInFixedTime(System.String,System.Int32,System.Single)\">\n      <summary>\n        <para>Plays a state.</para>\n      </summary>\n      <param name=\"stateName\">The state name.</param>\n      <param name=\"stateNameHash\">The state hash name. If statNameHash is 0, it changes the current state time.</param>\n      <param name=\"layer\">The layer index. If layer is -1, it plays the first state with the given state name or hash.</param>\n      <param name=\"fixedTime\">The time offset (in seconds).</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.PlayInFixedTime(System.Int32,System.Int32,System.Single)\">\n      <summary>\n        <para>Plays a state.</para>\n      </summary>\n      <param name=\"stateName\">The state name.</param>\n      <param name=\"stateNameHash\">The state hash name. If statNameHash is 0, it changes the current state time.</param>\n      <param name=\"layer\">The layer index. If layer is -1, it plays the first state with the given state name or hash.</param>\n      <param name=\"fixedTime\">The time offset (in seconds).</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.Rebind\">\n      <summary>\n        <para>Rebind all the animated properties and mesh data with the Animator.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animator.ResetTrigger(System.String)\">\n      <summary>\n        <para>Resets the value of the given trigger parameter.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.ResetTrigger(System.Int32)\">\n      <summary>\n        <para>Resets the value of the given trigger parameter.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetBoneLocalRotation(UnityEngine.HumanBodyBones,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Sets local rotation of a human bone during a IK pass.</para>\n      </summary>\n      <param name=\"humanBoneId\">The human bone Id.</param>\n      <param name=\"rotation\">The local rotation.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetBool(System.String,System.Boolean)\">\n      <summary>\n        <para>Sets the value of the given boolean parameter.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n      <param name=\"value\">The new parameter value.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetBool(System.Int32,System.Boolean)\">\n      <summary>\n        <para>Sets the value of the given boolean parameter.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n      <param name=\"value\">The new parameter value.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetFloat(System.String,System.Single)\">\n      <summary>\n        <para>Send float values to the Animator to affect transitions.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n      <param name=\"value\">The new parameter value.</param>\n      <param name=\"dampTime\">The damper total time.</param>\n      <param name=\"deltaTime\">The delta time to give to the damper.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetFloat(System.String,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Send float values to the Animator to affect transitions.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n      <param name=\"value\">The new parameter value.</param>\n      <param name=\"dampTime\">The damper total time.</param>\n      <param name=\"deltaTime\">The delta time to give to the damper.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetFloat(System.Int32,System.Single)\">\n      <summary>\n        <para>Send float values to the Animator to affect transitions.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n      <param name=\"value\">The new parameter value.</param>\n      <param name=\"dampTime\">The damper total time.</param>\n      <param name=\"deltaTime\">The delta time to give to the damper.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetFloat(System.Int32,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Send float values to the Animator to affect transitions.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n      <param name=\"value\">The new parameter value.</param>\n      <param name=\"dampTime\">The damper total time.</param>\n      <param name=\"deltaTime\">The delta time to give to the damper.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetIKHintPosition(UnityEngine.AvatarIKHint,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the position of an IK hint.</para>\n      </summary>\n      <param name=\"hint\">The AvatarIKHint that is set.</param>\n      <param name=\"hintPosition\">The position in world space.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetIKHintPositionWeight(UnityEngine.AvatarIKHint,System.Single)\">\n      <summary>\n        <para>Sets the translative weight of an IK hint (0 = at the original animation before IK, 1 = at the hint).</para>\n      </summary>\n      <param name=\"hint\">The AvatarIKHint that is set.</param>\n      <param name=\"value\">The translative weight.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetIKPosition(UnityEngine.AvatarIKGoal,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the position of an IK goal.</para>\n      </summary>\n      <param name=\"goal\">The AvatarIKGoal that is set.</param>\n      <param name=\"goalPosition\">The position in world space.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetIKPositionWeight(UnityEngine.AvatarIKGoal,System.Single)\">\n      <summary>\n        <para>Sets the translative weight of an IK goal (0 = at the original animation before IK, 1 = at the goal).</para>\n      </summary>\n      <param name=\"goal\">The AvatarIKGoal that is set.</param>\n      <param name=\"value\">The translative weight.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetIKRotation(UnityEngine.AvatarIKGoal,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Sets the rotation of an IK goal.</para>\n      </summary>\n      <param name=\"goal\">The AvatarIKGoal that is set.</param>\n      <param name=\"goalRotation\">The rotation in world space.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetIKRotationWeight(UnityEngine.AvatarIKGoal,System.Single)\">\n      <summary>\n        <para>Sets the rotational weight of an IK goal (0 = rotation before IK, 1 = rotation at the IK goal).</para>\n      </summary>\n      <param name=\"goal\">The AvatarIKGoal that is set.</param>\n      <param name=\"value\">The rotational weight.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetInteger(System.String,System.Int32)\">\n      <summary>\n        <para>Sets the value of the given integer parameter.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n      <param name=\"value\">The new parameter value.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetInteger(System.Int32,System.Int32)\">\n      <summary>\n        <para>Sets the value of the given integer parameter.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n      <param name=\"value\">The new parameter value.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetLayerWeight(System.Int32,System.Single)\">\n      <summary>\n        <para>Sets the weight of the layer at the given index.</para>\n      </summary>\n      <param name=\"layerIndex\">The layer index.</param>\n      <param name=\"weight\">The new layer weight.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetLookAtPosition(UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the look at position.</para>\n      </summary>\n      <param name=\"lookAtPosition\">The position to lookAt.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetLookAtWeight(System.Single)\">\n      <summary>\n        <para>Set look at weights.</para>\n      </summary>\n      <param name=\"weight\">(0-1) the global weight of the LookAt, multiplier for other parameters.</param>\n      <param name=\"bodyWeight\">(0-1) determines how much the body is involved in the LookAt.</param>\n      <param name=\"headWeight\">(0-1) determines how much the head is involved in the LookAt.</param>\n      <param name=\"eyesWeight\">(0-1) determines how much the eyes are involved in the LookAt.</param>\n      <param name=\"clampWeight\">(0-1) 0.0 means the character is completely unrestrained in motion, 1.0 means he's completely clamped (look at becomes impossible), and 0.5 means he'll be able to move on half of the possible range (180 degrees).</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetLookAtWeight(System.Single,System.Single)\">\n      <summary>\n        <para>Set look at weights.</para>\n      </summary>\n      <param name=\"weight\">(0-1) the global weight of the LookAt, multiplier for other parameters.</param>\n      <param name=\"bodyWeight\">(0-1) determines how much the body is involved in the LookAt.</param>\n      <param name=\"headWeight\">(0-1) determines how much the head is involved in the LookAt.</param>\n      <param name=\"eyesWeight\">(0-1) determines how much the eyes are involved in the LookAt.</param>\n      <param name=\"clampWeight\">(0-1) 0.0 means the character is completely unrestrained in motion, 1.0 means he's completely clamped (look at becomes impossible), and 0.5 means he'll be able to move on half of the possible range (180 degrees).</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetLookAtWeight(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Set look at weights.</para>\n      </summary>\n      <param name=\"weight\">(0-1) the global weight of the LookAt, multiplier for other parameters.</param>\n      <param name=\"bodyWeight\">(0-1) determines how much the body is involved in the LookAt.</param>\n      <param name=\"headWeight\">(0-1) determines how much the head is involved in the LookAt.</param>\n      <param name=\"eyesWeight\">(0-1) determines how much the eyes are involved in the LookAt.</param>\n      <param name=\"clampWeight\">(0-1) 0.0 means the character is completely unrestrained in motion, 1.0 means he's completely clamped (look at becomes impossible), and 0.5 means he'll be able to move on half of the possible range (180 degrees).</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetLookAtWeight(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Set look at weights.</para>\n      </summary>\n      <param name=\"weight\">(0-1) the global weight of the LookAt, multiplier for other parameters.</param>\n      <param name=\"bodyWeight\">(0-1) determines how much the body is involved in the LookAt.</param>\n      <param name=\"headWeight\">(0-1) determines how much the head is involved in the LookAt.</param>\n      <param name=\"eyesWeight\">(0-1) determines how much the eyes are involved in the LookAt.</param>\n      <param name=\"clampWeight\">(0-1) 0.0 means the character is completely unrestrained in motion, 1.0 means he's completely clamped (look at becomes impossible), and 0.5 means he'll be able to move on half of the possible range (180 degrees).</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetLookAtWeight(System.Single,System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Set look at weights.</para>\n      </summary>\n      <param name=\"weight\">(0-1) the global weight of the LookAt, multiplier for other parameters.</param>\n      <param name=\"bodyWeight\">(0-1) determines how much the body is involved in the LookAt.</param>\n      <param name=\"headWeight\">(0-1) determines how much the head is involved in the LookAt.</param>\n      <param name=\"eyesWeight\">(0-1) determines how much the eyes are involved in the LookAt.</param>\n      <param name=\"clampWeight\">(0-1) 0.0 means the character is completely unrestrained in motion, 1.0 means he's completely clamped (look at becomes impossible), and 0.5 means he'll be able to move on half of the possible range (180 degrees).</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetQuaternion(System.String,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Sets the value of a quaternion parameter.</para>\n      </summary>\n      <param name=\"name\">The name of the parameter.</param>\n      <param name=\"value\">The new value for the parameter.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetQuaternion(System.Int32,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Sets the value of a quaternion parameter.</para>\n      </summary>\n      <param name=\"id\">Of the parameter. The id is generated using Animator::StringToHash.</param>\n      <param name=\"value\">The new value for the parameter.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetTarget(UnityEngine.AvatarTarget,System.Single)\">\n      <summary>\n        <para>Sets an AvatarTarget and a targetNormalizedTime for the current state.</para>\n      </summary>\n      <param name=\"targetIndex\">The avatar body part that is queried.</param>\n      <param name=\"targetNormalizedTime\">The current state Time that is queried.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetTrigger(System.String)\">\n      <summary>\n        <para>Sets the value of the given trigger parameter.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetTrigger(System.Int32)\">\n      <summary>\n        <para>Sets the value of the given trigger parameter.</para>\n      </summary>\n      <param name=\"name\">The parameter name.</param>\n      <param name=\"id\">The parameter ID.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetVector(System.String,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the value of a vector parameter.</para>\n      </summary>\n      <param name=\"name\">The name of the parameter.</param>\n      <param name=\"value\">The new value for the parameter.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.SetVector(System.Int32,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the value of a vector parameter.</para>\n      </summary>\n      <param name=\"id\">The id of the parameter. The id is generated using Animator::StringToHash.</param>\n      <param name=\"value\">The new value for the parameter.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.StartPlayback\">\n      <summary>\n        <para>Sets the animator in playback mode.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animator.StartRecording(System.Int32)\">\n      <summary>\n        <para>Sets the animator in recording mode, and allocates a circular buffer of size frameCount.</para>\n      </summary>\n      <param name=\"frameCount\">The number of frames (updates) that will be recorded. If frameCount is 0, the recording will continue until the user calls StopRecording. The maximum value for frameCount is 10000.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.StopPlayback\">\n      <summary>\n        <para>Stops the animator playback mode. When playback stops, the avatar resumes getting control from game logic.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animator.StopRecording\">\n      <summary>\n        <para>Stops animator record mode.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Animator.StringToHash(System.String)\">\n      <summary>\n        <para>Generates an parameter id from a string.</para>\n      </summary>\n      <param name=\"name\">The string to convert to Id.</param>\n    </member>\n    <member name=\"M:UnityEngine.Animator.Update(System.Single)\">\n      <summary>\n        <para>Evaluates the animator based on deltaTime.</para>\n      </summary>\n      <param name=\"deltaTime\">The time delta.</param>\n    </member>\n    <member name=\"T:UnityEngine.AnimatorClipInfo\">\n      <summary>\n        <para>Information about clip being played and blended by the Animator.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorClipInfo.clip\">\n      <summary>\n        <para>Returns the animation clip played by the Animator.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorClipInfo.weight\">\n      <summary>\n        <para>Returns the blending weight used by the Animator to blend this clip.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AnimatorControllerParameter\">\n      <summary>\n        <para>Used to communicate between scripting and the controller. Some parameters can be set in scripting and used by the controller, while other parameters are based on Custom Curves in Animation Clips and can be sampled using the scripting API.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorControllerParameter.defaultBool\">\n      <summary>\n        <para>The default bool value for the parameter.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorControllerParameter.defaultFloat\">\n      <summary>\n        <para>The default float value for the parameter.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorControllerParameter.defaultInt\">\n      <summary>\n        <para>The default int value for the parameter.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorControllerParameter.name\">\n      <summary>\n        <para>The name of the parameter.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorControllerParameter.nameHash\">\n      <summary>\n        <para>Returns the hash of the parameter based on its name.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorControllerParameter.type\">\n      <summary>\n        <para>The type of the parameter.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AnimatorControllerParameterType\">\n      <summary>\n        <para>The type of the parameter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimatorControllerParameterType.Bool\">\n      <summary>\n        <para>Boolean type parameter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimatorControllerParameterType.Float\">\n      <summary>\n        <para>Float type parameter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimatorControllerParameterType.Int\">\n      <summary>\n        <para>Int type parameter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimatorControllerParameterType.Trigger\">\n      <summary>\n        <para>Trigger type parameter.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AnimatorCullingMode\">\n      <summary>\n        <para>Culling mode for the Animator.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimatorCullingMode.AlwaysAnimate\">\n      <summary>\n        <para>Always animate the entire character. Object is animated even when offscreen.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimatorCullingMode.CullCompletely\">\n      <summary>\n        <para>Animation is completely disabled when renderers are not visible.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimatorCullingMode.CullUpdateTransforms\">\n      <summary>\n        <para>Retarget, IK and write of Transforms are disabled when renderers are not visible.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AnimatorOverrideController\">\n      <summary>\n        <para>Interface to control Animator Override Controller.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorOverrideController.clips\">\n      <summary>\n        <para>Returns the list of orignal Animation Clip from the controller and their override Animation Clip.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorOverrideController.overridesCount\">\n      <summary>\n        <para>Returns the count of overrides.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorOverrideController.runtimeAnimatorController\">\n      <summary>\n        <para>The Runtime Animator Controller that the Animator Override Controller overrides.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AnimatorOverrideController.ApplyOverrides(System.Collections.Generic.IList`1&lt;System.Collections.Generic.KeyValuePair`2&lt;UnityEngine.AnimationClip,UnityEngine.AnimationClip&gt;&gt;)\">\n      <summary>\n        <para>Applies the list of overrides on this Animator Override Controller.</para>\n      </summary>\n      <param name=\"overrides\">Overrides list to apply.</param>\n    </member>\n    <member name=\"M:UnityEngine.AnimatorOverrideController.#ctor\">\n      <summary>\n        <para>Creates an empty Animator Override Controller.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AnimatorOverrideController.#ctor(UnityEngine.RuntimeAnimatorController)\">\n      <summary>\n        <para>Creates an Animator Override Controller that overrides controller.</para>\n      </summary>\n      <param name=\"controller\">Runtime Animator Controller to override.</param>\n    </member>\n    <member name=\"M:UnityEngine.AnimatorOverrideController.GetOverrides(System.Collections.Generic.List`1&lt;System.Collections.Generic.KeyValuePair`2&lt;UnityEngine.AnimationClip,UnityEngine.AnimationClip&gt;&gt;)\">\n      <summary>\n        <para>Gets the list of Animation Clip overrides currently defined in this Animator Override Controller.</para>\n      </summary>\n      <param name=\"overrides\">Array to receive results.</param>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorOverrideController.this\">\n      <summary>\n        <para>Returns either the overriding Animation Clip if set or the original Animation Clip named name.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorOverrideController.this\">\n      <summary>\n        <para>Returns either the overriding Animation Clip if set or the original Animation Clip named name.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AnimatorRecorderMode\">\n      <summary>\n        <para>The mode of the Animator's recorder.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimatorRecorderMode.Offline\">\n      <summary>\n        <para>The Animator recorder is offline.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimatorRecorderMode.Playback\">\n      <summary>\n        <para>The Animator recorder is in Playback.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimatorRecorderMode.Record\">\n      <summary>\n        <para>The Animator recorder is in Record.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AnimatorStateInfo\">\n      <summary>\n        <para>Information about the current or next state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorStateInfo.fullPathHash\">\n      <summary>\n        <para>The full path hash for this state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorStateInfo.length\">\n      <summary>\n        <para>Current duration of the state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorStateInfo.loop\">\n      <summary>\n        <para>Is the state looping.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorStateInfo.nameHash\">\n      <summary>\n        <para>The hashed name of the State.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorStateInfo.normalizedTime\">\n      <summary>\n        <para>Normalized time of the State.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorStateInfo.shortNameHash\">\n      <summary>\n        <para>The hash is generated using Animator.StringToHash. The hash does not include the name of the parent layer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorStateInfo.speed\">\n      <summary>\n        <para>The playback speed of the animation. 1 is the normal playback speed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorStateInfo.speedMultiplier\">\n      <summary>\n        <para>The speed multiplier for this state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorStateInfo.tagHash\">\n      <summary>\n        <para>The Tag of the State.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AnimatorStateInfo.IsName(System.String)\">\n      <summary>\n        <para>Does name match the name of the active state in the statemachine?</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AnimatorStateInfo.IsTag(System.String)\">\n      <summary>\n        <para>Does tag match the tag of the active state in the statemachine.</para>\n      </summary>\n      <param name=\"tag\"></param>\n    </member>\n    <member name=\"T:UnityEngine.AnimatorTransitionInfo\">\n      <summary>\n        <para>Information about the current transition.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorTransitionInfo.anyState\">\n      <summary>\n        <para>Returns true if the transition is from an AnyState node, or from Animator.CrossFade.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorTransitionInfo.duration\">\n      <summary>\n        <para>Duration of the transition.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorTransitionInfo.durationUnit\">\n      <summary>\n        <para>The unit of the transition duration.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorTransitionInfo.fullPathHash\">\n      <summary>\n        <para>The hash name of the Transition.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorTransitionInfo.nameHash\">\n      <summary>\n        <para>The simplified name of the Transition.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorTransitionInfo.normalizedTime\">\n      <summary>\n        <para>Normalized time of the Transition.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AnimatorTransitionInfo.userNameHash\">\n      <summary>\n        <para>The user-specified name of the Transition.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AnimatorTransitionInfo.IsName(System.String)\">\n      <summary>\n        <para>Does name match the name of the active Transition.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AnimatorTransitionInfo.IsUserName(System.String)\">\n      <summary>\n        <para>Does userName match the name of the active Transition.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"T:UnityEngine.AnimatorUpdateMode\">\n      <summary>\n        <para>The update mode of the Animator.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimatorUpdateMode.AnimatePhysics\">\n      <summary>\n        <para>Updates the animator during the physic loop in order to have the animation system synchronized with the physics engine.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimatorUpdateMode.Normal\">\n      <summary>\n        <para>Normal update of the animator.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnimatorUpdateMode.UnscaledTime\">\n      <summary>\n        <para>Animator updates independently of Time.timeScale.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AnimatorUtility\">\n      <summary>\n        <para>Various utilities for animator manipulation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AnimatorUtility.DeoptimizeTransformHierarchy(UnityEngine.GameObject)\">\n      <summary>\n        <para>This function will recreate all transform hierarchy under GameObject.</para>\n      </summary>\n      <param name=\"go\">GameObject to Deoptimize.</param>\n    </member>\n    <member name=\"M:UnityEngine.AnimatorUtility.OptimizeTransformHierarchy(UnityEngine.GameObject,System.String[])\">\n      <summary>\n        <para>This function will remove all transform hierarchy under GameObject, the animator will write directly transform matrices into the skin mesh matrices saving alot of CPU cycles.</para>\n      </summary>\n      <param name=\"go\">GameObject to Optimize.</param>\n      <param name=\"exposedTransforms\">List of transform name to expose.</param>\n    </member>\n    <member name=\"T:UnityEngine.AnisotropicFiltering\">\n      <summary>\n        <para>Anisotropic filtering mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnisotropicFiltering.Disable\">\n      <summary>\n        <para>Disable anisotropic filtering for all textures.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnisotropicFiltering.Enable\">\n      <summary>\n        <para>Enable anisotropic filtering, as set for each texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AnisotropicFiltering.ForceEnable\">\n      <summary>\n        <para>Enable anisotropic filtering for all textures.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Apple.ReplayKit.ReplayKit\">\n      <summary>\n        <para>ReplayKit is only available on certain iPhone, iPad and iPod Touch devices running iOS 9.0 or later.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Apple.ReplayKit.ReplayKit.broadcastingAPIAvailable\">\n      <summary>\n        <para>A Boolean that indicates whether ReplayKit broadcasting API is available (true means available) (Read Only).\nCheck the value of this property before making ReplayKit broadcasting API calls. On iOS versions prior to iOS 10, this property will have a value of false.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Apple.ReplayKit.ReplayKit.broadcastURL\">\n      <summary>\n        <para>A string property that contains an URL used to redirect the user to an on-going or completed broadcast (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Apple.ReplayKit.ReplayKit.cameraEnabled\">\n      <summary>\n        <para>Camera enabled status, true, if camera enabled, false otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Apple.ReplayKit.ReplayKit.isBroadcasting\">\n      <summary>\n        <para>Boolean property that indicates whether a broadcast is currently in progress (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Apple.ReplayKit.ReplayKit.isRecording\">\n      <summary>\n        <para>A boolean that indicates whether ReplayKit is making a recording (where True means a recording is in progress). (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Apple.ReplayKit.ReplayKit.lastError\">\n      <summary>\n        <para>A string value of the last error incurred by the ReplayKit: Either 'Failed to get Screen Recorder' or 'No recording available'. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Apple.ReplayKit.ReplayKit.microphoneEnabled\">\n      <summary>\n        <para>Microphone enabled status, true, if microhone enabled, false otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Apple.ReplayKit.ReplayKit.recordingAvailable\">\n      <summary>\n        <para>A boolean value that indicates that a new recording is available for preview (where True means available). (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Apple.ReplayKit.ReplayKit.APIAvailable\">\n      <summary>\n        <para>A boolean that indicates whether the ReplayKit API is available (where True means available). (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Apple.ReplayKit.ReplayKit.BroadcastStatusCallback\">\n      <summary>\n        <para>Function called at the completion of broadcast startup.</para>\n      </summary>\n      <param name=\"hasStarted\">This parameter will be true if the broadcast started successfully and false in the event of an error.</param>\n      <param name=\"errorMessage\">In the event of failure to start a broadcast, this parameter contains the associated error message.</param>\n    </member>\n    <member name=\"M:UnityEngine.Apple.ReplayKit.ReplayKit.Discard\">\n      <summary>\n        <para>Discard the current recording.</para>\n      </summary>\n      <returns>\n        <para>A boolean value of True if the recording was discarded successfully or False if an error occurred.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Apple.ReplayKit.ReplayKit.HideCameraPreview\">\n      <summary>\n        <para>Hide the camera preview view.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Apple.ReplayKit.ReplayKit.Preview\">\n      <summary>\n        <para>Preview the current recording</para>\n      </summary>\n      <returns>\n        <para>A boolean value of True if the video preview window opened successfully or False if an error occurred.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Apple.ReplayKit.ReplayKit.ShowCameraPreviewAt(System.Single,System.Single)\">\n      <summary>\n        <para>Shows camera preview at coordinates posX and posY.</para>\n      </summary>\n      <param name=\"posX\"></param>\n      <param name=\"posY\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Apple.ReplayKit.ReplayKit.StartBroadcasting\">\n      <summary>\n        <para>Initiates and starts a new broadcast\nWhen StartBroadcast is called, user is presented with a broadcast provider selection screen, and then a broadcast setup screen. Once it is finished, a broadcast will be started, and the callback will be invoked.\nIt will also be invoked in case of any error.\n        </para>\n      </summary>\n      <param name=\"callback\">A callback for getting the status of broadcast initiation.</param>\n      <param name=\"enableMicrophone\">Enable or disable the microphone while broadcasting. Enabling the microphone allows you to include user commentary while broadcasting. The default value is false.</param>\n      <param name=\"enableCamera\">Enable or disable the camera while broadcasting. Enabling camera allows you to include user camera footage while broadcasting. The default value is false. To actually include camera footage in your broadcast, you also have to call ShowCameraPreviewAt as well to position the preview view.</param>\n    </member>\n    <member name=\"M:UnityEngine.Apple.ReplayKit.ReplayKit.StartRecording(System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Start a new recording.</para>\n      </summary>\n      <param name=\"enableMicrophone\">Enable or disable the microphone while making a recording. Enabling the microphone allows you to include user commentary while recording. The default value is false.</param>\n      <param name=\"enableCamera\">Enable or disable the camera while making a recording. Enabling camera allows you to include user camera footage while recording. The default value is false. To actually include camera footage in your recording, you also have to call ShowCameraPreviewAt as well to position the preview view.</param>\n      <returns>\n        <para>A boolean value of True if recording started successfully or False if an error occurred.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Apple.ReplayKit.ReplayKit.StopBroadcasting\">\n      <summary>\n        <para>Stops current broadcast.\nWill terminate currently on-going broadcast. If no broadcast is in progress, does nothing.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Apple.ReplayKit.ReplayKit.StopRecording\">\n      <summary>\n        <para>Stop the current recording.</para>\n      </summary>\n      <returns>\n        <para>A boolean value of True if recording stopped successfully or False if an error occurred.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Application\">\n      <summary>\n        <para>Access to application run-time data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.absoluteURL\">\n      <summary>\n        <para>The URL of the document (what is shown in a browser's address bar) for WebGL (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.backgroundLoadingPriority\">\n      <summary>\n        <para>Priority of background loading thread.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.buildGUID\">\n      <summary>\n        <para>Returns a GUID for this build (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.cloudProjectId\">\n      <summary>\n        <para>A unique cloud project identifier. It is unique for every project (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.companyName\">\n      <summary>\n        <para>Return application company name (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.dataPath\">\n      <summary>\n        <para>Contains the path to the game data folder (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.genuine\">\n      <summary>\n        <para>Returns false if application is altered in any way after it was built.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.genuineCheckAvailable\">\n      <summary>\n        <para>Returns true if application integrity can be confirmed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.identifier\">\n      <summary>\n        <para>Returns application identifier at runtime. On Apple platforms this is the 'bundleIdentifier' saved in the info.plist file, on Android it's the 'package' from the AndroidManifest.xml. </para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.installerName\">\n      <summary>\n        <para>Returns the name of the store or package that installed the application (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.installMode\">\n      <summary>\n        <para>Returns application install mode (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.internetReachability\">\n      <summary>\n        <para>Returns the type of Internet reachability currently possible on the device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.isBatchMode\">\n      <summary>\n        <para>Returns true when Unity is launched with the -batchmode flag from the command line (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.isConsolePlatform\">\n      <summary>\n        <para>Is the current Runtime platform a known console platform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.isEditor\">\n      <summary>\n        <para>Are we running inside the Unity editor? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.isFocused\">\n      <summary>\n        <para>Whether the player currently has focus. Read-only.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.isLoadingLevel\">\n      <summary>\n        <para>Is some level being loaded? (Read Only) (Obsolete).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.isMobilePlatform\">\n      <summary>\n        <para>Is the current Runtime platform a known mobile platform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.isPlaying\">\n      <summary>\n        <para>Returns true when in any kind of player is active.(Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.isShowingSplashScreen\">\n      <summary>\n        <para>Checks whether splash screen is being shown.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.levelCount\">\n      <summary>\n        <para>The total number of levels available (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.loadedLevel\">\n      <summary>\n        <para>The level index that was last loaded (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.loadedLevelName\">\n      <summary>\n        <para>The name of the level that was last loaded (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Application.logMessageReceived(UnityEngine.Application/LogCallback)\">\n      <summary>\n        <para>Event that is fired if a log message is received.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Application.logMessageReceivedThreaded(UnityEngine.Application/LogCallback)\">\n      <summary>\n        <para>Event that is fired if a log message is received.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Application.lowMemory(UnityEngine.Application/LowMemoryCallback)\">\n      <summary>\n        <para>This event occurs when an iOS or Android device notifies of low memory while the app is running in the foreground. You can release non-critical assets from memory (such as, textures or audio clips) in response to this in order to avoid the app being terminated. You can also load smaller versions of such assets.  Furthermore, you should serialize any transient data to permanent storage to avoid data loss if the app is terminated.\n\nThis event corresponds to the following callbacks on the different platforms:\n\n- iOS: [UIApplicationDelegate applicationDidReceiveMemoryWarning]\n\n- Android: onLowMemory() and onTrimMemory(level == TRIM_MEMORY_RUNNING_CRITICAL)\n\nHere is an example of handling the callback:</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Application.onBeforeRender(UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Delegate method used to register for \"Just Before Render\" input updates for VR devices.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Application.persistentDataPath\">\n      <summary>\n        <para>Contains the path to a persistent data directory (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.platform\">\n      <summary>\n        <para>Returns the platform the game is running on (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.productName\">\n      <summary>\n        <para>Returns application product name (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Application.quitting(System.Action)\">\n      <summary>\n        <para>Unity raises this event when the player application is qutting.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Application.runInBackground\">\n      <summary>\n        <para>Should the player be running when the application is in the background?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.sandboxType\">\n      <summary>\n        <para>Returns application running in sandbox (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.stackTraceLogType\">\n      <summary>\n        <para>Stack trace logging options. The default value is StackTraceLogType.ScriptOnly.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.streamedBytes\">\n      <summary>\n        <para>How many bytes have we downloaded from the main unity web stream (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.streamingAssetsPath\">\n      <summary>\n        <para>Contains the path to the StreamingAssets folder (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.systemLanguage\">\n      <summary>\n        <para>The language the user's operating system is running in.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.targetFrameRate\">\n      <summary>\n        <para>Instructs game to try to render at a specified frame rate.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.temporaryCachePath\">\n      <summary>\n        <para>Contains the path to a temporary data / cache directory (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.unityVersion\">\n      <summary>\n        <para>The version of the Unity runtime used to play the content.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Application.version\">\n      <summary>\n        <para>Returns application version number  (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Application.wantsToQuit(System.Func`1&lt;System.Boolean&gt;)\">\n      <summary>\n        <para>Unity raises this event when the player application wants to quit.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Application.webSecurityEnabled\">\n      <summary>\n        <para>Indicates whether Unity's webplayer security model is enabled.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Application.AdvertisingIdentifierCallback\">\n      <summary>\n        <para>Delegate method for fetching advertising ID.</para>\n      </summary>\n      <param name=\"advertisingId\">Advertising ID.</param>\n      <param name=\"trackingEnabled\">Indicates whether user has chosen to limit ad tracking.</param>\n      <param name=\"errorMsg\">Error message.</param>\n    </member>\n    <member name=\"M:UnityEngine.Application.CancelQuit\">\n      <summary>\n        <para>Cancels quitting the application. This is useful for showing a splash screen at the end of a game.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Application.CanStreamedLevelBeLoaded(System.Int32)\">\n      <summary>\n        <para>Can the streamed level be loaded?</para>\n      </summary>\n      <param name=\"levelIndex\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Application.CanStreamedLevelBeLoaded(System.String)\">\n      <summary>\n        <para>Can the streamed level be loaded?</para>\n      </summary>\n      <param name=\"levelName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Application.CaptureScreenshot(System.String)\">\n      <summary>\n        <para>Captures a screenshot at path filename as a PNG file.</para>\n      </summary>\n      <param name=\"filename\">Pathname to save the screenshot file to.</param>\n      <param name=\"superSize\">Factor by which to increase resolution.</param>\n    </member>\n    <member name=\"M:UnityEngine.Application.CaptureScreenshot(System.String,System.Int32)\">\n      <summary>\n        <para>Captures a screenshot at path filename as a PNG file.</para>\n      </summary>\n      <param name=\"filename\">Pathname to save the screenshot file to.</param>\n      <param name=\"superSize\">Factor by which to increase resolution.</param>\n    </member>\n    <member name=\"M:UnityEngine.Application.ExternalCall(System.String,System.Object[])\">\n      <summary>\n        <para>Calls a function in the web page that contains the WebGL Player.</para>\n      </summary>\n      <param name=\"functionName\">Name of the function to call.</param>\n      <param name=\"args\">Array of arguments passed in the call.</param>\n    </member>\n    <member name=\"M:UnityEngine.Application.ExternalEval(System.String)\">\n      <summary>\n        <para>Execution of a script function in the contained web page.</para>\n      </summary>\n      <param name=\"script\">The Javascript function to call.</param>\n    </member>\n    <member name=\"M:UnityEngine.Application.GetBuildTags\">\n      <summary>\n        <para>Returns an array of feature tags in use for this build.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Application.GetStackTraceLogType(UnityEngine.LogType)\">\n      <summary>\n        <para>Get stack trace logging options. The default value is StackTraceLogType.ScriptOnly.</para>\n      </summary>\n      <param name=\"logType\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Application.GetStreamProgressForLevel(System.Int32)\">\n      <summary>\n        <para>How far has the download progressed? [0...1].</para>\n      </summary>\n      <param name=\"levelIndex\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Application.GetStreamProgressForLevel(System.String)\">\n      <summary>\n        <para>How far has the download progressed? [0...1].</para>\n      </summary>\n      <param name=\"levelName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Application.HasProLicense\">\n      <summary>\n        <para>Is Unity activated with the Pro license?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Application.HasUserAuthorization(UnityEngine.UserAuthorization)\">\n      <summary>\n        <para>Check if the user has authorized use of the webcam or microphone in the Web Player.</para>\n      </summary>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Application.LoadLevel(System.Int32)\">\n      <summary>\n        <para>Note: This is now obsolete. Use SceneManager.LoadScene instead.</para>\n      </summary>\n      <param name=\"index\">The level to load.</param>\n      <param name=\"name\">The name of the level to load.</param>\n    </member>\n    <member name=\"M:UnityEngine.Application.LoadLevel(System.String)\">\n      <summary>\n        <para>Note: This is now obsolete. Use SceneManager.LoadScene instead.</para>\n      </summary>\n      <param name=\"index\">The level to load.</param>\n      <param name=\"name\">The name of the level to load.</param>\n    </member>\n    <member name=\"M:UnityEngine.Application.LoadLevelAdditive(System.Int32)\">\n      <summary>\n        <para>Loads a level additively.</para>\n      </summary>\n      <param name=\"index\"></param>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Application.LoadLevelAdditive(System.String)\">\n      <summary>\n        <para>Loads a level additively.</para>\n      </summary>\n      <param name=\"index\"></param>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Application.LoadLevelAdditiveAsync(System.Int32)\">\n      <summary>\n        <para>Loads the level additively and asynchronously in the background.</para>\n      </summary>\n      <param name=\"index\"></param>\n      <param name=\"levelName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Application.LoadLevelAdditiveAsync(System.String)\">\n      <summary>\n        <para>Loads the level additively and asynchronously in the background.</para>\n      </summary>\n      <param name=\"index\"></param>\n      <param name=\"levelName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Application.LoadLevelAsync(System.Int32)\">\n      <summary>\n        <para>Loads the level asynchronously in the background.</para>\n      </summary>\n      <param name=\"index\"></param>\n      <param name=\"levelName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Application.LoadLevelAsync(System.String)\">\n      <summary>\n        <para>Loads the level asynchronously in the background.</para>\n      </summary>\n      <param name=\"index\"></param>\n      <param name=\"levelName\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Application.LogCallback\">\n      <summary>\n        <para>Use this delegate type with Application.logMessageReceived or Application.logMessageReceivedThreaded to monitor what gets logged.</para>\n      </summary>\n      <param name=\"condition\"></param>\n      <param name=\"stackTrace\"></param>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Application.LowMemoryCallback\">\n      <summary>\n        <para>This is the delegate function when a mobile device notifies of low memory.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Application.OpenURL(System.String)\">\n      <summary>\n        <para>Opens the url in a browser.</para>\n      </summary>\n      <param name=\"url\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Application.Quit\">\n      <summary>\n        <para>Quits the player application.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Application.RequestAdvertisingIdentifierAsync(UnityEngine.Application/AdvertisingIdentifierCallback)\">\n      <summary>\n        <para>Request advertising ID for iOS, Android and Windows Store.</para>\n      </summary>\n      <param name=\"delegateMethod\">Delegate method.</param>\n      <returns>\n        <para>Returns true if successful, or false for platforms which do not support Advertising Identifiers. In this case, the delegate method is not invoked.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Application.RequestUserAuthorization(UnityEngine.UserAuthorization)\">\n      <summary>\n        <para>Request authorization to use the webcam or microphone in the Web Player.</para>\n      </summary>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Application.SetBuildTags(System.String[])\">\n      <summary>\n        <para>Set an array of feature tags for this build.</para>\n      </summary>\n      <param name=\"buildTags\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Application.SetStackTraceLogType(UnityEngine.LogType,UnityEngine.StackTraceLogType)\">\n      <summary>\n        <para>Set stack trace logging options. The default value is StackTraceLogType.ScriptOnly.</para>\n      </summary>\n      <param name=\"logType\"></param>\n      <param name=\"stackTraceType\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Application.Unload\">\n      <summary>\n        <para>Unloads the Unity runtime.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Application.UnloadLevel(System.Int32)\">\n      <summary>\n        <para>Unloads all GameObject associated with the given scene. Note that assets are currently not unloaded, in order to free up asset memory call Resources.UnloadAllUnusedAssets.</para>\n      </summary>\n      <param name=\"index\">Index of the scene in the PlayerSettings to unload.</param>\n      <param name=\"scenePath\">Name of the scene to Unload.</param>\n      <returns>\n        <para>Return true if the scene is unloaded.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Application.UnloadLevel(System.String)\">\n      <summary>\n        <para>Unloads all GameObject associated with the given scene. Note that assets are currently not unloaded, in order to free up asset memory call Resources.UnloadAllUnusedAssets.</para>\n      </summary>\n      <param name=\"index\">Index of the scene in the PlayerSettings to unload.</param>\n      <param name=\"scenePath\">Name of the scene to Unload.</param>\n      <returns>\n        <para>Return true if the scene is unloaded.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.ApplicationInstallMode\">\n      <summary>\n        <para>Application installation mode (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ApplicationInstallMode.Adhoc\">\n      <summary>\n        <para>Application installed via ad hoc distribution.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ApplicationInstallMode.DeveloperBuild\">\n      <summary>\n        <para>Application installed via developer build.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ApplicationInstallMode.Editor\">\n      <summary>\n        <para>Application running in editor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ApplicationInstallMode.Enterprise\">\n      <summary>\n        <para>Application installed via enterprise distribution.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ApplicationInstallMode.Store\">\n      <summary>\n        <para>Application installed via online store.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ApplicationInstallMode.Unknown\">\n      <summary>\n        <para>Application install mode unknown.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ApplicationSandboxType\">\n      <summary>\n        <para>Application sandbox type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ApplicationSandboxType.NotSandboxed\">\n      <summary>\n        <para>Application not running in a sandbox.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ApplicationSandboxType.SandboxBroken\">\n      <summary>\n        <para>Application is running in broken sandbox.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ApplicationSandboxType.Sandboxed\">\n      <summary>\n        <para>Application is running in a sandbox.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ApplicationSandboxType.Unknown\">\n      <summary>\n        <para>Application sandbox type is unknown.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AreaEffector2D\">\n      <summary>\n        <para>Applies forces within an area.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AreaEffector2D.angularDrag\">\n      <summary>\n        <para>The angular drag to apply to rigid-bodies.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AreaEffector2D.drag\">\n      <summary>\n        <para>The linear drag to apply to rigid-bodies.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AreaEffector2D.forceAngle\">\n      <summary>\n        <para>The angle of the force to be applied.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AreaEffector2D.forceMagnitude\">\n      <summary>\n        <para>The magnitude of the force to be applied.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AreaEffector2D.forceTarget\">\n      <summary>\n        <para>The target for where the effector applies any force.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AreaEffector2D.forceVariation\">\n      <summary>\n        <para>The variation of the magnitude of the force to be applied.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AreaEffector2D.useGlobalAngle\">\n      <summary>\n        <para>Should the forceAngle use global space?</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ArmDof\">\n      <summary>\n        <para>Enumeration of all the muscles in an arm.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ArmDof.ArmDownUp\">\n      <summary>\n        <para>The arm down-up muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ArmDof.ArmFrontBack\">\n      <summary>\n        <para>The arm front-back muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ArmDof.ArmRollInOut\">\n      <summary>\n        <para>The arm roll in-out muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ArmDof.ForeArmCloseOpen\">\n      <summary>\n        <para>The forearm close-open muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ArmDof.ForeArmRollInOut\">\n      <summary>\n        <para>The forearm roll in-out muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ArmDof.HandDownUp\">\n      <summary>\n        <para>The hand down-up muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ArmDof.HandInOut\">\n      <summary>\n        <para>The hand in-out muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ArmDof.LastArmDof\">\n      <summary>\n        <para>The last value of the ArmDof enum.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ArmDof.ShoulderDownUp\">\n      <summary>\n        <para>The shoulder down-up muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ArmDof.ShoulderFrontBack\">\n      <summary>\n        <para>The shoulder front-back muscle.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AssemblyIsEditorAssembly\">\n      <summary>\n        <para>Assembly level attribute. Any classes in an assembly with this attribute will be considered to be Editor Classes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AssemblyIsEditorAssembly.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Assertions.Assert\">\n      <summary>\n        <para>The Assert class contains assertion methods for setting invariants in the code.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Assertions.Assert.raiseExceptions\">\n      <summary>\n        <para>Whether Unity should throw an exception on a failure.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.AreApproximatelyEqual(System.Single,System.Single)\">\n      <summary>\n        <para>Asserts that the values are approximately equal. An absolute error check is used for approximate equality check (|a-b| &lt; tolerance). Default tolerance is 0.00001f.\n\nNote: Every time you call the method with tolerance specified, a new instance of Assertions.Comparers.FloatComparer is created. For performance reasons you might want to instance your own comparer and pass it to the AreEqual method. If the tolerance is not specifies, a default comparer is used and the issue does not occur.</para>\n      </summary>\n      <param name=\"tolerance\">Tolerance of approximation.</param>\n      <param name=\"expected\"></param>\n      <param name=\"actual\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.AreApproximatelyEqual(System.Single,System.Single,System.String)\">\n      <summary>\n        <para>Asserts that the values are approximately equal. An absolute error check is used for approximate equality check (|a-b| &lt; tolerance). Default tolerance is 0.00001f.\n\nNote: Every time you call the method with tolerance specified, a new instance of Assertions.Comparers.FloatComparer is created. For performance reasons you might want to instance your own comparer and pass it to the AreEqual method. If the tolerance is not specifies, a default comparer is used and the issue does not occur.</para>\n      </summary>\n      <param name=\"tolerance\">Tolerance of approximation.</param>\n      <param name=\"expected\"></param>\n      <param name=\"actual\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.AreApproximatelyEqual(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Asserts that the values are approximately equal. An absolute error check is used for approximate equality check (|a-b| &lt; tolerance). Default tolerance is 0.00001f.\n\nNote: Every time you call the method with tolerance specified, a new instance of Assertions.Comparers.FloatComparer is created. For performance reasons you might want to instance your own comparer and pass it to the AreEqual method. If the tolerance is not specifies, a default comparer is used and the issue does not occur.</para>\n      </summary>\n      <param name=\"tolerance\">Tolerance of approximation.</param>\n      <param name=\"expected\"></param>\n      <param name=\"actual\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.AreApproximatelyEqual(System.Single,System.Single,System.Single,System.String)\">\n      <summary>\n        <para>Asserts that the values are approximately equal. An absolute error check is used for approximate equality check (|a-b| &lt; tolerance). Default tolerance is 0.00001f.\n\nNote: Every time you call the method with tolerance specified, a new instance of Assertions.Comparers.FloatComparer is created. For performance reasons you might want to instance your own comparer and pass it to the AreEqual method. If the tolerance is not specifies, a default comparer is used and the issue does not occur.</para>\n      </summary>\n      <param name=\"tolerance\">Tolerance of approximation.</param>\n      <param name=\"expected\"></param>\n      <param name=\"actual\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.AreEqual(T,T)\">\n      <summary>\n        <para>Asserts that the values are equal. If no comparer is specified, EqualityComparer&lt;T&gt;.Default is used.</para>\n      </summary>\n      <param name=\"expected\"></param>\n      <param name=\"actual\"></param>\n      <param name=\"message\"></param>\n      <param name=\"comparer\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.AreEqual(T,T,System.String)\">\n      <summary>\n        <para>Asserts that the values are equal. If no comparer is specified, EqualityComparer&lt;T&gt;.Default is used.</para>\n      </summary>\n      <param name=\"expected\"></param>\n      <param name=\"actual\"></param>\n      <param name=\"message\"></param>\n      <param name=\"comparer\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.AreEqual(T,T,System.String,System.Collections.Generic.IEqualityComparer`1&lt;T&gt;)\">\n      <summary>\n        <para>Asserts that the values are equal. If no comparer is specified, EqualityComparer&lt;T&gt;.Default is used.</para>\n      </summary>\n      <param name=\"expected\"></param>\n      <param name=\"actual\"></param>\n      <param name=\"message\"></param>\n      <param name=\"comparer\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.AreNotApproximatelyEqual(System.Single,System.Single)\">\n      <summary>\n        <para>Asserts that the values are approximately not equal. An absolute error check is used for approximate equality check (|a-b| &lt; tolerance). Default tolerance is 0.00001f.</para>\n      </summary>\n      <param name=\"tolerance\">Tolerance of approximation.</param>\n      <param name=\"expected\"></param>\n      <param name=\"actual\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.AreNotApproximatelyEqual(System.Single,System.Single,System.String)\">\n      <summary>\n        <para>Asserts that the values are approximately not equal. An absolute error check is used for approximate equality check (|a-b| &lt; tolerance). Default tolerance is 0.00001f.</para>\n      </summary>\n      <param name=\"tolerance\">Tolerance of approximation.</param>\n      <param name=\"expected\"></param>\n      <param name=\"actual\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.AreNotApproximatelyEqual(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Asserts that the values are approximately not equal. An absolute error check is used for approximate equality check (|a-b| &lt; tolerance). Default tolerance is 0.00001f.</para>\n      </summary>\n      <param name=\"tolerance\">Tolerance of approximation.</param>\n      <param name=\"expected\"></param>\n      <param name=\"actual\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.AreNotApproximatelyEqual(System.Single,System.Single,System.Single,System.String)\">\n      <summary>\n        <para>Asserts that the values are approximately not equal. An absolute error check is used for approximate equality check (|a-b| &lt; tolerance). Default tolerance is 0.00001f.</para>\n      </summary>\n      <param name=\"tolerance\">Tolerance of approximation.</param>\n      <param name=\"expected\"></param>\n      <param name=\"actual\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.AreNotEqual(T,T)\">\n      <summary>\n        <para>Asserts that the values are not equal.</para>\n      </summary>\n      <param name=\"expected\"></param>\n      <param name=\"actual\"></param>\n      <param name=\"message\"></param>\n      <param name=\"comparer\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.AreNotEqual(T,T,System.String)\">\n      <summary>\n        <para>Asserts that the values are not equal.</para>\n      </summary>\n      <param name=\"expected\"></param>\n      <param name=\"actual\"></param>\n      <param name=\"message\"></param>\n      <param name=\"comparer\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.AreNotEqual(T,T,System.String,System.Collections.Generic.IEqualityComparer`1&lt;T&gt;)\">\n      <summary>\n        <para>Asserts that the values are not equal.</para>\n      </summary>\n      <param name=\"expected\"></param>\n      <param name=\"actual\"></param>\n      <param name=\"message\"></param>\n      <param name=\"comparer\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.IsFalse(System.Boolean)\">\n      <summary>\n        <para>Asserts that the condition is false.</para>\n      </summary>\n      <param name=\"condition\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.IsFalse(System.Boolean,System.String)\">\n      <summary>\n        <para>Asserts that the condition is false.</para>\n      </summary>\n      <param name=\"condition\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.IsNotNull(T)\">\n      <summary>\n        <para>Asserts that the value is not null.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.IsNotNull(T,System.String)\">\n      <summary>\n        <para>Asserts that the value is not null.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.IsNull(T)\">\n      <summary>\n        <para>Asserts that the value is null.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.IsNull(T,System.String)\">\n      <summary>\n        <para>Asserts that the value is null.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.IsTrue(System.Boolean)\">\n      <summary>\n        <para>Asserts that the condition is true.</para>\n      </summary>\n      <param name=\"condition\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Assert.IsTrue(System.Boolean,System.String)\">\n      <summary>\n        <para>Asserts that the condition is true.</para>\n      </summary>\n      <param name=\"condition\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Assertions.AssertionException\">\n      <summary>\n        <para>An exception that is thrown on a failure. Assertions.Assert._raiseExceptions needs to be set to true.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Assertions.Comparers.FloatComparer\">\n      <summary>\n        <para>A float comparer used by Assertions.Assert performing approximate comparison.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Assertions.Comparers.FloatComparer.kEpsilon\">\n      <summary>\n        <para>Default epsilon used by the comparer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Assertions.Comparers.FloatComparer.s_ComparerWithDefaultTolerance\">\n      <summary>\n        <para>Default instance of a comparer class with deafult error epsilon and absolute error check.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Comparers.FloatComparer.AreEqual(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Performs equality check with absolute error check.</para>\n      </summary>\n      <param name=\"expected\">Expected value.</param>\n      <param name=\"actual\">Actual value.</param>\n      <param name=\"error\">Comparison error.</param>\n      <returns>\n        <para>Result of the comparison.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Comparers.FloatComparer.AreEqualRelative(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Performs equality check with relative error check.</para>\n      </summary>\n      <param name=\"expected\">Expected value.</param>\n      <param name=\"actual\">Actual value.</param>\n      <param name=\"error\">Comparison error.</param>\n      <returns>\n        <para>Result of the comparison.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Comparers.FloatComparer.#ctor\">\n      <summary>\n        <para>Creates an instance of the comparer.</para>\n      </summary>\n      <param name=\"relative\">Should a relative check be used when comparing values? By default, an absolute check will be used.</param>\n      <param name=\"error\">Allowed comparison error. By default, the FloatComparer.kEpsilon is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Comparers.FloatComparer.#ctor(System.Boolean)\">\n      <summary>\n        <para>Creates an instance of the comparer.</para>\n      </summary>\n      <param name=\"relative\">Should a relative check be used when comparing values? By default, an absolute check will be used.</param>\n      <param name=\"error\">Allowed comparison error. By default, the FloatComparer.kEpsilon is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Comparers.FloatComparer.#ctor(System.Single)\">\n      <summary>\n        <para>Creates an instance of the comparer.</para>\n      </summary>\n      <param name=\"relative\">Should a relative check be used when comparing values? By default, an absolute check will be used.</param>\n      <param name=\"error\">Allowed comparison error. By default, the FloatComparer.kEpsilon is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Comparers.FloatComparer.#ctor(System.Single,System.Boolean)\">\n      <summary>\n        <para>Creates an instance of the comparer.</para>\n      </summary>\n      <param name=\"relative\">Should a relative check be used when comparing values? By default, an absolute check will be used.</param>\n      <param name=\"error\">Allowed comparison error. By default, the FloatComparer.kEpsilon is used.</param>\n    </member>\n    <member name=\"T:UnityEngine.Assertions.Must.MustExtensions\">\n      <summary>\n        <para>An extension class that serves as a wrapper for the Assert class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustBeApproximatelyEqual(System.Single,System.Single)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.AreApproximatelyEqual.</para>\n      </summary>\n      <param name=\"actual\"></param>\n      <param name=\"expected\"></param>\n      <param name=\"message\"></param>\n      <param name=\"tolerance\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustBeApproximatelyEqual(System.Single,System.Single,System.String)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.AreApproximatelyEqual.</para>\n      </summary>\n      <param name=\"actual\"></param>\n      <param name=\"expected\"></param>\n      <param name=\"message\"></param>\n      <param name=\"tolerance\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustBeApproximatelyEqual(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.AreApproximatelyEqual.</para>\n      </summary>\n      <param name=\"actual\"></param>\n      <param name=\"expected\"></param>\n      <param name=\"message\"></param>\n      <param name=\"tolerance\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustBeApproximatelyEqual(System.Single,System.Single,System.Single,System.String)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.AreApproximatelyEqual.</para>\n      </summary>\n      <param name=\"actual\"></param>\n      <param name=\"expected\"></param>\n      <param name=\"message\"></param>\n      <param name=\"tolerance\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustBeEqual(T,T)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.AreEqual.</para>\n      </summary>\n      <param name=\"actual\"></param>\n      <param name=\"expected\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustBeEqual(T,T,System.String)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.AreEqual.</para>\n      </summary>\n      <param name=\"actual\"></param>\n      <param name=\"expected\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustBeFalse(System.Boolean)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.IsFalse.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustBeFalse(System.Boolean,System.String)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.IsFalse.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustBeNull(T)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.IsNull.</para>\n      </summary>\n      <param name=\"expected\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustBeNull(T,System.String)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.IsNull.</para>\n      </summary>\n      <param name=\"expected\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustBeTrue(System.Boolean)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.IsTrue.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustBeTrue(System.Boolean,System.String)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.IsTrue.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustNotBeApproximatelyEqual(System.Single,System.Single)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.AreNotApproximatelyEqual.</para>\n      </summary>\n      <param name=\"actual\"></param>\n      <param name=\"expected\"></param>\n      <param name=\"message\"></param>\n      <param name=\"tolerance\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustNotBeApproximatelyEqual(System.Single,System.Single,System.String)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.AreNotApproximatelyEqual.</para>\n      </summary>\n      <param name=\"actual\"></param>\n      <param name=\"expected\"></param>\n      <param name=\"message\"></param>\n      <param name=\"tolerance\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustNotBeApproximatelyEqual(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.AreNotApproximatelyEqual.</para>\n      </summary>\n      <param name=\"actual\"></param>\n      <param name=\"expected\"></param>\n      <param name=\"message\"></param>\n      <param name=\"tolerance\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustNotBeApproximatelyEqual(System.Single,System.Single,System.Single,System.String)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.AreNotApproximatelyEqual.</para>\n      </summary>\n      <param name=\"actual\"></param>\n      <param name=\"expected\"></param>\n      <param name=\"message\"></param>\n      <param name=\"tolerance\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustNotBeEqual(T,T)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.AreNotEqual.</para>\n      </summary>\n      <param name=\"actual\"></param>\n      <param name=\"expected\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustNotBeEqual(T,T,System.String)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.AreNotEqual.</para>\n      </summary>\n      <param name=\"actual\"></param>\n      <param name=\"expected\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustNotBeNull(T)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.AreNotNull.</para>\n      </summary>\n      <param name=\"expected\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Assertions.Must.MustExtensions.MustNotBeNull(T,System.String)\">\n      <summary>\n        <para>An extension method for Assertions.Assert.AreNotNull.</para>\n      </summary>\n      <param name=\"expected\"></param>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"T:UnityEngine.AssetBundle\">\n      <summary>\n        <para>AssetBundles let you stream additional assets via the UnityWebRequest class and instantiate them at runtime. AssetBundles are created via BuildPipeline.BuildAssetBundle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AssetBundle.isStreamedSceneAssetBundle\">\n      <summary>\n        <para>Return true if the AssetBundle is a streamed scene AssetBundle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AssetBundle.mainAsset\">\n      <summary>\n        <para>Main asset that was supplied when building the asset bundle (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.Contains(System.String)\">\n      <summary>\n        <para>Check if an AssetBundle contains a specific object.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.CreateFromFile(System.String)\">\n      <summary>\n        <para>Loads an asset bundle from a disk.</para>\n      </summary>\n      <param name=\"path\">Path of the file on disk\n\nSee Also: UnityWebRequestAssetBundle.GetAssetBundle, DownloadHandlerAssetBundle.</param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.CreateFromMemory(System.Byte[])\">\n      <summary>\n        <para>Asynchronously create an AssetBundle from a memory region.</para>\n      </summary>\n      <param name=\"binary\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.CreateFromMemoryImmediate(System.Byte[])\">\n      <summary>\n        <para>Synchronously create an AssetBundle from a memory region.</para>\n      </summary>\n      <param name=\"binary\">Array of bytes with the AssetBundle data.</param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.GetAllAssetNames\">\n      <summary>\n        <para>Return all asset names in the AssetBundle.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.GetAllLoadedAssetBundles\">\n      <summary>\n        <para>To use when you need to get a list of all the currently loaded Asset Bundles.</para>\n      </summary>\n      <returns>\n        <para>Returns IEnumerable&lt;AssetBundle&gt; of all currently loaded Asset Bundles.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.GetAllScenePaths\">\n      <summary>\n        <para>Return all the scene asset paths (paths to *.unity assets) in the AssetBundle.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadAllAssets(System.Type)\">\n      <summary>\n        <para>Loads all assets contained in the asset bundle that inherit from type.</para>\n      </summary>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadAllAssets\">\n      <summary>\n        <para>Loads all assets contained in the asset bundle.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadAllAssets\">\n      <summary>\n        <para>Loads all assets contained in the asset bundle that inherit from type T.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadAllAssetsAsync\">\n      <summary>\n        <para>Loads all assets contained in the asset bundle asynchronously.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadAllAssetsAsync\">\n      <summary>\n        <para>Loads all assets contained in the asset bundle that inherit from T asynchronously.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadAllAssetsAsync(System.Type)\">\n      <summary>\n        <para>Loads all assets contained in the asset bundle that inherit from type asynchronously.</para>\n      </summary>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadAsset(System.String)\">\n      <summary>\n        <para>Loads asset with name from the bundle.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadAsset(System.String,System.Type)\">\n      <summary>\n        <para>Loads asset with name of a given type from the bundle.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadAsset(System.String)\">\n      <summary>\n        <para>Loads asset with name of type T from the bundle.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadAssetAsync(System.String)\">\n      <summary>\n        <para>Asynchronously loads asset with name from the bundle.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadAssetAsync(System.String)\">\n      <summary>\n        <para>Asynchronously loads asset with name of a given T from the bundle.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadAssetAsync(System.String,System.Type)\">\n      <summary>\n        <para>Asynchronously loads asset with name of a given type from the bundle.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadAssetWithSubAssets(System.String)\">\n      <summary>\n        <para>Loads asset and sub assets with name from the bundle.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadAssetWithSubAssets(System.String,System.Type)\">\n      <summary>\n        <para>Loads asset and sub assets with name of a given type from the bundle.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadAssetWithSubAssets(System.String)\">\n      <summary>\n        <para>Loads asset and sub assets with name of type T from the bundle.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadAssetWithSubAssetsAsync(System.String)\">\n      <summary>\n        <para>Loads asset with sub assets with name from the bundle asynchronously.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadAssetWithSubAssetsAsync(System.String)\">\n      <summary>\n        <para>Loads asset with sub assets with name of type T from the bundle asynchronously.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadAssetWithSubAssetsAsync(System.String,System.Type)\">\n      <summary>\n        <para>Loads asset with sub assets with name of a given type from the bundle asynchronously.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadFromFile(System.String,System.UInt32,System.UInt64)\">\n      <summary>\n        <para>Synchronously loads an AssetBundle from a file on disk.</para>\n      </summary>\n      <param name=\"path\">Path of the file on disk.</param>\n      <param name=\"crc\">An optional CRC-32 checksum of the uncompressed content. If this is non-zero, then the content will be compared against the checksum before loading it, and give an error if it does not match.</param>\n      <param name=\"offset\">An optional byte offset. This value specifies where to start reading the AssetBundle from.</param>\n      <returns>\n        <para>Loaded AssetBundle object or null if failed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadFromFile\">\n      <summary>\n        <para>Synchronously loads an AssetBundle from a file on disk.</para>\n      </summary>\n      <param name=\"path\">Path of the file on disk.</param>\n      <param name=\"crc\">An optional CRC-32 checksum of the uncompressed content. If this is non-zero, then the content will be compared against the checksum before loading it, and give an error if it does not match.</param>\n      <param name=\"offset\">An optional byte offset. This value specifies where to start reading the AssetBundle from.</param>\n      <returns>\n        <para>Loaded AssetBundle object or null if failed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadFromFileAsync(System.String,System.UInt32,System.UInt64)\">\n      <summary>\n        <para>Asynchronously loads an AssetBundle from a file on disk.</para>\n      </summary>\n      <param name=\"path\">Path of the file on disk.</param>\n      <param name=\"crc\">An optional CRC-32 checksum of the uncompressed content. If this is non-zero, then the content will be compared against the checksum before loading it, and give an error if it does not match.</param>\n      <param name=\"offset\">An optional byte offset. This value specifies where to start reading the AssetBundle from.</param>\n      <returns>\n        <para>Asynchronous create request for an AssetBundle. Use AssetBundleCreateRequest.assetBundle property to get an AssetBundle once it is loaded.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadFromMemory(System.Byte[],System.UInt32)\">\n      <summary>\n        <para>Synchronously create an AssetBundle from a memory region.</para>\n      </summary>\n      <param name=\"binary\">Array of bytes with the AssetBundle data.</param>\n      <param name=\"crc\">An optional CRC-32 checksum of the uncompressed content. If this is non-zero, then the content will be compared against the checksum before loading it, and give an error if it does not match.</param>\n      <returns>\n        <para>Loaded AssetBundle object or null if failed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadFromMemoryAsync(System.Byte[],System.UInt32)\">\n      <summary>\n        <para>Asynchronously create an AssetBundle from a memory region.</para>\n      </summary>\n      <param name=\"binary\">Array of bytes with the AssetBundle data.</param>\n      <param name=\"crc\">An optional CRC-32 checksum of the uncompressed content. If this is non-zero, then the content will be compared against the checksum before loading it, and give an error if it does not match.</param>\n      <returns>\n        <para>Asynchronous create request for an AssetBundle. Use AssetBundleCreateRequest.assetBundle property to get an AssetBundle once it is loaded.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadFromStream(System.IO.Stream,System.UInt32,System.UInt32)\">\n      <summary>\n        <para>Synchronously loads an AssetBundle from a managed Stream.</para>\n      </summary>\n      <param name=\"stream\">The managed Stream object. Unity calls Read(), Seek() and the Length property on this object to load the AssetBundle data.</param>\n      <param name=\"crc\">An optional CRC-32 checksum of the uncompressed content.</param>\n      <param name=\"managedReadBufferSize\">An optional overide for the size of the read buffer size used whilst loading data. The default size is 32KB.</param>\n      <returns>\n        <para>The loaded AssetBundle object or null when the object fails to load.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.LoadFromStreamAsync(System.IO.Stream,System.UInt32,System.UInt32)\">\n      <summary>\n        <para>Asynchronously loads an AssetBundle from a managed Stream.</para>\n      </summary>\n      <param name=\"stream\">The managed Stream object. Unity calls Read(), Seek() and the Length property on this object to load the AssetBundle data.</param>\n      <param name=\"crc\">An optional CRC-32 checksum of the uncompressed content.</param>\n      <param name=\"managedReadBufferSize\">An optional overide for the size of the read buffer size used whilst loading data. The default size is 32KB.</param>\n      <returns>\n        <para>Asynchronous create request for an AssetBundle. Use AssetBundleCreateRequest.assetBundle property to get an AssetBundle once it is loaded.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.Unload(System.Boolean)\">\n      <summary>\n        <para>Unloads all assets in the bundle.</para>\n      </summary>\n      <param name=\"unloadAllLoadedObjects\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundle.UnloadAllAssetBundles(System.Boolean)\">\n      <summary>\n        <para>Unloads all currently loaded Asset Bundles.</para>\n      </summary>\n      <param name=\"unloadAllObjects\">Determines whether the current instances of objects loaded from Asset Bundles will also be unloaded.</param>\n    </member>\n    <member name=\"T:UnityEngine.AssetBundleCreateRequest\">\n      <summary>\n        <para>Asynchronous create request for an AssetBundle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AssetBundleCreateRequest.assetBundle\">\n      <summary>\n        <para>Asset object being loaded (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AssetBundleManifest\">\n      <summary>\n        <para>Manifest for all the AssetBundles in the build.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundleManifest.GetAllAssetBundles\">\n      <summary>\n        <para>Get all the AssetBundles in the manifest.</para>\n      </summary>\n      <returns>\n        <para>An array of asset bundle names.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundleManifest.GetAllAssetBundlesWithVariant\">\n      <summary>\n        <para>Get all the AssetBundles with variant in the manifest.</para>\n      </summary>\n      <returns>\n        <para>An array of asset bundle names.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundleManifest.GetAllDependencies(System.String)\">\n      <summary>\n        <para>Get all the dependent AssetBundles for the given AssetBundle.</para>\n      </summary>\n      <param name=\"assetBundleName\">Name of the asset bundle.</param>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundleManifest.GetAssetBundleHash(System.String)\">\n      <summary>\n        <para>Get the hash for the given AssetBundle.</para>\n      </summary>\n      <param name=\"assetBundleName\">Name of the asset bundle.</param>\n      <returns>\n        <para>The 128-bit hash for the asset bundle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AssetBundleManifest.GetDirectDependencies(System.String)\">\n      <summary>\n        <para>Get the direct dependent AssetBundles for the given AssetBundle.</para>\n      </summary>\n      <param name=\"assetBundleName\">Name of the asset bundle.</param>\n      <returns>\n        <para>Array of asset bundle names this asset bundle depends on.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.AssetBundleRequest\">\n      <summary>\n        <para>Asynchronous load request from an AssetBundle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AssetBundleRequest.allAssets\">\n      <summary>\n        <para>Asset objects with sub assets being loaded. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AssetBundleRequest.asset\">\n      <summary>\n        <para>Asset object being loaded (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AsyncOperation\">\n      <summary>\n        <para>Asynchronous operation coroutine.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AsyncOperation.allowSceneActivation\">\n      <summary>\n        <para>Allow scenes to be activated as soon as it is ready.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.AsyncOperation.completed(System.Action`1&lt;UnityEngine.AsyncOperation&gt;)\">\n      <summary>\n        <para>Event that is invoked upon operation completion.  An event handler that is registered in the same frame as the call that creates it will be invoked next frame, even if the operation is able to complete synchronously.  If a handler is registered after the operation has completed and has already invoked the complete event, the handler will be called synchronously.</para>\n      </summary>\n      <param name=\"value\">Action&lt;AsyncOperation&gt; handler - function signature for completion event handler.</param>\n    </member>\n    <member name=\"P:UnityEngine.AsyncOperation.isDone\">\n      <summary>\n        <para>Has the operation finished? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AsyncOperation.priority\">\n      <summary>\n        <para>Priority lets you tweak in which order async operation calls will be performed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AsyncOperation.progress\">\n      <summary>\n        <para>What's the operation's progress. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Audio.AudioClipPlayable\">\n      <summary>\n        <para>An implementation of IPlayable that controls an AudioClip.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Audio.AudioClipPlayable.Create(UnityEngine.Playables.PlayableGraph,UnityEngine.AudioClip,System.Boolean)\">\n      <summary>\n        <para>Creates an AudioClipPlayable in the PlayableGraph.</para>\n      </summary>\n      <param name=\"graph\">The PlayableGraph that will contain the new AnimationLayerMixerPlayable.</param>\n      <param name=\"clip\">The AudioClip that will be added in the PlayableGraph.</param>\n      <param name=\"looping\">True if the clip should loop, false otherwise.</param>\n      <returns>\n        <para>A AudioClipPlayable linked to the PlayableGraph.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Audio.AudioMixer\">\n      <summary>\n        <para>AudioMixer asset.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Audio.AudioMixer.outputAudioMixerGroup\">\n      <summary>\n        <para>Routing target.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Audio.AudioMixer.updateMode\">\n      <summary>\n        <para>How time should progress for this AudioMixer. Used during Snapshot transitions.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Audio.AudioMixer.ClearFloat(System.String)\">\n      <summary>\n        <para>Resets an exposed parameter to its initial value.</para>\n      </summary>\n      <param name=\"name\">Exposed parameter.</param>\n      <returns>\n        <para>Returns false if the parameter was not found or could not be set.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Audio.AudioMixer.FindMatchingGroups(System.String)\">\n      <summary>\n        <para>Connected groups in the mixer form a path from the mixer's master group to the leaves. This path has the format \"Master GroupChild of Master GroupGrandchild of Master Group\", so to find the grandchild group in this example, a valid search string would be for instance \"randchi\" which would return exactly one group while \"hild\" or \"oup/\" would return 2 different groups.</para>\n      </summary>\n      <param name=\"subPath\">Sub-string of the paths to be matched.</param>\n      <returns>\n        <para>Groups in the mixer whose paths match the specified search path.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Audio.AudioMixer.FindSnapshot(System.String)\">\n      <summary>\n        <para>The name must be an exact match.</para>\n      </summary>\n      <param name=\"name\">Name of snapshot object to be returned.</param>\n      <returns>\n        <para>The snapshot identified by the name.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Audio.AudioMixer.GetFloat(System.String,System.Single&amp;)\">\n      <summary>\n        <para>Returns the value of the exposed parameter specified. If the parameter doesn't exist the function returns false. Prior to calling SetFloat and after ClearFloat has been called on this parameter the value returned will be that of the current snapshot or snapshot transition.</para>\n      </summary>\n      <param name=\"name\">Name of exposed parameter.</param>\n      <param name=\"value\">Return value of exposed parameter.</param>\n      <returns>\n        <para>Returns false if the exposed parameter specified doesn't exist.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Audio.AudioMixer.SetFloat(System.String,System.Single)\">\n      <summary>\n        <para>Sets the value of the exposed parameter specified. When a parameter is exposed, it is not controlled by mixer snapshots and can therefore only be changed via this function.</para>\n      </summary>\n      <param name=\"name\">Name of exposed parameter.</param>\n      <param name=\"value\">New value of exposed parameter.</param>\n      <returns>\n        <para>Returns false if the exposed parameter was not found or snapshots are currently being edited.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Audio.AudioMixer.TransitionToSnapshots(UnityEngine.Audio.AudioMixerSnapshot[],System.Single[],System.Single)\">\n      <summary>\n        <para>Transitions to a weighted mixture of the snapshots specified. This can be used for games that specify the game state as a continuum between states or for interpolating snapshots from a triangulated map location.</para>\n      </summary>\n      <param name=\"snapshots\">The set of snapshots to be mixed.</param>\n      <param name=\"weights\">The mix weights for the snapshots specified.</param>\n      <param name=\"timeToReach\">Relative time after which the mixture should be reached from any current state.</param>\n    </member>\n    <member name=\"T:UnityEngine.Audio.AudioMixerGroup\">\n      <summary>\n        <para>Object representing a group in the mixer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Audio.AudioMixerPlayable\">\n      <summary>\n        <para>An implementation of IPlayable that controls an audio mixer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Audio.AudioMixerSnapshot\">\n      <summary>\n        <para>Object representing a snapshot in the mixer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Audio.AudioMixerSnapshot.TransitionTo(System.Single)\">\n      <summary>\n        <para>Performs an interpolated transition towards this snapshot over the time interval specified.</para>\n      </summary>\n      <param name=\"timeToReach\">Relative time after which this snapshot should be reached from any current state.</param>\n    </member>\n    <member name=\"T:UnityEngine.Audio.AudioMixerUpdateMode\">\n      <summary>\n        <para>The mode in which an AudioMixer should update its time.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Audio.AudioMixerUpdateMode.Normal\">\n      <summary>\n        <para>Update the AudioMixer with scaled game time.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Audio.AudioMixerUpdateMode.UnscaledTime\">\n      <summary>\n        <para>Update the AudioMixer with unscaled realtime.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Audio.AudioPlayableBinding\">\n      <summary>\n        <para>A PlayableBinding that contains information representing an AudioPlayableOutput.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Audio.AudioPlayableBinding.Create(System.String,UnityEngine.Object)\">\n      <summary>\n        <para>Creates a PlayableBinding that contains information representing an AudioPlayableOutput.</para>\n      </summary>\n      <param name=\"key\">A reference to a UnityEngine.Object that acts as a key for this binding.</param>\n      <param name=\"name\">The name of the AudioPlayableOutput.</param>\n      <returns>\n        <para>Returns a PlayableBinding that contains information that is used to create an AudioPlayableOutput.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Audio.AudioPlayableOutput\">\n      <summary>\n        <para>A IPlayableOutput implementation that will be used to play audio.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Audio.AudioPlayableOutput.Create(UnityEngine.Playables.PlayableGraph,System.String,UnityEngine.AudioSource)\">\n      <summary>\n        <para>Creates an AudioPlayableOutput in the PlayableGraph.</para>\n      </summary>\n      <param name=\"graph\">The PlayableGraph that will contain the AnimationPlayableOutput.</param>\n      <param name=\"name\">The name of the output.</param>\n      <param name=\"target\">The AudioSource that will play the AudioPlayableOutput source Playable.</param>\n      <returns>\n        <para>A new AudioPlayableOutput attached to the PlayableGraph.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Audio.AudioPlayableOutput.GetEvaluateOnSeek\">\n      <summary>\n        <para>Gets the state of output playback when seeking.</para>\n      </summary>\n      <returns>\n        <para>Returns true if the output plays when seeking. Returns false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Audio.AudioPlayableOutput.Null\">\n      <summary>\n        <para>Returns an invalid AudioPlayableOutput.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Audio.AudioPlayableOutput.SetEvaluateOnSeek(System.Boolean)\">\n      <summary>\n        <para>Controls whether the output should play when seeking.</para>\n      </summary>\n      <param name=\"value\">Set to true to play the output when seeking. Set to false to disable audio scrubbing on this output. Default is true.</param>\n    </member>\n    <member name=\"T:UnityEngine.AudioChorusFilter\">\n      <summary>\n        <para>The Audio Chorus Filter takes an Audio Clip and processes it creating a chorus effect.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioChorusFilter.delay\">\n      <summary>\n        <para>Chorus delay in ms. 0.1 to 100.0. Default = 40.0 ms.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioChorusFilter.depth\">\n      <summary>\n        <para>Chorus modulation depth. 0.0 to 1.0. Default = 0.03.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioChorusFilter.dryMix\">\n      <summary>\n        <para>Volume of original signal to pass to output. 0.0 to 1.0. Default = 0.5.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioChorusFilter.feedback\">\n      <summary>\n        <para>Chorus feedback. Controls how much of the wet signal gets fed back into the chorus buffer. 0.0 to 1.0. Default = 0.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioChorusFilter.rate\">\n      <summary>\n        <para>Chorus modulation rate in hz. 0.0 to 20.0. Default = 0.8 hz.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioChorusFilter.wetMix1\">\n      <summary>\n        <para>Volume of 1st chorus tap. 0.0 to 1.0. Default = 0.5.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioChorusFilter.wetMix2\">\n      <summary>\n        <para>Volume of 2nd chorus tap. This tap is 90 degrees out of phase of the first tap. 0.0 to 1.0. Default = 0.5.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioChorusFilter.wetMix3\">\n      <summary>\n        <para>Volume of 3rd chorus tap. This tap is 90 degrees out of phase of the second tap. 0.0 to 1.0. Default = 0.5.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AudioClip\">\n      <summary>\n        <para>A container for audio data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioClip.ambisonic\">\n      <summary>\n        <para>Returns true if this audio clip is ambisonic (read-only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioClip.channels\">\n      <summary>\n        <para>The number of channels in the audio clip. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioClip.frequency\">\n      <summary>\n        <para>The sample frequency of the clip in Hertz. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioClip.isReadyToPlay\">\n      <summary>\n        <para>Returns true if the AudioClip is ready to play (read-only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioClip.length\">\n      <summary>\n        <para>The length of the audio clip in seconds. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioClip.loadInBackground\">\n      <summary>\n        <para>Corresponding to the \"Load In Background\" flag in the inspector, when this flag is set, the loading will happen delayed without blocking the main thread.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioClip.loadState\">\n      <summary>\n        <para>Returns the current load state of the audio data associated with an AudioClip.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioClip.loadType\">\n      <summary>\n        <para>The load type of the clip (read-only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioClip.preloadAudioData\">\n      <summary>\n        <para>Preloads audio data of the clip when the clip asset is loaded. When this flag is off, scripts have to call AudioClip.LoadAudioData() to load the data before the clip can be played. Properties like length, channels and format are available before the audio data has been loaded.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioClip.samples\">\n      <summary>\n        <para>The length of the audio clip in samples. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AudioClip.Create(System.String,System.Int32,System.Int32,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Creates a user AudioClip with a name and with the given length in samples, channels and frequency.</para>\n      </summary>\n      <param name=\"name\">Name of clip.</param>\n      <param name=\"lengthSamples\">Number of sample frames.</param>\n      <param name=\"channels\">Number of channels per frame.</param>\n      <param name=\"frequency\">Sample frequency of clip.</param>\n      <param name=\"_3D\">Audio clip is played back in 3D.</param>\n      <param name=\"stream\">True if clip is streamed, that is if the pcmreadercallback generates data on the fly.</param>\n      <param name=\"pcmreadercallback\">This callback is invoked to generate a block of sample data. Non-streamed clips call this only once at creation time while streamed clips call this continuously.</param>\n      <param name=\"pcmsetpositioncallback\">This callback is invoked whenever the clip loops or changes playback position.</param>\n      <returns>\n        <para>A reference to the created AudioClip.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AudioClip.Create(System.String,System.Int32,System.Int32,System.Int32,System.Boolean,UnityEngine.AudioClip/PCMReaderCallback)\">\n      <summary>\n        <para>Creates a user AudioClip with a name and with the given length in samples, channels and frequency.</para>\n      </summary>\n      <param name=\"name\">Name of clip.</param>\n      <param name=\"lengthSamples\">Number of sample frames.</param>\n      <param name=\"channels\">Number of channels per frame.</param>\n      <param name=\"frequency\">Sample frequency of clip.</param>\n      <param name=\"_3D\">Audio clip is played back in 3D.</param>\n      <param name=\"stream\">True if clip is streamed, that is if the pcmreadercallback generates data on the fly.</param>\n      <param name=\"pcmreadercallback\">This callback is invoked to generate a block of sample data. Non-streamed clips call this only once at creation time while streamed clips call this continuously.</param>\n      <param name=\"pcmsetpositioncallback\">This callback is invoked whenever the clip loops or changes playback position.</param>\n      <returns>\n        <para>A reference to the created AudioClip.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AudioClip.Create(System.String,System.Int32,System.Int32,System.Int32,System.Boolean,UnityEngine.AudioClip/PCMReaderCallback,UnityEngine.AudioClip/PCMSetPositionCallback)\">\n      <summary>\n        <para>Creates a user AudioClip with a name and with the given length in samples, channels and frequency.</para>\n      </summary>\n      <param name=\"name\">Name of clip.</param>\n      <param name=\"lengthSamples\">Number of sample frames.</param>\n      <param name=\"channels\">Number of channels per frame.</param>\n      <param name=\"frequency\">Sample frequency of clip.</param>\n      <param name=\"_3D\">Audio clip is played back in 3D.</param>\n      <param name=\"stream\">True if clip is streamed, that is if the pcmreadercallback generates data on the fly.</param>\n      <param name=\"pcmreadercallback\">This callback is invoked to generate a block of sample data. Non-streamed clips call this only once at creation time while streamed clips call this continuously.</param>\n      <param name=\"pcmsetpositioncallback\">This callback is invoked whenever the clip loops or changes playback position.</param>\n      <returns>\n        <para>A reference to the created AudioClip.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AudioClip.Create(System.String,System.Int32,System.Int32,System.Int32,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Creates a user AudioClip with a name and with the given length in samples, channels and frequency.</para>\n      </summary>\n      <param name=\"name\">Name of clip.</param>\n      <param name=\"lengthSamples\">Number of sample frames.</param>\n      <param name=\"channels\">Number of channels per frame.</param>\n      <param name=\"frequency\">Sample frequency of clip.</param>\n      <param name=\"_3D\">Audio clip is played back in 3D.</param>\n      <param name=\"stream\">True if clip is streamed, that is if the pcmreadercallback generates data on the fly.</param>\n      <param name=\"pcmreadercallback\">This callback is invoked to generate a block of sample data. Non-streamed clips call this only once at creation time while streamed clips call this continuously.</param>\n      <param name=\"pcmsetpositioncallback\">This callback is invoked whenever the clip loops or changes playback position.</param>\n      <returns>\n        <para>A reference to the created AudioClip.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AudioClip.Create(System.String,System.Int32,System.Int32,System.Int32,System.Boolean,System.Boolean,UnityEngine.AudioClip/PCMReaderCallback)\">\n      <summary>\n        <para>Creates a user AudioClip with a name and with the given length in samples, channels and frequency.</para>\n      </summary>\n      <param name=\"name\">Name of clip.</param>\n      <param name=\"lengthSamples\">Number of sample frames.</param>\n      <param name=\"channels\">Number of channels per frame.</param>\n      <param name=\"frequency\">Sample frequency of clip.</param>\n      <param name=\"_3D\">Audio clip is played back in 3D.</param>\n      <param name=\"stream\">True if clip is streamed, that is if the pcmreadercallback generates data on the fly.</param>\n      <param name=\"pcmreadercallback\">This callback is invoked to generate a block of sample data. Non-streamed clips call this only once at creation time while streamed clips call this continuously.</param>\n      <param name=\"pcmsetpositioncallback\">This callback is invoked whenever the clip loops or changes playback position.</param>\n      <returns>\n        <para>A reference to the created AudioClip.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AudioClip.Create(System.String,System.Int32,System.Int32,System.Int32,System.Boolean,System.Boolean,UnityEngine.AudioClip/PCMReaderCallback,UnityEngine.AudioClip/PCMSetPositionCallback)\">\n      <summary>\n        <para>Creates a user AudioClip with a name and with the given length in samples, channels and frequency.</para>\n      </summary>\n      <param name=\"name\">Name of clip.</param>\n      <param name=\"lengthSamples\">Number of sample frames.</param>\n      <param name=\"channels\">Number of channels per frame.</param>\n      <param name=\"frequency\">Sample frequency of clip.</param>\n      <param name=\"_3D\">Audio clip is played back in 3D.</param>\n      <param name=\"stream\">True if clip is streamed, that is if the pcmreadercallback generates data on the fly.</param>\n      <param name=\"pcmreadercallback\">This callback is invoked to generate a block of sample data. Non-streamed clips call this only once at creation time while streamed clips call this continuously.</param>\n      <param name=\"pcmsetpositioncallback\">This callback is invoked whenever the clip loops or changes playback position.</param>\n      <returns>\n        <para>A reference to the created AudioClip.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AudioClip.GetData(System.Single[],System.Int32)\">\n      <summary>\n        <para>Fills an array with sample data from the clip.</para>\n      </summary>\n      <param name=\"data\"></param>\n      <param name=\"offsetSamples\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AudioClip.LoadAudioData\">\n      <summary>\n        <para>Loads the audio data of a clip. Clips that have \"Preload Audio Data\" set will load the audio data automatically.</para>\n      </summary>\n      <returns>\n        <para>Returns true if loading succeeded.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.AudioClip.PCMReaderCallback\">\n      <summary>\n        <para>Delegate called each time AudioClip reads data.</para>\n      </summary>\n      <param name=\"data\">Array of floats containing data read from the clip.</param>\n    </member>\n    <member name=\"T:UnityEngine.AudioClip.PCMSetPositionCallback\">\n      <summary>\n        <para>Delegate called each time AudioClip changes read position.</para>\n      </summary>\n      <param name=\"position\">New position in the audio clip.</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioClip.SetData(System.Single[],System.Int32)\">\n      <summary>\n        <para>Set sample data in a clip.</para>\n      </summary>\n      <param name=\"data\"></param>\n      <param name=\"offsetSamples\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AudioClip.UnloadAudioData\">\n      <summary>\n        <para>Unloads the audio data associated with the clip. This works only for AudioClips that are based on actual sound file assets.</para>\n      </summary>\n      <returns>\n        <para>Returns false if unloading failed.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.AudioClipLoadType\">\n      <summary>\n        <para>Determines how the audio clip is loaded in.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioClipLoadType.CompressedInMemory\">\n      <summary>\n        <para>The audio data of the clip will be kept in memory in compressed form.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioClipLoadType.DecompressOnLoad\">\n      <summary>\n        <para>The audio data is decompressed when the audio clip is loaded.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioClipLoadType.Streaming\">\n      <summary>\n        <para>Streams audio data from disk.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AudioCompressionFormat\">\n      <summary>\n        <para>An enum containing different compression types.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioCompressionFormat.AAC\">\n      <summary>\n        <para>AAC Audio Compression.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioCompressionFormat.ADPCM\">\n      <summary>\n        <para>Adaptive differential pulse-code modulation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioCompressionFormat.ATRAC9\">\n      <summary>\n        <para>Sony proprietary hardware format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioCompressionFormat.GCADPCM\">\n      <summary>\n        <para>Nintendo ADPCM audio compression format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioCompressionFormat.HEVAG\">\n      <summary>\n        <para>Sony proprietory hardware codec.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioCompressionFormat.MP3\">\n      <summary>\n        <para>MPEG Audio Layer III.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioCompressionFormat.PCM\">\n      <summary>\n        <para>Uncompressed pulse-code modulation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioCompressionFormat.VAG\">\n      <summary>\n        <para>Sony proprietary hardware format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioCompressionFormat.Vorbis\">\n      <summary>\n        <para>Vorbis compression format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioCompressionFormat.XMA\">\n      <summary>\n        <para>Xbox One proprietary hardware format.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AudioConfiguration\">\n      <summary>\n        <para>Specifies the current properties or desired properties to be set for the audio system.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioConfiguration.dspBufferSize\">\n      <summary>\n        <para>The length of the DSP buffer in samples determining the latency of sounds by the audio output device.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioConfiguration.numRealVoices\">\n      <summary>\n        <para>The current maximum number of simultaneously audible sounds in the game.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioConfiguration.numVirtualVoices\">\n      <summary>\n        <para>The  maximum number of managed sounds in the game. Beyond this limit sounds will simply stop playing.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioConfiguration.sampleRate\">\n      <summary>\n        <para>The current sample rate of the audio output device used.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioConfiguration.speakerMode\">\n      <summary>\n        <para>The current speaker mode used by the audio output device.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AudioDataLoadState\">\n      <summary>\n        <para>Value describing the current load state of the audio data associated with an AudioClip.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioDataLoadState.Failed\">\n      <summary>\n        <para>Value returned by AudioClip.loadState for an AudioClip that has failed loading its audio data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioDataLoadState.Loaded\">\n      <summary>\n        <para>Value returned by AudioClip.loadState for an AudioClip that has succeeded loading its audio data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioDataLoadState.Loading\">\n      <summary>\n        <para>Value returned by AudioClip.loadState for an AudioClip that is currently loading audio data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioDataLoadState.Unloaded\">\n      <summary>\n        <para>Value returned by AudioClip.loadState for an AudioClip that has no audio data loaded and where loading has not been initiated yet.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AudioDistortionFilter\">\n      <summary>\n        <para>The Audio Distortion Filter distorts the sound from an AudioSource or sounds reaching the AudioListener.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioDistortionFilter.distortionLevel\">\n      <summary>\n        <para>Distortion value. 0.0 to 1.0. Default = 0.5.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AudioEchoFilter\">\n      <summary>\n        <para>The Audio Echo Filter repeats a sound after a given Delay, attenuating the repetitions based on the Decay Ratio.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioEchoFilter.decayRatio\">\n      <summary>\n        <para>Echo decay per delay. 0 to 1. 1.0 = No decay, 0.0 = total decay (i.e. simple 1 line delay). Default = 0.5.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioEchoFilter.delay\">\n      <summary>\n        <para>Echo delay in ms. 10 to 5000. Default = 500.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioEchoFilter.dryMix\">\n      <summary>\n        <para>Volume of original signal to pass to output. 0.0 to 1.0. Default = 1.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioEchoFilter.wetMix\">\n      <summary>\n        <para>Volume of echo signal to pass to output. 0.0 to 1.0. Default = 1.0.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AudioHighPassFilter\">\n      <summary>\n        <para>The Audio High Pass Filter passes high frequencies of an AudioSource, and cuts off signals with frequencies lower than the Cutoff Frequency.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioHighPassFilter.cutoffFrequency\">\n      <summary>\n        <para>Highpass cutoff frequency in hz. 10.0 to 22000.0. Default = 5000.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioHighPassFilter.highpassResonanceQ\">\n      <summary>\n        <para>Determines how much the filter's self-resonance isdampened.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AudioListener\">\n      <summary>\n        <para>Representation of a listener in 3D space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioListener.pause\">\n      <summary>\n        <para>The paused state of the audio system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioListener.velocityUpdateMode\">\n      <summary>\n        <para>This lets you set whether the Audio Listener should be updated in the fixed or dynamic update.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioListener.volume\">\n      <summary>\n        <para>Controls the game sound volume (0.0 to 1.0).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AudioListener.GetOutputData(System.Single[],System.Int32)\">\n      <summary>\n        <para>Provides a block of the listener (master)'s output data.</para>\n      </summary>\n      <param name=\"samples\">The array to populate with audio samples. Its length must be a power of 2.</param>\n      <param name=\"channel\">The channel to sample from.</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioListener.GetOutputData(System.Int32,System.Int32)\">\n      <summary>\n        <para>Deprecated Version. Returns a block of the listener (master)'s output data.</para>\n      </summary>\n      <param name=\"numSamples\"></param>\n      <param name=\"channel\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AudioListener.GetSpectrumData(System.Single[],System.Int32,UnityEngine.FFTWindow)\">\n      <summary>\n        <para>Provides a block of the listener (master)'s spectrum data.</para>\n      </summary>\n      <param name=\"samples\">The array to populate with audio samples. Its length must be a power of 2.</param>\n      <param name=\"channel\">The channel to sample from.</param>\n      <param name=\"window\">The FFTWindow type to use when sampling.</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioListener.GetSpectrumData(System.Int32,System.Int32,UnityEngine.FFTWindow)\">\n      <summary>\n        <para>Deprecated Version. Returns a block of the listener (master)'s spectrum data.</para>\n      </summary>\n      <param name=\"numSamples\">Number of values (the length of the samples array). Must be a power of 2. Min = 64. Max = 8192.</param>\n      <param name=\"channel\">The channel to sample from.</param>\n      <param name=\"window\">The FFTWindow type to use when sampling.</param>\n    </member>\n    <member name=\"T:UnityEngine.AudioLowPassFilter\">\n      <summary>\n        <para>The Audio Low Pass Filter passes low frequencies of an AudioSource or all sounds reaching an AudioListener, while removing frequencies higher than the Cutoff Frequency.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioLowPassFilter.customCutoffCurve\">\n      <summary>\n        <para>Returns or sets the current custom frequency cutoff curve.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioLowPassFilter.cutoffFrequency\">\n      <summary>\n        <para>Lowpass cutoff frequency in hz. 10.0 to 22000.0. Default = 5000.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioLowPassFilter.lowpassResonanceQ\">\n      <summary>\n        <para>Determines how much the filter's self-resonance is dampened.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AudioRenderer\">\n      <summary>\n        <para>Allow recording the main output of the game or specific groups in the AudioMixer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AudioRenderer.GetSampleCountForCaptureFrame\">\n      <summary>\n        <para>Returns the number of samples available since the last time AudioRenderer.Render was called. This is dependent on the frame capture rate.</para>\n      </summary>\n      <returns>\n        <para>Number of samples available since last recorded frame.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AudioRenderer.Render(Unity.Collections.NativeArray`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Performs the recording of the main output as well as any optional mixer groups that have been registered via AudioRenderer.AddMixerGroupSink.</para>\n      </summary>\n      <param name=\"buffer\">The buffer to write the sample data to.</param>\n      <returns>\n        <para>True if the recording succeeded.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AudioRenderer.Start\">\n      <summary>\n        <para>Enters audio recording mode. After this Unity will output silence until AudioRenderer.Stop is called.</para>\n      </summary>\n      <returns>\n        <para>True if the engine was switched into output recording mode. False if it is already recording.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AudioRenderer.Stop\">\n      <summary>\n        <para>Exits audio recording mode. After this audio output will be audible again.</para>\n      </summary>\n      <returns>\n        <para>True if the engine was recording when this function was called.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.AudioReverbFilter\">\n      <summary>\n        <para>The Audio Reverb Filter takes an Audio Clip and distorts it to create a custom reverb effect.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbFilter.decayHFRatio\">\n      <summary>\n        <para>Decay HF Ratio : High-frequency to low-frequency decay time ratio. Ranges from 0.1 to 2.0. Default is 0.5.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbFilter.decayTime\">\n      <summary>\n        <para>Reverberation decay time at low-frequencies in seconds. Ranges from 0.1 to 20.0. Default is 1.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbFilter.density\">\n      <summary>\n        <para>Reverberation density (modal density) in percent. Ranges from 0.0 to 100.0. Default is 100.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbFilter.diffusion\">\n      <summary>\n        <para>Reverberation diffusion (echo density) in percent. Ranges from 0.0 to 100.0. Default is 100.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbFilter.dryLevel\">\n      <summary>\n        <para>Mix level of dry signal in output in mB. Ranges from -10000.0 to 0.0. Default is 0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbFilter.hfReference\">\n      <summary>\n        <para>Reference high frequency in Hz. Ranges from 20.0 to 20000.0. Default is 5000.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbFilter.lfReference\">\n      <summary>\n        <para>Reference low-frequency in Hz. Ranges from 20.0 to 1000.0. Default is 250.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbFilter.reflectionsDelay\">\n      <summary>\n        <para>Late reverberation level relative to room effect in mB. Ranges from -10000.0 to 2000.0. Default is 0.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbFilter.reflectionsLevel\">\n      <summary>\n        <para>Early reflections level relative to room effect in mB. Ranges from -10000.0 to 1000.0. Default is -10000.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbFilter.reverbDelay\">\n      <summary>\n        <para>Late reverberation delay time relative to first reflection in seconds. Ranges from 0.0 to 0.1. Default is 0.04.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbFilter.reverbLevel\">\n      <summary>\n        <para>Late reverberation level relative to room effect in mB. Ranges from -10000.0 to 2000.0. Default is 0.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbFilter.reverbPreset\">\n      <summary>\n        <para>Set/Get reverb preset properties.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbFilter.room\">\n      <summary>\n        <para>Room effect level at low frequencies in mB. Ranges from -10000.0 to 0.0. Default is 0.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbFilter.roomHF\">\n      <summary>\n        <para>Room effect high-frequency level re. low frequency level in mB. Ranges from -10000.0 to 0.0. Default is 0.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbFilter.roomLF\">\n      <summary>\n        <para>Room effect low-frequency level in mB. Ranges from -10000.0 to 0.0. Default is 0.0.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AudioReverbPreset\">\n      <summary>\n        <para>Reverb presets used by the Reverb Zone class and the audio reverb filter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Alley\">\n      <summary>\n        <para>Alley preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Arena\">\n      <summary>\n        <para>Arena preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Auditorium\">\n      <summary>\n        <para>Auditorium preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Bathroom\">\n      <summary>\n        <para>Bathroom preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.CarpetedHallway\">\n      <summary>\n        <para>Carpeted hallway preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Cave\">\n      <summary>\n        <para>Cave preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.City\">\n      <summary>\n        <para>City preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Concerthall\">\n      <summary>\n        <para>Concert hall preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Dizzy\">\n      <summary>\n        <para>Dizzy preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Drugged\">\n      <summary>\n        <para>Drugged preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Forest\">\n      <summary>\n        <para>Forest preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Generic\">\n      <summary>\n        <para>Generic preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Hallway\">\n      <summary>\n        <para>Hallway preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Hangar\">\n      <summary>\n        <para>Hangar preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Livingroom\">\n      <summary>\n        <para>Livingroom preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Mountains\">\n      <summary>\n        <para>Mountains preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Off\">\n      <summary>\n        <para>No reverb preset selected.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.PaddedCell\">\n      <summary>\n        <para>Padded cell preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.ParkingLot\">\n      <summary>\n        <para>Parking Lot preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Plain\">\n      <summary>\n        <para>Plain preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Psychotic\">\n      <summary>\n        <para>Psychotic preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Quarry\">\n      <summary>\n        <para>Quarry preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Room\">\n      <summary>\n        <para>Room preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.SewerPipe\">\n      <summary>\n        <para>Sewer pipe preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.StoneCorridor\">\n      <summary>\n        <para>Stone corridor preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Stoneroom\">\n      <summary>\n        <para>Stoneroom preset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.Underwater\">\n      <summary>\n        <para>Underwater presset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioReverbPreset.User\">\n      <summary>\n        <para>User defined preset.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AudioReverbZone\">\n      <summary>\n        <para>Reverb Zones are used when you want to create location based ambient effects in the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbZone.decayHFRatio\">\n      <summary>\n        <para>High-frequency to mid-frequency decay time ratio.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbZone.decayTime\">\n      <summary>\n        <para>Reverberation decay time at mid frequencies.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbZone.density\">\n      <summary>\n        <para>Value that controls the modal density in the late reverberation decay.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbZone.diffusion\">\n      <summary>\n        <para>Value that controls the echo density in the late reverberation decay.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbZone.maxDistance\">\n      <summary>\n        <para>The distance from the centerpoint that the reverb will not have any effect. Default = 15.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbZone.minDistance\">\n      <summary>\n        <para>The distance from the centerpoint that the reverb will have full effect at. Default = 10.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbZone.reflections\">\n      <summary>\n        <para>Early reflections level relative to room effect.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbZone.reflectionsDelay\">\n      <summary>\n        <para>Initial reflection delay time.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbZone.reverb\">\n      <summary>\n        <para>Late reverberation level relative to room effect.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbZone.reverbDelay\">\n      <summary>\n        <para>Late reverberation delay time relative to initial reflection.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbZone.reverbPreset\">\n      <summary>\n        <para>Set/Get reverb preset properties.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbZone.room\">\n      <summary>\n        <para>Room effect level (at mid frequencies).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbZone.roomHF\">\n      <summary>\n        <para>Relative room effect level at high frequencies.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbZone.roomLF\">\n      <summary>\n        <para>Relative room effect level at low frequencies.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbZone.roomRolloffFactor\">\n      <summary>\n        <para>Like rolloffscale in global settings, but for reverb room size effect.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbZone.HFReference\">\n      <summary>\n        <para>Reference high frequency (hz).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioReverbZone.LFReference\">\n      <summary>\n        <para>Reference low frequency (hz).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AudioRolloffMode\">\n      <summary>\n        <para>Rolloff modes that a 3D sound can have in an audio source.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioRolloffMode.Custom\">\n      <summary>\n        <para>Use this when you want to use a custom rolloff.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioRolloffMode.Linear\">\n      <summary>\n        <para>Use this mode when you want to lower the volume of your sound over the distance.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioRolloffMode.Logarithmic\">\n      <summary>\n        <para>Use this mode when you want a real-world rolloff.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AudioSettings\">\n      <summary>\n        <para>Controls the global audio settings from script.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSettings.driverCapabilities\">\n      <summary>\n        <para>Returns the speaker mode capability of the current audio driver. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSettings.dspTime\">\n      <summary>\n        <para>Returns the current time of the audio system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSettings.outputSampleRate\">\n      <summary>\n        <para>Get the mixer's current output rate.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSettings.speakerMode\">\n      <summary>\n        <para>Gets the current speaker mode. Default is 2 channel stereo.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AudioSettings.AudioConfigurationChangeHandler\">\n      <summary>\n        <para>A delegate called whenever the global audio settings are changed, either by AudioSettings.Reset or by an external device change such as the OS control panel changing the sample rate or because the default output device was changed, for example when plugging in an HDMI monitor or a USB headset.</para>\n      </summary>\n      <param name=\"deviceWasChanged\">True if the change was caused by an device change.</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioSettings.GetConfiguration\">\n      <summary>\n        <para>Returns the current configuration of the audio device and system. The values in the struct may then be modified and reapplied via AudioSettings.Reset.</para>\n      </summary>\n      <returns>\n        <para>The new configuration to be applied.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AudioSettings.GetDSPBufferSize(System.Int32&amp;,System.Int32&amp;)\">\n      <summary>\n        <para>Get the mixer's buffer size in samples.</para>\n      </summary>\n      <param name=\"bufferLength\">Is the length of each buffer in the ringbuffer.</param>\n      <param name=\"numBuffers\">Is number of buffers.</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioSettings.GetSpatializerPluginName\">\n      <summary>\n        <para>Returns the name of the spatializer selected on the currently-running platform.</para>\n      </summary>\n      <returns>\n        <para>The spatializer plugin name.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AudioSettings.GetSpatializerPluginNames\">\n      <summary>\n        <para>Returns an array with the names of all the available spatializer plugins.</para>\n      </summary>\n      <returns>\n        <para>An array of spatializer names.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.AudioSettings.OnAudioConfigurationChanged(UnityEngine.AudioSettings/AudioConfigurationChangeHandler)\">\n      <summary>\n        <para>A delegate called whenever the global audio settings are changed, either by AudioSettings.Reset or by an external factor such as the OS control panel changing the sample rate or because the default output device was changed, for example when plugging in an HDMI monitor or a USB headset.</para>\n      </summary>\n      <param name=\"value\">True if the change was caused by an device change.</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioSettings.Reset(UnityEngine.AudioConfiguration)\">\n      <summary>\n        <para>Performs a change of the device configuration. In response to this the AudioSettings.OnAudioConfigurationChanged delegate is invoked with the argument deviceWasChanged=false. It cannot be guaranteed that the exact settings specified can be used, but the an attempt is made to use the closest match supported by the system.</para>\n      </summary>\n      <param name=\"config\">The new configuration to be used.</param>\n      <returns>\n        <para>True if all settings could be successfully applied.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AudioSettings.SetSpatializerPluginName(System.String)\">\n      <summary>\n        <para>Sets the spatializer plugin for all platform groups. If a null or empty string is passed in, the existing spatializer plugin will be cleared.</para>\n      </summary>\n      <param name=\"pluginName\">The spatializer plugin name.</param>\n    </member>\n    <member name=\"T:UnityEngine.AudioSource\">\n      <summary>\n        <para>A representation of audio sources in 3D.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.bypassEffects\">\n      <summary>\n        <para>Bypass effects (Applied from filter components or global listener filters).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.bypassListenerEffects\">\n      <summary>\n        <para>When set global effects on the AudioListener will not be applied to the audio signal generated by the AudioSource. Does not apply if the AudioSource is playing into a mixer group.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.bypassReverbZones\">\n      <summary>\n        <para>When set doesn't route the signal from an AudioSource into the global reverb associated with reverb zones.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.clip\">\n      <summary>\n        <para>The default AudioClip to play.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.dopplerLevel\">\n      <summary>\n        <para>Sets the Doppler scale for this AudioSource.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.ignoreListenerPause\">\n      <summary>\n        <para>Allows AudioSource to play even though AudioListener.pause is set to true. This is useful for the menu element sounds or background music in pause menus.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.ignoreListenerVolume\">\n      <summary>\n        <para>This makes the audio source not take into account the volume of the audio listener.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.isPlaying\">\n      <summary>\n        <para>Is the clip playing right now (Read Only)?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.isVirtual\">\n      <summary>\n        <para>True if all sounds played by the AudioSource (main sound started by Play() or playOnAwake as well as one-shots) are culled by the audio system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.loop\">\n      <summary>\n        <para>Is the audio clip looping?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.maxDistance\">\n      <summary>\n        <para>(Logarithmic rolloff) MaxDistance is the distance a sound stops attenuating at.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.minDistance\">\n      <summary>\n        <para>Within the Min distance the AudioSource will cease to grow louder in volume.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.mute\">\n      <summary>\n        <para>Un- / Mutes the AudioSource. Mute sets the volume=0, Un-Mute restore the original volume.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.outputAudioMixerGroup\">\n      <summary>\n        <para>The target group to which the AudioSource should route its signal.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.pan\">\n      <summary>\n        <para>Pan has been deprecated. Use panStereo instead.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.panLevel\">\n      <summary>\n        <para>PanLevel has been deprecated. Use spatialBlend instead.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.panStereo\">\n      <summary>\n        <para>Pans a playing sound in a stereo way (left or right). This only applies to sounds that are Mono or Stereo.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.pitch\">\n      <summary>\n        <para>The pitch of the audio source.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.playOnAwake\">\n      <summary>\n        <para>If set to true, the audio source will automatically start playing on awake.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.priority\">\n      <summary>\n        <para>Sets the priority of the AudioSource.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.reverbZoneMix\">\n      <summary>\n        <para>The amount by which the signal from the AudioSource will be mixed into the global reverb associated with the Reverb Zones.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.rolloffMode\">\n      <summary>\n        <para>Sets/Gets how the AudioSource attenuates over distance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.spatialBlend\">\n      <summary>\n        <para>Sets how much this AudioSource is affected by 3D spatialisation calculations (attenuation, doppler etc). 0.0 makes the sound full 2D, 1.0 makes it full 3D.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.spatialize\">\n      <summary>\n        <para>Enables or disables spatialization.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.spatializePostEffects\">\n      <summary>\n        <para>Determines if the spatializer effect is inserted before or after the effect filters.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.spread\">\n      <summary>\n        <para>Sets the spread angle (in degrees) of a 3d stereo or multichannel sound in speaker space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.time\">\n      <summary>\n        <para>Playback position in seconds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.timeSamples\">\n      <summary>\n        <para>Playback position in PCM samples.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.velocityUpdateMode\">\n      <summary>\n        <para>Whether the Audio Source should be updated in the fixed or dynamic update.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AudioSource.volume\">\n      <summary>\n        <para>The volume of the audio source (0.0 to 1.0).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.GetAmbisonicDecoderFloat(System.Int32,System.Single&amp;)\">\n      <summary>\n        <para>Reads a user-defined parameter of a custom ambisonic decoder effect that is attached to an AudioSource.</para>\n      </summary>\n      <param name=\"index\">Zero-based index of user-defined parameter to be read.</param>\n      <param name=\"value\">Return value of the user-defined parameter that is read.</param>\n      <returns>\n        <para>True, if the parameter could be read.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.GetCustomCurve(UnityEngine.AudioSourceCurveType)\">\n      <summary>\n        <para>Get the current custom curve for the given AudioSourceCurveType.</para>\n      </summary>\n      <param name=\"type\">The curve type to get.</param>\n      <returns>\n        <para>The custom AnimationCurve corresponding to the given curve type.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.GetOutputData(System.Single[],System.Int32)\">\n      <summary>\n        <para>Provides a block of the currently playing source's output data.</para>\n      </summary>\n      <param name=\"samples\">The array to populate with audio samples. Its length must be a power of 2.</param>\n      <param name=\"channel\">The channel to sample from.</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.GetOutputData(System.Int32,System.Int32)\">\n      <summary>\n        <para>Deprecated Version. Returns a block of the currently playing source's output data.</para>\n      </summary>\n      <param name=\"numSamples\"></param>\n      <param name=\"channel\"></param>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.GetSpatializerFloat(System.Int32,System.Single&amp;)\">\n      <summary>\n        <para>Reads a user-defined parameter of a custom spatializer effect that is attached to an AudioSource.</para>\n      </summary>\n      <param name=\"index\">Zero-based index of user-defined parameter to be read.</param>\n      <param name=\"value\">Return value of the user-defined parameter that is read.</param>\n      <returns>\n        <para>True, if the parameter could be read.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.GetSpectrumData(System.Single[],System.Int32,UnityEngine.FFTWindow)\">\n      <summary>\n        <para>Provides a block of the currently playing audio source's spectrum data.</para>\n      </summary>\n      <param name=\"samples\">The array to populate with audio samples. Its length must be a power of 2.</param>\n      <param name=\"channel\">The channel to sample from.</param>\n      <param name=\"window\">The FFTWindow type to use when sampling.</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.GetSpectrumData(System.Int32,System.Int32,UnityEngine.FFTWindow)\">\n      <summary>\n        <para>Deprecated Version. Returns a block of the currently playing source's spectrum data.</para>\n      </summary>\n      <param name=\"numSamples\">The number of samples to retrieve. Must be a power of 2.</param>\n      <param name=\"channel\">The channel to sample from.</param>\n      <param name=\"window\">The FFTWindow type to use when sampling.</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.Pause\">\n      <summary>\n        <para>Pauses playing the clip.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.Play()\">\n      <summary>\n        <para>Plays the clip with an optional certain delay.</para>\n      </summary>\n      <param name=\"delay\">Delay in number of samples, assuming a 44100Hz sample rate (meaning that Play(44100) will delay the playing by exactly 1 sec).</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.Play(System.UInt64)\">\n      <summary>\n        <para>Plays the clip with an optional certain delay.</para>\n      </summary>\n      <param name=\"delay\">Delay in number of samples, assuming a 44100Hz sample rate (meaning that Play(44100) will delay the playing by exactly 1 sec).</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.PlayClipAtPoint(UnityEngine.AudioClip,UnityEngine.Vector3)\">\n      <summary>\n        <para>Plays an AudioClip at a given position in world space.</para>\n      </summary>\n      <param name=\"clip\">Audio data to play.</param>\n      <param name=\"position\">Position in world space from which sound originates.</param>\n      <param name=\"volume\">Playback volume.</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.PlayClipAtPoint(UnityEngine.AudioClip,UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Plays an AudioClip at a given position in world space.</para>\n      </summary>\n      <param name=\"clip\">Audio data to play.</param>\n      <param name=\"position\">Position in world space from which sound originates.</param>\n      <param name=\"volume\">Playback volume.</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.PlayDelayed(System.Single)\">\n      <summary>\n        <para>Plays the clip with a delay specified in seconds. Users are advised to use this function instead of the old Play(delay) function that took a delay specified in samples relative to a reference rate of 44.1 kHz as an argument.</para>\n      </summary>\n      <param name=\"delay\">Delay time specified in seconds.</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.PlayOneShot(UnityEngine.AudioClip)\">\n      <summary>\n        <para>Plays an AudioClip, and scales the AudioSource volume by volumeScale.</para>\n      </summary>\n      <param name=\"clip\">The clip being played.</param>\n      <param name=\"volumeScale\">The scale of the volume (0-1).</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.PlayOneShot(UnityEngine.AudioClip,System.Single)\">\n      <summary>\n        <para>Plays an AudioClip, and scales the AudioSource volume by volumeScale.</para>\n      </summary>\n      <param name=\"clip\">The clip being played.</param>\n      <param name=\"volumeScale\">The scale of the volume (0-1).</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.PlayScheduled(System.Double)\">\n      <summary>\n        <para>Plays the clip at a specific time on the absolute time-line that AudioSettings.dspTime reads from.</para>\n      </summary>\n      <param name=\"time\">Time in seconds on the absolute time-line that AudioSettings.dspTime refers to for when the sound should start playing.</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.SetAmbisonicDecoderFloat(System.Int32,System.Single)\">\n      <summary>\n        <para>Sets a user-defined parameter of a custom ambisonic decoder effect that is attached to an AudioSource.</para>\n      </summary>\n      <param name=\"index\">Zero-based index of user-defined parameter to be set.</param>\n      <param name=\"value\">New value of the user-defined parameter.</param>\n      <returns>\n        <para>True, if the parameter could be set.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.SetCustomCurve(UnityEngine.AudioSourceCurveType,UnityEngine.AnimationCurve)\">\n      <summary>\n        <para>Set the custom curve for the given AudioSourceCurveType.</para>\n      </summary>\n      <param name=\"type\">The curve type that should be set.</param>\n      <param name=\"curve\">The curve that should be applied to the given curve type.</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.SetScheduledEndTime(System.Double)\">\n      <summary>\n        <para>Changes the time at which a sound that has already been scheduled to play will end. Notice that depending on the timing not all rescheduling requests can be fulfilled.</para>\n      </summary>\n      <param name=\"time\">Time in seconds.</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.SetScheduledStartTime(System.Double)\">\n      <summary>\n        <para>Changes the time at which a sound that has already been scheduled to play will start.</para>\n      </summary>\n      <param name=\"time\">Time in seconds.</param>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.SetSpatializerFloat(System.Int32,System.Single)\">\n      <summary>\n        <para>Sets a user-defined parameter of a custom spatializer effect that is attached to an AudioSource.</para>\n      </summary>\n      <param name=\"index\">Zero-based index of user-defined parameter to be set.</param>\n      <param name=\"value\">New value of the user-defined parameter.</param>\n      <returns>\n        <para>True, if the parameter could be set.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.Stop\">\n      <summary>\n        <para>Stops playing the clip.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AudioSource.UnPause\">\n      <summary>\n        <para>Unpause the paused playback of this AudioSource.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AudioSourceCurveType\">\n      <summary>\n        <para>This defines the curve type of the different custom curves that can be queried and set within the AudioSource.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioSourceCurveType.CustomRolloff\">\n      <summary>\n        <para>Custom Volume Rolloff.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioSourceCurveType.ReverbZoneMix\">\n      <summary>\n        <para>Reverb Zone Mix.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioSourceCurveType.SpatialBlend\">\n      <summary>\n        <para>The Spatial Blend.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioSourceCurveType.Spread\">\n      <summary>\n        <para>The 3D Spread.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AudioSpeakerMode\">\n      <summary>\n        <para>These are speaker types defined for use with AudioSettings.speakerMode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioSpeakerMode.Mode5point1\">\n      <summary>\n        <para>Channel count is set to 6. 5.1 speaker setup. This includes front left, front right, center, rear left, rear right and a subwoofer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioSpeakerMode.Mode7point1\">\n      <summary>\n        <para>Channel count is set to 8. 7.1 speaker setup. This includes front left, front right, center, rear left, rear right, side left, side right and a subwoofer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioSpeakerMode.Mono\">\n      <summary>\n        <para>Channel count is set to 1. The speakers are monaural.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioSpeakerMode.Prologic\">\n      <summary>\n        <para>Channel count is set to 2. Stereo output, but data is encoded in a way that is picked up by a Prologic/Prologic2 decoder and split into a 5.1 speaker setup.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioSpeakerMode.Quad\">\n      <summary>\n        <para>Channel count is set to 4. 4 speaker setup. This includes front left, front right, rear left, rear right.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioSpeakerMode.Raw\">\n      <summary>\n        <para>Channel count is unaffected.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioSpeakerMode.Stereo\">\n      <summary>\n        <para>Channel count is set to 2. The speakers are stereo. This is the editor default.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioSpeakerMode.Surround\">\n      <summary>\n        <para>Channel count is set to 5. 5 speaker setup. This includes front left, front right, center, rear left, rear right.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AudioType\">\n      <summary>\n        <para>Type of the imported(native) data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioType.ACC\">\n      <summary>\n        <para>Acc - not supported.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioType.AIFF\">\n      <summary>\n        <para>Aiff.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioType.AUDIOQUEUE\">\n      <summary>\n        <para>iPhone hardware decoder, supports AAC, ALAC and MP3. Extracodecdata is a pointer to an FMOD_AUDIOQUEUE_EXTRACODECDATA structure.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioType.IT\">\n      <summary>\n        <para>Impulse tracker.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioType.MOD\">\n      <summary>\n        <para>Protracker / Fasttracker MOD.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioType.MPEG\">\n      <summary>\n        <para>MP2/MP3 MPEG.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioType.OGGVORBIS\">\n      <summary>\n        <para>Ogg vorbis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioType.S3M\">\n      <summary>\n        <para>ScreamTracker 3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioType.UNKNOWN\">\n      <summary>\n        <para>3rd party / unknown plugin format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioType.VAG\">\n      <summary>\n        <para>VAG.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioType.WAV\">\n      <summary>\n        <para>Microsoft WAV.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioType.XM\">\n      <summary>\n        <para>FastTracker 2 XM.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioType.XMA\">\n      <summary>\n        <para>Xbox360 XMA.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AudioVelocityUpdateMode\">\n      <summary>\n        <para>Describes when an AudioSource or AudioListener is updated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioVelocityUpdateMode.Auto\">\n      <summary>\n        <para>Updates the source or listener in the fixed update loop if it is attached to a Rigidbody, dynamic otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioVelocityUpdateMode.Dynamic\">\n      <summary>\n        <para>Updates the source or listener in the dynamic update loop.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AudioVelocityUpdateMode.Fixed\">\n      <summary>\n        <para>Updates the source or listener in the fixed update loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Avatar\">\n      <summary>\n        <para>Avatar definition.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Avatar.isHuman\">\n      <summary>\n        <para>Return true if this avatar is a valid human avatar.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Avatar.isValid\">\n      <summary>\n        <para>Return true if this avatar is a valid mecanim avatar. It can be a generic avatar or a human avatar.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AvatarBuilder\">\n      <summary>\n        <para>Class to build avatars from user scripts.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AvatarBuilder.BuildGenericAvatar(UnityEngine.GameObject,System.String)\">\n      <summary>\n        <para>Create a new generic avatar.</para>\n      </summary>\n      <param name=\"go\">Root object of your transform hierarchy.</param>\n      <param name=\"rootMotionTransformName\">Transform name of the root motion transform. If empty no root motion is defined and you must take care of avatar movement yourself.</param>\n    </member>\n    <member name=\"M:UnityEngine.AvatarBuilder.BuildHumanAvatar(UnityEngine.GameObject,UnityEngine.HumanDescription)\">\n      <summary>\n        <para>Create a humanoid avatar.</para>\n      </summary>\n      <param name=\"go\">Root object of your transform hierachy. It must be the top most gameobject when you create the avatar.</param>\n      <param name=\"humanDescription\">Humanoid description of the avatar.</param>\n      <returns>\n        <para>Returns the Avatar, you must always always check the avatar is valid before using it with Avatar.isValid.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.AvatarIKGoal\">\n      <summary>\n        <para>IK Goal.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarIKGoal.LeftFoot\">\n      <summary>\n        <para>The left foot.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarIKGoal.LeftHand\">\n      <summary>\n        <para>The left hand.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarIKGoal.RightFoot\">\n      <summary>\n        <para>The right foot.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarIKGoal.RightHand\">\n      <summary>\n        <para>The right hand.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AvatarIKHint\">\n      <summary>\n        <para>IK Hint.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarIKHint.LeftElbow\">\n      <summary>\n        <para>The left elbow IK hint.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarIKHint.LeftKnee\">\n      <summary>\n        <para>The left knee IK hint.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarIKHint.RightElbow\">\n      <summary>\n        <para>The right elbow IK hint.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarIKHint.RightKnee\">\n      <summary>\n        <para>The right knee IK hint.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AvatarMask\">\n      <summary>\n        <para>AvatarMask is used to mask out humanoid body parts and transforms.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AvatarMask.humanoidBodyPartCount\">\n      <summary>\n        <para>The number of humanoid body parts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.AvatarMask.transformCount\">\n      <summary>\n        <para>Number of transforms.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AvatarMask.AddTransformPath(UnityEngine.Transform,System.Boolean)\">\n      <summary>\n        <para>Adds a transform path into the AvatarMask.</para>\n      </summary>\n      <param name=\"transform\">The transform to add into the AvatarMask.</param>\n      <param name=\"recursive\">Whether to also add all children of the specified transform.</param>\n    </member>\n    <member name=\"M:UnityEngine.AvatarMask.#ctor\">\n      <summary>\n        <para>Creates a new AvatarMask.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.AvatarMask.GetHumanoidBodyPartActive(UnityEngine.AvatarMaskBodyPart)\">\n      <summary>\n        <para>Returns true if the humanoid body part at the given index is active.</para>\n      </summary>\n      <param name=\"index\">The index of the humanoid body part.</param>\n    </member>\n    <member name=\"M:UnityEngine.AvatarMask.GetTransformActive(System.Int32)\">\n      <summary>\n        <para>Returns true if the transform at the given index is active.</para>\n      </summary>\n      <param name=\"index\">The index of the transform.</param>\n    </member>\n    <member name=\"M:UnityEngine.AvatarMask.GetTransformPath(System.Int32)\">\n      <summary>\n        <para>Returns the path of the transform at the given index.</para>\n      </summary>\n      <param name=\"index\">The index of the transform.</param>\n    </member>\n    <member name=\"M:UnityEngine.AvatarMask.RemoveTransformPath(UnityEngine.Transform,System.Boolean)\">\n      <summary>\n        <para>Removes a transform path from the AvatarMask.</para>\n      </summary>\n      <param name=\"transform\">The Transform that should be removed from the AvatarMask.</param>\n      <param name=\"recursive\">Whether to also remove all children of the specified transform.</param>\n    </member>\n    <member name=\"M:UnityEngine.AvatarMask.SetHumanoidBodyPartActive(UnityEngine.AvatarMaskBodyPart,System.Boolean)\">\n      <summary>\n        <para>Sets the humanoid body part at the given index to active or not.</para>\n      </summary>\n      <param name=\"index\">The index of the humanoid body part.</param>\n      <param name=\"value\">Active or not.</param>\n    </member>\n    <member name=\"M:UnityEngine.AvatarMask.SetTransformActive(System.Int32,System.Boolean)\">\n      <summary>\n        <para>Sets the tranform at the given index to active or not.</para>\n      </summary>\n      <param name=\"index\">The index of the transform.</param>\n      <param name=\"value\">Active or not.</param>\n    </member>\n    <member name=\"M:UnityEngine.AvatarMask.SetTransformPath(System.Int32,System.String)\">\n      <summary>\n        <para>Sets the path of the transform at the given index.</para>\n      </summary>\n      <param name=\"index\">The index of the transform.</param>\n      <param name=\"path\">The path of the transform.</param>\n    </member>\n    <member name=\"T:UnityEngine.AvatarMaskBodyPart\">\n      <summary>\n        <para>Avatar body part.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarMaskBodyPart.Body\">\n      <summary>\n        <para>The Body.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarMaskBodyPart.Head\">\n      <summary>\n        <para>The Head.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarMaskBodyPart.LastBodyPart\">\n      <summary>\n        <para>Total number of body parts.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarMaskBodyPart.LeftArm\">\n      <summary>\n        <para>The Left Arm.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarMaskBodyPart.LeftFingers\">\n      <summary>\n        <para>Left Fingers.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarMaskBodyPart.LeftFootIK\">\n      <summary>\n        <para>Left Foot IK.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarMaskBodyPart.LeftHandIK\">\n      <summary>\n        <para>Left Hand IK.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarMaskBodyPart.LeftLeg\">\n      <summary>\n        <para>The Left Leg.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarMaskBodyPart.RightArm\">\n      <summary>\n        <para>The Right Arm.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarMaskBodyPart.RightFingers\">\n      <summary>\n        <para>Right Fingers.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarMaskBodyPart.RightFootIK\">\n      <summary>\n        <para>Right Foot IK.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarMaskBodyPart.RightHandIK\">\n      <summary>\n        <para>Right Hand IK.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarMaskBodyPart.RightLeg\">\n      <summary>\n        <para>The Right Leg.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarMaskBodyPart.Root\">\n      <summary>\n        <para>The Root.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.AvatarTarget\">\n      <summary>\n        <para>Target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarTarget.Body\">\n      <summary>\n        <para>The body, center of mass.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarTarget.LeftFoot\">\n      <summary>\n        <para>The left foot.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarTarget.LeftHand\">\n      <summary>\n        <para>The left hand.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarTarget.RightFoot\">\n      <summary>\n        <para>The right foot.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarTarget.RightHand\">\n      <summary>\n        <para>The right hand.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.AvatarTarget.Root\">\n      <summary>\n        <para>The root, the position of the game object.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.BatteryStatus\">\n      <summary>\n        <para>Enumeration for SystemInfo.batteryStatus which represents the current status of the device's battery.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BatteryStatus.Charging\">\n      <summary>\n        <para>Device is plugged in and charging.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BatteryStatus.Discharging\">\n      <summary>\n        <para>Device is unplugged and discharging.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BatteryStatus.Full\">\n      <summary>\n        <para>Device is plugged in and the battery is full.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BatteryStatus.NotCharging\">\n      <summary>\n        <para>Device is plugged in, but is not charging.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BatteryStatus.Unknown\">\n      <summary>\n        <para>The device's battery status cannot be determined. If battery status is not available on your target platform, SystemInfo.batteryStatus will return this value.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.BeforeRenderOrderAttribute\">\n      <summary>\n        <para>Use this BeforeRenderOrderAttribute when you need to specify a custom callback order for Application.onBeforeRender.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BeforeRenderOrderAttribute.order\">\n      <summary>\n        <para>The order, lowest to highest, that the Application.onBeforeRender event recievers will be called in.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.BeforeRenderOrderAttribute.#ctor(System.Int32)\">\n      <summary>\n        <para>When applied to methods, specifies the order called during Application.onBeforeRender events.</para>\n      </summary>\n      <param name=\"order\">The sorting order, sorted lowest to highest.</param>\n    </member>\n    <member name=\"T:UnityEngine.Behaviour\">\n      <summary>\n        <para>Behaviours are Components that can be enabled or disabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Behaviour.enabled\">\n      <summary>\n        <para>Enabled Behaviours are Updated, disabled Behaviours are not.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Behaviour.isActiveAndEnabled\">\n      <summary>\n        <para>Has the Behaviour had enabled called.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.BillboardAsset\">\n      <summary>\n        <para>BillboardAsset describes how a billboard is rendered.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BillboardAsset.bottom\">\n      <summary>\n        <para>Height of the billboard that is below ground.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BillboardAsset.height\">\n      <summary>\n        <para>Height of the billboard.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BillboardAsset.imageCount\">\n      <summary>\n        <para>Number of pre-rendered images that can be switched when the billboard is viewed from different angles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BillboardAsset.indexCount\">\n      <summary>\n        <para>Number of indices in the billboard mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BillboardAsset.material\">\n      <summary>\n        <para>The material used for rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BillboardAsset.vertexCount\">\n      <summary>\n        <para>Number of vertices in the billboard mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BillboardAsset.width\">\n      <summary>\n        <para>Width of the billboard.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.BillboardAsset.#ctor\">\n      <summary>\n        <para>Constructs a new BillboardAsset.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.BillboardAsset.GetImageTexCoords\">\n      <summary>\n        <para>Get the array of billboard image texture coordinate data.</para>\n      </summary>\n      <param name=\"imageTexCoords\">The list that receives the array.</param>\n    </member>\n    <member name=\"M:UnityEngine.BillboardAsset.GetImageTexCoords(System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Get the array of billboard image texture coordinate data.</para>\n      </summary>\n      <param name=\"imageTexCoords\">The list that receives the array.</param>\n    </member>\n    <member name=\"M:UnityEngine.BillboardAsset.GetIndices\">\n      <summary>\n        <para>Get the indices of the billboard mesh.</para>\n      </summary>\n      <param name=\"indices\">The list that receives the array.</param>\n    </member>\n    <member name=\"M:UnityEngine.BillboardAsset.GetIndices(System.Collections.Generic.List`1&lt;System.UInt16&gt;)\">\n      <summary>\n        <para>Get the indices of the billboard mesh.</para>\n      </summary>\n      <param name=\"indices\">The list that receives the array.</param>\n    </member>\n    <member name=\"M:UnityEngine.BillboardAsset.GetVertices\">\n      <summary>\n        <para>Get the vertices of the billboard mesh.</para>\n      </summary>\n      <param name=\"vertices\">The list that receives the array.</param>\n    </member>\n    <member name=\"M:UnityEngine.BillboardAsset.GetVertices(System.Collections.Generic.List`1&lt;UnityEngine.Vector2&gt;)\">\n      <summary>\n        <para>Get the vertices of the billboard mesh.</para>\n      </summary>\n      <param name=\"vertices\">The list that receives the array.</param>\n    </member>\n    <member name=\"M:UnityEngine.BillboardAsset.SetImageTexCoords(UnityEngine.Vector4[])\">\n      <summary>\n        <para>Set the array of billboard image texture coordinate data.</para>\n      </summary>\n      <param name=\"imageTexCoords\">The array of data to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.BillboardAsset.SetImageTexCoords(System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Set the array of billboard image texture coordinate data.</para>\n      </summary>\n      <param name=\"imageTexCoords\">The array of data to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.BillboardAsset.SetIndices(System.UInt16[])\">\n      <summary>\n        <para>Set the indices of the billboard mesh.</para>\n      </summary>\n      <param name=\"indices\">The array of data to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.BillboardAsset.SetIndices(System.Collections.Generic.List`1&lt;System.UInt16&gt;)\">\n      <summary>\n        <para>Set the indices of the billboard mesh.</para>\n      </summary>\n      <param name=\"indices\">The array of data to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.BillboardAsset.SetVertices(UnityEngine.Vector2[])\">\n      <summary>\n        <para>Set the vertices of the billboard mesh.</para>\n      </summary>\n      <param name=\"vertices\">The array of data to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.BillboardAsset.SetVertices(System.Collections.Generic.List`1&lt;UnityEngine.Vector2&gt;)\">\n      <summary>\n        <para>Set the vertices of the billboard mesh.</para>\n      </summary>\n      <param name=\"vertices\">The array of data to set.</param>\n    </member>\n    <member name=\"T:UnityEngine.BillboardRenderer\">\n      <summary>\n        <para>Renders a billboard from a BillboardAsset.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BillboardRenderer.billboard\">\n      <summary>\n        <para>The BillboardAsset to render.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.BillboardRenderer.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.BitStream\">\n      <summary>\n        <para>The BitStream class represents seralized variables, packed into a stream.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BitStream.isReading\">\n      <summary>\n        <para>Is the BitStream currently being read? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BitStream.isWriting\">\n      <summary>\n        <para>Is the BitStream currently being written? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.BitStream.Serialize(System.Boolean&amp;)\">\n      <summary>\n        <para>Serializes different types of variables.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"maxDelta\"></param>\n      <param name=\"viewID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.BitStream.Serialize(System.Char&amp;)\">\n      <summary>\n        <para>Serializes different types of variables.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"maxDelta\"></param>\n      <param name=\"viewID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.BitStream.Serialize(System.Int16&amp;)\">\n      <summary>\n        <para>Serializes different types of variables.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"maxDelta\"></param>\n      <param name=\"viewID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.BitStream.Serialize(System.Int32&amp;)\">\n      <summary>\n        <para>Serializes different types of variables.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"maxDelta\"></param>\n      <param name=\"viewID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.BitStream.Serialize(System.Single&amp;)\">\n      <summary>\n        <para>Serializes different types of variables.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"maxDelta\"></param>\n      <param name=\"viewID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.BitStream.Serialize(UnityEngine.Vector3&amp;)\">\n      <summary>\n        <para>Serializes different types of variables.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"maxDelta\"></param>\n      <param name=\"viewID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.BitStream.Serialize(UnityEngine.Quaternion&amp;)\">\n      <summary>\n        <para>Serializes different types of variables.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"maxDelta\"></param>\n      <param name=\"viewID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.BitStream.Serialize(System.Single&amp;,System.Single)\">\n      <summary>\n        <para>Serializes different types of variables.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"maxDelta\"></param>\n      <param name=\"viewID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.BitStream.Serialize(UnityEngine.Quaternion&amp;,System.Single)\">\n      <summary>\n        <para>Serializes different types of variables.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"maxDelta\"></param>\n      <param name=\"viewID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.BitStream.Serialize(UnityEngine.Vector3&amp;,System.Single)\">\n      <summary>\n        <para>Serializes different types of variables.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"maxDelta\"></param>\n      <param name=\"viewID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.BitStream.Serialize(UnityEngine.NetworkPlayer&amp;)\">\n      <summary>\n        <para>Serializes different types of variables.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"maxDelta\"></param>\n      <param name=\"viewID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.BitStream.Serialize(UnityEngine.NetworkViewID&amp;)\">\n      <summary>\n        <para>Serializes different types of variables.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"maxDelta\"></param>\n      <param name=\"viewID\"></param>\n    </member>\n    <member name=\"T:UnityEngine.BlendWeights\">\n      <summary>\n        <para>Blend weights.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BlendWeights.FourBones\">\n      <summary>\n        <para>Four bones affect each vertex.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BlendWeights.OneBone\">\n      <summary>\n        <para>One bone affects each vertex.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BlendWeights.TwoBones\">\n      <summary>\n        <para>Two bones affect each vertex.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.BodyDof\">\n      <summary>\n        <para>Enumeration of all the muscles in the body.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BodyDof.ChestFrontBack\">\n      <summary>\n        <para>The chest front-back muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BodyDof.ChestLeftRight\">\n      <summary>\n        <para>The chest left-right muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BodyDof.ChestRollLeftRight\">\n      <summary>\n        <para>The chest roll left-right muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BodyDof.LastBodyDof\">\n      <summary>\n        <para>The last value of the BodyDof enum.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BodyDof.SpineFrontBack\">\n      <summary>\n        <para>The spine front-back muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BodyDof.SpineLeftRight\">\n      <summary>\n        <para>The spine left-right muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BodyDof.SpineRollLeftRight\">\n      <summary>\n        <para>The spine roll left-right muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BodyDof.UpperChestFrontBack\">\n      <summary>\n        <para>The upper chest front-back muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BodyDof.UpperChestLeftRight\">\n      <summary>\n        <para>The upper chest left-right muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BodyDof.UpperChestRollLeftRight\">\n      <summary>\n        <para>The upper chest roll left-right muscle.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.BoneWeight\">\n      <summary>\n        <para>Skinning bone weights of a vertex in the mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoneWeight.boneIndex0\">\n      <summary>\n        <para>Index of first bone.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoneWeight.boneIndex1\">\n      <summary>\n        <para>Index of second bone.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoneWeight.boneIndex2\">\n      <summary>\n        <para>Index of third bone.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoneWeight.boneIndex3\">\n      <summary>\n        <para>Index of fourth bone.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoneWeight.weight0\">\n      <summary>\n        <para>Skinning weight for first bone.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoneWeight.weight1\">\n      <summary>\n        <para>Skinning weight for second bone.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoneWeight.weight2\">\n      <summary>\n        <para>Skinning weight for third bone.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoneWeight.weight3\">\n      <summary>\n        <para>Skinning weight for fourth bone.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.BoundingSphere\">\n      <summary>\n        <para>Describes a single bounding sphere for use by a CullingGroup.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BoundingSphere.position\">\n      <summary>\n        <para>The position of the center of the BoundingSphere.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.BoundingSphere.radius\">\n      <summary>\n        <para>The radius of the BoundingSphere.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.BoundingSphere.#ctor(UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Initializes a BoundingSphere.</para>\n      </summary>\n      <param name=\"pos\">The center of the sphere.</param>\n      <param name=\"rad\">The radius of the sphere.</param>\n      <param name=\"packedSphere\">A four-component vector containing the position (packed into the XYZ components) and radius (packed into the W component).</param>\n    </member>\n    <member name=\"M:UnityEngine.BoundingSphere.#ctor(UnityEngine.Vector4)\">\n      <summary>\n        <para>Initializes a BoundingSphere.</para>\n      </summary>\n      <param name=\"pos\">The center of the sphere.</param>\n      <param name=\"rad\">The radius of the sphere.</param>\n      <param name=\"packedSphere\">A four-component vector containing the position (packed into the XYZ components) and radius (packed into the W component).</param>\n    </member>\n    <member name=\"T:UnityEngine.Bounds\">\n      <summary>\n        <para>Represents an axis aligned bounding box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Bounds.center\">\n      <summary>\n        <para>The center of the bounding box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Bounds.extents\">\n      <summary>\n        <para>The extents of the Bounding Box. This is always half of the size of the Bounds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Bounds.max\">\n      <summary>\n        <para>The maximal point of the box. This is always equal to center+extents.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Bounds.min\">\n      <summary>\n        <para>The minimal point of the box. This is always equal to center-extents.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Bounds.size\">\n      <summary>\n        <para>The total size of the box. This is always twice as large as the extents.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Bounds.ClosestPoint(UnityEngine.Vector3)\">\n      <summary>\n        <para>The closest point on the bounding box.</para>\n      </summary>\n      <param name=\"point\">Arbitrary point.</param>\n      <returns>\n        <para>The point on the bounding box or inside the bounding box.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Bounds.Contains(UnityEngine.Vector3)\">\n      <summary>\n        <para>Is point contained in the bounding box?</para>\n      </summary>\n      <param name=\"point\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Bounds.#ctor(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Creates a new Bounds.</para>\n      </summary>\n      <param name=\"center\">The location of the origin of the Bounds.</param>\n      <param name=\"size\">The dimensions of the Bounds.</param>\n    </member>\n    <member name=\"M:UnityEngine.Bounds.Encapsulate(UnityEngine.Vector3)\">\n      <summary>\n        <para>Grows the Bounds to include the point.</para>\n      </summary>\n      <param name=\"point\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Bounds.Encapsulate(UnityEngine.Bounds)\">\n      <summary>\n        <para>Grow the bounds to encapsulate the bounds.</para>\n      </summary>\n      <param name=\"bounds\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Bounds.Expand(System.Single)\">\n      <summary>\n        <para>Expand the bounds by increasing its size by amount along each side.</para>\n      </summary>\n      <param name=\"amount\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Bounds.Expand(UnityEngine.Vector3)\">\n      <summary>\n        <para>Expand the bounds by increasing its size by amount along each side.</para>\n      </summary>\n      <param name=\"amount\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Bounds.IntersectRay(UnityEngine.Ray)\">\n      <summary>\n        <para>Does ray intersect this bounding box?</para>\n      </summary>\n      <param name=\"ray\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Bounds.IntersectRay(UnityEngine.Ray,System.Single&amp;)\">\n      <summary>\n        <para>Does ray intersect this bounding box?</para>\n      </summary>\n      <param name=\"ray\"></param>\n      <param name=\"distance\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Bounds.Intersects(UnityEngine.Bounds)\">\n      <summary>\n        <para>Does another bounding box intersect with this bounding box?</para>\n      </summary>\n      <param name=\"bounds\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Bounds.SetMinMax(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the bounds to the min and max value of the box.</para>\n      </summary>\n      <param name=\"min\"></param>\n      <param name=\"max\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Bounds.SqrDistance(UnityEngine.Vector3)\">\n      <summary>\n        <para>The smallest squared distance between the point and this bounding box.</para>\n      </summary>\n      <param name=\"point\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Bounds.ToString\">\n      <summary>\n        <para>Returns a nicely formatted string for the bounds.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Bounds.ToString(System.String)\">\n      <summary>\n        <para>Returns a nicely formatted string for the bounds.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"T:UnityEngine.BoundsInt\">\n      <summary>\n        <para>Represents an axis aligned bounding box with all values as integers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoundsInt.allPositionsWithin\">\n      <summary>\n        <para>A BoundsInt.PositionCollection that contains all positions within the BoundsInt.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoundsInt.center\">\n      <summary>\n        <para>The center of the bounding box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoundsInt.max\">\n      <summary>\n        <para>The maximal point of the box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoundsInt.min\">\n      <summary>\n        <para>The minimal point of the box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoundsInt.position\">\n      <summary>\n        <para>The position of the bounding box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoundsInt.size\">\n      <summary>\n        <para>The total size of the box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoundsInt.x\">\n      <summary>\n        <para>X value of the minimal point of the box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoundsInt.xMax\">\n      <summary>\n        <para>The maximal x point of the box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoundsInt.xMin\">\n      <summary>\n        <para>The minimal x point of the box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoundsInt.y\">\n      <summary>\n        <para>Y value of the minimal point of the box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoundsInt.yMax\">\n      <summary>\n        <para>The maximal y point of the box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoundsInt.yMin\">\n      <summary>\n        <para>The minimal y point of the box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoundsInt.z\">\n      <summary>\n        <para>Z value of the minimal point of the box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoundsInt.zMax\">\n      <summary>\n        <para>The maximal z point of the box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoundsInt.zMin\">\n      <summary>\n        <para>The minimal z point of the box.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.BoundsInt.ClampToBounds(UnityEngine.BoundsInt)\">\n      <summary>\n        <para>Clamps the position and size of this bounding box to the given bounds.</para>\n      </summary>\n      <param name=\"bounds\">Bounds to clamp to.</param>\n    </member>\n    <member name=\"M:UnityEngine.BoundsInt.Contains(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Is point contained in the bounding box?</para>\n      </summary>\n      <param name=\"position\">Point to check.</param>\n      <param name=\"inclusive\">Whether the max limits are included in the check.</param>\n      <returns>\n        <para>Is point contained in the bounding box?</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.BoundsInt.Contains\">\n      <summary>\n        <para>Is point contained in the bounding box?</para>\n      </summary>\n      <param name=\"position\">Point to check.</param>\n      <param name=\"inclusive\">Whether the max limits are included in the check.</param>\n      <returns>\n        <para>Is point contained in the bounding box?</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.BoundsInt.PositionEnumerator\">\n      <summary>\n        <para>An iterator that allows you to iterate over all positions within the BoundsInt.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoundsInt.PositionEnumerator.Current\">\n      <summary>\n        <para>Current position of the enumerator.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.BoundsInt.PositionEnumerator.GetEnumerator\">\n      <summary>\n        <para>Returns this as an iterator that allows you to iterate over all positions within the BoundsInt.</para>\n      </summary>\n      <returns>\n        <para>This BoundsInt.PositionEnumerator.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.BoundsInt.PositionEnumerator.MoveNext\">\n      <summary>\n        <para>Moves the enumerator to the next position.</para>\n      </summary>\n      <returns>\n        <para>Whether the enumerator has successfully moved to the next position.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.BoundsInt.PositionEnumerator.Reset\">\n      <summary>\n        <para>Resets this enumerator to its starting state.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.BoundsInt.SetMinMax(UnityEngine.Vector3Int,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Sets the bounds to the min and max value of the box.</para>\n      </summary>\n      <param name=\"minPosition\"></param>\n      <param name=\"maxPosition\"></param>\n    </member>\n    <member name=\"M:UnityEngine.BoundsInt.ToString\">\n      <summary>\n        <para>Returns a nicely formatted string for the bounds.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.BoxCollider\">\n      <summary>\n        <para>A box-shaped primitive collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoxCollider.center\">\n      <summary>\n        <para>The center of the box, measured in the object's local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoxCollider.size\">\n      <summary>\n        <para>The size of the box, measured in the object's local space.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.BoxCollider2D\">\n      <summary>\n        <para>Collider for 2D physics representing an axis-aligned rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoxCollider2D.autoTiling\">\n      <summary>\n        <para>Determines whether the BoxCollider2D's shape is automatically updated based on a SpriteRenderer's tiling properties.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoxCollider2D.center\">\n      <summary>\n        <para>The center point of the collider in local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoxCollider2D.edgeRadius\">\n      <summary>\n        <para>Controls the radius of all edges created by the collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BoxCollider2D.size\">\n      <summary>\n        <para>The width and height of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.BuoyancyEffector2D\">\n      <summary>\n        <para>Applies forces to simulate buoyancy, fluid-flow and fluid drag.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BuoyancyEffector2D.angularDrag\">\n      <summary>\n        <para>A force applied to slow angular movement of any Collider2D in contact with the effector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BuoyancyEffector2D.density\">\n      <summary>\n        <para>The density of the fluid used to calculate the buoyancy forces.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BuoyancyEffector2D.flowAngle\">\n      <summary>\n        <para>The angle of the force used to similate fluid flow.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BuoyancyEffector2D.flowMagnitude\">\n      <summary>\n        <para>The magnitude of the force used to similate fluid flow.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BuoyancyEffector2D.flowVariation\">\n      <summary>\n        <para>The random variation of the force used to similate fluid flow.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BuoyancyEffector2D.linearDrag\">\n      <summary>\n        <para>A force applied to slow linear movement of any Collider2D in contact with the effector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.BuoyancyEffector2D.surfaceLevel\">\n      <summary>\n        <para>Defines an arbitrary horizontal line that represents the fluid surface level.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Cache\">\n      <summary>\n        <para>Data structure for cache. Please refer to See Also:Caching.AddCache for more information.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cache.expirationDelay\">\n      <summary>\n        <para>The number of seconds that an AssetBundle may remain unused in the cache before it is automatically deleted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cache.index\">\n      <summary>\n        <para>Returns the index of the cache in the cache list.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cache.maximumAvailableStorageSpace\">\n      <summary>\n        <para>Allows you to specify the total number of bytes that can be allocated for the cache.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cache.path\">\n      <summary>\n        <para>Returns the path of the cache.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cache.readOnly\">\n      <summary>\n        <para>Returns true if the cache is readonly.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cache.ready\">\n      <summary>\n        <para>Returns true if the cache is ready.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cache.spaceFree\">\n      <summary>\n        <para>Returns the number of currently unused bytes in the cache.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cache.spaceOccupied\">\n      <summary>\n        <para>Returns the used disk space in bytes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cache.valid\">\n      <summary>\n        <para>Returns true if the cache is valid.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Cache.ClearCache\">\n      <summary>\n        <para>Removes all cached content in the cache that has been cached by the current application.</para>\n      </summary>\n      <param name=\"expiration\">The number of seconds that AssetBundles may remain unused in the cache.</param>\n      <returns>\n        <para>Returns True when cache clearing succeeded.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Cache.ClearCache(System.Int32)\">\n      <summary>\n        <para>Removes all cached content in the cache that has been cached by the current application.</para>\n      </summary>\n      <param name=\"expiration\">The number of seconds that AssetBundles may remain unused in the cache.</param>\n      <returns>\n        <para>Returns True when cache clearing succeeded.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.CachedAssetBundle\">\n      <summary>\n        <para>Data structure for downloading AssetBundles to a customized cache path. See Also:UnityWebRequestAssetBundle.GetAssetBundle for more information.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CachedAssetBundle.hash\">\n      <summary>\n        <para>Hash128 which is used as the version of the AssetBundle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CachedAssetBundle.name\">\n      <summary>\n        <para>AssetBundle name which is used as the customized cache path.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Caching\">\n      <summary>\n        <para>The Caching class lets you manage cached AssetBundles, downloaded using UnityWebRequestAssetBundle.GetAssetBundle().</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Caching.cacheCount\">\n      <summary>\n        <para>Returns the cache count in the cache list.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Caching.compressionEnabled\">\n      <summary>\n        <para>Controls compression of cache data. Enabled by default.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Caching.currentCacheForWriting\">\n      <summary>\n        <para>Gets or sets the current cache in which AssetBundles should be cached.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Caching.defaultCache\">\n      <summary>\n        <para>Returns the default cache which is added by Unity internally.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Caching.ready\">\n      <summary>\n        <para>Returns true if Caching system is ready for use.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Caching.AddCache(System.String)\">\n      <summary>\n        <para>Add a cache with the given path.</para>\n      </summary>\n      <param name=\"cachePath\">Path to the cache folder.</param>\n    </member>\n    <member name=\"M:UnityEngine.Caching.ClearAllCachedVersions(System.String)\">\n      <summary>\n        <para>Removes all the cached versions of the given AssetBundle from the cache.</para>\n      </summary>\n      <param name=\"assetBundleName\">The AssetBundle name.</param>\n      <returns>\n        <para>Returns true when cache clearing succeeded.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Caching.ClearCache\">\n      <summary>\n        <para>Removes all AssetBundle content that has been cached by the current application.</para>\n      </summary>\n      <param name=\"expiration\">The number of seconds that AssetBundles may remain unused in the cache.</param>\n      <returns>\n        <para>True when cache clearing succeeded, false if cache was in use.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Caching.ClearCache(System.Int32)\">\n      <summary>\n        <para>Removes all AssetBundle content that has been cached by the current application.</para>\n      </summary>\n      <param name=\"expiration\">The number of seconds that AssetBundles may remain unused in the cache.</param>\n      <returns>\n        <para>True when cache clearing succeeded, false if cache was in use.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Caching.ClearCachedVersion(System.String,UnityEngine.Hash128)\">\n      <summary>\n        <para>Removes the given version of the AssetBundle.</para>\n      </summary>\n      <param name=\"assetBundleName\">The AssetBundle name.</param>\n      <param name=\"hash\">Version needs to be cleaned.</param>\n      <returns>\n        <para>Returns true when cache clearing succeeded.  Can return false if any cached bundle is in use.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Caching.ClearOtherCachedVersions(System.String,UnityEngine.Hash128)\">\n      <summary>\n        <para>Removes all the cached versions of the AssetBundle from the cache, except for the specified version.</para>\n      </summary>\n      <param name=\"assetBundleName\">The AssetBundle name.</param>\n      <param name=\"hash\">Version needs to be kept.</param>\n      <returns>\n        <para>Returns true when cache clearing succeeded.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Caching.GetAllCachePaths(System.Collections.Generic.List`1&lt;System.String&gt;)\">\n      <summary>\n        <para>Returns all paths of the cache in the cache list.</para>\n      </summary>\n      <param name=\"cachePaths\">List of all the cache paths.</param>\n    </member>\n    <member name=\"M:UnityEngine.Caching.GetCacheAt(System.Int32)\">\n      <summary>\n        <para>Returns the Cache at the given position in the cache list.</para>\n      </summary>\n      <param name=\"cacheIndex\">Index of the cache to get.</param>\n      <returns>\n        <para>A reference to the Cache at the index specified.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Caching.GetCacheByPath(System.String)\">\n      <summary>\n        <para>Returns the Cache that has the given cache path.</para>\n      </summary>\n      <param name=\"cachePath\">The cache path.</param>\n      <returns>\n        <para>A reference to the Cache with the given path.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Caching.GetCachedVersions(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Hash128&gt;)\">\n      <summary>\n        <para>Returns all cached versions of the given AssetBundle.</para>\n      </summary>\n      <param name=\"assetBundleName\">The AssetBundle name.</param>\n      <param name=\"outCachedVersions\">List of all the cached version.</param>\n    </member>\n    <member name=\"M:UnityEngine.Caching.IsVersionCached(System.String,System.Int32)\">\n      <summary>\n        <para>Checks if an AssetBundle is cached.</para>\n      </summary>\n      <param name=\"string\">Url The filename of the AssetBundle. Domain and path information are stripped from this string automatically.</param>\n      <param name=\"int\">Version The version number of the AssetBundle to check for. Negative values are not allowed.</param>\n      <param name=\"url\"></param>\n      <param name=\"version\"></param>\n      <returns>\n        <para>True if an AssetBundle matching the url and version parameters has previously been loaded using UnityWebRequestAssetBundle.GetAssetBundle() and is currently stored in the cache. Returns false if the AssetBundle is not in cache, either because it has been flushed from the cache or was never loaded using the Caching API.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Caching.MarkAsUsed(System.String,System.Int32)\">\n      <summary>\n        <para>Bumps the timestamp of a cached file to be the current time.</para>\n      </summary>\n      <param name=\"url\"></param>\n      <param name=\"version\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Caching.MoveCacheAfter(UnityEngine.Cache,UnityEngine.Cache)\">\n      <summary>\n        <para>Moves the source Cache after the destination Cache in the cache list.</para>\n      </summary>\n      <param name=\"src\">The Cache to move.</param>\n      <param name=\"dst\">The Cache which should come before the source Cache in the cache list.</param>\n    </member>\n    <member name=\"M:UnityEngine.Caching.MoveCacheBefore(UnityEngine.Cache,UnityEngine.Cache)\">\n      <summary>\n        <para>Moves the source Cache before the destination Cache in the cache list.</para>\n      </summary>\n      <param name=\"src\">The Cache to move.</param>\n      <param name=\"dst\">The Cache which should come after the source Cache in the cache list.</param>\n    </member>\n    <member name=\"M:UnityEngine.Caching.RemoveCache(UnityEngine.Cache)\">\n      <summary>\n        <para>Removes the Cache from cache list.</para>\n      </summary>\n      <param name=\"cache\">The Cache to be removed.</param>\n      <returns>\n        <para>Returns true if the Cache is removed.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Camera\">\n      <summary>\n        <para>A Camera is a device through which the player views the world.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.activeTexture\">\n      <summary>\n        <para>Gets the temporary RenderTexture target for this Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.actualRenderingPath\">\n      <summary>\n        <para>The rendering path that is currently being used (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.allCameras\">\n      <summary>\n        <para>Returns all enabled cameras in the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.allCamerasCount\">\n      <summary>\n        <para>The number of cameras in the current scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.allowDynamicResolution\">\n      <summary>\n        <para>Dynamic Resolution Scaling.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.allowHDR\">\n      <summary>\n        <para>High dynamic range rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.allowMSAA\">\n      <summary>\n        <para>MSAA rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.areVRStereoViewMatricesWithinSingleCullTolerance\">\n      <summary>\n        <para>Determines whether the stereo view matrices are suitable to allow for a single pass cull.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.aspect\">\n      <summary>\n        <para>The aspect ratio (width divided by height).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.backgroundColor\">\n      <summary>\n        <para>The color with which the screen will be cleared.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.cameraToWorldMatrix\">\n      <summary>\n        <para>Matrix that transforms from camera space to world space (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.cameraType\">\n      <summary>\n        <para>Identifies what kind of camera this is.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.clearFlags\">\n      <summary>\n        <para>How the camera clears the background.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.clearStencilAfterLightingPass\">\n      <summary>\n        <para>Should the camera clear the stencil buffer after the deferred light pass?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.commandBufferCount\">\n      <summary>\n        <para>Number of command buffers set up on this camera (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.cullingMask\">\n      <summary>\n        <para>This is used to render parts of the scene selectively.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.cullingMatrix\">\n      <summary>\n        <para>Sets a custom matrix for the camera to use for all culling queries.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.current\">\n      <summary>\n        <para>The camera we are currently rendering with, for low-level render control only (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.depth\">\n      <summary>\n        <para>Camera's depth in the camera rendering order.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.depthTextureMode\">\n      <summary>\n        <para>How and if camera generates a depth texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.eventMask\">\n      <summary>\n        <para>Mask to select which layers can trigger events on the camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.farClipPlane\">\n      <summary>\n        <para>The far clipping plane distance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.fieldOfView\">\n      <summary>\n        <para>The field of view of the camera in degrees.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.focalLength\">\n      <summary>\n        <para>The camera focal length, expressed in millimeters. To use this property, enable UsePhysicalProperties.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.forceIntoRenderTexture\">\n      <summary>\n        <para>Should camera rendering be forced into a RenderTexture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.hdr\">\n      <summary>\n        <para>High dynamic range rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.layerCullDistances\">\n      <summary>\n        <para>Per-layer culling distances.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.layerCullSpherical\">\n      <summary>\n        <para>How to perform per-layer culling for a Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.lensShift\">\n      <summary>\n        <para>The lens offset of the camera. The lens shift is relative to the sensor size. For example, a lens shift of 0.5 offsets the sensor by half its horizontal size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.main\">\n      <summary>\n        <para>The first enabled camera tagged \"MainCamera\" (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.nearClipPlane\">\n      <summary>\n        <para>The near clipping plane distance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.nonJitteredProjectionMatrix\">\n      <summary>\n        <para>Get or set the raw projection matrix with no camera offset (no jittering).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Camera.onPostRender\">\n      <summary>\n        <para>Event that is fired after any camera finishes rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Camera.onPreCull\">\n      <summary>\n        <para>Event that is fired before any camera starts culling.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Camera.onPreRender\">\n      <summary>\n        <para>Event that is fired before any camera starts rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.opaqueSortMode\">\n      <summary>\n        <para>Opaque object sorting mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.orthographic\">\n      <summary>\n        <para>Is the camera orthographic (true) or perspective (false)?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.orthographicSize\">\n      <summary>\n        <para>Camera's half-size when in orthographic mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.pixelHeight\">\n      <summary>\n        <para>How tall is the camera in pixels (not accounting for dynamic resolution scaling) (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.pixelRect\">\n      <summary>\n        <para>Where on the screen is the camera rendered in pixel coordinates.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.pixelWidth\">\n      <summary>\n        <para>How wide is the camera in pixels (not accounting for dynamic resolution scaling) (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.previousViewProjectionMatrix\">\n      <summary>\n        <para>Get the view projection matrix used on the last frame.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.projectionMatrix\">\n      <summary>\n        <para>Set a custom projection matrix.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.rect\">\n      <summary>\n        <para>Where on the screen is the camera rendered in normalized coordinates.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.renderingPath\">\n      <summary>\n        <para>The rendering path that should be used, if possible.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.scaledPixelHeight\">\n      <summary>\n        <para>How tall is the camera in pixels (accounting for dynamic resolution scaling) (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.scaledPixelWidth\">\n      <summary>\n        <para>How wide is the camera in pixels (accounting for dynamic resolution scaling) (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.scene\">\n      <summary>\n        <para>If not null, the camera will only render the contents of the specified scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.sensorSize\">\n      <summary>\n        <para>The size of the camera sensor, expressed in millimeters.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.stereoActiveEye\">\n      <summary>\n        <para>Returns the eye that is currently rendering.\nIf called when stereo is not enabled it will return Camera.MonoOrStereoscopicEye.Mono.\n\nIf called during a camera rendering callback such as OnRenderImage it will return the currently rendering eye.\n\nIf called outside of a rendering callback and stereo is enabled, it will return the default eye which is Camera.MonoOrStereoscopicEye.Left.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.stereoConvergence\">\n      <summary>\n        <para>Distance to a point where virtual eyes converge.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.stereoEnabled\">\n      <summary>\n        <para>Stereoscopic rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.stereoMirrorMode\">\n      <summary>\n        <para>Render only once and use resulting image for both eyes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.stereoSeparation\">\n      <summary>\n        <para>The distance between the virtual eyes. Use this to query or set the current eye separation. Note that most VR devices provide this value, in which case setting the value will have no effect.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.stereoTargetEye\">\n      <summary>\n        <para>Defines which eye of a VR display the Camera renders into.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.targetDisplay\">\n      <summary>\n        <para>Set the target display for this Camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.targetTexture\">\n      <summary>\n        <para>Destination render texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.transparencySortAxis\">\n      <summary>\n        <para>An axis that describes the direction along which the distances of objects are measured for the purpose of sorting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.transparencySortMode\">\n      <summary>\n        <para>Transparent object sorting mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.useJitteredProjectionMatrixForTransparentRendering\">\n      <summary>\n        <para>Should the jittered matrix be used for transparency rendering?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.useOcclusionCulling\">\n      <summary>\n        <para>Whether or not the Camera will use occlusion culling during rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.usePhysicalProperties\">\n      <summary>\n        <para>Enable [UsePhysicalProperties] to use physical camera properties to compute the field of view and the frustum.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.velocity\">\n      <summary>\n        <para>Get the world-space speed of the camera (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Camera.worldToCameraMatrix\">\n      <summary>\n        <para>Matrix that transforms from world to camera space.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Camera.AddCommandBuffer(UnityEngine.Rendering.CameraEvent,UnityEngine.Rendering.CommandBuffer)\">\n      <summary>\n        <para>Add a command buffer to be executed at a specified place.</para>\n      </summary>\n      <param name=\"evt\">When to execute the command buffer during rendering.</param>\n      <param name=\"buffer\">The buffer to execute.</param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.AddCommandBufferAsync(UnityEngine.Rendering.CameraEvent,UnityEngine.Rendering.CommandBuffer,UnityEngine.Rendering.ComputeQueueType)\">\n      <summary>\n        <para>Adds a command buffer to the GPU's async compute queues and executes that command buffer when graphics processing reaches a given point.</para>\n      </summary>\n      <param name=\"evt\">The point during the graphics processing at which this command buffer should commence on the GPU.</param>\n      <param name=\"buffer\">The buffer to execute.</param>\n      <param name=\"queueType\">The desired async compute queue type to execute the buffer on.</param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.CalculateFrustumCorners(UnityEngine.Rect,System.Single,UnityEngine.Camera/MonoOrStereoscopicEye,UnityEngine.Vector3[])\">\n      <summary>\n        <para>Given viewport coordinates, calculates the view space vectors pointing to the four frustum corners at the specified camera depth.</para>\n      </summary>\n      <param name=\"viewport\">Normalized viewport coordinates to use for the frustum calculation.</param>\n      <param name=\"z\">Z-depth from the camera origin at which the corners will be calculated.</param>\n      <param name=\"eye\">Camera eye projection matrix to use.</param>\n      <param name=\"outCorners\">Output array for the frustum corner vectors. Cannot be null and length must be &gt;= 4.</param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.CalculateObliqueMatrix(UnityEngine.Vector4)\">\n      <summary>\n        <para>Calculates and returns oblique near-plane projection matrix.</para>\n      </summary>\n      <param name=\"clipPlane\">Vector4 that describes a clip plane.</param>\n      <returns>\n        <para>Oblique near-plane projection matrix.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Camera.CameraCallback\">\n      <summary>\n        <para>Delegate type for camera callbacks.</para>\n      </summary>\n      <param name=\"cam\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.CopyFrom(UnityEngine.Camera)\">\n      <summary>\n        <para>Makes this camera's settings match other camera.</para>\n      </summary>\n      <param name=\"other\">Copy camera settings to the other camera.</param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.CopyStereoDeviceProjectionMatrixToNonJittered(UnityEngine.Camera/StereoscopicEye)\">\n      <summary>\n        <para>Sets the non-jittered projection matrix, sourced from the VR SDK.</para>\n      </summary>\n      <param name=\"eye\">Specifies the stereoscopic eye whose non-jittered projection matrix will be sourced from the VR SDK.</param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.FocalLengthToFOV(System.Single,System.Single)\">\n      <summary>\n        <para>Converts focal length to field of view.</para>\n      </summary>\n      <param name=\"focalLength\">Focal length in millimeters.</param>\n      <param name=\"sensorSize\">Sensor size in millimeters. Use sensor height to get vertical field of view. Use sensor width to get horizontal field of view.</param>\n      <returns>\n        <para>Field of view in degrees.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Camera.FOVToFocalLength(System.Single,System.Single)\">\n      <summary>\n        <para>Converts field of view to focal length. Use either sensor height and vertical field of view, or sensor width and horizontal field of view.</para>\n      </summary>\n      <param name=\"fov\">Field of view in degrees.</param>\n      <param name=\"sensorSize\">Sensor size in millimeters.</param>\n      <returns>\n        <para>Focal length in millimeters.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Camera.GetAllCameras(UnityEngine.Camera[])\">\n      <summary>\n        <para>Fills an array of Camera with the current cameras in the scene, without allocating a new array.</para>\n      </summary>\n      <param name=\"cameras\">An array to be filled up with cameras currently in the scene.</param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.GetCommandBuffers(UnityEngine.Rendering.CameraEvent)\">\n      <summary>\n        <para>Get command buffers to be executed at a specified place.</para>\n      </summary>\n      <param name=\"evt\">When to execute the command buffer during rendering.</param>\n      <returns>\n        <para>Array of command buffers.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Camera.GetStereoNonJitteredProjectionMatrix(UnityEngine.Camera/StereoscopicEye)\">\n      <summary>\n        <para>Gets the non-jittered projection matrix of a specific left or right stereoscopic eye.</para>\n      </summary>\n      <param name=\"eye\">Specifies the stereoscopic eye whose non-jittered projection matrix needs to be returned.</param>\n      <returns>\n        <para>The non-jittered projection matrix of the specified stereoscopic eye.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Camera.GetStereoProjectionMatrix(UnityEngine.Camera/StereoscopicEye)\">\n      <summary>\n        <para>Gets the projection matrix of a specific left or right stereoscopic eye.</para>\n      </summary>\n      <param name=\"eye\">Specifies the stereoscopic eye whose projection matrix needs to be returned.</param>\n      <returns>\n        <para>The projection matrix of the specified stereoscopic eye.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Camera.GetStereoViewMatrix(UnityEngine.Camera/StereoscopicEye)\">\n      <summary>\n        <para>Gets the left or right view matrix of a specific stereoscopic eye.</para>\n      </summary>\n      <param name=\"eye\">Specifies the stereoscopic eye whose view matrix needs to be returned.</param>\n      <returns>\n        <para>The view matrix of the specified stereoscopic eye.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Camera.MonoOrStereoscopicEye\">\n      <summary>\n        <para>A Camera eye corresponding to the left or right human eye for stereoscopic rendering, or neither for non-stereoscopic rendering.\n\nA single Camera can render both left and right views in a single frame. Therefore, this enum describes which eye the Camera is currently rendering when returned by Camera.stereoActiveEye during a rendering callback (such as Camera.OnRenderImage), or which eye to act on when passed into a function.\n\nThe default value is Camera.MonoOrStereoscopicEye.Left, so Camera.MonoOrStereoscopicEye.Left may be returned by some methods or properties when called outside of rendering if stereoscopic rendering is enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Camera.MonoOrStereoscopicEye.Left\">\n      <summary>\n        <para>Camera eye corresponding to stereoscopic rendering of the left eye.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Camera.MonoOrStereoscopicEye.Mono\">\n      <summary>\n        <para>Camera eye corresponding to non-stereoscopic rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Camera.MonoOrStereoscopicEye.Right\">\n      <summary>\n        <para>Camera eye corresponding to stereoscopic rendering of the right eye.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Camera.RemoveAllCommandBuffers\">\n      <summary>\n        <para>Remove all command buffers set on this camera.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Camera.RemoveCommandBuffer(UnityEngine.Rendering.CameraEvent,UnityEngine.Rendering.CommandBuffer)\">\n      <summary>\n        <para>Remove command buffer from execution at a specified place.</para>\n      </summary>\n      <param name=\"evt\">When to execute the command buffer during rendering.</param>\n      <param name=\"buffer\">The buffer to execute.</param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.RemoveCommandBuffers(UnityEngine.Rendering.CameraEvent)\">\n      <summary>\n        <para>Remove command buffers from execution at a specified place.</para>\n      </summary>\n      <param name=\"evt\">When to execute the command buffer during rendering.</param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.Render\">\n      <summary>\n        <para>Render the camera manually.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Camera.RenderToCubemap(UnityEngine.Cubemap,System.Int32)\">\n      <summary>\n        <para>Render into a static cubemap from this camera.</para>\n      </summary>\n      <param name=\"cubemap\">The cube map to render to.</param>\n      <param name=\"faceMask\">A bitmask which determines which of the six faces are rendered to.</param>\n      <returns>\n        <para>False if rendering fails, else true.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Camera.RenderToCubemap(UnityEngine.RenderTexture,System.Int32)\">\n      <summary>\n        <para>Render into a cubemap from this camera.</para>\n      </summary>\n      <param name=\"faceMask\">A bitfield indicating which cubemap faces should be rendered into.</param>\n      <param name=\"cubemap\">The texture to render to.</param>\n      <returns>\n        <para>False if rendering fails, else true.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Camera.RenderToCubemap(UnityEngine.RenderTexture,System.Int32,UnityEngine.Camera/MonoOrStereoscopicEye)\">\n      <summary>\n        <para>Render one side of a stereoscopic 360-degree image into a cubemap from this camera.</para>\n      </summary>\n      <param name=\"cubemap\">The texture to render to.</param>\n      <param name=\"faceMask\">A bitfield indicating which cubemap faces should be rendered into. Set to the integer value 63 to render all faces.</param>\n      <param name=\"stereoEye\">A Camera eye corresponding to the left or right eye for stereoscopic rendering, or neither for non-stereoscopic rendering.</param>\n      <returns>\n        <para>False if rendering fails, else true.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Camera.RenderWithShader(UnityEngine.Shader,System.String)\">\n      <summary>\n        <para>Render the camera with shader replacement.</para>\n      </summary>\n      <param name=\"shader\"></param>\n      <param name=\"replacementTag\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.Reset\">\n      <summary>\n        <para>Revert all camera parameters to default.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Camera.ResetAspect\">\n      <summary>\n        <para>Revert the aspect ratio to the screen's aspect ratio.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Camera.ResetCullingMatrix\">\n      <summary>\n        <para>Make culling queries reflect the camera's built in parameters.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Camera.ResetFieldOfView\">\n      <summary>\n        <para>Reset to the default field of view.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Camera.ResetProjectionMatrix\">\n      <summary>\n        <para>Make the projection reflect normal camera's parameters.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Camera.ResetReplacementShader\">\n      <summary>\n        <para>Remove shader replacement from camera.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Camera.ResetStereoProjectionMatrices\">\n      <summary>\n        <para>Reset the camera to using the Unity computed projection matrices for all stereoscopic eyes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Camera.ResetStereoViewMatrices\">\n      <summary>\n        <para>Reset the camera to using the Unity computed view matrices for all stereoscopic eyes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Camera.ResetTransparencySortSettings\">\n      <summary>\n        <para>Resets this Camera's transparency sort settings to the default. Default transparency settings are taken from GraphicsSettings instead of directly from this Camera.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Camera.ResetWorldToCameraMatrix\">\n      <summary>\n        <para>Make the rendering position reflect the camera's position in the scene.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Camera.ScreenPointToRay(UnityEngine.Vector3)\">\n      <summary>\n        <para>Returns a ray going from camera through a screen point.</para>\n      </summary>\n      <param name=\"eye\">Optional argument that can be used to specify which eye transform to use. Default is Mono.</param>\n      <param name=\"pos\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.ScreenPointToRay(UnityEngine.Vector3,UnityEngine.Camera/MonoOrStereoscopicEye)\">\n      <summary>\n        <para>Returns a ray going from camera through a screen point.</para>\n      </summary>\n      <param name=\"eye\">Optional argument that can be used to specify which eye transform to use. Default is Mono.</param>\n      <param name=\"pos\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.ScreenToViewportPoint(UnityEngine.Vector3)\">\n      <summary>\n        <para>Transforms position from screen space into viewport space.</para>\n      </summary>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.ScreenToWorldPoint(UnityEngine.Vector3)\">\n      <summary>\n        <para>Transforms position from screen space into world space.</para>\n      </summary>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.SetReplacementShader(UnityEngine.Shader,System.String)\">\n      <summary>\n        <para>Make the camera render with shader replacement.</para>\n      </summary>\n      <param name=\"shader\"></param>\n      <param name=\"replacementTag\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.SetStereoProjectionMatrices(UnityEngine.Matrix4x4,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Sets custom projection matrices for both the left and right stereoscopic eyes.</para>\n      </summary>\n      <param name=\"leftMatrix\">Projection matrix for the stereoscopic left eye.</param>\n      <param name=\"rightMatrix\">Projection matrix for the stereoscopic right eye.</param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.SetStereoProjectionMatrix(UnityEngine.Camera/StereoscopicEye,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Sets a custom projection matrix for a specific stereoscopic eye.</para>\n      </summary>\n      <param name=\"eye\">Specifies the stereoscopic eye whose projection matrix needs to be set.</param>\n      <param name=\"matrix\">The matrix to be set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.SetStereoViewMatrices(UnityEngine.Matrix4x4,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Set custom view matrices for both eyes.</para>\n      </summary>\n      <param name=\"leftMatrix\">View matrix for the stereo left eye.</param>\n      <param name=\"rightMatrix\">View matrix for the stereo right eye.</param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.SetStereoViewMatrix(UnityEngine.Camera/StereoscopicEye,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Sets a custom view matrix for a specific stereoscopic eye.</para>\n      </summary>\n      <param name=\"eye\">Specifies the stereoscopic view matrix to set.</param>\n      <param name=\"matrix\">The matrix to be set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.SetTargetBuffers(UnityEngine.RenderBuffer,UnityEngine.RenderBuffer)\">\n      <summary>\n        <para>Sets the Camera to render to the chosen buffers of one or more RenderTextures.</para>\n      </summary>\n      <param name=\"colorBuffer\">The RenderBuffer(s) to which color information will be rendered.</param>\n      <param name=\"depthBuffer\">The RenderBuffer to which depth information will be rendered.</param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.SetTargetBuffers(UnityEngine.RenderBuffer[],UnityEngine.RenderBuffer)\">\n      <summary>\n        <para>Sets the Camera to render to the chosen buffers of one or more RenderTextures.</para>\n      </summary>\n      <param name=\"colorBuffer\">The RenderBuffer(s) to which color information will be rendered.</param>\n      <param name=\"depthBuffer\">The RenderBuffer to which depth information will be rendered.</param>\n    </member>\n    <member name=\"T:UnityEngine.Camera.StereoscopicEye\">\n      <summary>\n        <para>Enum used to specify either the left or the right eye of a stereoscopic camera.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Camera.StereoscopicEye.Left\">\n      <summary>\n        <para>Specifies the target to be the left eye.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Camera.StereoscopicEye.Right\">\n      <summary>\n        <para>Specifies the target to be the right eye.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Camera.ViewportPointToRay(UnityEngine.Vector3)\">\n      <summary>\n        <para>Returns a ray going from camera through a viewport point.</para>\n      </summary>\n      <param name=\"eye\">Optional argument that can be used to specify which eye transform to use. Default is Mono.</param>\n      <param name=\"pos\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.ViewportPointToRay(UnityEngine.Vector3,UnityEngine.Camera/MonoOrStereoscopicEye)\">\n      <summary>\n        <para>Returns a ray going from camera through a viewport point.</para>\n      </summary>\n      <param name=\"eye\">Optional argument that can be used to specify which eye transform to use. Default is Mono.</param>\n      <param name=\"pos\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.ViewportToScreenPoint(UnityEngine.Vector3)\">\n      <summary>\n        <para>Transforms position from viewport space into screen space.</para>\n      </summary>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.ViewportToWorldPoint(UnityEngine.Vector3)\">\n      <summary>\n        <para>Transforms position from viewport space into world space.</para>\n      </summary>\n      <param name=\"position\">The 3d vector in Viewport space.</param>\n      <returns>\n        <para>The 3d vector in World space.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Camera.WorldToScreenPoint(UnityEngine.Vector3)\">\n      <summary>\n        <para>Transforms position from world space into screen space.</para>\n      </summary>\n      <param name=\"eye\">Optional argument that can be used to specify which eye transform to use. Default is Mono.</param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.WorldToScreenPoint(UnityEngine.Vector3,UnityEngine.Camera/MonoOrStereoscopicEye)\">\n      <summary>\n        <para>Transforms position from world space into screen space.</para>\n      </summary>\n      <param name=\"eye\">Optional argument that can be used to specify which eye transform to use. Default is Mono.</param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.WorldToViewportPoint(UnityEngine.Vector3)\">\n      <summary>\n        <para>Transforms position from world space into viewport space.</para>\n      </summary>\n      <param name=\"eye\">Optional argument that can be used to specify which eye transform to use. Default is Mono.</param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Camera.WorldToViewportPoint(UnityEngine.Vector3,UnityEngine.Camera/MonoOrStereoscopicEye)\">\n      <summary>\n        <para>Transforms position from world space into viewport space.</para>\n      </summary>\n      <param name=\"eye\">Optional argument that can be used to specify which eye transform to use. Default is Mono.</param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"T:UnityEngine.CameraClearFlags\">\n      <summary>\n        <para>Values for Camera.clearFlags, determining what to clear when rendering a Camera.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CameraClearFlags.Depth\">\n      <summary>\n        <para>Clear only the depth buffer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CameraClearFlags.Nothing\">\n      <summary>\n        <para>Don't clear anything.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CameraClearFlags.Skybox\">\n      <summary>\n        <para>Clear with the skybox.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CameraClearFlags.SolidColor\">\n      <summary>\n        <para>Clear with a background color.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CameraType\">\n      <summary>\n        <para>Describes different types of camera.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CameraType.Game\">\n      <summary>\n        <para>Used to indicate a regular in-game camera.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CameraType.Preview\">\n      <summary>\n        <para>Used to indicate a camera that is used for rendering previews in the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CameraType.Reflection\">\n      <summary>\n        <para>Used to indicate a camera that is used for rendering reflection probes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CameraType.SceneView\">\n      <summary>\n        <para>Used to indicate that a camera is used for rendering the Scene View in the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CameraType.VR\">\n      <summary>\n        <para>Used to indicate that a camera is used for rendering VR (in edit mode) in the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Canvas\">\n      <summary>\n        <para>Element that can be used for screen rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.additionalShaderChannels\">\n      <summary>\n        <para>Get or set the mask of additional shader channels to be used when creating the Canvas mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.cachedSortingLayerValue\">\n      <summary>\n        <para>Cached calculated value based upon SortingLayerID.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.isRootCanvas\">\n      <summary>\n        <para>Is this the root Canvas?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.normalizedSortingGridSize\">\n      <summary>\n        <para>The normalized grid size that the canvas will split the renderable area into.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.overridePixelPerfect\">\n      <summary>\n        <para>Allows for nested canvases to override pixelPerfect settings inherited from parent canvases.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.overrideSorting\">\n      <summary>\n        <para>Override the sorting of canvas.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.pixelPerfect\">\n      <summary>\n        <para>Force elements in the canvas to be aligned with pixels. Only applies with renderMode is Screen Space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.pixelRect\">\n      <summary>\n        <para>Get the render rect for the Canvas.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.planeDistance\">\n      <summary>\n        <para>How far away from the camera is the Canvas generated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.referencePixelsPerUnit\">\n      <summary>\n        <para>The number of pixels per unit that is considered the default.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.renderMode\">\n      <summary>\n        <para>Is the Canvas in World or Overlay mode?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.renderOrder\">\n      <summary>\n        <para>The render order in which the canvas is being emitted to the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.rootCanvas\">\n      <summary>\n        <para>Returns the Canvas closest to root, by checking through each parent and returning the last canvas found. If no other canvas is found then the canvas will return itself.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.scaleFactor\">\n      <summary>\n        <para>Used to scale the entire canvas, while still making it fit the screen. Only applies with renderMode is Screen Space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.sortingGridNormalizedSize\">\n      <summary>\n        <para>The normalized grid size that the canvas will split the renderable area into.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.sortingLayerID\">\n      <summary>\n        <para>Unique ID of the Canvas' sorting layer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.sortingLayerName\">\n      <summary>\n        <para>Name of the Canvas' sorting layer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.sortingOrder\">\n      <summary>\n        <para>Canvas' order within a sorting layer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.targetDisplay\">\n      <summary>\n        <para>For Overlay mode, display index on which the UI canvas will appear.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Canvas.willRenderCanvases(UnityEngine.Canvas/WillRenderCanvases)\">\n      <summary>\n        <para>Event that is called just before Canvas rendering happens.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Canvas.worldCamera\">\n      <summary>\n        <para>Camera used for sizing the Canvas when in Screen Space - Camera. Also used as the Camera that events will be sent through for a World Space [[Canvas].</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Canvas.ForceUpdateCanvases\">\n      <summary>\n        <para>Force all canvases to update their content.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Canvas.GetDefaultCanvasMaterial\">\n      <summary>\n        <para>Returns the default material that can be used for rendering normal elements on the Canvas.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Canvas.GetDefaultCanvasTextMaterial\">\n      <summary>\n        <para>Returns the default material that can be used for rendering text elements on the Canvas.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Canvas.GetETC1SupportedCanvasMaterial\">\n      <summary>\n        <para>Gets or generates the ETC1 Material.</para>\n      </summary>\n      <returns>\n        <para>The generated ETC1 Material from the Canvas.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.CanvasGroup\">\n      <summary>\n        <para>A Canvas placable element that can be used to modify children Alpha, Raycasting, Enabled state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CanvasGroup.alpha\">\n      <summary>\n        <para>Set the alpha of the group.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CanvasGroup.blocksRaycasts\">\n      <summary>\n        <para>Does this group block raycasting (allow collision).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CanvasGroup.ignoreParentGroups\">\n      <summary>\n        <para>Should the group ignore parent groups?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CanvasGroup.interactable\">\n      <summary>\n        <para>Is the group interactable (are the elements beneath the group enabled).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CanvasGroup.IsRaycastLocationValid(UnityEngine.Vector2,UnityEngine.Camera)\">\n      <summary>\n        <para>Returns true if the Group allows raycasts.</para>\n      </summary>\n      <param name=\"sp\"></param>\n      <param name=\"eventCamera\"></param>\n    </member>\n    <member name=\"T:UnityEngine.CanvasRenderer\">\n      <summary>\n        <para>A component that will render to the screen after all normal rendering has completed when attached to a Canvas. Designed for GUI application.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CanvasRenderer.absoluteDepth\">\n      <summary>\n        <para>Depth of the renderer relative to the root canvas.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CanvasRenderer.cull\">\n      <summary>\n        <para>Indicates whether geometry emitted by this renderer is ignored.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CanvasRenderer.cullTransparentMesh\">\n      <summary>\n        <para>Indicates whether geometry emitted by this renderer can be ignored when the vertex color alpha is close to zero for every vertex of the mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CanvasRenderer.hasMoved\">\n      <summary>\n        <para>True if any change has occured that would invalidate the positions of generated geometry.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CanvasRenderer.hasPopInstruction\">\n      <summary>\n        <para>Enable 'render stack' pop draw call.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CanvasRenderer.hasRectClipping\">\n      <summary>\n        <para>True if rect clipping has been enabled on this renderer.\nSee Also: CanvasRenderer.EnableRectClipping, CanvasRenderer.DisableRectClipping.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CanvasRenderer.isMask\">\n      <summary>\n        <para>Is the UIRenderer a mask component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CanvasRenderer.materialCount\">\n      <summary>\n        <para>The number of materials usable by this renderer.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.CanvasRenderer.onRequestRebuild(UnityEngine.CanvasRenderer/OnRequestRebuild)\">\n      <summary>\n        <para>(Editor Only) Event that gets fired whenever the data in the CanvasRenderer gets invalidated and needs to be rebuilt.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.CanvasRenderer.popMaterialCount\">\n      <summary>\n        <para>The number of materials usable by this renderer. Used internally for masking.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CanvasRenderer.relativeDepth\">\n      <summary>\n        <para>Depth of the renderer realative to the parent canvas.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.AddUIVertexStream(System.Collections.Generic.List`1&lt;UnityEngine.UIVertex&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Color32&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Vector2&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Vector2&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Take the Vertex steam and split it corrisponding arrays (positions, colors, uv0s, uv1s, normals and tangents).</para>\n      </summary>\n      <param name=\"verts\">The UIVertex list to split.</param>\n      <param name=\"positions\">The destination list for the verts positions.</param>\n      <param name=\"colors\">The destination list for the verts colors.</param>\n      <param name=\"uv0S\">The destination list for the verts uv0s.</param>\n      <param name=\"uv1S\">The destination list for the verts uv1s.</param>\n      <param name=\"normals\">The destination list for the verts normals.</param>\n      <param name=\"tangents\">The destination list for the verts tangents.</param>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.Clear\">\n      <summary>\n        <para>Remove all cached vertices.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.CreateUIVertexStream(System.Collections.Generic.List`1&lt;UnityEngine.UIVertex&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Color32&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Vector2&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Vector2&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;,System.Collections.Generic.List`1&lt;System.Int32&gt;)\">\n      <summary>\n        <para>Convert a set of vertex components into a stream of UIVertex.</para>\n      </summary>\n      <param name=\"verts\"></param>\n      <param name=\"positions\"></param>\n      <param name=\"colors\"></param>\n      <param name=\"uv0S\"></param>\n      <param name=\"uv1S\"></param>\n      <param name=\"normals\"></param>\n      <param name=\"tangents\"></param>\n      <param name=\"indices\"></param>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.DisableRectClipping\">\n      <summary>\n        <para>Disables rectangle clipping for this CanvasRenderer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.EnableRectClipping(UnityEngine.Rect)\">\n      <summary>\n        <para>Enables rect clipping on the CanvasRendered. Geometry outside of the specified rect will be clipped (not rendered).</para>\n      </summary>\n      <param name=\"rect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.GetAlpha\">\n      <summary>\n        <para>Get the current alpha of the renderer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.GetColor\">\n      <summary>\n        <para>Get the current color of the renderer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.GetMaterial(System.Int32)\">\n      <summary>\n        <para>Gets the current Material assigned to the CanvasRenderer.</para>\n      </summary>\n      <param name=\"index\">The material index to retrieve (0 if this parameter is omitted).</param>\n      <returns>\n        <para>Result.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.GetMaterial\">\n      <summary>\n        <para>Gets the current Material assigned to the CanvasRenderer.</para>\n      </summary>\n      <param name=\"index\">The material index to retrieve (0 if this parameter is omitted).</param>\n      <returns>\n        <para>Result.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.GetPopMaterial(System.Int32)\">\n      <summary>\n        <para>Gets the current Material assigned to the CanvasRenderer. Used internally for masking.</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.SetAlpha(System.Single)\">\n      <summary>\n        <para>Set the alpha of the renderer. Will be multiplied with the UIVertex alpha and the Canvas alpha.</para>\n      </summary>\n      <param name=\"alpha\">Alpha.</param>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.SetAlphaTexture(UnityEngine.Texture)\">\n      <summary>\n        <para>The Alpha Texture that will be passed to the Shader under the _AlphaTex property.</para>\n      </summary>\n      <param name=\"texture\">The Texture to be passed.</param>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.SetColor(UnityEngine.Color)\">\n      <summary>\n        <para>Set the color of the renderer. Will be multiplied with the UIVertex color and the Canvas color.</para>\n      </summary>\n      <param name=\"color\">Renderer multiply color.</param>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.SetMaterial(UnityEngine.Material,System.Int32)\">\n      <summary>\n        <para>Set the material for the canvas renderer. If a texture is specified then it will be used as the 'MainTex' instead of the material's 'MainTex'.\nSee Also: CanvasRenderer.SetMaterialCount, CanvasRenderer.SetTexture.</para>\n      </summary>\n      <param name=\"material\">Material for rendering.</param>\n      <param name=\"texture\">Material texture overide.</param>\n      <param name=\"index\">Material index.</param>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.SetMaterial(UnityEngine.Material,UnityEngine.Texture)\">\n      <summary>\n        <para>Set the material for the canvas renderer. If a texture is specified then it will be used as the 'MainTex' instead of the material's 'MainTex'.\nSee Also: CanvasRenderer.SetMaterialCount, CanvasRenderer.SetTexture.</para>\n      </summary>\n      <param name=\"material\">Material for rendering.</param>\n      <param name=\"texture\">Material texture overide.</param>\n      <param name=\"index\">Material index.</param>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.SetMesh(UnityEngine.Mesh)\">\n      <summary>\n        <para>Sets the Mesh used by this renderer.</para>\n      </summary>\n      <param name=\"mesh\"></param>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.SetPopMaterial(UnityEngine.Material,System.Int32)\">\n      <summary>\n        <para>Set the material for the canvas renderer. Used internally for masking.</para>\n      </summary>\n      <param name=\"material\"></param>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.SetTexture(UnityEngine.Texture)\">\n      <summary>\n        <para>Sets the texture used by this renderer's material.</para>\n      </summary>\n      <param name=\"texture\"></param>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.SetVertices(System.Collections.Generic.List`1&lt;UnityEngine.UIVertex&gt;)\">\n      <summary>\n        <para>Set the vertices for the UIRenderer.</para>\n      </summary>\n      <param name=\"vertices\">Array of vertices to set.</param>\n      <param name=\"size\">Number of vertices to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.SetVertices(UnityEngine.UIVertex[],System.Int32)\">\n      <summary>\n        <para>Set the vertices for the UIRenderer.</para>\n      </summary>\n      <param name=\"vertices\">Array of vertices to set.</param>\n      <param name=\"size\">Number of vertices to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.CanvasRenderer.SplitUIVertexStreams(System.Collections.Generic.List`1&lt;UnityEngine.UIVertex&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Color32&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Vector2&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Vector2&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;,System.Collections.Generic.List`1&lt;System.Int32&gt;)\">\n      <summary>\n        <para>Given a list of UIVertex, split the stream into it's component types.</para>\n      </summary>\n      <param name=\"verts\"></param>\n      <param name=\"positions\"></param>\n      <param name=\"colors\"></param>\n      <param name=\"uv0S\"></param>\n      <param name=\"uv1S\"></param>\n      <param name=\"normals\"></param>\n      <param name=\"tangents\"></param>\n      <param name=\"indices\"></param>\n    </member>\n    <member name=\"T:UnityEngine.CapsuleCollider\">\n      <summary>\n        <para>A capsule-shaped primitive collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CapsuleCollider.center\">\n      <summary>\n        <para>The center of the capsule, measured in the object's local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CapsuleCollider.direction\">\n      <summary>\n        <para>The direction of the capsule.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CapsuleCollider.height\">\n      <summary>\n        <para>The height of the capsule meased in the object's local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CapsuleCollider.radius\">\n      <summary>\n        <para>The radius of the sphere, measured in the object's local space.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CapsuleCollider2D\">\n      <summary>\n        <para>A capsule-shaped primitive collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CapsuleCollider2D.direction\">\n      <summary>\n        <para>The direction that the capsule sides can extend.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CapsuleCollider2D.size\">\n      <summary>\n        <para>The width and height of the capsule area.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CapsuleDirection2D\">\n      <summary>\n        <para>The direction that the capsule sides can extend.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CapsuleDirection2D.Horizontal\">\n      <summary>\n        <para>The capsule sides extend horizontally.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CapsuleDirection2D.Vertical\">\n      <summary>\n        <para>The capsule sides extend vertically.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CharacterController\">\n      <summary>\n        <para>A CharacterController allows you to easily do movement constrained by collisions without having to deal with a rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterController.center\">\n      <summary>\n        <para>The center of the character's capsule relative to the transform's position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterController.collisionFlags\">\n      <summary>\n        <para>What part of the capsule collided with the environment during the last CharacterController.Move call.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterController.detectCollisions\">\n      <summary>\n        <para>Determines whether other rigidbodies or character controllers collide with this character controller (by default this is always enabled).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterController.enableOverlapRecovery\">\n      <summary>\n        <para>Enables or disables overlap recovery.\n Enables or disables overlap recovery. Used to depenetrate character controllers from static objects when an overlap is detected.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterController.height\">\n      <summary>\n        <para>The height of the character's capsule.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterController.isGrounded\">\n      <summary>\n        <para>Was the CharacterController touching the ground during the last move?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterController.minMoveDistance\">\n      <summary>\n        <para>Gets or sets the minimum move distance of the character controller.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterController.radius\">\n      <summary>\n        <para>The radius of the character's capsule.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterController.skinWidth\">\n      <summary>\n        <para>The character's collision skin width.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterController.slopeLimit\">\n      <summary>\n        <para>The character controllers slope limit in degrees.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterController.stepOffset\">\n      <summary>\n        <para>The character controllers step offset in meters.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterController.velocity\">\n      <summary>\n        <para>The current relative velocity of the Character (see notes).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CharacterController.Move(UnityEngine.Vector3)\">\n      <summary>\n        <para>A more complex move function taking absolute movement deltas.</para>\n      </summary>\n      <param name=\"motion\"></param>\n    </member>\n    <member name=\"M:UnityEngine.CharacterController.SimpleMove(UnityEngine.Vector3)\">\n      <summary>\n        <para>Moves the character with speed.</para>\n      </summary>\n      <param name=\"speed\"></param>\n    </member>\n    <member name=\"T:UnityEngine.CharacterInfo\">\n      <summary>\n        <para>Specification for how to render a character from the font texture. See Font.characterInfo.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterInfo.advance\">\n      <summary>\n        <para>The horizontal distance, rounded to the nearest integer, from the origin of this character to the origin of the next character.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterInfo.bearing\">\n      <summary>\n        <para>The horizontal distance from the origin of this glyph to the begining of the glyph image.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CharacterInfo.flipped\">\n      <summary>\n        <para>Is the character flipped?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterInfo.glyphHeight\">\n      <summary>\n        <para>The height of the glyph image.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterInfo.glyphWidth\">\n      <summary>\n        <para>The width of the glyph image.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CharacterInfo.index\">\n      <summary>\n        <para>Unicode value of the character.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterInfo.maxX\">\n      <summary>\n        <para>The maximum extend of the glyph image in the x-axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterInfo.maxY\">\n      <summary>\n        <para>The maximum extend of the glyph image in the y-axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterInfo.minX\">\n      <summary>\n        <para>The minium extend of the glyph image in the x-axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterInfo.minY\">\n      <summary>\n        <para>The minimum extend of the glyph image in the y-axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CharacterInfo.size\">\n      <summary>\n        <para>The size of the character or 0 if it is the default font size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CharacterInfo.style\">\n      <summary>\n        <para>The style of the character.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CharacterInfo.uv\">\n      <summary>\n        <para>UV coordinates for the character in the texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterInfo.uvBottomLeft\">\n      <summary>\n        <para>The uv coordinate matching the bottom left of the glyph image in the font texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterInfo.uvBottomRight\">\n      <summary>\n        <para>The uv coordinate matching the bottom right of the glyph image in the font texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterInfo.uvTopLeft\">\n      <summary>\n        <para>The uv coordinate matching the top left of the glyph image in the font texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterInfo.uvTopRight\">\n      <summary>\n        <para>The uv coordinate matching the top right of the glyph image in the font texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CharacterInfo.vert\">\n      <summary>\n        <para>Screen coordinates for the character in generated text meshes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CharacterInfo.width\">\n      <summary>\n        <para>How far to advance between the beginning of this charcater and the next.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CharacterJoint\">\n      <summary>\n        <para>Character Joints are mainly used for Ragdoll effects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterJoint.enableProjection\">\n      <summary>\n        <para>Brings violated constraints back into alignment even when the solver fails.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterJoint.highTwistLimit\">\n      <summary>\n        <para>The upper limit around the primary axis of the character joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterJoint.lowTwistLimit\">\n      <summary>\n        <para>The lower limit around the primary axis of the character joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterJoint.projectionAngle\">\n      <summary>\n        <para>Set the angular tolerance threshold (in degrees) for projection.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterJoint.projectionDistance\">\n      <summary>\n        <para>Set the linear tolerance threshold for projection.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterJoint.swing1Limit\">\n      <summary>\n        <para>The angular limit of rotation (in degrees) around the primary axis of the character joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterJoint.swing2Limit\">\n      <summary>\n        <para>The angular limit of rotation (in degrees) around the primary axis of the character joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterJoint.swingAxis\">\n      <summary>\n        <para>The secondary axis around which the joint can rotate.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterJoint.swingLimitSpring\">\n      <summary>\n        <para>The configuration of the spring attached to the swing limits of the joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CharacterJoint.twistLimitSpring\">\n      <summary>\n        <para>The configuration of the spring attached to the twist limits of the joint.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CircleCollider2D\">\n      <summary>\n        <para>Collider for 2D physics representing an circle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CircleCollider2D.center\">\n      <summary>\n        <para>The center point of the collider in local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CircleCollider2D.radius\">\n      <summary>\n        <para>Radius of the circle.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Cloth\">\n      <summary>\n        <para>The Cloth class provides an interface to cloth simulation physics.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.bendingStiffness\">\n      <summary>\n        <para>Bending stiffness of the cloth.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.capsuleColliders\">\n      <summary>\n        <para>An array of CapsuleColliders which this Cloth instance should collide with.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.clothSolverFrequency\">\n      <summary>\n        <para>Number of cloth solver iterations per second.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.coefficients\">\n      <summary>\n        <para>The cloth skinning coefficients used to set up how the cloth interacts with the skinned mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.collisionMassScale\">\n      <summary>\n        <para>How much to increase mass of colliding particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.damping\">\n      <summary>\n        <para>Damp cloth motion.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.enableContinuousCollision\">\n      <summary>\n        <para>Enable continuous collision to improve collision stability.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.enabled\">\n      <summary>\n        <para>Is this cloth enabled?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.externalAcceleration\">\n      <summary>\n        <para>A constant, external acceleration applied to the cloth.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.friction\">\n      <summary>\n        <para>The friction of the cloth when colliding with the character.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.normals\">\n      <summary>\n        <para>The current normals of the cloth object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.randomAcceleration\">\n      <summary>\n        <para>A random, external acceleration applied to the cloth.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.selfCollisionDistance\">\n      <summary>\n        <para>Minimum distance at which two cloth particles repel each other (default: 0.0).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.selfCollisionStiffness\">\n      <summary>\n        <para>Self-collision stiffness defines how strong the separating impulse should be for colliding particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.sleepThreshold\">\n      <summary>\n        <para>Cloth's sleep threshold.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.sphereColliders\">\n      <summary>\n        <para>An array of ClothSphereColliderPairs which this Cloth instance should collide with.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.stiffnessFrequency\">\n      <summary>\n        <para>Sets the stiffness frequency parameter.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.stretchingStiffness\">\n      <summary>\n        <para>Stretching stiffness of the cloth.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.useGravity\">\n      <summary>\n        <para>Should gravity affect the cloth simulation?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.useTethers\">\n      <summary>\n        <para>Use Tether Anchors.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.useVirtualParticles\">\n      <summary>\n        <para>Add one virtual particle per triangle to improve collision stability.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.vertices\">\n      <summary>\n        <para>The current vertex positions of the cloth object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.worldAccelerationScale\">\n      <summary>\n        <para>How much world-space acceleration of the character will affect cloth vertices.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cloth.worldVelocityScale\">\n      <summary>\n        <para>How much world-space movement of the character will affect cloth vertices.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Cloth.ClearTransformMotion\">\n      <summary>\n        <para>Clear the pending transform changes from affecting the cloth simulation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Cloth.GetSelfAndInterCollisionIndices(System.Collections.Generic.List`1&lt;System.UInt32&gt;)\">\n      <summary>\n        <para>Get list of particles to be used for self and inter collision.</para>\n      </summary>\n      <param name=\"indices\">List to be populated with cloth particle indices that are used for self and/or inter collision.</param>\n    </member>\n    <member name=\"M:UnityEngine.Cloth.GetVirtualParticleIndices(System.Collections.Generic.List`1&lt;System.UInt32&gt;)\">\n      <summary>\n        <para>Get list of indices to be used when generating virtual particles.</para>\n      </summary>\n      <param name=\"indices\">List to be populated with virtual particle indices.</param>\n    </member>\n    <member name=\"M:UnityEngine.Cloth.GetVirtualParticleWeights(System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;)\">\n      <summary>\n        <para>Get weights to be used when generating virtual particles for cloth.</para>\n      </summary>\n      <param name=\"weights\">List to populate with virtual particle weights.</param>\n    </member>\n    <member name=\"M:UnityEngine.Cloth.SetEnabledFading(System.Boolean,System.Single)\">\n      <summary>\n        <para>Fade the cloth simulation in or out.</para>\n      </summary>\n      <param name=\"enabled\">Fading enabled or not.</param>\n      <param name=\"interpolationTime\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Cloth.SetSelfAndInterCollisionIndices(System.Collections.Generic.List`1&lt;System.UInt32&gt;)\">\n      <summary>\n        <para>This allows you to set the cloth indices used for self and inter collision.</para>\n      </summary>\n      <param name=\"indices\">List of cloth particles indices to use for cloth self and/or inter collision.</param>\n    </member>\n    <member name=\"M:UnityEngine.Cloth.SetVirtualParticleIndices(System.Collections.Generic.List`1&lt;System.UInt32&gt;)\">\n      <summary>\n        <para>Set indices to use when generating virtual particles.</para>\n      </summary>\n      <param name=\"indices\">List of cloth particle indices to use when generating virtual particles.</param>\n    </member>\n    <member name=\"M:UnityEngine.Cloth.SetVirtualParticleWeights(System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;)\">\n      <summary>\n        <para>Sets weights to be used when generating virtual particles for cloth.</para>\n      </summary>\n      <param name=\"weights\">List of weights to be used when setting virutal particles for cloth.</param>\n    </member>\n    <member name=\"T:UnityEngine.ClothSkinningCoefficient\">\n      <summary>\n        <para>The ClothSkinningCoefficient struct is used to set up how a Cloth component is allowed to move with respect to the SkinnedMeshRenderer it is attached to.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ClothSkinningCoefficient.collisionSphereDistance\">\n      <summary>\n        <para>Definition of a sphere a vertex is not allowed to enter. This allows collision against the animated cloth.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ClothSkinningCoefficient.maxDistance\">\n      <summary>\n        <para>Distance a vertex is allowed to travel from the skinned mesh vertex position.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ClothSphereColliderPair\">\n      <summary>\n        <para>A pair of SphereColliders used to define shapes for Cloth objects to collide against.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ClothSphereColliderPair.first\">\n      <summary>\n        <para>The first SphereCollider of a ClothSphereColliderPair.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ClothSphereColliderPair.second\">\n      <summary>\n        <para>The second SphereCollider of a ClothSphereColliderPair.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ClothSphereColliderPair.#ctor(UnityEngine.SphereCollider)\">\n      <summary>\n        <para>Creates a ClothSphereColliderPair. If only one SphereCollider is given, the ClothSphereColliderPair will define a simple sphere. If two SphereColliders are given, the ClothSphereColliderPair defines a conic capsule shape, composed of the two spheres and the cone connecting the two.</para>\n      </summary>\n      <param name=\"a\">The first SphereCollider of a ClothSphereColliderPair.</param>\n      <param name=\"b\">The second SphereCollider of a ClothSphereColliderPair.</param>\n    </member>\n    <member name=\"M:UnityEngine.ClothSphereColliderPair.#ctor(UnityEngine.SphereCollider,UnityEngine.SphereCollider)\">\n      <summary>\n        <para>Creates a ClothSphereColliderPair. If only one SphereCollider is given, the ClothSphereColliderPair will define a simple sphere. If two SphereColliders are given, the ClothSphereColliderPair defines a conic capsule shape, composed of the two spheres and the cone connecting the two.</para>\n      </summary>\n      <param name=\"a\">The first SphereCollider of a ClothSphereColliderPair.</param>\n      <param name=\"b\">The second SphereCollider of a ClothSphereColliderPair.</param>\n    </member>\n    <member name=\"T:UnityEngine.ClusterInput\">\n      <summary>\n        <para>Interface for reading and writing inputs in a Unity Cluster.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ClusterInput.AddInput(System.String,System.String,System.String,System.Int32,UnityEngine.ClusterInputType)\">\n      <summary>\n        <para>Add a new VRPN input entry.</para>\n      </summary>\n      <param name=\"name\">Name of the input entry. This has to be unique.</param>\n      <param name=\"deviceName\">Device name registered to VRPN server.</param>\n      <param name=\"serverUrl\">URL to the vrpn server.</param>\n      <param name=\"index\">Index of the Input entry, refer to vrpn.cfg if unsure.</param>\n      <param name=\"type\">Type of the input.</param>\n      <returns>\n        <para>True if the operation succeed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ClusterInput.CheckConnectionToServer(System.String)\">\n      <summary>\n        <para>Check the connection status of the device to the VRPN server it connected to.</para>\n      </summary>\n      <param name=\"name\">Name of the input entry.</param>\n    </member>\n    <member name=\"M:UnityEngine.ClusterInput.EditInput(System.String,System.String,System.String,System.Int32,UnityEngine.ClusterInputType)\">\n      <summary>\n        <para>Edit an input entry which added via ClusterInput.AddInput.</para>\n      </summary>\n      <param name=\"name\">Name of the input entry. This has to be unique.</param>\n      <param name=\"deviceName\">Device name registered to VRPN server.</param>\n      <param name=\"serverUrl\">URL to the vrpn server.</param>\n      <param name=\"index\">Index of the Input entry, refer to vrpn.cfg if unsure.</param>\n      <param name=\"type\">Type of the ClusterInputType as follow.</param>\n    </member>\n    <member name=\"M:UnityEngine.ClusterInput.GetAxis(System.String)\">\n      <summary>\n        <para>Returns the axis value as a continous float.</para>\n      </summary>\n      <param name=\"name\">Name of input to poll.c.</param>\n    </member>\n    <member name=\"M:UnityEngine.ClusterInput.GetButton(System.String)\">\n      <summary>\n        <para>Returns the binary value of a button.</para>\n      </summary>\n      <param name=\"name\">Name of input to poll.</param>\n    </member>\n    <member name=\"M:UnityEngine.ClusterInput.GetTrackerPosition(System.String)\">\n      <summary>\n        <para>Return the position of a tracker as a Vector3.</para>\n      </summary>\n      <param name=\"name\">Name of input to poll.</param>\n    </member>\n    <member name=\"M:UnityEngine.ClusterInput.GetTrackerRotation(System.String)\">\n      <summary>\n        <para>Returns the rotation of a tracker as a Quaternion.</para>\n      </summary>\n      <param name=\"name\">Name of input to poll.</param>\n    </member>\n    <member name=\"M:UnityEngine.ClusterInput.SetAxis(System.String,System.Single)\">\n      <summary>\n        <para>Sets the axis value for this input. Only works for input typed Custom.</para>\n      </summary>\n      <param name=\"name\">Name of input to modify.</param>\n      <param name=\"value\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ClusterInput.SetButton(System.String,System.Boolean)\">\n      <summary>\n        <para>Sets the button value for this input. Only works for input typed Custom.</para>\n      </summary>\n      <param name=\"name\">Name of input to modify.</param>\n      <param name=\"value\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ClusterInput.SetTrackerPosition(System.String,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the tracker position for this input. Only works for input typed Custom.</para>\n      </summary>\n      <param name=\"name\">Name of input to modify.</param>\n      <param name=\"value\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ClusterInput.SetTrackerRotation(System.String,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Sets the tracker rotation for this input. Only works for input typed Custom.</para>\n      </summary>\n      <param name=\"name\">Name of input to modify.</param>\n      <param name=\"value\">Value to set.</param>\n    </member>\n    <member name=\"T:UnityEngine.ClusterInputType\">\n      <summary>\n        <para>Values to determine the type of input value to be expect from one entry of ClusterInput.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ClusterInputType.Axis\">\n      <summary>\n        <para>Device is an analog axis that provides continuous value represented by a float.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ClusterInputType.Button\">\n      <summary>\n        <para>Device that return a binary result of pressed or not pressed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ClusterInputType.CustomProvidedInput\">\n      <summary>\n        <para>A user customized input.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ClusterInputType.Tracker\">\n      <summary>\n        <para>Device that provide position and orientation values.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ClusterNetwork\">\n      <summary>\n        <para>A helper class that contains static method to inquire status of Unity Cluster.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ClusterNetwork.isDisconnected\">\n      <summary>\n        <para>Check whether the current instance is disconnected from the cluster network.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ClusterNetwork.isMasterOfCluster\">\n      <summary>\n        <para>Check whether the current instance is a master node in the cluster network.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ClusterNetwork.nodeIndex\">\n      <summary>\n        <para>To acquire or set the node index of the current machine from the cluster network.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Collider\">\n      <summary>\n        <para>A base class of all colliders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider.attachedRigidbody\">\n      <summary>\n        <para>The rigidbody the collider is attached to.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider.bounds\">\n      <summary>\n        <para>The world space bounding volume of the collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider.contactOffset\">\n      <summary>\n        <para>Contact offset value of this collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider.enabled\">\n      <summary>\n        <para>Enabled Colliders will collide with other Colliders, disabled Colliders won't.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider.isTrigger\">\n      <summary>\n        <para>Is the collider a trigger?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider.material\">\n      <summary>\n        <para>The material used by the collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider.sharedMaterial\">\n      <summary>\n        <para>The shared physic material of this collider.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Collider.ClosestPoint(UnityEngine.Vector3)\">\n      <summary>\n        <para>Returns a point on the collider that is closest to a given location.</para>\n      </summary>\n      <param name=\"position\">Location you want to find the closest point to.</param>\n      <returns>\n        <para>The point on the collider that is closest to the specified location.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Collider.ClosestPointOnBounds(UnityEngine.Vector3)\">\n      <summary>\n        <para>The closest point to the bounding box of the attached collider.</para>\n      </summary>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Collider.Raycast(UnityEngine.Ray,UnityEngine.RaycastHit&amp;,System.Single)\">\n      <summary>\n        <para>Casts a Ray that ignores all Colliders except this one.</para>\n      </summary>\n      <param name=\"ray\">The starting point and direction of the ray.</param>\n      <param name=\"hitInfo\">If true is returned, hitInfo will contain more information about where the collider was hit (See Also: RaycastHit).</param>\n      <param name=\"maxDistance\">The max length of the ray.</param>\n      <returns>\n        <para>True when the ray intersects any collider, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Collider2D\">\n      <summary>\n        <para>Parent class for collider types used with 2D gameplay.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider2D.attachedRigidbody\">\n      <summary>\n        <para>The Rigidbody2D attached to the Collider2D.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider2D.bounciness\">\n      <summary>\n        <para>Get the bounciness used by the collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider2D.bounds\">\n      <summary>\n        <para>The world space bounding area of the collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider2D.composite\">\n      <summary>\n        <para>Get the CompositeCollider2D that is available to be attached to the collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider2D.density\">\n      <summary>\n        <para>The density of the collider used to calculate its mass (when auto mass is enabled).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider2D.friction\">\n      <summary>\n        <para>Get the friction used by the collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider2D.isTrigger\">\n      <summary>\n        <para>Is this collider configured as a trigger?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider2D.offset\">\n      <summary>\n        <para>The local offset of the collider geometry.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider2D.shapeCount\">\n      <summary>\n        <para>The number of separate shaped regions in the collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider2D.sharedMaterial\">\n      <summary>\n        <para>The PhysicsMaterial2D that is applied to this collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider2D.usedByComposite\">\n      <summary>\n        <para>Sets whether the Collider will be used or not used by a CompositeCollider2D.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collider2D.usedByEffector\">\n      <summary>\n        <para>Whether the collider is used by an attached effector or not.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Collider2D.Cast(UnityEngine.Vector2,UnityEngine.RaycastHit2D[],System.Single,System.Boolean)\">\n      <summary>\n        <para>Casts the collider shape into the scene starting at the collider position ignoring the collider itself.</para>\n      </summary>\n      <param name=\"direction\">Vector representing the direction to cast the shape.</param>\n      <param name=\"results\">Array to receive results.</param>\n      <param name=\"distance\">Maximum distance over which to cast the shape.</param>\n      <param name=\"ignoreSiblingColliders\">Should colliders attached to the same Rigidbody2D (known as sibling colliders) be ignored?</param>\n      <returns>\n        <para>The number of results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Collider2D.Cast(UnityEngine.Vector2,UnityEngine.ContactFilter2D,UnityEngine.RaycastHit2D[],System.Single,System.Boolean)\">\n      <summary>\n        <para>Casts the collider shape into the scene starting at the collider position ignoring the collider itself.</para>\n      </summary>\n      <param name=\"direction\">Vector representing the direction to cast the shape.</param>\n      <param name=\"contactFilter\">Filter results defined by the contact filter.</param>\n      <param name=\"results\">Array to receive results.</param>\n      <param name=\"distance\">Maximum distance over which to cast the shape.</param>\n      <param name=\"ignoreSiblingColliders\">Should colliders attached to the same Rigidbody2D (known as sibling colliders) be ignored?</param>\n      <returns>\n        <para>The number of results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Collider2D.Distance(UnityEngine.Collider2D)\">\n      <summary>\n        <para>Calculates the minimum separation of this collider against another collider.</para>\n      </summary>\n      <param name=\"collider\">A collider used to calculate the minimum separation against this collider.</param>\n      <returns>\n        <para>The minimum separation of collider and this collider.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Collider2D.GetContacts(UnityEngine.ContactPoint2D[])\">\n      <summary>\n        <para>Retrieves all contact points for this collider.</para>\n      </summary>\n      <param name=\"contacts\">An array of ContactPoint2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of contacts placed in the contacts array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Collider2D.GetContacts(UnityEngine.Collider2D[])\">\n      <summary>\n        <para>Retrieves all colliders in contact with this collider.</para>\n      </summary>\n      <param name=\"colliders\">An array of Collider2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of contacts placed in the colliders array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Collider2D.GetContacts(UnityEngine.ContactFilter2D,UnityEngine.ContactPoint2D[])\">\n      <summary>\n        <para>Retrieves all contact points for this collider, with the results filtered by the ContactFilter2D.</para>\n      </summary>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <param name=\"contacts\">An array of ContactPoint2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of contacts placed in the contacts array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Collider2D.GetContacts(UnityEngine.ContactFilter2D,UnityEngine.Collider2D[])\">\n      <summary>\n        <para>Retrieves all colliders in contact with this collider, with the results filtered by the ContactFilter2D.</para>\n      </summary>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <param name=\"colliders\">An array of Collider2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of collidersplaced in the colliders array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Collider2D.IsTouching(UnityEngine.Collider2D)\">\n      <summary>\n        <para>Check whether this collider is touching the collider or not.</para>\n      </summary>\n      <param name=\"collider\">The collider to check if it is touching this collider.</param>\n      <returns>\n        <para>Whether this collider is touching the collider or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Collider2D.IsTouching(UnityEngine.Collider2D,UnityEngine.ContactFilter2D)\">\n      <summary>\n        <para>Check whether this collider is touching the collider or not with the results filtered by the ContactFilter2D.</para>\n      </summary>\n      <param name=\"collider\">The collider to check if it is touching this collider.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <returns>\n        <para>Whether this collider is touching the collider or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Collider2D.IsTouching(UnityEngine.ContactFilter2D)\">\n      <summary>\n        <para>Check whether this collider is touching other colliders or not with the results filtered by the ContactFilter2D.</para>\n      </summary>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <returns>\n        <para>Whether this collider is touching the collider or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Collider2D.IsTouchingLayers(System.Int32)\">\n      <summary>\n        <para>Checks whether this collider is touching any colliders on the specified layerMask or not.</para>\n      </summary>\n      <param name=\"layerMask\">Any colliders on any of these layers count as touching.</param>\n      <returns>\n        <para>Whether this collider is touching any collider on the specified layerMask or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Collider2D.OverlapCollider(UnityEngine.ContactFilter2D,UnityEngine.Collider2D[])\">\n      <summary>\n        <para>Get a list of all colliders that overlap this collider.</para>\n      </summary>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth.  Note that normal angle is not used for overlap testing.</param>\n      <param name=\"results\">The array to receive results.  The size of the array determines the maximum number of results that can be returned.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Collider2D.OverlapPoint(UnityEngine.Vector2)\">\n      <summary>\n        <para>Check if a collider overlaps a point in space.</para>\n      </summary>\n      <param name=\"point\">A point in world space.</param>\n      <returns>\n        <para>Does point overlap the collider?</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Collider2D.Raycast(UnityEngine.Vector2,UnityEngine.RaycastHit2D[],System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Casts a ray into the scene starting at the collider position ignoring the collider itself.</para>\n      </summary>\n      <param name=\"direction\">Vector representing the direction of the ray.</param>\n      <param name=\"results\">Array to receive results.</param>\n      <param name=\"distance\">Maximum distance over which to cast the ray.</param>\n      <param name=\"layerMask\">Filter to check objects only on specific layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than this value.</param>\n      <param name=\"contactFilter\">Filter results defined by the contact filter.</param>\n      <returns>\n        <para>The number of results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Collider2D.Raycast(UnityEngine.Vector2,UnityEngine.ContactFilter2D,UnityEngine.RaycastHit2D[],System.Single)\">\n      <summary>\n        <para>Casts a ray into the scene starting at the collider position ignoring the collider itself.</para>\n      </summary>\n      <param name=\"direction\">Vector representing the direction of the ray.</param>\n      <param name=\"results\">Array to receive results.</param>\n      <param name=\"distance\">Maximum distance over which to cast the ray.</param>\n      <param name=\"layerMask\">Filter to check objects only on specific layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than this value.</param>\n      <param name=\"contactFilter\">Filter results defined by the contact filter.</param>\n      <returns>\n        <para>The number of results returned.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.ColliderDistance2D\">\n      <summary>\n        <para>Represents the separation or overlap of two Collider2D.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ColliderDistance2D.distance\">\n      <summary>\n        <para>Gets the distance between two colliders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ColliderDistance2D.isOverlapped\">\n      <summary>\n        <para>Gets whether the distance represents an overlap or not.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ColliderDistance2D.isValid\">\n      <summary>\n        <para>Gets whether the distance is valid or not.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ColliderDistance2D.normal\">\n      <summary>\n        <para>A normalized vector that points from pointB to pointA.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ColliderDistance2D.pointA\">\n      <summary>\n        <para>A point on a Collider2D that is a specific distance away from pointB.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ColliderDistance2D.pointB\">\n      <summary>\n        <para>A point on a Collider2D that is a specific distance away from pointA.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Collision\">\n      <summary>\n        <para>Describes a collision.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collision.collider\">\n      <summary>\n        <para>The Collider we hit (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collision.contacts\">\n      <summary>\n        <para>The contact points generated by the physics engine.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collision.gameObject\">\n      <summary>\n        <para>The GameObject whose collider you are colliding with. (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collision.impulse\">\n      <summary>\n        <para>The total impulse applied to this contact pair to resolve the collision.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collision.relativeVelocity\">\n      <summary>\n        <para>The relative linear velocity of the two colliding objects (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collision.rigidbody\">\n      <summary>\n        <para>The Rigidbody we hit (Read Only). This is null if the object we hit is a collider with no rigidbody attached.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collision.transform\">\n      <summary>\n        <para>The Transform of the object we hit (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Collision2D\">\n      <summary>\n        <para>Collision details returned by 2D physics callback functions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collision2D.collider\">\n      <summary>\n        <para>The incoming Collider2D involved in the collision with the otherCollider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collision2D.contactCount\">\n      <summary>\n        <para>Gets the number of contacts for this collision.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collision2D.contacts\">\n      <summary>\n        <para>The specific points of contact with the incoming Collider2D. You should avoid using this as it produces memory garbage. Use GetContact or GetContacts instead.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collision2D.enabled\">\n      <summary>\n        <para>Indicates whether the collision response or reaction is enabled or disabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collision2D.gameObject\">\n      <summary>\n        <para>The incoming GameObject involved in the collision.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collision2D.otherCollider\">\n      <summary>\n        <para>The other Collider2D involved in the collision with the collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collision2D.otherRigidbody\">\n      <summary>\n        <para>The other Rigidbody2D involved in the collision with the rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collision2D.relativeVelocity\">\n      <summary>\n        <para>The relative linear velocity of the two colliding objects (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collision2D.rigidbody\">\n      <summary>\n        <para>The incoming Rigidbody2D involved in the collision with the otherRigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Collision2D.transform\">\n      <summary>\n        <para>The Transform of the incoming object involved in the collision.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Collision2D.GetContact(System.Int32)\">\n      <summary>\n        <para>Gets the contact point at the specified index.</para>\n      </summary>\n      <param name=\"index\">The index of the contact to retrieve.</param>\n      <returns>\n        <para>The contact at the specified index.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Collision2D.GetContacts(UnityEngine.ContactPoint2D[])\">\n      <summary>\n        <para>Retrieves all contact points in for contacts between collider and otherCollider.</para>\n      </summary>\n      <param name=\"contacts\">An array of ContactPoint2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of contacts placed in the contacts array.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.CollisionDetectionMode\">\n      <summary>\n        <para>The collision detection mode constants used for Rigidbody.collisionDetectionMode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CollisionDetectionMode.Continuous\">\n      <summary>\n        <para>Continuous collision detection is on for colliding with static mesh geometry.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CollisionDetectionMode.ContinuousDynamic\">\n      <summary>\n        <para>Continuous collision detection is on for colliding with static and dynamic geometry.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CollisionDetectionMode.Discrete\">\n      <summary>\n        <para>Continuous collision detection is off for this Rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CollisionDetectionMode2D\">\n      <summary>\n        <para>Controls how collisions are detected when a Rigidbody2D moves.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CollisionDetectionMode2D.Continuous\">\n      <summary>\n        <para>Ensures that all collisions are detected when a Rigidbody2D moves.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CollisionDetectionMode2D.Discrete\">\n      <summary>\n        <para>When a Rigidbody2D moves, only collisions at the new position are detected.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CollisionDetectionMode2D.None\">\n      <summary>\n        <para>This mode is obsolete.  You should use Discrete mode.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CollisionFlags\">\n      <summary>\n        <para>CollisionFlags is a bitmask returned by CharacterController.Move.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CollisionFlags.Above\">\n      <summary>\n        <para>CollisionFlags is a bitmask returned by CharacterController.Move.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CollisionFlags.Below\">\n      <summary>\n        <para>CollisionFlags is a bitmask returned by CharacterController.Move.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CollisionFlags.None\">\n      <summary>\n        <para>CollisionFlags is a bitmask returned by CharacterController.Move.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CollisionFlags.Sides\">\n      <summary>\n        <para>CollisionFlags is a bitmask returned by CharacterController.Move.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Color\">\n      <summary>\n        <para>Representation of RGBA colors.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Color.a\">\n      <summary>\n        <para>Alpha component of the color (0 is transparent, 1 is opaque).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Color.b\">\n      <summary>\n        <para>Blue component of the color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Color.black\">\n      <summary>\n        <para>Solid black. RGBA is (0, 0, 0, 1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Color.blue\">\n      <summary>\n        <para>Solid blue. RGBA is (0, 0, 1, 1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Color.clear\">\n      <summary>\n        <para>Completely transparent. RGBA is (0, 0, 0, 0).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Color.cyan\">\n      <summary>\n        <para>Cyan. RGBA is (0, 1, 1, 1).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Color.g\">\n      <summary>\n        <para>Green component of the color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Color.gamma\">\n      <summary>\n        <para>A version of the color that has had the gamma curve applied.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Color.gray\">\n      <summary>\n        <para>Gray. RGBA is (0.5, 0.5, 0.5, 1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Color.grayscale\">\n      <summary>\n        <para>The grayscale value of the color. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Color.green\">\n      <summary>\n        <para>Solid green. RGBA is (0, 1, 0, 1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Color.grey\">\n      <summary>\n        <para>English spelling for gray. RGBA is the same (0.5, 0.5, 0.5, 1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Color.linear\">\n      <summary>\n        <para>A linear value of an sRGB color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Color.magenta\">\n      <summary>\n        <para>Magenta. RGBA is (1, 0, 1, 1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Color.maxColorComponent\">\n      <summary>\n        <para>Returns the maximum color component value: Max(r,g,b).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Color.r\">\n      <summary>\n        <para>Red component of the color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Color.red\">\n      <summary>\n        <para>Solid red. RGBA is (1, 0, 0, 1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Color.white\">\n      <summary>\n        <para>Solid white. RGBA is (1, 1, 1, 1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Color.yellow\">\n      <summary>\n        <para>Yellow. RGBA is (1, 0.92, 0.016, 1), but the color is nice to look at!</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Color.#ctor(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Constructs a new Color with given r,g,b,a components.</para>\n      </summary>\n      <param name=\"r\">Red component.</param>\n      <param name=\"g\">Green component.</param>\n      <param name=\"b\">Blue component.</param>\n      <param name=\"a\">Alpha component.</param>\n    </member>\n    <member name=\"M:UnityEngine.Color.#ctor(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Constructs a new Color with given r,g,b components and sets a to 1.</para>\n      </summary>\n      <param name=\"r\">Red component.</param>\n      <param name=\"g\">Green component.</param>\n      <param name=\"b\">Blue component.</param>\n    </member>\n    <member name=\"M:UnityEngine.Color.HSVToRGB(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Creates an RGB colour from HSV input.</para>\n      </summary>\n      <param name=\"H\">Hue [0..1].</param>\n      <param name=\"S\">Saturation [0..1].</param>\n      <param name=\"V\">Value [0..1].</param>\n      <param name=\"hdr\">Output HDR colours. If true, the returned colour will not be clamped to [0..1].</param>\n      <returns>\n        <para>An opaque colour with HSV matching the input.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Color.HSVToRGB(System.Single,System.Single,System.Single,System.Boolean)\">\n      <summary>\n        <para>Creates an RGB colour from HSV input.</para>\n      </summary>\n      <param name=\"H\">Hue [0..1].</param>\n      <param name=\"S\">Saturation [0..1].</param>\n      <param name=\"V\">Value [0..1].</param>\n      <param name=\"hdr\">Output HDR colours. If true, the returned colour will not be clamped to [0..1].</param>\n      <returns>\n        <para>An opaque colour with HSV matching the input.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.Color.implop_Color(Vector4)(UnityEngine.Vector4)\">\n      <summary>\n        <para>Colors can be implicitly converted to and from Vector4.</para>\n      </summary>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Color.implop_Vector4(Color)(UnityEngine.Color)\">\n      <summary>\n        <para>Colors can be implicitly converted to and from Vector4.</para>\n      </summary>\n      <param name=\"c\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Color.Lerp(UnityEngine.Color,UnityEngine.Color,System.Single)\">\n      <summary>\n        <para>Linearly interpolates between colors a and b by t.</para>\n      </summary>\n      <param name=\"a\">Color a</param>\n      <param name=\"b\">Color b</param>\n      <param name=\"t\">Float for combining a and b</param>\n    </member>\n    <member name=\"M:UnityEngine.Color.LerpUnclamped(UnityEngine.Color,UnityEngine.Color,System.Single)\">\n      <summary>\n        <para>Linearly interpolates between colors a and b by t.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Color.op_Divide(UnityEngine.Color,System.Single)\">\n      <summary>\n        <para>Divides color a by the float b. Each color component is scaled separately.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Color.op_Minus(UnityEngine.Color,UnityEngine.Color)\">\n      <summary>\n        <para>Subtracts color b from color a. Each component is subtracted separately.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Color.op_Multiply(UnityEngine.Color,UnityEngine.Color)\">\n      <summary>\n        <para>Multiplies two colors together. Each component is multiplied separately.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Color.op_Multiply(UnityEngine.Color,System.Single)\">\n      <summary>\n        <para>Multiplies color a by the float b. Each color component is scaled separately.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Color.op_Multiply(System.Single,UnityEngine.Color)\">\n      <summary>\n        <para>Multiplies color a by the float b. Each color component is scaled separately.</para>\n      </summary>\n      <param name=\"b\"></param>\n      <param name=\"a\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Color.op_Plus(UnityEngine.Color,UnityEngine.Color)\">\n      <summary>\n        <para>Adds two colors together. Each component is added separately.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Color.RGBToHSV(UnityEngine.Color,System.Single&amp;,System.Single&amp;,System.Single&amp;)\">\n      <summary>\n        <para>Calculates the hue, saturation and value of an RGB input color.</para>\n      </summary>\n      <param name=\"rgbColor\">An input color.</param>\n      <param name=\"H\">Output variable for hue.</param>\n      <param name=\"S\">Output variable for saturation.</param>\n      <param name=\"V\">Output variable for value.</param>\n    </member>\n    <member name=\"P:UnityEngine.Color.this\">\n      <summary>\n        <para>Access the r, g, b,a components using [0], [1], [2], [3] respectively.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Color.ToString\">\n      <summary>\n        <para>Returns a nicely formatted string of this color.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Color.ToString(System.String)\">\n      <summary>\n        <para>Returns a nicely formatted string of this color.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Color32\">\n      <summary>\n        <para>Representation of RGBA colors in 32 bit format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Color32.a\">\n      <summary>\n        <para>Alpha component of the color.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Color32.b\">\n      <summary>\n        <para>Blue component of the color.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Color32.g\">\n      <summary>\n        <para>Green component of the color.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Color32.r\">\n      <summary>\n        <para>Red component of the color.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Color32.#ctor(System.Byte,System.Byte,System.Byte,System.Byte)\">\n      <summary>\n        <para>Constructs a new Color32 with given r, g, b, a components.</para>\n      </summary>\n      <param name=\"r\"></param>\n      <param name=\"g\"></param>\n      <param name=\"b\"></param>\n      <param name=\"a\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Color32.implop_Color(Color32)(UnityEngine.Color32)\">\n      <summary>\n        <para>Color32 can be implicitly converted to and from Color.</para>\n      </summary>\n      <param name=\"c\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Color32.implop_Color32(Color)(UnityEngine.Color)\">\n      <summary>\n        <para>Color32 can be implicitly converted to and from Color.</para>\n      </summary>\n      <param name=\"c\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Color32.Lerp(UnityEngine.Color32,UnityEngine.Color32,System.Single)\">\n      <summary>\n        <para>Linearly interpolates between colors a and b by t.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Color32.LerpUnclamped(UnityEngine.Color32,UnityEngine.Color32,System.Single)\">\n      <summary>\n        <para>Linearly interpolates between colors a and b by t.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Color32.ToString\">\n      <summary>\n        <para>Returns a nicely formatted string of this color.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Color32.ToString(System.String)\">\n      <summary>\n        <para>Returns a nicely formatted string of this color.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"T:UnityEngine.ColorGamut\">\n      <summary>\n        <para>Represents a color gamut.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ColorGamut.sRGB\">\n      <summary>\n        <para>sRGB color gamut.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ColorGamut.DisplayP3\">\n      <summary>\n        <para>Display-P3 color gamut.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ColorGamut.DolbyHDR\">\n      <summary>\n        <para>DolbyHDR high dynamic range color gamut.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ColorGamut.HDR10\">\n      <summary>\n        <para>HDR10 high dynamic range color gamut.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ColorGamut.Rec2020\">\n      <summary>\n        <para>Rec. 2020 color gamut.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ColorGamut.Rec709\">\n      <summary>\n        <para>Rec. 709 color gamut.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ColorSpace\">\n      <summary>\n        <para>Color space for player settings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ColorSpace.Gamma\">\n      <summary>\n        <para>Gamma color space.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ColorSpace.Linear\">\n      <summary>\n        <para>Linear color space.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ColorSpace.Uninitialized\">\n      <summary>\n        <para>Uninitialized color space.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ColorUsageAttribute\">\n      <summary>\n        <para>Attribute used to configure the usage of the ColorField and Color Picker for a color.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ColorUsageAttribute.hdr\">\n      <summary>\n        <para>If set to true the Color is treated as a HDR color.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ColorUsageAttribute.maxBrightness\">\n      <summary>\n        <para>Maximum allowed HDR color component value when using the HDR Color Picker.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ColorUsageAttribute.maxExposureValue\">\n      <summary>\n        <para>Maximum exposure value allowed in the HDR Color Picker.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ColorUsageAttribute.minBrightness\">\n      <summary>\n        <para>Minimum allowed HDR color component value when using the Color Picker.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ColorUsageAttribute.minExposureValue\">\n      <summary>\n        <para>Minimum exposure value allowed in the HDR Color Picker.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ColorUsageAttribute.showAlpha\">\n      <summary>\n        <para>If false then the alpha bar is hidden in the ColorField and the alpha value is not shown in the Color Picker.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ColorUsageAttribute.#ctor(System.Boolean)\">\n      <summary>\n        <para>Attribute for Color fields. Used for configuring the GUI for the color.</para>\n      </summary>\n      <param name=\"showAlpha\">If false then the alpha channel info is hidden both in the ColorField and in the Color Picker.</param>\n      <param name=\"hdr\">Set to true if the color should be treated as a HDR color (default value: false).</param>\n      <param name=\"minBrightness\">Minimum allowed HDR color component value when using the HDR Color Picker (default value: 0).</param>\n      <param name=\"maxBrightness\">Maximum allowed HDR color component value when using the HDR Color Picker (default value: 8).</param>\n      <param name=\"minExposureValue\">Minimum exposure value allowed in the HDR Color Picker (default value: 1/8 = 0.125).</param>\n      <param name=\"maxExposureValue\">Maximum exposure value allowed in the HDR Color Picker (default value: 3).</param>\n    </member>\n    <member name=\"M:UnityEngine.ColorUsageAttribute.#ctor(System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Attribute for Color fields. Used for configuring the GUI for the color.</para>\n      </summary>\n      <param name=\"showAlpha\">If false then the alpha channel info is hidden both in the ColorField and in the Color Picker.</param>\n      <param name=\"hdr\">Set to true if the color should be treated as a HDR color (default value: false).</param>\n      <param name=\"minBrightness\">Minimum allowed HDR color component value when using the HDR Color Picker (default value: 0).</param>\n      <param name=\"maxBrightness\">Maximum allowed HDR color component value when using the HDR Color Picker (default value: 8).</param>\n      <param name=\"minExposureValue\">Minimum exposure value allowed in the HDR Color Picker (default value: 1/8 = 0.125).</param>\n      <param name=\"maxExposureValue\">Maximum exposure value allowed in the HDR Color Picker (default value: 3).</param>\n    </member>\n    <member name=\"M:UnityEngine.ColorUsageAttribute.#ctor(System.Boolean,System.Boolean,System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Attribute for Color fields. Used for configuring the GUI for the color.</para>\n      </summary>\n      <param name=\"showAlpha\">If false then the alpha channel info is hidden both in the ColorField and in the Color Picker.</param>\n      <param name=\"hdr\">Set to true if the color should be treated as a HDR color (default value: false).</param>\n      <param name=\"minBrightness\">Minimum allowed HDR color component value when using the HDR Color Picker (default value: 0).</param>\n      <param name=\"maxBrightness\">Maximum allowed HDR color component value when using the HDR Color Picker (default value: 8).</param>\n      <param name=\"minExposureValue\">Minimum exposure value allowed in the HDR Color Picker (default value: 1/8 = 0.125).</param>\n      <param name=\"maxExposureValue\">Maximum exposure value allowed in the HDR Color Picker (default value: 3).</param>\n    </member>\n    <member name=\"T:UnityEngine.ColorUtility\">\n      <summary>\n        <para>A collection of common color functions.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ColorUtility.ToHtmlStringRGB(UnityEngine.Color)\">\n      <summary>\n        <para>Returns the color as a hexadecimal string in the format \"RRGGBB\".</para>\n      </summary>\n      <param name=\"color\">The color to be converted.</param>\n      <returns>\n        <para>Hexadecimal string representing the color.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ColorUtility.ToHtmlStringRGBA(UnityEngine.Color)\">\n      <summary>\n        <para>Returns the color as a hexadecimal string in the format \"RRGGBBAA\".</para>\n      </summary>\n      <param name=\"color\">The color to be converted.</param>\n      <returns>\n        <para>Hexadecimal string representing the color.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ColorUtility.TryParseHtmlString(System.String,UnityEngine.Color&amp;)\">\n      <summary>\n        <para>Attempts to convert a html color string.</para>\n      </summary>\n      <param name=\"htmlString\">Case insensitive html string to be converted into a color.</param>\n      <param name=\"color\">The converted color.</param>\n      <returns>\n        <para>True if the string was successfully converted else false.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.CombineInstance\">\n      <summary>\n        <para>Struct used to describe meshes to be combined using Mesh.CombineMeshes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CombineInstance.lightmapScaleOffset\">\n      <summary>\n        <para>The baked lightmap UV scale and offset applied to the Mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CombineInstance.mesh\">\n      <summary>\n        <para>Mesh to combine.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CombineInstance.realtimeLightmapScaleOffset\">\n      <summary>\n        <para>The realtime lightmap UV scale and offset applied to the Mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CombineInstance.subMeshIndex\">\n      <summary>\n        <para>Sub-Mesh index of the Mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CombineInstance.transform\">\n      <summary>\n        <para>Matrix to transform the Mesh with before combining.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Compass\">\n      <summary>\n        <para>Interface into compass functionality.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Compass.enabled\">\n      <summary>\n        <para>Used to enable or disable compass. Note, that if you want Input.compass.trueHeading property to contain a valid value, you must also enable location updates by calling Input.location.Start().</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Compass.headingAccuracy\">\n      <summary>\n        <para>Accuracy of heading reading in degrees.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Compass.magneticHeading\">\n      <summary>\n        <para>The heading in degrees relative to the magnetic North Pole. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Compass.rawVector\">\n      <summary>\n        <para>The raw geomagnetic data measured in microteslas. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Compass.timestamp\">\n      <summary>\n        <para>Timestamp (in seconds since 1970) when the heading was last time updated. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Compass.trueHeading\">\n      <summary>\n        <para>The heading in degrees relative to the geographic North Pole. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Component\">\n      <summary>\n        <para>Base class for everything attached to GameObjects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.animation\">\n      <summary>\n        <para>The Animation attached to this GameObject. (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.audio\">\n      <summary>\n        <para>The AudioSource attached to this GameObject. (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.camera\">\n      <summary>\n        <para>The Camera attached to this GameObject. (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.collider\">\n      <summary>\n        <para>The Collider attached to this GameObject. (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.collider2D\">\n      <summary>\n        <para>The Collider2D component attached to the object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.constantForce\">\n      <summary>\n        <para>The ConstantForce attached to this GameObject. (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.gameObject\">\n      <summary>\n        <para>The game object this component is attached to. A component is always attached to a game object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.guiText\">\n      <summary>\n        <para>The GUIText attached to this GameObject. (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.guiTexture\">\n      <summary>\n        <para>The GUITexture attached to this GameObject (Read Only). (null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.hingeJoint\">\n      <summary>\n        <para>The HingeJoint attached to this GameObject. (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.light\">\n      <summary>\n        <para>The Light attached to this GameObject. (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.networkView\">\n      <summary>\n        <para>The NetworkView attached to this GameObject (Read Only). (null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.particleEmitter\">\n      <summary>\n        <para>The ParticleEmitter attached to this GameObject. (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.particleSystem\">\n      <summary>\n        <para>The ParticleSystem attached to this GameObject. (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.renderer\">\n      <summary>\n        <para>The Renderer attached to this GameObject. (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.rigidbody\">\n      <summary>\n        <para>The Rigidbody attached to this GameObject. (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.rigidbody2D\">\n      <summary>\n        <para>The Rigidbody2D that is attached to the Component's GameObject.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.tag\">\n      <summary>\n        <para>The tag of this game object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Component.transform\">\n      <summary>\n        <para>The Transform attached to this GameObject.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Component.BroadcastMessage(System.String)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object or any of its children.</para>\n      </summary>\n      <param name=\"methodName\">Name of the method to call.</param>\n      <param name=\"parameter\">Optional parameter to pass to the method (can be any value).</param>\n      <param name=\"options\">Should an error be raised if the method does not exist for a given target object?</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.BroadcastMessage(System.String,System.Object)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object or any of its children.</para>\n      </summary>\n      <param name=\"methodName\">Name of the method to call.</param>\n      <param name=\"parameter\">Optional parameter to pass to the method (can be any value).</param>\n      <param name=\"options\">Should an error be raised if the method does not exist for a given target object?</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.BroadcastMessage(System.String,System.Object,UnityEngine.SendMessageOptions)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object or any of its children.</para>\n      </summary>\n      <param name=\"methodName\">Name of the method to call.</param>\n      <param name=\"parameter\">Optional parameter to pass to the method (can be any value).</param>\n      <param name=\"options\">Should an error be raised if the method does not exist for a given target object?</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.BroadcastMessage(System.String,UnityEngine.SendMessageOptions)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object or any of its children.</para>\n      </summary>\n      <param name=\"methodName\">Name of the method to call.</param>\n      <param name=\"parameter\">Optional parameter to pass to the method (can be any value).</param>\n      <param name=\"options\">Should an error be raised if the method does not exist for a given target object?</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.CompareTag(System.String)\">\n      <summary>\n        <para>Is this game object tagged with tag ?</para>\n      </summary>\n      <param name=\"tag\">The tag to compare.</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.GetComponent(System.Type)\">\n      <summary>\n        <para>Returns the component of Type type if the game object has one attached, null if it doesn't.</para>\n      </summary>\n      <param name=\"type\">The type of Component to retrieve.</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.GetComponent\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Component.GetComponent(System.String)\">\n      <summary>\n        <para>Returns the component with name type if the game object has one attached, null if it doesn't.</para>\n      </summary>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Component.GetComponentInChildren(System.Type)\">\n      <summary>\n        <para>Returns the component of Type type in the GameObject or any of its children using depth first search.</para>\n      </summary>\n      <param name=\"t\">The type of Component to retrieve.</param>\n      <returns>\n        <para>A component of the matching type, if found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Component.GetComponentInChildren()\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n      <param name=\"includeInactive\"></param>\n      <returns>\n        <para>A component of the matching type, if found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Component.GetComponentInParent(System.Type)\">\n      <summary>\n        <para>Returns the component of Type type in the GameObject or any of its parents.</para>\n      </summary>\n      <param name=\"t\">The type of Component to retrieve.</param>\n      <returns>\n        <para>A component of the matching type, if found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Component.GetComponentInParent\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n      <returns>\n        <para>A component of the matching type, if found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Component.GetComponents(System.Type)\">\n      <summary>\n        <para>Returns all components of Type type in the GameObject.</para>\n      </summary>\n      <param name=\"type\">The type of Component to retrieve.</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.GetComponents\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Component.GetComponentsInChildren\">\n      <summary>\n        <para>Returns all components of Type type in the GameObject or any of its children.</para>\n      </summary>\n      <param name=\"t\">The type of Component to retrieve.</param>\n      <param name=\"includeInactive\">Should Components on inactive GameObjects be included in the found set? includeInactive decides which children of the GameObject will be searched.  The GameObject that you call GetComponentsInChildren on is always searched regardless.</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.GetComponentsInChildren(System.Type,System.Boolean)\">\n      <summary>\n        <para>Returns all components of Type type in the GameObject or any of its children.</para>\n      </summary>\n      <param name=\"t\">The type of Component to retrieve.</param>\n      <param name=\"includeInactive\">Should Components on inactive GameObjects be included in the found set? includeInactive decides which children of the GameObject will be searched.  The GameObject that you call GetComponentsInChildren on is always searched regardless.</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.GetComponentsInChildren(System.Boolean)\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n      <param name=\"includeInactive\">Should Components on inactive GameObjects be included in the found set? includeInactive decides which children of the GameObject will be searched.  The GameObject that you call GetComponentsInChildren on is always searched regardless.</param>\n      <returns>\n        <para>A list of all found components matching the specified type.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Component.GetComponentsInChildren\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n      <returns>\n        <para>A list of all found components matching the specified type.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Component.GetComponentsInParent(System.Type,System.Boolean)\">\n      <summary>\n        <para>Returns all components of Type type in the GameObject or any of its parents.</para>\n      </summary>\n      <param name=\"t\">The type of Component to retrieve.</param>\n      <param name=\"includeInactive\">Should inactive Components be included in the found set?</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.GetComponentsInParent(System.Boolean)\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n      <param name=\"includeInactive\">Should inactive Components be included in the found set?</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.GetComponentsInParent\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n      <param name=\"includeInactive\">Should inactive Components be included in the found set?</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.SendMessage(System.String)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object.</para>\n      </summary>\n      <param name=\"methodName\">Name of the method to call.</param>\n      <param name=\"value\">Optional parameter for the method.</param>\n      <param name=\"options\">Should an error be raised if the target object doesn't implement the method for the message?</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.SendMessage(System.String,System.Object)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object.</para>\n      </summary>\n      <param name=\"methodName\">Name of the method to call.</param>\n      <param name=\"value\">Optional parameter for the method.</param>\n      <param name=\"options\">Should an error be raised if the target object doesn't implement the method for the message?</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.SendMessage(System.String,System.Object,UnityEngine.SendMessageOptions)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object.</para>\n      </summary>\n      <param name=\"methodName\">Name of the method to call.</param>\n      <param name=\"value\">Optional parameter for the method.</param>\n      <param name=\"options\">Should an error be raised if the target object doesn't implement the method for the message?</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.SendMessage(System.String,UnityEngine.SendMessageOptions)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object.</para>\n      </summary>\n      <param name=\"methodName\">Name of the method to call.</param>\n      <param name=\"value\">Optional parameter for the method.</param>\n      <param name=\"options\">Should an error be raised if the target object doesn't implement the method for the message?</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.SendMessageUpwards(System.String)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object and on every ancestor of the behaviour.</para>\n      </summary>\n      <param name=\"methodName\">Name of method to call.</param>\n      <param name=\"value\">Optional parameter value for the method.</param>\n      <param name=\"options\">Should an error be raised if the method does not exist on the target object?</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.SendMessageUpwards(System.String,System.Object)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object and on every ancestor of the behaviour.</para>\n      </summary>\n      <param name=\"methodName\">Name of method to call.</param>\n      <param name=\"value\">Optional parameter value for the method.</param>\n      <param name=\"options\">Should an error be raised if the method does not exist on the target object?</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.SendMessageUpwards(System.String,UnityEngine.SendMessageOptions)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object and on every ancestor of the behaviour.</para>\n      </summary>\n      <param name=\"methodName\">Name of method to call.</param>\n      <param name=\"value\">Optional parameter value for the method.</param>\n      <param name=\"options\">Should an error be raised if the method does not exist on the target object?</param>\n    </member>\n    <member name=\"M:UnityEngine.Component.SendMessageUpwards(System.String,System.Object,UnityEngine.SendMessageOptions)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object and on every ancestor of the behaviour.</para>\n      </summary>\n      <param name=\"methodName\">Name of method to call.</param>\n      <param name=\"value\">Optional parameter value for the method.</param>\n      <param name=\"options\">Should an error be raised if the method does not exist on the target object?</param>\n    </member>\n    <member name=\"T:UnityEngine.CompositeCollider2D\">\n      <summary>\n        <para>A Collider that can merge other Colliders together.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CompositeCollider2D.edgeRadius\">\n      <summary>\n        <para>Controls the radius of all edges created by the Collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CompositeCollider2D.generationType\">\n      <summary>\n        <para>Specifies when to generate the Composite Collider geometry.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CompositeCollider2D.geometryType\">\n      <summary>\n        <para>Specifies the type of geometry the Composite Collider should generate.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CompositeCollider2D.pathCount\">\n      <summary>\n        <para>The number of paths in the Collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CompositeCollider2D.pointCount\">\n      <summary>\n        <para>Gets the total number of points in all the paths within the Collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CompositeCollider2D.vertexDistance\">\n      <summary>\n        <para>Controls the minimum distance allowed between generated vertices.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CompositeCollider2D.GenerateGeometry\">\n      <summary>\n        <para>Regenerates the Composite Collider geometry.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CompositeCollider2D.GenerationType\">\n      <summary>\n        <para>Specifies when to generate the Composite Collider geometry.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CompositeCollider2D.GenerationType.Manual\">\n      <summary>\n        <para>Sets the Composite Collider geometry to not automatically update when a Collider used by the Composite Collider changes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CompositeCollider2D.GenerationType.Synchronous\">\n      <summary>\n        <para>Sets the Composite Collider geometry to update synchronously immediately when a Collider used by the Composite Collider changes.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CompositeCollider2D.GeometryType\">\n      <summary>\n        <para>Specifies the type of geometry the Composite Collider generates.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CompositeCollider2D.GeometryType.Outlines\">\n      <summary>\n        <para>Sets the Composite Collider to generate closed outlines for the merged Collider geometry consisting of only edges.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CompositeCollider2D.GeometryType.Polygons\">\n      <summary>\n        <para>Sets the Composite Collider to generate closed outlines for the merged Collider geometry consisting of convex polygon shapes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CompositeCollider2D.GetPath(System.Int32,UnityEngine.Vector2[])\">\n      <summary>\n        <para>Gets a path from the Collider by its index.</para>\n      </summary>\n      <param name=\"index\">The index of the path from 0 to pathCount.</param>\n      <param name=\"points\">An ordered array of the vertices or points in the selected path.</param>\n      <returns>\n        <para>Returns the number of points placed in the points array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.CompositeCollider2D.GetPathPointCount(System.Int32)\">\n      <summary>\n        <para>Gets the number of points in the specified path from the Collider by its index.</para>\n      </summary>\n      <param name=\"index\">The index of the path from 0 to pathCount.</param>\n      <returns>\n        <para>Returns the number of points in the path specified by index.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.ComputeBuffer\">\n      <summary>\n        <para>GPU data buffer, mostly for use with compute shaders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ComputeBuffer.count\">\n      <summary>\n        <para>Number of elements in the buffer (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ComputeBuffer.stride\">\n      <summary>\n        <para>Size of one element in the buffer (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ComputeBuffer.CopyCount(UnityEngine.ComputeBuffer,UnityEngine.ComputeBuffer,System.Int32)\">\n      <summary>\n        <para>Copy counter value of append/consume buffer into another buffer.</para>\n      </summary>\n      <param name=\"src\">Append/consume buffer to copy the counter from.</param>\n      <param name=\"dst\">A buffer to copy the counter to.</param>\n      <param name=\"dstOffsetBytes\">Target byte offset in dst.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeBuffer.#ctor(System.Int32,System.Int32)\">\n      <summary>\n        <para>Create a Compute Buffer.</para>\n      </summary>\n      <param name=\"count\">Number of elements in the buffer.</param>\n      <param name=\"stride\">Size of one element in the buffer. Has to match size of buffer type in the shader. See for cross-platform compatibility information.</param>\n      <param name=\"type\">Type of the buffer, default is ComputeBufferType.Default (structured buffer).</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeBuffer.#ctor(System.Int32,System.Int32,UnityEngine.ComputeBufferType)\">\n      <summary>\n        <para>Create a Compute Buffer.</para>\n      </summary>\n      <param name=\"count\">Number of elements in the buffer.</param>\n      <param name=\"stride\">Size of one element in the buffer. Has to match size of buffer type in the shader. See for cross-platform compatibility information.</param>\n      <param name=\"type\">Type of the buffer, default is ComputeBufferType.Default (structured buffer).</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeBuffer.GetData(System.Array)\">\n      <summary>\n        <para>Read data values from the buffer into an array. The array can only use &lt;a href=\"https:docs.microsoft.comen-usdotnetframeworkinteropblittable-and-non-blittable-types\"&gt;blittable&lt;a&gt; types.</para>\n      </summary>\n      <param name=\"data\">An array to receive the data.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeBuffer.GetData(System.Array,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Partial read of data values from the buffer into an array.</para>\n      </summary>\n      <param name=\"data\">An array to receive the data.</param>\n      <param name=\"managedBufferStartIndex\">The first element index in data where retrieved elements are copied.</param>\n      <param name=\"computeBufferStartIndex\">The first element index of the compute buffer from which elements are read.</param>\n      <param name=\"count\">The number of elements to retrieve.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeBuffer.GetNativeBufferPtr\">\n      <summary>\n        <para>Retrieve a native (underlying graphics API) pointer to the buffer.</para>\n      </summary>\n      <returns>\n        <para>Pointer to the underlying graphics API buffer.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ComputeBuffer.IsValid\">\n      <summary>\n        <para>Returns true if this compute buffer is valid and false otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ComputeBuffer.Release\">\n      <summary>\n        <para>Release a Compute Buffer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ComputeBuffer.SetCounterValue(System.UInt32)\">\n      <summary>\n        <para>Sets counter value of append/consume buffer.</para>\n      </summary>\n      <param name=\"counterValue\">Value of the append/consume counter.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeBuffer.SetData(System.Array)\">\n      <summary>\n        <para>Set the buffer with values from an array.</para>\n      </summary>\n      <param name=\"data\">Array of values to fill the buffer.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeBuffer.SetData(System.Array,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Partial copy of data values from an array into the buffer.</para>\n      </summary>\n      <param name=\"data\">Array of values to fill the buffer.</param>\n      <param name=\"managedBufferStartIndex\">The first element index in data to copy to the compute buffer.</param>\n      <param name=\"computeBufferStartIndex\">The first element index in compute buffer to receive the data.</param>\n      <param name=\"count\">The number of elements to copy.</param>\n    </member>\n    <member name=\"T:UnityEngine.ComputeBufferType\">\n      <summary>\n        <para>ComputeBuffer type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ComputeBufferType.Append\">\n      <summary>\n        <para>Append-consume ComputeBuffer type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ComputeBufferType.Counter\">\n      <summary>\n        <para>ComputeBuffer with a counter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ComputeBufferType.Default\">\n      <summary>\n        <para>Default ComputeBuffer type (structured buffer).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ComputeBufferType.IndirectArguments\">\n      <summary>\n        <para>ComputeBuffer used for Graphics.DrawProceduralIndirect, ComputeShader.DispatchIndirect or Graphics.DrawMeshInstancedIndirect arguments.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ComputeBufferType.Raw\">\n      <summary>\n        <para>Raw ComputeBuffer type (byte address buffer).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ComputeShader\">\n      <summary>\n        <para>Compute Shader asset.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.Dispatch(System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Execute a compute shader.</para>\n      </summary>\n      <param name=\"kernelIndex\">Which kernel to execute. A single compute shader asset can have multiple kernel entry points.</param>\n      <param name=\"threadGroupsX\">Number of work groups in the X dimension.</param>\n      <param name=\"threadGroupsY\">Number of work groups in the Y dimension.</param>\n      <param name=\"threadGroupsZ\">Number of work groups in the Z dimension.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.DispatchIndirect(System.Int32,UnityEngine.ComputeBuffer,System.UInt32)\">\n      <summary>\n        <para>Execute a compute shader.</para>\n      </summary>\n      <param name=\"kernelIndex\">Which kernel to execute. A single compute shader asset can have multiple kernel entry points.</param>\n      <param name=\"argsBuffer\">Buffer with dispatch arguments.</param>\n      <param name=\"argsOffset\">The byte offset into the buffer, where the draw arguments start.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.FindKernel(System.String)\">\n      <summary>\n        <para>Find ComputeShader kernel index.</para>\n      </summary>\n      <param name=\"name\">Name of kernel function.</param>\n      <returns>\n        <para>The Kernel index, or logs a \"FindKernel failed\" error message if the kernel is not found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.GetKernelThreadGroupSizes(System.Int32,System.UInt32&amp;,System.UInt32&amp;,System.UInt32&amp;)\">\n      <summary>\n        <para>Get kernel thread group sizes.</para>\n      </summary>\n      <param name=\"kernelIndex\">Which kernel to query. A single compute shader asset can have multiple kernel entry points.</param>\n      <param name=\"x\">Thread group size in the X dimension.</param>\n      <param name=\"y\">Thread group size in the Y dimension.</param>\n      <param name=\"z\">Thread group size in the Z dimension.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.HasKernel(System.String)\">\n      <summary>\n        <para>Checks whether a shader contains a given kernel.</para>\n      </summary>\n      <param name=\"name\">The name of the kernel to look for.</param>\n      <returns>\n        <para>True if the kernel is found, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetBool(System.String,System.Boolean)\">\n      <summary>\n        <para>Set a bool parameter.</para>\n      </summary>\n      <param name=\"name\">Variable name in shader code.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"val\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetBool(System.Int32,System.Boolean)\">\n      <summary>\n        <para>Set a bool parameter.</para>\n      </summary>\n      <param name=\"name\">Variable name in shader code.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"val\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetBuffer(System.Int32,System.String,UnityEngine.ComputeBuffer)\">\n      <summary>\n        <para>Sets an input or output compute buffer.</para>\n      </summary>\n      <param name=\"kernelIndex\">For which kernel the buffer is being set. See FindKernel.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Name of the buffer variable in shader code.</param>\n      <param name=\"buffer\">Buffer to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetBuffer(System.Int32,System.Int32,UnityEngine.ComputeBuffer)\">\n      <summary>\n        <para>Sets an input or output compute buffer.</para>\n      </summary>\n      <param name=\"kernelIndex\">For which kernel the buffer is being set. See FindKernel.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Name of the buffer variable in shader code.</param>\n      <param name=\"buffer\">Buffer to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetFloat(System.String,System.Single)\">\n      <summary>\n        <para>Set a float parameter.</para>\n      </summary>\n      <param name=\"name\">Variable name in shader code.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"val\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetFloat(System.Int32,System.Single)\">\n      <summary>\n        <para>Set a float parameter.</para>\n      </summary>\n      <param name=\"name\">Variable name in shader code.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"val\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetFloats(System.String,System.Single[])\">\n      <summary>\n        <para>Set multiple consecutive float parameters at once.</para>\n      </summary>\n      <param name=\"name\">Array variable name in the shader code.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"values\">Value array to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetFloats(System.Int32,System.Single[])\">\n      <summary>\n        <para>Set multiple consecutive float parameters at once.</para>\n      </summary>\n      <param name=\"name\">Array variable name in the shader code.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"values\">Value array to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetInt(System.String,System.Int32)\">\n      <summary>\n        <para>Set an integer parameter.</para>\n      </summary>\n      <param name=\"name\">Variable name in shader code.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"val\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetInt(System.Int32,System.Int32)\">\n      <summary>\n        <para>Set an integer parameter.</para>\n      </summary>\n      <param name=\"name\">Variable name in shader code.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"val\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetInts(System.String,System.Int32[])\">\n      <summary>\n        <para>Set multiple consecutive integer parameters at once.</para>\n      </summary>\n      <param name=\"name\">Array variable name in the shader code.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"values\">Value array to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetInts(System.Int32,System.Int32[])\">\n      <summary>\n        <para>Set multiple consecutive integer parameters at once.</para>\n      </summary>\n      <param name=\"name\">Array variable name in the shader code.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"values\">Value array to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetMatrix(System.String,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Set a Matrix parameter.</para>\n      </summary>\n      <param name=\"name\">Variable name in shader code.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"val\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetMatrix(System.Int32,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Set a Matrix parameter.</para>\n      </summary>\n      <param name=\"name\">Variable name in shader code.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"val\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetMatrixArray(System.String,UnityEngine.Matrix4x4[])\">\n      <summary>\n        <para>Set a Matrix array parameter.</para>\n      </summary>\n      <param name=\"name\">Variable name in shader code.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"values\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetMatrixArray(System.Int32,UnityEngine.Matrix4x4[])\">\n      <summary>\n        <para>Set a Matrix array parameter.</para>\n      </summary>\n      <param name=\"name\">Variable name in shader code.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"values\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetTexture(System.Int32,System.String,UnityEngine.Texture)\">\n      <summary>\n        <para>Set a texture parameter.</para>\n      </summary>\n      <param name=\"kernelIndex\">For which kernel the texture is being set. See FindKernel.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Name of the buffer variable in shader code.</param>\n      <param name=\"texture\">Texture to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetTexture(System.Int32,System.Int32,UnityEngine.Texture)\">\n      <summary>\n        <para>Set a texture parameter.</para>\n      </summary>\n      <param name=\"kernelIndex\">For which kernel the texture is being set. See FindKernel.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Name of the buffer variable in shader code.</param>\n      <param name=\"texture\">Texture to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetTextureFromGlobal(System.Int32,System.String,System.String)\">\n      <summary>\n        <para>Set a texture parameter from a global texture property.</para>\n      </summary>\n      <param name=\"kernelIndex\">For which kernel the texture is being set. See FindKernel.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Name of the buffer variable in shader code.</param>\n      <param name=\"globalTextureName\">Global texture property to assign to shader.</param>\n      <param name=\"globalTextureNameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetTextureFromGlobal(System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Set a texture parameter from a global texture property.</para>\n      </summary>\n      <param name=\"kernelIndex\">For which kernel the texture is being set. See FindKernel.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Name of the buffer variable in shader code.</param>\n      <param name=\"globalTextureName\">Global texture property to assign to shader.</param>\n      <param name=\"globalTextureNameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetVector(System.String,UnityEngine.Vector4)\">\n      <summary>\n        <para>Set a vector parameter.</para>\n      </summary>\n      <param name=\"name\">Variable name in shader code.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"val\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetVector(System.Int32,UnityEngine.Vector4)\">\n      <summary>\n        <para>Set a vector parameter.</para>\n      </summary>\n      <param name=\"name\">Variable name in shader code.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"val\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetVectorArray(System.String,UnityEngine.Vector4[])\">\n      <summary>\n        <para>Set a vector array parameter.</para>\n      </summary>\n      <param name=\"name\">Variable name in shader code.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"values\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.ComputeShader.SetVectorArray(System.Int32,UnityEngine.Vector4[])\">\n      <summary>\n        <para>Set a vector array parameter.</para>\n      </summary>\n      <param name=\"name\">Variable name in shader code.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"values\">Value to set.</param>\n    </member>\n    <member name=\"T:UnityEngine.ConfigurableJoint\">\n      <summary>\n        <para>The configurable joint is an extremely flexible joint giving you complete control over rotation and linear motion.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.angularXDrive\">\n      <summary>\n        <para>Definition of how the joint's rotation will behave around its local X axis. Only used if Rotation Drive Mode is Swing &amp; Twist.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.angularXLimitSpring\">\n      <summary>\n        <para>The configuration of the spring attached to the angular X limit of the joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.angularXMotion\">\n      <summary>\n        <para>Allow rotation around the X axis to be Free, completely Locked, or Limited according to Low and High Angular XLimit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.angularYLimit\">\n      <summary>\n        <para>Boundary defining rotation restriction, based on delta from original rotation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.angularYMotion\">\n      <summary>\n        <para>Allow rotation around the Y axis to be Free, completely Locked, or Limited according to Angular YLimit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.angularYZDrive\">\n      <summary>\n        <para>Definition of how the joint's rotation will behave around its local Y and Z axes. Only used if Rotation Drive Mode is Swing &amp; Twist.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.angularYZLimitSpring\">\n      <summary>\n        <para>The configuration of the spring attached to the angular Y and angular Z limits of the joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.angularZLimit\">\n      <summary>\n        <para>Boundary defining rotation restriction, based on delta from original rotation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.angularZMotion\">\n      <summary>\n        <para>Allow rotation around the Z axis to be Free, completely Locked, or Limited according to Angular ZLimit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.configuredInWorldSpace\">\n      <summary>\n        <para>If enabled, all Target values will be calculated in world space instead of the object's local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.highAngularXLimit\">\n      <summary>\n        <para>Boundary defining upper rotation restriction, based on delta from original rotation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.linearLimit\">\n      <summary>\n        <para>Boundary defining movement restriction, based on distance from the joint's origin.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.linearLimitSpring\">\n      <summary>\n        <para>The configuration of the spring attached to the linear limit of the joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.lowAngularXLimit\">\n      <summary>\n        <para>Boundary defining lower rotation restriction, based on delta from original rotation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.projectionAngle\">\n      <summary>\n        <para>Set the angular tolerance threshold (in degrees) for projection.\n\nIf the joint deviates by more than this angle around its locked angular degrees of freedom,\nthe solver will move the bodies to close the angle.\n\nSetting a very small tolerance may result in simulation jitter or other artifacts.\n\nSometimes it is not possible to project (for example when the joints form a cycle).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.projectionDistance\">\n      <summary>\n        <para>Set the linear tolerance threshold for projection.\n\nIf the joint separates by more than this distance along its locked degrees of freedom, the solver\nwill move the bodies to close the distance.\n\nSetting a very small tolerance may result in simulation jitter or other artifacts.\n\nSometimes it is not possible to project (for example when the joints form a cycle).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.projectionMode\">\n      <summary>\n        <para>Brings violated constraints back into alignment even when the solver fails. Projection is not a physical process and does not preserve momentum or respect collision geometry. It is best avoided if practical, but can be useful in improving simulation quality where joint separation results in unacceptable artifacts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.rotationDriveMode\">\n      <summary>\n        <para>Control the object's rotation with either X &amp; YZ or Slerp Drive by itself.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.secondaryAxis\">\n      <summary>\n        <para>The joint's secondary axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.slerpDrive\">\n      <summary>\n        <para>Definition of how the joint's rotation will behave around all local axes. Only used if Rotation Drive Mode is Slerp Only.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.swapBodies\">\n      <summary>\n        <para>If enabled, the two connected rigidbodies will be swapped, as if the joint was attached to the other body.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.targetAngularVelocity\">\n      <summary>\n        <para>This is a Vector3. It defines the desired angular velocity that the joint should rotate into.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.targetPosition\">\n      <summary>\n        <para>The desired position that the joint should move into.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.targetRotation\">\n      <summary>\n        <para>This is a Quaternion. It defines the desired rotation that the joint should rotate into.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.targetVelocity\">\n      <summary>\n        <para>The desired velocity that the joint should move along.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.xDrive\">\n      <summary>\n        <para>Definition of how the joint's movement will behave along its local X axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.xMotion\">\n      <summary>\n        <para>Allow movement along the X axis to be Free, completely Locked, or Limited according to Linear Limit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.yDrive\">\n      <summary>\n        <para>Definition of how the joint's movement will behave along its local Y axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.yMotion\">\n      <summary>\n        <para>Allow movement along the Y axis to be Free, completely Locked, or Limited according to Linear Limit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.zDrive\">\n      <summary>\n        <para>Definition of how the joint's movement will behave along its local Z axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConfigurableJoint.zMotion\">\n      <summary>\n        <para>Allow movement along the Z axis to be Free, completely Locked, or Limited according to Linear Limit.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ConfigurableJointMotion\">\n      <summary>\n        <para>Constrains movement for a ConfigurableJoint along the 6 axes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ConfigurableJointMotion.Free\">\n      <summary>\n        <para>Motion along the axis will be completely free and completely unconstrained.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ConfigurableJointMotion.Limited\">\n      <summary>\n        <para>Motion along the axis will be limited by the respective limit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ConfigurableJointMotion.Locked\">\n      <summary>\n        <para>Motion along the axis will be locked.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ConnectionTesterStatus\">\n      <summary>\n        <para>The various test results the connection tester may return with.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ConstantForce\">\n      <summary>\n        <para>A force applied constantly.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConstantForce.force\">\n      <summary>\n        <para>The force applied to the rigidbody every frame.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConstantForce.relativeForce\">\n      <summary>\n        <para>The force - relative to the rigid bodies coordinate system - applied every frame.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConstantForce.relativeTorque\">\n      <summary>\n        <para>The torque - relative to the rigid bodies coordinate system - applied every frame.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConstantForce.torque\">\n      <summary>\n        <para>The torque applied to the rigidbody every frame.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ConstantForce2D\">\n      <summary>\n        <para>Applies both linear and angular (torque) forces continuously to the rigidbody each physics update.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConstantForce2D.force\">\n      <summary>\n        <para>The linear force applied to the rigidbody each physics update.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConstantForce2D.relativeForce\">\n      <summary>\n        <para>The linear force, relative to the rigid-body coordinate system, applied each physics update.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ConstantForce2D.torque\">\n      <summary>\n        <para>The torque applied to the rigidbody each physics update.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ContactFilter2D\">\n      <summary>\n        <para>A set of parameters for filtering contact results.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ContactFilter2D.isFiltering\">\n      <summary>\n        <para>Given the current state of the contact filter, determine whether it would filter anything.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ContactFilter2D.layerMask\">\n      <summary>\n        <para>Sets the contact filter to filter the results that only include Collider2D on the layers defined by the layer mask.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ContactFilter2D.maxDepth\">\n      <summary>\n        <para>Sets the contact filter to filter the results to only include Collider2D with a Z coordinate (depth) less than this value.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ContactFilter2D.maxNormalAngle\">\n      <summary>\n        <para>Sets the contact filter to filter the results to only include contacts with collision normal angles that are less than this angle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ContactFilter2D.minDepth\">\n      <summary>\n        <para>Sets the contact filter to filter the results to only include Collider2D with a Z coordinate (depth) greater than this value.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ContactFilter2D.minNormalAngle\">\n      <summary>\n        <para>Sets the contact filter to filter the results to only include contacts with collision normal angles that are greater than this angle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ContactFilter2D.useDepth\">\n      <summary>\n        <para>Sets the contact filter to filter the results by depth using minDepth and maxDepth.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ContactFilter2D.useLayerMask\">\n      <summary>\n        <para>Sets the contact filter to filter results by layer mask.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ContactFilter2D.useNormalAngle\">\n      <summary>\n        <para>Sets the contact filter to filter the results by the collision's normal angle using minNormalAngle and maxNormalAngle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ContactFilter2D.useOutsideDepth\">\n      <summary>\n        <para>Sets the contact filter to filter within the minDepth and maxDepth range, or outside that range.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ContactFilter2D.useOutsideNormalAngle\">\n      <summary>\n        <para>Sets the contact filter to filter within the minNormalAngle and maxNormalAngle range, or outside that range.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ContactFilter2D.useTriggers\">\n      <summary>\n        <para>Sets to filter contact results based on trigger collider involvement.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ContactFilter2D.ClearDepth\">\n      <summary>\n        <para>Turns off depth filtering by setting useDepth to false.  The associated values of minDepth and maxDepth are not changed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ContactFilter2D.ClearLayerMask\">\n      <summary>\n        <para>Turns off layer mask filtering by setting useLayerMask to false.  The associated value of layerMask is not changed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ContactFilter2D.ClearNormalAngle\">\n      <summary>\n        <para>Turns off normal angle filtering by setting useNormalAngle to false. The associated values of minNormalAngle and maxNormalAngle are not changed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ContactFilter2D.IsFilteringDepth(UnityEngine.GameObject)\">\n      <summary>\n        <para>Checks if the Transform for obj is within the depth range to be filtered.</para>\n      </summary>\n      <param name=\"obj\">The GameObject used to check the z-position (depth) of Transform.position.</param>\n      <returns>\n        <para>Returns true when obj is excluded by the filter and false if otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ContactFilter2D.IsFilteringLayerMask(UnityEngine.GameObject)\">\n      <summary>\n        <para>Checks if the GameObject.layer for obj is included in the layerMask to be filtered.</para>\n      </summary>\n      <param name=\"obj\">The GameObject used to check the GameObject.layer.</param>\n      <returns>\n        <para>Returns true when obj is excluded by the filter and false if otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ContactFilter2D.IsFilteringNormalAngle(UnityEngine.Vector2)\">\n      <summary>\n        <para>Checks if the angle of normal is within the normal angle range to be filtered.</para>\n      </summary>\n      <param name=\"normal\">The normal used to calculate an angle.</param>\n      <returns>\n        <para>Returns true when normal is excluded by the filter and false if otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ContactFilter2D.IsFilteringNormalAngle(System.Single)\">\n      <summary>\n        <para>Checks if the angle is within the normal angle range to be filtered.</para>\n      </summary>\n      <param name=\"angle\">The angle used for comparison in the filter.</param>\n      <returns>\n        <para>Returns true when angle is excluded by the filter and false if otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ContactFilter2D.IsFilteringTrigger(UnityEngine.Collider2D)\">\n      <summary>\n        <para>Checks if the collider is a trigger and should be filtered by the useTriggers to be filtered.</para>\n      </summary>\n      <param name=\"collider\">The Collider2D used to check for a trigger.</param>\n      <returns>\n        <para>Returns true when collider is excluded by the filter and false if otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ContactFilter2D.NoFilter\">\n      <summary>\n        <para>Sets the contact filter to not filter any ContactPoint2D.</para>\n      </summary>\n      <returns>\n        <para>A copy of the contact filter set to not filter any ContactPoint2D.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ContactFilter2D.SetDepth(System.Single,System.Single)\">\n      <summary>\n        <para>Sets the minDepth and maxDepth filter properties and turns on depth filtering by setting useDepth to true.</para>\n      </summary>\n      <param name=\"minDepth\">The value used to set minDepth.</param>\n      <param name=\"maxDepth\">The value used to set maxDepth.</param>\n    </member>\n    <member name=\"M:UnityEngine.ContactFilter2D.SetLayerMask(UnityEngine.LayerMask)\">\n      <summary>\n        <para>Sets the layerMask filter property using the layerMask parameter provided and also enables layer mask filtering by setting useLayerMask to true.</para>\n      </summary>\n      <param name=\"layerMask\">The value used to set the layerMask.</param>\n    </member>\n    <member name=\"M:UnityEngine.ContactFilter2D.SetNormalAngle(System.Single,System.Single)\">\n      <summary>\n        <para>Sets the minNormalAngle and maxNormalAngle filter properties and turns on normal angle filtering by setting useNormalAngle to true.</para>\n      </summary>\n      <param name=\"minNormalAngle\">The value used to set the minNormalAngle.</param>\n      <param name=\"maxNormalAngle\">The value used to set the maxNormalAngle.</param>\n    </member>\n    <member name=\"T:UnityEngine.ContactPoint\">\n      <summary>\n        <para>Describes a contact point where the collision occurs.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ContactPoint.normal\">\n      <summary>\n        <para>Normal of the contact point.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ContactPoint.otherCollider\">\n      <summary>\n        <para>The other collider in contact at the point.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ContactPoint.point\">\n      <summary>\n        <para>The point of contact.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ContactPoint.separation\">\n      <summary>\n        <para>The distance between the colliders at the contact point.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ContactPoint.thisCollider\">\n      <summary>\n        <para>The first collider in contact at the point.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ContactPoint2D\">\n      <summary>\n        <para>Details about a specific point of contact involved in a 2D physics collision.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ContactPoint2D.collider\">\n      <summary>\n        <para>The incoming Collider2D involved in the collision with the otherCollider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ContactPoint2D.enabled\">\n      <summary>\n        <para>Indicates whether the collision response or reaction is enabled or disabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ContactPoint2D.normal\">\n      <summary>\n        <para>Surface normal at the contact point.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ContactPoint2D.normalImpulse\">\n      <summary>\n        <para>Gets the impulse force applied at the contact point along the ContactPoint2D.normal.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ContactPoint2D.otherCollider\">\n      <summary>\n        <para>The other Collider2D involved in the collision with the collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ContactPoint2D.otherRigidbody\">\n      <summary>\n        <para>The other Rigidbody2D involved in the collision with the rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ContactPoint2D.point\">\n      <summary>\n        <para>The point of contact between the two colliders in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ContactPoint2D.relativeVelocity\">\n      <summary>\n        <para>Gets the relative velocity of the two colliders at the contact point (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ContactPoint2D.rigidbody\">\n      <summary>\n        <para>The incoming Rigidbody2D involved in the collision with the otherRigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ContactPoint2D.separation\">\n      <summary>\n        <para>Gets the distance between the colliders at the contact point.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ContactPoint2D.tangentImpulse\">\n      <summary>\n        <para>Gets the impulse force applied at the contact point which is perpendicular to the ContactPoint2D.normal.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ContextMenu\">\n      <summary>\n        <para>The ContextMenu attribute allows you to add commands to the context menu.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ContextMenu.#ctor(System.String)\">\n      <summary>\n        <para>Adds the function to the context menu of the component.</para>\n      </summary>\n      <param name=\"itemName\">The name of the context menu item.</param>\n      <param name=\"isValidateFunction\">Whether this is a validate function (defaults to false).</param>\n      <param name=\"priority\">Priority used to override the ordering of the menu items (defaults to 1000000). The lower the number the earlier in the menu it will appear.</param>\n    </member>\n    <member name=\"M:UnityEngine.ContextMenu.#ctor(System.String,System.Boolean)\">\n      <summary>\n        <para>Adds the function to the context menu of the component.</para>\n      </summary>\n      <param name=\"itemName\">The name of the context menu item.</param>\n      <param name=\"isValidateFunction\">Whether this is a validate function (defaults to false).</param>\n      <param name=\"priority\">Priority used to override the ordering of the menu items (defaults to 1000000). The lower the number the earlier in the menu it will appear.</param>\n    </member>\n    <member name=\"M:UnityEngine.ContextMenu.#ctor(System.String,System.Boolean,System.Int32)\">\n      <summary>\n        <para>Adds the function to the context menu of the component.</para>\n      </summary>\n      <param name=\"itemName\">The name of the context menu item.</param>\n      <param name=\"isValidateFunction\">Whether this is a validate function (defaults to false).</param>\n      <param name=\"priority\">Priority used to override the ordering of the menu items (defaults to 1000000). The lower the number the earlier in the menu it will appear.</param>\n    </member>\n    <member name=\"T:UnityEngine.ContextMenuItemAttribute\">\n      <summary>\n        <para>Use this attribute to add a context menu to a field that calls a  named method.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ContextMenuItemAttribute.function\">\n      <summary>\n        <para>The name of the function that should be called.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ContextMenuItemAttribute.name\">\n      <summary>\n        <para>The name of the context menu item.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ContextMenuItemAttribute.#ctor(System.String,System.String)\">\n      <summary>\n        <para>Use this attribute to add a context menu to a field that calls a  named method.</para>\n      </summary>\n      <param name=\"name\">The name of the context menu item.</param>\n      <param name=\"function\">The name of the function that should be called.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ContextualMenu.MenuAction.StatusFlags\">\n      <summary>\n        <para>Status of the menu item.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.ContextualMenu.MenuAction.StatusFlags.Checked\">\n      <summary>\n        <para>The item is displayed with a checkmark.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.ContextualMenu.MenuAction.StatusFlags.Disabled\">\n      <summary>\n        <para>The item is disabled and is not be selectable by the user.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.ContextualMenu.MenuAction.StatusFlags.Hidden\">\n      <summary>\n        <para>The item is not displayed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.ContextualMenu.MenuAction.StatusFlags.Normal\">\n      <summary>\n        <para>The item is displayed normally.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ControllerColliderHit\">\n      <summary>\n        <para>ControllerColliderHit is used by CharacterController.OnControllerColliderHit to give detailed information about the collision and how to deal with it.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ControllerColliderHit.collider\">\n      <summary>\n        <para>The collider that was hit by the controller.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ControllerColliderHit.controller\">\n      <summary>\n        <para>The controller that hit the collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ControllerColliderHit.gameObject\">\n      <summary>\n        <para>The game object that was hit by the controller.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ControllerColliderHit.moveDirection\">\n      <summary>\n        <para>The direction the CharacterController was moving in when the collision occured.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ControllerColliderHit.moveLength\">\n      <summary>\n        <para>How far the character has travelled until it hit the collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ControllerColliderHit.normal\">\n      <summary>\n        <para>The normal of the surface we collided with in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ControllerColliderHit.point\">\n      <summary>\n        <para>The impact point in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ControllerColliderHit.rigidbody\">\n      <summary>\n        <para>The rigidbody that was hit by the controller.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ControllerColliderHit.transform\">\n      <summary>\n        <para>The transform that was hit by the controller.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Coroutine\">\n      <summary>\n        <para>MonoBehaviour.StartCoroutine returns a Coroutine. Instances of this class are only used to reference these coroutines, and do not hold any exposed properties or functions.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CrashReport\">\n      <summary>\n        <para>Holds data for a single application crash event and provides access to all gathered crash reports.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CrashReport.lastReport\">\n      <summary>\n        <para>Returns last crash report, or null if no reports are available.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CrashReport.reports\">\n      <summary>\n        <para>Returns all currently available reports in a new array.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CrashReport.text\">\n      <summary>\n        <para>Crash report data as formatted text.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CrashReport.time\">\n      <summary>\n        <para>Time, when the crash occured.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CrashReport.Remove\">\n      <summary>\n        <para>Remove report from available reports list.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CrashReport.RemoveAll\">\n      <summary>\n        <para>Remove all reports from available reports list.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CrashReportHandler.CrashReportHandler\">\n      <summary>\n        <para>Engine API for CrashReporting Service.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CrashReportHandler.CrashReportHandler.enableCaptureExceptions\">\n      <summary>\n        <para>This Boolean field will cause CrashReportHandler to capture exceptions when set to true. By default enable capture exceptions is true.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CreateAssetMenuAttribute\">\n      <summary>\n        <para>Mark a ScriptableObject-derived type to be automatically listed in the Assets/Create submenu, so that instances of the type can be easily created and stored in the project as \".asset\" files.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CreateAssetMenuAttribute.fileName\">\n      <summary>\n        <para>The default file name used by newly created instances of this type.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CreateAssetMenuAttribute.menuName\">\n      <summary>\n        <para>The display name for this type shown in the Assets/Create menu.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CreateAssetMenuAttribute.order\">\n      <summary>\n        <para>The position of the menu item within the Assets/Create menu.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Cubemap\">\n      <summary>\n        <para>Class for handling cube maps, Use this to create or modify existing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cubemap.format\">\n      <summary>\n        <para>The format of the pixel data in the texture (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cubemap.mipmapCount\">\n      <summary>\n        <para>How many mipmap levels are in this texture (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Cubemap.Apply(System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Actually apply all previous SetPixel and SetPixels changes.</para>\n      </summary>\n      <param name=\"updateMipmaps\">When set to true, mipmap levels are recalculated.</param>\n      <param name=\"makeNoLongerReadable\">When set to true, system memory copy of a texture is released.</param>\n    </member>\n    <member name=\"M:UnityEngine.Cubemap.CreateExternalTexture(System.Int32,UnityEngine.TextureFormat,System.Boolean,System.IntPtr)\">\n      <summary>\n        <para>Creates a Unity cubemap out of externally created native cubemap object.</para>\n      </summary>\n      <param name=\"size\">The width and height of each face of the cubemap should be the same.</param>\n      <param name=\"format\">Format of underlying cubemap object.</param>\n      <param name=\"mipmap\">Does the cubemap have mipmaps?</param>\n      <param name=\"nativeTex\">Native cubemap texture object.</param>\n      <param name=\"width\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Cubemap.#ctor(System.Int32,UnityEngine.TextureFormat,System.Boolean)\">\n      <summary>\n        <para>Create a new empty cubemap texture.</para>\n      </summary>\n      <param name=\"size\">Width/height of a cube face in pixels.</param>\n      <param name=\"format\">Pixel data format to be used for the Cubemap.</param>\n      <param name=\"mipmap\">Should mipmaps be created?</param>\n      <param name=\"width\"></param>\n      <param name=\"textureFormat\"></param>\n      <param name=\"mipChain\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Cubemap.GetPixel(UnityEngine.CubemapFace,System.Int32,System.Int32)\">\n      <summary>\n        <para>Returns pixel color at coordinates (face, x, y).</para>\n      </summary>\n      <param name=\"face\"></param>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Cubemap.GetPixels(UnityEngine.CubemapFace,System.Int32)\">\n      <summary>\n        <para>Returns pixel colors of a cubemap face.</para>\n      </summary>\n      <param name=\"face\">The face from which pixel data is taken.</param>\n      <param name=\"miplevel\">Mipmap level for the chosen face.</param>\n    </member>\n    <member name=\"M:UnityEngine.Cubemap.SetPixel(UnityEngine.CubemapFace,System.Int32,System.Int32,UnityEngine.Color)\">\n      <summary>\n        <para>Sets pixel color at coordinates (face, x, y).</para>\n      </summary>\n      <param name=\"face\"></param>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"color\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Cubemap.SetPixels(UnityEngine.Color[],UnityEngine.CubemapFace,System.Int32)\">\n      <summary>\n        <para>Sets pixel colors of a cubemap face.</para>\n      </summary>\n      <param name=\"colors\">Pixel data for the Cubemap face.</param>\n      <param name=\"face\">The face to which the new data should be applied.</param>\n      <param name=\"miplevel\">The mipmap level for the face.</param>\n    </member>\n    <member name=\"M:UnityEngine.Cubemap.SmoothEdges(System.Int32)\">\n      <summary>\n        <para>Performs smoothing of near edge regions.</para>\n      </summary>\n      <param name=\"smoothRegionWidthInPixels\">Pixel distance at edges over which to apply smoothing.</param>\n    </member>\n    <member name=\"T:UnityEngine.CubemapArray\">\n      <summary>\n        <para>Class for handling Cubemap arrays.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CubemapArray.cubemapCount\">\n      <summary>\n        <para>Number of cubemaps in the array (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CubemapArray.format\">\n      <summary>\n        <para>Texture format (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CubemapArray.Apply(System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Actually apply all previous SetPixels changes.</para>\n      </summary>\n      <param name=\"updateMipmaps\">When set to true, mipmap levels are recalculated.</param>\n      <param name=\"makeNoLongerReadable\">When set to true, system memory copy of a texture is released.</param>\n    </member>\n    <member name=\"M:UnityEngine.CubemapArray.#ctor(System.Int32,System.Int32,UnityEngine.TextureFormat,System.Boolean)\">\n      <summary>\n        <para>Create a new cubemap array.</para>\n      </summary>\n      <param name=\"faceSize\">Cubemap face size in pixels.</param>\n      <param name=\"cubemapCount\">Number of elements in the cubemap array.</param>\n      <param name=\"format\">Format of the pixel data.</param>\n      <param name=\"mipmap\">Should mipmaps be created?</param>\n      <param name=\"linear\">Does the texture contain non-color data (i.e. don't do any color space conversions when sampling)? Default is false.</param>\n      <param name=\"width\"></param>\n      <param name=\"textureFormat\"></param>\n      <param name=\"mipChain\"></param>\n    </member>\n    <member name=\"M:UnityEngine.CubemapArray.#ctor(System.Int32,System.Int32,UnityEngine.TextureFormat,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Create a new cubemap array.</para>\n      </summary>\n      <param name=\"faceSize\">Cubemap face size in pixels.</param>\n      <param name=\"cubemapCount\">Number of elements in the cubemap array.</param>\n      <param name=\"format\">Format of the pixel data.</param>\n      <param name=\"mipmap\">Should mipmaps be created?</param>\n      <param name=\"linear\">Does the texture contain non-color data (i.e. don't do any color space conversions when sampling)? Default is false.</param>\n      <param name=\"width\"></param>\n      <param name=\"textureFormat\"></param>\n      <param name=\"mipChain\"></param>\n    </member>\n    <member name=\"M:UnityEngine.CubemapArray.GetPixels(UnityEngine.CubemapFace,System.Int32,System.Int32)\">\n      <summary>\n        <para>Returns pixel colors of a single array slice/face.</para>\n      </summary>\n      <param name=\"face\">Cubemap face to read pixels from.</param>\n      <param name=\"arrayElement\">Array slice to read pixels from.</param>\n      <param name=\"miplevel\">Mipmap level to read pixels from.</param>\n      <returns>\n        <para>Array of pixel colors.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.CubemapArray.GetPixels32(UnityEngine.CubemapFace,System.Int32,System.Int32)\">\n      <summary>\n        <para>Returns pixel colors of a single array slice/face.</para>\n      </summary>\n      <param name=\"face\">Cubemap face to read pixels from.</param>\n      <param name=\"arrayElement\">Array slice to read pixels from.</param>\n      <param name=\"miplevel\">Mipmap level to read pixels from.</param>\n      <returns>\n        <para>Array of pixel colors in low precision (8 bits/channel) format.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.CubemapArray.SetPixels(UnityEngine.Color[],UnityEngine.CubemapFace,System.Int32,System.Int32)\">\n      <summary>\n        <para>Set pixel colors for a single array slice/face.</para>\n      </summary>\n      <param name=\"colors\">An array of pixel colors.</param>\n      <param name=\"face\">Cubemap face to set pixels for.</param>\n      <param name=\"arrayElement\">Array element index to set pixels for.</param>\n      <param name=\"miplevel\">Mipmap level to set pixels for.</param>\n    </member>\n    <member name=\"M:UnityEngine.CubemapArray.SetPixels32(UnityEngine.Color32[],UnityEngine.CubemapFace,System.Int32,System.Int32)\">\n      <summary>\n        <para>Set pixel colors for a single array slice/face.</para>\n      </summary>\n      <param name=\"colors\">An array of pixel colors in low precision (8 bits/channel) format.</param>\n      <param name=\"face\">Cubemap face to set pixels for.</param>\n      <param name=\"arrayElement\">Array element index to set pixels for.</param>\n      <param name=\"miplevel\">Mipmap level to set pixels for.</param>\n    </member>\n    <member name=\"T:UnityEngine.CubemapFace\">\n      <summary>\n        <para>Cubemap face.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CubemapFace.NegativeX\">\n      <summary>\n        <para>Left facing side (-x).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CubemapFace.NegativeY\">\n      <summary>\n        <para>Downward facing side (-y).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CubemapFace.NegativeZ\">\n      <summary>\n        <para>Backward facing side (-z).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CubemapFace.PositiveX\">\n      <summary>\n        <para>Right facing side (+x).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CubemapFace.PositiveY\">\n      <summary>\n        <para>Upwards facing side (+y).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CubemapFace.PositiveZ\">\n      <summary>\n        <para>Forward facing side (+z).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CubemapFace.Unknown\">\n      <summary>\n        <para>Cubemap face is unknown or unspecified.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CullingGroup\">\n      <summary>\n        <para>Describes a set of bounding spheres that should have their visibility and distances maintained.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CullingGroup.enabled\">\n      <summary>\n        <para>Pauses culling group execution.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CullingGroup.onStateChanged\">\n      <summary>\n        <para>Sets the callback that will be called when a sphere's visibility and/or distance state has changed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CullingGroup.targetCamera\">\n      <summary>\n        <para>Locks the CullingGroup to a specific camera.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CullingGroup.#ctor\">\n      <summary>\n        <para>Create a CullingGroup.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CullingGroup.Dispose\">\n      <summary>\n        <para>Clean up all memory used by the CullingGroup immediately.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CullingGroup.EraseSwapBack(System.Int32)\">\n      <summary>\n        <para>Erase a given bounding sphere by moving the final sphere on top of it.</para>\n      </summary>\n      <param name=\"index\">The index of the entry to erase.</param>\n    </member>\n    <member name=\"M:UnityEngine.CullingGroup.EraseSwapBack(System.Int32,T[],System.Int32&amp;)\">\n      <summary>\n        <para>Erase a given entry in an arbitrary array by copying the final entry on top of it, then decrementing the number of entries used by one.</para>\n      </summary>\n      <param name=\"index\">The index of the entry to erase.</param>\n      <param name=\"myArray\">An array of entries.</param>\n      <param name=\"size\">The number of entries in the array that are actually used.</param>\n    </member>\n    <member name=\"M:UnityEngine.CullingGroup.GetDistance(System.Int32)\">\n      <summary>\n        <para>Get the current distance band index of a given sphere.</para>\n      </summary>\n      <param name=\"index\">The index of the sphere.</param>\n      <returns>\n        <para>The sphere's current distance band index.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.CullingGroup.IsVisible(System.Int32)\">\n      <summary>\n        <para>Returns true if the bounding sphere at index is currently visible from any of the contributing cameras.</para>\n      </summary>\n      <param name=\"index\">The index of the bounding sphere.</param>\n      <returns>\n        <para>True if the sphere is visible; false if it is invisible.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.CullingGroup.QueryIndices(System.Boolean,System.Int32[],System.Int32)\">\n      <summary>\n        <para>Retrieve the indices of spheres that have particular visibility and/or distance states.</para>\n      </summary>\n      <param name=\"visible\">True if only visible spheres should be retrieved; false if only invisible spheres should be retrieved.</param>\n      <param name=\"distanceIndex\">The distance band that retrieved spheres must be in.</param>\n      <param name=\"result\">An array that will be filled with the retrieved sphere indices.</param>\n      <param name=\"firstIndex\">The index of the sphere to begin searching at.</param>\n      <returns>\n        <para>The number of sphere indices found and written into the result array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.CullingGroup.QueryIndices(System.Int32,System.Int32[],System.Int32)\">\n      <summary>\n        <para>Retrieve the indices of spheres that have particular visibility and/or distance states.</para>\n      </summary>\n      <param name=\"visible\">True if only visible spheres should be retrieved; false if only invisible spheres should be retrieved.</param>\n      <param name=\"distanceIndex\">The distance band that retrieved spheres must be in.</param>\n      <param name=\"result\">An array that will be filled with the retrieved sphere indices.</param>\n      <param name=\"firstIndex\">The index of the sphere to begin searching at.</param>\n      <returns>\n        <para>The number of sphere indices found and written into the result array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.CullingGroup.QueryIndices(System.Boolean,System.Int32,System.Int32[],System.Int32)\">\n      <summary>\n        <para>Retrieve the indices of spheres that have particular visibility and/or distance states.</para>\n      </summary>\n      <param name=\"visible\">True if only visible spheres should be retrieved; false if only invisible spheres should be retrieved.</param>\n      <param name=\"distanceIndex\">The distance band that retrieved spheres must be in.</param>\n      <param name=\"result\">An array that will be filled with the retrieved sphere indices.</param>\n      <param name=\"firstIndex\">The index of the sphere to begin searching at.</param>\n      <returns>\n        <para>The number of sphere indices found and written into the result array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.CullingGroup.SetBoundingDistances(System.Single[])\">\n      <summary>\n        <para>Set bounding distances for 'distance bands' the group should compute, as well as options for how spheres falling into each distance band should be treated.</para>\n      </summary>\n      <param name=\"distances\">An array of bounding distances. The distances should be sorted in increasing order.</param>\n      <param name=\"distanceBehaviours\">An array of CullingDistanceBehaviour settings. The array should be the same length as the array provided to the distances parameter. It can also be omitted or passed as null, in which case all distances will be given CullingDistanceBehaviour.Normal behaviour.</param>\n    </member>\n    <member name=\"M:UnityEngine.CullingGroup.SetBoundingSphereCount(System.Int32)\">\n      <summary>\n        <para>Sets the number of bounding spheres in the bounding spheres array that are actually being used.</para>\n      </summary>\n      <param name=\"count\">The number of bounding spheres being used.</param>\n    </member>\n    <member name=\"M:UnityEngine.CullingGroup.SetBoundingSpheres(UnityEngine.BoundingSphere[])\">\n      <summary>\n        <para>Sets the array of bounding sphere definitions that the CullingGroup should compute culling for.</para>\n      </summary>\n      <param name=\"array\">The BoundingSpheres to cull.</param>\n    </member>\n    <member name=\"M:UnityEngine.CullingGroup.SetDistanceReferencePoint(UnityEngine.Vector3)\">\n      <summary>\n        <para>Set the reference point from which distance bands are measured.</para>\n      </summary>\n      <param name=\"point\">A fixed point to measure the distance from.</param>\n      <param name=\"transform\">A transform to measure the distance from. The transform's position will be automatically tracked.</param>\n    </member>\n    <member name=\"M:UnityEngine.CullingGroup.SetDistanceReferencePoint(UnityEngine.Transform)\">\n      <summary>\n        <para>Set the reference point from which distance bands are measured.</para>\n      </summary>\n      <param name=\"point\">A fixed point to measure the distance from.</param>\n      <param name=\"transform\">A transform to measure the distance from. The transform's position will be automatically tracked.</param>\n    </member>\n    <member name=\"T:UnityEngine.CullingGroup.StateChanged\">\n      <summary>\n        <para>This delegate is used for recieving a callback when a sphere's distance or visibility state has changed.</para>\n      </summary>\n      <param name=\"sphere\">A CullingGroupEvent that provides information about the sphere that has changed.</param>\n    </member>\n    <member name=\"T:UnityEngine.CullingGroupEvent\">\n      <summary>\n        <para>Provides information about the current and previous states of one sphere in a CullingGroup.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CullingGroupEvent.currentDistance\">\n      <summary>\n        <para>The current distance band index of the sphere, after the most recent culling pass.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CullingGroupEvent.hasBecomeInvisible\">\n      <summary>\n        <para>Did this sphere change from being visible to being invisible in the most recent culling pass?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CullingGroupEvent.hasBecomeVisible\">\n      <summary>\n        <para>Did this sphere change from being invisible to being visible in the most recent culling pass?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CullingGroupEvent.index\">\n      <summary>\n        <para>The index of the sphere that has changed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CullingGroupEvent.isVisible\">\n      <summary>\n        <para>Was the sphere considered visible by the most recent culling pass?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CullingGroupEvent.previousDistance\">\n      <summary>\n        <para>The distance band index of the sphere before the most recent culling pass.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CullingGroupEvent.wasVisible\">\n      <summary>\n        <para>Was the sphere visible before the most recent culling pass?</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Cursor\">\n      <summary>\n        <para>Cursor API for setting the cursor (mouse pointer).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cursor.lockState\">\n      <summary>\n        <para>Determines whether the hardware pointer is locked to the center of the view, constrained to the window, or not constrained at all.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Cursor.visible\">\n      <summary>\n        <para>Determines whether the hardware pointer is visible or not.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Cursor.SetCursor\">\n      <summary>\n        <para>Sets the mouse cursor to the given texture.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Cursor.SetCursor(UnityEngine.Texture2D,UnityEngine.Vector2,UnityEngine.CursorMode)\">\n      <summary>\n        <para>Specify a custom cursor that you wish to use as a cursor.</para>\n      </summary>\n      <param name=\"texture\">The texture to use for the cursor or null to set the default cursor. Note that a texture needs to be imported with \"Read/Write enabled\" in the texture importer (or using the \"Cursor\" defaults), in order to be used as a cursor.</param>\n      <param name=\"hotspot\">The offset from the top left of the texture to use as the target point (must be within the bounds of the cursor).</param>\n      <param name=\"cursorMode\">Allow this cursor to render as a hardware cursor on supported platforms, or force software cursor.</param>\n    </member>\n    <member name=\"T:UnityEngine.CursorLockMode\">\n      <summary>\n        <para>How the cursor should behave.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CursorLockMode.Confined\">\n      <summary>\n        <para>Confine cursor to the game window.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CursorLockMode.Locked\">\n      <summary>\n        <para>Lock cursor to the center of the game window.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CursorLockMode.None\">\n      <summary>\n        <para>Cursor behavior is unmodified.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CursorMode\">\n      <summary>\n        <para>Determines whether the mouse cursor is rendered using software rendering or, on supported platforms, hardware rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CursorMode.Auto\">\n      <summary>\n        <para>Use hardware cursors on supported platforms.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CursorMode.ForceSoftware\">\n      <summary>\n        <para>Force the use of software cursors.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CustomGridBrushAttribute\">\n      <summary>\n        <para>Attribute to define the class as a grid brush and to make it available in the palette window.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CustomGridBrushAttribute.defaultBrush\">\n      <summary>\n        <para>If set to true, brush will replace Unity built-in brush as the default brush in palette window.\n\nOnly one class at any one time should set defaultBrush to true.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CustomGridBrushAttribute.defaultName\">\n      <summary>\n        <para>Name of the default instance of this brush.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CustomGridBrushAttribute.hideAssetInstances\">\n      <summary>\n        <para>Hide all asset instances of this brush in the tile palette window.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CustomGridBrushAttribute.hideDefaultInstance\">\n      <summary>\n        <para>Hide the default instance of brush in the tile palette window.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CustomGridBrushAttribute.#ctor\">\n      <summary>\n        <para>Attribute to define the class as a grid brush and to make it available in the palette window.</para>\n      </summary>\n      <param name=\"defaultBrush\">If set to true, brush will replace Unity built-in brush as the default brush in palette window.</param>\n      <param name=\"defaultName\">Name of the default instance of this brush.</param>\n      <param name=\"hideAssetInstanes\">Hide all asset instances of this brush in the tile palette window.</param>\n      <param name=\"hideDefaultInstance\">Hide the default instance of brush in the tile palette window.</param>\n      <param name=\"hideAssetInstances\"></param>\n    </member>\n    <member name=\"M:UnityEngine.CustomGridBrushAttribute.#ctor(System.Boolean,System.Boolean,System.Boolean,System.String)\">\n      <summary>\n        <para>Attribute to define the class as a grid brush and to make it available in the palette window.</para>\n      </summary>\n      <param name=\"defaultBrush\">If set to true, brush will replace Unity built-in brush as the default brush in palette window.</param>\n      <param name=\"defaultName\">Name of the default instance of this brush.</param>\n      <param name=\"hideAssetInstanes\">Hide all asset instances of this brush in the tile palette window.</param>\n      <param name=\"hideDefaultInstance\">Hide the default instance of brush in the tile palette window.</param>\n      <param name=\"hideAssetInstances\"></param>\n    </member>\n    <member name=\"T:UnityEngine.CustomRenderTexture\">\n      <summary>\n        <para>Custom Render Textures are an extension to Render Textures, enabling you to render directly to the Texture using a Shader.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CustomRenderTexture.cubemapFaceMask\">\n      <summary>\n        <para>Bitfield that allows to enable or disable update on each of the cubemap faces. Order from least significant bit is +X, -X, +Y, -Y, +Z, -Z.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CustomRenderTexture.doubleBuffered\">\n      <summary>\n        <para>If true, the Custom Render Texture is double buffered so that you can access it during its own update. otherwise the Custom Render Texture will be not be double buffered.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CustomRenderTexture.initializationColor\">\n      <summary>\n        <para>Color with which the Custom Render Texture is initialized. This parameter will be ignored if an initializationMaterial is set.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CustomRenderTexture.initializationMaterial\">\n      <summary>\n        <para>Material with which the Custom Render Texture is initialized. Initialization texture and color are ignored if this parameter is set.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CustomRenderTexture.initializationMode\">\n      <summary>\n        <para>Specify how the texture should be initialized.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CustomRenderTexture.initializationSource\">\n      <summary>\n        <para>Specify if the texture should be initialized with a Texture and a Color or a Material.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CustomRenderTexture.initializationTexture\">\n      <summary>\n        <para>Texture with which the Custom Render Texture is initialized (multiplied by the initialization color). This parameter will be ignored if an initializationMaterial is set.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CustomRenderTexture.material\">\n      <summary>\n        <para>Material with which the content of the Custom Render Texture is updated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CustomRenderTexture.shaderPass\">\n      <summary>\n        <para>Shader Pass used to update the Custom Render Texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CustomRenderTexture.updateMode\">\n      <summary>\n        <para>Specify how the texture should be updated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CustomRenderTexture.updateZoneSpace\">\n      <summary>\n        <para>Space in which the update zones are expressed (Normalized or Pixel space).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CustomRenderTexture.wrapUpdateZones\">\n      <summary>\n        <para>If true, Update zones will wrap around the border of the Custom Render Texture. Otherwise, Update zones will be clamped at the border of the Custom Render Texture.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CustomRenderTexture.ClearUpdateZones\">\n      <summary>\n        <para>Clear all Update Zones.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CustomRenderTexture.#ctor(System.Int32,System.Int32,UnityEngine.RenderTextureFormat,UnityEngine.RenderTextureReadWrite)\">\n      <summary>\n        <para>Create a new Custom Render Texture.</para>\n      </summary>\n      <param name=\"width\"></param>\n      <param name=\"height\"></param>\n      <param name=\"format\"></param>\n      <param name=\"readWrite\"></param>\n    </member>\n    <member name=\"M:UnityEngine.CustomRenderTexture.#ctor(System.Int32,System.Int32,UnityEngine.RenderTextureFormat)\">\n      <summary>\n        <para>Create a new Custom Render Texture.</para>\n      </summary>\n      <param name=\"width\"></param>\n      <param name=\"height\"></param>\n      <param name=\"format\"></param>\n      <param name=\"readWrite\"></param>\n    </member>\n    <member name=\"M:UnityEngine.CustomRenderTexture.#ctor(System.Int32,System.Int32)\">\n      <summary>\n        <para>Create a new Custom Render Texture.</para>\n      </summary>\n      <param name=\"width\"></param>\n      <param name=\"height\"></param>\n      <param name=\"format\"></param>\n      <param name=\"readWrite\"></param>\n    </member>\n    <member name=\"M:UnityEngine.CustomRenderTexture.GetUpdateZones(System.Collections.Generic.List`1&lt;UnityEngine.CustomRenderTextureUpdateZone&gt;)\">\n      <summary>\n        <para>Returns the list of Update Zones.</para>\n      </summary>\n      <param name=\"updateZones\">Output list of Update Zones.</param>\n    </member>\n    <member name=\"M:UnityEngine.CustomRenderTexture.Initialize\">\n      <summary>\n        <para>Triggers an initialization of the Custom Render Texture.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.CustomRenderTexture.SetUpdateZones(UnityEngine.CustomRenderTextureUpdateZone[])\">\n      <summary>\n        <para>Setup the list of Update Zones for the Custom Render Texture.</para>\n      </summary>\n      <param name=\"updateZones\"></param>\n    </member>\n    <member name=\"M:UnityEngine.CustomRenderTexture.Update(System.Int32)\">\n      <summary>\n        <para>Triggers the update of the Custom Render Texture.</para>\n      </summary>\n      <param name=\"count\">Number of upate pass to perform.</param>\n    </member>\n    <member name=\"T:UnityEngine.CustomRenderTextureInitializationSource\">\n      <summary>\n        <para>Specify the source of a Custom Render Texture initialization.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CustomRenderTextureInitializationSource.Material\">\n      <summary>\n        <para>Custom Render Texture is initalized with a Material.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CustomRenderTextureInitializationSource.TextureAndColor\">\n      <summary>\n        <para>Custom Render Texture is initialized by a Texture multiplied by a Color.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CustomRenderTextureUpdateMode\">\n      <summary>\n        <para>Frequency of update or initialization of a Custom Render Texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CustomRenderTextureUpdateMode.OnDemand\">\n      <summary>\n        <para>Initialization/Update will only occur when triggered by the script.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CustomRenderTextureUpdateMode.OnLoad\">\n      <summary>\n        <para>Initialization/Update will occur once at load time and then can be triggered again by script.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CustomRenderTextureUpdateMode.Realtime\">\n      <summary>\n        <para>Initialization/Update will occur at every frame.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CustomRenderTextureUpdateZone\">\n      <summary>\n        <para>Structure describing an Update Zone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CustomRenderTextureUpdateZone.needSwap\">\n      <summary>\n        <para>If true, and if the texture is double buffered, a request is made to swap the buffers before the next update. Otherwise, the buffers will not be swapped.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CustomRenderTextureUpdateZone.passIndex\">\n      <summary>\n        <para>Shader Pass used to update the Custom Render Texture for this Update Zone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CustomRenderTextureUpdateZone.rotation\">\n      <summary>\n        <para>Rotation of the Update Zone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CustomRenderTextureUpdateZone.updateZoneCenter\">\n      <summary>\n        <para>Position of the center of the Update Zone within the Custom Render Texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CustomRenderTextureUpdateZone.updateZoneSize\">\n      <summary>\n        <para>Size of the Update Zone.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CustomRenderTextureUpdateZoneSpace\">\n      <summary>\n        <para>Space in which coordinates are provided for Update Zones.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CustomRenderTextureUpdateZoneSpace.Normalized\">\n      <summary>\n        <para>Coordinates are normalized. (0, 0) is top left and (1, 1) is bottom right.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.CustomRenderTextureUpdateZoneSpace.Pixel\">\n      <summary>\n        <para>Coordinates are expressed in pixels. (0, 0) is top left (width, height) is bottom right.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.CustomYieldInstruction\">\n      <summary>\n        <para>Base class for custom yield instructions to suspend coroutines.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.CustomYieldInstruction.keepWaiting\">\n      <summary>\n        <para>Indicates if coroutine should be kept suspended.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Debug\">\n      <summary>\n        <para>Class containing methods to ease debugging while developing a game.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Debug.developerConsoleVisible\">\n      <summary>\n        <para>Reports whether the development console is visible. The development console cannot be made to appear using:</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Debug.isDebugBuild\">\n      <summary>\n        <para>In the Build Settings dialog there is a check box called \"Development Build\".</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Debug.unityLogger\">\n      <summary>\n        <para>Get default debug logger.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Debug.Assert(System.Boolean)\">\n      <summary>\n        <para>Assert a condition and logs an error message to the Unity console on failure.</para>\n      </summary>\n      <param name=\"condition\">Condition you expect to be true.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.Assert(System.Boolean,UnityEngine.Object)\">\n      <summary>\n        <para>Assert a condition and logs an error message to the Unity console on failure.</para>\n      </summary>\n      <param name=\"condition\">Condition you expect to be true.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.Assert(System.Boolean,System.Object)\">\n      <summary>\n        <para>Assert a condition and logs an error message to the Unity console on failure.</para>\n      </summary>\n      <param name=\"condition\">Condition you expect to be true.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.Assert(System.Boolean,System.Object,UnityEngine.Object)\">\n      <summary>\n        <para>Assert a condition and logs an error message to the Unity console on failure.</para>\n      </summary>\n      <param name=\"condition\">Condition you expect to be true.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.AssertFormat(System.Boolean,System.String,System.Object[])\">\n      <summary>\n        <para>Assert a condition and logs a formatted error message to the Unity console on failure.</para>\n      </summary>\n      <param name=\"condition\">Condition you expect to be true.</param>\n      <param name=\"format\">A composite format string.</param>\n      <param name=\"args\">Format arguments.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.AssertFormat(System.Boolean,UnityEngine.Object,System.String,System.Object[])\">\n      <summary>\n        <para>Assert a condition and logs a formatted error message to the Unity console on failure.</para>\n      </summary>\n      <param name=\"condition\">Condition you expect to be true.</param>\n      <param name=\"format\">A composite format string.</param>\n      <param name=\"args\">Format arguments.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.Break\">\n      <summary>\n        <para>Pauses the editor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Debug.ClearDeveloperConsole\">\n      <summary>\n        <para>Clears errors from the developer console.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Debug.DrawLine(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Draws a line between specified start and end points.</para>\n      </summary>\n      <param name=\"start\">Point in world space where the line should start.</param>\n      <param name=\"end\">Point in world space where the line should end.</param>\n      <param name=\"color\">Color of the line.</param>\n      <param name=\"duration\">How long the line should be visible for.</param>\n      <param name=\"depthTest\">Should the line be obscured by objects closer to the camera?</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.DrawLine(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Color)\">\n      <summary>\n        <para>Draws a line between specified start and end points.</para>\n      </summary>\n      <param name=\"start\">Point in world space where the line should start.</param>\n      <param name=\"end\">Point in world space where the line should end.</param>\n      <param name=\"color\">Color of the line.</param>\n      <param name=\"duration\">How long the line should be visible for.</param>\n      <param name=\"depthTest\">Should the line be obscured by objects closer to the camera?</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.DrawLine(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Color,System.Single)\">\n      <summary>\n        <para>Draws a line between specified start and end points.</para>\n      </summary>\n      <param name=\"start\">Point in world space where the line should start.</param>\n      <param name=\"end\">Point in world space where the line should end.</param>\n      <param name=\"color\">Color of the line.</param>\n      <param name=\"duration\">How long the line should be visible for.</param>\n      <param name=\"depthTest\">Should the line be obscured by objects closer to the camera?</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.DrawLine(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Color,System.Single,System.Boolean)\">\n      <summary>\n        <para>Draws a line between specified start and end points.</para>\n      </summary>\n      <param name=\"start\">Point in world space where the line should start.</param>\n      <param name=\"end\">Point in world space where the line should end.</param>\n      <param name=\"color\">Color of the line.</param>\n      <param name=\"duration\">How long the line should be visible for.</param>\n      <param name=\"depthTest\">Should the line be obscured by objects closer to the camera?</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.DrawRay(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Draws a line from start to start + dir in world coordinates.</para>\n      </summary>\n      <param name=\"start\">Point in world space where the ray should start.</param>\n      <param name=\"dir\">Direction and length of the ray.</param>\n      <param name=\"color\">Color of the drawn line.</param>\n      <param name=\"duration\">How long the line will be visible for (in seconds).</param>\n      <param name=\"depthTest\">Should the line be obscured by other objects closer to the camera?</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.DrawRay(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Color)\">\n      <summary>\n        <para>Draws a line from start to start + dir in world coordinates.</para>\n      </summary>\n      <param name=\"start\">Point in world space where the ray should start.</param>\n      <param name=\"dir\">Direction and length of the ray.</param>\n      <param name=\"color\">Color of the drawn line.</param>\n      <param name=\"duration\">How long the line will be visible for (in seconds).</param>\n      <param name=\"depthTest\">Should the line be obscured by other objects closer to the camera?</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.DrawRay(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Color,System.Single)\">\n      <summary>\n        <para>Draws a line from start to start + dir in world coordinates.</para>\n      </summary>\n      <param name=\"start\">Point in world space where the ray should start.</param>\n      <param name=\"dir\">Direction and length of the ray.</param>\n      <param name=\"color\">Color of the drawn line.</param>\n      <param name=\"duration\">How long the line will be visible for (in seconds).</param>\n      <param name=\"depthTest\">Should the line be obscured by other objects closer to the camera?</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.DrawRay(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Color,System.Single,System.Boolean)\">\n      <summary>\n        <para>Draws a line from start to start + dir in world coordinates.</para>\n      </summary>\n      <param name=\"start\">Point in world space where the ray should start.</param>\n      <param name=\"dir\">Direction and length of the ray.</param>\n      <param name=\"color\">Color of the drawn line.</param>\n      <param name=\"duration\">How long the line will be visible for (in seconds).</param>\n      <param name=\"depthTest\">Should the line be obscured by other objects closer to the camera?</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.Log(System.Object)\">\n      <summary>\n        <para>Logs message to the Unity Console.</para>\n      </summary>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.Log(System.Object,UnityEngine.Object)\">\n      <summary>\n        <para>Logs message to the Unity Console.</para>\n      </summary>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.LogAssertion(System.Object)\">\n      <summary>\n        <para>A variant of Debug.Log that logs an assertion message to the console.</para>\n      </summary>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.LogAssertion(System.Object,UnityEngine.Object)\">\n      <summary>\n        <para>A variant of Debug.Log that logs an assertion message to the console.</para>\n      </summary>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.LogAssertionFormat(System.String,System.Object[])\">\n      <summary>\n        <para>Logs a formatted assertion message to the Unity console.</para>\n      </summary>\n      <param name=\"format\">A composite format string.</param>\n      <param name=\"args\">Format arguments.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.LogAssertionFormat(UnityEngine.Object,System.String,System.Object[])\">\n      <summary>\n        <para>Logs a formatted assertion message to the Unity console.</para>\n      </summary>\n      <param name=\"format\">A composite format string.</param>\n      <param name=\"args\">Format arguments.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.LogError(System.Object)\">\n      <summary>\n        <para>A variant of Debug.Log that logs an error message to the console.</para>\n      </summary>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.LogError(System.Object,UnityEngine.Object)\">\n      <summary>\n        <para>A variant of Debug.Log that logs an error message to the console.</para>\n      </summary>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.LogErrorFormat(System.String,System.Object[])\">\n      <summary>\n        <para>Logs a formatted error message to the Unity console.</para>\n      </summary>\n      <param name=\"format\">A composite format string.</param>\n      <param name=\"args\">Format arguments.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.LogErrorFormat(UnityEngine.Object,System.String,System.Object[])\">\n      <summary>\n        <para>Logs a formatted error message to the Unity console.</para>\n      </summary>\n      <param name=\"format\">A composite format string.</param>\n      <param name=\"args\">Format arguments.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.LogException(System.Exception)\">\n      <summary>\n        <para>A variant of Debug.Log that logs an error message to the console.</para>\n      </summary>\n      <param name=\"context\">Object to which the message applies.</param>\n      <param name=\"exception\">Runtime Exception.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.LogException(System.Exception,UnityEngine.Object)\">\n      <summary>\n        <para>A variant of Debug.Log that logs an error message to the console.</para>\n      </summary>\n      <param name=\"context\">Object to which the message applies.</param>\n      <param name=\"exception\">Runtime Exception.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.LogFormat(System.String,System.Object[])\">\n      <summary>\n        <para>Logs a formatted message to the Unity Console.</para>\n      </summary>\n      <param name=\"format\">A composite format string.</param>\n      <param name=\"args\">Format arguments.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.LogFormat(UnityEngine.Object,System.String,System.Object[])\">\n      <summary>\n        <para>Logs a formatted message to the Unity Console.</para>\n      </summary>\n      <param name=\"format\">A composite format string.</param>\n      <param name=\"args\">Format arguments.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.LogWarning(System.Object)\">\n      <summary>\n        <para>A variant of Debug.Log that logs a warning message to the console.</para>\n      </summary>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.LogWarning(System.Object,UnityEngine.Object)\">\n      <summary>\n        <para>A variant of Debug.Log that logs a warning message to the console.</para>\n      </summary>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.LogWarningFormat(System.String,System.Object[])\">\n      <summary>\n        <para>Logs a formatted warning message to the Unity Console.</para>\n      </summary>\n      <param name=\"format\">A composite format string.</param>\n      <param name=\"args\">Format arguments.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Debug.LogWarningFormat(UnityEngine.Object,System.String,System.Object[])\">\n      <summary>\n        <para>Logs a formatted warning message to the Unity Console.</para>\n      </summary>\n      <param name=\"format\">A composite format string.</param>\n      <param name=\"args\">Format arguments.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"T:UnityEngine.DelayedAttribute\">\n      <summary>\n        <para>Attribute used to make a float, int, or string variable in a script be delayed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.DelayedAttribute.#ctor\">\n      <summary>\n        <para>Attribute used to make a float, int, or string variable in a script be delayed.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.DepthTextureMode\">\n      <summary>\n        <para>Depth texture generation mode for Camera.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DepthTextureMode.Depth\">\n      <summary>\n        <para>Generate a depth texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DepthTextureMode.DepthNormals\">\n      <summary>\n        <para>Generate a depth + normals texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DepthTextureMode.MotionVectors\">\n      <summary>\n        <para>Specifies whether motion vectors should be rendered (if possible).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DepthTextureMode.None\">\n      <summary>\n        <para>Do not generate depth texture (Default).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.DetailPrototype\">\n      <summary>\n        <para>Detail prototype used by the Terrain GameObject.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.DetailPrototype.bendFactor\">\n      <summary>\n        <para>Bend factor of the detailPrototype.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.DetailPrototype.dryColor\">\n      <summary>\n        <para>Color when the DetailPrototypes are \"dry\".</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.DetailPrototype.healthyColor\">\n      <summary>\n        <para>Color when the DetailPrototypes are \"healthy\".</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.DetailPrototype.maxHeight\">\n      <summary>\n        <para>Maximum height of the grass billboards (if render mode is GrassBillboard).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.DetailPrototype.maxWidth\">\n      <summary>\n        <para>Maximum width of the grass billboards (if render mode is GrassBillboard).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.DetailPrototype.minHeight\">\n      <summary>\n        <para>Minimum height of the grass billboards (if render mode is GrassBillboard).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.DetailPrototype.minWidth\">\n      <summary>\n        <para>Minimum width of the grass billboards (if render mode is GrassBillboard).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.DetailPrototype.noiseSpread\">\n      <summary>\n        <para>How spread out is the noise for the DetailPrototype.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.DetailPrototype.prototype\">\n      <summary>\n        <para>GameObject used by the DetailPrototype.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.DetailPrototype.prototypeTexture\">\n      <summary>\n        <para>Texture used by the DetailPrototype.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.DetailPrototype.renderMode\">\n      <summary>\n        <para>Render mode for the DetailPrototype.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.DetailRenderMode\">\n      <summary>\n        <para>Render mode for detail prototypes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DetailRenderMode.Grass\">\n      <summary>\n        <para>The detail prototype will use the grass shader.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DetailRenderMode.GrassBillboard\">\n      <summary>\n        <para>The detail prototype will be rendered as billboards that are always facing the camera.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DetailRenderMode.VertexLit\">\n      <summary>\n        <para>Will show the prototype using diffuse shading.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.DeviceOrientation\">\n      <summary>\n        <para>Describes physical orientation of the device as determined by the OS.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DeviceOrientation.FaceDown\">\n      <summary>\n        <para>The device is held parallel to the ground with the screen facing downwards.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DeviceOrientation.FaceUp\">\n      <summary>\n        <para>The device is held parallel to the ground with the screen facing upwards.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DeviceOrientation.LandscapeLeft\">\n      <summary>\n        <para>The device is in landscape mode, with the device held upright and the home button on the right side.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DeviceOrientation.LandscapeRight\">\n      <summary>\n        <para>The device is in landscape mode, with the device held upright and the home button on the left side.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DeviceOrientation.Portrait\">\n      <summary>\n        <para>The device is in portrait mode, with the device held upright and the home button at the bottom.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DeviceOrientation.PortraitUpsideDown\">\n      <summary>\n        <para>The device is in portrait mode but upside down, with the device held upright and the home button at the top.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DeviceOrientation.Unknown\">\n      <summary>\n        <para>The orientation of the device cannot be determined.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.DeviceType\">\n      <summary>\n        <para>Enumeration for SystemInfo.deviceType, denotes a coarse grouping of kinds of devices.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DeviceType.Console\">\n      <summary>\n        <para>A stationary gaming console.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DeviceType.Desktop\">\n      <summary>\n        <para>Desktop or laptop computer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DeviceType.Handheld\">\n      <summary>\n        <para>A handheld device like mobile phone or a tablet.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DeviceType.Unknown\">\n      <summary>\n        <para>Device type is unknown. You should never see this in practice.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.DisallowMultipleComponent\">\n      <summary>\n        <para>Prevents MonoBehaviour of same type (or subtype) to be added more than once to a GameObject.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Display\">\n      <summary>\n        <para>Provides access to a display / screen for rendering operations.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Display.active\">\n      <summary>\n        <para>Gets the state of the display and returns true if the display is active and false if otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Display.colorBuffer\">\n      <summary>\n        <para>Color RenderBuffer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Display.depthBuffer\">\n      <summary>\n        <para>Depth RenderBuffer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Display.displays\">\n      <summary>\n        <para>The list of currently connected Displays. Contains at least one (main) display.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Display.main\">\n      <summary>\n        <para>Main Display.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Display.renderingHeight\">\n      <summary>\n        <para>Vertical resolution that the display is rendering at.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Display.renderingWidth\">\n      <summary>\n        <para>Horizontal resolution that the display is rendering at.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Display.systemHeight\">\n      <summary>\n        <para>Vertical native display resolution.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Display.systemWidth\">\n      <summary>\n        <para>Horizontal native display resolution.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Display.Activate\">\n      <summary>\n        <para>Activate an external display. Eg. Secondary Monitors connected to the System.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Display.Activate(System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>This overloaded function available for Windows allows specifying desired Window Width, Height and Refresh Rate.</para>\n      </summary>\n      <param name=\"width\">Desired Width of the Window (for Windows only. On Linux and Mac uses Screen Width).</param>\n      <param name=\"height\">Desired Height of the Window (for Windows only. On Linux and Mac uses Screen Height).</param>\n      <param name=\"refreshRate\">Desired Refresh Rate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Display.RelativeMouseAt(UnityEngine.Vector3)\">\n      <summary>\n        <para>Query relative mouse coordinates.</para>\n      </summary>\n      <param name=\"inputMouseCoordinates\">Mouse Input Position as Coordinates.</param>\n    </member>\n    <member name=\"M:UnityEngine.Display.SetParams(System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Set rendering size and position on screen (Windows only).</para>\n      </summary>\n      <param name=\"width\">Change Window Width (Windows Only).</param>\n      <param name=\"height\">Change Window Height (Windows Only).</param>\n      <param name=\"x\">Change Window Position X (Windows Only).</param>\n      <param name=\"y\">Change Window Position Y (Windows Only).</param>\n    </member>\n    <member name=\"M:UnityEngine.Display.SetRenderingResolution(System.Int32,System.Int32)\">\n      <summary>\n        <para>Sets rendering resolution for the display.</para>\n      </summary>\n      <param name=\"w\">Rendering width in pixels.</param>\n      <param name=\"h\">Rendering height in pixels.</param>\n    </member>\n    <member name=\"T:UnityEngine.DistanceJoint2D\">\n      <summary>\n        <para>Joint that keeps two Rigidbody2D objects a fixed distance apart.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.DistanceJoint2D.autoConfigureDistance\">\n      <summary>\n        <para>Should the distance be calculated automatically?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.DistanceJoint2D.distance\">\n      <summary>\n        <para>The distance separating the two ends of the joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.DistanceJoint2D.maxDistanceOnly\">\n      <summary>\n        <para>Whether to maintain a maximum distance only or not.  If not then the absolute distance will be maintained instead.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.DrivenRectTransformTracker\">\n      <summary>\n        <para>A component can be designed to drive a RectTransform. The DrivenRectTransformTracker struct is used to specify which RectTransforms it is driving.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.DrivenRectTransformTracker.Add(UnityEngine.Object,UnityEngine.RectTransform,UnityEngine.DrivenTransformProperties)\">\n      <summary>\n        <para>Add a RectTransform to be driven.</para>\n      </summary>\n      <param name=\"driver\">The object to drive properties.</param>\n      <param name=\"rectTransform\">The RectTransform to be driven.</param>\n      <param name=\"drivenProperties\">The properties to be driven.</param>\n    </member>\n    <member name=\"M:UnityEngine.DrivenRectTransformTracker.Clear\">\n      <summary>\n        <para>Clear the list of RectTransforms being driven.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.DrivenRectTransformTracker.StartRecordingUndo\">\n      <summary>\n        <para>Resume recording undo of driven RectTransforms.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.DrivenRectTransformTracker.StopRecordingUndo\">\n      <summary>\n        <para>Stop recording undo actions from driven RectTransforms.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.DrivenTransformProperties\">\n      <summary>\n        <para>An enumeration of transform properties that can be driven on a RectTransform by an object.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.All\">\n      <summary>\n        <para>Selects all driven properties.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.AnchoredPosition\">\n      <summary>\n        <para>Selects driven property RectTransform.anchoredPosition.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.AnchoredPosition3D\">\n      <summary>\n        <para>Selects driven property RectTransform.anchoredPosition3D.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.AnchoredPositionX\">\n      <summary>\n        <para>Selects driven property RectTransform.anchoredPosition.x.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.AnchoredPositionY\">\n      <summary>\n        <para>Selects driven property RectTransform.anchoredPosition.y.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.AnchoredPositionZ\">\n      <summary>\n        <para>Selects driven property RectTransform.anchoredPosition3D.z.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.AnchorMax\">\n      <summary>\n        <para>Selects driven property combining AnchorMaxX and AnchorMaxY.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.AnchorMaxX\">\n      <summary>\n        <para>Selects driven property RectTransform.anchorMax.x.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.AnchorMaxY\">\n      <summary>\n        <para>Selects driven property RectTransform.anchorMax.y.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.AnchorMin\">\n      <summary>\n        <para>Selects driven property combining AnchorMinX and AnchorMinY.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.AnchorMinX\">\n      <summary>\n        <para>Selects driven property RectTransform.anchorMin.x.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.AnchorMinY\">\n      <summary>\n        <para>Selects driven property RectTransform.anchorMin.y.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.Anchors\">\n      <summary>\n        <para>Selects driven property combining AnchorMinX, AnchorMinY, AnchorMaxX and AnchorMaxY.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.None\">\n      <summary>\n        <para>Deselects all driven properties.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.Pivot\">\n      <summary>\n        <para>Selects driven property combining PivotX and PivotY.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.PivotX\">\n      <summary>\n        <para>Selects driven property RectTransform.pivot.x.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.PivotY\">\n      <summary>\n        <para>Selects driven property RectTransform.pivot.y.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.Rotation\">\n      <summary>\n        <para>Selects driven property Transform.localRotation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.Scale\">\n      <summary>\n        <para>Selects driven property combining ScaleX, ScaleY &amp;&amp; ScaleZ.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.ScaleX\">\n      <summary>\n        <para>Selects driven property Transform.localScale.x.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.ScaleY\">\n      <summary>\n        <para>Selects driven property Transform.localScale.y.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.ScaleZ\">\n      <summary>\n        <para>Selects driven property Transform.localScale.z.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.SizeDelta\">\n      <summary>\n        <para>Selects driven property combining SizeDeltaX and SizeDeltaY.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.SizeDeltaX\">\n      <summary>\n        <para>Selects driven property RectTransform.sizeDelta.x.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DrivenTransformProperties.SizeDeltaY\">\n      <summary>\n        <para>Selects driven property RectTransform.sizeDelta.y.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.DurationUnit\">\n      <summary>\n        <para>Describe the unit of a duration.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DurationUnit.Fixed\">\n      <summary>\n        <para>A fixed duration is a duration expressed in seconds.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.DurationUnit.Normalized\">\n      <summary>\n        <para>A normalized duration is a duration expressed in percentage.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.DynamicGI\">\n      <summary>\n        <para>Allows to control the dynamic Global Illumination.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.DynamicGI.indirectScale\">\n      <summary>\n        <para>Allows for scaling the contribution coming from realtime &amp; static  lightmaps.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.DynamicGI.isConverged\">\n      <summary>\n        <para>Is precomputed realtime Global Illumination output converged?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.DynamicGI.synchronousMode\">\n      <summary>\n        <para>When enabled, new dynamic Global Illumination output is shown in each frame.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.DynamicGI.updateThreshold\">\n      <summary>\n        <para>Threshold for limiting updates of realtime GI. The unit of measurement is \"percentage intensity change\".</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.DynamicGI.SetEmissive(UnityEngine.Renderer,UnityEngine.Color)\">\n      <summary>\n        <para>Allows to set an emissive color for a given renderer quickly, without the need to render the emissive input for the entire system.</para>\n      </summary>\n      <param name=\"renderer\">The Renderer that should get a new color.</param>\n      <param name=\"color\">The emissive Color.</param>\n    </member>\n    <member name=\"M:UnityEngine.DynamicGI.SetEnvironmentData(System.Single[])\">\n      <summary>\n        <para>Allows overriding the distant environment lighting for Realtime GI, without changing the Skybox Material.</para>\n      </summary>\n      <param name=\"input\">Array of float values to be used for Realtime GI environment lighting.</param>\n    </member>\n    <member name=\"M:UnityEngine.DynamicGI.UpdateEnvironment\">\n      <summary>\n        <para>Schedules an update of the environment texture.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.DynamicGI.UpdateMaterials(UnityEngine.Renderer)\">\n      <summary>\n        <para>Schedules an update of the albedo and emissive textures of a system that contains the renderer or the terrain.</para>\n      </summary>\n      <param name=\"renderer\">The Renderer to use when searching for a system to update.</param>\n      <param name=\"terrain\">The Terrain to use when searching for systems to update.</param>\n    </member>\n    <member name=\"M:UnityEngine.DynamicGI.UpdateMaterials\">\n      <summary>\n        <para>Schedules an update of the albedo and emissive textures of a system that contains the renderer or the terrain.</para>\n      </summary>\n      <param name=\"renderer\">The Renderer to use when searching for a system to update.</param>\n      <param name=\"terrain\">The Terrain to use when searching for systems to update.</param>\n    </member>\n    <member name=\"M:UnityEngine.DynamicGI.UpdateMaterials\">\n      <summary>\n        <para>Schedules an update of the albedo and emissive textures of a system that contains the renderer or the terrain.</para>\n      </summary>\n      <param name=\"renderer\">The Renderer to use when searching for a system to update.</param>\n      <param name=\"terrain\">The Terrain to use when searching for systems to update.</param>\n    </member>\n    <member name=\"T:UnityEngine.EdgeCollider2D\">\n      <summary>\n        <para>Collider for 2D physics representing an arbitrary set of connected edges (lines) defined by its vertices.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EdgeCollider2D.edgeCount\">\n      <summary>\n        <para>Gets the number of edges.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EdgeCollider2D.edgeRadius\">\n      <summary>\n        <para>Controls the radius of all edges created by the collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EdgeCollider2D.pointCount\">\n      <summary>\n        <para>Gets the number of points.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.EdgeCollider2D.points\">\n      <summary>\n        <para>Get or set the points defining multiple continuous edges.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.EdgeCollider2D.Reset\">\n      <summary>\n        <para>Reset to a single edge consisting of two points.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Effector2D\">\n      <summary>\n        <para>A base class for all 2D effectors.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Effector2D.colliderMask\">\n      <summary>\n        <para>The mask used to select specific layers allowed to interact with the effector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Effector2D.useColliderMask\">\n      <summary>\n        <para>Should the collider-mask be used or the global collision matrix?</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EffectorForceMode2D\">\n      <summary>\n        <para>The mode used to apply Effector2D forces.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EffectorForceMode2D.Constant\">\n      <summary>\n        <para>The force is applied at a constant rate.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EffectorForceMode2D.InverseLinear\">\n      <summary>\n        <para>The force is applied inverse-linear relative to a point.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EffectorForceMode2D.InverseSquared\">\n      <summary>\n        <para>The force is applied inverse-squared relative to a point.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EffectorSelection2D\">\n      <summary>\n        <para>Selects the source and/or target to be used by an Effector2D.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EffectorSelection2D.Collider\">\n      <summary>\n        <para>The source/target is defined by the Collider2D.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EffectorSelection2D.Rigidbody\">\n      <summary>\n        <para>The source/target is defined by the Rigidbody2D.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EllipsoidParticleEmitter\">\n      <summary>\n        <para>Class used to allow GameObject.AddComponent / GameObject.GetComponent to be used.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Event\">\n      <summary>\n        <para>A UnityGUI event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.alt\">\n      <summary>\n        <para>Is Alt/Option key held down? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.button\">\n      <summary>\n        <para>Which mouse button was pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.capsLock\">\n      <summary>\n        <para>Is Caps Lock on? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.character\">\n      <summary>\n        <para>The character typed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.clickCount\">\n      <summary>\n        <para>How many consecutive mouse clicks have we received.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.command\">\n      <summary>\n        <para>Is Command/Windows key held down? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.commandName\">\n      <summary>\n        <para>The name of an ExecuteCommand or ValidateCommand Event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.control\">\n      <summary>\n        <para>Is Control key held down? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.current\">\n      <summary>\n        <para>The current event that's being processed right now.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.delta\">\n      <summary>\n        <para>The relative movement of the mouse compared to last event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.displayIndex\">\n      <summary>\n        <para>Index of display that the event belongs to.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.functionKey\">\n      <summary>\n        <para>Is the current keypress a function key? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.isKey\">\n      <summary>\n        <para>Is this event a keyboard event? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.isMouse\">\n      <summary>\n        <para>Is this event a mouse event? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.keyCode\">\n      <summary>\n        <para>The raw key code for keyboard events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.modifiers\">\n      <summary>\n        <para>Which modifier keys are held down.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.mousePosition\">\n      <summary>\n        <para>The mouse position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.numeric\">\n      <summary>\n        <para>Is the current keypress on the numeric keyboard? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.shift\">\n      <summary>\n        <para>Is Shift held down? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Event.type\">\n      <summary>\n        <para>The type of event.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Event.GetEventCount\">\n      <summary>\n        <para>Returns the current number of events that are stored in the event queue.</para>\n      </summary>\n      <returns>\n        <para>Current number of events currently in the event queue.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Event.GetTypeForControl(System.Int32)\">\n      <summary>\n        <para>Get a filtered event type for a given control ID.</para>\n      </summary>\n      <param name=\"controlID\">The ID of the control you are querying from.</param>\n    </member>\n    <member name=\"M:UnityEngine.Event.KeyboardEvent(System.String)\">\n      <summary>\n        <para>Create a keyboard event.</para>\n      </summary>\n      <param name=\"key\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Event.PopEvent(UnityEngine.Event)\">\n      <summary>\n        <para>Get the next queued [Event] from the event system.</para>\n      </summary>\n      <param name=\"outEvent\">Next Event.</param>\n    </member>\n    <member name=\"M:UnityEngine.Event.Use\">\n      <summary>\n        <para>Use this event.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EventModifiers\">\n      <summary>\n        <para>Types of modifier key that can be active during a keystroke event.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventModifiers.Alt\">\n      <summary>\n        <para>Alt key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventModifiers.CapsLock\">\n      <summary>\n        <para>Caps lock key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventModifiers.Command\">\n      <summary>\n        <para>Command key (Mac).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventModifiers.Control\">\n      <summary>\n        <para>Control key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventModifiers.FunctionKey\">\n      <summary>\n        <para>Function key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventModifiers.None\">\n      <summary>\n        <para>No modifier key pressed during a keystroke event.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventModifiers.Numeric\">\n      <summary>\n        <para>Num lock key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventModifiers.Shift\">\n      <summary>\n        <para>Shift key.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Events.PersistentListenerMode\">\n      <summary>\n        <para>THe mode that a listener is operating in.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Events.PersistentListenerMode.Bool\">\n      <summary>\n        <para>The listener will bind to one argument bool functions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Events.PersistentListenerMode.EventDefined\">\n      <summary>\n        <para>The listener will use the function binding specified by the even.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Events.PersistentListenerMode.Float\">\n      <summary>\n        <para>The listener will bind to one argument float functions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Events.PersistentListenerMode.Int\">\n      <summary>\n        <para>The listener will bind to one argument int functions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Events.PersistentListenerMode.Object\">\n      <summary>\n        <para>The listener will bind to one argument Object functions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Events.PersistentListenerMode.String\">\n      <summary>\n        <para>The listener will bind to one argument string functions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Events.PersistentListenerMode.Void\">\n      <summary>\n        <para>The listener will bind to zero argument functions.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Events.UnityAction\">\n      <summary>\n        <para>Zero argument delegate used by UnityEvents.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Events.UnityAction_1\">\n      <summary>\n        <para>One argument delegate used by UnityEvents.</para>\n      </summary>\n      <param name=\"arg0\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Events.UnityAction_2\">\n      <summary>\n        <para>Two argument delegate used by UnityEvents.</para>\n      </summary>\n      <param name=\"arg0\"></param>\n      <param name=\"arg1\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Events.UnityAction_3\">\n      <summary>\n        <para>Three argument delegate used by UnityEvents.</para>\n      </summary>\n      <param name=\"arg0\"></param>\n      <param name=\"arg1\"></param>\n      <param name=\"arg2\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Events.UnityAction_4\">\n      <summary>\n        <para>Four argument delegate used by UnityEvents.</para>\n      </summary>\n      <param name=\"arg0\"></param>\n      <param name=\"arg1\"></param>\n      <param name=\"arg2\"></param>\n      <param name=\"arg3\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Events.UnityEvent\">\n      <summary>\n        <para>A zero argument persistent callback that can be saved with the scene.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Events.UnityEvent.AddListener(UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Add a non persistent listener to the UnityEvent.</para>\n      </summary>\n      <param name=\"call\">Callback function.</param>\n    </member>\n    <member name=\"M:UnityEngine.Events.UnityEvent.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Events.UnityEvent.Invoke\">\n      <summary>\n        <para>Invoke all registered callbacks (runtime and persistent).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Events.UnityEvent.RemoveListener(UnityEngine.Events.UnityAction)\">\n      <summary>\n        <para>Remove a non persistent listener from the UnityEvent.</para>\n      </summary>\n      <param name=\"call\">Callback function.</param>\n    </member>\n    <member name=\"T:UnityEngine.Events.UnityEvent`1\">\n      <summary>\n        <para>One argument version of UnityEvent.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Events.UnityEvent`2\">\n      <summary>\n        <para>Two argument version of UnityEvent.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Events.UnityEvent`3\">\n      <summary>\n        <para>Three argument version of UnityEvent.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Events.UnityEvent`4\">\n      <summary>\n        <para>Four argument version of UnityEvent.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Events.UnityEventBase\">\n      <summary>\n        <para>Abstract base class for UnityEvents.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Events.UnityEventBase.GetPersistentEventCount\">\n      <summary>\n        <para>Get the number of registered persistent listeners.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Events.UnityEventBase.GetPersistentMethodName(System.Int32)\">\n      <summary>\n        <para>Get the target method name of the listener at index index.</para>\n      </summary>\n      <param name=\"index\">Index of the listener to query.</param>\n    </member>\n    <member name=\"M:UnityEngine.Events.UnityEventBase.GetPersistentTarget(System.Int32)\">\n      <summary>\n        <para>Get the target component of the listener at index index.</para>\n      </summary>\n      <param name=\"index\">Index of the listener to query.</param>\n    </member>\n    <member name=\"M:UnityEngine.Events.UnityEventBase.GetValidMethodInfo(System.Object,System.String,System.Type[])\">\n      <summary>\n        <para>Given an object, function name, and a list of argument types; find the method that matches.</para>\n      </summary>\n      <param name=\"obj\">Object to search for the method.</param>\n      <param name=\"functionName\">Function name to search for.</param>\n      <param name=\"argumentTypes\">Argument types for the function.</param>\n    </member>\n    <member name=\"M:UnityEngine.Events.UnityEventBase.RemoveAllListeners\">\n      <summary>\n        <para>Remove all non-persisent (ie created from script) listeners  from the event.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Events.UnityEventBase.SetPersistentListenerState(System.Int32,UnityEngine.Events.UnityEventCallState)\">\n      <summary>\n        <para>Modify the execution state of a persistent listener.</para>\n      </summary>\n      <param name=\"index\">Index of the listener to query.</param>\n      <param name=\"state\">State to set.</param>\n    </member>\n    <member name=\"T:UnityEngine.Events.UnityEventCallState\">\n      <summary>\n        <para>Controls the scope of UnityEvent callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Events.UnityEventCallState.EditorAndRuntime\">\n      <summary>\n        <para>Callback is always issued.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Events.UnityEventCallState.Off\">\n      <summary>\n        <para>Callback is not issued.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Events.UnityEventCallState.RuntimeOnly\">\n      <summary>\n        <para>Callback is only issued in the Runtime and Editor playmode.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.EventType\">\n      <summary>\n        <para>Types of UnityGUI input and processing events.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.mouseDown\">\n      <summary>\n        <para>An event that is called when the mouse is clicked.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.mouseDrag\">\n      <summary>\n        <para>An event that is called when the mouse is clicked and dragged.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.mouseUp\">\n      <summary>\n        <para>An event that is called when the mouse is no longer being clicked.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.ContextClick\">\n      <summary>\n        <para>User has right-clicked (or control-clicked on the mac).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.DragExited\">\n      <summary>\n        <para>Editor only: drag &amp; drop operation exited.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.DragPerform\">\n      <summary>\n        <para>Editor only: drag &amp; drop operation performed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.DragUpdated\">\n      <summary>\n        <para>Editor only: drag &amp; drop operation updated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.ExecuteCommand\">\n      <summary>\n        <para>Execute a special command (eg. copy &amp; paste).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.Ignore\">\n      <summary>\n        <para>Event should be ignored.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.KeyDown\">\n      <summary>\n        <para>A keyboard key was pressed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.KeyUp\">\n      <summary>\n        <para>A keyboard key was released.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.Layout\">\n      <summary>\n        <para>A layout event.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.MouseDown\">\n      <summary>\n        <para>Mouse button was pressed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.MouseDrag\">\n      <summary>\n        <para>Mouse was dragged.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.MouseEnterWindow\">\n      <summary>\n        <para>Mouse entered a window (Editor views only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.MouseLeaveWindow\">\n      <summary>\n        <para>Mouse left a window (Editor views only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.MouseMove\">\n      <summary>\n        <para>Mouse was moved (Editor views only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.MouseUp\">\n      <summary>\n        <para>Mouse button was released.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.Repaint\">\n      <summary>\n        <para>A repaint event. One is sent every frame.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.ScrollWheel\">\n      <summary>\n        <para>The scroll wheel was moved.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.Used\">\n      <summary>\n        <para>Already processed event.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.EventType.ValidateCommand\">\n      <summary>\n        <para>Validates a special command (e.g. copy &amp; paste).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ExcludeFromObjectFactoryAttribute\">\n      <summary>\n        <para>Add this attribute to a class to prevent the class and its inherited classes from being created with ObjectFactory methods.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ExcludeFromObjectFactoryAttribute.#ctor\">\n      <summary>\n        <para>Default constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ExcludeFromPresetAttribute\">\n      <summary>\n        <para>Add this attribute to a class to prevent creating a Preset from the instances of the class.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ExecuteInEditMode\">\n      <summary>\n        <para>Makes all instances of a script execute in edit mode.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ExitGUIException\">\n      <summary>\n        <para>An exception that will prevent all subsequent immediate mode GUI functions from evaluating for the remainder of the GUI loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.AI.NavMeshLocation\">\n      <summary>\n        <para>A world position that is guaranteed to be on the surface of the NavMesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.AI.NavMeshLocation.polygon\">\n      <summary>\n        <para>Unique identifier for the node in the NavMesh to which the world position has been mapped.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.AI.NavMeshLocation.position\">\n      <summary>\n        <para>A world position that sits precisely on the surface of the NavMesh or along its links.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.AI.NavMeshPolyTypes\">\n      <summary>\n        <para>The types of nodes in the navigation data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.AI.NavMeshPolyTypes.Ground\">\n      <summary>\n        <para>Type of node in the NavMesh representing one surface polygon.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.AI.NavMeshPolyTypes.OffMeshConnection\">\n      <summary>\n        <para>Type of node in the NavMesh representing a point-to-point connection between two positions on the NavMesh surface.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.AI.NavMeshQuery\">\n      <summary>\n        <para>Object used for doing navigation operations in a NavMeshWorld.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshQuery.BeginFindPath(UnityEngine.Experimental.AI.NavMeshLocation,UnityEngine.Experimental.AI.NavMeshLocation,System.Int32,Unity.Collections.NativeArray`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Initiates a pathfinding operation between two locations on the NavMesh.</para>\n      </summary>\n      <param name=\"costs\">Array of custom cost values for all of the 32 possible area types. Each value must be at least 1.0f. This parameter is optional and defaults to the area costs configured in the project settings. See Also: NavMesh.GetAreaCost.</param>\n      <param name=\"areaMask\">Bitmask with values of 1 set at the indices for areas that can be traversed, and values of 0 for areas that are not traversable. This parameter is optional and defaults to NavMesh.AllAreas, if omitted. See Also:.</param>\n      <param name=\"start\">The start location on the NavMesh for the path.</param>\n      <param name=\"end\">The location on the NavMesh where the path ends.</param>\n      <returns>\n        <para>InProgress if the operation was successful and the query is ready to search for a path.\n\nFailure if the query's NavMeshWorld or any of the received parameters are no longer valid.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshQuery.CreateLocation(UnityEngine.Vector3,UnityEngine.Experimental.AI.PolygonId)\">\n      <summary>\n        <para>Returns a valid NavMeshLocation for a position and a polygon provided by the user.</para>\n      </summary>\n      <param name=\"position\">World position of the NavMeshLocation to be created.</param>\n      <param name=\"polygon\">Valid identifier for the NavMesh node.</param>\n      <returns>\n        <para>Object containing the desired position and NavMesh node.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshQuery.#ctor(UnityEngine.Experimental.AI.NavMeshWorld,Unity.Collections.Allocator,System.Int32)\">\n      <summary>\n        <para>Creates the NavMeshQuery object and allocates memory to store NavMesh node information, if required.</para>\n      </summary>\n      <param name=\"world\">NavMeshWorld object used as an entry point to the collection of NavMesh objects. This object that can be used by query operations.</param>\n      <param name=\"allocator\">Label indicating the desired life time of the object. (Known issue: Currently allocator has no effect).</param>\n      <param name=\"pathNodePoolSize\">The number of nodes that can be temporarily stored in the query during search operations. This value defaults to 0 if no other value is specified.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshQuery.Dispose\">\n      <summary>\n        <para>Destroys the NavMeshQuery and deallocates all memory used by it.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshQuery.EndFindPath(System.Int32&amp;)\">\n      <summary>\n        <para>Obtains the number of nodes in the path that has been computed during a successful NavMeshQuery.UpdateFindPath operation.</para>\n      </summary>\n      <param name=\"pathSize\">A reference to an int which will be set to the number of NavMesh nodes in the found path.</param>\n      <returns>\n        <para>Success when the number of nodes in the path was retrieved correctly.\n\nPartialPath when a path was found but it falls short of the desired end location.\n\nFailure when the path size can not be evaluated because the preceding call to UpdateFindPath was not successful.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshQuery.GetAgentTypeIdForPolygon(UnityEngine.Experimental.AI.PolygonId)\">\n      <summary>\n        <para>Returns the identifier of the agent type the NavMesh was baked for or for which the link has been configured.</para>\n      </summary>\n      <param name=\"polygon\">Identifier of a node from a NavMesh surface or link.</param>\n      <returns>\n        <para>Agent type identifier.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshQuery.GetPathResult(Unity.Collections.NativeSlice`1&lt;UnityEngine.Experimental.AI.PolygonId&gt;)\">\n      <summary>\n        <para>Copies into the provided array the list of NavMesh nodes that form the path found by the NavMeshQuery operation.</para>\n      </summary>\n      <param name=\"path\">Data array to be filled with the sequence of NavMesh nodes that comprises the found path.</param>\n      <returns>\n        <para>Number of path nodes successfully copied into the provided array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshQuery.GetPolygonType(UnityEngine.Experimental.AI.PolygonId)\">\n      <summary>\n        <para>Returns whether the NavMesh node is a polygon or a link.</para>\n      </summary>\n      <param name=\"polygon\">Identifier of a node from a NavMesh surface or link.</param>\n      <returns>\n        <para>Ground when the node is a polygon on a NavMesh surface.\n\nOffMeshConnection when the node is a.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshQuery.GetPortalPoints(UnityEngine.Experimental.AI.PolygonId,UnityEngine.Experimental.AI.PolygonId,UnityEngine.Vector3&amp;,UnityEngine.Vector3&amp;)\">\n      <summary>\n        <para>Obtains the end points of the line segment common to two adjacent NavMesh nodes.</para>\n      </summary>\n      <param name=\"polygon\">First NavMesh node.</param>\n      <param name=\"neighbourPolygon\">Second NavMesh node.</param>\n      <param name=\"left\">One of the world points for the resulting separation edge which must be passed through when traversing between the two specified nodes. This point is the left side of the edge when traversing from the first node to the second.</param>\n      <param name=\"right\">One of the world points for the resulting separation edge which must be passed through when traversing between the two specified nodes. This point is the right side of the edge when traversing from the first node to the second.</param>\n      <returns>\n        <para>True if a connection exists between the two NavMesh nodes.\nFalse if no connection exists between the two NavMesh nodes.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshQuery.IsValid(UnityEngine.Experimental.AI.PolygonId)\">\n      <summary>\n        <para>Returns true if the node referenced by the specified PolygonId is active in the NavMesh.</para>\n      </summary>\n      <param name=\"polygon\">Identifier of the NavMesh node to be checked.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshQuery.IsValid(UnityEngine.Experimental.AI.NavMeshLocation)\">\n      <summary>\n        <para>Returns true if the node referenced by the PolygonId contained in the NavMeshLocation is active in the NavMesh.</para>\n      </summary>\n      <param name=\"location\">Location on the NavMesh to be checked. Same as checking location.polygon directly.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshQuery.MapLocation(UnityEngine.Vector3,UnityEngine.Vector3,System.Int32,System.Int32)\">\n      <summary>\n        <para>Finds the closest point and PolygonId on the NavMesh for a given world position.</para>\n      </summary>\n      <param name=\"position\">World position for which the closest point on the NavMesh needs to be found.</param>\n      <param name=\"extents\">Maximum distance, from the specified position, expanding along all three axes, within which NavMesh surfaces are searched.</param>\n      <param name=\"agentTypeID\">Identifier for the agent type whose NavMesh surfaces should be selected for this operation. The Humanoid agent type exists for all NavMeshes and has an ID of 0. Other agent types can be defined manually through the Editor. A separate NavMesh surface needs to be baked for each agent type.</param>\n      <param name=\"areaMask\">Bitmask used to represent areas of the NavMesh that should (value of 1) or shouldn't (values of 0) be sampled. This parameter is optional and defaults to NavMesh.AllAreas if unspecified. See Also:.</param>\n      <returns>\n        <para>An object with position and valid PolygonId  - when a point on the NavMesh has been found.\n\nAn invalid object - when no NavMesh surface with the desired features has been found within the search area. See Also: NavMeshQuery.IsValid.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshQuery.MoveLocation(UnityEngine.Experimental.AI.NavMeshLocation,UnityEngine.Vector3,System.Int32)\">\n      <summary>\n        <para>Translates a NavMesh location to another position without losing contact with the surface.</para>\n      </summary>\n      <param name=\"location\">Position to be moved across the NavMesh surface.</param>\n      <param name=\"target\">World position you require the agent to move to.</param>\n      <param name=\"areaMask\">Bitmask with values of 1 set at the indices corresponding to areas that can be traversed, and with values of 0 for areas that should not be traversed. This parameter can be omitted, in which case it defaults to NavMesh.AllAreas. See Also:.</param>\n      <returns>\n        <para>A new location on the NavMesh placed as closely as possible to the specified target position.\n\nThe start location is returned when that start is inside an area which is not allowed by the areaMask.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshQuery.MoveLocations(Unity.Collections.NativeSlice`1&lt;UnityEngine.Experimental.AI.NavMeshLocation&gt;,Unity.Collections.NativeSlice`1&lt;UnityEngine.Vector3&gt;,Unity.Collections.NativeSlice`1&lt;System.Int32&gt;)\">\n      <summary>\n        <para>Translates a series of NavMesh locations to other positions without losing contact with the surface.</para>\n      </summary>\n      <param name=\"locations\">Array of positions to be moved across the NavMesh surface. At the end of the method call this array contains the resulting locations.</param>\n      <param name=\"targets\">World positions to be used as movement targets by the agent.</param>\n      <param name=\"areaMasks\">Filters for the areas which can be traversed during the movement to each of the locations.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshQuery.MoveLocationsInSameAreas(Unity.Collections.NativeSlice`1&lt;UnityEngine.Experimental.AI.NavMeshLocation&gt;,Unity.Collections.NativeSlice`1&lt;UnityEngine.Vector3&gt;,System.Int32)\">\n      <summary>\n        <para>Translates a series of NavMesh locations to other positions without losing contact with the surface, given one common area filter for all of them.</para>\n      </summary>\n      <param name=\"locations\">Array of positions to be moved across the NavMesh surface. At the end of the method call this array contains the resulting locations.</param>\n      <param name=\"targets\">World positions you want the agent to reach when moving to each of the locations.</param>\n      <param name=\"areaMask\">Filters for the areas which can be traversed during the movement to each of the locations.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshQuery.PolygonLocalToWorldMatrix(UnityEngine.Experimental.AI.PolygonId)\">\n      <summary>\n        <para>Returns the transformation matrix of the NavMesh surface that contains the specified NavMesh node (Read Only).</para>\n      </summary>\n      <param name=\"polygon\">NavMesh node for which its owner's transform must be determined.</param>\n      <returns>\n        <para>Transformation matrix for the surface owning the specified polygon.\n\nMatrix4x4.identity when the NavMesh node is a.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshQuery.PolygonWorldToLocalMatrix(UnityEngine.Experimental.AI.PolygonId)\">\n      <summary>\n        <para>Returns the inverse transformation matrix of the NavMesh surface that contains the specified NavMesh node (Read Only).</para>\n      </summary>\n      <param name=\"polygon\">NavMesh node for which its owner's inverse transform must be determined.</param>\n      <returns>\n        <para>Inverse transformation matrix of the surface owning the specified polygon.\n\nMatrix4x4.identity when the NavMesh node is a.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshQuery.UpdateFindPath(System.Int32,System.Int32&amp;)\">\n      <summary>\n        <para>Continues a path search that is in progress.</para>\n      </summary>\n      <param name=\"iterations\">Maximum number of nodes to be traversed by the search algorithm during this call.</param>\n      <param name=\"iterationsPerformed\">Outputs the actual number of nodes that have been traversed during this call.</param>\n      <returns>\n        <para>InProgress if the search needs to continue further by calling UpdateFindPath again.\n\nSuccess if the search is completed and a path has been found or not.\n\nFailure if the search for the desired position could not be completed because the NavMesh has changed significantly since the search was initiated.\n\nAdditionally the returned value can contain the OutOfNodes flag when the pathNodePoolSize parameter for the NavMeshQuery initialization was not large enough to accommodate the search space.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.AI.NavMeshWorld\">\n      <summary>\n        <para>Assembles together a collection of NavMesh surfaces and links that are used as a whole for performing navigation operations.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshWorld.AddDependency(Unity.Jobs.JobHandle)\">\n      <summary>\n        <para>Tells the NavMesh world to halt any changes until the specified job is completed.</para>\n      </summary>\n      <param name=\"job\">The job that needs to be completed before the NavMesh world can be modified in any way.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshWorld.GetDefaultWorld\">\n      <summary>\n        <para>Returns a reference to the single NavMeshWorld that can currently exist and be used in Unity.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.NavMeshWorld.IsValid\">\n      <summary>\n        <para>Returns true if the NavMeshWorld has been properly initialized.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.AI.PathQueryStatus\">\n      <summary>\n        <para>Bit flags representing the resulting state of NavMeshQuery operations.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.AI.PathQueryStatus.BufferTooSmall\">\n      <summary>\n        <para>The node buffer of the query was too small to store all results.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.AI.PathQueryStatus.Failure\">\n      <summary>\n        <para>The operation has failed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.AI.PathQueryStatus.InProgress\">\n      <summary>\n        <para>The operation is in progress.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.AI.PathQueryStatus.InvalidParam\">\n      <summary>\n        <para>A parameter did not contain valid information, useful for carring out the NavMesh query.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.AI.PathQueryStatus.OutOfMemory\">\n      <summary>\n        <para>Operation ran out of memory.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.AI.PathQueryStatus.OutOfNodes\">\n      <summary>\n        <para>Query ran out of node stack space during a search.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.AI.PathQueryStatus.PartialResult\">\n      <summary>\n        <para>Query did not reach the end location, returning best guess.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.AI.PathQueryStatus.StatusDetailMask\">\n      <summary>\n        <para>Bitmask that has 0 set for the Success, Failure and InProgress bits and 1 set for all the other flags.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.AI.PathQueryStatus.Success\">\n      <summary>\n        <para>The operation was successful.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.AI.PathQueryStatus.WrongMagic\">\n      <summary>\n        <para>Data in the NavMesh cannot be recognized and used.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.AI.PathQueryStatus.WrongVersion\">\n      <summary>\n        <para>Data in the NavMesh world has a wrong version.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.AI.PolygonId\">\n      <summary>\n        <para>Represents a compact identifier for the data of a NavMesh node.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.PolygonId.Equals(UnityEngine.Experimental.AI.PolygonId)\">\n      <summary>\n        <para>Returns true if two PolygonId objects refer to the same NavMesh node.</para>\n      </summary>\n      <param name=\"rhs\"></param>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.PolygonId.Equals(System.Object)\">\n      <summary>\n        <para>Returns true if two PolygonId objects refer to the same NavMesh node.</para>\n      </summary>\n      <param name=\"rhs\"></param>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.PolygonId.GetHashCode\">\n      <summary>\n        <para>Returns the hash code for use in collections.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.AI.PolygonId.IsNull\">\n      <summary>\n        <para>Returns true if the PolygonId has been created empty and has never pointed to any node in the NavMesh.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.AI.PolygonId.op_Equal(UnityEngine.Experimental.AI.PolygonId,UnityEngine.Experimental.AI.PolygonId)\">\n      <summary>\n        <para>Returns true if two PolygonId objects refer to the same NavMesh node or if they are both null.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.AI.PolygonId.op_NotEqual(UnityEngine.Experimental.AI.PolygonId,UnityEngine.Experimental.AI.PolygonId)\">\n      <summary>\n        <para>Returns true if two PolygonId objects refer to different NavMesh nodes or if only one of them is null.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Animations.AnimationHumanStream\">\n      <summary>\n        <para>The humanoid stream of animation data passed from one Playable to another.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.AnimationHumanStream.bodyLocalPosition\">\n      <summary>\n        <para>The position of the body center of mass relative to the root.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.AnimationHumanStream.bodyLocalRotation\">\n      <summary>\n        <para>The rotation of the body center of mass relative to the root.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.AnimationHumanStream.bodyPosition\">\n      <summary>\n        <para>The position of the body center of mass in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.AnimationHumanStream.bodyRotation\">\n      <summary>\n        <para>The rotation of the body center of mass in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.AnimationHumanStream.humanScale\">\n      <summary>\n        <para>The scale of the Avatar. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.AnimationHumanStream.isValid\">\n      <summary>\n        <para>Returns true if the stream is valid; false otherwise. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.AnimationHumanStream.leftFootHeight\">\n      <summary>\n        <para>The left foot height from the floor. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.AnimationHumanStream.leftFootVelocity\">\n      <summary>\n        <para>The left foot velocity from the last evaluated frame. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.AnimationHumanStream.rightFootHeight\">\n      <summary>\n        <para>The right foot height from the floor. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.AnimationHumanStream.rightFootVelocity\">\n      <summary>\n        <para>The right foot velocity from the last evaluated frame. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.GetGoalLocalPosition(UnityEngine.AvatarIKGoal)\">\n      <summary>\n        <para>Returns the position of this IK goal relative to the root.</para>\n      </summary>\n      <param name=\"index\">The AvatarIKGoal that is queried.</param>\n      <returns>\n        <para>The position of this IK goal.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.GetGoalLocalRotation(UnityEngine.AvatarIKGoal)\">\n      <summary>\n        <para>Returns the rotation of this IK goal relative to the root.</para>\n      </summary>\n      <param name=\"index\">The AvatarIKGoal that is queried.</param>\n      <returns>\n        <para>The rotation of this IK goal.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.GetGoalPosition(UnityEngine.AvatarIKGoal)\">\n      <summary>\n        <para>Returns the position of this IK goal in world space.</para>\n      </summary>\n      <param name=\"index\">The AvatarIKGoal that is queried.</param>\n      <returns>\n        <para>The position of this IK goal.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.GetGoalPositionFromPose(UnityEngine.AvatarIKGoal)\">\n      <summary>\n        <para>Returns the position of this IK goal in world space computed from the stream current pose.</para>\n      </summary>\n      <param name=\"index\">The AvatarIKGoal that is queried.</param>\n      <returns>\n        <para>The position of this IK goal.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.GetGoalRotation(UnityEngine.AvatarIKGoal)\">\n      <summary>\n        <para>Returns the rotation of this IK goal in world space.</para>\n      </summary>\n      <param name=\"index\">The AvatarIKGoal that is queried.</param>\n      <returns>\n        <para>The rotation of this IK goal.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.GetGoalRotationFromPose(UnityEngine.AvatarIKGoal)\">\n      <summary>\n        <para>Returns the rotation of this IK goal in world space computed from the stream current pose.</para>\n      </summary>\n      <param name=\"index\">The AvatarIKGoal that is queried.</param>\n      <returns>\n        <para>The rotation of this IK goal.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.GetGoalWeightPosition(UnityEngine.AvatarIKGoal)\">\n      <summary>\n        <para>Returns the position weight of the IK goal.</para>\n      </summary>\n      <param name=\"index\">The AvatarIKGoal that is queried.</param>\n      <returns>\n        <para>The position weight of the IK goal.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.GetGoalWeightRotation(UnityEngine.AvatarIKGoal)\">\n      <summary>\n        <para>Returns the rotation weight of the IK goal.</para>\n      </summary>\n      <param name=\"index\">The AvatarIKGoal that is queried.</param>\n      <returns>\n        <para>The rotation weight of the IK goal.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.GetHintPosition(UnityEngine.AvatarIKHint)\">\n      <summary>\n        <para>Returns the position of this IK Hint in world space.</para>\n      </summary>\n      <param name=\"index\">The AvatarIKHint that is queried.</param>\n      <returns>\n        <para>The position of this IK Hint.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.GetHintWeightPosition(UnityEngine.AvatarIKHint)\">\n      <summary>\n        <para>Returns the position weight of the IK Hint.</para>\n      </summary>\n      <param name=\"index\">The AvatarIKHint that is queried.</param>\n      <returns>\n        <para>The position weight of the IK Hint.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.GetMuscle(UnityEngine.Experimental.Animations.MuscleHandle)\">\n      <summary>\n        <para>Returns the muscle value.</para>\n      </summary>\n      <param name=\"muscle\">The Muscle that is queried.</param>\n      <returns>\n        <para>The muscle value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.ResetToStancePose\">\n      <summary>\n        <para>Reset the current pose to the stance pose (T Pose).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.SetGoalLocalPosition(UnityEngine.AvatarIKGoal,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the position of this IK goal relative to the root.</para>\n      </summary>\n      <param name=\"index\">The AvatarIKGoal that is queried.</param>\n      <param name=\"pos\">The position of this IK goal.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.SetGoalLocalRotation(UnityEngine.AvatarIKGoal,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Sets the rotation of this IK goal relative to the root.</para>\n      </summary>\n      <param name=\"index\">The AvatarIKGoal that is queried.</param>\n      <param name=\"rot\">The rotation of this IK goal.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.SetGoalPosition(UnityEngine.AvatarIKGoal,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the position of this IK goal in world space.</para>\n      </summary>\n      <param name=\"index\">The AvatarIKGoal that is queried.</param>\n      <param name=\"pos\">The position of this IK goal.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.SetGoalRotation(UnityEngine.AvatarIKGoal,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Sets the rotation of this IK goal in world space.</para>\n      </summary>\n      <param name=\"index\">The AvatarIKGoal that is queried.</param>\n      <param name=\"rot\">The rotation of this IK goal.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.SetGoalWeightPosition(UnityEngine.AvatarIKGoal,System.Single)\">\n      <summary>\n        <para>Sets the position weight of the IK goal.</para>\n      </summary>\n      <param name=\"index\">The AvatarIKGoal that is queried.</param>\n      <param name=\"value\">The position weight of the IK goal.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.SetGoalWeightRotation(UnityEngine.AvatarIKGoal,System.Single)\">\n      <summary>\n        <para>Sets the rotation weight of the IK goal.</para>\n      </summary>\n      <param name=\"index\">The AvatarIKGoal that is queried.</param>\n      <param name=\"value\">The rotation weight of the IK goal.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.SetHintPosition(UnityEngine.AvatarIKHint,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the position of this IK hint in world space.</para>\n      </summary>\n      <param name=\"index\">The AvatarIKHint that is queried.</param>\n      <param name=\"pos\">The position of this IK hint.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.SetHintWeightPosition(UnityEngine.AvatarIKHint,System.Single)\">\n      <summary>\n        <para>Sets the position weight of the IK Hint.</para>\n      </summary>\n      <param name=\"index\">The AvatarIKHint that is queried.</param>\n      <param name=\"value\">The position weight of the IK Hint.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.SetLookAtBodyWeight(System.Single)\">\n      <summary>\n        <para>Sets the LookAt body weight.</para>\n      </summary>\n      <param name=\"weight\">The LookAt body weight.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.SetLookAtClampWeight(System.Single)\">\n      <summary>\n        <para>Sets the LookAt clamp weight.</para>\n      </summary>\n      <param name=\"weight\">The LookAt clamp weight.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.SetLookAtEyesWeight(System.Single)\">\n      <summary>\n        <para>Sets the LookAt eyes weight.</para>\n      </summary>\n      <param name=\"weight\">The LookAt eyes weight.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.SetLookAtHeadWeight(System.Single)\">\n      <summary>\n        <para>Sets the LookAt head weight.</para>\n      </summary>\n      <param name=\"weight\">The LookAt head weight.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.SetLookAtPosition(UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the look at position in world space.</para>\n      </summary>\n      <param name=\"lookAtPosition\">The look at position.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.SetMuscle(UnityEngine.Experimental.Animations.MuscleHandle,System.Single)\">\n      <summary>\n        <para>Sets the muscle value.</para>\n      </summary>\n      <param name=\"muscle\">The Muscle that is queried.</param>\n      <param name=\"value\">The muscle value.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationHumanStream.SolveIK\">\n      <summary>\n        <para>Execute the IK solver.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Animations.AnimationScriptPlayable\">\n      <summary>\n        <para>A Playable that can run a custom, multi-threaded animation job.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationScriptPlayable.Create(UnityEngine.Playables.PlayableGraph,T,System.Int32)\">\n      <summary>\n        <para>Creates an AnimationScriptPlayable in the PlayableGraph.</para>\n      </summary>\n      <param name=\"graph\">The PlayableGraph object that will own the AnimationScriptPlayable.</param>\n      <param name=\"job\">The IAnimationJob to execute when processing the playable.</param>\n      <param name=\"inputCount\">The number of inputs on the playable.</param>\n      <param name=\"jobData\"></param>\n      <returns>\n        <para>A new AnimationScriptPlayable linked to the PlayableGraph.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationScriptPlayable.GetJobData\">\n      <summary>\n        <para>Gets the job data contained in the playable.</para>\n      </summary>\n      <returns>\n        <para>Returns the IAnimationJob data contained in the playable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationScriptPlayable.GetProcessInputs\">\n      <summary>\n        <para>Returns whether the playable inputs will be processed or not.</para>\n      </summary>\n      <returns>\n        <para>true if the inputs will be processed; false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationScriptPlayable.SetJobData(T)\">\n      <summary>\n        <para>Sets a new job data in the playable.</para>\n      </summary>\n      <param name=\"jobData\">The new IAnimationJob data to set in the playable.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationScriptPlayable.SetProcessInputs(System.Boolean)\">\n      <summary>\n        <para>Sets the new value for processing the inputs or not.</para>\n      </summary>\n      <param name=\"value\">The new value for processing the inputs or not.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Animations.AnimationStream\">\n      <summary>\n        <para>The stream of animation data passed from one Playable to another.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.AnimationStream.angularVelocity\">\n      <summary>\n        <para>Gets or sets the avatar angular velocity for the evaluated frame.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.AnimationStream.deltaTime\">\n      <summary>\n        <para>Gets the delta time for the evaluated frame. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.AnimationStream.inputStreamCount\">\n      <summary>\n        <para>Gets the number of input streams. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.AnimationStream.isHumanStream\">\n      <summary>\n        <para>Returns true if the stream is from a humanoid avatar; false otherwise. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.AnimationStream.isValid\">\n      <summary>\n        <para>Returns true if the stream is valid; false otherwise. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.AnimationStream.rootMotionPosition\">\n      <summary>\n        <para>Gets the root motion position for the evaluated frame. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.AnimationStream.rootMotionRotation\">\n      <summary>\n        <para>Gets the root motion rotation for the evaluated frame. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.AnimationStream.velocity\">\n      <summary>\n        <para>Gets or sets the avatar velocity for the evaluated frame.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationStream.AsHuman\">\n      <summary>\n        <para>Gets the same stream, but as an AnimationHumanStream.</para>\n      </summary>\n      <returns>\n        <para>Returns the same stream, but as an AnimationHumanStream.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimationStream.GetInputStream(System.Int32)\">\n      <summary>\n        <para>Gets the AnimationStream of the playable input at index.</para>\n      </summary>\n      <param name=\"index\">The input index.</param>\n      <returns>\n        <para>Returns the AnimationStream of the playable input at index. Returns an invalid stream if the input is not an animation Playable.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Animations.AnimatorJobExtensions\">\n      <summary>\n        <para>Static class providing extension methods for Animator and the animation C# jobs.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimatorJobExtensions.BindSceneProperty(UnityEngine.Animator,UnityEngine.Transform,System.Type,System.String)\">\n      <summary>\n        <para>Create a PropertySceneHandle representing the new binding on the Component property of a Transform in the scene.</para>\n      </summary>\n      <param name=\"animator\">The Animator instance the method is called on.</param>\n      <param name=\"transform\">The Transform to target.</param>\n      <param name=\"type\">The Component type.</param>\n      <param name=\"property\">The property to bind.</param>\n      <returns>\n        <para>The PropertySceneHandle representing the new binding.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimatorJobExtensions.BindSceneTransform(UnityEngine.Animator,UnityEngine.Transform)\">\n      <summary>\n        <para>Create a TransformSceneHandle representing the new binding between the Animator and a Transform in the scene.</para>\n      </summary>\n      <param name=\"animator\">The Animator instance the method is called on.</param>\n      <param name=\"transform\">The Transform to bind.</param>\n      <returns>\n        <para>The TransformSceneHandle representing the new binding.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimatorJobExtensions.BindStreamProperty(UnityEngine.Animator,UnityEngine.Transform,System.Type,System.String)\">\n      <summary>\n        <para>Create a PropertyStreamHandle representing the new binding on the Component property of a Transform already bound to the Animator.</para>\n      </summary>\n      <param name=\"animator\">The Animator instance the method is called on.</param>\n      <param name=\"transform\">The Transform to target.</param>\n      <param name=\"type\">The Component type.</param>\n      <param name=\"property\">The property to bind.</param>\n      <returns>\n        <para>The PropertyStreamHandle representing the new binding.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimatorJobExtensions.BindStreamTransform(UnityEngine.Animator,UnityEngine.Transform)\">\n      <summary>\n        <para>Create a TransformStreamHandle representing the new binding between the Animator and a Transform already bound to the Animator.</para>\n      </summary>\n      <param name=\"animator\">The Animator instance the method is called on.</param>\n      <param name=\"transform\">The Transform to bind.</param>\n      <returns>\n        <para>The TransformStreamHandle representing the new binding.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimatorJobExtensions.CloseAnimationStream(UnityEngine.Animator,UnityEngine.Experimental.Animations.AnimationStream&amp;)\">\n      <summary>\n        <para>Close a stream that has been opened using OpenAnimationStream.</para>\n      </summary>\n      <param name=\"animator\">The Animator instance the method is called on.</param>\n      <param name=\"stream\">The stream to close.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimatorJobExtensions.OpenAnimationStream(UnityEngine.Animator,UnityEngine.Experimental.Animations.AnimationStream&amp;)\">\n      <summary>\n        <para>Open a new stream on the Animator.</para>\n      </summary>\n      <param name=\"animator\">The Animator instance the method is called on.</param>\n      <param name=\"stream\">The new stream.</param>\n      <returns>\n        <para>Whether or not the stream have been opened.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimatorJobExtensions.ResolveAllSceneHandles(UnityEngine.Animator)\">\n      <summary>\n        <para>Newly created handles are always resolved lazily on the next access when the jobs are run. To avoid a cpu spike while evaluating the jobs you can manually resolve all handles from the main thread.</para>\n      </summary>\n      <param name=\"animator\">The Animator instance the method is called on.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.AnimatorJobExtensions.ResolveAllStreamHandles(UnityEngine.Animator)\">\n      <summary>\n        <para>Newly created handles are always resolved lazily on the next access when the jobs are run. To avoid a cpu spike while evaluating the jobs you can manually resolve all handles from the main thread.</para>\n      </summary>\n      <param name=\"animator\">The Animator instance the method is called on.</param>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.Animations.IAnimationJob\">\n      <summary>\n        <para>The interface defining an animation job to use with an IAnimationJobPlayable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.IAnimationJob.ProcessAnimation(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Defines what to do when processing the animation.</para>\n      </summary>\n      <param name=\"stream\">The animation stream to work on.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.IAnimationJob.ProcessRootMotion(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Defines what to do when processing the root motion.</para>\n      </summary>\n      <param name=\"stream\">The animation stream to work on.</param>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.Animations.IAnimationJobPlayable\">\n      <summary>\n        <para>The interface defining an animation playable that uses IAnimationJob.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.IAnimationJobPlayable.GetJobData\">\n      <summary>\n        <para>Gets the job data contained in the playable.</para>\n      </summary>\n      <returns>\n        <para>Returns the IAnimationJob data contained in the playable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.IAnimationJobPlayable.SetJobData(T)\">\n      <summary>\n        <para>Sets a new job data in the playable.</para>\n      </summary>\n      <param name=\"jobData\">The new IAnimationJob data to set in the playable.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Animations.MuscleHandle\">\n      <summary>\n        <para>Handle for a muscle in the AnimationHumanStream.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.MuscleHandle.dof\">\n      <summary>\n        <para>The muscle human sub-part. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.MuscleHandle.humanPartDof\">\n      <summary>\n        <para>The muscle human part. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.MuscleHandle.muscleHandleCount\">\n      <summary>\n        <para>The total number of DoF parts in a humanoid. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Animations.MuscleHandle.name\">\n      <summary>\n        <para>The name of the muscle. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.MuscleHandle.#ctor(UnityEngine.BodyDof)\">\n      <summary>\n        <para>The different constructors that creates the muscle handle.</para>\n      </summary>\n      <param name=\"bodyDof\">The muscle body sub-part.</param>\n      <param name=\"headDof\">The muscle head sub-part.</param>\n      <param name=\"partDof\">The muscle human part.</param>\n      <param name=\"legDof\">The muscle leg sub-part.</param>\n      <param name=\"armDof\">The muscle arm sub-part.</param>\n      <param name=\"fingerDof\">The muscle finger sub-part.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.MuscleHandle.#ctor(UnityEngine.HeadDof)\">\n      <summary>\n        <para>The different constructors that creates the muscle handle.</para>\n      </summary>\n      <param name=\"bodyDof\">The muscle body sub-part.</param>\n      <param name=\"headDof\">The muscle head sub-part.</param>\n      <param name=\"partDof\">The muscle human part.</param>\n      <param name=\"legDof\">The muscle leg sub-part.</param>\n      <param name=\"armDof\">The muscle arm sub-part.</param>\n      <param name=\"fingerDof\">The muscle finger sub-part.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.MuscleHandle.#ctor\">\n      <summary>\n        <para>The different constructors that creates the muscle handle.</para>\n      </summary>\n      <param name=\"bodyDof\">The muscle body sub-part.</param>\n      <param name=\"headDof\">The muscle head sub-part.</param>\n      <param name=\"partDof\">The muscle human part.</param>\n      <param name=\"legDof\">The muscle leg sub-part.</param>\n      <param name=\"armDof\">The muscle arm sub-part.</param>\n      <param name=\"fingerDof\">The muscle finger sub-part.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.MuscleHandle.#ctor\">\n      <summary>\n        <para>The different constructors that creates the muscle handle.</para>\n      </summary>\n      <param name=\"bodyDof\">The muscle body sub-part.</param>\n      <param name=\"headDof\">The muscle head sub-part.</param>\n      <param name=\"partDof\">The muscle human part.</param>\n      <param name=\"legDof\">The muscle leg sub-part.</param>\n      <param name=\"armDof\">The muscle arm sub-part.</param>\n      <param name=\"fingerDof\">The muscle finger sub-part.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.MuscleHandle.#ctor(UnityEngine.HumanPartDof,UnityEngine.LegDof)\">\n      <summary>\n        <para>The different constructors that creates the muscle handle.</para>\n      </summary>\n      <param name=\"bodyDof\">The muscle body sub-part.</param>\n      <param name=\"headDof\">The muscle head sub-part.</param>\n      <param name=\"partDof\">The muscle human part.</param>\n      <param name=\"legDof\">The muscle leg sub-part.</param>\n      <param name=\"armDof\">The muscle arm sub-part.</param>\n      <param name=\"fingerDof\">The muscle finger sub-part.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.MuscleHandle.#ctor(UnityEngine.HumanPartDof,UnityEngine.ArmDof)\">\n      <summary>\n        <para>The different constructors that creates the muscle handle.</para>\n      </summary>\n      <param name=\"bodyDof\">The muscle body sub-part.</param>\n      <param name=\"headDof\">The muscle head sub-part.</param>\n      <param name=\"partDof\">The muscle human part.</param>\n      <param name=\"legDof\">The muscle leg sub-part.</param>\n      <param name=\"armDof\">The muscle arm sub-part.</param>\n      <param name=\"fingerDof\">The muscle finger sub-part.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.MuscleHandle.#ctor(UnityEngine.HumanPartDof,UnityEngine.FingerDof)\">\n      <summary>\n        <para>The different constructors that creates the muscle handle.</para>\n      </summary>\n      <param name=\"bodyDof\">The muscle body sub-part.</param>\n      <param name=\"headDof\">The muscle head sub-part.</param>\n      <param name=\"partDof\">The muscle human part.</param>\n      <param name=\"legDof\">The muscle leg sub-part.</param>\n      <param name=\"armDof\">The muscle arm sub-part.</param>\n      <param name=\"fingerDof\">The muscle finger sub-part.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.MuscleHandle.GetMuscleHandles(UnityEngine.Experimental.Animations.MuscleHandle[])\">\n      <summary>\n        <para>Fills the array with all the possible muscle handles on a humanoid.</para>\n      </summary>\n      <param name=\"muscleHandles\">An array of MuscleHandle.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Animations.PropertySceneHandle\">\n      <summary>\n        <para>Handle for a Component property on an object in the scene.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.PropertySceneHandle.GetBool(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Gets the boolean property value from an object in the scene.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream managing this handle.</param>\n      <returns>\n        <para>The boolean property value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.PropertySceneHandle.GetFloat(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Gets the float property value from an object in the scene.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream managing this handle.</param>\n      <returns>\n        <para>The float property value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.PropertySceneHandle.GetInt(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Gets the integer property value from an object in the scene.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream managing this handle.</param>\n      <returns>\n        <para>The integer property value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.PropertySceneHandle.IsResolved(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Returns whether or not the handle is resolved.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream managing this handle.</param>\n      <returns>\n        <para>Returns true if the handle is resolved, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.PropertySceneHandle.IsValid(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Returns whether or not the handle is valid.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream managing this handle.</param>\n      <returns>\n        <para>Whether or not the handle is valid.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.PropertySceneHandle.Resolve(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Resolves the handle.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream managing this handle.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.PropertySceneHandle.SetBool(UnityEngine.Experimental.Animations.AnimationStream,System.Boolean)\">\n      <summary>\n        <para>Sets the boolean property value to an object in the scene.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream managing this handle.</param>\n      <param name=\"value\">The new boolean property value.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.PropertySceneHandle.SetFloat(UnityEngine.Experimental.Animations.AnimationStream,System.Single)\">\n      <summary>\n        <para>Sets the float property value to an object in the scene.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream managing this handle.</param>\n      <param name=\"value\">The new float property value.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.PropertySceneHandle.SetInt(UnityEngine.Experimental.Animations.AnimationStream,System.Int32)\">\n      <summary>\n        <para>Sets the integer property value to an object in the scene.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream managing this handle.</param>\n      <param name=\"value\">The new integer property value.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Animations.PropertyStreamHandle\">\n      <summary>\n        <para>Handle for a Component property on an object in the AnimationStream.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.PropertyStreamHandle.GetBool(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Gets the boolean property value from a stream.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream holding the animated values.</param>\n      <returns>\n        <para>The boolean property value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.PropertyStreamHandle.GetFloat(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Gets the float property value from a stream.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream holding the animated values.</param>\n      <returns>\n        <para>The float property value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.PropertyStreamHandle.GetInt(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Gets the integer property value from a stream.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream holding the animated values.</param>\n      <returns>\n        <para>The integer property value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.PropertyStreamHandle.IsResolved(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Returns whether or not the handle is resolved.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream holding the animated values.</param>\n      <returns>\n        <para>Returns true if the handle is resolved, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.PropertyStreamHandle.IsValid(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Returns whether or not the handle is valid.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream holding the animated values.</param>\n      <returns>\n        <para>Whether or not the handle is valid.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.PropertyStreamHandle.Resolve(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Resolves the handle.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream holding the animated values.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.PropertyStreamHandle.SetBool(UnityEngine.Experimental.Animations.AnimationStream,System.Boolean)\">\n      <summary>\n        <para>Sets the boolean property value into a stream.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream holding the animated values.</param>\n      <param name=\"value\">The new boolean property value.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.PropertyStreamHandle.SetFloat(UnityEngine.Experimental.Animations.AnimationStream,System.Single)\">\n      <summary>\n        <para>Sets the float property value into a stream.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream holding the animated values.</param>\n      <param name=\"value\">The new float property value.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.PropertyStreamHandle.SetInt(UnityEngine.Experimental.Animations.AnimationStream,System.Int32)\">\n      <summary>\n        <para>Sets the integer property value into a stream.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream holding the animated values.</param>\n      <param name=\"value\">The new integer property value.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Animations.TransformSceneHandle\">\n      <summary>\n        <para>Position, rotation and scale of an object in the scene.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformSceneHandle.GetLocalPosition(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Gets the position of the transform relative to the parent.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that manage this handle.</param>\n      <returns>\n        <para>The position of the transform relative to the parent.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformSceneHandle.GetLocalRotation(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Gets the rotation of the transform relative to the parent.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that manage this handle.</param>\n      <returns>\n        <para>The rotation of the transform relative to the parent.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformSceneHandle.GetLocalScale(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Gets the scale of the transform relative to the parent.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that manage this handle.</param>\n      <returns>\n        <para>The scale of the transform relative to the parent.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformSceneHandle.GetPosition(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Gets the position of the transform in world space.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that manage this handle.</param>\n      <returns>\n        <para>The position of the transform in world space.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformSceneHandle.GetRotation(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Gets the rotation of the transform in world space.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that manage this handle.</param>\n      <returns>\n        <para>The rotation of the transform in world space.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformSceneHandle.IsValid(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Returns whether this is a valid handle.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that manage this handle.</param>\n      <returns>\n        <para>Whether this is a valid handle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformSceneHandle.SetLocalPosition(UnityEngine.Experimental.Animations.AnimationStream,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the position of the transform relative to the parent.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that manage this handle.</param>\n      <param name=\"position\">The position of the transform relative to the parent.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformSceneHandle.SetLocalRotation(UnityEngine.Experimental.Animations.AnimationStream,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Sets the rotation of the transform relative to the parent.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that manage this handle.</param>\n      <param name=\"rotation\">The rotation of the transform relative to the parent.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformSceneHandle.SetLocalScale(UnityEngine.Experimental.Animations.AnimationStream,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the scale of the transform relative to the parent.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that manage this handle.</param>\n      <param name=\"scale\">The scale of the transform relative to the parent.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformSceneHandle.SetPosition(UnityEngine.Experimental.Animations.AnimationStream,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the position of the transform in world space.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that manage this handle.</param>\n      <param name=\"position\">The position of the transform in world space.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformSceneHandle.SetRotation(UnityEngine.Experimental.Animations.AnimationStream,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Sets the rotation of the transform in world space.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that manage this handle.</param>\n      <param name=\"rotation\">The rotation of the transform in world space.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Animations.TransformStreamHandle\">\n      <summary>\n        <para>Position, rotation and scale of an object in the AnimationStream.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformStreamHandle.GetLocalPosition(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Gets the position of the transform relative to the parent.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that hold the animated values.</param>\n      <returns>\n        <para>The position of the transform relative to the parent.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformStreamHandle.GetLocalRotation(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Gets the rotation of the transform relative to the parent.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that hold the animated values.</param>\n      <returns>\n        <para>The rotation of the transform relative to the parent.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformStreamHandle.GetLocalScale(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Gets the scale of the transform relative to the parent.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that hold the animated values.</param>\n      <returns>\n        <para>The scale of the transform relative to the parent.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformStreamHandle.GetPosition(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Gets the position of the transform in world space.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that hold the animated values.</param>\n      <returns>\n        <para>The position of the transform in world space.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformStreamHandle.GetRotation(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Gets the rotation of the transform in world space.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that hold the animated values.</param>\n      <returns>\n        <para>The rotation of the transform in world space.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformStreamHandle.IsResolved(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Returns whether this handle is resolved.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that hold the animated values.</param>\n      <returns>\n        <para>Returns true if the handle is resolved, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformStreamHandle.IsValid(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Returns whether this is a valid handle.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that hold the animated values.</param>\n      <returns>\n        <para>Whether this is a valid handle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformStreamHandle.Resolve(UnityEngine.Experimental.Animations.AnimationStream)\">\n      <summary>\n        <para>Bind this handle with an animated values from the AnimationStream.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that hold the animated values.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformStreamHandle.SetLocalPosition(UnityEngine.Experimental.Animations.AnimationStream,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the position of the transform relative to the parent.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that hold the animated values.</param>\n      <param name=\"position\">The position of the transform relative to the parent.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformStreamHandle.SetLocalRotation(UnityEngine.Experimental.Animations.AnimationStream,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Sets the rotation of the transform relative to the parent.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that hold the animated values.</param>\n      <param name=\"rotation\">The rotation of the transform relative to the parent.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformStreamHandle.SetLocalScale(UnityEngine.Experimental.Animations.AnimationStream,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the scale of the transform relative to the parent.</para>\n      </summary>\n      <param name=\"scale\">The scale of the transform relative to the parent.</param>\n      <param name=\"stream\">The AnimationStream that hold the animated values.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformStreamHandle.SetPosition(UnityEngine.Experimental.Animations.AnimationStream,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets the position of the transform in world space.</para>\n      </summary>\n      <param name=\"position\">The position of the transform in world space.</param>\n      <param name=\"stream\">The AnimationStream that hold the animated values.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Animations.TransformStreamHandle.SetRotation(UnityEngine.Experimental.Animations.AnimationStream,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Sets the rotation of the transform in world space.</para>\n      </summary>\n      <param name=\"stream\">The AnimationStream that hold the animated values.</param>\n      <param name=\"rotation\">The rotation of the transform in world space.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Audio.AudioSampleProvider\">\n      <summary>\n        <para>Provides access to the audio samples generated by Unity objects such as VideoPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Audio.AudioSampleProvider.availableSampleFrameCount\">\n      <summary>\n        <para>Number of sample frames available for consuming with Experimental.Audio.AudioSampleProvider.ConsumeSampleFrames.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Audio.AudioSampleProvider.channelCount\">\n      <summary>\n        <para>The number of audio channels per sample frame.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Audio.AudioSampleProvider.consumeSampleFramesNativeFunction\">\n      <summary>\n        <para>Pointer to the native function that provides access to audio sample frames.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Audio.AudioSampleProvider.enableSampleFramesAvailableEvents\">\n      <summary>\n        <para>Enables the Experimental.Audio.AudioSampleProvider.sampleFramesAvailable events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Audio.AudioSampleProvider.enableSilencePadding\">\n      <summary>\n        <para>If true, buffers produced by ConsumeSampleFrames will get padded when silence if there are less available than asked for. Otherwise, the extra sample frames in the buffer will be left unchanged.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Audio.AudioSampleProvider.freeSampleFrameCount\">\n      <summary>\n        <para>Number of sample frames that can still be written to by the sample producer before overflowing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Audio.AudioSampleProvider.freeSampleFrameCountLowThreshold\">\n      <summary>\n        <para>Then the free sample count falls below this threshold, the Experimental.Audio.AudioSampleProvider.sampleFramesAvailable event and associated native is emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Audio.AudioSampleProvider.id\">\n      <summary>\n        <para>Unique identifier for this instance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Audio.AudioSampleProvider.maxSampleFrameCount\">\n      <summary>\n        <para>The maximum number of sample frames that can be accumulated inside the internal buffer before an overflow event is emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Audio.AudioSampleProvider.owner\">\n      <summary>\n        <para>Object where this provider came from.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.Audio.AudioSampleProvider.sampleFramesAvailable(UnityEngine.Experimental.Audio.AudioSampleProvider/SampleFramesHandler)\">\n      <summary>\n        <para>Invoked when the number of available sample frames goes beyond the threshold set with Experimental.Audio.AudioSampleProvider.freeSampleFrameCountLowThreshold.</para>\n      </summary>\n      <param name=\"value\">Number of available sample frames.</param>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.Audio.AudioSampleProvider.sampleFramesOverflow(UnityEngine.Experimental.Audio.AudioSampleProvider/SampleFramesHandler)\">\n      <summary>\n        <para>Invoked when the number of available sample frames goes beyond the maximum that fits in the internal buffer.</para>\n      </summary>\n      <param name=\"value\">The number of sample frames that were dropped due to the overflow.</param>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Audio.AudioSampleProvider.sampleRate\">\n      <summary>\n        <para>The expected playback rate for the sample frames produced by this class.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Audio.AudioSampleProvider.trackIndex\">\n      <summary>\n        <para>Index of the track in the object that created this provider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Audio.AudioSampleProvider.valid\">\n      <summary>\n        <para>True if the object is valid.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Audio.AudioSampleProvider.ClearSampleFramesAvailableNativeHandler\">\n      <summary>\n        <para>Clear the native handler set with Experimental.Audio.AudioSampleProvider.SetSampleFramesAvailableNativeHandler.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Audio.AudioSampleProvider.ClearSampleFramesOverflowNativeHandler\">\n      <summary>\n        <para>Clear the native handler set with Experimental.Audio.AudioSampleProvider.SetSampleFramesOverflowNativeHandler.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Audio.AudioSampleProvider.ConsumeSampleFrames(Unity.Collections.NativeArray`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Consume sample frames from the internal buffer.</para>\n      </summary>\n      <param name=\"sampleFrames\">Buffer where the consumed samples will be transferred.</param>\n      <returns>\n        <para>How many sample frames were written into the buffer passed in.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Audio.AudioSampleProvider.ConsumeSampleFramesNativeFunction\">\n      <summary>\n        <para>Type that represents the native function pointer for consuming sample frames.</para>\n      </summary>\n      <param name=\"providerId\">Id of the provider. See Experimental.Audio.AudioSampleProvider.id.</param>\n      <param name=\"interleavedSampleFrames\">Pointer to the sample frames buffer to fill. The actual C type is float*.</param>\n      <param name=\"sampleFrameCount\">Number of sample frames that can be written into interleavedSampleFrames.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Audio.AudioSampleProvider.Dispose\">\n      <summary>\n        <para>Release internal resources. Inherited from IDisposable.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Audio.AudioSampleProvider.SampleFramesEventNativeFunction\">\n      <summary>\n        <para>Type that represents the native function pointer for handling sample frame events.</para>\n      </summary>\n      <param name=\"userData\">User data specified when the handler was set. The actual C type is void*.</param>\n      <param name=\"providerId\">Id of the provider. See Experimental.Audio.AudioSampleProvider.id.</param>\n      <param name=\"sampleFrameCount\">Number of sample frames available or overflowed, depending on event type.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Audio.AudioSampleProvider.SampleFramesHandler\">\n      <summary>\n        <para>Delegate for sample frame events.</para>\n      </summary>\n      <param name=\"provider\">Provider emitting the event.</param>\n      <param name=\"sampleFrameCount\">How many sample frames are available, or were dropped, depending on the event.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Audio.AudioSampleProvider.SetSampleFramesAvailableNativeHandler(UnityEngine.Experimental.Audio.AudioSampleProvider/SampleFramesEventNativeFunction,System.IntPtr)\">\n      <summary>\n        <para>Set the native event handler for events emitted when the number of available sample frames crosses the threshold.</para>\n      </summary>\n      <param name=\"handler\">Pointer to the function to invoke when the event is emitted.</param>\n      <param name=\"userData\">User data to be passed to the handler when invoked. The actual C type is void*.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Audio.AudioSampleProvider.SetSampleFramesOverflowNativeHandler(UnityEngine.Experimental.Audio.AudioSampleProvider/SampleFramesEventNativeFunction,System.IntPtr)\">\n      <summary>\n        <para>Set the native event handler for events emitted when the internal sample frame buffer overflows.</para>\n      </summary>\n      <param name=\"handler\">Pointer to the function to invoke when the event is emitted.</param>\n      <param name=\"userData\">User data to be passed to the handler when invoked. The actual C type is void*.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.GlobalIllumination.DirectionalLight\">\n      <summary>\n        <para>A helper structure used to initialize a LightDataGI structure as a directional light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.DirectionalLight.color\">\n      <summary>\n        <para>The direct light color.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.DirectionalLight.direction\">\n      <summary>\n        <para>The direction of the light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.DirectionalLight.indirectColor\">\n      <summary>\n        <para>The indirect light color.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.DirectionalLight.instanceID\">\n      <summary>\n        <para>The light's instanceID.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.DirectionalLight.mode\">\n      <summary>\n        <para>The lightmode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.DirectionalLight.penumbraWidthRadian\">\n      <summary>\n        <para>The penumbra width for soft shadows in radians.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.DirectionalLight.shadow\">\n      <summary>\n        <para>True if the light casts shadows, otherwise False.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.GlobalIllumination.FalloffType\">\n      <summary>\n        <para>Available falloff models for baking.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.FalloffType.InverseSquared\">\n      <summary>\n        <para>Inverse squared distance falloff model.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.FalloffType.InverseSquaredNoRangeAttenuation\">\n      <summary>\n        <para>Inverse squared distance falloff model (without smooth range attenuation).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.FalloffType.Legacy\">\n      <summary>\n        <para>Quadratic falloff model.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.FalloffType.Linear\">\n      <summary>\n        <para>Linear falloff model.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.FalloffType.Undefined\">\n      <summary>\n        <para>Falloff model is undefined.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.GlobalIllumination.LightDataGI\">\n      <summary>\n        <para>The interop structure to pass light information to the light baking backends. There are helper structures for Directional, Point, Spot and Rectangle lights to correctly initialize this structure.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightDataGI.color\">\n      <summary>\n        <para>The color of the light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightDataGI.coneAngle\">\n      <summary>\n        <para>The cone angle for spot lights.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightDataGI.falloff\">\n      <summary>\n        <para>The falloff model to use for baking point and spot lights.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightDataGI.indirectColor\">\n      <summary>\n        <para>The indirect color of the light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightDataGI.innerConeAngle\">\n      <summary>\n        <para>The inner cone angle for spot lights.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightDataGI.instanceID\">\n      <summary>\n        <para>The light's instanceID.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightDataGI.mode\">\n      <summary>\n        <para>The lightmap mode for the light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightDataGI.orientation\">\n      <summary>\n        <para>The orientation of the light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightDataGI.position\">\n      <summary>\n        <para>The position of the light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightDataGI.range\">\n      <summary>\n        <para>The range of the light. Unused for directional lights.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightDataGI.shadow\">\n      <summary>\n        <para>Set to 1 for shadow casting lights, 0 otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightDataGI.shape0\">\n      <summary>\n        <para>The light's sphere radius for point and spot lights, or the width for rectangle lights.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightDataGI.shape1\">\n      <summary>\n        <para>The height for rectangle lights.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightDataGI.type\">\n      <summary>\n        <para>The type of the light.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.GlobalIllumination.LightDataGI.Init(UnityEngine.Experimental.GlobalIllumination.DirectionalLight&amp;)\">\n      <summary>\n        <para>Initialize the struct with the parameters from the given light type.</para>\n      </summary>\n      <param name=\"light\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.GlobalIllumination.LightDataGI.Init(UnityEngine.Experimental.GlobalIllumination.PointLight&amp;)\">\n      <summary>\n        <para>Initialize the struct with the parameters from the given light type.</para>\n      </summary>\n      <param name=\"light\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.GlobalIllumination.LightDataGI.Init(UnityEngine.Experimental.GlobalIllumination.SpotLight&amp;)\">\n      <summary>\n        <para>Initialize the struct with the parameters from the given light type.</para>\n      </summary>\n      <param name=\"light\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.GlobalIllumination.LightDataGI.Init(UnityEngine.Experimental.GlobalIllumination.RectangleLight&amp;)\">\n      <summary>\n        <para>Initialize the struct with the parameters from the given light type.</para>\n      </summary>\n      <param name=\"light\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.GlobalIllumination.LightDataGI.InitNoBake(System.Int32)\">\n      <summary>\n        <para>Initialize a light so that the baking backends ignore it.</para>\n      </summary>\n      <param name=\"lightInstanceID\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.GlobalIllumination.LightmapperUtils\">\n      <summary>\n        <para>Utility class for converting Unity Lights to light types recognized by the baking backends.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.GlobalIllumination.LightmapperUtils.Extract(UnityEngine.LightmapBakeType)\">\n      <summary>\n        <para>Extracts informations from Lights.</para>\n      </summary>\n      <param name=\"baketype\">The lights baketype.</param>\n      <returns>\n        <para>Returns the light's light mode.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.GlobalIllumination.LightmapperUtils.Extract(UnityEngine.Light,UnityEngine.Experimental.GlobalIllumination.DirectionalLight&amp;)\">\n      <summary>\n        <para>Extract type specific information from Lights.</para>\n      </summary>\n      <param name=\"l\">The input light.</param>\n      <param name=\"dir\">Extracts directional light information.</param>\n      <param name=\"point\">Extracts point light information.</param>\n      <param name=\"spot\">Extracts spot light information.</param>\n      <param name=\"rect\">Extracts rectangle light information.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.GlobalIllumination.LightmapperUtils.Extract(UnityEngine.Light,UnityEngine.Experimental.GlobalIllumination.PointLight&amp;)\">\n      <summary>\n        <para>Extract type specific information from Lights.</para>\n      </summary>\n      <param name=\"l\">The input light.</param>\n      <param name=\"dir\">Extracts directional light information.</param>\n      <param name=\"point\">Extracts point light information.</param>\n      <param name=\"spot\">Extracts spot light information.</param>\n      <param name=\"rect\">Extracts rectangle light information.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.GlobalIllumination.LightmapperUtils.Extract(UnityEngine.Light,UnityEngine.Experimental.GlobalIllumination.SpotLight&amp;)\">\n      <summary>\n        <para>Extract type specific information from Lights.</para>\n      </summary>\n      <param name=\"l\">The input light.</param>\n      <param name=\"dir\">Extracts directional light information.</param>\n      <param name=\"point\">Extracts point light information.</param>\n      <param name=\"spot\">Extracts spot light information.</param>\n      <param name=\"rect\">Extracts rectangle light information.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.GlobalIllumination.LightmapperUtils.Extract(UnityEngine.Light,UnityEngine.Experimental.GlobalIllumination.RectangleLight&amp;)\">\n      <summary>\n        <para>Extract type specific information from Lights.</para>\n      </summary>\n      <param name=\"l\">The input light.</param>\n      <param name=\"dir\">Extracts directional light information.</param>\n      <param name=\"point\">Extracts point light information.</param>\n      <param name=\"spot\">Extracts spot light information.</param>\n      <param name=\"rect\">Extracts rectangle light information.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.GlobalIllumination.LightmapperUtils.ExtractIndirect(UnityEngine.Light)\">\n      <summary>\n        <para>Extracts the indirect color from a light.</para>\n      </summary>\n      <param name=\"l\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.GlobalIllumination.LightmapperUtils.ExtractInnerCone(UnityEngine.Light)\">\n      <summary>\n        <para>Extracts the inner cone angle of spot lights.</para>\n      </summary>\n      <param name=\"l\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.GlobalIllumination.Lightmapping\">\n      <summary>\n        <para>Interface to the light baking backends.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.GlobalIllumination.Lightmapping.RequestLightsDelegate\">\n      <summary>\n        <para>Delegate called when converting lights into a form that the baking backends understand.</para>\n      </summary>\n      <param name=\"requests\">The list of lights to be converted.</param>\n      <param name=\"lightsOutput\">The output generated by the delegate function. Lights that should be skipped must be added to the output, initialized with InitNoBake on the LightDataGI structure.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.GlobalIllumination.Lightmapping.ResetDelegate\">\n      <summary>\n        <para>Resets the light conversion delegate to Unity's default conversion function.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.GlobalIllumination.Lightmapping.SetDelegate(UnityEngine.Experimental.GlobalIllumination.Lightmapping/RequestLightsDelegate)\">\n      <summary>\n        <para>Set a delegate that converts a list of lights to a list of LightDataGI structures that are passed to the baking backends. Must be reset by calling ResetDelegate again.</para>\n      </summary>\n      <param name=\"del\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.GlobalIllumination.LightMode\">\n      <summary>\n        <para>The lightmode. A light can be realtime, mixed, baked or unknown. Unknown lights will be ignored by the baking backends.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightMode.Baked\">\n      <summary>\n        <para>The light is fully baked and has no realtime component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightMode.Mixed\">\n      <summary>\n        <para>The light is mixed. Mixed lights are interpreted based on the global light mode setting in the lighting window.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightMode.Realtime\">\n      <summary>\n        <para>The light is realtime. No contribution will be baked in lightmaps or light probes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightMode.Unknown\">\n      <summary>\n        <para>The light should be ignored by the baking backends.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.GlobalIllumination.LightType\">\n      <summary>\n        <para>The light type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightType.Directional\">\n      <summary>\n        <para>An infinite directional light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightType.Point\">\n      <summary>\n        <para>A point light emitting light in all directions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightType.Rectangle\">\n      <summary>\n        <para>A light shaped like a rectangle emitting light into the hemisphere that it is facing.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.LightType.Spot\">\n      <summary>\n        <para>A spot light emitting light in a direction with a cone shaped opening angle.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.GlobalIllumination.LinearColor\">\n      <summary>\n        <para>Contains normalized linear color values for red, green, blue in the range of 0 to 1, and an additional intensity value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.GlobalIllumination.LinearColor.blue\">\n      <summary>\n        <para>The blue color value in the range of 0.0 to 1.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.GlobalIllumination.LinearColor.green\">\n      <summary>\n        <para>The green color value in the range of 0.0 to 1.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.GlobalIllumination.LinearColor.intensity\">\n      <summary>\n        <para>The intensity value used to scale the red, green and blue values.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.GlobalIllumination.LinearColor.red\">\n      <summary>\n        <para>The red color value in the range of 0.0 to 1.0.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.GlobalIllumination.LinearColor.Black\">\n      <summary>\n        <para>Returns a black color.</para>\n      </summary>\n      <returns>\n        <para>Returns a black color.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.GlobalIllumination.LinearColor.Convert(UnityEngine.Color,System.Single)\">\n      <summary>\n        <para>Converts a Light's color value to a normalized linear color value, automatically handling gamma conversion if necessary.</para>\n      </summary>\n      <param name=\"color\">Light color.</param>\n      <param name=\"intensity\">Light intensity.</param>\n      <returns>\n        <para>Returns the normalized linear color value.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.GlobalIllumination.PointLight\">\n      <summary>\n        <para>A helper structure used to initialize a LightDataGI structure as a point light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.PointLight.color\">\n      <summary>\n        <para>The direct light color.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.PointLight.falloff\">\n      <summary>\n        <para>The falloff model to use for baking the point light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.PointLight.indirectColor\">\n      <summary>\n        <para>The indirect light color.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.PointLight.instanceID\">\n      <summary>\n        <para>The light's instanceID.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.PointLight.mode\">\n      <summary>\n        <para>The lightmode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.PointLight.position\">\n      <summary>\n        <para>The light's position.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.PointLight.range\">\n      <summary>\n        <para>The light's range.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.PointLight.shadow\">\n      <summary>\n        <para>True if the light casts shadows, otherwise False.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.PointLight.sphereRadius\">\n      <summary>\n        <para>The light's sphere radius, influencing soft shadows.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.GlobalIllumination.RectangleLight\">\n      <summary>\n        <para>A helper structure used to initialize a LightDataGI structure as a rectangle light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.RectangleLight.color\">\n      <summary>\n        <para>The direct light color.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.RectangleLight.height\">\n      <summary>\n        <para>The height of the rectangle light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.RectangleLight.indirectColor\">\n      <summary>\n        <para>The indirect light color.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.RectangleLight.instanceID\">\n      <summary>\n        <para>The light's instanceID.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.RectangleLight.mode\">\n      <summary>\n        <para>The lightmode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.RectangleLight.orientation\">\n      <summary>\n        <para>The light's orientation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.RectangleLight.position\">\n      <summary>\n        <para>The light's position.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.RectangleLight.range\">\n      <summary>\n        <para>The light's range.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.RectangleLight.shadow\">\n      <summary>\n        <para>True if the light casts shadows, otherwise False.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.RectangleLight.width\">\n      <summary>\n        <para>The width of the rectangle light.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.GlobalIllumination.SpotLight\">\n      <summary>\n        <para>A helper structure used to initialize a LightDataGI structure as a spot light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.SpotLight.color\">\n      <summary>\n        <para>The direct light color.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.SpotLight.coneAngle\">\n      <summary>\n        <para>The outer angle for the spot light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.SpotLight.falloff\">\n      <summary>\n        <para>The falloff model to use for baking the spot light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.SpotLight.indirectColor\">\n      <summary>\n        <para>The indirect light color.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.SpotLight.innerConeAngle\">\n      <summary>\n        <para>The inner angle for the spot light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.SpotLight.instanceID\">\n      <summary>\n        <para>The light's instanceID.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.SpotLight.mode\">\n      <summary>\n        <para>The lightmode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.SpotLight.orientation\">\n      <summary>\n        <para>The light's orientation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.SpotLight.position\">\n      <summary>\n        <para>The light's position.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.SpotLight.range\">\n      <summary>\n        <para>The light's range.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.SpotLight.shadow\">\n      <summary>\n        <para>True if the light casts shadows, otherwise False.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.GlobalIllumination.SpotLight.sphereRadius\">\n      <summary>\n        <para>The light's sphere radius, influencing soft shadows.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.LowLevel.PlayerLoop\">\n      <summary>\n        <para>The class representing the player loop in Unity.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.LowLevel.PlayerLoop.GetDefaultPlayerLoop\">\n      <summary>\n        <para>Returns the default update order of all engine systems in Unity.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.LowLevel.PlayerLoop.SetPlayerLoop\">\n      <summary>\n        <para>Set a new custom update order of all engine systems in Unity.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.LowLevel.PlayerLoopSystem\">\n      <summary>\n        <para>The representation of a single system being updated by the player loop in Unity.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.LowLevel.PlayerLoopSystem.loopConditionFunction\">\n      <summary>\n        <para>The loop condition for a native engine system. To get a valid value for this, you must copy it from one of the PlayerLoopSystems returned by PlayerLoop.GetDefaultPlayerLoop.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.LowLevel.PlayerLoopSystem.subSystemList\">\n      <summary>\n        <para>A list of sub systems which run as part of this item in the player loop.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.LowLevel.PlayerLoopSystem.type\">\n      <summary>\n        <para>This property is used to identify which native system this belongs to, or to get the name of the managed system to show in the profiler.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.LowLevel.PlayerLoopSystem.updateDelegate\">\n      <summary>\n        <para>A managed delegate. You can set this to create a new C# entrypoint in the player loop.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.LowLevel.PlayerLoopSystem.updateFunction\">\n      <summary>\n        <para>A native engine system. To get a valid value for this, you must copy it from one of the PlayerLoopSystems returned by PlayerLoop.GetDefaultPlayerLoop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Playables.CameraPlayable\">\n      <summary>\n        <para>An implementation of IPlayable that produces a Camera texture.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Playables.CameraPlayable.Create(UnityEngine.Playables.PlayableGraph,UnityEngine.Camera)\">\n      <summary>\n        <para>Creates a CameraPlayable in the PlayableGraph.</para>\n      </summary>\n      <param name=\"graph\">The PlayableGraph object that will own the CameraPlayable.</param>\n      <param name=\"camera\">Camera used to produce a texture in the PlayableGraph.</param>\n      <returns>\n        <para>A CameraPlayable linked to the PlayableGraph.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Playables.MaterialEffectPlayable\">\n      <summary>\n        <para>An implementation of IPlayable that allows application of a Material shader to one or many texture inputs to produce a texture output.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Playables.MaterialEffectPlayable.Create(UnityEngine.Playables.PlayableGraph,UnityEngine.Material)\">\n      <summary>\n        <para>Creates a MaterialEffectPlayable in the PlayableGraph.</para>\n      </summary>\n      <param name=\"graph\">The PlayableGraph object that will own the MaterialEffectPlayable.</param>\n      <param name=\"material\">Material used to modify linked texture playable inputs.</param>\n      <param name=\"pass\">Shader pass index.(Note: -1 for all passes).</param>\n      <returns>\n        <para>A MaterialEffectPlayable linked to the PlayableGraph.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Playables.TextureMixerPlayable\">\n      <summary>\n        <para>An implementation of IPlayable that allows mixing two textures.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Playables.TextureMixerPlayable.Create(UnityEngine.Playables.PlayableGraph)\">\n      <summary>\n        <para>Creates a TextureMixerPlayable in the PlayableGraph.</para>\n      </summary>\n      <param name=\"graph\">The PlayableGraph object that will own the TextureMixerPlayable.</param>\n      <returns>\n        <para>A TextureMixerPlayable linked to the PlayableGraph.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Playables.TexturePlayableBinding\">\n      <summary>\n        <para>A PlayableBinding that contains information representing a TexturePlayableOutput.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Playables.TexturePlayableBinding.Create(System.String,UnityEngine.Object)\">\n      <summary>\n        <para>Creates a PlayableBinding that contains information representing a TexturePlayableOutput.</para>\n      </summary>\n      <param name=\"key\">A reference to a UnityEngine.Object that acts as a key for this binding.</param>\n      <param name=\"name\">The name of the TexturePlayableOutput.</param>\n      <returns>\n        <para>Returns a PlayableBinding that contains information that is used to create a TexturePlayableOutput.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Playables.TexturePlayableOutput\">\n      <summary>\n        <para>An IPlayableOutput implementation that will be used to manipulate textures.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Playables.TexturePlayableOutput.Null\">\n      <summary>\n        <para>Returns an invalid TexturePlayableOutput.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate\">\n      <summary>\n        <para>Update phase in the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.ClearIntermediateRenderers\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.ClearLines\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.CloudWebServicesUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.DeliverIosPlatformEvents\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.DirectorSampleTime\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.DispatchEventQueueEvents\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.ExecuteMainThreadJobs\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.GpuTimestamp\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.PerformanceAnalyticsUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.PhysicsResetInterpolatedTransformPosition\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.PlayerCleanupCachedData\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.PollHtcsPlayerConnection\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.PollPlayerConnection\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.PresentBeforeUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.ProcessMouseInWindow\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.ProcessRemoteInput\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.ProfilerStartFrame\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.RendererNotifyInvisible\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.ResetFrameStatsAfterPresent\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.ScriptRunDelayedStartupFrame\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.SpriteAtlasManagerUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.TangoUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.UnityConnectClientUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.UnityWebRequestUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.UpdateAllUnityWebStreams\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.UpdateAsyncReadbackManager\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.UpdateCanvasRectTransform\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.UpdateInputManager\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.UpdateKinect\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.UpdateMainGameViewRect\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.UpdatePreloading\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.UpdateStreamingManager\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.UpdateTextureStreamingManager\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.EarlyUpdate.XRUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.FixedUpdate\">\n      <summary>\n        <para>Update phase in the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.FixedUpdate.AudioFixedUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.FixedUpdate.ClearLines\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.FixedUpdate.DirectorFixedSampleTime\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.FixedUpdate.DirectorFixedUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.FixedUpdate.DirectorFixedUpdatePostPhysics\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.FixedUpdate.LegacyFixedAnimationUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.FixedUpdate.NewInputFixedUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.FixedUpdate.Physics2DFixedUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.FixedUpdate.PhysicsFixedUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.FixedUpdate.ScriptRunBehaviourFixedUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.FixedUpdate.ScriptRunDelayedFixedFrameRate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.FixedUpdate.XRFixedUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.Initialization\">\n      <summary>\n        <para>Update phase in the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.Initialization.AsyncUploadTimeSlicedUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.Initialization.PlayerUpdateTime\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.Initialization.SynchronizeInputs\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.Initialization.SynchronizeState\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.Initialization.XREarlyUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate\">\n      <summary>\n        <para>Update phase in the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.BatchModeUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.ClearImmediateRenderers\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.DirectorLateUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.DirectorRenderImage\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.EnlightenRuntimeUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.ExecuteGameCenterCallbacks\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.FinishFrameRendering\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.GUIClearEvents\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.InputEndFrame\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.MemoryFrameMaintenance\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.ParticlesLegacyUpdateAllParticleSystems\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.ParticleSystemEndUpdateAll\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.PhysicsSkinnedClothBeginUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.PhysicsSkinnedClothFinishUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.PlayerEmitCanvasGeometry\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.PlayerSendFrameComplete\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.PlayerSendFramePostPresent\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.PlayerSendFrameStarted\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.PlayerUpdateCanvases\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.PresentAfterDraw\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.ProcessWebSendMessages\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.ProfilerEndFrame\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.ProfilerSynchronizeStats\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.ResetInputAxis\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.ScriptRunDelayedDynamicFrameRate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.ShaderHandleErrors\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.SortingGroupsUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.ThreadedLoadingDebug\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.TriggerEndOfFrameCallbacks\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.UpdateAllRenderers\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.UpdateAllSkinnedMeshes\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.UpdateAudio\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.UpdateCanvasRectTransform\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.UpdateCaptureScreenshot\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.UpdateCustomRenderTextures\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.UpdateRectTransform\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.UpdateResolution\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.UpdateSubstance\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.UpdateVideo\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.UpdateVideoTextures\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PostLateUpdate.XRPostPresent\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreLateUpdate\">\n      <summary>\n        <para>Update phase in the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreLateUpdate.AIUpdatePostScript\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreLateUpdate.ConstraintManagerUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreLateUpdate.DirectorDeferredEvaluate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreLateUpdate.DirectorUpdateAnimationBegin\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreLateUpdate.DirectorUpdateAnimationEnd\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreLateUpdate.EndGraphicsJobsLate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreLateUpdate.LegacyAnimationUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreLateUpdate.ParticleSystemBeginUpdateAll\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreLateUpdate.ScriptRunBehaviourLateUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreLateUpdate.UNetUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreLateUpdate.UpdateMasterServerInterface\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreLateUpdate.UpdateNetworkManager\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreUpdate\">\n      <summary>\n        <para>Update phase in the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreUpdate.AIUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreUpdate.CheckTexFieldInput\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreUpdate.IMGUISendQueuedEvents\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreUpdate.NewInputUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreUpdate.Physics2DUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreUpdate.PhysicsUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreUpdate.SendMouseEvents\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreUpdate.UpdateVideo\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.PreUpdate.WindUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.Update\">\n      <summary>\n        <para>Update phase in the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.Update.DirectorUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.Update.ScriptRunBehaviourUpdate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.Update.ScriptRunDelayedDynamicFrameRate\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.PlayerLoop.Update.ScriptRunDelayedTasks\">\n      <summary>\n        <para>Native engine system updated by the native player loop.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.BlendState\">\n      <summary>\n        <para>Values for the blend state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.BlendState.alphaToMask\">\n      <summary>\n        <para>Turns on alpha-to-coverage.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.BlendState.blendState0\">\n      <summary>\n        <para>Blend state for render target 0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.BlendState.blendState1\">\n      <summary>\n        <para>Blend state for render target 1.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.BlendState.blendState2\">\n      <summary>\n        <para>Blend state for render target 2.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.BlendState.blendState3\">\n      <summary>\n        <para>Blend state for render target 3.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.BlendState.blendState4\">\n      <summary>\n        <para>Blend state for render target 4.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.BlendState.blendState5\">\n      <summary>\n        <para>Blend state for render target 5.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.BlendState.blendState6\">\n      <summary>\n        <para>Blend state for render target 6.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.BlendState.blendState7\">\n      <summary>\n        <para>Blend state for render target 7.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.BlendState.separateMRTBlendStates\">\n      <summary>\n        <para>Determines whether each render target uses a separate blend state.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.BlendState.#ctor(System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Creates a new blend state with the specified values.</para>\n      </summary>\n      <param name=\"separateMRTBlend\">Determines whether each render target uses a separate blend state.</param>\n      <param name=\"alphaToMask\">Turns on alpha-to-coverage.</param>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.BlendState.Default\">\n      <summary>\n        <para>Default values for the blend state.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.CameraProperties\">\n      <summary>\n        <para>Camera related properties in CullingParameters.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.CameraProperties.GetCameraCullingPlane(System.Int32)\">\n      <summary>\n        <para>Get a camera culling plane.</para>\n      </summary>\n      <param name=\"index\">Plane index (up to 5).</param>\n      <returns>\n        <para>Camera culling plane.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.CameraProperties.GetShadowCullingPlane(System.Int32)\">\n      <summary>\n        <para>Get a shadow culling plane.</para>\n      </summary>\n      <param name=\"index\">Plane index (up to 5).</param>\n      <returns>\n        <para>Shadow culling plane.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.CameraProperties.SetCameraCullingPlane(System.Int32,UnityEngine.Plane)\">\n      <summary>\n        <para>Set a camera culling plane.</para>\n      </summary>\n      <param name=\"index\">Plane index (up to 5).</param>\n      <param name=\"plane\">Camera culling plane.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.CameraProperties.SetShadowCullingPlane(System.Int32,UnityEngine.Plane)\">\n      <summary>\n        <para>Set a shadow culling plane.</para>\n      </summary>\n      <param name=\"index\">Plane index (up to 5).</param>\n      <param name=\"plane\">Shadow culling plane.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.CoreCameraValues\">\n      <summary>\n        <para>Core Camera related properties in CullingParameters.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.CullResults\">\n      <summary>\n        <para>Culling results (visible objects, lights, reflection probes).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.CullResults.visibleLights\">\n      <summary>\n        <para>Array of visible lights.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.CullResults.visibleOffscreenVertexLights\">\n      <summary>\n        <para>Off screen lights that still effect visible scene vertices.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.CullResults.visibleReflectionProbes\">\n      <summary>\n        <para>Array of visible reflection probes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.CullResults.visibleRenderers\">\n      <summary>\n        <para>Visible renderers.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.CullResults.ComputeDirectionalShadowMatricesAndCullingPrimitives(System.Int32,System.Int32,System.Int32,UnityEngine.Vector3,System.Int32,System.Single,UnityEngine.Matrix4x4&amp;,UnityEngine.Matrix4x4&amp;,UnityEngine.Experimental.Rendering.ShadowSplitData&amp;)\">\n      <summary>\n        <para>Calculates the view and projection matrices and shadow split data for a directional light.</para>\n      </summary>\n      <param name=\"activeLightIndex\">The index into the active light array.</param>\n      <param name=\"splitIndex\">The cascade index.</param>\n      <param name=\"splitCount\">The number of cascades.</param>\n      <param name=\"splitRatio\">The cascade ratios.</param>\n      <param name=\"shadowResolution\">The resolution of the shadowmap.</param>\n      <param name=\"shadowNearPlaneOffset\">The near plane offset for the light.</param>\n      <param name=\"viewMatrix\">The computed view matrix.</param>\n      <param name=\"projMatrix\">The computed projection matrix.</param>\n      <param name=\"shadowSplitData\">The computed cascade data.</param>\n      <returns>\n        <para>If false, the shadow map for this cascade does not need to be rendered this frame.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.CullResults.ComputePointShadowMatricesAndCullingPrimitives(System.Int32,UnityEngine.CubemapFace,System.Single,UnityEngine.Matrix4x4&amp;,UnityEngine.Matrix4x4&amp;,UnityEngine.Experimental.Rendering.ShadowSplitData&amp;)\">\n      <summary>\n        <para>Calculates the view and projection matrices and shadow split data for a point light.</para>\n      </summary>\n      <param name=\"activeLightIndex\">The index into the active light array.</param>\n      <param name=\"cubemapFace\">The cubemap face to be rendered.</param>\n      <param name=\"fovBias\">The amount by which to increase the camera FOV above 90 degrees.</param>\n      <param name=\"viewMatrix\">The computed view matrix.</param>\n      <param name=\"projMatrix\">The computed projection matrix.</param>\n      <param name=\"shadowSplitData\">The computed split data.</param>\n      <returns>\n        <para>If false, the shadow map for this light and cubemap face does not need to be rendered this frame.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.CullResults.ComputeSpotShadowMatricesAndCullingPrimitives(System.Int32,UnityEngine.Matrix4x4&amp;,UnityEngine.Matrix4x4&amp;,UnityEngine.Experimental.Rendering.ShadowSplitData&amp;)\">\n      <summary>\n        <para>Calculates the view and projection matrices and shadow split data for a spot light.</para>\n      </summary>\n      <param name=\"activeLightIndex\">The index into the active light array.</param>\n      <param name=\"viewMatrix\">The computed view matrix.</param>\n      <param name=\"projMatrix\">The computed projection matrix.</param>\n      <param name=\"shadowSplitData\">The computed split data.</param>\n      <returns>\n        <para>If false, the shadow map for this light does not need to be rendered this frame.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.CullResults.Cull\">\n      <summary>\n        <para>Perform culling for a Camera.</para>\n      </summary>\n      <param name=\"camera\">Camera to cull for.</param>\n      <param name=\"renderLoop\">Render loop the culling results will be used with.</param>\n      <param name=\"results\">Culling results.</param>\n      <returns>\n        <para>Flag indicating whether culling succeeded.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.CullResults.Cull\">\n      <summary>\n        <para>Perform culling with custom CullingParameters.</para>\n      </summary>\n      <param name=\"parameters\">Parameters for culling.</param>\n      <param name=\"renderLoop\">Render loop the culling results will be used with.</param>\n      <returns>\n        <para>Culling results.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.CullResults.FillLightIndices(UnityEngine.ComputeBuffer)\">\n      <summary>\n        <para>Fills a compute buffer with per-object light indices.</para>\n      </summary>\n      <param name=\"computeBuffer\">The compute buffer object to fill.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.CullResults.GetCullingParameters(UnityEngine.Camera,UnityEngine.Experimental.Rendering.ScriptableCullingParameters&amp;)\">\n      <summary>\n        <para>Get culling parameters for a camera.</para>\n      </summary>\n      <param name=\"camera\">Camera to get parameters for.</param>\n      <param name=\"cullingParameters\">Resultant culling parameters.</param>\n      <param name=\"stereoAware\">Generate single-pass stereo aware culling parameters.</param>\n      <returns>\n        <para>Flag indicating whether culling parameters are valid.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.CullResults.GetCullingParameters(UnityEngine.Camera,System.Boolean,UnityEngine.Experimental.Rendering.ScriptableCullingParameters&amp;)\">\n      <summary>\n        <para>Get culling parameters for a camera.</para>\n      </summary>\n      <param name=\"camera\">Camera to get parameters for.</param>\n      <param name=\"cullingParameters\">Resultant culling parameters.</param>\n      <param name=\"stereoAware\">Generate single-pass stereo aware culling parameters.</param>\n      <returns>\n        <para>Flag indicating whether culling parameters are valid.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.CullResults.GetLightIndexMap\">\n      <summary>\n        <para>If a RenderPipeline sorts or otherwise modifies the VisibleLight list, an index remap will be necessary to properly make use of per-object light lists.</para>\n      </summary>\n      <returns>\n        <para>Array of indices that map from VisibleLight indices to internal per-object light list indices.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.CullResults.GetLightIndicesCount\">\n      <summary>\n        <para>Gets the number of per-object light indices.</para>\n      </summary>\n      <returns>\n        <para>The number of per-object light indices.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.CullResults.GetShadowCasterBounds(System.Int32,UnityEngine.Bounds&amp;)\">\n      <summary>\n        <para>Returns the bounding box that encapsulates the visible shadow casters.  Can be used to, for instance, dynamically adjust cascade ranges.</para>\n      </summary>\n      <param name=\"lightIndex\">The index of the shadow-casting light.</param>\n      <param name=\"outBounds\">The bounds to be computed.</param>\n      <returns>\n        <para>True if the light affects at least one shadow casting object in the scene.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.CullResults.SetLightIndexMap(System.Int32[])\">\n      <summary>\n        <para>If a RenderPipeline sorts or otherwise modifies the VisibleLight list, an index remap will be necessary to properly make use of per-object light lists.\nIf an element of the array is set to -1, the light corresponding to that element will be disabled.</para>\n      </summary>\n      <param name=\"mapping\">Array with light indices that map from VisibleLight to internal per-object light lists.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.DepthState\">\n      <summary>\n        <para>Values for the depth state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.DepthState.compareFunction\">\n      <summary>\n        <para>How should depth testing be performed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.DepthState.writeEnabled\">\n      <summary>\n        <para>Controls whether pixels from this object are written to the depth buffer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.DepthState.#ctor(System.Boolean,UnityEngine.Rendering.CompareFunction)\">\n      <summary>\n        <para>Creates a new depth state with the given values.</para>\n      </summary>\n      <param name=\"writeEnabled\">Controls whether pixels from this object are written to the depth buffer.</param>\n      <param name=\"compareFunction\">How should depth testing be performed.</param>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.DepthState.Default\">\n      <summary>\n        <para>Default values for the depth state.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.DrawRendererFlags\">\n      <summary>\n        <para>Flags controlling RenderLoop.DrawRenderers.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.DrawRendererFlags.EnableDynamicBatching\">\n      <summary>\n        <para>When set, enables dynamic batching.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.DrawRendererFlags.EnableInstancing\">\n      <summary>\n        <para>When set, enables GPU instancing.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.DrawRendererFlags.None\">\n      <summary>\n        <para>No flags are set.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.DrawRendererSettings\">\n      <summary>\n        <para>Settings for ScriptableRenderContext.DrawRenderers.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.DrawRendererSettings.flags\">\n      <summary>\n        <para>Other flags controlling object rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.DrawRendererSettings.maxShaderPasses\">\n      <summary>\n        <para>The maxiumum number of passes that can be rendered in 1 DrawRenderers call.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.DrawRendererSettings.rendererConfiguration\">\n      <summary>\n        <para>What kind of per-object data to setup during rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.DrawRendererSettings.sorting\">\n      <summary>\n        <para>How to sort objects during rendering.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.DrawRendererSettings.#ctor(UnityEngine.Camera,UnityEngine.Experimental.Rendering.ShaderPassName)\">\n      <summary>\n        <para>Create a draw settings struct.</para>\n      </summary>\n      <param name=\"camera\">Camera to use. Camera's transparency sort mode is used to determine whether to use orthographic or distance based sorting.</param>\n      <param name=\"shaderPassName\">Shader pass to use.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.DrawRendererSettings.SetOverrideMaterial(UnityEngine.Material,System.Int32)\">\n      <summary>\n        <para>Set the Material to use for all drawers that would render in this group.</para>\n      </summary>\n      <param name=\"mat\">Override material.</param>\n      <param name=\"passIndex\">Pass to use in the material.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.DrawRendererSettings.SetShaderPassName(System.Int32,UnityEngine.Experimental.Rendering.ShaderPassName)\">\n      <summary>\n        <para>Set the shader passes that this draw call can render.</para>\n      </summary>\n      <param name=\"index\">Index of the shader pass to use.</param>\n      <param name=\"shaderPassName\">Name of the shader pass.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.DrawRendererSortSettings\">\n      <summary>\n        <para>Describes how to sort objects during rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.DrawRendererSortSettings.cameraPosition\">\n      <summary>\n        <para>Camera position, used to determine distances to objects.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.DrawRendererSortSettings.flags\">\n      <summary>\n        <para>What kind of sorting to do while rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.DrawRendererSortSettings.sortOrthographic\">\n      <summary>\n        <para>Should orthographic sorting be used?</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.DrawRendererSortSettings.worldToCameraMatrix\">\n      <summary>\n        <para>Camera view matrix, used to determine distances to objects.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.DrawShadowsSettings\">\n      <summary>\n        <para>Settings for RenderLoop.DrawShadows.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.DrawShadowsSettings.cullResults\">\n      <summary>\n        <para>Culling results to use.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.DrawShadowsSettings.lightIndex\">\n      <summary>\n        <para>The index of the shadow-casting light to be rendered.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.DrawShadowsSettings.splitData\">\n      <summary>\n        <para>The split data.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.DrawShadowsSettings.#ctor(UnityEngine.Experimental.Rendering.CullResults,System.Int32)\">\n      <summary>\n        <para>Create a shadow settings object.</para>\n      </summary>\n      <param name=\"cullResults\">The cull results for this light.</param>\n      <param name=\"lightIndex\">The light index.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.FilterRenderersSettings\">\n      <summary>\n        <para>Filter settings for ScriptableRenderContext.DrawRenderers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.FilterRenderersSettings.layerMask\">\n      <summary>\n        <para>Only render objects in the given layer mask.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.FilterRenderersSettings.renderingLayerMask\">\n      <summary>\n        <para>The rendering layer mask to use when filtering available renderers for drawing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.FilterRenderersSettings.renderQueueRange\">\n      <summary>\n        <para>Render objects whose material render queue in inside this range.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.FilterRenderersSettings.#ctor(System.Boolean)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"initializeValues\">Specifies whether the values of the struct should be initialized.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.FilterResults\">\n      <summary>\n        <para>Describes a subset of objects to be rendered.\n\nSee Also: ScriptableRenderContext.DrawRenderers.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.FormatUsage\">\n      <summary>\n        <para>Use this format usages to figure out the capabilities of specific GraphicsFormat</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.FormatUsage.Blend\">\n      <summary>\n        <para>To blend on a rendertexture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.FormatUsage.Linear\">\n      <summary>\n        <para>To sample textures with a linear filter</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.FormatUsage.LoadStore\">\n      <summary>\n        <para>To perform resource load and store on a texture</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.FormatUsage.MSAA2x\">\n      <summary>\n        <para>To create and render to a MSAA 2X rendertexture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.FormatUsage.MSAA4x\">\n      <summary>\n        <para>To create and render to a MSAA 4X rendertexture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.FormatUsage.MSAA8x\">\n      <summary>\n        <para>To create and render to a MSAA 8X rendertexture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.FormatUsage.Render\">\n      <summary>\n        <para>To create and render to a rendertexture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.FormatUsage.Sample\">\n      <summary>\n        <para>To create and sample textures.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.GraphicsFormat\">\n      <summary>\n        <para>Use this format to create either Textures or RenderTextures from scripts.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.A10R10G10B10_XRSRGBPack32\">\n      <summary>\n        <para>A four-component, 64-bit packed unsigned normalized format that has a 10-bit A component in bits 30..39, a 10-bit R component in bits 20..29, a 10-bit G component in bits 10..19, and a 10-bit B component in bits 0..9. The components are gamma encoded and their values range from -0.5271 to 1.66894. The alpha component is clamped to either 0.0 or 1.0 on sampling, rendering, and writing operations.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.A10R10G10B10_XRUNormPack32\">\n      <summary>\n        <para>A four-component, 64-bit packed unsigned normalized format that has a 10-bit A component in bits 30..39, a 10-bit R component in bits 20..29, a 10-bit G component in bits 10..19, and a 10-bit B component in bits 0..9. The components are linearly encoded and their values range from -0.752941 to 1.25098 (pre-expansion). The alpha component is clamped to either 0.0 or 1.0 on sampling, rendering, and writing operations.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.A1R5G5B5_UNormPack16\">\n      <summary>\n        <para>A four-component, 16-bit packed unsigned normalized format that has a 1-bit A component in bit 15, a 5-bit R component in bits 10..14, a 5-bit G component in bits 5..9, and a 5-bit B component in bits 0..4.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.A2B10G10R10_SIntPack32\">\n      <summary>\n        <para>A four-component, 32-bit packed signed integer format that has a 2-bit A component in bits 30..31, a 10-bit B component in bits 20..29, a 10-bit G component in bits 10..19, and a 10-bit R component in bits 0..9.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.A2B10G10R10_UIntPack32\">\n      <summary>\n        <para>A four-component, 32-bit packed unsigned integer format that has a 2-bit A component in bits 30..31, a 10-bit B component in bits 20..29, a 10-bit G component in bits 10..19, and a 10-bit R component in bits 0..9.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.A2B10G10R10_UNormPack32\">\n      <summary>\n        <para>A four-component, 32-bit packed unsigned normalized format that has a 2-bit A component in bits 30..31, a 10-bit B component in bits 20..29, a 10-bit G component in bits 10..19, and a 10-bit R component in bits 0..9.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.A2R10G10B10_SIntPack32\">\n      <summary>\n        <para>A four-component, 32-bit packed signed integer format that has a 2-bit A component in bits 30..31, a 10-bit R component in bits 20..29, a 10-bit G component in bits 10..19, and a 10-bit B component in bits 0..9.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.A2R10G10B10_UIntPack32\">\n      <summary>\n        <para>A four-component, 32-bit packed unsigned integer format that has a 2-bit A component in bits 30..31, a 10-bit R component in bits 20..29, a 10-bit G component in bits 10..19, and a 10-bit B component in bits 0..9.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.A2R10G10B10_UNormPack32\">\n      <summary>\n        <para>A four-component, 32-bit packed unsigned normalized format that has a 2-bit A component in bits 30..31, a 10-bit R component in bits 20..29, a 10-bit G component in bits 10..19, and a 10-bit B component in bits 0..9.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.A2R10G10B10_XRSRGBPack32\">\n      <summary>\n        <para>A four-component, 32-bit packed unsigned normalized format that has a 2-bit A component in bits 30..31, a 10-bit R component in bits 20..29, a 10-bit G component in bits 10..19, and a 10-bit B component in bits 0..9. The components are gamma encoded and their values range from -0.5271 to 1.66894. The alpha component is clamped to either 0.0 or 1.0 on sampling, rendering, and writing operations.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.A2R10G10B10_XRUNormPack32\">\n      <summary>\n        <para>A four-component, 32-bit packed unsigned normalized format that has a 2-bit A component in bits 30..31, a 10-bit R component in bits 20..29, a 10-bit G component in bits 10..19, and a 10-bit B component in bits 0..9. The components are linearly encoded and their values range from -0.752941 to 1.25098 (pre-expansion). The alpha component is clamped to either 0.0 or 1.0 on sampling, rendering, and writing operations.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.B10G11R11_UFloatPack32\">\n      <summary>\n        <para>A three-component, 32-bit packed unsigned floating-point format that has a 10-bit B component in bits 22..31, an 11-bit G component in bits 11..21, an 11-bit R component in bits 0..10. </para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.B4G4R4A4_UNormPack16\">\n      <summary>\n        <para>A four-component, 16-bit packed unsigned normalized format that has a 4-bit B component in bits 12..15, a 4-bit G component in bits 8..11, a 4-bit R component in bits 4..7, and a 4-bit A component in bits 0..3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.B5G5R5A1_UNormPack16\">\n      <summary>\n        <para>A four-component, 16-bit packed unsigned normalized format that has a 5-bit B component in bits 11..15, a 5-bit G component in bits 6..10, a 5-bit R component in bits 1..5, and a 1-bit A component in bit 0.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.B5G6R5_UNormPack16\">\n      <summary>\n        <para>A three-component, 16-bit packed unsigned normalized format that has a 5-bit B component in bits 11..15, a 6-bit G component in bits 5..10, and a 5-bit R component in bits 0..4.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.B8G8R8_SInt\">\n      <summary>\n        <para>A three-component, 24-bit signed integer format that has an 8-bit B component in byte 0, an 8-bit G component in byte 1, and an 8-bit R component in byte 2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.B8G8R8_SNorm\">\n      <summary>\n        <para>A three-component, 24-bit signed normalized format that has an 8-bit B component in byte 0, an 8-bit G component in byte 1, and an 8-bit R component in byte 2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.B8G8R8_SRGB\">\n      <summary>\n        <para>A three-component, 24-bit unsigned normalized format that has an 8-bit R component stored with sRGB nonlinear encoding in byte 0, an 8-bit G component stored with sRGB nonlinear encoding in byte 1, and an 8-bit B component stored with sRGB nonlinear encoding in byte 2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.B8G8R8_UInt\">\n      <summary>\n        <para>A three-component, 24-bit unsigned integer format that has an 8-bit B component in byte 0, an 8-bit G component in byte 1, and an 8-bit R component in byte 2</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.B8G8R8_UNorm\">\n      <summary>\n        <para>A three-component, 24-bit unsigned normalized format that has an 8-bit B component in byte 0, an 8-bit G component in byte 1, and an 8-bit R component in byte 2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.B8G8R8A8_SInt\">\n      <summary>\n        <para>A four-component, 32-bit signed integer format that has an 8-bit B component in byte 0, an 8-bit G component in byte 1, an 8-bit R component in byte 2, and an 8-bit A component in byte 3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.B8G8R8A8_SNorm\">\n      <summary>\n        <para>A four-component, 32-bit signed normalized format that has an 8-bit B component in byte 0, an 8-bit G component in byte 1, an 8-bit R component in byte 2, and an 8-bit A component in byte 3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.B8G8R8A8_SRGB\">\n      <summary>\n        <para>A four-component, 32-bit unsigned normalized format that has an 8-bit B component stored with sRGB nonlinear encoding in byte 0, an 8-bit G component stored with sRGB nonlinear encoding in byte 1, an 8-bit R component stored with sRGB nonlinear encoding in byte 2, and an 8-bit A component in byte 3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.B8G8R8A8_UInt\">\n      <summary>\n        <para>A four-component, 32-bit unsigned integer format that has an 8-bit B component in byte 0, an 8-bit G component in byte 1, an 8-bit R component in byte 2, and an 8-bit A component in byte 3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.B8G8R8A8_UNorm\">\n      <summary>\n        <para>A four-component, 32-bit unsigned normalized format that has an 8-bit B component in byte 0, an 8-bit G component in byte 1, an 8-bit R component in byte 2, and an 8-bit A component in byte 3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.D16_UNorm\">\n      <summary>\n        <para>A one-component, 16-bit unsigned normalized format that has a single 16-bit depth component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.D24_UNorm\">\n      <summary>\n        <para>A two-component, 32-bit format that has 24 unsigned normalized bits in the depth component and, optionally: 8 bits that are unused.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.D24_UNorm_S8_UInt\">\n      <summary>\n        <para>A two-component, 32-bit packed format that has 8 unsigned integer bits in the stencil component, and 24 unsigned normalized bits in the depth component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.D32_SFloat\">\n      <summary>\n        <para>A one-component, 32-bit signed floating-point format that has 32-bits in the depth component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.D32_SFloat_S8_Uint\">\n      <summary>\n        <para>A two-component format that has 32 signed float bits in the depth component and 8 unsigned integer bits in the stencil component. There are optionally: 24-bits that are unused.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.E5B9G9R9_UFloatPack32\">\n      <summary>\n        <para>A three-component, 32-bit packed unsigned floating-point format that has a 5-bit shared exponent in bits 27..31, a 9-bit B component mantissa in bits 18..26, a 9-bit G component mantissa in bits 9..17, and a 9-bit R component mantissa in bits 0..8.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.None\">\n      <summary>\n        <para>The format is not specified.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R_BC4_SNorm\">\n      <summary>\n        <para>A one-component, block-compressed format where each 64-bit compressed texel block encodes a 4×4 rectangle of signed normalized red texel data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R_BC4_UNorm\">\n      <summary>\n        <para>A one-component, block-compressed format where each 64-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized red texel data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R_EAC_SNorm\">\n      <summary>\n        <para>A one-component, ETC2 compressed format where each 64-bit compressed texel block encodes a 4×4 rectangle of signed normalized red texel data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R_EAC_UNorm\">\n      <summary>\n        <para>A one-component, ETC2 compressed format where each 64-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized red texel data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R10G10B10_XRSRGBPack32\">\n      <summary>\n        <para>A four-component, 32-bit packed unsigned normalized format that has a 10-bit R component in bits 20..29, a 10-bit G component in bits 10..19, and a 10-bit B component in bits 0..9. The components are gamma encoded and their values range from -0.5271 to 1.66894. The alpha component is clamped to either 0.0 or 1.0 on sampling, rendering, and writing operations.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R10G10B10_XRUNormPack32\">\n      <summary>\n        <para>A four-component, 32-bit packed unsigned normalized format that has a 10-bit R component in bits 20..29, a 10-bit G component in bits 10..19, and a 10-bit B component in bits 0..9. The components are linearly encoded and their values range from -0.752941 to 1.25098 (pre-expansion).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16_SFloat\">\n      <summary>\n        <para>A one-component, 16-bit signed floating-point format that has a single 16-bit R component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16_SInt\">\n      <summary>\n        <para>A one-component, 16-bit signed integer format that has a single 16-bit R component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16_SNorm\">\n      <summary>\n        <para>A one-component, 16-bit signed normalized format that has a single 16-bit R component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16_UInt\">\n      <summary>\n        <para>A one-component, 16-bit unsigned integer format that has a single 16-bit R component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16_UNorm\">\n      <summary>\n        <para>A one-component, 16-bit unsigned normalized format that has a single 16-bit R component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16G16_SFloat\">\n      <summary>\n        <para>A two-component, 32-bit signed floating-point format that has a 16-bit R component in bytes 0..1, and a 16-bit G component in bytes 2..3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16G16_SInt\">\n      <summary>\n        <para>A two-component, 32-bit signed integer format that has a 16-bit R component in bytes 0..1, and a 16-bit G component in bytes 2..3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16G16_SNorm\">\n      <summary>\n        <para>A two-component, 32-bit signed normalized format that has a 16-bit R component in bytes 0..1, and a 16-bit G component in bytes 2..3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16G16_UInt\">\n      <summary>\n        <para>A two-component, 32-bit unsigned integer format that has a 16-bit R component in bytes 0..1, and a 16-bit G component in bytes 2..3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16G16_UNorm\">\n      <summary>\n        <para>A two-component, 32-bit unsigned normalized format that has a 16-bit R component in bytes 0..1, and a 16-bit G component in bytes 2..3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16G16B16_SFloat\">\n      <summary>\n        <para>A three-component, 48-bit signed floating-point format that has a 16-bit R component in bytes 0..1, a 16-bit G component in bytes 2..3, and a 16-bit B component in bytes 4..5.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16G16B16_SInt\">\n      <summary>\n        <para>A three-component, 48-bit signed integer format that has a 16-bit R component in bytes 0..1, a 16-bit G component in bytes 2..3, and a 16-bit B component in bytes 4..5.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16G16B16_SNorm\">\n      <summary>\n        <para>A three-component, 48-bit signed normalized format that has a 16-bit R component in bytes 0..1, a 16-bit G component in bytes 2..3, and a 16-bit B component in bytes 4..5.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16G16B16_UInt\">\n      <summary>\n        <para>A three-component, 48-bit unsigned integer format that has a 16-bit R component in bytes 0..1, a 16-bit G component in bytes 2..3, and a 16-bit B component in bytes 4..5.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16G16B16_UNorm\">\n      <summary>\n        <para>A three-component, 48-bit unsigned normalized format that has a 16-bit R component in bytes 0..1, a 16-bit G component in bytes 2..3, and a 16-bit B component in bytes 4..5.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16G16B16A16_SFloat\">\n      <summary>\n        <para>A four-component, 64-bit signed floating-point format that has a 16-bit R component in bytes 0..1, a 16-bit G component in bytes 2..3, a 16-bit B component in bytes 4..5, and a 16-bit A component in bytes 6..7.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16G16B16A16_SInt\">\n      <summary>\n        <para>A four-component, 64-bit signed integer format that has a 16-bit R component in bytes 0..1, a 16-bit G component in bytes 2..3, a 16-bit B component in bytes 4..5, and a 16-bit A component in bytes 6..7.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16G16B16A16_SNorm\">\n      <summary>\n        <para>A four-component, 64-bit signed normalized format that has a 16-bit R component in bytes 0..1, a 16-bit G component in bytes 2..3, a 16-bit B component in bytes 4..5, and a 16-bit A component in bytes 6..7.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16G16B16A16_UInt\">\n      <summary>\n        <para>A four-component, 64-bit unsigned integer format that has a 16-bit R component in bytes 0..1, a 16-bit G component in bytes 2..3, a 16-bit B component in bytes 4..5, and a 16-bit A component in bytes 6..7.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R16G16B16A16_UNorm\">\n      <summary>\n        <para>A four-component, 64-bit unsigned normalized format that has a 16-bit R component in bytes 0..1, a 16-bit G component in bytes 2..3, a 16-bit B component in bytes 4..5, and a 16-bit A component in bytes 6..7.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R32_SFloat\">\n      <summary>\n        <para>A one-component, 32-bit signed floating-point format that has a single 32-bit R component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R32_SInt\">\n      <summary>\n        <para>A one-component, 32-bit signed integer format that has a single 32-bit R component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R32_UInt\">\n      <summary>\n        <para>A one-component, 32-bit unsigned integer format that has a single 32-bit R component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R32G32_SFloat\">\n      <summary>\n        <para>A two-component, 64-bit signed floating-point format that has a 32-bit R component in bytes 0..3, and a 32-bit G component in bytes 4..7.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R32G32_SInt\">\n      <summary>\n        <para>A two-component, 64-bit signed integer format that has a 32-bit R component in bytes 0..3, and a 32-bit G component in bytes 4..7.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R32G32_UInt\">\n      <summary>\n        <para>A two-component, 64-bit unsigned integer format that has a 32-bit R component in bytes 0..3, and a 32-bit G component in bytes 4..7.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R32G32B32_SFloat\">\n      <summary>\n        <para>A three-component, 96-bit signed floating-point format that has a 32-bit R component in bytes 0..3, a 32-bit G component in bytes 4..7, and a 32-bit B component in bytes 8..11.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R32G32B32_SInt\">\n      <summary>\n        <para>A three-component, 96-bit signed integer format that has a 32-bit R component in bytes 0..3, a 32-bit G component in bytes 4..7, and a 32-bit B component in bytes 8..11.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R32G32B32_UInt\">\n      <summary>\n        <para>A three-component, 96-bit unsigned integer format that has a 32-bit R component in bytes 0..3, a 32-bit G component in bytes 4..7, and a 32-bit B component in bytes 8..11.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R32G32B32A32_SFloat\">\n      <summary>\n        <para>A four-component, 128-bit signed floating-point format that has a 32-bit R component in bytes 0..3, a 32-bit G component in bytes 4..7, a 32-bit B component in bytes 8..11, and a 32-bit A component in bytes 12..15.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R32G32B32A32_SInt\">\n      <summary>\n        <para>A four-component, 128-bit signed integer format that has a 32-bit R component in bytes 0..3, a 32-bit G component in bytes 4..7, a 32-bit B component in bytes 8..11, and a 32-bit A component in bytes 12..15.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R32G32B32A32_UInt\">\n      <summary>\n        <para>A four-component, 128-bit unsigned integer format that has a 32-bit R component in bytes 0..3, a 32-bit G component in bytes 4..7, a 32-bit B component in bytes 8..11, and a 32-bit A component in bytes 12..15.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R4G4B4A4_UNormPack16\">\n      <summary>\n        <para>A four-component, 16-bit packed unsigned normalized format that has a 4-bit R component in bits 12..15, a 4-bit G component in bits 8..11, a 4-bit B component in bits 4..7, and a 4-bit A component in bits 0..3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R5G5B5A1_UNormPack16\">\n      <summary>\n        <para>A four-component, 16-bit packed unsigned normalized format that has a 5-bit R component in bits 11..15, a 5-bit G component in bits 6..10, a 5-bit B component in bits 1..5, and a 1-bit A component in bit 0.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R5G6B5_UNormPack16\">\n      <summary>\n        <para>A three-component, 16-bit packed unsigned normalized format that has a 5-bit R component in bits 11..15, a 6-bit G component in bits 5..10, and a 5-bit B component in bits 0..4.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8_SInt\">\n      <summary>\n        <para>A one-component, 8-bit signed integer format that has a single 8-bit R component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8_SNorm\">\n      <summary>\n        <para>A one-component, 8-bit signed normalized format that has a single 8-bit R component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8_SRGB\">\n      <summary>\n        <para>A one-component, 8-bit unsigned normalized format that has a single 8-bit R component stored with sRGB nonlinear encoding.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8_UInt\">\n      <summary>\n        <para>A one-component, 8-bit unsigned integer format that has a single 8-bit R component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8_UNorm\">\n      <summary>\n        <para>A one-component, 8-bit unsigned normalized format that has a single 8-bit R component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8_SInt\">\n      <summary>\n        <para>A two-component, 16-bit signed integer format that has an 8-bit R component in byte 0, and an 8-bit G component in byte 1.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8_SNorm\">\n      <summary>\n        <para>A two-component, 16-bit signed normalized format that has an 8-bit R component stored with sRGB nonlinear encoding in byte 0, and an 8-bit G component stored with sRGB nonlinear encoding in byte 1.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8_SRGB\">\n      <summary>\n        <para>A two-component, 16-bit unsigned normalized format that has an 8-bit R component stored with sRGB nonlinear encoding in byte 0, and an 8-bit G component stored with sRGB nonlinear encoding in byte 1.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8_UInt\">\n      <summary>\n        <para>A two-component, 16-bit unsigned integer format that has an 8-bit R component in byte 0, and an 8-bit G component in byte 1.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8_UNorm\">\n      <summary>\n        <para>A two-component, 16-bit unsigned normalized format that has an 8-bit R component stored with sRGB nonlinear encoding in byte 0, and an 8-bit G component stored with sRGB nonlinear encoding in byte 1.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8B8_SInt\">\n      <summary>\n        <para>A three-component, 24-bit signed integer format that has an 8-bit R component in byte 0, an 8-bit G component in byte 1, and an 8-bit B component in byte 2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8B8_SNorm\">\n      <summary>\n        <para>A three-component, 24-bit signed normalized format that has an 8-bit R component in byte 0, an 8-bit G component in byte 1, and an 8-bit B component in byte 2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8B8_SRGB\">\n      <summary>\n        <para>A three-component, 24-bit unsigned normalized format that has an 8-bit R component stored with sRGB nonlinear encoding in byte 0, an 8-bit G component stored with sRGB nonlinear encoding in byte 1, and an 8-bit B component stored with sRGB nonlinear encoding in byte 2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8B8_UInt\">\n      <summary>\n        <para>A three-component, 24-bit unsigned integer format that has an 8-bit R component in byte 0, an 8-bit G component in byte 1, and an 8-bit B component in byte 2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8B8_UNorm\">\n      <summary>\n        <para>A three-component, 24-bit unsigned normalized format that has an 8-bit R component in byte 0, an 8-bit G component in byte 1, and an 8-bit B component in byte 2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8B8A8_SInt\">\n      <summary>\n        <para>A four-component, 32-bit signed integer format that has an 8-bit R component in byte 0, an 8-bit G component in byte 1, an 8-bit B component in byte 2, and an 8-bit A component in byte 3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8B8A8_SNorm\">\n      <summary>\n        <para>A four-component, 32-bit signed normalized format that has an 8-bit R component in byte 0, an 8-bit G component in byte 1, an 8-bit B component in byte 2, and an 8-bit A component in byte 3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8B8A8_SRGB\">\n      <summary>\n        <para>A four-component, 32-bit unsigned normalized format that has an 8-bit R component stored with sRGB nonlinear encoding in byte 0, an 8-bit G component stored with sRGB nonlinear encoding in byte 1, an 8-bit B component stored with sRGB nonlinear encoding in byte 2, and an 8-bit A component in byte 3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8B8A8_UInt\">\n      <summary>\n        <para>A four-component, 32-bit unsigned integer format that has an 8-bit R component in byte 0, an 8-bit G component in byte 1, an 8-bit B component in byte 2, and an 8-bit A component in byte 3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8B8A8_UNorm\">\n      <summary>\n        <para>A four-component, 32-bit unsigned normalized format that has an 8-bit R component in byte 0, an 8-bit G component in byte 1, an 8-bit B component in byte 2, and an 8-bit A component in byte 3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RG_BC5_SNorm\">\n      <summary>\n        <para>A two-component, block-compressed format where each 128-bit compressed texel block encodes a 4×4 rectangle of signed normalized RG texel data with the first 64 bits encoding red values followed by 64 bits encoding green values.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RG_BC5_UNorm\">\n      <summary>\n        <para>A two-component, block-compressed format where each 128-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RG texel data with the first 64 bits encoding red values followed by 64 bits encoding green values.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RG_EAC_SNorm\">\n      <summary>\n        <para>A two-component, ETC2 compressed format where each 128-bit compressed texel block encodes a 4×4 rectangle of signed normalized RG texel data with the first 64 bits encoding red values followed by 64 bits encoding green values.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RG_EAC_UNorm\">\n      <summary>\n        <para>A two-component, ETC2 compressed format where each 128-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RG texel data with the first 64 bits encoding red values followed by 64 bits encoding green values.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGB_A1_ETC2_SRGB\">\n      <summary>\n        <para>A four-component, ETC2 compressed format where each 64-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGB texel data with sRGB nonlinear encoding, and provides 1 bit of alpha.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGB_A1_ETC2_UNorm\">\n      <summary>\n        <para>A four-component, ETC2 compressed format where each 64-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGB texel data, and provides 1 bit of alpha.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGB_BC6H_SFloat\">\n      <summary>\n        <para>A three-component, block-compressed format where each 128-bit compressed texel block encodes a 4×4 rectangle of signed floating-point RGB texel data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGB_BC6H_UFloat\">\n      <summary>\n        <para>A three-component, block-compressed format where each 128-bit compressed texel block encodes a 4×4 rectangle of unsigned floating-point RGB texel data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGB_DXT1_SRGB\">\n      <summary>\n        <para>A three-component, block-compressed format where each 64-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGB texel data with sRGB nonlinear encoding. This format has no alpha and is considered opaque.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGB_DXT1_UNorm\">\n      <summary>\n        <para>A three-component, block-compressed format where each 64-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGB texel data. This format has no alpha and is considered opaque.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGB_ETC_UNorm\">\n      <summary>\n        <para>A three-component, ETC compressed format where each 64-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGB texel data. This format has no alpha and is considered opaque.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGB_ETC2_SRGB\">\n      <summary>\n        <para>A three-component, ETC2 compressed format where each 64-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGB texel data with sRGB nonlinear encoding. This format has no alpha and is considered opaque.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGB_ETC2_UNorm\">\n      <summary>\n        <para>A three-component, ETC2 compressed format where each 64-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGB texel data. This format has no alpha and is considered opaque.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGB_PVRTC_2Bpp_SRGB\">\n      <summary>\n        <para>A three-component, PVRTC compressed format where each 64-bit compressed texel block encodes a 8×4 rectangle of unsigned normalized RGB texel data with sRGB nonlinear encoding. This format has no alpha and is considered opaque.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGB_PVRTC_2Bpp_UNorm\">\n      <summary>\n        <para>A three-component, PVRTC compressed format where each 64-bit compressed texel block encodes a 8×4 rectangle of unsigned normalized RGB texel data. This format has no alpha and is considered opaque.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGB_PVRTC_4Bpp_SRGB\">\n      <summary>\n        <para>A three-component, PVRTC compressed format where each 64-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGB texel data with sRGB nonlinear encoding. This format has no alpha and is considered opaque.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGB_PVRTC_4Bpp_UNorm\">\n      <summary>\n        <para>A three-component, PVRTC compressed format where each 64-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGB texel data. This format has no alpha and is considered opaque.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_ASTC10X10_SRGB\">\n      <summary>\n        <para>A four-component, ASTC compressed format where each 128-bit compressed texel block encodes a 10×10 rectangle of unsigned normalized RGBA texel data with sRGB nonlinear encoding applied to the RGB components.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_ASTC10X10_UNorm\">\n      <summary>\n        <para>A four-component, ASTC compressed format where each 128-bit compressed texel block encodes a 10×10 rectangle of unsigned normalized RGBA texel data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_ASTC12X12_SRGB\">\n      <summary>\n        <para>A four-component, ASTC compressed format where each 128-bit compressed texel block encodes a 12×12 rectangle of unsigned normalized RGBA texel data with sRGB nonlinear encoding applied to the RGB components.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_ASTC12X12_UNorm\">\n      <summary>\n        <para>A four-component, ASTC compressed format where each 128-bit compressed texel block encodes a 12×12 rectangle of unsigned normalized RGBA texel data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_ASTC4X4_SRGB\">\n      <summary>\n        <para>A four-component, ASTC compressed format where each 128-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGBA texel data with sRGB nonlinear encoding applied to the RGB components.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_ASTC4X4_UNorm\">\n      <summary>\n        <para>A four-component, ASTC compressed format where each 128-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGBA texel data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_ASTC5X5_SRGB\">\n      <summary>\n        <para>A four-component, ASTC compressed format where each 128-bit compressed texel block encodes a 5×5 rectangle of unsigned normalized RGBA texel data with sRGB nonlinear encoding applied to the RGB components.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_ASTC5X5_UNorm\">\n      <summary>\n        <para>A four-component, ASTC compressed format where each 128-bit compressed texel block encodes a 5×5 rectangle of unsigned normalized RGBA texel data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_ASTC6X6_SRGB\">\n      <summary>\n        <para>A four-component, ASTC compressed format where each 128-bit compressed texel block encodes a 6×6 rectangle of unsigned normalized RGBA texel data with sRGB nonlinear encoding applied to the RGB components.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_ASTC6X6_UNorm\">\n      <summary>\n        <para>A four-component, ASTC compressed format where each 128-bit compressed texel block encodes a 6×6 rectangle of unsigned normalized RGBA texel data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_ASTC8X8_SRGB\">\n      <summary>\n        <para>A four-component, ASTC compressed format where each 128-bit compressed texel block encodes an 8×8 rectangle of unsigned normalized RGBA texel data with sRGB nonlinear encoding applied to the RGB components.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_ASTC8X8_UNorm\">\n      <summary>\n        <para>A four-component, ASTC compressed format where each 128-bit compressed texel block encodes an 8×8 rectangle of unsigned normalized RGBA texel data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_BC7_SRGB\">\n      <summary>\n        <para>A four-component, block-compressed format where each 128-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGBA texel data with sRGB nonlinear encoding applied to the RGB components.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_BC7_UNorm\">\n      <summary>\n        <para>A four-component, block-compressed format where each 128-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGBA texel data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_DXT3_SRGB\">\n      <summary>\n        <para>A four-component, block-compressed format where each 128-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGBA texel data with the first 64 bits encoding alpha values followed by 64 bits encoding RGB values with sRGB nonlinear encoding.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_DXT3_UNorm\">\n      <summary>\n        <para>A four-component, block-compressed format where each 128-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGBA texel data with the first 64 bits encoding alpha values followed by 64 bits encoding RGB values.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_DXT5_SRGB\">\n      <summary>\n        <para>A four-component, block-compressed format where each 128-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGBA texel data with the first 64 bits encoding alpha values followed by 64 bits encoding RGB values with sRGB nonlinear encoding.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_DXT5_UNorm\">\n      <summary>\n        <para>A four-component, block-compressed format where each 128-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGBA texel data with the first 64 bits encoding alpha values followed by 64 bits encoding RGB values.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_ETC2_SRGB\">\n      <summary>\n        <para>A four-component, ETC2 compressed format where each 128-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGBA texel data with the first 64 bits encoding alpha values followed by 64 bits encoding RGB values with sRGB nonlinear encoding applied.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_ETC2_UNorm\">\n      <summary>\n        <para>A four-component, ETC2 compressed format where each 128-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGBA texel data with the first 64 bits encoding alpha values followed by 64 bits encoding RGB values.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_PVRTC_2Bpp_SRGB\">\n      <summary>\n        <para>A four-component, PVRTC compressed format where each 64-bit compressed texel block encodes a 8×4 rectangle of unsigned normalized RGBA texel data with the first 32 bits encoding alpha values followed by 32 bits encoding RGB values with sRGB nonlinear encoding applied.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_PVRTC_2Bpp_UNorm\">\n      <summary>\n        <para>A four-component, PVRTC compressed format where each 64-bit compressed texel block encodes a 8×4 rectangle of unsigned normalized RGBA texel data with the first 32 bits encoding alpha values followed by 32 bits encoding RGB values.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_PVRTC_4Bpp_SRGB\">\n      <summary>\n        <para>A four-component, PVRTC compressed format where each 64-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGBA texel data with the first 32 bits encoding alpha values followed by 32 bits encoding RGB values with sRGB nonlinear encoding applied.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.RGBA_PVRTC_4Bpp_UNorm\">\n      <summary>\n        <para>A four-component, PVRTC compressed format where each 64-bit compressed texel block encodes a 4×4 rectangle of unsigned normalized RGBA texel data with the first 32 bits encoding alpha values followed by 32 bits encoding RGB values.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.GraphicsFormat.S8_Uint\">\n      <summary>\n        <para>A one-component, 8-bit unsigned integer format that has 8-bits in the stencil component.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.Rendering.IRenderPipeline\">\n      <summary>\n        <para>Defines a series of commands and settings that describes how Unity renders a frame.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.IRenderPipeline.disposed\">\n      <summary>\n        <para>When the IRenderPipeline is invalid or destroyed this returns true.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.IRenderPipeline.Render(UnityEngine.Experimental.Rendering.ScriptableRenderContext,UnityEngine.Camera[])\">\n      <summary>\n        <para>Defines custom rendering for this RenderPipeline.</para>\n      </summary>\n      <param name=\"renderContext\">Structure that holds the rendering commands for this loop.</param>\n      <param name=\"cameras\">Cameras to render.</param>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.Rendering.IRenderPipelineAsset\">\n      <summary>\n        <para>An asset that produces a specific IRenderPipeline.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.IRenderPipelineAsset.CreatePipeline\">\n      <summary>\n        <para>Create a IRenderPipeline specific to this asset.</para>\n      </summary>\n      <returns>\n        <para>Created pipeline.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.IRenderPipelineAsset.DestroyCreatedInstances\">\n      <summary>\n        <para>Override this method to destroy RenderPipeline cached state.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.IRenderPipelineAsset.GetTerrainBrushPassIndex\">\n      <summary>\n        <para>The render index for the terrain brush in the editor.</para>\n      </summary>\n      <returns>\n        <para>Queue index.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.LODParameters\">\n      <summary>\n        <para>LODGroup culling parameters.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.LODParameters.cameraPixelHeight\">\n      <summary>\n        <para>Rendering view height in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.LODParameters.cameraPosition\">\n      <summary>\n        <para>Camera position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.LODParameters.fieldOfView\">\n      <summary>\n        <para>Camera's field of view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.LODParameters.isOrthographic\">\n      <summary>\n        <para>Indicates whether camera is orthographic.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.LODParameters.orthoSize\">\n      <summary>\n        <para>Orhographic camera size.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.RasterState\">\n      <summary>\n        <para>Values for the raster state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RasterState.cullingMode\">\n      <summary>\n        <para>Controls which sides of polygons should be culled (not drawn).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RasterState.depthClip\">\n      <summary>\n        <para>Enable clipping based on depth.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RasterState.offsetFactor\">\n      <summary>\n        <para>Scales the maximum Z slope.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RasterState.offsetUnits\">\n      <summary>\n        <para>Scales the minimum resolvable depth buffer value.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RasterState.#ctor(UnityEngine.Rendering.CullMode,System.Int32,System.Single)\">\n      <summary>\n        <para>Creates a new raster state with the given values.</para>\n      </summary>\n      <param name=\"cullingMode\">Controls which sides of polygons should be culled (not drawn).</param>\n      <param name=\"offsetUnits\">Scales the minimum resolvable depth buffer value.</param>\n      <param name=\"offsetFactor\">Scales the maximum Z slope.</param>\n      <param name=\"depthClip\"></param>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RasterState.Default\">\n      <summary>\n        <para>Default values for the raster state.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.ReflectionProbeSortOptions\">\n      <summary>\n        <para>Visible reflection probes sorting options.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.ReflectionProbeSortOptions.Importance\">\n      <summary>\n        <para>Sort probes by importance.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.ReflectionProbeSortOptions.ImportanceThenSize\">\n      <summary>\n        <para>Sort probes by importance, then by size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.ReflectionProbeSortOptions.None\">\n      <summary>\n        <para>Do not sort reflection probes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.ReflectionProbeSortOptions.Size\">\n      <summary>\n        <para>Sort probes from largest to smallest.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.RendererConfiguration\">\n      <summary>\n        <para>What kind of per-object data to setup during rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RendererConfiguration.None\">\n      <summary>\n        <para>Do not setup any particular per-object data besides the transformation matrix.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RendererConfiguration.PerObjectLightmaps\">\n      <summary>\n        <para>Setup per-object lightmaps.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RendererConfiguration.PerObjectLightProbe\">\n      <summary>\n        <para>Setup per-object light probe SH data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RendererConfiguration.PerObjectLightProbeProxyVolume\">\n      <summary>\n        <para>Setup per-object light probe proxy volume data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RendererConfiguration.PerObjectMotionVectors\">\n      <summary>\n        <para>Setup per-object motion vectors.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RendererConfiguration.PerObjectOcclusionProbe\">\n      <summary>\n        <para>Setup per-object occlusion probe data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RendererConfiguration.PerObjectOcclusionProbeProxyVolume\">\n      <summary>\n        <para>Setup per-object occlusion probe proxy volume data (occlusion in alpha channels).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RendererConfiguration.PerObjectReflectionProbes\">\n      <summary>\n        <para>Setup per-object reflection probe data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RendererConfiguration.PerObjectShadowMask\">\n      <summary>\n        <para>Setup per-object shadowmask.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RendererConfiguration.ProvideLightIndices\">\n      <summary>\n        <para>Setup per-object light indices.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.RenderPass\">\n      <summary>\n        <para>Object encapsulating the duration of a single renderpass that contains one or more subpasses.\n\nThe RenderPass object provides a new way to switch rendertargets in the context of a Scriptable Rendering Pipeline. As opposed to the SetRenderTargets function, the RenderPass object specifies a clear beginning and an end for the rendering, alongside explicit load/store actions on the rendering surfaces.\n\nThe RenderPass object also allows running multiple subpasses within the same renderpass, where the pixel shaders have a read access to the current pixel value within the renderpass. This allows for efficient implementation of various rendering methods on tile-based GPUs, such as deferred rendering.\n\nRenderPasses are natively implemented on Metal (iOS) and Vulkan, but the API is fully functional on all rendering backends via emulation (using legacy SetRenderTargets calls and reading the current pixel values via texel fetches).\n\nA quick example on how to use the RenderPass API within the Scriptable Render Pipeline to implement deferred rendering:\n\nThe RenderPass mechanism has the following limitations:\n- All attachments must have the same resolution and MSAA sample count\n- The rendering results of previous subpasses are only available within the same screen-space pixel\n  coordinate via the UNITY_READ_FRAMEBUFFER_INPUT(x) macro in the shader; the attachments cannot be bound\n  as textures or otherwise accessed until the renderpass has ended\n- iOS Metal does not allow reading from the Z-Buffer, so an additional render target is needed to work around that\n- The maximum amount of attachments allowed per RenderPass is currently 8 + depth, but note that various GPUs may\n  have stricter limits.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderPass.colorAttachments\">\n      <summary>\n        <para>Read only: array of RenderPassAttachment objects currently bound into this RenderPass.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderPass.context\">\n      <summary>\n        <para>Read only: The ScriptableRenderContext object this RenderPass was created for.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderPass.depthAttachment\">\n      <summary>\n        <para>Read only: The depth/stencil attachment used in this RenderPass, or null if none.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderPass.height\">\n      <summary>\n        <para>Read only: The height of the RenderPass surfaces in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderPass.sampleCount\">\n      <summary>\n        <para>Read only: MSAA sample count for this RenderPass.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderPass.width\">\n      <summary>\n        <para>Read only: The width of the RenderPass surfaces in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPass.#ctor(UnityEngine.Experimental.Rendering.ScriptableRenderContext,System.Int32,System.Int32,System.Int32,UnityEngine.Experimental.Rendering.RenderPassAttachment[],UnityEngine.Experimental.Rendering.RenderPassAttachment)\">\n      <summary>\n        <para>Create a RenderPass and start it within the ScriptableRenderContext.</para>\n      </summary>\n      <param name=\"ctx\">The ScriptableRenderContext object currently being rendered.</param>\n      <param name=\"w\">The width of the RenderPass surfaces in pixels.</param>\n      <param name=\"h\">The height of the RenderPass surfaces in pixels.</param>\n      <param name=\"samples\">MSAA sample count; set to 1 to disable antialiasing.</param>\n      <param name=\"colors\">Array of color attachments to use within this RenderPass.</param>\n      <param name=\"depth\">The attachment to be used as the depthstencil buffer for this RenderPass, or null to disable depthstencil.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPass.Dispose\">\n      <summary>\n        <para>End the RenderPass.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.RenderPass.SubPass\">\n      <summary>\n        <para>This class encapsulates a single subpass within a RenderPass. RenderPasses can never be standalone, they must always contain at least one SubPass. See Also: RenderPass.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPass.SubPass.#ctor(UnityEngine.Experimental.Rendering.RenderPass,UnityEngine.Experimental.Rendering.RenderPassAttachment[],UnityEngine.Experimental.Rendering.RenderPassAttachment[],System.Boolean)\">\n      <summary>\n        <para>Create a subpass and start it.</para>\n      </summary>\n      <param name=\"renderPass\">The RenderPass object this subpass is part of.</param>\n      <param name=\"colors\">Array of attachments to be used as the color render targets in this subpass. All attachments in this array must also be declared in the RenderPass constructor.</param>\n      <param name=\"inputs\">Array of attachments to be used as input attachments in this subpass. All attachments in this array must also be declared in the RenderPass constructor.</param>\n      <param name=\"readOnlyDepth\">If true, the depth attachment is read-only in this subpass. Some renderers require this in order to be able to use the depth attachment as input.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPass.SubPass.Dispose\">\n      <summary>\n        <para>End the subpass.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.RenderPassAttachment\">\n      <summary>\n        <para>A declaration of a single color or depth rendering surface to be attached into a RenderPass.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderPassAttachment.clearColor\">\n      <summary>\n        <para>The currently assigned clear color for this attachment. Default is black.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderPassAttachment.clearDepth\">\n      <summary>\n        <para>Currently assigned depth clear value for this attachment. Default value is 1.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderPassAttachment.clearStencil\">\n      <summary>\n        <para>Currently assigned stencil clear value for this attachment. Default is 0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderPassAttachment.format\">\n      <summary>\n        <para>The RenderTextureFormat of this attachment.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderPassAttachment.loadAction\">\n      <summary>\n        <para>The load action to be used on this attachment when the RenderPass starts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderPassAttachment.storeAction\">\n      <summary>\n        <para>The store action to use with this attachment when the RenderPass ends. Only used when either BindSurface or BindResolveSurface has been called.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPassAttachment.BindResolveSurface(UnityEngine.Rendering.RenderTargetIdentifier)\">\n      <summary>\n        <para>When the renderpass that uses this attachment ends, resolve the MSAA surface into the given target.</para>\n      </summary>\n      <param name=\"tgt\">The target surface to receive the MSAA-resolved pixels.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPassAttachment.BindSurface(UnityEngine.Rendering.RenderTargetIdentifier,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Binds this RenderPassAttachment to the given target surface.</para>\n      </summary>\n      <param name=\"tgt\">The surface to use as the backing storage for this RenderPassAttachment.</param>\n      <param name=\"loadExistingContents\">Whether to read in the existing contents of the surface when the RenderPass starts.</param>\n      <param name=\"storeResults\">Whether to store the rendering results of the attachment when the RenderPass ends.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPassAttachment.Clear(UnityEngine.Color,System.Single,System.UInt32)\">\n      <summary>\n        <para>When the RenderPass starts, clear this attachment into the color or depth/stencil values given (depending on the format of this attachment). Changes loadAction to RenderBufferLoadAction.Clear.</para>\n      </summary>\n      <param name=\"clearCol\">Color clear value. Ignored on depth/stencil attachments.</param>\n      <param name=\"clearDep\">Depth clear value. Ignored on color surfaces.</param>\n      <param name=\"clearStenc\">Stencil clear value. Ignored on color or depth-only surfaces.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPassAttachment.#ctor(UnityEngine.RenderTextureFormat)\">\n      <summary>\n        <para>Create a RenderPassAttachment to be used with RenderPass.</para>\n      </summary>\n      <param name=\"fmt\">The format of this attachment.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.RenderPipeline\">\n      <summary>\n        <para>Defines a series of commands and settings that describes how Unity renders a frame.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.Rendering.RenderPipeline.beginCameraRendering(System.Action`1&lt;UnityEngine.Camera&gt;)\">\n      <summary>\n        <para>Call that should be issued by an SRP when the SRP begins to render a Camera so that other systems can inject per camera render logic.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.Rendering.RenderPipeline.beginFrameRendering(System.Action`1&lt;UnityEngine.Camera[]&gt;)\">\n      <summary>\n        <para>Call that should be issued by an SRP when the SRP begins to render so that other systems can inject 'pre render' logic.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderPipeline.disposed\">\n      <summary>\n        <para>When the IRenderPipeline is invalid or destroyed this returns true.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipeline.BeginCameraRendering(UnityEngine.Camera)\">\n      <summary>\n        <para>Call the delegate used during SRP rendering before a single camera starts rendering.</para>\n      </summary>\n      <param name=\"camera\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipeline.BeginFrameRendering(UnityEngine.Camera[])\">\n      <summary>\n        <para>Call the delegate used during SRP rendering before a render begins.</para>\n      </summary>\n      <param name=\"cameras\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipeline.Dispose\">\n      <summary>\n        <para>Dispose the Renderpipeline destroying all internal state.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipeline.Render(UnityEngine.Experimental.Rendering.ScriptableRenderContext,UnityEngine.Camera[])\">\n      <summary>\n        <para>Defines custom rendering for this RenderPipeline.</para>\n      </summary>\n      <param name=\"renderContext\"></param>\n      <param name=\"cameras\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.RenderPipelineAsset\">\n      <summary>\n        <para>An asset that produces a specific IRenderPipeline.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipelineAsset.CreatedInstances\">\n      <summary>\n        <para>Returns the list of current IRenderPipeline's created by the asset.</para>\n      </summary>\n      <returns>\n        <para>Enumerable of created pipelines.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipelineAsset.CreatePipeline\">\n      <summary>\n        <para>Create a IRenderPipeline specific to this asset.</para>\n      </summary>\n      <returns>\n        <para>Created pipeline.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipelineAsset.DestroyCreatedInstances\">\n      <summary>\n        <para>Destroys all cached data and created IRenderLoop's.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipelineAsset.GetDefault2DMaterial\">\n      <summary>\n        <para>Return the default 2D Material for this pipeline.</para>\n      </summary>\n      <returns>\n        <para>Default material.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipelineAsset.GetDefaultLineMaterial\">\n      <summary>\n        <para>Return the default Line Material for this pipeline.</para>\n      </summary>\n      <returns>\n        <para>Default material.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipelineAsset.GetDefaultMaterial\">\n      <summary>\n        <para>Return the default Material for this pipeline.</para>\n      </summary>\n      <returns>\n        <para>Default material.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipelineAsset.GetDefaultParticleMaterial\">\n      <summary>\n        <para>Return the default particle Material for this pipeline.</para>\n      </summary>\n      <returns>\n        <para>Default material.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipelineAsset.GetDefaultShader\">\n      <summary>\n        <para>Return the default Shader for this pipeline.</para>\n      </summary>\n      <returns>\n        <para>Default shader.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipelineAsset.GetDefaultTerrainMaterial\">\n      <summary>\n        <para>Return the default Terrain  Material for this pipeline.</para>\n      </summary>\n      <returns>\n        <para>Default material.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipelineAsset.GetDefaultUIETC1SupportedMaterial\">\n      <summary>\n        <para>Return the default UI ETC1  Material for this pipeline.</para>\n      </summary>\n      <returns>\n        <para>Default material.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipelineAsset.GetDefaultUIMaterial\">\n      <summary>\n        <para>Return the default UI Material for this pipeline.</para>\n      </summary>\n      <returns>\n        <para>Default material.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipelineAsset.GetDefaultUIOverdrawMaterial\">\n      <summary>\n        <para>Return the default UI overdraw Material for this pipeline.</para>\n      </summary>\n      <returns>\n        <para>Default material.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipelineAsset.GetTerrainBrushPassIndex\">\n      <summary>\n        <para>The render index for the terrain brush in the editor.</para>\n      </summary>\n      <returns>\n        <para>Queue index.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipelineAsset.InternalCreatePipeline\">\n      <summary>\n        <para>Create a IRenderPipeline specific to this asset.</para>\n      </summary>\n      <returns>\n        <para>Created pipeline.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipelineAsset.OnDisable\">\n      <summary>\n        <para>Default implementation of OnDisable for RenderPipelineAsset. See ScriptableObject.OnDisable</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderPipelineAsset.OnValidate\">\n      <summary>\n        <para>Default implementation of OnValidate for RenderPipelineAsset. See MonoBehaviour.OnValidate</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.RenderPipelineManager\">\n      <summary>\n        <para>Render Pipeline manager.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderPipelineManager.currentPipeline\">\n      <summary>\n        <para>Returns the instance of the currently used Render Pipeline.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.RenderQueueRange\">\n      <summary>\n        <para>Describes a material render queue range.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderQueueRange.all\">\n      <summary>\n        <para>A range that includes all objects.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RenderQueueRange.max\">\n      <summary>\n        <para>Inclusive upper bound for the range.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RenderQueueRange.min\">\n      <summary>\n        <para>Inclusive lower bound for the range.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderQueueRange.opaque\">\n      <summary>\n        <para>A range that includes only opaque objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderQueueRange.transparent\">\n      <summary>\n        <para>A range that includes only transparent objects.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.RenderStateBlock\">\n      <summary>\n        <para>A set of values used to override the render state. Note that it is not enough to set e.g. blendState, but that mask must also include RenderStateMask.Blend for the override to occur.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderStateBlock.blendState\">\n      <summary>\n        <para>Specifies the new blend state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderStateBlock.depthState\">\n      <summary>\n        <para>Specifies the new depth state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderStateBlock.mask\">\n      <summary>\n        <para>Specifies which parts of the render state that is overriden.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderStateBlock.rasterState\">\n      <summary>\n        <para>Specifies the new raster state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderStateBlock.stencilReference\">\n      <summary>\n        <para>The value to be compared against and/or the value to be written to the buffer based on the stencil state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderStateBlock.stencilState\">\n      <summary>\n        <para>Specifies the new stencil state.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderStateBlock.#ctor(UnityEngine.Experimental.Rendering.RenderStateMask)\">\n      <summary>\n        <para>Creates a new render state block with the specified mask.</para>\n      </summary>\n      <param name=\"mask\">Specifies which parts of the render state that is overriden.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.RenderStateMapping\">\n      <summary>\n        <para>Maps a RenderType to a specific render state override.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderStateMapping.renderType\">\n      <summary>\n        <para>Specifices the RenderType to override the render state for.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderStateMapping.stateBlock\">\n      <summary>\n        <para>Specifies the values to override the render state with.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderStateMapping.#ctor(UnityEngine.Experimental.Rendering.RenderStateBlock)\">\n      <summary>\n        <para>Creates a new render state mapping with the specified values.</para>\n      </summary>\n      <param name=\"renderType\">Specifices the RenderType to override the render state for.</param>\n      <param name=\"stateBlock\">Specifies the values to override the render state with.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderStateMapping.#ctor(System.String,UnityEngine.Experimental.Rendering.RenderStateBlock)\">\n      <summary>\n        <para>Creates a new render state mapping with the specified values.</para>\n      </summary>\n      <param name=\"renderType\">Specifices the RenderType to override the render state for.</param>\n      <param name=\"stateBlock\">Specifies the values to override the render state with.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.RenderStateMask\">\n      <summary>\n        <para>Specifies which parts of the render state that is overriden.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RenderStateMask.Blend\">\n      <summary>\n        <para>When set, the blend state is overridden.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RenderStateMask.Depth\">\n      <summary>\n        <para>When set, the depth state is overridden.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RenderStateMask.Everything\">\n      <summary>\n        <para>When set, all render states are overridden.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RenderStateMask.Nothing\">\n      <summary>\n        <para>No render states are overridden.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RenderStateMask.Raster\">\n      <summary>\n        <para>When set, the raster state is overridden.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.RenderStateMask.Stencil\">\n      <summary>\n        <para>When set, the stencil state and reference value is overridden.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.RenderTargetBlendState\">\n      <summary>\n        <para>Values for the blend state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderTargetBlendState.alphaBlendOperation\">\n      <summary>\n        <para>Operation used for blending the alpha (A) channel.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderTargetBlendState.colorBlendOperation\">\n      <summary>\n        <para>Operation used for blending the color (RGB) channel.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderTargetBlendState.destinationAlphaBlendMode\">\n      <summary>\n        <para>Blend factor used for the alpha (A) channel of the destination.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderTargetBlendState.destinationColorBlendMode\">\n      <summary>\n        <para>Blend factor used for the color (RGB) channel of the destination.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderTargetBlendState.sourceAlphaBlendMode\">\n      <summary>\n        <para>Blend factor used for the alpha (A) channel of the source.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderTargetBlendState.sourceColorBlendMode\">\n      <summary>\n        <para>Blend factor used for the color (RGB) channel of the source.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderTargetBlendState.writeMask\">\n      <summary>\n        <para>Specifies which color components will get written into the target framebuffer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.RenderTargetBlendState.#ctor(UnityEngine.Rendering.ColorWriteMask,UnityEngine.Rendering.BlendMode,UnityEngine.Rendering.BlendMode,UnityEngine.Rendering.BlendMode,UnityEngine.Rendering.BlendMode,UnityEngine.Rendering.BlendOp,UnityEngine.Rendering.BlendOp)\">\n      <summary>\n        <para>Creates a new blend state with the given values.</para>\n      </summary>\n      <param name=\"writeMask\">Specifies which color components will get written into the target framebuffer.</param>\n      <param name=\"sourceColorBlendMode\">Blend factor used for the color (RGB) channel of the source.</param>\n      <param name=\"destinationColorBlendMode\">Blend factor used for the color (RGB) channel of the destination.</param>\n      <param name=\"sourceAlphaBlendMode\">Blend factor used for the alpha (A) channel of the source.</param>\n      <param name=\"destinationAlphaBlendMode\">Blend factor used for the alpha (A) channel of the destination.</param>\n      <param name=\"colorBlendOperation\">Operation used for blending the color (RGB) channel.</param>\n      <param name=\"alphaBlendOperation\">Operation used for blending the alpha (A) channel.</param>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.RenderTargetBlendState.Default\">\n      <summary>\n        <para>Default values for the blend state.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.ScriptableCullingParameters\">\n      <summary>\n        <para>Parameters controlling culling process in CullResults.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.cameraProperties\">\n      <summary>\n        <para>Camera Properties used for culling.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.cullingFlags\">\n      <summary>\n        <para>Culling Flags for the culling.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.cullingMask\">\n      <summary>\n        <para>CullingMask used for culling.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.cullingMatrix\">\n      <summary>\n        <para>CullingMatrix used for culling.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.cullingPlaneCount\">\n      <summary>\n        <para>Number of culling planes to use.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.cullStereoProj\">\n      <summary>\n        <para>The projection matrix generated for single-pass stereo culling.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.cullStereoSeparation\">\n      <summary>\n        <para>Distance between the virtual eyes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.cullStereoView\">\n      <summary>\n        <para>The view matrix generated for single-pass stereo culling.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.isOrthographic\">\n      <summary>\n        <para>Is the cull orthographic.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.layerCull\">\n      <summary>\n        <para>Layers to cull.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.lodParameters\">\n      <summary>\n        <para>LODParameters for culling.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.position\">\n      <summary>\n        <para>Position for the origin of th cull.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.reflectionProbeSortOptions\">\n      <summary>\n        <para>Reflection Probe Sort options for the cull.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.sceneMask\">\n      <summary>\n        <para>Scene Mask to use for the cull.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.shadowDistance\">\n      <summary>\n        <para>Shadow distance to use for the cull.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.GetCullingPlane(System.Int32)\">\n      <summary>\n        <para>Fetch the culling plane at the given index.</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.GetLayerCullDistance(System.Int32)\">\n      <summary>\n        <para>Get the distance for the culling of a specific layer.</para>\n      </summary>\n      <param name=\"layerIndex\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.SetCullingPlane(System.Int32,UnityEngine.Plane)\">\n      <summary>\n        <para>Set the culling plane at a given index.</para>\n      </summary>\n      <param name=\"index\"></param>\n      <param name=\"plane\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ScriptableCullingParameters.SetLayerCullDistance(System.Int32,System.Single)\">\n      <summary>\n        <para>Set the distance for the culling of a specific layer.</para>\n      </summary>\n      <param name=\"layerIndex\"></param>\n      <param name=\"distance\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.ScriptableRenderContext\">\n      <summary>\n        <para>Defines state and drawing commands used in a custom render pipelines.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ScriptableRenderContext.DrawRenderers(UnityEngine.Experimental.Rendering.FilterResults,UnityEngine.Experimental.Rendering.DrawRendererSettings&amp;,UnityEngine.Experimental.Rendering.FilterRenderersSettings)\">\n      <summary>\n        <para>Draw subset of visible objects.</para>\n      </summary>\n      <param name=\"stateBlock\">Specifies parts of the render state to override.</param>\n      <param name=\"stateMap\">Specifies parts of the render state to override for specific render types.</param>\n      <param name=\"renderers\">Specifies which set of visible objects to draw.</param>\n      <param name=\"drawSettings\">Specifies how to draw the objects.</param>\n      <param name=\"filterSettings\">Specifies how the renderers should be further filtered.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ScriptableRenderContext.DrawRenderers(UnityEngine.Experimental.Rendering.FilterResults,UnityEngine.Experimental.Rendering.DrawRendererSettings&amp;,UnityEngine.Experimental.Rendering.FilterRenderersSettings,UnityEngine.Experimental.Rendering.RenderStateBlock)\">\n      <summary>\n        <para>Draw subset of visible objects.</para>\n      </summary>\n      <param name=\"stateBlock\">Specifies parts of the render state to override.</param>\n      <param name=\"stateMap\">Specifies parts of the render state to override for specific render types.</param>\n      <param name=\"renderers\">Specifies which set of visible objects to draw.</param>\n      <param name=\"drawSettings\">Specifies how to draw the objects.</param>\n      <param name=\"filterSettings\">Specifies how the renderers should be further filtered.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ScriptableRenderContext.DrawRenderers(UnityEngine.Experimental.Rendering.FilterResults,UnityEngine.Experimental.Rendering.DrawRendererSettings&amp;,UnityEngine.Experimental.Rendering.FilterRenderersSettings,System.Collections.Generic.List`1&lt;UnityEngine.Experimental.Rendering.RenderStateMapping&gt;)\">\n      <summary>\n        <para>Draw subset of visible objects.</para>\n      </summary>\n      <param name=\"stateBlock\">Specifies parts of the render state to override.</param>\n      <param name=\"stateMap\">Specifies parts of the render state to override for specific render types.</param>\n      <param name=\"renderers\">Specifies which set of visible objects to draw.</param>\n      <param name=\"drawSettings\">Specifies how to draw the objects.</param>\n      <param name=\"filterSettings\">Specifies how the renderers should be further filtered.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ScriptableRenderContext.DrawShadows(UnityEngine.Experimental.Rendering.DrawShadowsSettings&amp;)\">\n      <summary>\n        <para>Draw shadow casters for a single light.</para>\n      </summary>\n      <param name=\"settings\">Specifies which set of shadow casters to draw, and how to draw them.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ScriptableRenderContext.DrawSkybox(UnityEngine.Camera)\">\n      <summary>\n        <para>Draw skybox.</para>\n      </summary>\n      <param name=\"camera\">Camera to draw the skybox for.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ScriptableRenderContext.EmitWorldGeometryForSceneView(UnityEngine.Camera)\">\n      <summary>\n        <para>Emit UI geometry into the scene view for rendering.</para>\n      </summary>\n      <param name=\"cullingCamera\">Camera to emit the geometry for.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ScriptableRenderContext.ExecuteCommandBuffer(UnityEngine.Rendering.CommandBuffer)\">\n      <summary>\n        <para>Execute a custom graphics command buffer.</para>\n      </summary>\n      <param name=\"commandBuffer\">Command buffer to execute.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ScriptableRenderContext.ExecuteCommandBufferAsync(UnityEngine.Rendering.CommandBuffer,UnityEngine.Rendering.ComputeQueueType)\">\n      <summary>\n        <para>Executes a command buffer on an async compute queue with the queue selected based on the ComputeQueueType parameter passed.\n\nIt is required that all of the commands within the command buffer be of a type suitable for execution on the async compute queues. If the buffer contains any commands that are not appropriate then an error will be logged and displayed in the editor window.  Specifically the following commands are permitted in a CommandBuffer intended for async execution:\n\nCommandBuffer.BeginSample\n\nCommandBuffer.CopyCounterValue\n\nCommandBuffer.CopyTexture\n\nCommandBuffer.CreateGPUFence\n\nCommandBuffer.DispatchCompute\n\nCommandBuffer.EndSample\n\nCommandBuffer.IssuePluginEvent\n\nCommandBuffer.SetComputeBufferParam\n\nCommandBuffer.SetComputeFloatParam\n\nCommandBuffer.SetComputeFloatParams\n\nCommandBuffer.SetComputeTextureParam\n\nCommandBuffer.SetComputeVectorParam\n\nCommandBuffer.WaitOnGPUFence\n\nAll of the commands within the buffer are guaranteed to be executed on the same queue. If the target platform does not support async compute queues then the work is dispatched on the graphics queue.</para>\n      </summary>\n      <param name=\"commandBuffer\">The CommandBuffer to be executed.</param>\n      <param name=\"queueType\">Describes the desired async compute queue the supplied CommandBuffer should be executed on.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ScriptableRenderContext.SetupCameraProperties(UnityEngine.Camera)\">\n      <summary>\n        <para>Setup camera specific global shader variables.</para>\n      </summary>\n      <param name=\"camera\">Camera to setup shader variables for.</param>\n      <param name=\"stereoSetup\">Set up the stereo shader variables and state.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ScriptableRenderContext.SetupCameraProperties(UnityEngine.Camera,System.Boolean)\">\n      <summary>\n        <para>Setup camera specific global shader variables.</para>\n      </summary>\n      <param name=\"camera\">Camera to setup shader variables for.</param>\n      <param name=\"stereoSetup\">Set up the stereo shader variables and state.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ScriptableRenderContext.StartMultiEye(UnityEngine.Camera)\">\n      <summary>\n        <para>Fine-grain control to begin stereo rendering on the scriptable render context.</para>\n      </summary>\n      <param name=\"camera\">Camera to enable stereo rendering on.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ScriptableRenderContext.StereoEndRender(UnityEngine.Camera)\">\n      <summary>\n        <para>Indicate completion of stereo rendering on a single frame.</para>\n      </summary>\n      <param name=\"camera\">Camera to indicate completion of stereo rendering.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ScriptableRenderContext.StopMultiEye(UnityEngine.Camera)\">\n      <summary>\n        <para>Stop stereo rendering on the scriptable render context.</para>\n      </summary>\n      <param name=\"camera\">Camera to disable stereo rendering on.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ScriptableRenderContext.Submit\">\n      <summary>\n        <para>Submit rendering loop for execution.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.ShaderPassName\">\n      <summary>\n        <para>Shader pass name identifier.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ShaderPassName.#ctor(System.String)\">\n      <summary>\n        <para>Create shader pass name identifier.</para>\n      </summary>\n      <param name=\"name\">Pass name.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.ShadowSplitData\">\n      <summary>\n        <para>Describes the culling information for a given shadow split (e.g. directional cascade).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.ShadowSplitData.cullingPlaneCount\">\n      <summary>\n        <para>The number of culling planes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.ShadowSplitData.cullingSphere\">\n      <summary>\n        <para>The culling sphere.  The first three components of the vector describe the sphere center, and the last component specifies the radius.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ShadowSplitData.GetCullingPlane(System.Int32)\">\n      <summary>\n        <para>Gets a culling plane.</para>\n      </summary>\n      <param name=\"index\">The culling plane index.</param>\n      <returns>\n        <para>The culling plane.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.ShadowSplitData.SetCullingPlane(System.Int32,UnityEngine.Plane)\">\n      <summary>\n        <para>Sets a culling plane.</para>\n      </summary>\n      <param name=\"index\">The index of the culling plane to set.</param>\n      <param name=\"plane\">The culling plane.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.SortFlags\">\n      <summary>\n        <para>How to sort objects during rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.SortFlags.BackToFront\">\n      <summary>\n        <para>Sort objects back to front.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.SortFlags.CanvasOrder\">\n      <summary>\n        <para>Sort renderers taking canvas order into account.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.SortFlags.CommonOpaque\">\n      <summary>\n        <para>Typical sorting for opaque objects.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.SortFlags.CommonTransparent\">\n      <summary>\n        <para>Typical sorting for transparencies.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.SortFlags.None\">\n      <summary>\n        <para>Do not sort objects.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.SortFlags.OptimizeStateChanges\">\n      <summary>\n        <para>Sort objects to reduce draw state changes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.SortFlags.QuantizedFrontToBack\">\n      <summary>\n        <para>Sort objects in rough front-to-back buckets.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.SortFlags.RenderQueue\">\n      <summary>\n        <para>Sort by material render queue.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.SortFlags.SortingLayer\">\n      <summary>\n        <para>Sort by renderer sorting layer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.StencilState\">\n      <summary>\n        <para>Values for the stencil state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.StencilState.compareFunction\">\n      <summary>\n        <para>The function used to compare the reference value to the current contents of the buffer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.StencilState.compareFunctionBack\">\n      <summary>\n        <para>The function used to compare the reference value to the current contents of the buffer for back-facing geometry.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.StencilState.compareFunctionFront\">\n      <summary>\n        <para>The function used to compare the reference value to the current contents of the buffer for front-facing geometry.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.StencilState.enabled\">\n      <summary>\n        <para>Controls whether the stencil buffer is enabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.StencilState.failOperation\">\n      <summary>\n        <para>What to do with the contents of the buffer if the stencil test fails.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.StencilState.failOperationBack\">\n      <summary>\n        <para>What to do with the contents of the buffer if the stencil test fails for back-facing geometry.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.StencilState.failOperationFront\">\n      <summary>\n        <para>What to do with the contents of the buffer if the stencil test fails for front-facing geometry.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.StencilState.passOperation\">\n      <summary>\n        <para>What to do with the contents of the buffer if the stencil test (and the depth test) passes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.StencilState.passOperationBack\">\n      <summary>\n        <para>What to do with the contents of the buffer if the stencil test (and the depth test) passes for back-facing geometry.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.StencilState.passOperationFront\">\n      <summary>\n        <para>What to do with the contents of the buffer if the stencil test (and the depth test) passes for front-facing geometry.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.StencilState.readMask\">\n      <summary>\n        <para>An 8 bit mask as an 0–255 integer, used when comparing the reference value with the contents of the buffer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.StencilState.writeMask\">\n      <summary>\n        <para>An 8 bit mask as an 0–255 integer, used when writing to the buffer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.StencilState.zFailOperation\">\n      <summary>\n        <para>What to do with the contents of the buffer if the stencil test passes, but the depth test fails.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.StencilState.zFailOperationBack\">\n      <summary>\n        <para>What to do with the contents of the buffer if the stencil test passes, but the depth test fails for back-facing geometry.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.StencilState.zFailOperationFront\">\n      <summary>\n        <para>What to do with the contents of the buffer if the stencil test passes, but the depth test fails for front-facing geometry.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.StencilState.#ctor(System.Boolean,System.Byte,System.Byte,UnityEngine.Rendering.CompareFunction,UnityEngine.Rendering.StencilOp,UnityEngine.Rendering.StencilOp,UnityEngine.Rendering.StencilOp)\">\n      <summary>\n        <para>Creates a new stencil state with the given values.</para>\n      </summary>\n      <param name=\"readMask\">An 8 bit mask as an 0–255 integer, used when comparing the reference value with the contents of the buffer.</param>\n      <param name=\"writeMask\">An 8 bit mask as an 0–255 integer, used when writing to the buffer.</param>\n      <param name=\"enabled\">Controls whether the stencil buffer is enabled.</param>\n      <param name=\"compareFunctionFront\">The function used to compare the reference value to the current contents of the buffer for front-facing geometry.</param>\n      <param name=\"passOperationFront\">What to do with the contents of the buffer if the stencil test (and the depth test) passes for front-facing geometry.</param>\n      <param name=\"failOperationFront\">What to do with the contents of the buffer if the stencil test fails for front-facing geometry.</param>\n      <param name=\"zFailOperationFront\">What to do with the contents of the buffer if the stencil test passes, but the depth test fails for front-facing geometry.</param>\n      <param name=\"compareFunctionBack\">The function used to compare the reference value to the current contents of the buffer for back-facing geometry.</param>\n      <param name=\"passOperationBack\">What to do with the contents of the buffer if the stencil test (and the depth test) passes for back-facing geometry.</param>\n      <param name=\"failOperationBack\">What to do with the contents of the buffer if the stencil test fails for back-facing geometry.</param>\n      <param name=\"zFailOperationBack\">What to do with the contents of the buffer if the stencil test passes, but the depth test fails for back-facing geometry.</param>\n      <param name=\"compareFunction\">The function used to compare the reference value to the current contents of the buffer.</param>\n      <param name=\"passOperation\">What to do with the contents of the buffer if the stencil test (and the depth test) passes.</param>\n      <param name=\"failOperation\">What to do with the contents of the buffer if the stencil test fails.</param>\n      <param name=\"zFailOperation\">What to do with the contents of the buffer if the stencil test passes, but the depth test.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Rendering.StencilState.#ctor(System.Boolean,System.Byte,System.Byte,UnityEngine.Rendering.CompareFunction,UnityEngine.Rendering.StencilOp,UnityEngine.Rendering.StencilOp,UnityEngine.Rendering.StencilOp,UnityEngine.Rendering.CompareFunction,UnityEngine.Rendering.StencilOp,UnityEngine.Rendering.StencilOp,UnityEngine.Rendering.StencilOp)\">\n      <summary>\n        <para>Creates a new stencil state with the given values.</para>\n      </summary>\n      <param name=\"readMask\">An 8 bit mask as an 0–255 integer, used when comparing the reference value with the contents of the buffer.</param>\n      <param name=\"writeMask\">An 8 bit mask as an 0–255 integer, used when writing to the buffer.</param>\n      <param name=\"enabled\">Controls whether the stencil buffer is enabled.</param>\n      <param name=\"compareFunctionFront\">The function used to compare the reference value to the current contents of the buffer for front-facing geometry.</param>\n      <param name=\"passOperationFront\">What to do with the contents of the buffer if the stencil test (and the depth test) passes for front-facing geometry.</param>\n      <param name=\"failOperationFront\">What to do with the contents of the buffer if the stencil test fails for front-facing geometry.</param>\n      <param name=\"zFailOperationFront\">What to do with the contents of the buffer if the stencil test passes, but the depth test fails for front-facing geometry.</param>\n      <param name=\"compareFunctionBack\">The function used to compare the reference value to the current contents of the buffer for back-facing geometry.</param>\n      <param name=\"passOperationBack\">What to do with the contents of the buffer if the stencil test (and the depth test) passes for back-facing geometry.</param>\n      <param name=\"failOperationBack\">What to do with the contents of the buffer if the stencil test fails for back-facing geometry.</param>\n      <param name=\"zFailOperationBack\">What to do with the contents of the buffer if the stencil test passes, but the depth test fails for back-facing geometry.</param>\n      <param name=\"compareFunction\">The function used to compare the reference value to the current contents of the buffer.</param>\n      <param name=\"passOperation\">What to do with the contents of the buffer if the stencil test (and the depth test) passes.</param>\n      <param name=\"failOperation\">What to do with the contents of the buffer if the stencil test fails.</param>\n      <param name=\"zFailOperation\">What to do with the contents of the buffer if the stencil test passes, but the depth test.</param>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.StencilState.Default\">\n      <summary>\n        <para>Default values for the stencil state.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures\">\n      <summary>\n        <para>Describes the rendering features supported by a given render pipeline.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures.active\">\n      <summary>\n        <para>Get / Set a SupportedRenderingFeatures.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures.defaultMixedLightingMode\">\n      <summary>\n        <para>This is the fallback mode if the mode the user had previously selected is no longer available. See SupportedRenderingFeatures.supportedMixedLightingModes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures.reflectionProbeSupportFlags\">\n      <summary>\n        <para>Flags for supported reflection probes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures.rendererSupportsLightProbeProxyVolumes\">\n      <summary>\n        <para>Are light probe proxy volumes supported?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures.rendererSupportsMotionVectors\">\n      <summary>\n        <para>Are motion vectors supported?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures.rendererSupportsReceiveShadows\">\n      <summary>\n        <para>Can renderers support receiving shadows?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures.rendererSupportsReflectionProbes\">\n      <summary>\n        <para>Are reflection probes supported?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures.supportedLightmapBakeTypes\">\n      <summary>\n        <para>What baking types are supported. The unsupported ones will be hidden from the UI. See LightmapBakeType.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures.supportedLightmapsModes\">\n      <summary>\n        <para>Specifies what modes are supported. Has to be at least one. See LightmapsMode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures.supportedMixedLightingModes\">\n      <summary>\n        <para>Specifies what LightmapMixedBakeMode that are supported. Please define a SupportedRenderingFeatures.defaultMixedLightingMode in case multiple modes are supported.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures.LightmapMixedBakeMode\">\n      <summary>\n        <para>Same as MixedLightingMode for baking, but is used to determine what is supported by the pipeline.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures.LightmapMixedBakeMode.IndirectOnly\">\n      <summary>\n        <para>Same as MixedLightingMode.IndirectOnly but determines if it is supported by the pipeline.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures.LightmapMixedBakeMode.None\">\n      <summary>\n        <para>No mode is supported.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures.LightmapMixedBakeMode.Shadowmask\">\n      <summary>\n        <para>Same as MixedLightingMode.Shadowmask but determines if it is supported by the pipeline.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures.LightmapMixedBakeMode.Subtractive\">\n      <summary>\n        <para>Same as MixedLightingMode.Subtractive but determines if it is supported by the pipeline.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures.ReflectionProbeSupportFlags\">\n      <summary>\n        <para>Supported modes for ReflectionProbes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures.ReflectionProbeSupportFlags.None\">\n      <summary>\n        <para>Default reflection probe support.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.SupportedRenderingFeatures.ReflectionProbeSupportFlags.Rotation\">\n      <summary>\n        <para>Rotated reflection probes are supported.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.VertexAttribute\">\n      <summary>\n        <para>A list of data channels that describe a vertex in a mesh.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VertexAttribute.Color\">\n      <summary>\n        <para>The color channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VertexAttribute.Normal\">\n      <summary>\n        <para>The normal channel. The common format is Vector3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VertexAttribute.Position\">\n      <summary>\n        <para>The position channel. The common format is Vector3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VertexAttribute.Tangent\">\n      <summary>\n        <para>The tangent channel. The common format is Vector4.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VertexAttribute.TexCoord0\">\n      <summary>\n        <para>The primary UV channel. The common format is Vector2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VertexAttribute.TexCoord1\">\n      <summary>\n        <para>Additional UV channel. The common format is Vector2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VertexAttribute.TexCoord2\">\n      <summary>\n        <para>Additional UV channel. The common format is Vector2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VertexAttribute.TexCoord3\">\n      <summary>\n        <para>Additional UV channel. The common format is Vector2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VertexAttribute.TexCoord4\">\n      <summary>\n        <para>Additional UV channel. The common format is Vector2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VertexAttribute.TexCoord5\">\n      <summary>\n        <para>Additional UV channel. The common format is Vector2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VertexAttribute.TexCoord6\">\n      <summary>\n        <para>Additional UV channel. The common format is Vector2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VertexAttribute.TexCoord7\">\n      <summary>\n        <para>Additional UV channel. The common format is Vector2.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.VisibleLight\">\n      <summary>\n        <para>Holds data of a visible light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VisibleLight.finalColor\">\n      <summary>\n        <para>Light color multiplied by intensity.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VisibleLight.flags\">\n      <summary>\n        <para>Light flags, see VisibleLightFlags.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.VisibleLight.light\">\n      <summary>\n        <para>Accessor to Light component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VisibleLight.lightType\">\n      <summary>\n        <para>Light type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VisibleLight.localToWorld\">\n      <summary>\n        <para>Light transformation matrix.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VisibleLight.range\">\n      <summary>\n        <para>Light range.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VisibleLight.screenRect\">\n      <summary>\n        <para>Light's influence rectangle on screen.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VisibleLight.spotAngle\">\n      <summary>\n        <para>Spot light angle.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.VisibleLightFlags\">\n      <summary>\n        <para>Flags for VisibleLight.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VisibleLightFlags.IntersectsFarPlane\">\n      <summary>\n        <para>Light intersects far clipping plane.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VisibleLightFlags.IntersectsNearPlane\">\n      <summary>\n        <para>Light intersects near clipping plane.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VisibleLightFlags.None\">\n      <summary>\n        <para>No flags are set.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Rendering.VisibleReflectionProbe\">\n      <summary>\n        <para>Holds data of a visible reflection probe.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VisibleReflectionProbe.blendDistance\">\n      <summary>\n        <para>Probe blending distance.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VisibleReflectionProbe.bounds\">\n      <summary>\n        <para>Probe bounding box.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VisibleReflectionProbe.boxProjection\">\n      <summary>\n        <para>Should probe use box projection.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VisibleReflectionProbe.center\">\n      <summary>\n        <para>Probe projection center.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VisibleReflectionProbe.hdr\">\n      <summary>\n        <para>Shader data for probe HDR texture decoding.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VisibleReflectionProbe.importance\">\n      <summary>\n        <para>Probe importance.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.Rendering.VisibleReflectionProbe.localToWorld\">\n      <summary>\n        <para>Probe transformation matrix.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.VisibleReflectionProbe.probe\">\n      <summary>\n        <para>Accessor to ReflectionProbe component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.Rendering.VisibleReflectionProbe.texture\">\n      <summary>\n        <para>Probe texture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEditor.Experimental.RenderSettings\">\n      <summary>\n        <para>Experimental render settings features.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEditor.Experimental.RenderSettings.useRadianceAmbientProbe\">\n      <summary>\n        <para>If enabled, ambient trilight will be sampled using the old radiance sampling method.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Subsystem\">\n      <summary>\n        <para>An Subsystem is initialized from an SubsystemDescriptor for a given Subsystem (Example, Input, Environment, Display, etc.) and provides an interface to interact with that given Subsystem until it is Destroyed. After an Subsystem is created it can be Started or Stopped to turn on and off functionality (and preserve performance). The base type for Subsystem only exposes this functionality; this class is designed to be a base class for derived classes that expose more functionality specific to a given Subsystem.\n\n            Note: initializing a second Subsystem from the same SubsystemDescriptor will return a reference to the existing Subsystem as only one Subsystem is currently allowed for a single Subsystem provider.\n            </para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Subsystem.Destroy\">\n      <summary>\n        <para>Destroys this instance of a subsystem.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Subsystem.Start\">\n      <summary>\n        <para>Starts an instance of a subsystem.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Subsystem.Stop\">\n      <summary>\n        <para>Stops an instance of a subsystem.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.SubsystemDescriptor`1\">\n      <summary>\n        <para>Information about a subsystem that can be queried before creating a subsystem instance.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.SubsystemDescriptor_1.Create\">\n      <summary>\n        <para>Creates an Subsystem from this descriptor.</para>\n      </summary>\n      <returns>\n        <para>Instance of subsystem.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.SubsystemManager\">\n      <summary>\n        <para>Gives access to subsystems which provide additional functionality through plugins.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.SubsystemManager.GetInstances(System.Collections.Generic.List`1&lt;T&gt;)\">\n      <summary>\n        <para>Returns active Subsystems of a specific instance type.</para>\n      </summary>\n      <param name=\"instances\">Active instances.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.SubsystemManager.GetSubsystemDescriptors(System.Collections.Generic.List`1&lt;T&gt;)\">\n      <summary>\n        <para>Returns a list of SubsystemDescriptors which describe additional functionality that can be enabled.</para>\n      </summary>\n      <param name=\"descriptors\">Subsystem specific descriptors.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.U2D.AngleRangeInfo\">\n      <summary>\n        <para>Describes the information about the edge and how to tessellate it.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.AngleRangeInfo.end\">\n      <summary>\n        <para>The maximum angle to be considered within this range.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.AngleRangeInfo.order\">\n      <summary>\n        <para>The render order of the edges that belong in this range.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.AngleRangeInfo.sprites\">\n      <summary>\n        <para>The list of Sprites that are associated with this range.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.AngleRangeInfo.start\">\n      <summary>\n        <para>The minimum angle to be considered within this range.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.U2D.PixelPerfectRendering\">\n      <summary>\n        <para>A collection of APIs that facilitate pixel perfect rendering of sprite-based renderers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.U2D.PixelPerfectRendering.pixelSnapSpacing\">\n      <summary>\n        <para>To achieve a pixel perfect render, Sprites must be displaced to discrete positions at render time. This value defines the minimum distance between these positions. This doesn’t affect the GameObject's transform position.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.U2D.ShapeControlPoint\">\n      <summary>\n        <para>Data that describes the important points of the shape.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.ShapeControlPoint.leftTangent\">\n      <summary>\n        <para>The position of the left tangent in local space.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.ShapeControlPoint.mode\">\n      <summary>\n        <para>The various modes of the tangent handles. They could be continuous or broken.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.ShapeControlPoint.position\">\n      <summary>\n        <para>The position of this point in the object's local space.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.ShapeControlPoint.rightTangent\">\n      <summary>\n        <para>The position of the right tangent point in the local space.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.U2D.SpriteBone\">\n      <summary>\n        <para>A struct that holds a rich set of information that describes the bind pose of this Sprite.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.U2D.SpriteBone.length\">\n      <summary>\n        <para>The length of the bone. This is important for the leaf bones to describe their length without needing another bone as the terminal bone.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.U2D.SpriteBone.name\">\n      <summary>\n        <para>The name of the bone. This is useful when recreating bone hierarchy at editor or runtime. You can also use this as a way of resolving the bone path when a Sprite is bound to a more complex or richer hierarchy.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.U2D.SpriteBone.parentId\">\n      <summary>\n        <para>The ID of the parent of this bone.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.U2D.SpriteBone.position\">\n      <summary>\n        <para>The position in local space of this bone.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.U2D.SpriteBone.rotation\">\n      <summary>\n        <para>The rotation of this bone in local space.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.U2D.SpriteDataAccessExtensions\">\n      <summary>\n        <para>A list of methods designed for reading and writing to the rich internal data of a Sprite.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.U2D.SpriteDataAccessExtensions.GetBindPoses(UnityEngine.Sprite)\">\n      <summary>\n        <para>Returns an array of BindPoses.</para>\n      </summary>\n      <param name=\"sprite\">The sprite to retrieve the bind pose from.</param>\n      <returns>\n        <para>A list of bind poses for this sprite. There is no need to dispose the returned NativeArray.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.U2D.SpriteDataAccessExtensions.GetBones(UnityEngine.Sprite)\">\n      <summary>\n        <para>Returns a list of SpriteBone in this Sprite.</para>\n      </summary>\n      <param name=\"sprite\">The sprite to get the list of SpriteBone from.</param>\n      <returns>\n        <para>An array of SpriteBone that belongs to this Sprite.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.U2D.SpriteDataAccessExtensions.GetBoneWeights(UnityEngine.Sprite)\">\n      <summary>\n        <para>Returns a list of BoneWeight that corresponds to each and every vertice in this Sprite.</para>\n      </summary>\n      <param name=\"sprite\">The Sprite to get the BoneWeights from.</param>\n      <returns>\n        <para>The list of BoneWeight. The length should equal the number of vertices. There is no need to call dispose on this NativeArray.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.U2D.SpriteDataAccessExtensions.GetIndices(UnityEngine.Sprite)\">\n      <summary>\n        <para>Returns a list of indices. This is the same as Sprite.triangle.</para>\n      </summary>\n      <param name=\"sprite\"></param>\n      <returns>\n        <para>A read-only list of indices indicating how the triangles are formed between the vertices. The array is marked as undisposable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.U2D.SpriteDataAccessExtensions.GetVertexAttribute(UnityEngine.Sprite,UnityEngine.Experimental.Rendering.VertexAttribute)\">\n      <summary>\n        <para>Retrieves a strided accessor to the internal vertex attributes.</para>\n      </summary>\n      <param name=\"sprite\"></param>\n      <param name=\"channel\"></param>\n      <returns>\n        <para>A read-only list of.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.U2D.SpriteDataAccessExtensions.GetVertexCount(UnityEngine.Sprite)\">\n      <summary>\n        <para>Returns the number of vertices in this Sprite.</para>\n      </summary>\n      <param name=\"sprite\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.U2D.SpriteDataAccessExtensions.HasVertexAttribute(UnityEngine.Sprite,UnityEngine.Experimental.Rendering.VertexAttribute)\">\n      <summary>\n        <para>Checks if a specific channel exists for this Sprite.</para>\n      </summary>\n      <param name=\"sprite\"></param>\n      <param name=\"channel\"></param>\n      <returns>\n        <para>True if the channel exists.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.U2D.SpriteDataAccessExtensions.SetBindPoses(UnityEngine.Sprite,Unity.Collections.NativeArray`1&lt;UnityEngine.Matrix4x4&gt;)\">\n      <summary>\n        <para>Sets the bind poses for this Sprite.</para>\n      </summary>\n      <param name=\"src\">The list of bind poses for this Sprite. The array must be disposed of by the caller.</param>\n      <param name=\"sprite\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.U2D.SpriteDataAccessExtensions.SetBones(UnityEngine.Sprite,UnityEngine.Experimental.U2D.SpriteBone[])\">\n      <summary>\n        <para>Sets the SpriteBones for this Sprite.</para>\n      </summary>\n      <param name=\"sprite\"></param>\n      <param name=\"src\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.U2D.SpriteDataAccessExtensions.SetBoneWeights(UnityEngine.Sprite,Unity.Collections.NativeArray`1&lt;UnityEngine.BoneWeight&gt;)\">\n      <summary>\n        <para>Sets the BoneWeight for this Sprite. The length of the input array must match the number of vertices.</para>\n      </summary>\n      <param name=\"src\">The list of BoneWeight for this Sprite. The array must be disposed of by the caller.</param>\n      <param name=\"sprite\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.U2D.SpriteDataAccessExtensions.SetIndices(UnityEngine.Sprite,Unity.Collections.NativeArray`1&lt;System.UInt16&gt;)\">\n      <summary>\n        <para>Set the indices for this Sprite. This is the same as Sprite.triangle.</para>\n      </summary>\n      <param name=\"src\">The list of indices for this Sprite. The array must be disposed of by the caller.</param>\n      <param name=\"sprite\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.U2D.SpriteDataAccessExtensions.SetVertexAttribute(UnityEngine.Sprite,UnityEngine.Experimental.Rendering.VertexAttribute,Unity.Collections.NativeArray`1&lt;T&gt;)\">\n      <summary>\n        <para>Sets a specific channel of the VertexAttribute.</para>\n      </summary>\n      <param name=\"src\">The list of values for this specific VertexAttribute channel. The array must be disposed of by the caller.</param>\n      <param name=\"sprite\"></param>\n      <param name=\"channel\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.U2D.SpriteDataAccessExtensions.SetVertexCount(UnityEngine.Sprite,System.Int32)\">\n      <summary>\n        <para>Sets the vertex count. This resizes the internal buffer. It also preserves any configurations of VertexAttributes.</para>\n      </summary>\n      <param name=\"sprite\"></param>\n      <param name=\"count\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.U2D.SpriteRendererDataAccessExtensions\">\n      <summary>\n        <para>A list of methods that allow the caller to override what the SpriteRenderer renders.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.U2D.SpriteRendererDataAccessExtensions.DeactivateDeformableBuffer(UnityEngine.SpriteRenderer)\">\n      <summary>\n        <para>Stop using the deformable buffer to render the Sprite and use the original mesh instead.</para>\n      </summary>\n      <param name=\"renderer\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.U2D.SpriteRendererDataAccessExtensions.GetDeformableVertices(UnityEngine.SpriteRenderer)\">\n      <summary>\n        <para>Returns an array of vertices to be deformed by the caller.</para>\n      </summary>\n      <param name=\"spriteRenderer\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.U2D.SpriteRendererDataAccessExtensions.UpdateDeformableBuffer(UnityEngine.SpriteRenderer,Unity.Jobs.JobHandle)\">\n      <summary>\n        <para>Provides the JobHandle that updates the deform buffer to the SpriteRenderer.</para>\n      </summary>\n      <param name=\"spriteRenderer\"></param>\n      <param name=\"fence\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.U2D.SpriteShapeMetaData\">\n      <summary>\n        <para>Additional data about the shape's control point. This is useful during tessellation of the shape.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.SpriteShapeMetaData.bevelCutoff\">\n      <summary>\n        <para>The threshold of the angle that decides if it should be tessellated as a curve or a corner.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.SpriteShapeMetaData.bevelSize\">\n      <summary>\n        <para>The radius of the curve to be tessellated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.SpriteShapeMetaData.corner\">\n      <summary>\n        <para>True will indicate that this point should be tessellated as a corner or a continuous line otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.SpriteShapeMetaData.height\">\n      <summary>\n        <para>The height of the tessellated edge.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.SpriteShapeMetaData.spriteIndex\">\n      <summary>\n        <para>The Sprite to be used for a particular edge.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.U2D.SpriteShapeParameters\">\n      <summary>\n        <para>Input parameters for the SpriteShape tessellator.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.SpriteShapeParameters.adaptiveUV\">\n      <summary>\n        <para>If enabled, the tessellator will adapt the size of the quads based on the height of the edge.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.SpriteShapeParameters.angleThreshold\">\n      <summary>\n        <para>The threshold of the angle that indicates whether it is a corner or not.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.SpriteShapeParameters.bevelCutoff\">\n      <summary>\n        <para>The threshold of the angle that decides if it should be tessellated as a curve or a corner.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.SpriteShapeParameters.bevelSize\">\n      <summary>\n        <para>The radius of the curve to be tessellated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.SpriteShapeParameters.borderPivot\">\n      <summary>\n        <para>The local displacement of the Sprite when tessellated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.SpriteShapeParameters.carpet\">\n      <summary>\n        <para>If true, the Shape will be tessellated as a closed form.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.SpriteShapeParameters.fillScale\">\n      <summary>\n        <para>The scale to be used to calculate the UVs of the fill texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.SpriteShapeParameters.fillTexture\">\n      <summary>\n        <para>The texture to be used for the fill of the SpriteShape.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.SpriteShapeParameters.smartSprite\">\n      <summary>\n        <para>If enabled the tessellator will consider creating corners based on the various input parameters.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.SpriteShapeParameters.splineDetail\">\n      <summary>\n        <para>The tessellation quality of the input Spline that determines the complexity of the mesh.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.SpriteShapeParameters.spriteBorders\">\n      <summary>\n        <para>The borders to be used for calculating the uv of the edges based on the border info found in Sprites.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.U2D.SpriteShapeParameters.transform\">\n      <summary>\n        <para>The world space transform of the game object used for calculating the UVs of the fill texture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.U2D.SpriteShapeRenderer\">\n      <summary>\n        <para>Renders SpriteShapes defined through the SpriteShapeUtility.GenerateSpriteShape API.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.U2D.SpriteShapeUtility\">\n      <summary>\n        <para>A static class that helps tessellate a SpriteShape mesh.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.U2D.SpriteShapeUtility.Generate(UnityEngine.Mesh,UnityEngine.Experimental.U2D.SpriteShapeParameters,UnityEngine.Experimental.U2D.ShapeControlPoint[],UnityEngine.Experimental.U2D.SpriteShapeMetaData[],UnityEngine.Experimental.U2D.AngleRangeInfo[],UnityEngine.Sprite[],UnityEngine.Sprite[])\">\n      <summary>\n        <para>Generate a mesh based on input parameters.</para>\n      </summary>\n      <param name=\"mesh\">The output mesh.</param>\n      <param name=\"shapeParams\">Input parameters for the SpriteShape tessellator.</param>\n      <param name=\"points\">A list of control points that describes the shape.</param>\n      <param name=\"metaData\">Additional data about the shape's control point. This is useful during tessellation of the shape.</param>\n      <param name=\"sprites\">The list of Sprites that could be used for the edges.</param>\n      <param name=\"corners\">The list of Sprites that could be used for the corners.</param>\n      <param name=\"angleRange\">A parameter that determins how to tessellate each of the edge.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.U2D.SpriteShapeUtility.GenerateSpriteShape(UnityEngine.Experimental.U2D.SpriteShapeRenderer,UnityEngine.Experimental.U2D.SpriteShapeParameters,UnityEngine.Experimental.U2D.ShapeControlPoint[],UnityEngine.Experimental.U2D.SpriteShapeMetaData[],UnityEngine.Experimental.U2D.AngleRangeInfo[],UnityEngine.Sprite[],UnityEngine.Sprite[])\">\n      <summary>\n        <para>Generate a mesh based on input parameters.</para>\n      </summary>\n      <param name=\"renderer\">SpriteShapeRenderer to which the generated geometry is fed to.</param>\n      <param name=\"shapeParams\">Input parameters for the SpriteShape tessellator.</param>\n      <param name=\"points\">A list of control points that describes the shape.</param>\n      <param name=\"metaData\">Additional data about the shape's control point. This is useful during tessellation of the shape.</param>\n      <param name=\"sprites\">The list of Sprites that could be used for the edges.</param>\n      <param name=\"corners\">The list of Sprites that could be used for the corners.</param>\n      <param name=\"angleRange\">A parameter that determins how to tessellate each of the edge.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.AttachToPanelEvent\">\n      <summary>\n        <para>Event sent after an element is added to an element that is a descendent of a panel.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.AttachToPanelEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid newing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.BaseControl`1\">\n      <summary>\n        <para>Abstract base class for controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.BaseControl_1.value\">\n      <summary>\n        <para>The value associated with the control.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.BaseControl`1.BaseControlUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the BaseControl.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.BaseControl_1.BaseControlUxmlTraits.uxmlChildElementsDescription\">\n      <summary>\n        <para>Returns an empty enumerable, as controls generally do not have children.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.BaseControl_1.BaseControlUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.BaseTextControl`1\">\n      <summary>\n        <para>Abstract base class for controls containing a text property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.BaseTextControl_1.text\">\n      <summary>\n        <para>The text associated with the control.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.BaseTextControl_1.value\">\n      <summary>\n        <para>The value associated with the control.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.BaseTextControl`1.BaseTextControlUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the BaseTextControl.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.BaseTextControl_1.BaseTextControlUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.BaseTextElement\">\n      <summary>\n        <para>Abstract base class for VisualElement containing text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.BaseTextElement.text\">\n      <summary>\n        <para>The text associated with the element.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.BaseTextElement.BaseTextElementUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the BaseTextElement.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.BaseTextElement.BaseTextElementUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for BasetextElement properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.BaseTextElement.BaseTextElementUxmlTraits.uxmlChildElementsDescription\">\n      <summary>\n        <para>Returns an empty enumerable, as text elements generally do not have children.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.BaseTextElement.BaseTextElementUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.BaseTextElement.BaseTextElementUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize BaseTextElement properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.BlurEvent\">\n      <summary>\n        <para>Event sent immediately after an element has lost focus. Capturable, does not bubbles, non-cancellable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.BlurEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid newing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.Box\">\n      <summary>\n        <para>Styled visual element to match the IMGUI Box Style.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.Box.BoxFactory\">\n      <summary>\n        <para>Instantiates a Box using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Box.BoxFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.Button.ButtonFactory\">\n      <summary>\n        <para>Instantiates a Button using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Button.ButtonFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.Button.ButtonUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the Button.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Button.ButtonUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.CallbackEventHandler\">\n      <summary>\n        <para>Interface for classes capable of having callbacks to handle events.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.CallbackEventHandler.HandleEvent(UnityEngine.Experimental.UIElements.EventBase)\">\n      <summary>\n        <para>Handle an event, most often by executing the callbacks associated with the event.</para>\n      </summary>\n      <param name=\"evt\">The event to handle.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.CallbackEventHandler.HasBubbleHandlers\">\n      <summary>\n        <para>Return true if event handlers for the event propagation bubble up phase have been attached on this object.</para>\n      </summary>\n      <returns>\n        <para>True if object has event handlers for the bubble up phase.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.CallbackEventHandler.HasCaptureHandlers\">\n      <summary>\n        <para>Return true if event handlers for the event propagation capture phase have been attached on this object.</para>\n      </summary>\n      <returns>\n        <para>True if object has event handlers for the capture phase.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.CallbackEventHandler.RegisterCallback(UnityEngine.Experimental.UIElements.EventCallback`1&lt;TEventType&gt;,UnityEngine.Experimental.UIElements.Capture)\">\n      <summary>\n        <para>Add an event handler on the instance. If the handler has already been registered on the same phase (capture or bubbling), this will have no effect.</para>\n      </summary>\n      <param name=\"callback\">The event handler to add.</param>\n      <param name=\"useCapture\">By default the callback will be called during the bubbling phase. Pass Capture.Capture to have the callback called during the capture phase instead.</param>\n      <param name=\"userArgs\">Data to pass to the callback.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.CallbackEventHandler.RegisterCallback(UnityEngine.Experimental.UIElements.EventCallback`2&lt;TEventType,TUserArgsType&gt;,TUserArgsType,UnityEngine.Experimental.UIElements.Capture)\">\n      <summary>\n        <para>Add an event handler on the instance. If the handler has already been registered on the same phase (capture or bubbling), this will have no effect.</para>\n      </summary>\n      <param name=\"callback\">The event handler to add.</param>\n      <param name=\"useCapture\">By default the callback will be called during the bubbling phase. Pass Capture.Capture to have the callback called during the capture phase instead.</param>\n      <param name=\"userArgs\">Data to pass to the callback.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.CallbackEventHandler.UnregisterCallback(UnityEngine.Experimental.UIElements.EventCallback`1&lt;TEventType&gt;,UnityEngine.Experimental.UIElements.Capture)\">\n      <summary>\n        <para>Remove callback from the instance.</para>\n      </summary>\n      <param name=\"callback\">The callback to remove.</param>\n      <param name=\"useCapture\">Select wether the callback should be removed from the capture or the bubbling phase.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.CallbackEventHandler.UnregisterCallback(UnityEngine.Experimental.UIElements.EventCallback`2&lt;TEventType,TUserArgsType&gt;,UnityEngine.Experimental.UIElements.Capture)\">\n      <summary>\n        <para>Remove callback from the instance.</para>\n      </summary>\n      <param name=\"callback\">The callback to remove.</param>\n      <param name=\"useCapture\">Select wether the callback should be removed from the capture or the bubbling phase.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.Capture\">\n      <summary>\n        <para>Used to specify the phases where an event handler should be executed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.Capture.Capture\">\n      <summary>\n        <para>The event handler should be executed during the capture and the target phases.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.Capture.NoCapture\">\n      <summary>\n        <para>The event handler should be executed during the target and bubble up phases.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ChangeEvent`1\">\n      <summary>\n        <para>Sends an event when a value from a field changes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ChangeEvent_1.newValue\">\n      <summary>\n        <para>The new value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ChangeEvent_1.previousValue\">\n      <summary>\n        <para>The value before the change occured.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ChangeEvent_1.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ChangeEvent_1.GetPooled(T,T)\">\n      <summary>\n        <para>Gets an event from the event pool and initializes it with the given values. Use this function instead of creating new events. Events obtained from this method should be released back to the pool using ReleaseEvent().</para>\n      </summary>\n      <param name=\"previousValue\"></param>\n      <param name=\"newValue\"></param>\n      <returns>\n        <para>An event.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ChangeEvent_1.Init\">\n      <summary>\n        <para>Sets the event to its initial state.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ChangeType\">\n      <summary>\n        <para>Enum which describes the various types of changes that can occur on a VisualElement.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.ChangeType.All\">\n      <summary>\n        <para>All change types have been flagged.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.ChangeType.PersistentData\">\n      <summary>\n        <para>Persistence key or parent has changed on the current VisualElement.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.ChangeType.PersistentDataPath\">\n      <summary>\n        <para>Persistence key or parent has changed on some child of the current VisualElement.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.CommandEventBase`1\">\n      <summary>\n        <para>Base class for command events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.CommandEventBase_1.commandName\">\n      <summary>\n        <para>Name of the command.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.CommandEventBase_1.GetPooled(UnityEngine.Event)\">\n      <summary>\n        <para>Gets an event from the event pool and initializes it with the given values. Use this function instead of creating new events. Events obtained from this method should be released back to the pool using ReleaseEvent().</para>\n      </summary>\n      <param name=\"commandName\">The command name.</param>\n      <param name=\"systemEvent\">An IMGUI command event.</param>\n      <returns>\n        <para>An event.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.CommandEventBase_1.GetPooled(System.String)\">\n      <summary>\n        <para>Gets an event from the event pool and initializes it with the given values. Use this function instead of creating new events. Events obtained from this method should be released back to the pool using ReleaseEvent().</para>\n      </summary>\n      <param name=\"commandName\">The command name.</param>\n      <param name=\"systemEvent\">An IMGUI command event.</param>\n      <returns>\n        <para>An event.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.CommandEventBase_1.Init\">\n      <summary>\n        <para>Reset the event members to their initial value.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ContextClickEvent\">\n      <summary>\n        <para>The event sent when clicking the right mouse button.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextClickEvent.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ContextualMenu\">\n      <summary>\n        <para>A contextual menu.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenu.AppendAction(System.String,System.Action`1&lt;UnityEngine.Experimental.UIElements.ContextualMenu/MenuAction&gt;,System.Func`2&lt;UnityEngine.Experimental.UIElements.ContextualMenu/MenuAction,UnityEngine.Experimental.UIElements.ContextualMenu/MenuAction/StatusFlags&gt;,System.Object)\">\n      <summary>\n        <para>Add an item that will execute an action in the contextual menu. The item is added at the end of the current item list.</para>\n      </summary>\n      <param name=\"actionName\">Name of the item. This name will be displayed in the contextual menu.</param>\n      <param name=\"action\">Callback to execute when the user selects this item in the menu.</param>\n      <param name=\"actionStatusCallback\">Callback to execute to determine the status of the item.</param>\n      <param name=\"userData\">An object that will be stored in the userData property of the MenuAction item.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenu.AppendSeparator()\">\n      <summary>\n        <para>Add a separator line in the menu. The separator is added at the end of the current item list.</para>\n      </summary>\n      <param name=\"subMenuPath\">The submenu path where the separator will be added. Path components are delimited by forward slashes ('/').</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenu.AppendSeparator(System.String)\">\n      <summary>\n        <para>Add a separator line in the menu. The separator is added at the end of the current item list.</para>\n      </summary>\n      <param name=\"subMenuPath\">The submenu path where the separator will be added. Path components are delimited by forward slashes ('/').</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenu.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ContextualMenu.EventInfo\">\n      <summary>\n        <para>A class holding information about the event that triggered the display of the contextual menu.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ContextualMenu.EventInfo.localMousePosition\">\n      <summary>\n        <para>If the triggering event was a mouse event, this property is the mouse position. The position is expressed using the coordinate system of the element that received the mouse event. Otherwise this property is zero.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ContextualMenu.EventInfo.modifiers\">\n      <summary>\n        <para>If modifier keys (Alt, Control, Shift, Windows/Command) were pressed to trigger the display of the contextual menu, this property lists the modifier keys.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ContextualMenu.EventInfo.mousePosition\">\n      <summary>\n        <para>If the triggering event was a mouse event, this property is the mouse position expressed using the global coordinate system. Otherwise this property is zero.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenu.EventInfo.#ctor(UnityEngine.Experimental.UIElements.EventBase)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"e\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenu.InsertAction(System.Int32,System.String,System.Action`1&lt;UnityEngine.Experimental.UIElements.ContextualMenu/MenuAction&gt;,System.Func`2&lt;UnityEngine.Experimental.UIElements.ContextualMenu/MenuAction,UnityEngine.Experimental.UIElements.ContextualMenu/MenuAction/StatusFlags&gt;,System.Object)\">\n      <summary>\n        <para>Add an item that will execute an action in the contextual menu. The item is added at the end of the specified index in the list.</para>\n      </summary>\n      <param name=\"actionName\">Name of the item. This name will be displayed in the contextual menu.</param>\n      <param name=\"action\">Callback to execute when the user selects this item in the menu.</param>\n      <param name=\"actionStatusCallback\">Callback to execute to determine the status of the item.</param>\n      <param name=\"atIndex\">Index where the item should be inserted.</param>\n      <param name=\"userData\">An object that will be stored in the userData property of the MenuAction item. This object is accessible through the action callback.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenu.InsertSeparator(System.String,System.Int32)\">\n      <summary>\n        <para>Add a separator line in the menu. The separator is added at the end of the specified index in the list.</para>\n      </summary>\n      <param name=\"atIndex\">Index where the separator should be inserted.</param>\n      <param name=\"subMenuPath\">The submenu path where the separator is added. Path components are delimited by forward slashes ('/').</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ContextualMenu.MenuAction\">\n      <summary>\n        <para>A menu action item.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ContextualMenu.MenuAction.eventInfo\">\n      <summary>\n        <para>Provides information on the event that triggered the contextual menu.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.ContextualMenu.MenuAction.name\">\n      <summary>\n        <para>The name of the item. The name can be prefixed by its submenu path. Path components are delimited by forward slashes ('/').</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ContextualMenu.MenuAction.status\">\n      <summary>\n        <para>The status of the item.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ContextualMenu.MenuAction.userData\">\n      <summary>\n        <para>The userData object stored by the constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenu.MenuAction.AlwaysDisabled(UnityEngine.Experimental.UIElements.ContextualMenu/MenuAction)\">\n      <summary>\n        <para>Status callback that always returns StatusFlags.Disabled.</para>\n      </summary>\n      <param name=\"a\">Unused parameter.</param>\n      <returns>\n        <para>Always return StatusFlags.Disabled.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenu.MenuAction.AlwaysEnabled(UnityEngine.Experimental.UIElements.ContextualMenu/MenuAction)\">\n      <summary>\n        <para>Status callback that always returns StatusFlags.Enabled.</para>\n      </summary>\n      <param name=\"a\">Unused parameter.</param>\n      <returns>\n        <para>Always return StatusFlags.Enabled.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenu.MenuAction.#ctor(System.String,System.Action`1&lt;UnityEngine.Experimental.UIElements.ContextualMenu/MenuAction&gt;,System.Func`2&lt;UnityEngine.Experimental.UIElements.ContextualMenu/MenuAction,UnityEngine.Experimental.UIElements.ContextualMenu/MenuAction/StatusFlags&gt;,System.Object)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"actionName\">The path and name of the menu item. Use the path, delimited by forward slashes ('/'), to place the menu item within a submenu.</param>\n      <param name=\"actionCallback\">Action to be executed when the menu item is selected.</param>\n      <param name=\"actionStatusCallback\">Function called to determine if the menu item is enabled.</param>\n      <param name=\"userData\">An object that will be stored in the userData property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenu.MenuAction.Execute\">\n      <summary>\n        <para>Execute the callback associated with this item.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenu.MenuAction.UpdateActionStatus(UnityEngine.Experimental.UIElements.ContextualMenu/EventInfo)\">\n      <summary>\n        <para>Update the status flag of this item by calling the item status callback.</para>\n      </summary>\n      <param name=\"eventInfo\">Information about the event that triggered the display of the context menu, such as the mouse position or the key pressed.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ContextualMenu.MenuItem\">\n      <summary>\n        <para>An item in a contextual menu.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenu.MenuItems\">\n      <summary>\n        <para>Get the list of menu items.</para>\n      </summary>\n      <returns>\n        <para>The list of items in the menu.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenu.PrepareForDisplay(UnityEngine.Experimental.UIElements.EventBase)\">\n      <summary>\n        <para>Update the status of all items by calling their status callback and remove the separators in excess. This is called just before displaying the menu.</para>\n      </summary>\n      <param name=\"e\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenu.RemoveItemAt(System.Int32)\">\n      <summary>\n        <para>Remove the menu item at index.</para>\n      </summary>\n      <param name=\"index\">The index of the item to remove.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ContextualMenu.Separator\">\n      <summary>\n        <para>A separator menu item.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.ContextualMenu.Separator.subMenuPath\">\n      <summary>\n        <para>The submenu path where the separator will be added. Path components are delimited by forward slashes ('/').</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenu.Separator.#ctor(System.String)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"subMenuPath\">The path for the submenu. Path components are delimited by forward slashes ('/').</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ContextualMenuManager\">\n      <summary>\n        <para>Use this class to display a contextual menu.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenuManager.DisplayMenu(UnityEngine.Experimental.UIElements.EventBase,UnityEngine.Experimental.UIElements.IEventHandler)\">\n      <summary>\n        <para>Display the contextual menu.</para>\n      </summary>\n      <param name=\"triggerEvent\">The event that triggered the display of the menu.</param>\n      <param name=\"target\">The element for which the menu is displayed.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenuManager.DisplayMenuIfEventMatches(UnityEngine.Experimental.UIElements.EventBase,UnityEngine.Experimental.UIElements.IEventHandler)\">\n      <summary>\n        <para>Check if the event is an event that triggers the display of the menu and display it if it needs to.</para>\n      </summary>\n      <param name=\"eventHandler\">The element for which the menu is displayed.</param>\n      <param name=\"evt\">The event to inspect.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenuManager.DoDisplayMenu(UnityEngine.Experimental.UIElements.ContextualMenu,UnityEngine.Experimental.UIElements.EventBase)\">\n      <summary>\n        <para>Display the contextual menu.</para>\n      </summary>\n      <param name=\"menu\">The menu to display.</param>\n      <param name=\"triggerEvent\">The event that triggered the display of the contextual menu.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ContextualMenuManipulator\">\n      <summary>\n        <para>Manipulator that displays a contextual menu when the user clicks the right mouse button or presses the menu key on the keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenuManipulator.#ctor(System.Action`1&lt;UnityEngine.Experimental.UIElements.ContextualMenuPopulateEvent&gt;)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"menuBuilder\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenuManipulator.RegisterCallbacksOnTarget\">\n      <summary>\n        <para>Register the event callbacks on the manipulator target.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenuManipulator.UnregisterCallbacksFromTarget\">\n      <summary>\n        <para>Unregister the event callbacks from the manipulator target.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ContextualMenuPopulateEvent\">\n      <summary>\n        <para>An event sent when a contextual menu needs to be filled with menu item.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ContextualMenuPopulateEvent.menu\">\n      <summary>\n        <para>The menu to populate.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenuPopulateEvent.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenuPopulateEvent.GetPooled(UnityEngine.Experimental.UIElements.EventBase,UnityEngine.Experimental.UIElements.ContextualMenu,UnityEngine.Experimental.UIElements.IEventHandler)\">\n      <summary>\n        <para>Retrieves an event from the event pool. Use this method to retrieve a mouse event and initialize the event, instead of creating a new mouse event.</para>\n      </summary>\n      <param name=\"triggerEvent\">The event that triggered the display of the contextual menu.</param>\n      <param name=\"menu\">The menu to populate.</param>\n      <param name=\"target\">The element that triggered the display of the contextual menu.</param>\n      <returns>\n        <para>The event.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ContextualMenuPopulateEvent.Init\">\n      <summary>\n        <para>Reset the event members to their initial value.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.CreationContext\">\n      <summary>\n        <para>This class is used during UXML template instantiation.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.CursorStyle\">\n      <summary>\n        <para>Script interface for VisualElement cursor style property IStyle.cursor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.CursorStyle.hotspot\">\n      <summary>\n        <para>The offset from the top left of the texture to use as the target point (must be within the bounds of the cursor).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.CursorStyle.texture\">\n      <summary>\n        <para>The texture to use for the cursor style. To use a texture as a cursor, import the texture with \"Read/Write enabled\" in the texture importer (or using the \"Cursor\" defaults).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.DetachFromPanelEvent\">\n      <summary>\n        <para>Event sent just before an element is detach from its parent, if the parent is the descendant of a panel.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.DetachFromPanelEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid newing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.DragAndDropEventBase`1\">\n      <summary>\n        <para>Base class for drag and drop events.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.DragEnterEvent\">\n      <summary>\n        <para>Use the DragEnterEvent class to manage events that occur when dragging enters an element or one of its descendants. The DragEnterEvent can be cancelled, cannot be captured, and does not bubble.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.DragEnterEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid renewing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.DragEnterEvent.Init\">\n      <summary>\n        <para>Resets the event members to their initial values.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.DragExitedEvent\">\n      <summary>\n        <para>The event sent to a dragged element when the drag and drop process ends.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.DragExitedEvent.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.DragExitedEvent.Init\">\n      <summary>\n        <para>Resets the event members to their initial values.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.DragLeaveEvent\">\n      <summary>\n        <para>Use the DragLeaveEvent class to manage events sent when dragging leaves an element or one of its descendants. The DragLeaveEvent can be cancelled, cannot be captured, and does not bubble.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.DragLeaveEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid renewing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.DragLeaveEvent.Init\">\n      <summary>\n        <para>Resets the event members to their initial values.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.DragPerformEvent\">\n      <summary>\n        <para>The event sent to an element when another element is dragged and dropped on the element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.DragPerformEvent.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.DragUpdatedEvent\">\n      <summary>\n        <para>The event sent when the element being dragged enters a possible drop target.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.DragUpdatedEvent.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.EventBase\">\n      <summary>\n        <para>The base class for all UIElements events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.EventBase.bubbles\">\n      <summary>\n        <para>Returns whether this event type bubbles up in the event propagation path.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.EventBase.capturable\">\n      <summary>\n        <para>Return whether this event is sent down the event propagation path during the capture phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.EventBase.currentTarget\">\n      <summary>\n        <para>The current target of the event. The current target is the element in the propagation path for which event handlers are currently being executed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.EventBase.dispatch\">\n      <summary>\n        <para>Return whether the event is currently being dispatched to visual element. An event can not be redispatched while being dispatched. If you need to recursively redispatch an event, you should use a copy.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.EventBase.flags\">\n      <summary>\n        <para>Flags for the event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.EventBase.imguiEvent\">\n      <summary>\n        <para>The IMGUIEvent at the source of this event. This can be null as not all events are generated by IMGUI.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.EventBase.isDefaultPrevented\">\n      <summary>\n        <para>Return true if the default actions should not be executed for this event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.EventBase.isImmediatePropagationStopped\">\n      <summary>\n        <para>Return true if StopImmediatePropagation() has been called for this event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.EventBase.isPropagationStopped\">\n      <summary>\n        <para>Return true if StopPropagation() has been called for this event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.EventBase.originalMousePosition\">\n      <summary>\n        <para>The original mouse position of the IMGUI event, before it is transformed to the local element coordinates. </para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.EventBase.propagationPhase\">\n      <summary>\n        <para>The current propagation phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.EventBase.target\">\n      <summary>\n        <para>The target for this event. The is the visual element that received the event. Unlike currentTarget, target does not change when the event is sent to elements along the propagation path.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.EventBase.timestamp\">\n      <summary>\n        <para>The time at which the event was created.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.EventBase.Dispose\">\n      <summary>\n        <para>Implementation of IDisposable.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.EventBase.EventFlags\">\n      <summary>\n        <para>Flags to describe the characteristics of an event.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.EventBase.EventFlags.Bubbles\">\n      <summary>\n        <para>Event will bubble up the propagation path (i.e. from the target parent up to the visual tree root).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.EventBase.EventFlags.Cancellable\">\n      <summary>\n        <para>Execution of default behavior for this event can be cancelled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.EventBase.EventFlags.Capturable\">\n      <summary>\n        <para>Event will be sent down the propagation path during the capture phase (i.e. from the visual tree root down to the target parent).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.EventBase.EventFlags.None\">\n      <summary>\n        <para>Empty value.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.EventBase.EventFlags.Pooled\">\n      <summary>\n        <para>Event has been instanciated from the event pool.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.EventBase.GetEventTypeId\">\n      <summary>\n        <para>Get the type id for this event instance.</para>\n      </summary>\n      <returns>\n        <para>The type ID.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.EventBase.Init\">\n      <summary>\n        <para>Reset the event members to their initial value.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.EventBase.PreventDefault\">\n      <summary>\n        <para>Call this function to prevent the execution of the default actions for this event.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.EventBase.RegisterEventType\">\n      <summary>\n        <para>Register an event class to the event type system.</para>\n      </summary>\n      <returns>\n        <para>The type ID.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.EventBase.StopImmediatePropagation\">\n      <summary>\n        <para>Immediately stop the propagation of this event. The event will not be sent to any further event handlers on the current target or on any other element in the propagation path.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.EventBase.StopPropagation\">\n      <summary>\n        <para>Stop the propagation of this event. The event will not be sent to any further element in the propagation path. Further event handlers on the current target will be executed.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.EventBase`1\">\n      <summary>\n        <para>Generic base class for events, implementing event pooling and automatic registration to the event type system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.EventBase_1.Dispose\">\n      <summary>\n        <para>Implementation of IDispose.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.EventBase_1.GetEventTypeId\">\n      <summary>\n        <para>Get the type id for this event instance.</para>\n      </summary>\n      <returns>\n        <para>The type ID.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.EventBase_1.GetPooled\">\n      <summary>\n        <para>Get an event from the event pool. Use this function instead of creating new events. Events obtained from this method should be released back to the pool using ReleaseEvent().</para>\n      </summary>\n      <returns>\n        <para>An event.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.EventBase_1.ReleasePooled(T)\">\n      <summary>\n        <para>Release an event obtained from GetPooled().</para>\n      </summary>\n      <param name=\"evt\">The event to release.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.EventBase_1.TypeId\">\n      <summary>\n        <para>Get the type id for this event instance.</para>\n      </summary>\n      <returns>\n        <para>The event instance type id.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ExecuteCommandEvent\">\n      <summary>\n        <para>The event sent when an element should execute a command.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ExecuteCommandEvent.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.Focusable\">\n      <summary>\n        <para>Base class for objects that can get the focus.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.Focusable.canGrabFocus\">\n      <summary>\n        <para>Return true if the element can be focused.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.Focusable.focusController\">\n      <summary>\n        <para>Return the focus controller for this element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.Focusable.focusIndex\">\n      <summary>\n        <para>An integer used to sort focusables in the focus ring. A negative value means that the element can not be focused.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Focusable.Blur\">\n      <summary>\n        <para>Tell the element to release the focus.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Focusable.Focus\">\n      <summary>\n        <para>Attempt to give the focus to this element.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.FocusChangeDirection\">\n      <summary>\n        <para>Base class for defining in which direction the focus moves in a focus ring.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.FocusChangeDirection.lastValue\">\n      <summary>\n        <para>Last value for the direction defined by this class.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.FocusChangeDirection.none\">\n      <summary>\n        <para>The null direction. This is usually used when the focus stays on the same element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.FocusChangeDirection.unspecified\">\n      <summary>\n        <para>Focus came from an unspecified direction, for example after a mouse down.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.FocusChangeDirection.implop_int(FocusChangeDirection)(UnityEngine.Experimental.UIElements.FocusChangeDirection)\">\n      <summary>\n        <para>The underlying integer value for this direction.</para>\n      </summary>\n      <param name=\"fcd\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.FocusController\">\n      <summary>\n        <para>Class in charge of managing the focus inside a Panel.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.FocusController.focusedElement\">\n      <summary>\n        <para>The currently focused element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.FocusController.#ctor(UnityEngine.Experimental.UIElements.IFocusRing)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"focusRing\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.FocusController.SwitchFocusOnEvent(UnityEngine.Experimental.UIElements.EventBase)\">\n      <summary>\n        <para>Ask the controller to change the focus according to the event. The focus controller will use its focus ring to choose the next element to be focused.</para>\n      </summary>\n      <param name=\"e\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.FocusEvent\">\n      <summary>\n        <para>Event sent immediately after an element has gained focus. Capturable, does not bubbles, non-cancellable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.FocusEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid newing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.FocusEventBase`1\">\n      <summary>\n        <para>Base class for focus related events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.FocusEventBase_1.direction\">\n      <summary>\n        <para>Direction of the focus change.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.FocusEventBase_1.relatedTarget\">\n      <summary>\n        <para>For FocusOut and Blur events, the element gaining the focus. For FocusIn and Focus events, the element losing the focus.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.FocusEventBase_1.GetPooled(UnityEngine.Experimental.UIElements.IEventHandler,UnityEngine.Experimental.UIElements.Focusable,UnityEngine.Experimental.UIElements.FocusChangeDirection)\">\n      <summary>\n        <para>Get an event from the event pool and initialize it with the given values. Use this function instead of creating new events. Events obtained from this method should be released back to the pool using ReleaseEvent().</para>\n      </summary>\n      <param name=\"target\">The event target.</param>\n      <param name=\"relatedTarget\">The related target.</param>\n      <param name=\"direction\">The direction of the focus change.</param>\n      <returns>\n        <para>An event.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.FocusEventBase_1.Init\">\n      <summary>\n        <para>Reset the event members to their initial value.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.FocusInEvent\">\n      <summary>\n        <para>Event sent immediately before an element gains focus. Capturable, bubbles, non-cancellable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.FocusInEvent.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.FocusInEvent.Init\">\n      <summary>\n        <para>Reset the event members to their initial value.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.FocusOutEvent\">\n      <summary>\n        <para>Event sent immediately before an element loses focus. Capturable, bubbles, non-cancellable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.FocusOutEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid newing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.FocusOutEvent.Init\">\n      <summary>\n        <para>Reset the event members to their initial value.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.GeometryChangedEvent\">\n      <summary>\n        <para>Event sent after layout calculations, when the position or the dimension of an element changes. This event cannot be captured, cannot be cancelled, and it does not bubble.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.GeometryChangedEvent.newRect\">\n      <summary>\n        <para>The new dimensions of the element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.GeometryChangedEvent.oldRect\">\n      <summary>\n        <para>The old dimensions of the element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.GeometryChangedEvent.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.GeometryChangedEvent.GetPooled(UnityEngine.Rect,UnityEngine.Rect)\">\n      <summary>\n        <para>Gets an event from the event pool and initializes the event with the specified values. Use this method instead of instancing new events. Use Dispose() to release events back to the event pool.</para>\n      </summary>\n      <param name=\"oldRect\">The old dimensions of the element.</param>\n      <param name=\"newRect\">The new dimensions of the element.</param>\n      <returns>\n        <para>Returns an event from the pool.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.GeometryChangedEvent.Init\">\n      <summary>\n        <para>Resets the event values to their initial values.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IChangeEvent\">\n      <summary>\n        <para>Base interface for ChangeEvent.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.ICommandEvent\">\n      <summary>\n        <para>Interface for Command events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ICommandEvent.commandName\">\n      <summary>\n        <para>Name of the command.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IDragAndDropEvent\">\n      <summary>\n        <para>Interface for drag and drop events.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IEventDispatcher\">\n      <summary>\n        <para>Interface for event dispatchers.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IEventDispatcher.DispatchEvent(UnityEngine.Experimental.UIElements.EventBase,UnityEngine.Experimental.UIElements.IPanel)\">\n      <summary>\n        <para>Dispatch an event to the panel.</para>\n      </summary>\n      <param name=\"evt\">The event to dispatch.</param>\n      <param name=\"panel\">The panel where the event will be dispatched.</param>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IEventHandler\">\n      <summary>\n        <para>Interface for class capable of handling events.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IEventHandler.HandleEvent(UnityEngine.Experimental.UIElements.EventBase)\">\n      <summary>\n        <para>Handle an event.</para>\n      </summary>\n      <param name=\"evt\">The event to handle.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IEventHandler.HasBubbleHandlers\">\n      <summary>\n        <para>Return true if event handlers for the event propagation bubble up phase have been attached on this object.</para>\n      </summary>\n      <returns>\n        <para>True if object has event handlers for the bubble up phase.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IEventHandler.HasCaptureHandlers\">\n      <summary>\n        <para>Return true if event handlers for the event propagation capture phase have been attached on this object.</para>\n      </summary>\n      <returns>\n        <para>True if object has event handlers for the capture phase.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IFocusEvent\">\n      <summary>\n        <para>Interface for focus events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IFocusEvent.direction\">\n      <summary>\n        <para>Direction of the focus change.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IFocusEvent.relatedTarget\">\n      <summary>\n        <para>Related target. See implementation for specific meaning.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IFocusRing\">\n      <summary>\n        <para>Interface for classes implementing focus rings.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IFocusRing.GetFocusChangeDirection(UnityEngine.Experimental.UIElements.Focusable,UnityEngine.Experimental.UIElements.EventBase)\">\n      <summary>\n        <para>Get the direction of the focus change for the given event. For example, when the Tab key is pressed, focus should be given to the element to the right.</para>\n      </summary>\n      <param name=\"currentFocusable\"></param>\n      <param name=\"e\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IFocusRing.GetNextFocusable(UnityEngine.Experimental.UIElements.Focusable,UnityEngine.Experimental.UIElements.FocusChangeDirection)\">\n      <summary>\n        <para>Get the next element in the given direction.</para>\n      </summary>\n      <param name=\"currentFocusable\"></param>\n      <param name=\"direction\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IKeyboardEvent\">\n      <summary>\n        <para>Interface for keyboard events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IKeyboardEvent.altKey\">\n      <summary>\n        <para>Return true if the Alt key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IKeyboardEvent.character\">\n      <summary>\n        <para>The character.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IKeyboardEvent.commandKey\">\n      <summary>\n        <para>Return true if the Windows/Command key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IKeyboardEvent.ctrlKey\">\n      <summary>\n        <para>Return true if the Control key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IKeyboardEvent.keyCode\">\n      <summary>\n        <para>The key code.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IKeyboardEvent.modifiers\">\n      <summary>\n        <para>Flag set holding the pressed modifier keys (Alt, Control, Shift, Windows/Command).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IKeyboardEvent.shiftKey\">\n      <summary>\n        <para>Return true if the Shift key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.Image\">\n      <summary>\n        <para>A VisualElement representing a source texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.Image.image\">\n      <summary>\n        <para>The source texture of the Image element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.Image.sourceRect\">\n      <summary>\n        <para>The source rectangle inside the texture relative to the top left corner.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.Image.uv\">\n      <summary>\n        <para>The base texture coordinates of the Image relative to the bottom left corner.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.Image.ImageFactory\">\n      <summary>\n        <para>Instantiates an Image using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Image.ImageFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.Image.ImageUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the Image.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.Image.ImageUxmlTraits.uxmlChildElementsDescription\">\n      <summary>\n        <para>Returns an empty enumerable, as images generally do not have children.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Image.ImageUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.IMGUIContainer.IMGUIContainerFactory\">\n      <summary>\n        <para>Instantiates an IMGUIContainer using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IMGUIContainer.IMGUIContainerFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.IMGUIContainer.IMGUIContainerUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the IMGUIContainer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IMGUIContainer.IMGUIContainerUxmlTraits.uxmlChildElementsDescription\">\n      <summary>\n        <para>Returns an empty enumerable, as IMGUIContainer cannot have VisualElement children.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IMGUIContainer.IMGUIContainerUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.IMGUIEvent\">\n      <summary>\n        <para>Class used to dispatch IMGUI event types that have no equivalent in UIElements events.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IMGUIEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid newing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IMGUIEvent.GetPooled(UnityEngine.Event)\">\n      <summary>\n        <para>Get an event from the event pool and initialize it with the given values. Use this function instead of creating new events. Events obtained from this method should be released back to the pool using ReleaseEvent().</para>\n      </summary>\n      <param name=\"systemEvent\">The IMGUI event used to initialize the event.</param>\n      <returns>\n        <para>An event.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IMGUIEvent.Init\">\n      <summary>\n        <para>Reset the event members to their initial value.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IMouseCaptureEvent\">\n      <summary>\n        <para>Interface for mouse capture events.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IMouseEvent\">\n      <summary>\n        <para>Interface for mouse events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IMouseEvent.altKey\">\n      <summary>\n        <para>Return true if the Alt key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IMouseEvent.button\">\n      <summary>\n        <para>Integer representing the pressed mouse button: 0 is left, 1 is right, 2 is center.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IMouseEvent.clickCount\">\n      <summary>\n        <para>Number of clicks.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IMouseEvent.commandKey\">\n      <summary>\n        <para>Return true if the Windows/Command key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IMouseEvent.ctrlKey\">\n      <summary>\n        <para>Return true if the Control key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IMouseEvent.localMousePosition\">\n      <summary>\n        <para>The mouse position in the current target coordinate system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IMouseEvent.modifiers\">\n      <summary>\n        <para>Flag set holding the pressed modifier keys (Alt, Control, Shift, Windows/Command).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IMouseEvent.mouseDelta\">\n      <summary>\n        <para>Mouse position difference between the last mouse event and this one.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IMouseEvent.mousePosition\">\n      <summary>\n        <para>The mouse position in the panel coordinate system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IMouseEvent.shiftKey\">\n      <summary>\n        <para>Return true if the Shift key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.INotifyValueChanged_1\">\n      <summary>\n        <para>Interface for controls that hold a value and can notify when it is changed by user input.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.INotifyValueChanged_1.value\">\n      <summary>\n        <para>The Value held by the control.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.INotifyValueChanged_1.OnValueChanged(UnityEngine.Experimental.UIElements.EventCallback`1&lt;UnityEngine.Experimental.UIElements.ChangeEvent`1&lt;T&gt;&gt;)\">\n      <summary>\n        <para>Registers this callback to receive ChangeEvent&lt;T&gt; when value was changed by user input.</para>\n      </summary>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.INotifyValueChanged_1.SetValueAndNotify(T)\">\n      <summary>\n        <para>Set the value and, if different, notifies registers callbacks with a ChangeEvent&lt;T&gt;</para>\n      </summary>\n      <param name=\"newValue\">The new value to be set.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.InputEvent\">\n      <summary>\n        <para>Sends an event when text from a TextField changes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.InputEvent.newData\">\n      <summary>\n        <para>The new text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.InputEvent.previousData\">\n      <summary>\n        <para>The text before the change occured.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.InputEvent.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.InputEvent.GetPooled(System.String,System.String)\">\n      <summary>\n        <para>Gets an event from the event pool and initializes it with the given values. Use this function instead of creating new events. Events obtained from this method should be released back to the pool using ReleaseEvent().</para>\n      </summary>\n      <param name=\"newData\">The new text.</param>\n      <param name=\"previousData\">The text before the change occured.</param>\n      <returns>\n        <para>An event.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.InputEvent.Init\">\n      <summary>\n        <para>Sets the event to its initial state.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IPanel\">\n      <summary>\n        <para>Interface for classes implementing UI panels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IPanel.focusController\">\n      <summary>\n        <para>Return the focus controller for this panel.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IScheduledItem\">\n      <summary>\n        <para>A reference to a scheduled action.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IScheduler\">\n      <summary>\n        <para>A scheduler allows you to register actions to be executed at a later point.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IScheduler.Schedule(UnityEngine.Experimental.UIElements.IScheduledItem)\">\n      <summary>\n        <para>Add this item to the list of scheduled tasks.</para>\n      </summary>\n      <param name=\"item\">The item to register.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IScheduler.ScheduleForDuration(System.Action`1&lt;UnityEngine.Experimental.UIElements.TimerState&gt;,System.Int64,System.Int64,System.Int64)\">\n      <summary>\n        <para>Schedule this action to be executed later. The item will be automatically unscheduled after it has ran for the amount of time specified with the durationMs parameter.</para>\n      </summary>\n      <param name=\"timerUpdateEvent\">Action to be executed.</param>\n      <param name=\"delayMs\">The minimum delay in milliseconds before executing the action.</param>\n      <param name=\"intervalMs\">The minimum interval in milliseconds between each execution.</param>\n      <param name=\"durationMs\">The total duration in milliseconds where this item will be active.</param>\n      <returns>\n        <para>Internal reference to the scheduled action.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IScheduler.ScheduleOnce(System.Action`1&lt;UnityEngine.Experimental.UIElements.TimerState&gt;,System.Int64)\">\n      <summary>\n        <para>Schedule this action to be executed later. After the execution, the item will be automatically unscheduled.</para>\n      </summary>\n      <param name=\"timerUpdateEvent\">Action to be executed.</param>\n      <param name=\"delayMs\">The minimum delay in milliseconds before executing the action.</param>\n      <returns>\n        <para>Internal reference to the scheduled action.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IScheduler.ScheduleUntil(System.Action`1&lt;UnityEngine.Experimental.UIElements.TimerState&gt;,System.Int64,System.Int64,System.Func`1&lt;System.Boolean&gt;)\">\n      <summary>\n        <para>Schedule this action to be executed later. Item will be unscheduled when condition is met.</para>\n      </summary>\n      <param name=\"timerUpdateEvent\">Action to be executed.</param>\n      <param name=\"delayMs\">The minimum delay in milliseconds before executing the action.</param>\n      <param name=\"intervalMs\">The minimum interval in milliseconds bettwen each execution.</param>\n      <param name=\"stopCondition\">When condition returns true, the item will be unscheduled.</param>\n      <returns>\n        <para>Internal reference to the scheduled action.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IScheduler.Unschedule(UnityEngine.Experimental.UIElements.IScheduledItem)\">\n      <summary>\n        <para>Manually unschedules a previously scheduled action.</para>\n      </summary>\n      <param name=\"item\">The item to be removed from this scheduler.</param>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IStyle\">\n      <summary>\n        <para>This interface provides access to a VisualElement style data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.alignContent\">\n      <summary>\n        <para>Alignment of the whole area of children on the cross axis if they span over multiple lines in this container.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.alignItems\">\n      <summary>\n        <para>Alignment of children on the cross axis of this container.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.alignSelf\">\n      <summary>\n        <para>Similar to align-items, but only for this specific element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.backgroundColor\">\n      <summary>\n        <para>Background color to paint in the element's box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.backgroundImage\">\n      <summary>\n        <para>Background image to paint in the element's box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.backgroundSize\">\n      <summary>\n        <para>Background image scaling in the element's box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.borderBottom\">\n      <summary>\n        <para>Space reserved for the bottom edge of the border during the layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.borderBottomLeftRadius\">\n      <summary>\n        <para>This is the radius of the bottom-left corner when a rounded rectangle is drawn in the element's box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.borderBottomRightRadius\">\n      <summary>\n        <para>This is the radius of the bottom-right corner when a rounded rectangle is drawn in the element's box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.borderBottomWidth\">\n      <summary>\n        <para>Space reserved for the bottom edge of the border during the layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.borderColor\">\n      <summary>\n        <para>Color of the border to paint inside the element's box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.borderLeft\">\n      <summary>\n        <para>Space reserved for the left edge of the border during the layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.borderLeftWidth\">\n      <summary>\n        <para>Space reserved for the left edge of the border during the layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.borderRadius\">\n      <summary>\n        <para>This is the radius of every corner when a rounded rectangle is drawn in the element's box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.borderRight\">\n      <summary>\n        <para>Space reserved for the right edge of the border during the layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.borderRightWidth\">\n      <summary>\n        <para>Space reserved for the right edge of the border during the layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.borderTop\">\n      <summary>\n        <para>Space reserved for the top edge of the border during the layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.borderTopLeftRadius\">\n      <summary>\n        <para>This is the radius of the top-left corner when a rounded rectangle is drawn in the element's box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.borderTopRightRadius\">\n      <summary>\n        <para>This is the radius of the top-right corner when a rounded rectangle is drawn in the element's box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.borderTopWidth\">\n      <summary>\n        <para>Space reserved for the top edge of the border during the layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.cursor\">\n      <summary>\n        <para>Mouse cursor to display when the mouse pointer is over an element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.flex\">\n      <summary>\n        <para>Ration of this element in its parent during the layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.flexBasis\">\n      <summary>\n        <para>Initial main size of a flex item, on the main flex axis. The final layout mught be smaller or larger, according to the flex shrinking and growing determined by the flex property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.flexDirection\">\n      <summary>\n        <para>Direction of the main axis to layout children in a container.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.flexGrow\">\n      <summary>\n        <para>Specifies how much the item will grow relative to the rest of the flexible items inside the same container.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.flexShrink\">\n      <summary>\n        <para>Specifies how the item will shrink relative to the rest of the flexible items inside the same container.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.flexWrap\">\n      <summary>\n        <para>Placement of children over multiple lines if not enough space is available in this container.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.font\">\n      <summary>\n        <para>Font to draw the element's text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.fontSize\">\n      <summary>\n        <para>Font size to draw the element's text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.fontStyle\">\n      <summary>\n        <para>Font style to draw the element's text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.height\">\n      <summary>\n        <para>Fixed height of an element for the layout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.justifyContent\">\n      <summary>\n        <para>Justification of children on the main axis of this container.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.marginBottom\">\n      <summary>\n        <para>Space reserved for the bottom edge of the margin during the layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.marginLeft\">\n      <summary>\n        <para>Space reserved for the left edge of the margin during the layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.marginRight\">\n      <summary>\n        <para>Space reserved for the right edge of the margin during the layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.marginTop\">\n      <summary>\n        <para>Space reserved for the top edge of the margin during the layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.maxHeight\">\n      <summary>\n        <para>Maximum height for an element, when it is flexible or measures its own size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.maxWidth\">\n      <summary>\n        <para>Maximum width for an element, when it is flexible or measures its own size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.minHeight\">\n      <summary>\n        <para>Minimum height for an element, when it is flexible or measures its own size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.minWidth\">\n      <summary>\n        <para>Minimum height for an element, when it is flexible or measures its own size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.paddingBottom\">\n      <summary>\n        <para>Space reserved for the bottom edge of the padding during the layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.paddingLeft\">\n      <summary>\n        <para>Space reserved for the left edge of the padding during the layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.paddingRight\">\n      <summary>\n        <para>Space reserved for the right edge of the padding during the layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.paddingTop\">\n      <summary>\n        <para>Space reserved for the top edge of the padding during the layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.positionBottom\">\n      <summary>\n        <para>Bottom distance from the element's box during layout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.positionLeft\">\n      <summary>\n        <para>Left distance from the element's box during layout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.positionRight\">\n      <summary>\n        <para>Right distance from the element's box during layout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.positionTop\">\n      <summary>\n        <para>Top distance from the element's box during layout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.positionType\">\n      <summary>\n        <para>Element's positioning in its parent container.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.sliceBottom\">\n      <summary>\n        <para>Size of the 9-slice's bottom edge when painting an element's background image.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.sliceLeft\">\n      <summary>\n        <para>Size of the 9-slice's left edge when painting an element's background image.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.sliceRight\">\n      <summary>\n        <para>Size of the 9-slice's right edge when painting an element's background image.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.sliceTop\">\n      <summary>\n        <para>Size of the 9-slice's top edge when painting an element's background image.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.textAlignment\">\n      <summary>\n        <para>Text alignment in the element's box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.textClipping\">\n      <summary>\n        <para>Clipping if the text does not fit in the element's box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.textColor\">\n      <summary>\n        <para>Color to use when drawing the text of an element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.visibility\">\n      <summary>\n        <para>Specifies whether or not an element is visible.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.width\">\n      <summary>\n        <para>Fixed width of an element for the layout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IStyle.wordWrap\">\n      <summary>\n        <para>Word wrapping over multiple lines if not enough space is available to draw the text of an element.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.ITransform\">\n      <summary>\n        <para>This interface provides access to a VisualElement transform data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ITransform.matrix\">\n      <summary>\n        <para>Transformation matrix calculated from the position, rotation and scale of the transform (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ITransform.position\">\n      <summary>\n        <para>The position of the VisualElement's transform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ITransform.rotation\">\n      <summary>\n        <para>The rotation of the VisualElement's transform stored as a Quaternion.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ITransform.scale\">\n      <summary>\n        <para>The scale of the VisualElement's transform.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IUIElementDataWatch\">\n      <summary>\n        <para>Interface allowing access to this elements datawatch.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IUIElementDataWatch.RegisterWatch(UnityEngine.Object,System.Action`1&lt;UnityEngine.Object&gt;)\">\n      <summary>\n        <para>Starts watching an object. When watched, all changes on an object will trigger the callback to be invoked.</para>\n      </summary>\n      <param name=\"toWatch\">The object to watch.</param>\n      <param name=\"watchNotification\">Callback.</param>\n      <returns>\n        <para>A reference to this datawatch request. Disposing it will ensure any native resources will also be released.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IUIElementDataWatch.UnregisterWatch(UnityEngine.Experimental.UIElements.IUIElementDataWatchRequest)\">\n      <summary>\n        <para>Unregisters a previously watched request.</para>\n      </summary>\n      <param name=\"requested\">The registered request.</param>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IUIElementDataWatchRequest\">\n      <summary>\n        <para>An internal reference to a data watch request.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IUxmlAttributes\">\n      <summary>\n        <para>This type allows UXML attribute value retrieval during the VisualElement instantiation. An instance will be provided to the factory method - see UXMLFactoryAttribute.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IUxmlAttributes.GetPropertyBool(System.String,System.Boolean)\">\n      <summary>\n        <para>Return the value of an attribute as a bool, or the defaultValue if the property is not found.</para>\n      </summary>\n      <param name=\"propertyName\">Attribute name.</param>\n      <param name=\"defaultValue\">Default value if the property is not found.</param>\n      <returns>\n        <para>The attribute value or the default value if not found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IUxmlAttributes.GetPropertyColor(System.String,UnityEngine.Color)\">\n      <summary>\n        <para>Return the value of an attribute as a Color, or the defaultValue if the property is not found.</para>\n      </summary>\n      <param name=\"propertyName\">Attribute name.</param>\n      <param name=\"defaultValue\">Default value if the property is not found.</param>\n      <returns>\n        <para>The attribute value or the default value if not found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IUxmlAttributes.GetPropertyDouble(System.String,System.Double)\">\n      <summary>\n        <para>Return the value of an attribute as a double, or the defaultValue if the property is not found.</para>\n      </summary>\n      <param name=\"defaultValue\">Default value if the property is not found.</param>\n      <param name=\"propertyName\">AttributeName.</param>\n      <returns>\n        <para>The attribute value or the default value if not found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IUxmlAttributes.GetPropertyEnum(System.String,T)\">\n      <summary>\n        <para>Return the value of an attribute as a T, or the defaultValue if the property is not found.</para>\n      </summary>\n      <param name=\"propertyName\">Attribute name.</param>\n      <param name=\"defaultValue\">Default value if the property is not found.</param>\n      <returns>\n        <para>The attribute value or the default value if not found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IUxmlAttributes.GetPropertyFloat(System.String,System.Single)\">\n      <summary>\n        <para>Return the value of an attribute as a float, or the defaultValue if the property is not found.</para>\n      </summary>\n      <param name=\"propertyName\">Attribute name.</param>\n      <param name=\"defaultValue\">Default value if the property is not found.</param>\n      <returns>\n        <para>The attribute value or the default value if not found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IUxmlAttributes.GetPropertyInt(System.String,System.Int32)\">\n      <summary>\n        <para>Return the value of an attribute as an int, or the defaultValue if the property is not found.</para>\n      </summary>\n      <param name=\"propertyName\">Attribute name.</param>\n      <param name=\"defaultValue\">Default value if the property is not found.</param>\n      <returns>\n        <para>The attribute value or the default value if not found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IUxmlAttributes.GetPropertyLong(System.String,System.Int64)\">\n      <summary>\n        <para>Return the value of an attribute as a long, or the defaultValue if the property is not found.</para>\n      </summary>\n      <param name=\"propertyName\">Attribute name.</param>\n      <param name=\"defaultValue\">Default value if the property is not found.</param>\n      <returns>\n        <para>The attribute value or the default value if not found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IUxmlAttributes.GetPropertyString(System.String,System.String)\">\n      <summary>\n        <para>Return the value of an attribute as a string, or the defaultValue if the property is not found.</para>\n      </summary>\n      <param name=\"propertyName\">Attribute name.</param>\n      <param name=\"defaultValue\">Default value if the property is not found.</param>\n      <returns>\n        <para>The attribute value or the default value if not found.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IUxmlFactory\">\n      <summary>\n        <para>Interface for UXML factories. While it is not strictly required, concrete factories should derive from the generic class UxmlFactory.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IUxmlFactory.canHaveAnyAttribute\">\n      <summary>\n        <para>Must return true if the UXML element attributes are not restricted to the values enumerated by uxmlAttributesDescription.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IUxmlFactory.substituteForTypeName\">\n      <summary>\n        <para>The type of element for which this element type can substitute for.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IUxmlFactory.substituteForTypeNamespace\">\n      <summary>\n        <para>The UXML namespace for the type returned by substituteForTypeName.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IUxmlFactory.substituteForTypeQualifiedName\">\n      <summary>\n        <para>The fully qualified XML name for the type returned by substituteForTypeName.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IUxmlFactory.uxmlAttributesDescription\">\n      <summary>\n        <para>Describes the UXML attributes expected by the element. The attributes enumerated here will appear in the UXML schema.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IUxmlFactory.uxmlChildElementsDescription\">\n      <summary>\n        <para>Describes the types of element that can appear as children of this element in a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IUxmlFactory.uxmlName\">\n      <summary>\n        <para>The name of the UXML element read by the factory.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IUxmlFactory.uxmlNamespace\">\n      <summary>\n        <para>The namespace of the UXML element read by the factory.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IUxmlFactory.uxmlQualifiedName\">\n      <summary>\n        <para>The fully qualified name of the UXML element read by the factory.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IUxmlFactory.AcceptsAttributeBag(UnityEngine.Experimental.UIElements.IUxmlAttributes)\">\n      <summary>\n        <para>Returns true if the factory accepts the content of the attribute bag.</para>\n      </summary>\n      <param name=\"bag\">The attribute bag.</param>\n      <returns>\n        <para>True if the factory accepts the content of the attribute bag. False otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IUxmlFactory.Create(UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Instanciate and initialize an object of type T0.</para>\n      </summary>\n      <param name=\"bag\">A bag of name-value pairs, one for each attribute of the UXML element. This can be used to initialize the properties of the created object.</param>\n      <param name=\"cc\">When the element is created as part of a template instance inserted in another document, this contains information about the insertion point.</param>\n      <returns>\n        <para>The created object.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IVisualElementScheduledItem\">\n      <summary>\n        <para>Represents a scheduled task created with a VisualElement's schedule interface.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IVisualElementScheduledItem.element\">\n      <summary>\n        <para>Returns the VisualElement this object is associated with.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.IVisualElementScheduledItem.isActive\">\n      <summary>\n        <para>Will be true when this item is scheduled. Note that an item's callback will only be executed when it's VisualElement is attached to a panel.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IVisualElementScheduledItem.Every(System.Int64)\">\n      <summary>\n        <para>Repeats this action after a specified time.</para>\n      </summary>\n      <param name=\"intervalMs\">Minimum amount of time in milliseconds between each action execution.</param>\n      <returns>\n        <para>This ScheduledItem.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IVisualElementScheduledItem.ExecuteLater(System.Int64)\">\n      <summary>\n        <para>Cancels any previously scheduled execution of this item and re-schedules the item.</para>\n      </summary>\n      <param name=\"delayMs\">Minimum time in milliseconds before this item will be executed.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IVisualElementScheduledItem.ForDuration(System.Int64)\">\n      <summary>\n        <para>After specified duration, the item will be automatically unscheduled.</para>\n      </summary>\n      <param name=\"durationMs\">The total duration in milliseconds where this item will be active.</param>\n      <returns>\n        <para>This ScheduledItem.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IVisualElementScheduledItem.Pause\">\n      <summary>\n        <para>Removes this item from its VisualElement's scheduler.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IVisualElementScheduledItem.Resume\">\n      <summary>\n        <para>If not already active, will schedule this item on its VisualElement's scheduler.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IVisualElementScheduledItem.StartingIn(System.Int64)\">\n      <summary>\n        <para>Adds a delay to the first invokation.</para>\n      </summary>\n      <param name=\"delayMs\">The minimum number of milliseconds after activation where this item's action will be executed.</param>\n      <returns>\n        <para>This ScheduledItem.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IVisualElementScheduledItem.Until(System.Func`1&lt;System.Boolean&gt;)\">\n      <summary>\n        <para>Item will be unscheduled automatically when specified condition is met.</para>\n      </summary>\n      <param name=\"stopCondition\">When condition returns true, the item will be unscheduled.</param>\n      <returns>\n        <para>This ScheduledItem.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.IVisualElementScheduler\">\n      <summary>\n        <para>A scheduler allows you to register actions to be executed at a later point.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IVisualElementScheduler.Execute(System.Action`1&lt;UnityEngine.Experimental.UIElements.TimerState&gt;)\">\n      <summary>\n        <para>Schedule this action to be executed later.</para>\n      </summary>\n      <param name=\"timerUpdateEvent\">The action to be executed.</param>\n      <param name=\"updateEvent\">The action to be executed.</param>\n      <returns>\n        <para>Reference to the scheduled action.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.IVisualElementScheduler.Execute(System.Action)\">\n      <summary>\n        <para>Schedule this action to be executed later.</para>\n      </summary>\n      <param name=\"timerUpdateEvent\">The action to be executed.</param>\n      <param name=\"updateEvent\">The action to be executed.</param>\n      <returns>\n        <para>Reference to the scheduled action.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.KeyboardEventBase`1\">\n      <summary>\n        <para>Base class for keyboard events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.KeyboardEventBase_1.altKey\">\n      <summary>\n        <para>Return true if the Alt key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.KeyboardEventBase_1.character\">\n      <summary>\n        <para>The character.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.KeyboardEventBase_1.commandKey\">\n      <summary>\n        <para>Return true if the Windows/Command key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.KeyboardEventBase_1.ctrlKey\">\n      <summary>\n        <para>Return true if the Control key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.KeyboardEventBase_1.keyCode\">\n      <summary>\n        <para>The key code.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.KeyboardEventBase_1.modifiers\">\n      <summary>\n        <para>Flag set holding the pressed modifier keys (Alt, Control, Shift, Windows/Command).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.KeyboardEventBase_1.shiftKey\">\n      <summary>\n        <para>Return true if the Shift key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.KeyboardEventBase_1.GetPooled(System.Char,UnityEngine.KeyCode,UnityEngine.EventModifiers)\">\n      <summary>\n        <para>Get an event from the event pool and initialize it with the given values. Use this function instead of creating new events. Events obtained from this method should be released back to the pool using ReleaseEvent().</para>\n      </summary>\n      <param name=\"c\">The character for this event.</param>\n      <param name=\"keyCode\">The keyCode for this event.</param>\n      <param name=\"modifiers\">Event modifier keys that are active for this event.</param>\n      <param name=\"systemEvent\">A keyboard IMGUI event.</param>\n      <returns>\n        <para>A keyboard event.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.KeyboardEventBase_1.GetPooled(UnityEngine.Event)\">\n      <summary>\n        <para>Get an event from the event pool and initialize it with the given values. Use this function instead of creating new events. Events obtained from this method should be released back to the pool using ReleaseEvent().</para>\n      </summary>\n      <param name=\"c\">The character for this event.</param>\n      <param name=\"keyCode\">The keyCode for this event.</param>\n      <param name=\"modifiers\">Event modifier keys that are active for this event.</param>\n      <param name=\"systemEvent\">A keyboard IMGUI event.</param>\n      <returns>\n        <para>A keyboard event.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.KeyboardEventBase_1.Init\">\n      <summary>\n        <para>Reset the event members to their initial value.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.KeyDownEvent\">\n      <summary>\n        <para>Event sent when a key is pressed on the keyboard. Capturable, bubbles, cancellable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.KeyDownEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid newing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.KeyUpEvent\">\n      <summary>\n        <para>Event sent when a key is released on the keyboard. Capturable, bubbles, cancellable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.KeyUpEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid newing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.Label.LabelFactory\">\n      <summary>\n        <para>Instantiates a Label using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Label.LabelFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.Label.LabelUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the Label.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Label.LabelUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ListView\">\n      <summary>\n        <para>A vertically scrollable area that only creates visual elements for visible items while allowing the binding of many more items. As the user scrolls, visual elements are recycled and re-bound to new data items.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ListView.bindItem\">\n      <summary>\n        <para>Callback for binding a data item to the visual element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ListView.itemHeight\">\n      <summary>\n        <para>ListView requires all visual elements to have the same height so that it can calculate a sensible scroller size. This property must be set for the list view to function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ListView.itemsSource\">\n      <summary>\n        <para>The items data source. This property must be set for the list view to function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ListView.makeItem\">\n      <summary>\n        <para>Callback for constructing the VisualElement that will serve as the template for each recycled and re-bound element in the list. This property must be set for the list view to function.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.ListView.onItemChosen(System.Action`1&lt;System.Object&gt;)\">\n      <summary>\n        <para>Callback for when an item is chosen (double-click). This is different from just a selection.</para>\n      </summary>\n      <param name=\"value\">The chosen item.</param>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.ListView.onSelectionChanged(System.Action`1&lt;System.Collections.Generic.List`1&lt;System.Object&gt;&gt;)\">\n      <summary>\n        <para>Callback for a selection change.</para>\n      </summary>\n      <param name=\"value\">List of selected items.</param>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ListView.selectedIndex\">\n      <summary>\n        <para>Currently selected item index in the items source. If multiple items are selected, this will return the first selected item's index.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ListView.selectedItem\">\n      <summary>\n        <para>The currently selected item from the items source. If multiple items are selected, this will return the first selected item.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ListView.selectionType\">\n      <summary>\n        <para>Controls the selection state, whether: selections are disabled, there is only one selectable item, or if there are multiple selectable items.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ListView.ListViewFactory\">\n      <summary>\n        <para>Instantiates a ListView using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ListView.ListViewFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ListView.ListViewUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the ListView.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ListView.ListViewUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for ListView properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ListView.ListViewUxmlTraits.uxmlChildElementsDescription\">\n      <summary>\n        <para>Returns an empty enumerable, as list views generally do not have children.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ListView.ListViewUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ListView.ListViewUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize ListView properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ListView.Refresh\">\n      <summary>\n        <para>Clear, recreate all visible visual elements, and rebind all items. This should be called whenever the items source changes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ListView.ScrollTo(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Scroll to a specific visual element.</para>\n      </summary>\n      <param name=\"visualElement\">Element to scroll to.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ListView.ScrollToItem(System.Int32)\">\n      <summary>\n        <para>Scroll so that a specific item index from the items source is visible.</para>\n      </summary>\n      <param name=\"index\">Item index to scroll to.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ManipulatorActivationFilter\">\n      <summary>\n        <para>Used by manipulators to match events against their requirements.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.ManipulatorActivationFilter.button\">\n      <summary>\n        <para>The button that activates the manipulation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.ManipulatorActivationFilter.clickCount\">\n      <summary>\n        <para>Number of mouse clicks required to activate the manipulator.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.ManipulatorActivationFilter.modifiers\">\n      <summary>\n        <para>Any modifier keys (ie. ctrl, alt, ...) that are needed to activate the manipulation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ManipulatorActivationFilter.Matches(UnityEngine.Experimental.UIElements.IMouseEvent)\">\n      <summary>\n        <para>Returns true if the current mouse event satisfies the activation requirements.</para>\n      </summary>\n      <param name=\"e\">The mouse event.</param>\n      <returns>\n        <para>True if the event matches the requirements.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.MouseCaptureController\">\n      <summary>\n        <para>Class that manages capturing mouse events.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseCaptureController.HasMouseCapture(UnityEngine.Experimental.UIElements.IEventHandler)\">\n      <summary>\n        <para>Checks if the event handler is capturing the mouse.</para>\n      </summary>\n      <param name=\"handler\">Event handler to check.</param>\n      <returns>\n        <para>True if the handler captures the mouse.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseCaptureController.IsMouseCaptureTaken\">\n      <summary>\n        <para>Checks if there is a handler assigned to capturing the mouse.</para>\n      </summary>\n      <returns>\n        <para>Returns true if a handler is assigned to capture the mouse, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseCaptureController.ReleaseMouseCapture(UnityEngine.Experimental.UIElements.IEventHandler)\">\n      <summary>\n        <para>Stops an event handler from capturing the mouse.</para>\n      </summary>\n      <param name=\"handler\">The event handler to stop capturing the mouse. If this handler is not assigned to capturing the mouse, nothing happens.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseCaptureController.ReleaseMouseCapture\">\n      <summary>\n        <para>Stops an event handler from capturing the mouse.</para>\n      </summary>\n      <param name=\"handler\">The event handler to stop capturing the mouse. If this handler is not assigned to capturing the mouse, nothing happens.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseCaptureController.TakeMouseCapture(UnityEngine.Experimental.UIElements.IEventHandler)\">\n      <summary>\n        <para>Assigns an event handler to capture the mouse.</para>\n      </summary>\n      <param name=\"handler\">The event handler to capture the mouse.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.MouseCaptureEvent\">\n      <summary>\n        <para>Event sent after a handler starts capturing the mouse.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseCaptureEvent.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.MouseCaptureEventBase`1\">\n      <summary>\n        <para>Event sent when the handler capturing the mouse changes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseCaptureEventBase_1.GetPooled(UnityEngine.Experimental.UIElements.IEventHandler)\">\n      <summary>\n        <para>Retrieves an event from the event pool. Use this method to retrieve a mouse event and initialize the event, instead of creating a new mouse event.</para>\n      </summary>\n      <param name=\"target\">The handler taking or releasing the mouse capture.</param>\n      <returns>\n        <para>A IMouseCaptureEvent.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseCaptureEventBase_1.Init\">\n      <summary>\n        <para>Reset the event members to their initial value.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.MouseCaptureOutEvent\">\n      <summary>\n        <para>Event sent before a handler stops capturing the mouse.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseCaptureOutEvent.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.MouseDownEvent\">\n      <summary>\n        <para>Mouse down event.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseDownEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid newing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.MouseEnterEvent\">\n      <summary>\n        <para>Event sent when the mouse pointer enters an element or one of its descendent elements. The event is cancellable, non-capturable, and does not bubble.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseEnterEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid newing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseEnterEvent.Init\">\n      <summary>\n        <para>Resets the event members to their initial value.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.MouseEnterWindowEvent\">\n      <summary>\n        <para>Event sent when the mouse pointer enters a window. Cancellable, non-capturable, does not bubbles.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseEnterWindowEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid newing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseEnterWindowEvent.Init\">\n      <summary>\n        <para>Resets the event members to their initial value.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.MouseEventBase`1\">\n      <summary>\n        <para>The base class for mouse events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.MouseEventBase_1.altKey\">\n      <summary>\n        <para>Return true if the Alt key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.MouseEventBase_1.button\">\n      <summary>\n        <para>Integer representing the pressed mouse button: 0 is left, 1 is right, 2 is center.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.MouseEventBase_1.clickCount\">\n      <summary>\n        <para>Number of clicks.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.MouseEventBase_1.commandKey\">\n      <summary>\n        <para>Return true if the Windows/Command key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.MouseEventBase_1.ctrlKey\">\n      <summary>\n        <para>Return true if the Control key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.MouseEventBase_1.currentTarget\">\n      <summary>\n        <para>The current target of the event. The current target is the element in the propagation path for which event handlers are currently being executed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.MouseEventBase_1.localMousePosition\">\n      <summary>\n        <para>The mouse position in the current target coordinate system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.MouseEventBase_1.modifiers\">\n      <summary>\n        <para>Flag set holding the pressed modifier keys (Alt, Control, Shift, Windows/Command).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.MouseEventBase_1.mouseDelta\">\n      <summary>\n        <para>Mouse position difference between the last mouse event and this one.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.MouseEventBase_1.mousePosition\">\n      <summary>\n        <para>The mouse position in the screen coordinate system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.MouseEventBase_1.shiftKey\">\n      <summary>\n        <para>Return true if the Shift key is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseEventBase_1.GetPooled(UnityEngine.Event)\">\n      <summary>\n        <para>Get an event from the event pool and initialize it with the given values. Use this function instead of creating new events. Events obtained from this method should be released back to the pool using ReleaseEvent().</para>\n      </summary>\n      <param name=\"systemEvent\">A mouse IMGUI event.</param>\n      <returns>\n        <para>A mouse event.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseEventBase_1.Init\">\n      <summary>\n        <para>Reset the event members to their initial value.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.MouseLeaveEvent\">\n      <summary>\n        <para>Event sent when the mouse pointer exits an element and all its descendent elements. The event is cancellable, non-capturable, and does not bubble.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseLeaveEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid newing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseLeaveEvent.Init\">\n      <summary>\n        <para>Resets the event members to their initial value.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.MouseLeaveWindowEvent\">\n      <summary>\n        <para>Event sent when the mouse pointer exits a window. Cancellable, non-capturable, does not bubbles.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseLeaveWindowEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid newing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseLeaveWindowEvent.Init\">\n      <summary>\n        <para>Reset the event members to their initial value.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.MouseMoveEvent\">\n      <summary>\n        <para>Mouse move event.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseMoveEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid newing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.MouseOutEvent\">\n      <summary>\n        <para>Event sent when the mouse pointer exits an element. Capturable, bubbles, cancellable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseOutEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid newing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.MouseOverEvent\">\n      <summary>\n        <para>Event sent when the mouse pointer enters an element. Capturable, bubbles, cancellable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseOverEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid newing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.MouseUpEvent\">\n      <summary>\n        <para>Mouse up event.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.MouseUpEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid newing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.PopupWindow\">\n      <summary>\n        <para>Styled visual element that matches the EditorGUILayout.Popup IMGUI element.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.PopupWindow.PopupWindowFactory\">\n      <summary>\n        <para>Instantiates a PopupWindow using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.PopupWindow.PopupWindowFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.PopupWindow.PopupWindowUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the PopupWindow.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.PopupWindow.PopupWindowUxmlTraits.uxmlChildElementsDescription\">\n      <summary>\n        <para>Returns an empty enumerable, as popup windows generally do not have children.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.PopupWindow.PopupWindowUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.PropagationPhase\">\n      <summary>\n        <para>The propagation phases of an event.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.PropagationPhase.AtTarget\">\n      <summary>\n        <para>The event is being sent to the event target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.PropagationPhase.BubbleUp\">\n      <summary>\n        <para>The event is being sent to the event target parent element up to the root element.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.PropagationPhase.Capture\">\n      <summary>\n        <para>The event is being sent to the root element down to the event target parent element.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.PropagationPhase.DefaultAction\">\n      <summary>\n        <para>The event is being sent to the target element for it to execute its default actions for this event. Event handlers do not get the events in this phase. Instead, ExecuteDefaultAction is called on the target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.PropagationPhase.None\">\n      <summary>\n        <para>The event is not being propagated.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.RepeatButton\">\n      <summary>\n        <para>A button that executes an action repeatedly while it is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.RepeatButton.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"clickEvent\">The action to execute when the button is pressed.</param>\n      <param name=\"delay\">The initial delay before the action is executed for the first time.</param>\n      <param name=\"interval\">The interval between each execution of the action.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.RepeatButton.#ctor(System.Action,System.Int64,System.Int64)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"clickEvent\">The action to execute when the button is pressed.</param>\n      <param name=\"delay\">The initial delay before the action is executed for the first time.</param>\n      <param name=\"interval\">The interval between each execution of the action.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.RepeatButton.RepeatButtonFactory\">\n      <summary>\n        <para>Instantiates a RepeatButton using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.RepeatButton.RepeatButtonFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.RepeatButton.RepeatButtonUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the RepeatButton.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.RepeatButton.RepeatButtonUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for RepeatButton properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.RepeatButton.RepeatButtonUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.RepeatButton.RepeatButtonUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize RepeatButton properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.RepeatButton.SetAction(System.Action,System.Int64,System.Int64)\">\n      <summary>\n        <para>Set the action that should be executed when the button is pressed.</para>\n      </summary>\n      <param name=\"clickEvent\">The action to execute.</param>\n      <param name=\"delay\">The initial delay before the action is executed for the first time.</param>\n      <param name=\"interval\">The interval between each execution of the action.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.Scroller.ScrollerFactory\">\n      <summary>\n        <para>Instantiates a Scroller using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Scroller.ScrollerFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.Scroller.ScrollerUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the Scroller.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.Scroller.ScrollerUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for Scroller properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.Scroller.ScrollerUxmlTraits.uxmlChildElementsDescription\">\n      <summary>\n        <para>Returns an empty enumerable, as scrollers do not have children.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Scroller.ScrollerUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Scroller.ScrollerUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize Scroller properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ScrollerButton.ScrollerButtonFactory\">\n      <summary>\n        <para>Instantiates a ScrollerButton using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ScrollerButton.ScrollerButtonFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ScrollerButton.ScrollerButtonUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the ScrollerButton.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ScrollerButton.ScrollerButtonUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for ScrollerButton properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ScrollerButton.ScrollerButtonUxmlTraits.uxmlChildElementsDescription\">\n      <summary>\n        <para>Returns an empty enumerable, as buttons generally do not have children.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ScrollerButton.ScrollerButtonUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ScrollerButton.ScrollerButtonUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize ScrollerButton properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ScrollView.stretchContentWidth\">\n      <summary>\n        <para>Indicates whether the content of ScrollView should fill the width of its viewport. The default value is false.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ScrollView.ScrollTo(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Scroll to a specific child element.</para>\n      </summary>\n      <param name=\"child\">The child to scroll to.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ScrollView.ScrollViewFactory\">\n      <summary>\n        <para>Instantiates a ScrollView using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ScrollView.ScrollViewFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ScrollView.ScrollViewUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the ScrollView.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.ScrollView.ScrollViewUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for ScrollView properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ScrollView.ScrollViewUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ScrollView.ScrollViewUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize ScrollView properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.SelectionType\">\n      <summary>\n        <para>Controls how many items can be selected at once.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.SelectionType.Multiple\">\n      <summary>\n        <para>Multiple items are selectable at once.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.SelectionType.None\">\n      <summary>\n        <para>Selections are disabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.SelectionType.Single\">\n      <summary>\n        <para>Only one item is selectable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Slider.OnPersistentDataReady\">\n      <summary>\n        <para>Called when the persistent data is accessible and/or when the data or persistence key have changed (VisualElement is properly parented).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.Slider.SliderFactory\">\n      <summary>\n        <para>Instantiates a Slider using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Slider.SliderFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.Slider.SliderUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the Slider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.Slider.SliderUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for Slider properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.Slider.SliderUxmlTraits.uxmlChildElementsDescription\">\n      <summary>\n        <para>Returns an empty enumerable, as sliders generally do not have children.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Slider.SliderUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Slider.SliderUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize Slider properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.StyleEnums.Align\">\n      <summary>\n        <para>This enumeration contains values to control how an element is aligned in its parent during the layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.Align.Auto\">\n      <summary>\n        <para>Default value (currently FlexStart).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.Align.Center\">\n      <summary>\n        <para>Items are centered on the cross axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.Align.FlexEnd\">\n      <summary>\n        <para>Items are aligned at the end on the cross axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.Align.FlexStart\">\n      <summary>\n        <para>Items are aligned at the beginning on the cross axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.Align.Stretch\">\n      <summary>\n        <para>Stretches items on the cross axis.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.StyleEnums.FlexDirection\">\n      <summary>\n        <para>This enumeration defines values used to control in which direction a container will place its children during layout.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.FlexDirection.Column\">\n      <summary>\n        <para>Vertical layout.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.FlexDirection.ColumnReverse\">\n      <summary>\n        <para>Vertical layout in reverse order.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.FlexDirection.Row\">\n      <summary>\n        <para>Horizontal layout.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.FlexDirection.RowReverse\">\n      <summary>\n        <para>Horizontal layout in reverse order.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.StyleEnums.Justify\">\n      <summary>\n        <para>This enumeration contains values to control how children are justified during layout.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.Justify.Center\">\n      <summary>\n        <para>Items are centered.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.Justify.FlexEnd\">\n      <summary>\n        <para>Items are justified towards the end of the layout direction.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.Justify.FlexStart\">\n      <summary>\n        <para>Items are justified towards the beginning of the main axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.Justify.SpaceAround\">\n      <summary>\n        <para>Items are evenly distributed in the line  with extra space on each end of the line.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.Justify.SpaceBetween\">\n      <summary>\n        <para>Items are evenly distributed in the line; first item is at the beginning of the line, last item is at the end.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.StyleEnums.PositionType\">\n      <summary>\n        <para>This enumeration contains values to control how an element is positioned in its parent container.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.PositionType.Absolute\">\n      <summary>\n        <para>The element is positioned in relation to its parent box and does not contribute to the layout anymore.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.PositionType.Relative\">\n      <summary>\n        <para>The element is positioned in relation to its default box as calculated by layout.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.StyleEnums.Visibility\">\n      <summary>\n        <para>This enumeration contains values to specify whether or not an element is visible.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.Visibility.Hidden\">\n      <summary>\n        <para>The picking and rendering of this element is skipped. It still takes space in the layout.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.Visibility.Visible\">\n      <summary>\n        <para>The element is drawn normally (default).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.StyleEnums.Wrap\">\n      <summary>\n        <para>This enumeration contains values to control how elements are placed in a container if not enough space is available.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.Wrap.NoWrap\">\n      <summary>\n        <para>All elements are placed on the same line.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleEnums.Wrap.Wrap\">\n      <summary>\n        <para>Elements are placed over multiple lines.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.UIElements.StyleSheets.ICustomStyle\">\n      <summary>\n        <para>This interface exposes methods to read custom style properties applied from USS files to visual elements.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.StyleSheets.ICustomStyle.ApplyCustomProperty(System.String,UnityEngine.Experimental.UIElements.StyleSheets.StyleValue`1&lt;System.Single&gt;&amp;)\">\n      <summary>\n        <para>Read a style property value into the specified StyleValue&lt;T&gt;.</para>\n      </summary>\n      <param name=\"propertyName\">Name of the property in USS.</param>\n      <param name=\"target\">Target StyleValue&lt;T&gt; field or variable to write to.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.StyleSheets.ICustomStyle.ApplyCustomProperty(System.String,UnityEngine.Experimental.UIElements.StyleSheets.StyleValue`1&lt;System.Int32&gt;&amp;)\">\n      <summary>\n        <para>Read a style property value into the specified StyleValue&lt;T&gt;.</para>\n      </summary>\n      <param name=\"propertyName\">Name of the property in USS.</param>\n      <param name=\"target\">Target StyleValue&lt;T&gt; field or variable to write to.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.StyleSheets.ICustomStyle.ApplyCustomProperty(System.String,UnityEngine.Experimental.UIElements.StyleSheets.StyleValue`1&lt;System.Boolean&gt;&amp;)\">\n      <summary>\n        <para>Read a style property value into the specified StyleValue&lt;T&gt;.</para>\n      </summary>\n      <param name=\"propertyName\">Name of the property in USS.</param>\n      <param name=\"target\">Target StyleValue&lt;T&gt; field or variable to write to.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.StyleSheets.ICustomStyle.ApplyCustomProperty(System.String,UnityEngine.Experimental.UIElements.StyleSheets.StyleValue`1&lt;UnityEngine.Color&gt;&amp;)\">\n      <summary>\n        <para>Read a style property value into the specified StyleValue&lt;T&gt;.</para>\n      </summary>\n      <param name=\"propertyName\">Name of the property in USS.</param>\n      <param name=\"target\">Target StyleValue&lt;T&gt; field or variable to write to.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.StyleSheets.ICustomStyle.ApplyCustomProperty(System.String,UnityEngine.Experimental.UIElements.StyleSheets.StyleValue`1&lt;T&gt;&amp;)\">\n      <summary>\n        <para>Read a style property value into the specified StyleValue&lt;T&gt;.</para>\n      </summary>\n      <param name=\"propertyName\">Name of the property in USS.</param>\n      <param name=\"target\">Target StyleValue&lt;T&gt; field or variable to write to.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.StyleSheets.ICustomStyle.ApplyCustomProperty(System.String,UnityEngine.Experimental.UIElements.StyleSheets.StyleValue`1&lt;System.String&gt;&amp;)\">\n      <summary>\n        <para>Read a style property value into the specified StyleValue&lt;T&gt;.</para>\n      </summary>\n      <param name=\"propertyName\">Name of the property in USS.</param>\n      <param name=\"target\">Target StyleValue&lt;T&gt; field or variable to write to.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.StyleSheets.StyleValue`1\">\n      <summary>\n        <para>This generic structure encodes a value type that can come from USS or be specified programmatically.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.StyleSheets.StyleValue_1.nil\">\n      <summary>\n        <para>This represents the default value for a StyleValue&lt;T&gt; of the according generic type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.StyleSheets.StyleValue_1.value\">\n      <summary>\n        <para>The actual value of the StyleValue&lt;T&gt;.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.StyleSheets.StyleValue_1.Create(T)\">\n      <summary>\n        <para>Creates a StyleValue of the according generic type directly from a value.</para>\n      </summary>\n      <param name=\"value\">Value to be used as inline style.</param>\n      <returns>\n        <para>The result StyleValue&lt;T&gt;</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.StyleSheets.StyleValue_1.#ctor(T)\">\n      <summary>\n        <para>This constructor can be used to specified an alternate default value but it is recommended to use StyleValue&lt;T&gt;.nil.</para>\n      </summary>\n      <param name=\"value\">Default starting value.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.StyleSheets.StyleValue_1.GetSpecifiedValueOrDefault(T)\">\n      <summary>\n        <para>Utility function to be used when reading custom styles values and provide a default value in one step.</para>\n      </summary>\n      <param name=\"defaultValue\">Default value to be returned if no value is set.</param>\n      <returns>\n        <para>The value to be used for the custom style.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.TemplateContainer.TemplateContainerFactory\">\n      <summary>\n        <para>Instantiates and clones a TemplateContainer using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.TemplateContainer.TemplateContainerFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.TemplateContainer.TemplateContainerUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the TemplateContainer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.TemplateContainer.TemplateContainerUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for TemplateContainer properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.TemplateContainer.TemplateContainerUxmlTraits.uxmlChildElementsDescription\">\n      <summary>\n        <para>Returns an empty enumerable, as template instance do not have children.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.TemplateContainer.TemplateContainerUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.TemplateContainer.TemplateContainerUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize TemplateContainer properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.TextField\">\n      <summary>\n        <para>A textfield is a rectangular area where the user can edit a string.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.TextField.isPasswordField\">\n      <summary>\n        <para>Set this to true to mask the characters and false if otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.TextField.multiline\">\n      <summary>\n        <para>Set this to true to allow multiple lines in the textfield and false if otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.TextField.value\">\n      <summary>\n        <para>The string currently being exposed by the field.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.TextField.#ctor\">\n      <summary>\n        <para>Creates a new textfield.</para>\n      </summary>\n      <param name=\"maxLength\">The maximum number of characters this textfield can hold. If 0, there is no limit.</param>\n      <param name=\"multiline\">Set this to true to allow multiple lines in the textfield and false if otherwise.</param>\n      <param name=\"isPasswordField\">Set this to true to mask the characters and false if otherwise.</param>\n      <param name=\"maskChar\">The character used for masking in a password field.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.TextField.#ctor(System.Int32,System.Boolean,System.Boolean,System.Char)\">\n      <summary>\n        <para>Creates a new textfield.</para>\n      </summary>\n      <param name=\"maxLength\">The maximum number of characters this textfield can hold. If 0, there is no limit.</param>\n      <param name=\"multiline\">Set this to true to allow multiple lines in the textfield and false if otherwise.</param>\n      <param name=\"isPasswordField\">Set this to true to mask the characters and false if otherwise.</param>\n      <param name=\"maskChar\">The character used for masking in a password field.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.TextField.OnPersistentDataReady\">\n      <summary>\n        <para>Called when the persistent data is accessible and/or when the data or persistence key have changed (VisualElement is properly parented).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.TextField.TextFieldFactory\">\n      <summary>\n        <para>Instantiates a TextField using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.TextField.TextFieldFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.TextField.TextFieldUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the TextField.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.TextField.TextFieldUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for TextField properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.TextField.TextFieldUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.TextField.TextFieldUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize TextField properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.TextInputFieldBase`1\">\n      <summary>\n        <para>Abstract base class used for all text-based fields.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.TextInputFieldBase_1.cursorColor\">\n      <summary>\n        <para>Color of the cursor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.TextInputFieldBase_1.cursorIndex\">\n      <summary>\n        <para>The current cursor position index in the text input field.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.TextInputFieldBase_1.doubleClickSelectsWord\">\n      <summary>\n        <para>Controls whether double clicking selects the word under the mouse pointer or not.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.TextInputFieldBase_1.isDelayed\">\n      <summary>\n        <para>If set to true, the value property is not updated until either the user presses Enter or the text field loses focus.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.TextInputFieldBase_1.isPasswordField\">\n      <summary>\n        <para>Returns true if the field is used to edit a password.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.TextInputFieldBase_1.maskChar\">\n      <summary>\n        <para>The character used for masking in a password field.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.TextInputFieldBase_1.maxLength\">\n      <summary>\n        <para>Maximum number of characters for the field.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.TextInputFieldBase_1.selectionColor\">\n      <summary>\n        <para>Background color of selected text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.TextInputFieldBase_1.tripleClickSelectsLine\">\n      <summary>\n        <para>Controls whether triple clicking selects the entire line under the mouse pointer or not.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.TextInputFieldBase_1.BuildContextualMenu(UnityEngine.Experimental.UIElements.ContextualMenuPopulateEvent)\">\n      <summary>\n        <para>Add menu items to the text field contextual menu.</para>\n      </summary>\n      <param name=\"evt\">The event holding the menu to populate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.TextInputFieldBase_1.#ctor(System.Int32,System.Char)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"maxLength\">Maximum number of characters for the field.</param>\n      <param name=\"maskChar\">The character used for masking in a password field.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.TextInputFieldBase_1.SelectAll\">\n      <summary>\n        <para>Selects all the text.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.TextInputFieldBase`1.TextInputFieldBaseUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the TextInputFieldBase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.TextInputFieldBase_1.TextInputFieldBaseUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for TextInputFieldBase properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.TextInputFieldBase_1.TextInputFieldBaseUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize TextInputFieldBase properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.Toggle.text\">\n      <summary>\n        <para>Optional text after the toggle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.Toggle.value\">\n      <summary>\n        <para>Return whether the toggle is on or not.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Toggle.OnToggle(System.Action)\">\n      <summary>\n        <para>Sets the event callback for this toggle button.</para>\n      </summary>\n      <param name=\"clickEvent\">The action to be called when this Toggle is clicked.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.Toggle.ToggleFactory\">\n      <summary>\n        <para>Instantiates a Toggle using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Toggle.ToggleFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.Toggle.ToggleUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the Toggle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.Toggle.ToggleUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for Toggle properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Toggle.ToggleUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.Toggle.ToggleUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize Toggle properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UQuery\">\n      <summary>\n        <para>UQuery is a set of extension methods allowing you to select individual or collection of visualElements inside a complex hierarchy.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder`1\">\n      <summary>\n        <para>Utility Object that contructs a set of selection rules to be ran on a root visual element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.Active\">\n      <summary>\n        <para>Selects all elements that are active.</para>\n      </summary>\n      <returns>\n        <para>A QueryBuilder with the selection rules.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.AtIndex(System.Int32)\">\n      <summary>\n        <para>Convenience overload, shorthand for Build().AtIndex().</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.Build\">\n      <summary>\n        <para>Compiles the selection rules into a QueryState object.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.Checked\">\n      <summary>\n        <para>Selects all elements that are checked.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.Children(System.String,System.String[])\">\n      <summary>\n        <para>Selects all direct child elements of elements matching the previous rules.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"classes\"></param>\n      <param name=\"className\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.Children(System.String,System.String)\">\n      <summary>\n        <para>Selects all direct child elements of elements matching the previous rules.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"classes\"></param>\n      <param name=\"className\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.Class(System.String)\">\n      <summary>\n        <para>Selects all elements with the given class. Not to be confused with Type (see OfType&lt;&gt;()).</para>\n      </summary>\n      <param name=\"classname\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.#ctor(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Initializes a QueryBuilder.</para>\n      </summary>\n      <param name=\"visualElement\">The root element on which to condfuct the search query.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.Descendents(System.String,System.String[])\">\n      <summary>\n        <para>Selects all elements that are descendants of currently matching ancestors.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"classNames\"></param>\n      <param name=\"classname\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.Descendents(System.String,System.String)\">\n      <summary>\n        <para>Selects all elements that are descendants of currently matching ancestors.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"classNames\"></param>\n      <param name=\"classname\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.Enabled\">\n      <summary>\n        <para>Selects all elements that are enabled.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.First\">\n      <summary>\n        <para>Convenience overload, shorthand for Build().First().</para>\n      </summary>\n      <returns>\n        <para>The first element matching all the criteria, or null if none was found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.Focused\">\n      <summary>\n        <para>Selects all elements that are enabled.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.ForEach(System.Action`1&lt;T&gt;)\">\n      <summary>\n        <para>Convenience overload, shorthand for Build().ForEach().</para>\n      </summary>\n      <param name=\"funcCall\">The function to be invoked with each matching element.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.ForEach(System.Collections.Generic.List`1&lt;T2&gt;,System.Func`2&lt;T,T2&gt;)\">\n      <summary>\n        <para>Convenience overload, shorthand for Build().ForEach().</para>\n      </summary>\n      <param name=\"funcCall\">The function to be invoked with each matching element.</param>\n      <param name=\"result\">Each return value will be added to this list.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.ForEach(System.Func`2&lt;T,T2&gt;)\">\n      <summary>\n        <para>Convenience overload, shorthand for Build().ForEach().</para>\n      </summary>\n      <param name=\"funcCall\">The function to be invoked with each matching element.</param>\n      <returns>\n        <para>Returns a list of all the results of the function calls.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.Hovered\">\n      <summary>\n        <para>Selects all elements that are hovered.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.Last\">\n      <summary>\n        <para>Convenience overload, shorthand for Build().Last().</para>\n      </summary>\n      <returns>\n        <para>The last element matching all the criteria, or null if none was found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.Name(System.String)\">\n      <summary>\n        <para>Selects element with this name.</para>\n      </summary>\n      <param name=\"id\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.NotActive\">\n      <summary>\n        <para>Selects all elements that are not active.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.NotChecked\">\n      <summary>\n        <para>Selects all elements that npot checked.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.NotEnabled\">\n      <summary>\n        <para>Selects all elements that are not enabled.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.NotFocused\">\n      <summary>\n        <para>Selects all elements that don't currently own the focus.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.NotHovered\">\n      <summary>\n        <para>Selects all elements that are not hovered.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.NotSelected\">\n      <summary>\n        <para>Selects all elements that are not selected.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.NotVisible\">\n      <summary>\n        <para>Selects all elements that are not visible.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.OfType(System.String,System.String[])\">\n      <summary>\n        <para>Selects all elements of the specified Type (eg: Label, Button, ScrollView, etc).</para>\n      </summary>\n      <param name=\"name\">If specified, will select elements with this name.</param>\n      <param name=\"classes\">If specified, will select elements with the given class (not to be confused with Type).</param>\n      <param name=\"className\">If specified, will select elements with the given class (not to be confused with Type).</param>\n      <returns>\n        <para>QueryBuilder configured with the associated selection rules.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.OfType(System.String,System.String)\">\n      <summary>\n        <para>Selects all elements of the specified Type (eg: Label, Button, ScrollView, etc).</para>\n      </summary>\n      <param name=\"name\">If specified, will select elements with this name.</param>\n      <param name=\"classes\">If specified, will select elements with the given class (not to be confused with Type).</param>\n      <param name=\"className\">If specified, will select elements with the given class (not to be confused with Type).</param>\n      <returns>\n        <para>QueryBuilder configured with the associated selection rules.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.Selected\">\n      <summary>\n        <para>Selects all elements that are selected.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.ToList\">\n      <summary>\n        <para>Convenience method. shorthand for Build().ToList.</para>\n      </summary>\n      <returns>\n        <para>Returns a list containing elements satisfying selection rules.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.ToList(System.Collections.Generic.List`1&lt;T&gt;)\">\n      <summary>\n        <para>Convenience method. Shorthand gor Build().ToList().</para>\n      </summary>\n      <param name=\"results\">Adds all elements satisfying selection rules to the list.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.Visible\">\n      <summary>\n        <para>Selects all elements that are visible.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryBuilder_1.Where(System.Func`2&lt;T,System.Boolean&gt;)\">\n      <summary>\n        <para>Selects all elements satifying the predicate.</para>\n      </summary>\n      <param name=\"selectorPredicate\">Predicate that must return true for selected elements.</param>\n      <returns>\n        <para>QueryBuilder configured with the associated selection rules.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UQuery.QueryState`1\">\n      <summary>\n        <para>Query object containing all the selection rules. Can be saved and rerun later without re-allocating memory.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryState_1.AtIndex(System.Int32)\">\n      <summary>\n        <para>Selects the n th element matching all the criteria, or null if not enough elements were found.</para>\n      </summary>\n      <param name=\"index\">The index of the matched element.</param>\n      <returns>\n        <para>The match element at the specified index.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryState_1.First\">\n      <summary>\n        <para>The first element matching all the criteria, or null if none was found.</para>\n      </summary>\n      <returns>\n        <para>The first element matching all the criteria, or null if none was found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryState_1.ForEach(System.Action`1&lt;T&gt;)\">\n      <summary>\n        <para>Invokes function on all elements matching the query.</para>\n      </summary>\n      <param name=\"funcCall\">The action to be invoked with each matching element.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryState_1.ForEach(System.Collections.Generic.List`1&lt;T2&gt;,System.Func`2&lt;T,T2&gt;)\">\n      <summary>\n        <para>Invokes function on all elements matching the query.</para>\n      </summary>\n      <param name=\"result\">Each return value will be added to this list.</param>\n      <param name=\"funcCall\">The function to be invoked with each matching element.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryState_1.ForEach(System.Func`2&lt;T,T2&gt;)\">\n      <summary>\n        <para>Invokes function on all elements matching the query. Overloaded for convenience.</para>\n      </summary>\n      <param name=\"funcCall\">The function to be invoked with each matching element.</param>\n      <returns>\n        <para>Returns a list of all the results of the function calls.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryState_1.Last\">\n      <summary>\n        <para>The last element matching all the criteria, or null if none was found.</para>\n      </summary>\n      <returns>\n        <para>The last element matching all the criteria, or null if none was found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryState_1.RebuildOn(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Creates a new QueryState with the same selection rules, applied on another VisualElement.</para>\n      </summary>\n      <param name=\"element\">The element on which to apply the selection rules.</param>\n      <returns>\n        <para>A new QueryState with the same selection rules, applied on this element.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryState_1.ToList\">\n      <summary>\n        <para>Returns a list containing elements satisfying selection rules.</para>\n      </summary>\n      <returns>\n        <para>Returns a list containing elements satisfying selection rules.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQuery.QueryState_1.ToList(System.Collections.Generic.List`1&lt;T&gt;)\">\n      <summary>\n        <para>Adds all elements satisfying selection rules to the list.</para>\n      </summary>\n      <param name=\"results\">Adds all elements satisfying selection rules to the list.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UQueryExtensions\">\n      <summary>\n        <para>UQuery is a set of extension methods allowing you to select individual or collection of visualElements inside a complex hierarchy.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQueryExtensions.Q(UnityEngine.Experimental.UIElements.VisualElement,System.String,System.String)\">\n      <summary>\n        <para>Convenience overload, shorthand for Query&lt;T&gt;.Build().First().</para>\n      </summary>\n      <param name=\"e\">Root VisualElement on which the selector will be applied.</param>\n      <param name=\"name\">If specified, will select elements with this name.</param>\n      <param name=\"classes\">If specified, will select elements with the given class (not to be confused with Type).</param>\n      <param name=\"className\">If specified, will select elements with the given class (not to be confused with Type).</param>\n      <returns>\n        <para>The first element matching all the criteria, or null if none was found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQueryExtensions.Q(UnityEngine.Experimental.UIElements.VisualElement,System.String,System.String[])\">\n      <summary>\n        <para>Convenience overload, shorthand for Query&lt;T&gt;.Build().First().</para>\n      </summary>\n      <param name=\"e\">Root VisualElement on which the selector will be applied.</param>\n      <param name=\"name\">If specified, will select elements with this name.</param>\n      <param name=\"classes\">If specified, will select elements with the given class (not to be confused with Type).</param>\n      <param name=\"className\">If specified, will select elements with the given class (not to be confused with Type).</param>\n      <returns>\n        <para>The first element matching all the criteria, or null if none was found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQueryExtensions.Query(UnityEngine.Experimental.UIElements.VisualElement,System.String,System.String)\">\n      <summary>\n        <para>Initializes a QueryBuilder with the specified selection rules.</para>\n      </summary>\n      <param name=\"e\">Root VisualElement on which the selector will be applied.</param>\n      <param name=\"name\">If specified, will select elements with this name.</param>\n      <param name=\"className\">If specified, will select elements with the given class (not to be confused with Type).</param>\n      <param name=\"classes\">If specified, will select elements with the given class (not to be confused with Type).</param>\n      <returns>\n        <para>QueryBuilder configured with the associated selection rules.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQueryExtensions.Query(UnityEngine.Experimental.UIElements.VisualElement,System.String,System.String[])\">\n      <summary>\n        <para>Initializes a QueryBuilder with the specified selection rules.</para>\n      </summary>\n      <param name=\"e\">Root VisualElement on which the selector will be applied.</param>\n      <param name=\"name\">If specified, will select elements with this name.</param>\n      <param name=\"className\">If specified, will select elements with the given class (not to be confused with Type).</param>\n      <param name=\"classes\">If specified, will select elements with the given class (not to be confused with Type).</param>\n      <returns>\n        <para>QueryBuilder configured with the associated selection rules.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQueryExtensions.Query(UnityEngine.Experimental.UIElements.VisualElement,System.String,System.String[])\">\n      <summary>\n        <para>Initializes a QueryBuilder with the specified selection rules. Template parameter specifies the type of elements the selector applies to (ie: Label, Button, etc).</para>\n      </summary>\n      <param name=\"e\">Root VisualElement on which the selector will be applied.</param>\n      <param name=\"name\">If specified, will select elements with this name.</param>\n      <param name=\"classes\">If specified, will select elements with the given class (not to be confused with Type).</param>\n      <param name=\"className\">If specified, will select elements with the given class (not to be confused with Type).</param>\n      <returns>\n        <para>QueryBuilder configured with the associated selection rules.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQueryExtensions.Query(UnityEngine.Experimental.UIElements.VisualElement,System.String,System.String)\">\n      <summary>\n        <para>Initializes a QueryBuilder with the specified selection rules. Template parameter specifies the type of elements the selector applies to (ie: Label, Button, etc).</para>\n      </summary>\n      <param name=\"e\">Root VisualElement on which the selector will be applied.</param>\n      <param name=\"name\">If specified, will select elements with this name.</param>\n      <param name=\"classes\">If specified, will select elements with the given class (not to be confused with Type).</param>\n      <param name=\"className\">If specified, will select elements with the given class (not to be confused with Type).</param>\n      <returns>\n        <para>QueryBuilder configured with the associated selection rules.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UQueryExtensions.Query(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Initializes an empty QueryBuilder on a specified root element.</para>\n      </summary>\n      <param name=\"e\">Root VisualElement on which the selector will be applied.</param>\n      <returns>\n        <para>An empty QueryBuilder on a specified root element.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlAttributeDescription\">\n      <summary>\n        <para>Base class for describing an XML attribute.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlAttributeDescription.defaultValueAsString\">\n      <summary>\n        <para>The default value for the attribute, as a string.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlAttributeDescription.name\">\n      <summary>\n        <para>The attribute name.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlAttributeDescription.restriction\">\n      <summary>\n        <para>Restrictions on the possible values of the attribute.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlAttributeDescription.type\">\n      <summary>\n        <para>Attribute type.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlAttributeDescription.typeNamespace\">\n      <summary>\n        <para>Attribute namespace.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlAttributeDescription.use\">\n      <summary>\n        <para>Whether the attribute is optional, required or prohibited.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlAttributeDescription.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlAttributeDescription.Use\">\n      <summary>\n        <para>An enum to describe attribute use.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.UxmlAttributeDescription.Use.None\">\n      <summary>\n        <para>There is no restriction on the use of this attribute with the element.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.UxmlAttributeDescription.Use.Optional\">\n      <summary>\n        <para>The attribute is optional for the element.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.UxmlAttributeDescription.Use.Prohibited\">\n      <summary>\n        <para>The attribute should not appear for the element.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.UxmlAttributeDescription.Use.Required\">\n      <summary>\n        <para>The attribute must appear in the element tag.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlBoolAttributeDescription\">\n      <summary>\n        <para>Describes a XML bool attribute.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlBoolAttributeDescription.defaultValue\">\n      <summary>\n        <para>The default value for the attribute.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlBoolAttributeDescription.defaultValueAsString\">\n      <summary>\n        <para>The default value for the attribute, as a string.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlBoolAttributeDescription.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlBoolAttributeDescription.GetValueFromBag(UnityEngine.Experimental.UIElements.IUxmlAttributes)\">\n      <summary>\n        <para>Retrieves the value of this attribute from the attribute bag. Returns it if it is found, otherwise return defaultValue.</para>\n      </summary>\n      <param name=\"bag\">The bag of attributes.</param>\n      <returns>\n        <para>The value of the attribute.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlChildElementDescription\">\n      <summary>\n        <para>Describe an allowed child element for an element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlChildElementDescription.elementName\">\n      <summary>\n        <para>The name of the allowed child element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlChildElementDescription.elementNamespace\">\n      <summary>\n        <para>The namespace name of the allowed child element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlChildElementDescription.#ctor(System.Type)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlColorAttributeDescription\">\n      <summary>\n        <para>Describes a XML attribute representing a Color as a string.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlColorAttributeDescription.defaultValue\">\n      <summary>\n        <para>The default value for the attribute.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlColorAttributeDescription.defaultValueAsString\">\n      <summary>\n        <para>The default value for the attribute, as a string.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlColorAttributeDescription.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlColorAttributeDescription.GetValueFromBag(UnityEngine.Experimental.UIElements.IUxmlAttributes)\">\n      <summary>\n        <para>Retrieves the value of this attribute from the attribute bag. Returns it if it is found, otherwise return defaultValue.</para>\n      </summary>\n      <param name=\"bag\">The bag of attributes.</param>\n      <returns>\n        <para>The value of the attribute.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlDoubleAttributeDescription\">\n      <summary>\n        <para>Describes a XML double attribute.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlDoubleAttributeDescription.defaultValue\">\n      <summary>\n        <para>The default value for the attribute.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlDoubleAttributeDescription.defaultValueAsString\">\n      <summary>\n        <para>The default value for the attribute, as a string.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlDoubleAttributeDescription.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlDoubleAttributeDescription.GetValueFromBag(UnityEngine.Experimental.UIElements.IUxmlAttributes)\">\n      <summary>\n        <para>Retrieves the value of this attribute from the attribute bag. Returns it if it is found, otherwise return defaultValue.</para>\n      </summary>\n      <param name=\"bag\">The bag of attributes.</param>\n      <returns>\n        <para>The value of the attribute.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlEnumAttributeDescription`1\">\n      <summary>\n        <para>Describes a XML attribute representing an enum as a string.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlEnumAttributeDescription_1.defaultValue\">\n      <summary>\n        <para>The default value for the attribute.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlEnumAttributeDescription_1.defaultValueAsString\">\n      <summary>\n        <para>The default value for the attribute, as a string.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlEnumAttributeDescription_1.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlEnumAttributeDescription_1.GetValueFromBag(UnityEngine.Experimental.UIElements.IUxmlAttributes)\">\n      <summary>\n        <para>Retrieves the value of this attribute from the attribute bag. Returns it if it is found, otherwise return defaultValue.</para>\n      </summary>\n      <param name=\"bag\">The bag of attributes.</param>\n      <returns>\n        <para>The value of the attribute.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlEnumeration\">\n      <summary>\n        <para>Restricts the value of an attribute to be taken from a list of values.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.UxmlEnumeration.values\">\n      <summary>\n        <para>The list of values the attribute can take.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlEnumeration.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlEnumeration.Equals(UnityEngine.Experimental.UIElements.UxmlTypeRestriction)\">\n      <summary>\n        <para>Indicates whether the current UxmlEnumeration object is equal to another object of the same type.</para>\n      </summary>\n      <param name=\"other\">The object to compare with.</param>\n      <returns>\n        <para>True if the otheer object is equal to this one.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlFactory`1\">\n      <summary>\n        <para>UxmlFactory specialization for classes that derive from VisualElement and that shares its traits, VisualElementTraits.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlFactory_1.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlFactory`2\">\n      <summary>\n        <para>Generic base class for UXML factories, which instantiate a VisualElement using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlFactory_2.canHaveAnyAttribute\">\n      <summary>\n        <para>Returns UxmlTraits.canHaveAnyAttribute (where UxmlTraits is the argument for T1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlFactory_2.substituteForTypeName\">\n      <summary>\n        <para>Returns an empty string if T0 is not VisualElement; otherwise, returns \"VisualElement\".</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlFactory_2.substituteForTypeNamespace\">\n      <summary>\n        <para>Returns the namespace for substituteForTypeName.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlFactory_2.substituteForTypeQualifiedName\">\n      <summary>\n        <para>Returns the fully qualified name for substituteForTypeName.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlFactory_2.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an empty enumerable.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlFactory_2.uxmlChildElementsDescription\">\n      <summary>\n        <para>Returns an empty enumerable.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlFactory_2.uxmlName\">\n      <summary>\n        <para>Returns the type name of T0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlFactory_2.uxmlNamespace\">\n      <summary>\n        <para>Returns the namespace name of T0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlFactory_2.uxmlQualifiedName\">\n      <summary>\n        <para>Returns the typefully qualified name of T0.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlFactory_2.AcceptsAttributeBag(UnityEngine.Experimental.UIElements.IUxmlAttributes)\">\n      <summary>\n        <para>Returns true.</para>\n      </summary>\n      <param name=\"bag\">The attribute bag.</param>\n      <returns>\n        <para>Always true.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlFactory_2.Create(UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Instantiate an object of type T0 and initialize it by calling T1 UxmlTraits.Init method.</para>\n      </summary>\n      <param name=\"bag\">A bag of name-value pairs, one for each attribute of the UXML element. This can be used to initialize the properties of the created object.</param>\n      <param name=\"cc\">When the element is created as part of a template instance inserted in another document, this contains information about the insertion point.</param>\n      <returns>\n        <para>The created element.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlFactory_2.CreatesType\">\n      <summary>\n        <para>Returns the Type of the objects created by this factory.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlFactory_2.DoCreate(UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>If implemented by your factory, this function will be called to instantiate an object of type T0. Otherwise, the default constructor of T0 will be used.</para>\n      </summary>\n      <param name=\"bag\">A bag of name-value pairs, one for each attribute of the UXML element. This can be used to initialize the properties of the created object.</param>\n      <param name=\"cc\">When the element is created as part of a template instance inserted in another document, this contains information about the insertion point.</param>\n      <returns>\n        <para>The created element.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlFloatAttributeDescription\">\n      <summary>\n        <para>Describes a XML float attribute.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlFloatAttributeDescription.defaultValue\">\n      <summary>\n        <para>The default value for the attribute.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlFloatAttributeDescription.defaultValueAsString\">\n      <summary>\n        <para>The default value for the attribute, as a string.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlFloatAttributeDescription.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlFloatAttributeDescription.GetValueFromBag(UnityEngine.Experimental.UIElements.IUxmlAttributes)\">\n      <summary>\n        <para>Retrieves the value of this attribute from the attribute bag. Returns it if it is found, otherwise return defaultValue.</para>\n      </summary>\n      <param name=\"bag\">The bag of attributes.</param>\n      <returns>\n        <para>The value of the attribute.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlIntAttributeDescription\">\n      <summary>\n        <para>Describes a XML int attribute.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlIntAttributeDescription.defaultValue\">\n      <summary>\n        <para>The default value for the attribute.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlIntAttributeDescription.defaultValueAsString\">\n      <summary>\n        <para>The default value for the attribute, as a string.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlIntAttributeDescription.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlIntAttributeDescription.GetValueFromBag(UnityEngine.Experimental.UIElements.IUxmlAttributes)\">\n      <summary>\n        <para>Retrieves the value of this attribute from the attribute bag. Returns it if it is found, otherwise return defaultValue.</para>\n      </summary>\n      <param name=\"bag\">The bag of attributes.</param>\n      <returns>\n        <para>The value of the attribute.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlLongAttributeDescription\">\n      <summary>\n        <para>Describes a XML long attribute.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlLongAttributeDescription.defaultValue\">\n      <summary>\n        <para>The default value for the attribute.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlLongAttributeDescription.defaultValueAsString\">\n      <summary>\n        <para>The default value for the attribute, as a string.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlLongAttributeDescription.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlLongAttributeDescription.GetValueFromBag(UnityEngine.Experimental.UIElements.IUxmlAttributes)\">\n      <summary>\n        <para>Retrieves the value of this attribute from the attribute bag. Returns it if it is found, otherwise return defaultValue.</para>\n      </summary>\n      <param name=\"bag\">The bag of attributes.</param>\n      <returns>\n        <para>The value of the attribute.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlRootElementFactory\">\n      <summary>\n        <para>Factory for the root UXML element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlRootElementFactory.substituteForTypeName\">\n      <summary>\n        <para>Returns the empty string, as the root element can not appear anywhere else bit at the root of the document.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlRootElementFactory.substituteForTypeNamespace\">\n      <summary>\n        <para>Returns the empty string, as the root element can not appear anywhere else bit at the root of the document.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlRootElementFactory.substituteForTypeQualifiedName\">\n      <summary>\n        <para>Returns the empty string, as the root element can not appear anywhere else bit at the root of the document.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlRootElementFactory.uxmlName\">\n      <summary>\n        <para>Returns \"UXML\".</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlRootElementFactory.uxmlQualifiedName\">\n      <summary>\n        <para>Returns the qualified name for this element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlRootElementFactory.Create(UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Returns null.</para>\n      </summary>\n      <param name=\"bag\"></param>\n      <param name=\"cc\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlRootElementFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlRootElementTraits\">\n      <summary>\n        <para>UxmlTraits for the UXML root element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlRootElementTraits.uxmlChildElementsDescription\">\n      <summary>\n        <para>Returns an enumerable containing UxmlChildElementDescription(typeof(VisualElement)), since the root element can contain VisualElements.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlRootElementTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlStringAttributeDescription\">\n      <summary>\n        <para>Describes a XML string attribute.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlStringAttributeDescription.defaultValue\">\n      <summary>\n        <para>The default value for the attribute.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlStringAttributeDescription.defaultValueAsString\">\n      <summary>\n        <para>The default value for the attribute, as a string.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlStringAttributeDescription.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlStringAttributeDescription.GetValueFromBag(UnityEngine.Experimental.UIElements.IUxmlAttributes)\">\n      <summary>\n        <para>Retrieves the value of this attribute from the attribute bag. Returns it if it is found, otherwise return defaultValue.</para>\n      </summary>\n      <param name=\"bag\">The bag of attributes.</param>\n      <returns>\n        <para>The value of the attribute.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlTraits\">\n      <summary>\n        <para>Describes a VisualElement derived class for the parsing of UXML files and the generation of UXML schema definition.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlTraits.canHaveAnyAttribute\">\n      <summary>\n        <para>Must return true if the UXML element attributes are not restricted to the values enumerated by uxmlAttributesDescription.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Describes the UXML attributes expected by the element. The attributes enumerated here will appear in the UXML schema.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.UxmlTraits.uxmlChildElementsDescription\">\n      <summary>\n        <para>Describes the types of element that can appear as children of this element in a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize a VisualElement instance with values from the UXML element attributes.</para>\n      </summary>\n      <param name=\"ve\">The VisualElement to initialize.</param>\n      <param name=\"bag\">A bag of name-value pairs, one for each attribute of the UXML element.</param>\n      <param name=\"cc\">When the element is created as part of a template instance inserted in another document, this contains information about the insertion point.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlTypeRestriction\">\n      <summary>\n        <para>Base class to restricts the value of an attribute.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlTypeRestriction.Equals(UnityEngine.Experimental.UIElements.UxmlTypeRestriction)\">\n      <summary>\n        <para>Indicates whether the current UxmlTypeRestriction object is equal to another object of the same type.</para>\n      </summary>\n      <param name=\"other\">The object to compare with.</param>\n      <returns>\n        <para>True if the otheer object is equal to this one.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlValueBounds\">\n      <summary>\n        <para>Restricts the value of an attribute to be within the specified bounds.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.UxmlValueBounds.excludeMax\">\n      <summary>\n        <para>True if the bounds exclude max.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.UxmlValueBounds.excludeMin\">\n      <summary>\n        <para>True if the bounds exclude min.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.UxmlValueBounds.max\">\n      <summary>\n        <para>The maximum value for the attribute.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.UxmlValueBounds.min\">\n      <summary>\n        <para>The minimum value for the attribute.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlValueBounds.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlValueBounds.Equals(UnityEngine.Experimental.UIElements.UxmlTypeRestriction)\">\n      <summary>\n        <para>Indicates whether the current UxmlValueBounds object is equal to another object of the same type.</para>\n      </summary>\n      <param name=\"other\">The object to compare with.</param>\n      <returns>\n        <para>True if the otheer object is equal to this one.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.UxmlValueMatches\">\n      <summary>\n        <para>Restricts the value of an attribute to match a regular expression.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.UxmlValueMatches.regex\">\n      <summary>\n        <para>The regular expression that should be matched by the value.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlValueMatches.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.UxmlValueMatches.Equals(UnityEngine.Experimental.UIElements.UxmlTypeRestriction)\">\n      <summary>\n        <para>Indicates whether the current UxmlValueMatches object is equal to another object of the same type.</para>\n      </summary>\n      <param name=\"other\">The object to compare with.</param>\n      <returns>\n        <para>True if the otheer object is equal to this one.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.ValidateCommandEvent\">\n      <summary>\n        <para>The event sent to probe which elements accepts a command.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.ValidateCommandEvent.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.VisualContainer.VisualContainerFactory\">\n      <summary>\n        <para>Instantiates a VisualElement using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualContainer.VisualContainerFactory.substituteForTypeName\">\n      <summary>\n        <para>Returns the VisualElement type name.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualContainer.VisualContainerFactory.substituteForTypeNamespace\">\n      <summary>\n        <para>Returns the VisualElement type namespace.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualContainer.VisualContainerFactory.substituteForTypeQualifiedName\">\n      <summary>\n        <para>Returns the VisualElement qualified name.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualContainer.VisualContainerFactory.uxmlName\">\n      <summary>\n        <para>Returns VisualContainer type name.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualContainer.VisualContainerFactory.uxmlNamespace\">\n      <summary>\n        <para>Returns VisualContainer namespace name.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualContainer.VisualContainerFactory.uxmlQualifiedName\">\n      <summary>\n        <para>Returns VisualContainer full name.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualContainer.VisualContainerFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.VisualElement\">\n      <summary>\n        <para>Base class for objects that are part of the UIElements visual tree.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElement.childCount\">\n      <summary>\n        <para> Number of child elements in this object's contentContainer\n                </para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElement.clippingOptions\">\n      <summary>\n        <para>Should this element clip painting to its boundaries.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElement.contentContainer\">\n      <summary>\n        <para> child elements are added to this element, usually this\n                </para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElement.dataWatch\">\n      <summary>\n        <para>Access to this element data watch interface.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.VisualElement.defaultFocusIndex\">\n      <summary>\n        <para>The default focus index for newly created elements.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElement.enabledInHierarchy\">\n      <summary>\n        <para>Returns true if the VisualElement is enabled in its own hierarchy.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElement.enabledSelf\">\n      <summary>\n        <para>Returns true if the VisualElement is enabled locally.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElement.persistenceKey\">\n      <summary>\n        <para>Used for view data persistence (ie. tree expanded states, scroll position, zoom level).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElement.schedule\">\n      <summary>\n        <para>Retrieves this VisualElement's IVisualElementScheduler</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElement.shadow\">\n      <summary>\n        <para> Access to this element physical hierarchy\n                </para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElement.style\">\n      <summary>\n        <para>Reference to the style object of this element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElement.userData\">\n      <summary>\n        <para>This property can be used to associate application-specific user data with this VisualElement.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.Add(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Add an element to this element's contentContainer</para>\n      </summary>\n      <param name=\"child\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.AddStyleSheetPath(System.String)\">\n      <summary>\n        <para>Adds this stylesheet file to this element list of applied styles</para>\n      </summary>\n      <param name=\"sheetPath\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.AnyDirty(UnityEngine.Experimental.UIElements.ChangeType)\">\n      <summary>\n        <para>Checks if any of the ChangeTypes have been marked dirty.</para>\n      </summary>\n      <param name=\"type\">The ChangeType(s) to check.</param>\n      <returns>\n        <para>True if at least one of the checked ChangeTypes have been marked dirty.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.BringToFront\">\n      <summary>\n        <para>Brings this element to the end of its parent children list. The element will be visually in front of any overlapping sibling elements.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.Children\">\n      <summary>\n        <para>Returns the elements from its contentContainer</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.Clear\">\n      <summary>\n        <para>Remove all child elements from this element's contentContainer</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.VisualElement.ClippingOptions\">\n      <summary>\n        <para>Options to select clipping strategy.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.VisualElement.ClippingOptions.ClipAndCacheContents\">\n      <summary>\n        <para>Enables clipping and renders contents to a cache texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.VisualElement.ClippingOptions.ClipContents\">\n      <summary>\n        <para>Will enable clipping. This VisualElement and its children's content will be limited to this element's bounds.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.VisualElement.ClippingOptions.NoClipping\">\n      <summary>\n        <para>Will disable clipping and let children VisualElements paint outside its bounds.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.Contains(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Returns true if the element is a direct child of this VisualElement</para>\n      </summary>\n      <param name=\"child\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.ElementAt(System.Int32)\">\n      <summary>\n        <para>Retrieves the child element at position</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.EnableInClassList(System.String,System.Boolean)\">\n      <summary>\n        <para>Enables or disables the class with the given name.</para>\n      </summary>\n      <param name=\"className\">The name of the class to enable or disable.</param>\n      <param name=\"enable\">A boolean flag that adds or removes the class name from the class list. If true, EnableInClassList adds the class name to the class list. If false, EnableInClassList removes the class name from the class list.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.FindAncestorUserData\">\n      <summary>\n        <para>Searchs up the hierachy of this VisualElement and retrieves stored userData, if any is found.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.FindCommonAncestor(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Finds the lowest commont ancestor between two VisualElements inside the VisualTree hierarchy</para>\n      </summary>\n      <param name=\"other\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.GetEnumerator\">\n      <summary>\n        <para>Allows to iterate into this elements children</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.GetFirstAncestorOfType\">\n      <summary>\n        <para>Walks up the hierarchy, starting from this element's parent, and returns the first VisualElement of this type</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.GetFirstOfType\">\n      <summary>\n        <para>Walks up the hierarchy, starting from this element, and returns the first VisualElement of this type</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.GetFullHierarchicalPersistenceKey\">\n      <summary>\n        <para>Combine this VisualElement's VisualElement.persistenceKey with those of its parents to create a more unique key for use with VisualElement.GetOrCreatePersistentData.</para>\n      </summary>\n      <returns>\n        <para>Full hierarchical persistence key.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.GetOrCreatePersistentData(System.Object,System.String)\">\n      <summary>\n        <para>Takes a reference to an existing persisted object and a key and returns the object either filled with the persisted state or as-is.</para>\n      </summary>\n      <param name=\"existing\">An existing object to be persisted, or null to create a new object. If no persisted state is found, a non-null object will be returned as-is.</param>\n      <param name=\"key\">The key for the current VisualElement to be used with the persistence store on the EditorWindow.</param>\n      <returns>\n        <para>The same object being passed in (or a new one if null was passed in), but possibly with its persistent state restored.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.GetOrCreatePersistentData(UnityEngine.ScriptableObject,System.String)\">\n      <summary>\n        <para>Takes a reference to an existing persisted object and a key and returns the object either filled with the persisted state or as-is.</para>\n      </summary>\n      <param name=\"existing\">An existing object to be persisted, or null to create a new object. If no persisted state is found, a non-null object will be returned as-is.</param>\n      <param name=\"key\">The key for the current VisualElement to be used with the persistence store on the EditorWindow.</param>\n      <returns>\n        <para>The same object being passed in (or a new one if null was passed in), but possibly with its persistent state restored.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.HasStyleSheetPath\">\n      <summary>\n        <para>Checks if this stylesheet file is in this element list of applied styles</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.VisualElement.Hierarchy\">\n      <summary>\n        <para>Hierarchy is a sctuct allowing access to the shadow hierarchy of visual elements</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElement.Hierarchy.childCount\">\n      <summary>\n        <para> Number of child elements in this object's contentContainer\n                </para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElement.Hierarchy.parent\">\n      <summary>\n        <para> Access the physical parent of this element in the hierarchy\n                </para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.Hierarchy.Add(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Add an element to this element's contentContainer</para>\n      </summary>\n      <param name=\"child\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.Hierarchy.Children\">\n      <summary>\n        <para>Returns the elements from its contentContainer</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.Hierarchy.Clear\">\n      <summary>\n        <para>Remove all child elements from this element's contentContainer</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.Hierarchy.ElementAt(System.Int32)\">\n      <summary>\n        <para>Retrieves the child element at position</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.Hierarchy.IndexOf(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Retrieves the index of the specified VisualElement in the Hierarchy.</para>\n      </summary>\n      <param name=\"element\">The element to return the index for.</param>\n      <returns>\n        <para>Returns the index of the element, or -1 if the element is not found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.Hierarchy.Insert\">\n      <summary>\n        <para>Insert an element into this element's contentContainer</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.Hierarchy.Remove(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Removes this child from the hierarchy</para>\n      </summary>\n      <param name=\"child\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.Hierarchy.RemoveAt(System.Int32)\">\n      <summary>\n        <para>Remove the child element located at this position from this element's contentContainer</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.Hierarchy.Sort(System.Comparison`1&lt;UnityEngine.Experimental.UIElements.VisualElement&gt;)\">\n      <summary>\n        <para>Reorders child elements from this VisualElement contentContainer.</para>\n      </summary>\n      <param name=\"comp\">Sorting criteria.</param>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElement.Hierarchy.this\">\n      <summary>\n        <para> Access to this element physical hierarchy\n                </para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.IndexOf(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Retrieves the child index of the specified VisualElement.</para>\n      </summary>\n      <param name=\"element\">The child to return the index for.</param>\n      <returns>\n        <para>Returns the index of the child, or -1 if the child is not found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.Insert\">\n      <summary>\n        <para>Insert an element into this element's contentContainer</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.VisualElement.MeasureMode\">\n      <summary>\n        <para>The modes available to measure VisualElement sizes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.VisualElement.MeasureMode.AtMost\">\n      <summary>\n        <para>At Most. The element should give its preferred width/height but no more than the value passed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.VisualElement.MeasureMode.Exactly\">\n      <summary>\n        <para>The element should give the width/height that is passed in and derive the opposite site from this value (for example, calculate text size from a fixed width).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.VisualElement.MeasureMode.Undefined\">\n      <summary>\n        <para>The element should give its preferred width/height without any constraint.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.OnPersistentDataReady\">\n      <summary>\n        <para>Called when the persistent data is accessible and/or when the data or persistence key have changed (VisualElement is properly parented).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.OnStyleResolved(UnityEngine.Experimental.UIElements.StyleSheets.ICustomStyle)\">\n      <summary>\n        <para>Callback when the styles of an object have changed.</para>\n      </summary>\n      <param name=\"style\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.OverwriteFromPersistedData(System.Object,System.String)\">\n      <summary>\n        <para>Overwrite object from the persistent data store.</para>\n      </summary>\n      <param name=\"key\">The key for the current VisualElement to be used with the persistence store on the EditorWindow.</param>\n      <param name=\"obj\">Object to overwrite.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.PlaceBehind(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Places this element right before the sibling element in their parent children list. If the element and the sibling position overlap, the element will be visually behind of its sibling.</para>\n      </summary>\n      <param name=\"sibling\">The sibling element.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.PlaceInFront(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Places this element right after the sibling element in their parent children list. If the element and the sibling position overlap, the element will be visually in front of its sibling.</para>\n      </summary>\n      <param name=\"sibling\">The sibling element.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.Remove(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>Removes this child from the hierarchy</para>\n      </summary>\n      <param name=\"element\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.RemoveAt(System.Int32)\">\n      <summary>\n        <para>Remove the child element located at this position from this element's contentContainer</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.RemoveFromHierarchy\">\n      <summary>\n        <para>Removes this element from its parent hierarchy</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.RemoveStyleSheetPath(System.String)\">\n      <summary>\n        <para>Removes this stylesheet file from this element list of applied styles</para>\n      </summary>\n      <param name=\"sheetPath\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.SavePersistentData\">\n      <summary>\n        <para>Write persistence data to file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.SendToBack\">\n      <summary>\n        <para>Sends this element to the beginning of its parent children list. The element will be visually behind any overlapping sibling elements.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.SetEnabled(System.Boolean)\">\n      <summary>\n        <para>Changes the VisualElement enabled state. A disabled VisualElement does not receive most events.</para>\n      </summary>\n      <param name=\"value\">New enabled state</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.Sort(System.Comparison`1&lt;UnityEngine.Experimental.UIElements.VisualElement&gt;)\">\n      <summary>\n        <para>Reorders child elements from this VisualElement contentContainer.</para>\n      </summary>\n      <param name=\"comp\">Sorting criteria.</param>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElement.this\">\n      <summary>\n        <para> Access to this element physical hierarchy\n                </para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.ToggleInClassList(System.String)\">\n      <summary>\n        <para>Toggles between adding and removing the given class name from the class list.</para>\n      </summary>\n      <param name=\"className\">The class name to add or remove from the class list.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.VisualElement.VisualElementFactory\">\n      <summary>\n        <para>Instantiates a VisualElement using the data read from a UXML file.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.VisualElementFactory.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.VisualElement.VisualElementUxmlTraits\">\n      <summary>\n        <para>UxmlTraits for the VisualElement.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElement.VisualElementUxmlTraits.uxmlAttributesDescription\">\n      <summary>\n        <para>Returns an enumerable containing attribute descriptions for VisualElement properties that should be available in UXML.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElement.VisualElementUxmlTraits.uxmlChildElementsDescription\">\n      <summary>\n        <para>Returns an enumerable containing UxmlChildElementDescription(typeof(VisualElement)), since VisualElements can contain other VisualElements.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.VisualElementUxmlTraits.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElement.VisualElementUxmlTraits.Init(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IUxmlAttributes,UnityEngine.Experimental.UIElements.CreationContext)\">\n      <summary>\n        <para>Initialize VisualElement properties using values from the attribute bag.</para>\n      </summary>\n      <param name=\"ve\">The object to initialize.</param>\n      <param name=\"bag\">The attribute bag.</param>\n      <param name=\"cc\">The creation context; unused.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.VisualElementExtensions\">\n      <summary>\n        <para>VisualElementExtensions is a set of extension methods useful for VisualElement.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElementExtensions.AddManipulator(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IManipulator)\">\n      <summary>\n        <para>Add a manipulator associated to a VisualElement.</para>\n      </summary>\n      <param name=\"ele\">VisualElement associated to the manipulator.</param>\n      <param name=\"manipulator\">Manipulator to be added to the VisualElement.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElementExtensions.RemoveManipulator(UnityEngine.Experimental.UIElements.VisualElement,UnityEngine.Experimental.UIElements.IManipulator)\">\n      <summary>\n        <para>Remove a manipulator associated to a VisualElement.</para>\n      </summary>\n      <param name=\"ele\">VisualElement associated to the manipulator.</param>\n      <param name=\"manipulator\">Manipulator to be removed from the VisualElement.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElementExtensions.StretchToParentWidth(UnityEngine.Experimental.UIElements.VisualElement)\">\n      <summary>\n        <para>The given VisualElement's left and right edges will be aligned with the corresponding edges of the parent element.</para>\n      </summary>\n      <param name=\"elem\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.VisualElementFocusChangeDirection\">\n      <summary>\n        <para>Define focus change directions for the VisualElementFocusRing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElementFocusChangeDirection.lastValue\">\n      <summary>\n        <para>Last value for the direction defined by this class.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElementFocusChangeDirection.left\">\n      <summary>\n        <para>The focus is moving to the left.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElementFocusChangeDirection.right\">\n      <summary>\n        <para>The focus is moving to the right.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.VisualElementFocusRing\">\n      <summary>\n        <para>Implementation of a linear focus ring. Elements are sorted according to their focusIndex.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.VisualElementFocusRing.defaultFocusOrder\">\n      <summary>\n        <para>The focus order for elements having 0 has a focusIndex.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElementFocusRing.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"root\">The root of the element tree for which we want to build a focus ring.</param>\n      <param name=\"dfo\">Default ordering of the elements in the ring.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.VisualElementFocusRing.DefaultFocusOrder\">\n      <summary>\n        <para>Ordering of elements in the focus ring.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.VisualElementFocusRing.DefaultFocusOrder.ChildOrder\">\n      <summary>\n        <para>Order elements using a depth-first pre-order traversal of the element tree.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.VisualElementFocusRing.DefaultFocusOrder.PositionXY\">\n      <summary>\n        <para>Order elements according to their position, first by X, then by Y.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.UIElements.VisualElementFocusRing.DefaultFocusOrder.PositionYX\">\n      <summary>\n        <para>Order elements according to their position, first by Y, then by X.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElementFocusRing.GetFocusChangeDirection(UnityEngine.Experimental.UIElements.Focusable,UnityEngine.Experimental.UIElements.EventBase)\">\n      <summary>\n        <para>Get the direction of the focus change for the given event. For example, when the Tab key is pressed, focus should be given to the element to the right in the focus ring.</para>\n      </summary>\n      <param name=\"currentFocusable\"></param>\n      <param name=\"e\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.VisualElementFocusRing.GetNextFocusable(UnityEngine.Experimental.UIElements.Focusable,UnityEngine.Experimental.UIElements.FocusChangeDirection)\">\n      <summary>\n        <para>Get the next element in the given direction.</para>\n      </summary>\n      <param name=\"currentFocusable\"></param>\n      <param name=\"direction\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.UIElements.WheelEvent\">\n      <summary>\n        <para>Mouse wheel event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.UIElements.WheelEvent.delta\">\n      <summary>\n        <para>The amount of scrolling applied on the mouse wheel.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.WheelEvent.#ctor\">\n      <summary>\n        <para>Constructor. Avoid newing events. Instead, use GetPooled() to get an event from a pool of reusable events.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.WheelEvent.GetPooled(UnityEngine.Event)\">\n      <summary>\n        <para>Get an event from the event pool and initialize it with the given values. Use this function instead of creating new events. Events obtained from this method should be released back to the pool using ReleaseEvent().</para>\n      </summary>\n      <param name=\"systemEvent\">A wheel IMGUI event.</param>\n      <returns>\n        <para>A wheel event.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.UIElements.WheelEvent.Init\">\n      <summary>\n        <para>Reset the event members to their initial value.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Video.VideoClipPlayable\">\n      <summary>\n        <para>An implementation of IPlayable that controls playback of a VideoClip.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Video.VideoClipPlayable.Create(UnityEngine.Playables.PlayableGraph,UnityEngine.Video.VideoClip,System.Boolean)\">\n      <summary>\n        <para>Creates a VideoClipPlayable in the PlayableGraph.</para>\n      </summary>\n      <param name=\"graph\">The PlayableGraph object that will own the VideoClipPlayable.</param>\n      <param name=\"looping\">Indicates if VideoClip loops when it reaches the end.</param>\n      <param name=\"clip\">VideoClip used to produce textures in the PlayableGraph.</param>\n      <returns>\n        <para>A VideoClipPlayable linked to the PlayableGraph.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.Video.VideoPlayerExtensions\">\n      <summary>\n        <para>Extension methods for the Video.VideoPlayer class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.Video.VideoPlayerExtensions.GetAudioSampleProvider(UnityEngine.Video.VideoPlayer,System.UInt16)\">\n      <summary>\n        <para>Return the Experimental.Audio.AudioSampleProvider for the specified track, used to receive audio samples during playback.</para>\n      </summary>\n      <param name=\"vp\">The \"this\" pointer for the extension method.</param>\n      <param name=\"trackIndex\">The audio track index for which the sample provider is queried.</param>\n      <returns>\n        <para>The sample provider for the specified track.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.BoundedPlane\">\n      <summary>\n        <para>Structure describing a bounded plane representing a real-world surface.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.BoundedPlane.Alignment\">\n      <summary>\n        <para>The alignment of the plane, e.g., horizontal or vertical.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.BoundedPlane.Center\">\n      <summary>\n        <para>Center point of the plane in device space.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.BoundedPlane.GetCorners(UnityEngine.Vector3&amp;,UnityEngine.Vector3&amp;,UnityEngine.Vector3&amp;,UnityEngine.Vector3&amp;)\">\n      <summary>\n        <para>Outputs four points, in device space, representing the four corners of the plane. The corners are in clockwise order.</para>\n      </summary>\n      <param name=\"p0\">The vertex of the first corner.</param>\n      <param name=\"p1\">The vertex of the second corner.</param>\n      <param name=\"p2\">The vertex of the third corner.</param>\n      <param name=\"p3\">The vertex of the fourth corner.</param>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.BoundedPlane.Height\">\n      <summary>\n        <para>Current height of the plane.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.BoundedPlane.Id\">\n      <summary>\n        <para>A session-unique identifier for the plane.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.BoundedPlane.Normal\">\n      <summary>\n        <para>Normal vector of the plane in device space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.BoundedPlane.Plane\">\n      <summary>\n        <para>Returns the infinite Plane associated with this BoundedPlane.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.BoundedPlane.Pose\">\n      <summary>\n        <para>Pose of the plane in device space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.BoundedPlane.Size\">\n      <summary>\n        <para>Current size of the plane.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.BoundedPlane.SubsumedById\">\n      <summary>\n        <para>A session-unique identifier for the BoundedPlane that subsumed this plane.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.BoundedPlane.TryGetBoundary(System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;)\">\n      <summary>\n        <para>Try to retrieve a list of positions in device space describing current plane boundary.</para>\n      </summary>\n      <param name=\"boundaryOut\">A list of vertices representing the boundary.</param>\n      <returns>\n        <para>True if the plane exists (i.e., is still being tracked), otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.BoundedPlane.Width\">\n      <summary>\n        <para>Current width of the plane.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.FrameReceivedEventArgs\">\n      <summary>\n        <para>Structure containing data passed during Frame Received Event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.FrameReceivedEventArgs.CameraSubsystem\">\n      <summary>\n        <para>Reference to the XRCameraSubsystem associated with this event.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.PlaneAddedEventArgs\">\n      <summary>\n        <para>Contains data supplied to a XRPlaneSubsystem.PlaneAdded event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.PlaneAddedEventArgs.Plane\">\n      <summary>\n        <para>The BoundedPlane that was added.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.PlaneAddedEventArgs.PlaneSubsystem\">\n      <summary>\n        <para>A reference to the PlaneSubsystem object from which the event originated.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.PlaneAlignment\">\n      <summary>\n        <para>Describes current plane alignment in mixed reality space.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.XR.PlaneAlignment.Horizontal\">\n      <summary>\n        <para>Plane has horizontal alignment.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.XR.PlaneAlignment.NonAxis\">\n      <summary>\n        <para>Plane is not alligned along cardinal (X, Y or Z) axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.XR.PlaneAlignment.Vertical\">\n      <summary>\n        <para>Plane has vertical alignment.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.PlaneRemovedEventArgs\">\n      <summary>\n        <para>Contains data supplied to a XRPlaneSubsystem.PlaneRemoved event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.PlaneRemovedEventArgs.Plane\">\n      <summary>\n        <para>The BoundedPlane that was removed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.PlaneRemovedEventArgs.PlaneSubsystem\">\n      <summary>\n        <para>A reference to the XRPlaneSubsystem object from which the event originated.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.PlaneUpdatedEventArgs\">\n      <summary>\n        <para>Contains data supplied to a XRPlaneSubsystem.PlaneUpdated event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.PlaneUpdatedEventArgs.Plane\">\n      <summary>\n        <para>The BoundedPlane that was updated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.PlaneUpdatedEventArgs.PlaneSubsystem\">\n      <summary>\n        <para>A reference to the XRPlaneSubsystem object from which the event originated.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.PointCloudUpdatedEventArgs\">\n      <summary>\n        <para>Contains data supplied to a XRDepth.PointCloudUpdated event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.PointCloudUpdatedEventArgs.DepthSubsystem\">\n      <summary>\n        <para>A reference to the XRDepthSubsystem object from which the event originated.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.ReferencePoint\">\n      <summary>\n        <para>Describes the transform data of a real-world point.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.ReferencePoint.Id\">\n      <summary>\n        <para>ID for the reference point that is unique across the session.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.ReferencePoint.Pose\">\n      <summary>\n        <para>The pose (position and rotation) of the reference point. Respond to changes in this pose to correct for changes in the device's understanding of where this point is in the real world.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.ReferencePoint.TrackingState\">\n      <summary>\n        <para>The TrackingState of the reference point.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.ReferencePointUpdatedEventArgs\">\n      <summary>\n        <para>Data to be passed to the user when the device corrects its understanding of the world enough that the ReferencePoint's position or rotation has changed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.ReferencePointUpdatedEventArgs.PreviousPose\">\n      <summary>\n        <para>The previous Pose of the ReferencePoint, prior to this event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.ReferencePointUpdatedEventArgs.PreviousTrackingState\">\n      <summary>\n        <para>The previous TrackingState of the ReferencePoint, prior to this event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.ReferencePointUpdatedEventArgs.ReferencePoint\">\n      <summary>\n        <para>The reference point that has the value of its position, rotation, or both changed enough through the device correcting its understanding of where this point should be located in device space.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.SessionTrackingStateChangedEventArgs\">\n      <summary>\n        <para>Structure defining Tracking State Changed event arguments passed when tracking state changes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.SessionTrackingStateChangedEventArgs.NewState\">\n      <summary>\n        <para>New Tracking State.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.SessionTrackingStateChangedEventArgs.SessionSubsystem\">\n      <summary>\n        <para>Reference to the XRSessionSubsystem object associated with the event.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.TrackableId\">\n      <summary>\n        <para>A session-unique identifier for trackables in the environment, e.g., planes and feature points.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.TrackableId.InvalidId\">\n      <summary>\n        <para>Represents an invalid id.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.TrackableId.ToString\">\n      <summary>\n        <para>Generates a nicely formatted version of the id.</para>\n      </summary>\n      <returns>\n        <para>A string unique to this id</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.TrackableType\">\n      <summary>\n        <para>A trackable is feature in the physical environment that a device is able to track, such as a plane.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.XR.TrackableType.All\">\n      <summary>\n        <para>All trackables (planes and point cloud)</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.XR.TrackableType.FeaturePoint\">\n      <summary>\n        <para>A feature point.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.XR.TrackableType.None\">\n      <summary>\n        <para>No trackable.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.XR.TrackableType.PlaneEstimated\">\n      <summary>\n        <para>An estimated plane.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.XR.TrackableType.Planes\">\n      <summary>\n        <para>Any of the plane types.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.XR.TrackableType.PlaneWithinBounds\">\n      <summary>\n        <para>Within the BoundedPlane.Size of a BoundedPlane</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.XR.TrackableType.PlaneWithinInfinity\">\n      <summary>\n        <para>The infinite plane of a BoundedPlane</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.XR.TrackableType.PlaneWithinPolygon\">\n      <summary>\n        <para>The boundary of a BoundedPlane</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.TrackingState\">\n      <summary>\n        <para>Current tracking state of the device.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.XR.TrackingState.Tracking\">\n      <summary>\n        <para>Tracking is currently working.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.XR.TrackingState.Unavailable\">\n      <summary>\n        <para>Tracking is not available.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Experimental.XR.TrackingState.Unknown\">\n      <summary>\n        <para>Tracking state is unknown.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.XRCameraSubsystem\">\n      <summary>\n        <para>Provides access to a device's camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRCameraSubsystem.Camera\">\n      <summary>\n        <para>Set current Camera component within the app to be used by this XRCameraInstance.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.XR.XRCameraSubsystem.FrameReceived(System.Action`1&lt;UnityEngine.Experimental.XR.FrameReceivedEventArgs&gt;)\">\n      <summary>\n        <para>Event raised when a new camera frame is received.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRCameraSubsystem.GetTextures(System.Collections.Generic.List`1&lt;UnityEngine.Texture2D&gt;)\">\n      <summary>\n        <para>Fills the provided texturesOut with the texture(s) associated with the XRCameraSubsystem.</para>\n      </summary>\n      <param name=\"texturesOut\">A List of Texture2D to be filled. Passing null will throw an ArgumentNullException.</param>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRCameraSubsystem.LastUpdatedFrame\">\n      <summary>\n        <para>The frame during which the camera subsystem was last successfully updated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRCameraSubsystem.LightEstimationRequested\">\n      <summary>\n        <para>True if the XRCameraSubsystem should try to provide light estimation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRCameraSubsystem.Material\">\n      <summary>\n        <para>Set current Material to be used while rendering to the render target.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRCameraSubsystem.TryGetAverageBrightness(System.Single&amp;)\">\n      <summary>\n        <para>Provides brightness for the whole image as an average of all pixels' brightness.</para>\n      </summary>\n      <param name=\"averageBrightness\">An estimated average brightness for the environment.</param>\n      <returns>\n        <para>Returns true if average brigthness was provided.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRCameraSubsystem.TryGetAverageColorTemperature(System.Single&amp;)\">\n      <summary>\n        <para>Provides color temperature for the whole image as an average of all pixels' color temperature.</para>\n      </summary>\n      <param name=\"averageColorTemperature\">An estimated color temperature.</param>\n      <returns>\n        <para>Return true if succesful.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRCameraSubsystem.TryGetDisplayMatrix(UnityEngine.Matrix4x4&amp;)\">\n      <summary>\n        <para>Provides display matrix defining how texture is being rendered on the screen.</para>\n      </summary>\n      <param name=\"displayMatrix\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRCameraSubsystem.TryGetProjectionMatrix(UnityEngine.Matrix4x4&amp;)\">\n      <summary>\n        <para>Provides projection matrix used by camera subsystem.</para>\n      </summary>\n      <param name=\"projectionMatrix\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRCameraSubsystem.TryGetShaderName(System.String&amp;)\">\n      <summary>\n        <para>Provides shader name used by Camera subsystem to render texture.</para>\n      </summary>\n      <param name=\"shaderName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRCameraSubsystem.TryGetTimestamp(System.Int64&amp;)\">\n      <summary>\n        <para>Provides timestamp.</para>\n      </summary>\n      <param name=\"timestampNs\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.XRCameraSubsystemDescriptor\">\n      <summary>\n        <para>Class providing information about  XRCameraSubsystem registration.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRCameraSubsystemDescriptor.ProvidesAverageBrightness\">\n      <summary>\n        <para>Specifies if current subsystem is allowed to provide average brightness.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRCameraSubsystemDescriptor.ProvidesAverageColorTemperature\">\n      <summary>\n        <para>Specifies if current subsystem is allowed to provide average camera temperature.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRCameraSubsystemDescriptor.ProvidesDisplayMatrix\">\n      <summary>\n        <para>Specifies if current subsystem is allowed to provide display matrix.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRCameraSubsystemDescriptor.ProvidesProjectionMatrix\">\n      <summary>\n        <para>Specifies if current subsystem is allowed to provide projection matrix.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRCameraSubsystemDescriptor.ProvidesTimestamp\">\n      <summary>\n        <para>Specifies if current subsystem is allowed to provide timestamp.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.XRDepthSubsystem\">\n      <summary>\n        <para>Provides access to depth data of the physical environment, such as a point cloud.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRDepthSubsystem.GetConfidence(System.Collections.Generic.List`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Retrieves the confidence values for each point in the point cloud.</para>\n      </summary>\n      <param name=\"confidenceOut\">A list of floats containing all confidence values for the point cloud.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRDepthSubsystem.GetPoints(System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;)\">\n      <summary>\n        <para>Retrieves the point cloud points.</para>\n      </summary>\n      <param name=\"pointsOut\">A list of Vector3s containing all points in the point cloud.</param>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRDepthSubsystem.LastUpdatedFrame\">\n      <summary>\n        <para>The frame during which the point cloud was last updated.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.XR.XRDepthSubsystem.PointCloudUpdated(System.Action`1&lt;UnityEngine.Experimental.XR.PointCloudUpdatedEventArgs&gt;)\">\n      <summary>\n        <para>Raised once during each frame in which the point cloud is updated.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.XRDepthSubsystemDescriptor\">\n      <summary>\n        <para>Class providing information about XRDepthSubsystem registration.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRDepthSubsystemDescriptor.SupportsFeaturePoints\">\n      <summary>\n        <para>When true, XRDepthSubsystem will provide list of feature points detected so far.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.XRInputSubsystem\">\n      <summary>\n        <para>XRInputSubsystem\nInstance is used to enable and disable the inputs coming from a specific plugin.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.XRInputSubsystemDescriptor\">\n      <summary>\n        <para>Information about an Input subsystem.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRInputSubsystemDescriptor.disablesLegacyInput\">\n      <summary>\n        <para>When true, will suppress legacy support for Daydream, Oculus, OpenVR, and Windows MR built directly into the Unity runtime from generating input. This is useful when adding an XRInputSubsystem that supports these devices.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.XRPlaneSubsystem\">\n      <summary>\n        <para>Provides methods, events, and properties that provides information about planes detected in the environment. </para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRPlaneSubsystem.GetAllPlanes(System.Collections.Generic.List`1&lt;UnityEngine.Experimental.XR.BoundedPlane&gt;)\">\n      <summary>\n        <para>Get all the BoundedPlanes currently tracked by the system.</para>\n      </summary>\n      <param name=\"planesOut\">A list of BoundedPlanes containing all planes currently tracked by the system.</param>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRPlaneSubsystem.LastUpdatedFrame\">\n      <summary>\n        <para>The frame during which the planes were last updated.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.XR.XRPlaneSubsystem.PlaneAdded(System.Action`1&lt;UnityEngine.Experimental.XR.PlaneAddedEventArgs&gt;)\">\n      <summary>\n        <para>Raised for each BoundedPlane that has been added in the current frame.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.XR.XRPlaneSubsystem.PlaneRemoved(System.Action`1&lt;UnityEngine.Experimental.XR.PlaneRemovedEventArgs&gt;)\">\n      <summary>\n        <para>Raised for each BoundedPlane that has been removed in the current frame.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.XR.XRPlaneSubsystem.PlaneUpdated(System.Action`1&lt;UnityEngine.Experimental.XR.PlaneUpdatedEventArgs&gt;)\">\n      <summary>\n        <para>Raised for each plane that has been updated in the current frame.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRPlaneSubsystem.TryGetPlane(UnityEngine.Experimental.XR.TrackableId,UnityEngine.Experimental.XR.BoundedPlane&amp;)\">\n      <summary>\n        <para>Get a BoundedPlane by TrackableId</para>\n      </summary>\n      <param name=\"planeId\">The session-unique TrackableId of the plane to get.</param>\n      <param name=\"plane\">The BoundedPlane with the supplied planeId</param>\n      <returns>\n        <para>True if the BoundedPlane with planeId exists, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRPlaneSubsystem.TryGetPlaneBoundary(UnityEngine.Experimental.XR.TrackableId,System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;)\">\n      <summary>\n        <para>Try to retrieve a list of positions in device space describing the current plane boundary.</para>\n      </summary>\n      <param name=\"planeId\">The session-unique TrackableId of the plane.</param>\n      <param name=\"boundaryOut\">A list of vertices representing the plane's boundary.</param>\n      <returns>\n        <para>True if the plane exists (i.e., is still being tracked), otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.XRPlaneSubsystemDescriptor\">\n      <summary>\n        <para>Class providing information about XRPlaneSubsystem registration.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.XRRaycastHit\">\n      <summary>\n        <para>Structure describing the result of a XRRaycastSubsystem.Raycast hit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRRaycastHit.Distance\">\n      <summary>\n        <para>The distance, in meters, from the screen to the hit's XRRaycastSubsystemHit.Position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRRaycastHit.HitType\">\n      <summary>\n        <para>The TrackableType(s) that were hit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRRaycastHit.Pose\">\n      <summary>\n        <para>The position and rotation of the hit result in device space where the ray hit the trackable.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRRaycastHit.TrackableId\">\n      <summary>\n        <para>The TrackableId of the trackable that was hit by the raycast.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.XRRaycastSubsystem\">\n      <summary>\n        <para>Provides methods and properties that allow for querying portions of the physical environment that are near a provided specified ray. These trackables include planes and depth data.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRRaycastSubsystem.Raycast(UnityEngine.Vector3,System.Collections.Generic.List`1&lt;UnityEngine.Experimental.XR.XRRaycastHit&gt;,UnityEngine.Experimental.XR.TrackableType)\">\n      <summary>\n        <para>Casts a ray from a screen point against selected trackables (e.g., planes and feature points).</para>\n      </summary>\n      <param name=\"screenPoint\">The screen point from which to cast.</param>\n      <param name=\"hitResults\">The resulting list of XRRaycastHit.</param>\n      <param name=\"trackableTypeMask\">An optional mask of TrackableType to raycast against.</param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRRaycastSubsystem.Raycast(UnityEngine.Ray,UnityEngine.Experimental.XR.XRDepthSubsystem,UnityEngine.Experimental.XR.XRPlaneSubsystem,System.Collections.Generic.List`1&lt;UnityEngine.Experimental.XR.XRRaycastHit&gt;,UnityEngine.Experimental.XR.TrackableType,System.Single)\">\n      <summary>\n        <para>Casts a ray using ray against selected trackables (e.g., planes and feature points).</para>\n      </summary>\n      <param name=\"ray\">The Ray to use.</param>\n      <param name=\"depthSubsystem\">The XRDepthSubsystem to raycast against. May be null.</param>\n      <param name=\"planeSubsystem\">The XRPlaneSubsystem to raycast against. May be null.</param>\n      <param name=\"hitResults\">The resulting list of XRRaycastHit.</param>\n      <param name=\"trackableTypeMask\">An optional mask of TrackableType to raycast against.</param>\n      <param name=\"pointCloudRaycastAngleInDegrees\">When raycasting against feature points, cast a cone with this angle.</param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.XRRaycastSubsystemDescriptor\">\n      <summary>\n        <para>Class providing information about XRRaycastSubsystem registration.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.XRReferencePointSubsystem\">\n      <summary>\n        <para>Provides methods and properties that allow for querying, creating, and removing of reference points. These reference points are cues to the XRSessionSubsystem that indicate areas of interest in the environment which helps assure that tracking of these points remains accurate.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRReferencePointSubsystem.GetAllReferencePoints(System.Collections.Generic.List`1&lt;UnityEngine.Experimental.XR.ReferencePoint&gt;)\">\n      <summary>\n        <para>Retrieves all ReferencePoints added by calls to XRReferencePointSubsystem.TryAddReferencePoint.</para>\n      </summary>\n      <param name=\"referencePointsOut\">A list of ReferencePoints containing all reference points.</param>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRReferencePointSubsystem.LastUpdatedFrame\">\n      <summary>\n        <para>The frame during which the reference points were last updated.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.XR.XRReferencePointSubsystem.ReferencePointUpdated(System.Action`1&lt;UnityEngine.Experimental.XR.ReferencePointUpdatedEventArgs&gt;)\">\n      <summary>\n        <para>Raised each frame for each ReferencePoint that had the values of its position, rotation, or both changed enough by the device correcting its understanding of where the point should be located in Unity space.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRReferencePointSubsystem.TryAddReferencePoint(UnityEngine.Vector3,UnityEngine.Quaternion,UnityEngine.Experimental.XR.TrackableId&amp;)\">\n      <summary>\n        <para>Attempt to add a ReferencePoint that gets tracked by the device.</para>\n      </summary>\n      <param name=\"position\">Current position, in device space, of a point you want the device to track.</param>\n      <param name=\"rotation\">Current rotation, in device space, of a point you want the device to track.</param>\n      <param name=\"referencePointId\">If this method returns true, this is filled out with the ID (unique to the session) of the point.</param>\n      <returns>\n        <para>If the ReferencePoint was added successfully, this method returns true. Otherwise, it returns false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRReferencePointSubsystem.TryAddReferencePoint(UnityEngine.Pose,UnityEngine.Experimental.XR.TrackableId&amp;)\">\n      <summary>\n        <para>Attempt to add a ReferencePoint that gets tracked by the device.</para>\n      </summary>\n      <param name=\"pose\">Current pose, in device space, of a point you want the device to track.</param>\n      <param name=\"referencePointId\">If this method returns true, this is filled out with the ID (unique to the session) of the point.</param>\n      <returns>\n        <para>If the ReferencePoint was added successfully, this method returns true. Otherwise, it returns false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRReferencePointSubsystem.TryGetReferencePoint(UnityEngine.Experimental.XR.TrackableId,UnityEngine.Experimental.XR.ReferencePoint&amp;)\">\n      <summary>\n        <para>Attempt to retrieve a ReferencePoint.</para>\n      </summary>\n      <param name=\"referencePointId\">The ID of the ReferencePoint that TryAddReferencePoint filled out when you added this point.</param>\n      <param name=\"referencePoint\">The ReferencePoint to be filled out that matches the ID passed in.</param>\n      <returns>\n        <para>If the ReferencePoint was found and filled out successfully, this method returns true. Otherwise, it return false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Experimental.XR.XRReferencePointSubsystem.TryRemoveReferencePoint(UnityEngine.Experimental.XR.TrackableId)\">\n      <summary>\n        <para>Attempt to remove a ReferencePoint getting tracked by the device.</para>\n      </summary>\n      <param name=\"referencePointId\">ID of the ReferencePoint you wish to remove so the device no longer tries to track it.</param>\n      <returns>\n        <para>If the ReferencePoint was removed successfully, this method returns true. Otherwise, it returns false.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.XRReferencePointSubsystemDescriptor\">\n      <summary>\n        <para>Class providing information about XRReferencePointSubsystem registration.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.XRSessionSubsystem\">\n      <summary>\n        <para>A collection of methods and properties used to interact with and configure an XR session.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRSessionSubsystem.LastUpdatedFrame\">\n      <summary>\n        <para>The frame during which the tracking state was last updated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Experimental.XR.XRSessionSubsystem.TrackingState\">\n      <summary>\n        <para>Get current tracking status of the device.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Experimental.XR.XRSessionSubsystem.TrackingStateChanged(System.Action`1&lt;UnityEngine.Experimental.XR.SessionTrackingStateChangedEventArgs&gt;)\">\n      <summary>\n        <para>Raised when the TrackingState changes.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Experimental.XR.XRSessionSubsystemDescriptor\">\n      <summary>\n        <para>Class providing information about XRSessionSubsystem registration.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ExposedPropertyResolver\">\n      <summary>\n        <para>Object that is used to resolve references to an ExposedReference field.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ExposedReference`1\">\n      <summary>\n        <para>Creates a type whos value is resolvable at runtime.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ExposedReference_1.defaultValue\">\n      <summary>\n        <para>The default value, in case the value cannot be resolved.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ExposedReference_1.exposedName\">\n      <summary>\n        <para>The name of the ExposedReference.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ExposedReference_1.Resolve\">\n      <summary>\n        <para>Gets the value of the reference by resolving it given the ExposedPropertyResolver context object.</para>\n      </summary>\n      <param name=\"resolver\">The ExposedPropertyResolver context object.</param>\n      <returns>\n        <para>The resolved reference value.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.FFTWindow\">\n      <summary>\n        <para>Spectrum analysis windowing types.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FFTWindow.Blackman\">\n      <summary>\n        <para>W[n] = 0.42 - (0.5 * COS(nN) ) + (0.08 * COS(2.0 * nN) ).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FFTWindow.BlackmanHarris\">\n      <summary>\n        <para>W[n] = 0.35875 - (0.48829 * COS(1.0 * nN)) + (0.14128 * COS(2.0 * nN)) - (0.01168 * COS(3.0 * n/N)).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FFTWindow.Hamming\">\n      <summary>\n        <para>W[n] = 0.54 - (0.46 * COS(n/N) ).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FFTWindow.Hanning\">\n      <summary>\n        <para>W[n] = 0.5 * (1.0 - COS(n/N) ).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FFTWindow.Rectangular\">\n      <summary>\n        <para>W[n] = 1.0.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FFTWindow.Triangle\">\n      <summary>\n        <para>W[n] = TRI(2n/N).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.FilterMode\">\n      <summary>\n        <para>Filtering mode for textures. Corresponds to the settings in a.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FilterMode.Bilinear\">\n      <summary>\n        <para>Bilinear filtering - texture samples are averaged.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FilterMode.Point\">\n      <summary>\n        <para>Point filtering - texture pixels become blocky up close.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FilterMode.Trilinear\">\n      <summary>\n        <para>Trilinear filtering - texture samples are averaged and also blended between mipmap levels.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.FingerDof\">\n      <summary>\n        <para>Enumeration of all the muscles in a finger.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FingerDof.DistalCloseOpen\">\n      <summary>\n        <para>The distal close-open muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FingerDof.IntermediateCloseOpen\">\n      <summary>\n        <para>The intermediate close-open muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FingerDof.LastFingerDof\">\n      <summary>\n        <para>The last value of the FingerDof enum.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FingerDof.ProximalDownUp\">\n      <summary>\n        <para>The proximal down-up muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FingerDof.ProximalInOut\">\n      <summary>\n        <para>The proximal in-out muscle.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.FixedJoint\">\n      <summary>\n        <para>The Fixed joint groups together 2 rigidbodies, making them stick together in their bound position.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.FixedJoint2D\">\n      <summary>\n        <para>Connects two Rigidbody2D together at their anchor points using a configurable spring.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.FixedJoint2D.dampingRatio\">\n      <summary>\n        <para>The amount by which the spring force is reduced in proportion to the movement speed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.FixedJoint2D.frequency\">\n      <summary>\n        <para>The frequency at which the spring oscillates around the distance between the objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.FixedJoint2D.referenceAngle\">\n      <summary>\n        <para>The angle referenced between the two bodies used as the constraint for the joint.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Flare\">\n      <summary>\n        <para>A flare asset. Read more about flares in the.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.FlareLayer\">\n      <summary>\n        <para>FlareLayer component.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.FocusType\">\n      <summary>\n        <para>Used by GUIUtility.GetControlID to inform the IMGUI system if a given control can get keyboard focus. This allows the IMGUI system to give focus appropriately when a user presses tab for cycling between controls.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FocusType.Keyboard\">\n      <summary>\n        <para>This control can receive keyboard focus.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FocusType.Passive\">\n      <summary>\n        <para>This control can not receive keyboard focus.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.FogMode\">\n      <summary>\n        <para>Fog mode to use.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FogMode.Exponential\">\n      <summary>\n        <para>Exponential fog.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FogMode.ExponentialSquared\">\n      <summary>\n        <para>Exponential squared fog (default).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FogMode.Linear\">\n      <summary>\n        <para>Linear fog.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Font\">\n      <summary>\n        <para>Script interface for.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Font.ascent\">\n      <summary>\n        <para>The ascent of the font.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Font.characterInfo\">\n      <summary>\n        <para>Access an array of all characters contained in the font texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Font.dynamic\">\n      <summary>\n        <para>Is the font a dynamic font.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Font.fontSize\">\n      <summary>\n        <para>The default size of the font.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Font.lineHeight\">\n      <summary>\n        <para>The line height of the font.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Font.material\">\n      <summary>\n        <para>The material used for the font display.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Font.textureRebuilt(System.Action`1&lt;UnityEngine.Font&gt;)\">\n      <summary>\n        <para>Set a function to be called when the dynamic font texture is rebuilt.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Font.CreateDynamicFontFromOSFont(System.String,System.Int32)\">\n      <summary>\n        <para>Creates a Font object which lets you render a font installed on the user machine.</para>\n      </summary>\n      <param name=\"fontname\">The name of the OS font to use for this font object.</param>\n      <param name=\"size\">The default character size of the generated font.</param>\n      <param name=\"fontnames\">Am array of names of OS fonts to use for this font object. When rendering characters using this font object, the first font which is installed on the machine, which contains the requested character will be used.</param>\n      <returns>\n        <para>The generate Font object.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Font.CreateDynamicFontFromOSFont(System.String[],System.Int32)\">\n      <summary>\n        <para>Creates a Font object which lets you render a font installed on the user machine.</para>\n      </summary>\n      <param name=\"fontname\">The name of the OS font to use for this font object.</param>\n      <param name=\"size\">The default character size of the generated font.</param>\n      <param name=\"fontnames\">Am array of names of OS fonts to use for this font object. When rendering characters using this font object, the first font which is installed on the machine, which contains the requested character will be used.</param>\n      <returns>\n        <para>The generate Font object.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Font.#ctor\">\n      <summary>\n        <para>Create a new Font.</para>\n      </summary>\n      <param name=\"name\">The name of the created Font object.</param>\n    </member>\n    <member name=\"M:UnityEngine.Font.#ctor(System.String)\">\n      <summary>\n        <para>Create a new Font.</para>\n      </summary>\n      <param name=\"name\">The name of the created Font object.</param>\n    </member>\n    <member name=\"M:UnityEngine.Font.GetCharacterInfo(System.Char,UnityEngine.CharacterInfo&amp;)\">\n      <summary>\n        <para>Get rendering info for a specific character.</para>\n      </summary>\n      <param name=\"ch\">The character you need rendering information for.</param>\n      <param name=\"info\">Returns the CharacterInfo struct with the rendering information for the character (if available).</param>\n      <param name=\"size\">The size of the character (default value of zero will use font default size).</param>\n      <param name=\"style\">The style of the character.</param>\n    </member>\n    <member name=\"M:UnityEngine.Font.GetCharacterInfo(System.Char,UnityEngine.CharacterInfo&amp;,System.Int32)\">\n      <summary>\n        <para>Get rendering info for a specific character.</para>\n      </summary>\n      <param name=\"ch\">The character you need rendering information for.</param>\n      <param name=\"info\">Returns the CharacterInfo struct with the rendering information for the character (if available).</param>\n      <param name=\"size\">The size of the character (default value of zero will use font default size).</param>\n      <param name=\"style\">The style of the character.</param>\n    </member>\n    <member name=\"M:UnityEngine.Font.GetCharacterInfo(System.Char,UnityEngine.CharacterInfo&amp;,System.Int32,UnityEngine.FontStyle)\">\n      <summary>\n        <para>Get rendering info for a specific character.</para>\n      </summary>\n      <param name=\"ch\">The character you need rendering information for.</param>\n      <param name=\"info\">Returns the CharacterInfo struct with the rendering information for the character (if available).</param>\n      <param name=\"size\">The size of the character (default value of zero will use font default size).</param>\n      <param name=\"style\">The style of the character.</param>\n    </member>\n    <member name=\"M:UnityEngine.Font.GetMaxVertsForString(System.String)\">\n      <summary>\n        <para>Returns the maximum number of verts that the text generator may return for a given string.</para>\n      </summary>\n      <param name=\"str\">Input string.</param>\n    </member>\n    <member name=\"M:UnityEngine.Font.GetOSInstalledFontNames\">\n      <summary>\n        <para>Get names of fonts installed on the machine.</para>\n      </summary>\n      <returns>\n        <para>An array of the names of all fonts installed on the machine.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Font.HasCharacter(System.Char)\">\n      <summary>\n        <para>Does this font have a specific character?</para>\n      </summary>\n      <param name=\"c\">The character to check for.</param>\n      <returns>\n        <para>Whether or not the font has the character specified.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Font.RequestCharactersInTexture(System.String,System.Int32,UnityEngine.FontStyle)\">\n      <summary>\n        <para>Request characters to be added to the font texture (dynamic fonts only).</para>\n      </summary>\n      <param name=\"characters\">The characters which are needed to be in the font texture.</param>\n      <param name=\"size\">The size of the requested characters (the default value of zero will use the font's default size).</param>\n      <param name=\"style\">The style of the requested characters.</param>\n    </member>\n    <member name=\"T:UnityEngine.FontStyle\">\n      <summary>\n        <para>Font Style applied to GUI Texts, Text Meshes or GUIStyles.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FontStyle.Bold\">\n      <summary>\n        <para>Bold style applied to your texts.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FontStyle.BoldAndItalic\">\n      <summary>\n        <para>Bold and Italic styles applied to your texts.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FontStyle.Italic\">\n      <summary>\n        <para>Italic style applied to your texts.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FontStyle.Normal\">\n      <summary>\n        <para>No special style is applied.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ForceMode\">\n      <summary>\n        <para>Use ForceMode to specify how to apply a force using Rigidbody.AddForce.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ForceMode.Acceleration\">\n      <summary>\n        <para>Add a continuous acceleration to the rigidbody, ignoring its mass.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ForceMode.Force\">\n      <summary>\n        <para>Add a continuous force to the rigidbody, using its mass.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ForceMode.Impulse\">\n      <summary>\n        <para>Add an instant force impulse to the rigidbody, using its mass.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ForceMode.VelocityChange\">\n      <summary>\n        <para>Add an instant velocity change to the rigidbody, ignoring its mass.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ForceMode2D\">\n      <summary>\n        <para>Option for how to apply a force using Rigidbody2D.AddForce.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ForceMode2D.Force\">\n      <summary>\n        <para>Add a force to the Rigidbody2D, using its mass.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ForceMode2D.Impulse\">\n      <summary>\n        <para>Add an instant force impulse to the rigidbody2D, using its mass.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.FrameTiming\">\n      <summary>\n        <para>Struct containing basic FrameTimings and accompanying relevant data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FrameTiming.cpuFrameTime\">\n      <summary>\n        <para>The CPU time for a given frame, in ms.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FrameTiming.cpuTimeFrameComplete\">\n      <summary>\n        <para>This is the CPU clock time at the point GPU finished rendering the frame and interrupted the CPU.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FrameTiming.cpuTimePresentCalled\">\n      <summary>\n        <para>This is the CPU clock time at the point Present was called for the current frame.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FrameTiming.gpuFrameTime\">\n      <summary>\n        <para>The GPU time for a given frame, in ms.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FrameTiming.heightScale\">\n      <summary>\n        <para>This was the height scale factor of the Dynamic Resolution system(if used) for the given frame and the linked frame timings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FrameTiming.syncInterval\">\n      <summary>\n        <para>This was the vsync mode for the given frame and the linked frame timings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FrameTiming.widthScale\">\n      <summary>\n        <para>This was the width scale factor of the Dynamic Resolution system(if used) for the given frame and the linked frame timings.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.FrameTimingManager\">\n      <summary>\n        <para>The FrameTimingManager allows the user to capture and access FrameTiming data for multple frames.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.FrameTimingManager.CaptureFrameTimings\">\n      <summary>\n        <para>This function triggers the FrameTimingManager to capture a snapshot of FrameTiming's data, that can then be accessed by the user.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.FrameTimingManager.GetCpuTimerFrequency\">\n      <summary>\n        <para>This returns the frequency of CPU timer on the current platform, used to interpret timing results. If the platform does not support returning this value it will return 0.</para>\n      </summary>\n      <returns>\n        <para>CPU timer frequency for current platform.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.FrameTimingManager.GetGpuTimerFrequency\">\n      <summary>\n        <para>This returns the frequency of GPU timer on the current platform, used to interpret timing results. If the platform does not support returning this value it will return 0.</para>\n      </summary>\n      <returns>\n        <para>GPU timer frequency for current platform.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.FrameTimingManager.GetLatestTimings(System.UInt32,UnityEngine.FrameTiming[])\">\n      <summary>\n        <para>Allows the user to access the currently captured FrameTimings.</para>\n      </summary>\n      <param name=\"numFrames\">User supplies a desired number of frames they would like FrameTimings for. This should be equal to or less than the maximum FrameTimings the platform can capture.</param>\n      <param name=\"timings\">An array of FrameTiming structs that is passed in by the user and will be filled with data as requested. It is the users job to make sure the array that is passed is large enough to hold the requested number of FrameTimings.</param>\n      <returns>\n        <para>Returns the number of FrameTimings it actually was able to get. This will always be equal to or less than the requested numFrames depending on availability of captured FrameTimings.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.FrameTimingManager.GetVSyncsPerSecond\">\n      <summary>\n        <para>This returns the number of vsyncs per second on the current platform, used to interpret timing results. If the platform does not support returning this value it will return 0.</para>\n      </summary>\n      <returns>\n        <para>Number of vsyncs per second of the current platform.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.FrictionJoint2D\">\n      <summary>\n        <para>Applies both force and torque to reduce both the linear and angular velocities to zero.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.FrictionJoint2D.maxForce\">\n      <summary>\n        <para>The maximum force that can be generated when trying to maintain the friction joint constraint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.FrictionJoint2D.maxTorque\">\n      <summary>\n        <para>The maximum torque that can be generated when trying to maintain the friction joint constraint.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.FrustumPlanes\">\n      <summary>\n        <para>This struct contains the view space coordinates of the near projection plane.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FrustumPlanes.bottom\">\n      <summary>\n        <para>Position in view space of the bottom side of the near projection plane.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FrustumPlanes.left\">\n      <summary>\n        <para>Position in view space of the left side of the near projection plane.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FrustumPlanes.right\">\n      <summary>\n        <para>Position in view space of the right side of the near projection plane.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FrustumPlanes.top\">\n      <summary>\n        <para>Position in view space of the top side of the near projection plane.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FrustumPlanes.zFar\">\n      <summary>\n        <para>Z distance from the origin of view space to the far projection plane.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FrustumPlanes.zNear\">\n      <summary>\n        <para>Z distance from the origin of view space to the near projection plane.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.FullScreenMode\">\n      <summary>\n        <para>Platform agnostic fullscreen mode. Not all platforms support all modes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FullScreenMode.ExclusiveFullScreen\">\n      <summary>\n        <para>Exclusive Mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FullScreenMode.FullScreenWindow\">\n      <summary>\n        <para>Fullscreen window.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FullScreenMode.MaximizedWindow\">\n      <summary>\n        <para>Maximized window.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FullScreenMode.Windowed\">\n      <summary>\n        <para>Windowed.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.FullScreenMovieControlMode\">\n      <summary>\n        <para>Describes options for displaying movie playback controls.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FullScreenMovieControlMode.CancelOnInput\">\n      <summary>\n        <para>Do not display any controls, but cancel movie playback if input occurs.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FullScreenMovieControlMode.Full\">\n      <summary>\n        <para>Display the standard controls for controlling movie playback.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FullScreenMovieControlMode.Hidden\">\n      <summary>\n        <para>Do not display any controls.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FullScreenMovieControlMode.Minimal\">\n      <summary>\n        <para>Display minimal set of controls controlling movie playback.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.FullScreenMovieScalingMode\">\n      <summary>\n        <para>Describes scaling modes for displaying movies.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FullScreenMovieScalingMode.AspectFill\">\n      <summary>\n        <para>Scale the movie until the movie fills the entire screen.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FullScreenMovieScalingMode.AspectFit\">\n      <summary>\n        <para>Scale the movie until one dimension fits on the screen exactly.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FullScreenMovieScalingMode.Fill\">\n      <summary>\n        <para>Scale the movie until both dimensions fit the screen exactly.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.FullScreenMovieScalingMode.None\">\n      <summary>\n        <para>Do not scale the movie.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.GameObject\">\n      <summary>\n        <para>Base class for all entities in Unity scenes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.activeInHierarchy\">\n      <summary>\n        <para>Defines whether the GameObject is active in the Scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.activeSelf\">\n      <summary>\n        <para>The local active state of this GameObject. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.animation\">\n      <summary>\n        <para>The Animation attached to this GameObject (Read Only). (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.audio\">\n      <summary>\n        <para>The AudioSource attached to this GameObject (Read Only). (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.camera\">\n      <summary>\n        <para>The Camera attached to this GameObject (Read Only). (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.collider\">\n      <summary>\n        <para>The Collider attached to this GameObject (Read Only). (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.collider2D\">\n      <summary>\n        <para>The Collider2D component attached to this object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.constantForce\">\n      <summary>\n        <para>The ConstantForce attached to this GameObject (Read Only). (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.guiText\">\n      <summary>\n        <para>The GUIText attached to this GameObject (Read Only). (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.guiTexture\">\n      <summary>\n        <para>The GUITexture attached to this GameObject (Read Only). (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.hingeJoint\">\n      <summary>\n        <para>The HingeJoint attached to this GameObject (Read Only). (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.isStatic\">\n      <summary>\n        <para>Editor only API that specifies if a game object is static.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.layer\">\n      <summary>\n        <para>The layer the game object is in. A layer is in the range [0...31].</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.light\">\n      <summary>\n        <para>The Light attached to this GameObject (Read Only). (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.networkView\">\n      <summary>\n        <para>The NetworkView attached to this GameObject (Read Only). (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.particleEmitter\">\n      <summary>\n        <para>The ParticleEmitter attached to this GameObject (Read Only). (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.particleSystem\">\n      <summary>\n        <para>The ParticleSystem attached to this GameObject (Read Only). (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.renderer\">\n      <summary>\n        <para>The Renderer attached to this GameObject (Read Only). (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.rigidbody\">\n      <summary>\n        <para>The Rigidbody attached to this GameObject (Read Only). (Null if there is none attached).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.rigidbody2D\">\n      <summary>\n        <para>The Rigidbody2D component attached to this GameObject. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.scene\">\n      <summary>\n        <para>Scene that the GameObject is part of.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.tag\">\n      <summary>\n        <para>The tag of this game object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GameObject.transform\">\n      <summary>\n        <para>The Transform attached to this GameObject.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.AddComponent(System.String)\">\n      <summary>\n        <para>Adds a component class named className to the game object.</para>\n      </summary>\n      <param name=\"className\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.AddComponent(System.Type)\">\n      <summary>\n        <para>Adds a component class of type componentType to the game object. C# Users can use a generic version.</para>\n      </summary>\n      <param name=\"componentType\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.AddComponent\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.BroadcastMessage(System.String)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object or any of its children.</para>\n      </summary>\n      <param name=\"methodName\"></param>\n      <param name=\"parameter\"></param>\n      <param name=\"options\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.BroadcastMessage(System.String,System.Object)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object or any of its children.</para>\n      </summary>\n      <param name=\"methodName\"></param>\n      <param name=\"parameter\"></param>\n      <param name=\"options\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.BroadcastMessage(System.String,System.Object,UnityEngine.SendMessageOptions)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object or any of its children.</para>\n      </summary>\n      <param name=\"methodName\"></param>\n      <param name=\"parameter\"></param>\n      <param name=\"options\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.BroadcastMessage(System.String,UnityEngine.SendMessageOptions)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"methodName\"></param>\n      <param name=\"options\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.CompareTag(System.String)\">\n      <summary>\n        <para>Is this game object tagged with tag ?</para>\n      </summary>\n      <param name=\"tag\">The tag to compare.</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.CreatePrimitive(UnityEngine.PrimitiveType)\">\n      <summary>\n        <para>Creates a game object with a primitive mesh renderer and appropriate collider.</para>\n      </summary>\n      <param name=\"type\">The type of primitive object to create.</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.#ctor\">\n      <summary>\n        <para>Creates a new game object, named name.</para>\n      </summary>\n      <param name=\"name\">The name that the GameObject is created with.</param>\n      <param name=\"components\">A list of Components to add to the GameObject on creation.</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.#ctor(System.String)\">\n      <summary>\n        <para>Creates a new game object, named name.</para>\n      </summary>\n      <param name=\"name\">The name that the GameObject is created with.</param>\n      <param name=\"components\">A list of Components to add to the GameObject on creation.</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.#ctor(System.String,System.Type[])\">\n      <summary>\n        <para>Creates a new game object, named name.</para>\n      </summary>\n      <param name=\"name\">The name that the GameObject is created with.</param>\n      <param name=\"components\">A list of Components to add to the GameObject on creation.</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.Find(System.String)\">\n      <summary>\n        <para>Finds a GameObject by name and returns it.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.FindGameObjectsWithTag(System.String)\">\n      <summary>\n        <para>Returns a list of active GameObjects tagged tag. Returns empty array if no GameObject was found.</para>\n      </summary>\n      <param name=\"tag\">The name of the tag to search GameObjects for.</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.FindWithTag(System.String)\">\n      <summary>\n        <para>Returns one active GameObject tagged tag. Returns null if no GameObject was found.</para>\n      </summary>\n      <param name=\"tag\">The tag to search for.</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponent(System.Type)\">\n      <summary>\n        <para>Returns the component of Type type if the game object has one attached, null if it doesn't.</para>\n      </summary>\n      <param name=\"type\">The type of Component to retrieve.</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponent\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponent(System.String)\">\n      <summary>\n        <para>Returns the component with name type if the game object has one attached, null if it doesn't.</para>\n      </summary>\n      <param name=\"type\">The type of Component to retrieve.</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponentInChildren(System.Type)\">\n      <summary>\n        <para>Returns the component of Type type in the GameObject or any of its children using depth first search.</para>\n      </summary>\n      <param name=\"type\">The type of Component to retrieve.</param>\n      <param name=\"includeInactive\"></param>\n      <returns>\n        <para>A component of the matching type, if found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponentInChildren(System.Type,System.Boolean)\">\n      <summary>\n        <para>Returns the component of Type type in the GameObject or any of its children using depth first search.</para>\n      </summary>\n      <param name=\"type\">The type of Component to retrieve.</param>\n      <param name=\"includeInactive\"></param>\n      <returns>\n        <para>A component of the matching type, if found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponentInChildren()\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n      <param name=\"includeInactive\"></param>\n      <returns>\n        <para>A component of the matching type, if found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponentInChildren(System.Boolean)\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n      <param name=\"includeInactive\"></param>\n      <returns>\n        <para>A component of the matching type, if found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponentInParent(System.Type)\">\n      <summary>\n        <para>Returns the component of Type type in the GameObject or any of its parents.</para>\n      </summary>\n      <param name=\"type\">Type of component to find.</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponentInParent\">\n      <summary>\n        <para>Returns the component &lt;T&gt; in the GameObject or any of its parents.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponents(System.Type)\">\n      <summary>\n        <para>Returns all components of Type type in the GameObject.</para>\n      </summary>\n      <param name=\"type\">The type of Component to retrieve.</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponents\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponents(System.Type,System.Collections.Generic.List`1&lt;UnityEngine.Component&gt;)\">\n      <summary>\n        <para>Returns all components of Type type in the GameObject into List results. Note that results is of type Component, not the type of the component retrieved.</para>\n      </summary>\n      <param name=\"type\">The type of Component to retrieve.</param>\n      <param name=\"results\">List to receive the results.</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponents(System.Collections.Generic.List`1&lt;T&gt;)\">\n      <summary>\n        <para>Returns all components of Type type in the GameObject into List results.</para>\n      </summary>\n      <param name=\"results\">List of type T to receive the results.</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponentsInChildren(System.Type)\">\n      <summary>\n        <para>Returns all components of Type type in the GameObject or any of its children.</para>\n      </summary>\n      <param name=\"type\">The type of Component to retrieve.</param>\n      <param name=\"includeInactive\">Should Components on inactive GameObjects be included in the found set?</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponentsInChildren(System.Type,System.Boolean)\">\n      <summary>\n        <para>Returns all components of Type type in the GameObject or any of its children.</para>\n      </summary>\n      <param name=\"type\">The type of Component to retrieve.</param>\n      <param name=\"includeInactive\">Should Components on inactive GameObjects be included in the found set?</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponentsInChildren\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n      <param name=\"includeInactive\">Should inactive GameObjects be included in the found set?</param>\n      <returns>\n        <para>A list of all found components matching the specified type.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponentsInChildren(System.Boolean)\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n      <param name=\"includeInactive\">Should inactive GameObjects be included in the found set?</param>\n      <returns>\n        <para>A list of all found components matching the specified type.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponentsInChildren(System.Collections.Generic.List`1&lt;T&gt;)\">\n      <summary>\n        <para>Return all found Components into List results.</para>\n      </summary>\n      <param name=\"results\">List to receive found Components.</param>\n      <param name=\"includeInactive\">Should inactive GameObjects be included in the found set?</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponentsInChildren(System.Boolean,System.Collections.Generic.List`1&lt;T&gt;)\">\n      <summary>\n        <para>Return all found Components into List results.</para>\n      </summary>\n      <param name=\"results\">List to receive found Components.</param>\n      <param name=\"includeInactive\">Should inactive GameObjects be included in the found set?</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponentsInParent(System.Type,System.Boolean)\">\n      <summary>\n        <para>Returns all components of Type type in the GameObject or any of its parents.</para>\n      </summary>\n      <param name=\"type\">The type of Component to retrieve.</param>\n      <param name=\"includeInactive\">Should inactive Components be included in the found set?</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponentsInParent\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n      <param name=\"includeInactive\">Should inactive Components be included in the found set?</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponentsInParent(System.Boolean)\">\n      <summary>\n        <para>Generic version. See the page for more details.</para>\n      </summary>\n      <param name=\"includeInactive\">Should inactive Components be included in the found set?</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.GetComponentsInParent(System.Boolean,System.Collections.Generic.List`1&lt;T&gt;)\">\n      <summary>\n        <para>Find Components in GameObject or parents, and return them in List results.</para>\n      </summary>\n      <param name=\"includeInactive\">Should inactive Components be included in the found set?</param>\n      <param name=\"results\">List holding the found Components.</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.SendMessage(System.String)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object.</para>\n      </summary>\n      <param name=\"methodName\">The name of the method to call.</param>\n      <param name=\"value\">An optional parameter value to pass to the called method.</param>\n      <param name=\"options\">Should an error be raised if the method doesn't exist on the target object?</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.SendMessage(System.String,System.Object)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object.</para>\n      </summary>\n      <param name=\"methodName\">The name of the method to call.</param>\n      <param name=\"value\">An optional parameter value to pass to the called method.</param>\n      <param name=\"options\">Should an error be raised if the method doesn't exist on the target object?</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.SendMessage(System.String,System.Object,UnityEngine.SendMessageOptions)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object.</para>\n      </summary>\n      <param name=\"methodName\">The name of the method to call.</param>\n      <param name=\"value\">An optional parameter value to pass to the called method.</param>\n      <param name=\"options\">Should an error be raised if the method doesn't exist on the target object?</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.SendMessage(System.String,UnityEngine.SendMessageOptions)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"methodName\"></param>\n      <param name=\"options\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.SendMessageUpwards(System.String)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object and on every ancestor of the behaviour.</para>\n      </summary>\n      <param name=\"methodName\">The name of the method to call.</param>\n      <param name=\"value\">An optional parameter value to pass to the called method.</param>\n      <param name=\"options\">Should an error be raised if the method doesn't exist on the target object?</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.SendMessageUpwards(System.String,System.Object)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object and on every ancestor of the behaviour.</para>\n      </summary>\n      <param name=\"methodName\">The name of the method to call.</param>\n      <param name=\"value\">An optional parameter value to pass to the called method.</param>\n      <param name=\"options\">Should an error be raised if the method doesn't exist on the target object?</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.SendMessageUpwards(System.String,System.Object,UnityEngine.SendMessageOptions)\">\n      <summary>\n        <para>Calls the method named methodName on every MonoBehaviour in this game object and on every ancestor of the behaviour.</para>\n      </summary>\n      <param name=\"methodName\">The name of the method to call.</param>\n      <param name=\"value\">An optional parameter value to pass to the called method.</param>\n      <param name=\"options\">Should an error be raised if the method doesn't exist on the target object?</param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.SendMessageUpwards(System.String,UnityEngine.SendMessageOptions)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"methodName\"></param>\n      <param name=\"options\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GameObject.SetActive(System.Boolean)\">\n      <summary>\n        <para>Activates/Deactivates the GameObject.</para>\n      </summary>\n      <param name=\"value\">Activate or deactivation the  object.</param>\n    </member>\n    <member name=\"T:UnityEngine.GeometryUtility\">\n      <summary>\n        <para>Utility class for common geometric functions.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GeometryUtility.CalculateBounds(UnityEngine.Vector3[],UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Calculates a bounding box given an array of positions and a transformation matrix.</para>\n      </summary>\n      <param name=\"positions\"></param>\n      <param name=\"transform\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GeometryUtility.CalculateFrustumPlanes(UnityEngine.Camera)\">\n      <summary>\n        <para>Calculates frustum planes.</para>\n      </summary>\n      <param name=\"camera\">The camera with the view frustum that you want to calculate planes from.</param>\n      <returns>\n        <para>The planes that form the camera's view frustum.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GeometryUtility.CalculateFrustumPlanes(UnityEngine.Camera,UnityEngine.Plane[])\">\n      <summary>\n        <para>Calculates frustum planes.</para>\n      </summary>\n      <param name=\"camera\">The camera with the view frustum that you want to calculate planes from.</param>\n      <param name=\"planes\">An array of 6 Planes that will be overwritten with the calculated plane values.</param>\n    </member>\n    <member name=\"M:UnityEngine.GeometryUtility.CalculateFrustumPlanes(UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Calculates frustum planes.</para>\n      </summary>\n      <param name=\"worldToProjectionMatrix\">A matrix that transforms from world space to projection space, from which the planes will be calculated.</param>\n      <returns>\n        <para>The planes that enclose the projection space described by the matrix.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GeometryUtility.CalculateFrustumPlanes(UnityEngine.Matrix4x4,UnityEngine.Plane[])\">\n      <summary>\n        <para>Calculates frustum planes.</para>\n      </summary>\n      <param name=\"worldToProjectionMatrix\">A matrix that transforms from world space to projection space, from which the planes will be calculated.</param>\n      <param name=\"planes\">An array of 6 Planes that will be overwritten with the calculated plane values.</param>\n    </member>\n    <member name=\"M:UnityEngine.GeometryUtility.TestPlanesAABB(UnityEngine.Plane[],UnityEngine.Bounds)\">\n      <summary>\n        <para>Returns true if bounds are inside the plane array.</para>\n      </summary>\n      <param name=\"planes\"></param>\n      <param name=\"bounds\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GeometryUtility.TryCreatePlaneFromPolygon(UnityEngine.Vector3[],UnityEngine.Plane&amp;)\">\n      <summary>\n        <para>Creates a plane from a given list of vertices. Works for concave polygons and polygons that have multiple aligned vertices.</para>\n      </summary>\n      <param name=\"vertices\">An array of vertex positions that define the shape of a polygon.</param>\n      <param name=\"plane\">If successful, a valid plane that goes through all the vertices.</param>\n      <returns>\n        <para>Returns true on success, false if the algorithm failed to create a plane from the given vertices.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Gizmos\">\n      <summary>\n        <para>Gizmos are used to give visual debugging or setup aids in the scene view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Gizmos.color\">\n      <summary>\n        <para>Sets the color for the gizmos that will be drawn next.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Gizmos.matrix\">\n      <summary>\n        <para>Set the gizmo matrix used to draw all gizmos.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Gizmos.DrawCube(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Draw a solid box with center and size.</para>\n      </summary>\n      <param name=\"center\"></param>\n      <param name=\"size\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Gizmos.DrawFrustum(UnityEngine.Vector3,System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Draw a camera frustum using the currently set Gizmos.matrix for it's location and rotation.</para>\n      </summary>\n      <param name=\"center\">The apex of the truncated pyramid.</param>\n      <param name=\"fov\">Vertical field of view (ie, the angle at the apex in degrees).</param>\n      <param name=\"maxRange\">Distance of the frustum's far plane.</param>\n      <param name=\"minRange\">Distance of the frustum's near plane.</param>\n      <param name=\"aspect\">Width/height ratio.</param>\n    </member>\n    <member name=\"M:UnityEngine.Gizmos.DrawGUITexture(UnityEngine.Rect,UnityEngine.Texture)\">\n      <summary>\n        <para>Draw a texture in the scene.</para>\n      </summary>\n      <param name=\"screenRect\">The size and position of the texture on the \"screen\" defined by the XY plane.</param>\n      <param name=\"texture\">The texture to be displayed.</param>\n      <param name=\"mat\">An optional material to apply the texture.</param>\n      <param name=\"leftBorder\">Inset from the rectangle's left edge.</param>\n      <param name=\"rightBorder\">Inset from the rectangle's right edge.</param>\n      <param name=\"topBorder\">Inset from the rectangle's top edge.</param>\n      <param name=\"bottomBorder\">Inset from the rectangle's bottom edge.</param>\n    </member>\n    <member name=\"M:UnityEngine.Gizmos.DrawGUITexture(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.Material)\">\n      <summary>\n        <para>Draw a texture in the scene.</para>\n      </summary>\n      <param name=\"screenRect\">The size and position of the texture on the \"screen\" defined by the XY plane.</param>\n      <param name=\"texture\">The texture to be displayed.</param>\n      <param name=\"mat\">An optional material to apply the texture.</param>\n      <param name=\"leftBorder\">Inset from the rectangle's left edge.</param>\n      <param name=\"rightBorder\">Inset from the rectangle's right edge.</param>\n      <param name=\"topBorder\">Inset from the rectangle's top edge.</param>\n      <param name=\"bottomBorder\">Inset from the rectangle's bottom edge.</param>\n    </member>\n    <member name=\"M:UnityEngine.Gizmos.DrawGUITexture(UnityEngine.Rect,UnityEngine.Texture,System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Draw a texture in the scene.</para>\n      </summary>\n      <param name=\"screenRect\">The size and position of the texture on the \"screen\" defined by the XY plane.</param>\n      <param name=\"texture\">The texture to be displayed.</param>\n      <param name=\"mat\">An optional material to apply the texture.</param>\n      <param name=\"leftBorder\">Inset from the rectangle's left edge.</param>\n      <param name=\"rightBorder\">Inset from the rectangle's right edge.</param>\n      <param name=\"topBorder\">Inset from the rectangle's top edge.</param>\n      <param name=\"bottomBorder\">Inset from the rectangle's bottom edge.</param>\n    </member>\n    <member name=\"M:UnityEngine.Gizmos.DrawGUITexture(UnityEngine.Rect,UnityEngine.Texture,System.Int32,System.Int32,System.Int32,System.Int32,UnityEngine.Material)\">\n      <summary>\n        <para>Draw a texture in the scene.</para>\n      </summary>\n      <param name=\"screenRect\">The size and position of the texture on the \"screen\" defined by the XY plane.</param>\n      <param name=\"texture\">The texture to be displayed.</param>\n      <param name=\"mat\">An optional material to apply the texture.</param>\n      <param name=\"leftBorder\">Inset from the rectangle's left edge.</param>\n      <param name=\"rightBorder\">Inset from the rectangle's right edge.</param>\n      <param name=\"topBorder\">Inset from the rectangle's top edge.</param>\n      <param name=\"bottomBorder\">Inset from the rectangle's bottom edge.</param>\n    </member>\n    <member name=\"M:UnityEngine.Gizmos.DrawIcon(UnityEngine.Vector3,System.String)\">\n      <summary>\n        <para>Draw an icon at a position in the scene view.</para>\n      </summary>\n      <param name=\"center\"></param>\n      <param name=\"name\"></param>\n      <param name=\"allowScaling\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Gizmos.DrawIcon(UnityEngine.Vector3,System.String,System.Boolean)\">\n      <summary>\n        <para>Draw an icon at a position in the scene view.</para>\n      </summary>\n      <param name=\"center\"></param>\n      <param name=\"name\"></param>\n      <param name=\"allowScaling\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Gizmos.DrawLine(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Draws a line starting at from towards to.</para>\n      </summary>\n      <param name=\"from\"></param>\n      <param name=\"to\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Gizmos.DrawMesh(UnityEngine.Mesh,UnityEngine.Vector3,UnityEngine.Quaternion,UnityEngine.Vector3)\">\n      <summary>\n        <para>Draws a mesh.</para>\n      </summary>\n      <param name=\"mesh\">Mesh to draw as a gizmo.</param>\n      <param name=\"position\">Position (default is zero).</param>\n      <param name=\"rotation\">Rotation (default is no rotation).</param>\n      <param name=\"scale\">Scale (default is no scale).</param>\n      <param name=\"submeshIndex\">Submesh to draw (default is -1, which draws whole mesh).</param>\n    </member>\n    <member name=\"M:UnityEngine.Gizmos.DrawMesh(UnityEngine.Mesh,System.Int32,UnityEngine.Vector3,UnityEngine.Quaternion,UnityEngine.Vector3)\">\n      <summary>\n        <para>Draws a mesh.</para>\n      </summary>\n      <param name=\"mesh\">Mesh to draw as a gizmo.</param>\n      <param name=\"position\">Position (default is zero).</param>\n      <param name=\"rotation\">Rotation (default is no rotation).</param>\n      <param name=\"scale\">Scale (default is no scale).</param>\n      <param name=\"submeshIndex\">Submesh to draw (default is -1, which draws whole mesh).</param>\n    </member>\n    <member name=\"M:UnityEngine.Gizmos.DrawRay(UnityEngine.Ray)\">\n      <summary>\n        <para>Draws a ray starting at from to from + direction.</para>\n      </summary>\n      <param name=\"r\"></param>\n      <param name=\"from\"></param>\n      <param name=\"direction\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Gizmos.DrawRay(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Draws a ray starting at from to from + direction.</para>\n      </summary>\n      <param name=\"r\"></param>\n      <param name=\"from\"></param>\n      <param name=\"direction\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Gizmos.DrawSphere(UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Draws a solid sphere with center and radius.</para>\n      </summary>\n      <param name=\"center\"></param>\n      <param name=\"radius\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Gizmos.DrawWireCube(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Draw a wireframe box with center and size.</para>\n      </summary>\n      <param name=\"center\"></param>\n      <param name=\"size\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Gizmos.DrawWireMesh(UnityEngine.Mesh,UnityEngine.Vector3,UnityEngine.Quaternion,UnityEngine.Vector3)\">\n      <summary>\n        <para>Draws a wireframe mesh.</para>\n      </summary>\n      <param name=\"mesh\">Mesh to draw as a gizmo.</param>\n      <param name=\"position\">Position (default is zero).</param>\n      <param name=\"rotation\">Rotation (default is no rotation).</param>\n      <param name=\"scale\">Scale (default is no scale).</param>\n      <param name=\"submeshIndex\">Submesh to draw (default is -1, which draws whole mesh).</param>\n    </member>\n    <member name=\"M:UnityEngine.Gizmos.DrawWireMesh(UnityEngine.Mesh,System.Int32,UnityEngine.Vector3,UnityEngine.Quaternion,UnityEngine.Vector3)\">\n      <summary>\n        <para>Draws a wireframe mesh.</para>\n      </summary>\n      <param name=\"mesh\">Mesh to draw as a gizmo.</param>\n      <param name=\"position\">Position (default is zero).</param>\n      <param name=\"rotation\">Rotation (default is no rotation).</param>\n      <param name=\"scale\">Scale (default is no scale).</param>\n      <param name=\"submeshIndex\">Submesh to draw (default is -1, which draws whole mesh).</param>\n    </member>\n    <member name=\"M:UnityEngine.Gizmos.DrawWireSphere(UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Draws a wireframe sphere with center and radius.</para>\n      </summary>\n      <param name=\"center\"></param>\n      <param name=\"radius\"></param>\n    </member>\n    <member name=\"T:UnityEngine.GL\">\n      <summary>\n        <para>Low-level graphics library.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GL.invertCulling\">\n      <summary>\n        <para>Select whether to invert the backface culling (true) or not (false).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GL.modelview\">\n      <summary>\n        <para>The current modelview matrix.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GL.sRGBWrite\">\n      <summary>\n        <para>Controls whether Linear-to-sRGB color conversion is performed while rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GL.wireframe\">\n      <summary>\n        <para>Should rendering be done in wireframe?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GL.Begin(System.Int32)\">\n      <summary>\n        <para>Begin drawing 3D primitives.</para>\n      </summary>\n      <param name=\"mode\">Primitives to draw: can be TRIANGLES, TRIANGLE_STRIP, QUADS or LINES.</param>\n    </member>\n    <member name=\"M:UnityEngine.GL.Clear(System.Boolean,System.Boolean,UnityEngine.Color,System.Single)\">\n      <summary>\n        <para>Clear the current render buffer.</para>\n      </summary>\n      <param name=\"clearDepth\">Should the depth buffer be cleared?</param>\n      <param name=\"clearColor\">Should the color buffer be cleared?</param>\n      <param name=\"backgroundColor\">The color to clear with, used only if clearColor is true.</param>\n      <param name=\"depth\">The depth to clear Z buffer with, used only if clearDepth is true.</param>\n    </member>\n    <member name=\"M:UnityEngine.GL.ClearWithSkybox(System.Boolean,UnityEngine.Camera)\">\n      <summary>\n        <para>Clear the current render buffer with camera's skybox.</para>\n      </summary>\n      <param name=\"clearDepth\">Should the depth buffer be cleared?</param>\n      <param name=\"camera\">Camera to get projection parameters and skybox from.</param>\n    </member>\n    <member name=\"M:UnityEngine.GL.Color(UnityEngine.Color)\">\n      <summary>\n        <para>Sets current vertex color.</para>\n      </summary>\n      <param name=\"c\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GL.End\">\n      <summary>\n        <para>End drawing 3D primitives.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GL.Flush\">\n      <summary>\n        <para>Sends queued-up commands in the driver's command buffer to the GPU.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GL.GetGPUProjectionMatrix(UnityEngine.Matrix4x4,System.Boolean)\">\n      <summary>\n        <para>Compute GPU projection matrix from camera's projection matrix.</para>\n      </summary>\n      <param name=\"proj\">Source projection matrix.</param>\n      <param name=\"renderIntoTexture\">Will this projection be used for rendering into a RenderTexture?</param>\n      <returns>\n        <para>Adjusted projection matrix for the current graphics API.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GL.InvalidateState\">\n      <summary>\n        <para>Invalidate the internally cached render state.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GL.IssuePluginEvent(System.Int32)\">\n      <summary>\n        <para>Send a user-defined event to a native code plugin.</para>\n      </summary>\n      <param name=\"eventID\">User defined id to send to the callback.</param>\n      <param name=\"callback\">Native code callback to queue for Unity's renderer to invoke.</param>\n    </member>\n    <member name=\"M:UnityEngine.GL.IssuePluginEvent(System.IntPtr,System.Int32)\">\n      <summary>\n        <para>Send a user-defined event to a native code plugin.</para>\n      </summary>\n      <param name=\"eventID\">User defined id to send to the callback.</param>\n      <param name=\"callback\">Native code callback to queue for Unity's renderer to invoke.</param>\n    </member>\n    <member name=\"F:UnityEngine.GL.LINE_STRIP\">\n      <summary>\n        <para>Mode for Begin: draw line strip.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GL.LINES\">\n      <summary>\n        <para>Mode for Begin: draw lines.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GL.LoadIdentity\">\n      <summary>\n        <para>Load the identity matrix to the current modelview matrix.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GL.LoadOrtho\">\n      <summary>\n        <para>Helper function to set up an ortho perspective transform.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GL.LoadPixelMatrix\">\n      <summary>\n        <para>Setup a matrix for pixel-correct rendering.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GL.LoadPixelMatrix(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Setup a matrix for pixel-correct rendering.</para>\n      </summary>\n      <param name=\"left\"></param>\n      <param name=\"right\"></param>\n      <param name=\"bottom\"></param>\n      <param name=\"top\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GL.LoadProjectionMatrix(UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Load an arbitrary matrix to the current projection matrix.</para>\n      </summary>\n      <param name=\"mat\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GL.MultiTexCoord(System.Int32,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets current texture coordinate (v.x,v.y,v.z) to the actual texture unit.</para>\n      </summary>\n      <param name=\"unit\"></param>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GL.MultiTexCoord2(System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Sets current texture coordinate (x,y) for the actual texture unit.</para>\n      </summary>\n      <param name=\"unit\"></param>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GL.MultiTexCoord3(System.Int32,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Sets current texture coordinate (x,y,z) to the actual texture unit.</para>\n      </summary>\n      <param name=\"unit\"></param>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"z\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GL.MultMatrix(UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Sets the current modelview matrix to the one specified.</para>\n      </summary>\n      <param name=\"m\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GL.PopMatrix\">\n      <summary>\n        <para>Restores both projection and modelview matrices off the top of the matrix stack.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GL.PushMatrix\">\n      <summary>\n        <para>Saves both projection and modelview matrices to the matrix stack.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GL.QUADS\">\n      <summary>\n        <para>Mode for Begin: draw quads.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GL.RenderTargetBarrier\">\n      <summary>\n        <para>Resolves the render target for subsequent operations sampling from it.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GL.TexCoord(UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets current texture coordinate (v.x,v.y,v.z) for all texture units.</para>\n      </summary>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GL.TexCoord2(System.Single,System.Single)\">\n      <summary>\n        <para>Sets current texture coordinate (x,y) for all texture units.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GL.TexCoord3(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Sets current texture coordinate (x,y,z) for all texture units.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"z\"></param>\n    </member>\n    <member name=\"F:UnityEngine.GL.TRIANGLE_STRIP\">\n      <summary>\n        <para>Mode for Begin: draw triangle strip.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GL.TRIANGLES\">\n      <summary>\n        <para>Mode for Begin: draw triangles.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GL.Vertex(UnityEngine.Vector3)\">\n      <summary>\n        <para>Submit a vertex.</para>\n      </summary>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GL.Vertex3(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Submit a vertex.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"z\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GL.Viewport(UnityEngine.Rect)\">\n      <summary>\n        <para>Set the rendering viewport.</para>\n      </summary>\n      <param name=\"pixelRect\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Gradient\">\n      <summary>\n        <para>Gradient used for animating colors.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Gradient.alphaKeys\">\n      <summary>\n        <para>All alpha keys defined in the gradient.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Gradient.colorKeys\">\n      <summary>\n        <para>All color keys defined in the gradient.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Gradient.mode\">\n      <summary>\n        <para>Control how the gradient is evaluated.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Gradient.#ctor\">\n      <summary>\n        <para>Create a new Gradient object.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Gradient.Evaluate(System.Single)\">\n      <summary>\n        <para>Calculate color at a given time.</para>\n      </summary>\n      <param name=\"time\">Time of the key (0 - 1).</param>\n    </member>\n    <member name=\"M:UnityEngine.Gradient.SetKeys(UnityEngine.GradientColorKey[],UnityEngine.GradientAlphaKey[])\">\n      <summary>\n        <para>Setup Gradient with an array of color keys and alpha keys.</para>\n      </summary>\n      <param name=\"colorKeys\">Color keys of the gradient (maximum 8 color keys).</param>\n      <param name=\"alphaKeys\">Alpha keys of the gradient (maximum 8 alpha keys).</param>\n    </member>\n    <member name=\"T:UnityEngine.GradientAlphaKey\">\n      <summary>\n        <para>Alpha key used by Gradient.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GradientAlphaKey.alpha\">\n      <summary>\n        <para>Alpha channel of key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GradientAlphaKey.time\">\n      <summary>\n        <para>Time of the key (0 - 1).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GradientAlphaKey.#ctor(System.Single,System.Single)\">\n      <summary>\n        <para>Gradient alpha key.</para>\n      </summary>\n      <param name=\"alpha\">Alpha of key (0 - 1).</param>\n      <param name=\"time\">Time of the key (0 - 1).</param>\n    </member>\n    <member name=\"T:UnityEngine.GradientColorKey\">\n      <summary>\n        <para>Color key used by Gradient.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GradientColorKey.color\">\n      <summary>\n        <para>Color of key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GradientColorKey.time\">\n      <summary>\n        <para>Time of the key (0 - 1).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GradientColorKey.#ctor(UnityEngine.Color,System.Single)\">\n      <summary>\n        <para>Gradient color key.</para>\n      </summary>\n      <param name=\"color\">Color of key.</param>\n      <param name=\"time\">Time of the key (0 - 1).</param>\n      <param name=\"col\"></param>\n    </member>\n    <member name=\"T:UnityEngine.GradientMode\">\n      <summary>\n        <para>Select how gradients will be evaluated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GradientMode.Blend\">\n      <summary>\n        <para>Find the 2 keys adjacent to the requested evaluation time, and linearly interpolate between them to obtain a blended color.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GradientMode.Fixed\">\n      <summary>\n        <para>Return a fixed color, by finding the first key whose time value is greater than the requested evaluation time.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Graphics\">\n      <summary>\n        <para>Raw interface to Unity's drawing functions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Graphics.activeColorBuffer\">\n      <summary>\n        <para>Currently active color buffer (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Graphics.activeColorGamut\">\n      <summary>\n        <para>Returns the currently active color gamut.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Graphics.activeDepthBuffer\">\n      <summary>\n        <para>Currently active depth/stencil buffer (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Graphics.activeTier\">\n      <summary>\n        <para>Graphics Tier classification for current device.\nChanging this value affects any subsequently loaded shaders. Initially this value is auto-detected from the hardware in use.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.Blit(UnityEngine.Texture,UnityEngine.RenderTexture)\">\n      <summary>\n        <para>Copies source texture into destination render texture with a shader.</para>\n      </summary>\n      <param name=\"source\">Source texture.</param>\n      <param name=\"dest\">The destination RenderTexture. Set this to null to blit directly to screen. See description for more information.</param>\n      <param name=\"mat\">Material to use. Material's shader could do some post-processing effect, for example.</param>\n      <param name=\"pass\">If -1 (default), draws all passes in the material. Otherwise, draws given pass only.</param>\n      <param name=\"offset\">Offset applied to the source texture coordinate.</param>\n      <param name=\"scale\">Scale applied to the source texture coordinate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.Blit(UnityEngine.Texture,UnityEngine.RenderTexture,UnityEngine.Material,System.Int32)\">\n      <summary>\n        <para>Copies source texture into destination render texture with a shader.</para>\n      </summary>\n      <param name=\"source\">Source texture.</param>\n      <param name=\"dest\">The destination RenderTexture. Set this to null to blit directly to screen. See description for more information.</param>\n      <param name=\"mat\">Material to use. Material's shader could do some post-processing effect, for example.</param>\n      <param name=\"pass\">If -1 (default), draws all passes in the material. Otherwise, draws given pass only.</param>\n      <param name=\"offset\">Offset applied to the source texture coordinate.</param>\n      <param name=\"scale\">Scale applied to the source texture coordinate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.Blit(UnityEngine.Texture,UnityEngine.Material,System.Int32)\">\n      <summary>\n        <para>Copies source texture into destination render texture with a shader.</para>\n      </summary>\n      <param name=\"source\">Source texture.</param>\n      <param name=\"dest\">The destination RenderTexture. Set this to null to blit directly to screen. See description for more information.</param>\n      <param name=\"mat\">Material to use. Material's shader could do some post-processing effect, for example.</param>\n      <param name=\"pass\">If -1 (default), draws all passes in the material. Otherwise, draws given pass only.</param>\n      <param name=\"offset\">Offset applied to the source texture coordinate.</param>\n      <param name=\"scale\">Scale applied to the source texture coordinate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.Blit(UnityEngine.Texture,UnityEngine.RenderTexture,UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Copies source texture into destination render texture with a shader.</para>\n      </summary>\n      <param name=\"source\">Source texture.</param>\n      <param name=\"dest\">The destination RenderTexture. Set this to null to blit directly to screen. See description for more information.</param>\n      <param name=\"mat\">Material to use. Material's shader could do some post-processing effect, for example.</param>\n      <param name=\"pass\">If -1 (default), draws all passes in the material. Otherwise, draws given pass only.</param>\n      <param name=\"offset\">Offset applied to the source texture coordinate.</param>\n      <param name=\"scale\">Scale applied to the source texture coordinate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.BlitMultiTap(UnityEngine.Texture,UnityEngine.RenderTexture,UnityEngine.Material,UnityEngine.Vector2[])\">\n      <summary>\n        <para>Copies source texture into destination, for multi-tap shader.</para>\n      </summary>\n      <param name=\"source\">Source texture.</param>\n      <param name=\"dest\">Destination RenderTexture, or null to blit directly to screen.</param>\n      <param name=\"mat\">Material to use for copying. Material's shader should do some post-processing effect.</param>\n      <param name=\"offsets\">Variable number of filtering offsets. Offsets are given in pixels.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.ClearRandomWriteTargets\">\n      <summary>\n        <para>Clear random write targets for level pixel shaders.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.ConvertTexture(UnityEngine.Texture,UnityEngine.Texture)\">\n      <summary>\n        <para>This function provides an efficient way to convert between textures of different formats and dimensions.\nThe destination texture format should be uncompressed and correspond to a supported RenderTextureFormat.</para>\n      </summary>\n      <param name=\"src\">Source texture.</param>\n      <param name=\"dst\">Destination texture.</param>\n      <param name=\"srcElement\">Source element (e.g. cubemap face).  Set this to 0 for 2d source textures.</param>\n      <param name=\"dstElement\">Destination element (e.g. cubemap face or texture array element).</param>\n      <returns>\n        <para>True if the call succeeded.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.ConvertTexture(UnityEngine.Texture,System.Int32,UnityEngine.Texture,System.Int32)\">\n      <summary>\n        <para>This function provides an efficient way to convert between textures of different formats and dimensions.\nThe destination texture format should be uncompressed and correspond to a supported RenderTextureFormat.</para>\n      </summary>\n      <param name=\"src\">Source texture.</param>\n      <param name=\"dst\">Destination texture.</param>\n      <param name=\"srcElement\">Source element (e.g. cubemap face).  Set this to 0 for 2d source textures.</param>\n      <param name=\"dstElement\">Destination element (e.g. cubemap face or texture array element).</param>\n      <returns>\n        <para>True if the call succeeded.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.CopyTexture(UnityEngine.Texture,UnityEngine.Texture)\">\n      <summary>\n        <para>Copy texture contents.</para>\n      </summary>\n      <param name=\"src\">Source texture.</param>\n      <param name=\"dst\">Destination texture.</param>\n      <param name=\"srcElement\">Source texture element (cubemap face, texture array layer or 3D texture depth slice).</param>\n      <param name=\"srcMip\">Source texture mipmap level.</param>\n      <param name=\"dstElement\">Destination texture element (cubemap face, texture array layer or 3D texture depth slice).</param>\n      <param name=\"dstMip\">Destination texture mipmap level.</param>\n      <param name=\"srcX\">X coordinate of source texture region to copy (left side is zero).</param>\n      <param name=\"srcY\">Y coordinate of source texture region to copy (bottom is zero).</param>\n      <param name=\"srcWidth\">Width of source texture region to copy.</param>\n      <param name=\"srcHeight\">Height of source texture region to copy.</param>\n      <param name=\"dstX\">X coordinate of where to copy region in destination texture (left side is zero).</param>\n      <param name=\"dstY\">Y coordinate of where to copy region in destination texture (bottom is zero).</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.CopyTexture(UnityEngine.Texture,System.Int32,System.Int32,UnityEngine.Texture,System.Int32,System.Int32)\">\n      <summary>\n        <para>Copy texture contents.</para>\n      </summary>\n      <param name=\"src\">Source texture.</param>\n      <param name=\"dst\">Destination texture.</param>\n      <param name=\"srcElement\">Source texture element (cubemap face, texture array layer or 3D texture depth slice).</param>\n      <param name=\"srcMip\">Source texture mipmap level.</param>\n      <param name=\"dstElement\">Destination texture element (cubemap face, texture array layer or 3D texture depth slice).</param>\n      <param name=\"dstMip\">Destination texture mipmap level.</param>\n      <param name=\"srcX\">X coordinate of source texture region to copy (left side is zero).</param>\n      <param name=\"srcY\">Y coordinate of source texture region to copy (bottom is zero).</param>\n      <param name=\"srcWidth\">Width of source texture region to copy.</param>\n      <param name=\"srcHeight\">Height of source texture region to copy.</param>\n      <param name=\"dstX\">X coordinate of where to copy region in destination texture (left side is zero).</param>\n      <param name=\"dstY\">Y coordinate of where to copy region in destination texture (bottom is zero).</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.CopyTexture(UnityEngine.Texture,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,UnityEngine.Texture,System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Copy texture contents.</para>\n      </summary>\n      <param name=\"src\">Source texture.</param>\n      <param name=\"dst\">Destination texture.</param>\n      <param name=\"srcElement\">Source texture element (cubemap face, texture array layer or 3D texture depth slice).</param>\n      <param name=\"srcMip\">Source texture mipmap level.</param>\n      <param name=\"dstElement\">Destination texture element (cubemap face, texture array layer or 3D texture depth slice).</param>\n      <param name=\"dstMip\">Destination texture mipmap level.</param>\n      <param name=\"srcX\">X coordinate of source texture region to copy (left side is zero).</param>\n      <param name=\"srcY\">Y coordinate of source texture region to copy (bottom is zero).</param>\n      <param name=\"srcWidth\">Width of source texture region to copy.</param>\n      <param name=\"srcHeight\">Height of source texture region to copy.</param>\n      <param name=\"dstX\">X coordinate of where to copy region in destination texture (left side is zero).</param>\n      <param name=\"dstY\">Y coordinate of where to copy region in destination texture (bottom is zero).</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.CreateGPUFence(UnityEngine.Rendering.SynchronisationStage)\">\n      <summary>\n        <para>Creates a GPUFence which will be passed after the last Blit, Clear, Draw, Dispatch or Texture Copy command prior to this call has been completed on the GPU.</para>\n      </summary>\n      <param name=\"stage\">On some platforms there is a significant gap between the vertex processing completing and the pixel processing begining for a given draw call. This parameter allows for the fence to be passed after either the vertex or pixel processing for the proceeding draw has completed. If a compute shader dispatch was the last task submitted then this parameter is ignored.</param>\n      <returns>\n        <para>Returns a new GPUFence.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawMesh(UnityEngine.Mesh,UnityEngine.Vector3,UnityEngine.Quaternion,UnityEngine.Material,System.Int32,UnityEngine.Camera,System.Int32,UnityEngine.MaterialPropertyBlock,System.Boolean,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Draw a mesh.</para>\n      </summary>\n      <param name=\"mesh\">The Mesh to draw.</param>\n      <param name=\"position\">Position of the mesh.</param>\n      <param name=\"rotation\">Rotation of the mesh.</param>\n      <param name=\"matrix\">Transformation matrix of the mesh (combines position, rotation and other transformations).</param>\n      <param name=\"material\">Material to use.</param>\n      <param name=\"layer\"> to use.</param>\n      <param name=\"camera\">If null (default), the mesh will be drawn in all cameras. Otherwise it will be rendered in the given camera only.</param>\n      <param name=\"submeshIndex\">Which subset of the mesh to draw. This applies only to meshes that are composed of several materials.</param>\n      <param name=\"properties\">Additional material properties to apply onto material just before this mesh will be drawn. See MaterialPropertyBlock.</param>\n      <param name=\"castShadows\">Should the mesh cast shadows?</param>\n      <param name=\"receiveShadows\">Should the mesh receive shadows?</param>\n      <param name=\"useLightProbes\">Should the mesh use light probes?</param>\n      <param name=\"probeAnchor\">If used, the mesh will use this Transform's position to sample light probes and find the matching reflection probe.</param>\n      <param name=\"lightProbeUsage\">LightProbeUsage for the mesh.</param>\n      <param name=\"lightProbeProxyVolume\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawMesh(UnityEngine.Mesh,UnityEngine.Vector3,UnityEngine.Quaternion,UnityEngine.Material,System.Int32,UnityEngine.Camera,System.Int32,UnityEngine.MaterialPropertyBlock,UnityEngine.Rendering.ShadowCastingMode,System.Boolean,UnityEngine.Transform,System.Boolean)\">\n      <summary>\n        <para>Draw a mesh.</para>\n      </summary>\n      <param name=\"mesh\">The Mesh to draw.</param>\n      <param name=\"position\">Position of the mesh.</param>\n      <param name=\"rotation\">Rotation of the mesh.</param>\n      <param name=\"matrix\">Transformation matrix of the mesh (combines position, rotation and other transformations).</param>\n      <param name=\"material\">Material to use.</param>\n      <param name=\"layer\"> to use.</param>\n      <param name=\"camera\">If null (default), the mesh will be drawn in all cameras. Otherwise it will be rendered in the given camera only.</param>\n      <param name=\"submeshIndex\">Which subset of the mesh to draw. This applies only to meshes that are composed of several materials.</param>\n      <param name=\"properties\">Additional material properties to apply onto material just before this mesh will be drawn. See MaterialPropertyBlock.</param>\n      <param name=\"castShadows\">Should the mesh cast shadows?</param>\n      <param name=\"receiveShadows\">Should the mesh receive shadows?</param>\n      <param name=\"useLightProbes\">Should the mesh use light probes?</param>\n      <param name=\"probeAnchor\">If used, the mesh will use this Transform's position to sample light probes and find the matching reflection probe.</param>\n      <param name=\"lightProbeUsage\">LightProbeUsage for the mesh.</param>\n      <param name=\"lightProbeProxyVolume\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawMesh(UnityEngine.Mesh,UnityEngine.Matrix4x4,UnityEngine.Material,System.Int32,UnityEngine.Camera,System.Int32,UnityEngine.MaterialPropertyBlock,System.Boolean,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Draw a mesh.</para>\n      </summary>\n      <param name=\"mesh\">The Mesh to draw.</param>\n      <param name=\"position\">Position of the mesh.</param>\n      <param name=\"rotation\">Rotation of the mesh.</param>\n      <param name=\"matrix\">Transformation matrix of the mesh (combines position, rotation and other transformations).</param>\n      <param name=\"material\">Material to use.</param>\n      <param name=\"layer\"> to use.</param>\n      <param name=\"camera\">If null (default), the mesh will be drawn in all cameras. Otherwise it will be rendered in the given camera only.</param>\n      <param name=\"submeshIndex\">Which subset of the mesh to draw. This applies only to meshes that are composed of several materials.</param>\n      <param name=\"properties\">Additional material properties to apply onto material just before this mesh will be drawn. See MaterialPropertyBlock.</param>\n      <param name=\"castShadows\">Should the mesh cast shadows?</param>\n      <param name=\"receiveShadows\">Should the mesh receive shadows?</param>\n      <param name=\"useLightProbes\">Should the mesh use light probes?</param>\n      <param name=\"probeAnchor\">If used, the mesh will use this Transform's position to sample light probes and find the matching reflection probe.</param>\n      <param name=\"lightProbeUsage\">LightProbeUsage for the mesh.</param>\n      <param name=\"lightProbeProxyVolume\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawMesh(UnityEngine.Mesh,UnityEngine.Matrix4x4,UnityEngine.Material,System.Int32,UnityEngine.Camera,System.Int32,UnityEngine.MaterialPropertyBlock,UnityEngine.Rendering.ShadowCastingMode,System.Boolean,UnityEngine.Transform,System.Boolean)\">\n      <summary>\n        <para>Draw a mesh.</para>\n      </summary>\n      <param name=\"mesh\">The Mesh to draw.</param>\n      <param name=\"position\">Position of the mesh.</param>\n      <param name=\"rotation\">Rotation of the mesh.</param>\n      <param name=\"matrix\">Transformation matrix of the mesh (combines position, rotation and other transformations).</param>\n      <param name=\"material\">Material to use.</param>\n      <param name=\"layer\"> to use.</param>\n      <param name=\"camera\">If null (default), the mesh will be drawn in all cameras. Otherwise it will be rendered in the given camera only.</param>\n      <param name=\"submeshIndex\">Which subset of the mesh to draw. This applies only to meshes that are composed of several materials.</param>\n      <param name=\"properties\">Additional material properties to apply onto material just before this mesh will be drawn. See MaterialPropertyBlock.</param>\n      <param name=\"castShadows\">Should the mesh cast shadows?</param>\n      <param name=\"receiveShadows\">Should the mesh receive shadows?</param>\n      <param name=\"useLightProbes\">Should the mesh use light probes?</param>\n      <param name=\"probeAnchor\">If used, the mesh will use this Transform's position to sample light probes and find the matching reflection probe.</param>\n      <param name=\"lightProbeUsage\">LightProbeUsage for the mesh.</param>\n      <param name=\"lightProbeProxyVolume\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawMesh(UnityEngine.Mesh,UnityEngine.Matrix4x4,UnityEngine.Material,System.Int32,UnityEngine.Camera,System.Int32,UnityEngine.MaterialPropertyBlock,UnityEngine.Rendering.ShadowCastingMode,System.Boolean,UnityEngine.Transform,UnityEngine.Rendering.LightProbeUsage)\">\n      <summary>\n        <para>Draw a mesh.</para>\n      </summary>\n      <param name=\"mesh\">The Mesh to draw.</param>\n      <param name=\"position\">Position of the mesh.</param>\n      <param name=\"rotation\">Rotation of the mesh.</param>\n      <param name=\"matrix\">Transformation matrix of the mesh (combines position, rotation and other transformations).</param>\n      <param name=\"material\">Material to use.</param>\n      <param name=\"layer\"> to use.</param>\n      <param name=\"camera\">If null (default), the mesh will be drawn in all cameras. Otherwise it will be rendered in the given camera only.</param>\n      <param name=\"submeshIndex\">Which subset of the mesh to draw. This applies only to meshes that are composed of several materials.</param>\n      <param name=\"properties\">Additional material properties to apply onto material just before this mesh will be drawn. See MaterialPropertyBlock.</param>\n      <param name=\"castShadows\">Should the mesh cast shadows?</param>\n      <param name=\"receiveShadows\">Should the mesh receive shadows?</param>\n      <param name=\"useLightProbes\">Should the mesh use light probes?</param>\n      <param name=\"probeAnchor\">If used, the mesh will use this Transform's position to sample light probes and find the matching reflection probe.</param>\n      <param name=\"lightProbeUsage\">LightProbeUsage for the mesh.</param>\n      <param name=\"lightProbeProxyVolume\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawMeshInstanced(UnityEngine.Mesh,System.Int32,UnityEngine.Material,UnityEngine.Matrix4x4[],System.Int32,UnityEngine.MaterialPropertyBlock,UnityEngine.Rendering.ShadowCastingMode,System.Boolean,System.Int32,UnityEngine.Camera,UnityEngine.Rendering.LightProbeUsage)\">\n      <summary>\n        <para>Draw the same mesh multiple times using GPU instancing.</para>\n      </summary>\n      <param name=\"mesh\">The Mesh to draw.</param>\n      <param name=\"submeshIndex\">Which subset of the mesh to draw. This applies only to meshes that are composed of several materials.</param>\n      <param name=\"material\">Material to use.</param>\n      <param name=\"matrices\">The array of object transformation matrices.</param>\n      <param name=\"count\">The number of instances to be drawn.</param>\n      <param name=\"properties\">Additional material properties to apply. See MaterialPropertyBlock.</param>\n      <param name=\"castShadows\">Should the meshes cast shadows?</param>\n      <param name=\"receiveShadows\">Should the meshes receive shadows?</param>\n      <param name=\"layer\"> to use.</param>\n      <param name=\"camera\">If null (default), the mesh will be drawn in all cameras. Otherwise it will be drawn in the given camera only.</param>\n      <param name=\"lightProbeUsage\">LightProbeUsage for the instances.</param>\n      <param name=\"lightProbeProxyVolume\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawMeshInstanced(UnityEngine.Mesh,System.Int32,UnityEngine.Material,System.Collections.Generic.List`1&lt;UnityEngine.Matrix4x4&gt;,UnityEngine.MaterialPropertyBlock,UnityEngine.Rendering.ShadowCastingMode,System.Boolean,System.Int32,UnityEngine.Camera,UnityEngine.Rendering.LightProbeUsage)\">\n      <summary>\n        <para>Draw the same mesh multiple times using GPU instancing.</para>\n      </summary>\n      <param name=\"mesh\">The Mesh to draw.</param>\n      <param name=\"submeshIndex\">Which subset of the mesh to draw. This applies only to meshes that are composed of several materials.</param>\n      <param name=\"material\">Material to use.</param>\n      <param name=\"matrices\">The array of object transformation matrices.</param>\n      <param name=\"count\">The number of instances to be drawn.</param>\n      <param name=\"properties\">Additional material properties to apply. See MaterialPropertyBlock.</param>\n      <param name=\"castShadows\">Should the meshes cast shadows?</param>\n      <param name=\"receiveShadows\">Should the meshes receive shadows?</param>\n      <param name=\"layer\"> to use.</param>\n      <param name=\"camera\">If null (default), the mesh will be drawn in all cameras. Otherwise it will be drawn in the given camera only.</param>\n      <param name=\"lightProbeUsage\">LightProbeUsage for the instances.</param>\n      <param name=\"lightProbeProxyVolume\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawMeshInstancedIndirect(UnityEngine.Mesh,System.Int32,UnityEngine.Material,UnityEngine.Bounds,UnityEngine.ComputeBuffer,System.Int32,UnityEngine.MaterialPropertyBlock,UnityEngine.Rendering.ShadowCastingMode,System.Boolean,System.Int32,UnityEngine.Camera,UnityEngine.Rendering.LightProbeUsage)\">\n      <summary>\n        <para>Draw the same mesh multiple times using GPU instancing.</para>\n      </summary>\n      <param name=\"mesh\">The Mesh to draw.</param>\n      <param name=\"submeshIndex\">Which subset of the mesh to draw. This applies only to meshes that are composed of several materials.</param>\n      <param name=\"material\">Material to use.</param>\n      <param name=\"bounds\">The bounding volume surrounding the instances you intend to draw.</param>\n      <param name=\"bufferWithArgs\">The GPU buffer containing the arguments for how many instances of this mesh to draw.</param>\n      <param name=\"argsOffset\">The byte offset into the buffer, where the draw arguments start.</param>\n      <param name=\"properties\">Additional material properties to apply. See MaterialPropertyBlock.</param>\n      <param name=\"castShadows\">Should the mesh cast shadows?</param>\n      <param name=\"receiveShadows\">Should the mesh receive shadows?</param>\n      <param name=\"layer\"> to use.</param>\n      <param name=\"camera\">If null (default), the mesh will be drawn in all cameras. Otherwise it will be drawn in the given camera only.</param>\n      <param name=\"lightProbeUsage\">LightProbeUsage for the instances.</param>\n      <param name=\"lightProbeProxyVolume\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawMeshNow(UnityEngine.Mesh,UnityEngine.Vector3,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Draw a mesh immediately.</para>\n      </summary>\n      <param name=\"mesh\">The Mesh to draw.</param>\n      <param name=\"position\">Position of the mesh.</param>\n      <param name=\"rotation\">Rotation of the mesh.</param>\n      <param name=\"matrix\">Transformation matrix of the mesh (combines position, rotation and other transformations). Note that the mesh will not be displayed correctly if matrix has negative scale.</param>\n      <param name=\"materialIndex\">Subset of the mesh to draw.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawMeshNow(UnityEngine.Mesh,UnityEngine.Vector3,UnityEngine.Quaternion,System.Int32)\">\n      <summary>\n        <para>Draw a mesh immediately.</para>\n      </summary>\n      <param name=\"mesh\">The Mesh to draw.</param>\n      <param name=\"position\">Position of the mesh.</param>\n      <param name=\"rotation\">Rotation of the mesh.</param>\n      <param name=\"matrix\">Transformation matrix of the mesh (combines position, rotation and other transformations). Note that the mesh will not be displayed correctly if matrix has negative scale.</param>\n      <param name=\"materialIndex\">Subset of the mesh to draw.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawMeshNow(UnityEngine.Mesh,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Draw a mesh immediately.</para>\n      </summary>\n      <param name=\"mesh\">The Mesh to draw.</param>\n      <param name=\"position\">Position of the mesh.</param>\n      <param name=\"rotation\">Rotation of the mesh.</param>\n      <param name=\"matrix\">Transformation matrix of the mesh (combines position, rotation and other transformations). Note that the mesh will not be displayed correctly if matrix has negative scale.</param>\n      <param name=\"materialIndex\">Subset of the mesh to draw.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawMeshNow(UnityEngine.Mesh,UnityEngine.Matrix4x4,System.Int32)\">\n      <summary>\n        <para>Draw a mesh immediately.</para>\n      </summary>\n      <param name=\"mesh\">The Mesh to draw.</param>\n      <param name=\"position\">Position of the mesh.</param>\n      <param name=\"rotation\">Rotation of the mesh.</param>\n      <param name=\"matrix\">Transformation matrix of the mesh (combines position, rotation and other transformations). Note that the mesh will not be displayed correctly if matrix has negative scale.</param>\n      <param name=\"materialIndex\">Subset of the mesh to draw.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawProcedural(UnityEngine.MeshTopology,System.Int32,System.Int32)\">\n      <summary>\n        <para>Draws a fully procedural geometry on the GPU.</para>\n      </summary>\n      <param name=\"topology\"></param>\n      <param name=\"vertexCount\"></param>\n      <param name=\"instanceCount\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawProceduralIndirect(UnityEngine.MeshTopology,UnityEngine.ComputeBuffer,System.Int32)\">\n      <summary>\n        <para>Draws a fully procedural geometry on the GPU.</para>\n      </summary>\n      <param name=\"topology\">Topology of the procedural geometry.</param>\n      <param name=\"bufferWithArgs\">Buffer with draw arguments.</param>\n      <param name=\"argsOffset\">Byte offset where in the buffer the draw arguments are.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawTexture(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.Material)\">\n      <summary>\n        <para>Draw a texture in screen coordinates.</para>\n      </summary>\n      <param name=\"screenRect\">Rectangle on the screen to use for the texture. In pixel coordinates with (0,0) in the upper-left corner.</param>\n      <param name=\"texture\">Texture to draw.</param>\n      <param name=\"sourceRect\">Region of the texture to use. In normalized coordinates with (0,0) in the bottom-left corner.</param>\n      <param name=\"leftBorder\">Number of pixels from the left that are not affected by scale.</param>\n      <param name=\"rightBorder\">Number of pixels from the right that are not affected by scale.</param>\n      <param name=\"topBorder\">Number of pixels from the top that are not affected by scale.</param>\n      <param name=\"bottomBorder\">Number of pixels from the bottom that are not affected by scale.</param>\n      <param name=\"color\">Color that modulates the output. The neutral value is (0.5, 0.5, 0.5, 0.5). Set as vertex color for the shader.</param>\n      <param name=\"mat\">Custom Material that can be used to draw the texture. If null is passed, a default material with the Internal-GUITexture.shader is used.</param>\n      <param name=\"pass\">If -1 (default), draws all passes in the material. Otherwise, draws given pass only.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawTexture(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.Material,System.Int32)\">\n      <summary>\n        <para>Draw a texture in screen coordinates.</para>\n      </summary>\n      <param name=\"screenRect\">Rectangle on the screen to use for the texture. In pixel coordinates with (0,0) in the upper-left corner.</param>\n      <param name=\"texture\">Texture to draw.</param>\n      <param name=\"sourceRect\">Region of the texture to use. In normalized coordinates with (0,0) in the bottom-left corner.</param>\n      <param name=\"leftBorder\">Number of pixels from the left that are not affected by scale.</param>\n      <param name=\"rightBorder\">Number of pixels from the right that are not affected by scale.</param>\n      <param name=\"topBorder\">Number of pixels from the top that are not affected by scale.</param>\n      <param name=\"bottomBorder\">Number of pixels from the bottom that are not affected by scale.</param>\n      <param name=\"color\">Color that modulates the output. The neutral value is (0.5, 0.5, 0.5, 0.5). Set as vertex color for the shader.</param>\n      <param name=\"mat\">Custom Material that can be used to draw the texture. If null is passed, a default material with the Internal-GUITexture.shader is used.</param>\n      <param name=\"pass\">If -1 (default), draws all passes in the material. Otherwise, draws given pass only.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawTexture(UnityEngine.Rect,UnityEngine.Texture,System.Int32,System.Int32,System.Int32,System.Int32,UnityEngine.Material,System.Int32)\">\n      <summary>\n        <para>Draw a texture in screen coordinates.</para>\n      </summary>\n      <param name=\"screenRect\">Rectangle on the screen to use for the texture. In pixel coordinates with (0,0) in the upper-left corner.</param>\n      <param name=\"texture\">Texture to draw.</param>\n      <param name=\"sourceRect\">Region of the texture to use. In normalized coordinates with (0,0) in the bottom-left corner.</param>\n      <param name=\"leftBorder\">Number of pixels from the left that are not affected by scale.</param>\n      <param name=\"rightBorder\">Number of pixels from the right that are not affected by scale.</param>\n      <param name=\"topBorder\">Number of pixels from the top that are not affected by scale.</param>\n      <param name=\"bottomBorder\">Number of pixels from the bottom that are not affected by scale.</param>\n      <param name=\"color\">Color that modulates the output. The neutral value is (0.5, 0.5, 0.5, 0.5). Set as vertex color for the shader.</param>\n      <param name=\"mat\">Custom Material that can be used to draw the texture. If null is passed, a default material with the Internal-GUITexture.shader is used.</param>\n      <param name=\"pass\">If -1 (default), draws all passes in the material. Otherwise, draws given pass only.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawTexture(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.Rect,System.Int32,System.Int32,System.Int32,System.Int32,UnityEngine.Material,System.Int32)\">\n      <summary>\n        <para>Draw a texture in screen coordinates.</para>\n      </summary>\n      <param name=\"screenRect\">Rectangle on the screen to use for the texture. In pixel coordinates with (0,0) in the upper-left corner.</param>\n      <param name=\"texture\">Texture to draw.</param>\n      <param name=\"sourceRect\">Region of the texture to use. In normalized coordinates with (0,0) in the bottom-left corner.</param>\n      <param name=\"leftBorder\">Number of pixels from the left that are not affected by scale.</param>\n      <param name=\"rightBorder\">Number of pixels from the right that are not affected by scale.</param>\n      <param name=\"topBorder\">Number of pixels from the top that are not affected by scale.</param>\n      <param name=\"bottomBorder\">Number of pixels from the bottom that are not affected by scale.</param>\n      <param name=\"color\">Color that modulates the output. The neutral value is (0.5, 0.5, 0.5, 0.5). Set as vertex color for the shader.</param>\n      <param name=\"mat\">Custom Material that can be used to draw the texture. If null is passed, a default material with the Internal-GUITexture.shader is used.</param>\n      <param name=\"pass\">If -1 (default), draws all passes in the material. Otherwise, draws given pass only.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawTexture(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.Rect,System.Int32,System.Int32,System.Int32,System.Int32,UnityEngine.Color,UnityEngine.Material,System.Int32)\">\n      <summary>\n        <para>Draw a texture in screen coordinates.</para>\n      </summary>\n      <param name=\"screenRect\">Rectangle on the screen to use for the texture. In pixel coordinates with (0,0) in the upper-left corner.</param>\n      <param name=\"texture\">Texture to draw.</param>\n      <param name=\"sourceRect\">Region of the texture to use. In normalized coordinates with (0,0) in the bottom-left corner.</param>\n      <param name=\"leftBorder\">Number of pixels from the left that are not affected by scale.</param>\n      <param name=\"rightBorder\">Number of pixels from the right that are not affected by scale.</param>\n      <param name=\"topBorder\">Number of pixels from the top that are not affected by scale.</param>\n      <param name=\"bottomBorder\">Number of pixels from the bottom that are not affected by scale.</param>\n      <param name=\"color\">Color that modulates the output. The neutral value is (0.5, 0.5, 0.5, 0.5). Set as vertex color for the shader.</param>\n      <param name=\"mat\">Custom Material that can be used to draw the texture. If null is passed, a default material with the Internal-GUITexture.shader is used.</param>\n      <param name=\"pass\">If -1 (default), draws all passes in the material. Otherwise, draws given pass only.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawTexture(UnityEngine.Rect,UnityEngine.Texture,System.Int32,System.Int32,System.Int32,System.Int32,UnityEngine.Material)\">\n      <summary>\n        <para>Draw a texture in screen coordinates.</para>\n      </summary>\n      <param name=\"screenRect\">Rectangle on the screen to use for the texture. In pixel coordinates with (0,0) in the upper-left corner.</param>\n      <param name=\"texture\">Texture to draw.</param>\n      <param name=\"sourceRect\">Region of the texture to use. In normalized coordinates with (0,0) in the bottom-left corner.</param>\n      <param name=\"leftBorder\">Number of pixels from the left that are not affected by scale.</param>\n      <param name=\"rightBorder\">Number of pixels from the right that are not affected by scale.</param>\n      <param name=\"topBorder\">Number of pixels from the top that are not affected by scale.</param>\n      <param name=\"bottomBorder\">Number of pixels from the bottom that are not affected by scale.</param>\n      <param name=\"color\">Color that modulates the output. The neutral value is (0.5, 0.5, 0.5, 0.5). Set as vertex color for the shader.</param>\n      <param name=\"mat\">Custom Material that can be used to draw the texture. If null is passed, a default material with the Internal-GUITexture.shader is used.</param>\n      <param name=\"pass\">If -1 (default), draws all passes in the material. Otherwise, draws given pass only.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawTexture(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.Rect,System.Int32,System.Int32,System.Int32,System.Int32,UnityEngine.Material)\">\n      <summary>\n        <para>Draw a texture in screen coordinates.</para>\n      </summary>\n      <param name=\"screenRect\">Rectangle on the screen to use for the texture. In pixel coordinates with (0,0) in the upper-left corner.</param>\n      <param name=\"texture\">Texture to draw.</param>\n      <param name=\"sourceRect\">Region of the texture to use. In normalized coordinates with (0,0) in the bottom-left corner.</param>\n      <param name=\"leftBorder\">Number of pixels from the left that are not affected by scale.</param>\n      <param name=\"rightBorder\">Number of pixels from the right that are not affected by scale.</param>\n      <param name=\"topBorder\">Number of pixels from the top that are not affected by scale.</param>\n      <param name=\"bottomBorder\">Number of pixels from the bottom that are not affected by scale.</param>\n      <param name=\"color\">Color that modulates the output. The neutral value is (0.5, 0.5, 0.5, 0.5). Set as vertex color for the shader.</param>\n      <param name=\"mat\">Custom Material that can be used to draw the texture. If null is passed, a default material with the Internal-GUITexture.shader is used.</param>\n      <param name=\"pass\">If -1 (default), draws all passes in the material. Otherwise, draws given pass only.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.DrawTexture(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.Rect,System.Int32,System.Int32,System.Int32,System.Int32,UnityEngine.Color,UnityEngine.Material)\">\n      <summary>\n        <para>Draw a texture in screen coordinates.</para>\n      </summary>\n      <param name=\"screenRect\">Rectangle on the screen to use for the texture. In pixel coordinates with (0,0) in the upper-left corner.</param>\n      <param name=\"texture\">Texture to draw.</param>\n      <param name=\"sourceRect\">Region of the texture to use. In normalized coordinates with (0,0) in the bottom-left corner.</param>\n      <param name=\"leftBorder\">Number of pixels from the left that are not affected by scale.</param>\n      <param name=\"rightBorder\">Number of pixels from the right that are not affected by scale.</param>\n      <param name=\"topBorder\">Number of pixels from the top that are not affected by scale.</param>\n      <param name=\"bottomBorder\">Number of pixels from the bottom that are not affected by scale.</param>\n      <param name=\"color\">Color that modulates the output. The neutral value is (0.5, 0.5, 0.5, 0.5). Set as vertex color for the shader.</param>\n      <param name=\"mat\">Custom Material that can be used to draw the texture. If null is passed, a default material with the Internal-GUITexture.shader is used.</param>\n      <param name=\"pass\">If -1 (default), draws all passes in the material. Otherwise, draws given pass only.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.ExecuteCommandBuffer(UnityEngine.Rendering.CommandBuffer)\">\n      <summary>\n        <para>Execute a command buffer.</para>\n      </summary>\n      <param name=\"buffer\">The buffer to execute.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.ExecuteCommandBufferAsync(UnityEngine.Rendering.CommandBuffer,UnityEngine.Rendering.ComputeQueueType)\">\n      <summary>\n        <para>Executes a command buffer on an async compute queue with the queue selected based on the ComputeQueueType parameter passed.\n\nIt is required that all of the commands within the command buffer be of a type suitable for execution on the async compute queues. If the buffer contains any commands that are not appropriate then an error will be logged and displayed in the editor window.  Specifically the following commands are permitted in a CommandBuffer intended for async execution:\n\nCommandBuffer.BeginSample\n\nCommandBuffer.CopyCounterValue\n\nCommandBuffer.CopyTexture\n\nCommandBuffer.CreateGPUFence\n\nCommandBuffer.DispatchCompute\n\nCommandBuffer.EndSample\n\nCommandBuffer.IssuePluginEvent\n\nCommandBuffer.SetComputeBufferParam\n\nCommandBuffer.SetComputeFloatParam\n\nCommandBuffer.SetComputeFloatParams\n\nCommandBuffer.SetComputeTextureParam\n\nCommandBuffer.SetComputeVectorParam\n\nCommandBuffer.WaitOnGPUFence\n\nAll of the commands within the buffer are guaranteed to be executed on the same queue. If the target platform does not support async compute queues then the work is dispatched on the graphics queue.</para>\n      </summary>\n      <param name=\"buffer\">The CommandBuffer to be executed.</param>\n      <param name=\"queueType\">Describes the desired async compute queue the suuplied CommandBuffer should be executed on.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.SetRandomWriteTarget(System.Int32,UnityEngine.ComputeBuffer,System.Boolean)\">\n      <summary>\n        <para>Set random write target for level pixel shaders.</para>\n      </summary>\n      <param name=\"index\">Index of the random write target in the shader.</param>\n      <param name=\"uav\">RenderTexture to set as write target.</param>\n      <param name=\"preserveCounterValue\">Whether to leave the append/consume counter value unchanged.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.SetRandomWriteTarget(System.Int32,UnityEngine.RenderTexture)\">\n      <summary>\n        <para>Set random write target for level pixel shaders.</para>\n      </summary>\n      <param name=\"index\">Index of the random write target in the shader.</param>\n      <param name=\"uav\">RenderTexture to set as write target.</param>\n      <param name=\"preserveCounterValue\">Whether to leave the append/consume counter value unchanged.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.SetRenderTarget(UnityEngine.RenderTexture,System.Int32,UnityEngine.CubemapFace,System.Int32)\">\n      <summary>\n        <para>Sets current render target.</para>\n      </summary>\n      <param name=\"rt\">RenderTexture to set as active render target.</param>\n      <param name=\"mipLevel\">Mipmap level to render into (use 0 if not mipmapped).</param>\n      <param name=\"face\">Cubemap face to render into (use Unknown if not a cubemap).</param>\n      <param name=\"depthSlice\">Depth slice to render into (use 0 if not a 3D or 2DArray render target).</param>\n      <param name=\"colorBuffer\">Color buffer to render into.</param>\n      <param name=\"depthBuffer\">Depth buffer to render into.</param>\n      <param name=\"colorBuffers\">Color buffers to render into (for multiple render target effects).</param>\n      <param name=\"setup\">Full render target setup information.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.SetRenderTarget(UnityEngine.RenderBuffer[],UnityEngine.RenderBuffer)\">\n      <summary>\n        <para>Sets current render target.</para>\n      </summary>\n      <param name=\"rt\">RenderTexture to set as active render target.</param>\n      <param name=\"mipLevel\">Mipmap level to render into (use 0 if not mipmapped).</param>\n      <param name=\"face\">Cubemap face to render into (use Unknown if not a cubemap).</param>\n      <param name=\"depthSlice\">Depth slice to render into (use 0 if not a 3D or 2DArray render target).</param>\n      <param name=\"colorBuffer\">Color buffer to render into.</param>\n      <param name=\"depthBuffer\">Depth buffer to render into.</param>\n      <param name=\"colorBuffers\">Color buffers to render into (for multiple render target effects).</param>\n      <param name=\"setup\">Full render target setup information.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.SetRenderTarget(UnityEngine.RenderBuffer,UnityEngine.RenderBuffer,System.Int32,UnityEngine.CubemapFace,System.Int32)\">\n      <summary>\n        <para>Sets current render target.</para>\n      </summary>\n      <param name=\"rt\">RenderTexture to set as active render target.</param>\n      <param name=\"mipLevel\">Mipmap level to render into (use 0 if not mipmapped).</param>\n      <param name=\"face\">Cubemap face to render into (use Unknown if not a cubemap).</param>\n      <param name=\"depthSlice\">Depth slice to render into (use 0 if not a 3D or 2DArray render target).</param>\n      <param name=\"colorBuffer\">Color buffer to render into.</param>\n      <param name=\"depthBuffer\">Depth buffer to render into.</param>\n      <param name=\"colorBuffers\">Color buffers to render into (for multiple render target effects).</param>\n      <param name=\"setup\">Full render target setup information.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.SetRenderTarget(UnityEngine.RenderTargetSetup)\">\n      <summary>\n        <para>Sets current render target.</para>\n      </summary>\n      <param name=\"rt\">RenderTexture to set as active render target.</param>\n      <param name=\"mipLevel\">Mipmap level to render into (use 0 if not mipmapped).</param>\n      <param name=\"face\">Cubemap face to render into (use Unknown if not a cubemap).</param>\n      <param name=\"depthSlice\">Depth slice to render into (use 0 if not a 3D or 2DArray render target).</param>\n      <param name=\"colorBuffer\">Color buffer to render into.</param>\n      <param name=\"depthBuffer\">Depth buffer to render into.</param>\n      <param name=\"colorBuffers\">Color buffers to render into (for multiple render target effects).</param>\n      <param name=\"setup\">Full render target setup information.</param>\n    </member>\n    <member name=\"M:UnityEngine.Graphics.WaitOnGPUFence(UnityEngine.Rendering.GPUFence,UnityEngine.Rendering.SynchronisationStage)\">\n      <summary>\n        <para>Instructs the GPU's processing of the graphics queue to wait until the given GPUFence is passed.</para>\n      </summary>\n      <param name=\"fence\">The GPUFence that the GPU will be instructed to wait upon before proceeding with its processing of the graphics queue.</param>\n      <param name=\"stage\">On some platforms there is a significant gap between the vertex processing completing and the pixel processing begining for a given draw call. This parameter allows for requested wait to be before the next items vertex or pixel processing begins. If a compute shader dispatch is the next item to be submitted then this parameter is ignored.</param>\n    </member>\n    <member name=\"T:UnityEngine.Grid\">\n      <summary>\n        <para>Grid is the base class for plotting a layout of uniformly spaced points and lines.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Grid.cellGap\">\n      <summary>\n        <para>The size of the gap between each cell in the Grid.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Grid.cellLayout\">\n      <summary>\n        <para>The layout of the cells in the Grid.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Grid.cellSize\">\n      <summary>\n        <para>The size of each cell in the Grid.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Grid.cellSwizzle\">\n      <summary>\n        <para>The cell swizzle for the Grid.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Grid.GetCellCenterLocal(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Get the logical center coordinate of a grid cell in local space.</para>\n      </summary>\n      <param name=\"position\">Grid cell position.</param>\n      <returns>\n        <para>Center of the cell transformed into local space coordinates.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Grid.GetCellCenterWorld(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Get the logical center coordinate of a grid cell in world space.</para>\n      </summary>\n      <param name=\"position\">Grid cell position.</param>\n      <returns>\n        <para>Center of the cell transformed into world space coordinates.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Grid.InverseSwizzle(UnityEngine.GridLayout/CellSwizzle,UnityEngine.Vector3)\">\n      <summary>\n        <para>Does the inverse swizzle of the given position for given swizzle order.</para>\n      </summary>\n      <param name=\"swizzle\">Determines the rearrangement order for the inverse swizzle.</param>\n      <param name=\"position\">Position to inverse swizzle.</param>\n      <returns>\n        <para>The inversed swizzled position.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Grid.Swizzle(UnityEngine.GridLayout/CellSwizzle,UnityEngine.Vector3)\">\n      <summary>\n        <para>Swizzles the given position with the given swizzle order.</para>\n      </summary>\n      <param name=\"swizzle\">Determines the rearrangement order for the swizzle.</param>\n      <param name=\"position\">Position to swizzle.</param>\n      <returns>\n        <para>The swizzled position.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.GridBrushBase\">\n      <summary>\n        <para>Base class for authoring data on a grid with grid painting tools like paint, erase, pick, select and fill.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GridBrushBase.BoxErase(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.BoundsInt)\">\n      <summary>\n        <para>Erases data on a grid within the given bounds.</para>\n      </summary>\n      <param name=\"gridLayout\">Grid used for layout.</param>\n      <param name=\"brushTarget\">Target of the erase operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">The bounds to erase data from.</param>\n    </member>\n    <member name=\"M:UnityEngine.GridBrushBase.BoxFill(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.BoundsInt)\">\n      <summary>\n        <para>Box fills tiles and GameObjects into given bounds within the selected layers.</para>\n      </summary>\n      <param name=\"gridLayout\">Grid used for layout.</param>\n      <param name=\"brushTarget\">Target of box fill operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">The bounds to box fill data to.</param>\n    </member>\n    <member name=\"M:UnityEngine.GridBrushBase.Erase(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Erases data on a grid within the given bounds.</para>\n      </summary>\n      <param name=\"grid\">Grid used for layout.</param>\n      <param name=\"brushTarget\">Target of the erase operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">The coordinates of the cell to erase data from.</param>\n      <param name=\"gridLayout\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GridBrushBase.Flip(UnityEngine.GridBrushBase/FlipAxis,UnityEngine.GridLayout/CellLayout)\">\n      <summary>\n        <para>Flips the grid brush in the given FlipAxis.</para>\n      </summary>\n      <param name=\"flip\">Axis to flip by.</param>\n      <param name=\"layout\">CellLayout for flipping.</param>\n    </member>\n    <member name=\"T:UnityEngine.GridBrushBase.FlipAxis\">\n      <summary>\n        <para>Axis to flip tiles in the GridBrushBase by.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridBrushBase.FlipAxis.X\">\n      <summary>\n        <para>Flip the brush in the X Axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridBrushBase.FlipAxis.Y\">\n      <summary>\n        <para>Flip the brush in the Y Axis.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GridBrushBase.FloodFill(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Flood fills data onto a grid given the starting coordinates of the cell.</para>\n      </summary>\n      <param name=\"gridLayout\">Grid used for layout.</param>\n      <param name=\"brushTarget\">Targets of flood fill operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">Starting position of the flood fill.</param>\n    </member>\n    <member name=\"M:UnityEngine.GridBrushBase.Move(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.BoundsInt,UnityEngine.BoundsInt)\">\n      <summary>\n        <para>Move is called when user moves the area previously selected with the selection marquee.</para>\n      </summary>\n      <param name=\"grid\">Grid used for layout.</param>\n      <param name=\"brushTarget\">Target of the move operation. By default the currently selected GameObject.</param>\n      <param name=\"from\">Source bounds of the move.</param>\n      <param name=\"to\">Target bounds of the move.</param>\n      <param name=\"gridLayout\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GridBrushBase.MoveEnd(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.BoundsInt)\">\n      <summary>\n        <para>MoveEnd is called when user has ended the move of the area previously selected with the selection marquee.</para>\n      </summary>\n      <param name=\"position\">Layers affected by the move operation.</param>\n      <param name=\"brushTarget\">Target of the move operation. By default the currently selected GameObject.</param>\n      <param name=\"grid\">Grid used for layout.</param>\n      <param name=\"gridLayout\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GridBrushBase.MoveStart(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.BoundsInt)\">\n      <summary>\n        <para>MoveEnd is called when user starts moving the area previously selected with the selection marquee.</para>\n      </summary>\n      <param name=\"grid\">Grid used for layout.</param>\n      <param name=\"brushTarget\">Target of the move operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">Position where the move operation has started.</param>\n      <param name=\"gridLayout\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GridBrushBase.Paint(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Paints data into a grid within the given bounds.</para>\n      </summary>\n      <param name=\"grid\">Grid used for layout.</param>\n      <param name=\"brushTarget\">Target of the paint operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">The coordinates of the cell to paint data to.</param>\n      <param name=\"gridLayout\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GridBrushBase.Pick(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.BoundsInt,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Picks data from a grid given the coordinates of the cells.</para>\n      </summary>\n      <param name=\"grid\">Grid used for layout.</param>\n      <param name=\"brushTarget\">Target of the paint operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">The coordinates of the cells to paint data from.</param>\n      <param name=\"pivot\">Pivot of the picking brush.</param>\n      <param name=\"gridLayout\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GridBrushBase.Rotate(UnityEngine.GridBrushBase/RotationDirection,UnityEngine.GridLayout/CellLayout)\">\n      <summary>\n        <para>Rotates all tiles on the grid brush with the given RotationDirection.</para>\n      </summary>\n      <param name=\"direction\">Direction to rotate by.</param>\n      <param name=\"layout\">Cell Layout for rotating.</param>\n    </member>\n    <member name=\"T:UnityEngine.GridBrushBase.RotationDirection\">\n      <summary>\n        <para>Direction to rotate tiles in the GridBrushBase by.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridBrushBase.RotationDirection.Clockwise\">\n      <summary>\n        <para>Rotates tiles clockwise.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridBrushBase.RotationDirection.CounterClockwise\">\n      <summary>\n        <para>Rotates tiles counter-clockwise.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GridBrushBase.Select(UnityEngine.GridLayout,UnityEngine.GameObject,UnityEngine.BoundsInt)\">\n      <summary>\n        <para>Select an area of a grid.</para>\n      </summary>\n      <param name=\"grid\">Grid used for layout.</param>\n      <param name=\"brushTarget\">Targets of paint operation. By default the currently selected GameObject.</param>\n      <param name=\"position\">Area to get selected.</param>\n      <param name=\"gridLayout\"></param>\n    </member>\n    <member name=\"T:UnityEngine.GridBrushBase.Tool\">\n      <summary>\n        <para>Tool mode for the GridBrushBase.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridBrushBase.Tool.Box\">\n      <summary>\n        <para>Box Fill.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridBrushBase.Tool.Erase\">\n      <summary>\n        <para>Erase.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridBrushBase.Tool.FloodFill\">\n      <summary>\n        <para>Flood Fill.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridBrushBase.Tool.Move\">\n      <summary>\n        <para>Move.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridBrushBase.Tool.Paint\">\n      <summary>\n        <para>Paint.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridBrushBase.Tool.Pick\">\n      <summary>\n        <para>Pick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridBrushBase.Tool.Select\">\n      <summary>\n        <para>Select.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.GridLayout\">\n      <summary>\n        <para>An abstract class that defines a grid layout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GridLayout.cellGap\">\n      <summary>\n        <para>The size of the gap between each cell in the layout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GridLayout.cellLayout\">\n      <summary>\n        <para>The layout of the cells.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GridLayout.cellSize\">\n      <summary>\n        <para>The size of each cell in the layout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GridLayout.cellSwizzle\">\n      <summary>\n        <para>The cell swizzle for the layout.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.GridLayout.CellLayout\">\n      <summary>\n        <para>The layout of the GridLayout.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridLayout.CellLayout.Hexagon\">\n      <summary>\n        <para>Hexagonal layout for cells in the GridLayout.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridLayout.CellLayout.Rectangle\">\n      <summary>\n        <para>Rectangular layout for cells in the GridLayout.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.GridLayout.CellSwizzle\">\n      <summary>\n        <para>Swizzles cell positions to other positions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridLayout.CellSwizzle.XYZ\">\n      <summary>\n        <para>Keeps the cell positions at XYZ.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridLayout.CellSwizzle.XZY\">\n      <summary>\n        <para>Swizzles the cell positions from XYZ to XZY.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridLayout.CellSwizzle.YXZ\">\n      <summary>\n        <para>Swizzles the cell positions from XYZ to YXZ.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridLayout.CellSwizzle.YZX\">\n      <summary>\n        <para>Swizzles the cell positions from XYZ to YZX.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridLayout.CellSwizzle.ZXY\">\n      <summary>\n        <para>Swizzles the cell positions from XYZ to ZXY.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GridLayout.CellSwizzle.ZYX\">\n      <summary>\n        <para>Swizzles the cell positions from XYZ to ZYX.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GridLayout.CellToLocal(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Converts a cell position to local position space.</para>\n      </summary>\n      <param name=\"cellPosition\">Cell position to convert.</param>\n      <returns>\n        <para>Local position of the cell position.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GridLayout.CellToLocalInterpolated(UnityEngine.Vector3)\">\n      <summary>\n        <para>Converts an interpolated cell position in floats to local position space.</para>\n      </summary>\n      <param name=\"cellPosition\">Interpolated cell position to convert.</param>\n      <returns>\n        <para>Local position of the cell position.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GridLayout.CellToWorld(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Converts a cell position to world position space.</para>\n      </summary>\n      <param name=\"cellPosition\">Cell position to convert.</param>\n      <returns>\n        <para>World position of the cell position.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GridLayout.GetBoundsLocal(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Returns the local bounds for a cell at the location.</para>\n      </summary>\n      <param name=\"localPosition\">Location of the cell.</param>\n      <param name=\"cellPosition\"></param>\n      <returns>\n        <para>Local bounds of cell at the position.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GridLayout.GetLayoutCellCenter\">\n      <summary>\n        <para>Get the default center coordinate of a cell for the set layout of the Grid.</para>\n      </summary>\n      <returns>\n        <para>Cell Center coordinate.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GridLayout.LocalToCell(UnityEngine.Vector3)\">\n      <summary>\n        <para>Converts a local position to cell position.</para>\n      </summary>\n      <param name=\"localPosition\">Local Position to convert.</param>\n      <returns>\n        <para>Cell position of the local position.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GridLayout.LocalToCellInterpolated(UnityEngine.Vector3)\">\n      <summary>\n        <para>Converts a local position to cell position.</para>\n      </summary>\n      <param name=\"localPosition\">Local Position to convert.</param>\n      <returns>\n        <para>Interpolated cell position of the local position.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GridLayout.LocalToWorld(UnityEngine.Vector3)\">\n      <summary>\n        <para>Converts a local position to world position.</para>\n      </summary>\n      <param name=\"localPosition\">Local Position to convert.</param>\n      <returns>\n        <para>World position of the local position.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GridLayout.WorldToCell(UnityEngine.Vector3)\">\n      <summary>\n        <para>Converts a world position to cell position.</para>\n      </summary>\n      <param name=\"worldPosition\">World Position to convert.</param>\n      <returns>\n        <para>Cell position of the world position.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GridLayout.WorldToLocal(UnityEngine.Vector3)\">\n      <summary>\n        <para>Converts a world position to local position.</para>\n      </summary>\n      <param name=\"worldPosition\">World Position to convert.</param>\n      <returns>\n        <para>Local position of the world position.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.GUI\">\n      <summary>\n        <para>The GUI class is the interface for Unity's GUI with manual positioning.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUI.backgroundColor\">\n      <summary>\n        <para>Global tinting color for all background elements rendered by the GUI.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUI.changed\">\n      <summary>\n        <para>Returns true if any controls changed the value of the input data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUI.color\">\n      <summary>\n        <para>Global tinting color for the GUI.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUI.contentColor\">\n      <summary>\n        <para>Tinting color for all text rendered by the GUI.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUI.depth\">\n      <summary>\n        <para>The sorting depth of the currently executing GUI behaviour.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUI.enabled\">\n      <summary>\n        <para>Is the GUI enabled?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUI.matrix\">\n      <summary>\n        <para>The GUI transform matrix.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUI.skin\">\n      <summary>\n        <para>The global skin to use.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUI.tooltip\">\n      <summary>\n        <para>The tooltip of the control the mouse is currently over, or which has keyboard focus. (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUI.BeginGroup(UnityEngine.Rect)\">\n      <summary>\n        <para>Begin a group. Must be matched with a call to EndGroup.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the group.</param>\n      <param name=\"text\">Text to display on the group.</param>\n      <param name=\"image\">Texture to display on the group.</param>\n      <param name=\"content\">Text, image and tooltip for this group. If supplied, any mouse clicks are \"captured\" by the group and not If left out, no background is rendered, and mouse clicks are passed.</param>\n      <param name=\"style\">The style to use for the background.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.BeginGroup(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>Begin a group. Must be matched with a call to EndGroup.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the group.</param>\n      <param name=\"text\">Text to display on the group.</param>\n      <param name=\"image\">Texture to display on the group.</param>\n      <param name=\"content\">Text, image and tooltip for this group. If supplied, any mouse clicks are \"captured\" by the group and not If left out, no background is rendered, and mouse clicks are passed.</param>\n      <param name=\"style\">The style to use for the background.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.BeginGroup(UnityEngine.Rect,UnityEngine.Texture)\">\n      <summary>\n        <para>Begin a group. Must be matched with a call to EndGroup.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the group.</param>\n      <param name=\"text\">Text to display on the group.</param>\n      <param name=\"image\">Texture to display on the group.</param>\n      <param name=\"content\">Text, image and tooltip for this group. If supplied, any mouse clicks are \"captured\" by the group and not If left out, no background is rendered, and mouse clicks are passed.</param>\n      <param name=\"style\">The style to use for the background.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.BeginGroup(UnityEngine.Rect,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Begin a group. Must be matched with a call to EndGroup.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the group.</param>\n      <param name=\"text\">Text to display on the group.</param>\n      <param name=\"image\">Texture to display on the group.</param>\n      <param name=\"content\">Text, image and tooltip for this group. If supplied, any mouse clicks are \"captured\" by the group and not If left out, no background is rendered, and mouse clicks are passed.</param>\n      <param name=\"style\">The style to use for the background.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.BeginGroup(UnityEngine.Rect,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Begin a group. Must be matched with a call to EndGroup.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the group.</param>\n      <param name=\"text\">Text to display on the group.</param>\n      <param name=\"image\">Texture to display on the group.</param>\n      <param name=\"content\">Text, image and tooltip for this group. If supplied, any mouse clicks are \"captured\" by the group and not If left out, no background is rendered, and mouse clicks are passed.</param>\n      <param name=\"style\">The style to use for the background.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.BeginGroup(UnityEngine.Rect,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Begin a group. Must be matched with a call to EndGroup.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the group.</param>\n      <param name=\"text\">Text to display on the group.</param>\n      <param name=\"image\">Texture to display on the group.</param>\n      <param name=\"content\">Text, image and tooltip for this group. If supplied, any mouse clicks are \"captured\" by the group and not If left out, no background is rendered, and mouse clicks are passed.</param>\n      <param name=\"style\">The style to use for the background.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.BeginGroup(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Begin a group. Must be matched with a call to EndGroup.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the group.</param>\n      <param name=\"text\">Text to display on the group.</param>\n      <param name=\"image\">Texture to display on the group.</param>\n      <param name=\"content\">Text, image and tooltip for this group. If supplied, any mouse clicks are \"captured\" by the group and not If left out, no background is rendered, and mouse clicks are passed.</param>\n      <param name=\"style\">The style to use for the background.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.BeginGroup(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Begin a group. Must be matched with a call to EndGroup.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the group.</param>\n      <param name=\"text\">Text to display on the group.</param>\n      <param name=\"image\">Texture to display on the group.</param>\n      <param name=\"content\">Text, image and tooltip for this group. If supplied, any mouse clicks are \"captured\" by the group and not If left out, no background is rendered, and mouse clicks are passed.</param>\n      <param name=\"style\">The style to use for the background.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.BeginScrollView(UnityEngine.Rect,UnityEngine.Vector2,UnityEngine.Rect)\">\n      <summary>\n        <para>Begin a scrolling view inside your GUI.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the ScrollView.</param>\n      <param name=\"scrollPosition\">The pixel distance that the view is scrolled in the X and Y directions.</param>\n      <param name=\"viewRect\">The rectangle used inside the scrollview.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"alwaysShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when viewRect is wider than position.</param>\n      <param name=\"alwaysShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when viewRect is taller than position.</param>\n      <returns>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.BeginScrollView(UnityEngine.Rect,UnityEngine.Vector2,UnityEngine.Rect,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Begin a scrolling view inside your GUI.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the ScrollView.</param>\n      <param name=\"scrollPosition\">The pixel distance that the view is scrolled in the X and Y directions.</param>\n      <param name=\"viewRect\">The rectangle used inside the scrollview.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"alwaysShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when viewRect is wider than position.</param>\n      <param name=\"alwaysShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when viewRect is taller than position.</param>\n      <returns>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.BeginScrollView(UnityEngine.Rect,UnityEngine.Vector2,UnityEngine.Rect,UnityEngine.GUIStyle,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Begin a scrolling view inside your GUI.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the ScrollView.</param>\n      <param name=\"scrollPosition\">The pixel distance that the view is scrolled in the X and Y directions.</param>\n      <param name=\"viewRect\">The rectangle used inside the scrollview.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"alwaysShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when viewRect is wider than position.</param>\n      <param name=\"alwaysShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when viewRect is taller than position.</param>\n      <returns>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.BeginScrollView(UnityEngine.Rect,UnityEngine.Vector2,UnityEngine.Rect,System.Boolean,System.Boolean,UnityEngine.GUIStyle,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Begin a scrolling view inside your GUI.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the ScrollView.</param>\n      <param name=\"scrollPosition\">The pixel distance that the view is scrolled in the X and Y directions.</param>\n      <param name=\"viewRect\">The rectangle used inside the scrollview.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"alwaysShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when viewRect is wider than position.</param>\n      <param name=\"alwaysShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when viewRect is taller than position.</param>\n      <returns>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Box(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>Create a Box on the GUI Layer.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the box.</param>\n      <param name=\"text\">Text to display on the box.</param>\n      <param name=\"image\">Texture to display on the box.</param>\n      <param name=\"content\">Text, image and tooltip for this box.</param>\n      <param name=\"style\">The style to use. If left out, the box style from the current GUISkin is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Box(UnityEngine.Rect,UnityEngine.Texture)\">\n      <summary>\n        <para>Create a Box on the GUI Layer.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the box.</param>\n      <param name=\"text\">Text to display on the box.</param>\n      <param name=\"image\">Texture to display on the box.</param>\n      <param name=\"content\">Text, image and tooltip for this box.</param>\n      <param name=\"style\">The style to use. If left out, the box style from the current GUISkin is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Box(UnityEngine.Rect,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Create a Box on the GUI Layer.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the box.</param>\n      <param name=\"text\">Text to display on the box.</param>\n      <param name=\"image\">Texture to display on the box.</param>\n      <param name=\"content\">Text, image and tooltip for this box.</param>\n      <param name=\"style\">The style to use. If left out, the box style from the current GUISkin is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Box(UnityEngine.Rect,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Create a Box on the GUI Layer.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the box.</param>\n      <param name=\"text\">Text to display on the box.</param>\n      <param name=\"image\">Texture to display on the box.</param>\n      <param name=\"content\">Text, image and tooltip for this box.</param>\n      <param name=\"style\">The style to use. If left out, the box style from the current GUISkin is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Box(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Create a Box on the GUI Layer.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the box.</param>\n      <param name=\"text\">Text to display on the box.</param>\n      <param name=\"image\">Texture to display on the box.</param>\n      <param name=\"content\">Text, image and tooltip for this box.</param>\n      <param name=\"style\">The style to use. If left out, the box style from the current GUISkin is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Box(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Create a Box on the GUI Layer.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the box.</param>\n      <param name=\"text\">Text to display on the box.</param>\n      <param name=\"image\">Texture to display on the box.</param>\n      <param name=\"content\">Text, image and tooltip for this box.</param>\n      <param name=\"style\">The style to use. If left out, the box style from the current GUISkin is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.BringWindowToBack(System.Int32)\">\n      <summary>\n        <para>Bring a specific window to back of the floating windows.</para>\n      </summary>\n      <param name=\"windowID\">The identifier used when you created the window in the Window call.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.BringWindowToFront(System.Int32)\">\n      <summary>\n        <para>Bring a specific window to front of the floating windows.</para>\n      </summary>\n      <param name=\"windowID\">The identifier used when you created the window in the Window call.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Button(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>Make a single press button. The user clicks them and something happens immediately.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <returns>\n        <para>true when the users clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Button(UnityEngine.Rect,UnityEngine.Texture)\">\n      <summary>\n        <para>Make a single press button. The user clicks them and something happens immediately.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <returns>\n        <para>true when the users clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Button(UnityEngine.Rect,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a single press button. The user clicks them and something happens immediately.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <returns>\n        <para>true when the users clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Button(UnityEngine.Rect,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a single press button. The user clicks them and something happens immediately.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <returns>\n        <para>true when the users clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Button(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a single press button. The user clicks them and something happens immediately.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <returns>\n        <para>true when the users clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Button(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a single press button. The user clicks them and something happens immediately.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <returns>\n        <para>true when the users clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.DragWindow(UnityEngine.Rect)\">\n      <summary>\n        <para>Make a window draggable.</para>\n      </summary>\n      <param name=\"position\">The part of the window that can be dragged. This is clipped to the actual window.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.DragWindow\">\n      <summary>\n        <para>If you want to have the entire window background to act as a drag area, use the version of DragWindow that takes no parameters and put it at the end of the window function.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUI.DrawTexture(UnityEngine.Rect,UnityEngine.Texture)\">\n      <summary>\n        <para>Draw a texture within a rectangle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to draw the texture within.</param>\n      <param name=\"image\">Texture to display.</param>\n      <param name=\"scaleMode\">How to scale the image when the aspect ratio of it doesn't fit the aspect ratio to be drawn within.</param>\n      <param name=\"alphaBlend\">Whether to apply alpha blending when drawing the image (enabled by default).</param>\n      <param name=\"imageAspect\">Aspect ratio to use for the source image. If 0 (the default), the aspect ratio from the image is used.  Pass in w/h for the desired aspect ratio.  This allows the aspect ratio of the source image to be adjusted without changing the pixel width and height.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.DrawTexture(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.ScaleMode)\">\n      <summary>\n        <para>Draw a texture within a rectangle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to draw the texture within.</param>\n      <param name=\"image\">Texture to display.</param>\n      <param name=\"scaleMode\">How to scale the image when the aspect ratio of it doesn't fit the aspect ratio to be drawn within.</param>\n      <param name=\"alphaBlend\">Whether to apply alpha blending when drawing the image (enabled by default).</param>\n      <param name=\"imageAspect\">Aspect ratio to use for the source image. If 0 (the default), the aspect ratio from the image is used.  Pass in w/h for the desired aspect ratio.  This allows the aspect ratio of the source image to be adjusted without changing the pixel width and height.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.DrawTexture(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.ScaleMode,System.Boolean)\">\n      <summary>\n        <para>Draw a texture within a rectangle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to draw the texture within.</param>\n      <param name=\"image\">Texture to display.</param>\n      <param name=\"scaleMode\">How to scale the image when the aspect ratio of it doesn't fit the aspect ratio to be drawn within.</param>\n      <param name=\"alphaBlend\">Whether to apply alpha blending when drawing the image (enabled by default).</param>\n      <param name=\"imageAspect\">Aspect ratio to use for the source image. If 0 (the default), the aspect ratio from the image is used.  Pass in w/h for the desired aspect ratio.  This allows the aspect ratio of the source image to be adjusted without changing the pixel width and height.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.DrawTexture(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.ScaleMode,System.Boolean,System.Single)\">\n      <summary>\n        <para>Draw a texture within a rectangle.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to draw the texture within.</param>\n      <param name=\"image\">Texture to display.</param>\n      <param name=\"scaleMode\">How to scale the image when the aspect ratio of it doesn't fit the aspect ratio to be drawn within.</param>\n      <param name=\"alphaBlend\">Whether to apply alpha blending when drawing the image (enabled by default).</param>\n      <param name=\"imageAspect\">Aspect ratio to use for the source image. If 0 (the default), the aspect ratio from the image is used.  Pass in w/h for the desired aspect ratio.  This allows the aspect ratio of the source image to be adjusted without changing the pixel width and height.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.DrawTexture(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.ScaleMode,System.Boolean,System.Single,UnityEngine.Color,System.Single,System.Single)\">\n      <summary>\n        <para>Draws a border with rounded corners within a rectangle. The texture is used to pattern the border.  Note that this method only works on shader model 2.5 and above.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to draw the texture within.</param>\n      <param name=\"image\">Texture to display.</param>\n      <param name=\"scaleMode\">How to scale the image when the aspect ratio of it doesn't fit the aspect ratio to be drawn within.</param>\n      <param name=\"alphaBlend\">Whether to apply alpha blending when drawing the image (enabled by default).</param>\n      <param name=\"imageAspect\">Aspect ratio to use for the source image. If 0 (the default), the aspect ratio from the image is used.  Pass in w/h for the desired aspect ratio.  This allows the aspect ratio of the source image to be adjusted without changing the pixel width and height.</param>\n      <param name=\"color\">A tint color to apply on the texture.</param>\n      <param name=\"borderWidth\">The width of the border. If 0, the full texture is drawn.</param>\n      <param name=\"borderWidths\">The width of the borders (left, top, right and bottom). If Vector4.zero, the full texture is drawn.</param>\n      <param name=\"borderRadius\">The radius for rounded corners. If 0, corners will not be rounded.</param>\n      <param name=\"borderRadiuses\">The radiuses for rounded corners (top-left, top-right, bottom-right and bottom-left). If Vector4.zero, corners will not be rounded.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.DrawTexture(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.ScaleMode,System.Boolean,System.Single,UnityEngine.Color,UnityEngine.Vector4,System.Single)\">\n      <summary>\n        <para>Draws a border with rounded corners within a rectangle. The texture is used to pattern the border.  Note that this method only works on shader model 2.5 and above.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to draw the texture within.</param>\n      <param name=\"image\">Texture to display.</param>\n      <param name=\"scaleMode\">How to scale the image when the aspect ratio of it doesn't fit the aspect ratio to be drawn within.</param>\n      <param name=\"alphaBlend\">Whether to apply alpha blending when drawing the image (enabled by default).</param>\n      <param name=\"imageAspect\">Aspect ratio to use for the source image. If 0 (the default), the aspect ratio from the image is used.  Pass in w/h for the desired aspect ratio.  This allows the aspect ratio of the source image to be adjusted without changing the pixel width and height.</param>\n      <param name=\"color\">A tint color to apply on the texture.</param>\n      <param name=\"borderWidth\">The width of the border. If 0, the full texture is drawn.</param>\n      <param name=\"borderWidths\">The width of the borders (left, top, right and bottom). If Vector4.zero, the full texture is drawn.</param>\n      <param name=\"borderRadius\">The radius for rounded corners. If 0, corners will not be rounded.</param>\n      <param name=\"borderRadiuses\">The radiuses for rounded corners (top-left, top-right, bottom-right and bottom-left). If Vector4.zero, corners will not be rounded.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.DrawTextureWithTexCoords(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.Rect)\">\n      <summary>\n        <para>Draw a texture within a rectangle with the given texture coordinates.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to draw the texture within.</param>\n      <param name=\"image\">Texture to display.</param>\n      <param name=\"texCoords\">How to scale the image when the aspect ratio of it doesn't fit the aspect ratio to be drawn within.</param>\n      <param name=\"alphaBlend\">Whether to alpha blend the image on to the display (the default). If false, the picture is drawn on to the display.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.DrawTextureWithTexCoords(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.Rect,System.Boolean)\">\n      <summary>\n        <para>Draw a texture within a rectangle with the given texture coordinates.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to draw the texture within.</param>\n      <param name=\"image\">Texture to display.</param>\n      <param name=\"texCoords\">How to scale the image when the aspect ratio of it doesn't fit the aspect ratio to be drawn within.</param>\n      <param name=\"alphaBlend\">Whether to alpha blend the image on to the display (the default). If false, the picture is drawn on to the display.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.EndGroup\">\n      <summary>\n        <para>End a group.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUI.EndScrollView\">\n      <summary>\n        <para>Ends a scrollview started with a call to BeginScrollView.</para>\n      </summary>\n      <param name=\"handleScrollWheel\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.EndScrollView(System.Boolean)\">\n      <summary>\n        <para>Ends a scrollview started with a call to BeginScrollView.</para>\n      </summary>\n      <param name=\"handleScrollWheel\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.FocusControl(System.String)\">\n      <summary>\n        <para>Move keyboard focus to a named control.</para>\n      </summary>\n      <param name=\"name\">Name set using SetNextControlName.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.FocusWindow(System.Int32)\">\n      <summary>\n        <para>Make a window become the active window.</para>\n      </summary>\n      <param name=\"windowID\">The identifier used when you created the window in the Window call.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.GetNameOfFocusedControl\">\n      <summary>\n        <para>Get the name of named control that has focus.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.GUI.GroupScope\">\n      <summary>\n        <para>Disposable helper class for managing BeginGroup / EndGroup.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUI.GroupScope.#ctor(UnityEngine.Rect)\">\n      <summary>\n        <para>Create a new GroupScope and begin the corresponding group.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the group.</param>\n      <param name=\"text\">Text to display on the group.</param>\n      <param name=\"image\">Texture to display on the group.</param>\n      <param name=\"content\">Text, image and tooltip for this group. If supplied, any mouse clicks are \"captured\" by the group and not If left out, no background is rendered, and mouse clicks are passed.</param>\n      <param name=\"style\">The style to use for the background.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.GroupScope.#ctor(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>Create a new GroupScope and begin the corresponding group.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the group.</param>\n      <param name=\"text\">Text to display on the group.</param>\n      <param name=\"image\">Texture to display on the group.</param>\n      <param name=\"content\">Text, image and tooltip for this group. If supplied, any mouse clicks are \"captured\" by the group and not If left out, no background is rendered, and mouse clicks are passed.</param>\n      <param name=\"style\">The style to use for the background.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.GroupScope.#ctor(UnityEngine.Rect,UnityEngine.Texture)\">\n      <summary>\n        <para>Create a new GroupScope and begin the corresponding group.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the group.</param>\n      <param name=\"text\">Text to display on the group.</param>\n      <param name=\"image\">Texture to display on the group.</param>\n      <param name=\"content\">Text, image and tooltip for this group. If supplied, any mouse clicks are \"captured\" by the group and not If left out, no background is rendered, and mouse clicks are passed.</param>\n      <param name=\"style\">The style to use for the background.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.GroupScope.#ctor(UnityEngine.Rect,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Create a new GroupScope and begin the corresponding group.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the group.</param>\n      <param name=\"text\">Text to display on the group.</param>\n      <param name=\"image\">Texture to display on the group.</param>\n      <param name=\"content\">Text, image and tooltip for this group. If supplied, any mouse clicks are \"captured\" by the group and not If left out, no background is rendered, and mouse clicks are passed.</param>\n      <param name=\"style\">The style to use for the background.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.GroupScope.#ctor(UnityEngine.Rect,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Create a new GroupScope and begin the corresponding group.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the group.</param>\n      <param name=\"text\">Text to display on the group.</param>\n      <param name=\"image\">Texture to display on the group.</param>\n      <param name=\"content\">Text, image and tooltip for this group. If supplied, any mouse clicks are \"captured\" by the group and not If left out, no background is rendered, and mouse clicks are passed.</param>\n      <param name=\"style\">The style to use for the background.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.GroupScope.#ctor(UnityEngine.Rect,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Create a new GroupScope and begin the corresponding group.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the group.</param>\n      <param name=\"text\">Text to display on the group.</param>\n      <param name=\"image\">Texture to display on the group.</param>\n      <param name=\"content\">Text, image and tooltip for this group. If supplied, any mouse clicks are \"captured\" by the group and not If left out, no background is rendered, and mouse clicks are passed.</param>\n      <param name=\"style\">The style to use for the background.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.GroupScope.#ctor(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Create a new GroupScope and begin the corresponding group.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the group.</param>\n      <param name=\"text\">Text to display on the group.</param>\n      <param name=\"image\">Texture to display on the group.</param>\n      <param name=\"content\">Text, image and tooltip for this group. If supplied, any mouse clicks are \"captured\" by the group and not If left out, no background is rendered, and mouse clicks are passed.</param>\n      <param name=\"style\">The style to use for the background.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.HorizontalScrollbar(UnityEngine.Rect,System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Make a horizontal scrollbar. Scrollbars are what you use to scroll through a document. Most likely, you want to use scrollViews instead.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the scrollbar.</param>\n      <param name=\"value\">The position between min and max.</param>\n      <param name=\"size\">How much can we see?</param>\n      <param name=\"leftValue\">The value at the left end of the scrollbar.</param>\n      <param name=\"rightValue\">The value at the right end of the scrollbar.</param>\n      <param name=\"style\">The style to use for the scrollbar background. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <returns>\n        <para>The modified value. This can be changed by the user by dragging the scrollbar, or clicking the arrows at the end.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.HorizontalScrollbar(UnityEngine.Rect,System.Single,System.Single,System.Single,System.Single,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a horizontal scrollbar. Scrollbars are what you use to scroll through a document. Most likely, you want to use scrollViews instead.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the scrollbar.</param>\n      <param name=\"value\">The position between min and max.</param>\n      <param name=\"size\">How much can we see?</param>\n      <param name=\"leftValue\">The value at the left end of the scrollbar.</param>\n      <param name=\"rightValue\">The value at the right end of the scrollbar.</param>\n      <param name=\"style\">The style to use for the scrollbar background. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <returns>\n        <para>The modified value. This can be changed by the user by dragging the scrollbar, or clicking the arrows at the end.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.HorizontalSlider(UnityEngine.Rect,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>A horizontal slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <param name=\"slider\">The GUIStyle to use for displaying the dragging area. If left out, the horizontalSlider style from the current GUISkin is used.</param>\n      <param name=\"thumb\">The GUIStyle to use for displaying draggable thumb. If left out, the horizontalSliderThumb style from the current GUISkin is used.</param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.HorizontalSlider(UnityEngine.Rect,System.Single,System.Single,System.Single,UnityEngine.GUIStyle,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>A horizontal slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <param name=\"slider\">The GUIStyle to use for displaying the dragging area. If left out, the horizontalSlider style from the current GUISkin is used.</param>\n      <param name=\"thumb\">The GUIStyle to use for displaying draggable thumb. If left out, the horizontalSliderThumb style from the current GUISkin is used.</param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Label(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>Make a text or texture label on screen.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the label.</param>\n      <param name=\"text\">Text to display on the label.</param>\n      <param name=\"image\">Texture to display on the label.</param>\n      <param name=\"content\">Text, image and tooltip for this label.</param>\n      <param name=\"style\">The style to use. If left out, the label style from the current GUISkin is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Label(UnityEngine.Rect,UnityEngine.Texture)\">\n      <summary>\n        <para>Make a text or texture label on screen.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the label.</param>\n      <param name=\"text\">Text to display on the label.</param>\n      <param name=\"image\">Texture to display on the label.</param>\n      <param name=\"content\">Text, image and tooltip for this label.</param>\n      <param name=\"style\">The style to use. If left out, the label style from the current GUISkin is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Label(UnityEngine.Rect,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a text or texture label on screen.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the label.</param>\n      <param name=\"text\">Text to display on the label.</param>\n      <param name=\"image\">Texture to display on the label.</param>\n      <param name=\"content\">Text, image and tooltip for this label.</param>\n      <param name=\"style\">The style to use. If left out, the label style from the current GUISkin is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Label(UnityEngine.Rect,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text or texture label on screen.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the label.</param>\n      <param name=\"text\">Text to display on the label.</param>\n      <param name=\"image\">Texture to display on the label.</param>\n      <param name=\"content\">Text, image and tooltip for this label.</param>\n      <param name=\"style\">The style to use. If left out, the label style from the current GUISkin is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Label(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text or texture label on screen.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the label.</param>\n      <param name=\"text\">Text to display on the label.</param>\n      <param name=\"image\">Texture to display on the label.</param>\n      <param name=\"content\">Text, image and tooltip for this label.</param>\n      <param name=\"style\">The style to use. If left out, the label style from the current GUISkin is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Label(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text or texture label on screen.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the label.</param>\n      <param name=\"text\">Text to display on the label.</param>\n      <param name=\"image\">Texture to display on the label.</param>\n      <param name=\"content\">Text, image and tooltip for this label.</param>\n      <param name=\"style\">The style to use. If left out, the label style from the current GUISkin is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.ModalWindow\">\n      <summary>\n        <para>Show a Modal Window.</para>\n      </summary>\n      <param name=\"id\">A unique id number.</param>\n      <param name=\"clientRect\">Position and size of the window.</param>\n      <param name=\"func\">A function which contains the immediate mode GUI code to draw the contents of your window.</param>\n      <param name=\"text\">Text to appear in the title-bar area of the window, if any.</param>\n      <param name=\"image\">An image to appear in the title bar of the window, if any.</param>\n      <param name=\"content\">GUIContent to appear in the title bar of the window, if any.</param>\n      <param name=\"style\">Style to apply to the window.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.ModalWindow(System.Int32,UnityEngine.Rect,UnityEngine.GUI/WindowFunction,System.String)\">\n      <summary>\n        <para>Show a Modal Window.</para>\n      </summary>\n      <param name=\"id\">A unique id number.</param>\n      <param name=\"clientRect\">Position and size of the window.</param>\n      <param name=\"func\">A function which contains the immediate mode GUI code to draw the contents of your window.</param>\n      <param name=\"text\">Text to appear in the title-bar area of the window, if any.</param>\n      <param name=\"image\">An image to appear in the title bar of the window, if any.</param>\n      <param name=\"content\">GUIContent to appear in the title bar of the window, if any.</param>\n      <param name=\"style\">Style to apply to the window.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.ModalWindow(System.Int32,UnityEngine.Rect,UnityEngine.GUI/WindowFunction,UnityEngine.Texture)\">\n      <summary>\n        <para>Show a Modal Window.</para>\n      </summary>\n      <param name=\"id\">A unique id number.</param>\n      <param name=\"clientRect\">Position and size of the window.</param>\n      <param name=\"func\">A function which contains the immediate mode GUI code to draw the contents of your window.</param>\n      <param name=\"text\">Text to appear in the title-bar area of the window, if any.</param>\n      <param name=\"image\">An image to appear in the title bar of the window, if any.</param>\n      <param name=\"content\">GUIContent to appear in the title bar of the window, if any.</param>\n      <param name=\"style\">Style to apply to the window.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.ModalWindow(System.Int32,UnityEngine.Rect,UnityEngine.GUI/WindowFunction,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Show a Modal Window.</para>\n      </summary>\n      <param name=\"id\">A unique id number.</param>\n      <param name=\"clientRect\">Position and size of the window.</param>\n      <param name=\"func\">A function which contains the immediate mode GUI code to draw the contents of your window.</param>\n      <param name=\"text\">Text to appear in the title-bar area of the window, if any.</param>\n      <param name=\"image\">An image to appear in the title bar of the window, if any.</param>\n      <param name=\"content\">GUIContent to appear in the title bar of the window, if any.</param>\n      <param name=\"style\">Style to apply to the window.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.ModalWindow(System.Int32,UnityEngine.Rect,UnityEngine.GUI/WindowFunction,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Show a Modal Window.</para>\n      </summary>\n      <param name=\"id\">A unique id number.</param>\n      <param name=\"clientRect\">Position and size of the window.</param>\n      <param name=\"func\">A function which contains the immediate mode GUI code to draw the contents of your window.</param>\n      <param name=\"text\">Text to appear in the title-bar area of the window, if any.</param>\n      <param name=\"image\">An image to appear in the title bar of the window, if any.</param>\n      <param name=\"content\">GUIContent to appear in the title bar of the window, if any.</param>\n      <param name=\"style\">Style to apply to the window.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.ModalWindow(System.Int32,UnityEngine.Rect,UnityEngine.GUI/WindowFunction,UnityEngine.Texture,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Show a Modal Window.</para>\n      </summary>\n      <param name=\"id\">A unique id number.</param>\n      <param name=\"clientRect\">Position and size of the window.</param>\n      <param name=\"func\">A function which contains the immediate mode GUI code to draw the contents of your window.</param>\n      <param name=\"text\">Text to appear in the title-bar area of the window, if any.</param>\n      <param name=\"image\">An image to appear in the title bar of the window, if any.</param>\n      <param name=\"content\">GUIContent to appear in the title bar of the window, if any.</param>\n      <param name=\"style\">Style to apply to the window.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.ModalWindow(System.Int32,UnityEngine.Rect,UnityEngine.GUI/WindowFunction,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Show a Modal Window.</para>\n      </summary>\n      <param name=\"id\">A unique id number.</param>\n      <param name=\"clientRect\">Position and size of the window.</param>\n      <param name=\"func\">A function which contains the immediate mode GUI code to draw the contents of your window.</param>\n      <param name=\"text\">Text to appear in the title-bar area of the window, if any.</param>\n      <param name=\"image\">An image to appear in the title bar of the window, if any.</param>\n      <param name=\"content\">GUIContent to appear in the title bar of the window, if any.</param>\n      <param name=\"style\">Style to apply to the window.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.ModalWindow\">\n      <summary>\n        <para>Show a Modal Window.</para>\n      </summary>\n      <param name=\"id\">A unique id number.</param>\n      <param name=\"clientRect\">Position and size of the window.</param>\n      <param name=\"func\">A function which contains the immediate mode GUI code to draw the contents of your window.</param>\n      <param name=\"text\">Text to appear in the title-bar area of the window, if any.</param>\n      <param name=\"image\">An image to appear in the title bar of the window, if any.</param>\n      <param name=\"content\">GUIContent to appear in the title bar of the window, if any.</param>\n      <param name=\"style\">Style to apply to the window.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.PasswordField(UnityEngine.Rect,System.String,System.Char)\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"password\">Password to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maskChar\">Character to mask the password with.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textField style from the current GUISkin is used.</param>\n      <returns>\n        <para>The edited password.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.PasswordField(UnityEngine.Rect,System.String,System.Char,System.Int32)\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"password\">Password to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maskChar\">Character to mask the password with.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textField style from the current GUISkin is used.</param>\n      <returns>\n        <para>The edited password.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.PasswordField(UnityEngine.Rect,System.String,System.Char,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"password\">Password to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maskChar\">Character to mask the password with.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textField style from the current GUISkin is used.</param>\n      <returns>\n        <para>The edited password.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.PasswordField(UnityEngine.Rect,System.String,System.Char,System.Int32,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"password\">Password to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maskChar\">Character to mask the password with.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textField style from the current GUISkin is used.</param>\n      <returns>\n        <para>The edited password.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.RepeatButton(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>Make a button that is active as long as the user holds it down.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <returns>\n        <para>True when the users clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.RepeatButton(UnityEngine.Rect,UnityEngine.Texture)\">\n      <summary>\n        <para>Make a button that is active as long as the user holds it down.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <returns>\n        <para>True when the users clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.RepeatButton(UnityEngine.Rect,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a button that is active as long as the user holds it down.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <returns>\n        <para>True when the users clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.RepeatButton(UnityEngine.Rect,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a button that is active as long as the user holds it down.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <returns>\n        <para>True when the users clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.RepeatButton(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a button that is active as long as the user holds it down.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <returns>\n        <para>True when the users clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.RepeatButton(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a button that is active as long as the user holds it down.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <returns>\n        <para>True when the users clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.ScrollTo(UnityEngine.Rect)\">\n      <summary>\n        <para>Scrolls all enclosing scrollviews so they try to make position visible.</para>\n      </summary>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"T:UnityEngine.GUI.ScrollViewScope\">\n      <summary>\n        <para>Disposable helper class for managing BeginScrollView / EndScrollView.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUI.ScrollViewScope.handleScrollWheel\">\n      <summary>\n        <para>Whether this ScrollView should handle scroll wheel events. (default: true).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUI.ScrollViewScope.scrollPosition\">\n      <summary>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUI.ScrollViewScope.#ctor(UnityEngine.Rect,UnityEngine.Vector2,UnityEngine.Rect)\">\n      <summary>\n        <para>Create a new ScrollViewScope and begin the corresponding ScrollView.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the ScrollView.</param>\n      <param name=\"scrollPosition\">The pixel distance that the view is scrolled in the X and Y directions.</param>\n      <param name=\"viewRect\">The rectangle used inside the scrollview.</param>\n      <param name=\"alwaysShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when clientRect is wider than position.</param>\n      <param name=\"alwaysShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when clientRect is taller than position.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.ScrollViewScope.#ctor(UnityEngine.Rect,UnityEngine.Vector2,UnityEngine.Rect,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Create a new ScrollViewScope and begin the corresponding ScrollView.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the ScrollView.</param>\n      <param name=\"scrollPosition\">The pixel distance that the view is scrolled in the X and Y directions.</param>\n      <param name=\"viewRect\">The rectangle used inside the scrollview.</param>\n      <param name=\"alwaysShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when clientRect is wider than position.</param>\n      <param name=\"alwaysShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when clientRect is taller than position.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.ScrollViewScope.#ctor(UnityEngine.Rect,UnityEngine.Vector2,UnityEngine.Rect,UnityEngine.GUIStyle,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Create a new ScrollViewScope and begin the corresponding ScrollView.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the ScrollView.</param>\n      <param name=\"scrollPosition\">The pixel distance that the view is scrolled in the X and Y directions.</param>\n      <param name=\"viewRect\">The rectangle used inside the scrollview.</param>\n      <param name=\"alwaysShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when clientRect is wider than position.</param>\n      <param name=\"alwaysShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when clientRect is taller than position.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.ScrollViewScope.#ctor(UnityEngine.Rect,UnityEngine.Vector2,UnityEngine.Rect,System.Boolean,System.Boolean,UnityEngine.GUIStyle,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Create a new ScrollViewScope and begin the corresponding ScrollView.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the ScrollView.</param>\n      <param name=\"scrollPosition\">The pixel distance that the view is scrolled in the X and Y directions.</param>\n      <param name=\"viewRect\">The rectangle used inside the scrollview.</param>\n      <param name=\"alwaysShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when clientRect is wider than position.</param>\n      <param name=\"alwaysShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when clientRect is taller than position.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.SelectionGrid(UnityEngine.Rect,System.Int32,System.String[],System.Int32)\">\n      <summary>\n        <para>Make a grid of buttons.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the grid.</param>\n      <param name=\"selected\">The index of the selected grid button.</param>\n      <param name=\"texts\">An array of strings to show on the grid buttons.</param>\n      <param name=\"images\">An array of textures on the grid buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the grid button.</param>\n      <param name=\"xCount\">How many elements to fit in the horizontal direction. The controls will be scaled to fit unless the style defines a fixedWidth to use.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"content\"></param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.SelectionGrid(UnityEngine.Rect,System.Int32,UnityEngine.Texture[],System.Int32)\">\n      <summary>\n        <para>Make a grid of buttons.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the grid.</param>\n      <param name=\"selected\">The index of the selected grid button.</param>\n      <param name=\"texts\">An array of strings to show on the grid buttons.</param>\n      <param name=\"images\">An array of textures on the grid buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the grid button.</param>\n      <param name=\"xCount\">How many elements to fit in the horizontal direction. The controls will be scaled to fit unless the style defines a fixedWidth to use.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"content\"></param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.SelectionGrid(UnityEngine.Rect,System.Int32,UnityEngine.GUIContent[],System.Int32)\">\n      <summary>\n        <para>Make a grid of buttons.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the grid.</param>\n      <param name=\"selected\">The index of the selected grid button.</param>\n      <param name=\"texts\">An array of strings to show on the grid buttons.</param>\n      <param name=\"images\">An array of textures on the grid buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the grid button.</param>\n      <param name=\"xCount\">How many elements to fit in the horizontal direction. The controls will be scaled to fit unless the style defines a fixedWidth to use.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"content\"></param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.SelectionGrid(UnityEngine.Rect,System.Int32,System.String[],System.Int32,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a grid of buttons.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the grid.</param>\n      <param name=\"selected\">The index of the selected grid button.</param>\n      <param name=\"texts\">An array of strings to show on the grid buttons.</param>\n      <param name=\"images\">An array of textures on the grid buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the grid button.</param>\n      <param name=\"xCount\">How many elements to fit in the horizontal direction. The controls will be scaled to fit unless the style defines a fixedWidth to use.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"content\"></param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.SelectionGrid(UnityEngine.Rect,System.Int32,UnityEngine.Texture[],System.Int32,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a grid of buttons.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the grid.</param>\n      <param name=\"selected\">The index of the selected grid button.</param>\n      <param name=\"texts\">An array of strings to show on the grid buttons.</param>\n      <param name=\"images\">An array of textures on the grid buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the grid button.</param>\n      <param name=\"xCount\">How many elements to fit in the horizontal direction. The controls will be scaled to fit unless the style defines a fixedWidth to use.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"content\"></param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.SelectionGrid(UnityEngine.Rect,System.Int32,UnityEngine.GUIContent[],System.Int32,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a grid of buttons.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the grid.</param>\n      <param name=\"selected\">The index of the selected grid button.</param>\n      <param name=\"texts\">An array of strings to show on the grid buttons.</param>\n      <param name=\"images\">An array of textures on the grid buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the grid button.</param>\n      <param name=\"xCount\">How many elements to fit in the horizontal direction. The controls will be scaled to fit unless the style defines a fixedWidth to use.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"content\"></param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.SetNextControlName(System.String)\">\n      <summary>\n        <para>Set the name of the next control.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUI.TextArea(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>Make a Multi-line text area where the user can edit a string.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"text\">Text to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textArea style from the current GUISkin is used.</param>\n      <returns>\n        <para>The edited string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.TextArea(UnityEngine.Rect,System.String,System.Int32)\">\n      <summary>\n        <para>Make a Multi-line text area where the user can edit a string.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"text\">Text to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textArea style from the current GUISkin is used.</param>\n      <returns>\n        <para>The edited string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.TextArea(UnityEngine.Rect,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a Multi-line text area where the user can edit a string.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"text\">Text to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textArea style from the current GUISkin is used.</param>\n      <returns>\n        <para>The edited string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.TextArea(UnityEngine.Rect,System.String,System.Int32,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a Multi-line text area where the user can edit a string.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"text\">Text to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textArea style from the current GUISkin is used.</param>\n      <returns>\n        <para>The edited string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.TextField(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>Make a single-line text field where the user can edit a string.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"text\">Text to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textField style from the current GUISkin is used.</param>\n      <returns>\n        <para>The edited string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.TextField(UnityEngine.Rect,System.String,System.Int32)\">\n      <summary>\n        <para>Make a single-line text field where the user can edit a string.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"text\">Text to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textField style from the current GUISkin is used.</param>\n      <returns>\n        <para>The edited string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.TextField(UnityEngine.Rect,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a single-line text field where the user can edit a string.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"text\">Text to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textField style from the current GUISkin is used.</param>\n      <returns>\n        <para>The edited string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.TextField(UnityEngine.Rect,System.String,System.Int32,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a single-line text field where the user can edit a string.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the text field.</param>\n      <param name=\"text\">Text to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textField style from the current GUISkin is used.</param>\n      <returns>\n        <para>The edited string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Toggle(UnityEngine.Rect,System.Boolean,System.String)\">\n      <summary>\n        <para>Make an on/off toggle button.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"value\">Is this button on or off?</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the toggle style from the current GUISkin is used.</param>\n      <returns>\n        <para>The new value of the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Toggle(UnityEngine.Rect,System.Boolean,UnityEngine.Texture)\">\n      <summary>\n        <para>Make an on/off toggle button.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"value\">Is this button on or off?</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the toggle style from the current GUISkin is used.</param>\n      <returns>\n        <para>The new value of the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Toggle(UnityEngine.Rect,System.Boolean,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make an on/off toggle button.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"value\">Is this button on or off?</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the toggle style from the current GUISkin is used.</param>\n      <returns>\n        <para>The new value of the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Toggle(UnityEngine.Rect,System.Boolean,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make an on/off toggle button.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"value\">Is this button on or off?</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the toggle style from the current GUISkin is used.</param>\n      <returns>\n        <para>The new value of the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Toggle(UnityEngine.Rect,System.Boolean,UnityEngine.Texture,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make an on/off toggle button.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"value\">Is this button on or off?</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the toggle style from the current GUISkin is used.</param>\n      <returns>\n        <para>The new value of the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Toggle(UnityEngine.Rect,System.Boolean,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make an on/off toggle button.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the button.</param>\n      <param name=\"value\">Is this button on or off?</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the toggle style from the current GUISkin is used.</param>\n      <returns>\n        <para>The new value of the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Toolbar(UnityEngine.Rect,System.Int32,System.String[])\">\n      <summary>\n        <para>Make a toolbar.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the toolbar.</param>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the toolbar buttons.</param>\n      <param name=\"images\">An array of textures on the toolbar buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the toolbar buttons.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"buttonSize\">Determines how toolbar button size is calculated.</param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Toolbar(UnityEngine.Rect,System.Int32,UnityEngine.Texture[])\">\n      <summary>\n        <para>Make a toolbar.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the toolbar.</param>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the toolbar buttons.</param>\n      <param name=\"images\">An array of textures on the toolbar buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the toolbar buttons.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"buttonSize\">Determines how toolbar button size is calculated.</param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Toolbar(UnityEngine.Rect,System.Int32,UnityEngine.GUIContent[])\">\n      <summary>\n        <para>Make a toolbar.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the toolbar.</param>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the toolbar buttons.</param>\n      <param name=\"images\">An array of textures on the toolbar buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the toolbar buttons.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"buttonSize\">Determines how toolbar button size is calculated.</param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Toolbar(UnityEngine.Rect,System.Int32,System.String[],UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a toolbar.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the toolbar.</param>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the toolbar buttons.</param>\n      <param name=\"images\">An array of textures on the toolbar buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the toolbar buttons.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"buttonSize\">Determines how toolbar button size is calculated.</param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Toolbar(UnityEngine.Rect,System.Int32,UnityEngine.Texture[],UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a toolbar.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the toolbar.</param>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the toolbar buttons.</param>\n      <param name=\"images\">An array of textures on the toolbar buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the toolbar buttons.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"buttonSize\">Determines how toolbar button size is calculated.</param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Toolbar(UnityEngine.Rect,System.Int32,UnityEngine.GUIContent[],UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a toolbar.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the toolbar.</param>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the toolbar buttons.</param>\n      <param name=\"images\">An array of textures on the toolbar buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the toolbar buttons.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"buttonSize\">Determines how toolbar button size is calculated.</param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Toolbar(UnityEngine.Rect,System.Int32,UnityEngine.GUIContent[],UnityEngine.GUIStyle,UnityEngine.GUI/ToolbarButtonSize)\">\n      <summary>\n        <para>Make a toolbar.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the toolbar.</param>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the toolbar buttons.</param>\n      <param name=\"images\">An array of textures on the toolbar buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the toolbar buttons.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"buttonSize\">Determines how toolbar button size is calculated.</param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.GUI.ToolbarButtonSize\">\n      <summary>\n        <para>Determines how toolbar button size is calculated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GUI.ToolbarButtonSize.FitToContents\">\n      <summary>\n        <para>The width of each toolbar button is calculated based on the width of its content.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GUI.ToolbarButtonSize.Fixed\">\n      <summary>\n        <para>Calculates the button size by dividing the available width by the number of buttons. The minimum size is the maximum content width.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUI.UnfocusWindow\">\n      <summary>\n        <para>Remove focus from all windows.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUI.VerticalScrollbar(UnityEngine.Rect,System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Make a vertical scrollbar. Scrollbars are what you use to scroll through a document. Most likely, you want to use scrollViews instead.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the scrollbar.</param>\n      <param name=\"value\">The position between min and max.</param>\n      <param name=\"size\">How much can we see?</param>\n      <param name=\"topValue\">The value at the top of the scrollbar.</param>\n      <param name=\"bottomValue\">The value at the bottom of the scrollbar.</param>\n      <param name=\"style\">The style to use for the scrollbar background. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <returns>\n        <para>The modified value. This can be changed by the user by dragging the scrollbar, or clicking the arrows at the end.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.VerticalScrollbar(UnityEngine.Rect,System.Single,System.Single,System.Single,System.Single,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a vertical scrollbar. Scrollbars are what you use to scroll through a document. Most likely, you want to use scrollViews instead.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the scrollbar.</param>\n      <param name=\"value\">The position between min and max.</param>\n      <param name=\"size\">How much can we see?</param>\n      <param name=\"topValue\">The value at the top of the scrollbar.</param>\n      <param name=\"bottomValue\">The value at the bottom of the scrollbar.</param>\n      <param name=\"style\">The style to use for the scrollbar background. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <returns>\n        <para>The modified value. This can be changed by the user by dragging the scrollbar, or clicking the arrows at the end.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.VerticalSlider(UnityEngine.Rect,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>A vertical slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"topValue\">The value at the top end of the slider.</param>\n      <param name=\"bottomValue\">The value at the bottom end of the slider.</param>\n      <param name=\"slider\">The GUIStyle to use for displaying the dragging area. If left out, the horizontalSlider style from the current GUISkin is used.</param>\n      <param name=\"thumb\">The GUIStyle to use for displaying draggable thumb. If left out, the horizontalSliderThumb style from the current GUISkin is used.</param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.VerticalSlider(UnityEngine.Rect,System.Single,System.Single,System.Single,UnityEngine.GUIStyle,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>A vertical slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"position\">Rectangle on the screen to use for the slider.</param>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"topValue\">The value at the top end of the slider.</param>\n      <param name=\"bottomValue\">The value at the bottom end of the slider.</param>\n      <param name=\"slider\">The GUIStyle to use for displaying the dragging area. If left out, the horizontalSlider style from the current GUISkin is used.</param>\n      <param name=\"thumb\">The GUIStyle to use for displaying draggable thumb. If left out, the horizontalSliderThumb style from the current GUISkin is used.</param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Window(System.Int32,UnityEngine.Rect,UnityEngine.GUI/WindowFunction,System.String)\">\n      <summary>\n        <para>Make a popup window.</para>\n      </summary>\n      <param name=\"Style\">An optional style to use for the window. If left out, the window style from the current GUISkin is used.</param>\n      <param name=\"id\">ID number for the window (can be any value as long as it is unique).</param>\n      <param name=\"clientRect\">Onscreen rectangle denoting the window's position and size.</param>\n      <param name=\"func\">Script function to display the window's contents.</param>\n      <param name=\"text\">Text to render inside the window.</param>\n      <param name=\"image\">Image to render inside the window.</param>\n      <param name=\"content\">GUIContent to render inside the window.</param>\n      <param name=\"style\">Style information for the window.</param>\n      <param name=\"title\">Text displayed in the window's title bar.</param>\n      <returns>\n        <para>Onscreen rectangle denoting the window's position and size.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Window(System.Int32,UnityEngine.Rect,UnityEngine.GUI/WindowFunction,UnityEngine.Texture)\">\n      <summary>\n        <para>Make a popup window.</para>\n      </summary>\n      <param name=\"Style\">An optional style to use for the window. If left out, the window style from the current GUISkin is used.</param>\n      <param name=\"id\">ID number for the window (can be any value as long as it is unique).</param>\n      <param name=\"clientRect\">Onscreen rectangle denoting the window's position and size.</param>\n      <param name=\"func\">Script function to display the window's contents.</param>\n      <param name=\"text\">Text to render inside the window.</param>\n      <param name=\"image\">Image to render inside the window.</param>\n      <param name=\"content\">GUIContent to render inside the window.</param>\n      <param name=\"style\">Style information for the window.</param>\n      <param name=\"title\">Text displayed in the window's title bar.</param>\n      <returns>\n        <para>Onscreen rectangle denoting the window's position and size.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Window(System.Int32,UnityEngine.Rect,UnityEngine.GUI/WindowFunction,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Make a popup window.</para>\n      </summary>\n      <param name=\"Style\">An optional style to use for the window. If left out, the window style from the current GUISkin is used.</param>\n      <param name=\"id\">ID number for the window (can be any value as long as it is unique).</param>\n      <param name=\"clientRect\">Onscreen rectangle denoting the window's position and size.</param>\n      <param name=\"func\">Script function to display the window's contents.</param>\n      <param name=\"text\">Text to render inside the window.</param>\n      <param name=\"image\">Image to render inside the window.</param>\n      <param name=\"content\">GUIContent to render inside the window.</param>\n      <param name=\"style\">Style information for the window.</param>\n      <param name=\"title\">Text displayed in the window's title bar.</param>\n      <returns>\n        <para>Onscreen rectangle denoting the window's position and size.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Window(System.Int32,UnityEngine.Rect,UnityEngine.GUI/WindowFunction,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a popup window.</para>\n      </summary>\n      <param name=\"Style\">An optional style to use for the window. If left out, the window style from the current GUISkin is used.</param>\n      <param name=\"id\">ID number for the window (can be any value as long as it is unique).</param>\n      <param name=\"clientRect\">Onscreen rectangle denoting the window's position and size.</param>\n      <param name=\"func\">Script function to display the window's contents.</param>\n      <param name=\"text\">Text to render inside the window.</param>\n      <param name=\"image\">Image to render inside the window.</param>\n      <param name=\"content\">GUIContent to render inside the window.</param>\n      <param name=\"style\">Style information for the window.</param>\n      <param name=\"title\">Text displayed in the window's title bar.</param>\n      <returns>\n        <para>Onscreen rectangle denoting the window's position and size.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Window(System.Int32,UnityEngine.Rect,UnityEngine.GUI/WindowFunction,UnityEngine.Texture,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a popup window.</para>\n      </summary>\n      <param name=\"Style\">An optional style to use for the window. If left out, the window style from the current GUISkin is used.</param>\n      <param name=\"id\">ID number for the window (can be any value as long as it is unique).</param>\n      <param name=\"clientRect\">Onscreen rectangle denoting the window's position and size.</param>\n      <param name=\"func\">Script function to display the window's contents.</param>\n      <param name=\"text\">Text to render inside the window.</param>\n      <param name=\"image\">Image to render inside the window.</param>\n      <param name=\"content\">GUIContent to render inside the window.</param>\n      <param name=\"style\">Style information for the window.</param>\n      <param name=\"title\">Text displayed in the window's title bar.</param>\n      <returns>\n        <para>Onscreen rectangle denoting the window's position and size.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUI.Window(System.Int32,UnityEngine.Rect,UnityEngine.GUI/WindowFunction,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Make a popup window.</para>\n      </summary>\n      <param name=\"Style\">An optional style to use for the window. If left out, the window style from the current GUISkin is used.</param>\n      <param name=\"id\">ID number for the window (can be any value as long as it is unique).</param>\n      <param name=\"clientRect\">Onscreen rectangle denoting the window's position and size.</param>\n      <param name=\"func\">Script function to display the window's contents.</param>\n      <param name=\"text\">Text to render inside the window.</param>\n      <param name=\"image\">Image to render inside the window.</param>\n      <param name=\"content\">GUIContent to render inside the window.</param>\n      <param name=\"style\">Style information for the window.</param>\n      <param name=\"title\">Text displayed in the window's title bar.</param>\n      <returns>\n        <para>Onscreen rectangle denoting the window's position and size.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.GUI.WindowFunction\">\n      <summary>\n        <para>Callback to draw GUI within a window (used with GUI.Window).</para>\n      </summary>\n      <param name=\"id\"></param>\n    </member>\n    <member name=\"T:UnityEngine.GUIContent\">\n      <summary>\n        <para>The contents of a GUI element.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIContent.image\">\n      <summary>\n        <para>The icon image contained.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.GUIContent.none\">\n      <summary>\n        <para>Shorthand for empty content.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIContent.text\">\n      <summary>\n        <para>The text contained.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIContent.tooltip\">\n      <summary>\n        <para>The tooltip of this element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUIContent.#ctor\">\n      <summary>\n        <para>Constructor for GUIContent in all shapes and sizes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUIContent.#ctor(System.String)\">\n      <summary>\n        <para>Build a GUIContent object containing only text.</para>\n      </summary>\n      <param name=\"text\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIContent.#ctor(UnityEngine.Texture)\">\n      <summary>\n        <para>Build a GUIContent object containing only an image.</para>\n      </summary>\n      <param name=\"image\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIContent.#ctor(System.String,UnityEngine.Texture)\">\n      <summary>\n        <para>Build a GUIContent object containing both text and an image.</para>\n      </summary>\n      <param name=\"text\"></param>\n      <param name=\"image\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIContent.#ctor(System.String,System.String)\">\n      <summary>\n        <para>Build a GUIContent containing some text. When the user hovers the mouse over it, the global GUI.tooltip is set to the tooltip.</para>\n      </summary>\n      <param name=\"text\"></param>\n      <param name=\"tooltip\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIContent.#ctor(UnityEngine.Texture,System.String)\">\n      <summary>\n        <para>Build a GUIContent containing an image. When the user hovers the mouse over it, the global GUI.tooltip is set to the tooltip.</para>\n      </summary>\n      <param name=\"image\"></param>\n      <param name=\"tooltip\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIContent.#ctor(System.String,UnityEngine.Texture,System.String)\">\n      <summary>\n        <para>Build a GUIContent that contains both text, an image and has a tooltip defined. When the user hovers the mouse over it, the global GUI.tooltip is set to the tooltip.</para>\n      </summary>\n      <param name=\"text\"></param>\n      <param name=\"image\"></param>\n      <param name=\"tooltip\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIContent.#ctor(UnityEngine.GUIContent)\">\n      <summary>\n        <para>Build a GUIContent as a copy of another GUIContent.</para>\n      </summary>\n      <param name=\"src\"></param>\n    </member>\n    <member name=\"T:UnityEngine.GUIElement\">\n      <summary>\n        <para>Base class for images &amp; text strings displayed in a GUI.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUIElement.GetScreenRect()\">\n      <summary>\n        <para>Returns bounding rectangle of GUIElement in screen coordinates.</para>\n      </summary>\n      <param name=\"camera\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIElement.GetScreenRect(UnityEngine.Camera)\">\n      <summary>\n        <para>Returns bounding rectangle of GUIElement in screen coordinates.</para>\n      </summary>\n      <param name=\"camera\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIElement.HitTest(UnityEngine.Vector3)\">\n      <summary>\n        <para>Is a point on screen inside the element?</para>\n      </summary>\n      <param name=\"screenPosition\"></param>\n      <param name=\"camera\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIElement.HitTest(UnityEngine.Vector3,UnityEngine.Camera)\">\n      <summary>\n        <para>Is a point on screen inside the element?</para>\n      </summary>\n      <param name=\"screenPosition\"></param>\n      <param name=\"camera\"></param>\n    </member>\n    <member name=\"T:UnityEngine.GUILayer\">\n      <summary>\n        <para>Component added to a camera to make it render 2D GUI elements.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUILayer.HitTest(UnityEngine.Vector3)\">\n      <summary>\n        <para>Get the GUI element at a specific screen position.</para>\n      </summary>\n      <param name=\"screenPosition\"></param>\n    </member>\n    <member name=\"T:UnityEngine.GUILayout\">\n      <summary>\n        <para>The GUILayout class is the interface for Unity gui with automatic layout.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.GUILayout.AreaScope\">\n      <summary>\n        <para>Disposable helper class for managing BeginArea / EndArea.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.AreaScope.#ctor(UnityEngine.Rect)\">\n      <summary>\n        <para>Create a new AreaScope and begin the corresponding Area.</para>\n      </summary>\n      <param name=\"text\">Optional text to display in the area.</param>\n      <param name=\"image\">Optional texture to display in the area.</param>\n      <param name=\"content\">Optional text, image and tooltip top display for this area.</param>\n      <param name=\"style\">The style to use. If left out, the empty GUIStyle (GUIStyle.none) is used, giving a transparent background.</param>\n      <param name=\"screenRect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.AreaScope.#ctor(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>Create a new AreaScope and begin the corresponding Area.</para>\n      </summary>\n      <param name=\"text\">Optional text to display in the area.</param>\n      <param name=\"image\">Optional texture to display in the area.</param>\n      <param name=\"content\">Optional text, image and tooltip top display for this area.</param>\n      <param name=\"style\">The style to use. If left out, the empty GUIStyle (GUIStyle.none) is used, giving a transparent background.</param>\n      <param name=\"screenRect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.AreaScope.#ctor(UnityEngine.Rect,UnityEngine.Texture)\">\n      <summary>\n        <para>Create a new AreaScope and begin the corresponding Area.</para>\n      </summary>\n      <param name=\"text\">Optional text to display in the area.</param>\n      <param name=\"image\">Optional texture to display in the area.</param>\n      <param name=\"content\">Optional text, image and tooltip top display for this area.</param>\n      <param name=\"style\">The style to use. If left out, the empty GUIStyle (GUIStyle.none) is used, giving a transparent background.</param>\n      <param name=\"screenRect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.AreaScope.#ctor(UnityEngine.Rect,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Create a new AreaScope and begin the corresponding Area.</para>\n      </summary>\n      <param name=\"text\">Optional text to display in the area.</param>\n      <param name=\"image\">Optional texture to display in the area.</param>\n      <param name=\"content\">Optional text, image and tooltip top display for this area.</param>\n      <param name=\"style\">The style to use. If left out, the empty GUIStyle (GUIStyle.none) is used, giving a transparent background.</param>\n      <param name=\"screenRect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.AreaScope.#ctor(UnityEngine.Rect,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Create a new AreaScope and begin the corresponding Area.</para>\n      </summary>\n      <param name=\"text\">Optional text to display in the area.</param>\n      <param name=\"image\">Optional texture to display in the area.</param>\n      <param name=\"content\">Optional text, image and tooltip top display for this area.</param>\n      <param name=\"style\">The style to use. If left out, the empty GUIStyle (GUIStyle.none) is used, giving a transparent background.</param>\n      <param name=\"screenRect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.AreaScope.#ctor(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Create a new AreaScope and begin the corresponding Area.</para>\n      </summary>\n      <param name=\"text\">Optional text to display in the area.</param>\n      <param name=\"image\">Optional texture to display in the area.</param>\n      <param name=\"content\">Optional text, image and tooltip top display for this area.</param>\n      <param name=\"style\">The style to use. If left out, the empty GUIStyle (GUIStyle.none) is used, giving a transparent background.</param>\n      <param name=\"screenRect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.AreaScope.#ctor(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Create a new AreaScope and begin the corresponding Area.</para>\n      </summary>\n      <param name=\"text\">Optional text to display in the area.</param>\n      <param name=\"image\">Optional texture to display in the area.</param>\n      <param name=\"content\">Optional text, image and tooltip top display for this area.</param>\n      <param name=\"style\">The style to use. If left out, the empty GUIStyle (GUIStyle.none) is used, giving a transparent background.</param>\n      <param name=\"screenRect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginArea(UnityEngine.Rect)\">\n      <summary>\n        <para>Begin a GUILayout block of GUI controls in a fixed screen area.</para>\n      </summary>\n      <param name=\"text\">Optional text to display in the area.</param>\n      <param name=\"image\">Optional texture to display in the area.</param>\n      <param name=\"content\">Optional text, image and tooltip top display for this area.</param>\n      <param name=\"style\">The style to use. If left out, the empty GUIStyle (GUIStyle.none) is used, giving a transparent background.</param>\n      <param name=\"screenRect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginArea(UnityEngine.Rect,System.String)\">\n      <summary>\n        <para>Begin a GUILayout block of GUI controls in a fixed screen area.</para>\n      </summary>\n      <param name=\"text\">Optional text to display in the area.</param>\n      <param name=\"image\">Optional texture to display in the area.</param>\n      <param name=\"content\">Optional text, image and tooltip top display for this area.</param>\n      <param name=\"style\">The style to use. If left out, the empty GUIStyle (GUIStyle.none) is used, giving a transparent background.</param>\n      <param name=\"screenRect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginArea(UnityEngine.Rect,UnityEngine.Texture)\">\n      <summary>\n        <para>Begin a GUILayout block of GUI controls in a fixed screen area.</para>\n      </summary>\n      <param name=\"text\">Optional text to display in the area.</param>\n      <param name=\"image\">Optional texture to display in the area.</param>\n      <param name=\"content\">Optional text, image and tooltip top display for this area.</param>\n      <param name=\"style\">The style to use. If left out, the empty GUIStyle (GUIStyle.none) is used, giving a transparent background.</param>\n      <param name=\"screenRect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginArea(UnityEngine.Rect,UnityEngine.GUIContent)\">\n      <summary>\n        <para>Begin a GUILayout block of GUI controls in a fixed screen area.</para>\n      </summary>\n      <param name=\"text\">Optional text to display in the area.</param>\n      <param name=\"image\">Optional texture to display in the area.</param>\n      <param name=\"content\">Optional text, image and tooltip top display for this area.</param>\n      <param name=\"style\">The style to use. If left out, the empty GUIStyle (GUIStyle.none) is used, giving a transparent background.</param>\n      <param name=\"screenRect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginArea(UnityEngine.Rect,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Begin a GUILayout block of GUI controls in a fixed screen area.</para>\n      </summary>\n      <param name=\"text\">Optional text to display in the area.</param>\n      <param name=\"image\">Optional texture to display in the area.</param>\n      <param name=\"content\">Optional text, image and tooltip top display for this area.</param>\n      <param name=\"style\">The style to use. If left out, the empty GUIStyle (GUIStyle.none) is used, giving a transparent background.</param>\n      <param name=\"screenRect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginArea(UnityEngine.Rect,System.String,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Begin a GUILayout block of GUI controls in a fixed screen area.</para>\n      </summary>\n      <param name=\"text\">Optional text to display in the area.</param>\n      <param name=\"image\">Optional texture to display in the area.</param>\n      <param name=\"content\">Optional text, image and tooltip top display for this area.</param>\n      <param name=\"style\">The style to use. If left out, the empty GUIStyle (GUIStyle.none) is used, giving a transparent background.</param>\n      <param name=\"screenRect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginArea(UnityEngine.Rect,UnityEngine.Texture,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Begin a GUILayout block of GUI controls in a fixed screen area.</para>\n      </summary>\n      <param name=\"text\">Optional text to display in the area.</param>\n      <param name=\"image\">Optional texture to display in the area.</param>\n      <param name=\"content\">Optional text, image and tooltip top display for this area.</param>\n      <param name=\"style\">The style to use. If left out, the empty GUIStyle (GUIStyle.none) is used, giving a transparent background.</param>\n      <param name=\"screenRect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginArea(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Begin a GUILayout block of GUI controls in a fixed screen area.</para>\n      </summary>\n      <param name=\"text\">Optional text to display in the area.</param>\n      <param name=\"image\">Optional texture to display in the area.</param>\n      <param name=\"content\">Optional text, image and tooltip top display for this area.</param>\n      <param name=\"style\">The style to use. If left out, the empty GUIStyle (GUIStyle.none) is used, giving a transparent background.</param>\n      <param name=\"screenRect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginHorizontal(UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin a Horizontal control group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginHorizontal(UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin a Horizontal control group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginHorizontal(System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin a Horizontal control group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginHorizontal(UnityEngine.Texture,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin a Horizontal control group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginHorizontal(UnityEngine.GUIContent,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin a Horizontal control group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginScrollView(UnityEngine.Vector2,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin an automatically laid out scrollview.</para>\n      </summary>\n      <param name=\"scrollPosition\">The position to use display.</param>\n      <param name=\"alwayShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwayShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when content inside the ScrollView is taller than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"alwaysShowHorizontal\"></param>\n      <param name=\"alwaysShowVertical\"></param>\n      <param name=\"style\"></param>\n      <param name=\"background\"></param>\n      <returns>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginScrollView(UnityEngine.Vector2,System.Boolean,System.Boolean,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin an automatically laid out scrollview.</para>\n      </summary>\n      <param name=\"scrollPosition\">The position to use display.</param>\n      <param name=\"alwayShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwayShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when content inside the ScrollView is taller than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"alwaysShowHorizontal\"></param>\n      <param name=\"alwaysShowVertical\"></param>\n      <param name=\"style\"></param>\n      <param name=\"background\"></param>\n      <returns>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginScrollView(UnityEngine.Vector2,UnityEngine.GUIStyle,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin an automatically laid out scrollview.</para>\n      </summary>\n      <param name=\"scrollPosition\">The position to use display.</param>\n      <param name=\"alwayShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwayShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when content inside the ScrollView is taller than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"alwaysShowHorizontal\"></param>\n      <param name=\"alwaysShowVertical\"></param>\n      <param name=\"style\"></param>\n      <param name=\"background\"></param>\n      <returns>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginScrollView(UnityEngine.Vector2,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Begin an automatically laid out scrollview.</para>\n      </summary>\n      <param name=\"scrollPosition\">The position to use display.</param>\n      <param name=\"alwayShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwayShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when content inside the ScrollView is taller than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"alwaysShowHorizontal\"></param>\n      <param name=\"alwaysShowVertical\"></param>\n      <param name=\"style\"></param>\n      <param name=\"background\"></param>\n      <returns>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginScrollView(UnityEngine.Vector2,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin an automatically laid out scrollview.</para>\n      </summary>\n      <param name=\"scrollPosition\">The position to use display.</param>\n      <param name=\"alwayShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwayShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when content inside the ScrollView is taller than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"alwaysShowHorizontal\"></param>\n      <param name=\"alwaysShowVertical\"></param>\n      <param name=\"style\"></param>\n      <param name=\"background\"></param>\n      <returns>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginScrollView(UnityEngine.Vector2,System.Boolean,System.Boolean,UnityEngine.GUIStyle,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin an automatically laid out scrollview.</para>\n      </summary>\n      <param name=\"scrollPosition\">The position to use display.</param>\n      <param name=\"alwayShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwayShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when content inside the ScrollView is taller than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"alwaysShowHorizontal\"></param>\n      <param name=\"alwaysShowVertical\"></param>\n      <param name=\"style\"></param>\n      <param name=\"background\"></param>\n      <returns>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginScrollView(UnityEngine.Vector2,System.Boolean,System.Boolean,UnityEngine.GUIStyle,UnityEngine.GUIStyle,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin an automatically laid out scrollview.</para>\n      </summary>\n      <param name=\"scrollPosition\">The position to use display.</param>\n      <param name=\"alwayShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwayShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when content inside the ScrollView is taller than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"alwaysShowHorizontal\"></param>\n      <param name=\"alwaysShowVertical\"></param>\n      <param name=\"style\"></param>\n      <param name=\"background\"></param>\n      <returns>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginVertical(UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin a vertical control group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginVertical(UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin a vertical control group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginVertical(System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin a vertical control group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginVertical(UnityEngine.Texture,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin a vertical control group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.BeginVertical(UnityEngine.GUIContent,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Begin a vertical control group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Box(UnityEngine.Texture,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an auto-layout box.</para>\n      </summary>\n      <param name=\"text\">Text to display on the box.</param>\n      <param name=\"image\">Texture to display on the box.</param>\n      <param name=\"content\">Text, image and tooltip for this box.</param>\n      <param name=\"style\">The style to use. If left out, the box style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Box(System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an auto-layout box.</para>\n      </summary>\n      <param name=\"text\">Text to display on the box.</param>\n      <param name=\"image\">Texture to display on the box.</param>\n      <param name=\"content\">Text, image and tooltip for this box.</param>\n      <param name=\"style\">The style to use. If left out, the box style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Box(UnityEngine.GUIContent,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an auto-layout box.</para>\n      </summary>\n      <param name=\"text\">Text to display on the box.</param>\n      <param name=\"image\">Texture to display on the box.</param>\n      <param name=\"content\">Text, image and tooltip for this box.</param>\n      <param name=\"style\">The style to use. If left out, the box style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Box(UnityEngine.Texture,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an auto-layout box.</para>\n      </summary>\n      <param name=\"text\">Text to display on the box.</param>\n      <param name=\"image\">Texture to display on the box.</param>\n      <param name=\"content\">Text, image and tooltip for this box.</param>\n      <param name=\"style\">The style to use. If left out, the box style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Box(System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an auto-layout box.</para>\n      </summary>\n      <param name=\"text\">Text to display on the box.</param>\n      <param name=\"image\">Texture to display on the box.</param>\n      <param name=\"content\">Text, image and tooltip for this box.</param>\n      <param name=\"style\">The style to use. If left out, the box style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Box(UnityEngine.GUIContent,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an auto-layout box.</para>\n      </summary>\n      <param name=\"text\">Text to display on the box.</param>\n      <param name=\"image\">Texture to display on the box.</param>\n      <param name=\"content\">Text, image and tooltip for this box.</param>\n      <param name=\"style\">The style to use. If left out, the box style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Button(UnityEngine.Texture,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a single press button.</para>\n      </summary>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>true when the users clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Button(System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a single press button.</para>\n      </summary>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>true when the users clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Button(UnityEngine.GUIContent,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a single press button.</para>\n      </summary>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>true when the users clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Button(UnityEngine.Texture,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a single press button.</para>\n      </summary>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>true when the users clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Button(System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a single press button.</para>\n      </summary>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>true when the users clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Button(UnityEngine.GUIContent,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a single press button.</para>\n      </summary>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>true when the users clicks the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.EndArea\">\n      <summary>\n        <para>Close a GUILayout block started with BeginArea.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.EndHorizontal\">\n      <summary>\n        <para>Close a group started with BeginHorizontal.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.EndScrollView\">\n      <summary>\n        <para>End a scroll view begun with a call to BeginScrollView.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.EndVertical\">\n      <summary>\n        <para>Close a group started with BeginVertical.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.ExpandHeight(System.Boolean)\">\n      <summary>\n        <para>Option passed to a control to allow or disallow vertical expansion.</para>\n      </summary>\n      <param name=\"expand\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.ExpandWidth(System.Boolean)\">\n      <summary>\n        <para>Option passed to a control to allow or disallow horizontal expansion.</para>\n      </summary>\n      <param name=\"expand\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.FlexibleSpace\">\n      <summary>\n        <para>Insert a flexible space element.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Height(System.Single)\">\n      <summary>\n        <para>Option passed to a control to give it an absolute height.</para>\n      </summary>\n      <param name=\"height\"></param>\n    </member>\n    <member name=\"T:UnityEngine.GUILayout.HorizontalScope\">\n      <summary>\n        <para>Disposable helper class for managing BeginHorizontal / EndHorizontal.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.HorizontalScope.#ctor(UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new HorizontalScope and begin the corresponding horizontal group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.HorizontalScope.#ctor(UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new HorizontalScope and begin the corresponding horizontal group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.HorizontalScope.#ctor(System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new HorizontalScope and begin the corresponding horizontal group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.HorizontalScope.#ctor(UnityEngine.Texture,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new HorizontalScope and begin the corresponding horizontal group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.HorizontalScope.#ctor(UnityEngine.GUIContent,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new HorizontalScope and begin the corresponding horizontal group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.HorizontalScrollbar(System.Single,System.Single,System.Single,System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a horizontal scrollbar.</para>\n      </summary>\n      <param name=\"value\">The position between min and max.</param>\n      <param name=\"size\">How much can we see?</param>\n      <param name=\"leftValue\">The value at the left end of the scrollbar.</param>\n      <param name=\"rightValue\">The value at the right end of the scrollbar.</param>\n      <param name=\"style\">The style to use for the scrollbar background. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.</param>\n      <returns>\n        <para>The modified value. This can be changed by the user by dragging the scrollbar, or clicking the arrows at the end.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.HorizontalScrollbar(System.Single,System.Single,System.Single,System.Single,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a horizontal scrollbar.</para>\n      </summary>\n      <param name=\"value\">The position between min and max.</param>\n      <param name=\"size\">How much can we see?</param>\n      <param name=\"leftValue\">The value at the left end of the scrollbar.</param>\n      <param name=\"rightValue\">The value at the right end of the scrollbar.</param>\n      <param name=\"style\">The style to use for the scrollbar background. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.</param>\n      <returns>\n        <para>The modified value. This can be changed by the user by dragging the scrollbar, or clicking the arrows at the end.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.HorizontalSlider(System.Single,System.Single,System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>A horizontal slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <param name=\"slider\">The GUIStyle to use for displaying the dragging area. If left out, the horizontalSlider style from the current GUISkin is used.</param>\n      <param name=\"thumb\">The GUIStyle to use for displaying draggable thumb. If left out, the horizontalSliderThumb style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.</param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.HorizontalSlider(System.Single,System.Single,System.Single,UnityEngine.GUIStyle,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>A horizontal slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"leftValue\">The value at the left end of the slider.</param>\n      <param name=\"rightValue\">The value at the right end of the slider.</param>\n      <param name=\"slider\">The GUIStyle to use for displaying the dragging area. If left out, the horizontalSlider style from the current GUISkin is used.</param>\n      <param name=\"thumb\">The GUIStyle to use for displaying draggable thumb. If left out, the horizontalSliderThumb style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.</param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Label(UnityEngine.Texture,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an auto-layout label.</para>\n      </summary>\n      <param name=\"text\">Text to display on the label.</param>\n      <param name=\"image\">Texture to display on the label.</param>\n      <param name=\"content\">Text, image and tooltip for this label.</param>\n      <param name=\"style\">The style to use. If left out, the label style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Label(System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an auto-layout label.</para>\n      </summary>\n      <param name=\"text\">Text to display on the label.</param>\n      <param name=\"image\">Texture to display on the label.</param>\n      <param name=\"content\">Text, image and tooltip for this label.</param>\n      <param name=\"style\">The style to use. If left out, the label style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Label(UnityEngine.GUIContent,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an auto-layout label.</para>\n      </summary>\n      <param name=\"text\">Text to display on the label.</param>\n      <param name=\"image\">Texture to display on the label.</param>\n      <param name=\"content\">Text, image and tooltip for this label.</param>\n      <param name=\"style\">The style to use. If left out, the label style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Label(UnityEngine.Texture,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an auto-layout label.</para>\n      </summary>\n      <param name=\"text\">Text to display on the label.</param>\n      <param name=\"image\">Texture to display on the label.</param>\n      <param name=\"content\">Text, image and tooltip for this label.</param>\n      <param name=\"style\">The style to use. If left out, the label style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Label(System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an auto-layout label.</para>\n      </summary>\n      <param name=\"text\">Text to display on the label.</param>\n      <param name=\"image\">Texture to display on the label.</param>\n      <param name=\"content\">Text, image and tooltip for this label.</param>\n      <param name=\"style\">The style to use. If left out, the label style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Label(UnityEngine.GUIContent,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an auto-layout label.</para>\n      </summary>\n      <param name=\"text\">Text to display on the label.</param>\n      <param name=\"image\">Texture to display on the label.</param>\n      <param name=\"content\">Text, image and tooltip for this label.</param>\n      <param name=\"style\">The style to use. If left out, the label style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.MaxHeight(System.Single)\">\n      <summary>\n        <para>Option passed to a control to specify a maximum height.</para>\n      </summary>\n      <param name=\"maxHeight\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.MaxWidth(System.Single)\">\n      <summary>\n        <para>Option passed to a control to specify a maximum width.</para>\n      </summary>\n      <param name=\"maxWidth\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.MinHeight(System.Single)\">\n      <summary>\n        <para>Option passed to a control to specify a minimum height.</para>\n      </summary>\n      <param name=\"minHeight\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.MinWidth(System.Single)\">\n      <summary>\n        <para>Option passed to a control to specify a minimum width.\n</para>\n      </summary>\n      <param name=\"minWidth\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.PasswordField(System.String,System.Char,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"password\">Password to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maskChar\">Character to mask the password with.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textField style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <returns>\n        <para>The edited password.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.PasswordField(System.String,System.Char,System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"password\">Password to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maskChar\">Character to mask the password with.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textField style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <returns>\n        <para>The edited password.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.PasswordField(System.String,System.Char,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"password\">Password to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maskChar\">Character to mask the password with.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textField style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <returns>\n        <para>The edited password.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.PasswordField(System.String,System.Char,System.Int32,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a text field where the user can enter a password.</para>\n      </summary>\n      <param name=\"password\">Password to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maskChar\">Character to mask the password with.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textField style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <returns>\n        <para>The edited password.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.RepeatButton(UnityEngine.Texture,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a repeating button. The button returns true as long as the user holds down the mouse.</para>\n      </summary>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>true when the holds down the mouse.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.RepeatButton(System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a repeating button. The button returns true as long as the user holds down the mouse.</para>\n      </summary>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>true when the holds down the mouse.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.RepeatButton(UnityEngine.GUIContent,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a repeating button. The button returns true as long as the user holds down the mouse.</para>\n      </summary>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>true when the holds down the mouse.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.RepeatButton(UnityEngine.Texture,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a repeating button. The button returns true as long as the user holds down the mouse.</para>\n      </summary>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>true when the holds down the mouse.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.RepeatButton(System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a repeating button. The button returns true as long as the user holds down the mouse.</para>\n      </summary>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>true when the holds down the mouse.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.RepeatButton(UnityEngine.GUIContent,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a repeating button. The button returns true as long as the user holds down the mouse.</para>\n      </summary>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>true when the holds down the mouse.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.GUILayout.ScrollViewScope\">\n      <summary>\n        <para>Disposable helper class for managing BeginScrollView / EndScrollView.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUILayout.ScrollViewScope.handleScrollWheel\">\n      <summary>\n        <para>Whether this ScrollView should handle scroll wheel events. (default: true).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUILayout.ScrollViewScope.scrollPosition\">\n      <summary>\n        <para>The modified scrollPosition. Feed this back into the variable you pass in, as shown in the example.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.ScrollViewScope.#ctor(UnityEngine.Vector2,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new ScrollViewScope and begin the corresponding ScrollView.</para>\n      </summary>\n      <param name=\"scrollPosition\">The position to use display.</param>\n      <param name=\"alwaysShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwaysShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when content inside the ScrollView is taller than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"style\"></param>\n      <param name=\"background\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.ScrollViewScope.#ctor(UnityEngine.Vector2,System.Boolean,System.Boolean,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new ScrollViewScope and begin the corresponding ScrollView.</para>\n      </summary>\n      <param name=\"scrollPosition\">The position to use display.</param>\n      <param name=\"alwaysShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwaysShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when content inside the ScrollView is taller than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"style\"></param>\n      <param name=\"background\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.ScrollViewScope.#ctor(UnityEngine.Vector2,UnityEngine.GUIStyle,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new ScrollViewScope and begin the corresponding ScrollView.</para>\n      </summary>\n      <param name=\"scrollPosition\">The position to use display.</param>\n      <param name=\"alwaysShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwaysShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when content inside the ScrollView is taller than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"style\"></param>\n      <param name=\"background\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.ScrollViewScope.#ctor(UnityEngine.Vector2,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new ScrollViewScope and begin the corresponding ScrollView.</para>\n      </summary>\n      <param name=\"scrollPosition\">The position to use display.</param>\n      <param name=\"alwaysShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwaysShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when content inside the ScrollView is taller than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"style\"></param>\n      <param name=\"background\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.ScrollViewScope.#ctor(UnityEngine.Vector2,System.Boolean,System.Boolean,UnityEngine.GUIStyle,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new ScrollViewScope and begin the corresponding ScrollView.</para>\n      </summary>\n      <param name=\"scrollPosition\">The position to use display.</param>\n      <param name=\"alwaysShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwaysShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when content inside the ScrollView is taller than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"style\"></param>\n      <param name=\"background\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.ScrollViewScope.#ctor(UnityEngine.Vector2,System.Boolean,System.Boolean,UnityEngine.GUIStyle,UnityEngine.GUIStyle,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new ScrollViewScope and begin the corresponding ScrollView.</para>\n      </summary>\n      <param name=\"scrollPosition\">The position to use display.</param>\n      <param name=\"alwaysShowHorizontal\">Optional parameter to always show the horizontal scrollbar. If false or left out, it is only shown when the content inside the ScrollView is wider than the scrollview itself.</param>\n      <param name=\"alwaysShowVertical\">Optional parameter to always show the vertical scrollbar. If false or left out, it is only shown when content inside the ScrollView is taller than the scrollview itself.</param>\n      <param name=\"horizontalScrollbar\">Optional GUIStyle to use for the horizontal scrollbar. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"verticalScrollbar\">Optional GUIStyle to use for the vertical scrollbar. If left out, the verticalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\"></param>\n      <param name=\"style\"></param>\n      <param name=\"background\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.SelectionGrid(System.Int32,System.String[],System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a Selection Grid.</para>\n      </summary>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the buttons.</param>\n      <param name=\"images\">An array of textures on the buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the button.</param>\n      <param name=\"xCount\">How many elements to fit in the horizontal direction. The elements will be scaled to fit unless the style defines a fixedWidth to use. The height of the control will be determined from the number of elements.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"content\"></param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.SelectionGrid(System.Int32,UnityEngine.Texture[],System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a Selection Grid.</para>\n      </summary>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the buttons.</param>\n      <param name=\"images\">An array of textures on the buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the button.</param>\n      <param name=\"xCount\">How many elements to fit in the horizontal direction. The elements will be scaled to fit unless the style defines a fixedWidth to use. The height of the control will be determined from the number of elements.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"content\"></param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.SelectionGrid(System.Int32,UnityEngine.GUIContent[],System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a Selection Grid.</para>\n      </summary>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the buttons.</param>\n      <param name=\"images\">An array of textures on the buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the button.</param>\n      <param name=\"xCount\">How many elements to fit in the horizontal direction. The elements will be scaled to fit unless the style defines a fixedWidth to use. The height of the control will be determined from the number of elements.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"content\"></param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.SelectionGrid(System.Int32,System.String[],System.Int32,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a Selection Grid.</para>\n      </summary>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the buttons.</param>\n      <param name=\"images\">An array of textures on the buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the button.</param>\n      <param name=\"xCount\">How many elements to fit in the horizontal direction. The elements will be scaled to fit unless the style defines a fixedWidth to use. The height of the control will be determined from the number of elements.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"content\"></param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.SelectionGrid(System.Int32,UnityEngine.Texture[],System.Int32,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a Selection Grid.</para>\n      </summary>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the buttons.</param>\n      <param name=\"images\">An array of textures on the buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the button.</param>\n      <param name=\"xCount\">How many elements to fit in the horizontal direction. The elements will be scaled to fit unless the style defines a fixedWidth to use. The height of the control will be determined from the number of elements.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"content\"></param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.SelectionGrid(System.Int32,UnityEngine.GUIContent[],System.Int32,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a Selection Grid.</para>\n      </summary>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the buttons.</param>\n      <param name=\"images\">An array of textures on the buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the button.</param>\n      <param name=\"xCount\">How many elements to fit in the horizontal direction. The elements will be scaled to fit unless the style defines a fixedWidth to use. The height of the control will be determined from the number of elements.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"content\"></param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Space(System.Single)\">\n      <summary>\n        <para>Insert a space in the current layout group.</para>\n      </summary>\n      <param name=\"pixels\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.TextArea(System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a multi-line text field where the user can edit a string.</para>\n      </summary>\n      <param name=\"text\">Text to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textField style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&amp;amp;lt;br&amp;amp;gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The edited string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.TextArea(System.String,System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a multi-line text field where the user can edit a string.</para>\n      </summary>\n      <param name=\"text\">Text to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textField style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&amp;amp;lt;br&amp;amp;gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The edited string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.TextArea(System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a multi-line text field where the user can edit a string.</para>\n      </summary>\n      <param name=\"text\">Text to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textField style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&amp;amp;lt;br&amp;amp;gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The edited string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.TextArea(System.String,System.Int32,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a multi-line text field where the user can edit a string.</para>\n      </summary>\n      <param name=\"text\">Text to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textField style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&amp;amp;lt;br&amp;amp;gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The edited string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.TextField(System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a single-line text field where the user can edit a string.</para>\n      </summary>\n      <param name=\"text\">Text to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textArea style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The edited string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.TextField(System.String,System.Int32,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a single-line text field where the user can edit a string.</para>\n      </summary>\n      <param name=\"text\">Text to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textArea style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The edited string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.TextField(System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a single-line text field where the user can edit a string.</para>\n      </summary>\n      <param name=\"text\">Text to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textArea style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The edited string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.TextField(System.String,System.Int32,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a single-line text field where the user can edit a string.</para>\n      </summary>\n      <param name=\"text\">Text to edit. The return value of this function should be assigned back to the string as shown in the example.</param>\n      <param name=\"maxLength\">The maximum length of the string. If left out, the user can type for ever and ever.</param>\n      <param name=\"style\">The style to use. If left out, the textArea style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The edited string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Toggle(System.Boolean,UnityEngine.Texture,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an on/off toggle button.</para>\n      </summary>\n      <param name=\"value\">Is the button on or off?</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The new value of the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Toggle(System.Boolean,System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an on/off toggle button.</para>\n      </summary>\n      <param name=\"value\">Is the button on or off?</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The new value of the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Toggle(System.Boolean,UnityEngine.GUIContent,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an on/off toggle button.</para>\n      </summary>\n      <param name=\"value\">Is the button on or off?</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The new value of the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Toggle(System.Boolean,UnityEngine.Texture,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an on/off toggle button.</para>\n      </summary>\n      <param name=\"value\">Is the button on or off?</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The new value of the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Toggle(System.Boolean,System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an on/off toggle button.</para>\n      </summary>\n      <param name=\"value\">Is the button on or off?</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The new value of the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Toggle(System.Boolean,UnityEngine.GUIContent,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make an on/off toggle button.</para>\n      </summary>\n      <param name=\"value\">Is the button on or off?</param>\n      <param name=\"text\">Text to display on the button.</param>\n      <param name=\"image\">Texture to display on the button.</param>\n      <param name=\"content\">Text, image and tooltip for this button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The new value of the button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Toolbar(System.Int32,System.String[],UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toolbar.</para>\n      </summary>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the buttons.</param>\n      <param name=\"images\">An array of textures on the buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"buttonSize\">Determines how toolbar button size is calculated.</param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Toolbar(System.Int32,UnityEngine.Texture[],UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toolbar.</para>\n      </summary>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the buttons.</param>\n      <param name=\"images\">An array of textures on the buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"buttonSize\">Determines how toolbar button size is calculated.</param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Toolbar(System.Int32,UnityEngine.GUIContent[],UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toolbar.</para>\n      </summary>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the buttons.</param>\n      <param name=\"images\">An array of textures on the buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"buttonSize\">Determines how toolbar button size is calculated.</param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Toolbar(System.Int32,System.String[],UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toolbar.</para>\n      </summary>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the buttons.</param>\n      <param name=\"images\">An array of textures on the buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"buttonSize\">Determines how toolbar button size is calculated.</param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Toolbar(System.Int32,UnityEngine.Texture[],UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toolbar.</para>\n      </summary>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the buttons.</param>\n      <param name=\"images\">An array of textures on the buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"buttonSize\">Determines how toolbar button size is calculated.</param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Toolbar(System.Int32,UnityEngine.GUIContent[],UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toolbar.</para>\n      </summary>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the buttons.</param>\n      <param name=\"images\">An array of textures on the buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"buttonSize\">Determines how toolbar button size is calculated.</param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Toolbar(System.Int32,System.String[],UnityEngine.GUIStyle,UnityEngine.GUI/ToolbarButtonSize,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toolbar.</para>\n      </summary>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the buttons.</param>\n      <param name=\"images\">An array of textures on the buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"buttonSize\">Determines how toolbar button size is calculated.</param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Toolbar(System.Int32,UnityEngine.Texture[],UnityEngine.GUIStyle,UnityEngine.GUI/ToolbarButtonSize,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toolbar.</para>\n      </summary>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the buttons.</param>\n      <param name=\"images\">An array of textures on the buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"buttonSize\">Determines how toolbar button size is calculated.</param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Toolbar(System.Int32,UnityEngine.GUIContent[],UnityEngine.GUIStyle,UnityEngine.GUI/ToolbarButtonSize,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a toolbar.</para>\n      </summary>\n      <param name=\"selected\">The index of the selected button.</param>\n      <param name=\"texts\">An array of strings to show on the buttons.</param>\n      <param name=\"images\">An array of textures on the buttons.</param>\n      <param name=\"contents\">An array of text, image and tooltips for the button.</param>\n      <param name=\"style\">The style to use. If left out, the button style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <param name=\"buttonSize\">Determines how toolbar button size is calculated.</param>\n      <returns>\n        <para>The index of the selected button.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.GUILayout.VerticalScope\">\n      <summary>\n        <para>Disposable helper class for managing BeginVertical / EndVertical.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.VerticalScope.#ctor(UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new VerticalScope and begin the corresponding vertical group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.VerticalScope.#ctor(UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new VerticalScope and begin the corresponding vertical group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.VerticalScope.#ctor(System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new VerticalScope and begin the corresponding vertical group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.VerticalScope.#ctor(UnityEngine.Texture,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new VerticalScope and begin the corresponding vertical group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.VerticalScope.#ctor(UnityEngine.GUIContent,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Create a new VerticalScope and begin the corresponding vertical group.</para>\n      </summary>\n      <param name=\"text\">Text to display on group.</param>\n      <param name=\"image\">Texture to display on group.</param>\n      <param name=\"content\">Text, image, and tooltip for this group.</param>\n      <param name=\"style\">The style to use for background image and padding values. If left out, the background is transparent.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.VerticalScrollbar(System.Single,System.Single,System.Single,System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a vertical scrollbar.</para>\n      </summary>\n      <param name=\"value\">The position between min and max.</param>\n      <param name=\"size\">How much can we see?</param>\n      <param name=\"topValue\">The value at the top end of the scrollbar.</param>\n      <param name=\"bottomValue\">The value at the bottom end of the scrollbar.</param>\n      <param name=\"style\">The style to use for the scrollbar background. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.</param>\n      <returns>\n        <para>The modified value. This can be changed by the user by dragging the scrollbar, or clicking the arrows at the end.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.VerticalScrollbar(System.Single,System.Single,System.Single,System.Single,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a vertical scrollbar.</para>\n      </summary>\n      <param name=\"value\">The position between min and max.</param>\n      <param name=\"size\">How much can we see?</param>\n      <param name=\"topValue\">The value at the top end of the scrollbar.</param>\n      <param name=\"bottomValue\">The value at the bottom end of the scrollbar.</param>\n      <param name=\"style\">The style to use for the scrollbar background. If left out, the horizontalScrollbar style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.</param>\n      <returns>\n        <para>The modified value. This can be changed by the user by dragging the scrollbar, or clicking the arrows at the end.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.VerticalSlider(System.Single,System.Single,System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>A vertical slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"topValue\">The value at the top end of the slider.</param>\n      <param name=\"bottomValue\">The value at the bottom end of the slider.</param>\n      <param name=\"slider\">The GUIStyle to use for displaying the dragging area. If left out, the horizontalSlider style from the current GUISkin is used.</param>\n      <param name=\"thumb\">The GUIStyle to use for displaying draggable thumb. If left out, the horizontalSliderThumb style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.</param>\n      <param name=\"leftValue\"></param>\n      <param name=\"rightValue\"></param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.VerticalSlider(System.Single,System.Single,System.Single,UnityEngine.GUIStyle,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>A vertical slider the user can drag to change a value between a min and a max.</para>\n      </summary>\n      <param name=\"value\">The value the slider shows. This determines the position of the draggable thumb.</param>\n      <param name=\"topValue\">The value at the top end of the slider.</param>\n      <param name=\"bottomValue\">The value at the bottom end of the slider.</param>\n      <param name=\"slider\">The GUIStyle to use for displaying the dragging area. If left out, the horizontalSlider style from the current GUISkin is used.</param>\n      <param name=\"thumb\">The GUIStyle to use for displaying draggable thumb. If left out, the horizontalSliderThumb style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.</param>\n      <param name=\"leftValue\"></param>\n      <param name=\"rightValue\"></param>\n      <returns>\n        <para>The value that has been set by the user.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Width(System.Single)\">\n      <summary>\n        <para>Option passed to a control to give it an absolute width.</para>\n      </summary>\n      <param name=\"width\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Window(System.Int32,UnityEngine.Rect,UnityEngine.GUI/WindowFunction,System.String,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a popup window that layouts its contents automatically.</para>\n      </summary>\n      <param name=\"id\">A unique ID to use for each window. This is the ID you'll use to interface to it.</param>\n      <param name=\"screenRect\">Rectangle on the screen to use for the window. The layouting system will attempt to fit the window inside it - if that cannot be done, it will adjust the rectangle to fit.</param>\n      <param name=\"func\">The function that creates the GUI inside the window. This function must take one parameter - the id of the window it's currently making GUI for.</param>\n      <param name=\"text\">Text to display as a title for the window.</param>\n      <param name=\"image\">Texture to display an image in the titlebar.</param>\n      <param name=\"content\">Text, image and tooltip for this window.</param>\n      <param name=\"style\">An optional style to use for the window. If left out, the window style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style or the screenRect you pass in.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The rectangle the window is at. This can be in a different position and have a different size than the one you passed in.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Window(System.Int32,UnityEngine.Rect,UnityEngine.GUI/WindowFunction,UnityEngine.Texture,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a popup window that layouts its contents automatically.</para>\n      </summary>\n      <param name=\"id\">A unique ID to use for each window. This is the ID you'll use to interface to it.</param>\n      <param name=\"screenRect\">Rectangle on the screen to use for the window. The layouting system will attempt to fit the window inside it - if that cannot be done, it will adjust the rectangle to fit.</param>\n      <param name=\"func\">The function that creates the GUI inside the window. This function must take one parameter - the id of the window it's currently making GUI for.</param>\n      <param name=\"text\">Text to display as a title for the window.</param>\n      <param name=\"image\">Texture to display an image in the titlebar.</param>\n      <param name=\"content\">Text, image and tooltip for this window.</param>\n      <param name=\"style\">An optional style to use for the window. If left out, the window style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style or the screenRect you pass in.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The rectangle the window is at. This can be in a different position and have a different size than the one you passed in.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Window(System.Int32,UnityEngine.Rect,UnityEngine.GUI/WindowFunction,UnityEngine.GUIContent,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a popup window that layouts its contents automatically.</para>\n      </summary>\n      <param name=\"id\">A unique ID to use for each window. This is the ID you'll use to interface to it.</param>\n      <param name=\"screenRect\">Rectangle on the screen to use for the window. The layouting system will attempt to fit the window inside it - if that cannot be done, it will adjust the rectangle to fit.</param>\n      <param name=\"func\">The function that creates the GUI inside the window. This function must take one parameter - the id of the window it's currently making GUI for.</param>\n      <param name=\"text\">Text to display as a title for the window.</param>\n      <param name=\"image\">Texture to display an image in the titlebar.</param>\n      <param name=\"content\">Text, image and tooltip for this window.</param>\n      <param name=\"style\">An optional style to use for the window. If left out, the window style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style or the screenRect you pass in.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The rectangle the window is at. This can be in a different position and have a different size than the one you passed in.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Window(System.Int32,UnityEngine.Rect,UnityEngine.GUI/WindowFunction,System.String,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a popup window that layouts its contents automatically.</para>\n      </summary>\n      <param name=\"id\">A unique ID to use for each window. This is the ID you'll use to interface to it.</param>\n      <param name=\"screenRect\">Rectangle on the screen to use for the window. The layouting system will attempt to fit the window inside it - if that cannot be done, it will adjust the rectangle to fit.</param>\n      <param name=\"func\">The function that creates the GUI inside the window. This function must take one parameter - the id of the window it's currently making GUI for.</param>\n      <param name=\"text\">Text to display as a title for the window.</param>\n      <param name=\"image\">Texture to display an image in the titlebar.</param>\n      <param name=\"content\">Text, image and tooltip for this window.</param>\n      <param name=\"style\">An optional style to use for the window. If left out, the window style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style or the screenRect you pass in.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The rectangle the window is at. This can be in a different position and have a different size than the one you passed in.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Window(System.Int32,UnityEngine.Rect,UnityEngine.GUI/WindowFunction,UnityEngine.Texture,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a popup window that layouts its contents automatically.</para>\n      </summary>\n      <param name=\"id\">A unique ID to use for each window. This is the ID you'll use to interface to it.</param>\n      <param name=\"screenRect\">Rectangle on the screen to use for the window. The layouting system will attempt to fit the window inside it - if that cannot be done, it will adjust the rectangle to fit.</param>\n      <param name=\"func\">The function that creates the GUI inside the window. This function must take one parameter - the id of the window it's currently making GUI for.</param>\n      <param name=\"text\">Text to display as a title for the window.</param>\n      <param name=\"image\">Texture to display an image in the titlebar.</param>\n      <param name=\"content\">Text, image and tooltip for this window.</param>\n      <param name=\"style\">An optional style to use for the window. If left out, the window style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style or the screenRect you pass in.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The rectangle the window is at. This can be in a different position and have a different size than the one you passed in.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayout.Window(System.Int32,UnityEngine.Rect,UnityEngine.GUI/WindowFunction,UnityEngine.GUIContent,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Make a popup window that layouts its contents automatically.</para>\n      </summary>\n      <param name=\"id\">A unique ID to use for each window. This is the ID you'll use to interface to it.</param>\n      <param name=\"screenRect\">Rectangle on the screen to use for the window. The layouting system will attempt to fit the window inside it - if that cannot be done, it will adjust the rectangle to fit.</param>\n      <param name=\"func\">The function that creates the GUI inside the window. This function must take one parameter - the id of the window it's currently making GUI for.</param>\n      <param name=\"text\">Text to display as a title for the window.</param>\n      <param name=\"image\">Texture to display an image in the titlebar.</param>\n      <param name=\"content\">Text, image and tooltip for this window.</param>\n      <param name=\"style\">An optional style to use for the window. If left out, the window style from the current GUISkin is used.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style or the screenRect you pass in.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The rectangle the window is at. This can be in a different position and have a different size than the one you passed in.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.GUILayoutOption\">\n      <summary>\n        <para>Class internally used to pass layout options into GUILayout functions. You don't use these directly, but construct them with the layouting functions in the GUILayout class.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.GUILayoutUtility\">\n      <summary>\n        <para>Utility functions for implementing and extending the GUILayout class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUILayoutUtility.GetAspectRect(System.Single)\">\n      <summary>\n        <para>Reserve layout space for a rectangle with a specific aspect ratio.</para>\n      </summary>\n      <param name=\"aspect\">The aspect ratio of the element (width / height).</param>\n      <param name=\"style\">An optional style. If specified, the style's padding value will be added to the sizes of the returned rectangle &amp; the style's margin values will be used for spacing.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The rect for the control.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayoutUtility.GetAspectRect(System.Single,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Reserve layout space for a rectangle with a specific aspect ratio.</para>\n      </summary>\n      <param name=\"aspect\">The aspect ratio of the element (width / height).</param>\n      <param name=\"style\">An optional style. If specified, the style's padding value will be added to the sizes of the returned rectangle &amp; the style's margin values will be used for spacing.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The rect for the control.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayoutUtility.GetAspectRect(System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Reserve layout space for a rectangle with a specific aspect ratio.</para>\n      </summary>\n      <param name=\"aspect\">The aspect ratio of the element (width / height).</param>\n      <param name=\"style\">An optional style. If specified, the style's padding value will be added to the sizes of the returned rectangle &amp; the style's margin values will be used for spacing.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The rect for the control.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayoutUtility.GetAspectRect(System.Single,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Reserve layout space for a rectangle with a specific aspect ratio.</para>\n      </summary>\n      <param name=\"aspect\">The aspect ratio of the element (width / height).</param>\n      <param name=\"style\">An optional style. If specified, the style's padding value will be added to the sizes of the returned rectangle &amp; the style's margin values will be used for spacing.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The rect for the control.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayoutUtility.GetLastRect\">\n      <summary>\n        <para>Get the rectangle last used by GUILayout for a control.</para>\n      </summary>\n      <returns>\n        <para>The last used rectangle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayoutUtility.GetRect(UnityEngine.GUIContent,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Reserve layout space for a rectangle for displaying some contents with a specific style.</para>\n      </summary>\n      <param name=\"content\">The content to make room for displaying.</param>\n      <param name=\"style\">The GUIStyle to layout for.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>A rectangle that is large enough to contain content when rendered in style.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayoutUtility.GetRect(UnityEngine.GUIContent,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Reserve layout space for a rectangle for displaying some contents with a specific style.</para>\n      </summary>\n      <param name=\"content\">The content to make room for displaying.</param>\n      <param name=\"style\">The GUIStyle to layout for.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>A rectangle that is large enough to contain content when rendered in style.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayoutUtility.GetRect(System.Single,System.Single)\">\n      <summary>\n        <para>Reserve layout space for a rectangle with a fixed content area.</para>\n      </summary>\n      <param name=\"width\">The width of the area you want.</param>\n      <param name=\"height\">The height of the area you want.</param>\n      <param name=\"style\">An optional GUIStyle to layout for. If specified, the style's padding value will be added to your sizes &amp; its margin value will be used for spacing.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The rectanlge to put your control in.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayoutUtility.GetRect(System.Single,System.Single,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Reserve layout space for a rectangle with a fixed content area.</para>\n      </summary>\n      <param name=\"width\">The width of the area you want.</param>\n      <param name=\"height\">The height of the area you want.</param>\n      <param name=\"style\">An optional GUIStyle to layout for. If specified, the style's padding value will be added to your sizes &amp; its margin value will be used for spacing.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The rectanlge to put your control in.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayoutUtility.GetRect(System.Single,System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Reserve layout space for a rectangle with a fixed content area.</para>\n      </summary>\n      <param name=\"width\">The width of the area you want.</param>\n      <param name=\"height\">The height of the area you want.</param>\n      <param name=\"style\">An optional GUIStyle to layout for. If specified, the style's padding value will be added to your sizes &amp; its margin value will be used for spacing.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The rectanlge to put your control in.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayoutUtility.GetRect(System.Single,System.Single,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Reserve layout space for a rectangle with a fixed content area.</para>\n      </summary>\n      <param name=\"width\">The width of the area you want.</param>\n      <param name=\"height\">The height of the area you want.</param>\n      <param name=\"style\">An optional GUIStyle to layout for. If specified, the style's padding value will be added to your sizes &amp; its margin value will be used for spacing.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>The rectanlge to put your control in.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayoutUtility.GetRect(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Reserve layout space for a flexible rect.</para>\n      </summary>\n      <param name=\"minWidth\">The minimum width of the area passed back.</param>\n      <param name=\"maxWidth\">The maximum width of the area passed back.</param>\n      <param name=\"minHeight\">The minimum width of the area passed back.</param>\n      <param name=\"maxHeight\">The maximum width of the area passed back.</param>\n      <param name=\"style\">An optional style. If specified, the style's padding value will be added to the sizes requested &amp; the style's margin values will be used for spacing.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>A rectangle with size between minWidth &amp; maxWidth on both axes.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayoutUtility.GetRect(System.Single,System.Single,System.Single,System.Single,UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Reserve layout space for a flexible rect.</para>\n      </summary>\n      <param name=\"minWidth\">The minimum width of the area passed back.</param>\n      <param name=\"maxWidth\">The maximum width of the area passed back.</param>\n      <param name=\"minHeight\">The minimum width of the area passed back.</param>\n      <param name=\"maxHeight\">The maximum width of the area passed back.</param>\n      <param name=\"style\">An optional style. If specified, the style's padding value will be added to the sizes requested &amp; the style's margin values will be used for spacing.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>A rectangle with size between minWidth &amp; maxWidth on both axes.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayoutUtility.GetRect(System.Single,System.Single,System.Single,System.Single,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Reserve layout space for a flexible rect.</para>\n      </summary>\n      <param name=\"minWidth\">The minimum width of the area passed back.</param>\n      <param name=\"maxWidth\">The maximum width of the area passed back.</param>\n      <param name=\"minHeight\">The minimum width of the area passed back.</param>\n      <param name=\"maxHeight\">The maximum width of the area passed back.</param>\n      <param name=\"style\">An optional style. If specified, the style's padding value will be added to the sizes requested &amp; the style's margin values will be used for spacing.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>A rectangle with size between minWidth &amp; maxWidth on both axes.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUILayoutUtility.GetRect(System.Single,System.Single,System.Single,System.Single,UnityEngine.GUIStyle,UnityEngine.GUILayoutOption[])\">\n      <summary>\n        <para>Reserve layout space for a flexible rect.</para>\n      </summary>\n      <param name=\"minWidth\">The minimum width of the area passed back.</param>\n      <param name=\"maxWidth\">The maximum width of the area passed back.</param>\n      <param name=\"minHeight\">The minimum width of the area passed back.</param>\n      <param name=\"maxHeight\">The maximum width of the area passed back.</param>\n      <param name=\"style\">An optional style. If specified, the style's padding value will be added to the sizes requested &amp; the style's margin values will be used for spacing.</param>\n      <param name=\"options\">An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style.&lt;br&gt;\nSee Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight,\nGUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.</param>\n      <returns>\n        <para>A rectangle with size between minWidth &amp; maxWidth on both axes.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.GUISettings\">\n      <summary>\n        <para>General settings for how the GUI behaves.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISettings.cursorColor\">\n      <summary>\n        <para>The color of the cursor in text fields.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISettings.cursorFlashSpeed\">\n      <summary>\n        <para>The speed of text field cursor flashes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISettings.doubleClickSelectsWord\">\n      <summary>\n        <para>Should double-clicking select words in text fields.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISettings.selectionColor\">\n      <summary>\n        <para>The color of the selection rect in text fields.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISettings.tripleClickSelectsLine\">\n      <summary>\n        <para>Should triple-clicking select whole text in text fields.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.GUISkin\">\n      <summary>\n        <para>Defines how GUI looks and behaves.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.box\">\n      <summary>\n        <para>Style used by default for GUI.Box controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.button\">\n      <summary>\n        <para>Style used by default for GUI.Button controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.customStyles\">\n      <summary>\n        <para>Array of GUI styles for specific needs.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.font\">\n      <summary>\n        <para>The default font to use for all styles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.horizontalScrollbar\">\n      <summary>\n        <para>Style used by default for the background part of GUI.HorizontalScrollbar controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.horizontalScrollbarLeftButton\">\n      <summary>\n        <para>Style used by default for the left button on GUI.HorizontalScrollbar controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.horizontalScrollbarRightButton\">\n      <summary>\n        <para>Style used by default for the right button on GUI.HorizontalScrollbar controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.horizontalScrollbarThumb\">\n      <summary>\n        <para>Style used by default for the thumb that is dragged in GUI.HorizontalScrollbar controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.horizontalSlider\">\n      <summary>\n        <para>Style used by default for the background part of GUI.HorizontalSlider controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.horizontalSliderThumb\">\n      <summary>\n        <para>Style used by default for the thumb that is dragged in GUI.HorizontalSlider controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.label\">\n      <summary>\n        <para>Style used by default for GUI.Label controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.scrollView\">\n      <summary>\n        <para>Style used by default for the background of ScrollView controls (see GUI.BeginScrollView).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.settings\">\n      <summary>\n        <para>Generic settings for how controls should behave with this skin.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.textArea\">\n      <summary>\n        <para>Style used by default for GUI.TextArea controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.textField\">\n      <summary>\n        <para>Style used by default for GUI.TextField controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.toggle\">\n      <summary>\n        <para>Style used by default for GUI.Toggle controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.verticalScrollbar\">\n      <summary>\n        <para>Style used by default for the background part of GUI.VerticalScrollbar controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.verticalScrollbarDownButton\">\n      <summary>\n        <para>Style used by default for the down button on GUI.VerticalScrollbar controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.verticalScrollbarThumb\">\n      <summary>\n        <para>Style used by default for the thumb that is dragged in GUI.VerticalScrollbar controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.verticalScrollbarUpButton\">\n      <summary>\n        <para>Style used by default for the up button on GUI.VerticalScrollbar controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.verticalSlider\">\n      <summary>\n        <para>Style used by default for the background part of GUI.VerticalSlider controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.verticalSliderThumb\">\n      <summary>\n        <para>Style used by default for the thumb that is dragged in GUI.VerticalSlider controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUISkin.window\">\n      <summary>\n        <para>Style used by default for Window controls (SA GUI.Window).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUISkin.FindStyle(System.String)\">\n      <summary>\n        <para>Try to search for a GUIStyle. This functions returns NULL and does not give an error.</para>\n      </summary>\n      <param name=\"styleName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUISkin.GetStyle(System.String)\">\n      <summary>\n        <para>Get a named GUIStyle.</para>\n      </summary>\n      <param name=\"styleName\"></param>\n    </member>\n    <member name=\"T:UnityEngine.GUIStyle\">\n      <summary>\n        <para>Styling information for GUI elements.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.active\">\n      <summary>\n        <para>Rendering settings for when the control is pressed down.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.alignment\">\n      <summary>\n        <para>Text alignment.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.border\">\n      <summary>\n        <para>The borders of all background images.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.clipping\">\n      <summary>\n        <para>What to do when the contents to be rendered is too large to fit within the area given.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.contentOffset\">\n      <summary>\n        <para>Pixel offset to apply to the content of this GUIstyle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.fixedHeight\">\n      <summary>\n        <para>If non-0, any GUI elements rendered with this style will have the height specified here.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.fixedWidth\">\n      <summary>\n        <para>If non-0, any GUI elements rendered with this style will have the width specified here.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.focused\">\n      <summary>\n        <para>Rendering settings for when the element has keyboard focus.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.font\">\n      <summary>\n        <para>The font to use for rendering. If null, the default font for the current GUISkin is used instead.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.fontSize\">\n      <summary>\n        <para>The font size to use (for dynamic fonts).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.fontStyle\">\n      <summary>\n        <para>The font style to use (for dynamic fonts).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.hover\">\n      <summary>\n        <para>Rendering settings for when the mouse is hovering over the control.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.imagePosition\">\n      <summary>\n        <para>How image and text of the GUIContent is combined.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.lineHeight\">\n      <summary>\n        <para>The height of one line of text with this style, measured in pixels. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.margin\">\n      <summary>\n        <para>The margins between elements rendered in this style and any other GUI elements.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.name\">\n      <summary>\n        <para>The name of this GUIStyle. Used for getting them based on name.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.none\">\n      <summary>\n        <para>Shortcut for an empty GUIStyle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.normal\">\n      <summary>\n        <para>Rendering settings for when the component is displayed normally.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.onActive\">\n      <summary>\n        <para>Rendering settings for when the element is turned on and pressed down.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.onFocused\">\n      <summary>\n        <para>Rendering settings for when the element has keyboard and is turned on.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.onHover\">\n      <summary>\n        <para>Rendering settings for when the control is turned on and the mouse is hovering it.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.onNormal\">\n      <summary>\n        <para>Rendering settings for when the control is turned on.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.overflow\">\n      <summary>\n        <para>Extra space to be added to the background image.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.padding\">\n      <summary>\n        <para>Space from the edge of GUIStyle to the start of the contents.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.richText\">\n      <summary>\n        <para>Enable HTML-style tags for Text Formatting Markup.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.stretchHeight\">\n      <summary>\n        <para>Can GUI elements of this style be stretched vertically for better layout?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.stretchWidth\">\n      <summary>\n        <para>Can GUI elements of this style be stretched horizontally for better layouting?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyle.wordWrap\">\n      <summary>\n        <para>Should the text be wordwrapped?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUIStyle.CalcHeight(UnityEngine.GUIContent,System.Single)\">\n      <summary>\n        <para>How tall this element will be when rendered with content and a specific width.</para>\n      </summary>\n      <param name=\"content\"></param>\n      <param name=\"width\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIStyle.CalcMinMaxWidth(UnityEngine.GUIContent,System.Single&amp;,System.Single&amp;)\">\n      <summary>\n        <para>Calculate the minimum and maximum widths for this style rendered with content.</para>\n      </summary>\n      <param name=\"content\"></param>\n      <param name=\"minWidth\"></param>\n      <param name=\"maxWidth\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIStyle.CalcScreenSize(UnityEngine.Vector2)\">\n      <summary>\n        <para>Calculate the size of an element formatted with this style, and a given space to content.</para>\n      </summary>\n      <param name=\"contentSize\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIStyle.CalcSize(UnityEngine.GUIContent)\">\n      <summary>\n        <para>Calculate the size of some content if it is rendered with this style.</para>\n      </summary>\n      <param name=\"content\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIStyle.#ctor\">\n      <summary>\n        <para>Constructor for empty GUIStyle.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUIStyle.#ctor(UnityEngine.GUIStyle)\">\n      <summary>\n        <para>Constructs GUIStyle identical to given other GUIStyle.</para>\n      </summary>\n      <param name=\"other\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIStyle.Draw(UnityEngine.Rect,System.Boolean,System.Boolean,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Draw this GUIStyle on to the screen, internal version.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"isHover\"></param>\n      <param name=\"isActive\"></param>\n      <param name=\"on\"></param>\n      <param name=\"hasKeyboardFocus\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIStyle.Draw(UnityEngine.Rect,System.String,System.Boolean,System.Boolean,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Draw the GUIStyle with a text string inside.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"text\"></param>\n      <param name=\"isHover\"></param>\n      <param name=\"isActive\"></param>\n      <param name=\"on\"></param>\n      <param name=\"hasKeyboardFocus\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIStyle.Draw(UnityEngine.Rect,UnityEngine.Texture,System.Boolean,System.Boolean,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Draw the GUIStyle with an image inside. If the image is too large to fit within the content area of the style it is scaled down.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"image\"></param>\n      <param name=\"isHover\"></param>\n      <param name=\"isActive\"></param>\n      <param name=\"on\"></param>\n      <param name=\"hasKeyboardFocus\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIStyle.Draw(UnityEngine.Rect,UnityEngine.GUIContent,System.Int32)\">\n      <summary>\n        <para>Draw the GUIStyle with text and an image inside. If the image is too large to fit within the content area of the style it is scaled down.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"content\"></param>\n      <param name=\"controlID\"></param>\n      <param name=\"on\"></param>\n      <param name=\"isHover\"></param>\n      <param name=\"isActive\"></param>\n      <param name=\"hasKeyboardFocus\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIStyle.Draw(UnityEngine.Rect,UnityEngine.GUIContent,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Draw the GUIStyle with text and an image inside. If the image is too large to fit within the content area of the style it is scaled down.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"content\"></param>\n      <param name=\"controlID\"></param>\n      <param name=\"on\"></param>\n      <param name=\"isHover\"></param>\n      <param name=\"isActive\"></param>\n      <param name=\"hasKeyboardFocus\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIStyle.Draw(UnityEngine.Rect,UnityEngine.GUIContent,System.Boolean,System.Boolean,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Draw the GUIStyle with text and an image inside. If the image is too large to fit within the content area of the style it is scaled down.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"content\"></param>\n      <param name=\"controlID\"></param>\n      <param name=\"on\"></param>\n      <param name=\"isHover\"></param>\n      <param name=\"isActive\"></param>\n      <param name=\"hasKeyboardFocus\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIStyle.DrawCursor(UnityEngine.Rect,UnityEngine.GUIContent,System.Int32,System.Int32)\">\n      <summary>\n        <para>Draw this GUIStyle with selected content.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"content\"></param>\n      <param name=\"controlID\"></param>\n      <param name=\"character\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIStyle.DrawWithTextSelection(UnityEngine.Rect,UnityEngine.GUIContent,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Draw this GUIStyle with selected content.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"content\"></param>\n      <param name=\"controlID\"></param>\n      <param name=\"firstSelectedCharacter\"></param>\n      <param name=\"lastSelectedCharacter\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIStyle.GetCursorPixelPosition(UnityEngine.Rect,UnityEngine.GUIContent,System.Int32)\">\n      <summary>\n        <para>Get the pixel position of a given string index.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"content\"></param>\n      <param name=\"cursorStringIndex\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIStyle.GetCursorStringIndex(UnityEngine.Rect,UnityEngine.GUIContent,UnityEngine.Vector2)\">\n      <summary>\n        <para>Get the cursor position (indexing into contents.text) when the user clicked at cursorPixelPosition.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"content\"></param>\n      <param name=\"cursorPixelPosition\"></param>\n    </member>\n    <member name=\"?:UnityEngine.GUIStyle.implop_GUIStyle(string)(System.String)\">\n      <summary>\n        <para>Get a named GUI style from the current skin.</para>\n      </summary>\n      <param name=\"str\"></param>\n    </member>\n    <member name=\"T:UnityEngine.GUIStyleState\">\n      <summary>\n        <para>Specialized values for the given states used by GUIStyle objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyleState.background\">\n      <summary>\n        <para>The background image used by GUI elements in this given state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyleState.scaledBackgrounds\">\n      <summary>\n        <para>Background images used by this state when on a high-resolution screen. It should either be left empty, or contain a single image that is exactly twice the resolution of background. This is only used by the editor. The field is not copied to player data, and is not accessible from player code.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIStyleState.textColor\">\n      <summary>\n        <para>The text color used by GUI elements in this state.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.GUITargetAttribute\">\n      <summary>\n        <para>Allows to control for which display the OnGUI is called.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUITargetAttribute.#ctor\">\n      <summary>\n        <para>Default constructor initializes the attribute for OnGUI to be called for all available displays.</para>\n      </summary>\n      <param name=\"displayIndex\">Display index.</param>\n      <param name=\"displayIndex1\">Display index.</param>\n      <param name=\"displayIndexList\">Display index list.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUITargetAttribute.#ctor(System.Int32)\">\n      <summary>\n        <para>Default constructor initializes the attribute for OnGUI to be called for all available displays.</para>\n      </summary>\n      <param name=\"displayIndex\">Display index.</param>\n      <param name=\"displayIndex1\">Display index.</param>\n      <param name=\"displayIndexList\">Display index list.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUITargetAttribute.#ctor(System.Int32,System.Int32)\">\n      <summary>\n        <para>Default constructor initializes the attribute for OnGUI to be called for all available displays.</para>\n      </summary>\n      <param name=\"displayIndex\">Display index.</param>\n      <param name=\"displayIndex1\">Display index.</param>\n      <param name=\"displayIndexList\">Display index list.</param>\n    </member>\n    <member name=\"M:UnityEngine.GUITargetAttribute.#ctor(System.Int32,System.Int32,System.Int32[])\">\n      <summary>\n        <para>Default constructor initializes the attribute for OnGUI to be called for all available displays.</para>\n      </summary>\n      <param name=\"displayIndex\">Display index.</param>\n      <param name=\"displayIndex1\">Display index.</param>\n      <param name=\"displayIndexList\">Display index list.</param>\n    </member>\n    <member name=\"T:UnityEngine.GUIText\">\n      <summary>\n        <para>A text string displayed in a GUI.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIText.alignment\">\n      <summary>\n        <para>The alignment of the text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIText.anchor\">\n      <summary>\n        <para>The anchor of the text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIText.color\">\n      <summary>\n        <para>The color used to render the text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIText.font\">\n      <summary>\n        <para>The font used for the text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIText.fontSize\">\n      <summary>\n        <para>The font size to use (for dynamic fonts).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIText.fontStyle\">\n      <summary>\n        <para>The font style to use (for dynamic fonts).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIText.lineSpacing\">\n      <summary>\n        <para>The line spacing multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIText.material\">\n      <summary>\n        <para>The Material to use for rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIText.pixelOffset\">\n      <summary>\n        <para>The pixel offset of the text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIText.richText\">\n      <summary>\n        <para>Enable HTML-style tags for Text Formatting Markup.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIText.tabSize\">\n      <summary>\n        <para>The tab width multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIText.text\">\n      <summary>\n        <para>The text to display.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.GUITexture\">\n      <summary>\n        <para>A texture image used in a 2D GUI.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUITexture.border\">\n      <summary>\n        <para>The border defines the number of pixels from the edge that are not affected by scale.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUITexture.color\">\n      <summary>\n        <para>The color of the GUI texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUITexture.pixelInset\">\n      <summary>\n        <para>Pixel inset used for pixel adjustments for size and position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUITexture.texture\">\n      <summary>\n        <para>The texture used for drawing.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.GUIUtility\">\n      <summary>\n        <para>Utility class for making new GUI controls.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIUtility.hasModalWindow\">\n      <summary>\n        <para>A global property, which is true if a ModalWindow is being displayed, false otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIUtility.hotControl\">\n      <summary>\n        <para>The controlID of the current hot control.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIUtility.keyboardControl\">\n      <summary>\n        <para>The controlID of the control that has keyboard focus.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.GUIUtility.systemCopyBuffer\">\n      <summary>\n        <para>Get access to the system-wide clipboard.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUIUtility.AlignRectToDevice(UnityEngine.Rect)\">\n      <summary>\n        <para>Align a local space rectangle to the pixel grid.</para>\n      </summary>\n      <param name=\"local\">The local space rectangle that needs to be processed.</param>\n      <param name=\"widthInPixels\">Width, in pixel units, of the axis-aligned bounding box that encompasses the aligned points.</param>\n      <param name=\"heightInPixels\">Height, in pixel units, of the axis-aligned bounding box that encompasses the aligned points.</param>\n      <param name=\"rect\"></param>\n      <returns>\n        <para>The aligned rectangle in local space.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUIUtility.AlignRectToDevice(UnityEngine.Rect,System.Int32&amp;,System.Int32&amp;)\">\n      <summary>\n        <para>Align a local space rectangle to the pixel grid.</para>\n      </summary>\n      <param name=\"local\">The local space rectangle that needs to be processed.</param>\n      <param name=\"widthInPixels\">Width, in pixel units, of the axis-aligned bounding box that encompasses the aligned points.</param>\n      <param name=\"heightInPixels\">Height, in pixel units, of the axis-aligned bounding box that encompasses the aligned points.</param>\n      <param name=\"rect\"></param>\n      <returns>\n        <para>The aligned rectangle in local space.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.GUIUtility.ExitGUI\">\n      <summary>\n        <para>Puts the GUI in a state that will prevent all subsequent immediate mode GUI functions from evaluating for the remainder of the GUI loop by throwing an ExitGUIException.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.GUIUtility.GetControlID(UnityEngine.FocusType)\">\n      <summary>\n        <para>Get a unique ID for a control.</para>\n      </summary>\n      <param name=\"focus\"></param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIUtility.GetControlID(UnityEngine.FocusType,UnityEngine.Rect)\">\n      <summary>\n        <para>Get a unique ID for a control.</para>\n      </summary>\n      <param name=\"focus\"></param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIUtility.GetControlID(System.Int32,UnityEngine.FocusType)\">\n      <summary>\n        <para>Get a unique ID for a control, using an integer as a hint to help ensure correct matching of IDs to controls.</para>\n      </summary>\n      <param name=\"hint\"></param>\n      <param name=\"focus\"></param>\n      <param name=\"focusType\"></param>\n      <param name=\"rect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIUtility.GetControlID(System.Int32,UnityEngine.FocusType,UnityEngine.Rect)\">\n      <summary>\n        <para>Get a unique ID for a control, using an integer as a hint to help ensure correct matching of IDs to controls.</para>\n      </summary>\n      <param name=\"hint\"></param>\n      <param name=\"focus\"></param>\n      <param name=\"focusType\"></param>\n      <param name=\"rect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIUtility.GetControlID(UnityEngine.GUIContent,UnityEngine.FocusType)\">\n      <summary>\n        <para>Get a unique ID for a control, using a the label content as a hint to help ensure correct matching of IDs to controls.</para>\n      </summary>\n      <param name=\"contents\"></param>\n      <param name=\"focus\"></param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIUtility.GetControlID(UnityEngine.GUIContent,UnityEngine.FocusType,UnityEngine.Rect)\">\n      <summary>\n        <para>Get a unique ID for a control, using a the label content as a hint to help ensure correct matching of IDs to controls.</para>\n      </summary>\n      <param name=\"contents\"></param>\n      <param name=\"focus\"></param>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIUtility.GetStateObject(System.Type,System.Int32)\">\n      <summary>\n        <para>Get a state object from a controlID.</para>\n      </summary>\n      <param name=\"t\"></param>\n      <param name=\"controlID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIUtility.GUIToScreenPoint(UnityEngine.Vector2)\">\n      <summary>\n        <para>Convert a point from GUI position to screen space.</para>\n      </summary>\n      <param name=\"guiPoint\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIUtility.QueryStateObject(System.Type,System.Int32)\">\n      <summary>\n        <para>Get an existing state object from a controlID.</para>\n      </summary>\n      <param name=\"t\"></param>\n      <param name=\"controlID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIUtility.RotateAroundPivot(System.Single,UnityEngine.Vector2)\">\n      <summary>\n        <para>Helper function to rotate the GUI around a point.</para>\n      </summary>\n      <param name=\"angle\"></param>\n      <param name=\"pivotPoint\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIUtility.ScaleAroundPivot(UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Helper function to scale the GUI around a point.</para>\n      </summary>\n      <param name=\"scale\"></param>\n      <param name=\"pivotPoint\"></param>\n    </member>\n    <member name=\"M:UnityEngine.GUIUtility.ScreenToGUIPoint(UnityEngine.Vector2)\">\n      <summary>\n        <para>Convert a point from screen space to GUI position.</para>\n      </summary>\n      <param name=\"screenPoint\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Gyroscope\">\n      <summary>\n        <para>Interface into the Gyroscope.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Gyroscope.attitude\">\n      <summary>\n        <para>Returns the attitude (ie, orientation in space) of the device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Gyroscope.enabled\">\n      <summary>\n        <para>Sets or retrieves the enabled status of this gyroscope.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Gyroscope.gravity\">\n      <summary>\n        <para>Returns the gravity acceleration vector expressed in the device's reference frame.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Gyroscope.rotationRate\">\n      <summary>\n        <para>Returns rotation rate as measured by the device's gyroscope.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Gyroscope.rotationRateUnbiased\">\n      <summary>\n        <para>Returns unbiased rotation rate as measured by the device's gyroscope.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Gyroscope.updateInterval\">\n      <summary>\n        <para>Sets or retrieves gyroscope interval in seconds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Gyroscope.userAcceleration\">\n      <summary>\n        <para>Returns the acceleration that the user is giving to the device.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Handheld\">\n      <summary>\n        <para>Interface into functionality unique to handheld devices.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Handheld.use32BitDisplayBuffer\">\n      <summary>\n        <para>Determines whether or not a 32-bit display buffer will be used.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Handheld.GetActivityIndicatorStyle\">\n      <summary>\n        <para>Gets the current activity indicator style.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Handheld.PlayFullScreenMovie(System.String)\">\n      <summary>\n        <para>Plays a full-screen movie.</para>\n      </summary>\n      <param name=\"path\">Filesystem path to the movie file.</param>\n      <param name=\"bgColor\">Background color.</param>\n      <param name=\"controlMode\">How the playback controls are to be displayed.</param>\n      <param name=\"scalingMode\">How the movie is to be scaled to fit the screen.</param>\n    </member>\n    <member name=\"M:UnityEngine.Handheld.PlayFullScreenMovie(System.String,UnityEngine.Color)\">\n      <summary>\n        <para>Plays a full-screen movie.</para>\n      </summary>\n      <param name=\"path\">Filesystem path to the movie file.</param>\n      <param name=\"bgColor\">Background color.</param>\n      <param name=\"controlMode\">How the playback controls are to be displayed.</param>\n      <param name=\"scalingMode\">How the movie is to be scaled to fit the screen.</param>\n    </member>\n    <member name=\"M:UnityEngine.Handheld.PlayFullScreenMovie(System.String,UnityEngine.Color,UnityEngine.FullScreenMovieControlMode)\">\n      <summary>\n        <para>Plays a full-screen movie.</para>\n      </summary>\n      <param name=\"path\">Filesystem path to the movie file.</param>\n      <param name=\"bgColor\">Background color.</param>\n      <param name=\"controlMode\">How the playback controls are to be displayed.</param>\n      <param name=\"scalingMode\">How the movie is to be scaled to fit the screen.</param>\n    </member>\n    <member name=\"M:UnityEngine.Handheld.PlayFullScreenMovie(System.String,UnityEngine.Color,UnityEngine.FullScreenMovieControlMode,UnityEngine.FullScreenMovieScalingMode)\">\n      <summary>\n        <para>Plays a full-screen movie.</para>\n      </summary>\n      <param name=\"path\">Filesystem path to the movie file.</param>\n      <param name=\"bgColor\">Background color.</param>\n      <param name=\"controlMode\">How the playback controls are to be displayed.</param>\n      <param name=\"scalingMode\">How the movie is to be scaled to fit the screen.</param>\n    </member>\n    <member name=\"M:UnityEngine.Handheld.SetActivityIndicatorStyle\">\n      <summary>\n        <para>Sets the desired activity indicator style.</para>\n      </summary>\n      <param name=\"style\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Handheld.SetActivityIndicatorStyle(UnityEngine.AndroidActivityIndicatorStyle)\">\n      <summary>\n        <para>Sets the desired activity indicator style.</para>\n      </summary>\n      <param name=\"style\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Handheld.StartActivityIndicator\">\n      <summary>\n        <para>Starts os activity indicator.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Handheld.StopActivityIndicator\">\n      <summary>\n        <para>Stops os activity indicator.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Handheld.Vibrate\">\n      <summary>\n        <para>Triggers device vibration.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Hash128\">\n      <summary>\n        <para>Represent the hash value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Hash128.isValid\">\n      <summary>\n        <para>Get if the hash value is valid or not. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Hash128.Compute(System.String)\">\n      <summary>\n        <para>Compute a hash of the input string.</para>\n      </summary>\n      <param name=\"hashString\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Hash128.#ctor(System.UInt32,System.UInt32,System.UInt32,System.UInt32)\">\n      <summary>\n        <para>Construct the Hash128.</para>\n      </summary>\n      <param name=\"u32_0\"></param>\n      <param name=\"u32_1\"></param>\n      <param name=\"u32_2\"></param>\n      <param name=\"u32_3\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Hash128.Parse(System.String)\">\n      <summary>\n        <para>Convert the input string to Hash128.</para>\n      </summary>\n      <param name=\"hashString\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Hash128.ToString\">\n      <summary>\n        <para>Convert Hash128 to string.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.HeadDof\">\n      <summary>\n        <para>Enumeration of all the muscles in the head.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HeadDof.HeadFrontBack\">\n      <summary>\n        <para>The head front-back muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HeadDof.HeadLeftRight\">\n      <summary>\n        <para>The head left-right muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HeadDof.HeadRollLeftRight\">\n      <summary>\n        <para>The head roll left-right muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HeadDof.JawDownUp\">\n      <summary>\n        <para>The jaw down-up muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HeadDof.JawLeftRight\">\n      <summary>\n        <para>The jaw left-right muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HeadDof.LastHeadDof\">\n      <summary>\n        <para>The last value of the HeadDof enum.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HeadDof.LeftEyeDownUp\">\n      <summary>\n        <para>The left eye down-up muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HeadDof.LeftEyeInOut\">\n      <summary>\n        <para>The left eye in-out muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HeadDof.NeckFrontBack\">\n      <summary>\n        <para>The neck front-back muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HeadDof.NeckLeftRight\">\n      <summary>\n        <para>The neck left-right muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HeadDof.NeckRollLeftRight\">\n      <summary>\n        <para>The neck roll left-right muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HeadDof.RightEyeDownUp\">\n      <summary>\n        <para>The right eye down-up muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HeadDof.RightEyeInOut\">\n      <summary>\n        <para>The right eye in-out muscle.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.HeaderAttribute\">\n      <summary>\n        <para>Use this PropertyAttribute to add a header above some fields in the Inspector.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HeaderAttribute.header\">\n      <summary>\n        <para>The header text.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.HeaderAttribute.#ctor(System.String)\">\n      <summary>\n        <para>Add a header above some fields in the Inspector.</para>\n      </summary>\n      <param name=\"header\">The header text.</param>\n    </member>\n    <member name=\"T:UnityEngine.HelpURLAttribute\">\n      <summary>\n        <para>Provide a custom documentation URL for a class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.HelpURLAttribute.#ctor(System.String)\">\n      <summary>\n        <para>Initialize the HelpURL attribute with a documentation url.</para>\n      </summary>\n      <param name=\"url\">The custom documentation URL for this class.</param>\n    </member>\n    <member name=\"P:UnityEngine.HelpURLAttribute.URL\">\n      <summary>\n        <para>The documentation URL specified for this class.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.HideFlags\">\n      <summary>\n        <para>Bit mask that controls object destruction, saving and visibility in inspectors.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HideFlags.DontSave\">\n      <summary>\n        <para>The object will not be saved to the scene. It will not be destroyed when a new scene is loaded. It is a shortcut for HideFlags.DontSaveInBuild | HideFlags.DontSaveInEditor | HideFlags.DontUnloadUnusedAsset.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HideFlags.DontSaveInBuild\">\n      <summary>\n        <para>The object will not be saved when building a player.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HideFlags.DontSaveInEditor\">\n      <summary>\n        <para>The object will not be saved to the scene in the editor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HideFlags.DontUnloadUnusedAsset\">\n      <summary>\n        <para>The object will not be unloaded by Resources.UnloadUnusedAssets.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HideFlags.HideAndDontSave\">\n      <summary>\n        <para>The GameObject is not shown in the Hierarchy, not saved to to Scenes, and not unloaded by Resources.UnloadUnusedAssets.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HideFlags.HideInHierarchy\">\n      <summary>\n        <para>The object will not appear in the hierarchy.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HideFlags.HideInInspector\">\n      <summary>\n        <para>It is not possible to view it in the inspector.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HideFlags.None\">\n      <summary>\n        <para>A normal, visible object. This is the default.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HideFlags.NotEditable\">\n      <summary>\n        <para>The object is not be editable in the inspector.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.HideInInspector\">\n      <summary>\n        <para>Makes a variable not show up in the inspector but be serialized.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.HingeJoint\">\n      <summary>\n        <para>The HingeJoint groups together 2 rigid bodies, constraining them to move like connected by a hinge.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HingeJoint.angle\">\n      <summary>\n        <para>The current angle in degrees of the joint relative to its rest position. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HingeJoint.limits\">\n      <summary>\n        <para>Limit of angular rotation (in degrees) on the hinge joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HingeJoint.motor\">\n      <summary>\n        <para>The motor will apply a force up to a maximum force to achieve the target velocity in degrees per second.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HingeJoint.spring\">\n      <summary>\n        <para>The spring attempts to reach a target angle by adding spring and damping forces.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HingeJoint.useLimits\">\n      <summary>\n        <para>Enables the joint's limits. Disabled by default.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HingeJoint.useMotor\">\n      <summary>\n        <para>Enables the joint's motor. Disabled by default.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HingeJoint.useSpring\">\n      <summary>\n        <para>Enables the joint's spring. Disabled by default.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HingeJoint.velocity\">\n      <summary>\n        <para>The angular velocity of the joint in degrees per second. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.HingeJoint2D\">\n      <summary>\n        <para>Joint that allows a Rigidbody2D object to rotate around a point in space or a point on another object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HingeJoint2D.jointAngle\">\n      <summary>\n        <para>The current joint angle (in degrees) with respect to the reference angle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HingeJoint2D.jointSpeed\">\n      <summary>\n        <para>The current joint speed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HingeJoint2D.limits\">\n      <summary>\n        <para>Limit of angular rotation (in degrees) on the joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HingeJoint2D.limitState\">\n      <summary>\n        <para>Gets the state of the joint limit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HingeJoint2D.motor\">\n      <summary>\n        <para>Parameters for the motor force applied to the joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HingeJoint2D.referenceAngle\">\n      <summary>\n        <para>The angle (in degrees) referenced between the two bodies used as the constraint for the joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HingeJoint2D.useLimits\">\n      <summary>\n        <para>Should limits be placed on the range of rotation?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HingeJoint2D.useMotor\">\n      <summary>\n        <para>Should the joint be rotated automatically by a motor torque?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.HingeJoint2D.GetMotorTorque(System.Single)\">\n      <summary>\n        <para>Gets the motor torque of the joint given the specified timestep.</para>\n      </summary>\n      <param name=\"timeStep\">The time to calculate the motor torque for.</param>\n    </member>\n    <member name=\"T:UnityEngine.HorizontalWrapMode\">\n      <summary>\n        <para>Wrapping modes for text that reaches the horizontal boundary.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HorizontalWrapMode.Overflow\">\n      <summary>\n        <para>Text can exceed the horizontal boundary.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HorizontalWrapMode.Wrap\">\n      <summary>\n        <para>Text will word-wrap when reaching the horizontal boundary.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.HostData\">\n      <summary>\n        <para>This is the data structure for holding individual host information.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HostData.comment\">\n      <summary>\n        <para>A miscellaneous comment (can hold data).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HostData.connectedPlayers\">\n      <summary>\n        <para>Currently connected players.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HostData.gameName\">\n      <summary>\n        <para>The name of the game (like John Doe's Game).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HostData.gameType\">\n      <summary>\n        <para>The type of the game (like \"MyUniqueGameType\").</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HostData.guid\">\n      <summary>\n        <para>The GUID of the host, needed when connecting with NAT punchthrough.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HostData.ip\">\n      <summary>\n        <para>Server IP address.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HostData.passwordProtected\">\n      <summary>\n        <para>Does the server require a password?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HostData.playerLimit\">\n      <summary>\n        <para>Maximum players limit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HostData.port\">\n      <summary>\n        <para>Server port.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HostData.useNat\">\n      <summary>\n        <para>Does this server require NAT punchthrough?</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.HumanBodyBones\">\n      <summary>\n        <para>Human Body Bones.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.Chest\">\n      <summary>\n        <para>This is the Chest bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.Head\">\n      <summary>\n        <para>This is the Head bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.Hips\">\n      <summary>\n        <para>This is the Hips bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.Jaw\">\n      <summary>\n        <para>This is the Jaw bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LastBone\">\n      <summary>\n        <para>This is the Last bone index delimiter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftEye\">\n      <summary>\n        <para>This is the Left Eye bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftFoot\">\n      <summary>\n        <para>This is the Left Ankle bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftHand\">\n      <summary>\n        <para>This is the Left Wrist bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftIndexDistal\">\n      <summary>\n        <para>This is the left index 3rd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftIndexIntermediate\">\n      <summary>\n        <para>This is the left index 2nd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftIndexProximal\">\n      <summary>\n        <para>This is the left index 1st phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftLittleDistal\">\n      <summary>\n        <para>This is the left little 3rd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftLittleIntermediate\">\n      <summary>\n        <para>This is the left little 2nd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftLittleProximal\">\n      <summary>\n        <para>This is the left little 1st phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftLowerArm\">\n      <summary>\n        <para>This is the Left Elbow bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftLowerLeg\">\n      <summary>\n        <para>This is the Left Knee bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftMiddleDistal\">\n      <summary>\n        <para>This is the left middle 3rd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftMiddleIntermediate\">\n      <summary>\n        <para>This is the left middle 2nd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftMiddleProximal\">\n      <summary>\n        <para>This is the left middle 1st phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftRingDistal\">\n      <summary>\n        <para>This is the left ring 3rd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftRingIntermediate\">\n      <summary>\n        <para>This is the left ring 2nd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftRingProximal\">\n      <summary>\n        <para>This is the left ring 1st phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftShoulder\">\n      <summary>\n        <para>This is the Left Shoulder bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftThumbDistal\">\n      <summary>\n        <para>This is the left thumb 3rd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftThumbIntermediate\">\n      <summary>\n        <para>This is the left thumb 2nd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftThumbProximal\">\n      <summary>\n        <para>This is the left thumb 1st phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftToes\">\n      <summary>\n        <para>This is the Left Toes bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftUpperArm\">\n      <summary>\n        <para>This is the Left Upper Arm bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.LeftUpperLeg\">\n      <summary>\n        <para>This is the Left Upper Leg bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.Neck\">\n      <summary>\n        <para>This is the Neck bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightEye\">\n      <summary>\n        <para>This is the Right Eye bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightFoot\">\n      <summary>\n        <para>This is the Right Ankle bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightHand\">\n      <summary>\n        <para>This is the Right Wrist bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightIndexDistal\">\n      <summary>\n        <para>This is the right index 3rd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightIndexIntermediate\">\n      <summary>\n        <para>This is the right index 2nd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightIndexProximal\">\n      <summary>\n        <para>This is the right index 1st phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightLittleDistal\">\n      <summary>\n        <para>This is the right little 3rd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightLittleIntermediate\">\n      <summary>\n        <para>This is the right little 2nd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightLittleProximal\">\n      <summary>\n        <para>This is the right little 1st phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightLowerArm\">\n      <summary>\n        <para>This is the Right Elbow bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightLowerLeg\">\n      <summary>\n        <para>This is the Right Knee bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightMiddleDistal\">\n      <summary>\n        <para>This is the right middle 3rd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightMiddleIntermediate\">\n      <summary>\n        <para>This is the right middle 2nd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightMiddleProximal\">\n      <summary>\n        <para>This is the right middle 1st phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightRingDistal\">\n      <summary>\n        <para>This is the right ring 3rd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightRingIntermediate\">\n      <summary>\n        <para>This is the right ring 2nd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightRingProximal\">\n      <summary>\n        <para>This is the right ring 1st phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightShoulder\">\n      <summary>\n        <para>This is the Right Shoulder bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightThumbDistal\">\n      <summary>\n        <para>This is the right thumb 3rd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightThumbIntermediate\">\n      <summary>\n        <para>This is the right thumb 2nd phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightThumbProximal\">\n      <summary>\n        <para>This is the right thumb 1st phalange.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightToes\">\n      <summary>\n        <para>This is the Right Toes bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightUpperArm\">\n      <summary>\n        <para>This is the Right Upper Arm bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.RightUpperLeg\">\n      <summary>\n        <para>This is the Right Upper Leg bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.Spine\">\n      <summary>\n        <para>This is the first Spine bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBodyBones.UpperChest\">\n      <summary>\n        <para>This is the Upper Chest bone.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.HumanBone\">\n      <summary>\n        <para>The mapping between a bone in the model and the conceptual bone in the Mecanim human anatomy.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HumanBone.boneName\">\n      <summary>\n        <para>The name of the bone to which the Mecanim human bone is mapped.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HumanBone.humanName\">\n      <summary>\n        <para>The name of the Mecanim human bone to which the bone from the model is mapped.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanBone.limit\">\n      <summary>\n        <para>The rotation limits that define the muscle for this bone.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.HumanDescription\">\n      <summary>\n        <para>Class that holds humanoid avatar parameters to pass to the AvatarBuilder.BuildHumanAvatar function.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HumanDescription.armStretch\">\n      <summary>\n        <para>Amount by which the arm's length is allowed to stretch when using IK.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HumanDescription.feetSpacing\">\n      <summary>\n        <para>Modification to the minimum distance between the feet of a humanoid model.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HumanDescription.hasTranslationDoF\">\n      <summary>\n        <para>True for any human that has a translation Degree of Freedom (DoF). It is set to false by default.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanDescription.human\">\n      <summary>\n        <para>Mapping between Mecanim bone names and bone names in the rig.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HumanDescription.legStretch\">\n      <summary>\n        <para>Amount by which the leg's length is allowed to stretch when using IK.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HumanDescription.lowerArmTwist\">\n      <summary>\n        <para>Defines how the lower arm's roll/twisting is distributed between the elbow and wrist joints.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HumanDescription.lowerLegTwist\">\n      <summary>\n        <para>Defines how the lower leg's roll/twisting is distributed between the knee and ankle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanDescription.skeleton\">\n      <summary>\n        <para>List of bone Transforms to include in the model.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HumanDescription.upperArmTwist\">\n      <summary>\n        <para>Defines how the upper arm's roll/twisting is distributed between the shoulder and elbow joints.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HumanDescription.upperLegTwist\">\n      <summary>\n        <para>Defines how the upper leg's roll/twisting is distributed between the thigh and knee joints.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.HumanLimit\">\n      <summary>\n        <para>This class stores the rotation limits that define the muscle for a single human bone.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HumanLimit.axisLength\">\n      <summary>\n        <para>Length of the bone to which the limit is applied.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HumanLimit.center\">\n      <summary>\n        <para>The default orientation of a bone when no muscle action is applied.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HumanLimit.max\">\n      <summary>\n        <para>The maximum rotation away from the initial value that this muscle can apply.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HumanLimit.min\">\n      <summary>\n        <para>The maximum negative rotation away from the initial value that this muscle can apply.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HumanLimit.useDefaultValues\">\n      <summary>\n        <para>Should this limit use the default values?</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.HumanPartDof\">\n      <summary>\n        <para>Enumeration of all the parts in a human.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPartDof.Body\">\n      <summary>\n        <para>The human body part.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPartDof.Head\">\n      <summary>\n        <para>The human head part.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPartDof.LeftArm\">\n      <summary>\n        <para>The human left arm part.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPartDof.LeftIndex\">\n      <summary>\n        <para>The human left index finger part.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPartDof.LeftLeg\">\n      <summary>\n        <para>The human left leg part.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPartDof.LeftLittle\">\n      <summary>\n        <para>The human left little finger part.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPartDof.LeftMiddle\">\n      <summary>\n        <para>The human left middle finger part.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPartDof.LeftRing\">\n      <summary>\n        <para>The human left ring finger part.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPartDof.LeftThumb\">\n      <summary>\n        <para>The human left thumb finger part.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPartDof.RightArm\">\n      <summary>\n        <para>The human right arm part.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPartDof.RightIndex\">\n      <summary>\n        <para>The human right index finger part.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPartDof.RightLeg\">\n      <summary>\n        <para>The human right leg part.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPartDof.RightLittle\">\n      <summary>\n        <para>The human right little finger part.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPartDof.RightMiddle\">\n      <summary>\n        <para>The human right middle finger part.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPartDof.RightRing\">\n      <summary>\n        <para>The human right ring finger part.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPartDof.RightThumb\">\n      <summary>\n        <para>The human right thumb finger part.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.HumanPose\">\n      <summary>\n        <para>Retargetable humanoid pose.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPose.bodyPosition\">\n      <summary>\n        <para>The human body position for that pose.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPose.bodyRotation\">\n      <summary>\n        <para>The human body orientation for that pose.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.HumanPose.muscles\">\n      <summary>\n        <para>The array of muscle values for that pose.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.HumanPoseHandler\">\n      <summary>\n        <para>A handler that lets you read or write a HumanPose from or to a humanoid avatar skeleton hierarchy.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.HumanPoseHandler.#ctor(UnityEngine.Avatar,UnityEngine.Transform)\">\n      <summary>\n        <para>Creates a human pose handler from an avatar and a root transform.</para>\n      </summary>\n      <param name=\"avatar\">The avatar that defines the humanoid rig on skeleton hierarchy with root as the top most parent.</param>\n      <param name=\"root\">The top most node of the skeleton hierarchy defined in humanoid avatar.</param>\n    </member>\n    <member name=\"M:UnityEngine.HumanPoseHandler.GetHumanPose(UnityEngine.HumanPose&amp;)\">\n      <summary>\n        <para>Gets a human pose from the handled avatar skeleton.</para>\n      </summary>\n      <param name=\"humanPose\">The output human pose.</param>\n    </member>\n    <member name=\"M:UnityEngine.HumanPoseHandler.SetHumanPose(UnityEngine.HumanPose&amp;)\">\n      <summary>\n        <para>Sets a human pose on the handled avatar skeleton.</para>\n      </summary>\n      <param name=\"humanPose\">The human pose to be set.</param>\n    </member>\n    <member name=\"T:UnityEngine.HumanTrait\">\n      <summary>\n        <para>Details of all the human bone and muscle types defined by Mecanim.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.HumanTrait.BoneCount\">\n      <summary>\n        <para>The number of human bone types defined by Mecanim.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.HumanTrait.BoneFromMuscle(System.Int32)\">\n      <summary>\n        <para>Return the bone to which a particular muscle is connected.</para>\n      </summary>\n      <param name=\"i\">Muscle index.</param>\n    </member>\n    <member name=\"P:UnityEngine.HumanTrait.BoneName\">\n      <summary>\n        <para>Array of the names of all human bone types defined by Mecanim.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.HumanTrait.GetBoneDefaultHierarchyMass(System.Int32)\">\n      <summary>\n        <para>Gets the bone hierarchy mass.</para>\n      </summary>\n      <param name=\"i\">The humanoid bone index.</param>\n      <returns>\n        <para>The bone hierarchy mass.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.HumanTrait.GetMuscleDefaultMax(System.Int32)\">\n      <summary>\n        <para>Get the default maximum value of rotation for a muscle in degrees.</para>\n      </summary>\n      <param name=\"i\">Muscle index.</param>\n    </member>\n    <member name=\"M:UnityEngine.HumanTrait.GetMuscleDefaultMin(System.Int32)\">\n      <summary>\n        <para>Get the default minimum value of rotation for a muscle in degrees.</para>\n      </summary>\n      <param name=\"i\">Muscle index.</param>\n    </member>\n    <member name=\"M:UnityEngine.HumanTrait.GetParentBone(System.Int32)\">\n      <summary>\n        <para>Returns parent humanoid bone index of a bone.</para>\n      </summary>\n      <param name=\"i\">Humanoid bone index to get parent from.</param>\n      <returns>\n        <para>Humanoid bone index of parent.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.HumanTrait.MuscleCount\">\n      <summary>\n        <para>The number of human muscle types defined by Mecanim.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.HumanTrait.MuscleFromBone(System.Int32,System.Int32)\">\n      <summary>\n        <para>Obtain the muscle index for a particular bone index and \"degree of freedom\".</para>\n      </summary>\n      <param name=\"i\">Bone index.</param>\n      <param name=\"dofIndex\">Number representing a \"degree of freedom\": 0 for X-Axis, 1 for Y-Axis, 2 for Z-Axis.</param>\n    </member>\n    <member name=\"P:UnityEngine.HumanTrait.MuscleName\">\n      <summary>\n        <para>Array of the names of all human muscle types defined by Mecanim.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.HumanTrait.RequiredBone(System.Int32)\">\n      <summary>\n        <para>Is the bone a member of the minimal set of bones that Mecanim requires for a human model?</para>\n      </summary>\n      <param name=\"i\">Index of the bone to test.</param>\n    </member>\n    <member name=\"P:UnityEngine.HumanTrait.RequiredBoneCount\">\n      <summary>\n        <para>The number of bone types that are required by Mecanim for any human model.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.ICanvasRaycastFilter\">\n      <summary>\n        <para>This element can filter raycasts. If the top level element is hit it can further 'check' if the location is valid.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ICanvasRaycastFilter.IsRaycastLocationValid(UnityEngine.Vector2,UnityEngine.Camera)\">\n      <summary>\n        <para>Given a point and a camera is the raycast valid.</para>\n      </summary>\n      <param name=\"sp\">Screen position.</param>\n      <param name=\"eventCamera\">Raycast camera.</param>\n      <returns>\n        <para>Valid.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.IExposedPropertyTable\">\n      <summary>\n        <para>Interface for objects used as resolvers on ExposedReferences.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.IExposedPropertyTable.ClearReferenceValue(UnityEngine.PropertyName)\">\n      <summary>\n        <para>Remove a value for the given reference.</para>\n      </summary>\n      <param name=\"id\">Identifier of the ExposedReference.</param>\n    </member>\n    <member name=\"M:UnityEngine.IExposedPropertyTable.GetReferenceValue(UnityEngine.PropertyName,System.Boolean&amp;)\">\n      <summary>\n        <para>Retrieves a value for the given identifier.</para>\n      </summary>\n      <param name=\"id\">Identifier of the ExposedReference.</param>\n      <param name=\"idValid\">Is the identifier valid?</param>\n      <returns>\n        <para>The value stored in the table.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.IExposedPropertyTable.SetReferenceValue(UnityEngine.PropertyName,UnityEngine.Object)\">\n      <summary>\n        <para>Assigns a value for an ExposedReference.</para>\n      </summary>\n      <param name=\"id\">Identifier of the ExposedReference.</param>\n      <param name=\"value\">The value to assigned to the ExposedReference.</param>\n    </member>\n    <member name=\"?:UnityEngine.ILogger\">\n      <summary>\n        <para>Interface for custom logger implementation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ILogger.filterLogType\">\n      <summary>\n        <para>To selective enable debug log message.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ILogger.logEnabled\">\n      <summary>\n        <para>To runtime toggle debug logging [ON/OFF].</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ILogger.logHandler\">\n      <summary>\n        <para>Set Logger.ILogHandler.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ILogger.IsLogTypeAllowed(UnityEngine.LogType)\">\n      <summary>\n        <para>Check logging is enabled based on the LogType.</para>\n      </summary>\n      <param name=\"logType\"></param>\n      <returns>\n        <para>Retrun true in case logs of LogType will be logged otherwise returns false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ILogger.Log(UnityEngine.LogType,System.Object)\">\n      <summary>\n        <para>Logs message to the Unity Console using default logger.</para>\n      </summary>\n      <param name=\"logType\"></param>\n      <param name=\"message\"></param>\n      <param name=\"context\"></param>\n      <param name=\"tag\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ILogger.Log(UnityEngine.LogType,System.Object,UnityEngine.Object)\">\n      <summary>\n        <para>Logs message to the Unity Console using default logger.</para>\n      </summary>\n      <param name=\"logType\"></param>\n      <param name=\"message\"></param>\n      <param name=\"context\"></param>\n      <param name=\"tag\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ILogger.Log(UnityEngine.LogType,System.String,System.Object)\">\n      <summary>\n        <para>Logs message to the Unity Console using default logger.</para>\n      </summary>\n      <param name=\"logType\"></param>\n      <param name=\"message\"></param>\n      <param name=\"context\"></param>\n      <param name=\"tag\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ILogger.Log(UnityEngine.LogType,System.String,System.Object,UnityEngine.Object)\">\n      <summary>\n        <para>Logs message to the Unity Console using default logger.</para>\n      </summary>\n      <param name=\"logType\"></param>\n      <param name=\"message\"></param>\n      <param name=\"context\"></param>\n      <param name=\"tag\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ILogger.Log(System.Object)\">\n      <summary>\n        <para>Logs message to the Unity Console using default logger.</para>\n      </summary>\n      <param name=\"logType\"></param>\n      <param name=\"message\"></param>\n      <param name=\"context\"></param>\n      <param name=\"tag\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ILogger.Log(System.String,System.Object)\">\n      <summary>\n        <para>Logs message to the Unity Console using default logger.</para>\n      </summary>\n      <param name=\"logType\"></param>\n      <param name=\"message\"></param>\n      <param name=\"context\"></param>\n      <param name=\"tag\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ILogger.Log(System.String,System.Object,UnityEngine.Object)\">\n      <summary>\n        <para>Logs message to the Unity Console using default logger.</para>\n      </summary>\n      <param name=\"logType\"></param>\n      <param name=\"message\"></param>\n      <param name=\"context\"></param>\n      <param name=\"tag\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ILogger.LogError(System.String,System.Object)\">\n      <summary>\n        <para>A variant of ILogger.Log that logs an error message.</para>\n      </summary>\n      <param name=\"tag\"></param>\n      <param name=\"message\"></param>\n      <param name=\"context\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ILogger.LogError(System.String,System.Object,UnityEngine.Object)\">\n      <summary>\n        <para>A variant of ILogger.Log that logs an error message.</para>\n      </summary>\n      <param name=\"tag\"></param>\n      <param name=\"message\"></param>\n      <param name=\"context\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ILogger.LogException(System.Exception)\">\n      <summary>\n        <para>A variant of ILogger.Log that logs an exception message.</para>\n      </summary>\n      <param name=\"exception\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ILogger.LogFormat(UnityEngine.LogType,System.String,System.Object[])\">\n      <summary>\n        <para>Logs a formatted message.</para>\n      </summary>\n      <param name=\"logType\"></param>\n      <param name=\"format\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ILogger.LogWarning(System.String,System.Object)\">\n      <summary>\n        <para>A variant of Logger.Log that logs an warning message.</para>\n      </summary>\n      <param name=\"tag\"></param>\n      <param name=\"message\"></param>\n      <param name=\"context\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ILogger.LogWarning(System.String,System.Object,UnityEngine.Object)\">\n      <summary>\n        <para>A variant of Logger.Log that logs an warning message.</para>\n      </summary>\n      <param name=\"tag\"></param>\n      <param name=\"message\"></param>\n      <param name=\"context\"></param>\n    </member>\n    <member name=\"?:UnityEngine.ILogHandler\">\n      <summary>\n        <para>Interface for custom log handler implementation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ILogHandler.LogException(System.Exception,UnityEngine.Object)\">\n      <summary>\n        <para>A variant of ILogHandler.LogFormat that logs an exception message.</para>\n      </summary>\n      <param name=\"exception\">Runtime Exception.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.ILogHandler.LogFormat(UnityEngine.LogType,UnityEngine.Object,System.String,System.Object[])\">\n      <summary>\n        <para>Logs a formatted message.</para>\n      </summary>\n      <param name=\"logType\">The type of the log message.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n      <param name=\"format\">A composite format string.</param>\n      <param name=\"args\">Format arguments.</param>\n    </member>\n    <member name=\"T:UnityEngine.ImageConversion\">\n      <summary>\n        <para>Class with utility methods and extension methods to deal with converting image data from or to PNG and JPEG formats.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ImageConversion.EncodeToEXR(UnityEngine.Texture2D,UnityEngine.Texture2D/EXRFlags)\">\n      <summary>\n        <para>Encodes this texture into the EXR format.</para>\n      </summary>\n      <param name=\"tex\">The texture to convert.</param>\n      <param name=\"flags\">Flags used to control compression and the output format.</param>\n    </member>\n    <member name=\"M:UnityEngine.ImageConversion.EncodeToJPG(UnityEngine.Texture2D,System.Int32)\">\n      <summary>\n        <para>Encodes this texture into JPG format.</para>\n      </summary>\n      <param name=\"tex\">Text texture to convert.</param>\n      <param name=\"quality\">JPG quality to encode with, 1..100 (default 75).</param>\n    </member>\n    <member name=\"M:UnityEngine.ImageConversion.EncodeToJPG(UnityEngine.Texture2D)\">\n      <summary>\n        <para>Encodes this texture into JPG format.</para>\n      </summary>\n      <param name=\"tex\">Text texture to convert.</param>\n      <param name=\"quality\">JPG quality to encode with, 1..100 (default 75).</param>\n    </member>\n    <member name=\"M:UnityEngine.ImageConversion.EncodeToPNG(UnityEngine.Texture2D)\">\n      <summary>\n        <para>Encodes this texture into PNG format.</para>\n      </summary>\n      <param name=\"tex\">The texture to convert.</param>\n    </member>\n    <member name=\"M:UnityEngine.ImageConversion.LoadImage(UnityEngine.Texture2D,System.Byte[],System.Boolean)\">\n      <summary>\n        <para>Loads PNG/JPG image byte array into a texture.</para>\n      </summary>\n      <param name=\"data\">The byte array containing the image data to load.</param>\n      <param name=\"markNonReadable\">Set to false by default, pass true to optionally mark the texture as non-readable.</param>\n      <param name=\"tex\">The texture to load the image into.</param>\n      <returns>\n        <para>Returns true if the data can be loaded, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.ImageEffectAfterScale\">\n      <summary>\n        <para>Any Image Effect with this attribute will be rendered after Dynamic Resolution stage.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ImageEffectAllowedInSceneView\">\n      <summary>\n        <para>Any Image Effect with this attribute can be rendered into the scene view camera.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ImageEffectOpaque\">\n      <summary>\n        <para>Any Image Effect with this attribute will be rendered after opaque geometry but before transparent geometry.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ImageEffectTransformsToLDR\">\n      <summary>\n        <para>When using HDR rendering it can sometime be desirable to switch to LDR rendering during ImageEffect rendering.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ImagePosition\">\n      <summary>\n        <para>How image and text is placed inside GUIStyle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ImagePosition.ImageAbove\">\n      <summary>\n        <para>Image is above the text.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ImagePosition.ImageLeft\">\n      <summary>\n        <para>Image is to the left of the text.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ImagePosition.ImageOnly\">\n      <summary>\n        <para>Only the image is displayed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ImagePosition.TextOnly\">\n      <summary>\n        <para>Only the text is displayed.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.IMECompositionMode\">\n      <summary>\n        <para>Controls IME input.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.IMECompositionMode.Auto\">\n      <summary>\n        <para>Enable IME input only when a text field is selected (default).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.IMECompositionMode.Off\">\n      <summary>\n        <para>Disable IME input.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.IMECompositionMode.On\">\n      <summary>\n        <para>Enable IME input.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Input\">\n      <summary>\n        <para>Interface into the Input system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.acceleration\">\n      <summary>\n        <para>Last measured linear acceleration of a device in three-dimensional space. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.accelerationEventCount\">\n      <summary>\n        <para>Number of acceleration measurements which occurred during last frame.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.accelerationEvents\">\n      <summary>\n        <para>Returns list of acceleration measurements which occurred during the last frame. (Read Only) (Allocates temporary variables).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.anyKey\">\n      <summary>\n        <para>Is any key or mouse button currently held down? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.anyKeyDown\">\n      <summary>\n        <para>Returns true the first frame the user hits any key or mouse button. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.backButtonLeavesApp\">\n      <summary>\n        <para>Should  Back button quit the application?\n\nOnly usable on Android, Windows Phone or Windows Tablets.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.compass\">\n      <summary>\n        <para>Property for accessing compass (handheld devices only). (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.compensateSensors\">\n      <summary>\n        <para>This property controls if input sensors should be compensated for screen orientation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.compositionCursorPos\">\n      <summary>\n        <para>The current text input position used by IMEs to open windows.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.compositionString\">\n      <summary>\n        <para>The current IME composition string being typed by the user.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.deviceOrientation\">\n      <summary>\n        <para>Device physical orientation as reported by OS. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.eatKeyPressOnTextFieldFocus\">\n      <summary>\n        <para>Property indicating whether keypresses are eaten by a textinput if it has focus (default true).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.gyro\">\n      <summary>\n        <para>Returns default gyroscope.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.imeCompositionMode\">\n      <summary>\n        <para>Controls enabling and disabling of IME input composition.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.imeIsSelected\">\n      <summary>\n        <para>Does the user have an IME keyboard input source selected?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.inputString\">\n      <summary>\n        <para>Returns the keyboard input entered this frame. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.location\">\n      <summary>\n        <para>Property for accessing device location (handheld devices only). (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.mousePosition\">\n      <summary>\n        <para>The current mouse position in pixel coordinates. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.mousePresent\">\n      <summary>\n        <para>Indicates if a mouse device is detected.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.mouseScrollDelta\">\n      <summary>\n        <para>The current mouse scroll delta. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.multiTouchEnabled\">\n      <summary>\n        <para>Property indicating whether the system handles multiple touches.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.simulateMouseWithTouches\">\n      <summary>\n        <para>Enables/Disables mouse simulation with touches. By default this option is enabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.stylusTouchSupported\">\n      <summary>\n        <para>Returns true when Stylus Touch is supported by a device or platform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.touchCount\">\n      <summary>\n        <para>Number of touches. Guaranteed not to change throughout the frame. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.touches\">\n      <summary>\n        <para>Returns list of objects representing status of all touches during last frame. (Read Only) (Allocates temporary variables).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.touchPressureSupported\">\n      <summary>\n        <para>Bool value which let's users check if touch pressure is supported.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Input.touchSupported\">\n      <summary>\n        <para>Returns whether the device on which application is currently running supports touch input.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Input.GetAccelerationEvent(System.Int32)\">\n      <summary>\n        <para>Returns specific acceleration measurement which occurred during last frame. (Does not allocate temporary variables).</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Input.GetAxis(System.String)\">\n      <summary>\n        <para>Returns the value of the virtual axis identified by axisName.</para>\n      </summary>\n      <param name=\"axisName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Input.GetAxisRaw(System.String)\">\n      <summary>\n        <para>Returns the value of the virtual axis identified by axisName with no smoothing filtering applied.</para>\n      </summary>\n      <param name=\"axisName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Input.GetButton(System.String)\">\n      <summary>\n        <para>Returns true while the virtual button identified by buttonName is held down.</para>\n      </summary>\n      <param name=\"buttonName\">The name of the button such as Jump.</param>\n      <returns>\n        <para>True when an axis has been pressed and not released.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Input.GetButtonDown(System.String)\">\n      <summary>\n        <para>Returns true during the frame the user pressed down the virtual button identified by buttonName.</para>\n      </summary>\n      <param name=\"buttonName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Input.GetButtonUp(System.String)\">\n      <summary>\n        <para>Returns true the first frame the user releases the virtual button identified by buttonName.</para>\n      </summary>\n      <param name=\"buttonName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Input.GetJoystickNames\">\n      <summary>\n        <para>Returns an array of strings describing the connected joysticks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Input.GetKey(System.String)\">\n      <summary>\n        <para>Returns true while the user holds down the key identified by name. Think auto fire.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Input.GetKey(UnityEngine.KeyCode)\">\n      <summary>\n        <para>Returns true while the user holds down the key identified by the key KeyCode enum parameter.</para>\n      </summary>\n      <param name=\"key\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Input.GetKeyDown(System.String)\">\n      <summary>\n        <para>Returns true during the frame the user starts pressing down the key identified by name.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Input.GetKeyDown(UnityEngine.KeyCode)\">\n      <summary>\n        <para>Returns true during the frame the user starts pressing down the key identified by the key KeyCode enum parameter.</para>\n      </summary>\n      <param name=\"key\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Input.GetKeyUp(System.String)\">\n      <summary>\n        <para>Returns true during the frame the user releases the key identified by name.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Input.GetKeyUp(UnityEngine.KeyCode)\">\n      <summary>\n        <para>Returns true during the frame the user releases the key identified by the key KeyCode enum parameter.</para>\n      </summary>\n      <param name=\"key\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Input.GetMouseButton(System.Int32)\">\n      <summary>\n        <para>Returns whether the given mouse button is held down.</para>\n      </summary>\n      <param name=\"button\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Input.GetMouseButtonDown(System.Int32)\">\n      <summary>\n        <para>Returns true during the frame the user pressed the given mouse button.</para>\n      </summary>\n      <param name=\"button\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Input.GetMouseButtonUp(System.Int32)\">\n      <summary>\n        <para>Returns true during the frame the user releases the given mouse button.</para>\n      </summary>\n      <param name=\"button\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Input.GetTouch(System.Int32)\">\n      <summary>\n        <para>Returns object representing status of a specific touch. (Does not allocate temporary variables).</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Input.IsJoystickPreconfigured(System.String)\">\n      <summary>\n        <para>Determine whether a particular joystick model has been preconfigured by Unity. (Linux-only).</para>\n      </summary>\n      <param name=\"joystickName\">The name of the joystick to check (returned by Input.GetJoystickNames).</param>\n      <returns>\n        <para>True if the joystick layout has been preconfigured; false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Input.ResetInputAxes\">\n      <summary>\n        <para>Resets all input. After ResetInputAxes all axes return to 0 and all buttons return to 0 for one frame.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.iOS.ActivityIndicatorStyle\">\n      <summary>\n        <para>ActivityIndicator Style (iOS Specific).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.ActivityIndicatorStyle.DontShow\">\n      <summary>\n        <para>Do not show ActivityIndicator.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.ActivityIndicatorStyle.Gray\">\n      <summary>\n        <para>The standard gray style of indicator (UIActivityIndicatorViewStyleGray).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.ActivityIndicatorStyle.White\">\n      <summary>\n        <para>The standard white style of indicator (UIActivityIndicatorViewStyleWhite).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.ActivityIndicatorStyle.WhiteLarge\">\n      <summary>\n        <para>The large white style of indicator (UIActivityIndicatorViewStyleWhiteLarge).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.iOS.ADBannerView\">\n      <summary>\n        <para>ADBannerView is a wrapper around the ADBannerView class found in the Apple iAd framework and is only available on iOS.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.ADBannerView.layout\">\n      <summary>\n        <para>Banner layout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.ADBannerView.loaded\">\n      <summary>\n        <para>Checks if banner contents are loaded.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.ADBannerView.position\">\n      <summary>\n        <para>The position of the banner view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.ADBannerView.size\">\n      <summary>\n        <para>The size of the banner view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.ADBannerView.visible\">\n      <summary>\n        <para>Banner visibility. Initially banner is not visible.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.iOS.ADBannerView.BannerFailedToLoadDelegate\">\n      <summary>\n        <para>Will be fired when banner ad failed to load.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.iOS.ADBannerView.BannerWasClickedDelegate\">\n      <summary>\n        <para>Will be fired when banner was clicked.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.iOS.ADBannerView.BannerWasLoadedDelegate\">\n      <summary>\n        <para>Will be fired when banner loaded new ad.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.iOS.ADBannerView.#ctor(UnityEngine.iOS.ADBannerView/Type,UnityEngine.iOS.ADBannerView/Layout)\">\n      <summary>\n        <para>Creates a banner view with given type and auto-layout params.</para>\n      </summary>\n      <param name=\"type\"></param>\n      <param name=\"layout\"></param>\n    </member>\n    <member name=\"M:UnityEngine.iOS.ADBannerView.IsAvailable(UnityEngine.iOS.ADBannerView/Type)\">\n      <summary>\n        <para>Checks if the banner type is available (e.g. MediumRect is available only starting with ios6).</para>\n      </summary>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"T:UnityEngine.iOS.ADBannerView.Layout\">\n      <summary>\n        <para>Specifies how banner should be layed out on screen.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.ADBannerView.Layout.Bottom\">\n      <summary>\n        <para>Traditional Banner: align to screen bottom.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.ADBannerView.Layout.BottomCenter\">\n      <summary>\n        <para>Rect Banner: align to screen bottom, placing at the center.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.ADBannerView.Layout.BottomLeft\">\n      <summary>\n        <para>Rect Banner: place in bottom-left corner.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.ADBannerView.Layout.BottomRight\">\n      <summary>\n        <para>Rect Banner: place in bottom-right corner.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.ADBannerView.Layout.Center\">\n      <summary>\n        <para>Rect Banner: place exactly at screen center.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.ADBannerView.Layout.CenterLeft\">\n      <summary>\n        <para>Rect Banner: align to screen left, placing at the center.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.ADBannerView.Layout.CenterRight\">\n      <summary>\n        <para>Rect Banner: align to screen right, placing at the center.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.ADBannerView.Layout.Manual\">\n      <summary>\n        <para>Completely manual positioning.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.ADBannerView.Layout.Top\">\n      <summary>\n        <para>Traditional Banner: align to screen top.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.ADBannerView.Layout.TopCenter\">\n      <summary>\n        <para>Rect Banner: align to screen top, placing at the center.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.ADBannerView.Layout.TopLeft\">\n      <summary>\n        <para>Rect Banner: place in top-left corner.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.ADBannerView.Layout.TopRight\">\n      <summary>\n        <para>Rect Banner: place in top-right corner.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.iOS.ADBannerView.Type\">\n      <summary>\n        <para>The type of the banner view.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.ADBannerView.Type.Banner\">\n      <summary>\n        <para>Traditional Banner (it takes full screen width).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.ADBannerView.Type.MediumRect\">\n      <summary>\n        <para>Rect Banner (300x250).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.iOS.ADInterstitialAd\">\n      <summary>\n        <para>ADInterstitialAd is a wrapper around the ADInterstitialAd class found in the Apple iAd framework and is only available on iPad.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.ADInterstitialAd.isAvailable\">\n      <summary>\n        <para>Checks if InterstitialAd is available (it is available on iPad since iOS 4.3, and on iPhone since iOS 7.0).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.ADInterstitialAd.loaded\">\n      <summary>\n        <para>Has the interstitial ad object downloaded an advertisement? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.iOS.ADInterstitialAd.#ctor\">\n      <summary>\n        <para>Creates an interstitial ad.</para>\n      </summary>\n      <param name=\"autoReload\"></param>\n    </member>\n    <member name=\"M:UnityEngine.iOS.ADInterstitialAd.#ctor(System.Boolean)\">\n      <summary>\n        <para>Creates an interstitial ad.</para>\n      </summary>\n      <param name=\"autoReload\"></param>\n    </member>\n    <member name=\"T:UnityEngine.iOS.ADInterstitialAd.InterstitialWasLoadedDelegate\">\n      <summary>\n        <para>Will be called when ad is ready to be shown.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.iOS.ADInterstitialAd.InterstitialWasViewedDelegate\">\n      <summary>\n        <para>Will be called when user viewed ad contents: i.e. they went past the initial screen. Please note that it is impossible to determine if they clicked on any links in ad sequences that follows the initial screen.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.iOS.ADInterstitialAd.ReloadAd\">\n      <summary>\n        <para>Reload advertisement.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.iOS.ADInterstitialAd.Show\">\n      <summary>\n        <para>Shows full-screen advertisement to user.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.iOS.CalendarIdentifier\">\n      <summary>\n        <para>Specify calendar types.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarIdentifier.BuddhistCalendar\">\n      <summary>\n        <para>Identifies the Buddhist calendar.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarIdentifier.ChineseCalendar\">\n      <summary>\n        <para>Identifies the Chinese calendar.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarIdentifier.GregorianCalendar\">\n      <summary>\n        <para>Identifies the Gregorian calendar.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarIdentifier.HebrewCalendar\">\n      <summary>\n        <para>Identifies the Hebrew calendar.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarIdentifier.IndianCalendar\">\n      <summary>\n        <para>Identifies the Indian calendar.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarIdentifier.IslamicCalendar\">\n      <summary>\n        <para>Identifies the Islamic calendar.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarIdentifier.IslamicCivilCalendar\">\n      <summary>\n        <para>Identifies the Islamic civil calendar.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarIdentifier.ISO8601Calendar\">\n      <summary>\n        <para>Identifies the ISO8601.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarIdentifier.JapaneseCalendar\">\n      <summary>\n        <para>Identifies the Japanese calendar.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarIdentifier.PersianCalendar\">\n      <summary>\n        <para>Identifies the Persian calendar.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarIdentifier.RepublicOfChinaCalendar\">\n      <summary>\n        <para>Identifies the Republic of China (Taiwan) calendar.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.iOS.CalendarUnit\">\n      <summary>\n        <para>Specify calendrical units.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarUnit.Day\">\n      <summary>\n        <para>Specifies the day unit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarUnit.Era\">\n      <summary>\n        <para>Specifies the era unit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarUnit.Hour\">\n      <summary>\n        <para>Specifies the hour unit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarUnit.Minute\">\n      <summary>\n        <para>Specifies the minute unit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarUnit.Month\">\n      <summary>\n        <para>Specifies the month unit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarUnit.Quarter\">\n      <summary>\n        <para>Specifies the quarter of the calendar.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarUnit.Second\">\n      <summary>\n        <para>Specifies the second unit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarUnit.Week\">\n      <summary>\n        <para>Specifies the week unit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarUnit.Weekday\">\n      <summary>\n        <para>Specifies the weekday unit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarUnit.WeekdayOrdinal\">\n      <summary>\n        <para>Specifies the ordinal weekday unit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.CalendarUnit.Year\">\n      <summary>\n        <para>Specifies the year unit.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.iOS.Device\">\n      <summary>\n        <para>Interface into iOS specific functionality.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.Device.advertisingIdentifier\">\n      <summary>\n        <para>Advertising ID.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.Device.advertisingTrackingEnabled\">\n      <summary>\n        <para>Is advertising tracking enabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.Device.deferSystemGesturesMode\">\n      <summary>\n        <para>Defer system gestures until the second swipe on specific edges.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.Device.generation\">\n      <summary>\n        <para>The generation of the device. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.Device.hideHomeButton\">\n      <summary>\n        <para>Specifies whether the home button should be hidden in the iOS build of this application.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.Device.systemVersion\">\n      <summary>\n        <para>iOS version.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.Device.vendorIdentifier\">\n      <summary>\n        <para>Vendor ID.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.iOS.Device.RequestStoreReview\">\n      <summary>\n        <para>Request App Store rating and review from the user.</para>\n      </summary>\n      <returns>\n        <para>Value indicating whether the underlying API is available or not. False indicates that the iOS version isn't recent enough or that the StoreKit framework is not linked with the app.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.iOS.Device.ResetNoBackupFlag(System.String)\">\n      <summary>\n        <para>Reset \"no backup\" file flag: file will be synced with iCloud/iTunes backup and can be deleted by OS in low storage situations.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEngine.iOS.Device.SetNoBackupFlag(System.String)\">\n      <summary>\n        <para>Set file flag to be excluded from iCloud/iTunes backup.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"T:UnityEngine.iOS.DeviceGeneration\">\n      <summary>\n        <para>iOS device generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPad1Gen\">\n      <summary>\n        <para>iPad, first generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPad2Gen\">\n      <summary>\n        <para>iPad, second generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPad3Gen\">\n      <summary>\n        <para>iPad, third generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPad4Gen\">\n      <summary>\n        <para>iPad, fourth generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPad5Gen\">\n      <summary>\n        <para>iPad Air, fifth generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPadAir1\">\n      <summary>\n        <para>iPad Air.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPadAir2\">\n      <summary>\n        <para>iPad Air 2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPadMini1Gen\">\n      <summary>\n        <para>iPadMini, first generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPadMini2Gen\">\n      <summary>\n        <para>iPadMini Retina, second generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPadMini3Gen\">\n      <summary>\n        <para>iPad Mini 3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPadMini4Gen\">\n      <summary>\n        <para>iPad Mini, fourth generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPadPro10Inch1Gen\">\n      <summary>\n        <para>iPad Pro 9.7\", first generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPadPro10Inch2Gen\">\n      <summary>\n        <para>iPad Pro 10.5\", second generation 10\" iPad.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPadPro1Gen\">\n      <summary>\n        <para>iPad Pro 12.9\", first generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPadPro2Gen\">\n      <summary>\n        <para>iPad Pro 12.9\", second generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPadUnknown\">\n      <summary>\n        <para>Yet unknown iPad.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhone\">\n      <summary>\n        <para>iPhone, first generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhone3G\">\n      <summary>\n        <para>iPhone, second generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhone3GS\">\n      <summary>\n        <para>iPhone, third generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhone4\">\n      <summary>\n        <para>iPhone, fourth generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhone4S\">\n      <summary>\n        <para>iPhone, fifth generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhone5\">\n      <summary>\n        <para>iPhone5.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhone5C\">\n      <summary>\n        <para>iPhone 5C.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhone5S\">\n      <summary>\n        <para>iPhone 5S.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhone6\">\n      <summary>\n        <para>iPhone 6.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhone6Plus\">\n      <summary>\n        <para>iPhone 6 plus.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhone6S\">\n      <summary>\n        <para>iPhone 6S.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhone6SPlus\">\n      <summary>\n        <para>iPhone 6S Plus.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhone7\">\n      <summary>\n        <para>iPhone 7.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhone7Plus\">\n      <summary>\n        <para>iPhone 7 Plus.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhone8\">\n      <summary>\n        <para>iPhone 8.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhone8Plus\">\n      <summary>\n        <para>iPhone 8 Plus.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhoneSE1Gen\">\n      <summary>\n        <para>iPhone SE, first generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhoneUnknown\">\n      <summary>\n        <para>Yet unknown iPhone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPhoneX\">\n      <summary>\n        <para>iPhone X.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPodTouch1Gen\">\n      <summary>\n        <para>iPod Touch, first generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPodTouch2Gen\">\n      <summary>\n        <para>iPod Touch, second generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPodTouch3Gen\">\n      <summary>\n        <para>iPod Touch, third generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPodTouch4Gen\">\n      <summary>\n        <para>iPod Touch, fourth generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPodTouch5Gen\">\n      <summary>\n        <para>iPod Touch, fifth generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPodTouch6Gen\">\n      <summary>\n        <para>iPod Touch, sixth generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.DeviceGeneration.iPodTouchUnknown\">\n      <summary>\n        <para>Yet unknown iPod Touch.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.iOS.LocalNotification\">\n      <summary>\n        <para>iOS.LocalNotification is a wrapper around the UILocalNotification class found in the Apple UIKit framework and is only available on iPhoneiPadiPod Touch.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.LocalNotification.alertAction\">\n      <summary>\n        <para>The title of the action button or slider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.LocalNotification.alertBody\">\n      <summary>\n        <para>The message displayed in the notification alert.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.LocalNotification.alertLaunchImage\">\n      <summary>\n        <para>Identifies the image used as the launch image when the user taps the action button.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.LocalNotification.alertTitle\">\n      <summary>\n        <para>A short description of the reason for the alert.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.LocalNotification.applicationIconBadgeNumber\">\n      <summary>\n        <para>The number to display as the application's icon badge.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.LocalNotification.defaultSoundName\">\n      <summary>\n        <para>The default system sound. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.LocalNotification.fireDate\">\n      <summary>\n        <para>The date and time when the system should deliver the notification.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.LocalNotification.hasAction\">\n      <summary>\n        <para>A boolean value that controls whether the alert action is visible or not.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.LocalNotification.repeatCalendar\">\n      <summary>\n        <para>The calendar type (Gregorian, Chinese, etc) to use for rescheduling the notification.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.LocalNotification.repeatInterval\">\n      <summary>\n        <para>The calendar interval at which to reschedule the notification.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.LocalNotification.soundName\">\n      <summary>\n        <para>The name of the sound file to play when an alert is displayed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.LocalNotification.timeZone\">\n      <summary>\n        <para>The time zone of the notification's fire date.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.LocalNotification.userInfo\">\n      <summary>\n        <para>A dictionary for passing custom information to the notified application.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.iOS.LocalNotification.#ctor\">\n      <summary>\n        <para>Creates a new local notification.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.iOS.NotificationServices\">\n      <summary>\n        <para>NotificationServices is only available on iPhoneiPadiPod Touch.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.NotificationServices.deviceToken\">\n      <summary>\n        <para>Device token received from Apple Push Service after calling NotificationServices.RegisterForRemoteNotificationTypes. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.NotificationServices.enabledNotificationTypes\">\n      <summary>\n        <para>Enabled local and remote notification types.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.NotificationServices.localNotificationCount\">\n      <summary>\n        <para>The number of received local notifications. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.NotificationServices.localNotifications\">\n      <summary>\n        <para>The list of objects representing received local notifications. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.NotificationServices.registrationError\">\n      <summary>\n        <para>Returns an error that might occur on registration for remote notifications via NotificationServices.RegisterForRemoteNotificationTypes. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.NotificationServices.remoteNotificationCount\">\n      <summary>\n        <para>The number of received remote notifications. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.NotificationServices.remoteNotifications\">\n      <summary>\n        <para>The list of objects representing received remote notifications. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.NotificationServices.scheduledLocalNotifications\">\n      <summary>\n        <para>All currently scheduled local notifications.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.iOS.NotificationServices.CancelAllLocalNotifications\">\n      <summary>\n        <para>Cancels the delivery of all scheduled local notifications.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.iOS.NotificationServices.CancelLocalNotification(UnityEngine.iOS.LocalNotification)\">\n      <summary>\n        <para>Cancels the delivery of the specified scheduled local notification.</para>\n      </summary>\n      <param name=\"notification\"></param>\n    </member>\n    <member name=\"M:UnityEngine.iOS.NotificationServices.ClearLocalNotifications\">\n      <summary>\n        <para>Discards of all received local notifications.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.iOS.NotificationServices.ClearRemoteNotifications\">\n      <summary>\n        <para>Discards of all received remote notifications.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.iOS.NotificationServices.GetLocalNotification(System.Int32)\">\n      <summary>\n        <para>Returns an object representing a specific local notification. (Read Only)</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.iOS.NotificationServices.GetRemoteNotification(System.Int32)\">\n      <summary>\n        <para>Returns an object representing a specific remote notification. (Read Only)</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.iOS.NotificationServices.PresentLocalNotificationNow(UnityEngine.iOS.LocalNotification)\">\n      <summary>\n        <para>Presents a local notification immediately.</para>\n      </summary>\n      <param name=\"notification\"></param>\n    </member>\n    <member name=\"M:UnityEngine.iOS.NotificationServices.RegisterForNotifications(UnityEngine.iOS.NotificationType)\">\n      <summary>\n        <para>Register to receive local and remote notifications of the specified types from a provider via Apple Push Service.</para>\n      </summary>\n      <param name=\"notificationTypes\">Notification types to register for.</param>\n      <param name=\"registerForRemote\">Specify true to also register for remote notifications.</param>\n    </member>\n    <member name=\"M:UnityEngine.iOS.NotificationServices.RegisterForNotifications(UnityEngine.iOS.NotificationType,System.Boolean)\">\n      <summary>\n        <para>Register to receive local and remote notifications of the specified types from a provider via Apple Push Service.</para>\n      </summary>\n      <param name=\"notificationTypes\">Notification types to register for.</param>\n      <param name=\"registerForRemote\">Specify true to also register for remote notifications.</param>\n    </member>\n    <member name=\"M:UnityEngine.iOS.NotificationServices.ScheduleLocalNotification(UnityEngine.iOS.LocalNotification)\">\n      <summary>\n        <para>Schedules a local notification.</para>\n      </summary>\n      <param name=\"notification\"></param>\n    </member>\n    <member name=\"M:UnityEngine.iOS.NotificationServices.UnregisterForRemoteNotifications\">\n      <summary>\n        <para>Unregister for remote notifications.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.iOS.NotificationType\">\n      <summary>\n        <para>Specifies local and remote notification types.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.NotificationType.Alert\">\n      <summary>\n        <para>Notification is an alert message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.NotificationType.Badge\">\n      <summary>\n        <para>Notification is a badge shown above the application's icon.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.NotificationType.None\">\n      <summary>\n        <para>No notification types specified.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.NotificationType.Sound\">\n      <summary>\n        <para>Notification is an alert sound.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.iOS.OnDemandResources\">\n      <summary>\n        <para>On Demand Resources API.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.OnDemandResources.enabled\">\n      <summary>\n        <para>Indicates whether player was built with \"Use On Demand Resources\" player setting enabled.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.iOS.OnDemandResources.PreloadAsync(System.String[])\">\n      <summary>\n        <para>Creates an On Demand Resources (ODR) request.</para>\n      </summary>\n      <param name=\"tags\">Tags for On Demand Resources that should be included in the request.</param>\n      <returns>\n        <para>Object representing ODR request.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.iOS.OnDemandResourcesRequest\">\n      <summary>\n        <para>Represents a request for On Demand Resources (ODR). It's an AsyncOperation and can be yielded in a coroutine.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.OnDemandResourcesRequest.error\">\n      <summary>\n        <para>Returns an error after operation is complete.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.OnDemandResourcesRequest.loadingPriority\">\n      <summary>\n        <para>Sets the priority for request.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.iOS.OnDemandResourcesRequest.Dispose\">\n      <summary>\n        <para>Release all resources kept alive by On Demand Resources (ODR) request.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.iOS.OnDemandResourcesRequest.GetResourcePath(System.String)\">\n      <summary>\n        <para>Gets file system's path to the resource available in On Demand Resources (ODR) request.</para>\n      </summary>\n      <param name=\"resourceName\">Resource name.</param>\n    </member>\n    <member name=\"T:UnityEngine.iOS.RemoteNotification\">\n      <summary>\n        <para>RemoteNotification is only available on iPhoneiPadiPod Touch.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.RemoteNotification.alertBody\">\n      <summary>\n        <para>The message displayed in the notification alert. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.RemoteNotification.alertTitle\">\n      <summary>\n        <para>A short description of the reason for the alert. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.RemoteNotification.applicationIconBadgeNumber\">\n      <summary>\n        <para>The number to display as the application's icon badge. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.RemoteNotification.hasAction\">\n      <summary>\n        <para>A boolean value that controls whether the alert action is visible or not. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.RemoteNotification.soundName\">\n      <summary>\n        <para>The name of the sound file to play when an alert is displayed. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.iOS.RemoteNotification.userInfo\">\n      <summary>\n        <para>A dictionary for passing custom information to the notified application. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.iOS.SystemGestureDeferMode\">\n      <summary>\n        <para>Bit-mask used to control the deferring of system gestures on iOS.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.SystemGestureDeferMode.All\">\n      <summary>\n        <para>Identifies all screen edges.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.SystemGestureDeferMode.BottomEdge\">\n      <summary>\n        <para>Identifies bottom screen edge.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.SystemGestureDeferMode.LeftEdge\">\n      <summary>\n        <para>Identifies left screen edge.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.SystemGestureDeferMode.None\">\n      <summary>\n        <para>Disables gesture deferring on all edges.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.SystemGestureDeferMode.RightEdge\">\n      <summary>\n        <para>Identifies right screen edge.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.iOS.SystemGestureDeferMode.TopEdge\">\n      <summary>\n        <para>Identifies top screen edge.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.ISerializationCallbackReceiver\">\n      <summary>\n        <para>Interface to receive callbacks upon serialization and deserialization.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ISerializationCallbackReceiver.OnAfterDeserialize\">\n      <summary>\n        <para>Implement this method to receive a callback after Unity deserializes your object.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ISerializationCallbackReceiver.OnBeforeSerialize\">\n      <summary>\n        <para>Implement this method to receive a callback before Unity serializes your object.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Jobs.IJobParallelForTransform\">\n      <summary>\n        <para>IJobParallelForTransform.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Jobs.IJobParallelForTransform.Execute(System.Int32,UnityEngine.Jobs.TransformAccess)\">\n      <summary>\n        <para>Execute.</para>\n      </summary>\n      <param name=\"index\">Index.</param>\n      <param name=\"transform\">TransformAccessArray.</param>\n    </member>\n    <member name=\"T:UnityEngine.Jobs.IJobParallelForTransformExtensions\">\n      <summary>\n        <para>Extension methods for IJobParallelForTransform.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Jobs.IJobParallelForTransformExtensions.Schedule(T,UnityEngine.Jobs.TransformAccessArray,Unity.Jobs.JobHandle)\">\n      <summary>\n        <para>Schedule.</para>\n      </summary>\n      <param name=\"jobData\">Job data.</param>\n      <param name=\"transforms\">TransformAccessArray.</param>\n      <param name=\"dependsOn\">Job handle dependency.</param>\n      <returns>\n        <para>Job handle.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Jobs.TransformAccess\">\n      <summary>\n        <para>Position, rotation and scale of an object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Jobs.TransformAccess.localPosition\">\n      <summary>\n        <para>The scale of the transform relative to the parent.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Jobs.TransformAccess.localRotation\">\n      <summary>\n        <para>The rotation of the transform relative to the parent transform's rotation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Jobs.TransformAccess.localScale\">\n      <summary>\n        <para>The scale of the transform relative to the parent.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Jobs.TransformAccess.position\">\n      <summary>\n        <para>The position of the transform in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Jobs.TransformAccess.rotation\">\n      <summary>\n        <para>The rotation of the transform in world space stored as a Quaternion.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Jobs.TransformAccessArray\">\n      <summary>\n        <para>TransformAccessArray.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Jobs.TransformAccessArray.capacity\">\n      <summary>\n        <para>Returns array capacity.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Jobs.TransformAccessArray.isCreated\">\n      <summary>\n        <para>isCreated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Jobs.TransformAccessArray.length\">\n      <summary>\n        <para>Length.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Jobs.TransformAccessArray.Add(UnityEngine.Transform)\">\n      <summary>\n        <para>Add.</para>\n      </summary>\n      <param name=\"transform\">Transform.</param>\n    </member>\n    <member name=\"M:UnityEngine.Jobs.TransformAccessArray.Allocate(System.Int32,System.Int32,UnityEngine.Jobs.TransformAccessArray&amp;)\">\n      <summary>\n        <para>Allocate.</para>\n      </summary>\n      <param name=\"capacity\">Capacity.</param>\n      <param name=\"desiredJobCount\">Desired job count.</param>\n      <param name=\"array\">TransformAccessArray.</param>\n    </member>\n    <member name=\"M:UnityEngine.Jobs.TransformAccessArray.#ctor(UnityEngine.Transform[],System.Int32)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"transforms\">Transforms.</param>\n      <param name=\"desiredJobCount\">Desired job count.</param>\n      <param name=\"capacity\">Capacity.</param>\n    </member>\n    <member name=\"M:UnityEngine.Jobs.TransformAccessArray.#ctor(System.Int32,System.Int32)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"transforms\">Transforms.</param>\n      <param name=\"desiredJobCount\">Desired job count.</param>\n      <param name=\"capacity\">Capacity.</param>\n    </member>\n    <member name=\"M:UnityEngine.Jobs.TransformAccessArray.Dispose\">\n      <summary>\n        <para>Dispose.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Jobs.TransformAccessArray.RemoveAtSwapBack(System.Int32)\">\n      <summary>\n        <para>Remove item at index.</para>\n      </summary>\n      <param name=\"index\">Index.</param>\n    </member>\n    <member name=\"M:UnityEngine.Jobs.TransformAccessArray.SetTransforms(UnityEngine.Transform[])\">\n      <summary>\n        <para>Set transforms.</para>\n      </summary>\n      <param name=\"transforms\">Transforms.</param>\n    </member>\n    <member name=\"P:UnityEngine.Jobs.TransformAccessArray.this\">\n      <summary>\n        <para>Array indexer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Joint\">\n      <summary>\n        <para>Joint is the base class for all joints.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint.anchor\">\n      <summary>\n        <para>The Position of the anchor around which the joints motion is constrained.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint.autoConfigureConnectedAnchor\">\n      <summary>\n        <para>Should the connectedAnchor be calculated automatically?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint.axis\">\n      <summary>\n        <para>The Direction of the axis around which the body is constrained.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint.breakForce\">\n      <summary>\n        <para>The force that needs to be applied for this joint to break.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint.breakTorque\">\n      <summary>\n        <para>The torque that needs to be applied for this joint to break.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint.connectedAnchor\">\n      <summary>\n        <para>Position of the anchor relative to the connected Rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint.connectedBody\">\n      <summary>\n        <para>A reference to another rigidbody this joint connects to.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint.connectedMassScale\">\n      <summary>\n        <para>The scale to apply to the inverse mass and inertia tensor of the connected body prior to solving the constraints.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint.currentForce\">\n      <summary>\n        <para>The force applied by the solver to satisfy all constraints.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint.currentTorque\">\n      <summary>\n        <para>The torque applied by the solver to satisfy all constraints.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint.enableCollision\">\n      <summary>\n        <para>Enable collision between bodies connected with the joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint.enablePreprocessing\">\n      <summary>\n        <para>Toggle preprocessing for this joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint.massScale\">\n      <summary>\n        <para>The scale to apply to the inverse mass and inertia tensor of the body prior to solving the constraints.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Joint2D\">\n      <summary>\n        <para>Parent class for joints to connect Rigidbody2D objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint2D.attachedRigidbody\">\n      <summary>\n        <para>The Rigidbody2D attached to the Joint2D.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint2D.breakForce\">\n      <summary>\n        <para>The force that needs to be applied for this joint to break.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint2D.breakTorque\">\n      <summary>\n        <para>The torque that needs to be applied for this joint to break.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint2D.collideConnected\">\n      <summary>\n        <para>Can the joint collide with the other Rigidbody2D object to which it is attached?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint2D.connectedBody\">\n      <summary>\n        <para>The Rigidbody2D object to which the other end of the joint is attached (ie, the object without the joint component).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint2D.enableCollision\">\n      <summary>\n        <para>Should the two rigid bodies connected with this joint collide with each other?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint2D.reactionForce\">\n      <summary>\n        <para>Gets the reaction force of the joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Joint2D.reactionTorque\">\n      <summary>\n        <para>Gets the reaction torque of the joint.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Joint2D.GetReactionForce(System.Single)\">\n      <summary>\n        <para>Gets the reaction force of the joint given the specified timeStep.</para>\n      </summary>\n      <param name=\"timeStep\">The time to calculate the reaction force for.</param>\n      <returns>\n        <para>The reaction force of the joint in the specified timeStep.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Joint2D.GetReactionTorque(System.Single)\">\n      <summary>\n        <para>Gets the reaction torque of the joint given the specified timeStep.</para>\n      </summary>\n      <param name=\"timeStep\">The time to calculate the reaction torque for.</param>\n      <returns>\n        <para>The reaction torque of the joint in the specified timeStep.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.JointAngleLimits2D\">\n      <summary>\n        <para>Angular limits on the rotation of a Rigidbody2D object around a HingeJoint2D.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointAngleLimits2D.max\">\n      <summary>\n        <para>Upper angular limit of rotation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointAngleLimits2D.min\">\n      <summary>\n        <para>Lower angular limit of rotation.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.JointDrive\">\n      <summary>\n        <para>How the joint's movement will behave along its local X axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointDrive.maximumForce\">\n      <summary>\n        <para>Amount of force applied to push the object toward the defined direction.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointDrive.mode\">\n      <summary>\n        <para>Whether the drive should attempt to reach position, velocity, both or nothing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointDrive.positionDamper\">\n      <summary>\n        <para>Resistance strength against the Position Spring. Only used if mode includes Position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointDrive.positionSpring\">\n      <summary>\n        <para>Strength of a rubber-band pull toward the defined direction. Only used if mode includes Position.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.JointDriveMode\">\n      <summary>\n        <para>The ConfigurableJoint attempts to attain position / velocity targets based on this flag.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.JointDriveMode.None\">\n      <summary>\n        <para>Don't apply any forces to reach the target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.JointDriveMode.Position\">\n      <summary>\n        <para>Try to reach the specified target position.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.JointDriveMode.PositionAndVelocity\">\n      <summary>\n        <para>Try to reach the specified target position and velocity.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.JointDriveMode.Velocity\">\n      <summary>\n        <para>Try to reach the specified target velocity.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.JointLimits\">\n      <summary>\n        <para>JointLimits is used by the HingeJoint to limit the joints angle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointLimits.bounceMinVelocity\">\n      <summary>\n        <para>The minimum impact velocity which will cause the joint to bounce.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointLimits.bounciness\">\n      <summary>\n        <para>Determines the size of the bounce when the joint hits it's limit. Also known as restitution.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointLimits.contactDistance\">\n      <summary>\n        <para>Distance inside the limit value at which the limit will be considered to be active by the solver.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointLimits.max\">\n      <summary>\n        <para>The upper angular limit (in degrees) of the joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointLimits.min\">\n      <summary>\n        <para>The lower angular limit (in degrees) of the joint.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.JointLimitState2D\">\n      <summary>\n        <para>Represents the state of a joint limit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.JointLimitState2D.EqualLimits\">\n      <summary>\n        <para>Represents a state where the joint limit is at the specified lower and upper limits (they are identical).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.JointLimitState2D.Inactive\">\n      <summary>\n        <para>Represents a state where the joint limit is inactive.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.JointLimitState2D.LowerLimit\">\n      <summary>\n        <para>Represents a state where the joint limit is at the specified lower limit.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.JointLimitState2D.UpperLimit\">\n      <summary>\n        <para>Represents a state where the joint limit is at the specified upper limit.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.JointMotor\">\n      <summary>\n        <para>The JointMotor is used to motorize a joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointMotor.force\">\n      <summary>\n        <para>The motor will apply a force.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointMotor.freeSpin\">\n      <summary>\n        <para>If freeSpin is enabled the motor will only accelerate but never slow down.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointMotor.targetVelocity\">\n      <summary>\n        <para>The motor will apply a force up to force to achieve targetVelocity.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.JointMotor2D\">\n      <summary>\n        <para>Parameters for the optional motor force applied to a Joint2D.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointMotor2D.maxMotorTorque\">\n      <summary>\n        <para>The maximum force that can be applied to the Rigidbody2D at the joint to attain the target speed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointMotor2D.motorSpeed\">\n      <summary>\n        <para>The desired speed for the Rigidbody2D to reach as it moves with the joint.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.JointProjectionMode\">\n      <summary>\n        <para>Determines how to snap physics joints back to its constrained position when it drifts off too much.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.JointProjectionMode.None\">\n      <summary>\n        <para>Don't snap at all.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.JointProjectionMode.PositionAndRotation\">\n      <summary>\n        <para>Snap both position and rotation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.JointProjectionMode.PositionOnly\">\n      <summary>\n        <para>Snap Position only.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.JointSpring\">\n      <summary>\n        <para>JointSpring is used add a spring force to HingeJoint and PhysicMaterial.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.JointSpring.damper\">\n      <summary>\n        <para>The damper force uses to dampen the spring.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.JointSpring.spring\">\n      <summary>\n        <para>The spring forces used to reach the target position.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.JointSpring.targetPosition\">\n      <summary>\n        <para>The target position the joint attempts to reach.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.JointSuspension2D\">\n      <summary>\n        <para>Joint suspension is used to define how suspension works on a WheelJoint2D.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointSuspension2D.angle\">\n      <summary>\n        <para>The world angle (in degrees) along which the suspension will move.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointSuspension2D.dampingRatio\">\n      <summary>\n        <para>The amount by which the suspension spring force is reduced in proportion to the movement speed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointSuspension2D.frequency\">\n      <summary>\n        <para>The frequency at which the suspension spring oscillates.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.JointTranslationLimits2D\">\n      <summary>\n        <para>Motion limits of a Rigidbody2D object along a SliderJoint2D.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointTranslationLimits2D.max\">\n      <summary>\n        <para>Maximum distance the Rigidbody2D object can move from the Slider Joint's anchor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.JointTranslationLimits2D.min\">\n      <summary>\n        <para>Minimum distance the Rigidbody2D object can move from the Slider Joint's anchor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.JsonUtility\">\n      <summary>\n        <para>Utility functions for working with JSON data.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.JsonUtility.FromJson(System.String)\">\n      <summary>\n        <para>Create an object from its JSON representation.</para>\n      </summary>\n      <param name=\"json\">The JSON representation of the object.</param>\n      <returns>\n        <para>An instance of the object.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.JsonUtility.FromJson(System.String,System.Type)\">\n      <summary>\n        <para>Create an object from its JSON representation.</para>\n      </summary>\n      <param name=\"json\">The JSON representation of the object.</param>\n      <param name=\"type\">The type of object represented by the Json.</param>\n      <returns>\n        <para>An instance of the object.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.JsonUtility.FromJsonOverwrite(System.String,System.Object)\">\n      <summary>\n        <para>Overwrite data in an object by reading from its JSON representation.</para>\n      </summary>\n      <param name=\"json\">The JSON representation of the object.</param>\n      <param name=\"objectToOverwrite\">The object that should be overwritten.</param>\n    </member>\n    <member name=\"M:UnityEngine.JsonUtility.ToJson(System.Object)\">\n      <summary>\n        <para>Generate a JSON representation of the public fields of an object.</para>\n      </summary>\n      <param name=\"obj\">The object to convert to JSON form.</param>\n      <param name=\"prettyPrint\">If true, format the output for readability. If false, format the output for minimum size. Default is false.</param>\n      <returns>\n        <para>The object's data in JSON format.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.JsonUtility.ToJson(System.Object,System.Boolean)\">\n      <summary>\n        <para>Generate a JSON representation of the public fields of an object.</para>\n      </summary>\n      <param name=\"obj\">The object to convert to JSON form.</param>\n      <param name=\"prettyPrint\">If true, format the output for readability. If false, format the output for minimum size. Default is false.</param>\n      <returns>\n        <para>The object's data in JSON format.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.KeyCode\">\n      <summary>\n        <para>Key codes returned by Event.keyCode. These map directly to a physical key on the keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.A\">\n      <summary>\n        <para>'a' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Alpha0\">\n      <summary>\n        <para>The '0' key on the top of the alphanumeric keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Alpha1\">\n      <summary>\n        <para>The '1' key on the top of the alphanumeric keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Alpha2\">\n      <summary>\n        <para>The '2' key on the top of the alphanumeric keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Alpha3\">\n      <summary>\n        <para>The '3' key on the top of the alphanumeric keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Alpha4\">\n      <summary>\n        <para>The '4' key on the top of the alphanumeric keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Alpha5\">\n      <summary>\n        <para>The '5' key on the top of the alphanumeric keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Alpha6\">\n      <summary>\n        <para>The '6' key on the top of the alphanumeric keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Alpha7\">\n      <summary>\n        <para>The '7' key on the top of the alphanumeric keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Alpha8\">\n      <summary>\n        <para>The '8' key on the top of the alphanumeric keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Alpha9\">\n      <summary>\n        <para>The '9' key on the top of the alphanumeric keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.AltGr\">\n      <summary>\n        <para>Alt Gr key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Ampersand\">\n      <summary>\n        <para>Ampersand key '&amp;'.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Asterisk\">\n      <summary>\n        <para>Asterisk key '*'.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.At\">\n      <summary>\n        <para>At key '@'.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.B\">\n      <summary>\n        <para>'b' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.BackQuote\">\n      <summary>\n        <para>Back quote key '`'.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Backslash\">\n      <summary>\n        <para>Backslash key '\\'.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Backspace\">\n      <summary>\n        <para>The backspace key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Break\">\n      <summary>\n        <para>Break key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.C\">\n      <summary>\n        <para>'c' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.CapsLock\">\n      <summary>\n        <para>Capslock key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Caret\">\n      <summary>\n        <para>Caret key '^'.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Clear\">\n      <summary>\n        <para>The Clear key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Colon\">\n      <summary>\n        <para>Colon ':' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Comma\">\n      <summary>\n        <para>Comma ',' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.D\">\n      <summary>\n        <para>'d' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Delete\">\n      <summary>\n        <para>The forward delete key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Dollar\">\n      <summary>\n        <para>Dollar sign key '$'.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.DoubleQuote\">\n      <summary>\n        <para>Double quote key '\"'.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.DownArrow\">\n      <summary>\n        <para>Down arrow key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.E\">\n      <summary>\n        <para>'e' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.End\">\n      <summary>\n        <para>End key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Equals\">\n      <summary>\n        <para>Equals '=' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Escape\">\n      <summary>\n        <para>Escape key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Exclaim\">\n      <summary>\n        <para>Exclamation mark key '!'.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.F\">\n      <summary>\n        <para>'f' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.F1\">\n      <summary>\n        <para>F1 function key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.F10\">\n      <summary>\n        <para>F10 function key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.F11\">\n      <summary>\n        <para>F11 function key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.F12\">\n      <summary>\n        <para>F12 function key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.F13\">\n      <summary>\n        <para>F13 function key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.F14\">\n      <summary>\n        <para>F14 function key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.F15\">\n      <summary>\n        <para>F15 function key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.F2\">\n      <summary>\n        <para>F2 function key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.F3\">\n      <summary>\n        <para>F3 function key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.F4\">\n      <summary>\n        <para>F4 function key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.F5\">\n      <summary>\n        <para>F5 function key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.F6\">\n      <summary>\n        <para>F6 function key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.F7\">\n      <summary>\n        <para>F7 function key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.F8\">\n      <summary>\n        <para>F8 function key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.F9\">\n      <summary>\n        <para>F9 function key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.G\">\n      <summary>\n        <para>'g' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Greater\">\n      <summary>\n        <para>Greater than '&gt;' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.H\">\n      <summary>\n        <para>'h' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Hash\">\n      <summary>\n        <para>Hash key '#'.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Help\">\n      <summary>\n        <para>Help key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Home\">\n      <summary>\n        <para>Home key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.I\">\n      <summary>\n        <para>'i' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Insert\">\n      <summary>\n        <para>Insert key key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.J\">\n      <summary>\n        <para>'j' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button0\">\n      <summary>\n        <para>Button 0 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button1\">\n      <summary>\n        <para>Button 1 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button10\">\n      <summary>\n        <para>Button 10 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button11\">\n      <summary>\n        <para>Button 11 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button12\">\n      <summary>\n        <para>Button 12 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button13\">\n      <summary>\n        <para>Button 13 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button14\">\n      <summary>\n        <para>Button 14 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button15\">\n      <summary>\n        <para>Button 15 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button16\">\n      <summary>\n        <para>Button 16 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button17\">\n      <summary>\n        <para>Button 17 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button18\">\n      <summary>\n        <para>Button 18 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button19\">\n      <summary>\n        <para>Button 19 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button2\">\n      <summary>\n        <para>Button 2 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button3\">\n      <summary>\n        <para>Button 3 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button4\">\n      <summary>\n        <para>Button 4 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button5\">\n      <summary>\n        <para>Button 5 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button6\">\n      <summary>\n        <para>Button 6 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button7\">\n      <summary>\n        <para>Button 7 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button8\">\n      <summary>\n        <para>Button 8 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick1Button9\">\n      <summary>\n        <para>Button 9 on first joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button0\">\n      <summary>\n        <para>Button 0 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button1\">\n      <summary>\n        <para>Button 1 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button10\">\n      <summary>\n        <para>Button 10 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button11\">\n      <summary>\n        <para>Button 11 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button12\">\n      <summary>\n        <para>Button 12 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button13\">\n      <summary>\n        <para>Button 13 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button14\">\n      <summary>\n        <para>Button 14 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button15\">\n      <summary>\n        <para>Button 15 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button16\">\n      <summary>\n        <para>Button 16 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button17\">\n      <summary>\n        <para>Button 17 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button18\">\n      <summary>\n        <para>Button 18 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button19\">\n      <summary>\n        <para>Button 19 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button2\">\n      <summary>\n        <para>Button 2 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button3\">\n      <summary>\n        <para>Button 3 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button4\">\n      <summary>\n        <para>Button 4 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button5\">\n      <summary>\n        <para>Button 5 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button6\">\n      <summary>\n        <para>Button 6 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button7\">\n      <summary>\n        <para>Button 7 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button8\">\n      <summary>\n        <para>Button 8 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick2Button9\">\n      <summary>\n        <para>Button 9 on second joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button0\">\n      <summary>\n        <para>Button 0 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button1\">\n      <summary>\n        <para>Button 1 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button10\">\n      <summary>\n        <para>Button 10 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button11\">\n      <summary>\n        <para>Button 11 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button12\">\n      <summary>\n        <para>Button 12 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button13\">\n      <summary>\n        <para>Button 13 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button14\">\n      <summary>\n        <para>Button 14 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button15\">\n      <summary>\n        <para>Button 15 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button16\">\n      <summary>\n        <para>Button 16 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button17\">\n      <summary>\n        <para>Button 17 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button18\">\n      <summary>\n        <para>Button 18 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button19\">\n      <summary>\n        <para>Button 19 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button2\">\n      <summary>\n        <para>Button 2 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button3\">\n      <summary>\n        <para>Button 3 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button4\">\n      <summary>\n        <para>Button 4 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button5\">\n      <summary>\n        <para>Button 5 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button6\">\n      <summary>\n        <para>Button 6 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button7\">\n      <summary>\n        <para>Button 7 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button8\">\n      <summary>\n        <para>Button 8 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick3Button9\">\n      <summary>\n        <para>Button 9 on third joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button0\">\n      <summary>\n        <para>Button 0 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button1\">\n      <summary>\n        <para>Button 1 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button10\">\n      <summary>\n        <para>Button 10 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button11\">\n      <summary>\n        <para>Button 11 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button12\">\n      <summary>\n        <para>Button 12 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button13\">\n      <summary>\n        <para>Button 13 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button14\">\n      <summary>\n        <para>Button 14 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button15\">\n      <summary>\n        <para>Button 15 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button16\">\n      <summary>\n        <para>Button 16 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button17\">\n      <summary>\n        <para>Button 17 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button18\">\n      <summary>\n        <para>Button 18 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button19\">\n      <summary>\n        <para>Button 19 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button2\">\n      <summary>\n        <para>Button 2 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button3\">\n      <summary>\n        <para>Button 3 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button4\">\n      <summary>\n        <para>Button 4 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button5\">\n      <summary>\n        <para>Button 5 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button6\">\n      <summary>\n        <para>Button 6 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button7\">\n      <summary>\n        <para>Button 7 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button8\">\n      <summary>\n        <para>Button 8 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick4Button9\">\n      <summary>\n        <para>Button 9 on forth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button0\">\n      <summary>\n        <para>Button 0 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button1\">\n      <summary>\n        <para>Button 1 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button10\">\n      <summary>\n        <para>Button 10 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button11\">\n      <summary>\n        <para>Button 11 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button12\">\n      <summary>\n        <para>Button 12 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button13\">\n      <summary>\n        <para>Button 13 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button14\">\n      <summary>\n        <para>Button 14 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button15\">\n      <summary>\n        <para>Button 15 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button16\">\n      <summary>\n        <para>Button 16 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button17\">\n      <summary>\n        <para>Button 17 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button18\">\n      <summary>\n        <para>Button 18 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button19\">\n      <summary>\n        <para>Button 19 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button2\">\n      <summary>\n        <para>Button 2 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button3\">\n      <summary>\n        <para>Button 3 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button4\">\n      <summary>\n        <para>Button 4 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button5\">\n      <summary>\n        <para>Button 5 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button6\">\n      <summary>\n        <para>Button 6 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button7\">\n      <summary>\n        <para>Button 7 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button8\">\n      <summary>\n        <para>Button 8 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick5Button9\">\n      <summary>\n        <para>Button 9 on fifth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button0\">\n      <summary>\n        <para>Button 0 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button1\">\n      <summary>\n        <para>Button 1 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button10\">\n      <summary>\n        <para>Button 10 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button11\">\n      <summary>\n        <para>Button 11 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button12\">\n      <summary>\n        <para>Button 12 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button13\">\n      <summary>\n        <para>Button 13 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button14\">\n      <summary>\n        <para>Button 14 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button15\">\n      <summary>\n        <para>Button 15 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button16\">\n      <summary>\n        <para>Button 16 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button17\">\n      <summary>\n        <para>Button 17 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button18\">\n      <summary>\n        <para>Button 18 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button19\">\n      <summary>\n        <para>Button 19 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button2\">\n      <summary>\n        <para>Button 2 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button3\">\n      <summary>\n        <para>Button 3 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button4\">\n      <summary>\n        <para>Button 4 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button5\">\n      <summary>\n        <para>Button 5 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button6\">\n      <summary>\n        <para>Button 6 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button7\">\n      <summary>\n        <para>Button 7 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button8\">\n      <summary>\n        <para>Button 8 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick6Button9\">\n      <summary>\n        <para>Button 9 on sixth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button0\">\n      <summary>\n        <para>Button 0 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button1\">\n      <summary>\n        <para>Button 1 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button10\">\n      <summary>\n        <para>Button 10 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button11\">\n      <summary>\n        <para>Button 11 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button12\">\n      <summary>\n        <para>Button 12 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button13\">\n      <summary>\n        <para>Button 13 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button14\">\n      <summary>\n        <para>Button 14 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button15\">\n      <summary>\n        <para>Button 15 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button16\">\n      <summary>\n        <para>Button 16 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button17\">\n      <summary>\n        <para>Button 17 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button18\">\n      <summary>\n        <para>Button 18 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button19\">\n      <summary>\n        <para>Button 19 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button2\">\n      <summary>\n        <para>Button 2 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button3\">\n      <summary>\n        <para>Button 3 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button4\">\n      <summary>\n        <para>Button 4 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button5\">\n      <summary>\n        <para>Button 5 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button6\">\n      <summary>\n        <para>Button 6 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button7\">\n      <summary>\n        <para>Button 7 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button8\">\n      <summary>\n        <para>Button 8 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick7Button9\">\n      <summary>\n        <para>Button 9 on seventh joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button0\">\n      <summary>\n        <para>Button 0 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button1\">\n      <summary>\n        <para>Button 1 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button10\">\n      <summary>\n        <para>Button 10 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button11\">\n      <summary>\n        <para>Button 11 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button12\">\n      <summary>\n        <para>Button 12 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button13\">\n      <summary>\n        <para>Button 13 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button14\">\n      <summary>\n        <para>Button 14 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button15\">\n      <summary>\n        <para>Button 15 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button16\">\n      <summary>\n        <para>Button 16 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button17\">\n      <summary>\n        <para>Button 17 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button18\">\n      <summary>\n        <para>Button 18 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button19\">\n      <summary>\n        <para>Button 19 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button2\">\n      <summary>\n        <para>Button 2 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button3\">\n      <summary>\n        <para>Button 3 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button4\">\n      <summary>\n        <para>Button 4 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button5\">\n      <summary>\n        <para>Button 5 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button6\">\n      <summary>\n        <para>Button 6 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button7\">\n      <summary>\n        <para>Button 7 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button8\">\n      <summary>\n        <para>Button 8 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Joystick8Button9\">\n      <summary>\n        <para>Button 9 on eighth joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton0\">\n      <summary>\n        <para>Button 0 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton1\">\n      <summary>\n        <para>Button 1 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton10\">\n      <summary>\n        <para>Button 10 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton11\">\n      <summary>\n        <para>Button 11 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton12\">\n      <summary>\n        <para>Button 12 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton13\">\n      <summary>\n        <para>Button 13 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton14\">\n      <summary>\n        <para>Button 14 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton15\">\n      <summary>\n        <para>Button 15 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton16\">\n      <summary>\n        <para>Button 16 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton17\">\n      <summary>\n        <para>Button 17 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton18\">\n      <summary>\n        <para>Button 18 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton19\">\n      <summary>\n        <para>Button 19 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton2\">\n      <summary>\n        <para>Button 2 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton3\">\n      <summary>\n        <para>Button 3 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton4\">\n      <summary>\n        <para>Button 4 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton5\">\n      <summary>\n        <para>Button 5 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton6\">\n      <summary>\n        <para>Button 6 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton7\">\n      <summary>\n        <para>Button 7 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton8\">\n      <summary>\n        <para>Button 8 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.JoystickButton9\">\n      <summary>\n        <para>Button 9 on any joystick.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.K\">\n      <summary>\n        <para>'k' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Keypad0\">\n      <summary>\n        <para>Numeric keypad 0.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Keypad1\">\n      <summary>\n        <para>Numeric keypad 1.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Keypad2\">\n      <summary>\n        <para>Numeric keypad 2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Keypad3\">\n      <summary>\n        <para>Numeric keypad 3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Keypad4\">\n      <summary>\n        <para>Numeric keypad 4.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Keypad5\">\n      <summary>\n        <para>Numeric keypad 5.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Keypad6\">\n      <summary>\n        <para>Numeric keypad 6.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Keypad7\">\n      <summary>\n        <para>Numeric keypad 7.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Keypad8\">\n      <summary>\n        <para>Numeric keypad 8.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Keypad9\">\n      <summary>\n        <para>Numeric keypad 9.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.KeypadDivide\">\n      <summary>\n        <para>Numeric keypad '/'.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.KeypadEnter\">\n      <summary>\n        <para>Numeric keypad enter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.KeypadEquals\">\n      <summary>\n        <para>Numeric keypad '='.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.KeypadMinus\">\n      <summary>\n        <para>Numeric keypad '-'.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.KeypadMultiply\">\n      <summary>\n        <para>Numeric keypad '*'.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.KeypadPeriod\">\n      <summary>\n        <para>Numeric keypad '.'.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.KeypadPlus\">\n      <summary>\n        <para>Numeric keypad '+'.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.L\">\n      <summary>\n        <para>'l' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.LeftAlt\">\n      <summary>\n        <para>Left Alt key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.LeftApple\">\n      <summary>\n        <para>Left Command key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.LeftArrow\">\n      <summary>\n        <para>Left arrow key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.LeftBracket\">\n      <summary>\n        <para>Left square bracket key '['.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.LeftCommand\">\n      <summary>\n        <para>Left Command key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.LeftControl\">\n      <summary>\n        <para>Left Control key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.LeftParen\">\n      <summary>\n        <para>Left Parenthesis key '('.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.LeftShift\">\n      <summary>\n        <para>Left shift key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.LeftWindows\">\n      <summary>\n        <para>Left Windows key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Less\">\n      <summary>\n        <para>Less than '&lt;' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.M\">\n      <summary>\n        <para>'m' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Menu\">\n      <summary>\n        <para>Menu key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Minus\">\n      <summary>\n        <para>Minus '-' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Mouse0\">\n      <summary>\n        <para>The Left (or primary) mouse button.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Mouse1\">\n      <summary>\n        <para>Right mouse button (or secondary mouse button).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Mouse2\">\n      <summary>\n        <para>Middle mouse button (or third button).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Mouse3\">\n      <summary>\n        <para>Additional (fourth) mouse button.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Mouse4\">\n      <summary>\n        <para>Additional (fifth) mouse button.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Mouse5\">\n      <summary>\n        <para>Additional (or sixth) mouse button.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Mouse6\">\n      <summary>\n        <para>Additional (or seventh) mouse button.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.N\">\n      <summary>\n        <para>'n' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.None\">\n      <summary>\n        <para>Not assigned (never returned as the result of a keystroke).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Numlock\">\n      <summary>\n        <para>Numlock key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.O\">\n      <summary>\n        <para>'o' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.P\">\n      <summary>\n        <para>'p' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.PageDown\">\n      <summary>\n        <para>Page down.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.PageUp\">\n      <summary>\n        <para>Page up.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Pause\">\n      <summary>\n        <para>Pause on PC machines.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Period\">\n      <summary>\n        <para>Period '.' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Plus\">\n      <summary>\n        <para>Plus key '+'.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Print\">\n      <summary>\n        <para>Print key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Q\">\n      <summary>\n        <para>'q' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Question\">\n      <summary>\n        <para>Question mark '?' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Quote\">\n      <summary>\n        <para>Quote key '.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.R\">\n      <summary>\n        <para>'r' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Return\">\n      <summary>\n        <para>Return key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.RightAlt\">\n      <summary>\n        <para>Right Alt key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.RightApple\">\n      <summary>\n        <para>Right Command key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.RightArrow\">\n      <summary>\n        <para>Right arrow key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.RightBracket\">\n      <summary>\n        <para>Right square bracket key ']'.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.RightCommand\">\n      <summary>\n        <para>Right Command key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.RightControl\">\n      <summary>\n        <para>Right Control key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.RightParen\">\n      <summary>\n        <para>Right Parenthesis key ')'.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.RightShift\">\n      <summary>\n        <para>Right shift key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.RightWindows\">\n      <summary>\n        <para>Right Windows key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.S\">\n      <summary>\n        <para>'s' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.ScrollLock\">\n      <summary>\n        <para>Scroll lock key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Semicolon\">\n      <summary>\n        <para>Semicolon ';' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Slash\">\n      <summary>\n        <para>Slash '/' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Space\">\n      <summary>\n        <para>Space key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.SysReq\">\n      <summary>\n        <para>Sys Req key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.T\">\n      <summary>\n        <para>'t' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Tab\">\n      <summary>\n        <para>The tab key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.U\">\n      <summary>\n        <para>'u' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Underscore\">\n      <summary>\n        <para>Underscore '_' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.UpArrow\">\n      <summary>\n        <para>Up arrow key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.V\">\n      <summary>\n        <para>'v' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.W\">\n      <summary>\n        <para>'w' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.X\">\n      <summary>\n        <para>'x' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Y\">\n      <summary>\n        <para>'y' key.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.KeyCode.Z\">\n      <summary>\n        <para>'z' key.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Keyframe\">\n      <summary>\n        <para>A single keyframe that can be injected into an animation curve.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Keyframe.inTangent\">\n      <summary>\n        <para>Sets the incoming tangent for this key. The incoming tangent affects the slope of the curve from the previous key to this key.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Keyframe.inWeight\">\n      <summary>\n        <para>Sets the incoming weight for this key. The incoming weight affects the slope of the curve from the previous key to this key.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Keyframe.outTangent\">\n      <summary>\n        <para>Sets the outgoing tangent for this key. The outgoing tangent affects the slope of the curve from this key to the next key.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Keyframe.outWeight\">\n      <summary>\n        <para>Sets the outgoing weight for this key. The outgoing weight affects the slope of the curve from this key to the next key.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Keyframe.tangentMode\">\n      <summary>\n        <para>TangentMode is deprecated.  Use AnimationUtility.SetKeyLeftTangentMode or AnimationUtility.SetKeyRightTangentMode instead.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Keyframe.time\">\n      <summary>\n        <para>The time of the keyframe.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Keyframe.value\">\n      <summary>\n        <para>The value of the curve at keyframe.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Keyframe.weightedMode\">\n      <summary>\n        <para>Weighted mode for the keyframe.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Keyframe.#ctor(System.Single,System.Single)\">\n      <summary>\n        <para>Create a keyframe.</para>\n      </summary>\n      <param name=\"time\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Keyframe.#ctor(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Create a keyframe.</para>\n      </summary>\n      <param name=\"time\"></param>\n      <param name=\"value\"></param>\n      <param name=\"inTangent\"></param>\n      <param name=\"outTangent\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Keyframe.#ctor(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Create a keyframe.</para>\n      </summary>\n      <param name=\"time\"></param>\n      <param name=\"value\"></param>\n      <param name=\"inTangent\"></param>\n      <param name=\"outTangent\"></param>\n      <param name=\"inWeight\"></param>\n      <param name=\"outWeight\"></param>\n    </member>\n    <member name=\"T:UnityEngine.LayerMask\">\n      <summary>\n        <para>LayerMask allow you to display the LayerMask popup menu in the inspector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LayerMask.value\">\n      <summary>\n        <para>Converts a layer mask value to an integer value.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.LayerMask.GetMask(System.String[])\">\n      <summary>\n        <para>Given a set of layer names as defined by either a Builtin or a User Layer in the, returns the equivalent layer mask for all of them.</para>\n      </summary>\n      <param name=\"layerNames\">List of layer names to convert to a layer mask.</param>\n      <returns>\n        <para>The layer mask created from the layerNames.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.LayerMask.implop_LayerMask(int)(System.Int32)\">\n      <summary>\n        <para>Implicitly converts an integer to a LayerMask.</para>\n      </summary>\n      <param name=\"intVal\"></param>\n    </member>\n    <member name=\"M:UnityEngine.LayerMask.LayerToName(System.Int32)\">\n      <summary>\n        <para>Given a layer number, returns the name of the layer as defined in either a Builtin or a User Layer in the.</para>\n      </summary>\n      <param name=\"layer\"></param>\n    </member>\n    <member name=\"M:UnityEngine.LayerMask.NameToLayer(System.String)\">\n      <summary>\n        <para>Given a layer name, returns the layer index as defined by either a Builtin or a User Layer in the.</para>\n      </summary>\n      <param name=\"layerName\"></param>\n    </member>\n    <member name=\"T:UnityEngine.LegDof\">\n      <summary>\n        <para>Enumeration of all the muscles in a leg.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LegDof.FootCloseOpen\">\n      <summary>\n        <para>The foot close-open muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LegDof.FootInOut\">\n      <summary>\n        <para>The foot in-out muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LegDof.LastLegDof\">\n      <summary>\n        <para>The last value of the LegDof enum.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LegDof.LegCloseOpen\">\n      <summary>\n        <para>The leg close-open muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LegDof.LegRollInOut\">\n      <summary>\n        <para>The leg roll in-out muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LegDof.ToesUpDown\">\n      <summary>\n        <para>The toes up-down muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LegDof.UpperLegFrontBack\">\n      <summary>\n        <para>The upper leg front-back muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LegDof.UpperLegInOut\">\n      <summary>\n        <para>The upper leg in-out muscle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LegDof.UpperLegRollInOut\">\n      <summary>\n        <para>The upper leg roll in-out muscle.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LensFlare\">\n      <summary>\n        <para>Script interface for a.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LensFlare.brightness\">\n      <summary>\n        <para>The strength of the flare.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LensFlare.color\">\n      <summary>\n        <para>The color of the flare.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LensFlare.fadeSpeed\">\n      <summary>\n        <para>The fade speed of the flare.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LensFlare.flare\">\n      <summary>\n        <para>The to use.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Light\">\n      <summary>\n        <para>Script interface for.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.areaSize\">\n      <summary>\n        <para>The size of the area light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.bakingOutput\">\n      <summary>\n        <para>This property describes the output of the last Global Illumination bake.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.bounceIntensity\">\n      <summary>\n        <para>The multiplier that defines the strength of the bounce lighting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.color\">\n      <summary>\n        <para>The color of the light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.colorTemperature\">\n      <summary>\n        <para>\n          The color temperature of the light.\n          Correlated Color Temperature (abbreviated as CCT) is multiplied with the color filter when calculating the final color of a light source. The color temperature of the electromagnetic radiation emitted from an ideal black body is defined as its surface temperature in Kelvin. White is 6500K according to the D65 standard. Candle light is 1800K.\n          If you want to use lightsUseCCT, lightsUseLinearIntensity has to be enabled to ensure physically correct output.\n          See Also: GraphicsSettings.lightsUseLinearIntensity, GraphicsSettings.lightsUseCCT.\n        </para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.commandBufferCount\">\n      <summary>\n        <para>Number of command buffers set up on this light (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.cookie\">\n      <summary>\n        <para>The cookie texture projected by the light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.cookieSize\">\n      <summary>\n        <para>The size of a directional light's cookie.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.cullingMask\">\n      <summary>\n        <para>This is used to light certain objects in the scene selectively.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.flare\">\n      <summary>\n        <para>The to use for this light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.intensity\">\n      <summary>\n        <para>The Intensity of a light is multiplied with the Light color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.isBaked\">\n      <summary>\n        <para>Is the light contribution already stored in lightmaps and/or lightprobes (Read Only). Obsolete; replaced by Light-lightmapBakeType.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.layerShadowCullDistances\">\n      <summary>\n        <para>Per-light, per-layer shadow culling distances.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.lightmapBakeType\">\n      <summary>\n        <para>This property describes what part of a light's contribution can be baked.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.lightShadowCasterMode\">\n      <summary>\n        <para>Allows you to override the global Shadowmask Mode per light. Only use this with render pipelines that can handle per light Shadowmask modes. Incompatible with the legacy renderers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.range\">\n      <summary>\n        <para>The range of the light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.renderMode\">\n      <summary>\n        <para>How to render the light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.shadowAngle\">\n      <summary>\n        <para>Controls the amount of artificial softening applied to the edges of shadows cast by directional lights.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.shadowBias\">\n      <summary>\n        <para>Shadow mapping constant bias.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.shadowCustomResolution\">\n      <summary>\n        <para>The custom resolution of the shadow map.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.shadowNearPlane\">\n      <summary>\n        <para>Near plane value to use for shadow frustums.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.shadowNormalBias\">\n      <summary>\n        <para>Shadow mapping normal-based bias.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.shadowRadius\">\n      <summary>\n        <para>Controls the amount of artificial softening applied to the edges of shadows cast by the Point or Spot light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.shadowResolution\">\n      <summary>\n        <para>The resolution of the shadow map.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.shadows\">\n      <summary>\n        <para>How this light casts shadows</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.shadowStrength\">\n      <summary>\n        <para>Strength of light's shadows.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.spotAngle\">\n      <summary>\n        <para>The angle of the light's spotlight cone in degrees.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Light.type\">\n      <summary>\n        <para>The type of the light.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Light.AddCommandBuffer(UnityEngine.Rendering.LightEvent,UnityEngine.Rendering.CommandBuffer)\">\n      <summary>\n        <para>Add a command buffer to be executed at a specified place.</para>\n      </summary>\n      <param name=\"evt\">When to execute the command buffer during rendering.</param>\n      <param name=\"buffer\">The buffer to execute.</param>\n      <param name=\"shadowPassMask\">A mask specifying which shadow passes to execute the buffer for.</param>\n    </member>\n    <member name=\"M:UnityEngine.Light.AddCommandBuffer(UnityEngine.Rendering.LightEvent,UnityEngine.Rendering.CommandBuffer,UnityEngine.Rendering.ShadowMapPass)\">\n      <summary>\n        <para>Add a command buffer to be executed at a specified place.</para>\n      </summary>\n      <param name=\"evt\">When to execute the command buffer during rendering.</param>\n      <param name=\"buffer\">The buffer to execute.</param>\n      <param name=\"shadowPassMask\">A mask specifying which shadow passes to execute the buffer for.</param>\n    </member>\n    <member name=\"M:UnityEngine.Light.AddCommandBufferAsync(UnityEngine.Rendering.LightEvent,UnityEngine.Rendering.CommandBuffer,UnityEngine.Rendering.ComputeQueueType)\">\n      <summary>\n        <para>Adds a command buffer to the GPU's async compute queues and executes that command buffer when graphics processing reaches a given point.</para>\n      </summary>\n      <param name=\"evt\">The point during the graphics processing at which this command buffer should commence on the GPU.</param>\n      <param name=\"buffer\">The buffer to execute.</param>\n      <param name=\"queueType\">The desired async compute queue type to execute the buffer on.</param>\n      <param name=\"shadowPassMask\">A mask specifying which shadow passes to execute the buffer for.</param>\n    </member>\n    <member name=\"M:UnityEngine.Light.AddCommandBufferAsync(UnityEngine.Rendering.LightEvent,UnityEngine.Rendering.CommandBuffer,UnityEngine.Rendering.ShadowMapPass,UnityEngine.Rendering.ComputeQueueType)\">\n      <summary>\n        <para>Adds a command buffer to the GPU's async compute queues and executes that command buffer when graphics processing reaches a given point.</para>\n      </summary>\n      <param name=\"evt\">The point during the graphics processing at which this command buffer should commence on the GPU.</param>\n      <param name=\"buffer\">The buffer to execute.</param>\n      <param name=\"queueType\">The desired async compute queue type to execute the buffer on.</param>\n      <param name=\"shadowPassMask\">A mask specifying which shadow passes to execute the buffer for.</param>\n    </member>\n    <member name=\"M:UnityEngine.Light.GetCommandBuffers(UnityEngine.Rendering.LightEvent)\">\n      <summary>\n        <para>Get command buffers to be executed at a specified place.</para>\n      </summary>\n      <param name=\"evt\">When to execute the command buffer during rendering.</param>\n      <returns>\n        <para>Array of command buffers.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Light.RemoveAllCommandBuffers\">\n      <summary>\n        <para>Remove all command buffers set on this light.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Light.RemoveCommandBuffer(UnityEngine.Rendering.LightEvent,UnityEngine.Rendering.CommandBuffer)\">\n      <summary>\n        <para>Remove command buffer from execution at a specified place.</para>\n      </summary>\n      <param name=\"evt\">When to execute the command buffer during rendering.</param>\n      <param name=\"buffer\">The buffer to execute.</param>\n    </member>\n    <member name=\"M:UnityEngine.Light.RemoveCommandBuffers(UnityEngine.Rendering.LightEvent)\">\n      <summary>\n        <para>Remove command buffers from execution at a specified place.</para>\n      </summary>\n      <param name=\"evt\">When to execute the command buffer during rendering.</param>\n    </member>\n    <member name=\"M:UnityEngine.Light.SetLightDirty\">\n      <summary>\n        <para>Sets a light dirty to notify the light baking backends to update their internal light representation.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LightBakingOutput\">\n      <summary>\n        <para>Struct describing the result of a Global Illumination bake for a given light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightBakingOutput.isBaked\">\n      <summary>\n        <para>Is the light contribution already stored in lightmaps and/or lightprobes?</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightBakingOutput.lightmapBakeType\">\n      <summary>\n        <para>This property describes what part of a light's contribution was baked.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightBakingOutput.mixedLightingMode\">\n      <summary>\n        <para>In case of a LightmapBakeType.Mixed light, describes what Mixed mode was used to bake the light, irrelevant otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightBakingOutput.occlusionMaskChannel\">\n      <summary>\n        <para>In case of a LightmapBakeType.Mixed light, contains the index of the occlusion mask channel to use if any, otherwise -1.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightBakingOutput.probeOcclusionLightIndex\">\n      <summary>\n        <para>In case of a LightmapBakeType.Mixed light, contains the index of the light as seen from the occlusion probes point of view if any, otherwise -1.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LightmapBakeType\">\n      <summary>\n        <para>Enum describing what part of a light contribution can be baked.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightmapBakeType.Baked\">\n      <summary>\n        <para>Baked lights cannot move or change in any way during run time. All lighting for static objects gets baked into lightmaps. Lighting and shadows for dynamic objects gets baked into Light Probes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightmapBakeType.Mixed\">\n      <summary>\n        <para>Mixed lights allow a mix of realtime and baked lighting, based on the Mixed Lighting Mode used. These lights cannot move, but can change color and intensity at run time. Changes to color and intensity only affect direct lighting as indirect lighting gets baked. If using Subtractive mode, changes to color or intensity are not calculated at run time on static objects.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightmapBakeType.Realtime\">\n      <summary>\n        <para>Realtime lights cast run time light and shadows. They can change position, orientation, color, brightness, and many other properties at run time. No lighting gets baked into lightmaps or light probes..</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LightmapData\">\n      <summary>\n        <para>Data of a lightmap.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightmapData.lightmapColor\">\n      <summary>\n        <para>Lightmap storing color of incoming light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightmapData.lightmapDir\">\n      <summary>\n        <para>Lightmap storing dominant direction of incoming light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightmapData.shadowMask\">\n      <summary>\n        <para>Texture storing occlusion mask per light (ShadowMask, up to four lights).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LightmapSettings\">\n      <summary>\n        <para>Stores lightmaps of the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightmapSettings.lightmaps\">\n      <summary>\n        <para>Lightmap array.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightmapSettings.lightmapsMode\">\n      <summary>\n        <para>Non-directional, Directional or Directional Specular lightmaps rendering mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightmapSettings.lightProbes\">\n      <summary>\n        <para>Holds all data needed by the light probes.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LightmapsMode\">\n      <summary>\n        <para>Lightmap (and lighting) configuration mode, controls how lightmaps interact with lighting and what kind of information they store.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightmapsMode.CombinedDirectional\">\n      <summary>\n        <para>Directional information for direct light is combined with directional information for indirect light, encoded as 2 lightmaps.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightmapsMode.NonDirectional\">\n      <summary>\n        <para>Light intensity (no directional information), encoded as 1 lightmap.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightmapsMode.SeparateDirectional\">\n      <summary>\n        <para>Directional information for direct light is stored separately from directional information for indirect light, encoded as 4 lightmaps.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LightmapsModeLegacy\">\n      <summary>\n        <para>Single, dual, or directional lightmaps rendering mode, used only in GIWorkflowMode.Legacy</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightmapsModeLegacy.Directional\">\n      <summary>\n        <para>Directional rendering mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightmapsModeLegacy.Dual\">\n      <summary>\n        <para>Dual lightmap rendering mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightmapsModeLegacy.Single\">\n      <summary>\n        <para>Single, traditional lightmap rendering mode.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LightProbeGroup\">\n      <summary>\n        <para>Light Probe Group.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightProbeGroup.probePositions\">\n      <summary>\n        <para>Editor only function to access and modify probe positions.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LightProbeProxyVolume\">\n      <summary>\n        <para>The Light Probe Proxy Volume component offers the possibility to use higher resolution lighting for large non-static GameObjects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightProbeProxyVolume.boundingBoxMode\">\n      <summary>\n        <para>The bounding box mode for generating the 3D grid of interpolated Light Probes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightProbeProxyVolume.boundsGlobal\">\n      <summary>\n        <para>The world-space bounding box in which the 3D grid of interpolated Light Probes is generated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightProbeProxyVolume.gridResolutionX\">\n      <summary>\n        <para>The 3D grid resolution on the z-axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightProbeProxyVolume.gridResolutionY\">\n      <summary>\n        <para>The 3D grid resolution on the y-axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightProbeProxyVolume.gridResolutionZ\">\n      <summary>\n        <para>The 3D grid resolution on the z-axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightProbeProxyVolume.isFeatureSupported\">\n      <summary>\n        <para>Checks if Light Probe Proxy Volumes are supported.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightProbeProxyVolume.originCustom\">\n      <summary>\n        <para>The local-space origin of the bounding box in which the 3D grid of interpolated Light Probes is generated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightProbeProxyVolume.probeDensity\">\n      <summary>\n        <para>Interpolated Light Probe density.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightProbeProxyVolume.probePositionMode\">\n      <summary>\n        <para>The mode in which the interpolated Light Probe positions are generated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightProbeProxyVolume.qualityMode\">\n      <summary>\n        <para>Determines how many Spherical Harmonics bands will be evaluated to compute the ambient color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightProbeProxyVolume.refreshMode\">\n      <summary>\n        <para>Sets the way the Light Probe Proxy Volume refreshes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightProbeProxyVolume.resolutionMode\">\n      <summary>\n        <para>The resolution mode for generating the grid of interpolated Light Probes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightProbeProxyVolume.sizeCustom\">\n      <summary>\n        <para>The size of the bounding box in which the 3D grid of interpolated Light Probes is generated.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LightProbeProxyVolume.BoundingBoxMode\">\n      <summary>\n        <para>The bounding box mode for generating a grid of interpolated Light Probes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightProbeProxyVolume.BoundingBoxMode.AutomaticLocal\">\n      <summary>\n        <para>The bounding box encloses the current Renderer and all the relevant Renderers down the hierarchy, in local space.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightProbeProxyVolume.BoundingBoxMode.AutomaticWorld\">\n      <summary>\n        <para>The bounding box encloses the current Renderer and all the relevant Renderers down the hierarchy, in world space.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightProbeProxyVolume.BoundingBoxMode.Custom\">\n      <summary>\n        <para>A custom local-space bounding box is used. The user is able to edit the bounding box.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LightProbeProxyVolume.ProbePositionMode\">\n      <summary>\n        <para>The mode in which the interpolated Light Probe positions are generated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightProbeProxyVolume.ProbePositionMode.CellCenter\">\n      <summary>\n        <para>Divide the volume in cells based on resolution, and generate interpolated Light Probe positions in the center of the cells.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightProbeProxyVolume.ProbePositionMode.CellCorner\">\n      <summary>\n        <para>Divide the volume in cells based on resolution, and generate interpolated Light Probes positions in the corner/edge of the cells.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LightProbeProxyVolume.QualityMode\">\n      <summary>\n        <para>An enum describing the Quality option used by the Light Probe Proxy Volume component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightProbeProxyVolume.QualityMode.Low\">\n      <summary>\n        <para>This option will use only two SH coefficients bands: L0 and L1. The coefficients are sampled from the Light Probe Proxy Volume 3D Texture. Using this option might increase the draw call batch sizes by not having to change the L2 coefficients per Renderer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightProbeProxyVolume.QualityMode.Normal\">\n      <summary>\n        <para>This option will use L0 and L1 SH coefficients from the Light Probe Proxy Volume 3D Texture. The L2 coefficients are constant per Renderer. By having to provide the L2 coefficients, draw call batches might be broken.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LightProbeProxyVolume.RefreshMode\">\n      <summary>\n        <para>An enum describing the way a Light Probe Proxy Volume refreshes in the Player.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightProbeProxyVolume.RefreshMode.Automatic\">\n      <summary>\n        <para>Automatically detects updates in Light Probes and triggers an update of the Light Probe volume.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightProbeProxyVolume.RefreshMode.EveryFrame\">\n      <summary>\n        <para>Causes Unity to update the Light Probe Proxy Volume every frame.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightProbeProxyVolume.RefreshMode.ViaScripting\">\n      <summary>\n        <para>Use this option to indicate that the Light Probe Proxy Volume is never to be automatically updated by Unity.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LightProbeProxyVolume.ResolutionMode\">\n      <summary>\n        <para>The resolution mode for generating a grid of interpolated Light Probes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightProbeProxyVolume.ResolutionMode.Automatic\">\n      <summary>\n        <para>The automatic mode uses a number of interpolated Light Probes per unit area, and uses the bounding volume size to compute the resolution. The final resolution value is a power of 2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightProbeProxyVolume.ResolutionMode.Custom\">\n      <summary>\n        <para>The custom mode allows you to specify the 3D grid resolution.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.LightProbeProxyVolume.Update\">\n      <summary>\n        <para>Triggers an update of the Light Probe Proxy Volume.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LightProbes\">\n      <summary>\n        <para>Stores light probes for the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightProbes.bakedProbes\">\n      <summary>\n        <para>Coefficients of baked light probes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightProbes.cellCount\">\n      <summary>\n        <para>The number of cells space is divided into (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightProbes.count\">\n      <summary>\n        <para>The number of light probes (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LightProbes.positions\">\n      <summary>\n        <para>Positions of the baked light probes (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.LightProbes.CalculateInterpolatedLightAndOcclusionProbes(UnityEngine.Vector3[],UnityEngine.Rendering.SphericalHarmonicsL2[],UnityEngine.Vector4[])\">\n      <summary>\n        <para>Calculate light probes and occlusion probes at the given world space positions.</para>\n      </summary>\n      <param name=\"positions\">The array of world space positions used to evaluate the probes.</param>\n      <param name=\"lightProbes\">The array where the resulting light probes are written to.</param>\n      <param name=\"occlusionProbes\">The array where the resulting occlusion probes are written to.</param>\n    </member>\n    <member name=\"M:UnityEngine.LightProbes.CalculateInterpolatedLightAndOcclusionProbes(System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Rendering.SphericalHarmonicsL2&gt;,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Calculate light probes and occlusion probes at the given world space positions.</para>\n      </summary>\n      <param name=\"positions\">The array of world space positions used to evaluate the probes.</param>\n      <param name=\"lightProbes\">The array where the resulting light probes are written to.</param>\n      <param name=\"occlusionProbes\">The array where the resulting occlusion probes are written to.</param>\n    </member>\n    <member name=\"M:UnityEngine.LightProbes.GetInterpolatedProbe(UnityEngine.Vector3,UnityEngine.Renderer,UnityEngine.Rendering.SphericalHarmonicsL2&amp;)\">\n      <summary>\n        <para>Returns an interpolated probe for the given position for both realtime and baked light probes combined.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"renderer\"></param>\n      <param name=\"probe\"></param>\n    </member>\n    <member name=\"T:UnityEngine.LightRenderMode\">\n      <summary>\n        <para>How the Light is rendered.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightRenderMode.Auto\">\n      <summary>\n        <para>Automatically choose the render mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightRenderMode.ForcePixel\">\n      <summary>\n        <para>Force the Light to be a pixel light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightRenderMode.ForceVertex\">\n      <summary>\n        <para>Force the Light to be a vertex light.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LightShadowCasterMode\">\n      <summary>\n        <para>Allows mixed lights to control shadow caster culling when Shadowmasks are present.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightShadowCasterMode.Default\">\n      <summary>\n        <para>Use the global Shadowmask Mode from the quality settings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightShadowCasterMode.Everything\">\n      <summary>\n        <para>Render all shadow casters into the shadow map. This corresponds with the distance Shadowmask mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightShadowCasterMode.NonLightmappedOnly\">\n      <summary>\n        <para>Render only non-lightmapped objects into the shadow map. This corresponds with the Shadowmask mode.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LightShadows\">\n      <summary>\n        <para>Shadow casting options for a Light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightShadows.Hard\">\n      <summary>\n        <para>Cast \"hard\" shadows (with no shadow filtering).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightShadows.None\">\n      <summary>\n        <para>Do not cast shadows (default).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightShadows.Soft\">\n      <summary>\n        <para>Cast \"soft\" shadows (with 4x PCF filtering).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LightType\">\n      <summary>\n        <para>The type of a Light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightType.Area\">\n      <summary>\n        <para>The light is an area light. It affects only lightmaps and lightprobes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightType.Directional\">\n      <summary>\n        <para>The light is a directional light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightType.Point\">\n      <summary>\n        <para>The light is a point light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LightType.Spot\">\n      <summary>\n        <para>The light is a spot light.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LineAlignment\">\n      <summary>\n        <para>Control the direction lines face, when using the LineRenderer or TrailRenderer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LineAlignment.Local\">\n      <summary>\n        <para>Lines face the direction of the Transform Component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LineAlignment.TransformZ\">\n      <summary>\n        <para>Lines face the Z axis of the Transform Component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LineAlignment.View\">\n      <summary>\n        <para>Lines face the camera.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LineRenderer\">\n      <summary>\n        <para>The line renderer is used to draw free-floating lines in 3D space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LineRenderer.alignment\">\n      <summary>\n        <para>Select whether the line will face the camera, or the orientation of the Transform Component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LineRenderer.colorGradient\">\n      <summary>\n        <para>Set the color gradient describing the color of the line at various points along its length.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LineRenderer.endColor\">\n      <summary>\n        <para>Set the color at the end of the line.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LineRenderer.endWidth\">\n      <summary>\n        <para>Set the width at the end of the line.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LineRenderer.generateLightingData\">\n      <summary>\n        <para>Configures a line to generate Normals and Tangents. With this data, Scene lighting can affect the line via Normal Maps and the Unity Standard Shader, or your own custom-built Shaders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LineRenderer.loop\">\n      <summary>\n        <para>Connect the start and end positions of the line together to form a continuous loop.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LineRenderer.numCapVertices\">\n      <summary>\n        <para>Set this to a value greater than 0, to get rounded corners on each end of the line.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LineRenderer.numCornerVertices\">\n      <summary>\n        <para>Set this to a value greater than 0, to get rounded corners between each segment of the line.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LineRenderer.numPositions\">\n      <summary>\n        <para>Set the number of line segments.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LineRenderer.positionCount\">\n      <summary>\n        <para>Set the number of line segments.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LineRenderer.startColor\">\n      <summary>\n        <para>Set the color at the start of the line.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LineRenderer.startWidth\">\n      <summary>\n        <para>Set the width at the start of the line.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LineRenderer.textureMode\">\n      <summary>\n        <para>Choose whether the U coordinate of the line texture is tiled or stretched.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LineRenderer.useWorldSpace\">\n      <summary>\n        <para>If enabled, the lines are defined in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LineRenderer.widthCurve\">\n      <summary>\n        <para>Set the curve describing the width of the line at various points along its length.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LineRenderer.widthMultiplier\">\n      <summary>\n        <para>Set an overall multiplier that is applied to the LineRenderer.widthCurve to get the final width of the line.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.LineRenderer.BakeMesh(UnityEngine.Mesh,System.Boolean)\">\n      <summary>\n        <para>Creates a snapshot of LineRenderer and stores it in mesh.</para>\n      </summary>\n      <param name=\"mesh\">A static mesh that will receive the snapshot of the line.</param>\n      <param name=\"camera\">The camera used for determining which way view space lines will face.</param>\n      <param name=\"useTransform\">Include the rotation and scale of the Transform in the baked mesh.</param>\n    </member>\n    <member name=\"M:UnityEngine.LineRenderer.BakeMesh(UnityEngine.Mesh)\">\n      <summary>\n        <para>Creates a snapshot of LineRenderer and stores it in mesh.</para>\n      </summary>\n      <param name=\"mesh\">A static mesh that will receive the snapshot of the line.</param>\n      <param name=\"camera\">The camera used for determining which way view space lines will face.</param>\n      <param name=\"useTransform\">Include the rotation and scale of the Transform in the baked mesh.</param>\n    </member>\n    <member name=\"M:UnityEngine.LineRenderer.BakeMesh(UnityEngine.Mesh,UnityEngine.Camera,System.Boolean)\">\n      <summary>\n        <para>Creates a snapshot of LineRenderer and stores it in mesh.</para>\n      </summary>\n      <param name=\"mesh\">A static mesh that will receive the snapshot of the line.</param>\n      <param name=\"camera\">The camera used for determining which way view space lines will face.</param>\n      <param name=\"useTransform\">Include the rotation and scale of the Transform in the baked mesh.</param>\n    </member>\n    <member name=\"M:UnityEngine.LineRenderer.BakeMesh(UnityEngine.Mesh,UnityEngine.Camera)\">\n      <summary>\n        <para>Creates a snapshot of LineRenderer and stores it in mesh.</para>\n      </summary>\n      <param name=\"mesh\">A static mesh that will receive the snapshot of the line.</param>\n      <param name=\"camera\">The camera used for determining which way view space lines will face.</param>\n      <param name=\"useTransform\">Include the rotation and scale of the Transform in the baked mesh.</param>\n    </member>\n    <member name=\"M:UnityEngine.LineRenderer.GetPosition(System.Int32)\">\n      <summary>\n        <para>Get the position of a vertex in the line.</para>\n      </summary>\n      <param name=\"index\">The index of the position to retrieve.</param>\n      <returns>\n        <para>The position at the specified index in the array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.LineRenderer.GetPositions(UnityEngine.Vector3[])\">\n      <summary>\n        <para>Get the positions of all vertices in the line.</para>\n      </summary>\n      <param name=\"positions\">The array of positions to retrieve. The array passed should be of at least numPositions in size.</param>\n      <returns>\n        <para>How many positions were actually stored in the output array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.LineRenderer.SetColors(UnityEngine.Color,UnityEngine.Color)\">\n      <summary>\n        <para>Set the line color at the start and at the end.</para>\n      </summary>\n      <param name=\"start\"></param>\n      <param name=\"end\"></param>\n    </member>\n    <member name=\"M:UnityEngine.LineRenderer.SetPosition(System.Int32,UnityEngine.Vector3)\">\n      <summary>\n        <para>Set the position of a vertex in the line.</para>\n      </summary>\n      <param name=\"index\">Which position to set.</param>\n      <param name=\"position\">The new position.</param>\n    </member>\n    <member name=\"M:UnityEngine.LineRenderer.SetPositions(UnityEngine.Vector3[])\">\n      <summary>\n        <para>Set the positions of all vertices in the line.</para>\n      </summary>\n      <param name=\"positions\">The array of positions to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.LineRenderer.SetVertexCount(System.Int32)\">\n      <summary>\n        <para>Set the number of line segments.</para>\n      </summary>\n      <param name=\"count\"></param>\n    </member>\n    <member name=\"M:UnityEngine.LineRenderer.SetWidth(System.Single,System.Single)\">\n      <summary>\n        <para>Set the line width at the start and at the end.</para>\n      </summary>\n      <param name=\"start\"></param>\n      <param name=\"end\"></param>\n    </member>\n    <member name=\"M:UnityEngine.LineRenderer.Simplify(System.Single)\">\n      <summary>\n        <para>Generates a simplified version of the original line by removing points that fall within the specified tolerance.</para>\n      </summary>\n      <param name=\"tolerance\">This value is used to evaluate which points should be removed from the line. A higher value results in a simpler line (less points). A positive value close to zero results in a line with little to no reduction. A value of zero or less has no effect.</param>\n    </member>\n    <member name=\"T:UnityEngine.LineTextureMode\">\n      <summary>\n        <para>Choose how textures are applied to Lines and Trails.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LineTextureMode.DistributePerSegment\">\n      <summary>\n        <para>Map the texture once along the entire length of the line, assuming all vertices are evenly spaced.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LineTextureMode.RepeatPerSegment\">\n      <summary>\n        <para>Repeat the texture along the line, repeating at a rate of once per line segment. To adjust the tiling rate, use Material.SetTextureScale.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LineTextureMode.Stretch\">\n      <summary>\n        <para>Map the texture once along the entire length of the line.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LineTextureMode.Tile\">\n      <summary>\n        <para>Repeat the texture along the line, based on its length in world units. To set the tiling rate, use Material.SetTextureScale.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LineUtility\">\n      <summary>\n        <para>A collection of common line functions.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.LineUtility.Simplify(System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;,System.Single,System.Collections.Generic.List`1&lt;System.Int32&gt;)\">\n      <summary>\n        <para>Generates a simplified version of the original line by removing points that fall within the specified tolerance.</para>\n      </summary>\n      <param name=\"points\">The points that make up the original line.</param>\n      <param name=\"tolerance\">This value is used to evaluate which points should be removed from the line. A higher value results in a simpler line (less points). A positive value close to zero results in a line with little to no reduction. A value of zero or less has no effect.</param>\n      <param name=\"pointsToKeep\">Populated by this function. Contains the indexes of the points that should be generate a simplified version..</param>\n      <param name=\"simplifiedPoints\">Populated by this function. Contains the points that form the simplified line.</param>\n    </member>\n    <member name=\"M:UnityEngine.LineUtility.Simplify(System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;,System.Single,System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;)\">\n      <summary>\n        <para>Generates a simplified version of the original line by removing points that fall within the specified tolerance.</para>\n      </summary>\n      <param name=\"points\">The points that make up the original line.</param>\n      <param name=\"tolerance\">This value is used to evaluate which points should be removed from the line. A higher value results in a simpler line (less points). A positive value close to zero results in a line with little to no reduction. A value of zero or less has no effect.</param>\n      <param name=\"pointsToKeep\">Populated by this function. Contains the indexes of the points that should be generate a simplified version..</param>\n      <param name=\"simplifiedPoints\">Populated by this function. Contains the points that form the simplified line.</param>\n    </member>\n    <member name=\"M:UnityEngine.LineUtility.Simplify(System.Collections.Generic.List`1&lt;UnityEngine.Vector2&gt;,System.Single,System.Collections.Generic.List`1&lt;System.Int32&gt;)\">\n      <summary>\n        <para>Generates a simplified version of the original line by removing points that fall within the specified tolerance.</para>\n      </summary>\n      <param name=\"points\">The points that make up the original line.</param>\n      <param name=\"tolerance\">This value is used to evaluate which points should be removed from the line. A higher value results in a simpler line (less points). A positive value close to zero results in a line with little to no reduction. A value of zero or less has no effect.</param>\n      <param name=\"pointsToKeep\">Populated by this function. Contains the indexes of the points that should be generate a simplified version..</param>\n      <param name=\"simplifiedPoints\">Populated by this function. Contains the points that form the simplified line.</param>\n    </member>\n    <member name=\"M:UnityEngine.LineUtility.Simplify(System.Collections.Generic.List`1&lt;UnityEngine.Vector2&gt;,System.Single,System.Collections.Generic.List`1&lt;UnityEngine.Vector2&gt;)\">\n      <summary>\n        <para>Generates a simplified version of the original line by removing points that fall within the specified tolerance.</para>\n      </summary>\n      <param name=\"points\">The points that make up the original line.</param>\n      <param name=\"tolerance\">This value is used to evaluate which points should be removed from the line. A higher value results in a simpler line (less points). A positive value close to zero results in a line with little to no reduction. A value of zero or less has no effect.</param>\n      <param name=\"pointsToKeep\">Populated by this function. Contains the indexes of the points that should be generate a simplified version..</param>\n      <param name=\"simplifiedPoints\">Populated by this function. Contains the points that form the simplified line.</param>\n    </member>\n    <member name=\"T:UnityEngine.LocationInfo\">\n      <summary>\n        <para>Structure describing device location.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LocationInfo.altitude\">\n      <summary>\n        <para>Geographical device location altitude.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LocationInfo.horizontalAccuracy\">\n      <summary>\n        <para>Horizontal accuracy of the location.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LocationInfo.latitude\">\n      <summary>\n        <para>Geographical device location latitude.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LocationInfo.longitude\">\n      <summary>\n        <para>Geographical device location latitude.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LocationInfo.timestamp\">\n      <summary>\n        <para>Timestamp (in seconds since 1970) when location was last time updated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LocationInfo.verticalAccuracy\">\n      <summary>\n        <para>Vertical accuracy of the location.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LocationService\">\n      <summary>\n        <para>Interface into location functionality.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LocationService.isEnabledByUser\">\n      <summary>\n        <para>Specifies whether location service is enabled in user settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LocationService.lastData\">\n      <summary>\n        <para>Last measured device geographical location.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LocationService.status\">\n      <summary>\n        <para>Returns location service status.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.LocationService.Start()\">\n      <summary>\n        <para>Starts location service updates.  Last location coordinates could be.</para>\n      </summary>\n      <param name=\"desiredAccuracyInMeters\"></param>\n      <param name=\"updateDistanceInMeters\"></param>\n    </member>\n    <member name=\"M:UnityEngine.LocationService.Start(System.Single)\">\n      <summary>\n        <para>Starts location service updates.  Last location coordinates could be.</para>\n      </summary>\n      <param name=\"desiredAccuracyInMeters\"></param>\n      <param name=\"updateDistanceInMeters\"></param>\n    </member>\n    <member name=\"M:UnityEngine.LocationService.Start(System.Single,System.Single)\">\n      <summary>\n        <para>Starts location service updates.  Last location coordinates could be.</para>\n      </summary>\n      <param name=\"desiredAccuracyInMeters\"></param>\n      <param name=\"updateDistanceInMeters\"></param>\n    </member>\n    <member name=\"M:UnityEngine.LocationService.Stop\">\n      <summary>\n        <para>Stops location service updates. This could be useful for saving battery life.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LocationServiceStatus\">\n      <summary>\n        <para>Describes location service status.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LocationServiceStatus.Failed\">\n      <summary>\n        <para>Location service failed (user denied access to location service).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LocationServiceStatus.Initializing\">\n      <summary>\n        <para>Location service is initializing, some time later it will switch to.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LocationServiceStatus.Running\">\n      <summary>\n        <para>Location service is running and locations could be queried.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LocationServiceStatus.Stopped\">\n      <summary>\n        <para>Location service is stopped.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LOD\">\n      <summary>\n        <para>Structure for building a LOD for passing to the SetLODs function.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LOD.fadeTransitionWidth\">\n      <summary>\n        <para>Width of the cross-fade transition zone (proportion to the current LOD's whole length) [0-1]. Only used if it's not animated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LOD.renderers\">\n      <summary>\n        <para>List of renderers for this LOD level.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LOD.screenRelativeTransitionHeight\">\n      <summary>\n        <para>The screen relative height to use for the transition [0-1].</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.LOD.#ctor(System.Single,UnityEngine.Renderer[])\">\n      <summary>\n        <para>Construct a LOD.</para>\n      </summary>\n      <param name=\"screenRelativeTransitionHeight\">The screen relative height to use for the transition [0-1].</param>\n      <param name=\"renderers\">An array of renderers to use for this LOD level.</param>\n    </member>\n    <member name=\"T:UnityEngine.LODFadeMode\">\n      <summary>\n        <para>The LOD fade modes. Modes other than LODFadeMode.None will result in Unity calculating a blend factor for blending/interpolating between two neighbouring LODs and pass it to your shader.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LODFadeMode.CrossFade\">\n      <summary>\n        <para>Perform cross-fade style blending between the current LOD and the next LOD if the distance to camera falls in the range specified by the LOD.fadeTransitionWidth of each LOD.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LODFadeMode.None\">\n      <summary>\n        <para>Indicates the LOD fading is turned off.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LODFadeMode.SpeedTree\">\n      <summary>\n        <para>By specifying this mode, your LODGroup will perform a SpeedTree-style LOD fading scheme:\n\n\n* For all the mesh LODs other than the last (most crude) mesh LOD, the fade factor is calculated as the percentage of the object's current screen height, compared to the whole range of the LOD. It is 1, if the camera is right at the position where the previous LOD switches out and 0, if the next LOD is just about to switch in.\n\n\n* For the last mesh LOD and the billboard LOD, the cross-fade mode is used.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.LODGroup\">\n      <summary>\n        <para>LODGroup lets you group multiple Renderers into LOD levels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LODGroup.animateCrossFading\">\n      <summary>\n        <para>Specify if the cross-fading should be animated by time. The animation duration is specified globally as crossFadeAnimationDuration.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LODGroup.crossFadeAnimationDuration\">\n      <summary>\n        <para>The cross-fading animation duration in seconds. ArgumentException will be thrown if it is set to zero or a negative value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LODGroup.enabled\">\n      <summary>\n        <para>Enable / Disable the LODGroup - Disabling will turn off all renderers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LODGroup.fadeMode\">\n      <summary>\n        <para>The LOD fade mode used.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LODGroup.localReferencePoint\">\n      <summary>\n        <para>The local reference point against which the LOD distance is calculated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LODGroup.lodCount\">\n      <summary>\n        <para>The number of LOD levels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.LODGroup.size\">\n      <summary>\n        <para>The size of the LOD object in local space.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.LODGroup.ForceLOD(System.Int32)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"index\">The LOD level to use. Passing index &lt; 0 will return to standard LOD processing.</param>\n    </member>\n    <member name=\"M:UnityEngine.LODGroup.GetLODs\">\n      <summary>\n        <para>Returns the array of LODs.</para>\n      </summary>\n      <returns>\n        <para>The LOD array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.LODGroup.RecalculateBounds\">\n      <summary>\n        <para>Recalculate the bounding region for the LODGroup (Relatively slow, do not call often).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.LODGroup.SetLODs(UnityEngine.LOD[])\">\n      <summary>\n        <para>Set the LODs for the LOD group. This will remove any existing LODs configured on the LODGroup.</para>\n      </summary>\n      <param name=\"lods\">The LODs to use for this group.</param>\n    </member>\n    <member name=\"T:UnityEngine.Logger\">\n      <summary>\n        <para>Initializes a new instance of the Logger.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Logger.filterLogType\">\n      <summary>\n        <para>To selective enable debug log message.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Logger.logEnabled\">\n      <summary>\n        <para>To runtime toggle debug logging [ON/OFF].</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Logger.logHandler\">\n      <summary>\n        <para>Set  Logger.ILogHandler.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Logger.#ctor(UnityEngine.ILogHandler)\">\n      <summary>\n        <para>Create a custom Logger.</para>\n      </summary>\n      <param name=\"logHandler\">Pass in default log handler or custom log handler.</param>\n    </member>\n    <member name=\"M:UnityEngine.Logger.IsLogTypeAllowed(UnityEngine.LogType)\">\n      <summary>\n        <para>Check logging is enabled based on the LogType.</para>\n      </summary>\n      <param name=\"logType\">The type of the log message.</param>\n      <returns>\n        <para>Retrun true in case logs of LogType will be logged otherwise returns false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Logger.Log(UnityEngine.LogType,System.Object)\">\n      <summary>\n        <para>Logs message to the Unity Console using default logger.</para>\n      </summary>\n      <param name=\"logType\">The type of the log message.</param>\n      <param name=\"tag\">Used to identify the source of a log message. It usually identifies the class where the log call occurs.</param>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Logger.Log(UnityEngine.LogType,System.Object,UnityEngine.Object)\">\n      <summary>\n        <para>Logs message to the Unity Console using default logger.</para>\n      </summary>\n      <param name=\"logType\">The type of the log message.</param>\n      <param name=\"tag\">Used to identify the source of a log message. It usually identifies the class where the log call occurs.</param>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Logger.Log(UnityEngine.LogType,System.String,System.Object)\">\n      <summary>\n        <para>Logs message to the Unity Console using default logger.</para>\n      </summary>\n      <param name=\"logType\">The type of the log message.</param>\n      <param name=\"tag\">Used to identify the source of a log message. It usually identifies the class where the log call occurs.</param>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Logger.Log(UnityEngine.LogType,System.String,System.Object,UnityEngine.Object)\">\n      <summary>\n        <para>Logs message to the Unity Console using default logger.</para>\n      </summary>\n      <param name=\"logType\">The type of the log message.</param>\n      <param name=\"tag\">Used to identify the source of a log message. It usually identifies the class where the log call occurs.</param>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Logger.Log(System.Object)\">\n      <summary>\n        <para>Logs message to the Unity Console using default logger.</para>\n      </summary>\n      <param name=\"logType\">The type of the log message.</param>\n      <param name=\"tag\">Used to identify the source of a log message. It usually identifies the class where the log call occurs.</param>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Logger.Log(System.String,System.Object)\">\n      <summary>\n        <para>Logs message to the Unity Console using default logger.</para>\n      </summary>\n      <param name=\"logType\">The type of the log message.</param>\n      <param name=\"tag\">Used to identify the source of a log message. It usually identifies the class where the log call occurs.</param>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Logger.Log(System.String,System.Object,UnityEngine.Object)\">\n      <summary>\n        <para>Logs message to the Unity Console using default logger.</para>\n      </summary>\n      <param name=\"logType\">The type of the log message.</param>\n      <param name=\"tag\">Used to identify the source of a log message. It usually identifies the class where the log call occurs.</param>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Logger.LogError(System.String,System.Object)\">\n      <summary>\n        <para>A variant of Logger.Log that logs an error message.</para>\n      </summary>\n      <param name=\"tag\">Used to identify the source of a log message. It usually identifies the class where the log call occurs.</param>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Logger.LogError(System.String,System.Object,UnityEngine.Object)\">\n      <summary>\n        <para>A variant of Logger.Log that logs an error message.</para>\n      </summary>\n      <param name=\"tag\">Used to identify the source of a log message. It usually identifies the class where the log call occurs.</param>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Logger.LogException(System.Exception)\">\n      <summary>\n        <para>A variant of Logger.Log that logs an exception message.</para>\n      </summary>\n      <param name=\"exception\">Runtime Exception.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Logger.LogException(System.Exception,UnityEngine.Object)\">\n      <summary>\n        <para>A variant of Logger.Log that logs an exception message.</para>\n      </summary>\n      <param name=\"exception\">Runtime Exception.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Logger.LogFormat(UnityEngine.LogType,System.String,System.Object[])\">\n      <summary>\n        <para>Logs a formatted message.</para>\n      </summary>\n      <param name=\"logType\">The type of the log message.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n      <param name=\"format\">A composite format string.</param>\n      <param name=\"args\">Format arguments.</param>\n    </member>\n    <member name=\"M:UnityEngine.Logger.LogFormat(UnityEngine.LogType,UnityEngine.Object,System.String,System.Object[])\">\n      <summary>\n        <para>Logs a formatted message.</para>\n      </summary>\n      <param name=\"logType\">The type of the log message.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n      <param name=\"format\">A composite format string.</param>\n      <param name=\"args\">Format arguments.</param>\n    </member>\n    <member name=\"M:UnityEngine.Logger.LogWarning(System.String,System.Object)\">\n      <summary>\n        <para>A variant of Logger.Log that logs an warning message.</para>\n      </summary>\n      <param name=\"tag\">Used to identify the source of a log message. It usually identifies the class where the log call occurs.</param>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"M:UnityEngine.Logger.LogWarning(System.String,System.Object,UnityEngine.Object)\">\n      <summary>\n        <para>A variant of Logger.Log that logs an warning message.</para>\n      </summary>\n      <param name=\"tag\">Used to identify the source of a log message. It usually identifies the class where the log call occurs.</param>\n      <param name=\"message\">String or object to be converted to string representation for display.</param>\n      <param name=\"context\">Object to which the message applies.</param>\n    </member>\n    <member name=\"T:UnityEngine.LogType\">\n      <summary>\n        <para>The type of the log message in Debug.unityLogger.Log or delegate registered with Application.RegisterLogCallback.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LogType.Assert\">\n      <summary>\n        <para>LogType used for Asserts. (These could also indicate an error inside Unity itself.)</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LogType.Error\">\n      <summary>\n        <para>LogType used for Errors.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LogType.Exception\">\n      <summary>\n        <para>LogType used for Exceptions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LogType.Log\">\n      <summary>\n        <para>LogType used for regular log messages.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.LogType.Warning\">\n      <summary>\n        <para>LogType used for Warnings.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.MasterServer\">\n      <summary>\n        <para>The Master Server is used to make matchmaking between servers and clients easy.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MasterServer.dedicatedServer\">\n      <summary>\n        <para>Report this machine as a dedicated server.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MasterServer.ipAddress\">\n      <summary>\n        <para>The IP address of the master server.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MasterServer.port\">\n      <summary>\n        <para>The connection port of the master server.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MasterServer.updateRate\">\n      <summary>\n        <para>Set the minimum update rate for master server host information update.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.MasterServer.ClearHostList\">\n      <summary>\n        <para>Clear the host list which was received by MasterServer.PollHostList.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.MasterServer.PollHostList\">\n      <summary>\n        <para>Check for the latest host list received by using MasterServer.RequestHostList.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.MasterServer.RegisterHost(System.String,System.String)\">\n      <summary>\n        <para>Register this server on the master server.</para>\n      </summary>\n      <param name=\"gameTypeName\"></param>\n      <param name=\"gameName\"></param>\n      <param name=\"comment\"></param>\n    </member>\n    <member name=\"M:UnityEngine.MasterServer.RegisterHost(System.String,System.String,System.String)\">\n      <summary>\n        <para>Register this server on the master server.</para>\n      </summary>\n      <param name=\"gameTypeName\"></param>\n      <param name=\"gameName\"></param>\n      <param name=\"comment\"></param>\n    </member>\n    <member name=\"M:UnityEngine.MasterServer.RequestHostList(System.String)\">\n      <summary>\n        <para>Request a host list from the master server.</para>\n      </summary>\n      <param name=\"gameTypeName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.MasterServer.UnregisterHost\">\n      <summary>\n        <para>Unregister this server from the master server.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.MasterServerEvent\">\n      <summary>\n        <para>Describes status messages from the master server as returned in MonoBehaviour.OnMasterServerEvent|OnMasterServerEvent.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.MatchTargetWeightMask\">\n      <summary>\n        <para>Use this struct to specify the position and rotation weight mask for Animator.MatchTarget.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MatchTargetWeightMask.positionXYZWeight\">\n      <summary>\n        <para>Position XYZ weight.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MatchTargetWeightMask.rotationWeight\">\n      <summary>\n        <para>Rotation weight.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.MatchTargetWeightMask.#ctor(UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>MatchTargetWeightMask contructor.</para>\n      </summary>\n      <param name=\"positionXYZWeight\">Position XYZ weight.</param>\n      <param name=\"rotationWeight\">Rotation weight.</param>\n    </member>\n    <member name=\"T:UnityEngine.Material\">\n      <summary>\n        <para>The material class.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Material.color\">\n      <summary>\n        <para>The main material's color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Material.doubleSidedGI\">\n      <summary>\n        <para>Gets and sets whether the Double Sided Global Illumination setting is enabled for this material.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Material.enableInstancing\">\n      <summary>\n        <para>Gets and sets whether GPU instancing is enabled for this material.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Material.globalIlluminationFlags\">\n      <summary>\n        <para>Defines how the material should interact with lightmaps and lightprobes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Material.mainTexture\">\n      <summary>\n        <para>The material's texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Material.mainTextureOffset\">\n      <summary>\n        <para>The texture offset of the main texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Material.mainTextureScale\">\n      <summary>\n        <para>The texture scale of the main texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Material.passCount\">\n      <summary>\n        <para>How many passes are in this material (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Material.renderQueue\">\n      <summary>\n        <para>Render queue of this material.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Material.shader\">\n      <summary>\n        <para>The shader used by the material.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Material.shaderKeywords\">\n      <summary>\n        <para>Additional shader keywords set by this material.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Material.CopyPropertiesFromMaterial(UnityEngine.Material)\">\n      <summary>\n        <para>Copy properties from other material into this material.</para>\n      </summary>\n      <param name=\"mat\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Material.#ctor(System.String)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"contents\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Material.#ctor(UnityEngine.Shader)\">\n      <summary>\n        <para>Create a temporary Material.</para>\n      </summary>\n      <param name=\"shader\">Create a material with a given Shader.</param>\n      <param name=\"source\">Create a material by copying all properties from another material.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.#ctor(UnityEngine.Material)\">\n      <summary>\n        <para>Create a temporary Material.</para>\n      </summary>\n      <param name=\"shader\">Create a material with a given Shader.</param>\n      <param name=\"source\">Create a material by copying all properties from another material.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.DisableKeyword(System.String)\">\n      <summary>\n        <para>Unset a shader keyword.</para>\n      </summary>\n      <param name=\"keyword\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Material.EnableKeyword(System.String)\">\n      <summary>\n        <para>Sets a shader keyword that is enabled by this material.</para>\n      </summary>\n      <param name=\"keyword\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Material.FindPass(System.String)\">\n      <summary>\n        <para>Returns the index of the pass passName.</para>\n      </summary>\n      <param name=\"passName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetColor(System.String)\">\n      <summary>\n        <para>Get a named color value.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetColor(System.Int32)\">\n      <summary>\n        <para>Get a named color value.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetColorArray(System.String)\">\n      <summary>\n        <para>Get a named color array.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetColorArray(System.Int32)\">\n      <summary>\n        <para>Get a named color array.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetColorArray(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Color&gt;)\">\n      <summary>\n        <para>Fetch a named color array into a list.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\">The list to hold the returned array.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetColorArray(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Color&gt;)\">\n      <summary>\n        <para>Fetch a named color array into a list.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\">The list to hold the returned array.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetFloat(System.String)\">\n      <summary>\n        <para>Get a named float value.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetFloat(System.Int32)\">\n      <summary>\n        <para>Get a named float value.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetFloatArray(System.String)\">\n      <summary>\n        <para>Get a named float array.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetFloatArray(System.Int32)\">\n      <summary>\n        <para>Get a named float array.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetFloatArray(System.String,System.Collections.Generic.List`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Fetch a named float array into a list.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\">The list to hold the returned array.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetFloatArray(System.Int32,System.Collections.Generic.List`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Fetch a named float array into a list.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\">The list to hold the returned array.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetInt(System.String)\">\n      <summary>\n        <para>Get a named integer value.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetInt(System.Int32)\">\n      <summary>\n        <para>Get a named integer value.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetMatrix(System.String)\">\n      <summary>\n        <para>Get a named matrix value from the shader.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetMatrix(System.Int32)\">\n      <summary>\n        <para>Get a named matrix value from the shader.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetMatrixArray(System.String)\">\n      <summary>\n        <para>Get a named matrix array.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetMatrixArray(System.Int32)\">\n      <summary>\n        <para>Get a named matrix array.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetMatrixArray(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Matrix4x4&gt;)\">\n      <summary>\n        <para>Fetch a named matrix array into a list.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"values\">The list to hold the returned array.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetMatrixArray(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Matrix4x4&gt;)\">\n      <summary>\n        <para>Fetch a named matrix array into a list.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"values\">The list to hold the returned array.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetPassName(System.Int32)\">\n      <summary>\n        <para>Returns the name of the shader pass at index pass.</para>\n      </summary>\n      <param name=\"pass\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetShaderPassEnabled(System.String)\">\n      <summary>\n        <para>Checks whether a given Shader pass is enabled on this Material.</para>\n      </summary>\n      <param name=\"passName\">Shader pass name (case insensitive).</param>\n      <returns>\n        <para>True if the Shader pass is enabled.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetTag(System.String,System.Boolean)\">\n      <summary>\n        <para>Get the value of material's shader tag.</para>\n      </summary>\n      <param name=\"tag\"></param>\n      <param name=\"searchFallbacks\"></param>\n      <param name=\"defaultValue\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetTag(System.String,System.Boolean,System.String)\">\n      <summary>\n        <para>Get the value of material's shader tag.</para>\n      </summary>\n      <param name=\"tag\"></param>\n      <param name=\"searchFallbacks\"></param>\n      <param name=\"defaultValue\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetTexture(System.String)\">\n      <summary>\n        <para>Get a named texture.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetTexture(System.Int32)\">\n      <summary>\n        <para>Get a named texture.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetTextureOffset(System.String)\">\n      <summary>\n        <para>Gets the placement offset of texture propertyName.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetTextureOffset(System.Int32)\">\n      <summary>\n        <para>Gets the placement offset of texture propertyName.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetTexturePropertyNameIDs\">\n      <summary>\n        <para>Return the name IDs of all texture properties exposed on this material.</para>\n      </summary>\n      <param name=\"outNames\">IDs of all texture properties exposed on this material.</param>\n      <returns>\n        <para>IDs of all texture properties exposed on this material.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetTexturePropertyNameIDs(System.Collections.Generic.List`1&lt;System.Int32&gt;)\">\n      <summary>\n        <para>Return the name IDs of all texture properties exposed on this material.</para>\n      </summary>\n      <param name=\"outNames\">IDs of all texture properties exposed on this material.</param>\n      <returns>\n        <para>IDs of all texture properties exposed on this material.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetTexturePropertyNames\">\n      <summary>\n        <para>Returns the names of all texture properties exposed on this material.</para>\n      </summary>\n      <param name=\"outNames\">Names of all texture properties exposed on this material.</param>\n      <returns>\n        <para>Names of all texture properties exposed on this material.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetTexturePropertyNames(System.Collections.Generic.List`1&lt;System.String&gt;)\">\n      <summary>\n        <para>Returns the names of all texture properties exposed on this material.</para>\n      </summary>\n      <param name=\"outNames\">Names of all texture properties exposed on this material.</param>\n      <returns>\n        <para>Names of all texture properties exposed on this material.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetTextureScale(System.String)\">\n      <summary>\n        <para>Gets the placement scale of texture propertyName.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetTextureScale(System.Int32)\">\n      <summary>\n        <para>Gets the placement scale of texture propertyName.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetVector(System.String)\">\n      <summary>\n        <para>Get a named vector value.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetVector(System.Int32)\">\n      <summary>\n        <para>Get a named vector value.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetVectorArray(System.String)\">\n      <summary>\n        <para>Get a named vector array.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetVectorArray(System.Int32)\">\n      <summary>\n        <para>Get a named vector array.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetVectorArray(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Fetch a named vector array into a list.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"values\">The list to hold the returned array.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.GetVectorArray(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Fetch a named vector array into a list.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"values\">The list to hold the returned array.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.HasProperty(System.String)\">\n      <summary>\n        <para>Checks if material's shader has a property of a given name.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.HasProperty(System.Int32)\">\n      <summary>\n        <para>Checks if material's shader has a property of a given name.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.IsKeywordEnabled(System.String)\">\n      <summary>\n        <para>Is the shader keyword enabled on this material?</para>\n      </summary>\n      <param name=\"keyword\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Material.Lerp(UnityEngine.Material,UnityEngine.Material,System.Single)\">\n      <summary>\n        <para>Interpolate properties between two materials.</para>\n      </summary>\n      <param name=\"start\"></param>\n      <param name=\"end\"></param>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetBuffer(System.String,UnityEngine.ComputeBuffer)\">\n      <summary>\n        <para>Sets a named ComputeBuffer value.</para>\n      </summary>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Property name.</param>\n      <param name=\"value\">The ComputeBuffer value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetBuffer(System.Int32,UnityEngine.ComputeBuffer)\">\n      <summary>\n        <para>Sets a named ComputeBuffer value.</para>\n      </summary>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Property name.</param>\n      <param name=\"value\">The ComputeBuffer value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetColor(System.String,UnityEngine.Color)\">\n      <summary>\n        <para>Sets a named color value.</para>\n      </summary>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Property name, e.g. \"_Color\".</param>\n      <param name=\"value\">Color value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetColor(System.Int32,UnityEngine.Color)\">\n      <summary>\n        <para>Sets a named color value.</para>\n      </summary>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Property name, e.g. \"_Color\".</param>\n      <param name=\"value\">Color value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetColorArray(System.String,UnityEngine.Color[])\">\n      <summary>\n        <para>Sets a color array property.</para>\n      </summary>\n      <param name=\"name\">Property name.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"values\">Array of values to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetColorArray(System.Int32,UnityEngine.Color[])\">\n      <summary>\n        <para>Sets a color array property.</para>\n      </summary>\n      <param name=\"name\">Property name.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"values\">Array of values to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetColorArray(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Color&gt;)\">\n      <summary>\n        <para>Sets a color array property.</para>\n      </summary>\n      <param name=\"name\">Property name.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"values\">Array of values to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetColorArray(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Color&gt;)\">\n      <summary>\n        <para>Sets a color array property.</para>\n      </summary>\n      <param name=\"name\">Property name.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"values\">Array of values to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetFloat(System.String,System.Single)\">\n      <summary>\n        <para>Sets a named float value.</para>\n      </summary>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"value\">Float value to set.</param>\n      <param name=\"name\">Property name, e.g. \"_Glossiness\".</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetFloat(System.Int32,System.Single)\">\n      <summary>\n        <para>Sets a named float value.</para>\n      </summary>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"value\">Float value to set.</param>\n      <param name=\"name\">Property name, e.g. \"_Glossiness\".</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetFloatArray(System.String,System.Single[])\">\n      <summary>\n        <para>Sets a float array property.</para>\n      </summary>\n      <param name=\"name\">Property name.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"values\">Array of values to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetFloatArray(System.Int32,System.Single[])\">\n      <summary>\n        <para>Sets a float array property.</para>\n      </summary>\n      <param name=\"name\">Property name.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"values\">Array of values to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetFloatArray(System.String,System.Collections.Generic.List`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Sets a float array property.</para>\n      </summary>\n      <param name=\"name\">Property name.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"values\">Array of values to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetFloatArray(System.Int32,System.Collections.Generic.List`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Sets a float array property.</para>\n      </summary>\n      <param name=\"name\">Property name.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"values\">Array of values to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetInt(System.String,System.Int32)\">\n      <summary>\n        <para>Sets a named integer value.</para>\n      </summary>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"value\">Integer value to set.</param>\n      <param name=\"name\">Property name, e.g. \"_SrcBlend\".</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetInt(System.Int32,System.Int32)\">\n      <summary>\n        <para>Sets a named integer value.</para>\n      </summary>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"value\">Integer value to set.</param>\n      <param name=\"name\">Property name, e.g. \"_SrcBlend\".</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetMatrix(System.String,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Sets a named matrix for the shader.</para>\n      </summary>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Property name, e.g. \"_CubemapRotation\".</param>\n      <param name=\"value\">Matrix value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetMatrix(System.Int32,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Sets a named matrix for the shader.</para>\n      </summary>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Property name, e.g. \"_CubemapRotation\".</param>\n      <param name=\"value\">Matrix value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetMatrixArray(System.String,UnityEngine.Matrix4x4[])\">\n      <summary>\n        <para>Sets a matrix array property.</para>\n      </summary>\n      <param name=\"name\">Property name.</param>\n      <param name=\"values\">Array of values to set.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetMatrixArray(System.Int32,UnityEngine.Matrix4x4[])\">\n      <summary>\n        <para>Sets a matrix array property.</para>\n      </summary>\n      <param name=\"name\">Property name.</param>\n      <param name=\"values\">Array of values to set.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetMatrixArray(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Matrix4x4&gt;)\">\n      <summary>\n        <para>Sets a matrix array property.</para>\n      </summary>\n      <param name=\"name\">Property name.</param>\n      <param name=\"values\">Array of values to set.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetMatrixArray(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Matrix4x4&gt;)\">\n      <summary>\n        <para>Sets a matrix array property.</para>\n      </summary>\n      <param name=\"name\">Property name.</param>\n      <param name=\"values\">Array of values to set.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetOverrideTag(System.String,System.String)\">\n      <summary>\n        <para>Sets an override tag/value on the material.</para>\n      </summary>\n      <param name=\"tag\">Name of the tag to set.</param>\n      <param name=\"val\">Name of the value to set. Empty string to clear the override flag.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetPass(System.Int32)\">\n      <summary>\n        <para>Activate the given pass for rendering.</para>\n      </summary>\n      <param name=\"pass\">Shader pass number to setup.</param>\n      <returns>\n        <para>If false is returned, no rendering should be done.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetShaderPassEnabled(System.String,System.Boolean)\">\n      <summary>\n        <para>Enables or disables a Shader pass on a per-Material level.</para>\n      </summary>\n      <param name=\"passName\">Shader pass name (case insensitive).</param>\n      <param name=\"enabled\">Flag indicating whether this Shader pass should be enabled.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetTexture(System.String,UnityEngine.Texture)\">\n      <summary>\n        <para>Sets a named texture.</para>\n      </summary>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Property name, e.g. \"_MainTex\".</param>\n      <param name=\"value\">Texture to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetTexture(System.Int32,UnityEngine.Texture)\">\n      <summary>\n        <para>Sets a named texture.</para>\n      </summary>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Property name, e.g. \"_MainTex\".</param>\n      <param name=\"value\">Texture to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetTextureOffset(System.String,UnityEngine.Vector2)\">\n      <summary>\n        <para>Sets the placement offset of texture propertyName.</para>\n      </summary>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Property name, for example: \"_MainTex\".</param>\n      <param name=\"value\">Texture placement offset.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetTextureOffset(System.Int32,UnityEngine.Vector2)\">\n      <summary>\n        <para>Sets the placement offset of texture propertyName.</para>\n      </summary>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Property name, for example: \"_MainTex\".</param>\n      <param name=\"value\">Texture placement offset.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetTextureScale(System.String,UnityEngine.Vector2)\">\n      <summary>\n        <para>Sets the placement scale of texture propertyName.</para>\n      </summary>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Property name, e.g. \"_MainTex\".</param>\n      <param name=\"value\">Texture placement scale.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetTextureScale(System.Int32,UnityEngine.Vector2)\">\n      <summary>\n        <para>Sets the placement scale of texture propertyName.</para>\n      </summary>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Property name, e.g. \"_MainTex\".</param>\n      <param name=\"value\">Texture placement scale.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetVector(System.String,UnityEngine.Vector4)\">\n      <summary>\n        <para>Sets a named vector value.</para>\n      </summary>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Property name, e.g. \"_WaveAndDistance\".</param>\n      <param name=\"value\">Vector value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetVector(System.Int32,UnityEngine.Vector4)\">\n      <summary>\n        <para>Sets a named vector value.</para>\n      </summary>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n      <param name=\"name\">Property name, e.g. \"_WaveAndDistance\".</param>\n      <param name=\"value\">Vector value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetVectorArray(System.String,UnityEngine.Vector4[])\">\n      <summary>\n        <para>Sets a vector array property.</para>\n      </summary>\n      <param name=\"name\">Property name.</param>\n      <param name=\"values\">Array of values to set.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetVectorArray(System.Int32,UnityEngine.Vector4[])\">\n      <summary>\n        <para>Sets a vector array property.</para>\n      </summary>\n      <param name=\"name\">Property name.</param>\n      <param name=\"values\">Array of values to set.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetVectorArray(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Sets a vector array property.</para>\n      </summary>\n      <param name=\"name\">Property name.</param>\n      <param name=\"values\">Array of values to set.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n    </member>\n    <member name=\"M:UnityEngine.Material.SetVectorArray(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Sets a vector array property.</para>\n      </summary>\n      <param name=\"name\">Property name.</param>\n      <param name=\"values\">Array of values to set.</param>\n      <param name=\"nameID\">Property name ID, use Shader.PropertyToID to get it.</param>\n    </member>\n    <member name=\"T:UnityEngine.MaterialGlobalIlluminationFlags\">\n      <summary>\n        <para>How the material interacts with lightmaps and lightprobes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MaterialGlobalIlluminationFlags.AnyEmissive\">\n      <summary>\n        <para>Helper Mask to be used to query the enum only based on whether realtime GI or baked GI is set, ignoring all other bits.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MaterialGlobalIlluminationFlags.BakedEmissive\">\n      <summary>\n        <para>The emissive lighting affects baked Global Illumination. It emits lighting into baked lightmaps and baked lightprobes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MaterialGlobalIlluminationFlags.EmissiveIsBlack\">\n      <summary>\n        <para>The emissive lighting is guaranteed to be black. This lets the lightmapping system know that it doesn't have to extract emissive lighting information from the material and can simply assume it is completely black.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MaterialGlobalIlluminationFlags.None\">\n      <summary>\n        <para>The emissive lighting does not affect Global Illumination at all.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MaterialGlobalIlluminationFlags.RealtimeEmissive\">\n      <summary>\n        <para>The emissive lighting will affect realtime Global Illumination. It emits lighting into realtime lightmaps and realtime lightprobes.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.MaterialPropertyBlock\">\n      <summary>\n        <para>A block of material values to apply.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MaterialPropertyBlock.isEmpty\">\n      <summary>\n        <para>Is the material property block empty? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.Clear\">\n      <summary>\n        <para>Clear material property values.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.CopyProbeOcclusionArrayFrom(UnityEngine.Vector4[])\">\n      <summary>\n        <para>This function copies the entire source array into a Vector4 property array named unity_ProbesOcclusion for use with instanced rendering.</para>\n      </summary>\n      <param name=\"occlusionProbes\">The array of probe occlusion values to copy from.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.CopyProbeOcclusionArrayFrom(System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>This function copies the entire source array into a Vector4 property array named unity_ProbesOcclusion for use with instanced rendering.</para>\n      </summary>\n      <param name=\"occlusionProbes\">The array of probe occlusion values to copy from.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.CopyProbeOcclusionArrayFrom(UnityEngine.Vector4[],System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>This function copies the source array into a Vector4 property array named unity_ProbesOcclusion with the specified source and destination range for use with instanced rendering.</para>\n      </summary>\n      <param name=\"occlusionProbes\">The array of probe occlusion values to copy from.</param>\n      <param name=\"sourceStart\">The index of the first element in the source array to copy from.</param>\n      <param name=\"destStart\">The index of the first element in the destination MaterialPropertyBlock array to copy to.</param>\n      <param name=\"count\">The number of elements to copy.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.CopyProbeOcclusionArrayFrom(System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>This function copies the source array into a Vector4 property array named unity_ProbesOcclusion with the specified source and destination range for use with instanced rendering.</para>\n      </summary>\n      <param name=\"occlusionProbes\">The array of probe occlusion values to copy from.</param>\n      <param name=\"sourceStart\">The index of the first element in the source array to copy from.</param>\n      <param name=\"destStart\">The index of the first element in the destination MaterialPropertyBlock array to copy to.</param>\n      <param name=\"count\">The number of elements to copy.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.CopySHCoefficientArraysFrom(System.Collections.Generic.List`1&lt;UnityEngine.Rendering.SphericalHarmonicsL2&gt;)\">\n      <summary>\n        <para>This function converts and copies the entire source array into 7 Vector4 property arrays named unity_SHAr, unity_SHAg, unity_SHAb, unity_SHBr, unity_SHBg, unity_SHBb and unity_SHC for use with instanced rendering.</para>\n      </summary>\n      <param name=\"lightProbes\">The array of SH values to copy from.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.CopySHCoefficientArraysFrom(UnityEngine.Rendering.SphericalHarmonicsL2[])\">\n      <summary>\n        <para>This function converts and copies the entire source array into 7 Vector4 property arrays named unity_SHAr, unity_SHAg, unity_SHAb, unity_SHBr, unity_SHBg, unity_SHBb and unity_SHC for use with instanced rendering.</para>\n      </summary>\n      <param name=\"lightProbes\">The array of SH values to copy from.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.CopySHCoefficientArraysFrom(UnityEngine.Rendering.SphericalHarmonicsL2[],System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>This function converts and copies the source array into 7 Vector4 property arrays named unity_SHAr, unity_SHAg, unity_SHAb, unity_SHBr, unity_SHBg, unity_SHBb and unity_SHC with the specified source and destination range for use with instanced rendering.</para>\n      </summary>\n      <param name=\"lightProbes\">The array of SH values to copy from.</param>\n      <param name=\"sourceStart\">The index of the first element in the source array to copy from.</param>\n      <param name=\"destStart\">The index of the first element in the destination MaterialPropertyBlock array to copy to.</param>\n      <param name=\"count\">The number of elements to copy.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.CopySHCoefficientArraysFrom(System.Collections.Generic.List`1&lt;UnityEngine.Rendering.SphericalHarmonicsL2&gt;,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>This function converts and copies the source array into 7 Vector4 property arrays named unity_SHAr, unity_SHAg, unity_SHAb, unity_SHBr, unity_SHBg, unity_SHBb and unity_SHC with the specified source and destination range for use with instanced rendering.</para>\n      </summary>\n      <param name=\"lightProbes\">The array of SH values to copy from.</param>\n      <param name=\"sourceStart\">The index of the first element in the source array to copy from.</param>\n      <param name=\"destStart\">The index of the first element in the destination MaterialPropertyBlock array to copy to.</param>\n      <param name=\"count\">The number of elements to copy.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetColor(System.String)\">\n      <summary>\n        <para>Get a color from the property block.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetColor(System.Int32)\">\n      <summary>\n        <para>Get a color from the property block.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetFloat(System.String)\">\n      <summary>\n        <para>Get a float from the property block.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetFloat(System.Int32)\">\n      <summary>\n        <para>Get a float from the property block.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetFloatArray(System.String)\">\n      <summary>\n        <para>Get a float array from the property block.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetFloatArray(System.Int32)\">\n      <summary>\n        <para>Get a float array from the property block.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetFloatArray(System.String,System.Collections.Generic.List`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Fetch a float array from the property block into a list.</para>\n      </summary>\n      <param name=\"values\">The list to hold the returned array.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetFloatArray(System.Int32,System.Collections.Generic.List`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Fetch a float array from the property block into a list.</para>\n      </summary>\n      <param name=\"values\">The list to hold the returned array.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetInt(System.String)\">\n      <summary>\n        <para>Get an int from the property block.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetInt(System.Int32)\">\n      <summary>\n        <para>Get an int from the property block.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetMatrix(System.String)\">\n      <summary>\n        <para>Get a matrix from the property block.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetMatrix(System.Int32)\">\n      <summary>\n        <para>Get a matrix from the property block.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetMatrixArray(System.String)\">\n      <summary>\n        <para>Get a matrix array from the property block.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetMatrixArray(System.Int32)\">\n      <summary>\n        <para>Get a matrix array from the property block.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetMatrixArray(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Matrix4x4&gt;)\">\n      <summary>\n        <para>Fetch a matrix array from the property block into a list.</para>\n      </summary>\n      <param name=\"values\">The list to hold the returned array.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetMatrixArray(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Matrix4x4&gt;)\">\n      <summary>\n        <para>Fetch a matrix array from the property block into a list.</para>\n      </summary>\n      <param name=\"values\">The list to hold the returned array.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetTexture(System.String)\">\n      <summary>\n        <para>Get a texture from the property block.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetTexture(System.Int32)\">\n      <summary>\n        <para>Get a texture from the property block.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetVector(System.String)\">\n      <summary>\n        <para>Get a vector from the property block.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetVector(System.Int32)\">\n      <summary>\n        <para>Get a vector from the property block.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetVectorArray(System.String)\">\n      <summary>\n        <para>Get a vector array from the property block.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetVectorArray(System.Int32)\">\n      <summary>\n        <para>Get a vector array from the property block.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetVectorArray(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Fetch a vector array from the property block into a list.</para>\n      </summary>\n      <param name=\"values\">The list to hold the returned array.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.GetVectorArray(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Fetch a vector array from the property block into a list.</para>\n      </summary>\n      <param name=\"values\">The list to hold the returned array.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetBuffer(System.String,UnityEngine.ComputeBuffer)\">\n      <summary>\n        <para>Set a ComputeBuffer property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"value\">The ComputeBuffer to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetBuffer(System.Int32,UnityEngine.ComputeBuffer)\">\n      <summary>\n        <para>Set a ComputeBuffer property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"value\">The ComputeBuffer to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetColor(System.String,UnityEngine.Color)\">\n      <summary>\n        <para>Set a color property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"value\">The Color value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetColor(System.Int32,UnityEngine.Color)\">\n      <summary>\n        <para>Set a color property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"value\">The Color value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetFloat(System.String,System.Single)\">\n      <summary>\n        <para>Set a float property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"value\">The float value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetFloat(System.Int32,System.Single)\">\n      <summary>\n        <para>Set a float property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"value\">The float value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetFloatArray(System.String,System.Single[])\">\n      <summary>\n        <para>Set a float array property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"values\">The array to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetFloatArray(System.Int32,System.Single[])\">\n      <summary>\n        <para>Set a float array property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"values\">The array to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetFloatArray(System.String,System.Collections.Generic.List`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Set a float array property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"values\">The array to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetFloatArray(System.Int32,System.Collections.Generic.List`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Set a float array property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"values\">The array to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetInt(System.Int32,System.Int32)\">\n      <summary>\n        <para>Adds a property to the block. If an int property with the given name already exists, the old value is replaced.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"value\">The int value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetInt(System.String,System.Int32)\">\n      <summary>\n        <para>Adds a property to the block. If an int property with the given name already exists, the old value is replaced.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"value\">The int value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetMatrix(System.String,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Set a matrix property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"value\">The matrix value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetMatrix(System.Int32,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Set a matrix property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"value\">The matrix value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetMatrixArray(System.String,UnityEngine.Matrix4x4[])\">\n      <summary>\n        <para>Set a matrix array property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"nameID\">The array to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetMatrixArray(System.Int32,UnityEngine.Matrix4x4[])\">\n      <summary>\n        <para>Set a matrix array property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"nameID\">The array to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetMatrixArray(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Matrix4x4&gt;)\">\n      <summary>\n        <para>Set a matrix array property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"nameID\">The array to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetMatrixArray(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Matrix4x4&gt;)\">\n      <summary>\n        <para>Set a matrix array property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"nameID\">The array to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetTexture(System.String,UnityEngine.Texture)\">\n      <summary>\n        <para>Set a texture property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"value\">The Texture to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetTexture(System.Int32,UnityEngine.Texture)\">\n      <summary>\n        <para>Set a texture property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"value\">The Texture to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetVector(System.String,UnityEngine.Vector4)\">\n      <summary>\n        <para>Set a vector property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"value\">The Vector4 value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetVector(System.Int32,UnityEngine.Vector4)\">\n      <summary>\n        <para>Set a vector property.</para>\n      </summary>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"value\">The Vector4 value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetVectorArray(System.String,UnityEngine.Vector4[])\">\n      <summary>\n        <para>Set a vector array property.</para>\n      </summary>\n      <param name=\"nameID\">The name of the property.</param>\n      <param name=\"values\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The array to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetVectorArray(System.Int32,UnityEngine.Vector4[])\">\n      <summary>\n        <para>Set a vector array property.</para>\n      </summary>\n      <param name=\"nameID\">The name of the property.</param>\n      <param name=\"values\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The array to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetVectorArray(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Set a vector array property.</para>\n      </summary>\n      <param name=\"nameID\">The name of the property.</param>\n      <param name=\"values\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The array to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.MaterialPropertyBlock.SetVectorArray(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Set a vector array property.</para>\n      </summary>\n      <param name=\"nameID\">The name of the property.</param>\n      <param name=\"values\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The array to set.</param>\n    </member>\n    <member name=\"T:UnityEngine.Mathf\">\n      <summary>\n        <para>A collection of common math functions.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Abs(System.Single)\">\n      <summary>\n        <para>Returns the absolute value of f.</para>\n      </summary>\n      <param name=\"f\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Abs(System.Int32)\">\n      <summary>\n        <para>Returns the absolute value of value.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Acos(System.Single)\">\n      <summary>\n        <para>Returns the arc-cosine of f - the angle in radians whose cosine is f.</para>\n      </summary>\n      <param name=\"f\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Approximately(System.Single,System.Single)\">\n      <summary>\n        <para>Compares two floating point values and returns true if they are similar.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Asin(System.Single)\">\n      <summary>\n        <para>Returns the arc-sine of f - the angle in radians whose sine is f.</para>\n      </summary>\n      <param name=\"f\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Atan(System.Single)\">\n      <summary>\n        <para>Returns the arc-tangent of f - the angle in radians whose tangent is f.</para>\n      </summary>\n      <param name=\"f\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Atan2(System.Single,System.Single)\">\n      <summary>\n        <para>Returns the angle in radians whose Tan is y/x.</para>\n      </summary>\n      <param name=\"y\"></param>\n      <param name=\"x\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Ceil(System.Single)\">\n      <summary>\n        <para>Returns the smallest integer greater to or equal to f.</para>\n      </summary>\n      <param name=\"f\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.CeilToInt(System.Single)\">\n      <summary>\n        <para>Returns the smallest integer greater to or equal to f.</para>\n      </summary>\n      <param name=\"f\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Clamp(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Clamps a value between a minimum float and maximum float value.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"min\"></param>\n      <param name=\"max\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Clamp(System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Clamps value between min and max and returns value.</para>\n      </summary>\n      <param name=\"value\"></param>\n      <param name=\"min\"></param>\n      <param name=\"max\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Clamp01(System.Single)\">\n      <summary>\n        <para>Clamps value between 0 and 1 and returns value.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.ClosestPowerOfTwo(System.Int32)\">\n      <summary>\n        <para>Returns the closest power of two value.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.CorrelatedColorTemperatureToRGB(System.Single)\">\n      <summary>\n        <para>Convert a color temperature in Kelvin to RGB color.</para>\n      </summary>\n      <param name=\"kelvin\">Temperature in Kelvin. Range 1000 to 40000 Kelvin.</param>\n      <returns>\n        <para>Correlated Color Temperature as floating point RGB color.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Cos(System.Single)\">\n      <summary>\n        <para>Returns the cosine of angle f.</para>\n      </summary>\n      <param name=\"f\">The input angle, in radians.</param>\n      <returns>\n        <para>The return value between -1 and 1.</para>\n      </returns>\n    </member>\n    <member name=\"F:UnityEngine.Mathf.Deg2Rad\">\n      <summary>\n        <para>Degrees-to-radians conversion constant (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.DeltaAngle(System.Single,System.Single)\">\n      <summary>\n        <para>Calculates the shortest difference between two given angles given in degrees.</para>\n      </summary>\n      <param name=\"current\"></param>\n      <param name=\"target\"></param>\n    </member>\n    <member name=\"F:UnityEngine.Mathf.Epsilon\">\n      <summary>\n        <para>A tiny floating point value (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Exp(System.Single)\">\n      <summary>\n        <para>Returns e raised to the specified power.</para>\n      </summary>\n      <param name=\"power\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Floor(System.Single)\">\n      <summary>\n        <para>Returns the largest integer smaller than or equal to f.</para>\n      </summary>\n      <param name=\"f\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.FloorToInt(System.Single)\">\n      <summary>\n        <para>Returns the largest integer smaller to or equal to f.</para>\n      </summary>\n      <param name=\"f\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.GammaToLinearSpace(System.Single)\">\n      <summary>\n        <para>Converts the given value from gamma (sRGB) to linear color space.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"F:UnityEngine.Mathf.Infinity\">\n      <summary>\n        <para>A representation of positive infinity (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.InverseLerp(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Calculates the linear parameter t that produces the interpolant value within the range [a, b].</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.IsPowerOfTwo(System.Int32)\">\n      <summary>\n        <para>Returns true if the value is power of two.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Lerp(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Linearly interpolates between a and b by t.</para>\n      </summary>\n      <param name=\"a\">The start value.</param>\n      <param name=\"b\">The end value.</param>\n      <param name=\"t\">The interpolation value between the two floats.</param>\n      <returns>\n        <para>The interpolated float result between the two float values.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.LerpAngle(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Same as Lerp but makes sure the values interpolate correctly when they wrap around 360 degrees.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.LerpUnclamped(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Linearly interpolates between a and b by t with no limit to t.</para>\n      </summary>\n      <param name=\"a\">The start value.</param>\n      <param name=\"b\">The end value.</param>\n      <param name=\"t\">The interpolation between the two floats.</param>\n      <returns>\n        <para>The float value as a result from the linear interpolation.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.LinearToGammaSpace(System.Single)\">\n      <summary>\n        <para>Converts the given value from linear to gamma (sRGB) color space.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Log(System.Single,System.Single)\">\n      <summary>\n        <para>Returns the logarithm of a specified number in a specified base.</para>\n      </summary>\n      <param name=\"f\"></param>\n      <param name=\"p\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Log(System.Single)\">\n      <summary>\n        <para>Returns the natural (base e) logarithm of a specified number.</para>\n      </summary>\n      <param name=\"f\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Log10(System.Single)\">\n      <summary>\n        <para>Returns the base 10 logarithm of a specified number.</para>\n      </summary>\n      <param name=\"f\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Max(System.Single,System.Single)\">\n      <summary>\n        <para>Returns largest of two or more values.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Max(System.Single[])\">\n      <summary>\n        <para>Returns largest of two or more values.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Max(System.Int32,System.Int32)\">\n      <summary>\n        <para>Returns the largest of two or more values.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Max(System.Int32[])\">\n      <summary>\n        <para>Returns the largest of two or more values.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Min(System.Single,System.Single)\">\n      <summary>\n        <para>Returns the smallest of two or more values.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Min(System.Single[])\">\n      <summary>\n        <para>Returns the smallest of two or more values.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Min(System.Int32,System.Int32)\">\n      <summary>\n        <para>Returns the smallest of two or more values.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Min(System.Int32[])\">\n      <summary>\n        <para>Returns the smallest of two or more values.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.MoveTowards(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Moves a value current towards target.</para>\n      </summary>\n      <param name=\"current\">The current value.</param>\n      <param name=\"target\">The value to move towards.</param>\n      <param name=\"maxDelta\">The maximum change that should be applied to the value.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.MoveTowardsAngle(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Same as MoveTowards but makes sure the values interpolate correctly when they wrap around 360 degrees.</para>\n      </summary>\n      <param name=\"current\"></param>\n      <param name=\"target\"></param>\n      <param name=\"maxDelta\"></param>\n    </member>\n    <member name=\"F:UnityEngine.Mathf.NegativeInfinity\">\n      <summary>\n        <para>A representation of negative infinity (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.NextPowerOfTwo(System.Int32)\">\n      <summary>\n        <para>Returns the next power of two value.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.PerlinNoise(System.Single,System.Single)\">\n      <summary>\n        <para>Generate 2D Perlin noise.</para>\n      </summary>\n      <param name=\"x\">X-coordinate of sample point.</param>\n      <param name=\"y\">Y-coordinate of sample point.</param>\n      <returns>\n        <para>Value between 0.0 and 1.0.</para>\n      </returns>\n    </member>\n    <member name=\"F:UnityEngine.Mathf.PI\">\n      <summary>\n        <para>The infamous 3.14159265358979... value (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.PingPong(System.Single,System.Single)\">\n      <summary>\n        <para>PingPongs the value t, so that it is never larger than length and never smaller than 0.</para>\n      </summary>\n      <param name=\"t\"></param>\n      <param name=\"length\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Pow(System.Single,System.Single)\">\n      <summary>\n        <para>Returns f raised to power p.</para>\n      </summary>\n      <param name=\"f\"></param>\n      <param name=\"p\"></param>\n    </member>\n    <member name=\"F:UnityEngine.Mathf.Rad2Deg\">\n      <summary>\n        <para>Radians-to-degrees conversion constant (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Repeat(System.Single,System.Single)\">\n      <summary>\n        <para>Loops the value t, so that it is never larger than length and never smaller than 0.</para>\n      </summary>\n      <param name=\"t\"></param>\n      <param name=\"length\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Round(System.Single)\">\n      <summary>\n        <para>Returns f rounded to the nearest integer.</para>\n      </summary>\n      <param name=\"f\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.RoundToInt(System.Single)\">\n      <summary>\n        <para>Returns f rounded to the nearest integer.</para>\n      </summary>\n      <param name=\"f\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Sign(System.Single)\">\n      <summary>\n        <para>Returns the sign of f.</para>\n      </summary>\n      <param name=\"f\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Sin(System.Single)\">\n      <summary>\n        <para>Returns the sine of angle f.</para>\n      </summary>\n      <param name=\"f\">The input angle, in radians.</param>\n      <returns>\n        <para>The return value between -1 and +1.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.SmoothDamp(System.Single,System.Single,System.Single&amp;,System.Single)\">\n      <summary>\n        <para>Gradually changes a value towards a desired goal over time.</para>\n      </summary>\n      <param name=\"current\">The current position.</param>\n      <param name=\"target\">The position we are trying to reach.</param>\n      <param name=\"currentVelocity\">The current velocity, this value is modified by the function every time you call it.</param>\n      <param name=\"smoothTime\">Approximately the time it will take to reach the target. A smaller value will reach the target faster.</param>\n      <param name=\"maxSpeed\">Optionally allows you to clamp the maximum speed.</param>\n      <param name=\"deltaTime\">The time since the last call to this function. By default Time.deltaTime.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.SmoothDamp(System.Single,System.Single,System.Single&amp;,System.Single,System.Single)\">\n      <summary>\n        <para>Gradually changes a value towards a desired goal over time.</para>\n      </summary>\n      <param name=\"current\">The current position.</param>\n      <param name=\"target\">The position we are trying to reach.</param>\n      <param name=\"currentVelocity\">The current velocity, this value is modified by the function every time you call it.</param>\n      <param name=\"smoothTime\">Approximately the time it will take to reach the target. A smaller value will reach the target faster.</param>\n      <param name=\"maxSpeed\">Optionally allows you to clamp the maximum speed.</param>\n      <param name=\"deltaTime\">The time since the last call to this function. By default Time.deltaTime.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.SmoothDamp(System.Single,System.Single,System.Single&amp;,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Gradually changes a value towards a desired goal over time.</para>\n      </summary>\n      <param name=\"current\">The current position.</param>\n      <param name=\"target\">The position we are trying to reach.</param>\n      <param name=\"currentVelocity\">The current velocity, this value is modified by the function every time you call it.</param>\n      <param name=\"smoothTime\">Approximately the time it will take to reach the target. A smaller value will reach the target faster.</param>\n      <param name=\"maxSpeed\">Optionally allows you to clamp the maximum speed.</param>\n      <param name=\"deltaTime\">The time since the last call to this function. By default Time.deltaTime.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.SmoothDampAngle(System.Single,System.Single,System.Single&amp;,System.Single)\">\n      <summary>\n        <para>Gradually changes an angle given in degrees towards a desired goal angle over time.</para>\n      </summary>\n      <param name=\"current\">The current position.</param>\n      <param name=\"target\">The position we are trying to reach.</param>\n      <param name=\"currentVelocity\">The current velocity, this value is modified by the function every time you call it.</param>\n      <param name=\"smoothTime\">Approximately the time it will take to reach the target. A smaller value will reach the target faster.</param>\n      <param name=\"maxSpeed\">Optionally allows you to clamp the maximum speed.</param>\n      <param name=\"deltaTime\">The time since the last call to this function. By default Time.deltaTime.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.SmoothDampAngle(System.Single,System.Single,System.Single&amp;,System.Single,System.Single)\">\n      <summary>\n        <para>Gradually changes an angle given in degrees towards a desired goal angle over time.</para>\n      </summary>\n      <param name=\"current\">The current position.</param>\n      <param name=\"target\">The position we are trying to reach.</param>\n      <param name=\"currentVelocity\">The current velocity, this value is modified by the function every time you call it.</param>\n      <param name=\"smoothTime\">Approximately the time it will take to reach the target. A smaller value will reach the target faster.</param>\n      <param name=\"maxSpeed\">Optionally allows you to clamp the maximum speed.</param>\n      <param name=\"deltaTime\">The time since the last call to this function. By default Time.deltaTime.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.SmoothDampAngle(System.Single,System.Single,System.Single&amp;,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Gradually changes an angle given in degrees towards a desired goal angle over time.</para>\n      </summary>\n      <param name=\"current\">The current position.</param>\n      <param name=\"target\">The position we are trying to reach.</param>\n      <param name=\"currentVelocity\">The current velocity, this value is modified by the function every time you call it.</param>\n      <param name=\"smoothTime\">Approximately the time it will take to reach the target. A smaller value will reach the target faster.</param>\n      <param name=\"maxSpeed\">Optionally allows you to clamp the maximum speed.</param>\n      <param name=\"deltaTime\">The time since the last call to this function. By default Time.deltaTime.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.SmoothStep(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Interpolates between min and max with smoothing at the limits.</para>\n      </summary>\n      <param name=\"from\"></param>\n      <param name=\"to\"></param>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Sqrt(System.Single)\">\n      <summary>\n        <para>Returns square root of f.</para>\n      </summary>\n      <param name=\"f\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mathf.Tan(System.Single)\">\n      <summary>\n        <para>Returns the tangent of angle f in radians.</para>\n      </summary>\n      <param name=\"f\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Matrix4x4\">\n      <summary>\n        <para>A standard 4x4 transformation matrix.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Matrix4x4.decomposeProjection\">\n      <summary>\n        <para>This property takes a projection matrix and returns the six plane coordinates that define a projection frustum.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Matrix4x4.determinant\">\n      <summary>\n        <para>The determinant of the matrix.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Matrix4x4.identity\">\n      <summary>\n        <para>Returns the identity matrix (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Matrix4x4.inverse\">\n      <summary>\n        <para>The inverse of this matrix (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Matrix4x4.isIdentity\">\n      <summary>\n        <para>Is this the identity matrix?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Matrix4x4.lossyScale\">\n      <summary>\n        <para>Attempts to get a scale value from the matrix.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Matrix4x4.rotation\">\n      <summary>\n        <para>Attempts to get a rotation quaternion from this matrix.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Matrix4x4.transpose\">\n      <summary>\n        <para>Returns the transpose of this matrix (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Matrix4x4.zero\">\n      <summary>\n        <para>Returns a matrix with all elements set to zero (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.Frustum(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>This function returns a projection matrix with viewing frustum that has a near plane defined by the coordinates that were passed in.</para>\n      </summary>\n      <param name=\"left\">The X coordinate of the left side of the near projection plane in view space.</param>\n      <param name=\"right\">The X coordinate of the right side of the near projection plane in view space.</param>\n      <param name=\"bottom\">The Y coordinate of the bottom side of the near projection plane in view space.</param>\n      <param name=\"top\">The Y coordinate of the top side of the near projection plane in view space.</param>\n      <param name=\"zNear\">Z distance to the near plane from the origin in view space.</param>\n      <param name=\"zFar\">Z distance to the far plane from the origin in view space.</param>\n      <param name=\"frustumPlanes\">Frustum planes struct that contains the view space coordinates of that define a viewing frustum.</param>\n      <param name=\"fp\"></param>\n      <returns>\n        <para>A projection matrix with a viewing frustum defined by the plane coordinates passed in.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.Frustum(UnityEngine.FrustumPlanes)\">\n      <summary>\n        <para>This function returns a projection matrix with viewing frustum that has a near plane defined by the coordinates that were passed in.</para>\n      </summary>\n      <param name=\"left\">The X coordinate of the left side of the near projection plane in view space.</param>\n      <param name=\"right\">The X coordinate of the right side of the near projection plane in view space.</param>\n      <param name=\"bottom\">The Y coordinate of the bottom side of the near projection plane in view space.</param>\n      <param name=\"top\">The Y coordinate of the top side of the near projection plane in view space.</param>\n      <param name=\"zNear\">Z distance to the near plane from the origin in view space.</param>\n      <param name=\"zFar\">Z distance to the far plane from the origin in view space.</param>\n      <param name=\"frustumPlanes\">Frustum planes struct that contains the view space coordinates of that define a viewing frustum.</param>\n      <param name=\"fp\"></param>\n      <returns>\n        <para>A projection matrix with a viewing frustum defined by the plane coordinates passed in.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.GetColumn(System.Int32)\">\n      <summary>\n        <para>Get a column of the matrix.</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.GetRow(System.Int32)\">\n      <summary>\n        <para>Returns a row of the matrix.</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.LookAt(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Given a source point, a target point, and an up vector, computes a transformation matrix that corresponds to a camera viewing the target from the source, such that the right-hand vector is perpendicular to the up vector.</para>\n      </summary>\n      <param name=\"from\">The source point.</param>\n      <param name=\"to\">The target point.</param>\n      <param name=\"up\">The vector describing the up direction (typically Vector3.up).</param>\n      <returns>\n        <para>The resulting transformation matrix.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.MultiplyPoint(UnityEngine.Vector3)\">\n      <summary>\n        <para>Transforms a position by this matrix (generic).</para>\n      </summary>\n      <param name=\"point\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.MultiplyPoint3x4(UnityEngine.Vector3)\">\n      <summary>\n        <para>Transforms a position by this matrix (fast).</para>\n      </summary>\n      <param name=\"point\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.MultiplyVector(UnityEngine.Vector3)\">\n      <summary>\n        <para>Transforms a direction by this matrix.</para>\n      </summary>\n      <param name=\"vector\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Matrix4x4.op_Multiply(UnityEngine.Matrix4x4,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Multiplies two matrices.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Matrix4x4.op_Multiply(UnityEngine.Matrix4x4,UnityEngine.Vector4)\">\n      <summary>\n        <para>Transforms a Vector4 by a matrix.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"vector\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.Ortho(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Creates an orthogonal projection matrix.</para>\n      </summary>\n      <param name=\"left\"></param>\n      <param name=\"right\"></param>\n      <param name=\"bottom\"></param>\n      <param name=\"top\"></param>\n      <param name=\"zNear\"></param>\n      <param name=\"zFar\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.Perspective(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Creates a perspective projection matrix.</para>\n      </summary>\n      <param name=\"fov\"></param>\n      <param name=\"aspect\"></param>\n      <param name=\"zNear\"></param>\n      <param name=\"zFar\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.Rotate(UnityEngine.Quaternion)\">\n      <summary>\n        <para>Creates a rotation matrix.</para>\n      </summary>\n      <param name=\"q\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.Scale(UnityEngine.Vector3)\">\n      <summary>\n        <para>Creates a scaling matrix.</para>\n      </summary>\n      <param name=\"vector\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.SetColumn(System.Int32,UnityEngine.Vector4)\">\n      <summary>\n        <para>Sets a column of the matrix.</para>\n      </summary>\n      <param name=\"index\"></param>\n      <param name=\"column\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.SetRow(System.Int32,UnityEngine.Vector4)\">\n      <summary>\n        <para>Sets a row of the matrix.</para>\n      </summary>\n      <param name=\"index\"></param>\n      <param name=\"row\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.SetTRS(UnityEngine.Vector3,UnityEngine.Quaternion,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets this matrix to a translation, rotation and scaling matrix.</para>\n      </summary>\n      <param name=\"pos\"></param>\n      <param name=\"q\"></param>\n      <param name=\"s\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Matrix4x4.this\">\n      <summary>\n        <para>Access element at [row, column].</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Matrix4x4.this\">\n      <summary>\n        <para>Access element at sequential index (0..15 inclusive).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.ToString\">\n      <summary>\n        <para>Returns a nicely formatted string for this matrix.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.ToString(System.String)\">\n      <summary>\n        <para>Returns a nicely formatted string for this matrix.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.TransformPlane(UnityEngine.Plane)\">\n      <summary>\n        <para>Returns a plane that is transformed in space.</para>\n      </summary>\n      <param name=\"plane\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.Translate(UnityEngine.Vector3)\">\n      <summary>\n        <para>Creates a translation matrix.</para>\n      </summary>\n      <param name=\"vector\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.TRS(UnityEngine.Vector3,UnityEngine.Quaternion,UnityEngine.Vector3)\">\n      <summary>\n        <para>Creates a translation, rotation and scaling matrix.</para>\n      </summary>\n      <param name=\"pos\"></param>\n      <param name=\"q\"></param>\n      <param name=\"s\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Matrix4x4.ValidTRS\">\n      <summary>\n        <para>Checks if this matrix is a valid transform matrix.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Mesh\">\n      <summary>\n        <para>A class that allows creating or modifying meshes from scripts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.bindposes\">\n      <summary>\n        <para>The bind poses. The bind pose at each index refers to the bone with the same index.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.blendShapeCount\">\n      <summary>\n        <para>Returns BlendShape count on this mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.boneWeights\">\n      <summary>\n        <para>The bone weights of each vertex.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.bounds\">\n      <summary>\n        <para>The bounding volume of the mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.colors\">\n      <summary>\n        <para>Vertex colors of the Mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.colors32\">\n      <summary>\n        <para>Vertex colors of the Mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.indexFormat\">\n      <summary>\n        <para>Format of the mesh index buffer data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.isReadable\">\n      <summary>\n        <para>Returns state of the Read/Write Enabled checkbox when model was imported.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.normals\">\n      <summary>\n        <para>The normals of the Mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.subMeshCount\">\n      <summary>\n        <para>The number of sub-meshes inside the Mesh object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.tangents\">\n      <summary>\n        <para>The tangents of the Mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.triangles\">\n      <summary>\n        <para>An array containing all triangles in the Mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.uv\">\n      <summary>\n        <para>The base texture coordinates of the Mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.uv2\">\n      <summary>\n        <para>The second texture coordinate set of the mesh, if present.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.uv3\">\n      <summary>\n        <para>The third texture coordinate set of the mesh, if present.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.uv4\">\n      <summary>\n        <para>The fourth texture coordinate set of the mesh, if present.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.uv5\">\n      <summary>\n        <para>The fifth texture coordinate set of the mesh, if present.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.uv6\">\n      <summary>\n        <para>The sixth texture coordinate set of the mesh, if present.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.uv7\">\n      <summary>\n        <para>The seventh texture coordinate set of the mesh, if present.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.uv8\">\n      <summary>\n        <para>The eighth texture coordinate set of the mesh, if present.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.vertexBufferCount\">\n      <summary>\n        <para>Gets the number of vertex buffers present in the Mesh. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.vertexCount\">\n      <summary>\n        <para>Returns the number of vertices in the Mesh (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Mesh.vertices\">\n      <summary>\n        <para>Returns a copy of the vertex positions or assigns a new vertex positions array.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.AddBlendShapeFrame(System.String,System.Single,UnityEngine.Vector3[],UnityEngine.Vector3[],UnityEngine.Vector3[])\">\n      <summary>\n        <para>Adds a new blend shape frame.</para>\n      </summary>\n      <param name=\"shapeName\">Name of the blend shape to add a frame to.</param>\n      <param name=\"frameWeight\">Weight for the frame being added.</param>\n      <param name=\"deltaVertices\">Delta vertices for the frame being added.</param>\n      <param name=\"deltaNormals\">Delta normals for the frame being added.</param>\n      <param name=\"deltaTangents\">Delta tangents for the frame being added.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.Clear(System.Boolean)\">\n      <summary>\n        <para>Clears all vertex data and all triangle indices.</para>\n      </summary>\n      <param name=\"keepVertexLayout\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.ClearBlendShapes\">\n      <summary>\n        <para>Clears all blend shapes from Mesh.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.CombineMeshes(UnityEngine.CombineInstance[],System.Boolean,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Combines several Meshes into this Mesh.</para>\n      </summary>\n      <param name=\"combine\">Descriptions of the Meshes to combine.</param>\n      <param name=\"mergeSubMeshes\">Defines whether Meshes should be combined into a single sub-mesh.</param>\n      <param name=\"useMatrices\">Defines whether the transforms supplied in the CombineInstance array should be used or ignored.</param>\n      <param name=\"hasLightmapData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.#ctor\">\n      <summary>\n        <para>Creates an empty Mesh.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetBaseVertex(System.Int32)\">\n      <summary>\n        <para>Gets the base vertex index of the given sub-mesh.</para>\n      </summary>\n      <param name=\"submesh\">The sub-mesh index. See subMeshCount.</param>\n      <returns>\n        <para>The offset applied to all vertex indices of this sub-mesh.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetBindposes(System.Collections.Generic.List`1&lt;UnityEngine.Matrix4x4&gt;)\">\n      <summary>\n        <para>Gets the bind poses for this instance.</para>\n      </summary>\n      <param name=\"bindposes\">A list of bind poses to populate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetBlendShapeFrameCount(System.Int32)\">\n      <summary>\n        <para>Returns the frame count for a blend shape.</para>\n      </summary>\n      <param name=\"shapeIndex\">The shape index to get frame count from.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetBlendShapeFrameVertices(System.Int32,System.Int32,UnityEngine.Vector3[],UnityEngine.Vector3[],UnityEngine.Vector3[])\">\n      <summary>\n        <para>Retreives deltaVertices, deltaNormals and deltaTangents of a blend shape frame.</para>\n      </summary>\n      <param name=\"shapeIndex\">The shape index of the frame.</param>\n      <param name=\"frameIndex\">The frame index to get the weight from.</param>\n      <param name=\"deltaVertices\">Delta vertices output array for the frame being retreived.</param>\n      <param name=\"deltaNormals\">Delta normals output array for the frame being retreived.</param>\n      <param name=\"deltaTangents\">Delta tangents output array for the frame being retreived.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetBlendShapeFrameWeight(System.Int32,System.Int32)\">\n      <summary>\n        <para>Returns the weight of a blend shape frame.</para>\n      </summary>\n      <param name=\"shapeIndex\">The shape index of the frame.</param>\n      <param name=\"frameIndex\">The frame index to get the weight from.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetBlendShapeIndex(System.String)\">\n      <summary>\n        <para>Returns index of BlendShape by given name.</para>\n      </summary>\n      <param name=\"blendShapeName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetBlendShapeName(System.Int32)\">\n      <summary>\n        <para>Returns name of BlendShape by given index.</para>\n      </summary>\n      <param name=\"shapeIndex\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetBoneWeights(System.Collections.Generic.List`1&lt;UnityEngine.BoneWeight&gt;)\">\n      <summary>\n        <para>Gets the bone weights for this instance.</para>\n      </summary>\n      <param name=\"boneWeights\">A list of bone weights to populate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetColors(System.Collections.Generic.List`1&lt;UnityEngine.Color&gt;)\">\n      <summary>\n        <para>Gets the vertex colors for this instance.</para>\n      </summary>\n      <param name=\"colors\">A list of vertex colors to populate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetColors(System.Collections.Generic.List`1&lt;UnityEngine.Color32&gt;)\">\n      <summary>\n        <para>Gets the vertex colors for this instance.</para>\n      </summary>\n      <param name=\"colors\">A list of vertex colors to populate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetIndexCount(System.Int32)\">\n      <summary>\n        <para>Gets the index count of the given sub-mesh.</para>\n      </summary>\n      <param name=\"submesh\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetIndexStart(System.Int32)\">\n      <summary>\n        <para>Gets the starting index location within the Mesh's index buffer, for the given sub-mesh.</para>\n      </summary>\n      <param name=\"submesh\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetIndices(System.Collections.Generic.List`1&lt;System.Int32&gt;,System.Int32)\">\n      <summary>\n        <para>Fetches the index list for the specified sub-mesh.</para>\n      </summary>\n      <param name=\"indices\">A list of indices to populate.</param>\n      <param name=\"submesh\">The sub-mesh index. See subMeshCount.</param>\n      <param name=\"applyBaseVertex\">True (default value) will apply base vertex offset to returned indices.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetIndices(System.Int32)\">\n      <summary>\n        <para>Fetches the index list for the specified sub-mesh.</para>\n      </summary>\n      <param name=\"indices\">A list of indices to populate.</param>\n      <param name=\"submesh\">The sub-mesh index. See subMeshCount.</param>\n      <param name=\"applyBaseVertex\">True (default value) will apply base vertex offset to returned indices.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetNativeIndexBufferPtr\">\n      <summary>\n        <para>Retrieves a native (underlying graphics API) pointer to the index buffer.</para>\n      </summary>\n      <returns>\n        <para>Pointer to the underlying graphics API index buffer.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetNativeVertexBufferPtr(System.Int32)\">\n      <summary>\n        <para>Retrieves a native (underlying graphics API) pointer to the vertex buffer.</para>\n      </summary>\n      <param name=\"bufferIndex\">Which vertex buffer to get (some Meshes might have more than one). See vertexBufferCount.</param>\n      <param name=\"index\"></param>\n      <returns>\n        <para>Pointer to the underlying graphics API vertex buffer.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetNormals(System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;)\">\n      <summary>\n        <para>Gets the vertex normals for this instance.</para>\n      </summary>\n      <param name=\"normals\">A list of vertex normals to populate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetTangents(System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Gets the tangents for this instance.</para>\n      </summary>\n      <param name=\"tangents\">A list of tangents to populate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetTopology(System.Int32)\">\n      <summary>\n        <para>Gets the topology of a sub-mesh.</para>\n      </summary>\n      <param name=\"submesh\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetTriangles(System.Int32)\">\n      <summary>\n        <para>Fetches the triangle list for the specified sub-mesh on this object.</para>\n      </summary>\n      <param name=\"triangles\">A list of vertex indices to populate.</param>\n      <param name=\"submesh\">The sub-mesh index. See subMeshCount.</param>\n      <param name=\"applyBaseVertex\">True (default value) will apply base vertex offset to returned indices.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetTriangles(System.Int32,System.Boolean)\">\n      <summary>\n        <para>Fetches the triangle list for the specified sub-mesh on this object.</para>\n      </summary>\n      <param name=\"triangles\">A list of vertex indices to populate.</param>\n      <param name=\"submesh\">The sub-mesh index. See subMeshCount.</param>\n      <param name=\"applyBaseVertex\">True (default value) will apply base vertex offset to returned indices.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetTriangles(System.Collections.Generic.List`1&lt;System.Int32&gt;,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Fetches the triangle list for the specified sub-mesh on this object.</para>\n      </summary>\n      <param name=\"triangles\">A list of vertex indices to populate.</param>\n      <param name=\"submesh\">The sub-mesh index. See subMeshCount.</param>\n      <param name=\"applyBaseVertex\">True (default value) will apply base vertex offset to returned indices.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetTriangles(System.Collections.Generic.List`1&lt;System.Int32&gt;,System.Int32)\">\n      <summary>\n        <para>Fetches the triangle list for the specified sub-mesh on this object.</para>\n      </summary>\n      <param name=\"triangles\">A list of vertex indices to populate.</param>\n      <param name=\"submesh\">The sub-mesh index. See subMeshCount.</param>\n      <param name=\"applyBaseVertex\">True (default value) will apply base vertex offset to returned indices.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetUVDistributionMetric(System.Int32)\">\n      <summary>\n        <para>The UV distribution metric can be used to calculate the desired mipmap level based on the position of the camera.</para>\n      </summary>\n      <param name=\"uvSetIndex\">UV set index to return the UV distibution metric for. 0 for first.</param>\n      <returns>\n        <para>Average of triangle area / uv area.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetUVs(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Vector2&gt;)\">\n      <summary>\n        <para>Gets the UVs of the Mesh.</para>\n      </summary>\n      <param name=\"channel\">The UV channel. Indices start at 0, which corresponds to uv. Note that 1 corresponds to uv2.</param>\n      <param name=\"uvs\">A list of UVs to populate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetUVs(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;)\">\n      <summary>\n        <para>Gets the UVs of the Mesh.</para>\n      </summary>\n      <param name=\"channel\">The UV channel. Indices start at 0, which corresponds to uv. Note that 1 corresponds to uv2.</param>\n      <param name=\"uvs\">A list of UVs to populate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetUVs(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Gets the UVs of the Mesh.</para>\n      </summary>\n      <param name=\"channel\">The UV channel. Indices start at 0, which corresponds to uv. Note that 1 corresponds to uv2.</param>\n      <param name=\"uvs\">A list of UVs to populate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.GetVertices(System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;)\">\n      <summary>\n        <para>Gets the vertex positions for this instance.</para>\n      </summary>\n      <param name=\"vertices\">A list of vertex positions to populate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.MarkDynamic\">\n      <summary>\n        <para>Optimize mesh for frequent updates.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.Optimize\">\n      <summary>\n        <para>Optimizes the Mesh for display.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.RecalculateBounds\">\n      <summary>\n        <para>Recalculate the bounding volume of the Mesh from the vertices.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.RecalculateNormals\">\n      <summary>\n        <para>Recalculates the normals of the Mesh from the triangles and vertices.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.RecalculateTangents\">\n      <summary>\n        <para>Recalculates the tangents of the Mesh from the normals and texture coordinates.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.SetColors(System.Collections.Generic.List`1&lt;UnityEngine.Color&gt;)\">\n      <summary>\n        <para>Vertex colors of the Mesh.</para>\n      </summary>\n      <param name=\"inColors\">Per-Vertex Colours.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.SetColors(System.Collections.Generic.List`1&lt;UnityEngine.Color32&gt;)\">\n      <summary>\n        <para>Vertex colors of the Mesh.</para>\n      </summary>\n      <param name=\"inColors\">Per-Vertex Colours.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.SetIndices(System.Int32[],UnityEngine.MeshTopology,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Sets the index buffer for the sub-mesh.</para>\n      </summary>\n      <param name=\"indices\">The array of indices that define the Mesh.</param>\n      <param name=\"topology\">The topology of the Mesh, e.g: Triangles, Lines, Quads, Points, etc. See MeshTopology.</param>\n      <param name=\"submesh\">The sub-mesh to modify.</param>\n      <param name=\"calculateBounds\">Calculate the bounding box of the Mesh after setting the indices. This is done by default.\nUse false when you want to use the existing bounding box and reduce the CPU cost of setting the indices.</param>\n      <param name=\"baseVertex\">Optional vertex offset that is added to all triangle vertex indices.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.SetIndices(System.Int32[],UnityEngine.MeshTopology,System.Int32)\">\n      <summary>\n        <para>Sets the index buffer for the sub-mesh.</para>\n      </summary>\n      <param name=\"indices\">The array of indices that define the Mesh.</param>\n      <param name=\"topology\">The topology of the Mesh, e.g: Triangles, Lines, Quads, Points, etc. See MeshTopology.</param>\n      <param name=\"submesh\">The sub-mesh to modify.</param>\n      <param name=\"calculateBounds\">Calculate the bounding box of the Mesh after setting the indices. This is done by default.\nUse false when you want to use the existing bounding box and reduce the CPU cost of setting the indices.</param>\n      <param name=\"baseVertex\">Optional vertex offset that is added to all triangle vertex indices.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.SetIndices(System.Int32[],UnityEngine.MeshTopology,System.Int32,System.Boolean,System.Int32)\">\n      <summary>\n        <para>Sets the index buffer for the sub-mesh.</para>\n      </summary>\n      <param name=\"indices\">The array of indices that define the Mesh.</param>\n      <param name=\"topology\">The topology of the Mesh, e.g: Triangles, Lines, Quads, Points, etc. See MeshTopology.</param>\n      <param name=\"submesh\">The sub-mesh to modify.</param>\n      <param name=\"calculateBounds\">Calculate the bounding box of the Mesh after setting the indices. This is done by default.\nUse false when you want to use the existing bounding box and reduce the CPU cost of setting the indices.</param>\n      <param name=\"baseVertex\">Optional vertex offset that is added to all triangle vertex indices.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.SetNormals(System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;)\">\n      <summary>\n        <para>Set the normals of the Mesh.</para>\n      </summary>\n      <param name=\"inNormals\">Per-vertex normals.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.SetTangents(System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Set the tangents of the Mesh.</para>\n      </summary>\n      <param name=\"inTangents\">Per-vertex tangents.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.SetTriangles(System.Int32[],System.Int32,System.Boolean,System.Int32)\">\n      <summary>\n        <para>Sets the triangle list for the sub-mesh.</para>\n      </summary>\n      <param name=\"triangles\">The list of indices that define the triangles.</param>\n      <param name=\"submesh\">The sub-mesh to modify.</param>\n      <param name=\"calculateBounds\">Calculate the bounding box of the Mesh after setting the triangles. This is done by default.\nUse false when you want to use the existing bounding box and reduce the CPU cost of setting the triangles.</param>\n      <param name=\"baseVertex\">Optional vertex offset that is added to all triangle vertex indices.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.SetTriangles(System.Int32[],System.Int32)\">\n      <summary>\n        <para>Sets the triangle list for the sub-mesh.</para>\n      </summary>\n      <param name=\"triangles\">The list of indices that define the triangles.</param>\n      <param name=\"submesh\">The sub-mesh to modify.</param>\n      <param name=\"calculateBounds\">Calculate the bounding box of the Mesh after setting the triangles. This is done by default.\nUse false when you want to use the existing bounding box and reduce the CPU cost of setting the triangles.</param>\n      <param name=\"baseVertex\">Optional vertex offset that is added to all triangle vertex indices.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.SetTriangles(System.Collections.Generic.List`1&lt;System.Int32&gt;,System.Int32,System.Boolean,System.Int32)\">\n      <summary>\n        <para>Sets the triangle list for the sub-mesh.</para>\n      </summary>\n      <param name=\"triangles\">The list of indices that define the triangles.</param>\n      <param name=\"submesh\">The sub-mesh to modify.</param>\n      <param name=\"calculateBounds\">Calculate the bounding box of the Mesh after setting the triangles. This is done by default.\nUse false when you want to use the existing bounding box and reduce the CPU cost of setting the triangles.</param>\n      <param name=\"baseVertex\">Optional vertex offset that is added to all triangle vertex indices.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.SetTriangles(System.Collections.Generic.List`1&lt;System.Int32&gt;,System.Int32)\">\n      <summary>\n        <para>Sets the triangle list for the sub-mesh.</para>\n      </summary>\n      <param name=\"triangles\">The list of indices that define the triangles.</param>\n      <param name=\"submesh\">The sub-mesh to modify.</param>\n      <param name=\"calculateBounds\">Calculate the bounding box of the Mesh after setting the triangles. This is done by default.\nUse false when you want to use the existing bounding box and reduce the CPU cost of setting the triangles.</param>\n      <param name=\"baseVertex\">Optional vertex offset that is added to all triangle vertex indices.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.SetUVs(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Vector2&gt;)\">\n      <summary>\n        <para>Sets the UVs of the Mesh.</para>\n      </summary>\n      <param name=\"channel\">The UV channel. Indices start at 0, which corresponds to uv. Note that 1 corresponds to uv2.</param>\n      <param name=\"uvs\">List of UVs to set for the given index.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.SetUVs(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;)\">\n      <summary>\n        <para>Sets the UVs of the Mesh.</para>\n      </summary>\n      <param name=\"channel\">The UV channel. Indices start at 0, which corresponds to uv. Note that 1 corresponds to uv2.</param>\n      <param name=\"uvs\">List of UVs to set for the given index.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.SetUVs(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Sets the UVs of the Mesh.</para>\n      </summary>\n      <param name=\"channel\">The UV channel. Indices start at 0, which corresponds to uv. Note that 1 corresponds to uv2.</param>\n      <param name=\"uvs\">List of UVs to set for the given index.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.SetVertices(System.Collections.Generic.List`1&lt;UnityEngine.Vector3&gt;)\">\n      <summary>\n        <para>Assigns a new vertex positions array.</para>\n      </summary>\n      <param name=\"inVertices\">Per-vertex position.</param>\n    </member>\n    <member name=\"M:UnityEngine.Mesh.UploadMeshData(System.Boolean)\">\n      <summary>\n        <para>Upload previously done Mesh modifications to the graphics API.</para>\n      </summary>\n      <param name=\"markNoLongerReadable\">Frees up system memory copy of mesh data when set to true.</param>\n    </member>\n    <member name=\"T:UnityEngine.MeshCollider\">\n      <summary>\n        <para>A mesh collider allows you to do between meshes and primitives.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MeshCollider.convex\">\n      <summary>\n        <para>Use a convex collider from the mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MeshCollider.cookingOptions\">\n      <summary>\n        <para>Options used to enable or disable certain features in mesh cooking.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MeshCollider.inflateMesh\">\n      <summary>\n        <para>Allow the physics engine to increase the volume of the input mesh in attempt to generate a valid convex mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MeshCollider.sharedMesh\">\n      <summary>\n        <para>The mesh object used for collision detection.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MeshCollider.skinWidth\">\n      <summary>\n        <para>Used when set to inflateMesh to determine how much inflation is acceptable.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MeshCollider.smoothSphereCollisions\">\n      <summary>\n        <para>Uses interpolated normals for sphere collisions instead of flat polygonal normals.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.MeshColliderCookingOptions\">\n      <summary>\n        <para>Cooking options that are available with MeshCollider.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MeshColliderCookingOptions.CookForFasterSimulation\">\n      <summary>\n        <para>Toggle between cooking for faster simulation or faster cooking time.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MeshColliderCookingOptions.EnableMeshCleaning\">\n      <summary>\n        <para>Toggle cleaning of the mesh.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MeshColliderCookingOptions.InflateConvexMesh\">\n      <summary>\n        <para>Allow the physics engine to increase the volume of the input mesh in attempt to generate a valid convex mesh.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MeshColliderCookingOptions.None\">\n      <summary>\n        <para>No optional cooking steps will be run.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MeshColliderCookingOptions.WeldColocatedVertices\">\n      <summary>\n        <para>Toggle the removal of equal vertices.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.MeshFilter\">\n      <summary>\n        <para>A class to access the Mesh of the.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MeshFilter.mesh\">\n      <summary>\n        <para>Returns the instantiated Mesh assigned to the mesh filter.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MeshFilter.sharedMesh\">\n      <summary>\n        <para>Returns the shared mesh of the mesh filter.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.MeshParticleEmitter\">\n      <summary>\n        <para>Class used to allow GameObject.AddComponent / GameObject.GetComponent to be used.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.MeshRenderer\">\n      <summary>\n        <para>Renders meshes inserted by the MeshFilter or TextMesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MeshRenderer.additionalVertexStreams\">\n      <summary>\n        <para>Vertex attributes in this mesh will override or add attributes of the primary mesh in the MeshRenderer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MeshRenderer.subMeshStartIndex\">\n      <summary>\n        <para>Index of the first sub-mesh to use from the Mesh associated with this MeshRenderer (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.MeshTopology\">\n      <summary>\n        <para>Topology of Mesh faces.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MeshTopology.Lines\">\n      <summary>\n        <para>Mesh is made from lines.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MeshTopology.LineStrip\">\n      <summary>\n        <para>Mesh is a line strip.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MeshTopology.Points\">\n      <summary>\n        <para>Mesh is made from points.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MeshTopology.Quads\">\n      <summary>\n        <para>Mesh is made from quads.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MeshTopology.Triangles\">\n      <summary>\n        <para>Mesh is made from triangles.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Microphone\">\n      <summary>\n        <para>Use this class to record to an AudioClip using a connected microphone.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Microphone.devices\">\n      <summary>\n        <para>A list of available microphone devices, identified by name.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Microphone.End(System.String)\">\n      <summary>\n        <para>Stops recording.</para>\n      </summary>\n      <param name=\"deviceName\">The name of the device.</param>\n    </member>\n    <member name=\"M:UnityEngine.Microphone.GetDeviceCaps(System.String,System.Int32&amp;,System.Int32&amp;)\">\n      <summary>\n        <para>Get the frequency capabilities of a device.</para>\n      </summary>\n      <param name=\"deviceName\">The name of the device.</param>\n      <param name=\"minFreq\">Returns the minimum sampling frequency of the device.</param>\n      <param name=\"maxFreq\">Returns the maximum sampling frequency of the device.</param>\n    </member>\n    <member name=\"M:UnityEngine.Microphone.GetPosition(System.String)\">\n      <summary>\n        <para>Get the position in samples of the recording.</para>\n      </summary>\n      <param name=\"deviceName\">The name of the device.</param>\n    </member>\n    <member name=\"M:UnityEngine.Microphone.IsRecording(System.String)\">\n      <summary>\n        <para>Query if a device is currently recording.</para>\n      </summary>\n      <param name=\"deviceName\">The name of the device.</param>\n    </member>\n    <member name=\"M:UnityEngine.Microphone.Start(System.String,System.Boolean,System.Int32,System.Int32)\">\n      <summary>\n        <para>Start Recording with device.</para>\n      </summary>\n      <param name=\"deviceName\">The name of the device.</param>\n      <param name=\"loop\">Indicates whether the recording should continue recording if lengthSec is reached, and wrap around and record from the beginning of the AudioClip.</param>\n      <param name=\"lengthSec\">Is the length of the AudioClip produced by the recording.</param>\n      <param name=\"frequency\">The sample rate of the AudioClip produced by the recording.</param>\n      <returns>\n        <para>The function returns null if the recording fails to start.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.MixedLightingMode\">\n      <summary>\n        <para>Enum describing what lighting mode to be used with Mixed lights.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MixedLightingMode.IndirectOnly\">\n      <summary>\n        <para>Mixed lights provide realtime direct lighting while indirect light is baked into lightmaps and light probes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MixedLightingMode.Shadowmask\">\n      <summary>\n        <para>Mixed lights provide realtime direct lighting. Indirect lighting gets baked into lightmaps and light probes. Shadowmasks and light probe occlusion get generated for baked shadows. The Shadowmask Mode used at run time can be set in the Quality Settings panel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MixedLightingMode.Subtractive\">\n      <summary>\n        <para>Mixed lights provide baked direct and indirect lighting for static objects. Dynamic objects receive realtime direct lighting and cast shadows on static objects using the main directional light in the scene.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.MonoBehaviour\">\n      <summary>\n        <para>MonoBehaviour is the base class from which every Unity script derives.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.MonoBehaviour.print(System.Object)\">\n      <summary>\n        <para>Logs message to the Unity Console (identical to Debug.Log).</para>\n      </summary>\n      <param name=\"message\"></param>\n    </member>\n    <member name=\"P:UnityEngine.MonoBehaviour.runInEditMode\">\n      <summary>\n        <para>Allow a specific instance of a MonoBehaviour to run in edit mode (only available in the editor).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MonoBehaviour.useGUILayout\">\n      <summary>\n        <para>Disabling this lets you skip the GUI layout phase.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.MonoBehaviour.CancelInvoke\">\n      <summary>\n        <para>Cancels all Invoke calls on this MonoBehaviour.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.MonoBehaviour.CancelInvoke(System.String)\">\n      <summary>\n        <para>Cancels all Invoke calls with name methodName on this behaviour.</para>\n      </summary>\n      <param name=\"methodName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.MonoBehaviour.Invoke(System.String,System.Single)\">\n      <summary>\n        <para>Invokes the method methodName in time seconds.</para>\n      </summary>\n      <param name=\"methodName\"></param>\n      <param name=\"time\"></param>\n    </member>\n    <member name=\"M:UnityEngine.MonoBehaviour.InvokeRepeating(System.String,System.Single,System.Single)\">\n      <summary>\n        <para>Invokes the method methodName in time seconds, then repeatedly every repeatRate seconds.</para>\n      </summary>\n      <param name=\"methodName\"></param>\n      <param name=\"time\"></param>\n      <param name=\"repeatRate\"></param>\n    </member>\n    <member name=\"M:UnityEngine.MonoBehaviour.IsInvoking(System.String)\">\n      <summary>\n        <para>Is any invoke on methodName pending?</para>\n      </summary>\n      <param name=\"methodName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.MonoBehaviour.IsInvoking\">\n      <summary>\n        <para>Is any invoke pending on this MonoBehaviour?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.MonoBehaviour.StartCoroutine(System.Collections.IEnumerator)\">\n      <summary>\n        <para>Starts a coroutine.</para>\n      </summary>\n      <param name=\"routine\"></param>\n    </member>\n    <member name=\"M:UnityEngine.MonoBehaviour.StartCoroutine(System.String,System.Object)\">\n      <summary>\n        <para>Starts a coroutine named methodName.</para>\n      </summary>\n      <param name=\"methodName\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.MonoBehaviour.StartCoroutine(System.String)\">\n      <summary>\n        <para>Starts a coroutine named methodName.</para>\n      </summary>\n      <param name=\"methodName\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.MonoBehaviour.StartCoroutine\">\n      <summary>\n        <para>Starts a Coroutine named coroutine.</para>\n      </summary>\n      <param name=\"coroutine\">Name of the created Coroutine.</param>\n    </member>\n    <member name=\"M:UnityEngine.MonoBehaviour.StopAllCoroutines\">\n      <summary>\n        <para>Stops all coroutines running on this behaviour.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.MonoBehaviour.StopCoroutine(System.String)\">\n      <summary>\n        <para>Stops the first coroutine named methodName, or the coroutine stored in routine running on this behaviour.</para>\n      </summary>\n      <param name=\"methodName\">Name of coroutine.</param>\n      <param name=\"routine\">Name of the function in code, including coroutines.</param>\n    </member>\n    <member name=\"M:UnityEngine.MonoBehaviour.StopCoroutine(System.Collections.IEnumerator)\">\n      <summary>\n        <para>Stops the first coroutine named methodName, or the coroutine stored in routine running on this behaviour.</para>\n      </summary>\n      <param name=\"methodName\">Name of coroutine.</param>\n      <param name=\"routine\">Name of the function in code, including coroutines.</param>\n    </member>\n    <member name=\"M:UnityEngine.MonoBehaviour.StopCoroutine(UnityEngine.Coroutine)\">\n      <summary>\n        <para>Stops the first coroutine named methodName, or the coroutine stored in routine running on this behaviour.</para>\n      </summary>\n      <param name=\"methodName\">Name of coroutine.</param>\n      <param name=\"routine\">Name of the function in code, including coroutines.</param>\n    </member>\n    <member name=\"T:UnityEngine.Motion\">\n      <summary>\n        <para>Base class for AnimationClips and BlendTrees.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.MotionVectorGenerationMode\">\n      <summary>\n        <para>The type of motion vectors that should be generated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MotionVectorGenerationMode.Camera\">\n      <summary>\n        <para>Use only camera movement to track motion.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MotionVectorGenerationMode.ForceNoMotion\">\n      <summary>\n        <para>Do not track motion. Motion vectors will be 0.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.MotionVectorGenerationMode.Object\">\n      <summary>\n        <para>Use a specific pass (if required) to track motion.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.MovieTexture\">\n      <summary>\n        <para>MovieTexture has been deprecated. Refer to the new movie playback solution VideoPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MovieTexture.audioClip\">\n      <summary>\n        <para>MovieTexture has been deprecated. Refer to the new movie playback solution VideoPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MovieTexture.duration\">\n      <summary>\n        <para>MovieTexture has been deprecated. Refer to the new movie playback solution VideoPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MovieTexture.isPlaying\">\n      <summary>\n        <para>MovieTexture has been deprecated. Refer to the new movie playback solution VideoPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MovieTexture.isReadyToPlay\">\n      <summary>\n        <para>MovieTexture has been deprecated. Refer to the new movie playback solution VideoPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.MovieTexture.loop\">\n      <summary>\n        <para>MovieTexture has been deprecated. Refer to the new movie playback solution VideoPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.MovieTexture.Pause\">\n      <summary>\n        <para>MovieTexture has been deprecated. Refer to the new movie playback solution VideoPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.MovieTexture.Play\">\n      <summary>\n        <para>MovieTexture has been deprecated. Refer to the new movie playback solution VideoPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.MovieTexture.Stop\">\n      <summary>\n        <para>MovieTexture has been deprecated. Refer to the new movie playback solution VideoPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.MultilineAttribute\">\n      <summary>\n        <para>Attribute to make a string be edited with a multi-line textfield.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.MultilineAttribute.#ctor\">\n      <summary>\n        <para>Attribute used to make a string value be shown in a multiline textarea.</para>\n      </summary>\n      <param name=\"lines\">How many lines of text to make room for. Default is 3.</param>\n    </member>\n    <member name=\"M:UnityEngine.MultilineAttribute.#ctor(System.Int32)\">\n      <summary>\n        <para>Attribute used to make a string value be shown in a multiline textarea.</para>\n      </summary>\n      <param name=\"lines\">How many lines of text to make room for. Default is 3.</param>\n    </member>\n    <member name=\"T:UnityEngine.Network\">\n      <summary>\n        <para>The network class is at the heart of the network implementation and provides the core functions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.connections\">\n      <summary>\n        <para>All connected players.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.connectionTesterIP\">\n      <summary>\n        <para>The IP address of the connection tester used in Network.TestConnection.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.connectionTesterPort\">\n      <summary>\n        <para>The port of the connection tester used in Network.TestConnection.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.incomingPassword\">\n      <summary>\n        <para>Set the password for the server (for incoming connections).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.isClient\">\n      <summary>\n        <para>Returns true if your peer type is client.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.isMessageQueueRunning\">\n      <summary>\n        <para>Enable or disable the processing of network messages.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.isServer\">\n      <summary>\n        <para>Returns true if your peer type is server.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.logLevel\">\n      <summary>\n        <para>Set the log level for network messages (default is Off).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.maxConnections\">\n      <summary>\n        <para>Set the maximum amount of connections/players allowed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.minimumAllocatableViewIDs\">\n      <summary>\n        <para>Get or set the minimum number of ViewID numbers in the ViewID pool given to clients by the server.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.natFacilitatorIP\">\n      <summary>\n        <para>The IP address of the NAT punchthrough facilitator.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.natFacilitatorPort\">\n      <summary>\n        <para>The port of the NAT punchthrough facilitator.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.peerType\">\n      <summary>\n        <para>The status of the peer type, i.e. if it is disconnected, connecting, server or client.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.player\">\n      <summary>\n        <para>Get the local NetworkPlayer instance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.proxyIP\">\n      <summary>\n        <para>The IP address of the proxy server.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.proxyPassword\">\n      <summary>\n        <para>Set the proxy server password.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.proxyPort\">\n      <summary>\n        <para>The port of the proxy server.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.sendRate\">\n      <summary>\n        <para>The default send rate of network updates for all Network Views.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.time\">\n      <summary>\n        <para>Get the current network time (seconds).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Network.useProxy\">\n      <summary>\n        <para>Indicate if proxy support is needed, in which case traffic is relayed through the proxy server.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Network.AllocateViewID\">\n      <summary>\n        <para>Query for the next available network view ID number and allocate it (reserve).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Network.CloseConnection(UnityEngine.NetworkPlayer,System.Boolean)\">\n      <summary>\n        <para>Close the connection to another system.</para>\n      </summary>\n      <param name=\"target\"></param>\n      <param name=\"sendDisconnectionNotification\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.Connect(System.String,System.Int32)\">\n      <summary>\n        <para>Connect to the specified host (ip or domain name) and server port.</para>\n      </summary>\n      <param name=\"IP\"></param>\n      <param name=\"remotePort\"></param>\n      <param name=\"password\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.Connect(System.String,System.Int32,System.String)\">\n      <summary>\n        <para>Connect to the specified host (ip or domain name) and server port.</para>\n      </summary>\n      <param name=\"IP\"></param>\n      <param name=\"remotePort\"></param>\n      <param name=\"password\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.Connect(System.String[],System.Int32)\">\n      <summary>\n        <para>This function is exactly like Network.Connect but can accept an array of IP addresses.</para>\n      </summary>\n      <param name=\"IPs\"></param>\n      <param name=\"remotePort\"></param>\n      <param name=\"password\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.Connect(System.String[],System.Int32,System.String)\">\n      <summary>\n        <para>This function is exactly like Network.Connect but can accept an array of IP addresses.</para>\n      </summary>\n      <param name=\"IPs\"></param>\n      <param name=\"remotePort\"></param>\n      <param name=\"password\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.Connect(System.String)\">\n      <summary>\n        <para>Connect to a server GUID. NAT punchthrough can only be performed this way.</para>\n      </summary>\n      <param name=\"GUID\"></param>\n      <param name=\"password\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.Connect(System.String,System.String)\">\n      <summary>\n        <para>Connect to a server GUID. NAT punchthrough can only be performed this way.</para>\n      </summary>\n      <param name=\"GUID\"></param>\n      <param name=\"password\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.Connect(UnityEngine.HostData)\">\n      <summary>\n        <para>Connect to the host represented by a HostData structure returned by the Master Server.</para>\n      </summary>\n      <param name=\"hostData\"></param>\n      <param name=\"password\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.Connect(UnityEngine.HostData,System.String)\">\n      <summary>\n        <para>Connect to the host represented by a HostData structure returned by the Master Server.</para>\n      </summary>\n      <param name=\"hostData\"></param>\n      <param name=\"password\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.Destroy(UnityEngine.NetworkViewID)\">\n      <summary>\n        <para>Destroy the object associated with this view ID across the network.</para>\n      </summary>\n      <param name=\"viewID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.Destroy(UnityEngine.GameObject)\">\n      <summary>\n        <para>Destroy the object across the network.</para>\n      </summary>\n      <param name=\"gameObject\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.DestroyPlayerObjects(UnityEngine.NetworkPlayer)\">\n      <summary>\n        <para>Destroy all the objects based on view IDs belonging to this player.</para>\n      </summary>\n      <param name=\"playerID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.Disconnect()\">\n      <summary>\n        <para>Close all open connections and shuts down the network interface.</para>\n      </summary>\n      <param name=\"timeout\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.Disconnect(System.Int32)\">\n      <summary>\n        <para>Close all open connections and shuts down the network interface.</para>\n      </summary>\n      <param name=\"timeout\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.GetAveragePing(UnityEngine.NetworkPlayer)\">\n      <summary>\n        <para>The last average ping time to the given player in milliseconds.</para>\n      </summary>\n      <param name=\"player\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.GetLastPing(UnityEngine.NetworkPlayer)\">\n      <summary>\n        <para>The last ping time to the given player in milliseconds.</para>\n      </summary>\n      <param name=\"player\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.HavePublicAddress\">\n      <summary>\n        <para>Check if this machine has a public IP address.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Network.InitializeSecurity\">\n      <summary>\n        <para>Initializes security layer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Network.InitializeServer(System.Int32,System.Int32)\">\n      <summary>\n        <para>Initialize the server.</para>\n      </summary>\n      <param name=\"connections\"></param>\n      <param name=\"listenPort\"></param>\n      <param name=\"useNat\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.InitializeServer(System.Int32,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Initialize the server.</para>\n      </summary>\n      <param name=\"connections\"></param>\n      <param name=\"listenPort\"></param>\n      <param name=\"useNat\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.Instantiate(UnityEngine.Object,UnityEngine.Vector3,UnityEngine.Quaternion,System.Int32)\">\n      <summary>\n        <para>Network instantiate a prefab.</para>\n      </summary>\n      <param name=\"prefab\"></param>\n      <param name=\"position\"></param>\n      <param name=\"rotation\"></param>\n      <param name=\"group\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.RemoveRPCs(UnityEngine.NetworkPlayer)\">\n      <summary>\n        <para>Remove all RPC functions which belong to this player ID.</para>\n      </summary>\n      <param name=\"playerID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.RemoveRPCs(UnityEngine.NetworkPlayer,System.Int32)\">\n      <summary>\n        <para>Remove all RPC functions which belong to this player ID and were sent based on the given group.</para>\n      </summary>\n      <param name=\"playerID\"></param>\n      <param name=\"group\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.RemoveRPCs(UnityEngine.NetworkViewID)\">\n      <summary>\n        <para>Remove the RPC function calls accociated with this view ID number.</para>\n      </summary>\n      <param name=\"viewID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.RemoveRPCsInGroup(System.Int32)\">\n      <summary>\n        <para>Remove all RPC functions which belong to given group number.</para>\n      </summary>\n      <param name=\"group\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.SetLevelPrefix(System.Int32)\">\n      <summary>\n        <para>Set the level prefix which will then be prefixed to all network ViewID numbers.</para>\n      </summary>\n      <param name=\"prefix\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.SetReceivingEnabled(UnityEngine.NetworkPlayer,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Enable or disables the reception of messages in a specific group number from a specific player.</para>\n      </summary>\n      <param name=\"player\"></param>\n      <param name=\"group\"></param>\n      <param name=\"enabled\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.SetSendingEnabled(System.Int32,System.Boolean)\">\n      <summary>\n        <para>Enables or disables transmission of messages and RPC calls on a specific network group number.</para>\n      </summary>\n      <param name=\"group\"></param>\n      <param name=\"enabled\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.SetSendingEnabled(UnityEngine.NetworkPlayer,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Enable or disable transmission of messages and RPC calls based on target network player as well as the network group.</para>\n      </summary>\n      <param name=\"player\"></param>\n      <param name=\"group\"></param>\n      <param name=\"enabled\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.TestConnection()\">\n      <summary>\n        <para>Test this machines network connection.</para>\n      </summary>\n      <param name=\"forceTest\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.TestConnection(System.Boolean)\">\n      <summary>\n        <para>Test this machines network connection.</para>\n      </summary>\n      <param name=\"forceTest\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.TestConnectionNAT()\">\n      <summary>\n        <para>Test the connection specifically for NAT punch-through connectivity.</para>\n      </summary>\n      <param name=\"forceTest\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Network.TestConnectionNAT(System.Boolean)\">\n      <summary>\n        <para>Test the connection specifically for NAT punch-through connectivity.</para>\n      </summary>\n      <param name=\"forceTest\"></param>\n    </member>\n    <member name=\"T:UnityEngine.NetworkConnectionError\">\n      <summary>\n        <para>Possible status messages returned by Network.Connect and in MonoBehaviour.OnFailedToConnect|OnFailedToConnect in case the error was not immediate.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.NetworkDisconnection\">\n      <summary>\n        <para>The reason a disconnect event occured, like in MonoBehaviour.OnDisconnectedFromServer|OnDisconnectedFromServer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.CertificateHandler\">\n      <summary>\n        <para>Responsible for rejecting or accepting certificates received on https requests.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.CertificateHandler.Dispose\">\n      <summary>\n        <para>Signals that this [CertificateHandler] is no longer being used, and should clean up any resources it is using.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.CertificateHandler.ValidateCertificate(System.Byte[])\">\n      <summary>\n        <para>Callback, invoked for each leaf certificate sent by the remote server.</para>\n      </summary>\n      <param name=\"certificateData\">Certificate data in PEM or DER format. If certificate data contains multiple certificates, the first one is the leaf certificate.</param>\n      <returns>\n        <para>true if the certificate should be accepted, false if not.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Networking.ChannelQOS\">\n      <summary>\n        <para>Defines parameters of channels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ChannelQOS.BelongsToSharedOrderChannel\">\n      <summary>\n        <para>Returns true if the channel belongs to a shared group.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.ChannelQOS.#ctor(UnityEngine.Networking.QosType)\">\n      <summary>\n        <para>UnderlyingModel.MemDoc.MemDocModel.</para>\n      </summary>\n      <param name=\"value\">Requested type of quality of service (default Unreliable).</param>\n      <param name=\"channel\">Copy constructor.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.ChannelQOS.#ctor\">\n      <summary>\n        <para>UnderlyingModel.MemDoc.MemDocModel.</para>\n      </summary>\n      <param name=\"value\">Requested type of quality of service (default Unreliable).</param>\n      <param name=\"channel\">Copy constructor.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.ChannelQOS.#ctor(UnityEngine.Networking.ChannelQOS)\">\n      <summary>\n        <para>UnderlyingModel.MemDoc.MemDocModel.</para>\n      </summary>\n      <param name=\"value\">Requested type of quality of service (default Unreliable).</param>\n      <param name=\"channel\">Copy constructor.</param>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ChannelQOS.QOS\">\n      <summary>\n        <para>Channel quality of service.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.ConnectionAcksType\">\n      <summary>\n        <para>Defines size of the buffer holding reliable messages, before they will be acknowledged.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.ConnectionAcksType.Acks128\">\n      <summary>\n        <para>Ack buffer can hold 128 messages.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.ConnectionAcksType.Acks32\">\n      <summary>\n        <para>Ack buffer can hold 32 messages.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.ConnectionAcksType.Acks64\">\n      <summary>\n        <para>Ack buffer can hold 64 messages.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.ConnectionAcksType.Acks96\">\n      <summary>\n        <para>Ack buffer can hold 96 messages.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.ConnectionConfig\">\n      <summary>\n        <para>This class defines parameters of connection between two peers, this definition includes various timeouts and sizes as well as channel configuration.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.AckDelay\">\n      <summary>\n        <para>Defines the duration in milliseconds that the receiver waits for before it sends an acknowledgement back without waiting for any data payload. Default value = 33.\n\nNetwork clients that send data to a server may do so using many different quality of service (QOS) modes, some of which (reliable modes) expect the server to send back acknowledgement of receipt of data sent.\n\nServers must periodically acknowledge data packets received over channels with reliable QOS modes by sending packets containing acknowledgement data (also known as \"acks\") back to the client. If the server were to send an acknowledgement immediately after receiving each packet from the client there would be significant overhead (the acknowledgement is a 32 or 64 bit integer, which is very small compared to the whole size of the packet which also contains the IP and the UDP header). AckDelay allows the server some time to accumulate a list of received reliable data packets to acknowledge, and decreases traffic overhead by combining many acknowledgements into a single packet.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.AcksType\">\n      <summary>\n        <para>Determines the size of the buffer used to store reliable messages that are waiting for acknowledgement. It can be set to Acks32, Acks64, Acks96, or Acks128. Depends of this setting buffer can hold 32, 64, 96, or 128 messages. Default value = Ack32.\n\nMessages sent on reliable quality of service channels are stored in a special buffer while they wait for acknowledgement from the peer. This buffer can be either 32, 64, 96 or 128 positions long. It is recommended to begin with this value set to Ack32, which defines a buffer up to 32 messages in size. If you receive NoResources errors often when you send reliable messages, change this value to the next possible size.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.ConnectionConfig.AddChannel(UnityEngine.Networking.QosType)\">\n      <summary>\n        <para>Adds a new channel to the configuration and returns the unique id of that channel.\n\nChannels are logical delimiters of traffic between peers. Every time you send data to a peer, you should use two ids: connection id and channel id. Channels are not only logically separate traffic but could each be configured with a different quality of service (QOS). In the example below, a configuration is created containing two channels with Unreliable and Reliable QOS types. This configuration is then used for sending data.</para>\n      </summary>\n      <param name=\"value\">Add new channel to configuration.</param>\n      <returns>\n        <para>Channel id, user can use this id to send message via this channel.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.AllCostTimeout\">\n      <summary>\n        <para>Defines the timeout in milliseconds after which messages sent via the AllCost channel will be re-sent without waiting for acknowledgement. Default value = 20 ms.\n\nAllCost delivery quality of service (QOS) is a special QOS for delivering game-critical information, such as when the game starts, or when bullets are shot.\n\nDue to packets dropping, sometimes reliable messages cannot be delivered and need to be re-sent. Reliable messages will re-sent after RTT+Delta time, (RTT is round trip time) where RTT is a dynamic value and can reach couple of hundred milliseconds. For the AllCost delivery channel this timeout can be user-defined to force game critical information to be re-sent.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.BandwidthPeakFactor\">\n      <summary>\n        <para>Defines, when multiplied internally by InitialBandwidth, the maximum bandwidth that can be used under burst conditions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.ChannelCount\">\n      <summary>\n        <para>(Read Only) The number of channels in the current configuration.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.Channels\">\n      <summary>\n        <para>The list of channels belonging to the current configuration.\n\nNote: any ConnectionConfig passed as a parameter to a function in Unity Multiplayer is deep copied (that is, an entirely new copy is made, with no references to the original).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.ConnectTimeout\">\n      <summary>\n        <para>Timeout in ms which library will wait before it will send another connection request.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.ConnectionConfig.#ctor\">\n      <summary>\n        <para>Will create default connection config or will copy them from another.</para>\n      </summary>\n      <param name=\"config\">Connection config.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.ConnectionConfig.#ctor(UnityEngine.Networking.ConnectionConfig)\">\n      <summary>\n        <para>Will create default connection config or will copy them from another.</para>\n      </summary>\n      <param name=\"config\">Connection config.</param>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.DisconnectTimeout\">\n      <summary>\n        <para>Defines the timeout in milliseconds before a connection is considered to have been disconnected. Default value = 2000.\n\nUnity Multiplayer defines conditions under which a connection is considered as disconnected. Disconnection can happen for the following reasons:\n\n(1) A disconnection request was received.\n\n(2) The connection has not received any traffic at all for a time longer than DisconnectTimeout (Note that live connections receive regular keep-alive packets, so in this case \"no traffic\" means not only no user traffic but also absence of any keep-alive traffic as well).\n\n(3) Flow control determines that the time between sending packets is longer than DisconnectTimeout. Keep-alive packets are regularly delivered from peers and contain statistical information. This information includes values of packet loss due to network and peer overflow conditions. Setting NetworkDropThreshold and OverflowDropThreshold defines thresholds for flow control which can decrease packet frequency. When the time before sending the next packet is longer than DisconnectTimeout, the connection will be considered as disconnected and a disconnect event is received.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.FragmentSize\">\n      <summary>\n        <para>Defines the fragment size for fragmented messages (for QOS: ReliableFragmented and UnreliableFragmented). Default value = 500.\n\nUnder fragmented quality of service modes, the original message is split into fragments (up to 64) of up to FragmentSize bytes each. The fragment size depends on the frequency and size of reliable messages sent. Each reliable message potentially could be re-sent, so you need to choose a fragment size less than the remaining free space in a UDP packet after retransmitted reliable messages are added to the packet. For example, if Networking.ConnectionConfig.PacketSize is 1440 bytes, and a reliable message's average size is 200 bytes, it would be wise to set this parameter to 900 – 1000 bytes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.ConnectionConfig.GetChannel(System.Byte)\">\n      <summary>\n        <para>Return the QoS set for the given channel or throw an out of range exception.</para>\n      </summary>\n      <param name=\"idx\">Index in array.</param>\n      <returns>\n        <para>Channel QoS.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.ConnectionConfig.GetSharedOrderChannels(System.Byte)\">\n      <summary>\n        <para>Return IList&lt;byte&gt; of channel IDs which belong to the group.</para>\n      </summary>\n      <param name=\"idx\">Group id.</param>\n      <returns>\n        <para>List of channel IDs belonging to the group.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.InitialBandwidth\">\n      <summary>\n        <para>Gets or sets the bandwidth in bytes per second that can be used by Unity Multiplayer. No traffic over this limit is allowed. Unity Multiplayer may internally reduce the bandwidth it uses due to flow control. The default value is 1.5MB/sec (1,536,000 bytes per second). The default value is intentionally a large number to allow all traffic to pass without delay.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.ConnectionConfig.MakeChannelsSharedOrder(System.Collections.Generic.List`1&lt;System.Byte&gt;)\">\n      <summary>\n        <para>Allows you to combine multiple channels into a single group, so those channels share a common receiving order.</para>\n      </summary>\n      <param name=\"channelIndices\">The list of channel indices which should be grouped together. The list can include both reliable and unreliable channels.</param>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.MaxCombinedReliableMessageCount\">\n      <summary>\n        <para>Defines the maximum number of small reliable messages that can be included in one combined message. Default value = 10.\n\nSince each message sent to a server contains IP information and a UDP header, duplicating this information for every message sent can be inefficient in the case where there are many small messages being sent frequently. Many small reliable messages can be combined into one longer reliable message, saving space in the waiting buffer. Unity Multiplayer will automatically combine up to MaxCombinedReliableMessageCount small messages into one message. To qualify as a small message, the data payload of the message should not be greater than MaxCombinedReliableMessageSize.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.MaxCombinedReliableMessageSize\">\n      <summary>\n        <para>Defines the maximum size in bytes of a reliable message which is considered small enough to include in a combined message. Default value = 100.\n\nSince each message sent to a server contains IP information and a UDP header, duplicating this information for every message sent can be inefficient in the case where there are many small messages being sent frequently. Many small reliable messages can be combined into one longer reliable message, saving space in the waiting buffer. Unity Multiplayer will automatically combine up to MaxCombinedReliableMessageCount small messages into one message. To qualify as a small message, the data payload of the message should not be greater than MaxCombinedReliableMessageSize.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.MaxConnectionAttempt\">\n      <summary>\n        <para>Defines the maximum number of times Unity Multiplayer will attempt to send a connection request without receiving a response before it reports that it cannot establish a connection. Default value = 10.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.MaxSentMessageQueueSize\">\n      <summary>\n        <para>Defines maximum number of messages that can be held in the queue for sending. Default value = 128.\n\nThis buffer serves to smooth spikes in traffic and decreases network jitter. If the queue is full, a NoResources error will result from any calls to Send(). Setting this value greater than around 300 is likely to cause significant delaying of message delivering and can make game unplayable.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.MinUpdateTimeout\">\n      <summary>\n        <para>Defines minimum time in milliseconds between sending packets. This duration may be automatically increased if required by flow control. Default value = 10.\n\nWhen Send() is called, Unity Multiplayer won’t send the message immediately. Instead, once every SendTimeout milliseconds each connection is checked to see if it has something to send. While initial and minimal send timeouts can be set, these may be increased internally due to network conditions or buffer overflows.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.NetworkDropThreshold\">\n      <summary>\n        <para>Defines the percentage (from 0 to 100) of packets that need to be dropped due to network conditions before the SendUpdate timeout is automatically increased (and send rate is automatically decreased). Default value = 5.\n\nTo avoid receiver overflow, Unity Multiplayer supports flow control. Each ping packet sent between connected peers contains two values:\n\n(1) Packets lost due to network conditions.\n\n(2) Packets lost because the receiver does not have free space in its incoming buffers.\n\nLike OverflowDropThreshold, both values are reported in percent. Use NetworkDropThreshold and OverflowDropThreshold to set thresholds for these values. If a value reported in the ping packet exceeds the corresponding threshold, Unity Multiplayer increases the sending timeout for packets up to a maximum value of DisconnectTimeout.\n\nNote: wireless networks usually exhibit 5% or greater packet loss. For wireless networks it is advisable to use a NetworkDropThreshold of 40-50%.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.OverflowDropThreshold\">\n      <summary>\n        <para>Defines the percentage (from 0 to 100) of packets that need to be dropped due to lack of space in internal buffers before the SendUpdate timeout is automatically increased (and send rate is automatically decreased). Default value = 5.\n\nTo avoid receiver overflow, Unity Multiplayer supports flow control. Each ping packet sent between connected peers contains two values:\n\n(1) Packets lost due to network conditions.\n\n(2) Packets lost because the receiver does not have free space in its incoming buffers.\n\nLike NetworkDropThreshold, both values are reported in percent. Use NetworkDropThreshold and OverflowDropThreshold to set thresholds for these values. If a value reported in the ping packet exceeds the corresponding threshold, Unity Multiplayer increases the sending timeout for packets up to a maximum value of DisconnectTimeout.\n\nNote: wireless networks usually exhibit 5% or greater packet loss. For wireless networks it is advisable to use a NetworkDropThreshold of 40-50%.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.PacketSize\">\n      <summary>\n        <para>Defines maximum packet size (in bytes) (including payload and all header). Packet can contain multiple messages inside. Default value = 1500.\n\nNote that this default value is suitable for local testing only. Usually you should change this value; a recommended setting for PC or mobile is 1470. For games consoles this value should probably be less than ~1100. Wrong size definition can cause packet dropping.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.PingTimeout\">\n      <summary>\n        <para>Defines the duration in milliseconds between keep-alive packets, also known as pings. Default value = 500.\n\nThe ping frequency should be long enough to accumulate good statistics and short enough to compare with DisconnectTimeout. A good guideline is to have more than 3 pings per disconnect timeout, and more than 5 messages per ping. For example, with a DisconnectTimeout of 2000ms, a PingTimeout of 500ms works well.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.ResendTimeout\">\n      <summary>\n        <para>Defines the maximum wait time in milliseconds before the \"not acknowledged\" message is re-sent. Default value = 1200.\n\nIt does not make a lot of sense to wait for acknowledgement forever. This parameter sets an upper time limit at which point reliable messages are re-sent.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.SendDelay\">\n      <summary>\n        <para>Gets or sets the delay in milliseconds after a call to Send() before packets are sent. During this time, new messages may be combined in queued packets. Default value: 10ms.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.SharedOrderChannelCount\">\n      <summary>\n        <para>(Read Only) The number of shared order groups in current configuration.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.SSLCAFilePath\">\n      <summary>\n        <para>Defines the path to the file containing the certification authority (CA) certificate for WebSocket via SSL communication.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.SSLCertFilePath\">\n      <summary>\n        <para>Defines path to SSL certificate file, for WebSocket via SSL communication.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.SSLPrivateKeyFilePath\">\n      <summary>\n        <para>Defines the path to the file containing the private key for WebSocket via SSL communication.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.UdpSocketReceiveBufferMaxSize\">\n      <summary>\n        <para>Defines the size in bytes of the receiving buffer for UDP sockets. It is useful to set this parameter equal to the maximum size of a fragmented message. Default value is OS specific (usually 8kb).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.UsePlatformSpecificProtocols\">\n      <summary>\n        <para>When starting a server use protocols that make use of platform specific optimisations where appropriate rather than cross-platform protocols. (Sony consoles only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.ConnectionConfig.Validate(UnityEngine.Networking.ConnectionConfig)\">\n      <summary>\n        <para>Validate parameters of connection config. Will throw exceptions if parameters are incorrect.</para>\n      </summary>\n      <param name=\"config\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Networking.ConnectionConfig.WebSocketReceiveBufferMaxSize\">\n      <summary>\n        <para>WebSocket only. Defines the buffer size in bytes for received frames on a WebSocket host. If this value is 0 (the default), a 4 kilobyte buffer is used. Any other value results in a buffer of that size, in bytes.\n\nWebSocket message fragments are called \"frames\". A WebSocket host has a buffer to store incoming message frames. Therefore this buffer should be set to the largest legal frame size supported. If an incoming frame exceeds the buffer size, no error is reported. However, the buffer will invoke the user callback in order to create space for the overflow.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.ConnectionSimulatorConfig\">\n      <summary>\n        <para>Create configuration for network simulator; You can use this class in editor and developer build only.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.ConnectionSimulatorConfig.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,System.Single)\">\n      <summary>\n        <para>Will create object describing network simulation parameters.</para>\n      </summary>\n      <param name=\"outMinDelay\">Minimal simulation delay for outgoing traffic in ms.</param>\n      <param name=\"outAvgDelay\">Average simulation delay for outgoing traffic in ms.</param>\n      <param name=\"inMinDelay\">Minimal  simulation delay for incoming traffic in ms.</param>\n      <param name=\"inAvgDelay\">Average  simulation delay for incoming traffic in ms.</param>\n      <param name=\"packetLossPercentage\">Probability of packet loss  0 &lt;= p &lt;= 1.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.ConnectionSimulatorConfig.Dispose\">\n      <summary>\n        <para>Destructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.DownloadHandler\">\n      <summary>\n        <para>Manage and process HTTP response body data received from a remote server.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.DownloadHandler.data\">\n      <summary>\n        <para>Returns the raw bytes downloaded from the remote server, or null. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.DownloadHandler.isDone\">\n      <summary>\n        <para>Returns true if this DownloadHandler has been informed by its parent UnityWebRequest that all data has been received, and this DownloadHandler has completed any necessary post-download processing. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.DownloadHandler.text\">\n      <summary>\n        <para>Convenience property. Returns the bytes from data interpreted as a UTF8 string. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandler.CompleteContent\">\n      <summary>\n        <para>Callback, invoked when all data has been received from the remote server.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandler.Dispose\">\n      <summary>\n        <para>Signals that this [DownloadHandler] is no longer being used, and should clean up any resources it is using.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandler.GetData\">\n      <summary>\n        <para>Callback, invoked when the data property is accessed.</para>\n      </summary>\n      <returns>\n        <para>Byte array to return as the value of the data property.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandler.GetProgress\">\n      <summary>\n        <para>Callback, invoked when UnityWebRequest.downloadProgress is accessed.</para>\n      </summary>\n      <returns>\n        <para>The return value for UnityWebRequest.downloadProgress.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandler.GetText\">\n      <summary>\n        <para>Callback, invoked when the text property is accessed.</para>\n      </summary>\n      <returns>\n        <para>String to return as the return value of the text property.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandler.ReceiveContentLength(System.Int32)\">\n      <summary>\n        <para>Callback, invoked with a Content-Length header is received.</para>\n      </summary>\n      <param name=\"contentLength\">The value of the received Content-Length header.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandler.ReceiveData(System.Byte[],System.Int32)\">\n      <summary>\n        <para>Callback, invoked as data is received from the remote server.</para>\n      </summary>\n      <param name=\"data\">A buffer containing unprocessed data, received from the remote server.</param>\n      <param name=\"dataLength\">The number of bytes in data which are new.</param>\n      <returns>\n        <para>True if the download should continue, false to abort.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Networking.DownloadHandlerAssetBundle\">\n      <summary>\n        <para>A DownloadHandler subclass specialized for downloading AssetBundles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.DownloadHandlerAssetBundle.assetBundle\">\n      <summary>\n        <para>Returns the downloaded AssetBundle, or null. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerAssetBundle.#ctor(System.String,System.UInt32)\">\n      <summary>\n        <para>Standard constructor for non-cached asset bundles.</para>\n      </summary>\n      <param name=\"url\">The nominal (pre-redirect) URL at which the asset bundle is located.</param>\n      <param name=\"crc\">A checksum to compare to the downloaded data for integrity checking, or zero to skip integrity checking.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerAssetBundle.#ctor(System.String,System.UInt32,System.UInt32)\">\n      <summary>\n        <para>Simple versioned constructor. Caches downloaded asset bundles.</para>\n      </summary>\n      <param name=\"url\">The nominal (pre-redirect) URL at which the asset bundle is located.</param>\n      <param name=\"crc\">A checksum to compare to the downloaded data for integrity checking, or zero to skip integrity checking.</param>\n      <param name=\"version\">Current version number of the asset bundle at url. Increment to redownload.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerAssetBundle.#ctor(System.String,UnityEngine.Hash128,System.UInt32)\">\n      <summary>\n        <para>Versioned constructor. Caches downloaded asset bundles.</para>\n      </summary>\n      <param name=\"url\">The nominal (pre-redirect) URL at which the asset bundle is located.</param>\n      <param name=\"crc\">A checksum to compare to the downloaded data for integrity checking, or zero to skip integrity checking.</param>\n      <param name=\"hash\">A hash object defining the version of the asset bundle.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerAssetBundle.GetContent(UnityEngine.Networking.UnityWebRequest)\">\n      <summary>\n        <para>Returns the downloaded AssetBundle, or null.</para>\n      </summary>\n      <param name=\"www\">A finished UnityWebRequest object with DownloadHandlerAssetBundle attached.</param>\n      <returns>\n        <para>The same as DownloadHandlerAssetBundle.assetBundle</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerAssetBundle.GetData\">\n      <summary>\n        <para>Not implemented. Throws &lt;a href=\"http:msdn.microsoft.comen-uslibrarysystem.notsupportedexception\"&gt;NotSupportedException&lt;a&gt;.</para>\n      </summary>\n      <returns>\n        <para>Not implemented.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerAssetBundle.GetText\">\n      <summary>\n        <para>Not implemented. Throws &lt;a href=\"http:msdn.microsoft.comen-uslibrarysystem.notsupportedexception\"&gt;NotSupportedException&lt;a&gt;.</para>\n      </summary>\n      <returns>\n        <para>Not implemented.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Networking.DownloadHandlerAudioClip\">\n      <summary>\n        <para>A DownloadHandler subclass specialized for downloading audio data for use as AudioClip objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.DownloadHandlerAudioClip.audioClip\">\n      <summary>\n        <para>Returns the downloaded AudioClip, or null. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.DownloadHandlerAudioClip.compressed\">\n      <summary>\n        <para>Create AudioClip that is compressed in memory.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.DownloadHandlerAudioClip.streamAudio\">\n      <summary>\n        <para>Create streaming AudioClip.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerAudioClip.#ctor(System.String,UnityEngine.AudioType)\">\n      <summary>\n        <para>Constructor, specifies what kind of audio data is going to be downloaded.</para>\n      </summary>\n      <param name=\"url\">The nominal (pre-redirect) URL at which the audio clip is located.</param>\n      <param name=\"audioType\">Value to set for AudioClip type.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerAudioClip.GetContent(UnityEngine.Networking.UnityWebRequest)\">\n      <summary>\n        <para>Returns the downloaded AudioClip, or null.</para>\n      </summary>\n      <param name=\"www\">A finished UnityWebRequest object with DownloadHandlerAudioClip attached.</param>\n      <returns>\n        <para>The same as DownloadHandlerAudioClip.audioClip</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerAudioClip.GetData\">\n      <summary>\n        <para>Called by DownloadHandler.data. Returns a copy of the downloaded clip data as raw bytes.</para>\n      </summary>\n      <returns>\n        <para>A copy of the downloaded data.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Networking.DownloadHandlerBuffer\">\n      <summary>\n        <para>A general-purpose DownloadHandler implementation which stores received data in a native byte buffer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerBuffer.#ctor\">\n      <summary>\n        <para>Default constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerBuffer.GetContent(UnityEngine.Networking.UnityWebRequest)\">\n      <summary>\n        <para>Returns a copy of the native-memory buffer interpreted as a UTF8 string.</para>\n      </summary>\n      <param name=\"www\">A finished UnityWebRequest object with DownloadHandlerBuffer attached.</param>\n      <returns>\n        <para>The same as DownloadHandlerBuffer.text</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerBuffer.GetData\">\n      <summary>\n        <para>Returns a copy of the contents of the native-memory data buffer as a byte array.</para>\n      </summary>\n      <returns>\n        <para>A copy of the data which has been downloaded.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Networking.DownloadHandlerFile\">\n      <summary>\n        <para>Download handler for saving the downloaded data to file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.DownloadHandlerFile.removeFileOnAbort\">\n      <summary>\n        <para>Should the created file be removed if download is aborted (manually or due to an error). Default: false.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerFile.#ctor(System.String)\">\n      <summary>\n        <para>Creates a new instance and a file on disk where downloaded data will be written to.</para>\n      </summary>\n      <param name=\"path\">Path to file to be written.</param>\n    </member>\n    <member name=\"T:UnityEngine.Networking.DownloadHandlerMovieTexture\">\n      <summary>\n        <para>MovieTexture has been deprecated. Refer to the new movie playback solution VideoPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.DownloadHandlerMovieTexture.movieTexture\">\n      <summary>\n        <para>MovieTexture has been deprecated. Refer to the new movie playback solution VideoPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerMovieTexture.#ctor\">\n      <summary>\n        <para>MovieTexture has been deprecated. Refer to the new movie playback solution VideoPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerMovieTexture.GetContent(UnityEngine.Networking.UnityWebRequest)\">\n      <summary>\n        <para>MovieTexture has been deprecated. Refer to the new movie playback solution VideoPlayer.</para>\n      </summary>\n      <param name=\"uwr\">A UnityWebRequest with attached DownloadHandlerMovieTexture.</param>\n      <returns>\n        <para>A MovieTexture created out of downloaded bytes.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerMovieTexture.GetData\">\n      <summary>\n        <para>MovieTexture has been deprecated. Refer to the new movie playback solution VideoPlayer.</para>\n      </summary>\n      <returns>\n        <para>Raw downloaded bytes.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Networking.DownloadHandlerScript\">\n      <summary>\n        <para>An abstract base class for user-created scripting-driven DownloadHandler implementations.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerScript.#ctor\">\n      <summary>\n        <para>Create a DownloadHandlerScript which allocates new buffers when passing data to callbacks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerScript.#ctor(System.Byte[])\">\n      <summary>\n        <para>Create a DownloadHandlerScript which reuses a preallocated buffer to pass data to callbacks.</para>\n      </summary>\n      <param name=\"preallocatedBuffer\">A byte buffer into which data will be copied, for use by DownloadHandler.ReceiveData.</param>\n    </member>\n    <member name=\"T:UnityEngine.Networking.DownloadHandlerTexture\">\n      <summary>\n        <para>A DownloadHandler subclass specialized for downloading images for use as Texture objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.DownloadHandlerTexture.texture\">\n      <summary>\n        <para>Returns the downloaded Texture, or null. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerTexture.#ctor\">\n      <summary>\n        <para>Default constructor.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerTexture.#ctor(System.Boolean)\">\n      <summary>\n        <para>Constructor, allows TextureImporter.isReadable property to be set.</para>\n      </summary>\n      <param name=\"readable\">Value to set for TextureImporter.isReadable.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerTexture.GetContent(UnityEngine.Networking.UnityWebRequest)\">\n      <summary>\n        <para>Returns the downloaded Texture, or null.</para>\n      </summary>\n      <param name=\"www\">A finished UnityWebRequest object with DownloadHandlerTexture attached.</param>\n      <returns>\n        <para>The same as DownloadHandlerTexture.texture</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.DownloadHandlerTexture.GetData\">\n      <summary>\n        <para>Called by DownloadHandler.data. Returns a copy of the downloaded image data as raw bytes.</para>\n      </summary>\n      <returns>\n        <para>A copy of the downloaded data.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Networking.GlobalConfig\">\n      <summary>\n        <para>Defines global paramters for network library.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.GlobalConfig.ConnectionReadyForSend\">\n      <summary>\n        <para>Defines the callback delegate which you can use to get a notification when a connection is ready to send data.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.GlobalConfig.#ctor\">\n      <summary>\n        <para>Create new global config object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.GlobalConfig.MaxHosts\">\n      <summary>\n        <para>Defines how many hosts you can use. Default Value = 16. Max value = 128.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.GlobalConfig.MaxNetSimulatorTimeout\">\n      <summary>\n        <para>Deprecated. Defines maximum delay for network simulator. See Also: MaxTimerTimeout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.GlobalConfig.MaxPacketSize\">\n      <summary>\n        <para>Defines maximum possible packet size in bytes for all network connections.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.GlobalConfig.MaxTimerTimeout\">\n      <summary>\n        <para>Defines the maximum timeout in milliseconds for any configuration. The default value is 12 seconds (12000ms).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.GlobalConfig.MinNetSimulatorTimeout\">\n      <summary>\n        <para>Deprecated. Defines the minimal timeout for network simulator. You cannot set up any delay less than this value. See Also: MinTimerTimeout.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.GlobalConfig.MinTimerTimeout\">\n      <summary>\n        <para>Defines the minimum timeout in milliseconds recognised by the system. The default value is 1 ms.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.GlobalConfig.NetworkEventAvailable\">\n      <summary>\n        <para>Defines the callback delegate which you can use to get a notification when the host (defined by hostID) has a network event. The callback is called for all event types except Networking.NetworkEventType.Nothing.\n\nSee Also: Networking.NetworkEventType</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.GlobalConfig.ReactorMaximumReceivedMessages\">\n      <summary>\n        <para>This property determines the initial size of the queue that holds messages received by Unity Multiplayer before they are processed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.GlobalConfig.ReactorMaximumSentMessages\">\n      <summary>\n        <para>Defines the initial size of the send queue. Messages are placed in this queue ready to be sent in packets to their destination.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.GlobalConfig.ReactorModel\">\n      <summary>\n        <para>Defines reactor model for the network library.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.GlobalConfig.ThreadAwakeTimeout\">\n      <summary>\n        <para>Defines (1) for select reactor, minimum time period, when system will check if there are any messages for send (2) for fixrate reactor, minimum interval of time, when system will check for sending and receiving messages.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.GlobalConfig.ThreadPoolSize\">\n      <summary>\n        <para>Defines how many worker threads are available to handle incoming and outgoing messages.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.HostTopology\">\n      <summary>\n        <para>Class defines network topology for host (socket opened by Networking.NetworkTransport.AddHost function). This topology defines: (1) how many connection with default config will be supported and (2) what will be special connections (connections with config different from default).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.HostTopology.AddSpecialConnectionConfig(UnityEngine.Networking.ConnectionConfig)\">\n      <summary>\n        <para>Add special connection to topology (for example if you need to keep connection to standalone chat server you will need to use this function). Returned id should be use as one of parameters (with ip and port) to establish connection to this server.</para>\n      </summary>\n      <param name=\"config\">Connection config for special connection.</param>\n      <returns>\n        <para>Id of this connection. You should use this id when you call Networking.NetworkTransport.Connect.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.HostTopology.#ctor(UnityEngine.Networking.ConnectionConfig,System.Int32)\">\n      <summary>\n        <para>Create topology.</para>\n      </summary>\n      <param name=\"defaultConfig\">Default config.</param>\n      <param name=\"maxDefaultConnections\">Maximum default connections.</param>\n    </member>\n    <member name=\"P:UnityEngine.Networking.HostTopology.DefaultConfig\">\n      <summary>\n        <para>Defines config for default connections in the topology.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.HostTopology.GetSpecialConnectionConfig(System.Int32)\">\n      <summary>\n        <para>Return reference to special connection config. Parameters of this config can be changed.</para>\n      </summary>\n      <param name=\"i\">Config id.</param>\n      <returns>\n        <para>Connection config.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Networking.HostTopology.MaxDefaultConnections\">\n      <summary>\n        <para>Defines how many connection with default config be permitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.HostTopology.ReceivedMessagePoolSize\">\n      <summary>\n        <para>Defines the maximum number of messages that each host can hold in its pool of received messages. The default size is 128.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.HostTopology.SentMessagePoolSize\">\n      <summary>\n        <para>Defines the maximum number of messages that each host can hold in its pool of messages waiting to be sent. The default size is 128.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.HostTopology.SpecialConnectionConfigs\">\n      <summary>\n        <para>List of special connection configs.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.HostTopology.SpecialConnectionConfigsCount\">\n      <summary>\n        <para>Returns count of special connection added to topology.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Networking.IMultipartFormSection\">\n      <summary>\n        <para>An interface for composition of data into multipart forms.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.IMultipartFormSection.contentType\">\n      <summary>\n        <para>Returns the value to use in the Content-Type header for this form section.</para>\n      </summary>\n      <returns>\n        <para>The value to use in the Content-Type header, or null.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Networking.IMultipartFormSection.fileName\">\n      <summary>\n        <para>Returns a string denoting the desired filename of this section on the destination server.</para>\n      </summary>\n      <returns>\n        <para>The desired file name of this section, or null if this is not a file section.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Networking.IMultipartFormSection.sectionData\">\n      <summary>\n        <para>Returns the raw binary data contained in this section. Must not return null or a zero-length array.</para>\n      </summary>\n      <returns>\n        <para>The raw binary data contained in this section. Must not be null or empty.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Networking.IMultipartFormSection.sectionName\">\n      <summary>\n        <para>Returns the name of this section, if any.</para>\n      </summary>\n      <returns>\n        <para>The section's name, or null.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Networking.Match.MatchInfo\">\n      <summary>\n        <para>Details about a UNET MatchMaker match.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfo.accessToken\">\n      <summary>\n        <para>The binary access token this client uses to authenticate its session for future commands.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfo.address\">\n      <summary>\n        <para>IP address of the host of the match,.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfo.domain\">\n      <summary>\n        <para>The numeric domain for the match.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfo.networkId\">\n      <summary>\n        <para>The unique ID of this match.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfo.nodeId\">\n      <summary>\n        <para>NodeID for this member client in the match.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfo.port\">\n      <summary>\n        <para>Port of the host of the match.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfo.usingRelay\">\n      <summary>\n        <para>This flag indicates whether or not the match is using a Relay server.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.Match.MatchInfoSnapshot\">\n      <summary>\n        <para>A class describing the match information as a snapshot at the time the request was processed on the MatchMaker.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfoSnapshot.averageEloScore\">\n      <summary>\n        <para>The average Elo score of the match.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfoSnapshot.currentSize\">\n      <summary>\n        <para>The current number of players in the match.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfoSnapshot.directConnectInfos\">\n      <summary>\n        <para>The collection of direct connect info classes describing direct connection information supplied to the MatchMaker.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfoSnapshot.hostNodeId\">\n      <summary>\n        <para>The NodeID of the host for this match.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfoSnapshot.isPrivate\">\n      <summary>\n        <para>Describes if the match is private. Private matches are unlisted in ListMatch results.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfoSnapshot.matchAttributes\">\n      <summary>\n        <para>The collection of match attributes on this match.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfoSnapshot.maxSize\">\n      <summary>\n        <para>The maximum number of players this match can grow to.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfoSnapshot.name\">\n      <summary>\n        <para>The text name for this match.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfoSnapshot.networkId\">\n      <summary>\n        <para>The network ID for this match.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.Match.MatchInfoSnapshot.MatchInfoDirectConnectSnapshot\">\n      <summary>\n        <para>A class describing one member of a match and what direct connect information other clients have supplied.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfoSnapshot.MatchInfoDirectConnectSnapshot.hostPriority\">\n      <summary>\n        <para>The host priority for this direct connect info. Host priority describes the order in which this match member occurs in the list of clients attached to a match.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfoSnapshot.MatchInfoDirectConnectSnapshot.nodeId\">\n      <summary>\n        <para>NodeID of the match member this info refers to.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfoSnapshot.MatchInfoDirectConnectSnapshot.privateAddress\">\n      <summary>\n        <para>The private network address supplied for this direct connect info.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.MatchInfoSnapshot.MatchInfoDirectConnectSnapshot.publicAddress\">\n      <summary>\n        <para>The public network address supplied for this direct connect info.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.Match.NetworkMatch\">\n      <summary>\n        <para>A component for communicating with the Unity Multiplayer Matchmaking service.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Match.NetworkMatch.baseUri\">\n      <summary>\n        <para>The base URI of the MatchMaker that this NetworkMatch will communicate with.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.Match.NetworkMatch.BasicResponseDelegate\">\n      <summary>\n        <para>A delegate that can handle MatchMaker responses that return basic response types (generally only indicating success or failure and extended information if a failure did happen).</para>\n      </summary>\n      <param name=\"success\">Indicates if the request succeeded.</param>\n      <param name=\"extendedInfo\">A text description of the failure if success is false.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.Match.NetworkMatch.CreateMatch(System.String,System.UInt32,System.Boolean,System.String,System.String,System.String,System.Int32,System.Int32,UnityEngine.Networking.Match.NetworkMatch/DataResponseDelegate`1&lt;UnityEngine.Networking.Match.MatchInfo&gt;)\">\n      <summary>\n        <para>Use this function to create a new match. The client which calls this function becomes the host of the match.</para>\n      </summary>\n      <param name=\"matchName\">The text string describing the name for this match.</param>\n      <param name=\"matchSize\">When creating a match, the matchmaker will use either this value, or the maximum size you have configured online at https:multiplayer.unity3d.com, whichever is lower. This way you can specify different match sizes for a particular game, but still maintain an overall size limit in the online control panel.</param>\n      <param name=\"matchAdvertise\">A bool indicating if this match should be available in NetworkMatch.ListMatches results.</param>\n      <param name=\"matchPassword\">A text string indicating if this match is password protected. If it is, all clients trying to join this match must supply the correct match password.</param>\n      <param name=\"publicClientAddress\">The optional public client address. This value is stored on the matchmaker and given to clients listing matches. It is intended to be a network address for connecting to this client directly over the internet. This value will only be present if a publicly available address is known, and direct connection is supported by the matchmaker.</param>\n      <param name=\"privateClientAddress\">The optional private client address. This value is stored on the matchmaker and given to clients listing matches. It is intended to be a network address for connecting to this client directly on a local area network. This value will only be present if direct connection is supported by the matchmaker. This may be an empty string and it will not affect the ability to interface with matchmaker or use relay server.</param>\n      <param name=\"eloScoreForMatch\">The Elo score for the client hosting the match being created.  If this number is set on all clients to indicate relative skill level, this number is used to return matches ordered by those that are most suitable for play given a listing player's skill level. This may be 0 on all clients, which would disable any Elo calculations in the MatchMaker.</param>\n      <param name=\"requestDomain\">The request domain for this request. Only requests in the same domain can interface with each other. For example if a NetworkMatch.CreateMatch is made with domain 1, only ListMatches that also specify domain 1 will find that match. Use this value to silo different (possibly incompatible) client versions.</param>\n      <param name=\"callback\">The callback to be called when this function completes. This will be called regardless of whether the function succeeds or fails.</param>\n      <returns>\n        <para>This function is asynchronous and will complete at some point in the future, when the coroutine has finished communicating with the service backend.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Networking.Match.NetworkMatch.DataResponseDelegate_1\">\n      <summary>\n        <para>Response delegate containing basic information plus a data member. This is used on a subset of MatchMaker callbacks that require data passed in along with the success/failure information of the call itself.</para>\n      </summary>\n      <param name=\"success\">Indicates if the request succeeded.</param>\n      <param name=\"extendedInfo\">If success is false, this will contain a text string indicating the reason.</param>\n      <param name=\"responseData\">The generic passed in containing data required by the callback. This typically contains data returned from a call to the service backend.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.Match.NetworkMatch.DestroyMatch(UnityEngine.Networking.Types.NetworkID,System.Int32,UnityEngine.Networking.Match.NetworkMatch/BasicResponseDelegate)\">\n      <summary>\n        <para>This function is used to tell MatchMaker to destroy a match in progress, regardless of who is connected.</para>\n      </summary>\n      <param name=\"netId\">The NetworkID of the match to terminate.</param>\n      <param name=\"requestDomain\">The request domain for this request. Only requests in the same domain can interface with each other. For example if a NetworkMatch.CreateMatch is made with domain 1, only ListMatches that also specify domain 1 will find that match. Use this value to silo different (possibly incompatible) client versions.</param>\n      <param name=\"callback\">The callback to be called when the request completes.</param>\n      <returns>\n        <para>This function is asynchronous and will complete at some point in the future, when the coroutine has finished communicating with the service backend.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.Match.NetworkMatch.DropConnection(UnityEngine.Networking.Types.NetworkID,UnityEngine.Networking.Types.NodeID,System.Int32,UnityEngine.Networking.Match.NetworkMatch/BasicResponseDelegate)\">\n      <summary>\n        <para>A function to allow an individual client to be dropped from a match.</para>\n      </summary>\n      <param name=\"netId\">The NetworkID of the match the client to drop belongs to.</param>\n      <param name=\"dropNodeId\">The NodeID of the client to drop inside the specified match.</param>\n      <param name=\"requestDomain\">The request domain for this request. Only requests in the same domain can interface with each other. For example if a NetworkMatch.CreateMatch is made with domain 1, only ListMatches that also specify domain 1 will find that match. Use this value to silo different (possibly incompatible) client versions.</param>\n      <param name=\"callback\">The callback to invoke when the request completes.</param>\n      <returns>\n        <para>This function is asynchronous and will complete at some point in the future, when the coroutine has finished communicating with the service backend.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.Match.NetworkMatch.JoinMatch(UnityEngine.Networking.Types.NetworkID,System.String,System.String,System.String,System.Int32,System.Int32,UnityEngine.Networking.Match.NetworkMatch/DataResponseDelegate`1&lt;UnityEngine.Networking.Match.MatchInfo&gt;)\">\n      <summary>\n        <para>The function used to tell MatchMaker the current client wishes to join a specific match.</para>\n      </summary>\n      <param name=\"netId\">The NetworkID of the match to join. This is found through calling NetworkMatch.ListMatches and picking a result from the returned list of matches.</param>\n      <param name=\"matchPassword\">The password of the match. Leave empty if there is no password for the match, and supply the text string password if the match was configured to have one of the NetworkMatch.CreateMatch request.</param>\n      <param name=\"publicClientAddress\">The optional public client address. This value will be stored on the matchmaker and given to other clients listing matches. You should send this value if you want your players to be able to connect directly with each other over the internet. Alternatively you can pass an empty string and it will not affect the ability to interface with matchmaker or use relay server.</param>\n      <param name=\"privateClientAddress\">The optional private client address. This value will be stored on the matchmaker and given to other clients listing matches. You should send this value if you want your players to be able to connect directly with each other over a Local Area Network. Alternatively you can pass an empty string and it will not affect the ability to interface with matchmaker or use relay server.</param>\n      <param name=\"eloScoreForClient\">The Elo score for the client joining the match being created. If this number is set on all clients to indicate relative skill level, this number is used to return matches ordered by those that are most suitable for play given a listing player's skill level. This may be 0 on all clients, which would disable any Elo calculations in the MatchMaker.</param>\n      <param name=\"requestDomain\">The request domain for this request. Only requests in the same domain can interface with each other. For example if a NetworkMatch.CreateMatch is made with domain 1, only ListMatches that also specify domain 1 will find that match. Use this value to silo different (possibly incompatible) client versions.</param>\n      <param name=\"callback\">The callback to be invoked when this call completes.</param>\n      <returns>\n        <para>This function is asynchronous and will complete at some point in the future, when the coroutine has finished communicating with the service backend.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.Match.NetworkMatch.ListMatches(System.Int32,System.Int32,System.String,System.Boolean,System.Int32,System.Int32,UnityEngine.Networking.Match.NetworkMatch/DataResponseDelegate`1&lt;System.Collections.Generic.List`1&lt;UnityEngine.Networking.Match.MatchInfoSnapshot&gt;&gt;)\">\n      <summary>\n        <para>The function to list ongoing matches in the MatchMaker.</para>\n      </summary>\n      <param name=\"startPageNumber\">The current page to list in the return results.</param>\n      <param name=\"resultPageSize\">The size of the page requested. This determines the maximum number of matches contained in the list of matches passed into the callback.</param>\n      <param name=\"matchNameFilter\">The text string name filter. This is a partial wildcard search against match names that are currently active, and can be thought of as matching equivalent to *&lt;matchNameFilter&gt;* where any result containing the entire string supplied here will be in the result set.</param>\n      <param name=\"filterOutPrivateMatchesFromResults\">Boolean that indicates if the response should contain matches that are private (meaning matches that are password protected).</param>\n      <param name=\"eloScoreTarget\">The Elo score target for the match list results to be grouped around. If used, this should be set to the Elo level of the client listing the matches so results will more closely match that player's skill level. If not used this can be set to 0 along with all other Elo refereces in funcitons like NetworkMatch.CreateMatch or NetworkMatch.JoinMatch.</param>\n      <param name=\"requestDomain\">The request domain for this request. Only requests in the same domain can interface with each other. For example if a NetworkMatch.CreateMatch is made with domain 1, only ListMatches that also specify domain 1 will find that match. Use this value to silo different (possibly incompatible) client versions.</param>\n      <param name=\"callback\">The callback invoked when this call completes on the MatchMaker.</param>\n      <returns>\n        <para>This function is asynchronous and will complete at some point in the future, when the coroutine has finished communicating with the service backend.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.Match.NetworkMatch.SetMatchAttributes(UnityEngine.Networking.Types.NetworkID,System.Boolean,System.Int32,UnityEngine.Networking.Match.NetworkMatch/BasicResponseDelegate)\">\n      <summary>\n        <para>This function allows the caller to change attributes on a match in progress.</para>\n      </summary>\n      <param name=\"networkId\">The NetworkID of the match to set attributes on.</param>\n      <param name=\"isListed\">A bool indicating whether the match should be listed in NetworkMatch.ListMatches results after this call is complete.</param>\n      <param name=\"requestDomain\">The request domain for this request. Only requests in the same domain can interface with each other. For example if a NetworkMatch.CreateMatch is made with domain 1, only ListMatches that also specify domain 1 will find that match. Use this value to silo different (possibly incompatible) client versions.</param>\n      <param name=\"callback\">The callback invoked after the call has completed, indicating if it was successful or not.</param>\n      <returns>\n        <para>This function is asynchronous and will complete at some point in the future, when the coroutine has finished communicating with the service backend.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.Match.NetworkMatch.SetProgramAppID(UnityEngine.Networking.Types.AppID)\">\n      <summary>\n        <para>This method is deprecated. Please instead log in through the editor services panel and setup the project under the Unity Multiplayer section. This will populate the required infomation from the cloud site automatically.</para>\n      </summary>\n      <param name=\"programAppID\">Deprecated, see description.</param>\n    </member>\n    <member name=\"T:UnityEngine.Networking.MultipartFormDataSection\">\n      <summary>\n        <para>A helper object for form sections containing generic, non-file data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.MultipartFormDataSection.contentType\">\n      <summary>\n        <para>Returns the value to use in this section's Content-Type header.</para>\n      </summary>\n      <returns>\n        <para>The Content-Type header for this section, or null.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Networking.MultipartFormDataSection.fileName\">\n      <summary>\n        <para>Returns a string denoting the desired filename of this section on the destination server.</para>\n      </summary>\n      <returns>\n        <para>The desired file name of this section, or null if this is not a file section.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Networking.MultipartFormDataSection.sectionData\">\n      <summary>\n        <para>Returns the raw binary data contained in this section. Will not return null or a zero-length array.</para>\n      </summary>\n      <returns>\n        <para>The raw binary data contained in this section. Will not be null or empty.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Networking.MultipartFormDataSection.sectionName\">\n      <summary>\n        <para>Returns the name of this section, if any.</para>\n      </summary>\n      <returns>\n        <para>The section's name, or null.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.MultipartFormDataSection.#ctor(System.Byte[])\">\n      <summary>\n        <para>Raw data section, unnamed and no Content-Type header.</para>\n      </summary>\n      <param name=\"data\">Data payload of this section.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.MultipartFormDataSection.#ctor(System.String,System.Byte[])\">\n      <summary>\n        <para>Raw data section with a section name, no Content-Type header.</para>\n      </summary>\n      <param name=\"name\">Section name.</param>\n      <param name=\"data\">Data payload of this section.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.MultipartFormDataSection.#ctor(System.String,System.Byte[],System.String)\">\n      <summary>\n        <para>A raw data section with a section name and a Content-Type header.</para>\n      </summary>\n      <param name=\"name\">Section name.</param>\n      <param name=\"data\">Data payload of this section.</param>\n      <param name=\"contentType\">The value for this section's Content-Type header.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.MultipartFormDataSection.#ctor(System.String,System.String,System.Text.Encoding,System.String)\">\n      <summary>\n        <para>A named raw data section whose payload is derived from a string, with a Content-Type header.</para>\n      </summary>\n      <param name=\"name\">Section name.</param>\n      <param name=\"data\">String data payload for this section.</param>\n      <param name=\"contentType\">The value for this section's Content-Type header.</param>\n      <param name=\"encoding\">An encoding to marshal data to or from raw bytes.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.MultipartFormDataSection.#ctor(System.String,System.String,System.String)\">\n      <summary>\n        <para>A named raw data section whose payload is derived from a UTF8 string, with a Content-Type header.</para>\n      </summary>\n      <param name=\"name\">Section name.</param>\n      <param name=\"data\">String data payload for this section.</param>\n      <param name=\"contentType\">C.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.MultipartFormDataSection.#ctor(System.String,System.String)\">\n      <summary>\n        <para>A names raw data section whose payload is derived from a UTF8 string, with a default Content-Type.</para>\n      </summary>\n      <param name=\"name\">Section name.</param>\n      <param name=\"data\">String data payload for this section.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.MultipartFormDataSection.#ctor(System.String)\">\n      <summary>\n        <para>An anonymous raw data section whose payload is derived from a UTF8 string, with a default Content-Type.</para>\n      </summary>\n      <param name=\"data\">String data payload for this section.</param>\n    </member>\n    <member name=\"T:UnityEngine.Networking.MultipartFormFileSection\">\n      <summary>\n        <para>A helper object for adding file uploads to multipart forms via the [IMultipartFormSection] API.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.MultipartFormFileSection.contentType\">\n      <summary>\n        <para>Returns the value of the section's Content-Type header.</para>\n      </summary>\n      <returns>\n        <para>The Content-Type header for this section, or null.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Networking.MultipartFormFileSection.fileName\">\n      <summary>\n        <para>Returns a string denoting the desired filename of this section on the destination server.</para>\n      </summary>\n      <returns>\n        <para>The desired file name of this section, or null if this is not a file section.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Networking.MultipartFormFileSection.sectionData\">\n      <summary>\n        <para>Returns the raw binary data contained in this section. Will not return null or a zero-length array.</para>\n      </summary>\n      <returns>\n        <para>The raw binary data contained in this section. Will not be null or empty.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Networking.MultipartFormFileSection.sectionName\">\n      <summary>\n        <para>Returns the name of this section, if any.</para>\n      </summary>\n      <returns>\n        <para>The section's name, or null.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.MultipartFormFileSection.#ctor(System.String,System.Byte[],System.String,System.String)\">\n      <summary>\n        <para>Contains a named file section based on the raw bytes from data, with a custom Content-Type and file name.</para>\n      </summary>\n      <param name=\"name\">Name of this form section.</param>\n      <param name=\"data\">Raw contents of the file to upload.</param>\n      <param name=\"fileName\">Name of the file uploaded by this form section.</param>\n      <param name=\"contentType\">The value for this section's Content-Type header.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.MultipartFormFileSection.#ctor(System.Byte[])\">\n      <summary>\n        <para>Contains an anonymous file section based on the raw bytes from data, assigns a default Content-Type and file name.</para>\n      </summary>\n      <param name=\"data\">Raw contents of the file to upload.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.MultipartFormFileSection.#ctor(System.String,System.Byte[])\">\n      <summary>\n        <para>Contains an anonymous file section based on the raw bytes from data with a specific file name. Assigns a default Content-Type.</para>\n      </summary>\n      <param name=\"data\">Raw contents of the file to upload.</param>\n      <param name=\"fileName\">Name of the file uploaded by this form section.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.MultipartFormFileSection.#ctor(System.String,System.String,System.Text.Encoding,System.String)\">\n      <summary>\n        <para>Contains a named file section with data drawn from data, as marshaled by dataEncoding. Assigns a specific file name from fileName and a default Content-Type.</para>\n      </summary>\n      <param name=\"name\">Name of this form section.</param>\n      <param name=\"data\">Contents of the file to upload.</param>\n      <param name=\"dataEncoding\">A string encoding.</param>\n      <param name=\"fileName\">Name of the file uploaded by this form section.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.MultipartFormFileSection.#ctor(System.String,System.Text.Encoding,System.String)\">\n      <summary>\n        <para>An anonymous file section with data drawn from data, as marshaled by dataEncoding. Assigns a specific file name from fileName and a default Content-Type.</para>\n      </summary>\n      <param name=\"data\">Contents of the file to upload.</param>\n      <param name=\"dataEncoding\">A string encoding.</param>\n      <param name=\"fileName\">Name of the file uploaded by this form section.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.MultipartFormFileSection.#ctor(System.String,System.String)\">\n      <summary>\n        <para>An anonymous file section with data drawn from the UTF8 string data. Assigns a specific file name from fileName and a default Content-Type.</para>\n      </summary>\n      <param name=\"data\">Contents of the file to upload.</param>\n      <param name=\"fileName\">Name of the file uploaded by this form section.</param>\n    </member>\n    <member name=\"T:UnityEngine.Networking.NetworkError\">\n      <summary>\n        <para>Possible Networking.NetworkTransport errors.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.NetworkError.BadMessage\">\n      <summary>\n        <para>Not a data message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.NetworkError.CRCMismatch\">\n      <summary>\n        <para>The Networking.ConnectionConfig  does not match the other endpoint.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.NetworkError.DNSFailure\">\n      <summary>\n        <para>The address supplied to connect to was invalid or could not be resolved.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.NetworkError.MessageToLong\">\n      <summary>\n        <para>The message is too long to fit the buffer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.NetworkError.NoResources\">\n      <summary>\n        <para>Not enough resources are available to process this request.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.NetworkError.Ok\">\n      <summary>\n        <para>The operation completed successfully.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.NetworkError.Timeout\">\n      <summary>\n        <para>Connection timed out.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.NetworkError.UsageError\">\n      <summary>\n        <para>This error will occur if any function is called with inappropriate parameter values.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.NetworkError.VersionMismatch\">\n      <summary>\n        <para>The protocol versions are not compatible. Check your library versions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.NetworkError.WrongChannel\">\n      <summary>\n        <para>The specified channel doesn't exist.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.NetworkError.WrongConnection\">\n      <summary>\n        <para>The specified connectionId doesn't exist.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.NetworkError.WrongHost\">\n      <summary>\n        <para>The specified host not available.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.NetworkError.WrongOperation\">\n      <summary>\n        <para>Operation is not supported.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.NetworkEventType\">\n      <summary>\n        <para>Event that is returned when calling the Networking.NetworkTransport.Receive and Networking.NetworkTransport.ReceiveFromHost functions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.NetworkEventType.BroadcastEvent\">\n      <summary>\n        <para>Broadcast discovery event received.\nTo obtain sender connection info and possible complimentary message from them, call Networking.NetworkTransport.GetBroadcastConnectionInfo() and Networking.NetworkTransport.GetBroadcastConnectionMessage() functions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.NetworkEventType.ConnectEvent\">\n      <summary>\n        <para>Connection event received. Indicating that a new connection was established.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.NetworkEventType.DataEvent\">\n      <summary>\n        <para>Data event received. Indicating that data was received.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.NetworkEventType.DisconnectEvent\">\n      <summary>\n        <para>Disconnection event received.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.NetworkEventType.Nothing\">\n      <summary>\n        <para>No new event was received.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.NetworkTransport\">\n      <summary>\n        <para>Transport Layer API.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.AddHost(UnityEngine.Networking.HostTopology,System.Int32,System.String)\">\n      <summary>\n        <para>Creates a host based on Networking.HostTopology.</para>\n      </summary>\n      <param name=\"topology\">The Networking.HostTopology associated with the host.</param>\n      <param name=\"port\">Port to bind to (when 0 is selected, the OS will choose a port at random).</param>\n      <param name=\"ip\">IP address to bind to.</param>\n      <returns>\n        <para>Returns the ID of the host that was created.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.AddHostWithSimulator(UnityEngine.Networking.HostTopology,System.Int32,System.Int32,System.Int32,System.String)\">\n      <summary>\n        <para>Create a host and configure them to simulate Internet latency (works on Editor and development build only).</para>\n      </summary>\n      <param name=\"topology\">The Networking.HostTopology associated with the host.</param>\n      <param name=\"minTimeout\">Minimum simulated delay in milliseconds.</param>\n      <param name=\"maxTimeout\">Maximum simulated delay in milliseconds.</param>\n      <param name=\"port\">Port to bind to (when 0 is selected, the OS will choose a port at random).</param>\n      <param name=\"ip\">IP address to bind to.</param>\n      <returns>\n        <para>Returns host ID just created.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.AddWebsocketHost(UnityEngine.Networking.HostTopology,System.Int32)\">\n      <summary>\n        <para>Created web socket host.</para>\n      </summary>\n      <param name=\"port\">Port to bind to.</param>\n      <param name=\"topology\">The Networking.HostTopology associated with the host.</param>\n      <param name=\"ip\">IP address to bind to.</param>\n      <returns>\n        <para>Web socket host id.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.AddWebsocketHost(UnityEngine.Networking.HostTopology,System.Int32,System.String)\">\n      <summary>\n        <para>Created web socket host.</para>\n      </summary>\n      <param name=\"port\">Port to bind to.</param>\n      <param name=\"topology\">The Networking.HostTopology associated with the host.</param>\n      <param name=\"ip\">IP address to bind to.</param>\n      <returns>\n        <para>Web socket host id.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.Connect(System.Int32,System.String,System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Tries to establish a connection to another peer.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection (retrieved when calling Networking.NetworkTransport.AddHost).</param>\n      <param name=\"address\">IPv4 address of the other peer.</param>\n      <param name=\"port\">Port of the other peer.</param>\n      <param name=\"exceptionConnectionId\">Set to 0 in the case of a default connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <param name=\"exeptionConnectionId\"></param>\n      <returns>\n        <para>A unique connection identifier on success (otherwise zero).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.ConnectAsNetworkHost(System.Int32,System.String,System.Int32,UnityEngine.Networking.Types.NetworkID,UnityEngine.Networking.Types.SourceID,UnityEngine.Networking.Types.NodeID,System.Byte&amp;)\">\n      <summary>\n        <para>Create dedicated connection to Relay server.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection (Retrieved when calling Networking.NetworkTransport.AddHost).</param>\n      <param name=\"address\">IPv4 address of the relay.</param>\n      <param name=\"port\">Port of the relay.</param>\n      <param name=\"network\">GUID for the relay match, retrieved by calling Networking.Match.NetworkMatch.CreateMatch and using the Networking.Match.MatchInfo.networkId.</param>\n      <param name=\"source\">GUID for the source, can be retrieved by calling Utility.GetSourceID.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <param name=\"node\">Slot ID for this user, retrieved by calling Networking.Match.NetworkMatch.CreateMatch and using the Networking.Match.MatchInfo.nodeId.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.ConnectEndPoint(System.Int32,System.Net.EndPoint,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Try to establish connection to other peer, where the peer is specified using a C# System.EndPoint.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection (Retrieved when calling Networking.NetworkTransport.AddHost).</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <param name=\"xboxOneEndPoint\">A valid System.EndPoint.</param>\n      <param name=\"exceptionConnectionId\">Set to 0 in the case of a default connection.</param>\n      <param name=\"endPoint\"></param>\n      <returns>\n        <para>A unique connection identifier on success (otherwise zero).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.ConnectToNetworkPeer(System.Int32,System.String,System.Int32,System.Int32,System.Int32,UnityEngine.Networking.Types.NetworkID,UnityEngine.Networking.Types.SourceID,UnityEngine.Networking.Types.NodeID,System.Int32,System.Single,System.Byte&amp;)\">\n      <summary>\n        <para>Create a connection to another peer in the Relay group.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection (retrieved when calling Networking.NetworkTransport.AddHost).</param>\n      <param name=\"address\">IP address of the peer, retrieved by calling Networking.Match.NetworkMatch.JoinMatch and using the Networking.Match.MatchInfo.address.</param>\n      <param name=\"port\">Port of the peer, retrieved by calling Networking.Match.NetworkMatch.JoinMatch and using the Networking.Match.MatchInfo.port.</param>\n      <param name=\"exceptionConnectionId\">Set to 0 in the case of a default connection.</param>\n      <param name=\"relaySlotId\">ID of the remote peer in relay.</param>\n      <param name=\"network\">GUID for the relay match, retrieved by calling Networking.Match.NetworkMatch.JoinMatch and using the Networking.Match.MatchInfo.networkId.</param>\n      <param name=\"source\">GUID for the source, can be retrieved by calling Utility.GetSourceID.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <param name=\"node\">Slot ID reserved for the user, retrieved by calling Networking.Match.NetworkMatch.JoinMatch and using the Networking.Match.MatchInfo.nodeId.</param>\n      <param name=\"bucketSizeFactor\">Allowed peak bandwidth (peak bandwidth = factor*bytesPerSec, recommended value is 2.0) If data has not been sent for a long time, it is allowed to send more data, with factor 2 it is allowed send 2*bytesPerSec bytes per sec.</param>\n      <param name=\"bytesPerSec\">Average bandwidth (bandwidth will be throttled on this level).</param>\n      <returns>\n        <para>A unique connection identifier on success (otherwise zero).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.ConnectToNetworkPeer(System.Int32,System.String,System.Int32,System.Int32,System.Int32,UnityEngine.Networking.Types.NetworkID,UnityEngine.Networking.Types.SourceID,UnityEngine.Networking.Types.NodeID,System.Byte&amp;)\">\n      <summary>\n        <para>Create a connection to another peer in the Relay group.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection (retrieved when calling Networking.NetworkTransport.AddHost).</param>\n      <param name=\"address\">IP address of the peer, retrieved by calling Networking.Match.NetworkMatch.JoinMatch and using the Networking.Match.MatchInfo.address.</param>\n      <param name=\"port\">Port of the peer, retrieved by calling Networking.Match.NetworkMatch.JoinMatch and using the Networking.Match.MatchInfo.port.</param>\n      <param name=\"exceptionConnectionId\">Set to 0 in the case of a default connection.</param>\n      <param name=\"relaySlotId\">ID of the remote peer in relay.</param>\n      <param name=\"network\">GUID for the relay match, retrieved by calling Networking.Match.NetworkMatch.JoinMatch and using the Networking.Match.MatchInfo.networkId.</param>\n      <param name=\"source\">GUID for the source, can be retrieved by calling Utility.GetSourceID.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <param name=\"node\">Slot ID reserved for the user, retrieved by calling Networking.Match.NetworkMatch.JoinMatch and using the Networking.Match.MatchInfo.nodeId.</param>\n      <param name=\"bucketSizeFactor\">Allowed peak bandwidth (peak bandwidth = factor*bytesPerSec, recommended value is 2.0) If data has not been sent for a long time, it is allowed to send more data, with factor 2 it is allowed send 2*bytesPerSec bytes per sec.</param>\n      <param name=\"bytesPerSec\">Average bandwidth (bandwidth will be throttled on this level).</param>\n      <returns>\n        <para>A unique connection identifier on success (otherwise zero).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.ConnectWithSimulator(System.Int32,System.String,System.Int32,System.Int32,System.Byte&amp;,UnityEngine.Networking.ConnectionSimulatorConfig)\">\n      <summary>\n        <para>Connect with simulated latency.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection (Retrieved when calling Networking.NetworkTransport.AddHost).</param>\n      <param name=\"address\">IPv4 address of the other peer.</param>\n      <param name=\"port\">Port of the other peer.</param>\n      <param name=\"exeptionConnectionId\">Set to 0 in the case of a default connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <param name=\"conf\">A Networking.ConnectionSimulatorConfig defined for this connection.</param>\n      <returns>\n        <para>A unique connection identifier on success (otherwise zero).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.Disconnect(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Send a disconnect signal to the connected peer and close the connection. Poll Networking.NetworkTransport.Receive() to be notified that the connection is closed. This signal is only sent once (best effort delivery).  If this packet is dropped for some reason, the peer closes the connection by timeout.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">The connection ID of the connection you want to close.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.DisconnectNetworkHost(System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>This will disconnect the host and disband the group.\nDisconnectNetworkHost can only be called by the group owner on the relay server.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.FinishSendMulticast(System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Finalizes sending of a message to a group of connections. Only one multicast message at a time is allowed per host.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection (retrieved when calling Networking.NetworkTransport.AddHost).</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetAckBufferCount(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Returns size of reliable buffer.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>Size of ack buffer.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetAssetId(UnityEngine.GameObject)\">\n      <summary>\n        <para>The Unity Multiplayer spawning system uses assetIds to identify what remote objects to spawn. This function allows you to get the assetId for the prefab associated with an object.</para>\n      </summary>\n      <param name=\"go\">Target GameObject to get assetId for.</param>\n      <returns>\n        <para>The assetId of the game object's prefab.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetBroadcastConnectionInfo(System.Int32,System.String&amp;,System.Int32&amp;,System.Byte&amp;)\">\n      <summary>\n        <para>After Networking.NetworkTransport.Receive() returns Networking.NetworkEventType.BroadcastEvent, this function will return the connection information of the broadcast sender. This information can then be used for connecting to the broadcast sender.</para>\n      </summary>\n      <param name=\"hostId\">ID of the broadcast receiver.</param>\n      <param name=\"address\">IPv4 address of broadcast sender.</param>\n      <param name=\"port\">Port of broadcast sender.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetBroadcastConnectionMessage(System.Int32,System.Byte[],System.Int32,System.Int32&amp;,System.Byte&amp;)\">\n      <summary>\n        <para>After Networking.NetworkTransport.Receive() returns Networking.NetworkEventType.BroadcastEvent, this function returns a complimentary message from the broadcast sender.</para>\n      </summary>\n      <param name=\"hostId\">ID of broadcast receiver.</param>\n      <param name=\"buffer\">Message buffer provided by caller.</param>\n      <param name=\"bufferSize\">Buffer size.</param>\n      <param name=\"receivedSize\">Received size (if received size &gt; bufferSize, corresponding error will be set).</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetConnectionInfo(System.Int32,System.Int32,System.String&amp;,System.Int32&amp;,UnityEngine.Networking.Types.NetworkID&amp;,UnityEngine.Networking.Types.NodeID&amp;,System.Byte&amp;)\">\n      <summary>\n        <para>Returns the connection parameters for the specified connectionId. These parameters can be sent to other users to establish a direct connection to this peer. If this peer is connected to the host via Relay, the Relay-related parameters are set.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of connection.</param>\n      <param name=\"address\">IP address.</param>\n      <param name=\"port\">Port.</param>\n      <param name=\"network\">Relay network guid.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <param name=\"dstNode\">Destination slot id.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetCurrentIncomingMessageAmount\">\n      <summary>\n        <para>Returns the number of unread messages in the read-queue.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetCurrentOutgoingMessageAmount\">\n      <summary>\n        <para>Returns the total number of messages still in the write-queue.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetCurrentRTT(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Return the round trip time for the given connectionId.</para>\n      </summary>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <returns>\n        <para>Current round trip time in ms.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetHostPort(System.Int32)\">\n      <summary>\n        <para>Returns the port number assigned to the host.</para>\n      </summary>\n      <param name=\"hostId\">Host ID.</param>\n      <returns>\n        <para>The UDP port number, or -1 if an error occurred.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetIncomingMessageQueueSize(System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Returns the number of received messages waiting in the queue for processing.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this queue.</param>\n      <param name=\"error\">Error code. Cast this value to Networking.NetworkError for more information.</param>\n      <returns>\n        <para>The number of messages in the queue.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetIncomingPacketCount(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Returns how many packets have been received from start for connection.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>The absolute number of packets received since the connection was established.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetIncomingPacketCountForAllHosts\">\n      <summary>\n        <para>Returns how many packets have been received from start. (from Networking.NetworkTransport.Init call).</para>\n      </summary>\n      <returns>\n        <para>Packets count received from start for all hosts.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetIncomingPacketDropCountForAllHosts\">\n      <summary>\n        <para>How many packets have been dropped due lack space in incoming queue (absolute value, countinf from start).</para>\n      </summary>\n      <returns>\n        <para>Dropping packet count.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetIncomingPacketLossCount(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Returns how many incoming packets have been lost due transmitting (dropped by network).</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>The absolute number of packets that have been lost since the connection was established.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetMaxAllowedBandwidth(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Gets the currently-allowed network bandwidth in bytes per second. The value returned can vary because bandwidth can be throttled by flow control. If the bandwidth is throttled to zero, the connection is disconnected.ted.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>Currently-allowed bandwidth in bytes per second.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetNetIOTimeuS\">\n      <summary>\n        <para>Function returns time spent on network I/O operations in microseconds.</para>\n      </summary>\n      <returns>\n        <para>Time in micro seconds.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetNetworkLostPacketNum(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Return the total number of packets that has been lost.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetNetworkTimestamp\">\n      <summary>\n        <para>Get a network timestamp. Can be used in your messages to investigate network delays together with Networking.GetRemoteDelayTimeMS.</para>\n      </summary>\n      <returns>\n        <para>Timestamp.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetOutgoingFullBytesCount\">\n      <summary>\n        <para>Returns how much raw data (in bytes) have been sent from start for all hosts (from Networking.NetworkTransport.Init call).</para>\n      </summary>\n      <returns>\n        <para>Total data (user payload, protocol specific data, ip and udp headers) (in bytes) sent from start for all hosts.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetOutgoingFullBytesCountForConnection(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Returns how much raw data (in bytes) have been sent from start for connection (from call Networking.NetworkTransport.Connect for active connect or from connection request receiving for passive connect).</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>Total data (user payload, protocol specific data, ip and udp headers) (in bytes) sent from start for connection.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetOutgoingFullBytesCountForHost(System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Returns how much raw data (in bytes) have been sent from start for the host (from call Networking.NetworkTransport.AddHost).</para>\n      </summary>\n      <param name=\"hostId\">ID of the host.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>Total data (user payload, protocol specific data, ip and udp headers) (in bytes) sent from start for the host.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetOutgoingMessageCount\">\n      <summary>\n        <para>Returns how many messages have been sent from start (from Networking.NetworkTransport.Init call).</para>\n      </summary>\n      <returns>\n        <para>Messages count sent from start (from call Networking.NetworkTransport.Init) for all hosts.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetOutgoingMessageCountForConnection(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Returns how many packets have been sent from start for connection (from call Networking.NetworkTransport.Connect for active connect or from connection request receiving for passive connect).</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>Messages count sending from start for connection.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetOutgoingMessageCountForHost(System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Returns how many messages have been sent from start for host (from call Networking.NetworkTransport.AddHost).</para>\n      </summary>\n      <param name=\"hostId\">ID of the host.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>Messages count sending from start for the host.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetOutgoingMessageQueueSize(System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Returns the number of messages waiting in the outgoing message queue to be sent.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this queue.</param>\n      <param name=\"error\">Error code. Cast this value to Networking.NetworkError for more information.</param>\n      <returns>\n        <para>The number of messages waiting in the outgoing message queue to be sent.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetOutgoingPacketCount\">\n      <summary>\n        <para>Returns how many packets have been sent from start (from call Networking.NetworkTransport.Init) for all hosts.</para>\n      </summary>\n      <returns>\n        <para>Packets count sent from networking library start (from call Networking.NetworkTransport.Init)  for all hosts.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetOutgoingPacketCountForConnection(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Returns how many packets have been sent for connection from it start (from call Networking.NetworkTransport.Connect for active connect or from connection request receiving for passive connect).</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>Packets count sent for connection from it start.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetOutgoingPacketCountForHost(System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Returns how many packets have been sent for host from it start (from call Networking.NetworkTransport.AddHost).</para>\n      </summary>\n      <param name=\"hostId\">ID of the host.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>Count packets have been sent from host start.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetOutgoingPacketNetworkLossPercent(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Returns the value in percent of the number of sent packets that were dropped by the network and not received by the peer.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>The number of packets dropped by the network in the last ping timeout period expressed as an integer percentage from 0 to 100.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetOutgoingPacketOverflowLossPercent(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Returns the value in percent of the number of sent packets that were dropped by the peer.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>The number of packets dropped by the peer in the last ping timeout period expressed as an integer percentage from 0 to 100.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetOutgoingSystemBytesCount\">\n      <summary>\n        <para>Returns how much user payload and protocol system headers (in bytes)  have been sent from start (from Networking.NetworkTransport.Init call).</para>\n      </summary>\n      <returns>\n        <para>Total payload and protocol system headers (in bytes) sent from start for all hosts.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetOutgoingSystemBytesCountForConnection(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Returns how much payload and protocol system headers (in bytes) have been sent from start for connection (from call Networking.NetworkTransport.Connect for active connect or from connection request receiving for passive connect).</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>Total user payload and protocol system headers (in bytes) sent from start for connection.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetOutgoingSystemBytesCountForHost(System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Returns how much payload and protocol system headers (in bytes) have been sent from start for the host (from call Networking.NetworkTransport.AddHost).</para>\n      </summary>\n      <param name=\"hostId\">ID of the host.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>Total user payload and protocol system headers (in bytes) sent from start for the host.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetOutgoingUserBytesCount\">\n      <summary>\n        <para>Returns how much payload (user) bytes have been sent from start (from Networking.NetworkTransport.Init call).</para>\n      </summary>\n      <returns>\n        <para>Total payload (in bytes) sent from start for all hosts.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetOutgoingUserBytesCountForConnection(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Returns how much payload (user) bytes have been sent from start for connection (from call Networking.NetworkTransport.Connect for active connect or from connection request receiving for passive connect).</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>Total payload (in bytes) sent from start for connection.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetOutgoingUserBytesCountForHost(System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Returns how much payload (user) bytes have been sent from start for the host (from call Networking.NetworkTransport.AddHost).</para>\n      </summary>\n      <param name=\"hostId\">ID of the host.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>Total payload (in bytes) sent from start for the host.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetPacketReceivedRate(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Return the current receive rate in bytes per second.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetPacketSentRate(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Return the current send rate in bytes per second.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetRemoteDelayTimeMS(System.Int32,System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Returns the delay for the timestamp received.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"remoteTime\">Timestamp delivered from peer.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.GetRemotePacketReceivedRate(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Deprecated. Use Networking.NetworkTransport.GetNetworkLostPacketNum() instead.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.Init\">\n      <summary>\n        <para>Initializes the NetworkTransport. Should be called before any other operations on the NetworkTransport are done.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.IsBroadcastDiscoveryRunning\">\n      <summary>\n        <para>Check if the broadcast discovery sender is running.</para>\n      </summary>\n      <returns>\n        <para>True if it is running. False if it is not running.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Networking.NetworkTransport.IsStarted\">\n      <summary>\n        <para>Deprecated.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.NotifyWhenConnectionReadyForSend(System.Int32,System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>This method allows you to specify that notifications callbacks should be called when Unity's networking can send more messages than defined in notificationLevel.</para>\n      </summary>\n      <param name=\"hostId\">Host ID.</param>\n      <param name=\"connectionId\">Connection ID.</param>\n      <param name=\"notificationLevel\">Defines how many free slots in the incoming queue should be available before [GlobalConfig.ConnectionReadyForSend] callback is triggered.</param>\n      <param name=\"error\">Error code.</param>\n      <returns>\n        <para>Result, if false error will show error code.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.QueueMessageForSending(System.Int32,System.Int32,System.Int32,System.Byte[],System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Function is queueing but not sending messages.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <param name=\"channelId\">The channel ID to send on.</param>\n      <param name=\"buffer\">Buffer containing the data to send.</param>\n      <param name=\"size\">Size of the buffer.</param>\n      <returns>\n        <para>True if success.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.Receive(System.Int32&amp;,System.Int32&amp;,System.Int32&amp;,System.Byte[],System.Int32,System.Int32&amp;,System.Byte&amp;)\">\n      <summary>\n        <para>Called to poll the underlying system for events.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with the event.</param>\n      <param name=\"connectionId\">The connectionID that received the event.</param>\n      <param name=\"channelId\">The channel ID associated with the event.</param>\n      <param name=\"buffer\">The buffer that will hold the data received.</param>\n      <param name=\"bufferSize\">Size of the buffer supplied.</param>\n      <param name=\"receivedSize\">The actual receive size of the data.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>Type of event returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.ReceiveFromHost(System.Int32,System.Int32&amp;,System.Int32&amp;,System.Byte[],System.Int32,System.Int32&amp;,System.Byte&amp;)\">\n      <summary>\n        <para>Similar to Networking.NetworkTransport.Receive but will only poll for the provided hostId.</para>\n      </summary>\n      <param name=\"hostId\">The host ID to check for events.</param>\n      <param name=\"connectionId\">The connection ID that received the event.</param>\n      <param name=\"channelId\">The channel ID associated with the event.</param>\n      <param name=\"buffer\">The buffer that will hold the data received.</param>\n      <param name=\"bufferSize\">Size of the buffer supplied.</param>\n      <param name=\"receivedSize\">The actual receive size of the data.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>Type of event returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.ReceiveRelayEventFromHost(System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Polls the host for the following events:  Networking.NetworkEventType.ConnectEvent and Networking.NetworkEventType.DisconnectEvent.\nCan only be called by the relay group owner.</para>\n      </summary>\n      <param name=\"hostId\">The host ID to check for events.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>Type of event returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.RemoveHost(System.Int32)\">\n      <summary>\n        <para>Closes the opened socket, and closes all connections belonging to that socket.</para>\n      </summary>\n      <param name=\"hostId\">Host ID to remove.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.Send(System.Int32,System.Int32,System.Int32,System.Byte[],System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Send data to peer.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"channelId\">The channel ID to send on.</param>\n      <param name=\"buffer\">Buffer containing the data to send.</param>\n      <param name=\"size\">Size of the buffer.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.SendMulticast(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Add a connection for the multicast send.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.SendQueuedMessages(System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Sends messages, previously queued by NetworkTransport.QueueMessageForSending function.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"connectionId\">ID of the connection.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>True if hostId and connectioId are valid.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.SetBroadcastCredentials(System.Int32,System.Int32,System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Sets the credentials required for receiving broadcast messages. Should any credentials of a received broadcast message not match, the broadcast discovery message is dropped.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this broadcast.</param>\n      <param name=\"key\">Key part of the credentials associated with this broadcast.</param>\n      <param name=\"version\">Version part of the credentials associated with this broadcast.</param>\n      <param name=\"subversion\">Subversion part of the credentials associated with this broadcast.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.SetPacketStat(System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Used to inform the profiler of network packet statistics.</para>\n      </summary>\n      <param name=\"packetStatId\">The ID of the message being reported.</param>\n      <param name=\"numMsgs\">Number of messages being reported.</param>\n      <param name=\"numBytes\">Number of bytes used by reported messages.</param>\n      <param name=\"direction\">Whether the packet is outgoing (-1) or incoming (0).</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.Shutdown\">\n      <summary>\n        <para>Shut down the NetworkTransport.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.StartBroadcastDiscovery(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Byte[],System.Int32,System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Starts sending a broadcasting message in all local subnets.</para>\n      </summary>\n      <param name=\"hostId\">Host ID which should be reported via broadcast (broadcast receivers will connect to this host).</param>\n      <param name=\"broadcastPort\">Port used for the broadcast message.</param>\n      <param name=\"key\">Key part of the credentials associated with this broadcast.</param>\n      <param name=\"version\">Version part of the credentials associated with this broadcast.</param>\n      <param name=\"subversion\">Subversion part of the credentials associated with this broadcast.</param>\n      <param name=\"buffer\">Complimentary message. This message will delivered to the receiver with the broadcast event.</param>\n      <param name=\"size\">Size of message.</param>\n      <param name=\"timeout\">Specifies how often the broadcast message should be sent in milliseconds.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n      <returns>\n        <para>Return true if broadcasting request has been submitted.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.StartSendMulticast(System.Int32,System.Int32,System.Byte[],System.Int32,System.Byte&amp;)\">\n      <summary>\n        <para>Start to multicast send.</para>\n      </summary>\n      <param name=\"hostId\">Host ID associated with this connection.</param>\n      <param name=\"channelId\">The channel ID.</param>\n      <param name=\"buffer\">Buffer containing the data to send.</param>\n      <param name=\"size\">Size of the buffer.</param>\n      <param name=\"error\">Error (can be cast to Networking.NetworkError for more information).</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.NetworkTransport.StopBroadcastDiscovery\">\n      <summary>\n        <para>Stop sending the broadcast discovery message.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.PlayerConnection.MessageEventArgs\">\n      <summary>\n        <para>Arguments passed to Action callbacks registered in PlayerConnection.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.PlayerConnection.MessageEventArgs.data\">\n      <summary>\n        <para>Data that is received.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.PlayerConnection.MessageEventArgs.playerId\">\n      <summary>\n        <para>The Player ID that the data is received from.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.PlayerConnection.PlayerConnection\">\n      <summary>\n        <para>Used for handling the network connection from the Player to the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.PlayerConnection.PlayerConnection.instance\">\n      <summary>\n        <para>Singleton instance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.PlayerConnection.PlayerConnection.isConnected\">\n      <summary>\n        <para>Returns true when Editor is connected to the player.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.PlayerConnection.PlayerConnection.BlockUntilRecvMsg(System.Guid,System.Int32)\">\n      <summary>\n        <para>Blocks the calling thread until either a message with the specified messageId is received or the specified time-out elapses.</para>\n      </summary>\n      <param name=\"messageId\">The type ID of the message that is sent to the Editor.</param>\n      <param name=\"timeout\">The time-out specified in milliseconds.</param>\n      <returns>\n        <para>Returns true when the message is received and false if the call timed out.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.PlayerConnection.PlayerConnection.DisconnectAll\">\n      <summary>\n        <para>This disconnects all of the active connections.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.PlayerConnection.PlayerConnection.Register(System.Guid,UnityEngine.Events.UnityAction`1&lt;UnityEngine.Networking.PlayerConnection.MessageEventArgs&gt;)\">\n      <summary>\n        <para>Registers a listener for a specific message ID, with an Action to be executed whenever that message is received by the Editor.\nThis ID must be the same as for messages sent from EditorConnection.Send().</para>\n      </summary>\n      <param name=\"messageId\">The message ID that should cause the Action callback to be executed when received.</param>\n      <param name=\"callback\">Action that is executed when a message with ID messageId is received by the Editor.\nThe callback includes the data that is sent from the Player, and the Player ID.\nThe Player ID is always 1, because only one Editor can be connected.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.PlayerConnection.PlayerConnection.RegisterConnection(UnityEngine.Events.UnityAction`1&lt;System.Int32&gt;)\">\n      <summary>\n        <para>Registers a callback that is invoked when the Editor connects to the Player.</para>\n      </summary>\n      <param name=\"callback\">Action called when Player connects, with the Player ID of the Editor.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.PlayerConnection.PlayerConnection.RegisterDisconnection(UnityEngine.Events.UnityAction`1&lt;System.Int32&gt;)\">\n      <summary>\n        <para>Registers a callback to be called when Editor disconnects.</para>\n      </summary>\n      <param name=\"callback\">The Action that is called when a Player disconnects.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.PlayerConnection.PlayerConnection.Send(System.Guid,System.Byte[])\">\n      <summary>\n        <para>Sends data to the Editor.</para>\n      </summary>\n      <param name=\"messageId\">The type ID of the message that is sent to the Editor.</param>\n      <param name=\"data\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.PlayerConnection.PlayerConnection.Unregister(System.Guid,UnityEngine.Events.UnityAction`1&lt;UnityEngine.Networking.PlayerConnection.MessageEventArgs&gt;)\">\n      <summary>\n        <para>Deregisters a message listener.</para>\n      </summary>\n      <param name=\"messageId\">Message ID associated with the callback that you wish to deregister.</param>\n      <param name=\"callback\">The associated callback function you wish to deregister.</param>\n    </member>\n    <member name=\"T:UnityEngine.Networking.QosType\">\n      <summary>\n        <para>Enumeration of all supported quality of service channel modes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.QosType.AllCostDelivery\">\n      <summary>\n        <para>A reliable message that will be re-sent with a high frequency until it is acknowledged.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.QosType.Reliable\">\n      <summary>\n        <para>Each message is guaranteed to be delivered but not guaranteed to be in order.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.QosType.ReliableFragmented\">\n      <summary>\n        <para>Each message is guaranteed to be delivered, also allowing fragmented messages with up to 32 fragments per message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.QosType.ReliableFragmentedSequenced\">\n      <summary>\n        <para>Each message is guaranteed to be delivered in order, also allowing fragmented messages with up to 32 fragments per message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.QosType.ReliableSequenced\">\n      <summary>\n        <para>Each message is guaranteed to be delivered and in order.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.QosType.ReliableStateUpdate\">\n      <summary>\n        <para>A reliable message. Note: Only the last message in the send buffer is sent. Only the most recent message in the receive buffer will be delivered.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.QosType.StateUpdate\">\n      <summary>\n        <para>An unreliable message. Only the last message in the send buffer is sent. Only the most recent message in the receive buffer will be delivered.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.QosType.Unreliable\">\n      <summary>\n        <para>There is no guarantee of delivery or ordering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.QosType.UnreliableFragmented\">\n      <summary>\n        <para>There is no guarantee of delivery or ordering, but allowing fragmented messages with up to 32 fragments per message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.QosType.UnreliableFragmentedSequenced\">\n      <summary>\n        <para>There is garantee of ordering, no guarantee of delivery, but allowing fragmented messages with up to 32 fragments per message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.QosType.UnreliableSequenced\">\n      <summary>\n        <para>There is no guarantee of delivery and all unordered messages will be dropped. Example: VoIP.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.ReactorModel\">\n      <summary>\n        <para>Define how unet will handle network io operation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.ReactorModel.FixRateReactor\">\n      <summary>\n        <para>Network thread will sleep up to threadawake timeout, after that it will try receive up to maxpoolsize amount of messages and then will try perform send operation for connection whihc ready to send.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.ReactorModel.SelectReactor\">\n      <summary>\n        <para>Network thread will sleep up to threadawake timeout, or up to receive event on socket will happened. Awaked thread will try to read up to maxpoolsize packets from socket and will try update connections ready to send (with fixing awaketimeout rate).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.Types.AppID\">\n      <summary>\n        <para>The AppID identifies the application on the Unity Cloud or UNET servers.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.Types.AppID.Invalid\">\n      <summary>\n        <para>Invalid AppID.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.Types.HostPriority\">\n      <summary>\n        <para>An Enum representing the priority of a client in a match, starting at 0 and increasing.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.Types.HostPriority.Invalid\">\n      <summary>\n        <para>The Invalid case for a HostPriority. An Invalid host priority is not a valid host.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.Types.NetworkAccessLevel\">\n      <summary>\n        <para>Describes the access levels granted to this client.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.Types.NetworkAccessLevel.Admin\">\n      <summary>\n        <para>Administration access level, generally describing clearence to perform game altering actions against anyone inside a particular match.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.Types.NetworkAccessLevel.Invalid\">\n      <summary>\n        <para>Invalid access level, signifying no access level has been granted/specified.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.Types.NetworkAccessLevel.Owner\">\n      <summary>\n        <para>Access level Owner, generally granting access for operations key to the peer host server performing it's work.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.Types.NetworkAccessLevel.User\">\n      <summary>\n        <para>User access level. This means you can do operations which affect yourself only, like disconnect yourself from the match.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.Types.NetworkAccessToken\">\n      <summary>\n        <para>Access token used to authenticate a client session for the purposes of allowing or disallowing match operations requested by that client.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.Types.NetworkAccessToken.array\">\n      <summary>\n        <para>Binary field for the actual token.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.Types.NetworkAccessToken.GetByteString\">\n      <summary>\n        <para>Accessor to get an encoded string from the m_array data.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.Types.NetworkAccessToken.IsValid\">\n      <summary>\n        <para>Checks if the token is a valid set of data with respect to default values (returns true if the values are not default, does not validate the token is a current legitimate token with respect to the server's auth framework).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.Types.NetworkID\">\n      <summary>\n        <para>Network ID, used for match making.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.Types.NetworkID.Invalid\">\n      <summary>\n        <para>Invalid NetworkID.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.Types.NodeID\">\n      <summary>\n        <para>The NodeID is the ID used in Relay matches to track nodes in a network.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.Types.NodeID.Invalid\">\n      <summary>\n        <para>The invalid case of a NodeID.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.Types.SourceID\">\n      <summary>\n        <para>Identifies a specific game instance.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.Types.SourceID.Invalid\">\n      <summary>\n        <para>Invalid SourceID.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.UnityWebRequest\">\n      <summary>\n        <para>The UnityWebRequest object is used to communicate with web servers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.certificateHandler\">\n      <summary>\n        <para>Holds a reference to a CertificateHandler object, which manages certificate validation for this UnityWebRequest.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.chunkedTransfer\">\n      <summary>\n        <para>Indicates whether the UnityWebRequest system should employ the HTTP/1.1 chunked-transfer encoding method.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.disposeCertificateHandlerOnDispose\">\n      <summary>\n        <para>If true, any CertificateHandler attached to this UnityWebRequest will have CertificateHandler.Dispose called automatically when UnityWebRequest.Dispose is called.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.disposeDownloadHandlerOnDispose\">\n      <summary>\n        <para>If true, any DownloadHandler attached to this UnityWebRequest will have DownloadHandler.Dispose called automatically when UnityWebRequest.Dispose is called.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.disposeUploadHandlerOnDispose\">\n      <summary>\n        <para>If true, any UploadHandler attached to this UnityWebRequest will have UploadHandler.Dispose called automatically when UnityWebRequest.Dispose is called.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.downloadedBytes\">\n      <summary>\n        <para>Returns the number of bytes of body data the system has downloaded from the remote server. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.downloadHandler\">\n      <summary>\n        <para>Holds a reference to a DownloadHandler object, which manages body data received from the remote server by this UnityWebRequest.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.downloadProgress\">\n      <summary>\n        <para>Returns a floating-point value between 0.0 and 1.0, indicating the progress of downloading body data from the server. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.error\">\n      <summary>\n        <para>A human-readable string describing any system errors encountered by this UnityWebRequest object while handling HTTP requests or responses. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.isDone\">\n      <summary>\n        <para>Returns true after the UnityWebRequest has finished communicating with the remote server. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.isHttpError\">\n      <summary>\n        <para>Returns true after this UnityWebRequest receives an HTTP response code indicating an error. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.isModifiable\">\n      <summary>\n        <para>Returns true while a UnityWebRequest’s configuration properties can be altered. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.isNetworkError\">\n      <summary>\n        <para>Returns true after this UnityWebRequest encounters a system error. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.UnityWebRequest.kHttpVerbCREATE\">\n      <summary>\n        <para>The string \"CREATE\", commonly used as the verb for an HTTP CREATE request.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.UnityWebRequest.kHttpVerbDELETE\">\n      <summary>\n        <para>The string \"DELETE\", commonly used as the verb for an HTTP DELETE request.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.UnityWebRequest.kHttpVerbGET\">\n      <summary>\n        <para>The string \"GET\", commonly used as the verb for an HTTP GET request.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.UnityWebRequest.kHttpVerbHEAD\">\n      <summary>\n        <para>The string \"HEAD\", commonly used as the verb for an HTTP HEAD request.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.UnityWebRequest.kHttpVerbPOST\">\n      <summary>\n        <para>The string \"POST\", commonly used as the verb for an HTTP POST request.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Networking.UnityWebRequest.kHttpVerbPUT\">\n      <summary>\n        <para>The string \"PUT\", commonly used as the verb for an HTTP PUT request.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.method\">\n      <summary>\n        <para>Defines the HTTP verb used by this UnityWebRequest, such as GET or POST.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.redirectLimit\">\n      <summary>\n        <para>Indicates the number of redirects which this UnityWebRequest will follow before halting with a “Redirect Limit Exceeded” system error.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.responseCode\">\n      <summary>\n        <para>The numeric HTTP response code returned by the server, such as 200, 404 or 500. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.timeout\">\n      <summary>\n        <para>Sets UnityWebRequest to attempt to abort after the number of seconds in timeout have passed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.uploadedBytes\">\n      <summary>\n        <para>Returns the number of bytes of body data the system has uploaded to the remote server. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.uploadHandler\">\n      <summary>\n        <para>Holds a reference to the UploadHandler object which manages body data to be uploaded to the remote server.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.uploadProgress\">\n      <summary>\n        <para>Returns a floating-point value between 0.0 and 1.0, indicating the progress of uploading body data to the server.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.uri\">\n      <summary>\n        <para>Defines the target URI for the UnityWebRequest to communicate with.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.url\">\n      <summary>\n        <para>Defines the target URL for the UnityWebRequest to communicate with.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequest.useHttpContinue\">\n      <summary>\n        <para>Determines whether this UnityWebRequest will include Expect: 100-Continue in its outgoing request headers. (Default: true).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.Abort\">\n      <summary>\n        <para>If in progress, halts the UnityWebRequest as soon as possible.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.#ctor\">\n      <summary>\n        <para>Creates a UnityWebRequest with the default options and no attached DownloadHandler or UploadHandler. Default method is GET.</para>\n      </summary>\n      <param name=\"url\">The target URL with which this UnityWebRequest will communicate. Also accessible via the url property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.#ctor(System.String)\">\n      <summary>\n        <para>Creates a UnityWebRequest with the default options and no attached DownloadHandler or UploadHandler. Default method is GET.</para>\n      </summary>\n      <param name=\"url\">The target URL with which this UnityWebRequest will communicate. Also accessible via the url property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.Delete(System.String)\">\n      <summary>\n        <para>Creates a UnityWebRequest configured for HTTP DELETE.</para>\n      </summary>\n      <param name=\"uri\">The URI to which a DELETE request should be sent.</param>\n      <returns>\n        <para>A UnityWebRequest configured to send an HTTP DELETE request.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.Dispose\">\n      <summary>\n        <para>Signals that this [UnityWebRequest] is no longer being used, and should clean up any resources it is using.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.EscapeURL(System.String)\">\n      <summary>\n        <para>Escapes characters in a string to ensure they are URL-friendly.</para>\n      </summary>\n      <param name=\"s\">A string with characters to be escaped.</param>\n      <param name=\"e\">The text encoding to use.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.EscapeURL(System.String,System.Text.Encoding)\">\n      <summary>\n        <para>Escapes characters in a string to ensure they are URL-friendly.</para>\n      </summary>\n      <param name=\"s\">A string with characters to be escaped.</param>\n      <param name=\"e\">The text encoding to use.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.GenerateBoundary\">\n      <summary>\n        <para>Generate a random 40-byte array for use as a multipart form boundary.</para>\n      </summary>\n      <returns>\n        <para>40 random bytes, guaranteed to contain only printable ASCII values.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.Get(System.String)\">\n      <summary>\n        <para>Creates a UnityWebRequest configured for HTTP GET.</para>\n      </summary>\n      <param name=\"uri\">The URI of the resource to retrieve via HTTP GET.</param>\n      <returns>\n        <para>A UnityWebRequest object configured to retrieve data from uri.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.GetAssetBundle(System.String,System.UInt32)\">\n      <summary>\n        <para>Deprecated. Replaced by UnityWebRequestAssetBundle.GetAssetBundle.</para>\n      </summary>\n      <param name=\"uri\"></param>\n      <param name=\"crc\"></param>\n      <param name=\"version\"></param>\n      <param name=\"hash\"></param>\n      <param name=\"cachedAssetBundle\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.GetAssetBundle(System.String,System.UInt32,System.UInt32)\">\n      <summary>\n        <para>Deprecated. Replaced by UnityWebRequestAssetBundle.GetAssetBundle.</para>\n      </summary>\n      <param name=\"uri\"></param>\n      <param name=\"crc\"></param>\n      <param name=\"version\"></param>\n      <param name=\"hash\"></param>\n      <param name=\"cachedAssetBundle\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.GetAssetBundle(System.String,UnityEngine.Hash128,System.UInt32)\">\n      <summary>\n        <para>Deprecated. Replaced by UnityWebRequestAssetBundle.GetAssetBundle.</para>\n      </summary>\n      <param name=\"uri\"></param>\n      <param name=\"crc\"></param>\n      <param name=\"version\"></param>\n      <param name=\"hash\"></param>\n      <param name=\"cachedAssetBundle\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.GetAssetBundle(System.String,UnityEngine.CachedAssetBundle,System.UInt32)\">\n      <summary>\n        <para>Deprecated. Replaced by UnityWebRequestAssetBundle.GetAssetBundle.</para>\n      </summary>\n      <param name=\"uri\"></param>\n      <param name=\"crc\"></param>\n      <param name=\"version\"></param>\n      <param name=\"hash\"></param>\n      <param name=\"cachedAssetBundle\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.GetAudioClip(System.String,UnityEngine.AudioType)\">\n      <summary>\n        <para>OBSOLETE. Use UnityWebRequestMultimedia.GetAudioClip().</para>\n      </summary>\n      <param name=\"uri\"></param>\n      <param name=\"audioType\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.GetRequestHeader(System.String)\">\n      <summary>\n        <para>Retrieves the value of a custom request header.</para>\n      </summary>\n      <param name=\"name\">Name of the custom request header. Case-insensitive.</param>\n      <returns>\n        <para>The value of the custom request header. If no custom header with a matching name has been set, returns an empty string.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.GetResponseHeader(System.String)\">\n      <summary>\n        <para>Retrieves the value of a response header from the latest HTTP response received.</para>\n      </summary>\n      <param name=\"name\">The name of the HTTP header to retrieve. Case-insensitive.</param>\n      <returns>\n        <para>The value of the HTTP header from the latest HTTP response. If no header with a matching name has been received, or no responses have been received, returns null.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.GetResponseHeaders\">\n      <summary>\n        <para>Retrieves a dictionary containing all the response headers received by this UnityWebRequest in the latest HTTP response.</para>\n      </summary>\n      <returns>\n        <para>A dictionary containing all the response headers received in the latest HTTP response. If no responses have been received, returns null.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.GetTexture(System.String)\">\n      <summary>\n        <para>Creates a UnityWebRequest intended to download an image via HTTP GET and create a Texture based on the retrieved data.</para>\n      </summary>\n      <param name=\"uri\">The URI of the image to download.</param>\n      <param name=\"nonReadable\">If true, the texture's raw data will not be accessible to script. This can conserve memory. Default: false.</param>\n      <returns>\n        <para>A UnityWebRequest properly configured to download an image and convert it to a Texture.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.GetTexture(System.String,System.Boolean)\">\n      <summary>\n        <para>Creates a UnityWebRequest intended to download an image via HTTP GET and create a Texture based on the retrieved data.</para>\n      </summary>\n      <param name=\"uri\">The URI of the image to download.</param>\n      <param name=\"nonReadable\">If true, the texture's raw data will not be accessible to script. This can conserve memory. Default: false.</param>\n      <returns>\n        <para>A UnityWebRequest properly configured to download an image and convert it to a Texture.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.Head(System.String)\">\n      <summary>\n        <para>Creates a UnityWebRequest configured to send a HTTP HEAD request.</para>\n      </summary>\n      <param name=\"uri\">The URI to which to send a HTTP HEAD request.</param>\n      <returns>\n        <para>A UnityWebRequest configured to transmit a HTTP HEAD request.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.Post(System.String,System.String)\">\n      <summary>\n        <para>Creates a UnityWebRequest configured to send form data to a server via HTTP POST.</para>\n      </summary>\n      <param name=\"uri\">The target URI to which form data will be transmitted.</param>\n      <param name=\"postData\">Form body data. Will be URLEncoded prior to transmission.</param>\n      <returns>\n        <para>A UnityWebRequest configured to send form data to uri via POST.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.Post(System.String,UnityEngine.WWWForm)\">\n      <summary>\n        <para>Create a UnityWebRequest configured to send form data to a server via HTTP POST.</para>\n      </summary>\n      <param name=\"uri\">The target URI to which form data will be transmitted.</param>\n      <param name=\"formData\">Form fields or files encapsulated in a WWWForm object, for formatting and transmission to the remote server.</param>\n      <returns>\n        <para>A UnityWebRequest configured to send form data to uri via POST.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.Post(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Networking.IMultipartFormSection&gt;)\">\n      <summary>\n        <para>Create a UnityWebRequest configured to send form data to a server via HTTP POST.</para>\n      </summary>\n      <param name=\"uri\">The target URI to which form data will be transmitted.</param>\n      <param name=\"multipartFormSections\">A list of form fields or files to be formatted and transmitted to the remote server.</param>\n      <param name=\"boundary\">A unique boundary string, which will be used when separating form fields in a multipart form.  If not supplied, a boundary will be generated for you.</param>\n      <returns>\n        <para>A UnityWebRequest configured to send form data to uri via POST.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.Post(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Networking.IMultipartFormSection&gt;,System.Byte[])\">\n      <summary>\n        <para>Create a UnityWebRequest configured to send form data to a server via HTTP POST.</para>\n      </summary>\n      <param name=\"uri\">The target URI to which form data will be transmitted.</param>\n      <param name=\"multipartFormSections\">A list of form fields or files to be formatted and transmitted to the remote server.</param>\n      <param name=\"boundary\">A unique boundary string, which will be used when separating form fields in a multipart form.  If not supplied, a boundary will be generated for you.</param>\n      <returns>\n        <para>A UnityWebRequest configured to send form data to uri via POST.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.Post(System.String,System.Collections.Generic.Dictionary`2&lt;System.String,System.String&gt;)\">\n      <summary>\n        <para>Create a UnityWebRequest configured to send form data to a server via HTTP POST.</para>\n      </summary>\n      <param name=\"uri\">The target URI to which form data will be transmitted.</param>\n      <param name=\"formFields\">Strings indicating the keys and values of form fields. Will be automatically formatted into a URL-encoded form body.</param>\n      <returns>\n        <para>A UnityWebRequest configured to send form data to uri via POST.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.Put(System.String,System.Byte[])\">\n      <summary>\n        <para>Creates a UnityWebRequest configured to upload raw data to a remote server via HTTP PUT.</para>\n      </summary>\n      <param name=\"uri\">The URI to which the data will be sent.</param>\n      <param name=\"bodyData\">The data to transmit to the remote server.\n\nIf a string, the string will be converted to raw bytes via &lt;a href=\"http:msdn.microsoft.comen-uslibrarysystem.text.encoding.utf8\"&gt;System.Text.Encoding.UTF8&lt;a&gt;.</param>\n      <returns>\n        <para>A UnityWebRequest configured to transmit bodyData to uri via HTTP PUT.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.Put(System.String,System.String)\">\n      <summary>\n        <para>Creates a UnityWebRequest configured to upload raw data to a remote server via HTTP PUT.</para>\n      </summary>\n      <param name=\"uri\">The URI to which the data will be sent.</param>\n      <param name=\"bodyData\">The data to transmit to the remote server.\n\nIf a string, the string will be converted to raw bytes via &lt;a href=\"http:msdn.microsoft.comen-uslibrarysystem.text.encoding.utf8\"&gt;System.Text.Encoding.UTF8&lt;a&gt;.</param>\n      <returns>\n        <para>A UnityWebRequest configured to transmit bodyData to uri via HTTP PUT.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.Send\">\n      <summary>\n        <para>Begin communicating with the remote server.</para>\n      </summary>\n      <returns>\n        <para>An AsyncOperation indicating the progress/completion state of the UnityWebRequest. Yield this object to wait until the UnityWebRequest is done.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.SendWebRequest\">\n      <summary>\n        <para>Begin communicating with the remote server.\n\nAfter calling this method, the UnityWebRequest will perform DNS resolution (if necessary), transmit an HTTP request to the remote server at the target URL and process the server’s response.\n\nThis method can only be called once on any given UnityWebRequest object. Once this method is called, you cannot change any of the UnityWebRequest’s properties.\n\nThis method returns a WebRequestAsyncOperation object. Yielding the WebRequestAsyncOperation inside a coroutine will cause the coroutine to pause until the UnityWebRequest encounters a system error or finishes communicating.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.SerializeFormSections(System.Collections.Generic.List`1&lt;UnityEngine.Networking.IMultipartFormSection&gt;,System.Byte[])\">\n      <summary>\n        <para>Converts a List of IMultipartFormSection objects into a byte array containing raw multipart form data.</para>\n      </summary>\n      <param name=\"multipartFormSections\">A List of IMultipartFormSection objects.</param>\n      <param name=\"boundary\">A unique boundary string to separate the form sections.</param>\n      <returns>\n        <para>A byte array of raw multipart form data.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.SerializeSimpleForm(System.Collections.Generic.Dictionary`2&lt;System.String,System.String&gt;)\">\n      <summary>\n        <para>Serialize a dictionary of strings into a byte array containing URL-encoded UTF8 characters.</para>\n      </summary>\n      <param name=\"formFields\">A dictionary containing the form keys and values to serialize.</param>\n      <returns>\n        <para>A byte array containing the serialized form. The form's keys and values have been URL-encoded.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.SetRequestHeader(System.String,System.String)\">\n      <summary>\n        <para>Set a HTTP request header to a custom value.</para>\n      </summary>\n      <param name=\"name\">The key of the header to be set. Case-sensitive.</param>\n      <param name=\"value\">The header's intended value.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.UnEscapeURL(System.String)\">\n      <summary>\n        <para>Converts URL-friendly escape sequences back to normal text.</para>\n      </summary>\n      <param name=\"s\">A string containing escaped characters.</param>\n      <param name=\"e\">The text encoding to use.</param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequest.UnEscapeURL(System.String,System.Text.Encoding)\">\n      <summary>\n        <para>Converts URL-friendly escape sequences back to normal text.</para>\n      </summary>\n      <param name=\"s\">A string containing escaped characters.</param>\n      <param name=\"e\">The text encoding to use.</param>\n    </member>\n    <member name=\"T:UnityEngine.Networking.UnityWebRequestAssetBundle\">\n      <summary>\n        <para>Helpers for downloading asset bundles using UnityWebRequest.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(System.String)\">\n      <summary>\n        <para>Creates a UnityWebRequest optimized for downloading a Unity Asset Bundle via HTTP GET.</para>\n      </summary>\n      <param name=\"uri\">The URI of the asset bundle to download.</param>\n      <param name=\"crc\">If nonzero, this number will be compared to the checksum of the downloaded asset bundle data. If the CRCs do not match, an error will be logged and the asset bundle will not be loaded. If set to zero, CRC checking will be skipped.</param>\n      <param name=\"version\">An integer version number, which will be compared to the cached version of the asset bundle to download. Increment this number to force Unity to redownload a cached asset bundle.\n\nAnalogous to the version parameter for WWW.LoadFromCacheOrDownload.</param>\n      <param name=\"hash\">A version hash. If this hash does not match the hash for the cached version of this asset bundle, the asset bundle will be redownloaded.</param>\n      <param name=\"cachedAssetBundle\">A structure used to download a given version of AssetBundle to a customized cache path.</param>\n      <returns>\n        <para>A UnityWebRequest configured to downloading a Unity Asset Bundle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(System.Uri)\">\n      <summary>\n        <para>Creates a UnityWebRequest optimized for downloading a Unity Asset Bundle via HTTP GET.</para>\n      </summary>\n      <param name=\"uri\">The URI of the asset bundle to download.</param>\n      <param name=\"crc\">If nonzero, this number will be compared to the checksum of the downloaded asset bundle data. If the CRCs do not match, an error will be logged and the asset bundle will not be loaded. If set to zero, CRC checking will be skipped.</param>\n      <param name=\"version\">An integer version number, which will be compared to the cached version of the asset bundle to download. Increment this number to force Unity to redownload a cached asset bundle.\n\nAnalogous to the version parameter for WWW.LoadFromCacheOrDownload.</param>\n      <param name=\"hash\">A version hash. If this hash does not match the hash for the cached version of this asset bundle, the asset bundle will be redownloaded.</param>\n      <param name=\"cachedAssetBundle\">A structure used to download a given version of AssetBundle to a customized cache path.</param>\n      <returns>\n        <para>A UnityWebRequest configured to downloading a Unity Asset Bundle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(System.String,System.UInt32)\">\n      <summary>\n        <para>Creates a UnityWebRequest optimized for downloading a Unity Asset Bundle via HTTP GET.</para>\n      </summary>\n      <param name=\"uri\">The URI of the asset bundle to download.</param>\n      <param name=\"crc\">If nonzero, this number will be compared to the checksum of the downloaded asset bundle data. If the CRCs do not match, an error will be logged and the asset bundle will not be loaded. If set to zero, CRC checking will be skipped.</param>\n      <param name=\"version\">An integer version number, which will be compared to the cached version of the asset bundle to download. Increment this number to force Unity to redownload a cached asset bundle.\n\nAnalogous to the version parameter for WWW.LoadFromCacheOrDownload.</param>\n      <param name=\"hash\">A version hash. If this hash does not match the hash for the cached version of this asset bundle, the asset bundle will be redownloaded.</param>\n      <param name=\"cachedAssetBundle\">A structure used to download a given version of AssetBundle to a customized cache path.</param>\n      <returns>\n        <para>A UnityWebRequest configured to downloading a Unity Asset Bundle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(System.Uri,System.UInt32)\">\n      <summary>\n        <para>Creates a UnityWebRequest optimized for downloading a Unity Asset Bundle via HTTP GET.</para>\n      </summary>\n      <param name=\"uri\">The URI of the asset bundle to download.</param>\n      <param name=\"crc\">If nonzero, this number will be compared to the checksum of the downloaded asset bundle data. If the CRCs do not match, an error will be logged and the asset bundle will not be loaded. If set to zero, CRC checking will be skipped.</param>\n      <param name=\"version\">An integer version number, which will be compared to the cached version of the asset bundle to download. Increment this number to force Unity to redownload a cached asset bundle.\n\nAnalogous to the version parameter for WWW.LoadFromCacheOrDownload.</param>\n      <param name=\"hash\">A version hash. If this hash does not match the hash for the cached version of this asset bundle, the asset bundle will be redownloaded.</param>\n      <param name=\"cachedAssetBundle\">A structure used to download a given version of AssetBundle to a customized cache path.</param>\n      <returns>\n        <para>A UnityWebRequest configured to downloading a Unity Asset Bundle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(System.String,System.UInt32,System.UInt32)\">\n      <summary>\n        <para>Creates a UnityWebRequest optimized for downloading a Unity Asset Bundle via HTTP GET.</para>\n      </summary>\n      <param name=\"uri\">The URI of the asset bundle to download.</param>\n      <param name=\"crc\">If nonzero, this number will be compared to the checksum of the downloaded asset bundle data. If the CRCs do not match, an error will be logged and the asset bundle will not be loaded. If set to zero, CRC checking will be skipped.</param>\n      <param name=\"version\">An integer version number, which will be compared to the cached version of the asset bundle to download. Increment this number to force Unity to redownload a cached asset bundle.\n\nAnalogous to the version parameter for WWW.LoadFromCacheOrDownload.</param>\n      <param name=\"hash\">A version hash. If this hash does not match the hash for the cached version of this asset bundle, the asset bundle will be redownloaded.</param>\n      <param name=\"cachedAssetBundle\">A structure used to download a given version of AssetBundle to a customized cache path.</param>\n      <returns>\n        <para>A UnityWebRequest configured to downloading a Unity Asset Bundle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(System.Uri,System.UInt32,System.UInt32)\">\n      <summary>\n        <para>Creates a UnityWebRequest optimized for downloading a Unity Asset Bundle via HTTP GET.</para>\n      </summary>\n      <param name=\"uri\">The URI of the asset bundle to download.</param>\n      <param name=\"crc\">If nonzero, this number will be compared to the checksum of the downloaded asset bundle data. If the CRCs do not match, an error will be logged and the asset bundle will not be loaded. If set to zero, CRC checking will be skipped.</param>\n      <param name=\"version\">An integer version number, which will be compared to the cached version of the asset bundle to download. Increment this number to force Unity to redownload a cached asset bundle.\n\nAnalogous to the version parameter for WWW.LoadFromCacheOrDownload.</param>\n      <param name=\"hash\">A version hash. If this hash does not match the hash for the cached version of this asset bundle, the asset bundle will be redownloaded.</param>\n      <param name=\"cachedAssetBundle\">A structure used to download a given version of AssetBundle to a customized cache path.</param>\n      <returns>\n        <para>A UnityWebRequest configured to downloading a Unity Asset Bundle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(System.String,UnityEngine.Hash128,System.UInt32)\">\n      <summary>\n        <para>Creates a UnityWebRequest optimized for downloading a Unity Asset Bundle via HTTP GET.</para>\n      </summary>\n      <param name=\"uri\">The URI of the asset bundle to download.</param>\n      <param name=\"crc\">If nonzero, this number will be compared to the checksum of the downloaded asset bundle data. If the CRCs do not match, an error will be logged and the asset bundle will not be loaded. If set to zero, CRC checking will be skipped.</param>\n      <param name=\"version\">An integer version number, which will be compared to the cached version of the asset bundle to download. Increment this number to force Unity to redownload a cached asset bundle.\n\nAnalogous to the version parameter for WWW.LoadFromCacheOrDownload.</param>\n      <param name=\"hash\">A version hash. If this hash does not match the hash for the cached version of this asset bundle, the asset bundle will be redownloaded.</param>\n      <param name=\"cachedAssetBundle\">A structure used to download a given version of AssetBundle to a customized cache path.</param>\n      <returns>\n        <para>A UnityWebRequest configured to downloading a Unity Asset Bundle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(System.Uri,UnityEngine.Hash128,System.UInt32)\">\n      <summary>\n        <para>Creates a UnityWebRequest optimized for downloading a Unity Asset Bundle via HTTP GET.</para>\n      </summary>\n      <param name=\"uri\">The URI of the asset bundle to download.</param>\n      <param name=\"crc\">If nonzero, this number will be compared to the checksum of the downloaded asset bundle data. If the CRCs do not match, an error will be logged and the asset bundle will not be loaded. If set to zero, CRC checking will be skipped.</param>\n      <param name=\"version\">An integer version number, which will be compared to the cached version of the asset bundle to download. Increment this number to force Unity to redownload a cached asset bundle.\n\nAnalogous to the version parameter for WWW.LoadFromCacheOrDownload.</param>\n      <param name=\"hash\">A version hash. If this hash does not match the hash for the cached version of this asset bundle, the asset bundle will be redownloaded.</param>\n      <param name=\"cachedAssetBundle\">A structure used to download a given version of AssetBundle to a customized cache path.</param>\n      <returns>\n        <para>A UnityWebRequest configured to downloading a Unity Asset Bundle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(System.String,UnityEngine.CachedAssetBundle,System.UInt32)\">\n      <summary>\n        <para>Creates a UnityWebRequest optimized for downloading a Unity Asset Bundle via HTTP GET.</para>\n      </summary>\n      <param name=\"uri\">The URI of the asset bundle to download.</param>\n      <param name=\"crc\">If nonzero, this number will be compared to the checksum of the downloaded asset bundle data. If the CRCs do not match, an error will be logged and the asset bundle will not be loaded. If set to zero, CRC checking will be skipped.</param>\n      <param name=\"version\">An integer version number, which will be compared to the cached version of the asset bundle to download. Increment this number to force Unity to redownload a cached asset bundle.\n\nAnalogous to the version parameter for WWW.LoadFromCacheOrDownload.</param>\n      <param name=\"hash\">A version hash. If this hash does not match the hash for the cached version of this asset bundle, the asset bundle will be redownloaded.</param>\n      <param name=\"cachedAssetBundle\">A structure used to download a given version of AssetBundle to a customized cache path.</param>\n      <returns>\n        <para>A UnityWebRequest configured to downloading a Unity Asset Bundle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(System.Uri,UnityEngine.CachedAssetBundle,System.UInt32)\">\n      <summary>\n        <para>Creates a UnityWebRequest optimized for downloading a Unity Asset Bundle via HTTP GET.</para>\n      </summary>\n      <param name=\"uri\">The URI of the asset bundle to download.</param>\n      <param name=\"crc\">If nonzero, this number will be compared to the checksum of the downloaded asset bundle data. If the CRCs do not match, an error will be logged and the asset bundle will not be loaded. If set to zero, CRC checking will be skipped.</param>\n      <param name=\"version\">An integer version number, which will be compared to the cached version of the asset bundle to download. Increment this number to force Unity to redownload a cached asset bundle.\n\nAnalogous to the version parameter for WWW.LoadFromCacheOrDownload.</param>\n      <param name=\"hash\">A version hash. If this hash does not match the hash for the cached version of this asset bundle, the asset bundle will be redownloaded.</param>\n      <param name=\"cachedAssetBundle\">A structure used to download a given version of AssetBundle to a customized cache path.</param>\n      <returns>\n        <para>A UnityWebRequest configured to downloading a Unity Asset Bundle.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Networking.UnityWebRequestAsyncOperation\">\n      <summary>\n        <para>Asynchronous operation object returned from UnityWebRequest.SendWebRequest().\n\nYou can yield until it continues, register an event handler with AsyncOperation.completed, or manually check whether it's done (AsyncOperation.isDone) or progress (AsyncOperation.progress).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UnityWebRequestAsyncOperation.webRequest\">\n      <summary>\n        <para>Returns the associated UnityWebRequest that created the operation.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.UnityWebRequestMultimedia\">\n      <summary>\n        <para>Helpers for downloading multimedia files using UnityWebRequest.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequestMultimedia.GetAudioClip(System.String,UnityEngine.AudioType)\">\n      <summary>\n        <para>Create a UnityWebRequest to download an audio clip via HTTP GET and create an AudioClip based on the retrieved data.</para>\n      </summary>\n      <param name=\"uri\">The URI of the audio clip to download.</param>\n      <param name=\"audioType\">The type of audio encoding for the downloaded audio clip. See AudioType.</param>\n      <returns>\n        <para>A UnityWebRequest properly configured to download an audio clip and convert it to an AudioClip.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequestMultimedia.GetMovieTexture(System.String)\">\n      <summary>\n        <para>Create a UnityWebRequest intended to download a movie clip via HTTP GET and create an MovieTexture based on the retrieved data.</para>\n      </summary>\n      <param name=\"uri\">The URI of the movie clip to download.</param>\n      <returns>\n        <para>A UnityWebRequest properly configured to download a movie clip and convert it to a MovieTexture.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Networking.UnityWebRequestTexture\">\n      <summary>\n        <para>Helpers for downloading image files into Textures using UnityWebRequest.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequestTexture.GetTexture(System.String)\">\n      <summary>\n        <para>Create a UnityWebRequest intended to download an image via HTTP GET and create a Texture based on the retrieved data.</para>\n      </summary>\n      <param name=\"uri\">The URI of the image to download.</param>\n      <param name=\"nonReadable\">If true, the texture's raw data will not be accessible to script. This can conserve memory. Default: false.</param>\n      <returns>\n        <para>A UnityWebRequest properly configured to download an image and convert it to a Texture.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UnityWebRequestTexture.GetTexture(System.String,System.Boolean)\">\n      <summary>\n        <para>Create a UnityWebRequest intended to download an image via HTTP GET and create a Texture based on the retrieved data.</para>\n      </summary>\n      <param name=\"uri\">The URI of the image to download.</param>\n      <param name=\"nonReadable\">If true, the texture's raw data will not be accessible to script. This can conserve memory. Default: false.</param>\n      <returns>\n        <para>A UnityWebRequest properly configured to download an image and convert it to a Texture.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Networking.UploadHandler\">\n      <summary>\n        <para>Helper object for UnityWebRequests. Manages the buffering and transmission of body data during HTTP requests.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UploadHandler.contentType\">\n      <summary>\n        <para>Determines the default Content-Type header which will be transmitted with the outbound HTTP request.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UploadHandler.data\">\n      <summary>\n        <para>The raw data which will be transmitted to the remote server as body data. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.UploadHandler.progress\">\n      <summary>\n        <para>Returns the proportion of data uploaded to the remote server compared to the total amount of data to upload. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UploadHandler.Dispose\">\n      <summary>\n        <para>Signals that this [UploadHandler] is no longer being used, and should clean up any resources it is using.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Networking.UploadHandlerFile\">\n      <summary>\n        <para>A specialized UploadHandler that reads data from a given file and sends raw bytes to the server as the request body.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UploadHandlerFile.#ctor(System.String)\">\n      <summary>\n        <para>Create a new upload handler to send data from the given file to the server.</para>\n      </summary>\n      <param name=\"filePath\">A file containing data to send.</param>\n    </member>\n    <member name=\"T:UnityEngine.Networking.UploadHandlerRaw\">\n      <summary>\n        <para>A general-purpose UploadHandler subclass, using a native-code memory buffer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.UploadHandlerRaw.#ctor(System.Byte[])\">\n      <summary>\n        <para>General constructor. Contents of the input argument are copied into a native buffer.</para>\n      </summary>\n      <param name=\"data\">Raw data to transmit to the remote server.</param>\n    </member>\n    <member name=\"T:UnityEngine.Networking.Utility\">\n      <summary>\n        <para>Networking Utility.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Networking.Utility.useRandomSourceID\">\n      <summary>\n        <para>This property is deprecated and does not need to be set or referenced.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.Utility.GetAccessTokenForNetwork(UnityEngine.Networking.Types.NetworkID)\">\n      <summary>\n        <para>Utility function to get this client's access token for a particular network, if it has been set.</para>\n      </summary>\n      <param name=\"netId\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.Utility.GetAppID\">\n      <summary>\n        <para>Utility function to fetch the program's ID for UNET Cloud interfacing.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.Utility.GetSourceID\">\n      <summary>\n        <para>Utility function to get the client's SourceID for unique identification.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Networking.Utility.SetAccessTokenForNetwork(UnityEngine.Networking.Types.NetworkID,UnityEngine.Networking.Types.NetworkAccessToken)\">\n      <summary>\n        <para>Utility function that accepts the access token for a network after it's received from the server.</para>\n      </summary>\n      <param name=\"netId\"></param>\n      <param name=\"accessToken\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Networking.Utility.SetAppID(UnityEngine.Networking.Types.AppID)\">\n      <summary>\n        <para>Deprecated; Setting the AppID is no longer necessary. Please log in through the editor and set up the project there.</para>\n      </summary>\n      <param name=\"newAppID\"></param>\n    </member>\n    <member name=\"T:UnityEngine.NetworkLogLevel\">\n      <summary>\n        <para>Describes different levels of log information the network layer supports.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.NetworkMessageInfo\">\n      <summary>\n        <para>This data structure contains information on a message just received from the network.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.NetworkMessageInfo.networkView\">\n      <summary>\n        <para>The NetworkView who sent this message.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.NetworkMessageInfo.sender\">\n      <summary>\n        <para>The player who sent this network message (owner).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.NetworkMessageInfo.timestamp\">\n      <summary>\n        <para>The time stamp when the Message was sent in seconds.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.NetworkPeerType\">\n      <summary>\n        <para>Describes the status of the network interface peer type as returned by Network.peerType.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.NetworkPlayer\">\n      <summary>\n        <para>The NetworkPlayer is a data structure with which you can locate another player over the network.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.NetworkPlayer.externalIP\">\n      <summary>\n        <para>Returns the external IP address of the network interface.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.NetworkPlayer.externalPort\">\n      <summary>\n        <para>Returns the external port of the network interface.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.NetworkPlayer.guid\">\n      <summary>\n        <para>The GUID for this player, used when connecting with NAT punchthrough.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.NetworkPlayer.ipAddress\">\n      <summary>\n        <para>The IP address of this player.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.NetworkPlayer.port\">\n      <summary>\n        <para>The port of this player.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.NetworkReachability\">\n      <summary>\n        <para>Describes network reachability options.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.NetworkReachability.NotReachable\">\n      <summary>\n        <para>Network is not reachable.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.NetworkReachability.ReachableViaCarrierDataNetwork\">\n      <summary>\n        <para>Network is reachable via carrier data network.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.NetworkReachability.ReachableViaLocalAreaNetwork\">\n      <summary>\n        <para>Network is reachable via WiFi or cable.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.NetworkStateSynchronization\">\n      <summary>\n        <para>Different types of synchronization for the NetworkView component.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.NetworkView\">\n      <summary>\n        <para>The network view is the binding material of multiplayer games.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.NetworkView.group\">\n      <summary>\n        <para>The network group number of this network view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.NetworkView.isMine\">\n      <summary>\n        <para>Is the network view controlled by this object?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.NetworkView.observed\">\n      <summary>\n        <para>The component the network view is observing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.NetworkView.owner\">\n      <summary>\n        <para>The NetworkPlayer who owns this network view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.NetworkView.stateSynchronization\">\n      <summary>\n        <para>The type of NetworkStateSynchronization set for this network view.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.NetworkView.viewID\">\n      <summary>\n        <para>The ViewID of this network view.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.NetworkView.RPC(System.String,UnityEngine.RPCMode,System.Object[])\">\n      <summary>\n        <para>Call a RPC function on all connected peers.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"mode\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"M:UnityEngine.NetworkView.RPC(System.String,UnityEngine.NetworkPlayer,System.Object[])\">\n      <summary>\n        <para>Call a RPC function on a specific player.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"target\"></param>\n      <param name=\"args\"></param>\n    </member>\n    <member name=\"T:UnityEngine.NetworkViewID\">\n      <summary>\n        <para>The NetworkViewID is a unique identifier for a network view instance in a multiplayer game.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.NetworkViewID.isMine\">\n      <summary>\n        <para>True if instantiated by me.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.NetworkViewID.owner\">\n      <summary>\n        <para>The NetworkPlayer who owns the NetworkView. Could be the server.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.NetworkViewID.unassigned\">\n      <summary>\n        <para>Represents an invalid network view ID.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.NPOTSupport\">\n      <summary>\n        <para>NPOT Texture2D|textures support.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.NPOTSupport.Full\">\n      <summary>\n        <para>Full NPOT support.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.NPOTSupport.None\">\n      <summary>\n        <para>NPOT textures are not supported. Will be upscaled/padded at loading time.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.NPOTSupport.Restricted\">\n      <summary>\n        <para>Limited NPOT support: no mip-maps and clamp TextureWrapMode|wrap mode will be forced.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Object\">\n      <summary>\n        <para>Base class for all objects Unity can reference.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Object.hideFlags\">\n      <summary>\n        <para>Should the object be hidden, saved with the scene or modifiable by the user?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Object.name\">\n      <summary>\n        <para>The name of the object.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Object.Destroy(UnityEngine.Object)\">\n      <summary>\n        <para>Removes a gameobject, component or asset.</para>\n      </summary>\n      <param name=\"obj\">The object to destroy.</param>\n      <param name=\"t\">The optional amount of time to delay before destroying the object.</param>\n    </member>\n    <member name=\"M:UnityEngine.Object.Destroy(UnityEngine.Object,System.Single)\">\n      <summary>\n        <para>Removes a gameobject, component or asset.</para>\n      </summary>\n      <param name=\"obj\">The object to destroy.</param>\n      <param name=\"t\">The optional amount of time to delay before destroying the object.</param>\n    </member>\n    <member name=\"M:UnityEngine.Object.DestroyImmediate(UnityEngine.Object)\">\n      <summary>\n        <para>Destroys the object obj immediately. You are strongly recommended to use Destroy instead.</para>\n      </summary>\n      <param name=\"obj\">Object to be destroyed.</param>\n      <param name=\"allowDestroyingAssets\">Set to true to allow assets to be destroyed.</param>\n    </member>\n    <member name=\"M:UnityEngine.Object.DestroyImmediate(UnityEngine.Object,System.Boolean)\">\n      <summary>\n        <para>Destroys the object obj immediately. You are strongly recommended to use Destroy instead.</para>\n      </summary>\n      <param name=\"obj\">Object to be destroyed.</param>\n      <param name=\"allowDestroyingAssets\">Set to true to allow assets to be destroyed.</param>\n    </member>\n    <member name=\"M:UnityEngine.Object.DontDestroyOnLoad(UnityEngine.Object)\">\n      <summary>\n        <para>Makes the object target not be destroyed automatically when loading a new scene.</para>\n      </summary>\n      <param name=\"target\">The object which is not destroyed on scene change.</param>\n    </member>\n    <member name=\"M:UnityEngine.Object.FindObjectOfType(System.Type)\">\n      <summary>\n        <para>Returns the first active loaded object of Type type.</para>\n      </summary>\n      <param name=\"type\">The type of object to find.</param>\n      <returns>\n        <para>This returns the  Object that matches the specified type. It returns null if no Object matches the type.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Object.FindObjectsOfType(System.Type)\">\n      <summary>\n        <para>Returns a list of all active loaded objects of Type type.</para>\n      </summary>\n      <param name=\"type\">The type of object to find.</param>\n      <returns>\n        <para>The array of objects found matching the type specified.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Object.FindObjectsOfTypeAll(System.Type)\">\n      <summary>\n        <para>Returns a list of all active and inactive loaded objects of Type type.</para>\n      </summary>\n      <param name=\"type\">The type of object to find.</param>\n      <returns>\n        <para>The array of objects found matching the type specified.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Object.FindObjectsOfTypeIncludingAssets(System.Type)\">\n      <summary>\n        <para>Returns a list of all active and inactive loaded objects of Type type, including assets.</para>\n      </summary>\n      <param name=\"type\">The type of object or asset to find.</param>\n      <returns>\n        <para>The array of objects and assets found matching the type specified.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Object.GetInstanceID\">\n      <summary>\n        <para>Returns the instance id of the object.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Object.implop_bool(Object)(UnityEngine.Object)\">\n      <summary>\n        <para>Does the object exist?</para>\n      </summary>\n      <param name=\"exists\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Object.Instantiate(UnityEngine.Object)\">\n      <summary>\n        <para>Clones the object original and returns the clone.</para>\n      </summary>\n      <param name=\"original\">An existing object that you want to make a copy of.</param>\n      <param name=\"position\">Position for the new object.</param>\n      <param name=\"rotation\">Orientation of the new object.</param>\n      <param name=\"parent\">Parent that will be assigned to the new object.</param>\n      <param name=\"instantiateInWorldSpace\">Pass true when assigning a parent Object to maintain the world position of the Object, instead of setting its position relative to the new parent. Pass false to set the Object's position relative to its new parent.</param>\n      <returns>\n        <para>The instantiated clone.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Object.Instantiate(UnityEngine.Object,UnityEngine.Transform)\">\n      <summary>\n        <para>Clones the object original and returns the clone.</para>\n      </summary>\n      <param name=\"original\">An existing object that you want to make a copy of.</param>\n      <param name=\"position\">Position for the new object.</param>\n      <param name=\"rotation\">Orientation of the new object.</param>\n      <param name=\"parent\">Parent that will be assigned to the new object.</param>\n      <param name=\"instantiateInWorldSpace\">Pass true when assigning a parent Object to maintain the world position of the Object, instead of setting its position relative to the new parent. Pass false to set the Object's position relative to its new parent.</param>\n      <returns>\n        <para>The instantiated clone.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Object.Instantiate(UnityEngine.Object,UnityEngine.Transform,System.Boolean)\">\n      <summary>\n        <para>Clones the object original and returns the clone.</para>\n      </summary>\n      <param name=\"original\">An existing object that you want to make a copy of.</param>\n      <param name=\"position\">Position for the new object.</param>\n      <param name=\"rotation\">Orientation of the new object.</param>\n      <param name=\"parent\">Parent that will be assigned to the new object.</param>\n      <param name=\"instantiateInWorldSpace\">Pass true when assigning a parent Object to maintain the world position of the Object, instead of setting its position relative to the new parent. Pass false to set the Object's position relative to its new parent.</param>\n      <returns>\n        <para>The instantiated clone.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Object.Instantiate(UnityEngine.Object,UnityEngine.Vector3,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Clones the object original and returns the clone.</para>\n      </summary>\n      <param name=\"original\">An existing object that you want to make a copy of.</param>\n      <param name=\"position\">Position for the new object.</param>\n      <param name=\"rotation\">Orientation of the new object.</param>\n      <param name=\"parent\">Parent that will be assigned to the new object.</param>\n      <param name=\"instantiateInWorldSpace\">Pass true when assigning a parent Object to maintain the world position of the Object, instead of setting its position relative to the new parent. Pass false to set the Object's position relative to its new parent.</param>\n      <returns>\n        <para>The instantiated clone.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Object.Instantiate(UnityEngine.Object,UnityEngine.Vector3,UnityEngine.Quaternion,UnityEngine.Transform)\">\n      <summary>\n        <para>Clones the object original and returns the clone.</para>\n      </summary>\n      <param name=\"original\">An existing object that you want to make a copy of.</param>\n      <param name=\"position\">Position for the new object.</param>\n      <param name=\"rotation\">Orientation of the new object.</param>\n      <param name=\"parent\">Parent that will be assigned to the new object.</param>\n      <param name=\"instantiateInWorldSpace\">Pass true when assigning a parent Object to maintain the world position of the Object, instead of setting its position relative to the new parent. Pass false to set the Object's position relative to its new parent.</param>\n      <returns>\n        <para>The instantiated clone.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Object.Instantiate(T)\">\n      <summary>\n        <para>You can also use Generics to instantiate objects. See the page for more details.</para>\n      </summary>\n      <param name=\"original\">Object of type T that you want to make a clone of.</param>\n      <param name=\"parent\"></param>\n      <param name=\"worldPositionStays\"></param>\n      <param name=\"position\"></param>\n      <param name=\"rotation\"></param>\n      <returns>\n        <para>Object of type T.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Object.Instantiate(T,UnityEngine.Transform)\">\n      <summary>\n        <para>You can also use Generics to instantiate objects. See the page for more details.</para>\n      </summary>\n      <param name=\"original\">Object of type T that you want to make a clone of.</param>\n      <param name=\"parent\"></param>\n      <param name=\"worldPositionStays\"></param>\n      <param name=\"position\"></param>\n      <param name=\"rotation\"></param>\n      <returns>\n        <para>Object of type T.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Object.Instantiate(T,UnityEngine.Transform,System.Boolean)\">\n      <summary>\n        <para>You can also use Generics to instantiate objects. See the page for more details.</para>\n      </summary>\n      <param name=\"original\">Object of type T that you want to make a clone of.</param>\n      <param name=\"parent\"></param>\n      <param name=\"worldPositionStays\"></param>\n      <param name=\"position\"></param>\n      <param name=\"rotation\"></param>\n      <returns>\n        <para>Object of type T.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Object.Instantiate(T,UnityEngine.Vector3,UnityEngine.Quaternion)\">\n      <summary>\n        <para>You can also use Generics to instantiate objects. See the page for more details.</para>\n      </summary>\n      <param name=\"original\">Object of type T that you want to make a clone of.</param>\n      <param name=\"parent\"></param>\n      <param name=\"worldPositionStays\"></param>\n      <param name=\"position\"></param>\n      <param name=\"rotation\"></param>\n      <returns>\n        <para>Object of type T.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Object.Instantiate(T,UnityEngine.Vector3,UnityEngine.Quaternion,UnityEngine.Transform)\">\n      <summary>\n        <para>You can also use Generics to instantiate objects. See the page for more details.</para>\n      </summary>\n      <param name=\"original\">Object of type T that you want to make a clone of.</param>\n      <param name=\"parent\"></param>\n      <param name=\"worldPositionStays\"></param>\n      <param name=\"position\"></param>\n      <param name=\"rotation\"></param>\n      <returns>\n        <para>Object of type T.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.Object.op_Equal(UnityEngine.Object,UnityEngine.Object)\">\n      <summary>\n        <para>Compares two object references to see if they refer to the same object.</para>\n      </summary>\n      <param name=\"x\">The first Object.</param>\n      <param name=\"y\">The Object to compare against the first.</param>\n    </member>\n    <member name=\"?:UnityEngine.Object.op_NotEqual(UnityEngine.Object,UnityEngine.Object)\">\n      <summary>\n        <para>Compares if two objects refer to a different object.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Object.ToString\">\n      <summary>\n        <para>Returns the name of the GameObject.</para>\n      </summary>\n      <returns>\n        <para>The name returned by ToString.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.OcclusionArea\">\n      <summary>\n        <para>OcclusionArea is an area in which occlusion culling is performed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.OcclusionArea.center\">\n      <summary>\n        <para>Center of the occlusion area relative to the transform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.OcclusionArea.size\">\n      <summary>\n        <para>Size that the occlusion area will have.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.OcclusionPortal\">\n      <summary>\n        <para>The portal for dynamically changing occlusion at runtime.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.OcclusionPortal.open\">\n      <summary>\n        <para>Gets / sets the portal's open state.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.OperatingSystemFamily\">\n      <summary>\n        <para>Enumeration for SystemInfo.operatingSystemFamily.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.OperatingSystemFamily.Linux\">\n      <summary>\n        <para>Linux operating system family.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.OperatingSystemFamily.MacOSX\">\n      <summary>\n        <para>macOS operating system family.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.OperatingSystemFamily.Other\">\n      <summary>\n        <para>Returned for operating systems that do not fall into any other category.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.OperatingSystemFamily.Windows\">\n      <summary>\n        <para>Windows operating system family.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleAnimator\">\n      <summary>\n        <para>(Legacy Particles) Particle animators move your particles over time, you use them to apply wind, drag &amp; color cycling to your particle emitters.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleCollisionEvent\">\n      <summary>\n        <para>Information about a particle collision.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleCollisionEvent.collider\">\n      <summary>\n        <para>The Collider for the GameObject struck by the particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleCollisionEvent.colliderComponent\">\n      <summary>\n        <para>The Collider or Collider2D for the GameObject struck by the particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleCollisionEvent.intersection\">\n      <summary>\n        <para>Intersection point of the collision in world coordinates.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleCollisionEvent.normal\">\n      <summary>\n        <para>Geometry normal at the intersection point of the collision.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleCollisionEvent.velocity\">\n      <summary>\n        <para>Incident velocity at the intersection point of the collision.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleEmitter\">\n      <summary>\n        <para>(Legacy Particles) Script interface for particle emitters.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticlePhysicsExtensions\">\n      <summary>\n        <para>Method extension for Physics in Particle System.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticlePhysicsExtensions.GetCollisionEvents(UnityEngine.ParticleSystem,UnityEngine.GameObject,UnityEngine.ParticleCollisionEvent[])\">\n      <summary>\n        <para>Get the particle collision events for a GameObject. Returns the number of events written to the array.</para>\n      </summary>\n      <param name=\"go\">The GameObject for which to retrieve collision events.</param>\n      <param name=\"collisionEvents\">Array to write collision events to.</param>\n      <param name=\"ps\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ParticlePhysicsExtensions.GetSafeCollisionEventSize(UnityEngine.ParticleSystem)\">\n      <summary>\n        <para>Safe array size for use with ParticleSystem.GetCollisionEvents.</para>\n      </summary>\n      <param name=\"ps\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ParticlePhysicsExtensions.GetSafeTriggerParticlesSize(UnityEngine.ParticleSystem,UnityEngine.ParticleSystemTriggerEventType)\">\n      <summary>\n        <para>Safe array size for use with ParticleSystem.GetTriggerParticles.</para>\n      </summary>\n      <param name=\"ps\">Particle system.</param>\n      <param name=\"type\">Type of trigger to return size for.</param>\n      <returns>\n        <para>Number of particles with this trigger event type.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticlePhysicsExtensions.GetTriggerParticles\">\n      <summary>\n        <para>Get the particles that met the condition in the particle trigger module. Returns the number of particles written to the array.</para>\n      </summary>\n      <param name=\"ps\">Particle system.</param>\n      <param name=\"type\">Type of trigger to return particles for.</param>\n      <param name=\"particles\">The array of particles matching the trigger event type.</param>\n      <returns>\n        <para>Number of particles with this trigger event type.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticlePhysicsExtensions.SetTriggerParticles\">\n      <summary>\n        <para>Write modified particles back to the particle system, during a call to OnParticleTrigger.</para>\n      </summary>\n      <param name=\"ps\">Particle system.</param>\n      <param name=\"type\">Type of trigger to set particles for.</param>\n      <param name=\"particles\">Particle array.</param>\n      <param name=\"offset\">Offset into the array, if you only want to write back a subset of the returned particles.</param>\n      <param name=\"count\">Number of particles to write, if you only want to write back a subset of the returned particles.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticlePhysicsExtensions.SetTriggerParticles\">\n      <summary>\n        <para>Write modified particles back to the particle system, during a call to OnParticleTrigger.</para>\n      </summary>\n      <param name=\"ps\">Particle system.</param>\n      <param name=\"type\">Type of trigger to set particles for.</param>\n      <param name=\"particles\">Particle array.</param>\n      <param name=\"offset\">Offset into the array, if you only want to write back a subset of the returned particles.</param>\n      <param name=\"count\">Number of particles to write, if you only want to write back a subset of the returned particles.</param>\n    </member>\n    <member name=\"T:UnityEngine.ParticleRenderer\">\n      <summary>\n        <para>(Legacy Particles) Renders particles on to the screen.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem\">\n      <summary>\n        <para>Script interface for particle systems (Shuriken).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.automaticCullingEnabled\">\n      <summary>\n        <para>Does this system support Automatic Culling?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.collision\">\n      <summary>\n        <para>Access the particle system collision module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.colorBySpeed\">\n      <summary>\n        <para>Access the particle system color by lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.colorOverLifetime\">\n      <summary>\n        <para>Access the particle system color over lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.customData\">\n      <summary>\n        <para>Access the particle system Custom Data module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.duration\">\n      <summary>\n        <para>The duration of the particle system in seconds (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.emission\">\n      <summary>\n        <para>Access the particle system emission module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.emissionRate\">\n      <summary>\n        <para>The rate of emission.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.enableEmission\">\n      <summary>\n        <para>When set to false, the particle system will not emit particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.externalForces\">\n      <summary>\n        <para>Access the particle system external forces module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.forceOverLifetime\">\n      <summary>\n        <para>Access the particle system force over lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.gravityModifier\">\n      <summary>\n        <para>Scale being applied to the gravity defined by Physics.gravity.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.inheritVelocity\">\n      <summary>\n        <para>Access the particle system velocity inheritance module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.isEmitting\">\n      <summary>\n        <para>Is the Particle System currently emitting particles? A Particle System may stop emitting when its emission module has finished, it has been paused or if the system has been stopped using ParticleSystem.Stop|Stop with the ParticleSystemStopBehavior.StopEmitting|StopEmitting flag. Resume emitting by calling ParticleSystem.Play|Play.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.isPaused\">\n      <summary>\n        <para>Is the Particle System paused right now?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.isPlaying\">\n      <summary>\n        <para>Is the Particle System playing right now?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.isStopped\">\n      <summary>\n        <para>Is the Particle System stopped right now?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.lights\">\n      <summary>\n        <para>Access the particle system lights module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.limitVelocityOverLifetime\">\n      <summary>\n        <para>Access the particle system limit velocity over lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.loop\">\n      <summary>\n        <para>Is the particle system looping?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.main\">\n      <summary>\n        <para>Access the main particle system settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.maxParticles\">\n      <summary>\n        <para>The maximum number of particles to emit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.noise\">\n      <summary>\n        <para>Access the particle system noise module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.particleCount\">\n      <summary>\n        <para>The current number of particles (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.playbackSpeed\">\n      <summary>\n        <para>The playback speed of the particle system. 1 is normal playback speed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.playOnAwake\">\n      <summary>\n        <para>If set to true, the particle system will automatically start playing on startup.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.randomSeed\">\n      <summary>\n        <para>Override the random seed used for the particle system emission.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.rotationBySpeed\">\n      <summary>\n        <para>Access the particle system rotation by speed  module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.rotationOverLifetime\">\n      <summary>\n        <para>Access the particle system rotation over lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.scalingMode\">\n      <summary>\n        <para>The scaling mode applied to particle sizes and positions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.shape\">\n      <summary>\n        <para>Access the particle system shape module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.simulationSpace\">\n      <summary>\n        <para>This selects the space in which to simulate particles. It can be either world or local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.sizeBySpeed\">\n      <summary>\n        <para>Access the particle system size by speed module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.sizeOverLifetime\">\n      <summary>\n        <para>Access the particle system size over lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.startColor\">\n      <summary>\n        <para>The initial color of particles when emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.startDelay\">\n      <summary>\n        <para>Start delay in seconds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.startLifetime\">\n      <summary>\n        <para>The total lifetime in seconds that particles will have when emitted. When using curves, this values acts as a scale on the curve. This value is set in the particle when it is created by the particle system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.startRotation\">\n      <summary>\n        <para>The initial rotation of particles when emitted. When using curves, this values acts as a scale on the curve.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.startRotation3D\">\n      <summary>\n        <para>The initial 3D rotation of particles when emitted. When using curves, this values acts as a scale on the curves.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.startSize\">\n      <summary>\n        <para>The initial size of particles when emitted. When using curves, this values acts as a scale on the curve.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.startSpeed\">\n      <summary>\n        <para>The initial speed of particles when emitted. When using curves, this values acts as a scale on the curve.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.subEmitters\">\n      <summary>\n        <para>Access the particle system sub emitters module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.textureSheetAnimation\">\n      <summary>\n        <para>Access the particle system texture sheet animation module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.time\">\n      <summary>\n        <para>Playback position in seconds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.trails\">\n      <summary>\n        <para>Access the particle system trails module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.trigger\">\n      <summary>\n        <para>Access the particle system trigger module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.useAutoRandomSeed\">\n      <summary>\n        <para>Controls whether the Particle System uses an automatically-generated random number to seed the random number generator.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.velocityOverLifetime\">\n      <summary>\n        <para>Access the particle system velocity over lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.Burst\">\n      <summary>\n        <para>Script interface for a Burst.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Burst.count\">\n      <summary>\n        <para>Number of particles to be emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Burst.cycleCount\">\n      <summary>\n        <para>How many times to play the burst. (0 means infinitely).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Burst.maxCount\">\n      <summary>\n        <para>Maximum number of particles to be emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Burst.minCount\">\n      <summary>\n        <para>Minimum number of particles to be emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Burst.repeatInterval\">\n      <summary>\n        <para>How often to repeat the burst, in seconds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Burst.time\">\n      <summary>\n        <para>The time that each burst occurs.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.Burst.#ctor(System.Single,System.Int16)\">\n      <summary>\n        <para>Construct a new Burst with a time and count.</para>\n      </summary>\n      <param name=\"_time\">Time to emit the burst.</param>\n      <param name=\"_minCount\">Minimum number of particles to emit.</param>\n      <param name=\"_maxCount\">Maximum number of particles to emit.</param>\n      <param name=\"_count\">Number of particles to emit.</param>\n      <param name=\"_cycleCount\">Number of times to play the burst. (0 means indefinitely).</param>\n      <param name=\"_repeatInterval\">How often to repeat the burst, in seconds.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.Burst.#ctor(System.Single,System.Int16,System.Int16)\">\n      <summary>\n        <para>Construct a new Burst with a time and count.</para>\n      </summary>\n      <param name=\"_time\">Time to emit the burst.</param>\n      <param name=\"_minCount\">Minimum number of particles to emit.</param>\n      <param name=\"_maxCount\">Maximum number of particles to emit.</param>\n      <param name=\"_count\">Number of particles to emit.</param>\n      <param name=\"_cycleCount\">Number of times to play the burst. (0 means indefinitely).</param>\n      <param name=\"_repeatInterval\">How often to repeat the burst, in seconds.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.Burst.#ctor(System.Single,System.Int16,System.Int16,System.Int32,System.Single)\">\n      <summary>\n        <para>Construct a new Burst with a time and count.</para>\n      </summary>\n      <param name=\"_time\">Time to emit the burst.</param>\n      <param name=\"_minCount\">Minimum number of particles to emit.</param>\n      <param name=\"_maxCount\">Maximum number of particles to emit.</param>\n      <param name=\"_count\">Number of particles to emit.</param>\n      <param name=\"_cycleCount\">Number of times to play the burst. (0 means indefinitely).</param>\n      <param name=\"_repeatInterval\">How often to repeat the burst, in seconds.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.Burst.#ctor(System.Single,UnityEngine.ParticleSystem/MinMaxCurve)\">\n      <summary>\n        <para>Construct a new Burst with a time and count.</para>\n      </summary>\n      <param name=\"_time\">Time to emit the burst.</param>\n      <param name=\"_minCount\">Minimum number of particles to emit.</param>\n      <param name=\"_maxCount\">Maximum number of particles to emit.</param>\n      <param name=\"_count\">Number of particles to emit.</param>\n      <param name=\"_cycleCount\">Number of times to play the burst. (0 means indefinitely).</param>\n      <param name=\"_repeatInterval\">How often to repeat the burst, in seconds.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.Burst.#ctor(System.Single,UnityEngine.ParticleSystem/MinMaxCurve,System.Int32,System.Single)\">\n      <summary>\n        <para>Construct a new Burst with a time and count.</para>\n      </summary>\n      <param name=\"_time\">Time to emit the burst.</param>\n      <param name=\"_minCount\">Minimum number of particles to emit.</param>\n      <param name=\"_maxCount\">Maximum number of particles to emit.</param>\n      <param name=\"_count\">Number of particles to emit.</param>\n      <param name=\"_cycleCount\">Number of times to play the burst. (0 means indefinitely).</param>\n      <param name=\"_repeatInterval\">How often to repeat the burst, in seconds.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.Clear(System.Boolean)\">\n      <summary>\n        <para>Remove all particles in the particle system.</para>\n      </summary>\n      <param name=\"withChildren\">Clear all child particle systems as well.</param>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.CollisionModule\">\n      <summary>\n        <para>Script interface for the Collision module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.bounce\">\n      <summary>\n        <para>How much force is applied to each particle after a collision.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.bounceMultiplier\">\n      <summary>\n        <para>Change the bounce multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.colliderForce\">\n      <summary>\n        <para>How much force is applied to a Collider when hit by particles from this Particle System.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.collidesWith\">\n      <summary>\n        <para>Control which layers this particle system collides with.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.dampen\">\n      <summary>\n        <para>How much speed is lost from each particle after a collision.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.dampenMultiplier\">\n      <summary>\n        <para>Change the dampen multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.enabled\">\n      <summary>\n        <para>Enable/disable the Collision module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.enableDynamicColliders\">\n      <summary>\n        <para>Allow particles to collide with dynamic colliders when using world collision mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.enableInteriorCollisions\">\n      <summary>\n        <para>Allow particles to collide when inside colliders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.lifetimeLoss\">\n      <summary>\n        <para>How much a particle's lifetime is reduced after a collision.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.lifetimeLossMultiplier\">\n      <summary>\n        <para>Change the lifetime loss multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.maxCollisionShapes\">\n      <summary>\n        <para>The maximum number of collision shapes that will be considered for particle collisions. Excess shapes will be ignored. Terrains take priority.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.maxKillSpeed\">\n      <summary>\n        <para>Kill particles whose speed goes above this threshold, after a collision.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.maxPlaneCount\">\n      <summary>\n        <para>The maximum number of planes it is possible to set as colliders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.minKillSpeed\">\n      <summary>\n        <para>Kill particles whose speed falls below this threshold, after a collision.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.mode\">\n      <summary>\n        <para>Choose between 2D and 3D world collisions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.multiplyColliderForceByCollisionAngle\">\n      <summary>\n        <para>If true, the collision angle is considered when applying forces from particles to Colliders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.multiplyColliderForceByParticleSize\">\n      <summary>\n        <para>If true, particle sizes are considered when applying forces to Colliders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.multiplyColliderForceByParticleSpeed\">\n      <summary>\n        <para>If true, particle speeds are considered when applying forces to Colliders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.quality\">\n      <summary>\n        <para>Specifies the accuracy of particle collisions against colliders in the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.radiusScale\">\n      <summary>\n        <para>A multiplier applied to the size of each particle before collisions are processed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.sendCollisionMessages\">\n      <summary>\n        <para>Send collision callback messages.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.type\">\n      <summary>\n        <para>The type of particle collision to perform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CollisionModule.voxelSize\">\n      <summary>\n        <para>Size of voxels in the collision cache.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.CollisionModule.GetPlane(System.Int32)\">\n      <summary>\n        <para>Get a collision plane associated with this particle system.</para>\n      </summary>\n      <param name=\"index\">Specifies which plane to access.</param>\n      <returns>\n        <para>The plane.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.CollisionModule.SetPlane(System.Int32,UnityEngine.Transform)\">\n      <summary>\n        <para>Set a collision plane to be used with this particle system.</para>\n      </summary>\n      <param name=\"index\">Specifies which plane to set.</param>\n      <param name=\"transform\">The plane to set.</param>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.ColorBySpeedModule\">\n      <summary>\n        <para>Script interface for the Color By Speed module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ColorBySpeedModule.color\">\n      <summary>\n        <para>The gradient controlling the particle colors.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ColorBySpeedModule.enabled\">\n      <summary>\n        <para>Enable/disable the Color By Speed module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ColorBySpeedModule.range\">\n      <summary>\n        <para>Apply the color gradient between these minimum and maximum speeds.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.ColorOverLifetimeModule\">\n      <summary>\n        <para>Script interface for the Color Over Lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ColorOverLifetimeModule.color\">\n      <summary>\n        <para>The gradient controlling the particle colors.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ColorOverLifetimeModule.enabled\">\n      <summary>\n        <para>Enable/disable the Color Over Lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.CustomDataModule\">\n      <summary>\n        <para>Script interface for the Custom Data module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.CustomDataModule.enabled\">\n      <summary>\n        <para>Enable/disable the Custom Data module.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.CustomDataModule.GetColor(UnityEngine.ParticleSystemCustomData)\">\n      <summary>\n        <para>Get a ParticleSystem.MinMaxGradient, that is being used to generate custom HDR color data.</para>\n      </summary>\n      <param name=\"stream\">The name of the custom data stream to retrieve the gradient from.</param>\n      <returns>\n        <para>The color gradient being used to generate custom color data.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.CustomDataModule.GetMode(UnityEngine.ParticleSystemCustomData)\">\n      <summary>\n        <para>Find out the type of custom data that is being generated for the chosen data stream.</para>\n      </summary>\n      <param name=\"stream\">The name of the custom data stream to query.</param>\n      <returns>\n        <para>The type of data being generated for the requested stream.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.CustomDataModule.GetVector(UnityEngine.ParticleSystemCustomData,System.Int32)\">\n      <summary>\n        <para>Get a ParticleSystem.MinMaxCurve, that is being used to generate custom data.</para>\n      </summary>\n      <param name=\"stream\">The name of the custom data stream to retrieve the curve from.</param>\n      <param name=\"component\">The component index to retrieve the curve for (0-3, mapping to the xyzw components of a Vector4 or float4).</param>\n      <returns>\n        <para>The curve being used to generate custom data.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.CustomDataModule.GetVectorComponentCount(UnityEngine.ParticleSystemCustomData)\">\n      <summary>\n        <para>Query how many ParticleSystem.MinMaxCurve elements are being used to generate this stream of custom data.</para>\n      </summary>\n      <param name=\"stream\">The name of the custom data stream to retrieve the curve from.</param>\n      <returns>\n        <para>The number of curves.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.CustomDataModule.SetColor(UnityEngine.ParticleSystemCustomData,UnityEngine.ParticleSystem/MinMaxGradient)\">\n      <summary>\n        <para>Set a ParticleSystem.MinMaxGradient, in order to generate custom HDR color data.</para>\n      </summary>\n      <param name=\"stream\">The name of the custom data stream to apply the gradient to.</param>\n      <param name=\"gradient\">The gradient to be used for generating custom color data.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.CustomDataModule.SetMode(UnityEngine.ParticleSystemCustomData,UnityEngine.ParticleSystemCustomDataMode)\">\n      <summary>\n        <para>Choose the type of custom data to generate for the chosen data stream.</para>\n      </summary>\n      <param name=\"stream\">The name of the custom data stream to enable data generation on.</param>\n      <param name=\"mode\">The type of data to generate.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.CustomDataModule.SetVector(UnityEngine.ParticleSystemCustomData,System.Int32,UnityEngine.ParticleSystem/MinMaxCurve)\">\n      <summary>\n        <para>Set a ParticleSystem.MinMaxCurve, in order to generate custom data.</para>\n      </summary>\n      <param name=\"stream\">The name of the custom data stream to apply the curve to.</param>\n      <param name=\"component\">The component index to apply the curve to (0-3, mapping to the xyzw components of a Vector4 or float4).</param>\n      <param name=\"curve\">The curve to be used for generating custom data.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.CustomDataModule.SetVectorComponentCount(UnityEngine.ParticleSystemCustomData,System.Int32)\">\n      <summary>\n        <para>Specify how many curves are used to generate custom data for this stream.</para>\n      </summary>\n      <param name=\"stream\">The name of the custom data stream to apply the curve to.</param>\n      <param name=\"curveCount\">The number of curves to generate data for.</param>\n      <param name=\"count\"></param>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.EmissionModule\">\n      <summary>\n        <para>Script interface for the Emission module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmissionModule.burstCount\">\n      <summary>\n        <para>The current number of bursts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmissionModule.enabled\">\n      <summary>\n        <para>Enable/disable the Emission module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmissionModule.rate\">\n      <summary>\n        <para>The rate at which new particles are spawned.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmissionModule.rateMultiplier\">\n      <summary>\n        <para>Change the rate multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmissionModule.rateOverDistance\">\n      <summary>\n        <para>The rate at which new particles are spawned, over distance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmissionModule.rateOverDistanceMultiplier\">\n      <summary>\n        <para>Change the rate over distance multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmissionModule.rateOverTime\">\n      <summary>\n        <para>The rate at which new particles are spawned, over time.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmissionModule.rateOverTimeMultiplier\">\n      <summary>\n        <para>Change the rate over time multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmissionModule.type\">\n      <summary>\n        <para>The emission type.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.EmissionModule.GetBurst(System.Int32)\">\n      <summary>\n        <para>Get a single burst from the array of bursts.</para>\n      </summary>\n      <param name=\"index\">The index of the burst to retrieve.</param>\n      <returns>\n        <para>The burst data at the given index.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.EmissionModule.GetBursts(UnityEngine.ParticleSystem/Burst[])\">\n      <summary>\n        <para>Get the burst array.</para>\n      </summary>\n      <param name=\"bursts\">Array of bursts to be filled in.</param>\n      <returns>\n        <para>The number of bursts in the array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.EmissionModule.SetBurst(System.Int32,UnityEngine.ParticleSystem/Burst)\">\n      <summary>\n        <para>Set a single burst in the array of bursts.</para>\n      </summary>\n      <param name=\"index\">The index of the burst to retrieve.</param>\n      <param name=\"burst\">The new burst data to apply to the Particle System.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.EmissionModule.SetBursts(UnityEngine.ParticleSystem/Burst[])\">\n      <summary>\n        <para>Set the burst array.</para>\n      </summary>\n      <param name=\"bursts\">Array of bursts.</param>\n      <param name=\"size\">Optional array size, if burst count is less than array size.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.EmissionModule.SetBursts(UnityEngine.ParticleSystem/Burst[],System.Int32)\">\n      <summary>\n        <para>Set the burst array.</para>\n      </summary>\n      <param name=\"bursts\">Array of bursts.</param>\n      <param name=\"size\">Optional array size, if burst count is less than array size.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.Emit(System.Int32)\">\n      <summary>\n        <para>Emit count particles immediately.</para>\n      </summary>\n      <param name=\"count\">Number of particles to emit.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.Emit(UnityEngine.ParticleSystem/EmitParams,System.Int32)\">\n      <summary>\n        <para>Emit a number of particles from script.</para>\n      </summary>\n      <param name=\"emitParams\">Overidden particle properties.</param>\n      <param name=\"count\">Number of particles to emit.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.Emit(UnityEngine.Vector3,UnityEngine.Vector3,System.Single,System.Single,UnityEngine.Color32)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"velocity\"></param>\n      <param name=\"size\"></param>\n      <param name=\"lifetime\"></param>\n      <param name=\"color\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.Emit(UnityEngine.ParticleSystem/Particle)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"particle\"></param>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.EmitParams\">\n      <summary>\n        <para>Script interface for particle emission parameters.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmitParams.angularVelocity\">\n      <summary>\n        <para>Override the angular velocity of emitted particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmitParams.angularVelocity3D\">\n      <summary>\n        <para>Override the 3D angular velocity of emitted particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmitParams.applyShapeToPosition\">\n      <summary>\n        <para>When overriding the position of particles, setting this flag to true allows you to retain the influence of the shape module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmitParams.axisOfRotation\">\n      <summary>\n        <para>Override the axis of rotation of emitted particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmitParams.position\">\n      <summary>\n        <para>Override the position of emitted particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmitParams.randomSeed\">\n      <summary>\n        <para>Override the random seed of emitted particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmitParams.rotation\">\n      <summary>\n        <para>Override the rotation of emitted particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmitParams.rotation3D\">\n      <summary>\n        <para>Override the 3D rotation of emitted particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmitParams.startColor\">\n      <summary>\n        <para>Override the initial color of emitted particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmitParams.startLifetime\">\n      <summary>\n        <para>Override the lifetime of emitted particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmitParams.startSize\">\n      <summary>\n        <para>Override the initial size of emitted particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmitParams.startSize3D\">\n      <summary>\n        <para>Override the initial 3D size of emitted particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.EmitParams.velocity\">\n      <summary>\n        <para>Override the velocity of emitted particles.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.EmitParams.ResetAngularVelocity\">\n      <summary>\n        <para>Reverts angularVelocity and angularVelocity3D back to the values specified in the inspector.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.EmitParams.ResetAxisOfRotation\">\n      <summary>\n        <para>Revert the axis of rotation back to the value specified in the inspector.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.EmitParams.ResetPosition\">\n      <summary>\n        <para>Revert the position back to the value specified in the inspector.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.EmitParams.ResetRandomSeed\">\n      <summary>\n        <para>Revert the random seed back to the value specified in the inspector.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.EmitParams.ResetRotation\">\n      <summary>\n        <para>Reverts rotation and rotation3D back to the values specified in the inspector.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.EmitParams.ResetStartColor\">\n      <summary>\n        <para>Revert the initial color back to the value specified in the inspector.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.EmitParams.ResetStartLifetime\">\n      <summary>\n        <para>Revert the lifetime back to the value specified in the inspector.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.EmitParams.ResetStartSize\">\n      <summary>\n        <para>Revert the initial size back to the value specified in the inspector.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.EmitParams.ResetVelocity\">\n      <summary>\n        <para>Revert the velocity back to the value specified in the inspector.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.ExternalForcesModule\">\n      <summary>\n        <para>Script interface for the External Forces module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ExternalForcesModule.enabled\">\n      <summary>\n        <para>Enable/disable the External Forces module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ExternalForcesModule.multiplier\">\n      <summary>\n        <para>Multiplies the magnitude of applied external forces.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.ForceOverLifetimeModule\">\n      <summary>\n        <para>Script interface for the Force Over Lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ForceOverLifetimeModule.enabled\">\n      <summary>\n        <para>Enable/disable the Force Over Lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ForceOverLifetimeModule.randomized\">\n      <summary>\n        <para>When randomly selecting values between two curves or constants, this flag will cause a new random force to be chosen on each frame.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ForceOverLifetimeModule.space\">\n      <summary>\n        <para>Are the forces being applied in local or world space?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ForceOverLifetimeModule.x\">\n      <summary>\n        <para>The curve defining particle forces in the X axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ForceOverLifetimeModule.xMultiplier\">\n      <summary>\n        <para>Change the X axis mulutiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ForceOverLifetimeModule.y\">\n      <summary>\n        <para>The curve defining particle forces in the Y axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ForceOverLifetimeModule.yMultiplier\">\n      <summary>\n        <para>Change the Y axis multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ForceOverLifetimeModule.z\">\n      <summary>\n        <para>The curve defining particle forces in the Z axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ForceOverLifetimeModule.zMultiplier\">\n      <summary>\n        <para>Change the Z axis multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.GetCustomParticleData(System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;,UnityEngine.ParticleSystemCustomData)\">\n      <summary>\n        <para>Get a stream of custom per-particle data.</para>\n      </summary>\n      <param name=\"customData\">The array of per-particle data.</param>\n      <param name=\"streamIndex\">Which stream to retrieve the data from.</param>\n      <returns>\n        <para>The amount of valid per-particle data.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.GetParticles(UnityEngine.ParticleSystem/Particle[])\">\n      <summary>\n        <para>Gets the particles of this particle system.</para>\n      </summary>\n      <param name=\"particles\">Output particle buffer, containing the current particle state.</param>\n      <returns>\n        <para>The number of particles written to the input particle array (the number of particles currently alive).</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.InheritVelocityModule\">\n      <summary>\n        <para>The Inherit Velocity Module controls how the velocity of the emitter is transferred to the particles as they are emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.InheritVelocityModule.curve\">\n      <summary>\n        <para>Curve to define how much emitter velocity is applied during the lifetime of a particle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.InheritVelocityModule.curveMultiplier\">\n      <summary>\n        <para>Change the curve multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.InheritVelocityModule.enabled\">\n      <summary>\n        <para>Enable/disable the InheritVelocity module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.InheritVelocityModule.mode\">\n      <summary>\n        <para>How to apply emitter velocity to particles.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.IsAlive(System.Boolean)\">\n      <summary>\n        <para>Does the system contain any live particles, or will it produce more?</para>\n      </summary>\n      <param name=\"withChildren\">Check all child particle systems as well.</param>\n      <returns>\n        <para>True if the Particle System is still \"alive\". False if the Particle System has stopped emitting particles and all particles are dead.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.LightsModule\">\n      <summary>\n        <para>Access the ParticleSystem Lights Module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LightsModule.alphaAffectsIntensity\">\n      <summary>\n        <para>Toggle whether the particle alpha gets multiplied by the light intensity, when computing the final light intensity.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LightsModule.enabled\">\n      <summary>\n        <para>Enable/disable the Lights module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LightsModule.intensity\">\n      <summary>\n        <para>Define a curve to apply custom intensity scaling to particle lights.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LightsModule.intensityMultiplier\">\n      <summary>\n        <para>Intensity multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LightsModule.light\">\n      <summary>\n        <para>Select what Light prefab you want to base your particle lights on.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LightsModule.maxLights\">\n      <summary>\n        <para>Set a limit on how many lights this Module can create.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LightsModule.range\">\n      <summary>\n        <para>Define a curve to apply custom range scaling to particle lights.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LightsModule.rangeMultiplier\">\n      <summary>\n        <para>Range multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LightsModule.ratio\">\n      <summary>\n        <para>Choose what proportion of particles will receive a dynamic light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LightsModule.sizeAffectsRange\">\n      <summary>\n        <para>Toggle where the particle size will be multiplied by the light range, to determine the final light range.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LightsModule.useParticleColor\">\n      <summary>\n        <para>Toggle whether the particle lights will have their color multiplied by the particle color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LightsModule.useRandomDistribution\">\n      <summary>\n        <para>Randomly assign lights to new particles based on ParticleSystem.LightsModule.ratio.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule\">\n      <summary>\n        <para>Script interface for the Limit Velocity Over Lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule.dampen\">\n      <summary>\n        <para>Controls how much the velocity that exceeds the velocity limit should be dampened.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule.drag\">\n      <summary>\n        <para>Controls the amount of drag applied to the particle velocities.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule.dragMultiplier\">\n      <summary>\n        <para>Change the drag multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule.enabled\">\n      <summary>\n        <para>Enable/disable the Limit Force Over Lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule.limit\">\n      <summary>\n        <para>Maximum velocity curve, when not using one curve per axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule.limitMultiplier\">\n      <summary>\n        <para>Change the limit multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule.limitX\">\n      <summary>\n        <para>Maximum velocity curve for the X axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule.limitXMultiplier\">\n      <summary>\n        <para>Change the limit multiplier on the X axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule.limitY\">\n      <summary>\n        <para>Maximum velocity curve for the Y axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule.limitYMultiplier\">\n      <summary>\n        <para>Change the limit multiplier on the Y axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule.limitZ\">\n      <summary>\n        <para>Maximum velocity curve for the Z axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule.limitZMultiplier\">\n      <summary>\n        <para>Change the limit multiplier on the Z axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule.multiplyDragByParticleSize\">\n      <summary>\n        <para>Adjust the amount of drag applied to particles, based on their sizes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule.multiplyDragByParticleVelocity\">\n      <summary>\n        <para>Adjust the amount of drag applied to particles, based on their speeds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule.separateAxes\">\n      <summary>\n        <para>Set the velocity limit on each axis separately.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.LimitVelocityOverLifetimeModule.space\">\n      <summary>\n        <para>Specifies if the velocity limits are in local space (rotated with the transform) or world space.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.MainModule\">\n      <summary>\n        <para>Script interface for the main module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.customSimulationSpace\">\n      <summary>\n        <para>Simulate particles relative to a custom transform component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.duration\">\n      <summary>\n        <para>The duration of the particle system in seconds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.emitterVelocityMode\">\n      <summary>\n        <para>Control how the Particle System calculates its velocity, when moving in the world.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.flipRotation\">\n      <summary>\n        <para>Makes some particles spin in the opposite direction.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.gravityModifier\">\n      <summary>\n        <para>Scale applied to the gravity, defined by Physics.gravity.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.gravityModifierMultiplier\">\n      <summary>\n        <para>Change the gravity mulutiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.loop\">\n      <summary>\n        <para>Is the particle system looping?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.maxParticles\">\n      <summary>\n        <para>The maximum number of particles to emit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.playOnAwake\">\n      <summary>\n        <para>If set to true, the particle system will automatically start playing on startup.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.prewarm\">\n      <summary>\n        <para>When looping is enabled, this controls whether this particle system will look like it has already simulated for one loop when first becoming visible.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.randomizeRotationDirection\">\n      <summary>\n        <para>Cause some particles to spin in  the opposite direction.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.scalingMode\">\n      <summary>\n        <para>Control how the particle system's Transform Component is applied to the particle system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.simulationSpace\">\n      <summary>\n        <para>This selects the space in which to simulate particles. It can be either world or local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.simulationSpeed\">\n      <summary>\n        <para>Override the default playback speed of the Particle System.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startColor\">\n      <summary>\n        <para>The initial color of particles when emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startDelay\">\n      <summary>\n        <para>Start delay in seconds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startDelayMultiplier\">\n      <summary>\n        <para>Start delay multiplier in seconds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startLifetime\">\n      <summary>\n        <para>The total lifetime in seconds that each new particle will have.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startLifetimeMultiplier\">\n      <summary>\n        <para>Start lifetime multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startRotation\">\n      <summary>\n        <para>The initial rotation of particles when emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startRotation3D\">\n      <summary>\n        <para>A flag to enable 3D particle rotation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startRotationMultiplier\">\n      <summary>\n        <para>Start rotation multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startRotationX\">\n      <summary>\n        <para>The initial rotation of particles around the X axis when emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startRotationXMultiplier\">\n      <summary>\n        <para>Start rotation multiplier around the X axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startRotationY\">\n      <summary>\n        <para>The initial rotation of particles around the Y axis when emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startRotationYMultiplier\">\n      <summary>\n        <para>Start rotation multiplier around the Y axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startRotationZ\">\n      <summary>\n        <para>The initial rotation of particles around the Z axis when emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startRotationZMultiplier\">\n      <summary>\n        <para>Start rotation multiplier around the Z axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startSize\">\n      <summary>\n        <para>The initial size of particles when emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startSize3D\">\n      <summary>\n        <para>A flag to enable specifying particle size individually for each axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startSizeMultiplier\">\n      <summary>\n        <para>Start size multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startSizeX\">\n      <summary>\n        <para>The initial size of particles along the X axis when emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startSizeXMultiplier\">\n      <summary>\n        <para>Start rotation multiplier along the X axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startSizeY\">\n      <summary>\n        <para>The initial size of particles along the Y axis when emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startSizeYMultiplier\">\n      <summary>\n        <para>Start rotation multiplier along the Y axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startSizeZ\">\n      <summary>\n        <para>The initial size of particles along the Z axis when emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startSizeZMultiplier\">\n      <summary>\n        <para>Start rotation multiplier along the Z axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startSpeed\">\n      <summary>\n        <para>The initial speed of particles when emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.startSpeedMultiplier\">\n      <summary>\n        <para>A multiplier of the initial speed of particles when emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.stopAction\">\n      <summary>\n        <para>Configure whether the GameObject will automatically disable or destroy itself, when the Particle System is stopped and all particles have died.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MainModule.useUnscaledTime\">\n      <summary>\n        <para>When true, use the unscaled delta time to simulate the Particle System. Otherwise, use the scaled delta time.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.MinMaxCurve\">\n      <summary>\n        <para>Script interface for a Min-Max Curve.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MinMaxCurve.constant\">\n      <summary>\n        <para>Set the constant value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MinMaxCurve.constantMax\">\n      <summary>\n        <para>Set a constant for the upper bound.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MinMaxCurve.constantMin\">\n      <summary>\n        <para>Set a constant for the lower bound.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MinMaxCurve.curve\">\n      <summary>\n        <para>Set the curve.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MinMaxCurve.curveMax\">\n      <summary>\n        <para>Set a curve for the upper bound.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MinMaxCurve.curveMin\">\n      <summary>\n        <para>Set a curve for the lower bound.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MinMaxCurve.curveMultiplier\">\n      <summary>\n        <para>Set a multiplier to be applied to the curves.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MinMaxCurve.mode\">\n      <summary>\n        <para>Set the mode that the min-max curve will use to evaluate values.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.MinMaxCurve.#ctor(System.Single)\">\n      <summary>\n        <para>A single constant value for the entire curve.</para>\n      </summary>\n      <param name=\"constant\">Constant value.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.MinMaxCurve.#ctor(System.Single,UnityEngine.AnimationCurve)\">\n      <summary>\n        <para>Use one curve when evaluating numbers along this Min-Max curve.</para>\n      </summary>\n      <param name=\"scalar\">A multiplier to be applied to the curve.</param>\n      <param name=\"curve\">A single curve for evaluating against.</param>\n      <param name=\"multiplier\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.MinMaxCurve.#ctor(System.Single,UnityEngine.AnimationCurve,UnityEngine.AnimationCurve)\">\n      <summary>\n        <para>Randomly select values based on the interval between the minimum and maximum curves.</para>\n      </summary>\n      <param name=\"scalar\">A multiplier to be applied to the curves.</param>\n      <param name=\"min\">The curve describing the minimum values to be evaluated.</param>\n      <param name=\"max\">The curve describing the maximum values to be evaluated.</param>\n      <param name=\"multiplier\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.MinMaxCurve.#ctor(System.Single,System.Single)\">\n      <summary>\n        <para>Randomly select values based on the interval between the minimum and maximum constants.</para>\n      </summary>\n      <param name=\"min\">The constant describing the minimum values to be evaluated.</param>\n      <param name=\"max\">The constant describing the maximum values to be evaluated.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.MinMaxCurve.Evaluate(System.Single)\">\n      <summary>\n        <para>Manually query the curve to calculate values based on what mode it is in.</para>\n      </summary>\n      <param name=\"time\">Normalized time (in the range 0 - 1, where 1 represents 100%) at which to evaluate the curve. This is valid when ParticleSystem.MinMaxCurve.mode is set to ParticleSystemCurveMode.Curve or ParticleSystemCurveMode.TwoCurves.</param>\n      <param name=\"lerpFactor\">Blend between the 2 curves/constants (Valid when ParticleSystem.MinMaxCurve.mode is set to ParticleSystemCurveMode.TwoConstants or ParticleSystemCurveMode.TwoCurves).</param>\n      <returns>\n        <para>Calculated curve/constant value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.MinMaxCurve.Evaluate(System.Single,System.Single)\">\n      <summary>\n        <para>Manually query the curve to calculate values based on what mode it is in.</para>\n      </summary>\n      <param name=\"time\">Normalized time (in the range 0 - 1, where 1 represents 100%) at which to evaluate the curve. This is valid when ParticleSystem.MinMaxCurve.mode is set to ParticleSystemCurveMode.Curve or ParticleSystemCurveMode.TwoCurves.</param>\n      <param name=\"lerpFactor\">Blend between the 2 curves/constants (Valid when ParticleSystem.MinMaxCurve.mode is set to ParticleSystemCurveMode.TwoConstants or ParticleSystemCurveMode.TwoCurves).</param>\n      <returns>\n        <para>Calculated curve/constant value.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.MinMaxGradient\">\n      <summary>\n        <para>MinMaxGradient contains two Gradients, and returns a Color based on ParticleSystem.MinMaxGradient.mode. Depending on the mode, the Color returned may be randomized.\nGradients are edited via the ParticleSystem Inspector once a ParticleSystemGradientMode requiring them has been selected. Some modes do not require gradients, only colors.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MinMaxGradient.color\">\n      <summary>\n        <para>Set a constant color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MinMaxGradient.colorMax\">\n      <summary>\n        <para>Set a constant color for the upper bound.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MinMaxGradient.colorMin\">\n      <summary>\n        <para>Set a constant color for the lower bound.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MinMaxGradient.gradient\">\n      <summary>\n        <para>Set the gradient.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MinMaxGradient.gradientMax\">\n      <summary>\n        <para>Set a gradient for the upper bound.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MinMaxGradient.gradientMin\">\n      <summary>\n        <para>Set a gradient for the lower bound.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.MinMaxGradient.mode\">\n      <summary>\n        <para>Set the mode that the min-max gradient will use to evaluate colors.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.MinMaxGradient.#ctor(UnityEngine.Color)\">\n      <summary>\n        <para>A single constant color for the entire gradient.</para>\n      </summary>\n      <param name=\"color\">Constant color.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.MinMaxGradient.#ctor(UnityEngine.Gradient)\">\n      <summary>\n        <para>Use one gradient when evaluating numbers along this Min-Max gradient.</para>\n      </summary>\n      <param name=\"gradient\">A single gradient for evaluating against.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.MinMaxGradient.#ctor(UnityEngine.Color,UnityEngine.Color)\">\n      <summary>\n        <para>Randomly select colors based on the interval between the minimum and maximum constants.</para>\n      </summary>\n      <param name=\"min\">The constant color describing the minimum colors to be evaluated.</param>\n      <param name=\"max\">The constant color describing the maximum colors to be evaluated.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.MinMaxGradient.#ctor(UnityEngine.Gradient,UnityEngine.Gradient)\">\n      <summary>\n        <para>Randomly select colors based on the interval between the minimum and maximum gradients.</para>\n      </summary>\n      <param name=\"min\">The gradient describing the minimum colors to be evaluated.</param>\n      <param name=\"max\">The gradient describing the maximum colors to be evaluated.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.MinMaxGradient.Evaluate(System.Single)\">\n      <summary>\n        <para>Manually query the gradient to calculate colors based on what mode it is in.</para>\n      </summary>\n      <param name=\"time\">Normalized time (in the range 0 - 1, where 1 represents 100%) at which to evaluate the gradient. This is valid when ParticleSystem.MinMaxGradient.mode is set to ParticleSystemGradientMode.Gradient or ParticleSystemGradientMode.TwoGradients.</param>\n      <param name=\"lerpFactor\">Blend between the 2 gradients/colors (Valid when ParticleSystem.MinMaxGradient.mode is set to ParticleSystemGradientMode.TwoColors or ParticleSystemGradientMode.TwoGradients).</param>\n      <returns>\n        <para>Calculated gradient/color value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.MinMaxGradient.Evaluate(System.Single,System.Single)\">\n      <summary>\n        <para>Manually query the gradient to calculate colors based on what mode it is in.</para>\n      </summary>\n      <param name=\"time\">Normalized time (in the range 0 - 1, where 1 represents 100%) at which to evaluate the gradient. This is valid when ParticleSystem.MinMaxGradient.mode is set to ParticleSystemGradientMode.Gradient or ParticleSystemGradientMode.TwoGradients.</param>\n      <param name=\"lerpFactor\">Blend between the 2 gradients/colors (Valid when ParticleSystem.MinMaxGradient.mode is set to ParticleSystemGradientMode.TwoColors or ParticleSystemGradientMode.TwoGradients).</param>\n      <returns>\n        <para>Calculated gradient/color value.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.NoiseModule\">\n      <summary>\n        <para>Script interface for the Noise Module.\n\nThe Noise Module allows you to apply turbulence to the movement of your particles. Use the low quality settings to create computationally efficient Noise, or simulate smoother, richer Noise with the higher quality settings. You can also choose to define the behavior of the Noise individually for each axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.damping\">\n      <summary>\n        <para>Higher frequency noise will reduce the strength by a proportional amount, if enabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.enabled\">\n      <summary>\n        <para>Enable/disable the Noise module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.frequency\">\n      <summary>\n        <para>Low values create soft, smooth noise, and high values create rapidly changing noise.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.octaveCount\">\n      <summary>\n        <para>Layers of noise that combine to produce final noise.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.octaveMultiplier\">\n      <summary>\n        <para>When combining each octave, scale the intensity by this amount.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.octaveScale\">\n      <summary>\n        <para>When combining each octave, zoom in by this amount.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.positionAmount\">\n      <summary>\n        <para>How much the noise affects the particle positions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.quality\">\n      <summary>\n        <para>Generate 1D, 2D or 3D noise.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.remap\">\n      <summary>\n        <para>Define how the noise values are remapped.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.remapEnabled\">\n      <summary>\n        <para>Enable remapping of the final noise values, allowing for noise values to be translated into different values.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.remapMultiplier\">\n      <summary>\n        <para>Remap multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.remapX\">\n      <summary>\n        <para>Define how the noise values are remapped on the X axis, when using the ParticleSystem.NoiseModule.separateAxes option.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.remapXMultiplier\">\n      <summary>\n        <para>X axis remap multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.remapY\">\n      <summary>\n        <para>Define how the noise values are remapped on the Y axis, when using the ParticleSystem.NoiseModule.separateAxes option.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.remapYMultiplier\">\n      <summary>\n        <para>Y axis remap multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.remapZ\">\n      <summary>\n        <para>Define how the noise values are remapped on the Z axis, when using the ParticleSystem.NoiseModule.separateAxes option.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.remapZMultiplier\">\n      <summary>\n        <para>Z axis remap multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.rotationAmount\">\n      <summary>\n        <para>How much the noise affects the particle rotation, in degrees per second.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.scrollSpeed\">\n      <summary>\n        <para>Scroll the noise map over the particle system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.scrollSpeedMultiplier\">\n      <summary>\n        <para>Scroll speed multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.separateAxes\">\n      <summary>\n        <para>Control the noise separately for each axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.sizeAmount\">\n      <summary>\n        <para>How much the noise affects the particle sizes, applied as a multiplier on the size of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.strength\">\n      <summary>\n        <para>How strong the overall noise effect is.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.strengthMultiplier\">\n      <summary>\n        <para>Strength multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.strengthX\">\n      <summary>\n        <para>Define the strength of the effect on the X axis, when using the ParticleSystem.NoiseModule.separateAxes option.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.strengthXMultiplier\">\n      <summary>\n        <para>X axis strength multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.strengthY\">\n      <summary>\n        <para>Define the strength of the effect on the Y axis, when using the ParticleSystem.NoiseModule.separateAxes option.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.strengthYMultiplier\">\n      <summary>\n        <para>Y axis strength multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.strengthZ\">\n      <summary>\n        <para>Define the strength of the effect on the Z axis, when using the ParticleSystem.NoiseModule.separateAxes option.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.NoiseModule.strengthZMultiplier\">\n      <summary>\n        <para>Z axis strength multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.Particle\">\n      <summary>\n        <para>Script interface for a Particle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Particle.angularVelocity\">\n      <summary>\n        <para>The angular velocity of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Particle.angularVelocity3D\">\n      <summary>\n        <para>The 3D angular velocity of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Particle.animatedVelocity\">\n      <summary>\n        <para>The animated velocity of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Particle.lifetime\">\n      <summary>\n        <para>The lifetime of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Particle.position\">\n      <summary>\n        <para>The position of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Particle.randomSeed\">\n      <summary>\n        <para>The random seed of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Particle.randomValue\">\n      <summary>\n        <para>The random value of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Particle.remainingLifetime\">\n      <summary>\n        <para>The remaining lifetime of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Particle.rotation\">\n      <summary>\n        <para>The rotation of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Particle.rotation3D\">\n      <summary>\n        <para>The 3D rotation of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Particle.startColor\">\n      <summary>\n        <para>The initial color of the particle. The current color of the particle is calculated procedurally based on this value and the active color modules.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Particle.startLifetime\">\n      <summary>\n        <para>The starting lifetime of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Particle.startSize\">\n      <summary>\n        <para>The initial size of the particle. The current size of the particle is calculated procedurally based on this value and the active size modules.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Particle.startSize3D\">\n      <summary>\n        <para>The initial 3D size of the particle. The current size of the particle is calculated procedurally based on this value and the active size modules.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Particle.totalVelocity\">\n      <summary>\n        <para>The total velocity of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.Particle.velocity\">\n      <summary>\n        <para>The velocity of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.Particle.GetCurrentColor(UnityEngine.ParticleSystem)\">\n      <summary>\n        <para>Calculate the current color of the particle by applying the relevant curves to its startColor property.</para>\n      </summary>\n      <param name=\"system\">The particle system from which this particle was emitted.</param>\n      <returns>\n        <para>Current color.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.Particle.GetCurrentSize(UnityEngine.ParticleSystem)\">\n      <summary>\n        <para>Calculate the current size of the particle by applying the relevant curves to its startSize property.</para>\n      </summary>\n      <param name=\"system\">The particle system from which this particle was emitted.</param>\n      <returns>\n        <para>Current size.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.Particle.GetCurrentSize3D(UnityEngine.ParticleSystem)\">\n      <summary>\n        <para>Calculate the current 3D size of the particle by applying the relevant curves to its startSize3D property.</para>\n      </summary>\n      <param name=\"system\">The particle system from which this particle was emitted.</param>\n      <returns>\n        <para>Current size.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.Pause(System.Boolean)\">\n      <summary>\n        <para>Pauses the system so no new particles are emitted and the existing particles are not updated.</para>\n      </summary>\n      <param name=\"withChildren\">Pause all child Particle Systems as well.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.Play(System.Boolean)\">\n      <summary>\n        <para>Starts the particle system.</para>\n      </summary>\n      <param name=\"withChildren\">Play all child particle systems as well.</param>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.RotationBySpeedModule\">\n      <summary>\n        <para>Script interface for the Rotation By Speed module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.RotationBySpeedModule.enabled\">\n      <summary>\n        <para>Enable/disable the Rotation By Speed module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.RotationBySpeedModule.range\">\n      <summary>\n        <para>Apply the rotation curve between these minimum and maximum speeds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.RotationBySpeedModule.separateAxes\">\n      <summary>\n        <para>Set the rotation by speed on each axis separately.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.RotationBySpeedModule.x\">\n      <summary>\n        <para>Rotation by speed curve for the X axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.RotationBySpeedModule.xMultiplier\">\n      <summary>\n        <para>Speed multiplier along the X axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.RotationBySpeedModule.y\">\n      <summary>\n        <para>Rotation by speed curve for the Y axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.RotationBySpeedModule.yMultiplier\">\n      <summary>\n        <para>Speed multiplier along the Y axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.RotationBySpeedModule.z\">\n      <summary>\n        <para>Rotation by speed curve for the Z axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.RotationBySpeedModule.zMultiplier\">\n      <summary>\n        <para>Speed multiplier along the Z axis.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.RotationOverLifetimeModule\">\n      <summary>\n        <para>Script interface for the Rotation Over Lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.RotationOverLifetimeModule.enabled\">\n      <summary>\n        <para>Enable/disable the Rotation Over Lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.RotationOverLifetimeModule.separateAxes\">\n      <summary>\n        <para>Set the rotation over lifetime on each axis separately.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.RotationOverLifetimeModule.x\">\n      <summary>\n        <para>Rotation over lifetime curve for the X axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.RotationOverLifetimeModule.xMultiplier\">\n      <summary>\n        <para>Rotation multiplier around the X axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.RotationOverLifetimeModule.y\">\n      <summary>\n        <para>Rotation over lifetime curve for the Y axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.RotationOverLifetimeModule.yMultiplier\">\n      <summary>\n        <para>Rotation multiplier around the Y axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.RotationOverLifetimeModule.z\">\n      <summary>\n        <para>Rotation over lifetime curve for the Z axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.RotationOverLifetimeModule.zMultiplier\">\n      <summary>\n        <para>Rotation multiplier around the Z axis.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.SetCustomParticleData(System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;,UnityEngine.ParticleSystemCustomData)\">\n      <summary>\n        <para>Set a stream of custom per-particle data.</para>\n      </summary>\n      <param name=\"customData\">The array of per-particle data.</param>\n      <param name=\"streamIndex\">Which stream to assign the data to.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.SetParticles(UnityEngine.ParticleSystem/Particle[],System.Int32)\">\n      <summary>\n        <para>Sets the particles of this particle system.</para>\n      </summary>\n      <param name=\"particles\">Input particle buffer, containing the desired particle state.</param>\n      <param name=\"size\">The number of elements in the particles array that is written to the Particle System.</param>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.ShapeModule\">\n      <summary>\n        <para>Script interface for the Shape module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.alignToDirection\">\n      <summary>\n        <para>Align particles based on their initial direction of travel.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.angle\">\n      <summary>\n        <para>Angle of the cone.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.arc\">\n      <summary>\n        <para>Circle arc angle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.arcMode\">\n      <summary>\n        <para>The mode used for generating particles around the arc.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.arcSpeed\">\n      <summary>\n        <para>When using one of the animated modes, how quickly to move the emission position around the arc.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.arcSpeedMultiplier\">\n      <summary>\n        <para>A multiplier of the arc speed of the emission shape.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.arcSpread\">\n      <summary>\n        <para>Control the gap between emission points around the arc.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.box\">\n      <summary>\n        <para>Scale of the box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.boxThickness\">\n      <summary>\n        <para>Thickness of the box.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.donutRadius\">\n      <summary>\n        <para>The radius of the Donut shape.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.enabled\">\n      <summary>\n        <para>Enable/disable the Shape module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.length\">\n      <summary>\n        <para>Length of the cone.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.mesh\">\n      <summary>\n        <para>Mesh to emit particles from.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.meshMaterialIndex\">\n      <summary>\n        <para>Emit particles from a single material of a mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.meshRenderer\">\n      <summary>\n        <para>MeshRenderer to emit particles from.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.meshScale\">\n      <summary>\n        <para>Apply a scaling factor to the mesh used for generating source positions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.meshShapeType\">\n      <summary>\n        <para>Where on the mesh to emit particles from.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.normalOffset\">\n      <summary>\n        <para>Move particles away from the surface of the source mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.position\">\n      <summary>\n        <para>Apply an offset to the position from which particles are emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.radius\">\n      <summary>\n        <para>Radius of the shape.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.radiusMode\">\n      <summary>\n        <para>The mode used for generating particles along the radius.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.radiusSpeed\">\n      <summary>\n        <para>When using one of the animated modes, how quickly to move the emission position along the radius.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.radiusSpeedMultiplier\">\n      <summary>\n        <para>A multiplier of the radius speed of the emission shape.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.radiusSpread\">\n      <summary>\n        <para>Control the gap between emission points along the radius.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.radiusThickness\">\n      <summary>\n        <para>Thickness of the radius.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.randomDirection\">\n      <summary>\n        <para>Randomizes the starting direction of particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.randomDirectionAmount\">\n      <summary>\n        <para>Randomizes the starting direction of particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.randomPositionAmount\">\n      <summary>\n        <para>Randomizes the starting position of particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.rotation\">\n      <summary>\n        <para>Apply a rotation to the shape from which particles are emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.scale\">\n      <summary>\n        <para>Apply scale to the shape from which particles are emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.shapeType\">\n      <summary>\n        <para>Type of shape to emit particles from.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.skinnedMeshRenderer\">\n      <summary>\n        <para>SkinnedMeshRenderer to emit particles from.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.sphericalDirectionAmount\">\n      <summary>\n        <para>Spherizes the starting direction of particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.sprite\">\n      <summary>\n        <para>Sprite to emit particles from.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.spriteRenderer\">\n      <summary>\n        <para>SpriteRenderer to emit particles from.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.texture\">\n      <summary>\n        <para>Selects a texture to be used for tinting particle start colors.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.textureAlphaAffectsParticles\">\n      <summary>\n        <para>When enabled, the alpha channel of the texture is applied to the particle alpha when spawned.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.textureBilinearFiltering\">\n      <summary>\n        <para>When enabled, 4 neighboring samples are taken from the texture, and combined to give the final particle value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.textureClipChannel\">\n      <summary>\n        <para>Selects which channel of the texture is used for discarding particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.textureClipThreshold\">\n      <summary>\n        <para>Discards particles when they are spawned on an area of the texture with a value lower than this threshold.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.textureColorAffectsParticles\">\n      <summary>\n        <para>When enabled, the RGB channels of the texture are applied to the particle color when spawned.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.textureUVChannel\">\n      <summary>\n        <para>When using a Mesh as a source shape type, this option controls which UV channel on the Mesh is used for reading the source texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.useMeshColors\">\n      <summary>\n        <para>Modulate the particle colors with the vertex colors, or the material color if no vertex colors exist.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.ShapeModule.useMeshMaterialIndex\">\n      <summary>\n        <para>Emit from a single material, or the whole mesh.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.Simulate(System.Single,System.Boolean,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Fastforwards the particle system by simulating particles over given period of time, then pauses it.</para>\n      </summary>\n      <param name=\"t\">Time period in seconds to advance the ParticleSystem simulation by. If restart is true, the ParticleSystem will be reset to 0 time, and then advanced by this value. If restart is false, the ParticleSystem simulation will be advanced in time from its current state by this value.</param>\n      <param name=\"withChildren\">Fastforward all child particle systems as well.</param>\n      <param name=\"restart\">Restart and start from the beginning.</param>\n      <param name=\"fixedTimeStep\">Only update the system at fixed intervals, based on the value in \"Fixed Time\" in the Time options.</param>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.SizeBySpeedModule\">\n      <summary>\n        <para>Script interface for the Size By Speed module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeBySpeedModule.enabled\">\n      <summary>\n        <para>Enable/disable the Size By Speed module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeBySpeedModule.range\">\n      <summary>\n        <para>Apply the size curve between these minimum and maximum speeds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeBySpeedModule.separateAxes\">\n      <summary>\n        <para>Set the size by speed on each axis separately.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeBySpeedModule.size\">\n      <summary>\n        <para>Curve to control particle size based on speed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeBySpeedModule.sizeMultiplier\">\n      <summary>\n        <para>Size multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeBySpeedModule.x\">\n      <summary>\n        <para>Size by speed curve for the X axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeBySpeedModule.xMultiplier\">\n      <summary>\n        <para>X axis size multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeBySpeedModule.y\">\n      <summary>\n        <para>Size by speed curve for the Y axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeBySpeedModule.yMultiplier\">\n      <summary>\n        <para>Y axis size multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeBySpeedModule.z\">\n      <summary>\n        <para>Size by speed curve for the Z axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeBySpeedModule.zMultiplier\">\n      <summary>\n        <para>Z axis size multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.SizeOverLifetimeModule\">\n      <summary>\n        <para>Script interface for the Size Over Lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeOverLifetimeModule.enabled\">\n      <summary>\n        <para>Enable/disable the Size Over Lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeOverLifetimeModule.separateAxes\">\n      <summary>\n        <para>Set the size over lifetime on each axis separately.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeOverLifetimeModule.size\">\n      <summary>\n        <para>Curve to control particle size based on lifetime.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeOverLifetimeModule.sizeMultiplier\">\n      <summary>\n        <para>Size multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeOverLifetimeModule.x\">\n      <summary>\n        <para>Size over lifetime curve for the X axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeOverLifetimeModule.xMultiplier\">\n      <summary>\n        <para>X axis size multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeOverLifetimeModule.y\">\n      <summary>\n        <para>Size over lifetime curve for the Y axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeOverLifetimeModule.yMultiplier\">\n      <summary>\n        <para>Y axis size multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeOverLifetimeModule.z\">\n      <summary>\n        <para>Size over lifetime curve for the Z axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SizeOverLifetimeModule.zMultiplier\">\n      <summary>\n        <para>Z axis size multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.Stop(System.Boolean,UnityEngine.ParticleSystemStopBehavior)\">\n      <summary>\n        <para>Stops playing the particle system using the supplied stop behaviour.</para>\n      </summary>\n      <param name=\"withChildren\">Stop all child particle systems as well.</param>\n      <param name=\"stopBehavior\">Stop emitting or stop emitting and clear the system.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.Stop(System.Boolean)\">\n      <summary>\n        <para>Stops playing the particle system using the supplied stop behaviour.</para>\n      </summary>\n      <param name=\"withChildren\">Stop all child particle systems as well.</param>\n      <param name=\"stopBehavior\">Stop emitting or stop emitting and clear the system.</param>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.SubEmittersModule\">\n      <summary>\n        <para>Script interface for the Sub Emitters module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SubEmittersModule.birth0\">\n      <summary>\n        <para>Sub particle system which spawns at the locations of the birth of the particles from the parent system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SubEmittersModule.birth1\">\n      <summary>\n        <para>Sub particle system which spawns at the locations of the birth of the particles from the parent system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SubEmittersModule.collision0\">\n      <summary>\n        <para>Sub particle system which spawns at the locations of the collision of the particles from the parent system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SubEmittersModule.collision1\">\n      <summary>\n        <para>Sub particle system which spawns at the locations of the collision of the particles from the parent system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SubEmittersModule.death0\">\n      <summary>\n        <para>Sub particle system which spawns at the locations of the death of the particles from the parent system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SubEmittersModule.death1\">\n      <summary>\n        <para>Sub particle system to spawn on death of the parent system's particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SubEmittersModule.enabled\">\n      <summary>\n        <para>Enable/disable the Sub Emitters module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.SubEmittersModule.subEmittersCount\">\n      <summary>\n        <para>The total number of sub-emitters.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.SubEmittersModule.AddSubEmitter(UnityEngine.ParticleSystem,UnityEngine.ParticleSystemSubEmitterType,UnityEngine.ParticleSystemSubEmitterProperties)\">\n      <summary>\n        <para>Add a new sub-emitter.</para>\n      </summary>\n      <param name=\"subEmitter\">The sub-emitter to be added.</param>\n      <param name=\"type\">The event that creates new particles.</param>\n      <param name=\"properties\">The properties of the new particles.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.SubEmittersModule.GetSubEmitterProperties(System.Int32)\">\n      <summary>\n        <para>Get the properties of the sub-emitter at the given index.</para>\n      </summary>\n      <param name=\"index\">The index of the desired sub-emitter.</param>\n      <returns>\n        <para>The properties of the requested sub-emitter.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.SubEmittersModule.GetSubEmitterSystem(System.Int32)\">\n      <summary>\n        <para>Get the sub-emitter Particle System at the given index.</para>\n      </summary>\n      <param name=\"index\">The index of the desired sub-emitter.</param>\n      <returns>\n        <para>The sub-emitter being requested.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.SubEmittersModule.GetSubEmitterType(System.Int32)\">\n      <summary>\n        <para>Get the type of the sub-emitter at the given index.</para>\n      </summary>\n      <param name=\"index\">The index of the desired sub-emitter.</param>\n      <returns>\n        <para>The type of the requested sub-emitter.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.SubEmittersModule.RemoveSubEmitter(System.Int32)\">\n      <summary>\n        <para>Remove a sub-emitter from the given index in the array.</para>\n      </summary>\n      <param name=\"index\">The index from which to remove a sub-emitter.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.SubEmittersModule.SetSubEmitterProperties(System.Int32,UnityEngine.ParticleSystemSubEmitterProperties)\">\n      <summary>\n        <para>Set the properties of the sub-emitter at the given index.</para>\n      </summary>\n      <param name=\"index\">The index of the sub-emitter being modified.</param>\n      <param name=\"properties\">The new properties to assign to this sub-emitter.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.SubEmittersModule.SetSubEmitterSystem(System.Int32,UnityEngine.ParticleSystem)\">\n      <summary>\n        <para>Set the Particle System to use as the sub-emitter at the given index.</para>\n      </summary>\n      <param name=\"index\">The index of the sub-emitter being modified.</param>\n      <param name=\"subEmitter\">The Particle System being used as this sub-emitter.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.SubEmittersModule.SetSubEmitterType(System.Int32,UnityEngine.ParticleSystemSubEmitterType)\">\n      <summary>\n        <para>Set the type of the sub-emitter at the given index.</para>\n      </summary>\n      <param name=\"index\">The index of the sub-emitter being modified.</param>\n      <param name=\"type\">The new spawning type to assign to this sub-emitter.</param>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.TextureSheetAnimationModule\">\n      <summary>\n        <para>Script interface for the Texture Sheet Animation module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TextureSheetAnimationModule.animation\">\n      <summary>\n        <para>Specifies the animation type.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TextureSheetAnimationModule.cycleCount\">\n      <summary>\n        <para>Specifies how many times the animation will loop during the lifetime of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TextureSheetAnimationModule.enabled\">\n      <summary>\n        <para>Enable/disable the Texture Sheet Animation module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TextureSheetAnimationModule.flipU\">\n      <summary>\n        <para>Flip the U coordinate on particles, causing them to appear mirrored horizontally.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TextureSheetAnimationModule.flipV\">\n      <summary>\n        <para>Flip the V coordinate on particles, causing them to appear mirrored vertically.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TextureSheetAnimationModule.frameOverTime\">\n      <summary>\n        <para>Curve to control which frame of the texture sheet animation to play.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TextureSheetAnimationModule.frameOverTimeMultiplier\">\n      <summary>\n        <para>Frame over time mutiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TextureSheetAnimationModule.mode\">\n      <summary>\n        <para>Select whether the animated texture information comes from a grid of frames on a single texture, or from a list of Sprite objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TextureSheetAnimationModule.numTilesX\">\n      <summary>\n        <para>Defines the tiling of the texture in the X axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TextureSheetAnimationModule.numTilesY\">\n      <summary>\n        <para>Defines the tiling of the texture in the Y axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TextureSheetAnimationModule.rowIndex\">\n      <summary>\n        <para>Explicitly select which row of the texture sheet is used, when ParticleSystem.TextureSheetAnimationModule.useRandomRow is set to false.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TextureSheetAnimationModule.spriteCount\">\n      <summary>\n        <para>The total number of sprites.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TextureSheetAnimationModule.startFrame\">\n      <summary>\n        <para>Define a random starting frame for the texture sheet animation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TextureSheetAnimationModule.startFrameMultiplier\">\n      <summary>\n        <para>Starting frame multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TextureSheetAnimationModule.useRandomRow\">\n      <summary>\n        <para>Use a random row of the texture sheet for each particle emitted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TextureSheetAnimationModule.uvChannelMask\">\n      <summary>\n        <para>Choose which UV channels will receive texture animation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.TextureSheetAnimationModule.AddSprite(UnityEngine.Sprite)\">\n      <summary>\n        <para>Add a new Sprite.</para>\n      </summary>\n      <param name=\"sprite\">The Sprite to be added.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.TextureSheetAnimationModule.GetSprite(System.Int32)\">\n      <summary>\n        <para>Get the Sprite at the given index.</para>\n      </summary>\n      <param name=\"index\">The index of the desired Sprite.</param>\n      <returns>\n        <para>The Sprite being requested.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.TextureSheetAnimationModule.RemoveSprite(System.Int32)\">\n      <summary>\n        <para>Remove a Sprite from the given index in the array.</para>\n      </summary>\n      <param name=\"index\">The index from which to remove a Sprite.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.TextureSheetAnimationModule.SetSprite(System.Int32,UnityEngine.Sprite)\">\n      <summary>\n        <para>Set the Sprite at the given index.</para>\n      </summary>\n      <param name=\"index\">The index of the Sprite being modified.</param>\n      <param name=\"sprite\">The Sprite being assigned.</param>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.TrailModule\">\n      <summary>\n        <para>Access the particle system trails module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TrailModule.colorOverLifetime\">\n      <summary>\n        <para>The gradient controlling the trail colors during the lifetime of the attached particle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TrailModule.colorOverTrail\">\n      <summary>\n        <para>The gradient controlling the trail colors over the length of the trail.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TrailModule.dieWithParticles\">\n      <summary>\n        <para>If enabled, Trails will disappear immediately when their owning particle dies. Otherwise, the trail will persist until all its points have naturally expired, based on its lifetime.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TrailModule.enabled\">\n      <summary>\n        <para>Enable/disable the Trail module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TrailModule.generateLightingData\">\n      <summary>\n        <para>Configures the trails to generate Normals and Tangents. With this data, Scene lighting can affect the trails via Normal Maps and the Unity Standard Shader, or your own custom-built Shaders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TrailModule.inheritParticleColor\">\n      <summary>\n        <para>Toggle whether the trail will inherit the particle color as its starting color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TrailModule.lifetime\">\n      <summary>\n        <para>The curve describing the trail lifetime, throughout the lifetime of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TrailModule.lifetimeMultiplier\">\n      <summary>\n        <para>Change the lifetime multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TrailModule.minVertexDistance\">\n      <summary>\n        <para>Set the minimum distance each trail can travel before a new vertex is added to it.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TrailModule.mode\">\n      <summary>\n        <para>Choose how particle trails are generated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TrailModule.ratio\">\n      <summary>\n        <para>Choose what proportion of particles will receive a trail.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TrailModule.ribbonCount\">\n      <summary>\n        <para>Select how many lines to create through the Particle System.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TrailModule.sizeAffectsLifetime\">\n      <summary>\n        <para>Set whether the particle size will act as a multiplier on top of the trail lifetime.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TrailModule.sizeAffectsWidth\">\n      <summary>\n        <para>Set whether the particle size will act as a multiplier on top of the trail width.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TrailModule.textureMode\">\n      <summary>\n        <para>Choose whether the U coordinate of the trail texture is tiled or stretched.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TrailModule.widthOverTrail\">\n      <summary>\n        <para>The curve describing the width, of each trail point.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TrailModule.widthOverTrailMultiplier\">\n      <summary>\n        <para>Change the width multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TrailModule.worldSpace\">\n      <summary>\n        <para>Drop new trail points in world space, regardless of Particle System Simulation Space.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.TriggerModule\">\n      <summary>\n        <para>Script interface for the Trigger module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TriggerModule.enabled\">\n      <summary>\n        <para>Enable/disable the Trigger module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TriggerModule.enter\">\n      <summary>\n        <para>Choose what action to perform when particles enter the trigger volume.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TriggerModule.exit\">\n      <summary>\n        <para>Choose what action to perform when particles leave the trigger volume.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TriggerModule.inside\">\n      <summary>\n        <para>Choose what action to perform when particles are inside the trigger volume.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TriggerModule.maxColliderCount\">\n      <summary>\n        <para>The maximum number of collision shapes that can be attached to this particle system trigger.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TriggerModule.outside\">\n      <summary>\n        <para>Choose what action to perform when particles are outside the trigger volume.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.TriggerModule.radiusScale\">\n      <summary>\n        <para>A multiplier applied to the size of each particle before overlaps are processed.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.TriggerModule.GetCollider(System.Int32)\">\n      <summary>\n        <para>Get a collision shape associated with this particle system trigger.</para>\n      </summary>\n      <param name=\"index\">Which collider to return.</param>\n      <returns>\n        <para>The collider at the given index.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.TriggerModule.SetCollider(System.Int32,UnityEngine.Component)\">\n      <summary>\n        <para>Set a collision shape associated with this particle system trigger.</para>\n      </summary>\n      <param name=\"index\">Which collider to set.</param>\n      <param name=\"collider\">The collider to associate with this trigger.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.TriggerSubEmitter(System.Int32)\">\n      <summary>\n        <para>Triggers the specified sub emitter on all particles of the Particle System.</para>\n      </summary>\n      <param name=\"subEmitterIndex\">Index of the sub emitter to trigger.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.TriggerSubEmitter(System.Int32,UnityEngine.ParticleSystem/Particle&amp;)\">\n      <summary>\n        <para>Triggers the specified sub emitter on the specified particle(s) of the Particle System.</para>\n      </summary>\n      <param name=\"subEmitterIndex\">Index of the sub emitter to trigger.</param>\n      <param name=\"particle\">Triggers the sub emtter on a single particle.</param>\n      <param name=\"particles\">Triggers the sub emtter on a list of particles.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystem.TriggerSubEmitter(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.ParticleSystem/Particle&gt;)\">\n      <summary>\n        <para>Triggers the specified sub emitter on the specified particle(s) of the Particle System.</para>\n      </summary>\n      <param name=\"subEmitterIndex\">Index of the sub emitter to trigger.</param>\n      <param name=\"particle\">Triggers the sub emtter on a single particle.</param>\n      <param name=\"particles\">Triggers the sub emtter on a list of particles.</param>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystem.VelocityOverLifetimeModule\">\n      <summary>\n        <para>Script interface for the Velocity Over Lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.enabled\">\n      <summary>\n        <para>Enable/disable the Velocity Over Lifetime module.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.orbitalOffsetX\">\n      <summary>\n        <para>Specify a custom center of rotation for the orbital and radial velocities.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.orbitalOffsetXMultiplier\">\n      <summary>\n        <para>This method is more efficient than accessing the whole curve, if you only want to change the overall offset multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.orbitalOffsetY\">\n      <summary>\n        <para>Specify a custom center of rotation for the orbital and radial velocities.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.orbitalOffsetYMultiplier\">\n      <summary>\n        <para>This method is more efficient than accessing the whole curve, if you only want to change the overall offset multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.orbitalOffsetZ\">\n      <summary>\n        <para>Specify a custom center of rotation for the orbital and radial velocities.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.orbitalOffsetZMultiplier\">\n      <summary>\n        <para>This method is more efficient than accessing the whole curve, if you only want to change the overall offset multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.orbitalX\">\n      <summary>\n        <para>Curve to control particle speed based on lifetime, around the X axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.orbitalXMultiplier\">\n      <summary>\n        <para>X axis speed multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.orbitalY\">\n      <summary>\n        <para>Curve to control particle speed based on lifetime, around the Y axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.orbitalYMultiplier\">\n      <summary>\n        <para>Y axis speed multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.orbitalZ\">\n      <summary>\n        <para>Curve to control particle speed based on lifetime, around the Z axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.orbitalZMultiplier\">\n      <summary>\n        <para>Z axis speed multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.radial\">\n      <summary>\n        <para>Curve to control particle speed based on lifetime, away from a center position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.radialMultiplier\">\n      <summary>\n        <para>Radial speed multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.space\">\n      <summary>\n        <para>Specifies if the velocities are in local space (rotated with the transform) or world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.speedModifier\">\n      <summary>\n        <para>Curve to control particle speed based on lifetime, without affecting the direction of the particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.speedModifierMultiplier\">\n      <summary>\n        <para>Speed multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.x\">\n      <summary>\n        <para>Curve to control particle speed based on lifetime, on the X axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.xMultiplier\">\n      <summary>\n        <para>X axis speed multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.y\">\n      <summary>\n        <para>Curve to control particle speed based on lifetime, on the Y axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.yMultiplier\">\n      <summary>\n        <para>Y axis speed multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.z\">\n      <summary>\n        <para>Curve to control particle speed based on lifetime, on the Z axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystem.VelocityOverLifetimeModule.zMultiplier\">\n      <summary>\n        <para>Z axis speed multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemAnimationMode\">\n      <summary>\n        <para>The animation mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemAnimationMode.Grid\">\n      <summary>\n        <para>Use a regular grid to construct a sequence of animation frames.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemAnimationMode.Sprites\">\n      <summary>\n        <para>Use a list of sprites to construct a sequence of animation frames.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemAnimationType\">\n      <summary>\n        <para>The animation type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemAnimationType.SingleRow\">\n      <summary>\n        <para>Animate a single row in the sheet from left to right.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemAnimationType.WholeSheet\">\n      <summary>\n        <para>Animate over the whole texture sheet from left to right, top to bottom.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemCollisionMode\">\n      <summary>\n        <para>Whether to use 2D or 3D colliders for particle collisions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemCollisionMode.Collision2D\">\n      <summary>\n        <para>Use 2D colliders to collide particles against.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemCollisionMode.Collision3D\">\n      <summary>\n        <para>Use 3D colliders to collide particles against.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemCollisionQuality\">\n      <summary>\n        <para>Quality of world collisions. Medium and low quality are approximate and may leak particles.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemCollisionQuality.High\">\n      <summary>\n        <para>The most accurate world collisions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemCollisionQuality.Low\">\n      <summary>\n        <para>Fastest and most approximate world collisions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemCollisionQuality.Medium\">\n      <summary>\n        <para>Approximate world collisions.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemCollisionType\">\n      <summary>\n        <para>The type of collisions to use for a given particle system.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemCollisionType.Planes\">\n      <summary>\n        <para>Collide with a list of planes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemCollisionType.World\">\n      <summary>\n        <para>Collide with the world geometry.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemCurveMode\">\n      <summary>\n        <para>The particle curve mode (Shuriken).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemCurveMode.Constant\">\n      <summary>\n        <para>Use a single constant for the ParticleSystem.MinMaxCurve.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemCurveMode.Curve\">\n      <summary>\n        <para>Use a single curve for the ParticleSystem.MinMaxCurve.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemCurveMode.TwoConstants\">\n      <summary>\n        <para>Use a random value between 2 constants for the ParticleSystem.MinMaxCurve.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemCurveMode.TwoCurves\">\n      <summary>\n        <para>Use a random value between 2 curves for the ParticleSystem.MinMaxCurve.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemCustomData\">\n      <summary>\n        <para>Which stream of custom particle data to set.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemCustomData.Custom1\">\n      <summary>\n        <para>The first stream of custom per-particle data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemCustomData.Custom2\">\n      <summary>\n        <para>The second stream of custom per-particle data.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemCustomDataMode\">\n      <summary>\n        <para>Which mode the Custom Data module uses to generate its data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemCustomDataMode.Color\">\n      <summary>\n        <para>Generate data using ParticleSystem.MinMaxGradient.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemCustomDataMode.Disabled\">\n      <summary>\n        <para>Don't generate any data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemCustomDataMode.Vector\">\n      <summary>\n        <para>Generate data using ParticleSystem.MinMaxCurve.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemEmissionType\">\n      <summary>\n        <para>The mode in which particles are emitted.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemEmissionType.Distance\">\n      <summary>\n        <para>Emit when emitter moves.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemEmissionType.Time\">\n      <summary>\n        <para>Emit over time.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemEmitterVelocityMode\">\n      <summary>\n        <para>Control how a Particle System calculates its velocity.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemEmitterVelocityMode.Rigidbody\">\n      <summary>\n        <para>Calculate the Particle System velocity by using a Rigidbody or Rigidbody2D component, if one exists on the Game Object.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemEmitterVelocityMode.Transform\">\n      <summary>\n        <para>Calculate the Particle System velocity by using the Transform component.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemGradientMode\">\n      <summary>\n        <para>The particle gradient mode (Shuriken).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemGradientMode.Color\">\n      <summary>\n        <para>Use a single color for the ParticleSystem.MinMaxGradient.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemGradientMode.Gradient\">\n      <summary>\n        <para>Use a single color gradient for the ParticleSystem.MinMaxGradient.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemGradientMode.RandomColor\">\n      <summary>\n        <para>Define a list of colors in the ParticleSystem.MinMaxGradient, to be chosen from at random.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemGradientMode.TwoColors\">\n      <summary>\n        <para>Use a random value between 2 colors for the ParticleSystem.MinMaxGradient.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemGradientMode.TwoGradients\">\n      <summary>\n        <para>Use a random value between 2 color gradients for the ParticleSystem.MinMaxGradient.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemInheritVelocityMode\">\n      <summary>\n        <para>How to apply emitter velocity to particles.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemInheritVelocityMode.Current\">\n      <summary>\n        <para>Each particle's velocity is set to the emitter's current velocity value, every frame.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemInheritVelocityMode.Initial\">\n      <summary>\n        <para>Each particle inherits the emitter's velocity on the frame when it was initially emitted.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemMeshShapeType\">\n      <summary>\n        <para>The mesh emission type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemMeshShapeType.Edge\">\n      <summary>\n        <para>Emit from the edges of the mesh.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemMeshShapeType.Triangle\">\n      <summary>\n        <para>Emit from the surface of the mesh.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemMeshShapeType.Vertex\">\n      <summary>\n        <para>Emit from the vertices of the mesh.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemNoiseQuality\">\n      <summary>\n        <para>The quality of the generated noise.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemNoiseQuality.High\">\n      <summary>\n        <para>High quality 3D noise.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemNoiseQuality.Low\">\n      <summary>\n        <para>Low quality 1D noise.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemNoiseQuality.Medium\">\n      <summary>\n        <para>Medium quality 2D noise.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemOverlapAction\">\n      <summary>\n        <para>What action to perform when the particle trigger module passes a test.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemOverlapAction.Callback\">\n      <summary>\n        <para>Send the OnParticleTrigger command to the particle system's script.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemOverlapAction.Ignore\">\n      <summary>\n        <para>Do nothing.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemOverlapAction.Kill\">\n      <summary>\n        <para>Kill all particles that pass this test.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemRenderer\">\n      <summary>\n        <para>Renders particles on to the screen (Shuriken).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystemRenderer.activeVertexStreamsCount\">\n      <summary>\n        <para>The number of currently active custom vertex streams.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystemRenderer.alignment\">\n      <summary>\n        <para>Control the direction that particles face.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystemRenderer.cameraVelocityScale\">\n      <summary>\n        <para>How much are the particles stretched depending on the Camera's speed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystemRenderer.enableGPUInstancing\">\n      <summary>\n        <para>Enables GPU Instancing on platforms where it is supported.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystemRenderer.lengthScale\">\n      <summary>\n        <para>How much are the particles stretched in their direction of motion.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystemRenderer.maskInteraction\">\n      <summary>\n        <para>Specifies how the Particle System Renderer interacts with SpriteMask.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystemRenderer.maxParticleSize\">\n      <summary>\n        <para>Clamp the maximum particle size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystemRenderer.mesh\">\n      <summary>\n        <para>Mesh used as particle instead of billboarded texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystemRenderer.meshCount\">\n      <summary>\n        <para>The number of meshes being used for particle rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystemRenderer.minParticleSize\">\n      <summary>\n        <para>Clamp the minimum particle size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystemRenderer.normalDirection\">\n      <summary>\n        <para>How much are billboard particle normals oriented towards the camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystemRenderer.pivot\">\n      <summary>\n        <para>Modify the pivot point used for rotating particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystemRenderer.renderMode\">\n      <summary>\n        <para>How particles are drawn.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystemRenderer.sortingFudge\">\n      <summary>\n        <para>Biases particle system sorting amongst other transparencies.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystemRenderer.sortMode\">\n      <summary>\n        <para>Sort particles within a system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystemRenderer.trailMaterial\">\n      <summary>\n        <para>Set the material used by the Trail module for attaching trails to particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ParticleSystemRenderer.velocityScale\">\n      <summary>\n        <para>How much are the particles stretched depending on \"how fast they move\".</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystemRenderer.AreVertexStreamsEnabled(UnityEngine.ParticleSystemVertexStreams)\">\n      <summary>\n        <para>Query whether the particle system renderer uses a particular set of vertex streams.</para>\n      </summary>\n      <param name=\"streams\">Streams to query.</param>\n      <returns>\n        <para>Whether all the queried streams are enabled or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystemRenderer.BakeMesh(UnityEngine.Mesh)\">\n      <summary>\n        <para>Creates a snapshot of ParticleSystemRenderer and stores it in mesh.</para>\n      </summary>\n      <param name=\"mesh\">A static mesh that will receive the snapshot of the particles.</param>\n      <param name=\"camera\">The camera used for determining which way view space particles will face.</param>\n      <param name=\"useTransform\">Include the rotation and scale of the Transform in the baked mesh.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystemRenderer.BakeMesh(UnityEngine.Mesh,System.Boolean)\">\n      <summary>\n        <para>Creates a snapshot of ParticleSystemRenderer and stores it in mesh.</para>\n      </summary>\n      <param name=\"mesh\">A static mesh that will receive the snapshot of the particles.</param>\n      <param name=\"camera\">The camera used for determining which way view space particles will face.</param>\n      <param name=\"useTransform\">Include the rotation and scale of the Transform in the baked mesh.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystemRenderer.BakeMesh(UnityEngine.Mesh,UnityEngine.Camera)\">\n      <summary>\n        <para>Creates a snapshot of ParticleSystemRenderer and stores it in mesh.</para>\n      </summary>\n      <param name=\"mesh\">A static mesh that will receive the snapshot of the particles.</param>\n      <param name=\"camera\">The camera used for determining which way view space particles will face.</param>\n      <param name=\"useTransform\">Include the rotation and scale of the Transform in the baked mesh.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystemRenderer.BakeMesh(UnityEngine.Mesh,UnityEngine.Camera,System.Boolean)\">\n      <summary>\n        <para>Creates a snapshot of ParticleSystemRenderer and stores it in mesh.</para>\n      </summary>\n      <param name=\"mesh\">A static mesh that will receive the snapshot of the particles.</param>\n      <param name=\"camera\">The camera used for determining which way view space particles will face.</param>\n      <param name=\"useTransform\">Include the rotation and scale of the Transform in the baked mesh.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystemRenderer.BakeTrailsMesh(UnityEngine.Mesh)\">\n      <summary>\n        <para>Creates a snapshot of ParticleSystem Trails and stores them in mesh.</para>\n      </summary>\n      <param name=\"mesh\">A static mesh that will receive the snapshot of the particle trails.</param>\n      <param name=\"camera\">The camera used for determining which way view space trails will face.</param>\n      <param name=\"useTransform\">Include the rotation and scale of the Transform in the baked mesh.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystemRenderer.BakeTrailsMesh(UnityEngine.Mesh,System.Boolean)\">\n      <summary>\n        <para>Creates a snapshot of ParticleSystem Trails and stores them in mesh.</para>\n      </summary>\n      <param name=\"mesh\">A static mesh that will receive the snapshot of the particle trails.</param>\n      <param name=\"camera\">The camera used for determining which way view space trails will face.</param>\n      <param name=\"useTransform\">Include the rotation and scale of the Transform in the baked mesh.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystemRenderer.BakeTrailsMesh(UnityEngine.Mesh,UnityEngine.Camera)\">\n      <summary>\n        <para>Creates a snapshot of ParticleSystem Trails and stores them in mesh.</para>\n      </summary>\n      <param name=\"mesh\">A static mesh that will receive the snapshot of the particle trails.</param>\n      <param name=\"camera\">The camera used for determining which way view space trails will face.</param>\n      <param name=\"useTransform\">Include the rotation and scale of the Transform in the baked mesh.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystemRenderer.BakeTrailsMesh(UnityEngine.Mesh,UnityEngine.Camera,System.Boolean)\">\n      <summary>\n        <para>Creates a snapshot of ParticleSystem Trails and stores them in mesh.</para>\n      </summary>\n      <param name=\"mesh\">A static mesh that will receive the snapshot of the particle trails.</param>\n      <param name=\"camera\">The camera used for determining which way view space trails will face.</param>\n      <param name=\"useTransform\">Include the rotation and scale of the Transform in the baked mesh.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystemRenderer.DisableVertexStreams(UnityEngine.ParticleSystemVertexStreams)\">\n      <summary>\n        <para>Disable a set of vertex shader streams on the particle system renderer.\nThe position stream is always enabled, and any attempts to remove it will be ignored.</para>\n      </summary>\n      <param name=\"streams\">Streams to disable.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystemRenderer.EnableVertexStreams(UnityEngine.ParticleSystemVertexStreams)\">\n      <summary>\n        <para>Enable a set of vertex shader streams on the particle system renderer.</para>\n      </summary>\n      <param name=\"streams\">Streams to enable.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystemRenderer.GetActiveVertexStreams(System.Collections.Generic.List`1&lt;UnityEngine.ParticleSystemVertexStream&gt;)\">\n      <summary>\n        <para>Query which vertex shader streams are enabled on the ParticleSystemRenderer.</para>\n      </summary>\n      <param name=\"streams\">The array of streams to be populated.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystemRenderer.GetEnabledVertexStreams(UnityEngine.ParticleSystemVertexStreams)\">\n      <summary>\n        <para>Query whether the particle system renderer uses a particular set of vertex streams.</para>\n      </summary>\n      <param name=\"streams\">Streams to query.</param>\n      <returns>\n        <para>Returns the subset of the queried streams that are actually enabled.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystemRenderer.GetMeshes(UnityEngine.Mesh[])\">\n      <summary>\n        <para>Get the array of meshes to be used as particles.</para>\n      </summary>\n      <param name=\"meshes\">This array will be populated with the list of meshes being used for particle rendering.</param>\n      <returns>\n        <para>The number of meshes actually written to the destination array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystemRenderer.SetActiveVertexStreams(System.Collections.Generic.List`1&lt;UnityEngine.ParticleSystemVertexStream&gt;)\">\n      <summary>\n        <para>Enable a set of vertex shader streams on the ParticleSystemRenderer.</para>\n      </summary>\n      <param name=\"streams\">The new array of enabled vertex streams.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystemRenderer.SetMeshes(UnityEngine.Mesh[])\">\n      <summary>\n        <para>Set an array of meshes to be used as particles when the ParticleSystemRenderer.renderMode is set to ParticleSystemRenderMode.Mesh.</para>\n      </summary>\n      <param name=\"meshes\">Array of meshes to be used.</param>\n      <param name=\"size\">Number of elements from the mesh array to be applied.</param>\n    </member>\n    <member name=\"M:UnityEngine.ParticleSystemRenderer.SetMeshes(UnityEngine.Mesh[],System.Int32)\">\n      <summary>\n        <para>Set an array of meshes to be used as particles when the ParticleSystemRenderer.renderMode is set to ParticleSystemRenderMode.Mesh.</para>\n      </summary>\n      <param name=\"meshes\">Array of meshes to be used.</param>\n      <param name=\"size\">Number of elements from the mesh array to be applied.</param>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemRenderMode\">\n      <summary>\n        <para>The rendering mode for particle systems (Shuriken).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemRenderMode.Billboard\">\n      <summary>\n        <para>Render particles as billboards facing the active camera. (Default)</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemRenderMode.HorizontalBillboard\">\n      <summary>\n        <para>Render particles as billboards always facing up along the y-Axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemRenderMode.Mesh\">\n      <summary>\n        <para>Render particles as meshes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemRenderMode.None\">\n      <summary>\n        <para>Do not render particles.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemRenderMode.Stretch\">\n      <summary>\n        <para>Stretch particles in the direction of motion.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemRenderMode.VerticalBillboard\">\n      <summary>\n        <para>Render particles as billboards always facing the player, but not pitching along the x-Axis.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemRenderSpace\">\n      <summary>\n        <para>How particles are aligned when rendered.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemRenderSpace.Facing\">\n      <summary>\n        <para>Particles face the eye position.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemRenderSpace.Local\">\n      <summary>\n        <para>Particles align with their local transform.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemRenderSpace.Velocity\">\n      <summary>\n        <para>Particles are aligned to their direction of travel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemRenderSpace.View\">\n      <summary>\n        <para>Particles face the camera plane.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemRenderSpace.World\">\n      <summary>\n        <para>Particles align with the world.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemScalingMode\">\n      <summary>\n        <para>Control how particle systems apply transform scale.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemScalingMode.Hierarchy\">\n      <summary>\n        <para>Scale the particle system using the entire transform hierarchy.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemScalingMode.Local\">\n      <summary>\n        <para>Scale the particle system using only its own transform scale. (Ignores parent scale).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemScalingMode.Shape\">\n      <summary>\n        <para>Only apply transform scale to the shape component, which controls where\n        particles are spawned, but does not affect their size or movement.\n        </para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemShapeMultiModeValue\">\n      <summary>\n        <para>The mode used to generate new points in a shape (Shuriken).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeMultiModeValue.BurstSpread\">\n      <summary>\n        <para>Distribute new particles around the shape evenly.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeMultiModeValue.Loop\">\n      <summary>\n        <para>Animate the emission point around the shape.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeMultiModeValue.PingPong\">\n      <summary>\n        <para>Animate the emission point around the shape, alternating between clockwise and counter-clockwise directions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeMultiModeValue.Random\">\n      <summary>\n        <para>Generate points randomly. (Default)</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemShapeTextureChannel\">\n      <summary>\n        <para>The texture channel (Shuriken).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeTextureChannel.Alpha\">\n      <summary>\n        <para>The alpha channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeTextureChannel.Blue\">\n      <summary>\n        <para>The blue channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeTextureChannel.Green\">\n      <summary>\n        <para>The green channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeTextureChannel.Red\">\n      <summary>\n        <para>The red channel.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemShapeType\">\n      <summary>\n        <para>The emission shape (Shuriken).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.Box\">\n      <summary>\n        <para>Emit from the volume of a box.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.BoxEdge\">\n      <summary>\n        <para>Emit from the edges of a box.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.BoxShell\">\n      <summary>\n        <para>Emit from the surface of a box.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.Circle\">\n      <summary>\n        <para>Emit from a circle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.CircleEdge\">\n      <summary>\n        <para>Emit from the edge of a circle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.Cone\">\n      <summary>\n        <para>Emit from the base of a cone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.ConeShell\">\n      <summary>\n        <para>Emit from the base surface of a cone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.ConeVolume\">\n      <summary>\n        <para>Emit from a cone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.ConeVolumeShell\">\n      <summary>\n        <para>Emit from the surface of a cone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.Donut\">\n      <summary>\n        <para>Emit from a Donut.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.Hemisphere\">\n      <summary>\n        <para>Emit from a half-sphere.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.HemisphereShell\">\n      <summary>\n        <para>Emit from the surface of a half-sphere.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.Mesh\">\n      <summary>\n        <para>Emit from a mesh.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.MeshRenderer\">\n      <summary>\n        <para>Emit from a mesh renderer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.Rectangle\">\n      <summary>\n        <para>Emit from a rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.SingleSidedEdge\">\n      <summary>\n        <para>Emit from an edge.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.SkinnedMeshRenderer\">\n      <summary>\n        <para>Emit from a skinned mesh renderer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.Sphere\">\n      <summary>\n        <para>Emit from a sphere.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.SphereShell\">\n      <summary>\n        <para>Emit from the surface of a sphere.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.Sprite\">\n      <summary>\n        <para>Emit from a sprite.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemShapeType.SpriteRenderer\">\n      <summary>\n        <para>Emit from a sprite renderer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemSimulationSpace\">\n      <summary>\n        <para>The space to simulate particles in.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemSimulationSpace.Custom\">\n      <summary>\n        <para>Simulate particles relative to a custom transform component, defined by ParticleSystem.MainModule.customSimulationSpace.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemSimulationSpace.Local\">\n      <summary>\n        <para>Simulate particles in local space.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemSimulationSpace.World\">\n      <summary>\n        <para>Simulate particles in world space.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemSortMode\">\n      <summary>\n        <para>The sorting mode for particle systems.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemSortMode.Distance\">\n      <summary>\n        <para>Sort based on distance.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemSortMode.None\">\n      <summary>\n        <para>No sorting.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemSortMode.OldestInFront\">\n      <summary>\n        <para>Sort the oldest particles to the front.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemSortMode.YoungestInFront\">\n      <summary>\n        <para>Sort the youngest particles to the front.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemStopAction\">\n      <summary>\n        <para>The action to perform when the Particle System stops.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemStopAction.Callback\">\n      <summary>\n        <para>Call OnParticleSystemStopped on the ParticleSystem script.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemStopAction.Destroy\">\n      <summary>\n        <para>Destroy the GameObject containing the Particle System.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemStopAction.Disable\">\n      <summary>\n        <para>Disable the GameObject containing the Particle System.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemStopAction.None\">\n      <summary>\n        <para>Do nothing.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemStopBehavior\">\n      <summary>\n        <para>The behavior to apply when calling ParticleSystem.Stop|Stop.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemStopBehavior.StopEmitting\">\n      <summary>\n        <para>Stops particle system emitting any further particles. All existing particles will remain until they expire.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemStopBehavior.StopEmittingAndClear\">\n      <summary>\n        <para>Stops particle system emitting and removes all existing emitted particles.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemSubEmitterProperties\">\n      <summary>\n        <para>The properties of sub-emitter particles.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemSubEmitterProperties.InheritColor\">\n      <summary>\n        <para>When spawning new particles, multiply the start color by the color of the parent particles.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemSubEmitterProperties.InheritEverything\">\n      <summary>\n        <para>When spawning new particles, inherit all available properties from the parent particles.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemSubEmitterProperties.InheritLifetime\">\n      <summary>\n        <para>New particles will have a shorter lifespan, the closer their parent particles are to death.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemSubEmitterProperties.InheritNothing\">\n      <summary>\n        <para>When spawning new particles, do not inherit any properties from the parent particles.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemSubEmitterProperties.InheritRotation\">\n      <summary>\n        <para>When spawning new particles, add the start rotation to the rotation of the parent particles.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemSubEmitterProperties.InheritSize\">\n      <summary>\n        <para>When spawning new particles, multiply the start size by the size of the parent particles.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemSubEmitterType\">\n      <summary>\n        <para>The events that cause new particles to be spawned.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemSubEmitterType.Birth\">\n      <summary>\n        <para>Spawns new particles when particles from the parent system are born.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemSubEmitterType.Collision\">\n      <summary>\n        <para>Spawns new particles when particles from the parent system collide with something.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemSubEmitterType.Death\">\n      <summary>\n        <para>Spawns new particles when particles from the parent system die.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemSubEmitterType.Manual\">\n      <summary>\n        <para>Spawns new particles when triggered from script using ParticleSystem.TriggerSubEmitter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemSubEmitterType.Trigger\">\n      <summary>\n        <para>Spawns new particles when particles from the parent system pass conditions in the Trigger Module.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemTrailMode\">\n      <summary>\n        <para>Choose how Particle Trails are generated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemTrailMode.PerParticle\">\n      <summary>\n        <para>Makes a trail behind each particle as the particle moves.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemTrailMode.Ribbon\">\n      <summary>\n        <para>Draws a line between each particle, connecting the youngest particle to the oldest.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemTrailTextureMode\">\n      <summary>\n        <para>Choose how textures are applied to Particle Trails.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemTrailTextureMode.DistributePerSegment\">\n      <summary>\n        <para>Map the texture once along the entire length of the trail, assuming all vertices are evenly spaced.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemTrailTextureMode.RepeatPerSegment\">\n      <summary>\n        <para>Repeat the texture along the trail, repeating at a rate of once per trail segment. To adjust the tiling rate, use Material.SetTextureScale.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemTrailTextureMode.Stretch\">\n      <summary>\n        <para>Map the texture once along the entire length of the trail.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemTrailTextureMode.Tile\">\n      <summary>\n        <para>Repeat the texture along the trail. To set the tiling rate, use Material.SetTextureScale.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemTriggerEventType\">\n      <summary>\n        <para>The different types of particle triggers.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemTriggerEventType.Enter\">\n      <summary>\n        <para>Trigger when particles enter the collision volume.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemTriggerEventType.Exit\">\n      <summary>\n        <para>Trigger when particles leave the collision volume.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemTriggerEventType.Inside\">\n      <summary>\n        <para>Trigger when particles are inside the collision volume.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemTriggerEventType.Outside\">\n      <summary>\n        <para>Trigger when particles are outside the collision volume.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemVertexStream\">\n      <summary>\n        <para>All possible particle system vertex shader inputs.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.AgePercent\">\n      <summary>\n        <para>The normalized age of each particle, from 0 to 1.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.AnimBlend\">\n      <summary>\n        <para>The amount to blend between animated texture frames, from 0 to 1.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.AnimFrame\">\n      <summary>\n        <para>The current animation frame index of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.Center\">\n      <summary>\n        <para>The center position of the entire particle, in world space.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.Color\">\n      <summary>\n        <para>The color of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.Custom1X\">\n      <summary>\n        <para>One custom value for each particle, defined by the Custom Data Module, or ParticleSystem.SetCustomParticleData.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.Custom1XY\">\n      <summary>\n        <para>Two custom values for each particle, defined by the Custom Data Module, or ParticleSystem.SetCustomParticleData.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.Custom1XYZ\">\n      <summary>\n        <para>Three custom values for each particle, defined by the Custom Data Module, or ParticleSystem.SetCustomParticleData.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.Custom1XYZW\">\n      <summary>\n        <para>Four custom values for each particle, defined by the Custom Data Module, or ParticleSystem.SetCustomParticleData.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.Custom2X\">\n      <summary>\n        <para>One custom value for each particle, defined by the Custom Data Module, or ParticleSystem.SetCustomParticleData.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.Custom2XY\">\n      <summary>\n        <para>Two custom values for each particle, defined by the Custom Data Module, or ParticleSystem.SetCustomParticleData.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.Custom2XYZ\">\n      <summary>\n        <para>Three custom values for each particle, defined by the Custom Data Module, or ParticleSystem.SetCustomParticleData.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.Custom2XYZW\">\n      <summary>\n        <para>Four custom values for each particle, defined by the Custom Data Module, or ParticleSystem.SetCustomParticleData.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.InvStartLifetime\">\n      <summary>\n        <para>The reciprocal of the starting lifetime, in seconds (1.0f / startLifetime).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.NoiseImpulseX\">\n      <summary>\n        <para>The X axis noise on the current frame.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.NoiseImpulseXY\">\n      <summary>\n        <para>The X and Y axis noise on the current frame.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.NoiseImpulseXYZ\">\n      <summary>\n        <para>The 3D noise on the current frame.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.NoiseSumX\">\n      <summary>\n        <para>The accumulated X axis noise, over the lifetime of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.NoiseSumXY\">\n      <summary>\n        <para>The accumulated X and Y axis noise, over the lifetime of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.NoiseSumXYZ\">\n      <summary>\n        <para>The accumulated 3D noise, over the lifetime of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.Normal\">\n      <summary>\n        <para>The vertex normal of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.Position\">\n      <summary>\n        <para>The position of each particle vertex, in world space.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.Rotation\">\n      <summary>\n        <para>The Z axis rotation of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.Rotation3D\">\n      <summary>\n        <para>The 3D rotation of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.RotationSpeed\">\n      <summary>\n        <para>The Z axis rotational speed of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.RotationSpeed3D\">\n      <summary>\n        <para>The 3D rotational speed of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.SizeX\">\n      <summary>\n        <para>The X axis size of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.SizeXY\">\n      <summary>\n        <para>The X and Y axis sizes of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.SizeXYZ\">\n      <summary>\n        <para>The 3D size of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.Speed\">\n      <summary>\n        <para>The speed of each particle, calculated by taking the magnitude of the velocity.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.StableRandomX\">\n      <summary>\n        <para>A random number for each particle, which remains constant during their lifetime.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.StableRandomXY\">\n      <summary>\n        <para>Two random numbers for each particle, which remain constant during their lifetime.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.StableRandomXYZ\">\n      <summary>\n        <para>Three random numbers for each particle, which remain constant during their lifetime.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.StableRandomXYZW\">\n      <summary>\n        <para>Four random numbers for each particle, which remain constant during their lifetime.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.Tangent\">\n      <summary>\n        <para>The tangent vector for each particle (for normal mapping).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.UV\">\n      <summary>\n        <para>The first UV stream of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.UV2\">\n      <summary>\n        <para>The second UV stream of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.UV3\">\n      <summary>\n        <para>The third UV stream of each particle (only for meshes).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.UV4\">\n      <summary>\n        <para>The fourth UV stream of each particle (only for meshes).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.VaryingRandomX\">\n      <summary>\n        <para>A random number for each particle, which changes during their lifetime.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.VaryingRandomXY\">\n      <summary>\n        <para>Two random numbers for each particle, which change during their lifetime.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.VaryingRandomXYZ\">\n      <summary>\n        <para>Three random numbers for each particle, which change during their lifetime.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.VaryingRandomXYZW\">\n      <summary>\n        <para>Four random numbers for each particle, which change during their lifetime.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.Velocity\">\n      <summary>\n        <para>The velocity of each particle, in world space.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStream.VertexID\">\n      <summary>\n        <para>The vertex ID of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ParticleSystemVertexStreams\">\n      <summary>\n        <para>All possible particle system vertex shader inputs.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStreams.All\">\n      <summary>\n        <para>A mask with all vertex streams enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStreams.CenterAndVertexID\">\n      <summary>\n        <para>The center position of each particle, with the vertex ID of each particle, from 0-3, stored in the w component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStreams.Color\">\n      <summary>\n        <para>The color of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStreams.Custom1\">\n      <summary>\n        <para>The first stream of custom data, supplied from script.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStreams.Custom2\">\n      <summary>\n        <para>The second stream of custom data, supplied from script.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStreams.Lifetime\">\n      <summary>\n        <para>Alive time as a 0-1 value in the X component, and Total Lifetime in the Y component.\nTo get the current particle age, simply multiply X by Y.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStreams.None\">\n      <summary>\n        <para>A mask with no vertex streams enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStreams.Normal\">\n      <summary>\n        <para>The normal of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStreams.Position\">\n      <summary>\n        <para>The world space position of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStreams.Random\">\n      <summary>\n        <para>4 random numbers. The first 3 are deterministic and assigned once when each particle is born, but the 4th value will change during the lifetime of the particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStreams.Rotation\">\n      <summary>\n        <para>The rotation of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStreams.Size\">\n      <summary>\n        <para>The size of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStreams.Tangent\">\n      <summary>\n        <para>Tangent vectors for normal mapping.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStreams.UV\">\n      <summary>\n        <para>The texture coordinates of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStreams.UV2BlendAndFrame\">\n      <summary>\n        <para>With the Texture Sheet Animation module enabled, this contains the UVs for the second texture frame, the blend factor for each particle, and the raw frame, allowing for blending of frames.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ParticleSystemVertexStreams.Velocity\">\n      <summary>\n        <para>The 3D velocity of each particle.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.PatchExtents\">\n      <summary>\n        <para>Structure containing minimum and maximum terrain patch height values.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PatchExtents.max\">\n      <summary>\n        <para>Maximum height of a terrain patch.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PatchExtents.min\">\n      <summary>\n        <para>Minimum height of a terrain patch.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.PhysicMaterial\">\n      <summary>\n        <para>Physics material describes how to handle colliding objects (friction, bounciness).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicMaterial.bounceCombine\">\n      <summary>\n        <para>Determines how the bounciness is combined.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicMaterial.bounciness\">\n      <summary>\n        <para>How bouncy is the surface? A value of 0 will not bounce. A value of 1 will bounce without any loss of energy.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicMaterial.dynamicFriction\">\n      <summary>\n        <para>The friction used when already moving.  This value is usually between 0 and 1.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicMaterial.dynamicFriction2\">\n      <summary>\n        <para>If anisotropic friction is enabled, dynamicFriction2 will be applied along frictionDirection2.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicMaterial.frictionCombine\">\n      <summary>\n        <para>Determines how the friction is combined.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicMaterial.frictionDirection2\">\n      <summary>\n        <para>The direction of anisotropy. Anisotropic friction is enabled if the vector is not zero.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicMaterial.staticFriction\">\n      <summary>\n        <para>The friction coefficient used when an object is lying on a surface.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicMaterial.staticFriction2\">\n      <summary>\n        <para>If anisotropic friction is enabled, staticFriction2 will be applied along frictionDirection2.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.PhysicMaterial.#ctor\">\n      <summary>\n        <para>Creates a new material.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.PhysicMaterial.#ctor(System.String)\">\n      <summary>\n        <para>Creates a new material named name.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"T:UnityEngine.PhysicMaterialCombine\">\n      <summary>\n        <para>Describes how physics materials of the colliding objects are combined.\n\nThe friction force as well as the residual bounce impulse are applied symmertrically to both of the colliders in contact, so each pair of overlapping colliders must have a single set of friction and bouciness settings. However, one can set arbitrary physics materials to any colliders. For that particular reason, there is a mechanism that allows the combination of two different sets of properties that correspond to each of the colliders in contact into one set to be used in the solver.\n\nSpecifying Average, Maximum, Minimum or Multiply as the physics material combine mode, you directly set the function that is used to combine the settings corresponding to the two overlapping colliders into one set of settings that can be used to apply the material effect.\n\nNote that there is a special case when the two overlapping colliders have physics materials with different combine modes set. In this particular case, the function that has the highest priority is used. The priority order is as follows: Average &lt; Minimum &lt; Multiply &lt; Maximum. For example, if one material has Average set but the other one has Maximum, then the combine function to be used is Maximum, since it has higher priority.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.PhysicMaterialCombine.Average\">\n      <summary>\n        <para>Averages the friction/bounce of the two colliding materials.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.PhysicMaterialCombine.Maximum\">\n      <summary>\n        <para>Uses the larger friction/bounce of the two colliding materials.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.PhysicMaterialCombine.Minimum\">\n      <summary>\n        <para>Uses the smaller friction/bounce of the two colliding materials.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.PhysicMaterialCombine.Multiply\">\n      <summary>\n        <para>Multiplies the friction/bounce of the two colliding materials.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Physics\">\n      <summary>\n        <para>Global physics properties and helper methods.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics.autoSimulation\">\n      <summary>\n        <para>Sets whether the physics should be simulated automatically or not.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics.autoSyncTransforms\">\n      <summary>\n        <para>Whether or not to automatically sync transform changes with the physics system whenever a Transform component changes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics.bounceThreshold\">\n      <summary>\n        <para>Two colliding objects with a relative velocity below this will not bounce (default 2). Must be positive.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics.defaultContactOffset\">\n      <summary>\n        <para>The default contact offset of the newly created colliders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics.defaultSolverIterations\">\n      <summary>\n        <para>The defaultSolverIterations determines how accurately Rigidbody joints and collision contacts are resolved. (default 6). Must be positive.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics.defaultSolverVelocityIterations\">\n      <summary>\n        <para>The defaultSolverVelocityIterations affects how accurately the Rigidbody joints and collision contacts are resolved. (default 1). Must be positive.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics.gravity\">\n      <summary>\n        <para>The gravity applied to all rigid bodies in the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics.interCollisionDistance\">\n      <summary>\n        <para>Sets the minimum separation distance for cloth inter-collision.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics.interCollisionStiffness\">\n      <summary>\n        <para>Sets the cloth inter-collision stiffness.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics.maxAngularVelocity\">\n      <summary>\n        <para>The default maximum angular velocity permitted for any rigid bodies (default 7). Must be positive.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics.minPenetrationForPenalty\">\n      <summary>\n        <para>The minimum contact penetration value in order to apply a penalty force (default 0.05). Must be positive.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics.queriesHitBackfaces\">\n      <summary>\n        <para>Whether physics queries should hit back-face triangles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics.queriesHitTriggers\">\n      <summary>\n        <para>Specifies whether queries (raycasts, spherecasts, overlap tests, etc.) hit Triggers by default.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics.sleepAngularVelocity\">\n      <summary>\n        <para>The default angular velocity, below which objects start sleeping (default 0.14). Must be positive.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics.sleepThreshold\">\n      <summary>\n        <para>The mass-normalized energy threshold, below which objects start going to sleep.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics.sleepVelocity\">\n      <summary>\n        <para>The default linear velocity, below which objects start going to sleep (default 0.15). Must be positive.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Physics.AllLayers\">\n      <summary>\n        <para>Layer mask constant to select all layers.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Physics.BoxCast(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Quaternion,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Casts the box along a ray and returns detailed information on what was hit.</para>\n      </summary>\n      <param name=\"center\">Center of the box.</param>\n      <param name=\"halfExtents\">Half the size of the box in each dimension.</param>\n      <param name=\"direction\">The direction in which to cast the box.</param>\n      <param name=\"orientation\">Rotation of the box.</param>\n      <param name=\"maxDistance\">The max length of the cast.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a capsule.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>True, if any intersections were found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.BoxCast(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.RaycastHit&amp;,UnityEngine.Quaternion,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Casts the box along a ray and returns detailed information on what was hit.</para>\n      </summary>\n      <param name=\"center\">Center of the box.</param>\n      <param name=\"halfExtents\">Half the size of the box in each dimension.</param>\n      <param name=\"direction\">The direction in which to cast the box.</param>\n      <param name=\"hitInfo\">If true is returned, hitInfo will contain more information about where the collider was hit. (See Also: RaycastHit).</param>\n      <param name=\"orientation\">Rotation of the box.</param>\n      <param name=\"maxDistance\">The max length of the cast.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a capsule.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>True, if any intersections were found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.BoxCastAll(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Quaternion,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Like Physics.BoxCast, but returns all hits.</para>\n      </summary>\n      <param name=\"center\">Center of the box.</param>\n      <param name=\"halfExtents\">Half the size of the box in each dimension.</param>\n      <param name=\"direction\">The direction in which to cast the box.</param>\n      <param name=\"orientation\">Rotation of the box.</param>\n      <param name=\"maxDistance\">The max length of the cast.</param>\n      <param name=\"layermask\">A that is used to selectively ignore colliders when casting a capsule.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <param name=\"layerMask\"></param>\n      <returns>\n        <para>All colliders that were hit.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.BoxCastNonAlloc(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.RaycastHit[],UnityEngine.Quaternion,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Cast the box along the direction, and store hits in the provided buffer.</para>\n      </summary>\n      <param name=\"center\">Center of the box.</param>\n      <param name=\"halfExtents\">Half the size of the box in each dimension.</param>\n      <param name=\"direction\">The direction in which to cast the box.</param>\n      <param name=\"results\">The buffer to store the results in.</param>\n      <param name=\"orientation\">Rotation of the box.</param>\n      <param name=\"maxDistance\">The max length of the cast.</param>\n      <param name=\"layermask\">A that is used to selectively ignore colliders when casting a capsule.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <param name=\"layerMask\"></param>\n      <returns>\n        <para>The amount of hits stored to the results buffer.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.CapsuleCast(UnityEngine.Vector3,UnityEngine.Vector3,System.Single,UnityEngine.Vector3,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Casts a capsule against all colliders in the scene and returns detailed information on what was hit.</para>\n      </summary>\n      <param name=\"point1\">The center of the sphere at the start of the capsule.</param>\n      <param name=\"point2\">The center of the sphere at the end of the capsule.</param>\n      <param name=\"radius\">The radius of the capsule.</param>\n      <param name=\"direction\">The direction into which to sweep the capsule.</param>\n      <param name=\"maxDistance\">The max length of the sweep.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a capsule.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>True when the capsule sweep intersects any collider, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.CapsuleCast(UnityEngine.Vector3,UnityEngine.Vector3,System.Single,UnityEngine.Vector3,UnityEngine.RaycastHit&amp;,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"point1\">The center of the sphere at the start of the capsule.</param>\n      <param name=\"point2\">The center of the sphere at the end of the capsule.</param>\n      <param name=\"radius\">The radius of the capsule.</param>\n      <param name=\"direction\">The direction into which to sweep the capsule.</param>\n      <param name=\"maxDistance\">The max length of the sweep.</param>\n      <param name=\"hitInfo\">If true is returned, hitInfo will contain more information about where the collider was hit. (See Also: RaycastHit).</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a capsule.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n    </member>\n    <member name=\"M:UnityEngine.Physics.CapsuleCastAll(UnityEngine.Vector3,UnityEngine.Vector3,System.Single,UnityEngine.Vector3,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Like Physics.CapsuleCast, but this function will return all hits the capsule sweep intersects.</para>\n      </summary>\n      <param name=\"point1\">The center of the sphere at the start of the capsule.</param>\n      <param name=\"point2\">The center of the sphere at the end of the capsule.</param>\n      <param name=\"radius\">The radius of the capsule.</param>\n      <param name=\"direction\">The direction into which to sweep the capsule.</param>\n      <param name=\"maxDistance\">The max length of the sweep.</param>\n      <param name=\"layermask\">A that is used to selectively ignore colliders when casting a capsule.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <param name=\"layerMask\"></param>\n      <returns>\n        <para>An array of all colliders hit in the sweep.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.CapsuleCastNonAlloc(UnityEngine.Vector3,UnityEngine.Vector3,System.Single,UnityEngine.Vector3,UnityEngine.RaycastHit[],System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Casts a capsule against all colliders in the scene and returns detailed information on what was hit into the buffer.</para>\n      </summary>\n      <param name=\"point1\">The center of the sphere at the start of the capsule.</param>\n      <param name=\"point2\">The center of the sphere at the end of the capsule.</param>\n      <param name=\"radius\">The radius of the capsule.</param>\n      <param name=\"direction\">The direction into which to sweep the capsule.</param>\n      <param name=\"results\">The buffer to store the hits into.</param>\n      <param name=\"maxDistance\">The max length of the sweep.</param>\n      <param name=\"layermask\">A that is used to selectively ignore colliders when casting a capsule.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <param name=\"layerMask\"></param>\n      <returns>\n        <para>The amount of hits stored into the buffer.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.CheckBox(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Quaternion,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Check whether the given box overlaps with other colliders or not.</para>\n      </summary>\n      <param name=\"center\">Center of the box.</param>\n      <param name=\"halfExtents\">Half the size of the box in each dimension.</param>\n      <param name=\"orientation\">Rotation of the box.</param>\n      <param name=\"layermask\">A that is used to selectively ignore colliders when casting a ray.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>True, if the box overlaps with any colliders.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.CheckCapsule(UnityEngine.Vector3,UnityEngine.Vector3,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Checks if any colliders overlap a capsule-shaped volume in world space.</para>\n      </summary>\n      <param name=\"start\">The center of the sphere at the start of the capsule.</param>\n      <param name=\"end\">The center of the sphere at the end of the capsule.</param>\n      <param name=\"radius\">The radius of the capsule.</param>\n      <param name=\"layermask\">A that is used to selectively ignore colliders when casting a capsule.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <param name=\"layerMask\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Physics.CheckSphere(UnityEngine.Vector3,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Returns true if there are any colliders overlapping the sphere defined by position and radius in world coordinates.</para>\n      </summary>\n      <param name=\"position\">Center of the sphere.</param>\n      <param name=\"radius\">Radius of the sphere.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a capsule.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n    </member>\n    <member name=\"M:UnityEngine.Physics.ClosestPoint(UnityEngine.Vector3,UnityEngine.Collider,UnityEngine.Vector3,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Returns a point on the given collider that is closest to the specified location.</para>\n      </summary>\n      <param name=\"point\">Location you want to find the closest point to.</param>\n      <param name=\"collider\">The collider that you find the closest point on.</param>\n      <param name=\"position\">The position of the collider.</param>\n      <param name=\"rotation\">The rotation of the collider.</param>\n      <returns>\n        <para>The point on the collider that is closest to the specified location.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.ComputePenetration(UnityEngine.Collider,UnityEngine.Vector3,UnityEngine.Quaternion,UnityEngine.Collider,UnityEngine.Vector3,UnityEngine.Quaternion,UnityEngine.Vector3&amp;,System.Single&amp;)\">\n      <summary>\n        <para>Compute the minimal translation required to separate the given colliders apart at specified poses.</para>\n      </summary>\n      <param name=\"colliderA\">The first collider.</param>\n      <param name=\"positionA\">Position of the first collider.</param>\n      <param name=\"rotationA\">Rotation of the first collider.</param>\n      <param name=\"colliderB\">The second collider.</param>\n      <param name=\"positionB\">Position of the second collider.</param>\n      <param name=\"rotationB\">Rotation of the second collider.</param>\n      <param name=\"direction\">Direction along which the translation required to separate the colliders apart is minimal.</param>\n      <param name=\"distance\">The distance along direction that is required to separate the colliders apart.</param>\n      <returns>\n        <para>True, if the colliders overlap at the given poses.</para>\n      </returns>\n    </member>\n    <member name=\"F:UnityEngine.Physics.DefaultRaycastLayers\">\n      <summary>\n        <para>Layer mask constant to select default raycast layers.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Physics.GetIgnoreLayerCollision(System.Int32,System.Int32)\">\n      <summary>\n        <para>Are collisions between layer1 and layer2 being ignored?</para>\n      </summary>\n      <param name=\"layer1\"></param>\n      <param name=\"layer2\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Physics.IgnoreCollision(UnityEngine.Collider,UnityEngine.Collider,System.Boolean)\">\n      <summary>\n        <para>Makes the collision detection system ignore all collisions between collider1 and collider2.</para>\n      </summary>\n      <param name=\"start\">Start point.</param>\n      <param name=\"end\">End point.</param>\n      <param name=\"ignore\">Ignore collision.</param>\n      <param name=\"collider1\"></param>\n      <param name=\"collider2\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Physics.IgnoreLayerCollision(System.Int32,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Makes the collision detection system ignore all collisions between any collider in layer1 and any collider in layer2.\n\nNote that IgnoreLayerCollision will reset the trigger state of affected colliders, so you might receive OnTriggerExit and OnTriggerEnter messages in response to calling this.</para>\n      </summary>\n      <param name=\"layer1\"></param>\n      <param name=\"layer2\"></param>\n      <param name=\"ignore\"></param>\n    </member>\n    <member name=\"F:UnityEngine.Physics.IgnoreRaycastLayer\">\n      <summary>\n        <para>Layer mask constant to select ignore raycast layer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Physics.Linecast(UnityEngine.Vector3,UnityEngine.Vector3,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Returns true if there is any collider intersecting the line between start and end.</para>\n      </summary>\n      <param name=\"start\">Start point.</param>\n      <param name=\"end\">End point.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a ray.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n    </member>\n    <member name=\"M:UnityEngine.Physics.Linecast(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.RaycastHit&amp;,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Returns true if there is any collider intersecting the line between start and end.</para>\n      </summary>\n      <param name=\"start\">Start point.</param>\n      <param name=\"end\">End point.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a ray.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <param name=\"hitInfo\">If true is returned, hitInfo will contain more information about where the collider was hit. (See Also: RaycastHit).</param>\n    </member>\n    <member name=\"M:UnityEngine.Physics.OverlapBox(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Quaternion,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Find all colliders touching or inside of the given box.</para>\n      </summary>\n      <param name=\"center\">Center of the box.</param>\n      <param name=\"halfExtents\">Half of the size of the box in each dimension.</param>\n      <param name=\"orientation\">Rotation of the box.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a ray.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>Colliders that overlap with the given box.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.OverlapBoxNonAlloc(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Collider[],UnityEngine.Quaternion,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Find all colliders touching or inside of the given box, and store them into the buffer.</para>\n      </summary>\n      <param name=\"center\">Center of the box.</param>\n      <param name=\"halfExtents\">Half of the size of the box in each dimension.</param>\n      <param name=\"results\">The buffer to store the results in.</param>\n      <param name=\"orientation\">Rotation of the box.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a ray.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <param name=\"mask\"></param>\n      <returns>\n        <para>The amount of colliders stored in results.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.OverlapCapsule(UnityEngine.Vector3,UnityEngine.Vector3,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Check the given capsule against the physics world and return all overlapping colliders.</para>\n      </summary>\n      <param name=\"point0\">The center of the sphere at the start of the capsule.</param>\n      <param name=\"point1\">The center of the sphere at the end of the capsule.</param>\n      <param name=\"radius\">The radius of the capsule.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a capsule.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>Colliders touching or inside the capsule.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.OverlapCapsuleNonAlloc(UnityEngine.Vector3,UnityEngine.Vector3,System.Single,UnityEngine.Collider[],System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Check the given capsule against the physics world and return all overlapping colliders in the user-provided buffer.</para>\n      </summary>\n      <param name=\"point0\">The center of the sphere at the start of the capsule.</param>\n      <param name=\"point1\">The center of the sphere at the end of the capsule.</param>\n      <param name=\"radius\">The radius of the capsule.</param>\n      <param name=\"results\">The buffer to store the results into.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a capsule.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>The amount of entries written to the buffer.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.OverlapSphere(UnityEngine.Vector3,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Returns an array with all colliders touching or inside the sphere.</para>\n      </summary>\n      <param name=\"position\">Center of the sphere.</param>\n      <param name=\"radius\">Radius of the sphere.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a ray.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n    </member>\n    <member name=\"M:UnityEngine.Physics.OverlapSphereNonAlloc(UnityEngine.Vector3,System.Single,UnityEngine.Collider[],System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Computes and stores colliders touching or inside the sphere into the provided buffer.</para>\n      </summary>\n      <param name=\"position\">Center of the sphere.</param>\n      <param name=\"radius\">Radius of the sphere.</param>\n      <param name=\"results\">The buffer to store the results into.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a ray.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>The amount of colliders stored into the results buffer.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.Raycast(UnityEngine.Vector3,UnityEngine.Vector3,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Casts a ray, from point origin, in direction direction, of length maxDistance, against all colliders in the scene.</para>\n      </summary>\n      <param name=\"origin\">The starting point of the ray in world coordinates.</param>\n      <param name=\"direction\">The direction of the ray.</param>\n      <param name=\"maxDistance\">The max distance the ray should check for collisions.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore Colliders when casting a ray.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>True if the ray intersects with a Collider, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.Raycast(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.RaycastHit&amp;,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Casts a ray against all colliders in the scene and returns detailed information on what was hit.</para>\n      </summary>\n      <param name=\"origin\">The starting point of the ray in world coordinates.</param>\n      <param name=\"direction\">The direction of the ray.</param>\n      <param name=\"hitInfo\">If true is returned, hitInfo will contain more information about where the collider was hit. (See Also: RaycastHit).</param>\n      <param name=\"maxDistance\">The max distance the ray should check for collisions.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a ray.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>True when the ray intersects any collider, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.Raycast(UnityEngine.Ray,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Same as above using ray.origin and ray.direction instead of origin and direction.</para>\n      </summary>\n      <param name=\"ray\">The starting point and direction of the ray.</param>\n      <param name=\"maxDistance\">The max distance the ray should check for collisions.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a ray.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>True when the ray intersects any collider, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.Raycast(UnityEngine.Ray,UnityEngine.RaycastHit&amp;,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Same as above using ray.origin and ray.direction instead of origin and direction.</para>\n      </summary>\n      <param name=\"ray\">The starting point and direction of the ray.</param>\n      <param name=\"hitInfo\">If true is returned, hitInfo will contain more information about where the collider was hit. (See Also: RaycastHit).</param>\n      <param name=\"maxDistance\">The max distance the ray should check for collisions.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a ray.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>True when the ray intersects any collider, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.RaycastAll(UnityEngine.Ray,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Casts a ray through the scene and returns all hits. Note that order is not guaranteed.</para>\n      </summary>\n      <param name=\"ray\">The starting point and direction of the ray.</param>\n      <param name=\"maxDistance\">The max distance the rayhit is allowed to be from the start of the ray.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a ray.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n    </member>\n    <member name=\"M:UnityEngine.Physics.RaycastAll(UnityEngine.Vector3,UnityEngine.Vector3,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>See Also: Raycast.</para>\n      </summary>\n      <param name=\"origin\">The starting point of the ray in world coordinates.</param>\n      <param name=\"direction\">The direction of the ray.</param>\n      <param name=\"maxDistance\">The max distance the rayhit is allowed to be from the start of the ray.</param>\n      <param name=\"layermask\">A that is used to selectively ignore colliders when casting a ray.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <param name=\"layerMask\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Physics.RaycastNonAlloc(UnityEngine.Ray,UnityEngine.RaycastHit[],System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Cast a ray through the scene and store the hits into the buffer.</para>\n      </summary>\n      <param name=\"ray\">The starting point and direction of the ray.</param>\n      <param name=\"results\">The buffer to store the hits into.</param>\n      <param name=\"maxDistance\">The max distance the rayhit is allowed to be from the start of the ray.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a ray.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>The amount of hits stored into the results buffer.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.RaycastNonAlloc(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.RaycastHit[],System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Cast a ray through the scene and store the hits into the buffer.</para>\n      </summary>\n      <param name=\"origin\">The starting point and direction of the ray.</param>\n      <param name=\"results\">The buffer to store the hits into.</param>\n      <param name=\"direction\">The direction of the ray.</param>\n      <param name=\"maxDistance\">The max distance the rayhit is allowed to be from the start of the ray.</param>\n      <param name=\"layermask\">A that is used to selectively ignore colliders when casting a ray.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <param name=\"layerMask\"></param>\n      <returns>\n        <para>The amount of hits stored into the results buffer.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.RebuildBroadphaseRegions(UnityEngine.Bounds,System.Int32)\">\n      <summary>\n        <para>Rebuild the broadphase interest regions as well as set the world boundaries.</para>\n      </summary>\n      <param name=\"worldBounds\">Boundaries of the physics world.</param>\n      <param name=\"subdivisions\">How many cells to create along x and z axis.</param>\n    </member>\n    <member name=\"M:UnityEngine.Physics.Simulate(System.Single)\">\n      <summary>\n        <para>Simulate physics in the scene.</para>\n      </summary>\n      <param name=\"step\">The time to advance physics by.</param>\n    </member>\n    <member name=\"M:UnityEngine.Physics.SphereCast(UnityEngine.Vector3,System.Single,UnityEngine.Vector3,UnityEngine.RaycastHit&amp;,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Casts a sphere along a ray and returns detailed information on what was hit.</para>\n      </summary>\n      <param name=\"origin\">The center of the sphere at the start of the sweep.</param>\n      <param name=\"radius\">The radius of the sphere.</param>\n      <param name=\"direction\">The direction into which to sweep the sphere.</param>\n      <param name=\"hitInfo\">If true is returned, hitInfo will contain more information about where the collider was hit. (See Also: RaycastHit).</param>\n      <param name=\"maxDistance\">The max length of the cast.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a capsule.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>True when the sphere sweep intersects any collider, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.SphereCast(UnityEngine.Ray,System.Single,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Casts a sphere along a ray and returns detailed information on what was hit.</para>\n      </summary>\n      <param name=\"ray\">The starting point and direction of the ray into which the sphere sweep is cast.</param>\n      <param name=\"radius\">The radius of the sphere.</param>\n      <param name=\"maxDistance\">The max length of the cast.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a capsule.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>True when the sphere sweep intersects any collider, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.SphereCast(UnityEngine.Ray,System.Single,UnityEngine.RaycastHit&amp;,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"ray\">The starting point and direction of the ray into which the sphere sweep is cast.</param>\n      <param name=\"radius\">The radius of the sphere.</param>\n      <param name=\"hitInfo\">If true is returned, hitInfo will contain more information about where the collider was hit. (See Also: RaycastHit).</param>\n      <param name=\"maxDistance\">The max length of the cast.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a capsule.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n    </member>\n    <member name=\"M:UnityEngine.Physics.SphereCastAll(UnityEngine.Vector3,System.Single,UnityEngine.Vector3,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Like Physics.SphereCast, but this function will return all hits the sphere sweep intersects.</para>\n      </summary>\n      <param name=\"origin\">The center of the sphere at the start of the sweep.</param>\n      <param name=\"radius\">The radius of the sphere.</param>\n      <param name=\"direction\">The direction in which to sweep the sphere.</param>\n      <param name=\"maxDistance\">The max length of the sweep.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a sphere.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>An array of all colliders hit in the sweep.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.SphereCastAll(UnityEngine.Ray,System.Single,System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Like Physics.SphereCast, but this function will return all hits the sphere sweep intersects.</para>\n      </summary>\n      <param name=\"ray\">The starting point and direction of the ray into which the sphere sweep is cast.</param>\n      <param name=\"radius\">The radius of the sphere.</param>\n      <param name=\"maxDistance\">The max length of the sweep.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a sphere.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n    </member>\n    <member name=\"M:UnityEngine.Physics.SphereCastNonAlloc(UnityEngine.Vector3,System.Single,UnityEngine.Vector3,UnityEngine.RaycastHit[],System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Cast sphere along the direction and store the results into buffer.</para>\n      </summary>\n      <param name=\"origin\">The center of the sphere at the start of the sweep.</param>\n      <param name=\"radius\">The radius of the sphere.</param>\n      <param name=\"direction\">The direction in which to sweep the sphere.</param>\n      <param name=\"results\">The buffer to save the hits into.</param>\n      <param name=\"maxDistance\">The max length of the sweep.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a sphere.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>The amount of hits stored into the results buffer.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.SphereCastNonAlloc(UnityEngine.Ray,System.Single,UnityEngine.RaycastHit[],System.Single,System.Int32,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Cast sphere along the direction and store the results into buffer.</para>\n      </summary>\n      <param name=\"ray\">The starting point and direction of the ray into which the sphere sweep is cast.</param>\n      <param name=\"radius\">The radius of the sphere.</param>\n      <param name=\"results\">The buffer to save the results to.</param>\n      <param name=\"maxDistance\">The max length of the sweep.</param>\n      <param name=\"layerMask\">A that is used to selectively ignore colliders when casting a sphere.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>The amount of hits stored into the results buffer.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics.SyncTransforms\">\n      <summary>\n        <para>Apply Transform changes to the physics engine.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Physics2D\">\n      <summary>\n        <para>Global settings and helpers for 2D physics.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.alwaysShowColliders\">\n      <summary>\n        <para>Should the collider gizmos always be shown even when they are not selected?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.angularSleepTolerance\">\n      <summary>\n        <para>A rigid-body cannot sleep if its angular velocity is above this tolerance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.autoSimulation\">\n      <summary>\n        <para>Sets whether the physics should be simulated automatically or not.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.autoSyncTransforms\">\n      <summary>\n        <para>Whether or not to automatically sync transform changes with the physics system whenever a Transform component changes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.baumgarteScale\">\n      <summary>\n        <para>The scale factor that controls how fast overlaps are resolved.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.baumgarteTOIScale\">\n      <summary>\n        <para>The scale factor that controls how fast TOI overlaps are resolved.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.callbacksOnDisable\">\n      <summary>\n        <para>Use this to control whether or not the appropriate OnCollisionExit2D or OnTriggerExit2D callbacks should be called when a Collider2D is disabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.changeStopsCallbacks\">\n      <summary>\n        <para>Whether or not to stop reporting collision callbacks immediately if any of the objects involved in the collision are deleted/moved. </para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.colliderAABBColor\">\n      <summary>\n        <para>Sets the color used by the gizmos to show all Collider axis-aligned bounding boxes (AABBs).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.colliderAsleepColor\">\n      <summary>\n        <para>The color used by the gizmos to show all asleep colliders (collider is asleep when the body is asleep).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.colliderAwakeColor\">\n      <summary>\n        <para>The color used by the gizmos to show all awake colliders (collider is awake when the body is awake).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.colliderContactColor\">\n      <summary>\n        <para>The color used by the gizmos to show all collider contacts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.contactArrowScale\">\n      <summary>\n        <para>The scale of the contact arrow used by the collider gizmos.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.defaultContactOffset\">\n      <summary>\n        <para>The default contact offset of the newly created colliders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.deleteStopsCallbacks\">\n      <summary>\n        <para>Ets the collision callbacks to stop or continue processing if any of the objects involved in the collision are deleted.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.gravity\">\n      <summary>\n        <para>Acceleration due to gravity.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.jobOptions\">\n      <summary>\n        <para>A set of options that control how physics operates when using the job system to multithread the physics simulation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.linearSleepTolerance\">\n      <summary>\n        <para>A rigid-body cannot sleep if its linear velocity is above this tolerance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.maxAngularCorrection\">\n      <summary>\n        <para>The maximum angular position correction used when solving constraints.  This helps to prevent overshoot.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.maxLinearCorrection\">\n      <summary>\n        <para>The maximum linear position correction used when solving constraints.  This helps to prevent overshoot.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.maxRotationSpeed\">\n      <summary>\n        <para>The maximum angular speed of a rigid-body per physics update.  Increasing this can cause numerical problems.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.maxTranslationSpeed\">\n      <summary>\n        <para>The maximum linear speed of a rigid-body per physics update.  Increasing this can cause numerical problems.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.minPenetrationForPenalty\">\n      <summary>\n        <para>This property is obsolete.  You should use defaultContactOffset instead.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.positionIterations\">\n      <summary>\n        <para>The number of iterations of the physics solver when considering objects' positions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.queriesHitTriggers\">\n      <summary>\n        <para>Do raycasts detect Colliders configured as triggers?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.queriesStartInColliders\">\n      <summary>\n        <para>Sets the raycasts or linecasts that start inside Colliders to detect or not detect those Colliders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.raycastsHitTriggers\">\n      <summary>\n        <para>Sets the raycasts to either detect or not detect Triggers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.raycastsStartInColliders\">\n      <summary>\n        <para>Do ray/line casts that start inside a collider(s) detect those collider(s)?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.showColliderAABB\">\n      <summary>\n        <para>Should the collider gizmos show the AABBs for each collider?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.showColliderContacts\">\n      <summary>\n        <para>Should the collider gizmos show current contacts for each collider?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.showColliderSleep\">\n      <summary>\n        <para>Should the collider gizmos show the sleep-state for each collider?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.timeToSleep\">\n      <summary>\n        <para>The time in seconds that a rigid-body must be still before it will go to sleep.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.velocityIterations\">\n      <summary>\n        <para>The number of iterations of the physics solver when considering objects' velocities.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Physics2D.velocityThreshold\">\n      <summary>\n        <para>Any collisions with a relative linear velocity below this threshold will be treated as inelastic.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Physics2D.AllLayers\">\n      <summary>\n        <para>Layer mask constant that includes all layers.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.BoxCast(UnityEngine.Vector2,UnityEngine.Vector2,System.Single,UnityEngine.Vector2,System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Casts a box against colliders in the scene, returning the first collider to contact with it.</para>\n      </summary>\n      <param name=\"origin\">The point in 2D space where the box originates.</param>\n      <param name=\"size\">The size of the box.</param>\n      <param name=\"angle\">The angle of the box (in degrees).</param>\n      <param name=\"direction\">Vector representing the direction of the box.</param>\n      <param name=\"distance\">Maximum distance over which to cast the box.</param>\n      <param name=\"layerMask\">Filter to detect Colliders only on certain layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <returns>\n        <para>The cast results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.BoxCast(UnityEngine.Vector2,UnityEngine.Vector2,System.Single,UnityEngine.Vector2,UnityEngine.ContactFilter2D,UnityEngine.RaycastHit2D[],System.Single)\">\n      <summary>\n        <para>Casts a box against the colliders in the Scene and returns all colliders that are in contact with it.</para>\n      </summary>\n      <param name=\"origin\">The point in 2D space where the box originates.</param>\n      <param name=\"size\">The size of the box.</param>\n      <param name=\"angle\">The angle of the box (in degrees).</param>\n      <param name=\"direction\">Vector representing the direction of the box.</param>\n      <param name=\"distance\">Maximum distance over which to cast the box.</param>\n      <param name=\"results\">The array to receive results.  The size of the array determines the maximum number of results that can be returned.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.BoxCastAll(UnityEngine.Vector2,UnityEngine.Vector2,System.Single,UnityEngine.Vector2,System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Casts a box against colliders in the scene, returning all colliders that contact with it.</para>\n      </summary>\n      <param name=\"origin\">The point in 2D space where the box originates.</param>\n      <param name=\"size\">The size of the box.</param>\n      <param name=\"angle\">The angle of the box (in degrees).</param>\n      <param name=\"direction\">Vector representing the direction of the box.</param>\n      <param name=\"distance\">Maximum distance over which to cast the box.</param>\n      <param name=\"layerMask\">Filter to detect Colliders only on certain layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <returns>\n        <para>The cast results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.BoxCastNonAlloc(UnityEngine.Vector2,UnityEngine.Vector2,System.Single,UnityEngine.Vector2,UnityEngine.RaycastHit2D[],System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Casts a box into the scene, returning colliders that contact with it into the provided results array.</para>\n      </summary>\n      <param name=\"origin\">The point in 2D space where the box originates.</param>\n      <param name=\"size\">The size of the box.</param>\n      <param name=\"angle\">The angle of the box (in degrees).</param>\n      <param name=\"direction\">Vector representing the direction of the box.</param>\n      <param name=\"results\">Array to receive results.</param>\n      <param name=\"distance\">Maximum distance over which to cast the box.</param>\n      <param name=\"layerMask\">Filter to detect Colliders only on certain layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.CapsuleCast(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.CapsuleDirection2D,System.Single,UnityEngine.Vector2,System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Casts a capsule against colliders in the scene, returning the first collider to contact with it.</para>\n      </summary>\n      <param name=\"origin\">The point in 2D space where the capsule originates.</param>\n      <param name=\"size\">The size of the capsule.</param>\n      <param name=\"capsuleDirection\">The direction of the capsule.</param>\n      <param name=\"angle\">The angle of the capsule (in degrees).</param>\n      <param name=\"direction\">Vector representing the direction to cast the capsule.</param>\n      <param name=\"distance\">Maximum distance over which to cast the capsule.</param>\n      <param name=\"layerMask\">Filter to detect Colliders only on certain layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than this value.</param>\n      <returns>\n        <para>The cast results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.CapsuleCast(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.CapsuleDirection2D,System.Single,UnityEngine.Vector2,UnityEngine.ContactFilter2D,UnityEngine.RaycastHit2D[],System.Single)\">\n      <summary>\n        <para>Casts a capsule against the colliders in the Scene and returns all colliders that are in contact with it.</para>\n      </summary>\n      <param name=\"origin\">The point in 2D space where the capsule originates.</param>\n      <param name=\"size\">The size of the capsule.</param>\n      <param name=\"capsuleDirection\">The direction of the capsule.</param>\n      <param name=\"angle\">The angle of the capsule (in degrees).</param>\n      <param name=\"direction\">Vector representing the direction to cast the capsule.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <param name=\"results\">The array to receive results.  The size of the array determines the maximum number of results that can be returned.</param>\n      <param name=\"distance\">Maximum distance over which to cast the capsule.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.CapsuleCastAll(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.CapsuleDirection2D,System.Single,UnityEngine.Vector2,System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Casts a capsule against colliders in the scene, returning all colliders that contact with it.</para>\n      </summary>\n      <param name=\"origin\">The point in 2D space where the capsule originates.</param>\n      <param name=\"size\">The size of the capsule.</param>\n      <param name=\"capsuleDirection\">The direction of the capsule.</param>\n      <param name=\"angle\">The angle of the capsule (in degrees).</param>\n      <param name=\"direction\">Vector representing the direction to cast the capsule.</param>\n      <param name=\"distance\">Maximum distance over which to cast the capsule.</param>\n      <param name=\"layerMask\">Filter to detect Colliders only on certain layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than this value.</param>\n      <returns>\n        <para>The cast results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.CapsuleCastNonAlloc(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.CapsuleDirection2D,System.Single,UnityEngine.Vector2,UnityEngine.RaycastHit2D[],System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Casts a capsule into the scene, returning colliders that contact with it into the provided results array.</para>\n      </summary>\n      <param name=\"origin\">The point in 2D space where the capsule originates.</param>\n      <param name=\"size\">The size of the capsule.</param>\n      <param name=\"capsuleDirection\">The direction of the capsule.</param>\n      <param name=\"angle\">The angle of the capsule (in degrees).</param>\n      <param name=\"direction\">Vector representing the direction to cast the capsule.</param>\n      <param name=\"results\">Array to receive results.</param>\n      <param name=\"distance\">Maximum distance over which to cast the capsule.</param>\n      <param name=\"layerMask\">Filter to detect Colliders only on certain layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than this value.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.CircleCast(UnityEngine.Vector2,System.Single,UnityEngine.Vector2,System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Casts a circle against colliders in the scene, returning the first collider to contact with it.</para>\n      </summary>\n      <param name=\"origin\">The point in 2D space where the circle originates.</param>\n      <param name=\"radius\">The radius of the circle.</param>\n      <param name=\"direction\">Vector representing the direction of the circle.</param>\n      <param name=\"distance\">Maximum distance over which to cast the circle.</param>\n      <param name=\"layerMask\">Filter to detect Colliders only on certain layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <returns>\n        <para>The cast results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.CircleCast(UnityEngine.Vector2,System.Single,UnityEngine.Vector2,UnityEngine.ContactFilter2D,UnityEngine.RaycastHit2D[],System.Single)\">\n      <summary>\n        <para>Casts a circle against colliders in the Scene, returning all colliders that contact with it.</para>\n      </summary>\n      <param name=\"origin\">The point in 2D space where the circle originates.</param>\n      <param name=\"radius\">The radius of the circle.</param>\n      <param name=\"direction\">Vector representing the direction of the circle.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <param name=\"results\">The array to receive results.  The size of the array determines the maximum number of results that can be returned.</param>\n      <param name=\"distance\">Maximum distance over which to cast the circle.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.CircleCastAll(UnityEngine.Vector2,System.Single,UnityEngine.Vector2,System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Casts a circle against colliders in the scene, returning all colliders that contact with it.</para>\n      </summary>\n      <param name=\"origin\">The point in 2D space where the circle originates.</param>\n      <param name=\"radius\">The radius of the circle.</param>\n      <param name=\"direction\">Vector representing the direction of the circle.</param>\n      <param name=\"distance\">Maximum distance over which to cast the circle.</param>\n      <param name=\"layerMask\">Filter to detect Colliders only on certain layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <returns>\n        <para>The cast results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.CircleCastNonAlloc(UnityEngine.Vector2,System.Single,UnityEngine.Vector2,UnityEngine.RaycastHit2D[],System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Casts a circle into the scene, returning colliders that contact with it into the provided results array.</para>\n      </summary>\n      <param name=\"origin\">The point in 2D space where the circle originates.</param>\n      <param name=\"radius\">The radius of the circle.</param>\n      <param name=\"direction\">Vector representing the direction of the circle.</param>\n      <param name=\"results\">Array to receive results.</param>\n      <param name=\"distance\">Maximum distance over which to cast the circle.</param>\n      <param name=\"layerMask\">Filter to detect Colliders only on certain layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"F:UnityEngine.Physics2D.DefaultRaycastLayers\">\n      <summary>\n        <para>Layer mask constant that includes all layers participating in raycasts by default.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.Distance(UnityEngine.Collider2D,UnityEngine.Collider2D)\">\n      <summary>\n        <para>Calculates the minimum distance between two colliders.</para>\n      </summary>\n      <param name=\"colliderA\">A collider used to calculate the minimum distance against colliderB.</param>\n      <param name=\"colliderB\">A collider used to calculate the minimum distance against colliderA.</param>\n      <returns>\n        <para>The minimum distance between colliderA and colliderB.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.GetContacts(UnityEngine.Collider2D,UnityEngine.Collider2D[])\">\n      <summary>\n        <para>Retrieves all colliders in contact with the collider.</para>\n      </summary>\n      <param name=\"collider\">The collider to retrieve contacts for.</param>\n      <param name=\"colliders\">An array of Collider2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of colliders placed in the colliders array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.GetContacts(UnityEngine.Collider2D,UnityEngine.ContactPoint2D[])\">\n      <summary>\n        <para>Retrieves all contact points in contact with the collider.</para>\n      </summary>\n      <param name=\"collider\">The collider to retrieve contacts for.</param>\n      <param name=\"contacts\">An array of ContactPoint2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of contacts placed in the contacts array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.GetContacts(UnityEngine.Collider2D,UnityEngine.ContactFilter2D,UnityEngine.ContactPoint2D[])\">\n      <summary>\n        <para>Retrieves all contact points in contact with the collider, with the results filtered by the ContactFilter2D.</para>\n      </summary>\n      <param name=\"collider\">The collider to retrieve contacts for.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <param name=\"contacts\">An array of ContactPoint2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of contacts placed in the contacts array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.GetContacts(UnityEngine.Collider2D,UnityEngine.ContactFilter2D,UnityEngine.Collider2D[])\">\n      <summary>\n        <para>Retrieves all colliders in contact with the collider, with the results filtered by the ContactFilter2D.</para>\n      </summary>\n      <param name=\"collider\">The collider to retrieve contacts for.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <param name=\"colliders\">An array of Collider2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of colliders placed in the colliders array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.GetContacts(UnityEngine.Collider2D,UnityEngine.Collider2D,UnityEngine.ContactFilter2D,UnityEngine.ContactPoint2D[])\">\n      <summary>\n        <para>Retrieves all contact points in for contacts between with the collider1 and collider2, with the results filtered by the ContactFilter2D.</para>\n      </summary>\n      <param name=\"collider1\">The collider to check if it has contacts against collider2.</param>\n      <param name=\"collider2\">The collider to check if it has contacts against collider1.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <param name=\"contacts\">An array of ContactPoint2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of contacts placed in the contacts array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.GetContacts(UnityEngine.Rigidbody2D,UnityEngine.ContactPoint2D[])\">\n      <summary>\n        <para>Retrieves all contact points in contact with any of the collider(s) attached to this rigidbody.</para>\n      </summary>\n      <param name=\"rigidbody\">The rigidbody to retrieve contacts for.  All colliders attached to this rigidbody will be checked.</param>\n      <param name=\"contacts\">An array of ContactPoint2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of contacts placed in the contacts array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.GetContacts(UnityEngine.Rigidbody2D,UnityEngine.Collider2D[])\">\n      <summary>\n        <para>Retrieves all colliders in contact with any of the collider(s) attached to this rigidbody.</para>\n      </summary>\n      <param name=\"rigidbody\">The rigidbody to retrieve contacts for.  All colliders attached to this rigidbody will be checked.</param>\n      <param name=\"colliders\">An array of Collider2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of colliders placed in the colliders array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.GetContacts(UnityEngine.Rigidbody2D,UnityEngine.ContactFilter2D,UnityEngine.ContactPoint2D[])\">\n      <summary>\n        <para>Retrieves all contact points in contact with any of the collider(s) attached to this rigidbody, with the results filtered by the ContactFilter2D.</para>\n      </summary>\n      <param name=\"rigidbody\">The rigidbody to retrieve contacts for.  All colliders attached to this rigidbody will be checked.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <param name=\"contacts\">An array of ContactPoint2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of contacts placed in the contacts array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.GetContacts(UnityEngine.Rigidbody2D,UnityEngine.ContactFilter2D,UnityEngine.Collider2D[])\">\n      <summary>\n        <para>Retrieves all colliders in contact with any of the collider(s) attached to this rigidbody, with the results filtered by the ContactFilter2D.</para>\n      </summary>\n      <param name=\"rigidbody\">The rigidbody to retrieve contacts for.  All colliders attached to this rigidbody will be checked.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <param name=\"colliders\">An array of Collider2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of colliders placed in the colliders array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.GetIgnoreCollision(UnityEngine.Collider2D,UnityEngine.Collider2D)\">\n      <summary>\n        <para>Checks whether the collision detection system will ignore all collisionstriggers between collider1 and collider2/ or not.</para>\n      </summary>\n      <param name=\"collider1\">The first collider to compare to collider2.</param>\n      <param name=\"collider2\">The second collider to compare to collider1.</param>\n      <returns>\n        <para>Whether the collision detection system will ignore all collisionstriggers between collider1 and collider2/ or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.GetIgnoreLayerCollision(System.Int32,System.Int32)\">\n      <summary>\n        <para>Checks whether collisions between the specified layers be ignored or not.</para>\n      </summary>\n      <param name=\"layer1\">ID of first layer.</param>\n      <param name=\"layer2\">ID of second layer.</param>\n      <returns>\n        <para>Whether collisions between the specified layers be ignored or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.GetLayerCollisionMask(System.Int32)\">\n      <summary>\n        <para>Get the collision layer mask that indicates which layer(s) the specified layer can collide with.</para>\n      </summary>\n      <param name=\"layer\">The layer to retrieve the collision layer mask for.</param>\n      <returns>\n        <para>A mask where each bit indicates a layer and whether it can collide with layer or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.GetRayIntersection(UnityEngine.Ray,System.Single,System.Int32)\">\n      <summary>\n        <para>Cast a 3D ray against the colliders in the scene returning the first collider along the ray.</para>\n      </summary>\n      <param name=\"ray\">The 3D ray defining origin and direction to test.</param>\n      <param name=\"distance\">Maximum distance over which to cast the ray.</param>\n      <param name=\"layerMask\">Filter to detect colliders only on certain layers.</param>\n      <returns>\n        <para>The cast results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.GetRayIntersectionAll(UnityEngine.Ray,System.Single,System.Int32)\">\n      <summary>\n        <para>Cast a 3D ray against the colliders in the scene returning all the colliders along the ray.</para>\n      </summary>\n      <param name=\"ray\">The 3D ray defining origin and direction to test.</param>\n      <param name=\"distance\">Maximum distance over which to cast the ray.</param>\n      <param name=\"layerMask\">Filter to detect colliders only on certain layers.</param>\n      <returns>\n        <para>The cast results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.GetRayIntersectionNonAlloc(UnityEngine.Ray,UnityEngine.RaycastHit2D[],System.Single,System.Int32)\">\n      <summary>\n        <para>Cast a 3D ray against the colliders in the scene returning the colliders along the ray.</para>\n      </summary>\n      <param name=\"ray\">The 3D ray defining origin and direction to test.</param>\n      <param name=\"distance\">Maximum distance over which to cast the ray.</param>\n      <param name=\"layerMask\">Filter to detect colliders only on certain layers.</param>\n      <param name=\"results\">Array to receive results.</param>\n      <returns>\n        <para>The number of results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.IgnoreCollision(UnityEngine.Collider2D,UnityEngine.Collider2D,System.Boolean)\">\n      <summary>\n        <para>Makes the collision detection system ignore all collisionstriggers between collider1 and collider2/.</para>\n      </summary>\n      <param name=\"collider1\">The first collider to compare to collider2.</param>\n      <param name=\"collider2\">The second collider to compare to collider1.</param>\n      <param name=\"ignore\">Whether collisionstriggers between collider1 and collider2/ should be ignored or not.</param>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.IgnoreLayerCollision(System.Int32,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Choose whether to detect or ignore collisions between a specified pair of layers.</para>\n      </summary>\n      <param name=\"layer1\">ID of the first layer.</param>\n      <param name=\"layer2\">ID of the second layer.</param>\n      <param name=\"ignore\">Should collisions between these layers be ignored?</param>\n    </member>\n    <member name=\"F:UnityEngine.Physics2D.IgnoreRaycastLayer\">\n      <summary>\n        <para>Layer mask constant for the default layer that ignores raycasts.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.IsTouching(UnityEngine.Collider2D,UnityEngine.Collider2D)\">\n      <summary>\n        <para>Checks whether the passed colliders are in contact or not.</para>\n      </summary>\n      <param name=\"collider1\">The collider to check if it is touching collider2.</param>\n      <param name=\"collider2\">The collider to check if it is touching collider1.</param>\n      <returns>\n        <para>Whether collider1 is touching collider2 or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.IsTouching(UnityEngine.Collider2D,UnityEngine.ContactFilter2D)\">\n      <summary>\n        <para>Checks whether the passed colliders are in contact or not.</para>\n      </summary>\n      <param name=\"collider\">The collider to check if it is touching any other collider filtered by the contactFilter.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <returns>\n        <para>Whether the collider is touching any other collider filtered by the contactFilter or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.IsTouching(UnityEngine.Collider2D,UnityEngine.Collider2D,UnityEngine.ContactFilter2D)\">\n      <summary>\n        <para>Checks whether the passed colliders are in contact or not.</para>\n      </summary>\n      <param name=\"collider1\">The collider to check if it is touching collider2.</param>\n      <param name=\"collider2\">The collider to check if it is touching collider1.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <returns>\n        <para>Whether collider1 is touching collider2 or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.IsTouchingLayers(UnityEngine.Collider2D,System.Int32)\">\n      <summary>\n        <para>Checks whether the collider is touching any colliders on the specified layerMask or not.</para>\n      </summary>\n      <param name=\"collider\">The collider to check if it is touching colliders on the layerMask.</param>\n      <param name=\"layerMask\">Any colliders on any of these layers count as touching.</param>\n      <returns>\n        <para>Whether the collider is touching any colliders on the specified layerMask or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.Linecast(UnityEngine.Vector2,UnityEngine.Vector2,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Casts a line segment against colliders in the Scene.</para>\n      </summary>\n      <param name=\"start\">The start point of the line in world space.</param>\n      <param name=\"end\">The end point of the line in world space.</param>\n      <param name=\"layerMask\">Filter to detect Colliders only on certain layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <returns>\n        <para>The cast results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.Linecast(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.ContactFilter2D,UnityEngine.RaycastHit2D[])\">\n      <summary>\n        <para>Casts a line segment against colliders in the Scene with results filtered by ContactFilter2D.</para>\n      </summary>\n      <param name=\"start\">The start point of the line in world space.</param>\n      <param name=\"end\">The end point of the line in world space.</param>\n      <param name=\"results\">The array to receive results.  The size of the array determines the maximum number of results that can be returned.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.LinecastAll(UnityEngine.Vector2,UnityEngine.Vector2,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Casts a line against colliders in the scene.</para>\n      </summary>\n      <param name=\"start\">The start point of the line in world space.</param>\n      <param name=\"end\">The end point of the line in world space.</param>\n      <param name=\"layerMask\">Filter to detect Colliders only on certain layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <returns>\n        <para>The cast results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.LinecastNonAlloc(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.RaycastHit2D[],System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Casts a line against colliders in the scene.</para>\n      </summary>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <param name=\"start\">The start point of the line in world space.</param>\n      <param name=\"end\">The end point of the line in world space.</param>\n      <param name=\"results\">Returned array of objects that intersect the line.</param>\n      <param name=\"layerMask\">Filter to detect Colliders only on certain layers.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapArea(UnityEngine.Vector2,UnityEngine.Vector2,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Checks if a collider falls within a rectangular area.</para>\n      </summary>\n      <param name=\"pointA\">One corner of the rectangle.</param>\n      <param name=\"pointB\">Diagonally opposite the point A corner of the rectangle.</param>\n      <param name=\"layerMask\">Filter to check objects only on specific layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <returns>\n        <para>The collider overlapping the area.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapArea(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.ContactFilter2D,UnityEngine.Collider2D[])\">\n      <summary>\n        <para>Checks if a collider falls within a rectangular area.</para>\n      </summary>\n      <param name=\"pointA\">One corner of the rectangle.</param>\n      <param name=\"pointB\">Diagonally opposite the point A corner of the rectangle.</param>\n      <param name=\"results\">The array to receive results.  The size of the array determines the maximum number of results that can be returned.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth.  Note that normal angle is not used for overlap testing.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapAreaAll(UnityEngine.Vector2,UnityEngine.Vector2,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Get a list of all colliders that fall within a rectangular area.</para>\n      </summary>\n      <param name=\"pointA\">One corner of the rectangle.</param>\n      <param name=\"pointB\">Diagonally opposite the point A corner of the rectangle.</param>\n      <param name=\"layerMask\">Filter to check objects only on specific layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <returns>\n        <para>The cast results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapAreaNonAlloc(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.Collider2D[],System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Get a list of all colliders that fall within a specified area.</para>\n      </summary>\n      <param name=\"pointA\">One corner of the rectangle.</param>\n      <param name=\"pointB\">Diagonally opposite the point A corner of the rectangle.</param>\n      <param name=\"results\">Array to receive results.</param>\n      <param name=\"layerMask\">Filter to check objects only on specified layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapBox(UnityEngine.Vector2,UnityEngine.Vector2,System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Checks if a collider falls within a box area.</para>\n      </summary>\n      <param name=\"point\">Center of the box.</param>\n      <param name=\"size\">Size of the box.</param>\n      <param name=\"angle\">Angle of the box.</param>\n      <param name=\"layerMask\">Filter to check objects only on specific layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than this value.</param>\n      <returns>\n        <para>The collider overlapping the box.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapBox(UnityEngine.Vector2,UnityEngine.Vector2,System.Single,UnityEngine.ContactFilter2D,UnityEngine.Collider2D[])\">\n      <summary>\n        <para>Checks if a collider falls within a box area.</para>\n      </summary>\n      <param name=\"point\">Center of the box.</param>\n      <param name=\"size\">Size of the box.</param>\n      <param name=\"angle\">Angle of the box.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth.  Note that normal angle is not used for overlap testing.</param>\n      <param name=\"results\">The array to receive results.  The size of the array determines the maximum number of results that can be returned.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapBoxAll(UnityEngine.Vector2,UnityEngine.Vector2,System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Get a list of all colliders that fall within a box area.</para>\n      </summary>\n      <param name=\"point\">Center of the box.</param>\n      <param name=\"size\">Size of the box.</param>\n      <param name=\"angle\">Angle of the box.</param>\n      <param name=\"layerMask\">Filter to check objects only on specific layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than this value.</param>\n      <returns>\n        <para>The cast results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapBoxNonAlloc(UnityEngine.Vector2,UnityEngine.Vector2,System.Single,UnityEngine.Collider2D[],System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Get a list of all colliders that fall within a box area.</para>\n      </summary>\n      <param name=\"point\">Center of the box.</param>\n      <param name=\"size\">Size of the box.</param>\n      <param name=\"angle\">Angle of the box.</param>\n      <param name=\"results\">Array to receive results.</param>\n      <param name=\"layerMask\">Filter to check objects only on specific layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than this value.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapCapsule(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.CapsuleDirection2D,System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Checks if a collider falls within a capsule area.</para>\n      </summary>\n      <param name=\"point\">Center of the capsule.</param>\n      <param name=\"size\">Size of the capsule.</param>\n      <param name=\"direction\">The direction of the capsule.</param>\n      <param name=\"angle\">Angle of the capsule.</param>\n      <param name=\"layerMask\">Filter to check objects only on specific layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than this value.</param>\n      <returns>\n        <para>The collider overlapping the capsule.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapCapsule(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.CapsuleDirection2D,System.Single,UnityEngine.ContactFilter2D,UnityEngine.Collider2D[])\">\n      <summary>\n        <para>Checks if a collider falls within a capsule area.</para>\n      </summary>\n      <param name=\"point\">Center of the capsule.</param>\n      <param name=\"size\">Size of the capsule.</param>\n      <param name=\"direction\">The direction of the capsule.</param>\n      <param name=\"angle\">Angle of the capsule.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth.  Note that normal angle is not used for overlap testing.</param>\n      <param name=\"results\">The array to receive results.  The size of the array determines the maximum number of results that can be returned.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapCapsuleAll(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.CapsuleDirection2D,System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Get a list of all colliders that fall within a capsule area.</para>\n      </summary>\n      <param name=\"point\">Center of the capsule.</param>\n      <param name=\"size\">Size of the capsule.</param>\n      <param name=\"direction\">The direction of the capsule.</param>\n      <param name=\"angle\">Angle of the capsule.</param>\n      <param name=\"layerMask\">Filter to check objects only on specific layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than this value.</param>\n      <returns>\n        <para>The cast results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapCapsuleNonAlloc(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.CapsuleDirection2D,System.Single,UnityEngine.Collider2D[],System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Get a list of all colliders that fall within a capsule area.</para>\n      </summary>\n      <param name=\"point\">Center of the capsule.</param>\n      <param name=\"size\">Size of the capsule.</param>\n      <param name=\"direction\">The direction of the capsule.</param>\n      <param name=\"angle\">Angle of the capsule.</param>\n      <param name=\"results\">Array to receive results.</param>\n      <param name=\"layerMask\">Filter to check objects only on specific layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than this value.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapCircle(UnityEngine.Vector2,System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Checks if a collider falls within a circular area.</para>\n      </summary>\n      <param name=\"point\">Centre of the circle.</param>\n      <param name=\"radius\">Radius of the circle.</param>\n      <param name=\"layerMask\">Filter to check objects only on specific layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <returns>\n        <para>The collider overlapping the circle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapCircle(UnityEngine.Vector2,System.Single,UnityEngine.ContactFilter2D,UnityEngine.Collider2D[])\">\n      <summary>\n        <para>Checks if a collider is within a circular area.</para>\n      </summary>\n      <param name=\"point\">Centre of the circle.</param>\n      <param name=\"radius\">Radius of the circle.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth.  Note that normal angle is not used for overlap testing.</param>\n      <param name=\"results\">The array to receive results.  The size of the array determines the maximum number of results that can be returned.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapCircleAll(UnityEngine.Vector2,System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Get a list of all colliders that fall within a circular area.</para>\n      </summary>\n      <param name=\"point\">Center of the circle.</param>\n      <param name=\"radius\">Radius of the circle.</param>\n      <param name=\"layerMask\">Filter to check objects only on specified layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <returns>\n        <para>The cast results.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapCircleNonAlloc(UnityEngine.Vector2,System.Single,UnityEngine.Collider2D[],System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Get a list of all colliders that fall within a circular area.</para>\n      </summary>\n      <param name=\"point\">Center of the circle.</param>\n      <param name=\"radius\">Radius of the circle.</param>\n      <param name=\"results\">Array to receive results.</param>\n      <param name=\"layerMask\">Filter to check objects only on specific layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapCollider(UnityEngine.Collider2D,UnityEngine.ContactFilter2D,UnityEngine.Collider2D[])\">\n      <summary>\n        <para>Get a list of all colliders that overlap collider.</para>\n      </summary>\n      <param name=\"collider\">The collider that defines the area used to query for other collider overlaps.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth.  Note that normal angle is not used for overlap testing.</param>\n      <param name=\"results\">The array to receive results.  The size of the array determines the maximum number of results that can be returned.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapPoint(UnityEngine.Vector2,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Checks if a collider overlaps a point in space.</para>\n      </summary>\n      <param name=\"point\">A point in world space.</param>\n      <param name=\"layerMask\">Filter to check objects only on specific layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <returns>\n        <para>The collider overlapping the point.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapPoint(UnityEngine.Vector2,UnityEngine.ContactFilter2D,UnityEngine.Collider2D[])\">\n      <summary>\n        <para>Checks if a collider overlaps a point in world space.</para>\n      </summary>\n      <param name=\"point\">A point in world space.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth.  Note that normal angle is not used for overlap testing.</param>\n      <param name=\"results\">The array to receive results.  The size of the array determines the maximum number of results that can be returned.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapPointAll(UnityEngine.Vector2,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Get a list of all colliders that overlap a point in space.</para>\n      </summary>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <param name=\"point\">A point in space.</param>\n      <param name=\"layerMask\">Filter to check objects only on specific layers.</param>\n      <returns>\n        <para>The cast results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.OverlapPointNonAlloc(UnityEngine.Vector2,UnityEngine.Collider2D[],System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Get a list of all colliders that overlap a point in space.</para>\n      </summary>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <param name=\"point\">A point in space.</param>\n      <param name=\"results\">Array to receive results.</param>\n      <param name=\"layerMask\">Filter to check objects only on specific layers.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.Raycast(UnityEngine.Vector2,UnityEngine.Vector2,System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Casts a ray against colliders in the scene.</para>\n      </summary>\n      <param name=\"origin\">The point in 2D space where the ray originates.</param>\n      <param name=\"direction\">The vector representing the direction of the ray.</param>\n      <param name=\"distance\">Maximum distance over which to cast the ray.</param>\n      <param name=\"layerMask\">Filter to detect Colliders only on certain layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <returns>\n        <para>The cast results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.Raycast(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.ContactFilter2D,UnityEngine.RaycastHit2D[],System.Single)\">\n      <summary>\n        <para>Casts a ray against colliders in the Scene.</para>\n      </summary>\n      <param name=\"origin\">The point in 2D space where the ray originates.</param>\n      <param name=\"direction\">The vector representing the direction of the ray.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <param name=\"results\">The array to receive results.  The size of the array determines the maximum number of results that can be returned.</param>\n      <param name=\"distance\">Maximum distance over which to cast the ray.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.RaycastAll(UnityEngine.Vector2,UnityEngine.Vector2,System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Casts a ray against colliders in the scene, returning all colliders that contact with it.</para>\n      </summary>\n      <param name=\"origin\">The point in 2D space where the ray originates.</param>\n      <param name=\"direction\">The vector representing the direction of the ray.</param>\n      <param name=\"distance\">Maximum distance over which to cast the ray.</param>\n      <param name=\"layerMask\">Filter to detect Colliders only on certain layers.</param>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <returns>\n        <para>The cast results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.RaycastNonAlloc(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.RaycastHit2D[],System.Single,System.Int32,System.Single,System.Single)\">\n      <summary>\n        <para>Casts a ray into the scene.</para>\n      </summary>\n      <param name=\"minDepth\">Only include objects with a Z coordinate (depth) greater than or equal to this value.</param>\n      <param name=\"maxDepth\">Only include objects with a Z coordinate (depth) less than or equal to this value.</param>\n      <param name=\"origin\">The point in 2D space where the ray originates.</param>\n      <param name=\"direction\">The vector representing the direction of the ray.</param>\n      <param name=\"results\">Array to receive results.</param>\n      <param name=\"distance\">Maximum distance over which to cast the ray.</param>\n      <param name=\"layerMask\">Filter to check objects only on specific layers.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.SetLayerCollisionMask(System.Int32,System.Int32)\">\n      <summary>\n        <para>Set the collision layer mask that indicates which layer(s) the specified layer can collide with.</para>\n      </summary>\n      <param name=\"layer\">The layer to set the collision layer mask for.</param>\n      <param name=\"layerMask\">A mask where each bit indicates a layer and whether it can collide with layer or not.</param>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.Simulate(System.Single)\">\n      <summary>\n        <para>Simulate physics in the scene.</para>\n      </summary>\n      <param name=\"step\">The time to advance physics by.</param>\n      <returns>\n        <para>Whether the simulation was run or not.  Running the simulation during physics callbacks will always fail.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Physics2D.SyncTransforms\">\n      <summary>\n        <para>Synchronizes.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.PhysicsJobOptions2D\">\n      <summary>\n        <para>A set of options that control how physics operates when using the job system to multithread the physics simulation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsJobOptions2D.clearBodyForcesPerJob\">\n      <summary>\n        <para>Controls the minimum number of bodies to be cleared in each simulation job.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsJobOptions2D.clearFlagsPerJob\">\n      <summary>\n        <para>Controls the minimum number of flags to be cleared in each simulation job.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsJobOptions2D.collideContactsPerJob\">\n      <summary>\n        <para>Controls the minimum number of contacts to collide in each simulation job.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsJobOptions2D.findNearestContactsPerJob\">\n      <summary>\n        <para>Controls the minimum number of nearest contacts to find in each simulation job.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsJobOptions2D.interpolationPosesPerJob\">\n      <summary>\n        <para>Controls the minimum number of Rigidbody2D being interpolated in each simulation job.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsJobOptions2D.islandSolverBodiesPerJob\">\n      <summary>\n        <para>Controls the minimum number of bodies to solve in each simulation job when performing island solving.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsJobOptions2D.islandSolverBodyCostScale\">\n      <summary>\n        <para>Scales the cost of each body during discrete island solving.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsJobOptions2D.islandSolverContactCostScale\">\n      <summary>\n        <para>Scales the cost of each contact during discrete island solving.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsJobOptions2D.islandSolverContactsPerJob\">\n      <summary>\n        <para>Controls the minimum number of contacts to solve in each simulation job when performing island solving.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsJobOptions2D.islandSolverCostThreshold\">\n      <summary>\n        <para>The minimum threshold cost of all bodies, contacts and joints in an island during discrete island solving.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsJobOptions2D.islandSolverJointCostScale\">\n      <summary>\n        <para>Scales the cost of each joint during discrete island solving.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsJobOptions2D.newContactsPerJob\">\n      <summary>\n        <para>Controls the minimum number of new contacts to find in each simulation job.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsJobOptions2D.syncContinuousFixturesPerJob\">\n      <summary>\n        <para>Controls the minimum number of fixtures to synchronize in the broadphase during continuous island solving in each simulation job.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsJobOptions2D.syncDiscreteFixturesPerJob\">\n      <summary>\n        <para>Controls the minimum number of fixtures to synchronize in the broadphase during discrete island solving in each simulation job.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsJobOptions2D.updateTriggerContactsPerJob\">\n      <summary>\n        <para>Controls the minimum number of trigger contacts to update in each simulation job.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsJobOptions2D.useConsistencySorting\">\n      <summary>\n        <para>Should physics simulation sort multi-threaded results to maintain processing order consistency?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsJobOptions2D.useMultithreading\">\n      <summary>\n        <para>Should physics simulation use multithreading?</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.PhysicsMaterial2D\">\n      <summary>\n        <para>Asset type that defines the surface properties of a Collider2D.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsMaterial2D.bounciness\">\n      <summary>\n        <para>The degree of elasticity during collisions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PhysicsMaterial2D.friction\">\n      <summary>\n        <para>Coefficient of friction.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.PhysicsUpdateBehaviour2D\">\n      <summary>\n        <para>A base type for 2D physics components that required a callback during FixedUpdate.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Ping\">\n      <summary>\n        <para>Ping any given IP address (given in dot notation).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Ping.ip\">\n      <summary>\n        <para>The IP target of the ping.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Ping.isDone\">\n      <summary>\n        <para>Has the ping function completed?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Ping.time\">\n      <summary>\n        <para>This property contains the ping time result after isDone returns true.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Ping.#ctor(System.String)\">\n      <summary>\n        <para>Perform a ping to the supplied target IP address.</para>\n      </summary>\n      <param name=\"address\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Plane\">\n      <summary>\n        <para>Representation of a plane in 3D space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Plane.distance\">\n      <summary>\n        <para>Distance from the origin to the plane.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Plane.flipped\">\n      <summary>\n        <para>Returns a copy of the plane that faces in the opposite direction.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Plane.normal\">\n      <summary>\n        <para>Normal vector of the plane.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Plane.ClosestPointOnPlane(UnityEngine.Vector3)\">\n      <summary>\n        <para>For a given point returns the closest point on the plane.</para>\n      </summary>\n      <param name=\"point\">The point to project onto the plane.</param>\n      <returns>\n        <para>A point on the plane that is closest to point.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Plane.#ctor(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Creates a plane.</para>\n      </summary>\n      <param name=\"inNormal\"></param>\n      <param name=\"inPoint\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Plane.#ctor(UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Creates a plane.</para>\n      </summary>\n      <param name=\"inNormal\"></param>\n      <param name=\"d\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Plane.#ctor(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Creates a plane.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"c\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Plane.Flip\">\n      <summary>\n        <para>Makes the plane face in the opposite direction.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Plane.GetDistanceToPoint(UnityEngine.Vector3)\">\n      <summary>\n        <para>Returns a signed distance from plane to point.</para>\n      </summary>\n      <param name=\"point\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Plane.GetSide(UnityEngine.Vector3)\">\n      <summary>\n        <para>Is a point on the positive side of the plane?</para>\n      </summary>\n      <param name=\"point\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Plane.Raycast(UnityEngine.Ray,System.Single&amp;)\">\n      <summary>\n        <para>Intersects a ray with the plane.</para>\n      </summary>\n      <param name=\"ray\"></param>\n      <param name=\"enter\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Plane.SameSide(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Are two points on the same side of the plane?</para>\n      </summary>\n      <param name=\"inPt0\"></param>\n      <param name=\"inPt1\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Plane.Set3Points(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets a plane using three points that lie within it.  The points go around clockwise as you look down on the top surface of the plane.</para>\n      </summary>\n      <param name=\"a\">First point in clockwise order.</param>\n      <param name=\"b\">Second point in clockwise order.</param>\n      <param name=\"c\">Third point in clockwise order.</param>\n    </member>\n    <member name=\"M:UnityEngine.Plane.SetNormalAndPosition(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets a plane using a point that lies within it along with a normal to orient it.</para>\n      </summary>\n      <param name=\"inNormal\">The plane's normal vector.</param>\n      <param name=\"inPoint\">A point that lies on the plane.</param>\n    </member>\n    <member name=\"M:UnityEngine.Plane.Translate(UnityEngine.Plane,UnityEngine.Vector3)\">\n      <summary>\n        <para>Returns a copy of the given plane that is moved in space by the given translation.</para>\n      </summary>\n      <param name=\"plane\">The plane to move in space.</param>\n      <param name=\"translation\">The offset in space to move the plane with.</param>\n      <returns>\n        <para>The translated plane.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Plane.Translate(UnityEngine.Vector3)\">\n      <summary>\n        <para>Moves the plane in space by the translation vector.</para>\n      </summary>\n      <param name=\"translation\">The offset in space to move the plane with.</param>\n    </member>\n    <member name=\"T:UnityEngine.PlatformEffector2D\">\n      <summary>\n        <para>Applies \"platform\" behaviour such as one-way collisions etc.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PlatformEffector2D.oneWay\">\n      <summary>\n        <para>Whether to use one-way collision behaviour or not.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PlatformEffector2D.rotationalOffset\">\n      <summary>\n        <para>The rotational offset angle from the local 'up'.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PlatformEffector2D.sideAngleVariance\">\n      <summary>\n        <para>The angle variance centered on the sides of the platform.  Zero angle only matches sides 90-degree to the platform \"top\".</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PlatformEffector2D.sideArc\">\n      <summary>\n        <para>The angle of an arc that defines the sides of the platform centered on the local 'left' and 'right' of the effector. Any collision normals within this arc are considered for the 'side' behaviours.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PlatformEffector2D.sideBounce\">\n      <summary>\n        <para>Whether bounce should be used on the platform sides or not.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PlatformEffector2D.sideFriction\">\n      <summary>\n        <para>Whether friction should be used on the platform sides or not.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PlatformEffector2D.surfaceArc\">\n      <summary>\n        <para>The angle of an arc that defines the surface of the platform centered of the local 'up' of the effector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PlatformEffector2D.useOneWay\">\n      <summary>\n        <para>Should the one-way collision behaviour be used?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PlatformEffector2D.useOneWayGrouping\">\n      <summary>\n        <para>Ensures that all contacts controlled by the one-way behaviour act the same.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PlatformEffector2D.useSideBounce\">\n      <summary>\n        <para>Should bounce be used on the platform sides?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PlatformEffector2D.useSideFriction\">\n      <summary>\n        <para>Should friction be used on the platform sides?</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Playables.AnimationPlayableUtilities\">\n      <summary>\n        <para>Implements high-level utility methods to simplify use of the Playable API with Animations.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.AnimationPlayableUtilities.Play(UnityEngine.Animator,UnityEngine.Playables.Playable,UnityEngine.Playables.PlayableGraph)\">\n      <summary>\n        <para>Plays the Playable on  the given Animator.</para>\n      </summary>\n      <param name=\"animator\">Target Animator.</param>\n      <param name=\"playable\">The Playable that will be played.</param>\n      <param name=\"graph\">The Graph that owns the Playable.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.AnimationPlayableUtilities.PlayAnimatorController(UnityEngine.Animator,UnityEngine.RuntimeAnimatorController,UnityEngine.Playables.PlayableGraph&amp;)\">\n      <summary>\n        <para>Creates a PlayableGraph to be played on the given Animator. An AnimatorControllerPlayable is also created for the given RuntimeAnimatorController.</para>\n      </summary>\n      <param name=\"animator\">Target Animator.</param>\n      <param name=\"controller\">The RuntimeAnimatorController to create an AnimatorControllerPlayable for.</param>\n      <param name=\"graph\">The created PlayableGraph.</param>\n      <returns>\n        <para>A handle to the newly-created AnimatorControllerPlayable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.AnimationPlayableUtilities.PlayClip(UnityEngine.Animator,UnityEngine.AnimationClip,UnityEngine.Playables.PlayableGraph&amp;)\">\n      <summary>\n        <para>Creates a PlayableGraph to be played on the given Animator. An AnimationClipPlayable is also created for the given AnimationClip.</para>\n      </summary>\n      <param name=\"animator\">Target Animator.</param>\n      <param name=\"clip\">The AnimationClip to create an AnimationClipPlayable for.</param>\n      <param name=\"graph\">The created PlayableGraph.</param>\n      <returns>\n        <para>A handle to the newly-created AnimationClipPlayable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.AnimationPlayableUtilities.PlayLayerMixer(UnityEngine.Animator,System.Int32,UnityEngine.Playables.PlayableGraph&amp;)\">\n      <summary>\n        <para>Creates a PlayableGraph to be played on the given Animator. An AnimationLayerMixerPlayable is also created.</para>\n      </summary>\n      <param name=\"animator\">Target Animator.</param>\n      <param name=\"inputCount\">The input count for the AnimationLayerMixerPlayable. Defines the number of layers.</param>\n      <param name=\"graph\">The created PlayableGraph.</param>\n      <returns>\n        <para>A handle to the newly-created AnimationLayerMixerPlayable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.AnimationPlayableUtilities.PlayMixer(UnityEngine.Animator,System.Int32,UnityEngine.Playables.PlayableGraph&amp;)\">\n      <summary>\n        <para>Creates a PlayableGraph to be played on the given Animator. An AnimationMixerPlayable is also created.</para>\n      </summary>\n      <param name=\"animator\">Target Animator.</param>\n      <param name=\"inputCount\">The input count for the AnimationMixerPlayable.</param>\n      <param name=\"graph\">The created PlayableGraph.</param>\n      <returns>\n        <para>A handle to the newly-created AnimationMixerPlayable.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Playables.DataStreamType\">\n      <summary>\n        <para>Describes the type of information that flows in and out of a Playable. This also specifies that this Playable is connectable to others of the same type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.DataStreamType.Animation\">\n      <summary>\n        <para>Describes that the information flowing in and out of the Playable is of Animation type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.DataStreamType.Audio\">\n      <summary>\n        <para>Describes that the information flowing in and out of the Playable is of Audio type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.DataStreamType.None\">\n      <summary>\n        <para>Describes that the Playable does not have any particular type. This is use for Playables that execute script code, or that create their own playable graphs, such as the Sequence.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.DataStreamType.Texture\">\n      <summary>\n        <para>Describes that the information flowing in and out of the Playable is of type Texture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Playables.DirectorUpdateMode\">\n      <summary>\n        <para>Defines what time source is used to update a Director graph.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.DirectorUpdateMode.DSPClock\">\n      <summary>\n        <para>Update is based on DSP (Digital Sound Processing) clock. Use this for graphs that need to be synchronized with Audio.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.DirectorUpdateMode.GameTime\">\n      <summary>\n        <para>Update is based on Time.time. Use this for graphs that need to be synchronized on gameplay, and that need to be paused when the game is paused.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.DirectorUpdateMode.Manual\">\n      <summary>\n        <para>Update mode is manual. You need to manually call PlayerController.Tick with your own deltaTime. This can be useful for graphs that can be completely disconnected from the rest of the the game. Example: Localized Bullet time.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.DirectorUpdateMode.UnscaledGameTime\">\n      <summary>\n        <para>Update is based on Time.unscaledTime. Use this for graphs that need to be updated even when gameplay is paused. Example: Menus transitions need to be updated even when the game is paused.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Playables.DirectorWrapMode\">\n      <summary>\n        <para>Wrap mode for Playables.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.DirectorWrapMode.Hold\">\n      <summary>\n        <para>Hold the last frame when the playable time reaches it's duration.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.DirectorWrapMode.Loop\">\n      <summary>\n        <para>Loop back to zero time and continue playing.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.DirectorWrapMode.None\">\n      <summary>\n        <para>Do not keep playing when the time reaches the duration.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Playables.FrameData\">\n      <summary>\n        <para>This structure contains the frame information a Playable receives in Playable.PrepareFrame.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.FrameData.deltaTime\">\n      <summary>\n        <para>Time difference between this frame and the preceding frame.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.FrameData.effectiveParentDelay\">\n      <summary>\n        <para>The accumulated delay of the parent Playable during the PlayableGraph traversal.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.FrameData.effectiveParentSpeed\">\n      <summary>\n        <para>The accumulated speed of the parent Playable during the PlayableGraph traversal.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.FrameData.effectiveSpeed\">\n      <summary>\n        <para>The accumulated speed of the Playable during the PlayableGraph traversal.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.FrameData.effectiveWeight\">\n      <summary>\n        <para>The accumulated weight of the Playable during the PlayableGraph traversal.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.FrameData.evaluationType\">\n      <summary>\n        <para>Indicates the type of evaluation that caused PlayableGraph.PrepareFrame to be called.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.FrameData.frameId\">\n      <summary>\n        <para>The current frame identifier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.FrameData.seekOccurred\">\n      <summary>\n        <para>Indicates that the local time was explicitly set.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.FrameData.timeHeld\">\n      <summary>\n        <para>Indicates the local time did not advance because it has reached the duration and the extrapolation mode is set to Hold.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.FrameData.timeLooped\">\n      <summary>\n        <para>Indicates the local time wrapped because it has reached the duration and the extrapolation mode is set to Loop.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.FrameData.weight\">\n      <summary>\n        <para>The weight of the current Playable.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Playables.FrameData.EvaluationType\">\n      <summary>\n        <para>Describes the cause for the evaluation of a PlayableGraph.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.FrameData.EvaluationType.Evaluate\">\n      <summary>\n        <para>Indicates the graph was updated due to a call to PlayableGraph.Evaluate.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.FrameData.EvaluationType.Playback\">\n      <summary>\n        <para>Indicates the graph was called by the runtime during normal playback due to PlayableGraph.Play being called.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Playables.IPlayable\">\n      <summary>\n        <para>Interface implemented by all C# Playable implementations.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Playables.IPlayableAsset\">\n      <summary>\n        <para>Interface that permits a class to inject playables into a graph.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.IPlayableAsset.duration\">\n      <summary>\n        <para>Duration in seconds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.IPlayableAsset.outputs\">\n      <summary>\n        <para>A description of the PlayableOutputs generated by this asset.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.IPlayableAsset.CreatePlayable(UnityEngine.Playables.PlayableGraph,UnityEngine.GameObject)\">\n      <summary>\n        <para>Implement this method to have your asset inject playables into the given graph.</para>\n      </summary>\n      <param name=\"graph\">The graph to inject playables into.</param>\n      <param name=\"owner\">The game object which initiated the build.</param>\n      <returns>\n        <para>The playable injected into the graph, or the root playable if multiple playables are injected.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.Playables.IPlayableBehaviour\">\n      <summary>\n        <para>Interface implemented by all C# Playable Behaviour implementations.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Playables.IPlayableOutput\">\n      <summary>\n        <para>Interface implemented by all C# Playable output implementations.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Playables.Playable\">\n      <summary>\n        <para>Playables are customizable runtime objects that can be connected together and are contained in a PlayableGraph to create complex behaviours.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.Playable.Null\">\n      <summary>\n        <para>Returns an invalid Playable.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Playables.PlayableAsset\">\n      <summary>\n        <para>An base class for assets that can be used to instatiate a Playable at runtime.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.PlayableAsset.duration\">\n      <summary>\n        <para>The playback duration in seconds of the instantiated Playable.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.PlayableAsset.outputs\">\n      <summary>\n        <para>A description of the outputs of the instantiated Playable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableAsset.CreatePlayable(UnityEngine.Playables.PlayableGraph,UnityEngine.GameObject)\">\n      <summary>\n        <para>Implement this method to have your asset inject playables into the given graph.</para>\n      </summary>\n      <param name=\"graph\">The graph to inject playables into.</param>\n      <param name=\"owner\">The game object which initiated the build.</param>\n      <returns>\n        <para>The playable injected into the graph, or the root playable if multiple playables are injected.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Playables.PlayableBehaviour\">\n      <summary>\n        <para>PlayableBehaviour is the base class from which every custom playable script derives.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableBehaviour.OnBehaviourDelay(UnityEngine.Playables.Playable,UnityEngine.Playables.FrameData)\">\n      <summary>\n        <para>This function is called when the Playable play state is changed to Playables.PlayState.Delayed.</para>\n      </summary>\n      <param name=\"playable\">The Playable that owns the current PlayableBehaviour.</param>\n      <param name=\"info\">A FrameData structure that contains information about the current frame context.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableBehaviour.OnBehaviourPause(UnityEngine.Playables.Playable,UnityEngine.Playables.FrameData)\">\n      <summary>\n        <para>This function is called when the Playable play state is changed to Playables.PlayState.Paused.</para>\n      </summary>\n      <param name=\"playable\">The Playable that owns the current PlayableBehaviour.</param>\n      <param name=\"info\">A FrameData structure that contains information about the current frame context.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableBehaviour.OnBehaviourPlay(UnityEngine.Playables.Playable,UnityEngine.Playables.FrameData)\">\n      <summary>\n        <para>This function is called when the Playable play state is changed to Playables.PlayState.Playing.</para>\n      </summary>\n      <param name=\"playable\">The Playable that owns the current PlayableBehaviour.</param>\n      <param name=\"info\">A FrameData structure that contains information about the current frame context.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableBehaviour.OnGraphStart(UnityEngine.Playables.Playable)\">\n      <summary>\n        <para>This function is called when the PlayableGraph that owns this PlayableBehaviour starts.</para>\n      </summary>\n      <param name=\"playable\">The Playable that owns the current PlayableBehaviour.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableBehaviour.OnGraphStop(UnityEngine.Playables.Playable)\">\n      <summary>\n        <para>This function is called when the PlayableGraph that owns this PlayableBehaviour stops.</para>\n      </summary>\n      <param name=\"playable\">The Playable that owns the current PlayableBehaviour.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableBehaviour.OnPlayableCreate(UnityEngine.Playables.Playable)\">\n      <summary>\n        <para>This function is called when the Playable that owns the PlayableBehaviour is created.</para>\n      </summary>\n      <param name=\"playable\">The Playable that owns the current PlayableBehaviour.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableBehaviour.OnPlayableDestroy(UnityEngine.Playables.Playable)\">\n      <summary>\n        <para>This function is called when the Playable that owns the PlayableBehaviour is destroyed.</para>\n      </summary>\n      <param name=\"playable\">The Playable that owns the current PlayableBehaviour.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableBehaviour.PrepareData(UnityEngine.Playables.Playable,UnityEngine.Playables.FrameData)\">\n      <summary>\n        <para>This function is called during the PrepareData phase of the PlayableGraph.</para>\n      </summary>\n      <param name=\"playable\">The Playable that owns the current PlayableBehaviour.</param>\n      <param name=\"info\">A FrameData structure that contains information about the current frame context.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableBehaviour.PrepareFrame(UnityEngine.Playables.Playable,UnityEngine.Playables.FrameData)\">\n      <summary>\n        <para>This function is called during the PrepareFrame phase of the PlayableGraph.</para>\n      </summary>\n      <param name=\"playable\">The Playable that owns the current PlayableBehaviour.</param>\n      <param name=\"info\">A FrameData structure that contains information about the current frame context.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableBehaviour.ProcessFrame(UnityEngine.Playables.Playable,UnityEngine.Playables.FrameData,System.Object)\">\n      <summary>\n        <para>This function is called during the ProcessFrame phase of the PlayableGraph.</para>\n      </summary>\n      <param name=\"playable\">The Playable that owns the current PlayableBehaviour.</param>\n      <param name=\"info\">A FrameData structure that contains information about the current frame context.</param>\n      <param name=\"playerData\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Playables.PlayableBinding\">\n      <summary>\n        <para>Struct that holds information regarding an output of a PlayableAsset.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.PlayableBinding.outputTargetType\">\n      <summary>\n        <para>The type of target required by the PlayableOutput for this PlayableBinding.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.PlayableBinding.sourceObject\">\n      <summary>\n        <para>A reference to a UnityEngine.Object that acts a key for this binding.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.PlayableBinding.streamName\">\n      <summary>\n        <para>The name of the output or input stream.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.PlayableBinding.streamType\">\n      <summary>\n        <para>The type of the output or input stream.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.PlayableBinding.DefaultDuration\">\n      <summary>\n        <para>The default duration used when a PlayableOutput has no fixed duration.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.PlayableBinding.None\">\n      <summary>\n        <para>A constant to represent a PlayableAsset has no bindings.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Playables.PlayableDirector\">\n      <summary>\n        <para>Instantiates a PlayableAsset and controls playback of Playable objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.PlayableDirector.duration\">\n      <summary>\n        <para>The duration of the Playable in seconds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.PlayableDirector.extrapolationMode\">\n      <summary>\n        <para>Controls how the time is incremented when it goes beyond the duration of the playable.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.PlayableDirector.initialTime\">\n      <summary>\n        <para>The time at which the Playable should start when first played.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Playables.PlayableDirector.paused(System.Action`1&lt;UnityEngine.Playables.PlayableDirector&gt;)\">\n      <summary>\n        <para>Event that is raised when a PlayableDirector component has paused.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Playables.PlayableDirector.playableAsset\">\n      <summary>\n        <para>The PlayableAsset that is used to instantiate a playable for playback.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.PlayableDirector.playableGraph\">\n      <summary>\n        <para>The PlayableGraph created by the PlayableDirector.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Playables.PlayableDirector.played(System.Action`1&lt;UnityEngine.Playables.PlayableDirector&gt;)\">\n      <summary>\n        <para>Event that is raised when a PlayableDirector component has begun playing.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Playables.PlayableDirector.playOnAwake\">\n      <summary>\n        <para>Whether the playable asset will start playing back as soon as the component awakes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.PlayableDirector.state\">\n      <summary>\n        <para>The current playing state of the component. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Playables.PlayableDirector.stopped(System.Action`1&lt;UnityEngine.Playables.PlayableDirector&gt;)\">\n      <summary>\n        <para>Event that is raised when a PlayableDirector component has stopped.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Playables.PlayableDirector.time\">\n      <summary>\n        <para>The component's current time. This value is incremented according to the PlayableDirector.timeUpdateMode when it is playing. You can also change this value manually.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.PlayableDirector.timeUpdateMode\">\n      <summary>\n        <para>Controls how time is incremented when playing back.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableDirector.ClearReferenceValue(UnityEngine.PropertyName)\">\n      <summary>\n        <para>Clears an exposed reference value.</para>\n      </summary>\n      <param name=\"id\">Identifier of the ExposedReference.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableDirector.DeferredEvaluate\">\n      <summary>\n        <para>Tells the PlayableDirector to evaluate it's PlayableGraph on the next update.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableDirector.Evaluate\">\n      <summary>\n        <para>Evaluates the currently playing Playable at  the current time.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableDirector.GetGenericBinding(UnityEngine.Object)\">\n      <summary>\n        <para>Returns a binding to a reference object.</para>\n      </summary>\n      <param name=\"key\">The object that acts as a key.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableDirector.GetReferenceValue(UnityEngine.PropertyName,System.Boolean&amp;)\">\n      <summary>\n        <para>Retreives an ExposedReference binding.</para>\n      </summary>\n      <param name=\"id\">Identifier of the ExposedReference.</param>\n      <param name=\"idValid\">Whether the reference was found.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableDirector.Pause\">\n      <summary>\n        <para>Pauses playback of the currently running playable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableDirector.Play(UnityEngine.Playables.PlayableAsset,UnityEngine.Playables.DirectorWrapMode)\">\n      <summary>\n        <para>Instatiates a Playable using the provided PlayableAsset and starts playback.</para>\n      </summary>\n      <param name=\"asset\">An asset to instantiate a playable from.</param>\n      <param name=\"mode\">What to do when the time passes the duration of the playable.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableDirector.Play(UnityEngine.Playables.PlayableAsset)\">\n      <summary>\n        <para>Instatiates a Playable using the provided PlayableAsset and starts playback.</para>\n      </summary>\n      <param name=\"asset\">An asset to instantiate a playable from.</param>\n      <param name=\"mode\">What to do when the time passes the duration of the playable.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableDirector.Play\">\n      <summary>\n        <para>Instatiates a Playable using the provided PlayableAsset and starts playback.</para>\n      </summary>\n      <param name=\"asset\">An asset to instantiate a playable from.</param>\n      <param name=\"mode\">What to do when the time passes the duration of the playable.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableDirector.RebuildGraph\">\n      <summary>\n        <para>Discards the existing PlayableGraph and creates a new instance.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableDirector.Resume\">\n      <summary>\n        <para>Resume playing a paused playable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableDirector.SetGenericBinding(UnityEngine.Object,UnityEngine.Object)\">\n      <summary>\n        <para>Sets the binding of a reference object from a PlayableBinding.</para>\n      </summary>\n      <param name=\"key\">The source object in the PlayableBinding.</param>\n      <param name=\"value\">The object to bind to the key.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableDirector.SetReferenceValue(UnityEngine.PropertyName,UnityEngine.Object)\">\n      <summary>\n        <para>Sets an ExposedReference value.</para>\n      </summary>\n      <param name=\"id\">Identifier of the ExposedReference.</param>\n      <param name=\"value\">The object to bind to set the reference value to.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableDirector.Stop\">\n      <summary>\n        <para>Stops playback of the current Playable and destroys the corresponding graph.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Playables.PlayableExtensions\">\n      <summary>\n        <para>Extensions for all the types that implements IPlayable.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.AddInput(U,V,System.Int32,System.Single)\">\n      <summary>\n        <para>Create a new input port and connect it to the output port of the given Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"sourcePlayable\">The Playable to connect to.</param>\n      <param name=\"sourceOutputIndex\">The output port of the Playable.</param>\n      <param name=\"weight\">The weight of the created input port.</param>\n      <returns>\n        <para>The index of the newly created input port.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.ConnectInput(U,System.Int32,V,System.Int32,System.Single)\">\n      <summary>\n        <para>Connect the output port of a Playable to one of the input ports.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"inputIndex\">The input port index.</param>\n      <param name=\"sourcePlayable\">The Playable to connect to.</param>\n      <param name=\"sourceOutputIndex\">The output port of the Playable.</param>\n      <param name=\"weight\">The weight of the input port.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.Destroy(U)\">\n      <summary>\n        <para>Destroys the current Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.DisconnectInput(U,System.Int32)\">\n      <summary>\n        <para>Disconnect the input port of a Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"inputPort\">The input port index.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.GetDelay(U)\">\n      <summary>\n        <para>Returns the delay of the playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <returns>\n        <para>The delay in seconds.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.GetDuration(U)\">\n      <summary>\n        <para>Returns the duration of the Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <returns>\n        <para>The duration in seconds.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.GetGraph(U)\">\n      <summary>\n        <para>Returns the PlayableGraph that owns this Playable.  A Playable can only be used in the graph that was used to create it.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <returns>\n        <para>The PlayableGraph associated with the current Playable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.GetInput(U,System.Int32)\">\n      <summary>\n        <para>Returns the Playable connected at the given input port index.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"inputPort\">The port index.</param>\n      <returns>\n        <para>Playable connected at the index specified, or null if the index is valid but is not connected to anything. This happens if there was once a Playable connected at the index, but was disconnected via PlayableGraph.Disconnect.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.GetInputCount(U)\">\n      <summary>\n        <para>Returns the number of inputs supported by the Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <returns>\n        <para>The count of inputs on the Playable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.GetInputWeight(U,System.Int32)\">\n      <summary>\n        <para>Returns the weight of the Playable connected at the given input port index.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"inputIndex\">The port index.</param>\n      <returns>\n        <para>The current weight of the connected Playable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.GetLeadTime(U)\">\n      <summary>\n        <para>Returns the Playable lead time in seconds.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.GetOutput(U,System.Int32)\">\n      <summary>\n        <para>Returns the Playable connected at the given output port index.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"outputPort\">The port index.</param>\n      <returns>\n        <para>Playable connected at the output index specified, or null if the index is valid but is not connected to anything. This happens if there was once a Playable connected at the index, but was disconnected via PlayableGraph.Disconnect.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.GetOutputCount(U)\">\n      <summary>\n        <para>Returns the number of outputs supported by the Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <returns>\n        <para>The count of outputs on the Playable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.GetPlayState(U)\">\n      <summary>\n        <para>Returns the current PlayState of the Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <returns>\n        <para>The current PlayState of the Playable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.GetPreviousTime(U)\">\n      <summary>\n        <para>Returns the previous local time of the Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <returns>\n        <para>The previous time in seconds.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.GetPropagateSetTime(U)\">\n      <summary>\n        <para>Returns the time propagation behavior of this Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <returns>\n        <para>True if time propagation is enabled.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.GetSpeed(U)\">\n      <summary>\n        <para>Returns the speed multiplier that is applied to the the current Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <returns>\n        <para>The current speed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.GetTime(U)\">\n      <summary>\n        <para>Returns the current local time of the Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <returns>\n        <para>The current time in seconds.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.GetTraversalMode(U)\">\n      <summary>\n        <para>Returns the propagation mode for the multi-output playable.</para>\n      </summary>\n      <param name=\"playable\"></param>\n      <returns>\n        <para>Traversal mode (Mix or Passthrough).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.IsDelayed(U)\">\n      <summary>\n        <para>Returns whether or not the Playable has a delay.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <returns>\n        <para>True if the playable is delayed, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.IsDone(U)\">\n      <summary>\n        <para>Returns a flag indicating that a playable has completed its operation.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <returns>\n        <para>True if the playable has completed its operation, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.IsNull(U)\">\n      <summary>\n        <para>Returns true if the Playable is null, false otherwise.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.IsValid(U)\">\n      <summary>\n        <para>Returns the vality of the current Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <returns>\n        <para>True if the Playable is properly constructed by the PlayableGraph and has not been destroyed, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.Pause(U)\">\n      <summary>\n        <para>Tells to pause the Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.Play(U)\">\n      <summary>\n        <para>Starts to play the Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.SetDelay(U,System.Double)\">\n      <summary>\n        <para>Set a delay until the playable starts.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"delay\">The delay in seconds.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.SetDone(U,System.Boolean)\">\n      <summary>\n        <para>Changes a flag indicating that a playable has completed its operation.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"value\">True if the operation is completed, false otherwise.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.SetDuration(U,System.Double)\">\n      <summary>\n        <para>Changes the duration of the Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"value\">The new duration in seconds, must be a positive value.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.SetInputCount(U,System.Int32)\">\n      <summary>\n        <para>Changes the number of inputs supported by the Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.SetInputWeight(U,System.Int32,System.Single)\">\n      <summary>\n        <para>Changes the weight of the Playable connected to the current Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"input\">The connected Playable to change.</param>\n      <param name=\"weight\">The weight. Should be between 0 and 1.</param>\n      <param name=\"inputIndex\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.SetInputWeight(U,V,System.Single)\">\n      <summary>\n        <para>Changes the weight of the Playable connected to the current Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"input\">The connected Playable to change.</param>\n      <param name=\"weight\">The weight. Should be between 0 and 1.</param>\n      <param name=\"inputIndex\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.SetLeadTime(U,System.Single)\">\n      <summary>\n        <para>Sets the Playable lead time in seconds.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"value\">The new lead time in seconds.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.SetOutputCount(U,System.Int32)\">\n      <summary>\n        <para>Changes the number of outputs supported by the Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.SetPlayState(U,UnityEngine.Playables.PlayState)\">\n      <summary>\n        <para>Changes the current PlayState of the Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"value\">The new PlayState.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.SetPropagateSetTime(U,System.Boolean)\">\n      <summary>\n        <para>Changes the time propagation behavior of this Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"value\">True to enable time propagation.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.SetSpeed(U,System.Double)\">\n      <summary>\n        <para>Changes the speed multiplier that is applied to the the current Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"value\">The new speed.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.SetTime(U,System.Double)\">\n      <summary>\n        <para>Changes the current local time of the Playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"value\">The current time in seconds.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableExtensions.SetTraversalMode(U,UnityEngine.Playables.PlayableTraversalMode)\">\n      <summary>\n        <para>Sets the propagation mode of PrepareFrame and ProcessFrame for the multi-output playable.</para>\n      </summary>\n      <param name=\"playable\">The Playable used by this operation.</param>\n      <param name=\"mode\">The new traversal mode.</param>\n    </member>\n    <member name=\"T:UnityEngine.Playables.PlayableGraph\">\n      <summary>\n        <para>Use the PlayableGraph to manage Playable creations and destructions.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.Connect(U,System.Int32,V,System.Int32)\">\n      <summary>\n        <para>Connects two Playable instances.</para>\n      </summary>\n      <param name=\"source\">The source playable or its handle.</param>\n      <param name=\"sourceOutputPort\">The port used in the source playable.</param>\n      <param name=\"destination\">The destination playable or its handle.</param>\n      <param name=\"destinationInputPort\">The port used in the destination playable.</param>\n      <returns>\n        <para>Returns true if connection is successful.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.Create\">\n      <summary>\n        <para>Creates a PlayableGraph.</para>\n      </summary>\n      <param name=\"name\">The name of the graph.</param>\n      <returns>\n        <para>The newly created PlayableGraph.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.Create(System.String)\">\n      <summary>\n        <para>Creates a PlayableGraph.</para>\n      </summary>\n      <param name=\"name\">The name of the graph.</param>\n      <returns>\n        <para>The newly created PlayableGraph.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.Destroy\">\n      <summary>\n        <para>Destroys the graph.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.DestroyOutput(U)\">\n      <summary>\n        <para>Destroys the PlayableOutput.</para>\n      </summary>\n      <param name=\"output\">The output to destroy.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.DestroyPlayable(U)\">\n      <summary>\n        <para>Destroys the Playable.</para>\n      </summary>\n      <param name=\"playable\">The playable to destroy.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.DestroySubgraph(U)\">\n      <summary>\n        <para>Destroys the Playable and all its inputs, recursively.</para>\n      </summary>\n      <param name=\"playable\">The Playable to destroy.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.Disconnect(U,System.Int32)\">\n      <summary>\n        <para>Disconnects the Playable. The connections determine the topology of the PlayableGraph and how it is evaluated.</para>\n      </summary>\n      <param name=\"input\">The source playabe or its handle.</param>\n      <param name=\"inputPort\">The port used in the source playable.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.Evaluate(System.Single)\">\n      <summary>\n        <para>Evaluates all the PlayableOutputs in the graph, and updates all the connected Playables in the graph.</para>\n      </summary>\n      <param name=\"deltaTime\">The time in seconds by which to advance each Playable in the graph.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.Evaluate\">\n      <summary>\n        <para>Evaluates all the PlayableOutputs in the graph, and updates all the connected Playables in the graph.</para>\n      </summary>\n      <param name=\"deltaTime\">The time in seconds by which to advance each Playable in the graph.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.GetEditorName\">\n      <summary>\n        <para>Returns the name of the PlayableGraph.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.GetOutput(System.Int32)\">\n      <summary>\n        <para>Get PlayableOutput at the given index in the graph.</para>\n      </summary>\n      <param name=\"index\">The output index.</param>\n      <returns>\n        <para>The PlayableOutput at this given index, otherwise null.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.GetOutputByType(System.Int32)\">\n      <summary>\n        <para>Get PlayableOutput of the requested type at the given index in the graph.</para>\n      </summary>\n      <param name=\"index\">The output index.</param>\n      <returns>\n        <para>The PlayableOutput at the given index among all the PlayableOutput of the same type T.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.GetOutputCount\">\n      <summary>\n        <para>Returns the number of PlayableOutput in the graph.</para>\n      </summary>\n      <returns>\n        <para>The number of PlayableOutput in the graph.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.GetOutputCountByType\">\n      <summary>\n        <para>Get the number of PlayableOutput of the requested type in the graph.</para>\n      </summary>\n      <returns>\n        <para>The number of PlayableOutput of the same type T in the graph.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.GetPlayableCount\">\n      <summary>\n        <para>Returns the number of Playable owned by the Graph.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.GetResolver\">\n      <summary>\n        <para>Returns the table used by the graph to resolve ExposedReferences.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.GetRootPlayable(System.Int32)\">\n      <summary>\n        <para>Returns the Playable with no output connections at the given index.</para>\n      </summary>\n      <param name=\"index\">The index of the root Playable.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.GetRootPlayableCount\">\n      <summary>\n        <para>Returns the number of Playable owned by the Graph that have no connected outputs.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.GetTimeUpdateMode\">\n      <summary>\n        <para>Returns how time is incremented when playing back.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.IsDone\">\n      <summary>\n        <para>Indicates that a graph has completed its operations.</para>\n      </summary>\n      <returns>\n        <para>A boolean indicating if the graph is done playing or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.IsPlaying\">\n      <summary>\n        <para>Indicates that a graph is presently running.</para>\n      </summary>\n      <returns>\n        <para>A boolean indicating if the graph is playing or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.IsValid\">\n      <summary>\n        <para>Returns true if the PlayableGraph has been properly constructed using PlayableGraph.CreateGraph and is not deleted.</para>\n      </summary>\n      <returns>\n        <para>A boolean indicating if the graph is invalid or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.Play\">\n      <summary>\n        <para>Plays the graph.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.SetResolver(UnityEngine.IExposedPropertyTable)\">\n      <summary>\n        <para>Changes the table used by the graph to resolve ExposedReferences.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.SetTimeUpdateMode(UnityEngine.Playables.DirectorUpdateMode)\">\n      <summary>\n        <para>Changes how time is incremented when playing back.</para>\n      </summary>\n      <param name=\"value\">The new DirectorUpdateMode.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableGraph.Stop\">\n      <summary>\n        <para>Stops the graph, if it is playing.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Playables.PlayableOutput\">\n      <summary>\n        <para>See: Playables.IPlayableOutput.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Playables.PlayableOutput.Null\">\n      <summary>\n        <para>Returns an invalid PlayableOutput.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Playables.PlayableOutputExtensions\">\n      <summary>\n        <para>Extensions for all the types that implements IPlayableOutput.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableOutputExtensions.GetSourceOutputPort(U)\">\n      <summary>\n        <para>Returns the source playable's output connection index.</para>\n      </summary>\n      <param name=\"output\">The PlayableOutput used by this operation.</param>\n      <returns>\n        <para>The output port.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableOutputExtensions.GetSourcePlayable(U)\">\n      <summary>\n        <para>Returns the source playable.</para>\n      </summary>\n      <param name=\"output\">The PlayableOutput used by this operation.</param>\n      <returns>\n        <para>The source playable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableOutputExtensions.GetUserData(U)\">\n      <summary>\n        <para>Returns the opaque user data. This is the same value as the last last argument of ProcessFrame.</para>\n      </summary>\n      <param name=\"output\">The PlayableOutput used by this operation.</param>\n      <returns>\n        <para>The user data.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableOutputExtensions.GetWeight(U)\">\n      <summary>\n        <para>Returns the weight of the connection from the PlayableOutput to the source playable.</para>\n      </summary>\n      <param name=\"output\">The PlayableOutput used by this operation.</param>\n      <returns>\n        <para>The weight of the connection to the source playable.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableOutputExtensions.IsOutputNull(U)\">\n      <summary>\n        <para>Returns true if the PlayableOutput is null, false otherwise.</para>\n      </summary>\n      <param name=\"output\">The PlayableOutput used by this operation.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableOutputExtensions.IsOutputValid(U)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"output\">The PlayableOutput used by this operation.</param>\n      <returns>\n        <para>True if the PlayableOutput has not yet been destroyed and false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableOutputExtensions.SetReferenceObject(U,UnityEngine.Object)\">\n      <summary>\n        <para>Sets the bound object to a new value. Used to associate an output to an object (Track asset in case of Timeline).</para>\n      </summary>\n      <param name=\"output\">The PlayableOutput used by this operation.</param>\n      <param name=\"value\">The new reference object value.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableOutputExtensions.SetSourceOutputPort(U,System.Int32)\">\n      <summary>\n        <para>Sets the source playable's output connection index. For playables with multiple outputs, this determines which sub-branch of the source playable generates this output.</para>\n      </summary>\n      <param name=\"output\">The PlayableOutput used by this operation.</param>\n      <param name=\"value\">The new output port value.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableOutputExtensions.SetSourcePlayable(U,V,System.Int32)\">\n      <summary>\n        <para>Sets which playable that computes the output and which sub-tree index.</para>\n      </summary>\n      <param name=\"output\">The PlayableOutput used by this operation.</param>\n      <param name=\"value\">The new source Playable.</param>\n      <param name=\"port\">The new output port value.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableOutputExtensions.SetSourcePlayable(U,V)\">\n      <summary>\n        <para>Sets which playable that computes the output.</para>\n      </summary>\n      <param name=\"output\">The PlayableOutput used by this operation.</param>\n      <param name=\"value\">The new source Playable.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableOutputExtensions.SetUserData(U,UnityEngine.Object)\">\n      <summary>\n        <para>Sets the opaque user data. This same data is passed as the last argument to ProcessFrame.</para>\n      </summary>\n      <param name=\"output\">The PlayableOutput used by this operation.</param>\n      <param name=\"value\">The new user data.</param>\n    </member>\n    <member name=\"M:UnityEngine.Playables.PlayableOutputExtensions.SetWeight(U,System.Single)\">\n      <summary>\n        <para>Sets the weight of the connection from the PlayableOutput to the source playable.</para>\n      </summary>\n      <param name=\"output\">The PlayableOutput used by this operation.</param>\n      <param name=\"value\">The new weight.</param>\n    </member>\n    <member name=\"T:UnityEngine.Playables.PlayableTraversalMode\">\n      <summary>\n        <para>Traversal mode for Playables.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.PlayableTraversalMode.Mix\">\n      <summary>\n        <para>Causes the Playable to prepare and process it's inputs when demanded by an output.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.PlayableTraversalMode.Passthrough\">\n      <summary>\n        <para>Causes the Playable to act as a passthrough for PrepareFrame and ProcessFrame. If the PlayableOutput being processed is connected to the n-th input port of the Playable, the Playable only propagates the n-th output port. Use this enum value in conjunction with PlayableOutput SetSourceOutputPort.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Playables.PlayState\">\n      <summary>\n        <para>Status of a Playable.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.PlayState.Delayed\">\n      <summary>\n        <para>The Playable has been delayed, using PlayableExtensions.SetDelay. It will not start until the delay is entirely consumed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.PlayState.Paused\">\n      <summary>\n        <para>The Playable has been paused. Its local time will not advance.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Playables.PlayState.Playing\">\n      <summary>\n        <para>The Playable is currently Playing.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Playables.ScriptPlayable`1\">\n      <summary>\n        <para>A IPlayable implementation that contains a PlayableBehaviour for the PlayableGraph. PlayableBehaviour can be used to write custom Playable that implement their own PrepareFrame callback.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Playables.ScriptPlayableBinding\">\n      <summary>\n        <para>A PlayableBinding that contains information representing a ScriptingPlayableOutput.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.ScriptPlayableBinding.Create(System.String,UnityEngine.Object,System.Type)\">\n      <summary>\n        <para>Creates a PlayableBinding that contains information representing a ScriptPlayableOutput.</para>\n      </summary>\n      <param name=\"key\">A reference to a UnityEngine.Object that acts as a key for this binding.</param>\n      <param name=\"type\">The type of object that will be bound to the ScriptPlayableOutput.</param>\n      <param name=\"name\">The name of the ScriptPlayableOutput.</param>\n      <returns>\n        <para>Returns a PlayableBinding that contains information that is used to create a ScriptPlayableOutput.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Playables.ScriptPlayableOutput\">\n      <summary>\n        <para>A IPlayableOutput implementation that contains a script output for the a PlayableGraph.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Playables.ScriptPlayableOutput.Create(UnityEngine.Playables.PlayableGraph,System.String)\">\n      <summary>\n        <para>Creates a new ScriptPlayableOutput in the associated PlayableGraph.</para>\n      </summary>\n      <param name=\"graph\">The PlayableGraph that will contain the ScriptPlayableOutput.</param>\n      <param name=\"name\">The name of this ScriptPlayableOutput.</param>\n      <returns>\n        <para>The created ScriptPlayableOutput.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Playables.ScriptPlayableOutput.Null\">\n      <summary>\n        <para>Returns an invalid ScriptPlayableOutput.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.PlayerPrefs\">\n      <summary>\n        <para>Stores and accesses player preferences between game sessions.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.PlayerPrefs.DeleteAll\">\n      <summary>\n        <para>Removes all keys and values from the preferences. Use with caution.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.PlayerPrefs.DeleteKey(System.String)\">\n      <summary>\n        <para>Removes key and its corresponding value from the preferences.</para>\n      </summary>\n      <param name=\"key\"></param>\n    </member>\n    <member name=\"M:UnityEngine.PlayerPrefs.GetFloat(System.String)\">\n      <summary>\n        <para>Returns the value corresponding to key in the preference file if it exists.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"defaultValue\"></param>\n    </member>\n    <member name=\"M:UnityEngine.PlayerPrefs.GetFloat(System.String,System.Single)\">\n      <summary>\n        <para>Returns the value corresponding to key in the preference file if it exists.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"defaultValue\"></param>\n    </member>\n    <member name=\"M:UnityEngine.PlayerPrefs.GetInt(System.String)\">\n      <summary>\n        <para>Returns the value corresponding to key in the preference file if it exists.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"defaultValue\"></param>\n    </member>\n    <member name=\"M:UnityEngine.PlayerPrefs.GetInt(System.String,System.Int32)\">\n      <summary>\n        <para>Returns the value corresponding to key in the preference file if it exists.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"defaultValue\"></param>\n    </member>\n    <member name=\"M:UnityEngine.PlayerPrefs.GetString(System.String)\">\n      <summary>\n        <para>Returns the value corresponding to key in the preference file if it exists.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"defaultValue\"></param>\n    </member>\n    <member name=\"M:UnityEngine.PlayerPrefs.GetString(System.String,System.String)\">\n      <summary>\n        <para>Returns the value corresponding to key in the preference file if it exists.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"defaultValue\"></param>\n    </member>\n    <member name=\"M:UnityEngine.PlayerPrefs.HasKey(System.String)\">\n      <summary>\n        <para>Returns true if key exists in the preferences.</para>\n      </summary>\n      <param name=\"key\"></param>\n    </member>\n    <member name=\"M:UnityEngine.PlayerPrefs.Save\">\n      <summary>\n        <para>Writes all modified preferences to disk.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.PlayerPrefs.SetFloat(System.String,System.Single)\">\n      <summary>\n        <para>Sets the value of the preference identified by key.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.PlayerPrefs.SetInt(System.String,System.Int32)\">\n      <summary>\n        <para>Sets the value of the preference identified by key.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.PlayerPrefs.SetString(System.String,System.String)\">\n      <summary>\n        <para>Sets the value of the preference identified by key.</para>\n      </summary>\n      <param name=\"key\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"T:UnityEngine.PlayerPrefsException\">\n      <summary>\n        <para>An exception thrown by the PlayerPrefs class in a  web player build.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.PlayMode\">\n      <summary>\n        <para>Used by Animation.Play function.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.PlayMode.StopAll\">\n      <summary>\n        <para>Will stop all animations that were started with this component before playing.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.PlayMode.StopSameLayer\">\n      <summary>\n        <para>Will stop all animations that were started in the same layer. This is the default when playing animations.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.PointEffector2D\">\n      <summary>\n        <para>Applies forces to attract/repulse against a point.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PointEffector2D.angularDrag\">\n      <summary>\n        <para>The angular drag to apply to rigid-bodies.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PointEffector2D.distanceScale\">\n      <summary>\n        <para>The scale applied to the calculated distance between source and target.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PointEffector2D.drag\">\n      <summary>\n        <para>The linear drag to apply to rigid-bodies.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PointEffector2D.forceMagnitude\">\n      <summary>\n        <para>The magnitude of the force to be applied.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PointEffector2D.forceMode\">\n      <summary>\n        <para>The mode used to apply the effector force.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PointEffector2D.forceSource\">\n      <summary>\n        <para>The source which is used to calculate the centroid point of the effector.  The distance from the target is defined from this point.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PointEffector2D.forceTarget\">\n      <summary>\n        <para>The target for where the effector applies any force.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PointEffector2D.forceVariation\">\n      <summary>\n        <para>The variation of the magnitude of the force to be applied.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.PolygonCollider2D\">\n      <summary>\n        <para>Collider for 2D physics representing an arbitrary polygon defined by its vertices.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PolygonCollider2D.autoTiling\">\n      <summary>\n        <para>Determines whether the PolygonCollider2D's shape is automatically updated based on a SpriteRenderer's tiling properties.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PolygonCollider2D.pathCount\">\n      <summary>\n        <para>The number of paths in the polygon.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PolygonCollider2D.points\">\n      <summary>\n        <para>Corner points that define the collider's shape in local space.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.PolygonCollider2D.CreatePrimitive(System.Int32,UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Creates as regular primitive polygon with the specified number of sides.</para>\n      </summary>\n      <param name=\"sides\">The number of sides in the polygon.  This must be greater than two.</param>\n      <param name=\"scale\">The X/Y scale of the polygon.  These must be greater than zero.</param>\n      <param name=\"offset\">The X/Y offset of the polygon.</param>\n    </member>\n    <member name=\"M:UnityEngine.PolygonCollider2D.GetPath(System.Int32)\">\n      <summary>\n        <para>Gets a path from the Collider by its index.</para>\n      </summary>\n      <param name=\"index\">The index of the path to retrieve.</param>\n      <returns>\n        <para>An ordered array of the vertices or points in the selected path.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.PolygonCollider2D.GetTotalPointCount\">\n      <summary>\n        <para>Return the total number of points in the polygon in all paths.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.PolygonCollider2D.SetPath(System.Int32,UnityEngine.Vector2[])\">\n      <summary>\n        <para>Define a path by its constituent points.</para>\n      </summary>\n      <param name=\"index\">Index of the path to set.</param>\n      <param name=\"points\">Points that define the path.</param>\n    </member>\n    <member name=\"T:UnityEngine.Pose\">\n      <summary>\n        <para>Representation of a Position, and a Rotation in 3D Space</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Pose.forward\">\n      <summary>\n        <para>Returns the forward vector of the pose.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Pose.identity\">\n      <summary>\n        <para>Shorthand for pose which represents zero position, and an identity rotation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Pose.position\">\n      <summary>\n        <para>The position component of the pose.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Pose.right\">\n      <summary>\n        <para>Returns the right vector of the pose.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Pose.rotation\">\n      <summary>\n        <para>The rotation component of the pose.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Pose.up\">\n      <summary>\n        <para>Returns the up vector of the pose.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Pose.#ctor\">\n      <summary>\n        <para>Creates a new pose with the given vector, and quaternion values.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Pose.GetTransformedBy(UnityEngine.Pose)\">\n      <summary>\n        <para>Transforms the current pose into the local space of the provided pose.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Pose.GetTransformedBy(UnityEngine.Transform)\">\n      <summary>\n        <para>Transforms the current pose into the local space of the provided pose.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n    </member>\n    <member name=\"T:UnityEngine.PreferBinarySerialization\">\n      <summary>\n        <para>Prefer ScriptableObject derived type to use binary serialization regardless of project's asset serialization mode.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.PrimitiveType\">\n      <summary>\n        <para>The various primitives that can be created using the GameObject.CreatePrimitive function.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.PrimitiveType.Capsule\">\n      <summary>\n        <para>A capsule primitive.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.PrimitiveType.Cube\">\n      <summary>\n        <para>A cube primitive.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.PrimitiveType.Cylinder\">\n      <summary>\n        <para>A cylinder primitive.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.PrimitiveType.Plane\">\n      <summary>\n        <para>A plane primitive.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.PrimitiveType.Quad\">\n      <summary>\n        <para>A Quad primitive.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.PrimitiveType.Sphere\">\n      <summary>\n        <para>A sphere primitive.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ProceduralCacheSize\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralCacheSize.Heavy\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralCacheSize.Medium\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralCacheSize.NoLimit\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralCacheSize.None\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralCacheSize.Tiny\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ProceduralLoadingBehavior\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralLoadingBehavior.BakeAndDiscard\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralLoadingBehavior.BakeAndKeep\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralLoadingBehavior.Cache\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralLoadingBehavior.DoNothing\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralLoadingBehavior.DoNothingAndCache\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralLoadingBehavior.Generate\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ProceduralMaterial\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ProceduralMaterial.animationUpdateRate\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ProceduralMaterial.cacheSize\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ProceduralMaterial.isCachedDataAvailable\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ProceduralMaterial.isFrozen\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ProceduralMaterial.isLoadTimeGenerated\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ProceduralMaterial.isProcessing\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ProceduralMaterial.isReadable\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ProceduralMaterial.isSupported\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ProceduralMaterial.loadingBehavior\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ProceduralMaterial.preset\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ProceduralMaterial.substanceProcessorUsage\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.CacheProceduralProperty(System.String,System.Boolean)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"inputName\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.ClearCache\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.FreezeAndReleaseSourceData\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.GetGeneratedTexture(System.String)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"textureName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.GetGeneratedTextures\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.GetProceduralBoolean(System.String)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"inputName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.GetProceduralColor(System.String)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"inputName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.GetProceduralEnum(System.String)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"inputName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.GetProceduralFloat(System.String)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"inputName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.GetProceduralPropertyDescriptions\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.GetProceduralString(System.String)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"inputName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.GetProceduralTexture(System.String)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"inputName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.GetProceduralVector(System.String)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"inputName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.HasProceduralProperty(System.String)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"inputName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.IsProceduralPropertyCached(System.String)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"inputName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.IsProceduralPropertyVisible(System.String)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"inputName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.RebuildTextures\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.RebuildTexturesImmediately\">\n      <summary>\n        <para>Triggers an immediate (synchronous) rebuild of this ProceduralMaterial's dirty textures.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.SetProceduralBoolean(System.String,System.Boolean)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"inputName\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.SetProceduralColor(System.String,UnityEngine.Color)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"inputName\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.SetProceduralEnum(System.String,System.Int32)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"inputName\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.SetProceduralFloat(System.String,System.Single)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"inputName\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.SetProceduralString(System.String,System.String)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"inputName\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.SetProceduralTexture(System.String,UnityEngine.Texture2D)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"inputName\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.SetProceduralVector(System.String,UnityEngine.Vector4)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"inputName\"></param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralMaterial.StopRebuilds\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ProceduralOutputType\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralOutputType.AmbientOcclusion\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralOutputType.DetailMask\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralOutputType.Diffuse\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralOutputType.Emissive\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralOutputType.Height\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralOutputType.Metallic\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralOutputType.Normal\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralOutputType.Opacity\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralOutputType.Roughness\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralOutputType.Smoothness\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralOutputType.Specular\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralOutputType.Unknown\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ProceduralProcessorUsage\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralProcessorUsage.All\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralProcessorUsage.Half\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralProcessorUsage.One\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralProcessorUsage.Unsupported\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ProceduralPropertyDescription\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyDescription.componentLabels\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyDescription.enumOptions\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyDescription.group\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyDescription.hasRange\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyDescription.label\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyDescription.maximum\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyDescription.minimum\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyDescription.name\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyDescription.step\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyDescription.type\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ProceduralPropertyType\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyType.Boolean\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyType.Color3\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyType.Color4\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyType.Enum\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyType.Float\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyType.String\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyType.Texture\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyType.Vector2\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyType.Vector3\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ProceduralPropertyType.Vector4\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ProceduralTexture\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ProceduralTexture.format\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ProceduralTexture.hasAlpha\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralTexture.GetPixels32(System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"blockWidth\"></param>\n      <param name=\"blockHeight\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ProceduralTexture.GetProceduralOutputType\">\n      <summary>\n        <para>Deprecated feature, no longer available</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Profiling.CustomSampler\">\n      <summary>\n        <para>Custom CPU Profiler label used for profiling arbitrary code blocks.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.CustomSampler.Begin\">\n      <summary>\n        <para>Begin profiling a piece of code with a custom label defined by this instance of CustomSampler.</para>\n      </summary>\n      <param name=\"targetObject\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.CustomSampler.Begin(UnityEngine.Object)\">\n      <summary>\n        <para>Begin profiling a piece of code with a custom label defined by this instance of CustomSampler.</para>\n      </summary>\n      <param name=\"targetObject\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.CustomSampler.Create(System.String)\">\n      <summary>\n        <para>Creates a new CustomSampler for profiling parts of your code.</para>\n      </summary>\n      <param name=\"name\">Name of the Sampler.</param>\n      <returns>\n        <para>CustomSampler object or null if a built-in Sampler with the same name exists.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.CustomSampler.End\">\n      <summary>\n        <para>End profiling a piece of code with a custom label.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Profiling.Profiler\">\n      <summary>\n        <para>Controls the from script.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Profiling.Profiler.enableBinaryLog\">\n      <summary>\n        <para>Enables the logging of profiling data to a file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Profiling.Profiler.enabled\">\n      <summary>\n        <para>Enables the Profiler.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Profiling.Profiler.logFile\">\n      <summary>\n        <para>Specifies the file to use when writing profiling data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Profiling.Profiler.maxNumberOfSamplesPerFrame\">\n      <summary>\n        <para>Resize the profiler sample buffers to allow the desired amount of samples per thread.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Profiling.Profiler.usedHeapSize\">\n      <summary>\n        <para>Heap size used by the program.</para>\n      </summary>\n      <returns>\n        <para>Size of the used heap in bytes, (or 0 if the profiler is disabled).</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.Profiling.Profiler.usedHeapSizeLong\">\n      <summary>\n        <para>Returns the number of bytes that Unity has allocated. This does not include bytes allocated by external libraries or drivers.</para>\n      </summary>\n      <returns>\n        <para>Size of the memory allocated by Unity (or 0 if the profiler is disabled).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.AddFramesFromFile(System.String)\">\n      <summary>\n        <para>Displays the recorded profile data in the profiler.</para>\n      </summary>\n      <param name=\"file\">The name of the file containing the frame data, including extension.</param>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.BeginSample(System.String)\">\n      <summary>\n        <para>Begin profiling a piece of code with a custom label.</para>\n      </summary>\n      <param name=\"name\">A string to identify the sample in the Profiler window.</param>\n      <param name=\"targetObject\">An object that provides context to the sample,.</param>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.BeginSample(System.String,UnityEngine.Object)\">\n      <summary>\n        <para>Begin profiling a piece of code with a custom label.</para>\n      </summary>\n      <param name=\"name\">A string to identify the sample in the Profiler window.</param>\n      <param name=\"targetObject\">An object that provides context to the sample,.</param>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.BeginThreadProfiling(System.String,System.String)\">\n      <summary>\n        <para>Enables profiling on the thread from which you call this method.</para>\n      </summary>\n      <param name=\"threadGroupName\">The name of the thread group to which the thread belongs.</param>\n      <param name=\"threadName\">The name of the thread.</param>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.EndSample\">\n      <summary>\n        <para>Ends the current profiling sample.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.EndThreadProfiling\">\n      <summary>\n        <para>Frees the internal resources used by the Profiler for the thread.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.GetAllocatedMemoryForGraphicsDriver\">\n      <summary>\n        <para>Returns the amount of allocated memory for the graphics driver, in bytes.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.GetMonoHeapSize\">\n      <summary>\n        <para>Returns the size of the mono heap.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.GetMonoHeapSizeLong\">\n      <summary>\n        <para>Returns the size of the reserved space for managed-memory.</para>\n      </summary>\n      <returns>\n        <para>The size of the managed heap. This returns 0 if the Profiler is not available.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.GetMonoUsedSize\">\n      <summary>\n        <para>Returns the used size from mono.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.GetMonoUsedSizeLong\">\n      <summary>\n        <para>The allocated managed-memory for live objects and non-collected objects.</para>\n      </summary>\n      <returns>\n        <para>A long integer value of the memory in use. This returns 0 if the Profiler is not available.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.GetRuntimeMemorySize(UnityEngine.Object)\">\n      <summary>\n        <para>Returns the runtime memory usage of the resource.</para>\n      </summary>\n      <param name=\"o\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.GetRuntimeMemorySizeLong(UnityEngine.Object)\">\n      <summary>\n        <para>Gathers the native-memory used by a Unity object.</para>\n      </summary>\n      <param name=\"o\">The target Unity object.</param>\n      <returns>\n        <para>The amount of native-memory used by a Unity object. This returns 0 if the Profiler is not available.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.GetTempAllocatorSize\">\n      <summary>\n        <para>Returns the size of the temp allocator.</para>\n      </summary>\n      <returns>\n        <para>Size in bytes.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.GetTotalAllocatedMemory\">\n      <summary>\n        <para>Returns the amount of allocated and used system memory.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.GetTotalAllocatedMemoryLong\">\n      <summary>\n        <para>The total memory allocated by the internal allocators in Unity. Unity reserves large pools of memory from the system. This function returns the amount of used memory in those pools.</para>\n      </summary>\n      <returns>\n        <para>The amount of memory allocated by Unity. This returns 0 if the Profiler is not available.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.GetTotalReservedMemory\">\n      <summary>\n        <para>Returns the amount of reserved system memory.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.GetTotalReservedMemoryLong\">\n      <summary>\n        <para>The total memory Unity has reserved.</para>\n      </summary>\n      <returns>\n        <para>Memory reserved by Unity in bytes. This returns 0 if the Profiler is not available.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.GetTotalUnusedReservedMemory\">\n      <summary>\n        <para>Returns the amount of reserved but not used system memory.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.GetTotalUnusedReservedMemoryLong\">\n      <summary>\n        <para>Unity allocates memory in pools for usage when unity needs to allocate memory. This function returns the amount of unused memory in these pools.</para>\n      </summary>\n      <returns>\n        <para>The amount of unused memory in the reserved pools. This returns 0 if the Profiler is not available.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Profiler.SetTempAllocatorRequestedSize(System.UInt32)\">\n      <summary>\n        <para>Sets the size of the temp allocator.</para>\n      </summary>\n      <param name=\"size\">Size in bytes.</param>\n      <returns>\n        <para>Returns true if requested size was successfully set. Will return false if value is disallowed (too small).</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Profiling.Recorder\">\n      <summary>\n        <para>Records profiling data produced by a specific Sampler.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Profiling.Recorder.elapsedNanoseconds\">\n      <summary>\n        <para>Accumulated time of Begin/End pairs for the previous frame in nanoseconds. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Profiling.Recorder.enabled\">\n      <summary>\n        <para>Enables recording.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Profiling.Recorder.isValid\">\n      <summary>\n        <para>Returns true if Recorder is valid and can collect data. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Profiling.Recorder.sampleBlockCount\">\n      <summary>\n        <para>Number of time Begin/End pairs was called during the previous frame. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Recorder.Get(System.String)\">\n      <summary>\n        <para>Use this function to get a Recorder for the specific Profiler label.</para>\n      </summary>\n      <param name=\"samplerName\">Sampler name.</param>\n      <returns>\n        <para>Recorder object for the specified Sampler.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Profiling.Sampler\">\n      <summary>\n        <para>Provides control over a CPU Profiler label.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Profiling.Sampler.isValid\">\n      <summary>\n        <para>Returns true if Sampler is valid. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Profiling.Sampler.name\">\n      <summary>\n        <para>Sampler name. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Sampler.Get(System.String)\">\n      <summary>\n        <para>Returns Sampler object for the specific CPU Profiler label.</para>\n      </summary>\n      <param name=\"name\">Profiler Sampler name.</param>\n      <returns>\n        <para>Sampler object which represents specific profiler label.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Sampler.GetNames(System.Collections.Generic.List`1&lt;System.String&gt;)\">\n      <summary>\n        <para>Returns number and names of all registered Profiler labels.</para>\n      </summary>\n      <param name=\"names\">Preallocated list the Sampler names are written to. Or null if you want to get number of Samplers only.</param>\n      <returns>\n        <para>Number of active Samplers.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Profiling.Sampler.GetRecorder\">\n      <summary>\n        <para>Returns Recorder associated with the Sampler.</para>\n      </summary>\n      <returns>\n        <para>Recorder object associated with the Sampler.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Projector\">\n      <summary>\n        <para>A script interface for a.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Projector.aspectRatio\">\n      <summary>\n        <para>The aspect ratio of the projection.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Projector.farClipPlane\">\n      <summary>\n        <para>The far clipping plane distance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Projector.fieldOfView\">\n      <summary>\n        <para>The field of view of the projection in degrees.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Projector.ignoreLayers\">\n      <summary>\n        <para>Which object layers are ignored by the projector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Projector.material\">\n      <summary>\n        <para>The material that will be projected onto every object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Projector.nearClipPlane\">\n      <summary>\n        <para>The near clipping plane distance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Projector.orthographic\">\n      <summary>\n        <para>Is the projection orthographic (true) or perspective (false)?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Projector.orthographicSize\">\n      <summary>\n        <para>Projection's half-size when in orthographic mode.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.PropertyAttribute\">\n      <summary>\n        <para>Base class to derive custom property attributes from. Use this to create custom attributes for script variables.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.PropertyAttribute.order\">\n      <summary>\n        <para>Optional field to specify the order that multiple DecorationDrawers should be drawn in.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.PropertyName\">\n      <summary>\n        <para>Represents a string as an int for efficient lookup and comparison. Use this for common PropertyNames.\n\nInternally stores just an int to represent the string. A PropertyName can be created from a string but can not be converted back to a string. The same string always results in the same int representing that string. Thus this is a very efficient string representation in both memory and speed when all you need is comparison.\n\nPropertyName is serializable.\n\nToString() is only implemented for debugging purposes in the editor it returns \"theName:3737\" in the player it returns \"Unknown:3737\".</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.PropertyName.#ctor(System.String)\">\n      <summary>\n        <para>Initializes the PropertyName using a string.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.PropertyName.Equals(System.Object)\">\n      <summary>\n        <para>Determines whether this instance and a specified object, which must also be a PropertyName object, have the same value.</para>\n      </summary>\n      <param name=\"other\"></param>\n    </member>\n    <member name=\"M:UnityEngine.PropertyName.GetHashCode\">\n      <summary>\n        <para>Returns the hash code for this PropertyName.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.PropertyName.implop_PropertyName(string)(System.String)\">\n      <summary>\n        <para>Converts the string passed into a PropertyName. See Also: PropertyName.ctor(System.String).</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.PropertyName.IsNullOrEmpty(UnityEngine.PropertyName)\">\n      <summary>\n        <para>Indicates whether the specified PropertyName is an Empty string.</para>\n      </summary>\n      <param name=\"prop\"></param>\n    </member>\n    <member name=\"?:UnityEngine.PropertyName.op_Equal(UnityEngine.PropertyName,UnityEngine.PropertyName)\">\n      <summary>\n        <para>Determines whether two specified PropertyName have the same string value. Because two PropertyNames initialized with the same string value always have the same name index, we can simply perform a comparison of two ints to find out if the string value equals.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"?:UnityEngine.PropertyName.op_NotEqual(UnityEngine.PropertyName,UnityEngine.PropertyName)\">\n      <summary>\n        <para>Determines whether two specified PropertyName have a different string value.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"M:UnityEngine.PropertyName.ToString\">\n      <summary>\n        <para>For debugging purposes only. Returns the string value representing the string in the Editor.\nReturns \"UnityEngine.PropertyName\" in the player.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.QualitySettings\">\n      <summary>\n        <para>Script interface for.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.activeColorSpace\">\n      <summary>\n        <para>Active color space (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.anisotropicFiltering\">\n      <summary>\n        <para>Global anisotropic filtering mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.antiAliasing\">\n      <summary>\n        <para>Set The AA Filtering option.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.asyncUploadBufferSize\">\n      <summary>\n        <para>Async texture upload provides timesliced async texture upload on the render thread with tight control over memory and timeslicing. There are no allocations except for the ones which driver has to do. To read data and upload texture data a ringbuffer whose size can be controlled is re-used.\n\nUse asyncUploadBufferSize to set the buffer size for asynchronous texture uploads. The size is in megabytes. Minimum value is 2 and maximum is 512. Although the buffer will resize automatically to fit the largest texture currently loading, it is recommended to set the value approximately to the size of biggest texture used in the scene to avoid re-sizing of the buffer which can incur performance cost.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.asyncUploadTimeSlice\">\n      <summary>\n        <para>Async texture upload provides timesliced async texture upload on the render thread with tight control over memory and timeslicing. There are no allocations except for the ones which driver has to do. To read data and upload texture data a ringbuffer whose size can be controlled is re-used.\n\nUse asyncUploadTimeSlice to set the time-slice in milliseconds for asynchronous texture uploads per\nframe. Minimum value is 1 and maximum is 33.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.billboardsFaceCameraPosition\">\n      <summary>\n        <para>If enabled, billboards will face towards camera position rather than camera orientation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.blendWeights\">\n      <summary>\n        <para>Blend weights.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.desiredColorSpace\">\n      <summary>\n        <para>Desired color space (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.lodBias\">\n      <summary>\n        <para>Global multiplier for the LOD's switching distance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.masterTextureLimit\">\n      <summary>\n        <para>A texture size limit applied to all textures.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.maximumLODLevel\">\n      <summary>\n        <para>A maximum LOD level. All LOD groups.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.maxQueuedFrames\">\n      <summary>\n        <para>Maximum number of frames queued up by graphics driver.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.names\">\n      <summary>\n        <para>The indexed list of available Quality Settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.particleRaycastBudget\">\n      <summary>\n        <para>Budget for how many ray casts can be performed per frame for approximate collision testing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.pixelLightCount\">\n      <summary>\n        <para>The maximum number of pixel lights that should affect any object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.realtimeReflectionProbes\">\n      <summary>\n        <para>Enables realtime reflection probes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.resolutionScalingFixedDPIFactor\">\n      <summary>\n        <para>In resolution scaling mode, this factor is used to multiply with the target Fixed DPI specified to get the actual Fixed DPI to use for this quality setting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.shadowCascade2Split\">\n      <summary>\n        <para>The normalized cascade distribution for a 2 cascade setup. The value defines the position of the cascade with respect to Zero.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.shadowCascade4Split\">\n      <summary>\n        <para>The normalized cascade start position for a 4 cascade setup. Each member of the vector defines the normalized position of the coresponding cascade with respect to Zero.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.shadowCascades\">\n      <summary>\n        <para>Number of cascades to use for directional light shadows.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.shadowDistance\">\n      <summary>\n        <para>Shadow drawing distance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.shadowmaskMode\">\n      <summary>\n        <para>The rendering mode of Shadowmask.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.shadowNearPlaneOffset\">\n      <summary>\n        <para>Offset shadow frustum near plane.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.shadowProjection\">\n      <summary>\n        <para>Directional light shadow projection.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.shadowResolution\">\n      <summary>\n        <para>The default resolution of the shadow maps.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.shadows\">\n      <summary>\n        <para>Realtime Shadows type to be used.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.softParticles\">\n      <summary>\n        <para>Should soft blending be used for particles?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.softVegetation\">\n      <summary>\n        <para>Use a two-pass shader for the vegetation in the terrain engine.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.streamingMipmapsActive\">\n      <summary>\n        <para>Enable automatic streaming of texture mipmap levels based on their distance from all active cameras.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.streamingMipmapsAddAllCameras\">\n      <summary>\n        <para>Process all enabled Cameras for texture streaming (rather than just those with StreamingController components).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.streamingMipmapsMaxFileIORequests\">\n      <summary>\n        <para>The maximum number of active texture file IO requests from the texture streaming system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.streamingMipmapsMaxLevelReduction\">\n      <summary>\n        <para>The maximum number of mipmap levels to discard for each texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.streamingMipmapsMemoryBudget\">\n      <summary>\n        <para>The total amount of memory to be used by streaming and non-streaming textures.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.streamingMipmapsRenderersPerFrame\">\n      <summary>\n        <para>Number of renderers used to process each frame during the calculation of desired mipmap levels for the associated textures.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.QualitySettings.vSyncCount\">\n      <summary>\n        <para>The VSync Count.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.QualitySettings.DecreaseLevel(System.Boolean)\">\n      <summary>\n        <para>Decrease the current quality level.</para>\n      </summary>\n      <param name=\"applyExpensiveChanges\">Should expensive changes be applied (Anti-aliasing etc).</param>\n    </member>\n    <member name=\"M:UnityEngine.QualitySettings.GetQualityLevel\">\n      <summary>\n        <para>Returns the current graphics quality level.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.QualitySettings.IncreaseLevel(System.Boolean)\">\n      <summary>\n        <para>Increase the current quality level.</para>\n      </summary>\n      <param name=\"applyExpensiveChanges\">Should expensive changes be applied (Anti-aliasing etc).</param>\n    </member>\n    <member name=\"M:UnityEngine.QualitySettings.SetQualityLevel(System.Int32,System.Boolean)\">\n      <summary>\n        <para>Sets a new graphics quality level.</para>\n      </summary>\n      <param name=\"index\">Quality index to set.</param>\n      <param name=\"applyExpensiveChanges\">Should expensive changes be applied (Anti-aliasing etc).</param>\n    </member>\n    <member name=\"T:UnityEngine.Quaternion\">\n      <summary>\n        <para>Quaternions are used to represent rotations.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Quaternion.eulerAngles\">\n      <summary>\n        <para>Returns the euler angle representation of the rotation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Quaternion.identity\">\n      <summary>\n        <para>The identity rotation (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Quaternion.normalized\">\n      <summary>\n        <para>Returns this quaternion with a magnitude of 1 (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Quaternion.w\">\n      <summary>\n        <para>W component of the Quaternion. Don't modify this directly unless you know quaternions inside out.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Quaternion.x\">\n      <summary>\n        <para>X component of the Quaternion. Don't modify this directly unless you know quaternions inside out.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Quaternion.y\">\n      <summary>\n        <para>Y component of the Quaternion. Don't modify this directly unless you know quaternions inside out.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Quaternion.z\">\n      <summary>\n        <para>Z component of the Quaternion. Don't modify this directly unless you know quaternions inside out.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.Angle(UnityEngine.Quaternion,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Returns the angle in degrees between two rotations a and b.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.AngleAxis(System.Single,UnityEngine.Vector3)\">\n      <summary>\n        <para>Creates a rotation which rotates angle degrees around axis.</para>\n      </summary>\n      <param name=\"angle\"></param>\n      <param name=\"axis\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.#ctor(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Constructs new Quaternion with given x,y,z,w components.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"z\"></param>\n      <param name=\"w\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.Dot(UnityEngine.Quaternion,UnityEngine.Quaternion)\">\n      <summary>\n        <para>The dot product between two rotations.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.Euler(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Returns a rotation that rotates z degrees around the z axis, x degrees around the x axis, and y degrees around the y axis.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"z\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.Euler(UnityEngine.Vector3)\">\n      <summary>\n        <para>Returns a rotation that rotates z degrees around the z axis, x degrees around the x axis, and y degrees around the y axis.</para>\n      </summary>\n      <param name=\"euler\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.FromToRotation(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Creates a rotation which rotates from fromDirection to toDirection.</para>\n      </summary>\n      <param name=\"fromDirection\"></param>\n      <param name=\"toDirection\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.Inverse(UnityEngine.Quaternion)\">\n      <summary>\n        <para>Returns the Inverse of rotation.</para>\n      </summary>\n      <param name=\"rotation\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.Lerp(UnityEngine.Quaternion,UnityEngine.Quaternion,System.Single)\">\n      <summary>\n        <para>Interpolates between a and b by t and normalizes the result afterwards. The parameter t is clamped to the range [0, 1].</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.LerpUnclamped(UnityEngine.Quaternion,UnityEngine.Quaternion,System.Single)\">\n      <summary>\n        <para>Interpolates between a and b by t and normalizes the result afterwards. The parameter t is not clamped.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.LookRotation(UnityEngine.Vector3)\">\n      <summary>\n        <para>Creates a rotation with the specified forward and upwards directions.</para>\n      </summary>\n      <param name=\"forward\">The direction to look in.</param>\n      <param name=\"upwards\">The vector that defines in which direction up is.</param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.LookRotation(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Creates a rotation with the specified forward and upwards directions.</para>\n      </summary>\n      <param name=\"forward\">The direction to look in.</param>\n      <param name=\"upwards\">The vector that defines in which direction up is.</param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.Normalize(UnityEngine.Quaternion)\">\n      <summary>\n        <para>Converts this quaternion to one with the same orientation but with a magnitude of 1.</para>\n      </summary>\n      <param name=\"q\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Quaternion.op_Equal(UnityEngine.Quaternion,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Are two quaternions equal to each other?</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Quaternion.op_Multiply(UnityEngine.Quaternion,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Combines rotations lhs and rhs.</para>\n      </summary>\n      <param name=\"lhs\">Left-hand side quaternion.</param>\n      <param name=\"rhs\">Right-hand side quaternion.</param>\n    </member>\n    <member name=\"?:UnityEngine.Quaternion.op_Multiply(UnityEngine.Quaternion,UnityEngine.Vector3)\">\n      <summary>\n        <para>Rotates the point point with rotation.</para>\n      </summary>\n      <param name=\"rotation\"></param>\n      <param name=\"point\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.RotateTowards(UnityEngine.Quaternion,UnityEngine.Quaternion,System.Single)\">\n      <summary>\n        <para>Rotates a rotation from towards to.</para>\n      </summary>\n      <param name=\"from\"></param>\n      <param name=\"to\"></param>\n      <param name=\"maxDegreesDelta\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.Set(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Set x, y, z and w components of an existing Quaternion.</para>\n      </summary>\n      <param name=\"newX\"></param>\n      <param name=\"newY\"></param>\n      <param name=\"newZ\"></param>\n      <param name=\"newW\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.SetFromToRotation(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Creates a rotation which rotates from fromDirection to toDirection.</para>\n      </summary>\n      <param name=\"fromDirection\"></param>\n      <param name=\"toDirection\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.SetLookRotation(UnityEngine.Vector3)\">\n      <summary>\n        <para>Creates a rotation with the specified forward and upwards directions.</para>\n      </summary>\n      <param name=\"view\">The direction to look in.</param>\n      <param name=\"up\">The vector that defines in which direction up is.</param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.SetLookRotation(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Creates a rotation with the specified forward and upwards directions.</para>\n      </summary>\n      <param name=\"view\">The direction to look in.</param>\n      <param name=\"up\">The vector that defines in which direction up is.</param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.Slerp(UnityEngine.Quaternion,UnityEngine.Quaternion,System.Single)\">\n      <summary>\n        <para>Spherically interpolates between a and b by t. The parameter t is clamped to the range [0, 1].</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.SlerpUnclamped(UnityEngine.Quaternion,UnityEngine.Quaternion,System.Single)\">\n      <summary>\n        <para>Spherically interpolates between a and b by t. The parameter t is not clamped.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Quaternion.this\">\n      <summary>\n        <para>Access the x, y, z, w components using [0], [1], [2], [3] respectively.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.ToAngleAxis(System.Single&amp;,UnityEngine.Vector3&amp;)\">\n      <summary>\n        <para>Converts a rotation to angle-axis representation (angles in degrees).</para>\n      </summary>\n      <param name=\"angle\"></param>\n      <param name=\"axis\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.ToString\">\n      <summary>\n        <para>Returns a nicely formatted string of the Quaternion.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Quaternion.ToString(System.String)\">\n      <summary>\n        <para>Returns a nicely formatted string of the Quaternion.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"T:UnityEngine.QueryTriggerInteraction\">\n      <summary>\n        <para>Overrides the global Physics.queriesHitTriggers.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.QueryTriggerInteraction.Collide\">\n      <summary>\n        <para>Queries always report Trigger hits.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.QueryTriggerInteraction.Ignore\">\n      <summary>\n        <para>Queries never report Trigger hits.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.QueryTriggerInteraction.UseGlobal\">\n      <summary>\n        <para>Queries use the global Physics.queriesHitTriggers setting.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.QueueMode\">\n      <summary>\n        <para>Used by Animation.Play function.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.QueueMode.CompleteOthers\">\n      <summary>\n        <para>Will start playing after all other animations have stopped playing.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.QueueMode.PlayNow\">\n      <summary>\n        <para>Starts playing immediately. This can be used if you just want to quickly create a duplicate animation.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Random\">\n      <summary>\n        <para>Class for generating random data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Random.insideUnitCircle\">\n      <summary>\n        <para>Returns a random point inside a circle with radius 1 (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Random.insideUnitSphere\">\n      <summary>\n        <para>Returns a random point inside a sphere with radius 1 (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Random.onUnitSphere\">\n      <summary>\n        <para>Returns a random point on the surface of a sphere with radius 1 (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Random.rotation\">\n      <summary>\n        <para>Returns a random rotation (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Random.rotationUniform\">\n      <summary>\n        <para>Returns a random rotation with uniform distribution (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Random.state\">\n      <summary>\n        <para>Gets/Sets the full internal state of the random number generator.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Random.value\">\n      <summary>\n        <para>Returns a random number between 0.0 [inclusive] and 1.0 [inclusive] (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Random.ColorHSV\">\n      <summary>\n        <para>Generates a random color from HSV and alpha ranges.</para>\n      </summary>\n      <param name=\"hueMin\">Minimum hue [0..1].</param>\n      <param name=\"hueMax\">Maximum hue [0..1].</param>\n      <param name=\"saturationMin\">Minimum saturation [0..1].</param>\n      <param name=\"saturationMax\">Maximum saturation[0..1].</param>\n      <param name=\"valueMin\">Minimum value [0..1].</param>\n      <param name=\"valueMax\">Maximum value [0..1].</param>\n      <param name=\"alphaMin\">Minimum alpha [0..1].</param>\n      <param name=\"alphaMax\">Maximum alpha [0..1].</param>\n      <returns>\n        <para>A random color with HSV and alpha values in the input ranges.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Random.ColorHSV(System.Single,System.Single)\">\n      <summary>\n        <para>Generates a random color from HSV and alpha ranges.</para>\n      </summary>\n      <param name=\"hueMin\">Minimum hue [0..1].</param>\n      <param name=\"hueMax\">Maximum hue [0..1].</param>\n      <param name=\"saturationMin\">Minimum saturation [0..1].</param>\n      <param name=\"saturationMax\">Maximum saturation[0..1].</param>\n      <param name=\"valueMin\">Minimum value [0..1].</param>\n      <param name=\"valueMax\">Maximum value [0..1].</param>\n      <param name=\"alphaMin\">Minimum alpha [0..1].</param>\n      <param name=\"alphaMax\">Maximum alpha [0..1].</param>\n      <returns>\n        <para>A random color with HSV and alpha values in the input ranges.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Random.ColorHSV(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Generates a random color from HSV and alpha ranges.</para>\n      </summary>\n      <param name=\"hueMin\">Minimum hue [0..1].</param>\n      <param name=\"hueMax\">Maximum hue [0..1].</param>\n      <param name=\"saturationMin\">Minimum saturation [0..1].</param>\n      <param name=\"saturationMax\">Maximum saturation[0..1].</param>\n      <param name=\"valueMin\">Minimum value [0..1].</param>\n      <param name=\"valueMax\">Maximum value [0..1].</param>\n      <param name=\"alphaMin\">Minimum alpha [0..1].</param>\n      <param name=\"alphaMax\">Maximum alpha [0..1].</param>\n      <returns>\n        <para>A random color with HSV and alpha values in the input ranges.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Random.ColorHSV(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Generates a random color from HSV and alpha ranges.</para>\n      </summary>\n      <param name=\"hueMin\">Minimum hue [0..1].</param>\n      <param name=\"hueMax\">Maximum hue [0..1].</param>\n      <param name=\"saturationMin\">Minimum saturation [0..1].</param>\n      <param name=\"saturationMax\">Maximum saturation[0..1].</param>\n      <param name=\"valueMin\">Minimum value [0..1].</param>\n      <param name=\"valueMax\">Maximum value [0..1].</param>\n      <param name=\"alphaMin\">Minimum alpha [0..1].</param>\n      <param name=\"alphaMax\">Maximum alpha [0..1].</param>\n      <returns>\n        <para>A random color with HSV and alpha values in the input ranges.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Random.ColorHSV(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Generates a random color from HSV and alpha ranges.</para>\n      </summary>\n      <param name=\"hueMin\">Minimum hue [0..1].</param>\n      <param name=\"hueMax\">Maximum hue [0..1].</param>\n      <param name=\"saturationMin\">Minimum saturation [0..1].</param>\n      <param name=\"saturationMax\">Maximum saturation[0..1].</param>\n      <param name=\"valueMin\">Minimum value [0..1].</param>\n      <param name=\"valueMax\">Maximum value [0..1].</param>\n      <param name=\"alphaMin\">Minimum alpha [0..1].</param>\n      <param name=\"alphaMax\">Maximum alpha [0..1].</param>\n      <returns>\n        <para>A random color with HSV and alpha values in the input ranges.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Random.InitState(System.Int32)\">\n      <summary>\n        <para>Initializes the random number generator state with a seed.</para>\n      </summary>\n      <param name=\"seed\">Seed used to initialize the random number generator.</param>\n    </member>\n    <member name=\"M:UnityEngine.Random.Range(System.Single,System.Single)\">\n      <summary>\n        <para>Returns a random float number between and min [inclusive] and max [inclusive] (Read Only).</para>\n      </summary>\n      <param name=\"min\"></param>\n      <param name=\"max\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Random.Range(System.Int32,System.Int32)\">\n      <summary>\n        <para>Returns a random integer number between min [inclusive] and max [exclusive] (Read Only).</para>\n      </summary>\n      <param name=\"min\"></param>\n      <param name=\"max\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Random.State\">\n      <summary>\n        <para>Serializable structure used to hold the full internal state of the random number generator. See Also: Random.state.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RangeAttribute\">\n      <summary>\n        <para>Attribute used to make a float or int variable in a script be restricted to a specific range.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RangeAttribute.#ctor(System.Single,System.Single)\">\n      <summary>\n        <para>Attribute used to make a float or int variable in a script be restricted to a specific range.</para>\n      </summary>\n      <param name=\"min\">The minimum allowed value.</param>\n      <param name=\"max\">The maximum allowed value.</param>\n    </member>\n    <member name=\"T:UnityEngine.RangeInt\">\n      <summary>\n        <para>Describes an integer range.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RangeInt.end\">\n      <summary>\n        <para>The end index of the range (not inclusive).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RangeInt.length\">\n      <summary>\n        <para>The length of the range.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RangeInt.start\">\n      <summary>\n        <para>The starting index of the range, where 0 is the first position, 1 is the second, 2 is the third, and so on.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RangeInt.#ctor(System.Int32,System.Int32)\">\n      <summary>\n        <para>Constructs a new RangeInt with given start, length values.</para>\n      </summary>\n      <param name=\"start\">The starting index of the range.</param>\n      <param name=\"length\">The length of the range.</param>\n    </member>\n    <member name=\"T:UnityEngine.Ray\">\n      <summary>\n        <para>Representation of rays.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Ray.direction\">\n      <summary>\n        <para>The direction of the ray.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Ray.origin\">\n      <summary>\n        <para>The origin point of the ray.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Ray.#ctor(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Creates a ray starting at origin along direction.</para>\n      </summary>\n      <param name=\"origin\"></param>\n      <param name=\"direction\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Ray.GetPoint(System.Single)\">\n      <summary>\n        <para>Returns a point at distance units along the ray.</para>\n      </summary>\n      <param name=\"distance\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Ray.ToString\">\n      <summary>\n        <para>Returns a nicely formatted string for this ray.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Ray.ToString(System.String)\">\n      <summary>\n        <para>Returns a nicely formatted string for this ray.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Ray2D\">\n      <summary>\n        <para>A ray in 2D space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Ray2D.direction\">\n      <summary>\n        <para>The direction of the ray in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Ray2D.origin\">\n      <summary>\n        <para>The starting point of the ray in world space.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Ray2D.#ctor(UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Creates a 2D ray starting at origin along direction.</para>\n      </summary>\n      <param name=\"Vector2\">origin</param>\n      <param name=\"Vector2\">direction</param>\n      <param name=\"origin\"></param>\n      <param name=\"direction\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Ray2D.GetPoint(System.Single)\">\n      <summary>\n        <para>Get a point that lies a given distance along a ray.</para>\n      </summary>\n      <param name=\"distance\">Distance of the desired point along the path of the ray.</param>\n    </member>\n    <member name=\"T:UnityEngine.RaycastCommand\">\n      <summary>\n        <para>Struct used to set up a raycast command to be performed asynchronously during a job.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RaycastCommand.direction\">\n      <summary>\n        <para>The direction of the ray.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastCommand.distance\">\n      <summary>\n        <para>The maximum distance the ray should check for collisions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RaycastCommand.from\">\n      <summary>\n        <para>The starting point of the ray in world coordinates.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastCommand.layerMask\">\n      <summary>\n        <para>A LayerMask that is used to selectively ignore Colliders when casting a ray.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastCommand.maxHits\">\n      <summary>\n        <para>The maximum number of Colliders the ray can hit.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RaycastCommand.#ctor(UnityEngine.Vector3,UnityEngine.Vector3,System.Single,System.Int32,System.Int32)\">\n      <summary>\n        <para>Create a RaycastCommand.</para>\n      </summary>\n      <param name=\"from\">The starting point of the ray in world coordinates.</param>\n      <param name=\"direction\">The direction of the ray.</param>\n      <param name=\"distance\">The maximum distance the ray should check for collisions.</param>\n      <param name=\"layerMask\">A LayerMask that is used to selectively ignore Colliders when casting a ray.</param>\n      <param name=\"maxHits\">The maximum number of Colliders the ray can hit.</param>\n    </member>\n    <member name=\"M:UnityEngine.RaycastCommand.ScheduleBatch(Unity.Collections.NativeArray`1&lt;UnityEngine.RaycastCommand&gt;,Unity.Collections.NativeArray`1&lt;UnityEngine.RaycastHit&gt;,System.Int32,Unity.Jobs.JobHandle)\">\n      <summary>\n        <para>Schedule a batch of raycasts which are performed in a job.</para>\n      </summary>\n      <param name=\"commands\">A NativeArray of the RaycastCommands to perform.</param>\n      <param name=\"commands\">A NativeArray of the RaycastHits where the results of the commands are stored.</param>\n      <param name=\"minCommandsPerJob\">The minimum number of jobs which should be performed in a single job.</param>\n      <param name=\"dependsOn\">A JobHandle of a job which must be completed before the raycast starts.</param>\n      <param name=\"results\"></param>\n      <returns>\n        <para>The JobHandle of the job which will perform the raycasts.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.RaycastHit\">\n      <summary>\n        <para>Structure used to get information back from a raycast.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit.barycentricCoordinate\">\n      <summary>\n        <para>The barycentric coordinate of the triangle we hit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit.collider\">\n      <summary>\n        <para>The Collider that was hit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit.distance\">\n      <summary>\n        <para>The distance from the ray's origin to the impact point.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit.lightmapCoord\">\n      <summary>\n        <para>The uv lightmap coordinate at the impact point.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit.normal\">\n      <summary>\n        <para>The normal of the surface the ray hit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit.point\">\n      <summary>\n        <para>The impact point in world space where the ray hit the collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit.rigidbody\">\n      <summary>\n        <para>The Rigidbody of the collider that was hit. If the collider is not attached to a rigidbody then it is null.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit.textureCoord\">\n      <summary>\n        <para>The uv texture coordinate at the collision location.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit.textureCoord2\">\n      <summary>\n        <para>The secondary uv texture coordinate at the impact point.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit.transform\">\n      <summary>\n        <para>The Transform of the rigidbody or collider that was hit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit.triangleIndex\">\n      <summary>\n        <para>The index of the triangle that was hit.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RaycastHit2D\">\n      <summary>\n        <para>Information returned about an object detected by a raycast in 2D physics.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit2D.centroid\">\n      <summary>\n        <para>The centroid of the primitive used to perform the cast.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit2D.collider\">\n      <summary>\n        <para>The collider hit by the ray.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit2D.distance\">\n      <summary>\n        <para>The distance from the ray origin to the impact point.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit2D.fraction\">\n      <summary>\n        <para>Fraction of the distance along the ray that the hit occurred.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit2D.normal\">\n      <summary>\n        <para>The normal vector of the surface hit by the ray.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit2D.point\">\n      <summary>\n        <para>The point in world space where the ray hit the collider's surface.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit2D.rigidbody\">\n      <summary>\n        <para>The Rigidbody2D attached to the object that was hit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RaycastHit2D.transform\">\n      <summary>\n        <para>The Transform of the object that was hit.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rect\">\n      <summary>\n        <para>A 2D Rectangle defined by X and Y position, width and height.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rect.center\">\n      <summary>\n        <para>The position of the center of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rect.height\">\n      <summary>\n        <para>The height of the rectangle, measured from the Y position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rect.max\">\n      <summary>\n        <para>The position of the maximum corner of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rect.min\">\n      <summary>\n        <para>The position of the minimum corner of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rect.position\">\n      <summary>\n        <para>The X and Y position of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rect.size\">\n      <summary>\n        <para>The width and height of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rect.width\">\n      <summary>\n        <para>The width of the rectangle, measured from the X position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rect.x\">\n      <summary>\n        <para>The X coordinate of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rect.xMax\">\n      <summary>\n        <para>The maximum X coordinate of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rect.xMin\">\n      <summary>\n        <para>The minimum X coordinate of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rect.y\">\n      <summary>\n        <para>The Y coordinate of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rect.yMax\">\n      <summary>\n        <para>The maximum Y coordinate of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rect.yMin\">\n      <summary>\n        <para>The minimum Y coordinate of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rect.zero\">\n      <summary>\n        <para>Shorthand for writing new Rect(0,0,0,0).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rect.Contains(UnityEngine.Vector2)\">\n      <summary>\n        <para>Returns true if the x and y components of point is a point inside this rectangle. If allowInverse is present and true, the width and height of the Rect are allowed to take negative values (ie, the min value is greater than the max), and the test will still work.</para>\n      </summary>\n      <param name=\"point\">Point to test.</param>\n      <param name=\"allowInverse\">Does the test allow the Rect's width and height to be negative?</param>\n      <returns>\n        <para>True if the point lies within the specified rectangle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rect.Contains(UnityEngine.Vector3)\">\n      <summary>\n        <para>Returns true if the x and y components of point is a point inside this rectangle. If allowInverse is present and true, the width and height of the Rect are allowed to take negative values (ie, the min value is greater than the max), and the test will still work.</para>\n      </summary>\n      <param name=\"point\">Point to test.</param>\n      <param name=\"allowInverse\">Does the test allow the Rect's width and height to be negative?</param>\n      <returns>\n        <para>True if the point lies within the specified rectangle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rect.Contains(UnityEngine.Vector3,System.Boolean)\">\n      <summary>\n        <para>Returns true if the x and y components of point is a point inside this rectangle. If allowInverse is present and true, the width and height of the Rect are allowed to take negative values (ie, the min value is greater than the max), and the test will still work.</para>\n      </summary>\n      <param name=\"point\">Point to test.</param>\n      <param name=\"allowInverse\">Does the test allow the Rect's width and height to be negative?</param>\n      <returns>\n        <para>True if the point lies within the specified rectangle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rect.#ctor(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Creates a new rectangle.</para>\n      </summary>\n      <param name=\"x\">The X value the rect is measured from.</param>\n      <param name=\"y\">The Y value the rect is measured from.</param>\n      <param name=\"width\">The width of the rectangle.</param>\n      <param name=\"height\">The height of the rectangle.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rect.#ctor(UnityEngine.Rect)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"source\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rect.#ctor(UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Creates a rectangle given a size and position.</para>\n      </summary>\n      <param name=\"position\">The position of the minimum corner of the rect.</param>\n      <param name=\"size\">The width and height of the rect.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rect.MinMaxRect(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Creates a rectangle from min/max coordinate values.</para>\n      </summary>\n      <param name=\"xmin\">The minimum X coordinate.</param>\n      <param name=\"ymin\">The minimum Y coordinate.</param>\n      <param name=\"xmax\">The maximum X coordinate.</param>\n      <param name=\"ymax\">The maximum Y coordinate.</param>\n      <returns>\n        <para>A rectangle matching the specified coordinates.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rect.NormalizedToPoint(UnityEngine.Rect,UnityEngine.Vector2)\">\n      <summary>\n        <para>Returns a point inside a rectangle, given normalized coordinates.</para>\n      </summary>\n      <param name=\"rectangle\">Rectangle to get a point inside.</param>\n      <param name=\"normalizedRectCoordinates\">Normalized coordinates to get a point for.</param>\n    </member>\n    <member name=\"?:UnityEngine.Rect.op_Equal(UnityEngine.Rect,UnityEngine.Rect)\">\n      <summary>\n        <para>Returns true if the rectangles are the same.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rect.Overlaps(UnityEngine.Rect)\">\n      <summary>\n        <para>Returns true if the other rectangle overlaps this one. If allowInverse is present and true, the widths and heights of the Rects are allowed to take negative values (ie, the min value is greater than the max), and the test will still work.</para>\n      </summary>\n      <param name=\"other\">Other rectangle to test overlapping with.</param>\n      <param name=\"allowInverse\">Does the test allow the widths and heights of the Rects to be negative?</param>\n    </member>\n    <member name=\"M:UnityEngine.Rect.Overlaps(UnityEngine.Rect,System.Boolean)\">\n      <summary>\n        <para>Returns true if the other rectangle overlaps this one. If allowInverse is present and true, the widths and heights of the Rects are allowed to take negative values (ie, the min value is greater than the max), and the test will still work.</para>\n      </summary>\n      <param name=\"other\">Other rectangle to test overlapping with.</param>\n      <param name=\"allowInverse\">Does the test allow the widths and heights of the Rects to be negative?</param>\n    </member>\n    <member name=\"M:UnityEngine.Rect.PointToNormalized(UnityEngine.Rect,UnityEngine.Vector2)\">\n      <summary>\n        <para>Returns the normalized coordinates cooresponding the the point.</para>\n      </summary>\n      <param name=\"rectangle\">Rectangle to get normalized coordinates inside.</param>\n      <param name=\"point\">A point inside the rectangle to get normalized coordinates for.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rect.Set(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Set components of an existing Rect.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"width\"></param>\n      <param name=\"height\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rect.ToString\">\n      <summary>\n        <para>Returns a nicely formatted string for this Rect.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rect.ToString(System.String)\">\n      <summary>\n        <para>Returns a nicely formatted string for this Rect.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"T:UnityEngine.RectInt\">\n      <summary>\n        <para>A 2D Rectangle defined by x, y, width, height with integers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectInt.allPositionsWithin\">\n      <summary>\n        <para>A RectInt.PositionCollection that contains all positions within the RectInt.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectInt.center\">\n      <summary>\n        <para>Center coordinate of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectInt.height\">\n      <summary>\n        <para>Height of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectInt.max\">\n      <summary>\n        <para>Upper right corner of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectInt.min\">\n      <summary>\n        <para>Lower left corner of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectInt.position\">\n      <summary>\n        <para>Returns the position (x, y) of the RectInt.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectInt.size\">\n      <summary>\n        <para>Returns the width and height of the RectInt.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectInt.width\">\n      <summary>\n        <para>Width of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectInt.x\">\n      <summary>\n        <para>Left coordinate of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectInt.xMax\">\n      <summary>\n        <para>Returns the maximum X value of the RectInt.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectInt.xMin\">\n      <summary>\n        <para>Returns the minimum X value of the RectInt.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectInt.y\">\n      <summary>\n        <para>Top coordinate of the rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectInt.yMax\">\n      <summary>\n        <para>Returns the maximum Y value of the RectInt.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectInt.yMin\">\n      <summary>\n        <para>Returns the minimum Y value of the RectInt.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RectInt.ClampToBounds(UnityEngine.RectInt)\">\n      <summary>\n        <para>Clamps the position and size of the RectInt to the given bounds.</para>\n      </summary>\n      <param name=\"bounds\">Bounds to clamp the RectInt.</param>\n    </member>\n    <member name=\"M:UnityEngine.RectInt.Contains(UnityEngine.Vector2Int)\">\n      <summary>\n        <para>Returns true if the given position is within the RectInt.</para>\n      </summary>\n      <param name=\"position\">Position to check.</param>\n      <param name=\"inclusive\">Whether the max limits are included in the check.</param>\n      <returns>\n        <para>Whether the position is within the RectInt.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.RectInt.Contains\">\n      <summary>\n        <para>Returns true if the given position is within the RectInt.</para>\n      </summary>\n      <param name=\"position\">Position to check.</param>\n      <param name=\"inclusive\">Whether the max limits are included in the check.</param>\n      <returns>\n        <para>Whether the position is within the RectInt.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.RectInt.PositionEnumerator\">\n      <summary>\n        <para>An iterator that allows you to iterate over all positions within the RectInt.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectInt.PositionEnumerator.Current\">\n      <summary>\n        <para>Current position of the enumerator.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RectInt.PositionEnumerator.GetEnumerator\">\n      <summary>\n        <para>Returns this as an iterator that allows you to iterate over all positions within the RectInt.</para>\n      </summary>\n      <returns>\n        <para>This RectInt.PositionEnumerator.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.RectInt.PositionEnumerator.MoveNext\">\n      <summary>\n        <para>Moves the enumerator to the next position.</para>\n      </summary>\n      <returns>\n        <para>Whether the enumerator has successfully moved to the next position.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.RectInt.PositionEnumerator.Reset\">\n      <summary>\n        <para>Resets this enumerator to its starting state.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RectInt.SetMinMax(UnityEngine.Vector2Int,UnityEngine.Vector2Int)\">\n      <summary>\n        <para>Sets the bounds to the min and max value of the rect.</para>\n      </summary>\n      <param name=\"minPosition\"></param>\n      <param name=\"maxPosition\"></param>\n    </member>\n    <member name=\"M:UnityEngine.RectInt.ToString\">\n      <summary>\n        <para>Returns the x, y, width and height of the RectInt.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RectOffset\">\n      <summary>\n        <para>Offsets for rectangles, borders, etc.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectOffset.bottom\">\n      <summary>\n        <para>Bottom edge size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectOffset.horizontal\">\n      <summary>\n        <para>Shortcut for left + right. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectOffset.left\">\n      <summary>\n        <para>Left edge size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectOffset.right\">\n      <summary>\n        <para>Right edge size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectOffset.top\">\n      <summary>\n        <para>Top edge size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectOffset.vertical\">\n      <summary>\n        <para>Shortcut for top + bottom. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RectOffset.Add(UnityEngine.Rect)\">\n      <summary>\n        <para>Add the border offsets to a rect.</para>\n      </summary>\n      <param name=\"rect\"></param>\n    </member>\n    <member name=\"M:UnityEngine.RectOffset.#ctor\">\n      <summary>\n        <para>Creates a new rectangle with offsets.</para>\n      </summary>\n      <param name=\"left\"></param>\n      <param name=\"right\"></param>\n      <param name=\"top\"></param>\n      <param name=\"bottom\"></param>\n    </member>\n    <member name=\"M:UnityEngine.RectOffset.#ctor(System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Creates a new rectangle with offsets.</para>\n      </summary>\n      <param name=\"left\"></param>\n      <param name=\"right\"></param>\n      <param name=\"top\"></param>\n      <param name=\"bottom\"></param>\n    </member>\n    <member name=\"M:UnityEngine.RectOffset.Remove(UnityEngine.Rect)\">\n      <summary>\n        <para>Remove the border offsets from a rect.</para>\n      </summary>\n      <param name=\"rect\"></param>\n    </member>\n    <member name=\"T:UnityEngine.RectTransform\">\n      <summary>\n        <para>Position, size, anchor and pivot information for a rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectTransform.anchoredPosition\">\n      <summary>\n        <para>The position of the pivot of this RectTransform relative to the anchor reference point.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectTransform.anchoredPosition3D\">\n      <summary>\n        <para>The 3D position of the pivot of this RectTransform relative to the anchor reference point.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectTransform.anchorMax\">\n      <summary>\n        <para>The normalized position in the parent RectTransform that the upper right corner is anchored to.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectTransform.anchorMin\">\n      <summary>\n        <para>The normalized position in the parent RectTransform that the lower left corner is anchored to.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectTransform.offsetMax\">\n      <summary>\n        <para>The offset of the upper right corner of the rectangle relative to the upper right anchor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectTransform.offsetMin\">\n      <summary>\n        <para>The offset of the lower left corner of the rectangle relative to the lower left anchor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectTransform.pivot\">\n      <summary>\n        <para>The normalized position in this RectTransform that it rotates around.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.RectTransform.reapplyDrivenProperties(UnityEngine.RectTransform/ReapplyDrivenProperties)\">\n      <summary>\n        <para>Event that is invoked for RectTransforms that need to have their driven properties reapplied.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.RectTransform.rect\">\n      <summary>\n        <para>The calculated rectangle in the local space of the Transform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RectTransform.sizeDelta\">\n      <summary>\n        <para>The size of this RectTransform relative to the distances between the anchors.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RectTransform.Axis\">\n      <summary>\n        <para>An axis that can be horizontal or vertical.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RectTransform.Axis.Horizontal\">\n      <summary>\n        <para>Horizontal.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RectTransform.Axis.Vertical\">\n      <summary>\n        <para>Vertical.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RectTransform.Edge\">\n      <summary>\n        <para>Enum used to specify one edge of a rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RectTransform.Edge.Bottom\">\n      <summary>\n        <para>The bottom edge.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RectTransform.Edge.Left\">\n      <summary>\n        <para>The left edge.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RectTransform.Edge.Right\">\n      <summary>\n        <para>The right edge.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RectTransform.Edge.Top\">\n      <summary>\n        <para>The top edge.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RectTransform.ForceUpdateRectTransforms\">\n      <summary>\n        <para>Force the recalculation of RectTransforms internal data.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RectTransform.GetLocalCorners(UnityEngine.Vector3[])\">\n      <summary>\n        <para>Get the corners of the calculated rectangle in the local space of its Transform.</para>\n      </summary>\n      <param name=\"fourCornersArray\">The array that corners are filled into.</param>\n    </member>\n    <member name=\"M:UnityEngine.RectTransform.GetWorldCorners(UnityEngine.Vector3[])\">\n      <summary>\n        <para>Get the corners of the calculated rectangle in world space.</para>\n      </summary>\n      <param name=\"fourCornersArray\">The ray that corners are filled into.</param>\n    </member>\n    <member name=\"T:UnityEngine.RectTransform.ReapplyDrivenProperties\">\n      <summary>\n        <para>Delegate used for the reapplyDrivenProperties event.</para>\n      </summary>\n      <param name=\"driven\"></param>\n    </member>\n    <member name=\"M:UnityEngine.RectTransform.SetInsetAndSizeFromParentEdge(UnityEngine.RectTransform/Edge,System.Single,System.Single)\">\n      <summary>\n        <para>Set the distance of this rectangle relative to a specified edge of the parent rectangle, while also setting its size.</para>\n      </summary>\n      <param name=\"edge\">The edge of the parent rectangle to inset from.</param>\n      <param name=\"inset\">The inset distance.</param>\n      <param name=\"size\">The size of the rectangle along the same direction of the inset.</param>\n    </member>\n    <member name=\"M:UnityEngine.RectTransform.SetSizeWithCurrentAnchors(UnityEngine.RectTransform/Axis,System.Single)\">\n      <summary>\n        <para>Makes the RectTransform calculated rect be a given size on the specified axis.</para>\n      </summary>\n      <param name=\"axis\">The axis to specify the size along.</param>\n      <param name=\"size\">The desired size along the specified axis.</param>\n    </member>\n    <member name=\"T:UnityEngine.RectTransformUtility\">\n      <summary>\n        <para>Utility class containing helper methods for working with  RectTransform.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RectTransformUtility.FlipLayoutAxes(UnityEngine.RectTransform,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Flips the horizontal and vertical axes of the RectTransform size and alignment, and optionally its children as well.</para>\n      </summary>\n      <param name=\"rect\">The RectTransform to flip.</param>\n      <param name=\"keepPositioning\">Flips around the pivot if true. Flips within the parent rect if false.</param>\n      <param name=\"recursive\">Flip the children as well?</param>\n    </member>\n    <member name=\"M:UnityEngine.RectTransformUtility.FlipLayoutOnAxis(UnityEngine.RectTransform,System.Int32,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Flips the alignment of the RectTransform along the horizontal or vertical axis, and optionally its children as well.</para>\n      </summary>\n      <param name=\"rect\">The RectTransform to flip.</param>\n      <param name=\"keepPositioning\">Flips around the pivot if true. Flips within the parent rect if false.</param>\n      <param name=\"recursive\">Flip the children as well?</param>\n      <param name=\"axis\">The axis to flip along. 0 is horizontal and 1 is vertical.</param>\n    </member>\n    <member name=\"M:UnityEngine.RectTransformUtility.PixelAdjustPoint(UnityEngine.Vector2,UnityEngine.Transform,UnityEngine.Canvas)\">\n      <summary>\n        <para>Convert a given point in screen space into a pixel correct point.</para>\n      </summary>\n      <param name=\"point\"></param>\n      <param name=\"elementTransform\"></param>\n      <param name=\"canvas\"></param>\n      <returns>\n        <para>Pixel adjusted point.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.RectTransformUtility.PixelAdjustRect(UnityEngine.RectTransform,UnityEngine.Canvas)\">\n      <summary>\n        <para>Given a rect transform, return the corner points in pixel accurate coordinates.</para>\n      </summary>\n      <param name=\"rectTransform\"></param>\n      <param name=\"canvas\"></param>\n      <returns>\n        <para>Pixel adjusted rect.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.RectTransformUtility.RectangleContainsScreenPoint(UnityEngine.RectTransform,UnityEngine.Vector2,UnityEngine.Camera)\">\n      <summary>\n        <para>Does the RectTransform contain the screen point as seen from the given camera?</para>\n      </summary>\n      <param name=\"rect\">The RectTransform to test with.</param>\n      <param name=\"screenPoint\">The screen point to test.</param>\n      <param name=\"cam\">The camera from which the test is performed from. (Optional)</param>\n      <returns>\n        <para>True if the point is inside the rectangle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.RectTransformUtility.ScreenPointToLocalPointInRectangle(UnityEngine.RectTransform,UnityEngine.Vector2,UnityEngine.Camera,UnityEngine.Vector2&amp;)\">\n      <summary>\n        <para>Transform a screen space point to a position in the local space of a RectTransform that is on the plane of its rectangle.</para>\n      </summary>\n      <param name=\"rect\">The RectTransform to find a point inside.</param>\n      <param name=\"cam\">The camera associated with the screen space position.</param>\n      <param name=\"screenPoint\">Screen space position.</param>\n      <param name=\"localPoint\">Point in local space of the rect transform.</param>\n      <returns>\n        <para>Returns true if the plane of the RectTransform is hit, regardless of whether the point is inside the rectangle.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.RectTransformUtility.ScreenPointToWorldPointInRectangle(UnityEngine.RectTransform,UnityEngine.Vector2,UnityEngine.Camera,UnityEngine.Vector3&amp;)\">\n      <summary>\n        <para>Transform a screen space point to a position in world space that is on the plane of the given RectTransform.</para>\n      </summary>\n      <param name=\"rect\">The RectTransform to find a point inside.</param>\n      <param name=\"cam\">The camera associated with the screen space position.</param>\n      <param name=\"screenPoint\">Screen space position.</param>\n      <param name=\"worldPoint\">Point in world space.</param>\n      <returns>\n        <para>Returns true if the plane of the RectTransform is hit, regardless of whether the point is inside the rectangle.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.ReflectionProbe\">\n      <summary>\n        <para>The reflection probe is used to capture the surroundings into a texture which is passed to the shaders and used for reflections.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.backgroundColor\">\n      <summary>\n        <para>The color with which the texture of reflection probe will be cleared.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.bakedTexture\">\n      <summary>\n        <para>Reference to the baked texture of the reflection probe's surrounding.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.blendDistance\">\n      <summary>\n        <para>Distance around probe used for blending (used in deferred probes).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.bounds\">\n      <summary>\n        <para>The bounding volume of the reflection probe (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.boxProjection\">\n      <summary>\n        <para>Should this reflection probe use box projection?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.center\">\n      <summary>\n        <para>The center of the box area in which reflections will be applied to the objects. Measured in the probes's local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.clearFlags\">\n      <summary>\n        <para>How the reflection probe clears the background.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.cullingMask\">\n      <summary>\n        <para>This is used to render parts of the reflecion probe's surrounding selectively.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.customBakedTexture\">\n      <summary>\n        <para>Reference to the baked texture of the reflection probe's surrounding. Use this to assign custom reflection texture.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.ReflectionProbe.defaultReflectionSet(System.Action`1&lt;UnityEngine.Cubemap&gt;)\">\n      <summary>\n        <para>Adds a delegate to get notifications when the default specular Cubemap is changed.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.defaultTexture\">\n      <summary>\n        <para>Texture which is used outside of all reflection probes (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.defaultTextureHDRDecodeValues\">\n      <summary>\n        <para>HDR decode values of the default reflection probe texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.farClipPlane\">\n      <summary>\n        <para>The far clipping plane distance when rendering the probe.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.hdr\">\n      <summary>\n        <para>Should this reflection probe use HDR rendering?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.importance\">\n      <summary>\n        <para>Reflection probe importance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.intensity\">\n      <summary>\n        <para>The intensity modifier that is applied to the texture of reflection probe in the shader.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.mode\">\n      <summary>\n        <para>Should reflection probe texture be generated in the Editor (ReflectionProbeMode.Baked) or should probe use custom specified texure (ReflectionProbeMode.Custom)?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.nearClipPlane\">\n      <summary>\n        <para>The near clipping plane distance when rendering the probe.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.ReflectionProbe.reflectionProbeChanged(System.Action`2&lt;UnityEngine.ReflectionProbe,UnityEngine.ReflectionProbe/ReflectionProbeEvent&gt;)\">\n      <summary>\n        <para>Adds a delegate to get notifications when a Reflection Probe is added to a scene or removed from a scene.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.refreshMode\">\n      <summary>\n        <para>Sets the way the probe will refresh.\n\nSee Also: ReflectionProbeRefreshMode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.resolution\">\n      <summary>\n        <para>Resolution of the underlying reflection texture in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.shadowDistance\">\n      <summary>\n        <para>Shadow drawing distance when rendering the probe.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.size\">\n      <summary>\n        <para>The size of the box area in which reflections will be applied to the objects. Measured in the probes's local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.texture\">\n      <summary>\n        <para>Texture which is passed to the shader of the objects in the vicinity of the reflection probe (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.textureHDRDecodeValues\">\n      <summary>\n        <para>HDR decode values of the reflection probe texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ReflectionProbe.timeSlicingMode\">\n      <summary>\n        <para>Sets this probe time-slicing mode\n\nSee Also: ReflectionProbeTimeSlicingMode.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ReflectionProbe.BlendCubemap(UnityEngine.Texture,UnityEngine.Texture,System.Single,UnityEngine.RenderTexture)\">\n      <summary>\n        <para>Utility method to blend 2 cubemaps into a target render texture.</para>\n      </summary>\n      <param name=\"src\">Cubemap to blend from.</param>\n      <param name=\"dst\">Cubemap to blend to.</param>\n      <param name=\"blend\">Blend weight.</param>\n      <param name=\"target\">RenderTexture which will hold the result of the blend.</param>\n      <returns>\n        <para>Returns trues if cubemaps were blended, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ReflectionProbe.IsFinishedRendering(System.Int32)\">\n      <summary>\n        <para>Checks if a probe has finished a time-sliced render.</para>\n      </summary>\n      <param name=\"renderId\">An integer representing the RenderID as returned by the RenderProbe method.</param>\n      <returns>\n        <para>\n          True if the render has finished, false otherwise.\n\n          See Also: timeSlicingMode\n        </para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.ReflectionProbe.ReflectionProbeEvent\">\n      <summary>\n        <para>Types of events that occur when ReflectionProbe components are used in a scene.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ReflectionProbe.ReflectionProbeEvent.ReflectionProbeAdded\">\n      <summary>\n        <para>An event that occurs when a Reflection Probe component is added to a scene or enabled in a scene.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ReflectionProbe.ReflectionProbeEvent.ReflectionProbeRemoved\">\n      <summary>\n        <para>An event that occurs when a Reflection Probe component is unloaded from a scene or disabled in a scene.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ReflectionProbe.RenderProbe(UnityEngine.RenderTexture)\">\n      <summary>\n        <para>Refreshes the probe's cubemap.</para>\n      </summary>\n      <param name=\"targetTexture\">Target RendeTexture in which rendering should be done. Specifying null will update the probe's default texture.</param>\n      <returns>\n        <para>\n          An integer representing a RenderID which can subsequently be used to check if the probe has finished rendering while rendering in time-slice mode.\n\n          See Also: IsFinishedRendering\n          See Also: timeSlicingMode\n        </para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.RelativeJoint2D\">\n      <summary>\n        <para>Keeps two Rigidbody2D at their relative orientations.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RelativeJoint2D.angularOffset\">\n      <summary>\n        <para>The current angular offset between the Rigidbody2D that the joint connects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RelativeJoint2D.autoConfigureOffset\">\n      <summary>\n        <para>Should both the linearOffset and angularOffset be calculated automatically?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RelativeJoint2D.correctionScale\">\n      <summary>\n        <para>Scales both the linear and angular forces used to correct the required relative orientation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RelativeJoint2D.linearOffset\">\n      <summary>\n        <para>The current linear offset between the Rigidbody2D that the joint connects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RelativeJoint2D.maxForce\">\n      <summary>\n        <para>The maximum force that can be generated when trying to maintain the relative joint constraint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RelativeJoint2D.maxTorque\">\n      <summary>\n        <para>The maximum torque that can be generated when trying to maintain the relative joint constraint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RelativeJoint2D.target\">\n      <summary>\n        <para>The world-space position that is currently trying to be maintained.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RemoteSettings\">\n      <summary>\n        <para>Provides access to your remote settings.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.RemoteSettings.BeforeFetchFromServer(System.Action)\">\n      <summary>\n        <para>Dispatched before the RemoteSettings object makes the network request for the latest settings.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.RemoteSettings.Completed(System.Action`3&lt;System.Boolean,System.Boolean,System.Int32&gt;)\">\n      <summary>\n        <para>Dispatched when the network request made by the RemoteSettings object to fetch the remote configuration file is complete.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.RemoteSettings.ForceUpdate\">\n      <summary>\n        <para>Forces the game to download the newest settings from the server and update its values.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RemoteSettings.GetBool(System.String)\">\n      <summary>\n        <para>Gets the value corresponding to remote setting identified by key, if it exists.</para>\n      </summary>\n      <param name=\"key\">The key identifying the setting.</param>\n      <param name=\"defaultValue\">The default value to use if the setting identified by the key parameter cannot be found or is unavailable.</param>\n      <returns>\n        <para>The current value of the setting identified by key, or the default value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.RemoteSettings.GetBool(System.String,System.Boolean)\">\n      <summary>\n        <para>Gets the value corresponding to remote setting identified by key, if it exists.</para>\n      </summary>\n      <param name=\"key\">The key identifying the setting.</param>\n      <param name=\"defaultValue\">The default value to use if the setting identified by the key parameter cannot be found or is unavailable.</param>\n      <returns>\n        <para>The current value of the setting identified by key, or the default value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.RemoteSettings.GetCount\">\n      <summary>\n        <para>Gets the number of keys in the remote settings configuration.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RemoteSettings.GetFloat(System.String)\">\n      <summary>\n        <para>Gets the value corresponding to remote setting identified by key, if it exists.</para>\n      </summary>\n      <param name=\"key\">The key identifying the setting.</param>\n      <param name=\"defaultValue\">The default value to use if the setting identified by the key parameter cannot be found or is unavailable.</param>\n      <returns>\n        <para>The current value of the setting identified by key, or the default value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.RemoteSettings.GetFloat(System.String,System.Single)\">\n      <summary>\n        <para>Gets the value corresponding to remote setting identified by key, if it exists.</para>\n      </summary>\n      <param name=\"key\">The key identifying the setting.</param>\n      <param name=\"defaultValue\">The default value to use if the setting identified by the key parameter cannot be found or is unavailable.</param>\n      <returns>\n        <para>The current value of the setting identified by key, or the default value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.RemoteSettings.GetInt(System.String)\">\n      <summary>\n        <para>Gets the value corresponding to remote setting identified by key, if it exists.</para>\n      </summary>\n      <param name=\"key\">The key identifying the setting.</param>\n      <param name=\"defaultValue\">The default value to use if the setting identified by the key parameter cannot be found or is unavailable.</param>\n      <returns>\n        <para>The current value of the setting identified by key, or the default value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.RemoteSettings.GetInt(System.String,System.Int32)\">\n      <summary>\n        <para>Gets the value corresponding to remote setting identified by key, if it exists.</para>\n      </summary>\n      <param name=\"key\">The key identifying the setting.</param>\n      <param name=\"defaultValue\">The default value to use if the setting identified by the key parameter cannot be found or is unavailable.</param>\n      <returns>\n        <para>The current value of the setting identified by key, or the default value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.RemoteSettings.GetKeys\">\n      <summary>\n        <para>Gets an array containing all the keys in the remote settings configuration.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RemoteSettings.GetLong(System.String,System.Int64)\">\n      <summary>\n        <para>Gets the value corresponding to remote setting identified by key, if it exists.</para>\n      </summary>\n      <param name=\"key\">The key identifying the setting.</param>\n      <param name=\"defaultValue\">The default value to use if the setting identified by the key parameter cannot be found or is unavailable.</param>\n      <returns>\n        <para>The current value of the setting identified by key, or the default value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.RemoteSettings.GetString(System.String)\">\n      <summary>\n        <para>Gets the value corresponding to remote setting identified by key, if it exists.</para>\n      </summary>\n      <param name=\"key\">The key identifying the setting.</param>\n      <param name=\"defaultValue\">The default value to use if the setting identified by the key parameter cannot be found or is unavailable.</param>\n      <returns>\n        <para>The current value of the setting identified by key, or the default value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.RemoteSettings.GetString(System.String,System.String)\">\n      <summary>\n        <para>Gets the value corresponding to remote setting identified by key, if it exists.</para>\n      </summary>\n      <param name=\"key\">The key identifying the setting.</param>\n      <param name=\"defaultValue\">The default value to use if the setting identified by the key parameter cannot be found or is unavailable.</param>\n      <returns>\n        <para>The current value of the setting identified by key, or the default value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.RemoteSettings.HasKey(System.String)\">\n      <summary>\n        <para>Reports whether the specified key exists in the remote settings configuration.</para>\n      </summary>\n      <param name=\"key\">The key identifying the setting.</param>\n      <returns>\n        <para>True, if the key exists.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.RemoteSettings.Updated(UnityEngine.RemoteSettings/UpdatedEventHandler)\">\n      <summary>\n        <para>Dispatched when a remote settings configuration is fetched and successfully parsed from the server or from local cache.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"T:UnityEngine.RemoteSettings.UpdatedEventHandler\">\n      <summary>\n        <para>Defines the delegate signature for handling RemoteSettings.Updated events.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RemoteSettings.WasLastUpdatedFromServer\">\n      <summary>\n        <para>Reports whether or not the settings available from the RemoteSettings object were received from the Analytics Service during the current session.</para>\n      </summary>\n      <returns>\n        <para>True, if the remote settings file was received from the Analytics Service in the current session. False, if the remote settings file was received during an earlier session and cached.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.RenderBuffer\">\n      <summary>\n        <para>Color or depth buffer part of a RenderTexture.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RenderBuffer.GetNativeRenderBufferPtr\">\n      <summary>\n        <para>Returns native RenderBuffer. Be warned this is not native Texture, but rather pointer to unity struct that can be used with native unity API. Currently such API exists only on iOS.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Renderer\">\n      <summary>\n        <para>General functionality for all renderers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.allowOcclusionWhenDynamic\">\n      <summary>\n        <para>Controls if dynamic occlusion culling should be performed for this renderer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.bounds\">\n      <summary>\n        <para>The bounding volume of the renderer (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.enabled\">\n      <summary>\n        <para>Makes the rendered 3D object visible if enabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.isPartOfStaticBatch\">\n      <summary>\n        <para>Has this renderer been statically batched with any other renderers?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.isVisible\">\n      <summary>\n        <para>Is this renderer visible in any camera? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.lightmapIndex\">\n      <summary>\n        <para>The index of the baked lightmap applied to this renderer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.lightmapScaleOffset\">\n      <summary>\n        <para>The UV scale &amp; offset used for a lightmap.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.lightProbeProxyVolumeOverride\">\n      <summary>\n        <para>If set, the Renderer will use the Light Probe Proxy Volume component attached to the source GameObject.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.lightProbeUsage\">\n      <summary>\n        <para>The light probe interpolation type.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.localToWorldMatrix\">\n      <summary>\n        <para>Matrix that transforms a point from local space into world space (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.material\">\n      <summary>\n        <para>Returns the first instantiated Material assigned to the renderer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.materials\">\n      <summary>\n        <para>Returns all the instantiated materials of this object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.motionVectorGenerationMode\">\n      <summary>\n        <para>Specifies the mode for motion vector rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.motionVectors\">\n      <summary>\n        <para>Specifies whether this renderer has a per-object motion vector pass.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.probeAnchor\">\n      <summary>\n        <para>If set, Renderer will use this Transform's position to find the light or reflection probe.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.realtimeLightmapIndex\">\n      <summary>\n        <para>The index of the realtime lightmap applied to this renderer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.realtimeLightmapScaleOffset\">\n      <summary>\n        <para>The UV scale &amp; offset used for a realtime lightmap.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.receiveShadows\">\n      <summary>\n        <para>Does this object receive shadows?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.reflectionProbeUsage\">\n      <summary>\n        <para>Should reflection probes be used for this Renderer?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.renderingLayerMask\">\n      <summary>\n        <para>Determines which rendering layer this renderer lives on.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.shadowCastingMode\">\n      <summary>\n        <para>Does this object cast shadows?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.sharedMaterial\">\n      <summary>\n        <para>The shared material of this object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.sharedMaterials\">\n      <summary>\n        <para>All the shared materials of this object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.sortingLayerID\">\n      <summary>\n        <para>Unique ID of the Renderer's sorting layer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.sortingLayerName\">\n      <summary>\n        <para>Name of the Renderer's sorting layer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.sortingOrder\">\n      <summary>\n        <para>Renderer's order within a sorting layer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.useLightProbes\">\n      <summary>\n        <para>Should light probes be used for this Renderer?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Renderer.worldToLocalMatrix\">\n      <summary>\n        <para>Matrix that transforms a point from world space into local space (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Renderer.GetClosestReflectionProbes(System.Collections.Generic.List`1&lt;UnityEngine.Rendering.ReflectionProbeBlendInfo&gt;)\">\n      <summary>\n        <para>Returns an array of closest reflection probes with weights, weight shows how much influence the probe has on the renderer, this value is also used when blending between reflection probes occur.</para>\n      </summary>\n      <param name=\"result\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Renderer.GetMaterials(System.Collections.Generic.List`1&lt;UnityEngine.Material&gt;)\">\n      <summary>\n        <para>Returns all the instantiated materials of this object.</para>\n      </summary>\n      <param name=\"m\">A list of materials to populate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Renderer.GetPropertyBlock(UnityEngine.MaterialPropertyBlock)\">\n      <summary>\n        <para>Get per-Renderer or per-Material property block.</para>\n      </summary>\n      <param name=\"properties\">Material parameters to retrieve.</param>\n      <param name=\"materialIndex\">The index of the Material you want to get overridden parameters from. The index ranges from 0 to Renderer.sharedMaterials.Length-1.</param>\n    </member>\n    <member name=\"M:UnityEngine.Renderer.GetPropertyBlock(UnityEngine.MaterialPropertyBlock,System.Int32)\">\n      <summary>\n        <para>Get per-Renderer or per-Material property block.</para>\n      </summary>\n      <param name=\"properties\">Material parameters to retrieve.</param>\n      <param name=\"materialIndex\">The index of the Material you want to get overridden parameters from. The index ranges from 0 to Renderer.sharedMaterials.Length-1.</param>\n    </member>\n    <member name=\"M:UnityEngine.Renderer.GetSharedMaterials(System.Collections.Generic.List`1&lt;UnityEngine.Material&gt;)\">\n      <summary>\n        <para>Returns all the shared materials of this object.</para>\n      </summary>\n      <param name=\"m\">A list of materials to populate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Renderer.HasPropertyBlock\">\n      <summary>\n        <para>Returns true if the Renderer has a material property block attached via SetPropertyBlock.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Renderer.SetPropertyBlock(UnityEngine.MaterialPropertyBlock)\">\n      <summary>\n        <para>Lets you set or clear per-renderer or per-material parameter overrides.</para>\n      </summary>\n      <param name=\"properties\">Property block with values you want to override.</param>\n      <param name=\"materialIndex\">The index of the Material you want to override the parameters of. The index ranges from 0 to Renderer.sharedMaterial.Length-1.</param>\n    </member>\n    <member name=\"M:UnityEngine.Renderer.SetPropertyBlock(UnityEngine.MaterialPropertyBlock,System.Int32)\">\n      <summary>\n        <para>Lets you set or clear per-renderer or per-material parameter overrides.</para>\n      </summary>\n      <param name=\"properties\">Property block with values you want to override.</param>\n      <param name=\"materialIndex\">The index of the Material you want to override the parameters of. The index ranges from 0 to Renderer.sharedMaterial.Length-1.</param>\n    </member>\n    <member name=\"T:UnityEngine.RendererExtensions\">\n      <summary>\n        <para>Extension methods to the Renderer class, used only for the UpdateGIMaterials method used by the Global Illumination System.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RendererExtensions.UpdateGIMaterials(UnityEngine.Renderer)\">\n      <summary>\n        <para>Schedules an update of the albedo and emissive Textures of a system that contains the Renderer.</para>\n      </summary>\n      <param name=\"renderer\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.AmbientMode\">\n      <summary>\n        <para>Ambient lighting mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.AmbientMode.Custom\">\n      <summary>\n        <para>Ambient lighting is defined by a custom cubemap.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.AmbientMode.Flat\">\n      <summary>\n        <para>Flat ambient lighting.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.AmbientMode.Skybox\">\n      <summary>\n        <para>Skybox-based or custom ambient lighting.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.AmbientMode.Trilight\">\n      <summary>\n        <para>Trilight ambient lighting.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.AsyncGPUReadback\">\n      <summary>\n        <para>Allows the asynchronous read back of GPU resources.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.AsyncGPUReadback.Request(UnityEngine.ComputeBuffer)\">\n      <summary>\n        <para>Triggers a request to asynchronously fetch the data from a GPU resource.</para>\n      </summary>\n      <param name=\"src\">The resource to read the data from.</param>\n      <param name=\"size\">Size in bytes of the data to be retrieved from the ComputeBuffer.</param>\n      <param name=\"offset\">Offset in bytes in the ComputeBuffer.</param>\n      <param name=\"mipIndex\">The index of the mipmap to be fetched.</param>\n      <param name=\"dstFormat\">The target TextureFormat of the data. Conversion will happen automatically if format is different from the format stored on GPU.</param>\n      <param name=\"x\">Starting X coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"width\">Width in pixels of the Texture data to be fetched.</param>\n      <param name=\"y\">Starting Y coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"height\">Height in pixels of the Texture data to be fetched.</param>\n      <param name=\"z\">Start Z coordinate in pixels for the Texture3D being fetched. Index of Start layer for TextureCube, Texture2DArray and TextureCubeArray being fetched.</param>\n      <param name=\"depth\">Depth in pixels for Texture3D being fetched. Number of layers for TextureCube, TextureArray and TextureCubeArray.</param>\n      <param name=\"callback\">An optional delegate System.Action called once the request is fullfilled. The done request is passed as parameter to the System.Action.</param>\n      <returns>\n        <para>An AsyncGPUReadbackRequest that can be used to both access the data and check whether it is available.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.AsyncGPUReadback.Request(UnityEngine.ComputeBuffer,System.Int32,System.Int32)\">\n      <summary>\n        <para>Triggers a request to asynchronously fetch the data from a GPU resource.</para>\n      </summary>\n      <param name=\"src\">The resource to read the data from.</param>\n      <param name=\"size\">Size in bytes of the data to be retrieved from the ComputeBuffer.</param>\n      <param name=\"offset\">Offset in bytes in the ComputeBuffer.</param>\n      <param name=\"mipIndex\">The index of the mipmap to be fetched.</param>\n      <param name=\"dstFormat\">The target TextureFormat of the data. Conversion will happen automatically if format is different from the format stored on GPU.</param>\n      <param name=\"x\">Starting X coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"width\">Width in pixels of the Texture data to be fetched.</param>\n      <param name=\"y\">Starting Y coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"height\">Height in pixels of the Texture data to be fetched.</param>\n      <param name=\"z\">Start Z coordinate in pixels for the Texture3D being fetched. Index of Start layer for TextureCube, Texture2DArray and TextureCubeArray being fetched.</param>\n      <param name=\"depth\">Depth in pixels for Texture3D being fetched. Number of layers for TextureCube, TextureArray and TextureCubeArray.</param>\n      <param name=\"callback\">An optional delegate System.Action called once the request is fullfilled. The done request is passed as parameter to the System.Action.</param>\n      <returns>\n        <para>An AsyncGPUReadbackRequest that can be used to both access the data and check whether it is available.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.AsyncGPUReadback.Request(UnityEngine.Texture,System.Int32)\">\n      <summary>\n        <para>Triggers a request to asynchronously fetch the data from a GPU resource.</para>\n      </summary>\n      <param name=\"src\">The resource to read the data from.</param>\n      <param name=\"size\">Size in bytes of the data to be retrieved from the ComputeBuffer.</param>\n      <param name=\"offset\">Offset in bytes in the ComputeBuffer.</param>\n      <param name=\"mipIndex\">The index of the mipmap to be fetched.</param>\n      <param name=\"dstFormat\">The target TextureFormat of the data. Conversion will happen automatically if format is different from the format stored on GPU.</param>\n      <param name=\"x\">Starting X coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"width\">Width in pixels of the Texture data to be fetched.</param>\n      <param name=\"y\">Starting Y coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"height\">Height in pixels of the Texture data to be fetched.</param>\n      <param name=\"z\">Start Z coordinate in pixels for the Texture3D being fetched. Index of Start layer for TextureCube, Texture2DArray and TextureCubeArray being fetched.</param>\n      <param name=\"depth\">Depth in pixels for Texture3D being fetched. Number of layers for TextureCube, TextureArray and TextureCubeArray.</param>\n      <param name=\"callback\">An optional delegate System.Action called once the request is fullfilled. The done request is passed as parameter to the System.Action.</param>\n      <returns>\n        <para>An AsyncGPUReadbackRequest that can be used to both access the data and check whether it is available.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.AsyncGPUReadback.Request(UnityEngine.Texture,System.Int32,UnityEngine.TextureFormat)\">\n      <summary>\n        <para>Triggers a request to asynchronously fetch the data from a GPU resource.</para>\n      </summary>\n      <param name=\"src\">The resource to read the data from.</param>\n      <param name=\"size\">Size in bytes of the data to be retrieved from the ComputeBuffer.</param>\n      <param name=\"offset\">Offset in bytes in the ComputeBuffer.</param>\n      <param name=\"mipIndex\">The index of the mipmap to be fetched.</param>\n      <param name=\"dstFormat\">The target TextureFormat of the data. Conversion will happen automatically if format is different from the format stored on GPU.</param>\n      <param name=\"x\">Starting X coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"width\">Width in pixels of the Texture data to be fetched.</param>\n      <param name=\"y\">Starting Y coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"height\">Height in pixels of the Texture data to be fetched.</param>\n      <param name=\"z\">Start Z coordinate in pixels for the Texture3D being fetched. Index of Start layer for TextureCube, Texture2DArray and TextureCubeArray being fetched.</param>\n      <param name=\"depth\">Depth in pixels for Texture3D being fetched. Number of layers for TextureCube, TextureArray and TextureCubeArray.</param>\n      <param name=\"callback\">An optional delegate System.Action called once the request is fullfilled. The done request is passed as parameter to the System.Action.</param>\n      <returns>\n        <para>An AsyncGPUReadbackRequest that can be used to both access the data and check whether it is available.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.AsyncGPUReadback.Request(UnityEngine.Texture,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Triggers a request to asynchronously fetch the data from a GPU resource.</para>\n      </summary>\n      <param name=\"src\">The resource to read the data from.</param>\n      <param name=\"size\">Size in bytes of the data to be retrieved from the ComputeBuffer.</param>\n      <param name=\"offset\">Offset in bytes in the ComputeBuffer.</param>\n      <param name=\"mipIndex\">The index of the mipmap to be fetched.</param>\n      <param name=\"dstFormat\">The target TextureFormat of the data. Conversion will happen automatically if format is different from the format stored on GPU.</param>\n      <param name=\"x\">Starting X coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"width\">Width in pixels of the Texture data to be fetched.</param>\n      <param name=\"y\">Starting Y coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"height\">Height in pixels of the Texture data to be fetched.</param>\n      <param name=\"z\">Start Z coordinate in pixels for the Texture3D being fetched. Index of Start layer for TextureCube, Texture2DArray and TextureCubeArray being fetched.</param>\n      <param name=\"depth\">Depth in pixels for Texture3D being fetched. Number of layers for TextureCube, TextureArray and TextureCubeArray.</param>\n      <param name=\"callback\">An optional delegate System.Action called once the request is fullfilled. The done request is passed as parameter to the System.Action.</param>\n      <returns>\n        <para>An AsyncGPUReadbackRequest that can be used to both access the data and check whether it is available.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.AsyncGPUReadback.Request(UnityEngine.Texture,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,UnityEngine.TextureFormat)\">\n      <summary>\n        <para>Triggers a request to asynchronously fetch the data from a GPU resource.</para>\n      </summary>\n      <param name=\"src\">The resource to read the data from.</param>\n      <param name=\"size\">Size in bytes of the data to be retrieved from the ComputeBuffer.</param>\n      <param name=\"offset\">Offset in bytes in the ComputeBuffer.</param>\n      <param name=\"mipIndex\">The index of the mipmap to be fetched.</param>\n      <param name=\"dstFormat\">The target TextureFormat of the data. Conversion will happen automatically if format is different from the format stored on GPU.</param>\n      <param name=\"x\">Starting X coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"width\">Width in pixels of the Texture data to be fetched.</param>\n      <param name=\"y\">Starting Y coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"height\">Height in pixels of the Texture data to be fetched.</param>\n      <param name=\"z\">Start Z coordinate in pixels for the Texture3D being fetched. Index of Start layer for TextureCube, Texture2DArray and TextureCubeArray being fetched.</param>\n      <param name=\"depth\">Depth in pixels for Texture3D being fetched. Number of layers for TextureCube, TextureArray and TextureCubeArray.</param>\n      <param name=\"callback\">An optional delegate System.Action called once the request is fullfilled. The done request is passed as parameter to the System.Action.</param>\n      <returns>\n        <para>An AsyncGPUReadbackRequest that can be used to both access the data and check whether it is available.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.AsyncGPUReadbackRequest\">\n      <summary>\n        <para>Represents an asynchronous request for a GPU resource.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.AsyncGPUReadbackRequest.depth\">\n      <summary>\n        <para>When reading data from a ComputeBuffer, depth is 1, otherwise, the property takes the value of the requested depth from the texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.AsyncGPUReadbackRequest.done\">\n      <summary>\n        <para>Checks whether the request has been processed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.AsyncGPUReadbackRequest.hasError\">\n      <summary>\n        <para>This property is true if the request has encountered an error.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.AsyncGPUReadbackRequest.height\">\n      <summary>\n        <para>When reading data from a ComputeBuffer, height is 1, otherwise, the property takes the value of the requested height from the texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.AsyncGPUReadbackRequest.layerCount\">\n      <summary>\n        <para>Number of layers in the current request.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.AsyncGPUReadbackRequest.layerDataSize\">\n      <summary>\n        <para>The size in bytes of one layer of the readback data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.AsyncGPUReadbackRequest.width\">\n      <summary>\n        <para>The width of the requested GPU data.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.AsyncGPUReadbackRequest.GetData(System.Int32)\">\n      <summary>\n        <para>Fetches the data of a successful request.</para>\n      </summary>\n      <param name=\"layer\">The index of the layer to retrieve.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.AsyncGPUReadbackRequest.Update\">\n      <summary>\n        <para>Triggers an update of the request.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.AsyncGPUReadbackRequest.WaitForCompletion\">\n      <summary>\n        <para>Waits for completion of the request.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.BlendMode\">\n      <summary>\n        <para>Blend mode for controlling the blending.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendMode.DstAlpha\">\n      <summary>\n        <para>Blend factor is (Ad, Ad, Ad, Ad).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendMode.DstColor\">\n      <summary>\n        <para>Blend factor is (Rd, Gd, Bd, Ad).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendMode.One\">\n      <summary>\n        <para>Blend factor is (1, 1, 1, 1).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendMode.OneMinusDstAlpha\">\n      <summary>\n        <para>Blend factor is (1 - Ad, 1 - Ad, 1 - Ad, 1 - Ad).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendMode.OneMinusDstColor\">\n      <summary>\n        <para>Blend factor is (1 - Rd, 1 - Gd, 1 - Bd, 1 - Ad).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha\">\n      <summary>\n        <para>Blend factor is (1 - As, 1 - As, 1 - As, 1 - As).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendMode.OneMinusSrcColor\">\n      <summary>\n        <para>Blend factor is (1 - Rs, 1 - Gs, 1 - Bs, 1 - As).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendMode.SrcAlpha\">\n      <summary>\n        <para>Blend factor is (As, As, As, As).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendMode.SrcAlphaSaturate\">\n      <summary>\n        <para>Blend factor is (f, f, f, 1); where f = min(As, 1 - Ad).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendMode.SrcColor\">\n      <summary>\n        <para>Blend factor is (Rs, Gs, Bs, As).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendMode.Zero\">\n      <summary>\n        <para>Blend factor is  (0, 0, 0, 0).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.BlendOp\">\n      <summary>\n        <para>Blend operation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.Add\">\n      <summary>\n        <para>Add (s + d).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.ColorBurn\">\n      <summary>\n        <para>Color burn (Advanced OpenGL blending).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.ColorDodge\">\n      <summary>\n        <para>Color dodge (Advanced OpenGL blending).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.Darken\">\n      <summary>\n        <para>Darken (Advanced OpenGL blending).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.Difference\">\n      <summary>\n        <para>Difference (Advanced OpenGL blending).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.Exclusion\">\n      <summary>\n        <para>Exclusion (Advanced OpenGL blending).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.HardLight\">\n      <summary>\n        <para>Hard light (Advanced OpenGL blending).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.HSLColor\">\n      <summary>\n        <para>HSL color (Advanced OpenGL blending).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.HSLHue\">\n      <summary>\n        <para>HSL Hue (Advanced OpenGL blending).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.HSLLuminosity\">\n      <summary>\n        <para>HSL luminosity (Advanced OpenGL blending).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.HSLSaturation\">\n      <summary>\n        <para>HSL saturation (Advanced OpenGL blending).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.Lighten\">\n      <summary>\n        <para>Lighten (Advanced OpenGL blending).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.LogicalAnd\">\n      <summary>\n        <para>Logical AND (s &amp; d) (D3D11.1 only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.LogicalAndInverted\">\n      <summary>\n        <para>Logical inverted AND (!s &amp; d) (D3D11.1 only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.LogicalAndReverse\">\n      <summary>\n        <para>Logical reverse AND (s &amp; !d) (D3D11.1 only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.LogicalClear\">\n      <summary>\n        <para>Logical Clear (0).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.LogicalCopy\">\n      <summary>\n        <para>Logical Copy (s) (D3D11.1 only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.LogicalCopyInverted\">\n      <summary>\n        <para>Logical inverted Copy (!s) (D3D11.1 only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.LogicalEquivalence\">\n      <summary>\n        <para>Logical Equivalence !(s XOR d) (D3D11.1 only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.LogicalInvert\">\n      <summary>\n        <para>Logical Inverse (!d) (D3D11.1 only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.LogicalNand\">\n      <summary>\n        <para>Logical NAND !(s &amp; d). D3D11.1 only.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.LogicalNoop\">\n      <summary>\n        <para>Logical No-op (d) (D3D11.1 only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.LogicalNor\">\n      <summary>\n        <para>Logical NOR !(s | d) (D3D11.1 only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.LogicalOr\">\n      <summary>\n        <para>Logical OR (s | d) (D3D11.1 only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.LogicalOrInverted\">\n      <summary>\n        <para>Logical inverted OR (!s | d) (D3D11.1 only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.LogicalOrReverse\">\n      <summary>\n        <para>Logical reverse OR (s | !d) (D3D11.1 only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.LogicalSet\">\n      <summary>\n        <para>Logical SET (1) (D3D11.1 only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.LogicalXor\">\n      <summary>\n        <para>Logical XOR (s XOR d) (D3D11.1 only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.Max\">\n      <summary>\n        <para>Max.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.Min\">\n      <summary>\n        <para>Min.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.Multiply\">\n      <summary>\n        <para>Multiply (Advanced OpenGL blending).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.Overlay\">\n      <summary>\n        <para>Overlay (Advanced OpenGL blending).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.ReverseSubtract\">\n      <summary>\n        <para>Reverse subtract.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.Screen\">\n      <summary>\n        <para>Screen (Advanced OpenGL blending).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.SoftLight\">\n      <summary>\n        <para>Soft light (Advanced OpenGL blending).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BlendOp.Subtract\">\n      <summary>\n        <para>Subtract.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.BuiltinRenderTextureType\">\n      <summary>\n        <para>Built-in temporary render textures produced during camera's rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.BufferPtr\">\n      <summary>\n        <para>The raw RenderBuffer pointer to be used.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.CameraTarget\">\n      <summary>\n        <para>Target texture of currently rendering camera.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.CurrentActive\">\n      <summary>\n        <para>Currently active render target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.Depth\">\n      <summary>\n        <para>Camera's depth texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.DepthNormals\">\n      <summary>\n        <para>Camera's depth+normals texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.GBuffer0\">\n      <summary>\n        <para>Deferred shading G-buffer #0 (typically diffuse color).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.GBuffer1\">\n      <summary>\n        <para>Deferred shading G-buffer #1 (typically specular + roughness).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.GBuffer2\">\n      <summary>\n        <para>Deferred shading G-buffer #2 (typically normals).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.GBuffer3\">\n      <summary>\n        <para>Deferred shading G-buffer #3 (typically emission/lighting).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.GBuffer4\">\n      <summary>\n        <para>Deferred shading G-buffer #4 (typically occlusion mask for static lights if any).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.GBuffer5\">\n      <summary>\n        <para>G-buffer #5 Available.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.GBuffer6\">\n      <summary>\n        <para>G-buffer #6 Available.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.GBuffer7\">\n      <summary>\n        <para>G-buffer #7 Available.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.MotionVectors\">\n      <summary>\n        <para>Motion Vectors generated when the camera has motion vectors enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.PrepassLight\">\n      <summary>\n        <para>Deferred lighting light buffer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.PrepassLightSpec\">\n      <summary>\n        <para>Deferred lighting HDR specular light buffer (Xbox 360 only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.PrepassNormalsSpec\">\n      <summary>\n        <para>Deferred lighting (normals+specular) G-buffer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.PropertyName\">\n      <summary>\n        <para>A globally set property name.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.Reflections\">\n      <summary>\n        <para>Reflections gathered from default reflection and reflections probes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.RenderTexture\">\n      <summary>\n        <para>The given RenderTexture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinRenderTextureType.ResolvedDepth\">\n      <summary>\n        <para>Resolved depth buffer from deferred.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.BuiltinShaderDefine\">\n      <summary>\n        <para>Defines set by editor when compiling shaders, depending on target platform and tier.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.SHADER_API_DESKTOP\">\n      <summary>\n        <para>SHADER_API_DESKTOP is set when compiling shader for \"desktop\" platforms.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.SHADER_API_MOBILE\">\n      <summary>\n        <para>SHADER_API_MOBILE is set when compiling shader for mobile platforms.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_COLORSPACE_GAMMA\">\n      <summary>\n        <para>UNITY_COLORSPACE_GAMMA is set when compiling shaders for Gamma Color Space.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_ENABLE_DETAIL_NORMALMAP\">\n      <summary>\n        <para>UNITY_ENABLE_DETAIL_NORMALMAP is set if Detail Normal Map should be sampled if assigned.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_ENABLE_NATIVE_SHADOW_LOOKUPS\">\n      <summary>\n        <para>UNITY_ENABLE_NATIVE_SHADOW_LOOKUPS enables use of built-in shadow comparison samplers on OpenGL ES 2.0.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_ENABLE_REFLECTION_BUFFERS\">\n      <summary>\n        <para>UNITY_ENABLE_REFLECTION_BUFFERS is set when deferred shading renders reflection probes in deferred mode. With this option set reflections are rendered into a per-pixel buffer. This is similar to the way lights are rendered into a per-pixel buffer. UNITY_ENABLE_REFLECTION_BUFFERS is on by default when using deferred shading, but you can turn it off by setting “No support” for the Deferred Reflections shader option in Graphics Settings. When the setting is off, reflection probes are rendered per-object, similar to the way forward rendering works.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_FRAMEBUFFER_FETCH_AVAILABLE\">\n      <summary>\n        <para>UNITY_FRAMEBUFFER_FETCH_AVAILABLE is set when compiling shaders for platforms where framebuffer fetch is potentially available.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS\">\n      <summary>\n        <para>UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS is set automatically for platforms that don't require full floating-point precision support in fragment shaders.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_HARDWARE_TIER1\">\n      <summary>\n        <para>UNITY_HARDWARE_TIER1 is set when compiling shaders for GraphicsTier.Tier1.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_HARDWARE_TIER2\">\n      <summary>\n        <para>UNITY_HARDWARE_TIER2 is set when compiling shaders for GraphicsTier.Tier2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_HARDWARE_TIER3\">\n      <summary>\n        <para>UNITY_HARDWARE_TIER3 is set when compiling shaders for GraphicsTier.Tier3.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_LIGHT_PROBE_PROXY_VOLUME\">\n      <summary>\n        <para>UNITY_LIGHT_PROBE_PROXY_VOLUME is set when Light Probe Proxy Volume feature is supported by the current graphics API and is enabled in the current Tier Settings(Graphics Settings).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_LIGHTMAP_DLDR_ENCODING\">\n      <summary>\n        <para>UNITY_LIGHTMAP_DLDR_ENCODING is set when lightmap textures are using double LDR encoding to store the values in the texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_LIGHTMAP_FULL_HDR\">\n      <summary>\n        <para>UNITY_LIGHTMAP_FULL_HDR is set when lightmap textures are not using any encoding to store the values in the texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_LIGHTMAP_RGBM_ENCODING\">\n      <summary>\n        <para>UNITY_LIGHTMAP_RGBM_ENCODING is set when lightmap textures are using RGBM encoding to store the values in the texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_METAL_SHADOWS_USE_POINT_FILTERING\">\n      <summary>\n        <para>UNITY_METAL_SHADOWS_USE_POINT_FILTERING is set if shadow sampler should use point filtering on iOS Metal.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_NO_DXT5nm\">\n      <summary>\n        <para>UNITY_NO_DXT5nm is set when compiling shader for platform that do not support DXT5NM, meaning that normal maps will be encoded in RGB instead.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_NO_FULL_STANDARD_SHADER\">\n      <summary>\n        <para>UNITY_NO_FULL_STANDARD_SHADER is set if Standard shader BRDF3 with extra simplifications should be used.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_NO_RGBM\">\n      <summary>\n        <para>UNITY_NO_RGBM is set when compiling shader for platform that do not support RGBM, so dLDR will be used instead.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_NO_SCREENSPACE_SHADOWS\">\n      <summary>\n        <para>UNITY_NO_SCREENSPACE_SHADOWS is set when screenspace cascaded shadow maps are disabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_PBS_USE_BRDF1\">\n      <summary>\n        <para>UNITY_PBS_USE_BRDF1 is set if Standard Shader BRDF1 should be used.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_PBS_USE_BRDF2\">\n      <summary>\n        <para>UNITY_PBS_USE_BRDF2 is set if Standard Shader BRDF2 should be used.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_PBS_USE_BRDF3\">\n      <summary>\n        <para>UNITY_PBS_USE_BRDF3 is set if Standard Shader BRDF3 should be used.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_SPECCUBE_BLENDING\">\n      <summary>\n        <para>UNITY_SPECCUBE_BLENDING is set if Reflection Probes Blending is enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_SPECCUBE_BOX_PROJECTION\">\n      <summary>\n        <para>UNITY_SPECCUBE_BLENDING is set if Reflection Probes Box Projection is enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderDefine.UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS\">\n      <summary>\n        <para>UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS is set when Semitransparent Shadows are enabled.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.BuiltinShaderMode\">\n      <summary>\n        <para>Built-in shader modes used by Rendering.GraphicsSettings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderMode.Disabled\">\n      <summary>\n        <para>Don't use any shader, effectively disabling the functionality.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderMode.UseBuiltin\">\n      <summary>\n        <para>Use built-in shader (default).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderMode.UseCustom\">\n      <summary>\n        <para>Use custom shader instead of built-in one.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.BuiltinShaderType\">\n      <summary>\n        <para>Built-in shader types used by Rendering.GraphicsSettings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderType.DeferredReflections\">\n      <summary>\n        <para>Shader used for deferred reflection probes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderType.DeferredShading\">\n      <summary>\n        <para>Shader used for deferred shading calculations.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderType.DepthNormals\">\n      <summary>\n        <para>Shader used for depth and normals texture when enabled on a Camera.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderType.LegacyDeferredLighting\">\n      <summary>\n        <para>Shader used for legacy deferred lighting calculations.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderType.LensFlare\">\n      <summary>\n        <para>Default shader used for lens flares.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderType.LightHalo\">\n      <summary>\n        <para>Default shader used for light halos.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderType.MotionVectors\">\n      <summary>\n        <para>Shader used for Motion Vectors when enabled on a Camera.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.BuiltinShaderType.ScreenSpaceShadows\">\n      <summary>\n        <para>Shader used for screen-space cascaded shadows.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.CameraEvent\">\n      <summary>\n        <para>Defines a place in camera's rendering to attach Rendering.CommandBuffer objects to.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.AfterDepthNormalsTexture\">\n      <summary>\n        <para>After camera's depth+normals texture is generated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.AfterDepthTexture\">\n      <summary>\n        <para>After camera's depth texture is generated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.AfterEverything\">\n      <summary>\n        <para>After camera has done rendering everything.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.AfterFinalPass\">\n      <summary>\n        <para>After final geometry pass in deferred lighting.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.AfterForwardAlpha\">\n      <summary>\n        <para>After transparent objects in forward rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.AfterForwardOpaque\">\n      <summary>\n        <para>After opaque objects in forward rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.AfterGBuffer\">\n      <summary>\n        <para>After deferred rendering G-buffer is rendered.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.AfterHaloAndLensFlares\">\n      <summary>\n        <para>After halo and lens flares.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.AfterImageEffects\">\n      <summary>\n        <para>After image effects.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.AfterImageEffectsOpaque\">\n      <summary>\n        <para>After image effects that happen between opaque &amp; transparent objects.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.AfterLighting\">\n      <summary>\n        <para>After lighting pass in deferred rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.AfterReflections\">\n      <summary>\n        <para>After reflections pass in deferred rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.AfterSkybox\">\n      <summary>\n        <para>After skybox is drawn.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.BeforeDepthNormalsTexture\">\n      <summary>\n        <para>Before camera's depth+normals texture is generated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.BeforeDepthTexture\">\n      <summary>\n        <para>Before camera's depth texture is generated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.BeforeFinalPass\">\n      <summary>\n        <para>Before final geometry pass in deferred lighting.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.BeforeForwardAlpha\">\n      <summary>\n        <para>Before transparent objects in forward rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.BeforeForwardOpaque\">\n      <summary>\n        <para>Before opaque objects in forward rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.BeforeGBuffer\">\n      <summary>\n        <para>Before deferred rendering G-buffer is rendered.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.BeforeHaloAndLensFlares\">\n      <summary>\n        <para>Before halo and lens flares.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.BeforeImageEffects\">\n      <summary>\n        <para>Before image effects.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.BeforeImageEffectsOpaque\">\n      <summary>\n        <para>Before image effects that happen between opaque &amp; transparent objects.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.BeforeLighting\">\n      <summary>\n        <para>Before lighting pass in deferred rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.BeforeReflections\">\n      <summary>\n        <para>Before reflections pass in deferred rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraEvent.BeforeSkybox\">\n      <summary>\n        <para>Before skybox is drawn.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.CameraHDRMode\">\n      <summary>\n        <para>The HDR mode to use for rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraHDRMode.FP16\">\n      <summary>\n        <para>Uses RenderTextureFormat.ARGBHalf.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CameraHDRMode.R11G11B10\">\n      <summary>\n        <para>Uses RenderTextureFormat.RGB111110Float.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.ColorWriteMask\">\n      <summary>\n        <para>Specifies which color components will get written into the target framebuffer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ColorWriteMask.All\">\n      <summary>\n        <para>Write all components (R, G, B and Alpha).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ColorWriteMask.Alpha\">\n      <summary>\n        <para>Write alpha component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ColorWriteMask.Blue\">\n      <summary>\n        <para>Write blue component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ColorWriteMask.Green\">\n      <summary>\n        <para>Write green component.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ColorWriteMask.Red\">\n      <summary>\n        <para>Write red component.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.CommandBuffer\">\n      <summary>\n        <para>List of graphics commands to execute.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.CommandBuffer.name\">\n      <summary>\n        <para>Name of this command buffer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.CommandBuffer.sizeInBytes\">\n      <summary>\n        <para>Size of this command buffer in bytes (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.BeginSample(System.String)\">\n      <summary>\n        <para>Adds a command to begin profile sampling.</para>\n      </summary>\n      <param name=\"name\">Name of the profile information used for sampling.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.Blit(UnityEngine.Texture,UnityEngine.Rendering.RenderTargetIdentifier)\">\n      <summary>\n        <para>Add a \"blit into a render texture\" command.</para>\n      </summary>\n      <param name=\"source\">Source texture or render target to blit from.</param>\n      <param name=\"dest\">Destination to blit into.</param>\n      <param name=\"mat\">Material to use.</param>\n      <param name=\"pass\">Shader pass to use (default is -1, meaning \"all passes\").</param>\n      <param name=\"scale\">Scale applied to the source texture coordinate.</param>\n      <param name=\"offset\">Offset applied to the source texture coordinate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.Blit(UnityEngine.Texture,UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Material)\">\n      <summary>\n        <para>Add a \"blit into a render texture\" command.</para>\n      </summary>\n      <param name=\"source\">Source texture or render target to blit from.</param>\n      <param name=\"dest\">Destination to blit into.</param>\n      <param name=\"mat\">Material to use.</param>\n      <param name=\"pass\">Shader pass to use (default is -1, meaning \"all passes\").</param>\n      <param name=\"scale\">Scale applied to the source texture coordinate.</param>\n      <param name=\"offset\">Offset applied to the source texture coordinate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.Blit(UnityEngine.Texture,UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Material,System.Int32)\">\n      <summary>\n        <para>Add a \"blit into a render texture\" command.</para>\n      </summary>\n      <param name=\"source\">Source texture or render target to blit from.</param>\n      <param name=\"dest\">Destination to blit into.</param>\n      <param name=\"mat\">Material to use.</param>\n      <param name=\"pass\">Shader pass to use (default is -1, meaning \"all passes\").</param>\n      <param name=\"scale\">Scale applied to the source texture coordinate.</param>\n      <param name=\"offset\">Offset applied to the source texture coordinate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.Blit(UnityEngine.Texture,UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Add a \"blit into a render texture\" command.</para>\n      </summary>\n      <param name=\"source\">Source texture or render target to blit from.</param>\n      <param name=\"dest\">Destination to blit into.</param>\n      <param name=\"mat\">Material to use.</param>\n      <param name=\"pass\">Shader pass to use (default is -1, meaning \"all passes\").</param>\n      <param name=\"scale\">Scale applied to the source texture coordinate.</param>\n      <param name=\"offset\">Offset applied to the source texture coordinate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.Blit(UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.RenderTargetIdentifier)\">\n      <summary>\n        <para>Add a \"blit into a render texture\" command.</para>\n      </summary>\n      <param name=\"source\">Source texture or render target to blit from.</param>\n      <param name=\"dest\">Destination to blit into.</param>\n      <param name=\"mat\">Material to use.</param>\n      <param name=\"pass\">Shader pass to use (default is -1, meaning \"all passes\").</param>\n      <param name=\"scale\">Scale applied to the source texture coordinate.</param>\n      <param name=\"offset\">Offset applied to the source texture coordinate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.Blit(UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Material)\">\n      <summary>\n        <para>Add a \"blit into a render texture\" command.</para>\n      </summary>\n      <param name=\"source\">Source texture or render target to blit from.</param>\n      <param name=\"dest\">Destination to blit into.</param>\n      <param name=\"mat\">Material to use.</param>\n      <param name=\"pass\">Shader pass to use (default is -1, meaning \"all passes\").</param>\n      <param name=\"scale\">Scale applied to the source texture coordinate.</param>\n      <param name=\"offset\">Offset applied to the source texture coordinate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.Blit(UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Material,System.Int32)\">\n      <summary>\n        <para>Add a \"blit into a render texture\" command.</para>\n      </summary>\n      <param name=\"source\">Source texture or render target to blit from.</param>\n      <param name=\"dest\">Destination to blit into.</param>\n      <param name=\"mat\">Material to use.</param>\n      <param name=\"pass\">Shader pass to use (default is -1, meaning \"all passes\").</param>\n      <param name=\"scale\">Scale applied to the source texture coordinate.</param>\n      <param name=\"offset\">Offset applied to the source texture coordinate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.Blit(UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Add a \"blit into a render texture\" command.</para>\n      </summary>\n      <param name=\"source\">Source texture or render target to blit from.</param>\n      <param name=\"dest\">Destination to blit into.</param>\n      <param name=\"mat\">Material to use.</param>\n      <param name=\"pass\">Shader pass to use (default is -1, meaning \"all passes\").</param>\n      <param name=\"scale\">Scale applied to the source texture coordinate.</param>\n      <param name=\"offset\">Offset applied to the source texture coordinate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.Clear\">\n      <summary>\n        <para>Clear all commands in the buffer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.ClearRandomWriteTargets\">\n      <summary>\n        <para>Clear random write targets for level pixel shaders.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.ClearRenderTarget(System.Boolean,System.Boolean,UnityEngine.Color,System.Single)\">\n      <summary>\n        <para>Adds a \"clear render target\" command.</para>\n      </summary>\n      <param name=\"clearDepth\">Should clear depth buffer?</param>\n      <param name=\"clearColor\">Should clear color buffer?</param>\n      <param name=\"backgroundColor\">Color to clear with.</param>\n      <param name=\"depth\">Depth to clear with (default is 1.0).</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.ConvertTexture(UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.RenderTargetIdentifier)\">\n      <summary>\n        <para>Converts and copies a source texture to a destination texture with a different format or dimensions.</para>\n      </summary>\n      <param name=\"src\">Source texture.</param>\n      <param name=\"dst\">Destination texture.</param>\n      <param name=\"srcElement\">Source element (e.g. cubemap face). Set this to 0 for 2D source textures.</param>\n      <param name=\"dstElement\">Destination element (e.g. cubemap face or texture array element).</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.ConvertTexture(UnityEngine.Rendering.RenderTargetIdentifier,System.Int32,UnityEngine.Rendering.RenderTargetIdentifier,System.Int32)\">\n      <summary>\n        <para>Converts and copies a source texture to a destination texture with a different format or dimensions.</para>\n      </summary>\n      <param name=\"src\">Source texture.</param>\n      <param name=\"dst\">Destination texture.</param>\n      <param name=\"srcElement\">Source element (e.g. cubemap face). Set this to 0 for 2D source textures.</param>\n      <param name=\"dstElement\">Destination element (e.g. cubemap face or texture array element).</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.CopyCounterValue(UnityEngine.ComputeBuffer,UnityEngine.ComputeBuffer,System.UInt32)\">\n      <summary>\n        <para>Adds a command to copy ComputeBuffer counter value.</para>\n      </summary>\n      <param name=\"src\">Append/consume buffer to copy the counter from.</param>\n      <param name=\"dst\">A buffer to copy the counter to.</param>\n      <param name=\"dstOffsetBytes\">Target byte offset in dst buffer.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.CopyTexture(UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.RenderTargetIdentifier)\">\n      <summary>\n        <para>Adds a command to copy a texture into another texture.</para>\n      </summary>\n      <param name=\"src\">Source texture or identifier, see RenderTargetIdentifier.</param>\n      <param name=\"dst\">Destination texture or identifier, see RenderTargetIdentifier.</param>\n      <param name=\"srcElement\">Source texture element (cubemap face, texture array layer or 3D texture depth slice).</param>\n      <param name=\"srcMip\">Source texture mipmap level.</param>\n      <param name=\"dstElement\">Destination texture element (cubemap face, texture array layer or 3D texture depth slice).</param>\n      <param name=\"dstMip\">Destination texture mipmap level.</param>\n      <param name=\"srcX\">X coordinate of source texture region to copy (left side is zero).</param>\n      <param name=\"srcY\">Y coordinate of source texture region to copy (bottom is zero).</param>\n      <param name=\"srcWidth\">Width of source texture region to copy.</param>\n      <param name=\"srcHeight\">Height of source texture region to copy.</param>\n      <param name=\"dstX\">X coordinate of where to copy region in destination texture (left side is zero).</param>\n      <param name=\"dstY\">Y coordinate of where to copy region in destination texture (bottom is zero).</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.CopyTexture(UnityEngine.Rendering.RenderTargetIdentifier,System.Int32,UnityEngine.Rendering.RenderTargetIdentifier,System.Int32)\">\n      <summary>\n        <para>Adds a command to copy a texture into another texture.</para>\n      </summary>\n      <param name=\"src\">Source texture or identifier, see RenderTargetIdentifier.</param>\n      <param name=\"dst\">Destination texture or identifier, see RenderTargetIdentifier.</param>\n      <param name=\"srcElement\">Source texture element (cubemap face, texture array layer or 3D texture depth slice).</param>\n      <param name=\"srcMip\">Source texture mipmap level.</param>\n      <param name=\"dstElement\">Destination texture element (cubemap face, texture array layer or 3D texture depth slice).</param>\n      <param name=\"dstMip\">Destination texture mipmap level.</param>\n      <param name=\"srcX\">X coordinate of source texture region to copy (left side is zero).</param>\n      <param name=\"srcY\">Y coordinate of source texture region to copy (bottom is zero).</param>\n      <param name=\"srcWidth\">Width of source texture region to copy.</param>\n      <param name=\"srcHeight\">Height of source texture region to copy.</param>\n      <param name=\"dstX\">X coordinate of where to copy region in destination texture (left side is zero).</param>\n      <param name=\"dstY\">Y coordinate of where to copy region in destination texture (bottom is zero).</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.CopyTexture(UnityEngine.Rendering.RenderTargetIdentifier,System.Int32,System.Int32,UnityEngine.Rendering.RenderTargetIdentifier,System.Int32,System.Int32)\">\n      <summary>\n        <para>Adds a command to copy a texture into another texture.</para>\n      </summary>\n      <param name=\"src\">Source texture or identifier, see RenderTargetIdentifier.</param>\n      <param name=\"dst\">Destination texture or identifier, see RenderTargetIdentifier.</param>\n      <param name=\"srcElement\">Source texture element (cubemap face, texture array layer or 3D texture depth slice).</param>\n      <param name=\"srcMip\">Source texture mipmap level.</param>\n      <param name=\"dstElement\">Destination texture element (cubemap face, texture array layer or 3D texture depth slice).</param>\n      <param name=\"dstMip\">Destination texture mipmap level.</param>\n      <param name=\"srcX\">X coordinate of source texture region to copy (left side is zero).</param>\n      <param name=\"srcY\">Y coordinate of source texture region to copy (bottom is zero).</param>\n      <param name=\"srcWidth\">Width of source texture region to copy.</param>\n      <param name=\"srcHeight\">Height of source texture region to copy.</param>\n      <param name=\"dstX\">X coordinate of where to copy region in destination texture (left side is zero).</param>\n      <param name=\"dstY\">Y coordinate of where to copy region in destination texture (bottom is zero).</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.CopyTexture(UnityEngine.Rendering.RenderTargetIdentifier,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,UnityEngine.Rendering.RenderTargetIdentifier,System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Adds a command to copy a texture into another texture.</para>\n      </summary>\n      <param name=\"src\">Source texture or identifier, see RenderTargetIdentifier.</param>\n      <param name=\"dst\">Destination texture or identifier, see RenderTargetIdentifier.</param>\n      <param name=\"srcElement\">Source texture element (cubemap face, texture array layer or 3D texture depth slice).</param>\n      <param name=\"srcMip\">Source texture mipmap level.</param>\n      <param name=\"dstElement\">Destination texture element (cubemap face, texture array layer or 3D texture depth slice).</param>\n      <param name=\"dstMip\">Destination texture mipmap level.</param>\n      <param name=\"srcX\">X coordinate of source texture region to copy (left side is zero).</param>\n      <param name=\"srcY\">Y coordinate of source texture region to copy (bottom is zero).</param>\n      <param name=\"srcWidth\">Width of source texture region to copy.</param>\n      <param name=\"srcHeight\">Height of source texture region to copy.</param>\n      <param name=\"dstX\">X coordinate of where to copy region in destination texture (left side is zero).</param>\n      <param name=\"dstY\">Y coordinate of where to copy region in destination texture (bottom is zero).</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.CreateGPUFence(UnityEngine.Rendering.SynchronisationStage)\">\n      <summary>\n        <para>Creates a GPUFence which will be passed after the last Blit, Clear, Draw, Dispatch or Texture Copy command prior to this call has been completed on the GPU.</para>\n      </summary>\n      <param name=\"stage\">On some platforms there is a significant gap between the vertex processing completing and the pixel processing begining for a given draw call. This parameter allows for the fence to be passed after either the vertex or pixel processing for the proceeding draw has completed. If a compute shader dispatch was the last task submitted then this parameter is ignored.</param>\n      <returns>\n        <para>Returns a new GPUFence.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.#ctor\">\n      <summary>\n        <para>Create a new empty command buffer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.DisableScissorRect\">\n      <summary>\n        <para>Add a command to disable the hardware scissor rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.DisableShaderKeyword(System.String)\">\n      <summary>\n        <para>Adds a command to disable global shader keyword.</para>\n      </summary>\n      <param name=\"keyword\">Shader keyword to disable.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.DispatchCompute(UnityEngine.ComputeShader,System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Add a command to execute a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to execute.</param>\n      <param name=\"kernelIndex\">Kernel index to execute, see ComputeShader.FindKernel.</param>\n      <param name=\"threadGroupsX\">Number of work groups in the X dimension.</param>\n      <param name=\"threadGroupsY\">Number of work groups in the Y dimension.</param>\n      <param name=\"threadGroupsZ\">Number of work groups in the Z dimension.</param>\n      <param name=\"indirectBuffer\">ComputeBuffer with dispatch arguments.</param>\n      <param name=\"argsOffset\">Byte offset indicating the location of the dispatch arguments in the buffer.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.DispatchCompute(UnityEngine.ComputeShader,System.Int32,UnityEngine.ComputeBuffer,System.UInt32)\">\n      <summary>\n        <para>Add a command to execute a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to execute.</param>\n      <param name=\"kernelIndex\">Kernel index to execute, see ComputeShader.FindKernel.</param>\n      <param name=\"threadGroupsX\">Number of work groups in the X dimension.</param>\n      <param name=\"threadGroupsY\">Number of work groups in the Y dimension.</param>\n      <param name=\"threadGroupsZ\">Number of work groups in the Z dimension.</param>\n      <param name=\"indirectBuffer\">ComputeBuffer with dispatch arguments.</param>\n      <param name=\"argsOffset\">Byte offset indicating the location of the dispatch arguments in the buffer.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.DrawMesh(UnityEngine.Mesh,UnityEngine.Matrix4x4,UnityEngine.Material,System.Int32,System.Int32,UnityEngine.MaterialPropertyBlock)\">\n      <summary>\n        <para>Add a \"draw mesh\" command.</para>\n      </summary>\n      <param name=\"mesh\">Mesh to draw.</param>\n      <param name=\"matrix\">Transformation matrix to use.</param>\n      <param name=\"material\">Material to use.</param>\n      <param name=\"submeshIndex\">Which subset of the mesh to render.</param>\n      <param name=\"shaderPass\">Which pass of the shader to use (default is -1, which renders all passes).</param>\n      <param name=\"properties\">Additional material properties to apply onto material just before this mesh will be drawn. See MaterialPropertyBlock.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.DrawMeshInstanced(UnityEngine.Mesh,System.Int32,UnityEngine.Material,System.Int32,UnityEngine.Matrix4x4[],System.Int32,UnityEngine.MaterialPropertyBlock)\">\n      <summary>\n        <para>Add a \"draw mesh with instancing\" command.\n\nThe command will not immediately fail and throw an exception if Material.enableInstancing is false, but it will log an error and skips rendering each time the command is being executed if such a condition is detected.\n\nInvalidOperationException will be thrown if the current platform doesn't support this API (i.e. if GPU instancing is not available). See SystemInfo.supportsInstancing.</para>\n      </summary>\n      <param name=\"mesh\">The Mesh to draw.</param>\n      <param name=\"submeshIndex\">Which subset of the mesh to draw. This applies only to meshes that are composed of several materials.</param>\n      <param name=\"material\">Material to use.</param>\n      <param name=\"shaderPass\">Which pass of the shader to use, or -1 which renders all passes.</param>\n      <param name=\"matrices\">The array of object transformation matrices.</param>\n      <param name=\"count\">The number of instances to be drawn.</param>\n      <param name=\"properties\">Additional material properties to apply onto material just before this mesh will be drawn. See MaterialPropertyBlock.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.DrawMeshInstancedIndirect(UnityEngine.Mesh,System.Int32,UnityEngine.Material,System.Int32,UnityEngine.ComputeBuffer,System.Int32,UnityEngine.MaterialPropertyBlock)\">\n      <summary>\n        <para>Add a \"draw mesh with indirect instancing\" command.</para>\n      </summary>\n      <param name=\"mesh\">The Mesh to draw.</param>\n      <param name=\"submeshIndex\">Which subset of the mesh to draw. This applies only to meshes that are composed of several materials.</param>\n      <param name=\"material\">Material to use.</param>\n      <param name=\"shaderPass\">Which pass of the shader to use, or -1 which renders all passes.</param>\n      <param name=\"properties\">Additional material properties to apply onto material just before this mesh will be drawn. See MaterialPropertyBlock.</param>\n      <param name=\"bufferWithArgs\">The GPU buffer containing the arguments for how many instances of this mesh to draw.</param>\n      <param name=\"argsOffset\">The byte offset into the buffer, where the draw arguments start.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.DrawProcedural(UnityEngine.Matrix4x4,UnityEngine.Material,System.Int32,UnityEngine.MeshTopology,System.Int32,System.Int32,UnityEngine.MaterialPropertyBlock)\">\n      <summary>\n        <para>Add a \"draw procedural geometry\" command.</para>\n      </summary>\n      <param name=\"matrix\">Transformation matrix to use.</param>\n      <param name=\"material\">Material to use.</param>\n      <param name=\"shaderPass\">Which pass of the shader to use (or -1 for all passes).</param>\n      <param name=\"topology\">Topology of the procedural geometry.</param>\n      <param name=\"vertexCount\">Vertex count to render.</param>\n      <param name=\"instanceCount\">Instance count to render.</param>\n      <param name=\"properties\">Additional material properties to apply just before rendering. See MaterialPropertyBlock.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.DrawProceduralIndirect(UnityEngine.Matrix4x4,UnityEngine.Material,System.Int32,UnityEngine.MeshTopology,UnityEngine.ComputeBuffer,System.Int32,UnityEngine.MaterialPropertyBlock)\">\n      <summary>\n        <para>Add a \"draw procedural geometry\" command.</para>\n      </summary>\n      <param name=\"matrix\">Transformation matrix to use.</param>\n      <param name=\"material\">Material to use.</param>\n      <param name=\"shaderPass\">Which pass of the shader to use (or -1 for all passes).</param>\n      <param name=\"topology\">Topology of the procedural geometry.</param>\n      <param name=\"properties\">Additional material properties to apply just before rendering. See MaterialPropertyBlock.</param>\n      <param name=\"bufferWithArgs\">Buffer with draw arguments.</param>\n      <param name=\"argsOffset\">Byte offset where in the buffer the draw arguments are.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.DrawRenderer(UnityEngine.Renderer,UnityEngine.Material,System.Int32,System.Int32)\">\n      <summary>\n        <para>Add a \"draw renderer\" command.</para>\n      </summary>\n      <param name=\"renderer\">Renderer to draw.</param>\n      <param name=\"material\">Material to use.</param>\n      <param name=\"submeshIndex\">Which subset of the mesh to render.</param>\n      <param name=\"shaderPass\">Which pass of the shader to use (default is -1, which renders all passes).</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.EnableScissorRect(UnityEngine.Rect)\">\n      <summary>\n        <para>Add a command to enable the hardware scissor rectangle.</para>\n      </summary>\n      <param name=\"scissor\">Viewport rectangle in pixel coordinates.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.EnableShaderKeyword(System.String)\">\n      <summary>\n        <para>Adds a command to enable global shader keyword.</para>\n      </summary>\n      <param name=\"keyword\">Shader keyword to enable.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.EndSample(System.String)\">\n      <summary>\n        <para>Adds a command to begin profile sampling.</para>\n      </summary>\n      <param name=\"name\">Name of the profile information used for sampling.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.GenerateMips(UnityEngine.RenderTexture)\">\n      <summary>\n        <para>Generate mipmap levels of a render texture.</para>\n      </summary>\n      <param name=\"rt\">The render texture requiring mipmaps generation.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.GetTemporaryRT(System.Int32,System.Int32,System.Int32,System.Int32,UnityEngine.FilterMode,UnityEngine.RenderTextureFormat,UnityEngine.RenderTextureReadWrite,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Add a \"get a temporary render texture\" command.</para>\n      </summary>\n      <param name=\"nameID\">Shader property name for this texture.</param>\n      <param name=\"width\">Width in pixels, or -1 for \"camera pixel width\".</param>\n      <param name=\"height\">Height in pixels, or -1 for \"camera pixel height\".</param>\n      <param name=\"depthBuffer\">Depth buffer bits (0, 16 or 24).</param>\n      <param name=\"filter\">Texture filtering mode (default is Point).</param>\n      <param name=\"format\">Format of the render texture (default is ARGB32).</param>\n      <param name=\"readWrite\">Color space conversion mode.</param>\n      <param name=\"antiAliasing\">Anti-aliasing (default is no anti-aliasing).</param>\n      <param name=\"enableRandomWrite\">Should random-write access into the texture be enabled (default is false).</param>\n      <param name=\"desc\">Use this RenderTextureDescriptor for the settings when creating the temporary RenderTexture.</param>\n      <param name=\"memorylessMode\">Render texture memoryless mode.</param>\n      <param name=\"useDynamicScale\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.GetTemporaryRT(System.Int32,UnityEngine.RenderTextureDescriptor,UnityEngine.FilterMode)\">\n      <summary>\n        <para>Add a \"get a temporary render texture\" command.</para>\n      </summary>\n      <param name=\"nameID\">Shader property name for this texture.</param>\n      <param name=\"width\">Width in pixels, or -1 for \"camera pixel width\".</param>\n      <param name=\"height\">Height in pixels, or -1 for \"camera pixel height\".</param>\n      <param name=\"depthBuffer\">Depth buffer bits (0, 16 or 24).</param>\n      <param name=\"filter\">Texture filtering mode (default is Point).</param>\n      <param name=\"format\">Format of the render texture (default is ARGB32).</param>\n      <param name=\"readWrite\">Color space conversion mode.</param>\n      <param name=\"antiAliasing\">Anti-aliasing (default is no anti-aliasing).</param>\n      <param name=\"enableRandomWrite\">Should random-write access into the texture be enabled (default is false).</param>\n      <param name=\"desc\">Use this RenderTextureDescriptor for the settings when creating the temporary RenderTexture.</param>\n      <param name=\"memorylessMode\">Render texture memoryless mode.</param>\n      <param name=\"useDynamicScale\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.GetTemporaryRTArray(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,UnityEngine.FilterMode,UnityEngine.RenderTextureFormat,UnityEngine.RenderTextureReadWrite,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Add a \"get a temporary render texture array\" command.</para>\n      </summary>\n      <param name=\"nameID\">Shader property name for this texture.</param>\n      <param name=\"width\">Width in pixels, or -1 for \"camera pixel width\".</param>\n      <param name=\"height\">Height in pixels, or -1 for \"camera pixel height\".</param>\n      <param name=\"slices\">Number of slices in texture array.</param>\n      <param name=\"depthBuffer\">Depth buffer bits (0, 16 or 24).</param>\n      <param name=\"filter\">Texture filtering mode (default is Point).</param>\n      <param name=\"format\">Format of the render texture (default is ARGB32).</param>\n      <param name=\"readWrite\">Color space conversion mode.</param>\n      <param name=\"antiAliasing\">Anti-aliasing (default is no anti-aliasing).</param>\n      <param name=\"enableRandomWrite\">Should random-write access into the texture be enabled (default is false).</param>\n      <param name=\"useDynamicScale\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.IssuePluginCustomBlit(System.IntPtr,System.UInt32,UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.RenderTargetIdentifier,System.UInt32,System.UInt32)\">\n      <summary>\n        <para>Send a user-defined blit event to a native code plugin.</para>\n      </summary>\n      <param name=\"callback\">Native code callback to queue for Unity's renderer to invoke.</param>\n      <param name=\"command\">User defined command id to send to the callback.</param>\n      <param name=\"source\">Source render target.</param>\n      <param name=\"dest\">Destination render target.</param>\n      <param name=\"commandParam\">User data command parameters.</param>\n      <param name=\"commandFlags\">User data command flags.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.IssuePluginCustomTextureUpdate(System.IntPtr,UnityEngine.Texture,System.UInt32)\">\n      <summary>\n        <para>Send a texture update event to a native code plugin.</para>\n      </summary>\n      <param name=\"callback\">Native code callback to queue for Unity's renderer to invoke.</param>\n      <param name=\"targetTexture\">Texture resource to be updated.</param>\n      <param name=\"commandParam\">User data to send to the native plugin.</param>\n      <param name=\"userData\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.IssuePluginEvent(System.IntPtr,System.Int32)\">\n      <summary>\n        <para>Send a user-defined event to a native code plugin.</para>\n      </summary>\n      <param name=\"callback\">Native code callback to queue for Unity's renderer to invoke.</param>\n      <param name=\"eventID\">User defined id to send to the callback.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.IssuePluginEventAndData(System.IntPtr,System.Int32,System.IntPtr)\">\n      <summary>\n        <para>Send a user-defined event to a native code plugin with custom data.</para>\n      </summary>\n      <param name=\"callback\">Native code callback to queue for Unity's renderer to invoke.</param>\n      <param name=\"data\">Custom data to pass to the native plugin callback.</param>\n      <param name=\"eventID\">Built in or user defined id to send to the callback.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.ReleaseTemporaryRT(System.Int32)\">\n      <summary>\n        <para>Add a \"release a temporary render texture\" command.</para>\n      </summary>\n      <param name=\"nameID\">Shader property name for this texture.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.RequestAsyncReadback(UnityEngine.ComputeBuffer,System.Action`1&lt;UnityEngine.Rendering.AsyncGPUReadbackRequest&gt;)\">\n      <summary>\n        <para>Adds an asynchonous GPU readback request command to the command buffer.</para>\n      </summary>\n      <param name=\"src\">The resource to read the data from.</param>\n      <param name=\"size\">Size in bytes of the data to be retrieved from the ComputeBuffer.</param>\n      <param name=\"offset\">Offset in bytes in the ComputeBuffer.</param>\n      <param name=\"mipIndex\">The index of the mipmap to be fetched.</param>\n      <param name=\"dstFormat\">The target TextureFormat of the data. Conversion will happen automatically if format is different from the format stored on GPU.</param>\n      <param name=\"x\">Starting X coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"y\">Starting Y coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"z\">Start Z coordinate in pixels for the Texture3D being fetched. Index of Start layer for TextureCube, Texture2DArray and TextureCubeArray being fetched.</param>\n      <param name=\"depth\">Depth in pixels for Texture3D being fetched. Number of layers for TextureCube, TextureArray and TextureCubeArray.</param>\n      <param name=\"width\">Width in pixels of the Texture data to be fetched.</param>\n      <param name=\"height\">Height in pixels of the Texture data to be fetched.</param>\n      <param name=\"callback\">A delegate System.Action called once the request is fullfilled. The done request is passed as parameter to the System.Action.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.RequestAsyncReadback(UnityEngine.ComputeBuffer,System.Int32,System.Int32,System.Action`1&lt;UnityEngine.Rendering.AsyncGPUReadbackRequest&gt;)\">\n      <summary>\n        <para>Adds an asynchonous GPU readback request command to the command buffer.</para>\n      </summary>\n      <param name=\"src\">The resource to read the data from.</param>\n      <param name=\"size\">Size in bytes of the data to be retrieved from the ComputeBuffer.</param>\n      <param name=\"offset\">Offset in bytes in the ComputeBuffer.</param>\n      <param name=\"mipIndex\">The index of the mipmap to be fetched.</param>\n      <param name=\"dstFormat\">The target TextureFormat of the data. Conversion will happen automatically if format is different from the format stored on GPU.</param>\n      <param name=\"x\">Starting X coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"y\">Starting Y coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"z\">Start Z coordinate in pixels for the Texture3D being fetched. Index of Start layer for TextureCube, Texture2DArray and TextureCubeArray being fetched.</param>\n      <param name=\"depth\">Depth in pixels for Texture3D being fetched. Number of layers for TextureCube, TextureArray and TextureCubeArray.</param>\n      <param name=\"width\">Width in pixels of the Texture data to be fetched.</param>\n      <param name=\"height\">Height in pixels of the Texture data to be fetched.</param>\n      <param name=\"callback\">A delegate System.Action called once the request is fullfilled. The done request is passed as parameter to the System.Action.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.RequestAsyncReadback(UnityEngine.Texture,System.Action`1&lt;UnityEngine.Rendering.AsyncGPUReadbackRequest&gt;)\">\n      <summary>\n        <para>Adds an asynchonous GPU readback request command to the command buffer.</para>\n      </summary>\n      <param name=\"src\">The resource to read the data from.</param>\n      <param name=\"size\">Size in bytes of the data to be retrieved from the ComputeBuffer.</param>\n      <param name=\"offset\">Offset in bytes in the ComputeBuffer.</param>\n      <param name=\"mipIndex\">The index of the mipmap to be fetched.</param>\n      <param name=\"dstFormat\">The target TextureFormat of the data. Conversion will happen automatically if format is different from the format stored on GPU.</param>\n      <param name=\"x\">Starting X coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"y\">Starting Y coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"z\">Start Z coordinate in pixels for the Texture3D being fetched. Index of Start layer for TextureCube, Texture2DArray and TextureCubeArray being fetched.</param>\n      <param name=\"depth\">Depth in pixels for Texture3D being fetched. Number of layers for TextureCube, TextureArray and TextureCubeArray.</param>\n      <param name=\"width\">Width in pixels of the Texture data to be fetched.</param>\n      <param name=\"height\">Height in pixels of the Texture data to be fetched.</param>\n      <param name=\"callback\">A delegate System.Action called once the request is fullfilled. The done request is passed as parameter to the System.Action.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.RequestAsyncReadback(UnityEngine.Texture,System.Int32,System.Action`1&lt;UnityEngine.Rendering.AsyncGPUReadbackRequest&gt;)\">\n      <summary>\n        <para>Adds an asynchonous GPU readback request command to the command buffer.</para>\n      </summary>\n      <param name=\"src\">The resource to read the data from.</param>\n      <param name=\"size\">Size in bytes of the data to be retrieved from the ComputeBuffer.</param>\n      <param name=\"offset\">Offset in bytes in the ComputeBuffer.</param>\n      <param name=\"mipIndex\">The index of the mipmap to be fetched.</param>\n      <param name=\"dstFormat\">The target TextureFormat of the data. Conversion will happen automatically if format is different from the format stored on GPU.</param>\n      <param name=\"x\">Starting X coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"y\">Starting Y coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"z\">Start Z coordinate in pixels for the Texture3D being fetched. Index of Start layer for TextureCube, Texture2DArray and TextureCubeArray being fetched.</param>\n      <param name=\"depth\">Depth in pixels for Texture3D being fetched. Number of layers for TextureCube, TextureArray and TextureCubeArray.</param>\n      <param name=\"width\">Width in pixels of the Texture data to be fetched.</param>\n      <param name=\"height\">Height in pixels of the Texture data to be fetched.</param>\n      <param name=\"callback\">A delegate System.Action called once the request is fullfilled. The done request is passed as parameter to the System.Action.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.RequestAsyncReadback(UnityEngine.Texture,System.Int32,UnityEngine.TextureFormat,System.Action`1&lt;UnityEngine.Rendering.AsyncGPUReadbackRequest&gt;)\">\n      <summary>\n        <para>Adds an asynchonous GPU readback request command to the command buffer.</para>\n      </summary>\n      <param name=\"src\">The resource to read the data from.</param>\n      <param name=\"size\">Size in bytes of the data to be retrieved from the ComputeBuffer.</param>\n      <param name=\"offset\">Offset in bytes in the ComputeBuffer.</param>\n      <param name=\"mipIndex\">The index of the mipmap to be fetched.</param>\n      <param name=\"dstFormat\">The target TextureFormat of the data. Conversion will happen automatically if format is different from the format stored on GPU.</param>\n      <param name=\"x\">Starting X coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"y\">Starting Y coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"z\">Start Z coordinate in pixels for the Texture3D being fetched. Index of Start layer for TextureCube, Texture2DArray and TextureCubeArray being fetched.</param>\n      <param name=\"depth\">Depth in pixels for Texture3D being fetched. Number of layers for TextureCube, TextureArray and TextureCubeArray.</param>\n      <param name=\"width\">Width in pixels of the Texture data to be fetched.</param>\n      <param name=\"height\">Height in pixels of the Texture data to be fetched.</param>\n      <param name=\"callback\">A delegate System.Action called once the request is fullfilled. The done request is passed as parameter to the System.Action.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.RequestAsyncReadback(UnityEngine.Texture,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Action`1&lt;UnityEngine.Rendering.AsyncGPUReadbackRequest&gt;)\">\n      <summary>\n        <para>Adds an asynchonous GPU readback request command to the command buffer.</para>\n      </summary>\n      <param name=\"src\">The resource to read the data from.</param>\n      <param name=\"size\">Size in bytes of the data to be retrieved from the ComputeBuffer.</param>\n      <param name=\"offset\">Offset in bytes in the ComputeBuffer.</param>\n      <param name=\"mipIndex\">The index of the mipmap to be fetched.</param>\n      <param name=\"dstFormat\">The target TextureFormat of the data. Conversion will happen automatically if format is different from the format stored on GPU.</param>\n      <param name=\"x\">Starting X coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"y\">Starting Y coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"z\">Start Z coordinate in pixels for the Texture3D being fetched. Index of Start layer for TextureCube, Texture2DArray and TextureCubeArray being fetched.</param>\n      <param name=\"depth\">Depth in pixels for Texture3D being fetched. Number of layers for TextureCube, TextureArray and TextureCubeArray.</param>\n      <param name=\"width\">Width in pixels of the Texture data to be fetched.</param>\n      <param name=\"height\">Height in pixels of the Texture data to be fetched.</param>\n      <param name=\"callback\">A delegate System.Action called once the request is fullfilled. The done request is passed as parameter to the System.Action.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.RequestAsyncReadback(UnityEngine.Texture,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,UnityEngine.TextureFormat,System.Action`1&lt;UnityEngine.Rendering.AsyncGPUReadbackRequest&gt;)\">\n      <summary>\n        <para>Adds an asynchonous GPU readback request command to the command buffer.</para>\n      </summary>\n      <param name=\"src\">The resource to read the data from.</param>\n      <param name=\"size\">Size in bytes of the data to be retrieved from the ComputeBuffer.</param>\n      <param name=\"offset\">Offset in bytes in the ComputeBuffer.</param>\n      <param name=\"mipIndex\">The index of the mipmap to be fetched.</param>\n      <param name=\"dstFormat\">The target TextureFormat of the data. Conversion will happen automatically if format is different from the format stored on GPU.</param>\n      <param name=\"x\">Starting X coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"y\">Starting Y coordinate in pixels of the Texture data to be fetched.</param>\n      <param name=\"z\">Start Z coordinate in pixels for the Texture3D being fetched. Index of Start layer for TextureCube, Texture2DArray and TextureCubeArray being fetched.</param>\n      <param name=\"depth\">Depth in pixels for Texture3D being fetched. Number of layers for TextureCube, TextureArray and TextureCubeArray.</param>\n      <param name=\"width\">Width in pixels of the Texture data to be fetched.</param>\n      <param name=\"height\">Height in pixels of the Texture data to be fetched.</param>\n      <param name=\"callback\">A delegate System.Action called once the request is fullfilled. The done request is passed as parameter to the System.Action.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeBufferParam(UnityEngine.ComputeShader,System.Int32,System.String,UnityEngine.ComputeBuffer)\">\n      <summary>\n        <para>Adds a command to set an input or output buffer parameter on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"kernelIndex\">Which kernel the buffer is being set for. See ComputeShader.FindKernel.</param>\n      <param name=\"name\">Name of the buffer variable in shader code.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"buffer\">Buffer to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeBufferParam(UnityEngine.ComputeShader,System.Int32,System.Int32,UnityEngine.ComputeBuffer)\">\n      <summary>\n        <para>Adds a command to set an input or output buffer parameter on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"kernelIndex\">Which kernel the buffer is being set for. See ComputeShader.FindKernel.</param>\n      <param name=\"name\">Name of the buffer variable in shader code.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"buffer\">Buffer to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeFloatParam(UnityEngine.ComputeShader,System.String,System.Single)\">\n      <summary>\n        <para>Adds a command to set a float parameter on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"name\">Name of the variable in shader code.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"val\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeFloatParam(UnityEngine.ComputeShader,System.Int32,System.Single)\">\n      <summary>\n        <para>Adds a command to set a float parameter on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"name\">Name of the variable in shader code.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"val\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeFloatParams(UnityEngine.ComputeShader,System.String,System.Single[])\">\n      <summary>\n        <para>Adds a command to set multiple consecutive float parameters on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"name\">Name of the variable in shader code.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"values\">Values to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeFloatParams(UnityEngine.ComputeShader,System.Int32,System.Single[])\">\n      <summary>\n        <para>Adds a command to set multiple consecutive float parameters on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"name\">Name of the variable in shader code.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"values\">Values to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeIntParam(UnityEngine.ComputeShader,System.String,System.Int32)\">\n      <summary>\n        <para>Adds a command to set an integer parameter on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"name\">Name of the variable in shader code.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"val\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeIntParam(UnityEngine.ComputeShader,System.Int32,System.Int32)\">\n      <summary>\n        <para>Adds a command to set an integer parameter on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"name\">Name of the variable in shader code.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"val\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeIntParams(UnityEngine.ComputeShader,System.String,System.Int32[])\">\n      <summary>\n        <para>Adds a command to set multiple consecutive integer parameters on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"name\">Name of the variable in shader code.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"values\">Values to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeIntParams(UnityEngine.ComputeShader,System.Int32,System.Int32[])\">\n      <summary>\n        <para>Adds a command to set multiple consecutive integer parameters on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"name\">Name of the variable in shader code.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"values\">Values to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeMatrixArrayParam(UnityEngine.ComputeShader,System.String,UnityEngine.Matrix4x4[])\">\n      <summary>\n        <para>Adds a command to set a matrix array parameter on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"name\">Name of the variable in shader code.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"values\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeMatrixArrayParam(UnityEngine.ComputeShader,System.Int32,UnityEngine.Matrix4x4[])\">\n      <summary>\n        <para>Adds a command to set a matrix array parameter on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"name\">Name of the variable in shader code.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"values\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeMatrixParam(UnityEngine.ComputeShader,System.String,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Adds a command to set a matrix parameter on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"name\">Name of the variable in shader code.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"val\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeMatrixParam(UnityEngine.ComputeShader,System.Int32,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Adds a command to set a matrix parameter on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"name\">Name of the variable in shader code.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"val\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeTextureParam(UnityEngine.ComputeShader,System.Int32,System.String,UnityEngine.Rendering.RenderTargetIdentifier)\">\n      <summary>\n        <para>Adds a command to set a texture parameter on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"kernelIndex\">Which kernel the texture is being set for. See ComputeShader.FindKernel.</param>\n      <param name=\"name\">Name of the texture variable in shader code.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"rt\">Texture value or identifier to set, see RenderTargetIdentifier.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeTextureParam(UnityEngine.ComputeShader,System.Int32,System.Int32,UnityEngine.Rendering.RenderTargetIdentifier)\">\n      <summary>\n        <para>Adds a command to set a texture parameter on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"kernelIndex\">Which kernel the texture is being set for. See ComputeShader.FindKernel.</param>\n      <param name=\"name\">Name of the texture variable in shader code.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"rt\">Texture value or identifier to set, see RenderTargetIdentifier.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeVectorArrayParam(UnityEngine.ComputeShader,System.String,UnityEngine.Vector4[])\">\n      <summary>\n        <para>Adds a command to set a vector array parameter on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"name\">Property name.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"values\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeVectorArrayParam(UnityEngine.ComputeShader,System.Int32,UnityEngine.Vector4[])\">\n      <summary>\n        <para>Adds a command to set a vector array parameter on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"name\">Property name.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"values\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeVectorParam(UnityEngine.ComputeShader,System.String,UnityEngine.Vector4)\">\n      <summary>\n        <para>Adds a command to set a vector parameter on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"name\">Name of the variable in shader code.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"val\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetComputeVectorParam(UnityEngine.ComputeShader,System.Int32,UnityEngine.Vector4)\">\n      <summary>\n        <para>Adds a command to set a vector parameter on a ComputeShader.</para>\n      </summary>\n      <param name=\"computeShader\">ComputeShader to set parameter for.</param>\n      <param name=\"name\">Name of the variable in shader code.</param>\n      <param name=\"nameID\">Property name ID. Use Shader.PropertyToID to get this ID.</param>\n      <param name=\"val\">Value to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalBuffer(System.String,UnityEngine.ComputeBuffer)\">\n      <summary>\n        <para>Add a \"set global shader buffer property\" command.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"value\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalBuffer(System.Int32,UnityEngine.ComputeBuffer)\">\n      <summary>\n        <para>Add a \"set global shader buffer property\" command.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"value\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalColor(System.String,UnityEngine.Color)\">\n      <summary>\n        <para>Add a \"set global shader color property\" command.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"value\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalColor(System.Int32,UnityEngine.Color)\">\n      <summary>\n        <para>Add a \"set global shader color property\" command.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"value\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalDepthBias(System.Single,System.Single)\">\n      <summary>\n        <para>Add a command to set global depth bias.</para>\n      </summary>\n      <param name=\"bias\">Constant depth bias.</param>\n      <param name=\"slopeBias\">Slope-dependent depth bias.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalFloat(System.String,System.Single)\">\n      <summary>\n        <para>Add a \"set global shader float property\" command.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"value\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalFloat(System.Int32,System.Single)\">\n      <summary>\n        <para>Add a \"set global shader float property\" command.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"value\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalFloatArray(System.String,System.Single[])\">\n      <summary>\n        <para>Add a \"set global shader float array property\" command.</para>\n      </summary>\n      <param name=\"propertyName\"></param>\n      <param name=\"values\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalFloatArray(System.Int32,System.Single[])\">\n      <summary>\n        <para>Add a \"set global shader float array property\" command.</para>\n      </summary>\n      <param name=\"propertyName\"></param>\n      <param name=\"values\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalFloatArray(System.String,System.Collections.Generic.List`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Add a \"set global shader float array property\" command.</para>\n      </summary>\n      <param name=\"propertyName\"></param>\n      <param name=\"values\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalFloatArray(System.Int32,System.Collections.Generic.List`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Add a \"set global shader float array property\" command.</para>\n      </summary>\n      <param name=\"propertyName\"></param>\n      <param name=\"values\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalInt(System.String,System.Int32)\">\n      <summary>\n        <para>Sets the given global integer property for all shaders.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"value\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalInt(System.Int32,System.Int32)\">\n      <summary>\n        <para>Sets the given global integer property for all shaders.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"value\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalMatrix(System.String,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Add a \"set global shader matrix property\" command.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"value\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalMatrix(System.Int32,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Add a \"set global shader matrix property\" command.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"value\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalMatrixArray(System.String,UnityEngine.Matrix4x4[])\">\n      <summary>\n        <para>Add a \"set global shader matrix array property\" command.</para>\n      </summary>\n      <param name=\"propertyName\"></param>\n      <param name=\"values\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalMatrixArray(System.Int32,UnityEngine.Matrix4x4[])\">\n      <summary>\n        <para>Add a \"set global shader matrix array property\" command.</para>\n      </summary>\n      <param name=\"propertyName\"></param>\n      <param name=\"values\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalMatrixArray(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Matrix4x4&gt;)\">\n      <summary>\n        <para>Add a \"set global shader matrix array property\" command.</para>\n      </summary>\n      <param name=\"propertyName\"></param>\n      <param name=\"values\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalMatrixArray(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Matrix4x4&gt;)\">\n      <summary>\n        <para>Add a \"set global shader matrix array property\" command.</para>\n      </summary>\n      <param name=\"propertyName\"></param>\n      <param name=\"values\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalTexture(System.String,UnityEngine.Rendering.RenderTargetIdentifier)\">\n      <summary>\n        <para>Add a \"set global shader texture property\" command, referencing a RenderTexture.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"value\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalTexture(System.Int32,UnityEngine.Rendering.RenderTargetIdentifier)\">\n      <summary>\n        <para>Add a \"set global shader texture property\" command, referencing a RenderTexture.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"value\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalVector(System.String,UnityEngine.Vector4)\">\n      <summary>\n        <para>Add a \"set global shader vector property\" command.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"value\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalVector(System.Int32,UnityEngine.Vector4)\">\n      <summary>\n        <para>Add a \"set global shader vector property\" command.</para>\n      </summary>\n      <param name=\"name\"></param>\n      <param name=\"value\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalVectorArray(System.String,UnityEngine.Vector4[])\">\n      <summary>\n        <para>Add a \"set global shader vector array property\" command.</para>\n      </summary>\n      <param name=\"propertyName\"></param>\n      <param name=\"values\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalVectorArray(System.Int32,UnityEngine.Vector4[])\">\n      <summary>\n        <para>Add a \"set global shader vector array property\" command.</para>\n      </summary>\n      <param name=\"propertyName\"></param>\n      <param name=\"values\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalVectorArray(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Add a \"set global shader vector array property\" command.</para>\n      </summary>\n      <param name=\"propertyName\"></param>\n      <param name=\"values\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetGlobalVectorArray(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Add a \"set global shader vector array property\" command.</para>\n      </summary>\n      <param name=\"propertyName\"></param>\n      <param name=\"values\"></param>\n      <param name=\"nameID\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetInvertCulling(System.Boolean)\">\n      <summary>\n        <para>Add a \"set invert culling\" command to the buffer.</para>\n      </summary>\n      <param name=\"invertCulling\">A boolean indicating whether to invert the backface culling (true) or not (false).</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetProjectionMatrix(UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Add a command to set the projection matrix.</para>\n      </summary>\n      <param name=\"proj\">Projection (camera to clip space) matrix.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetRandomWriteTarget(System.Int32,UnityEngine.Rendering.RenderTargetIdentifier)\">\n      <summary>\n        <para>Set random write target for level pixel shaders.</para>\n      </summary>\n      <param name=\"index\">Index of the random write target in the shader.</param>\n      <param name=\"buffer\">ComputeBuffer to set as write targe.</param>\n      <param name=\"preserveCounterValue\">Whether to leave the append/consume counter value unchanged.</param>\n      <param name=\"rt\">RenderTargetIdentifier to set as write target.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetRandomWriteTarget(System.Int32,UnityEngine.ComputeBuffer,System.Boolean)\">\n      <summary>\n        <para>Set random write target for level pixel shaders.</para>\n      </summary>\n      <param name=\"index\">Index of the random write target in the shader.</param>\n      <param name=\"buffer\">ComputeBuffer to set as write targe.</param>\n      <param name=\"preserveCounterValue\">Whether to leave the append/consume counter value unchanged.</param>\n      <param name=\"rt\">RenderTargetIdentifier to set as write target.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetRenderTarget(UnityEngine.Rendering.RenderTargetIdentifier)\">\n      <summary>\n        <para>Add a \"set active render target\" command.</para>\n      </summary>\n      <param name=\"rt\">Render target to set for both color &amp; depth buffers.</param>\n      <param name=\"color\">Render target to set as a color buffer.</param>\n      <param name=\"colors\">Render targets to set as color buffers (MRT).</param>\n      <param name=\"depth\">Render target to set as a depth buffer.</param>\n      <param name=\"mipLevel\">The mip level of the render target to render into.</param>\n      <param name=\"cubemapFace\">The cubemap face of a cubemap render target to render into.</param>\n      <param name=\"depthSlice\">Slice of a 3D or array render target to set.</param>\n      <param name=\"loadAction\">Load action that is used for color and depth/stencil buffers.</param>\n      <param name=\"storeAction\">Store action that is used for color and depth/stencil buffers.</param>\n      <param name=\"colorLoadAction\">Load action that is used for the color buffer.</param>\n      <param name=\"colorStoreAction\">Store action that is used for the color buffer.</param>\n      <param name=\"depthLoadAction\">Load action that is used for the depth/stencil buffer.</param>\n      <param name=\"depthStoreAction\">Store action that is used for the depth/stencil buffer.</param>\n      <param name=\"binding\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetRenderTarget(UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.RenderBufferLoadAction,UnityEngine.Rendering.RenderBufferStoreAction)\">\n      <summary>\n        <para>Add a \"set active render target\" command.</para>\n      </summary>\n      <param name=\"rt\">Render target to set for both color &amp; depth buffers.</param>\n      <param name=\"color\">Render target to set as a color buffer.</param>\n      <param name=\"colors\">Render targets to set as color buffers (MRT).</param>\n      <param name=\"depth\">Render target to set as a depth buffer.</param>\n      <param name=\"mipLevel\">The mip level of the render target to render into.</param>\n      <param name=\"cubemapFace\">The cubemap face of a cubemap render target to render into.</param>\n      <param name=\"depthSlice\">Slice of a 3D or array render target to set.</param>\n      <param name=\"loadAction\">Load action that is used for color and depth/stencil buffers.</param>\n      <param name=\"storeAction\">Store action that is used for color and depth/stencil buffers.</param>\n      <param name=\"colorLoadAction\">Load action that is used for the color buffer.</param>\n      <param name=\"colorStoreAction\">Store action that is used for the color buffer.</param>\n      <param name=\"depthLoadAction\">Load action that is used for the depth/stencil buffer.</param>\n      <param name=\"depthStoreAction\">Store action that is used for the depth/stencil buffer.</param>\n      <param name=\"binding\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetRenderTarget(UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.RenderBufferLoadAction,UnityEngine.Rendering.RenderBufferStoreAction,UnityEngine.Rendering.RenderBufferLoadAction,UnityEngine.Rendering.RenderBufferStoreAction)\">\n      <summary>\n        <para>Add a \"set active render target\" command.</para>\n      </summary>\n      <param name=\"rt\">Render target to set for both color &amp; depth buffers.</param>\n      <param name=\"color\">Render target to set as a color buffer.</param>\n      <param name=\"colors\">Render targets to set as color buffers (MRT).</param>\n      <param name=\"depth\">Render target to set as a depth buffer.</param>\n      <param name=\"mipLevel\">The mip level of the render target to render into.</param>\n      <param name=\"cubemapFace\">The cubemap face of a cubemap render target to render into.</param>\n      <param name=\"depthSlice\">Slice of a 3D or array render target to set.</param>\n      <param name=\"loadAction\">Load action that is used for color and depth/stencil buffers.</param>\n      <param name=\"storeAction\">Store action that is used for color and depth/stencil buffers.</param>\n      <param name=\"colorLoadAction\">Load action that is used for the color buffer.</param>\n      <param name=\"colorStoreAction\">Store action that is used for the color buffer.</param>\n      <param name=\"depthLoadAction\">Load action that is used for the depth/stencil buffer.</param>\n      <param name=\"depthStoreAction\">Store action that is used for the depth/stencil buffer.</param>\n      <param name=\"binding\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetRenderTarget(UnityEngine.Rendering.RenderTargetIdentifier,System.Int32)\">\n      <summary>\n        <para>Add a \"set active render target\" command.</para>\n      </summary>\n      <param name=\"rt\">Render target to set for both color &amp; depth buffers.</param>\n      <param name=\"color\">Render target to set as a color buffer.</param>\n      <param name=\"colors\">Render targets to set as color buffers (MRT).</param>\n      <param name=\"depth\">Render target to set as a depth buffer.</param>\n      <param name=\"mipLevel\">The mip level of the render target to render into.</param>\n      <param name=\"cubemapFace\">The cubemap face of a cubemap render target to render into.</param>\n      <param name=\"depthSlice\">Slice of a 3D or array render target to set.</param>\n      <param name=\"loadAction\">Load action that is used for color and depth/stencil buffers.</param>\n      <param name=\"storeAction\">Store action that is used for color and depth/stencil buffers.</param>\n      <param name=\"colorLoadAction\">Load action that is used for the color buffer.</param>\n      <param name=\"colorStoreAction\">Store action that is used for the color buffer.</param>\n      <param name=\"depthLoadAction\">Load action that is used for the depth/stencil buffer.</param>\n      <param name=\"depthStoreAction\">Store action that is used for the depth/stencil buffer.</param>\n      <param name=\"binding\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetRenderTarget(UnityEngine.Rendering.RenderTargetIdentifier,System.Int32,UnityEngine.CubemapFace)\">\n      <summary>\n        <para>Add a \"set active render target\" command.</para>\n      </summary>\n      <param name=\"rt\">Render target to set for both color &amp; depth buffers.</param>\n      <param name=\"color\">Render target to set as a color buffer.</param>\n      <param name=\"colors\">Render targets to set as color buffers (MRT).</param>\n      <param name=\"depth\">Render target to set as a depth buffer.</param>\n      <param name=\"mipLevel\">The mip level of the render target to render into.</param>\n      <param name=\"cubemapFace\">The cubemap face of a cubemap render target to render into.</param>\n      <param name=\"depthSlice\">Slice of a 3D or array render target to set.</param>\n      <param name=\"loadAction\">Load action that is used for color and depth/stencil buffers.</param>\n      <param name=\"storeAction\">Store action that is used for color and depth/stencil buffers.</param>\n      <param name=\"colorLoadAction\">Load action that is used for the color buffer.</param>\n      <param name=\"colorStoreAction\">Store action that is used for the color buffer.</param>\n      <param name=\"depthLoadAction\">Load action that is used for the depth/stencil buffer.</param>\n      <param name=\"depthStoreAction\">Store action that is used for the depth/stencil buffer.</param>\n      <param name=\"binding\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetRenderTarget(UnityEngine.Rendering.RenderTargetIdentifier,System.Int32,UnityEngine.CubemapFace,System.Int32)\">\n      <summary>\n        <para>Add a \"set active render target\" command.</para>\n      </summary>\n      <param name=\"rt\">Render target to set for both color &amp; depth buffers.</param>\n      <param name=\"color\">Render target to set as a color buffer.</param>\n      <param name=\"colors\">Render targets to set as color buffers (MRT).</param>\n      <param name=\"depth\">Render target to set as a depth buffer.</param>\n      <param name=\"mipLevel\">The mip level of the render target to render into.</param>\n      <param name=\"cubemapFace\">The cubemap face of a cubemap render target to render into.</param>\n      <param name=\"depthSlice\">Slice of a 3D or array render target to set.</param>\n      <param name=\"loadAction\">Load action that is used for color and depth/stencil buffers.</param>\n      <param name=\"storeAction\">Store action that is used for color and depth/stencil buffers.</param>\n      <param name=\"colorLoadAction\">Load action that is used for the color buffer.</param>\n      <param name=\"colorStoreAction\">Store action that is used for the color buffer.</param>\n      <param name=\"depthLoadAction\">Load action that is used for the depth/stencil buffer.</param>\n      <param name=\"depthStoreAction\">Store action that is used for the depth/stencil buffer.</param>\n      <param name=\"binding\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetRenderTarget(UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.RenderTargetIdentifier)\">\n      <summary>\n        <para>Add a \"set active render target\" command.</para>\n      </summary>\n      <param name=\"rt\">Render target to set for both color &amp; depth buffers.</param>\n      <param name=\"color\">Render target to set as a color buffer.</param>\n      <param name=\"colors\">Render targets to set as color buffers (MRT).</param>\n      <param name=\"depth\">Render target to set as a depth buffer.</param>\n      <param name=\"mipLevel\">The mip level of the render target to render into.</param>\n      <param name=\"cubemapFace\">The cubemap face of a cubemap render target to render into.</param>\n      <param name=\"depthSlice\">Slice of a 3D or array render target to set.</param>\n      <param name=\"loadAction\">Load action that is used for color and depth/stencil buffers.</param>\n      <param name=\"storeAction\">Store action that is used for color and depth/stencil buffers.</param>\n      <param name=\"colorLoadAction\">Load action that is used for the color buffer.</param>\n      <param name=\"colorStoreAction\">Store action that is used for the color buffer.</param>\n      <param name=\"depthLoadAction\">Load action that is used for the depth/stencil buffer.</param>\n      <param name=\"depthStoreAction\">Store action that is used for the depth/stencil buffer.</param>\n      <param name=\"binding\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetRenderTarget(UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.RenderBufferLoadAction,UnityEngine.Rendering.RenderBufferStoreAction,UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.RenderBufferLoadAction,UnityEngine.Rendering.RenderBufferStoreAction)\">\n      <summary>\n        <para>Add a \"set active render target\" command.</para>\n      </summary>\n      <param name=\"rt\">Render target to set for both color &amp; depth buffers.</param>\n      <param name=\"color\">Render target to set as a color buffer.</param>\n      <param name=\"colors\">Render targets to set as color buffers (MRT).</param>\n      <param name=\"depth\">Render target to set as a depth buffer.</param>\n      <param name=\"mipLevel\">The mip level of the render target to render into.</param>\n      <param name=\"cubemapFace\">The cubemap face of a cubemap render target to render into.</param>\n      <param name=\"depthSlice\">Slice of a 3D or array render target to set.</param>\n      <param name=\"loadAction\">Load action that is used for color and depth/stencil buffers.</param>\n      <param name=\"storeAction\">Store action that is used for color and depth/stencil buffers.</param>\n      <param name=\"colorLoadAction\">Load action that is used for the color buffer.</param>\n      <param name=\"colorStoreAction\">Store action that is used for the color buffer.</param>\n      <param name=\"depthLoadAction\">Load action that is used for the depth/stencil buffer.</param>\n      <param name=\"depthStoreAction\">Store action that is used for the depth/stencil buffer.</param>\n      <param name=\"binding\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetRenderTarget(UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.RenderTargetIdentifier,System.Int32)\">\n      <summary>\n        <para>Add a \"set active render target\" command.</para>\n      </summary>\n      <param name=\"rt\">Render target to set for both color &amp; depth buffers.</param>\n      <param name=\"color\">Render target to set as a color buffer.</param>\n      <param name=\"colors\">Render targets to set as color buffers (MRT).</param>\n      <param name=\"depth\">Render target to set as a depth buffer.</param>\n      <param name=\"mipLevel\">The mip level of the render target to render into.</param>\n      <param name=\"cubemapFace\">The cubemap face of a cubemap render target to render into.</param>\n      <param name=\"depthSlice\">Slice of a 3D or array render target to set.</param>\n      <param name=\"loadAction\">Load action that is used for color and depth/stencil buffers.</param>\n      <param name=\"storeAction\">Store action that is used for color and depth/stencil buffers.</param>\n      <param name=\"colorLoadAction\">Load action that is used for the color buffer.</param>\n      <param name=\"colorStoreAction\">Store action that is used for the color buffer.</param>\n      <param name=\"depthLoadAction\">Load action that is used for the depth/stencil buffer.</param>\n      <param name=\"depthStoreAction\">Store action that is used for the depth/stencil buffer.</param>\n      <param name=\"binding\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetRenderTarget(UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.RenderTargetIdentifier,System.Int32,UnityEngine.CubemapFace)\">\n      <summary>\n        <para>Add a \"set active render target\" command.</para>\n      </summary>\n      <param name=\"rt\">Render target to set for both color &amp; depth buffers.</param>\n      <param name=\"color\">Render target to set as a color buffer.</param>\n      <param name=\"colors\">Render targets to set as color buffers (MRT).</param>\n      <param name=\"depth\">Render target to set as a depth buffer.</param>\n      <param name=\"mipLevel\">The mip level of the render target to render into.</param>\n      <param name=\"cubemapFace\">The cubemap face of a cubemap render target to render into.</param>\n      <param name=\"depthSlice\">Slice of a 3D or array render target to set.</param>\n      <param name=\"loadAction\">Load action that is used for color and depth/stencil buffers.</param>\n      <param name=\"storeAction\">Store action that is used for color and depth/stencil buffers.</param>\n      <param name=\"colorLoadAction\">Load action that is used for the color buffer.</param>\n      <param name=\"colorStoreAction\">Store action that is used for the color buffer.</param>\n      <param name=\"depthLoadAction\">Load action that is used for the depth/stencil buffer.</param>\n      <param name=\"depthStoreAction\">Store action that is used for the depth/stencil buffer.</param>\n      <param name=\"binding\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetRenderTarget(UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.RenderTargetIdentifier,System.Int32,UnityEngine.CubemapFace,System.Int32)\">\n      <summary>\n        <para>Add a \"set active render target\" command.</para>\n      </summary>\n      <param name=\"rt\">Render target to set for both color &amp; depth buffers.</param>\n      <param name=\"color\">Render target to set as a color buffer.</param>\n      <param name=\"colors\">Render targets to set as color buffers (MRT).</param>\n      <param name=\"depth\">Render target to set as a depth buffer.</param>\n      <param name=\"mipLevel\">The mip level of the render target to render into.</param>\n      <param name=\"cubemapFace\">The cubemap face of a cubemap render target to render into.</param>\n      <param name=\"depthSlice\">Slice of a 3D or array render target to set.</param>\n      <param name=\"loadAction\">Load action that is used for color and depth/stencil buffers.</param>\n      <param name=\"storeAction\">Store action that is used for color and depth/stencil buffers.</param>\n      <param name=\"colorLoadAction\">Load action that is used for the color buffer.</param>\n      <param name=\"colorStoreAction\">Store action that is used for the color buffer.</param>\n      <param name=\"depthLoadAction\">Load action that is used for the depth/stencil buffer.</param>\n      <param name=\"depthStoreAction\">Store action that is used for the depth/stencil buffer.</param>\n      <param name=\"binding\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetRenderTarget(UnityEngine.Rendering.RenderTargetIdentifier[],UnityEngine.Rendering.RenderTargetIdentifier)\">\n      <summary>\n        <para>Add a \"set active render target\" command.</para>\n      </summary>\n      <param name=\"rt\">Render target to set for both color &amp; depth buffers.</param>\n      <param name=\"color\">Render target to set as a color buffer.</param>\n      <param name=\"colors\">Render targets to set as color buffers (MRT).</param>\n      <param name=\"depth\">Render target to set as a depth buffer.</param>\n      <param name=\"mipLevel\">The mip level of the render target to render into.</param>\n      <param name=\"cubemapFace\">The cubemap face of a cubemap render target to render into.</param>\n      <param name=\"depthSlice\">Slice of a 3D or array render target to set.</param>\n      <param name=\"loadAction\">Load action that is used for color and depth/stencil buffers.</param>\n      <param name=\"storeAction\">Store action that is used for color and depth/stencil buffers.</param>\n      <param name=\"colorLoadAction\">Load action that is used for the color buffer.</param>\n      <param name=\"colorStoreAction\">Store action that is used for the color buffer.</param>\n      <param name=\"depthLoadAction\">Load action that is used for the depth/stencil buffer.</param>\n      <param name=\"depthStoreAction\">Store action that is used for the depth/stencil buffer.</param>\n      <param name=\"binding\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetRenderTarget(UnityEngine.Rendering.RenderTargetBinding)\">\n      <summary>\n        <para>Add a \"set active render target\" command.</para>\n      </summary>\n      <param name=\"rt\">Render target to set for both color &amp; depth buffers.</param>\n      <param name=\"color\">Render target to set as a color buffer.</param>\n      <param name=\"colors\">Render targets to set as color buffers (MRT).</param>\n      <param name=\"depth\">Render target to set as a depth buffer.</param>\n      <param name=\"mipLevel\">The mip level of the render target to render into.</param>\n      <param name=\"cubemapFace\">The cubemap face of a cubemap render target to render into.</param>\n      <param name=\"depthSlice\">Slice of a 3D or array render target to set.</param>\n      <param name=\"loadAction\">Load action that is used for color and depth/stencil buffers.</param>\n      <param name=\"storeAction\">Store action that is used for color and depth/stencil buffers.</param>\n      <param name=\"colorLoadAction\">Load action that is used for the color buffer.</param>\n      <param name=\"colorStoreAction\">Store action that is used for the color buffer.</param>\n      <param name=\"depthLoadAction\">Load action that is used for the depth/stencil buffer.</param>\n      <param name=\"depthStoreAction\">Store action that is used for the depth/stencil buffer.</param>\n      <param name=\"binding\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetShadowSamplingMode(UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.ShadowSamplingMode)\">\n      <summary>\n        <para>Add a \"set shadow sampling mode\" command.</para>\n      </summary>\n      <param name=\"shadowmap\">Shadowmap render target to change the sampling mode on.</param>\n      <param name=\"mode\">New sampling mode.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetViewMatrix(UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Add a command to set the view matrix.</para>\n      </summary>\n      <param name=\"view\">View (world to camera space) matrix.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetViewport(UnityEngine.Rect)\">\n      <summary>\n        <para>Add a command to set the rendering viewport.</para>\n      </summary>\n      <param name=\"pixelRect\">Viewport rectangle in pixel coordinates.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.SetViewProjectionMatrices(UnityEngine.Matrix4x4,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Add a command to set the view and projection matrices.</para>\n      </summary>\n      <param name=\"view\">View (world to camera space) matrix.</param>\n      <param name=\"proj\">Projection (camera to clip space) matrix.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.CommandBuffer.WaitOnGPUFence(UnityEngine.Rendering.GPUFence,UnityEngine.Rendering.SynchronisationStage)\">\n      <summary>\n        <para>Instructs the GPU to wait until the given GPUFence is passed.</para>\n      </summary>\n      <param name=\"fence\">The GPUFence that the GPU will be instructed to wait upon.</param>\n      <param name=\"stage\">On some platforms there is a significant gap between the vertex processing completing and the pixel processing completing for a given draw call. This parameter allows for requested wait to be before the next items vertex or pixel processing begins. Some platforms can not differentiate between the start of vertex and pixel processing, these platforms will wait before the next items vertex processing. If a compute shader dispatch is the next item to be submitted then this parameter is ignored.</param>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.CompareFunction\">\n      <summary>\n        <para>Depth or stencil comparison function.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CompareFunction.Always\">\n      <summary>\n        <para>Always pass depth or stencil test.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CompareFunction.Disabled\">\n      <summary>\n        <para>Depth or stencil test is disabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CompareFunction.Equal\">\n      <summary>\n        <para>Pass depth or stencil test when values are equal.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CompareFunction.Greater\">\n      <summary>\n        <para>Pass depth or stencil test when new value is greater than old one.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CompareFunction.GreaterEqual\">\n      <summary>\n        <para>Pass depth or stencil test when new value is greater or equal than old one.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CompareFunction.Less\">\n      <summary>\n        <para>Pass depth or stencil test when new value is less than old one.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CompareFunction.LessEqual\">\n      <summary>\n        <para>Pass depth or stencil test when new value is less or equal than old one.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CompareFunction.Never\">\n      <summary>\n        <para>Never pass depth or stencil test.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CompareFunction.NotEqual\">\n      <summary>\n        <para>Pass depth or stencil test when values are different.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.ComputeQueueType\">\n      <summary>\n        <para>Describes the desired characteristics with respect to prioritisation and load balancing of the queue that a command buffer being submitted via Graphics.ExecuteCommandBufferAsync or [[ScriptableRenderContext.ExecuteCommandBufferAsync] should be sent to.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ComputeQueueType.Background\">\n      <summary>\n        <para>Background queue types would be the choice for tasks intended to run for an extended period of time, e.g for most of a frame or for several frames. Dispatches on background queues would execute at a lower priority than gfx queue tasks.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ComputeQueueType.Default\">\n      <summary>\n        <para>This queue type would be the choice for compute tasks supporting or as optimisations to graphics processing. CommandBuffers sent to this queue would be expected to complete within the scope of a single frame and likely be synchronised with the graphics queue via GPUFence’s. Dispatches on default queue types would execute at a lower priority than graphics queue tasks.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ComputeQueueType.Urgent\">\n      <summary>\n        <para>This queue type would be the choice for compute tasks requiring processing as soon as possible and would be prioritised over the graphics queue.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.CopyTextureSupport\">\n      <summary>\n        <para>Support for various Graphics.CopyTexture cases.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CopyTextureSupport.Basic\">\n      <summary>\n        <para>Basic Graphics.CopyTexture support.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CopyTextureSupport.Copy3D\">\n      <summary>\n        <para>Support for Texture3D in Graphics.CopyTexture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CopyTextureSupport.DifferentTypes\">\n      <summary>\n        <para>Support for Graphics.CopyTexture between different texture types.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CopyTextureSupport.None\">\n      <summary>\n        <para>No support for Graphics.CopyTexture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CopyTextureSupport.RTToTexture\">\n      <summary>\n        <para>Support for RenderTexture to Texture copies in Graphics.CopyTexture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CopyTextureSupport.TextureToRT\">\n      <summary>\n        <para>Support for Texture to RenderTexture copies in Graphics.CopyTexture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.CullMode\">\n      <summary>\n        <para>Backface culling mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CullMode.Back\">\n      <summary>\n        <para>Cull back-facing geometry.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CullMode.Front\">\n      <summary>\n        <para>Cull front-facing geometry.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.CullMode.Off\">\n      <summary>\n        <para>Disable culling.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.DefaultReflectionMode\">\n      <summary>\n        <para>Default reflection mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.DefaultReflectionMode.Custom\">\n      <summary>\n        <para>Custom default reflection.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.DefaultReflectionMode.Skybox\">\n      <summary>\n        <para>Skybox-based default reflection.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.GPUFence\">\n      <summary>\n        <para>Used to manage synchronisation between tasks on async compute queues and the graphics queue.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.GPUFence.passed\">\n      <summary>\n        <para>Has the GPUFence passed?\n\nAllows for CPU determination of whether the GPU has passed the point in its processing represented by the GPUFence.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.GraphicsDeviceType\">\n      <summary>\n        <para>Graphics device API type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsDeviceType.Direct3D11\">\n      <summary>\n        <para>Direct3D 11 graphics API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsDeviceType.Direct3D12\">\n      <summary>\n        <para>Direct3D 12 graphics API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsDeviceType.Direct3D9\">\n      <summary>\n        <para>Direct3D 9 graphics API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsDeviceType.Metal\">\n      <summary>\n        <para>iOS Metal graphics API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsDeviceType.N3DS\">\n      <summary>\n        <para>Nintendo 3DS graphics API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsDeviceType.Null\">\n      <summary>\n        <para>No graphics API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsDeviceType.OpenGL2\">\n      <summary>\n        <para>OpenGL 2.x graphics API. (deprecated, only available on Linux and MacOSX)</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsDeviceType.OpenGLCore\">\n      <summary>\n        <para>OpenGL (Core profile - GL3 or later) graphics API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsDeviceType.OpenGLES2\">\n      <summary>\n        <para>OpenGL ES 2.0 graphics API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsDeviceType.OpenGLES3\">\n      <summary>\n        <para>OpenGL ES 3.0 graphics API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsDeviceType.PlayStation3\">\n      <summary>\n        <para>PlayStation 3 graphics API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsDeviceType.PlayStation4\">\n      <summary>\n        <para>PlayStation 4 graphics API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsDeviceType.PlayStationMobile\">\n      <summary>\n        <para>PlayStation Mobile (PSM) graphics API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsDeviceType.PlayStationVita\">\n      <summary>\n        <para>PlayStation Vita graphics API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsDeviceType.Switch\">\n      <summary>\n        <para>Nintendo Switch graphics API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsDeviceType.Vulkan\">\n      <summary>\n        <para>Vulkan (EXPERIMENTAL).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsDeviceType.XboxOne\">\n      <summary>\n        <para>Xbox One graphics API using Direct3D 11.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsDeviceType.XboxOneD3D12\">\n      <summary>\n        <para>Xbox One graphics API using Direct3D 12.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.GraphicsSettings\">\n      <summary>\n        <para>Script interface for.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.GraphicsSettings.lightsUseColorTemperature\">\n      <summary>\n        <para>Whether to use a Light's color temperature when calculating the final color of that Light.\"</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.GraphicsSettings.lightsUseLinearIntensity\">\n      <summary>\n        <para>If this is true, Light intensity is multiplied against linear color values. If it is false, gamma color values are used.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.GraphicsSettings.renderPipelineAsset\">\n      <summary>\n        <para>The RenderPipelineAsset that describes how the Scene should be rendered.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.GraphicsSettings.transparencySortAxis\">\n      <summary>\n        <para>An axis that describes the direction along which the distances of objects are measured for the purpose of sorting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.GraphicsSettings.transparencySortMode\">\n      <summary>\n        <para>Transparent object sorting mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.GraphicsSettings.useScriptableRenderPipelineBatching\">\n      <summary>\n        <para>Enable/Disable SRP batcher (experimental) at runtime.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.GraphicsSettings.GetCustomShader(UnityEngine.Rendering.BuiltinShaderType)\">\n      <summary>\n        <para>Get custom shader used instead of a built-in shader.</para>\n      </summary>\n      <param name=\"type\">Built-in shader type to query custom shader for.</param>\n      <returns>\n        <para>The shader used.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.GraphicsSettings.GetShaderMode(UnityEngine.Rendering.BuiltinShaderType)\">\n      <summary>\n        <para>Get built-in shader mode.</para>\n      </summary>\n      <param name=\"type\">Built-in shader type to query.</param>\n      <returns>\n        <para>Mode used for built-in shader.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.GraphicsSettings.HasShaderDefine(UnityEngine.Rendering.GraphicsTier,UnityEngine.Rendering.BuiltinShaderDefine)\">\n      <summary>\n        <para>Returns true if shader define was set when compiling shaders for current GraphicsTier.</para>\n      </summary>\n      <param name=\"tier\"></param>\n      <param name=\"defineHash\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.GraphicsSettings.HasShaderDefine(UnityEngine.Rendering.BuiltinShaderDefine)\">\n      <summary>\n        <para>Returns true if shader define was set when compiling shaders for given tier.</para>\n      </summary>\n      <param name=\"defineHash\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.GraphicsSettings.SetCustomShader(UnityEngine.Rendering.BuiltinShaderType,UnityEngine.Shader)\">\n      <summary>\n        <para>Set custom shader to use instead of a built-in shader.</para>\n      </summary>\n      <param name=\"type\">Built-in shader type to set custom shader to.</param>\n      <param name=\"shader\">The shader to use.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.GraphicsSettings.SetShaderMode(UnityEngine.Rendering.BuiltinShaderType,UnityEngine.Rendering.BuiltinShaderMode)\">\n      <summary>\n        <para>Set built-in shader mode.</para>\n      </summary>\n      <param name=\"type\">Built-in shader type to change.</param>\n      <param name=\"mode\">Mode to use for built-in shader.</param>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.GraphicsTier\">\n      <summary>\n        <para>Graphics Tier.\nSee Also: Graphics.activeTier.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsTier.Tier1\">\n      <summary>\n        <para>The first graphics tier (Low) - corresponds to shader define UNITY_HARDWARE_TIER1.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsTier.Tier2\">\n      <summary>\n        <para>The second graphics tier (Medium) - corresponds to shader define UNITY_HARDWARE_TIER2.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.GraphicsTier.Tier3\">\n      <summary>\n        <para>The third graphics tier (High) - corresponds to shader define UNITY_HARDWARE_TIER3.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.IndexFormat\">\n      <summary>\n        <para>Format of the mesh index buffer data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.IndexFormat.UInt16\">\n      <summary>\n        <para>16 bit mesh index buffer format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.IndexFormat.UInt32\">\n      <summary>\n        <para>32 bit mesh index buffer format.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.LightEvent\">\n      <summary>\n        <para>Defines a place in light's rendering to attach Rendering.CommandBuffer objects to.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.LightEvent.AfterScreenspaceMask\">\n      <summary>\n        <para>After directional light screenspace shadow mask is computed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.LightEvent.AfterShadowMap\">\n      <summary>\n        <para>After shadowmap is rendered.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.LightEvent.AfterShadowMapPass\">\n      <summary>\n        <para>After shadowmap pass is rendered.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.LightEvent.BeforeScreenspaceMask\">\n      <summary>\n        <para>Before directional light screenspace shadow mask is computed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.LightEvent.BeforeShadowMap\">\n      <summary>\n        <para>Before shadowmap is rendered.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.LightEvent.BeforeShadowMapPass\">\n      <summary>\n        <para>Before shadowmap pass is rendered.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.LightProbeUsage\">\n      <summary>\n        <para>Light probe interpolation type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.LightProbeUsage.BlendProbes\">\n      <summary>\n        <para>Simple light probe interpolation is used.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.LightProbeUsage.CustomProvided\">\n      <summary>\n        <para>The light probe shader uniform values are extracted from the material property block set on the renderer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.LightProbeUsage.Off\">\n      <summary>\n        <para>Light Probes are not used. The scene's ambient probe is provided to the shader.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.LightProbeUsage.UseProxyVolume\">\n      <summary>\n        <para>Uses a 3D grid of interpolated light probes.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.LightShadowResolution\">\n      <summary>\n        <para>Shadow resolution options for a Light.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.LightShadowResolution.FromQualitySettings\">\n      <summary>\n        <para>Use resolution from QualitySettings (default).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.LightShadowResolution.High\">\n      <summary>\n        <para>High shadow map resolution.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.LightShadowResolution.Low\">\n      <summary>\n        <para>Low shadow map resolution.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.LightShadowResolution.Medium\">\n      <summary>\n        <para>Medium shadow map resolution.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.LightShadowResolution.VeryHigh\">\n      <summary>\n        <para>Very high shadow map resolution.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.OpaqueSortMode\">\n      <summary>\n        <para>Opaque object sorting mode of a Camera.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.OpaqueSortMode.Default\">\n      <summary>\n        <para>Default opaque sorting mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.OpaqueSortMode.FrontToBack\">\n      <summary>\n        <para>Do rough front-to-back sorting of opaque objects.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.OpaqueSortMode.NoDistanceSort\">\n      <summary>\n        <para>Do not sort opaque objects by distance.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.PassType\">\n      <summary>\n        <para>Shader pass type for Unity's lighting pipeline.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.PassType.Deferred\">\n      <summary>\n        <para>Deferred Shading shader pass.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.PassType.ForwardAdd\">\n      <summary>\n        <para>Forward rendering additive pixel light pass.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.PassType.ForwardBase\">\n      <summary>\n        <para>Forward rendering base pass.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.PassType.LightPrePassBase\">\n      <summary>\n        <para>Legacy deferred lighting (light pre-pass) base pass.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.PassType.LightPrePassFinal\">\n      <summary>\n        <para>Legacy deferred lighting (light pre-pass) final pass.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.PassType.Meta\">\n      <summary>\n        <para>Shader pass used to generate the albedo and emissive values used as input to lightmapping.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.PassType.MotionVectors\">\n      <summary>\n        <para>Motion vector render pass.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.PassType.Normal\">\n      <summary>\n        <para>Regular shader pass that does not interact with lighting.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.PassType.ScriptableRenderPipeline\">\n      <summary>\n        <para>Custom scriptable pipeline.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.PassType.ScriptableRenderPipelineDefaultUnlit\">\n      <summary>\n        <para>Custom scriptable pipeline when lightmode is set to default unlit or no light mode is set.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.PassType.ShadowCaster\">\n      <summary>\n        <para>Shadow caster &amp; depth texure shader pass.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.PassType.Vertex\">\n      <summary>\n        <para>Legacy vertex-lit shader pass.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.PassType.VertexLM\">\n      <summary>\n        <para>Legacy vertex-lit shader pass, with mobile lightmaps.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.PassType.VertexLMRGBM\">\n      <summary>\n        <para>Legacy vertex-lit shader pass, with desktop (RGBM) lightmaps.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.PlatformKeywordSet\">\n      <summary>\n        <para>A collection of Rendering.ShaderKeyword that represents a specific platform variant.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.PlatformKeywordSet.Disable\">\n      <summary>\n        <para>Disable a specific shader keyword.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.PlatformKeywordSet.Enable\">\n      <summary>\n        <para>Enable a specific shader keyword.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.PlatformKeywordSet.IsEnabled(UnityEngine.Rendering.BuiltinShaderDefine)\">\n      <summary>\n        <para>Check whether a specific shader keyword is enabled.</para>\n      </summary>\n      <param name=\"define\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.RealtimeGICPUUsage\">\n      <summary>\n        <para>How much CPU usage to assign to the final lighting calculations at runtime.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.RealtimeGICPUUsage.High\">\n      <summary>\n        <para>75% of the allowed CPU threads are used as worker threads.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.RealtimeGICPUUsage.Low\">\n      <summary>\n        <para>25% of the allowed CPU threads are used as worker threads.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.RealtimeGICPUUsage.Medium\">\n      <summary>\n        <para>50% of the allowed CPU threads are used as worker threads.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.RealtimeGICPUUsage.Unlimited\">\n      <summary>\n        <para>100% of the allowed CPU threads are used as worker threads.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.ReflectionCubemapCompression\">\n      <summary>\n        <para>Determines how Unity will compress baked reflection cubemap.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionCubemapCompression.Auto\">\n      <summary>\n        <para>Baked Reflection cubemap will be compressed if compression format is suitable.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionCubemapCompression.Compressed\">\n      <summary>\n        <para>Baked Reflection cubemap will be compressed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionCubemapCompression.Uncompressed\">\n      <summary>\n        <para>Baked Reflection cubemap will be left uncompressed.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.ReflectionProbeBlendInfo\">\n      <summary>\n        <para>ReflectionProbeBlendInfo contains information required for blending probes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionProbeBlendInfo.probe\">\n      <summary>\n        <para>Reflection Probe used in blending.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionProbeBlendInfo.weight\">\n      <summary>\n        <para>Specifies the weight used in the interpolation between two probes, value varies from 0.0 to 1.0.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.ReflectionProbeClearFlags\">\n      <summary>\n        <para>Values for ReflectionProbe.clearFlags, determining what to clear when rendering a ReflectionProbe.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionProbeClearFlags.Skybox\">\n      <summary>\n        <para>Clear with the skybox.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionProbeClearFlags.SolidColor\">\n      <summary>\n        <para>Clear with a background color.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.ReflectionProbeMode\">\n      <summary>\n        <para>Reflection probe's update mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionProbeMode.Baked\">\n      <summary>\n        <para>Reflection probe is baked in the Editor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionProbeMode.Custom\">\n      <summary>\n        <para>Reflection probe uses a custom texture specified by the user.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionProbeMode.Realtime\">\n      <summary>\n        <para>Reflection probe is updating in realtime.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.ReflectionProbeRefreshMode\">\n      <summary>\n        <para>An enum describing the way a realtime reflection probe refreshes in the Player.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionProbeRefreshMode.EveryFrame\">\n      <summary>\n        <para>Causes Unity to update the probe's cubemap every frame.\nNote that updating a probe is very costly. Setting this option on too many probes could have a significant negative effect on frame rate. Use time-slicing to help improve performance.\n\nSee Also: ReflectionProbeTimeSlicingMode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionProbeRefreshMode.OnAwake\">\n      <summary>\n        <para>Causes the probe to update only on the first frame it becomes visible. The probe will no longer update automatically, however you may subsequently use RenderProbe to refresh the probe\n\nSee Also: ReflectionProbe.RenderProbe.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionProbeRefreshMode.ViaScripting\">\n      <summary>\n        <para>Sets the probe to never be automatically updated by Unity while your game is running. Use this to completely control the probe refresh behavior by script.\n\nSee Also: ReflectionProbe.RenderProbe.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.ReflectionProbeTimeSlicingMode\">\n      <summary>\n        <para>When a probe's ReflectionProbe.refreshMode is set to ReflectionProbeRefreshMode.EveryFrame, this enum specify whether or not Unity should update the probe's cubemap over several frames or update the whole cubemap in one frame.\nUpdating a probe's cubemap is a costly operation. Unity needs to render the entire scene for each face of the cubemap, as well as perform special blurring in order to get glossy reflections. The impact on frame rate can be significant. Time-slicing helps maintaning a more constant frame rate during these updates by performing the rendering over several frames.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionProbeTimeSlicingMode.AllFacesAtOnce\">\n      <summary>\n        <para>Instructs Unity to use time-slicing by first rendering all faces at once, then spreading the remaining work over the next 8 frames. Using this option, updating the probe will take 9 frames.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionProbeTimeSlicingMode.IndividualFaces\">\n      <summary>\n        <para>Instructs Unity to spread the rendering of each face over several frames. Using this option, updating the cubemap will take 14 frames. This option greatly reduces the impact on frame rate, however it may produce incorrect results, especially in scenes where lighting conditions change over these 14 frames.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionProbeTimeSlicingMode.NoTimeSlicing\">\n      <summary>\n        <para>Unity will render the probe entirely in one frame.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.ReflectionProbeUsage\">\n      <summary>\n        <para>Reflection Probe usage.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionProbeUsage.BlendProbes\">\n      <summary>\n        <para>Reflection probes are enabled. Blending occurs only between probes, useful in indoor environments. The renderer will use default reflection if there are no reflection probes nearby, but no blending between default reflection and probe will occur.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionProbeUsage.BlendProbesAndSkybox\">\n      <summary>\n        <para>Reflection probes are enabled. Blending occurs between probes or probes and default reflection, useful for outdoor environments.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionProbeUsage.Off\">\n      <summary>\n        <para>Reflection probes are disabled, skybox will be used for reflection.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ReflectionProbeUsage.Simple\">\n      <summary>\n        <para>Reflection probes are enabled, but no blending will occur between probes when there are two overlapping volumes.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.RenderBufferLoadAction\">\n      <summary>\n        <para>This enum describes what should be done on the render target when it is activated (loaded).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.RenderBufferLoadAction.Clear\">\n      <summary>\n        <para>Upon activating the render buffer, clear its contents. Currently only works together with the RenderPass API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.RenderBufferLoadAction.DontCare\">\n      <summary>\n        <para>When this RenderBuffer is activated, the GPU is instructed not to care about the existing contents of that RenderBuffer. On tile-based GPUs this means that the RenderBuffer contents do not need to be loaded into the tile memory, providing a performance boost.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.RenderBufferLoadAction.Load\">\n      <summary>\n        <para>When this RenderBuffer is activated, preserve the existing contents of it. This setting is expensive on tile-based GPUs and should be avoided whenever possible.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.RenderBufferStoreAction\">\n      <summary>\n        <para>This enum describes what should be done on the render target when the GPU is done rendering into it.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.RenderBufferStoreAction.DontCare\">\n      <summary>\n        <para>The contents of the RenderBuffer are not needed and can be discarded. Tile-based GPUs will skip writing out the surface contents altogether, providing performance boost.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.RenderBufferStoreAction.Resolve\">\n      <summary>\n        <para>Resolve the (MSAA'd) surface. Currently only used with the RenderPass API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.RenderBufferStoreAction.Store\">\n      <summary>\n        <para>The RenderBuffer contents need to be stored to RAM. If the surface has MSAA enabled, this stores the non-resolved surface.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.RenderBufferStoreAction.StoreAndResolve\">\n      <summary>\n        <para>Resolve the (MSAA'd) surface, but also store the multisampled version. Currently only used with the RenderPass API.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.RenderQueue\">\n      <summary>\n        <para>Determine in which order objects are renderered.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.RenderQueue.AlphaTest\">\n      <summary>\n        <para>Alpha tested geometry uses this queue.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.RenderQueue.Background\">\n      <summary>\n        <para>This render queue is rendered before any others.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.RenderQueue.Geometry\">\n      <summary>\n        <para>Opaque geometry uses this queue.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.RenderQueue.GeometryLast\">\n      <summary>\n        <para>Last render queue that is considered \"opaque\".</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.RenderQueue.Overlay\">\n      <summary>\n        <para>This render queue is meant for overlay effects.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.RenderQueue.Transparent\">\n      <summary>\n        <para>This render queue is rendered after Geometry and AlphaTest, in back-to-front order.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.RenderTargetBinding\">\n      <summary>\n        <para>Describes a render target with one or more color buffers, a depthstencil buffer and the associated loadstore-actions that are applied when the render target is active.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.RenderTargetBinding.colorLoadActions\">\n      <summary>\n        <para>Load actions for color buffers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.RenderTargetBinding.colorRenderTargets\">\n      <summary>\n        <para>Color buffers to use as render targets.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.RenderTargetBinding.colorStoreActions\">\n      <summary>\n        <para>Store actions for color buffers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.RenderTargetBinding.depthLoadAction\">\n      <summary>\n        <para>Load action for the depth/stencil buffer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.RenderTargetBinding.depthRenderTarget\">\n      <summary>\n        <para>Depth/stencil buffer to use as render target.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.RenderTargetBinding.depthStoreAction\">\n      <summary>\n        <para>Store action for the depth/stencil buffer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.RenderTargetBinding.#ctor(UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.RenderBufferLoadAction,UnityEngine.Rendering.RenderBufferStoreAction,UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.RenderBufferLoadAction,UnityEngine.Rendering.RenderBufferStoreAction)\">\n      <summary>\n        <para>Constructs RenderTargetBinding.</para>\n      </summary>\n      <param name=\"color\">Color buffers to use as render targets.</param>\n      <param name=\"depth\">Depth buffer to use as render target.</param>\n      <param name=\"colorLoadAction\">Load actions for color buffers.</param>\n      <param name=\"colorStoreAction\">Store actions for color buffers.</param>\n      <param name=\"depthLoadAction\">Load action for the depth/stencil buffer.</param>\n      <param name=\"depthStoreAction\">Store action for the depth/stencil buffer.</param>\n      <param name=\"colorRenderTarget\"></param>\n      <param name=\"depthRenderTarget\"></param>\n      <param name=\"colorRenderTargets\"></param>\n      <param name=\"colorLoadActions\"></param>\n      <param name=\"colorStoreActions\"></param>\n      <param name=\"setup\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.RenderTargetBinding.#ctor(UnityEngine.Rendering.RenderTargetIdentifier[],UnityEngine.Rendering.RenderBufferLoadAction[],UnityEngine.Rendering.RenderBufferStoreAction[],UnityEngine.Rendering.RenderTargetIdentifier,UnityEngine.Rendering.RenderBufferLoadAction,UnityEngine.Rendering.RenderBufferStoreAction)\">\n      <summary>\n        <para>Constructs RenderTargetBinding.</para>\n      </summary>\n      <param name=\"color\">Color buffers to use as render targets.</param>\n      <param name=\"depth\">Depth buffer to use as render target.</param>\n      <param name=\"colorLoadAction\">Load actions for color buffers.</param>\n      <param name=\"colorStoreAction\">Store actions for color buffers.</param>\n      <param name=\"depthLoadAction\">Load action for the depth/stencil buffer.</param>\n      <param name=\"depthStoreAction\">Store action for the depth/stencil buffer.</param>\n      <param name=\"colorRenderTarget\"></param>\n      <param name=\"depthRenderTarget\"></param>\n      <param name=\"colorRenderTargets\"></param>\n      <param name=\"colorLoadActions\"></param>\n      <param name=\"colorStoreActions\"></param>\n      <param name=\"setup\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.RenderTargetBinding.#ctor(UnityEngine.RenderTargetSetup)\">\n      <summary>\n        <para>Constructs RenderTargetBinding.</para>\n      </summary>\n      <param name=\"color\">Color buffers to use as render targets.</param>\n      <param name=\"depth\">Depth buffer to use as render target.</param>\n      <param name=\"colorLoadAction\">Load actions for color buffers.</param>\n      <param name=\"colorStoreAction\">Store actions for color buffers.</param>\n      <param name=\"depthLoadAction\">Load action for the depth/stencil buffer.</param>\n      <param name=\"depthStoreAction\">Store action for the depth/stencil buffer.</param>\n      <param name=\"colorRenderTarget\"></param>\n      <param name=\"depthRenderTarget\"></param>\n      <param name=\"colorRenderTargets\"></param>\n      <param name=\"colorLoadActions\"></param>\n      <param name=\"colorStoreActions\"></param>\n      <param name=\"setup\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.RenderTargetIdentifier\">\n      <summary>\n        <para>Identifies a RenderTexture for a Rendering.CommandBuffer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.RenderTargetIdentifier.#ctor(UnityEngine.Rendering.BuiltinRenderTextureType)\">\n      <summary>\n        <para>Creates a render target identifier.</para>\n      </summary>\n      <param name=\"type\">Built-in temporary render texture type.</param>\n      <param name=\"name\">Temporary render texture name.</param>\n      <param name=\"nameID\">Temporary render texture name (as integer, see Shader.PropertyToID).</param>\n      <param name=\"tex\">RenderTexture or Texture object to use.</param>\n      <param name=\"mipLevel\">MipLevel of the RenderTexture to use.</param>\n      <param name=\"cubemapFace\">Cubemap face of the Cubemap RenderTexture to use.</param>\n      <param name=\"depthSlice\">Depth slice of the Array RenderTexture to use.</param>\n      <param name=\"renderTargetIdentifier\">An existing render target identifier.</param>\n      <param name=\"cubeFace\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.RenderTargetIdentifier.#ctor(System.String)\">\n      <summary>\n        <para>Creates a render target identifier.</para>\n      </summary>\n      <param name=\"type\">Built-in temporary render texture type.</param>\n      <param name=\"name\">Temporary render texture name.</param>\n      <param name=\"nameID\">Temporary render texture name (as integer, see Shader.PropertyToID).</param>\n      <param name=\"tex\">RenderTexture or Texture object to use.</param>\n      <param name=\"mipLevel\">MipLevel of the RenderTexture to use.</param>\n      <param name=\"cubemapFace\">Cubemap face of the Cubemap RenderTexture to use.</param>\n      <param name=\"depthSlice\">Depth slice of the Array RenderTexture to use.</param>\n      <param name=\"renderTargetIdentifier\">An existing render target identifier.</param>\n      <param name=\"cubeFace\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.RenderTargetIdentifier.#ctor(System.Int32)\">\n      <summary>\n        <para>Creates a render target identifier.</para>\n      </summary>\n      <param name=\"type\">Built-in temporary render texture type.</param>\n      <param name=\"name\">Temporary render texture name.</param>\n      <param name=\"nameID\">Temporary render texture name (as integer, see Shader.PropertyToID).</param>\n      <param name=\"tex\">RenderTexture or Texture object to use.</param>\n      <param name=\"mipLevel\">MipLevel of the RenderTexture to use.</param>\n      <param name=\"cubemapFace\">Cubemap face of the Cubemap RenderTexture to use.</param>\n      <param name=\"depthSlice\">Depth slice of the Array RenderTexture to use.</param>\n      <param name=\"renderTargetIdentifier\">An existing render target identifier.</param>\n      <param name=\"cubeFace\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.RenderTargetIdentifier.#ctor(UnityEngine.Texture)\">\n      <summary>\n        <para>Creates a render target identifier.</para>\n      </summary>\n      <param name=\"type\">Built-in temporary render texture type.</param>\n      <param name=\"name\">Temporary render texture name.</param>\n      <param name=\"nameID\">Temporary render texture name (as integer, see Shader.PropertyToID).</param>\n      <param name=\"tex\">RenderTexture or Texture object to use.</param>\n      <param name=\"mipLevel\">MipLevel of the RenderTexture to use.</param>\n      <param name=\"cubemapFace\">Cubemap face of the Cubemap RenderTexture to use.</param>\n      <param name=\"depthSlice\">Depth slice of the Array RenderTexture to use.</param>\n      <param name=\"renderTargetIdentifier\">An existing render target identifier.</param>\n      <param name=\"cubeFace\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.RenderTargetIdentifier.#ctor(UnityEngine.Rendering.RenderTargetIdentifier,System.Int32,UnityEngine.CubemapFace,System.Int32)\">\n      <summary>\n        <para>Creates a render target identifier.</para>\n      </summary>\n      <param name=\"type\">Built-in temporary render texture type.</param>\n      <param name=\"name\">Temporary render texture name.</param>\n      <param name=\"nameID\">Temporary render texture name (as integer, see Shader.PropertyToID).</param>\n      <param name=\"tex\">RenderTexture or Texture object to use.</param>\n      <param name=\"mipLevel\">MipLevel of the RenderTexture to use.</param>\n      <param name=\"cubemapFace\">Cubemap face of the Cubemap RenderTexture to use.</param>\n      <param name=\"depthSlice\">Depth slice of the Array RenderTexture to use.</param>\n      <param name=\"renderTargetIdentifier\">An existing render target identifier.</param>\n      <param name=\"cubeFace\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.ShaderKeyword\">\n      <summary>\n        <para>Identifier of a specific code path in a shader.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.ShaderKeyword.#ctor(System.String)\">\n      <summary>\n        <para>Initializes a new instance of the ShaderKeyword class from a shader keyword name.</para>\n      </summary>\n      <param name=\"keywordName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.ShaderKeyword.GetName\">\n      <summary>\n        <para>Returns the string name of the keyword.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.ShaderKeyword.IsValid\">\n      <summary>\n        <para>Returns true if the keyword has been imported by Unity.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.ShaderKeywordSet\">\n      <summary>\n        <para>A collection of Rendering.ShaderKeyword that represents a specific shader variant.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.ShaderKeywordSet.Disable(UnityEngine.Rendering.ShaderKeyword)\">\n      <summary>\n        <para>Disable a specific shader keyword.</para>\n      </summary>\n      <param name=\"keyword\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.ShaderKeywordSet.Enable(UnityEngine.Rendering.ShaderKeyword)\">\n      <summary>\n        <para>Enable a specific shader keyword.</para>\n      </summary>\n      <param name=\"keyword\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.ShaderKeywordSet.GetShaderKeywords\">\n      <summary>\n        <para>Return an array with all the enabled keywords in the ShaderKeywordSet.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.ShaderKeywordSet.IsEnabled(UnityEngine.Rendering.ShaderKeyword)\">\n      <summary>\n        <para>Check whether a specific shader keyword is enabled.</para>\n      </summary>\n      <param name=\"keyword\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.ShadowCastingMode\">\n      <summary>\n        <para>How shadows are cast from this object.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowCastingMode.Off\">\n      <summary>\n        <para>No shadows are cast from this object.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowCastingMode.On\">\n      <summary>\n        <para>Shadows are cast from this object.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowCastingMode.ShadowsOnly\">\n      <summary>\n        <para>Object casts shadows, but is otherwise invisible in the scene.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowCastingMode.TwoSided\">\n      <summary>\n        <para>Shadows are cast from this object, treating it as two-sided.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.ShadowMapPass\">\n      <summary>\n        <para>Allows precise control over which shadow map passes to execute Rendering.CommandBuffer objects attached using Light.AddCommandBuffer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowMapPass.All\">\n      <summary>\n        <para>All shadow map passes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowMapPass.Directional\">\n      <summary>\n        <para>All directional shadow map passes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowMapPass.DirectionalCascade0\">\n      <summary>\n        <para>First directional shadow map cascade.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowMapPass.DirectionalCascade1\">\n      <summary>\n        <para>Second directional shadow map cascade.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowMapPass.DirectionalCascade2\">\n      <summary>\n        <para>Third directional shadow map cascade.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowMapPass.DirectionalCascade3\">\n      <summary>\n        <para>Fourth directional shadow map cascade.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowMapPass.Pointlight\">\n      <summary>\n        <para>All point light shadow passes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowMapPass.PointlightNegativeX\">\n      <summary>\n        <para>-X point light shadow cubemap face.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowMapPass.PointlightNegativeY\">\n      <summary>\n        <para>-Y point light shadow cubemap face.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowMapPass.PointlightNegativeZ\">\n      <summary>\n        <para>-Z point light shadow cubemap face.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowMapPass.PointlightPositiveX\">\n      <summary>\n        <para>+X point light shadow cubemap face.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowMapPass.PointlightPositiveY\">\n      <summary>\n        <para>+Y point light shadow cubemap face.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowMapPass.PointlightPositiveZ\">\n      <summary>\n        <para>+Z point light shadow cubemap face.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowMapPass.Spotlight\">\n      <summary>\n        <para>Spotlight shadow pass.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.ShadowSamplingMode\">\n      <summary>\n        <para>Used by CommandBuffer.SetShadowSamplingMode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowSamplingMode.CompareDepths\">\n      <summary>\n        <para>Default shadow sampling mode: sampling with a comparison filter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowSamplingMode.None\">\n      <summary>\n        <para>In ShadowSamplingMode.None, depths are not compared. Use this value if a Texture is not a shadowmap.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.ShadowSamplingMode.RawDepth\">\n      <summary>\n        <para>Shadow sampling mode for sampling the depth value.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.SortingGroup\">\n      <summary>\n        <para>Adding a SortingGroup component to a GameObject will ensure that all Renderers within the GameObject's descendants will be sorted and rendered together.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.SortingGroup.sortingLayerID\">\n      <summary>\n        <para>Unique ID of the Renderer's sorting layer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.SortingGroup.sortingLayerName\">\n      <summary>\n        <para>Name of the Renderer's sorting layer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.SortingGroup.sortingOrder\">\n      <summary>\n        <para>Renderer's order within a sorting layer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.SphericalHarmonicsL2\">\n      <summary>\n        <para>Spherical harmonics up to the second order (3 bands, 9 coefficients).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.SphericalHarmonicsL2.AddAmbientLight(UnityEngine.Color)\">\n      <summary>\n        <para>Add ambient lighting to probe data.</para>\n      </summary>\n      <param name=\"color\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.SphericalHarmonicsL2.AddDirectionalLight(UnityEngine.Vector3,UnityEngine.Color,System.Single)\">\n      <summary>\n        <para>Add directional light to probe data.</para>\n      </summary>\n      <param name=\"direction\"></param>\n      <param name=\"color\"></param>\n      <param name=\"intensity\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.SphericalHarmonicsL2.Clear\">\n      <summary>\n        <para>Clears SH probe to zero.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.SphericalHarmonicsL2.Evaluate(UnityEngine.Vector3[],UnityEngine.Color[])\">\n      <summary>\n        <para>Evaluates the Spherical Harmonics for each of the given directions. The result from the first direction is written into the first element of results, the result from the second direction is written into the second element of results, and so on. The array size of directions and results must match and directions must be normalized.</para>\n      </summary>\n      <param name=\"directions\">Normalized directions for which the spherical harmonics are to be evaluated.</param>\n      <param name=\"results\">Output array for the evaluated values of the corresponding directions.</param>\n    </member>\n    <member name=\"?:UnityEngine.Rendering.SphericalHarmonicsL2.op_Equal(UnityEngine.Rendering.SphericalHarmonicsL2,UnityEngine.Rendering.SphericalHarmonicsL2)\">\n      <summary>\n        <para>Returns true if SH probes are equal.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Rendering.SphericalHarmonicsL2.op_Multiply(UnityEngine.Rendering.SphericalHarmonicsL2,System.Single)\">\n      <summary>\n        <para>Scales SH by a given factor.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Rendering.SphericalHarmonicsL2.op_Multiply(System.Single,UnityEngine.Rendering.SphericalHarmonicsL2)\">\n      <summary>\n        <para>Scales SH by a given factor.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Rendering.SphericalHarmonicsL2.op_NotEqual(UnityEngine.Rendering.SphericalHarmonicsL2,UnityEngine.Rendering.SphericalHarmonicsL2)\">\n      <summary>\n        <para>Returns true if SH probes are different.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Rendering.SphericalHarmonicsL2.op_Plus(UnityEngine.Rendering.SphericalHarmonicsL2,UnityEngine.Rendering.SphericalHarmonicsL2)\">\n      <summary>\n        <para>Adds two SH probes.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.SphericalHarmonicsL2.this\">\n      <summary>\n        <para>Access individual SH coefficients.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.SplashScreen\">\n      <summary>\n        <para>Provides an interface to the Unity splash screen.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rendering.SplashScreen.isFinished\">\n      <summary>\n        <para>Returns true once the splash screen as finished. This is once all logos have been shown for their specified duration.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.SplashScreen.Begin\">\n      <summary>\n        <para>Initializes the splash screen so it is ready to begin drawing. Call this before you start calling Rendering.SplashScreen.Draw. Internally this function resets the timer and prepares the logos for drawing.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rendering.SplashScreen.Draw\">\n      <summary>\n        <para>Immediately draws the splash screen. Ensure you have called Rendering.SplashScreen.Begin before you start calling this.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.StencilOp\">\n      <summary>\n        <para>Specifies the operation that's performed on the stencil buffer when rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.StencilOp.DecrementSaturate\">\n      <summary>\n        <para>Decrements the current stencil buffer value. Clamps to 0.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.StencilOp.DecrementWrap\">\n      <summary>\n        <para>Decrements the current stencil buffer value. Wraps stencil buffer value to the maximum representable unsigned value when decrementing a stencil buffer value of zero.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.StencilOp.IncrementSaturate\">\n      <summary>\n        <para>Increments the current stencil buffer value. Clamps to the maximum representable unsigned value.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.StencilOp.IncrementWrap\">\n      <summary>\n        <para>Increments the current stencil buffer value. Wraps stencil buffer value to zero when incrementing the maximum representable unsigned value.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.StencilOp.Invert\">\n      <summary>\n        <para>Bitwise inverts the current stencil buffer value.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.StencilOp.Keep\">\n      <summary>\n        <para>Keeps the current stencil value.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.StencilOp.Replace\">\n      <summary>\n        <para>Replace the stencil buffer value with reference value (specified in the shader).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.StencilOp.Zero\">\n      <summary>\n        <para>Sets the stencil buffer value to zero.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.SynchronisationStage\">\n      <summary>\n        <para>Broadly describes the stages of processing a draw call on the GPU.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.SynchronisationStage.PixelProcessing\">\n      <summary>\n        <para>The process of creating and shading the fragments.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.SynchronisationStage.VertexProcessing\">\n      <summary>\n        <para>All aspects of vertex processing.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.TextureDimension\">\n      <summary>\n        <para>Texture \"dimension\" (type).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.TextureDimension.Any\">\n      <summary>\n        <para>Any texture type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.TextureDimension.Cube\">\n      <summary>\n        <para>Cubemap texture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.TextureDimension.CubeArray\">\n      <summary>\n        <para>Cubemap array texture (CubemapArray).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.TextureDimension.None\">\n      <summary>\n        <para>No texture is assigned.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.TextureDimension.Tex2D\">\n      <summary>\n        <para>2D texture (Texture2D).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.TextureDimension.Tex2DArray\">\n      <summary>\n        <para>2D array texture (Texture2DArray).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.TextureDimension.Tex3D\">\n      <summary>\n        <para>3D volume texture (Texture3D).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.TextureDimension.Unknown\">\n      <summary>\n        <para>Texture type is not initialized or unknown.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rendering.UVChannelFlags\">\n      <summary>\n        <para>A flag representing each UV channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.UVChannelFlags.UV0\">\n      <summary>\n        <para>First UV channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.UVChannelFlags.UV1\">\n      <summary>\n        <para>Second UV channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.UVChannelFlags.UV2\">\n      <summary>\n        <para>Third UV channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Rendering.UVChannelFlags.UV3\">\n      <summary>\n        <para>Fourth UV channel.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RenderingPath\">\n      <summary>\n        <para>Rendering path of a Camera.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderingPath.DeferredLighting\">\n      <summary>\n        <para>Deferred Lighting (Legacy).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderingPath.DeferredShading\">\n      <summary>\n        <para>Deferred Shading.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderingPath.Forward\">\n      <summary>\n        <para>Forward Rendering.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderingPath.UsePlayerSettings\">\n      <summary>\n        <para>Use Player Settings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderingPath.VertexLit\">\n      <summary>\n        <para>Vertex Lit.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RenderMode\">\n      <summary>\n        <para>RenderMode for the Canvas.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderMode.ScreenSpaceCamera\">\n      <summary>\n        <para>Render using the Camera configured on the Canvas.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderMode.ScreenSpaceOverlay\">\n      <summary>\n        <para>Render at the end of the scene using a 2D Canvas.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderMode.WorldSpace\">\n      <summary>\n        <para>Render using any Camera in the scene that can render the layer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RenderSettings\">\n      <summary>\n        <para>The Render Settings contain values for a range of visual elements in your scene, like fog and ambient light.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.ambientEquatorColor\">\n      <summary>\n        <para>Ambient lighting coming from the sides.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.ambientGroundColor\">\n      <summary>\n        <para>Ambient lighting coming from below.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.ambientIntensity\">\n      <summary>\n        <para>How much the light from the Ambient Source affects the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.ambientLight\">\n      <summary>\n        <para>Flat ambient lighting color.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.ambientMode\">\n      <summary>\n        <para>Ambient lighting mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.ambientProbe\">\n      <summary>\n        <para>Custom or skybox ambient lighting data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.ambientSkyColor\">\n      <summary>\n        <para>Ambient lighting coming from above.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.customReflection\">\n      <summary>\n        <para>Custom specular reflection cubemap.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.defaultReflectionMode\">\n      <summary>\n        <para>Default reflection mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.defaultReflectionResolution\">\n      <summary>\n        <para>Cubemap resolution for default reflection.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.flareFadeSpeed\">\n      <summary>\n        <para>The fade speed of all flares in the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.flareStrength\">\n      <summary>\n        <para>The intensity of all flares in the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.fog\">\n      <summary>\n        <para>Is fog enabled?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.fogColor\">\n      <summary>\n        <para>The color of the fog.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.fogDensity\">\n      <summary>\n        <para>The density of the exponential fog.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.fogEndDistance\">\n      <summary>\n        <para>The ending distance of linear fog.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.fogMode\">\n      <summary>\n        <para>Fog mode to use.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.fogStartDistance\">\n      <summary>\n        <para>The starting distance of linear fog.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.haloStrength\">\n      <summary>\n        <para>Size of the Light halos.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.reflectionBounces\">\n      <summary>\n        <para>The number of times a reflection includes other reflections.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.reflectionIntensity\">\n      <summary>\n        <para>How much the skybox / custom cubemap reflection affects the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.skybox\">\n      <summary>\n        <para>The global skybox to use.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.subtractiveShadowColor\">\n      <summary>\n        <para>The color used for the sun shadows in the Subtractive lightmode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderSettings.sun\">\n      <summary>\n        <para>The light used by the procedural skybox.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RenderTargetSetup\">\n      <summary>\n        <para>Fully describes setup of RenderTarget.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTargetSetup.color\">\n      <summary>\n        <para>Color Buffers to set.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTargetSetup.colorLoad\">\n      <summary>\n        <para>Load Actions for Color Buffers. It will override any actions set on RenderBuffers themselves.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTargetSetup.colorStore\">\n      <summary>\n        <para>Store Actions for Color Buffers. It will override any actions set on RenderBuffers themselves.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTargetSetup.cubemapFace\">\n      <summary>\n        <para>Cubemap face to render to.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTargetSetup.depth\">\n      <summary>\n        <para>Depth Buffer to set.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTargetSetup.depthLoad\">\n      <summary>\n        <para>Load Action for Depth Buffer. It will override any actions set on RenderBuffer itself.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTargetSetup.depthSlice\">\n      <summary>\n        <para>Slice of a Texture3D or Texture2DArray to set as a render target.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTargetSetup.depthStore\">\n      <summary>\n        <para>Store Actions for Depth Buffer. It will override any actions set on RenderBuffer itself.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTargetSetup.mipLevel\">\n      <summary>\n        <para>Mip Level to render to.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RenderTargetSetup.#ctor(UnityEngine.RenderBuffer,UnityEngine.RenderBuffer)\">\n      <summary>\n        <para>Constructs RenderTargetSetup.</para>\n      </summary>\n      <param name=\"color\">Color Buffer(s) to set.</param>\n      <param name=\"depth\">Depth Buffer to set.</param>\n      <param name=\"mipLevel\">Mip Level to render to.</param>\n      <param name=\"face\">Cubemap face to render to.</param>\n      <param name=\"mip\"></param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTargetSetup.#ctor(UnityEngine.RenderBuffer,UnityEngine.RenderBuffer,System.Int32)\">\n      <summary>\n        <para>Constructs RenderTargetSetup.</para>\n      </summary>\n      <param name=\"color\">Color Buffer(s) to set.</param>\n      <param name=\"depth\">Depth Buffer to set.</param>\n      <param name=\"mipLevel\">Mip Level to render to.</param>\n      <param name=\"face\">Cubemap face to render to.</param>\n      <param name=\"mip\"></param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTargetSetup.#ctor(UnityEngine.RenderBuffer,UnityEngine.RenderBuffer,System.Int32,UnityEngine.CubemapFace)\">\n      <summary>\n        <para>Constructs RenderTargetSetup.</para>\n      </summary>\n      <param name=\"color\">Color Buffer(s) to set.</param>\n      <param name=\"depth\">Depth Buffer to set.</param>\n      <param name=\"mipLevel\">Mip Level to render to.</param>\n      <param name=\"face\">Cubemap face to render to.</param>\n      <param name=\"mip\"></param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTargetSetup.#ctor(UnityEngine.RenderBuffer[],UnityEngine.RenderBuffer)\">\n      <summary>\n        <para>Constructs RenderTargetSetup.</para>\n      </summary>\n      <param name=\"color\">Color Buffer(s) to set.</param>\n      <param name=\"depth\">Depth Buffer to set.</param>\n      <param name=\"mipLevel\">Mip Level to render to.</param>\n      <param name=\"face\">Cubemap face to render to.</param>\n      <param name=\"mip\"></param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTargetSetup.#ctor(UnityEngine.RenderBuffer[],UnityEngine.RenderBuffer,System.Int32)\">\n      <summary>\n        <para>Constructs RenderTargetSetup.</para>\n      </summary>\n      <param name=\"color\">Color Buffer(s) to set.</param>\n      <param name=\"depth\">Depth Buffer to set.</param>\n      <param name=\"mipLevel\">Mip Level to render to.</param>\n      <param name=\"face\">Cubemap face to render to.</param>\n      <param name=\"mip\"></param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTargetSetup.#ctor(UnityEngine.RenderBuffer[],UnityEngine.RenderBuffer,System.Int32,UnityEngine.CubemapFace)\">\n      <summary>\n        <para>Constructs RenderTargetSetup.</para>\n      </summary>\n      <param name=\"color\">Color Buffer(s) to set.</param>\n      <param name=\"depth\">Depth Buffer to set.</param>\n      <param name=\"mipLevel\">Mip Level to render to.</param>\n      <param name=\"face\">Cubemap face to render to.</param>\n      <param name=\"mip\"></param>\n    </member>\n    <member name=\"T:UnityEngine.RenderTexture\">\n      <summary>\n        <para>Render textures are textures that can be rendered to.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.active\">\n      <summary>\n        <para>Currently active render texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.antiAliasing\">\n      <summary>\n        <para>The antialiasing level for the RenderTexture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.autoGenerateMips\">\n      <summary>\n        <para>Mipmap levels are generated automatically when this flag is set.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.bindTextureMS\">\n      <summary>\n        <para>If true and antiAliasing is greater than 1, the render texture will not be resolved by default.  Use this if the render texture needs to be bound as a multisampled texture in a shader.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.colorBuffer\">\n      <summary>\n        <para>Color buffer of the render texture (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.depth\">\n      <summary>\n        <para>The precision of the render texture's depth buffer in bits (0, 16, 24/32 are supported).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.depthBuffer\">\n      <summary>\n        <para>Depth/stencil buffer of the render texture (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.descriptor\">\n      <summary>\n        <para>This struct contains all the information required to create a RenderTexture. It can be copied, cached, and reused to easily create RenderTextures that all share the same properties.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.dimension\">\n      <summary>\n        <para>Dimensionality (type) of the render texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.enableRandomWrite\">\n      <summary>\n        <para>Enable random access write into this render texture on Shader Model 5.0 level shaders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.format\">\n      <summary>\n        <para>The color format of the render texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.height\">\n      <summary>\n        <para>The height of the render texture in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.isVolume\">\n      <summary>\n        <para>If enabled, this Render Texture will be used as a Texture3D.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.memorylessMode\">\n      <summary>\n        <para>The render texture memoryless mode property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.sRGB\">\n      <summary>\n        <para>Does this render texture use sRGB read/write conversions (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.useDynamicScale\">\n      <summary>\n        <para>Is the render texture marked to be scaled by the Dynamic Resolution system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.useMipMap\">\n      <summary>\n        <para>Render texture has mipmaps when this flag is set.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.volumeDepth\">\n      <summary>\n        <para>Volume extent of a 3D render texture or number of slices of array texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.vrUsage\">\n      <summary>\n        <para>If this RenderTexture is a VR eye texture used in stereoscopic rendering, this property decides what special rendering occurs, if any.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTexture.width\">\n      <summary>\n        <para>The width of the render texture in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.ConvertToEquirect(UnityEngine.RenderTexture,UnityEngine.Camera/MonoOrStereoscopicEye)\">\n      <summary>\n        <para>Converts the render texture to equirectangular format (both stereoscopic or monoscopic equirect).\nThe left eye will occupy the top half and the right eye will occupy the bottom. The monoscopic version will occupy the whole texture.\nTexture dimension must be of type TextureDimension.Cube.</para>\n      </summary>\n      <param name=\"equirect\">RenderTexture to render the equirect format to.</param>\n      <param name=\"eye\">A Camera eye corresponding to the left or right eye for stereoscopic rendering, or neither for monoscopic rendering.</param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.Create\">\n      <summary>\n        <para>Actually creates the RenderTexture.</para>\n      </summary>\n      <returns>\n        <para>True if the texture is created, else false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.#ctor(System.Int32,System.Int32,System.Int32,UnityEngine.RenderTextureFormat,UnityEngine.RenderTextureReadWrite)\">\n      <summary>\n        <para>Creates a new RenderTexture object.</para>\n      </summary>\n      <param name=\"width\">Texture width in pixels.</param>\n      <param name=\"height\">Texture height in pixels.</param>\n      <param name=\"depth\">Number of bits in depth buffer (0, 16 or 24). Note that only 24 bit depth has stencil buffer.</param>\n      <param name=\"format\">Texture color format.</param>\n      <param name=\"readWrite\">How or if color space conversions should be done on texture read/write.</param>\n      <param name=\"desc\">Create the RenderTexture with the settings in the RenderTextureDescriptor.</param>\n      <param name=\"textureToCopy\">Copy the settings from another RenderTexture.</param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.#ctor(UnityEngine.RenderTexture)\">\n      <summary>\n        <para>Creates a new RenderTexture object.</para>\n      </summary>\n      <param name=\"width\">Texture width in pixels.</param>\n      <param name=\"height\">Texture height in pixels.</param>\n      <param name=\"depth\">Number of bits in depth buffer (0, 16 or 24). Note that only 24 bit depth has stencil buffer.</param>\n      <param name=\"format\">Texture color format.</param>\n      <param name=\"readWrite\">How or if color space conversions should be done on texture read/write.</param>\n      <param name=\"desc\">Create the RenderTexture with the settings in the RenderTextureDescriptor.</param>\n      <param name=\"textureToCopy\">Copy the settings from another RenderTexture.</param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.#ctor(UnityEngine.RenderTextureDescriptor)\">\n      <summary>\n        <para>Creates a new RenderTexture object.</para>\n      </summary>\n      <param name=\"width\">Texture width in pixels.</param>\n      <param name=\"height\">Texture height in pixels.</param>\n      <param name=\"depth\">Number of bits in depth buffer (0, 16 or 24). Note that only 24 bit depth has stencil buffer.</param>\n      <param name=\"format\">Texture color format.</param>\n      <param name=\"readWrite\">How or if color space conversions should be done on texture read/write.</param>\n      <param name=\"desc\">Create the RenderTexture with the settings in the RenderTextureDescriptor.</param>\n      <param name=\"textureToCopy\">Copy the settings from another RenderTexture.</param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.DiscardContents\">\n      <summary>\n        <para>Hint the GPU driver that the contents of the RenderTexture will not be used.</para>\n      </summary>\n      <param name=\"discardColor\">Should the colour buffer be discarded?</param>\n      <param name=\"discardDepth\">Should the depth buffer be discarded?</param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.DiscardContents(System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Hint the GPU driver that the contents of the RenderTexture will not be used.</para>\n      </summary>\n      <param name=\"discardColor\">Should the colour buffer be discarded?</param>\n      <param name=\"discardDepth\">Should the depth buffer be discarded?</param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.GenerateMips\">\n      <summary>\n        <para>Generate mipmap levels of a render texture.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.GetNativeDepthBufferPtr\">\n      <summary>\n        <para>Retrieve a native (underlying graphics API) pointer to the depth buffer resource.</para>\n      </summary>\n      <returns>\n        <para>Pointer to an underlying graphics API depth buffer resource.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.GetTemporary(UnityEngine.RenderTextureDescriptor)\">\n      <summary>\n        <para>Allocate a temporary render texture.</para>\n      </summary>\n      <param name=\"width\">Width in pixels.</param>\n      <param name=\"height\">Height in pixels.</param>\n      <param name=\"depthBuffer\">Depth buffer bits (0, 16 or 24). Note that only 24 bit depth has stencil buffer.</param>\n      <param name=\"format\">Render texture format.</param>\n      <param name=\"readWrite\">Color space conversion mode.</param>\n      <param name=\"antiAliasing\">Number of antialiasing samples to store in the texture. Valid values are 1, 2, 4, and 8. Throws an exception if any other value is passed.</param>\n      <param name=\"memorylessMode\">Render texture memoryless mode.</param>\n      <param name=\"desc\">Use this RenderTextureDesc for the settings when creating the temporary RenderTexture.</param>\n      <param name=\"vrUsage\"></param>\n      <param name=\"useDynamicScale\"></param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.GetTemporary(System.Int32,System.Int32,System.Int32,UnityEngine.RenderTextureFormat,UnityEngine.RenderTextureReadWrite,System.Int32,UnityEngine.RenderTextureMemoryless,UnityEngine.VRTextureUsage,System.Boolean)\">\n      <summary>\n        <para>Allocate a temporary render texture.</para>\n      </summary>\n      <param name=\"width\">Width in pixels.</param>\n      <param name=\"height\">Height in pixels.</param>\n      <param name=\"depthBuffer\">Depth buffer bits (0, 16 or 24). Note that only 24 bit depth has stencil buffer.</param>\n      <param name=\"format\">Render texture format.</param>\n      <param name=\"readWrite\">Color space conversion mode.</param>\n      <param name=\"antiAliasing\">Number of antialiasing samples to store in the texture. Valid values are 1, 2, 4, and 8. Throws an exception if any other value is passed.</param>\n      <param name=\"memorylessMode\">Render texture memoryless mode.</param>\n      <param name=\"desc\">Use this RenderTextureDesc for the settings when creating the temporary RenderTexture.</param>\n      <param name=\"vrUsage\"></param>\n      <param name=\"useDynamicScale\"></param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.IsCreated\">\n      <summary>\n        <para>Is the render texture actually created?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.MarkRestoreExpected\">\n      <summary>\n        <para>Indicate that there's a RenderTexture restore operation expected.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.Release\">\n      <summary>\n        <para>Releases the RenderTexture.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.ReleaseTemporary(UnityEngine.RenderTexture)\">\n      <summary>\n        <para>Release a temporary texture allocated with GetTemporary.</para>\n      </summary>\n      <param name=\"temp\"></param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.ResolveAntiAliasedSurface\">\n      <summary>\n        <para>Force an antialiased render texture to be resolved.</para>\n      </summary>\n      <param name=\"target\">The render texture to resolve into.  If set, the target render texture must have the same dimensions and format as the source.</param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.ResolveAntiAliasedSurface(UnityEngine.RenderTexture)\">\n      <summary>\n        <para>Force an antialiased render texture to be resolved.</para>\n      </summary>\n      <param name=\"target\">The render texture to resolve into.  If set, the target render texture must have the same dimensions and format as the source.</param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.SetGlobalShaderProperty(System.String)\">\n      <summary>\n        <para>Assigns this RenderTexture as a global shader property named propertyName.</para>\n      </summary>\n      <param name=\"propertyName\"></param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTexture.SupportsStencil(UnityEngine.RenderTexture)\">\n      <summary>\n        <para>Does a RenderTexture have stencil buffer?</para>\n      </summary>\n      <param name=\"rt\">Render texture, or null for main screen.</param>\n    </member>\n    <member name=\"T:UnityEngine.RenderTextureCreationFlags\">\n      <summary>\n        <para>Set of flags that control the state of a newly-created RenderTexture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureCreationFlags.AllowVerticalFlip\">\n      <summary>\n        <para>Clear this flag when a RenderTexture is a VR eye texture and the device does not automatically flip the texture when being displayed. This is platform specific and\nIt is set by default. This flag is only cleared when part of a RenderTextureDesc that is returned from GetDefaultVREyeTextureDesc or other VR functions that return a RenderTextureDesc. Currently, only Hololens eye textures need to clear this flag.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureCreationFlags.AutoGenerateMips\">\n      <summary>\n        <para>Determines whether or not mipmaps are automatically generated when the RenderTexture is modified.\nThis flag is set by default, and has no effect if the RenderTextureCreationFlags.MipMap flag is not also set.\nSee RenderTexture.autoGenerateMips for more details.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureCreationFlags.BindMS\">\n      <summary>\n        <para>Setting this flag causes the RenderTexture to be bound as a multisampled texture in a shader. The flag prevents the RenderTexture from being resolved by default when RenderTexture.antiAliasing is greater than 1.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureCreationFlags.CreatedFromScript\">\n      <summary>\n        <para>This flag is always set internally when a RenderTexture is created from script. It has no effect when set manually from script code.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureCreationFlags.DynamicallyScalable\">\n      <summary>\n        <para>Set this flag to mark this RenderTexture for Dynamic Resolution should the target platform/graphics API support Dynamic Resolution. See ScalabeBufferManager for more details.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureCreationFlags.EnableRandomWrite\">\n      <summary>\n        <para>Set this flag to enable random access writes to the RenderTexture from shaders.\nNormally, pixel shaders only operate on pixels they are given. Compute shaders cannot write to textures without this flag. Random write enables shaders to write to arbitrary locations on a RenderTexture.  See RenderTexture.enableRandomWrite for more details, including supported platforms.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureCreationFlags.EyeTexture\">\n      <summary>\n        <para>Set this flag when the Texture is to be used as a VR eye texture. This flag is cleared by default. This flag is set on a RenderTextureDesc when it is returned from GetDefaultVREyeTextureDesc or other VR functions returning a RenderTextureDesc.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureCreationFlags.MipMap\">\n      <summary>\n        <para>Set this flag to allocate mipmaps in the RenderTexture. See RenderTexture.useMipMap for more details.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureCreationFlags.NoResolvedColorSurface\">\n      <summary>\n        <para>When this flag is set, the engine will not automatically resolve the color surface.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureCreationFlags.SRGB\">\n      <summary>\n        <para>When this flag is set, reads and writes to this texture are converted to SRGB color space. See RenderTexture.sRGB for more details.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RenderTextureDescriptor\">\n      <summary>\n        <para>This struct contains all the information required to create a RenderTexture. It can be copied, cached, and reused to easily create RenderTextures that all share the same properties.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTextureDescriptor.autoGenerateMips\">\n      <summary>\n        <para>Mipmap levels are generated automatically when this flag is set.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTextureDescriptor.bindMS\">\n      <summary>\n        <para>If true and msaaSamples is greater than 1, the render texture will not be resolved by default.  Use this if the render texture needs to be bound as a multisampled texture in a shader.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTextureDescriptor.colorFormat\">\n      <summary>\n        <para>The color format for the RenderTexture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTextureDescriptor.depthBufferBits\">\n      <summary>\n        <para>The precision of the render texture's depth buffer in bits (0, 16, 24/32 are supported).\n\nSee RenderTexture.depth.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTextureDescriptor.dimension\">\n      <summary>\n        <para>Dimensionality (type) of the render texture.\n\nSee RenderTexture.dimension.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTextureDescriptor.enableRandomWrite\">\n      <summary>\n        <para>Enable random access write into this render texture on Shader Model 5.0 level shaders.\n\nSee RenderTexture.enableRandomWrite.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTextureDescriptor.flags\">\n      <summary>\n        <para>A set of RenderTextureCreationFlags that control how the texture is created.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTextureDescriptor.height\">\n      <summary>\n        <para>The height of the render texture in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTextureDescriptor.memoryless\">\n      <summary>\n        <para>The render texture memoryless mode property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTextureDescriptor.msaaSamples\">\n      <summary>\n        <para>The multisample antialiasing level for the RenderTexture.\n\nSee RenderTexture.antiAliasing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTextureDescriptor.shadowSamplingMode\">\n      <summary>\n        <para>Determines how the RenderTexture is sampled if it is used as a shadow map.\n\nSee ShadowSamplingMode for more details.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTextureDescriptor.sRGB\">\n      <summary>\n        <para>This flag causes the render texture uses sRGB read/write conversions.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTextureDescriptor.useMipMap\">\n      <summary>\n        <para>Render texture has mipmaps when this flag is set.\n\nSee RenderTexture.useMipMap.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTextureDescriptor.volumeDepth\">\n      <summary>\n        <para>Volume extent of a 3D render texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTextureDescriptor.vrUsage\">\n      <summary>\n        <para>If this RenderTexture is a VR eye texture used in stereoscopic rendering, this property decides what special rendering occurs, if any. Instead of setting this manually, use the value returned by XR.XRSettings.eyeTextureDesc|eyeTextureDesc or other VR functions returning a RenderTextureDescriptor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RenderTextureDescriptor.width\">\n      <summary>\n        <para>The width of the render texture in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RenderTextureDescriptor.#ctor(System.Int32,System.Int32)\">\n      <summary>\n        <para>Create a RenderTextureDescriptor with default values, or a certain width, height, and format.</para>\n      </summary>\n      <param name=\"width\">Width of the RenderTexture in pixels.</param>\n      <param name=\"height\">Height of the RenderTexture in pixels.</param>\n      <param name=\"colorFormat\">The color format for the RenderTexture.</param>\n      <param name=\"depthBufferBits\">The number of bits to use for the depth buffer.</param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTextureDescriptor.#ctor(System.Int32,System.Int32,UnityEngine.RenderTextureFormat)\">\n      <summary>\n        <para>Create a RenderTextureDescriptor with default values, or a certain width, height, and format.</para>\n      </summary>\n      <param name=\"width\">Width of the RenderTexture in pixels.</param>\n      <param name=\"height\">Height of the RenderTexture in pixels.</param>\n      <param name=\"colorFormat\">The color format for the RenderTexture.</param>\n      <param name=\"depthBufferBits\">The number of bits to use for the depth buffer.</param>\n    </member>\n    <member name=\"M:UnityEngine.RenderTextureDescriptor.#ctor(System.Int32,System.Int32,UnityEngine.RenderTextureFormat,System.Int32)\">\n      <summary>\n        <para>Create a RenderTextureDescriptor with default values, or a certain width, height, and format.</para>\n      </summary>\n      <param name=\"width\">Width of the RenderTexture in pixels.</param>\n      <param name=\"height\">Height of the RenderTexture in pixels.</param>\n      <param name=\"colorFormat\">The color format for the RenderTexture.</param>\n      <param name=\"depthBufferBits\">The number of bits to use for the depth buffer.</param>\n    </member>\n    <member name=\"T:UnityEngine.RenderTextureFormat\">\n      <summary>\n        <para>Format of a RenderTexture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.ARGB1555\">\n      <summary>\n        <para>Color render texture format, 1 bit for Alpha channel, 5 bits for Red, Green and Blue channels.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.ARGB2101010\">\n      <summary>\n        <para>Color render texture format. 10 bits for colors, 2 bits for alpha.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.ARGB32\">\n      <summary>\n        <para>Color render texture format, 8 bits per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.ARGB4444\">\n      <summary>\n        <para>Color render texture format, 4 bit per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.ARGB64\">\n      <summary>\n        <para>Four color render texture format, 16 bits per channel, fixed point, unsigned normalized.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.ARGBFloat\">\n      <summary>\n        <para>Color render texture format, 32 bit floating point per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.ARGBHalf\">\n      <summary>\n        <para>Color render texture format, 16 bit floating point per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.ARGBInt\">\n      <summary>\n        <para>Four channel (ARGB) render texture format, 32 bit signed integer per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.BGR101010_XR\">\n      <summary>\n        <para>Color render texture format, 10 bit per channel, extended range.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.BGRA10101010_XR\">\n      <summary>\n        <para>Color render texture format, 10 bit per channel, extended range.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.BGRA32\">\n      <summary>\n        <para>Color render texture format, 8 bits per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.Default\">\n      <summary>\n        <para>Default color render texture format: will be chosen accordingly to Frame Buffer format and Platform.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.DefaultHDR\">\n      <summary>\n        <para>Default HDR color render texture format: will be chosen accordingly to Frame Buffer format and Platform.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.Depth\">\n      <summary>\n        <para>A depth render texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.R8\">\n      <summary>\n        <para>Scalar (R) render texture format, 8 bit fixed point.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.RFloat\">\n      <summary>\n        <para>Scalar (R) render texture format, 32 bit floating point.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.RG16\">\n      <summary>\n        <para>Two channel (RG) render texture format, 8 bits per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.RG32\">\n      <summary>\n        <para>Two color (RG) render texture format, 16 bits per channel, fixed point, unsigned normalized.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.RGB111110Float\">\n      <summary>\n        <para>Color render texture format. R and G channels are 11 bit floating point, B channel is 10 bit floating point.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.RGB565\">\n      <summary>\n        <para>Color render texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.RGBAUShort\">\n      <summary>\n        <para>Four channel (RGBA) render texture format, 16 bit unsigned integer per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.RGFloat\">\n      <summary>\n        <para>Two color (RG) render texture format, 32 bit floating point per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.RGHalf\">\n      <summary>\n        <para>Two color (RG) render texture format, 16 bit floating point per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.RGInt\">\n      <summary>\n        <para>Two channel (RG) render texture format, 32 bit signed integer per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.RHalf\">\n      <summary>\n        <para>Scalar (R) render texture format, 16 bit floating point.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.RInt\">\n      <summary>\n        <para>Scalar (R) render texture format, 32 bit signed integer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureFormat.Shadowmap\">\n      <summary>\n        <para>A native shadowmap render texture format.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RenderTextureMemoryless\">\n      <summary>\n        <para>Flags enumeration of the render texture memoryless modes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureMemoryless.Color\">\n      <summary>\n        <para>Render texture color pixels are memoryless when RenderTexture.antiAliasing is set to 1.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureMemoryless.Depth\">\n      <summary>\n        <para>Render texture depth pixels are memoryless.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureMemoryless.MSAA\">\n      <summary>\n        <para>Render texture color pixels are memoryless when RenderTexture.antiAliasing is set to 2, 4 or 8.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureMemoryless.None\">\n      <summary>\n        <para>The render texture is not memoryless.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RenderTextureReadWrite\">\n      <summary>\n        <para>Color space conversion mode of a RenderTexture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureReadWrite.sRGB\">\n      <summary>\n        <para>Render texture contains sRGB (color) data, perform Linear&lt;-&gt;sRGB conversions on it.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureReadWrite.Default\">\n      <summary>\n        <para>Default color space conversion based on project settings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RenderTextureReadWrite.Linear\">\n      <summary>\n        <para>Render texture contains linear (non-color) data; don't perform color conversions on it.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RequireComponent\">\n      <summary>\n        <para>The RequireComponent attribute automatically adds required components as dependencies.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RequireComponent.#ctor(System.Type)\">\n      <summary>\n        <para>Require a single component.</para>\n      </summary>\n      <param name=\"requiredComponent\"></param>\n    </member>\n    <member name=\"M:UnityEngine.RequireComponent.#ctor(System.Type,System.Type)\">\n      <summary>\n        <para>Require two components.</para>\n      </summary>\n      <param name=\"requiredComponent\"></param>\n      <param name=\"requiredComponent2\"></param>\n    </member>\n    <member name=\"M:UnityEngine.RequireComponent.#ctor(System.Type,System.Type,System.Type)\">\n      <summary>\n        <para>Require three components.</para>\n      </summary>\n      <param name=\"requiredComponent\"></param>\n      <param name=\"requiredComponent2\"></param>\n      <param name=\"requiredComponent3\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Resolution\">\n      <summary>\n        <para>Represents a display resolution.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Resolution.height\">\n      <summary>\n        <para>Resolution height in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Resolution.refreshRate\">\n      <summary>\n        <para>Resolution's vertical refresh rate in Hz.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Resolution.width\">\n      <summary>\n        <para>Resolution width in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Resolution.ToString\">\n      <summary>\n        <para>Returns a nicely formatted string of the resolution.</para>\n      </summary>\n      <returns>\n        <para>A string with the format \"width x height @ refreshRateHz\".</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.ResourceRequest\">\n      <summary>\n        <para>Asynchronous load request from the Resources bundle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ResourceRequest.asset\">\n      <summary>\n        <para>Asset object being loaded (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Resources\">\n      <summary>\n        <para>The Resources class allows you to find and access Objects including assets.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Resources.FindObjectsOfTypeAll(System.Type)\">\n      <summary>\n        <para>Returns a list of all objects of Type type.</para>\n      </summary>\n      <param name=\"type\">Type of the class to match while searching.</param>\n      <returns>\n        <para>An array of objects whose class is type or is derived from type.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Resources.FindObjectsOfTypeAll\">\n      <summary>\n        <para>Returns a list of all objects of Type T.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Resources.Load(System.String)\">\n      <summary>\n        <para>Loads an asset stored at path in a Resources folder.</para>\n      </summary>\n      <param name=\"path\">Pathname of the target folder. When using the empty string (i.e., \"\"), the function will load the entire contents of the Resources folder.</param>\n    </member>\n    <member name=\"M:UnityEngine.Resources.Load(System.String)\">\n      <summary>\n        <para>Loads an asset stored at path in a Resources folder.</para>\n      </summary>\n      <param name=\"path\">Pathname of the target folder. When using the empty string (i.e., \"\"), the function will load the entire contents of the Resources folder.</param>\n      <param name=\"systemTypeInstance\">Type filter for objects returned.</param>\n    </member>\n    <member name=\"M:UnityEngine.Resources.Load(System.String,System.Type)\">\n      <summary>\n        <para>Loads an asset stored at path in a Resources folder.</para>\n      </summary>\n      <param name=\"path\">Pathname of the target folder. When using the empty string (i.e., \"\"), the function will load the entire contents of the Resources folder.</param>\n      <param name=\"systemTypeInstance\">Type filter for objects returned.</param>\n    </member>\n    <member name=\"M:UnityEngine.Resources.LoadAll(System.String)\">\n      <summary>\n        <para>Loads all assets in a folder or file at path in a Resources folder.</para>\n      </summary>\n      <param name=\"path\">Pathname of the target folder. When using the empty string (i.e., \"\"), the function will load the entire contents of the Resources folder.</param>\n      <param name=\"systemTypeInstance\">Type filter for objects returned.</param>\n    </member>\n    <member name=\"M:UnityEngine.Resources.LoadAll(System.String,System.Type)\">\n      <summary>\n        <para>Loads all assets in a folder or file at path in a Resources folder.</para>\n      </summary>\n      <param name=\"path\">Pathname of the target folder. When using the empty string (i.e., \"\"), the function will load the entire contents of the Resources folder.</param>\n      <param name=\"systemTypeInstance\">Type filter for objects returned.</param>\n    </member>\n    <member name=\"M:UnityEngine.Resources.LoadAll(System.String)\">\n      <summary>\n        <para>Loads all assets in a folder or file at path in a Resources folder.</para>\n      </summary>\n      <param name=\"path\">Pathname of the target folder. When using the empty string (i.e., \"\"), the function will load the entire contents of the Resources folder.</param>\n    </member>\n    <member name=\"M:UnityEngine.Resources.LoadAssetAtPath(System.String,System.Type)\">\n      <summary>\n        <para>Returns a resource at an asset path (Editor Only).</para>\n      </summary>\n      <param name=\"assetPath\">Pathname of the target asset.</param>\n      <param name=\"type\">Type filter for objects returned.</param>\n    </member>\n    <member name=\"M:UnityEngine.Resources.LoadAssetAtPath(System.String)\">\n      <summary>\n        <para>Returns a resource at an asset path (Editor Only).</para>\n      </summary>\n      <param name=\"assetPath\">Pathname of the target asset.</param>\n    </member>\n    <member name=\"M:UnityEngine.Resources.LoadAsync(System.String)\">\n      <summary>\n        <para>Asynchronously loads an asset stored at path in a Resources folder.</para>\n      </summary>\n      <param name=\"path\">Pathname of the target folder. When using the empty string (i.e., \"\"), the function will load the entire contents of the Resources folder.</param>\n      <param name=\"systemTypeInstance\">Type filter for objects returned.</param>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Resources.LoadAsync(System.String,System.Type)\">\n      <summary>\n        <para>Asynchronously loads an asset stored at path in a Resources folder.</para>\n      </summary>\n      <param name=\"path\">Pathname of the target folder. When using the empty string (i.e., \"\"), the function will load the entire contents of the Resources folder.</param>\n      <param name=\"systemTypeInstance\">Type filter for objects returned.</param>\n      <param name=\"type\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Resources.LoadAsync(System.String)\">\n      <summary>\n        <para>Asynchronously loads an asset stored at path in a Resources folder.</para>\n      </summary>\n      <param name=\"path\">Pathname of the target folder. When using the empty string (i.e., \"\"), the function will load the entire contents of the Resources folder.</param>\n    </member>\n    <member name=\"M:UnityEngine.Resources.UnloadAsset(UnityEngine.Object)\">\n      <summary>\n        <para>Unloads assetToUnload from memory.</para>\n      </summary>\n      <param name=\"assetToUnload\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Resources.UnloadUnusedAssets\">\n      <summary>\n        <para>Unloads assets that are not used.</para>\n      </summary>\n      <returns>\n        <para>Object on which you can yield to wait until the operation completes.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Rigidbody\">\n      <summary>\n        <para>Control of an object's position through physics simulation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.angularDrag\">\n      <summary>\n        <para>The angular drag of the object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.angularVelocity\">\n      <summary>\n        <para>The angular velocity vector of the rigidbody measured in radians per second.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.centerOfMass\">\n      <summary>\n        <para>The center of mass relative to the transform's origin.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.collisionDetectionMode\">\n      <summary>\n        <para>The Rigidbody's collision detection mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.constraints\">\n      <summary>\n        <para>Controls which degrees of freedom are allowed for the simulation of this Rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.detectCollisions\">\n      <summary>\n        <para>Should collision detection be enabled? (By default always enabled).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.drag\">\n      <summary>\n        <para>The drag of the object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.freezeRotation\">\n      <summary>\n        <para>Controls whether physics will change the rotation of the object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.inertiaTensor\">\n      <summary>\n        <para>The diagonal inertia tensor of mass relative to the center of mass.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.inertiaTensorRotation\">\n      <summary>\n        <para>The rotation of the inertia tensor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.interpolation\">\n      <summary>\n        <para>Interpolation allows you to smooth out the effect of running physics at a fixed frame rate.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.isKinematic\">\n      <summary>\n        <para>Controls whether physics affects the rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.mass\">\n      <summary>\n        <para>The mass of the rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.maxAngularVelocity\">\n      <summary>\n        <para>The maximimum angular velocity of the rigidbody. (Default 7) range { 0, infinity }.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.maxDepenetrationVelocity\">\n      <summary>\n        <para>Maximum velocity of a rigidbody when moving out of penetrating state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.position\">\n      <summary>\n        <para>The position of the rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.rotation\">\n      <summary>\n        <para>The rotation of the rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.sleepAngularVelocity\">\n      <summary>\n        <para>The angular velocity below which objects start going to sleep.  (Default 0.14) range { 0, infinity }.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.sleepThreshold\">\n      <summary>\n        <para>The mass-normalized energy threshold, below which objects start going to sleep.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.sleepVelocity\">\n      <summary>\n        <para>The linear velocity below which objects start going to sleep. (Default 0.14) range { 0, infinity }.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.solverIterations\">\n      <summary>\n        <para>The solverIterations determines how accurately Rigidbody joints and collision contacts are resolved. Overrides Physics.defaultSolverIterations. Must be positive.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.solverVelocityIterations\">\n      <summary>\n        <para>The solverVelocityIterations affects how how accurately Rigidbody joints and collision contacts are resolved. Overrides Physics.defaultSolverVelocityIterations. Must be positive.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.useConeFriction\">\n      <summary>\n        <para>Force cone friction to be used for this rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.useGravity\">\n      <summary>\n        <para>Controls whether gravity affects this rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.velocity\">\n      <summary>\n        <para>The velocity vector of the rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody.worldCenterOfMass\">\n      <summary>\n        <para>The center of mass of the rigidbody in world space (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddExplosionForce(System.Single,UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Applies a force to a rigidbody that simulates explosion effects.</para>\n      </summary>\n      <param name=\"explosionForce\">The force of the explosion (which may be modified by distance).</param>\n      <param name=\"explosionPosition\">The centre of the sphere within which the explosion has its effect.</param>\n      <param name=\"explosionRadius\">The radius of the sphere within which the explosion has its effect.</param>\n      <param name=\"upwardsModifier\">Adjustment to the apparent position of the explosion to make it seem to lift objects.</param>\n      <param name=\"mode\">The method used to apply the force to its targets.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddExplosionForce(System.Single,UnityEngine.Vector3,System.Single,System.Single)\">\n      <summary>\n        <para>Applies a force to a rigidbody that simulates explosion effects.</para>\n      </summary>\n      <param name=\"explosionForce\">The force of the explosion (which may be modified by distance).</param>\n      <param name=\"explosionPosition\">The centre of the sphere within which the explosion has its effect.</param>\n      <param name=\"explosionRadius\">The radius of the sphere within which the explosion has its effect.</param>\n      <param name=\"upwardsModifier\">Adjustment to the apparent position of the explosion to make it seem to lift objects.</param>\n      <param name=\"mode\">The method used to apply the force to its targets.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddExplosionForce(System.Single,UnityEngine.Vector3,System.Single,System.Single,UnityEngine.ForceMode)\">\n      <summary>\n        <para>Applies a force to a rigidbody that simulates explosion effects.</para>\n      </summary>\n      <param name=\"explosionForce\">The force of the explosion (which may be modified by distance).</param>\n      <param name=\"explosionPosition\">The centre of the sphere within which the explosion has its effect.</param>\n      <param name=\"explosionRadius\">The radius of the sphere within which the explosion has its effect.</param>\n      <param name=\"upwardsModifier\">Adjustment to the apparent position of the explosion to make it seem to lift objects.</param>\n      <param name=\"mode\">The method used to apply the force to its targets.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddForce(UnityEngine.Vector3)\">\n      <summary>\n        <para>Adds a force to the Rigidbody.</para>\n      </summary>\n      <param name=\"force\">Force vector in world coordinates.</param>\n      <param name=\"mode\">Type of force to apply.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddForce(UnityEngine.Vector3,UnityEngine.ForceMode)\">\n      <summary>\n        <para>Adds a force to the Rigidbody.</para>\n      </summary>\n      <param name=\"force\">Force vector in world coordinates.</param>\n      <param name=\"mode\">Type of force to apply.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddForce(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Adds a force to the Rigidbody.</para>\n      </summary>\n      <param name=\"x\">Size of force along the world x-axis.</param>\n      <param name=\"y\">Size of force along the world y-axis.</param>\n      <param name=\"z\">Size of force along the world z-axis.</param>\n      <param name=\"mode\">Type of force to apply.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddForce(System.Single,System.Single,System.Single,UnityEngine.ForceMode)\">\n      <summary>\n        <para>Adds a force to the Rigidbody.</para>\n      </summary>\n      <param name=\"x\">Size of force along the world x-axis.</param>\n      <param name=\"y\">Size of force along the world y-axis.</param>\n      <param name=\"z\">Size of force along the world z-axis.</param>\n      <param name=\"mode\">Type of force to apply.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddForceAtPosition(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Applies force at position. As a result this will apply a torque and force on the object.</para>\n      </summary>\n      <param name=\"force\">Force vector in world coordinates.</param>\n      <param name=\"position\">Position in world coordinates.</param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddForceAtPosition(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.ForceMode)\">\n      <summary>\n        <para>Applies force at position. As a result this will apply a torque and force on the object.</para>\n      </summary>\n      <param name=\"force\">Force vector in world coordinates.</param>\n      <param name=\"position\">Position in world coordinates.</param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddRelativeForce(UnityEngine.Vector3)\">\n      <summary>\n        <para>Adds a force to the rigidbody relative to its coordinate system.</para>\n      </summary>\n      <param name=\"force\">Force vector in local coordinates.</param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddRelativeForce(UnityEngine.Vector3,UnityEngine.ForceMode)\">\n      <summary>\n        <para>Adds a force to the rigidbody relative to its coordinate system.</para>\n      </summary>\n      <param name=\"force\">Force vector in local coordinates.</param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddRelativeForce(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Adds a force to the rigidbody relative to its coordinate system.</para>\n      </summary>\n      <param name=\"x\">Size of force along the local x-axis.</param>\n      <param name=\"y\">Size of force along the local y-axis.</param>\n      <param name=\"z\">Size of force along the local z-axis.</param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddRelativeForce(System.Single,System.Single,System.Single,UnityEngine.ForceMode)\">\n      <summary>\n        <para>Adds a force to the rigidbody relative to its coordinate system.</para>\n      </summary>\n      <param name=\"x\">Size of force along the local x-axis.</param>\n      <param name=\"y\">Size of force along the local y-axis.</param>\n      <param name=\"z\">Size of force along the local z-axis.</param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddRelativeTorque(UnityEngine.Vector3)\">\n      <summary>\n        <para>Adds a torque to the rigidbody relative to its coordinate system.</para>\n      </summary>\n      <param name=\"torque\">Torque vector in local coordinates.</param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddRelativeTorque(UnityEngine.Vector3,UnityEngine.ForceMode)\">\n      <summary>\n        <para>Adds a torque to the rigidbody relative to its coordinate system.</para>\n      </summary>\n      <param name=\"torque\">Torque vector in local coordinates.</param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddRelativeTorque(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Adds a torque to the rigidbody relative to its coordinate system.</para>\n      </summary>\n      <param name=\"x\">Size of torque along the local x-axis.</param>\n      <param name=\"y\">Size of torque along the local y-axis.</param>\n      <param name=\"z\">Size of torque along the local z-axis.</param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddRelativeTorque(System.Single,System.Single,System.Single,UnityEngine.ForceMode)\">\n      <summary>\n        <para>Adds a torque to the rigidbody relative to its coordinate system.</para>\n      </summary>\n      <param name=\"x\">Size of torque along the local x-axis.</param>\n      <param name=\"y\">Size of torque along the local y-axis.</param>\n      <param name=\"z\">Size of torque along the local z-axis.</param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddTorque(UnityEngine.Vector3)\">\n      <summary>\n        <para>Adds a torque to the rigidbody.</para>\n      </summary>\n      <param name=\"torque\">Torque vector in world coordinates.</param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddTorque(UnityEngine.Vector3,UnityEngine.ForceMode)\">\n      <summary>\n        <para>Adds a torque to the rigidbody.</para>\n      </summary>\n      <param name=\"torque\">Torque vector in world coordinates.</param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddTorque(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Adds a torque to the rigidbody.</para>\n      </summary>\n      <param name=\"x\">Size of torque along the world x-axis.</param>\n      <param name=\"y\">Size of torque along the world y-axis.</param>\n      <param name=\"z\">Size of torque along the world z-axis.</param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.AddTorque(System.Single,System.Single,System.Single,UnityEngine.ForceMode)\">\n      <summary>\n        <para>Adds a torque to the rigidbody.</para>\n      </summary>\n      <param name=\"x\">Size of torque along the world x-axis.</param>\n      <param name=\"y\">Size of torque along the world y-axis.</param>\n      <param name=\"z\">Size of torque along the world z-axis.</param>\n      <param name=\"mode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.ClosestPointOnBounds(UnityEngine.Vector3)\">\n      <summary>\n        <para>The closest point to the bounding box of the attached colliders.</para>\n      </summary>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.GetPointVelocity(UnityEngine.Vector3)\">\n      <summary>\n        <para>The velocity of the rigidbody at the point worldPoint in global space.</para>\n      </summary>\n      <param name=\"worldPoint\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.GetRelativePointVelocity(UnityEngine.Vector3)\">\n      <summary>\n        <para>The velocity relative to the rigidbody at the point relativePoint.</para>\n      </summary>\n      <param name=\"relativePoint\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.IsSleeping\">\n      <summary>\n        <para>Is the rigidbody sleeping?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.MovePosition(UnityEngine.Vector3)\">\n      <summary>\n        <para>Moves the rigidbody to position.</para>\n      </summary>\n      <param name=\"position\">The new position for the Rigidbody object.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.MoveRotation(UnityEngine.Quaternion)\">\n      <summary>\n        <para>Rotates the rigidbody to rotation.</para>\n      </summary>\n      <param name=\"rot\">The new rotation for the Rigidbody.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.ResetCenterOfMass\">\n      <summary>\n        <para>Reset the center of mass of the rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.ResetInertiaTensor\">\n      <summary>\n        <para>Reset the inertia tensor value and rotation.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.SetDensity(System.Single)\">\n      <summary>\n        <para>Sets the mass based on the attached colliders assuming a constant density.</para>\n      </summary>\n      <param name=\"density\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.Sleep\">\n      <summary>\n        <para>Forces a rigidbody to sleep at least one frame.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.SweepTest(UnityEngine.Vector3,UnityEngine.RaycastHit&amp;,System.Single,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Tests if a rigidbody would collide with anything, if it was moved through the scene.</para>\n      </summary>\n      <param name=\"direction\">The direction into which to sweep the rigidbody.</param>\n      <param name=\"hitInfo\">If true is returned, hitInfo will contain more information about where the collider was hit (See Also: RaycastHit).</param>\n      <param name=\"maxDistance\">The length of the sweep.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>True when the rigidbody sweep intersects any collider, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.SweepTestAll(UnityEngine.Vector3,System.Single,UnityEngine.QueryTriggerInteraction)\">\n      <summary>\n        <para>Like Rigidbody.SweepTest, but returns all hits.</para>\n      </summary>\n      <param name=\"direction\">The direction into which to sweep the rigidbody.</param>\n      <param name=\"maxDistance\">The length of the sweep.</param>\n      <param name=\"queryTriggerInteraction\">Specifies whether this query should hit Triggers.</param>\n      <returns>\n        <para>An array of all colliders hit in the sweep.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody.WakeUp\">\n      <summary>\n        <para>Forces a rigidbody to wake up.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Rigidbody2D\">\n      <summary>\n        <para>Rigidbody physics component for 2D sprites.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.angularDrag\">\n      <summary>\n        <para>Coefficient of angular drag.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.angularVelocity\">\n      <summary>\n        <para>Angular velocity in degrees per second.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.attachedColliderCount\">\n      <summary>\n        <para>Returns the number of Collider2D attached to this Rigidbody2D.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.bodyType\">\n      <summary>\n        <para>The physical behaviour type of the Rigidbody2D.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.centerOfMass\">\n      <summary>\n        <para>The center of mass of the rigidBody in local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.collisionDetectionMode\">\n      <summary>\n        <para>The method used by the physics engine to check if two objects have collided.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.constraints\">\n      <summary>\n        <para>Controls which degrees of freedom are allowed for the simulation of this Rigidbody2D.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.drag\">\n      <summary>\n        <para>Coefficient of drag.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.fixedAngle\">\n      <summary>\n        <para>Should the rigidbody be prevented from rotating?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.freezeRotation\">\n      <summary>\n        <para>Controls whether physics will change the rotation of the object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.gravityScale\">\n      <summary>\n        <para>The degree to which this object is affected by gravity.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.inertia\">\n      <summary>\n        <para>The rigidBody rotational inertia.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.interpolation\">\n      <summary>\n        <para>Physics interpolation used between updates.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.isKinematic\">\n      <summary>\n        <para>Should this rigidbody be taken out of physics control?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.mass\">\n      <summary>\n        <para>Mass of the Rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.position\">\n      <summary>\n        <para>The position of the rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.rotation\">\n      <summary>\n        <para>The rotation of the rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.sharedMaterial\">\n      <summary>\n        <para>The PhysicsMaterial2D that is applied to all Collider2D attached to this Rigidbody2D.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.simulated\">\n      <summary>\n        <para>Indicates whether the rigid body should be simulated or not by the physics system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.sleepMode\">\n      <summary>\n        <para>The sleep state that the rigidbody will initially be in.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.useAutoMass\">\n      <summary>\n        <para>Should the total rigid-body mass be automatically calculated from the Collider2D.density of attached colliders?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.useFullKinematicContacts\">\n      <summary>\n        <para>Should kinematickinematic and kinematicstatic collisions be allowed?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.velocity\">\n      <summary>\n        <para>Linear velocity of the rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Rigidbody2D.worldCenterOfMass\">\n      <summary>\n        <para>Gets the center of mass of the rigidBody in global space.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.AddForce(UnityEngine.Vector2,UnityEngine.ForceMode2D)\">\n      <summary>\n        <para>Apply a force to the rigidbody.</para>\n      </summary>\n      <param name=\"force\">Components of the force in the X and Y axes.</param>\n      <param name=\"mode\">The method used to apply the specified force.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.AddForceAtPosition(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.ForceMode2D)\">\n      <summary>\n        <para>Apply a force at a given position in space.</para>\n      </summary>\n      <param name=\"force\">Components of the force in the X and Y axes.</param>\n      <param name=\"position\">Position in world space to apply the force.</param>\n      <param name=\"mode\">The method used to apply the specified force.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.AddRelativeForce(UnityEngine.Vector2,UnityEngine.ForceMode2D)\">\n      <summary>\n        <para>Adds a force to the rigidbody2D relative to its coordinate system.</para>\n      </summary>\n      <param name=\"relativeForce\">Components of the force in the X and Y axes.</param>\n      <param name=\"mode\">The method used to apply the specified force.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.AddTorque(System.Single,UnityEngine.ForceMode2D)\">\n      <summary>\n        <para>Apply a torque at the rigidbody's centre of mass.</para>\n      </summary>\n      <param name=\"torque\">Torque to apply.</param>\n      <param name=\"mode\">The force mode to use.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.Cast(UnityEngine.Vector2,UnityEngine.RaycastHit2D[],System.Single)\">\n      <summary>\n        <para>All the Collider2D shapes attached to the Rigidbody2D are cast into the scene starting at each collider position ignoring the colliders attached to the same Rigidbody2D.</para>\n      </summary>\n      <param name=\"direction\">Vector representing the direction to cast each Collider2D shape.</param>\n      <param name=\"results\">Array to receive results.</param>\n      <param name=\"distance\">Maximum distance over which to cast the shape(s).</param>\n      <returns>\n        <para>The number of results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.Cast(UnityEngine.Vector2,UnityEngine.ContactFilter2D,UnityEngine.RaycastHit2D[],System.Single)\">\n      <summary>\n        <para>All the Collider2D shapes attached to the Rigidbody2D are cast into the scene starting at each collider position ignoring the colliders attached to the same Rigidbody2D.</para>\n      </summary>\n      <param name=\"direction\">Vector representing the direction to cast each Collider2D shape.</param>\n      <param name=\"contactFilter\">Filter results defined by the contact filter.</param>\n      <param name=\"results\">Array to receive results.</param>\n      <param name=\"distance\">Maximum distance over which to cast the shape(s).</param>\n      <returns>\n        <para>The number of results returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.Distance(UnityEngine.Collider2D)\">\n      <summary>\n        <para>Calculates the minimum distance of this collider against all Collider2D attached to this Rigidbody2D.</para>\n      </summary>\n      <param name=\"collider\">A collider used to calculate the minimum distance against all colliders attached to this Rigidbody2D.</param>\n      <returns>\n        <para>The minimum distance of collider against all colliders attached to this Rigidbody2D.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.GetAttachedColliders(UnityEngine.Collider2D[])\">\n      <summary>\n        <para>Returns all Collider2D that are attached to this Rigidbody2D.</para>\n      </summary>\n      <param name=\"results\">An array of Collider2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of Collider2D placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.GetContacts(UnityEngine.ContactPoint2D[])\">\n      <summary>\n        <para>Retrieves all contact points for all of the collider(s) attached to this rigidbody.</para>\n      </summary>\n      <param name=\"contacts\">An array of ContactPoint2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of contacts placed in the contacts array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.GetContacts(UnityEngine.Collider2D[])\">\n      <summary>\n        <para>Retrieves all colliders in contact with any of the collider(s) attached to this rigidbody.</para>\n      </summary>\n      <param name=\"colliders\">An array of Collider2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of colliders placed in the colliders array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.GetContacts(UnityEngine.ContactFilter2D,UnityEngine.ContactPoint2D[])\">\n      <summary>\n        <para>Retrieves all contact points for all of the collider(s) attached to this rigidbody, with the results filtered by the ContactFilter2D.</para>\n      </summary>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <param name=\"contacts\">An array of ContactPoint2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of contacts placed in the contacts array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.GetContacts(UnityEngine.ContactFilter2D,UnityEngine.Collider2D[])\">\n      <summary>\n        <para>Retrieves all colliders in contact with any of the collider(s) attached to this rigidbody, with the results filtered by the ContactFilter2D.</para>\n      </summary>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <param name=\"colliders\">An array of Collider2D used to receive the results.</param>\n      <returns>\n        <para>Returns the number of colliders placed in the colliders array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.GetPoint(UnityEngine.Vector2)\">\n      <summary>\n        <para>Get a local space point given the point point in rigidBody global space.</para>\n      </summary>\n      <param name=\"point\">The global space point to transform into local space.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.GetPointVelocity(UnityEngine.Vector2)\">\n      <summary>\n        <para>The velocity of the rigidbody at the point Point in global space.</para>\n      </summary>\n      <param name=\"point\">The global space point to calculate velocity for.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.GetRelativePoint(UnityEngine.Vector2)\">\n      <summary>\n        <para>Get a global space point given the point relativePoint in rigidBody local space.</para>\n      </summary>\n      <param name=\"relativePoint\">The local space point to transform into global space.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.GetRelativePointVelocity(UnityEngine.Vector2)\">\n      <summary>\n        <para>The velocity of the rigidbody at the point Point in local space.</para>\n      </summary>\n      <param name=\"relativePoint\">The local space point to calculate velocity for.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.GetRelativeVector(UnityEngine.Vector2)\">\n      <summary>\n        <para>Get a global space vector given the vector relativeVector in rigidBody local space.</para>\n      </summary>\n      <param name=\"relativeVector\">The local space vector to transform into a global space vector.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.GetVector(UnityEngine.Vector2)\">\n      <summary>\n        <para>Get a local space vector given the vector vector in rigidBody global space.</para>\n      </summary>\n      <param name=\"vector\">The global space vector to transform into a local space vector.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.IsAwake\">\n      <summary>\n        <para>Is the rigidbody \"awake\"?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.IsSleeping\">\n      <summary>\n        <para>Is the rigidbody \"sleeping\"?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.IsTouching(UnityEngine.Collider2D)\">\n      <summary>\n        <para>Checks whether the collider  is touching any of the collider(s) attached to this rigidbody or not.</para>\n      </summary>\n      <param name=\"collider\">The collider to check if it is touching any of the collider(s) attached to this rigidbody.</param>\n      <returns>\n        <para>Whether the collider is touching any of the collider(s) attached to this rigidbody or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.IsTouching(UnityEngine.Collider2D,UnityEngine.ContactFilter2D)\">\n      <summary>\n        <para>Checks whether the collider  is touching any of the collider(s) attached to this rigidbody or not with the results filtered by the ContactFilter2D.</para>\n      </summary>\n      <param name=\"collider\">The collider to check if it is touching any of the collider(s) attached to this rigidbody.</param>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <returns>\n        <para>Whether the collider is touching any of the collider(s) attached to this rigidbody or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.IsTouching(UnityEngine.ContactFilter2D)\">\n      <summary>\n        <para>Checks whether any collider is touching any of the collider(s) attached to this rigidbody or not with the results filtered by the ContactFilter2D.</para>\n      </summary>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth, or normal angle.</param>\n      <returns>\n        <para>Whether any collider is touching any of the collider(s) attached to this rigidbody or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.IsTouchingLayers(System.Int32)\">\n      <summary>\n        <para>Checks whether any of the collider(s) attached to this rigidbody are touching any colliders on the specified layerMask or not.</para>\n      </summary>\n      <param name=\"layerMask\">Any colliders on any of these layers count as touching.</param>\n      <returns>\n        <para>Whether any of the collider(s) attached to this rigidbody are touching any colliders on the specified layerMask or not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.MovePosition(UnityEngine.Vector2)\">\n      <summary>\n        <para>Moves the rigidbody to position.</para>\n      </summary>\n      <param name=\"position\">The new position for the Rigidbody object.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.MoveRotation(System.Single)\">\n      <summary>\n        <para>Rotates the rigidbody to angle (given in degrees).</para>\n      </summary>\n      <param name=\"angle\">The new rotation angle for the Rigidbody object.</param>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.OverlapCollider(UnityEngine.ContactFilter2D,UnityEngine.Collider2D[])\">\n      <summary>\n        <para>Get a list of all colliders that overlap all colliders attached to this Rigidbody2D.</para>\n      </summary>\n      <param name=\"contactFilter\">The contact filter used to filter the results differently, such as by layer mask, Z depth.  Note that normal angle is not used for overlap testing.</param>\n      <param name=\"results\">The array to receive results.  The size of the array determines the maximum number of results that can be returned.</param>\n      <returns>\n        <para>Returns the number of results placed in the results array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.OverlapPoint(UnityEngine.Vector2)\">\n      <summary>\n        <para>Check if any of the Rigidbody2D colliders overlap a point in space.</para>\n      </summary>\n      <param name=\"point\">A point in world space.</param>\n      <returns>\n        <para>Whether the point overlapped any of the Rigidbody2D colliders.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.Sleep\">\n      <summary>\n        <para>Make the rigidbody \"sleep\".</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Rigidbody2D.WakeUp\">\n      <summary>\n        <para>Disables the \"sleeping\" state of a rigidbody.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RigidbodyConstraints\">\n      <summary>\n        <para>Use these flags to constrain motion of Rigidbodies.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyConstraints.FreezeAll\">\n      <summary>\n        <para>Freeze rotation and motion along all axes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyConstraints.FreezePosition\">\n      <summary>\n        <para>Freeze motion along all axes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyConstraints.FreezePositionX\">\n      <summary>\n        <para>Freeze motion along the X-axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyConstraints.FreezePositionY\">\n      <summary>\n        <para>Freeze motion along the Y-axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyConstraints.FreezePositionZ\">\n      <summary>\n        <para>Freeze motion along the Z-axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyConstraints.FreezeRotation\">\n      <summary>\n        <para>Freeze rotation along all axes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyConstraints.FreezeRotationX\">\n      <summary>\n        <para>Freeze rotation along the X-axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyConstraints.FreezeRotationY\">\n      <summary>\n        <para>Freeze rotation along the Y-axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyConstraints.FreezeRotationZ\">\n      <summary>\n        <para>Freeze rotation along the Z-axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyConstraints.None\">\n      <summary>\n        <para>No constraints.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RigidbodyConstraints2D\">\n      <summary>\n        <para>Use these flags to constrain motion of the Rigidbody2D.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyConstraints2D.FreezeAll\">\n      <summary>\n        <para>Freeze rotation and motion along all axes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyConstraints2D.FreezePosition\">\n      <summary>\n        <para>Freeze motion along the X-axis and Y-axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyConstraints2D.FreezePositionX\">\n      <summary>\n        <para>Freeze motion along the X-axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyConstraints2D.FreezePositionY\">\n      <summary>\n        <para>Freeze motion along the Y-axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyConstraints2D.FreezeRotation\">\n      <summary>\n        <para>Freeze rotation along the Z-axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyConstraints2D.None\">\n      <summary>\n        <para>No constraints.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RigidbodyInterpolation\">\n      <summary>\n        <para>Rigidbody interpolation mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyInterpolation.Extrapolate\">\n      <summary>\n        <para>Extrapolation will predict the position of the rigidbody based on the current velocity.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyInterpolation.Interpolate\">\n      <summary>\n        <para>Interpolation will always lag a little bit behind but can be smoother than extrapolation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyInterpolation.None\">\n      <summary>\n        <para>No Interpolation.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RigidbodyInterpolation2D\">\n      <summary>\n        <para>Interpolation mode for Rigidbody2D objects.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyInterpolation2D.Extrapolate\">\n      <summary>\n        <para>Smooth an object's movement based on an estimate of its position in the next frame.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyInterpolation2D.Interpolate\">\n      <summary>\n        <para>Smooth movement based on the object's positions in previous frames.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyInterpolation2D.None\">\n      <summary>\n        <para>Do not apply any smoothing to the object's movement.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RigidbodySleepMode2D\">\n      <summary>\n        <para>Settings for a Rigidbody2D's initial sleep state.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodySleepMode2D.NeverSleep\">\n      <summary>\n        <para>Rigidbody2D never automatically sleeps.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodySleepMode2D.StartAsleep\">\n      <summary>\n        <para>Rigidbody2D is initially asleep.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodySleepMode2D.StartAwake\">\n      <summary>\n        <para>Rigidbody2D is initially awake.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RigidbodyType2D\">\n      <summary>\n        <para>The physical behaviour type of the Rigidbody2D.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyType2D.Dynamic\">\n      <summary>\n        <para>Sets the Rigidbody2D to have dynamic behaviour.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyType2D.Kinematic\">\n      <summary>\n        <para>Sets the Rigidbody2D to have kinematic behaviour.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RigidbodyType2D.Static\">\n      <summary>\n        <para>Sets the Rigidbody2D to have static behaviour.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RotationDriveMode\">\n      <summary>\n        <para>Control ConfigurableJoint's rotation with either X &amp; YZ or Slerp Drive.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RotationDriveMode.Slerp\">\n      <summary>\n        <para>Use Slerp drive.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RotationDriveMode.XYAndZ\">\n      <summary>\n        <para>Use XY &amp; Z Drive.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RPC\">\n      <summary>\n        <para>Attribute for setting up RPC functions.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RPCMode\">\n      <summary>\n        <para>Option for who will receive an RPC, used by NetworkView.RPC.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RuntimeAnimatorController\">\n      <summary>\n        <para>The runtime representation of the AnimatorController. Use this representation to change the Animator Controller during runtime.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RuntimeAnimatorController.animationClips\">\n      <summary>\n        <para>Retrieves all AnimationClip used by the controller.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RuntimeInitializeLoadType\">\n      <summary>\n        <para>Set RuntimeInitializeOnLoadMethod type.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimeInitializeLoadType.AfterSceneLoad\">\n      <summary>\n        <para>After scene is loaded.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimeInitializeLoadType.BeforeSceneLoad\">\n      <summary>\n        <para>Before scene is loaded.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.RuntimeInitializeOnLoadMethodAttribute\">\n      <summary>\n        <para>Allow a runtime class method to be initialized when a game is loaded at runtime\n      without action from the user.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.RuntimeInitializeOnLoadMethodAttribute.loadType\">\n      <summary>\n        <para>Set RuntimeInitializeOnLoadMethod type.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.RuntimeInitializeOnLoadMethodAttribute.#ctor\">\n      <summary>\n        <para>Creation of the runtime class used when scenes are loaded.</para>\n      </summary>\n      <param name=\"loadType\">Determine whether methods are called before or after the\n        scene is loaded.</param>\n    </member>\n    <member name=\"M:UnityEngine.RuntimeInitializeOnLoadMethodAttribute.#ctor(UnityEngine.RuntimeInitializeLoadType)\">\n      <summary>\n        <para>Creation of the runtime class used when scenes are loaded.</para>\n      </summary>\n      <param name=\"loadType\">Determine whether methods are called before or after the\n        scene is loaded.</param>\n    </member>\n    <member name=\"T:UnityEngine.RuntimePlatform\">\n      <summary>\n        <para>The platform application is running. Returned by Application.platform.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.tvOS\">\n      <summary>\n        <para>In the player on the Apple's tvOS.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.Android\">\n      <summary>\n        <para>In the player on Android devices.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.IPhonePlayer\">\n      <summary>\n        <para>In the player on the iPhone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.LinuxEditor\">\n      <summary>\n        <para>In the Unity editor on Linux.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.LinuxPlayer\">\n      <summary>\n        <para>In the player on Linux.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.OSXDashboardPlayer\">\n      <summary>\n        <para>In the Dashboard widget on macOS.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.OSXEditor\">\n      <summary>\n        <para>In the Unity editor on macOS.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.OSXPlayer\">\n      <summary>\n        <para>In the player on macOS.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.OSXWebPlayer\">\n      <summary>\n        <para>In the web player on macOS.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.PS4\">\n      <summary>\n        <para>In the player on the Playstation 4.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.PSP2\">\n      <summary>\n        <para>In the player on the PS Vita.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.Switch\">\n      <summary>\n        <para>In the player on Nintendo Switch.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.WebGLPlayer\">\n      <summary>\n        <para>In the player on WebGL</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.WindowsEditor\">\n      <summary>\n        <para>In the Unity editor on Windows.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.WindowsPlayer\">\n      <summary>\n        <para>In the player on Windows.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.WindowsWebPlayer\">\n      <summary>\n        <para>In the web player on Windows.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.WSAPlayerARM\">\n      <summary>\n        <para>In the player on Windows Store Apps when CPU architecture is ARM.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.WSAPlayerX64\">\n      <summary>\n        <para>In the player on Windows Store Apps when CPU architecture is X64.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.WSAPlayerX86\">\n      <summary>\n        <para>In the player on Windows Store Apps when CPU architecture is X86.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.RuntimePlatform.XboxOne\">\n      <summary>\n        <para>In the player on Xbox One.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ScalableBufferManager\">\n      <summary>\n        <para>Scales render textures to support dynamic resolution if the target platform/graphics API supports it.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ScalableBufferManager.heightScaleFactor\">\n      <summary>\n        <para>Height scale factor to control dynamic resolution.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ScalableBufferManager.widthScaleFactor\">\n      <summary>\n        <para>Width scale factor to control dynamic resolution.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ScalableBufferManager.ResizeBuffers(System.Single,System.Single)\">\n      <summary>\n        <para>Function to resize all buffers marked as DynamicallyScalable.</para>\n      </summary>\n      <param name=\"widthScale\">New scale factor for the width the ScalableBufferManager will use to resize all render textures the user marked as DynamicallyScalable, has to be some value greater than 0.0 and less than or equal to 1.0.</param>\n      <param name=\"heightScale\">New scale factor for the height the ScalableBufferManager will use to resize all render textures the user marked as DynamicallyScalable, has to be some value greater than 0.0 and less than or equal to 1.0.</param>\n    </member>\n    <member name=\"T:UnityEngine.ScaleMode\">\n      <summary>\n        <para>Scaling mode to draw textures with.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ScaleMode.ScaleAndCrop\">\n      <summary>\n        <para>Scales the texture, maintaining aspect ratio, so it completely covers the position rectangle passed to GUI.DrawTexture. If the texture is being draw to a rectangle with a different aspect ratio than the original, the image is cropped.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ScaleMode.ScaleToFit\">\n      <summary>\n        <para>Scales the texture, maintaining aspect ratio, so it completely fits withing the position rectangle passed to GUI.DrawTexture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ScaleMode.StretchToFill\">\n      <summary>\n        <para>Stretches the texture to fill the complete rectangle passed in to GUI.DrawTexture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SceneManagement.LoadSceneMode\">\n      <summary>\n        <para>Used when loading a scene in a player.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SceneManagement.LoadSceneMode.Additive\">\n      <summary>\n        <para>Adds the scene to the current loaded scenes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SceneManagement.LoadSceneMode.Single\">\n      <summary>\n        <para>Closes all current loaded scenes and loads a scene.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SceneManagement.Scene\">\n      <summary>\n        <para>Run-time data structure for *.unity file.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SceneManagement.Scene.buildIndex\">\n      <summary>\n        <para>Returns the index of the scene in the Build Settings. Always returns -1 if the scene was loaded through an AssetBundle.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SceneManagement.Scene.isDirty\">\n      <summary>\n        <para>Returns true if the scene is modifed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SceneManagement.Scene.isLoaded\">\n      <summary>\n        <para>Returns true if the scene is loaded.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SceneManagement.Scene.name\">\n      <summary>\n        <para>Returns the name of the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SceneManagement.Scene.path\">\n      <summary>\n        <para>Returns the relative path of the scene. Like: \"AssetsMyScenesMyScene.unity\".</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SceneManagement.Scene.rootCount\">\n      <summary>\n        <para>The number of root transforms of this scene.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.Scene.GetRootGameObjects\">\n      <summary>\n        <para>Returns all the root game objects in the scene.</para>\n      </summary>\n      <returns>\n        <para>An array of game objects.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.Scene.GetRootGameObjects(System.Collections.Generic.List`1&lt;UnityEngine.GameObject&gt;)\">\n      <summary>\n        <para>Returns all the root game objects in the scene.</para>\n      </summary>\n      <param name=\"rootGameObjects\">A list which is used to return the root game objects.</param>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.Scene.IsValid\">\n      <summary>\n        <para>Whether this is a valid scene.\nA scene may be invalid if, for example, you tried to open a scene that does not exist. In this case, the scene returned from EditorSceneManager.OpenScene would return False for IsValid.</para>\n      </summary>\n      <returns>\n        <para>Whether this is a valid scene.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.SceneManagement.Scene.op_Equal(UnityEngine.SceneManagement.Scene,UnityEngine.SceneManagement.Scene)\">\n      <summary>\n        <para>Returns true if the Scenes are equal.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"?:UnityEngine.SceneManagement.Scene.op_NotEqual(UnityEngine.SceneManagement.Scene,UnityEngine.SceneManagement.Scene)\">\n      <summary>\n        <para>Returns true if the Scenes are different.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"T:UnityEngine.SceneManagement.SceneManager\">\n      <summary>\n        <para>Scene management at run-time.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.SceneManagement.SceneManager.activeSceneChanged(UnityEngine.Events.UnityAction`2&lt;UnityEngine.SceneManagement.Scene,UnityEngine.SceneManagement.Scene&gt;)\">\n      <summary>\n        <para>Subscribe to this event to get notified when the active Scene has changed.</para>\n      </summary>\n      <param name=\"value\">Previous active scene and the new active scene.</param>\n    </member>\n    <member name=\"P:UnityEngine.SceneManagement.SceneManager.sceneCount\">\n      <summary>\n        <para>The total number of currently loaded Scenes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SceneManagement.SceneManager.sceneCountInBuildSettings\">\n      <summary>\n        <para>Number of Scenes in Build Settings.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.SceneManagement.SceneManager.sceneLoaded(UnityEngine.Events.UnityAction`2&lt;UnityEngine.SceneManagement.Scene,UnityEngine.SceneManagement.LoadSceneMode&gt;)\">\n      <summary>\n        <para>Add a delegate to this to get notifications when a Scene has loaded.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.SceneManagement.SceneManager.sceneUnloaded(UnityEngine.Events.UnityAction`1&lt;UnityEngine.SceneManagement.Scene&gt;)\">\n      <summary>\n        <para>Add a delegate to this to get notifications when a Scene has unloaded</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.CreateScene(System.String)\">\n      <summary>\n        <para>Create an empty new Scene at runtime with the given name.</para>\n      </summary>\n      <param name=\"sceneName\">The name of the new Scene. It cannot be empty or null, or same as the name of the existing Scenes.</param>\n      <returns>\n        <para>A reference to the new Scene that was created, or an invalid Scene if creation failed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.GetActiveScene\">\n      <summary>\n        <para>Gets the currently active Scene.</para>\n      </summary>\n      <returns>\n        <para>The active Scene.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.GetAllScenes\">\n      <summary>\n        <para>Returns an array of all the Scenes currently open in the hierarchy.</para>\n      </summary>\n      <returns>\n        <para>Array of Scenes in the Hierarchy.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.GetSceneAt(System.Int32)\">\n      <summary>\n        <para>Get the Scene at index in the SceneManager's list of loaded Scenes.</para>\n      </summary>\n      <param name=\"index\">Index of the Scene to get. Index must be greater than or equal to 0 and less than SceneManager.sceneCount.</param>\n      <returns>\n        <para>A reference to the Scene at the index specified.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.GetSceneByBuildIndex(System.Int32)\">\n      <summary>\n        <para>Get a Scene struct from a build index.</para>\n      </summary>\n      <param name=\"buildIndex\">Build index as shown in the Build Settings window.</param>\n      <returns>\n        <para>A reference to the Scene, if valid. If not, an invalid Scene is returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.GetSceneByName(System.String)\">\n      <summary>\n        <para>Searches through the Scenes loaded for a Scene with the given name.</para>\n      </summary>\n      <param name=\"name\">Name of Scene to find.</param>\n      <returns>\n        <para>A reference to the Scene, if valid. If not, an invalid Scene is returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.GetSceneByPath(System.String)\">\n      <summary>\n        <para>Searches all Scenes loaded for a Scene that has the given asset path.</para>\n      </summary>\n      <param name=\"scenePath\">Path of the Scene. Should be relative to the project folder. Like: \"AssetsMyScenesMyScene.unity\".</param>\n      <returns>\n        <para>A reference to the Scene, if valid. If not, an invalid Scene is returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.LoadScene(System.Int32,UnityEngine.SceneManagement.LoadSceneMode)\">\n      <summary>\n        <para>Loads the Scene by its name or index in Build Settings.</para>\n      </summary>\n      <param name=\"sceneName\">Name or path of the Scene to load.</param>\n      <param name=\"sceneBuildIndex\">Index of the Scene in the Build Settings to load.</param>\n      <param name=\"mode\">Allows you to specify whether or not to load the Scene additively.\n        See SceneManagement.LoadSceneMode for more information about the options.</param>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.LoadScene(System.String,UnityEngine.SceneManagement.LoadSceneMode)\">\n      <summary>\n        <para>Loads the Scene by its name or index in Build Settings.</para>\n      </summary>\n      <param name=\"sceneName\">Name or path of the Scene to load.</param>\n      <param name=\"sceneBuildIndex\">Index of the Scene in the Build Settings to load.</param>\n      <param name=\"mode\">Allows you to specify whether or not to load the Scene additively.\n        See SceneManagement.LoadSceneMode for more information about the options.</param>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(System.String,UnityEngine.SceneManagement.LoadSceneMode)\">\n      <summary>\n        <para>Loads the Scene asynchronously in the background.</para>\n      </summary>\n      <param name=\"sceneName\">Name or path of the Scene to load.</param>\n      <param name=\"sceneBuildIndex\">Index of the Scene in the Build Settings to load.</param>\n      <param name=\"mode\">If LoadSceneMode.Single then all current Scenes will be unloaded before loading.</param>\n      <returns>\n        <para>Use the AsyncOperation to determine if the operation has completed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(System.Int32,UnityEngine.SceneManagement.LoadSceneMode)\">\n      <summary>\n        <para>Loads the Scene asynchronously in the background.</para>\n      </summary>\n      <param name=\"sceneName\">Name or path of the Scene to load.</param>\n      <param name=\"sceneBuildIndex\">Index of the Scene in the Build Settings to load.</param>\n      <param name=\"mode\">If LoadSceneMode.Single then all current Scenes will be unloaded before loading.</param>\n      <returns>\n        <para>Use the AsyncOperation to determine if the operation has completed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.MergeScenes(UnityEngine.SceneManagement.Scene,UnityEngine.SceneManagement.Scene)\">\n      <summary>\n        <para>This will merge the source Scene into the destinationScene.</para>\n      </summary>\n      <param name=\"sourceScene\">The Scene that will be merged into the destination Scene.</param>\n      <param name=\"destinationScene\">Existing Scene to merge the source Scene into.</param>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(UnityEngine.GameObject,UnityEngine.SceneManagement.Scene)\">\n      <summary>\n        <para>Move a GameObject from its current Scene to a new Scene.</para>\n      </summary>\n      <param name=\"go\">GameObject to move.</param>\n      <param name=\"scene\">Scene to move into.</param>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.SetActiveScene(UnityEngine.SceneManagement.Scene)\">\n      <summary>\n        <para>Set the Scene to be active.</para>\n      </summary>\n      <param name=\"scene\">The Scene to be set.</param>\n      <returns>\n        <para>Returns false if the Scene is not loaded yet.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.UnloadScene(System.Int32)\">\n      <summary>\n        <para>Destroys all GameObjects associated with the given Scene and removes the Scene from the SceneManager.</para>\n      </summary>\n      <param name=\"sceneBuildIndex\">Index of the Scene in the Build Settings to unload.</param>\n      <param name=\"sceneName\">Name or path of the Scene to unload.</param>\n      <param name=\"scene\">Scene to unload.</param>\n      <returns>\n        <para>Returns true if the Scene is unloaded.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.UnloadScene(System.String)\">\n      <summary>\n        <para>Destroys all GameObjects associated with the given Scene and removes the Scene from the SceneManager.</para>\n      </summary>\n      <param name=\"sceneBuildIndex\">Index of the Scene in the Build Settings to unload.</param>\n      <param name=\"sceneName\">Name or path of the Scene to unload.</param>\n      <param name=\"scene\">Scene to unload.</param>\n      <returns>\n        <para>Returns true if the Scene is unloaded.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.UnloadScene(UnityEngine.SceneManagement.Scene)\">\n      <summary>\n        <para>Destroys all GameObjects associated with the given Scene and removes the Scene from the SceneManager.</para>\n      </summary>\n      <param name=\"sceneBuildIndex\">Index of the Scene in the Build Settings to unload.</param>\n      <param name=\"sceneName\">Name or path of the Scene to unload.</param>\n      <param name=\"scene\">Scene to unload.</param>\n      <returns>\n        <para>Returns true if the Scene is unloaded.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.UnloadSceneAsync(System.Int32)\">\n      <summary>\n        <para>Destroys all GameObjects associated with the given Scene and removes the Scene from the SceneManager.</para>\n      </summary>\n      <param name=\"sceneBuildIndex\">Index of the Scene in BuildSettings.</param>\n      <param name=\"sceneName\">Name or path of the Scene to unload.</param>\n      <param name=\"scene\">Scene to unload.</param>\n      <returns>\n        <para>Use the AsyncOperation to determine if the operation has completed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.UnloadSceneAsync(System.String)\">\n      <summary>\n        <para>Destroys all GameObjects associated with the given Scene and removes the Scene from the SceneManager.</para>\n      </summary>\n      <param name=\"sceneBuildIndex\">Index of the Scene in BuildSettings.</param>\n      <param name=\"sceneName\">Name or path of the Scene to unload.</param>\n      <param name=\"scene\">Scene to unload.</param>\n      <returns>\n        <para>Use the AsyncOperation to determine if the operation has completed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneManager.UnloadSceneAsync(UnityEngine.SceneManagement.Scene)\">\n      <summary>\n        <para>Destroys all GameObjects associated with the given Scene and removes the Scene from the SceneManager.</para>\n      </summary>\n      <param name=\"sceneBuildIndex\">Index of the Scene in BuildSettings.</param>\n      <param name=\"sceneName\">Name or path of the Scene to unload.</param>\n      <param name=\"scene\">Scene to unload.</param>\n      <returns>\n        <para>Use the AsyncOperation to determine if the operation has completed.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.SceneManagement.SceneUtility\">\n      <summary>\n        <para>Scene and Build Settings related utilities.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneUtility.GetBuildIndexByScenePath(System.String)\">\n      <summary>\n        <para>Get the build index from a scene path.</para>\n      </summary>\n      <param name=\"scenePath\">Scene path (e.g: \"AssetsScenesScene1.unity\").</param>\n      <returns>\n        <para>Build index.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SceneManagement.SceneUtility.GetScenePathByBuildIndex(System.Int32)\">\n      <summary>\n        <para>Get the scene path from a build index.</para>\n      </summary>\n      <param name=\"buildIndex\"></param>\n      <returns>\n        <para>Scene path (e.g \"AssetsScenesScene1.unity\").</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Screen\">\n      <summary>\n        <para>Access to display information.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Screen.autorotateToLandscapeLeft\">\n      <summary>\n        <para>Allow auto-rotation to landscape left?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Screen.autorotateToLandscapeRight\">\n      <summary>\n        <para>Allow auto-rotation to landscape right?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Screen.autorotateToPortrait\">\n      <summary>\n        <para>Allow auto-rotation to portrait?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Screen.autorotateToPortraitUpsideDown\">\n      <summary>\n        <para>Allow auto-rotation to portrait, upside down?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Screen.currentResolution\">\n      <summary>\n        <para>The current screen resolution (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Screen.dpi\">\n      <summary>\n        <para>The current DPI of the screen / device (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Screen.fullScreen\">\n      <summary>\n        <para>Is the game running fullscreen?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Screen.fullScreenMode\">\n      <summary>\n        <para>Set this property to one of the values in FullScreenMode to change the display mode of your application.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Screen.height\">\n      <summary>\n        <para>The current height of the screen window in pixels (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Screen.lockCursor\">\n      <summary>\n        <para>Should the cursor be locked?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Screen.orientation\">\n      <summary>\n        <para>Specifies logical orientation of the screen.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Screen.resolutions\">\n      <summary>\n        <para>All fullscreen resolutions supported by the monitor (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Screen.safeArea\">\n      <summary>\n        <para>Returns the safe area of the screen in pixels (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Screen.showCursor\">\n      <summary>\n        <para>Should the cursor be visible?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Screen.sleepTimeout\">\n      <summary>\n        <para>A power saving setting, allowing the screen to dim some time after the last active user interaction.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Screen.width\">\n      <summary>\n        <para>The current width of the screen window in pixels (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Screen.SetResolution(System.Int32,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Switches the screen resolution.</para>\n      </summary>\n      <param name=\"width\"></param>\n      <param name=\"height\"></param>\n      <param name=\"fullscreen\"></param>\n      <param name=\"preferredRefreshRate\"></param>\n      <param name=\"fullscreenMode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Screen.SetResolution(System.Int32,System.Int32,System.Boolean,System.Int32)\">\n      <summary>\n        <para>Switches the screen resolution.</para>\n      </summary>\n      <param name=\"width\"></param>\n      <param name=\"height\"></param>\n      <param name=\"fullscreen\"></param>\n      <param name=\"preferredRefreshRate\"></param>\n      <param name=\"fullscreenMode\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Screen.SetResolution(System.Int32,System.Int32,UnityEngine.FullScreenMode,System.Int32)\">\n      <summary>\n        <para>Switches the screen resolution.</para>\n      </summary>\n      <param name=\"width\"></param>\n      <param name=\"height\"></param>\n      <param name=\"fullscreen\"></param>\n      <param name=\"preferredRefreshRate\"></param>\n      <param name=\"fullscreenMode\"></param>\n    </member>\n    <member name=\"T:UnityEngine.ScreenCapture\">\n      <summary>\n        <para>Functionality to take Screenshots.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ScreenCapture.CaptureScreenshot(System.String,System.Int32)\">\n      <summary>\n        <para>Captures a screenshot at path filename as a PNG file.</para>\n      </summary>\n      <param name=\"filename\">Pathname to save the screenshot file to.</param>\n      <param name=\"superSize\">Factor by which to increase resolution.</param>\n      <param name=\"stereoCaptureMode\">Specifies the eye texture to capture when stereo rendering is enabled.</param>\n    </member>\n    <member name=\"M:UnityEngine.ScreenCapture.CaptureScreenshot(System.String,UnityEngine.ScreenCapture/StereoScreenCaptureMode)\">\n      <summary>\n        <para>Captures a screenshot at path filename as a PNG file.</para>\n      </summary>\n      <param name=\"filename\">Pathname to save the screenshot file to.</param>\n      <param name=\"superSize\">Factor by which to increase resolution.</param>\n      <param name=\"stereoCaptureMode\">Specifies the eye texture to capture when stereo rendering is enabled.</param>\n    </member>\n    <member name=\"M:UnityEngine.ScreenCapture.CaptureScreenshotAsTexture(System.Int32)\">\n      <summary>\n        <para>Captures a screenshot of the game view into a Texture2D object.</para>\n      </summary>\n      <param name=\"superSize\">Factor by which to increase resolution.</param>\n      <param name=\"stereoCaptureMode\">Specifies the eye texture to capture when stereo rendering is enabled.</param>\n    </member>\n    <member name=\"M:UnityEngine.ScreenCapture.CaptureScreenshotAsTexture(UnityEngine.ScreenCapture/StereoScreenCaptureMode)\">\n      <summary>\n        <para>Captures a screenshot of the game view into a Texture2D object.</para>\n      </summary>\n      <param name=\"superSize\">Factor by which to increase resolution.</param>\n      <param name=\"stereoCaptureMode\">Specifies the eye texture to capture when stereo rendering is enabled.</param>\n    </member>\n    <member name=\"T:UnityEngine.ScreenCapture.StereoScreenCaptureMode\">\n      <summary>\n        <para>Enumeration specifying the eye texture to capture when using ScreenCapture.CaptureScreenshot and when stereo rendering is enabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ScreenCapture.StereoScreenCaptureMode.BothEyes\">\n      <summary>\n        <para>Both the left and right eyes are captured and composited into one image.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ScreenCapture.StereoScreenCaptureMode.LeftEye\">\n      <summary>\n        <para>The Left Eye is captured. This is the default setting for the CaptureScreenshot method.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ScreenCapture.StereoScreenCaptureMode.RightEye\">\n      <summary>\n        <para>The Right Eye is captured.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ScreenOrientation\">\n      <summary>\n        <para>Describes screen orientation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ScreenOrientation.AutoRotation\">\n      <summary>\n        <para>Auto-rotates the screen as necessary toward any of the enabled orientations.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ScreenOrientation.LandscapeLeft\">\n      <summary>\n        <para>Landscape orientation, counter-clockwise from the portrait orientation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ScreenOrientation.LandscapeRight\">\n      <summary>\n        <para>Landscape orientation, clockwise from the portrait orientation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ScreenOrientation.Portrait\">\n      <summary>\n        <para>Portrait orientation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ScreenOrientation.PortraitUpsideDown\">\n      <summary>\n        <para>Portrait orientation, upside down.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ScriptableObject\">\n      <summary>\n        <para>A class you can derive from if you want to create objects that don't need to be attached to game objects.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ScriptableObject.CreateInstance(System.String)\">\n      <summary>\n        <para>Creates an instance of a scriptable object.</para>\n      </summary>\n      <param name=\"className\">The type of the ScriptableObject to create, as the name of the type.</param>\n      <param name=\"type\">The type of the ScriptableObject to create, as a System.Type instance.</param>\n      <returns>\n        <para>The created ScriptableObject.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ScriptableObject.CreateInstance(System.Type)\">\n      <summary>\n        <para>Creates an instance of a scriptable object.</para>\n      </summary>\n      <param name=\"className\">The type of the ScriptableObject to create, as the name of the type.</param>\n      <param name=\"type\">The type of the ScriptableObject to create, as a System.Type instance.</param>\n      <returns>\n        <para>The created ScriptableObject.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ScriptableObject.CreateInstance\">\n      <summary>\n        <para>Creates an instance of a scriptable object.</para>\n      </summary>\n      <returns>\n        <para>The created ScriptableObject.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Scripting.PreserveAttribute\">\n      <summary>\n        <para>PreserveAttribute prevents byte code stripping from removing a class, method, field, or property.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Security\">\n      <summary>\n        <para>Webplayer security related class. Not supported from 5.4.0 onwards.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Security.LoadAndVerifyAssembly(System.Byte[],System.String)\">\n      <summary>\n        <para>Loads an assembly and checks that it is allowed to be used in the webplayer. (Web Player is no Longer Supported).</para>\n      </summary>\n      <param name=\"assemblyData\">Assembly to verify.</param>\n      <param name=\"authorizationKey\">Public key used to verify assembly.</param>\n      <returns>\n        <para>Loaded, verified, assembly, or null if the assembly cannot be verfied.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Security.LoadAndVerifyAssembly(System.Byte[])\">\n      <summary>\n        <para>Loads an assembly and checks that it is allowed to be used in the webplayer. (Web Player is no Longer Supported).</para>\n      </summary>\n      <param name=\"assemblyData\">Assembly to verify.</param>\n      <param name=\"authorizationKey\">Public key used to verify assembly.</param>\n      <returns>\n        <para>Loaded, verified, assembly, or null if the assembly cannot be verfied.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Security.PrefetchSocketPolicy(System.String,System.Int32)\">\n      <summary>\n        <para>Prefetch the webplayer socket security policy from a non-default port number.</para>\n      </summary>\n      <param name=\"ip\">IP address of server.</param>\n      <param name=\"atPort\">Port from where socket policy is read.</param>\n      <param name=\"timeout\">Time to wait for response.</param>\n    </member>\n    <member name=\"M:UnityEngine.Security.PrefetchSocketPolicy(System.String,System.Int32,System.Int32)\">\n      <summary>\n        <para>Prefetch the webplayer socket security policy from a non-default port number.</para>\n      </summary>\n      <param name=\"ip\">IP address of server.</param>\n      <param name=\"atPort\">Port from where socket policy is read.</param>\n      <param name=\"timeout\">Time to wait for response.</param>\n    </member>\n    <member name=\"T:UnityEngine.SelectionBaseAttribute\">\n      <summary>\n        <para>Add this attribute to a script class to mark its GameObject as a selection base object for Scene View picking.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SendMessageOptions\">\n      <summary>\n        <para>Options for how to send a message.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SendMessageOptions.DontRequireReceiver\">\n      <summary>\n        <para>No receiver is required for SendMessage.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SendMessageOptions.RequireReceiver\">\n      <summary>\n        <para>A receiver is required for SendMessage.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Serialization.FormerlySerializedAsAttribute\">\n      <summary>\n        <para>Use this attribute to rename a field without losing its serialized value.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Serialization.FormerlySerializedAsAttribute.oldName\">\n      <summary>\n        <para>The name of the field before the rename.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Serialization.FormerlySerializedAsAttribute.#ctor(System.String)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"oldName\">The name of the field before renaming.</param>\n    </member>\n    <member name=\"T:UnityEngine.SerializeField\">\n      <summary>\n        <para>Force Unity to serialize a private field.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Shader\">\n      <summary>\n        <para>Shader scripts used for all rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Shader.globalMaximumLOD\">\n      <summary>\n        <para>Shader LOD level for all shaders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Shader.globalRenderPipeline\">\n      <summary>\n        <para>Render pipeline currently in use.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Shader.globalShaderHardwareTier\">\n      <summary>\n        <para>Shader hardware tier classification for current device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Shader.isSupported\">\n      <summary>\n        <para>Can this shader run on the end-users graphics card? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Shader.maximumLOD\">\n      <summary>\n        <para>Shader LOD level for this shader.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Shader.renderQueue\">\n      <summary>\n        <para>Render queue of this shader. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Shader.DisableKeyword(System.String)\">\n      <summary>\n        <para>Unset a global shader keyword.</para>\n      </summary>\n      <param name=\"keyword\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.EnableKeyword(System.String)\">\n      <summary>\n        <para>Set a global shader keyword.</para>\n      </summary>\n      <param name=\"keyword\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.Find(System.String)\">\n      <summary>\n        <para>Finds a shader with the given name.</para>\n      </summary>\n      <param name=\"name\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalColor(System.String)\">\n      <summary>\n        <para>Gets a global color property for all shaders previously set using SetGlobalColor.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalColor(System.Int32)\">\n      <summary>\n        <para>Gets a global color property for all shaders previously set using SetGlobalColor.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalFloat(System.String)\">\n      <summary>\n        <para>Gets a global float property for all shaders previously set using SetGlobalFloat.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalFloat(System.Int32)\">\n      <summary>\n        <para>Gets a global float property for all shaders previously set using SetGlobalFloat.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalFloatArray(System.String)\">\n      <summary>\n        <para>Gets a global float array for all shaders previously set using SetGlobalFloatArray.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalFloatArray(System.Int32)\">\n      <summary>\n        <para>Gets a global float array for all shaders previously set using SetGlobalFloatArray.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalFloatArray(System.String,System.Collections.Generic.List`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Fetches a global float array into a list.</para>\n      </summary>\n      <param name=\"values\">The list to hold the returned array.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalFloatArray(System.Int32,System.Collections.Generic.List`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Fetches a global float array into a list.</para>\n      </summary>\n      <param name=\"values\">The list to hold the returned array.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalInt(System.String)\">\n      <summary>\n        <para>Gets a global int property for all shaders previously set using SetGlobalInt.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalInt(System.Int32)\">\n      <summary>\n        <para>Gets a global int property for all shaders previously set using SetGlobalInt.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalMatrix(System.String)\">\n      <summary>\n        <para>Gets a global matrix property for all shaders previously set using SetGlobalMatrix.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalMatrix(System.Int32)\">\n      <summary>\n        <para>Gets a global matrix property for all shaders previously set using SetGlobalMatrix.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalMatrixArray(System.String)\">\n      <summary>\n        <para>Gets a global matrix array for all shaders previously set using SetGlobalMatrixArray.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalMatrixArray(System.Int32)\">\n      <summary>\n        <para>Gets a global matrix array for all shaders previously set using SetGlobalMatrixArray.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalMatrixArray(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Matrix4x4&gt;)\">\n      <summary>\n        <para>Fetches a global matrix array into a list.</para>\n      </summary>\n      <param name=\"values\">The list to hold the returned array.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalMatrixArray(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Matrix4x4&gt;)\">\n      <summary>\n        <para>Fetches a global matrix array into a list.</para>\n      </summary>\n      <param name=\"values\">The list to hold the returned array.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalTexture(System.String)\">\n      <summary>\n        <para>Gets a global texture property for all shaders previously set using SetGlobalTexture.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalTexture(System.Int32)\">\n      <summary>\n        <para>Gets a global texture property for all shaders previously set using SetGlobalTexture.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalVector(System.String)\">\n      <summary>\n        <para>Gets a global vector property for all shaders previously set using SetGlobalVector.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalVector(System.Int32)\">\n      <summary>\n        <para>Gets a global vector property for all shaders previously set using SetGlobalVector.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalVectorArray(System.String)\">\n      <summary>\n        <para>Gets a global vector array for all shaders previously set using SetGlobalVectorArray.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalVectorArray(System.Int32)\">\n      <summary>\n        <para>Gets a global vector array for all shaders previously set using SetGlobalVectorArray.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalVectorArray(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Fetches a global vector array into a list.</para>\n      </summary>\n      <param name=\"values\">The list to hold the returned array.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.GetGlobalVectorArray(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Fetches a global vector array into a list.</para>\n      </summary>\n      <param name=\"values\">The list to hold the returned array.</param>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.IsKeywordEnabled(System.String)\">\n      <summary>\n        <para>Is global shader keyword enabled?</para>\n      </summary>\n      <param name=\"keyword\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.PropertyToID(System.String)\">\n      <summary>\n        <para>Gets unique identifier for a shader property name.</para>\n      </summary>\n      <param name=\"name\">Shader property name.</param>\n      <returns>\n        <para>Unique integer for the name.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalBuffer(System.String,UnityEngine.ComputeBuffer)\">\n      <summary>\n        <para>Sets a global compute buffer property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalBuffer(System.Int32,UnityEngine.ComputeBuffer)\">\n      <summary>\n        <para>Sets a global compute buffer property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalColor(System.String,UnityEngine.Color)\">\n      <summary>\n        <para>Sets a global color property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalColor(System.Int32,UnityEngine.Color)\">\n      <summary>\n        <para>Sets a global color property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalFloat(System.String,System.Single)\">\n      <summary>\n        <para>Sets a global float property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalFloat(System.Int32,System.Single)\">\n      <summary>\n        <para>Sets a global float property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalFloatArray(System.String,System.Single[])\">\n      <summary>\n        <para>Sets a global float array property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalFloatArray(System.Int32,System.Single[])\">\n      <summary>\n        <para>Sets a global float array property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalFloatArray(System.String,System.Collections.Generic.List`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Sets a global float array property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalFloatArray(System.Int32,System.Collections.Generic.List`1&lt;System.Single&gt;)\">\n      <summary>\n        <para>Sets a global float array property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalInt(System.String,System.Int32)\">\n      <summary>\n        <para>Sets a global int property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalInt(System.Int32,System.Int32)\">\n      <summary>\n        <para>Sets a global int property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalMatrix(System.String,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Sets a global matrix property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalMatrix(System.Int32,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Sets a global matrix property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalMatrixArray(System.String,UnityEngine.Matrix4x4[])\">\n      <summary>\n        <para>Sets a global matrix array property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalMatrixArray(System.Int32,UnityEngine.Matrix4x4[])\">\n      <summary>\n        <para>Sets a global matrix array property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalMatrixArray(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Matrix4x4&gt;)\">\n      <summary>\n        <para>Sets a global matrix array property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalMatrixArray(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Matrix4x4&gt;)\">\n      <summary>\n        <para>Sets a global matrix array property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalTexture(System.String,UnityEngine.Texture)\">\n      <summary>\n        <para>Sets a global texture property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalTexture(System.Int32,UnityEngine.Texture)\">\n      <summary>\n        <para>Sets a global texture property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalVector(System.String,UnityEngine.Vector4)\">\n      <summary>\n        <para>Sets a global vector property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalVector(System.Int32,UnityEngine.Vector4)\">\n      <summary>\n        <para>Sets a global vector property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalVectorArray(System.String,UnityEngine.Vector4[])\">\n      <summary>\n        <para>Sets a global vector array property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalVectorArray(System.Int32,UnityEngine.Vector4[])\">\n      <summary>\n        <para>Sets a global vector array property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalVectorArray(System.String,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Sets a global vector array property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.SetGlobalVectorArray(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Vector4&gt;)\">\n      <summary>\n        <para>Sets a global vector array property for all shaders.</para>\n      </summary>\n      <param name=\"nameID\">The name ID of the property retrieved by Shader.PropertyToID.</param>\n      <param name=\"name\">The name of the property.</param>\n      <param name=\"values\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Shader.WarmupAllShaders\">\n      <summary>\n        <para>Fully load all shaders to prevent future performance hiccups.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ShaderVariantCollection\">\n      <summary>\n        <para>ShaderVariantCollection records which shader variants are actually used in each shader.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ShaderVariantCollection.isWarmedUp\">\n      <summary>\n        <para>Is this ShaderVariantCollection already warmed up? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ShaderVariantCollection.shaderCount\">\n      <summary>\n        <para>Number of shaders in this collection (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.ShaderVariantCollection.variantCount\">\n      <summary>\n        <para>Number of total varians in this collection (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ShaderVariantCollection.Add(UnityEngine.ShaderVariantCollection/ShaderVariant)\">\n      <summary>\n        <para>Adds a new shader variant to the collection.</para>\n      </summary>\n      <param name=\"variant\">Shader variant to add.</param>\n      <returns>\n        <para>False if already in the collection.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ShaderVariantCollection.Clear\">\n      <summary>\n        <para>Remove all shader variants from the collection.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ShaderVariantCollection.Contains(UnityEngine.ShaderVariantCollection/ShaderVariant)\">\n      <summary>\n        <para>Checks if a shader variant is in the collection.</para>\n      </summary>\n      <param name=\"variant\">Shader variant to check.</param>\n      <returns>\n        <para>True if the variant is in the collection.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.ShaderVariantCollection.#ctor\">\n      <summary>\n        <para>Create a new empty shader variant collection.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ShaderVariantCollection.Remove(UnityEngine.ShaderVariantCollection/ShaderVariant)\">\n      <summary>\n        <para>Adds shader variant from the collection.</para>\n      </summary>\n      <param name=\"variant\">Shader variant to add.</param>\n      <returns>\n        <para>False if was not in the collection.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.ShaderVariantCollection.ShaderVariant\">\n      <summary>\n        <para>Identifies a specific variant of a shader.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ShaderVariantCollection.ShaderVariant.keywords\">\n      <summary>\n        <para>Array of shader keywords to use in this variant.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ShaderVariantCollection.ShaderVariant.passType\">\n      <summary>\n        <para>Pass type to use in this variant.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ShaderVariantCollection.ShaderVariant.shader\">\n      <summary>\n        <para>Shader to use in this variant.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.ShaderVariantCollection.ShaderVariant.#ctor(UnityEngine.Shader,UnityEngine.Rendering.PassType,System.String[])\">\n      <summary>\n        <para>Creates a ShaderVariant structure.</para>\n      </summary>\n      <param name=\"shader\"></param>\n      <param name=\"passType\"></param>\n      <param name=\"keywords\"></param>\n    </member>\n    <member name=\"M:UnityEngine.ShaderVariantCollection.WarmUp\">\n      <summary>\n        <para>Fully load shaders in ShaderVariantCollection.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ShadowmaskMode\">\n      <summary>\n        <para>The rendering mode of Shadowmask.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ShadowmaskMode.DistanceShadowmask\">\n      <summary>\n        <para>Static shadow casters will be rendered into realtime shadow maps. Shadowmasks and occlusion from Light Probes will only be used past the realtime shadow distance.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ShadowmaskMode.Shadowmask\">\n      <summary>\n        <para>Static shadow casters won't be rendered into realtime shadow maps. All shadows from static casters are handled via Shadowmasks and occlusion from Light Probes.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ShadowProjection\">\n      <summary>\n        <para>Shadow projection type for.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ShadowProjection.CloseFit\">\n      <summary>\n        <para>Close fit shadow maps with linear fadeout.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ShadowProjection.StableFit\">\n      <summary>\n        <para>Stable shadow maps with spherical fadeout.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ShadowQuality\">\n      <summary>\n        <para>Determines which type of shadows should be used.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ShadowQuality.All\">\n      <summary>\n        <para>Hard and Soft Shadows.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ShadowQuality.Disable\">\n      <summary>\n        <para>Disable Shadows.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ShadowQuality.HardOnly\">\n      <summary>\n        <para>Hard Shadows Only.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ShadowResolution\">\n      <summary>\n        <para>Default shadow resolution.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ShadowResolution.High\">\n      <summary>\n        <para>High shadow map resolution.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ShadowResolution.Low\">\n      <summary>\n        <para>Low shadow map resolution.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ShadowResolution.Medium\">\n      <summary>\n        <para>Medium shadow map resolution.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ShadowResolution.VeryHigh\">\n      <summary>\n        <para>Very high shadow map resolution.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SharedBetweenAnimatorsAttribute\">\n      <summary>\n        <para>SharedBetweenAnimatorsAttribute is an attribute that specify that this StateMachineBehaviour should be instantiate only once and shared among all Animator instance. This attribute reduce the memory footprint for each controller instance.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SkeletonBone\">\n      <summary>\n        <para>Details of the Transform name mapped to a model's skeleton bone and its default position and rotation in the T-pose.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SkeletonBone.name\">\n      <summary>\n        <para>The name of the Transform mapped to the bone.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SkeletonBone.position\">\n      <summary>\n        <para>The T-pose position of the bone in local space.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SkeletonBone.rotation\">\n      <summary>\n        <para>The T-pose rotation of the bone in local space.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SkeletonBone.scale\">\n      <summary>\n        <para>The T-pose scaling of the bone in local space.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SkinnedMeshRenderer\">\n      <summary>\n        <para>The Skinned Mesh filter.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SkinnedMeshRenderer.bones\">\n      <summary>\n        <para>The bones used to skin the mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SkinnedMeshRenderer.localBounds\">\n      <summary>\n        <para>AABB of this Skinned Mesh in its local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SkinnedMeshRenderer.quality\">\n      <summary>\n        <para>The maximum number of bones affecting a single vertex.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SkinnedMeshRenderer.sharedMesh\">\n      <summary>\n        <para>The mesh used for skinning.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SkinnedMeshRenderer.skinnedMotionVectors\">\n      <summary>\n        <para>Specifies whether skinned motion vectors should be used for this renderer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SkinnedMeshRenderer.updateWhenOffscreen\">\n      <summary>\n        <para>If enabled, the Skinned Mesh will be updated when offscreen. If disabled, this also disables updating animations.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.SkinnedMeshRenderer.BakeMesh(UnityEngine.Mesh)\">\n      <summary>\n        <para>Creates a snapshot of SkinnedMeshRenderer and stores it in mesh.</para>\n      </summary>\n      <param name=\"mesh\">A static mesh that will receive the snapshot of the skinned mesh.</param>\n    </member>\n    <member name=\"M:UnityEngine.SkinnedMeshRenderer.GetBlendShapeWeight(System.Int32)\">\n      <summary>\n        <para>Returns weight of BlendShape on this renderer.</para>\n      </summary>\n      <param name=\"index\"></param>\n    </member>\n    <member name=\"M:UnityEngine.SkinnedMeshRenderer.SetBlendShapeWeight(System.Int32,System.Single)\">\n      <summary>\n        <para>Sets the weight in percent of a BlendShape on this Renderer.</para>\n      </summary>\n      <param name=\"index\">The index of the BlendShape to modify.</param>\n      <param name=\"value\">The weight in percent for this BlendShape.</param>\n    </member>\n    <member name=\"T:UnityEngine.SkinQuality\">\n      <summary>\n        <para>The maximum number of bones affecting a single vertex.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SkinQuality.Auto\">\n      <summary>\n        <para>Chooses the number of bones from the number current QualitySettings. (Default)</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SkinQuality.Bone1\">\n      <summary>\n        <para>Use only 1 bone to deform a single vertex. (The most important bone will be used).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SkinQuality.Bone2\">\n      <summary>\n        <para>Use 2 bones to deform a single vertex. (The most important bones will be used).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SkinQuality.Bone4\">\n      <summary>\n        <para>Use 4 bones to deform a single vertex.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Skybox\">\n      <summary>\n        <para>A script interface for the.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Skybox.material\">\n      <summary>\n        <para>The material used by the skybox.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SleepTimeout\">\n      <summary>\n        <para>Constants for special values of Screen.sleepTimeout.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SleepTimeout.NeverSleep\">\n      <summary>\n        <para>Prevent screen dimming.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SleepTimeout.SystemSetting\">\n      <summary>\n        <para>Set the sleep timeout to whatever the user has specified in the system settings.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SliderJoint2D\">\n      <summary>\n        <para>Joint that restricts the motion of a Rigidbody2D object to a single line.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SliderJoint2D.angle\">\n      <summary>\n        <para>The angle of the line in space (in degrees).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SliderJoint2D.autoConfigureAngle\">\n      <summary>\n        <para>Should the angle be calculated automatically?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SliderJoint2D.jointSpeed\">\n      <summary>\n        <para>The current joint speed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SliderJoint2D.jointTranslation\">\n      <summary>\n        <para>The current joint translation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SliderJoint2D.limits\">\n      <summary>\n        <para>Restrictions on how far the joint can slide in each direction along the line.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SliderJoint2D.limitState\">\n      <summary>\n        <para>Gets the state of the joint limit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SliderJoint2D.motor\">\n      <summary>\n        <para>Parameters for a motor force that is applied automatically to the Rigibody2D along the line.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SliderJoint2D.referenceAngle\">\n      <summary>\n        <para>The angle (in degrees) referenced between the two bodies used as the constraint for the joint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SliderJoint2D.useLimits\">\n      <summary>\n        <para>Should motion limits be used?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SliderJoint2D.useMotor\">\n      <summary>\n        <para>Should a motor force be applied automatically to the Rigidbody2D?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.SliderJoint2D.GetMotorForce(System.Single)\">\n      <summary>\n        <para>Gets the motor force of the joint given the specified timestep.</para>\n      </summary>\n      <param name=\"timeStep\">The time to calculate the motor force for.</param>\n    </member>\n    <member name=\"T:UnityEngine.Social\">\n      <summary>\n        <para>Generic access to the Social API.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Social.localUser\">\n      <summary>\n        <para>The local user (potentially not logged in).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Social.Active\">\n      <summary>\n        <para>This is the currently active social platform. </para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Social.CreateAchievement\">\n      <summary>\n        <para>Create an IAchievement instance.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Social.CreateLeaderboard\">\n      <summary>\n        <para>Create an ILeaderboard instance.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Social.LoadAchievementDescriptions(System.Action`1&lt;UnityEngine.SocialPlatforms.IAchievementDescription[]&gt;)\">\n      <summary>\n        <para>Loads the achievement descriptions accociated with this application.</para>\n      </summary>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Social.LoadAchievements(System.Action`1&lt;UnityEngine.SocialPlatforms.IAchievement[]&gt;)\">\n      <summary>\n        <para>Load the achievements the logged in user has already achieved or reported progress on.</para>\n      </summary>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Social.LoadScores(System.String,System.Action`1&lt;UnityEngine.SocialPlatforms.IScore[]&gt;)\">\n      <summary>\n        <para>Load a default set of scores from the given leaderboard.</para>\n      </summary>\n      <param name=\"leaderboardID\"></param>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Social.LoadUsers(System.String[],System.Action`1&lt;UnityEngine.SocialPlatforms.IUserProfile[]&gt;)\">\n      <summary>\n        <para>Load the user profiles accociated with the given array of user IDs.</para>\n      </summary>\n      <param name=\"userIDs\"></param>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Social.ReportProgress(System.String,System.Double,System.Action`1&lt;System.Boolean&gt;)\">\n      <summary>\n        <para>Reports the progress of an achievement.</para>\n      </summary>\n      <param name=\"achievementID\"></param>\n      <param name=\"progress\"></param>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Social.ReportScore(System.Int64,System.String,System.Action`1&lt;System.Boolean&gt;)\">\n      <summary>\n        <para>Report a score to a specific leaderboard.</para>\n      </summary>\n      <param name=\"score\"></param>\n      <param name=\"board\"></param>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Social.ShowAchievementsUI\">\n      <summary>\n        <para>Show a default/system view of the games achievements.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Social.ShowLeaderboardUI\">\n      <summary>\n        <para>Show a default/system view of the games leaderboards.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SocialPlatforms.GameCenter.GameCenterPlatform\">\n      <summary>\n        <para>iOS GameCenter implementation for network services.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.GameCenter.GameCenterPlatform.ResetAllAchievements(System.Action`1&lt;System.Boolean&gt;)\">\n      <summary>\n        <para>Reset all the achievements for the local user.</para>\n      </summary>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.GameCenter.GameCenterPlatform.ShowDefaultAchievementCompletionBanner(System.Boolean)\">\n      <summary>\n        <para>Show the default iOS banner when achievements are completed.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.GameCenter.GameCenterPlatform.ShowLeaderboardUI(System.String,UnityEngine.SocialPlatforms.TimeScope)\">\n      <summary>\n        <para>Show the leaderboard UI with a specific leaderboard shown initially with a specific time scope selected.</para>\n      </summary>\n      <param name=\"leaderboardID\"></param>\n      <param name=\"timeScope\"></param>\n    </member>\n    <member name=\"?:UnityEngine.SocialPlatforms.IAchievement\">\n      <summary>\n        <para>Information for a user's achievement.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IAchievement.completed\">\n      <summary>\n        <para>Set to true when percentCompleted is 100.0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IAchievement.hidden\">\n      <summary>\n        <para>This achievement is currently hidden from the user.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IAchievement.id\">\n      <summary>\n        <para>The unique identifier of this achievement.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IAchievement.lastReportedDate\">\n      <summary>\n        <para>Set by server when percentCompleted is updated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IAchievement.percentCompleted\">\n      <summary>\n        <para>Progress for this achievement.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.IAchievement.ReportProgress(System.Action`1&lt;System.Boolean&gt;)\">\n      <summary>\n        <para>Send notification about progress on this achievement.</para>\n      </summary>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"?:UnityEngine.SocialPlatforms.IAchievementDescription\">\n      <summary>\n        <para>Static data describing an achievement.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IAchievementDescription.achievedDescription\">\n      <summary>\n        <para>Description when the achivement is completed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IAchievementDescription.hidden\">\n      <summary>\n        <para>Hidden achievement are not shown in the list until the percentCompleted has been touched (even if it's 0.0).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IAchievementDescription.id\">\n      <summary>\n        <para>Unique identifier for this achievement description.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IAchievementDescription.image\">\n      <summary>\n        <para>Image representation of the achievement.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IAchievementDescription.points\">\n      <summary>\n        <para>Point value of this achievement.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IAchievementDescription.title\">\n      <summary>\n        <para>Human readable title.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IAchievementDescription.unachievedDescription\">\n      <summary>\n        <para>Description when the achivement has not been completed.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.SocialPlatforms.ILeaderboard\">\n      <summary>\n        <para>The leaderboard contains the scores of all players for a particular game.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.ILeaderboard.id\">\n      <summary>\n        <para>Unique identifier for this leaderboard.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.ILeaderboard.loading\">\n      <summary>\n        <para>The leaderboad is in the process of loading scores.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.ILeaderboard.localUserScore\">\n      <summary>\n        <para>The leaderboard score of the logged in user.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.ILeaderboard.maxRange\">\n      <summary>\n        <para>The total amount of scores the leaderboard contains.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.ILeaderboard.range\">\n      <summary>\n        <para>The rank range this leaderboard returns.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.ILeaderboard.scores\">\n      <summary>\n        <para>The leaderboard scores returned by a query.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.ILeaderboard.timeScope\">\n      <summary>\n        <para>The time period/scope searched by this leaderboard.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.ILeaderboard.title\">\n      <summary>\n        <para>The human readable title of this leaderboard.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.ILeaderboard.userScope\">\n      <summary>\n        <para>The users scope searched by this leaderboard.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.ILeaderboard.LoadScores(System.Action`1&lt;System.Boolean&gt;)\">\n      <summary>\n        <para>Load scores according to the filters set on this leaderboard.</para>\n      </summary>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.ILeaderboard.SetUserFilter(System.String[])\">\n      <summary>\n        <para>Only search for these user IDs.</para>\n      </summary>\n      <param name=\"userIDs\">List of user ids.</param>\n    </member>\n    <member name=\"?:UnityEngine.SocialPlatforms.ILocalUser\">\n      <summary>\n        <para>Represents the local or currently logged in user.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.ILocalUser.authenticated\">\n      <summary>\n        <para>Checks if the current user has been authenticated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.ILocalUser.friends\">\n      <summary>\n        <para>The users friends list.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.ILocalUser.underage\">\n      <summary>\n        <para>Is the user underage?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.ILocalUser.Authenticate(System.Action`1&lt;System.Boolean&gt;)\">\n      <summary>\n        <para>Authenticate the local user to the current active Social API implementation and fetch his profile data.</para>\n      </summary>\n      <param name=\"callback\">Callback that is called whenever the authentication operation is finished. The first parameter is a Boolean identifying whether the authentication operation was successful. The optional second argument contains a string identifying any errors (if available) if the operation was unsuccessful.</param>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.ILocalUser.Authenticate(System.Action`2&lt;System.Boolean,System.String&gt;)\">\n      <summary>\n        <para>Authenticate the local user to the current active Social API implementation and fetch his profile data.</para>\n      </summary>\n      <param name=\"callback\">Callback that is called whenever the authentication operation is finished. The first parameter is a Boolean identifying whether the authentication operation was successful. The optional second argument contains a string identifying any errors (if available) if the operation was unsuccessful.</param>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.ILocalUser.LoadFriends(System.Action`1&lt;System.Boolean&gt;)\">\n      <summary>\n        <para>Fetches the friends list of the logged in user. The friends list on the ISocialPlatform.localUser|Social.localUser instance is populated if this call succeeds.</para>\n      </summary>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"?:UnityEngine.SocialPlatforms.IScore\">\n      <summary>\n        <para>A game score.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IScore.date\">\n      <summary>\n        <para>The date the score was achieved.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IScore.formattedValue\">\n      <summary>\n        <para>The correctly formatted value of the score, like X points or X kills.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IScore.leaderboardID\">\n      <summary>\n        <para>The ID of the leaderboard this score belongs to.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IScore.rank\">\n      <summary>\n        <para>The rank or position of the score in the leaderboard. </para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IScore.userID\">\n      <summary>\n        <para>The user who owns this score.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IScore.value\">\n      <summary>\n        <para>The score value achieved.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.IScore.ReportScore(System.Action`1&lt;System.Boolean&gt;)\">\n      <summary>\n        <para>Report this score instance.</para>\n      </summary>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"?:UnityEngine.SocialPlatforms.ISocialPlatform\">\n      <summary>\n        <para>The generic Social API interface which implementations must inherit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.ISocialPlatform.localUser\">\n      <summary>\n        <para>See Social.localUser.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.ISocialPlatform.CreateAchievement\">\n      <summary>\n        <para>See Social.CreateAchievement..</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.ISocialPlatform.CreateLeaderboard\">\n      <summary>\n        <para>See Social.CreateLeaderboard.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.ISocialPlatform.LoadAchievementDescriptions(System.Action`1&lt;UnityEngine.SocialPlatforms.IAchievementDescription[]&gt;)\">\n      <summary>\n        <para>See Social.LoadAchievementDescriptions.</para>\n      </summary>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.ISocialPlatform.LoadAchievements(System.Action`1&lt;UnityEngine.SocialPlatforms.IAchievement[]&gt;)\">\n      <summary>\n        <para>See Social.LoadAchievements.</para>\n      </summary>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.ISocialPlatform.LoadScores(System.String,System.Action`1&lt;UnityEngine.SocialPlatforms.IScore[]&gt;)\">\n      <summary>\n        <para>See Social.LoadScores.</para>\n      </summary>\n      <param name=\"leaderboardID\"></param>\n      <param name=\"callback\"></param>\n      <param name=\"board\"></param>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.ISocialPlatform.LoadScores(UnityEngine.SocialPlatforms.ILeaderboard,System.Action`1&lt;System.Boolean&gt;)\">\n      <summary>\n        <para>See Social.LoadScores.</para>\n      </summary>\n      <param name=\"leaderboardID\"></param>\n      <param name=\"callback\"></param>\n      <param name=\"board\"></param>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.ISocialPlatform.LoadUsers(System.String[],System.Action`1&lt;UnityEngine.SocialPlatforms.IUserProfile[]&gt;)\">\n      <summary>\n        <para>See Social.LoadUsers.</para>\n      </summary>\n      <param name=\"userIDs\"></param>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.ISocialPlatform.ReportProgress(System.String,System.Double,System.Action`1&lt;System.Boolean&gt;)\">\n      <summary>\n        <para>See Social.ReportProgress.</para>\n      </summary>\n      <param name=\"achievementID\"></param>\n      <param name=\"progress\"></param>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.ISocialPlatform.ReportScore(System.Int64,System.String,System.Action`1&lt;System.Boolean&gt;)\">\n      <summary>\n        <para>See Social.ReportScore.</para>\n      </summary>\n      <param name=\"score\"></param>\n      <param name=\"board\"></param>\n      <param name=\"callback\"></param>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.ISocialPlatform.ShowAchievementsUI\">\n      <summary>\n        <para>See Social.ShowAchievementsUI.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.ISocialPlatform.ShowLeaderboardUI\">\n      <summary>\n        <para>See Social.ShowLeaderboardUI.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.SocialPlatforms.IUserProfile\">\n      <summary>\n        <para>Represents generic user instances, like friends of the local user.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IUserProfile.id\">\n      <summary>\n        <para>This users unique identifier.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IUserProfile.image\">\n      <summary>\n        <para>Avatar image of the user.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IUserProfile.isFriend\">\n      <summary>\n        <para>Is this user a friend of the current logged in user?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IUserProfile.state\">\n      <summary>\n        <para>Presence state of the user.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SocialPlatforms.IUserProfile.userName\">\n      <summary>\n        <para>This user's username or alias.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SocialPlatforms.Range\">\n      <summary>\n        <para>The score range a leaderboard query should include.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SocialPlatforms.Range.count\">\n      <summary>\n        <para>The total amount of scores retreived.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SocialPlatforms.Range.from\">\n      <summary>\n        <para>The rank of the first score which is returned.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.SocialPlatforms.Range.#ctor(System.Int32,System.Int32)\">\n      <summary>\n        <para>Constructor for a score range, the range starts from a specific value and contains a maxium score count.</para>\n      </summary>\n      <param name=\"fromValue\">The minimum allowed value.</param>\n      <param name=\"valueCount\">The number of possible values.</param>\n    </member>\n    <member name=\"T:UnityEngine.SocialPlatforms.TimeScope\">\n      <summary>\n        <para>The scope of time searched through when querying the leaderboard.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SocialPlatforms.UserScope\">\n      <summary>\n        <para>The scope of the users searched through when querying the leaderboard.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SocialPlatforms.UserState\">\n      <summary>\n        <para>User presence state.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SocialPlatforms.UserState.Offline\">\n      <summary>\n        <para>The user is offline.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SocialPlatforms.UserState.Online\">\n      <summary>\n        <para>The user is online.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SocialPlatforms.UserState.OnlineAndAway\">\n      <summary>\n        <para>The user is online but away from their computer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SocialPlatforms.UserState.OnlineAndBusy\">\n      <summary>\n        <para>The user is online but set their status to busy.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SocialPlatforms.UserState.Playing\">\n      <summary>\n        <para>The user is playing a game.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SoftJointLimit\">\n      <summary>\n        <para>The limits defined by the CharacterJoint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SoftJointLimit.bounciness\">\n      <summary>\n        <para>When the joint hits the limit, it can be made to bounce off it.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SoftJointLimit.contactDistance\">\n      <summary>\n        <para>Determines how far ahead in space the solver can \"see\" the joint limit.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SoftJointLimit.damper\">\n      <summary>\n        <para>If spring is greater than zero, the limit is soft.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SoftJointLimit.limit\">\n      <summary>\n        <para>The limit position/angle of the joint (in degrees).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SoftJointLimit.spring\">\n      <summary>\n        <para>If greater than zero, the limit is soft. The spring will pull the joint back.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SoftJointLimitSpring\">\n      <summary>\n        <para>The configuration of the spring attached to the joint's limits: linear and angular. Used by CharacterJoint and ConfigurableJoint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SoftJointLimitSpring.damper\">\n      <summary>\n        <para>The damping of the spring limit. In effect when the stiffness of the sprint limit is not zero.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SoftJointLimitSpring.spring\">\n      <summary>\n        <para>The stiffness of the spring limit. When stiffness is zero the limit is hard, otherwise soft.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SortingLayer\">\n      <summary>\n        <para>SortingLayer allows you to set the render order of multiple sprites easily. There is always a default SortingLayer named \"Default\" which all sprites are added to initially. Added more SortingLayers to easily control the order of rendering of groups of sprites. Layers can be ordered before or after the default layer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SortingLayer.id\">\n      <summary>\n        <para>This is the unique id assigned to the layer. It is not an ordered running value and it should not be used to compare with other layers to determine the sorting order.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SortingLayer.layers\">\n      <summary>\n        <para>Returns all the layers defined in this project.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SortingLayer.name\">\n      <summary>\n        <para>Returns the name of the layer as defined in the TagManager.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SortingLayer.value\">\n      <summary>\n        <para>This is the relative value that indicates the sort order of this layer relative to the other layers.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.SortingLayer.GetLayerValueFromID(System.Int32)\">\n      <summary>\n        <para>Returns the final sorting layer value. To determine the sorting order between the various sorting layers, use this method to retrieve the final sorting value and use CompareTo to determine the order.</para>\n      </summary>\n      <param name=\"id\">The unique value of the sorting layer as returned by any renderer's sortingLayerID property.</param>\n      <returns>\n        <para>The final sorting value of the layer relative to other layers.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SortingLayer.GetLayerValueFromName(System.String)\">\n      <summary>\n        <para>Returns the final sorting layer value. See Also: GetLayerValueFromID.</para>\n      </summary>\n      <param name=\"name\">The unique value of the sorting layer as returned by any renderer's sortingLayerID property.</param>\n      <returns>\n        <para>The final sorting value of the layer relative to other layers.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SortingLayer.IDToName(System.Int32)\">\n      <summary>\n        <para>Returns the unique id of the layer. Will return \"&lt;unknown layer&gt;\" if an invalid id is given.</para>\n      </summary>\n      <param name=\"id\">The unique id of the layer.</param>\n      <returns>\n        <para>The name of the layer with id or \"&lt;unknown layer&gt;\" for invalid id.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SortingLayer.IsValid(System.Int32)\">\n      <summary>\n        <para>Returns true if the id provided is a valid layer id.</para>\n      </summary>\n      <param name=\"id\">The unique id of a layer.</param>\n      <returns>\n        <para>True if the id provided is valid and assigned to a layer.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SortingLayer.NameToID(System.String)\">\n      <summary>\n        <para>Returns the id given the name. Will return 0 if an invalid name was given.</para>\n      </summary>\n      <param name=\"name\">The name of the layer.</param>\n      <returns>\n        <para>The unique id of the layer with name.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Space\">\n      <summary>\n        <para>The coordinate space in which to operate.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Space.Self\">\n      <summary>\n        <para>Applies transformation relative to the local coordinate system.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Space.World\">\n      <summary>\n        <para>Applies transformation relative to the world coordinate system.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SpaceAttribute\">\n      <summary>\n        <para>Use this PropertyAttribute to add some spacing in the Inspector.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpaceAttribute.height\">\n      <summary>\n        <para>The spacing in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.SpaceAttribute.#ctor(System.Single)\">\n      <summary>\n        <para>Use this DecoratorDrawer to add some spacing in the Inspector.</para>\n      </summary>\n      <param name=\"height\">The spacing in pixels.</param>\n    </member>\n    <member name=\"T:UnityEngine.SparseTexture\">\n      <summary>\n        <para>Class for handling Sparse Textures.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SparseTexture.isCreated\">\n      <summary>\n        <para>Is the sparse texture actually created? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SparseTexture.tileHeight\">\n      <summary>\n        <para>Get sparse texture tile height (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SparseTexture.tileWidth\">\n      <summary>\n        <para>Get sparse texture tile width (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.SparseTexture.#ctor(System.Int32,System.Int32,UnityEngine.TextureFormat,System.Int32)\">\n      <summary>\n        <para>Create a sparse texture.</para>\n      </summary>\n      <param name=\"width\">Texture width in pixels.</param>\n      <param name=\"height\">Texture height in pixels.</param>\n      <param name=\"format\">Texture format.</param>\n      <param name=\"mipCount\">Mipmap count. Pass -1 to create full mipmap chain.</param>\n      <param name=\"linear\">Whether texture data will be in linear or sRGB color space (default is sRGB).</param>\n    </member>\n    <member name=\"M:UnityEngine.SparseTexture.#ctor(System.Int32,System.Int32,UnityEngine.TextureFormat,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Create a sparse texture.</para>\n      </summary>\n      <param name=\"width\">Texture width in pixels.</param>\n      <param name=\"height\">Texture height in pixels.</param>\n      <param name=\"format\">Texture format.</param>\n      <param name=\"mipCount\">Mipmap count. Pass -1 to create full mipmap chain.</param>\n      <param name=\"linear\">Whether texture data will be in linear or sRGB color space (default is sRGB).</param>\n    </member>\n    <member name=\"M:UnityEngine.SparseTexture.UnloadTile(System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Unload sparse texture tile.</para>\n      </summary>\n      <param name=\"tileX\">Tile X coordinate.</param>\n      <param name=\"tileY\">Tile Y coordinate.</param>\n      <param name=\"miplevel\">Mipmap level of the texture.</param>\n    </member>\n    <member name=\"M:UnityEngine.SparseTexture.UpdateTile(System.Int32,System.Int32,System.Int32,UnityEngine.Color32[])\">\n      <summary>\n        <para>Update sparse texture tile with color values.</para>\n      </summary>\n      <param name=\"tileX\">Tile X coordinate.</param>\n      <param name=\"tileY\">Tile Y coordinate.</param>\n      <param name=\"miplevel\">Mipmap level of the texture.</param>\n      <param name=\"data\">Tile color data.</param>\n    </member>\n    <member name=\"M:UnityEngine.SparseTexture.UpdateTileRaw(System.Int32,System.Int32,System.Int32,System.Byte[])\">\n      <summary>\n        <para>Update sparse texture tile with raw pixel values.</para>\n      </summary>\n      <param name=\"tileX\">Tile X coordinate.</param>\n      <param name=\"tileY\">Tile Y coordinate.</param>\n      <param name=\"miplevel\">Mipmap level of the texture.</param>\n      <param name=\"data\">Tile raw pixel data.</param>\n    </member>\n    <member name=\"T:UnityEngine.SphereCollider\">\n      <summary>\n        <para>A sphere-shaped primitive collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SphereCollider.center\">\n      <summary>\n        <para>The center of the sphere in the object's local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SphereCollider.radius\">\n      <summary>\n        <para>The radius of the sphere measured in the object's local space.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SplatPrototype\">\n      <summary>\n        <para>A Splat prototype is just a texture that is used by the TerrainData.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SplatPrototype.metallic\">\n      <summary>\n        <para>The metallic value of the splat layer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SplatPrototype.normalMap\">\n      <summary>\n        <para>Normal map of the splat applied to the Terrain.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SplatPrototype.smoothness\">\n      <summary>\n        <para>The smoothness value of the splat layer when the main texture has no alpha channel.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SplatPrototype.texture\">\n      <summary>\n        <para>Texture of the splat applied to the Terrain.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SplatPrototype.tileOffset\">\n      <summary>\n        <para>Offset of the tile texture of the SplatPrototype.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SplatPrototype.tileSize\">\n      <summary>\n        <para>Size of the tile used in the texture of the SplatPrototype.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SpringJoint\">\n      <summary>\n        <para>The spring joint ties together 2 rigid bodies, spring forces will be automatically applied to keep the object at the given distance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpringJoint.damper\">\n      <summary>\n        <para>The damper force used to dampen the spring force.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpringJoint.maxDistance\">\n      <summary>\n        <para>The maximum distance between the bodies relative to their initial distance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpringJoint.minDistance\">\n      <summary>\n        <para>The minimum distance between the bodies relative to their initial distance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpringJoint.spring\">\n      <summary>\n        <para>The spring force used to keep the two objects together.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpringJoint.tolerance\">\n      <summary>\n        <para>The maximum allowed error between the current spring length and the length defined by minDistance and maxDistance.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SpringJoint2D\">\n      <summary>\n        <para>Joint that attempts to keep two Rigidbody2D objects a set distance apart by applying a force between them.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpringJoint2D.autoConfigureDistance\">\n      <summary>\n        <para>Should the distance be calculated automatically?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpringJoint2D.dampingRatio\">\n      <summary>\n        <para>The amount by which the spring force is reduced in proportion to the movement speed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpringJoint2D.distance\">\n      <summary>\n        <para>The distance the spring will try to keep between the two objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpringJoint2D.frequency\">\n      <summary>\n        <para>The frequency at which the spring oscillates around the distance distance between the objects.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Sprite\">\n      <summary>\n        <para>Represents a Sprite object for use in 2D gameplay.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Sprite.associatedAlphaSplitTexture\">\n      <summary>\n        <para>Returns the texture that contains the alpha channel from the source texture. Unity generates this texture under the hood for sprites that have alpha in the source, and need to be compressed using techniques like ETC1.\n\nReturns NULL if there is no associated alpha texture for the source sprite. This is the case if the sprite has not been setup to use ETC1 compression.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Sprite.border\">\n      <summary>\n        <para>Returns the border sizes of the sprite.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Sprite.bounds\">\n      <summary>\n        <para>Bounds of the Sprite, specified by its center and extents in world space units.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Sprite.packed\">\n      <summary>\n        <para>Returns true if this Sprite is packed in an atlas.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Sprite.packingMode\">\n      <summary>\n        <para>If Sprite is packed (see Sprite.packed), returns its SpritePackingMode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Sprite.packingRotation\">\n      <summary>\n        <para>If Sprite is packed (see Sprite.packed), returns its SpritePackingRotation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Sprite.pivot\">\n      <summary>\n        <para>Location of the Sprite's center point in the Rect on the original Texture, specified in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Sprite.pixelsPerUnit\">\n      <summary>\n        <para>The number of pixels in the sprite that correspond to one unit in world space. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Sprite.rect\">\n      <summary>\n        <para>Location of the Sprite on the original Texture, specified in pixels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Sprite.texture\">\n      <summary>\n        <para>Get the reference to the used texture. If packed this will point to the atlas, if not packed will point to the source sprite.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Sprite.textureRect\">\n      <summary>\n        <para>Get the rectangle this sprite uses on its texture. Raises an exception if this sprite is tightly packed in an atlas.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Sprite.textureRectOffset\">\n      <summary>\n        <para>Gets the offset of the rectangle this sprite uses on its texture to the original sprite bounds. If sprite mesh type is FullRect, offset is zero.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Sprite.triangles\">\n      <summary>\n        <para>Returns a copy of the array containing sprite mesh triangles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Sprite.uv\">\n      <summary>\n        <para>The base texture coordinates of the sprite mesh.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Sprite.vertices\">\n      <summary>\n        <para>Returns a copy of the array containing sprite mesh vertex positions.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Sprite.Create(UnityEngine.Texture2D,UnityEngine.Rect,UnityEngine.Vector2,System.Single,System.UInt32)\">\n      <summary>\n        <para>Create a new Sprite object.</para>\n      </summary>\n      <param name=\"texture\">Texture from which to obtain the sprite graphic.</param>\n      <param name=\"rect\">Rectangular section of the texture to use for the sprite.</param>\n      <param name=\"pivot\">Sprite's pivot point relative to its graphic rectangle.</param>\n      <param name=\"pixelsPerUnit\">The number of pixels in the sprite that correspond to one unit in world space.</param>\n      <param name=\"extrude\">Amount by which the sprite mesh should be expanded outwards.</param>\n      <param name=\"meshType\">Controls the type of mesh generated for the sprite.</param>\n      <param name=\"border\">The border sizes of the sprite (X=left, Y=bottom, Z=right, W=top).</param>\n      <param name=\"generateFallbackPhysicsShape\">Generates a default physics shape for the sprite.</param>\n    </member>\n    <member name=\"M:UnityEngine.Sprite.Create(UnityEngine.Texture2D,UnityEngine.Rect,UnityEngine.Vector2,System.Single,System.UInt32,UnityEngine.SpriteMeshType)\">\n      <summary>\n        <para>Create a new Sprite object.</para>\n      </summary>\n      <param name=\"texture\">Texture from which to obtain the sprite graphic.</param>\n      <param name=\"rect\">Rectangular section of the texture to use for the sprite.</param>\n      <param name=\"pivot\">Sprite's pivot point relative to its graphic rectangle.</param>\n      <param name=\"pixelsPerUnit\">The number of pixels in the sprite that correspond to one unit in world space.</param>\n      <param name=\"extrude\">Amount by which the sprite mesh should be expanded outwards.</param>\n      <param name=\"meshType\">Controls the type of mesh generated for the sprite.</param>\n      <param name=\"border\">The border sizes of the sprite (X=left, Y=bottom, Z=right, W=top).</param>\n      <param name=\"generateFallbackPhysicsShape\">Generates a default physics shape for the sprite.</param>\n    </member>\n    <member name=\"M:UnityEngine.Sprite.Create(UnityEngine.Texture2D,UnityEngine.Rect,UnityEngine.Vector2,System.Single,System.UInt32,UnityEngine.SpriteMeshType,UnityEngine.Vector4,System.Boolean)\">\n      <summary>\n        <para>Create a new Sprite object.</para>\n      </summary>\n      <param name=\"texture\">Texture from which to obtain the sprite graphic.</param>\n      <param name=\"rect\">Rectangular section of the texture to use for the sprite.</param>\n      <param name=\"pivot\">Sprite's pivot point relative to its graphic rectangle.</param>\n      <param name=\"pixelsPerUnit\">The number of pixels in the sprite that correspond to one unit in world space.</param>\n      <param name=\"extrude\">Amount by which the sprite mesh should be expanded outwards.</param>\n      <param name=\"meshType\">Controls the type of mesh generated for the sprite.</param>\n      <param name=\"border\">The border sizes of the sprite (X=left, Y=bottom, Z=right, W=top).</param>\n      <param name=\"generateFallbackPhysicsShape\">Generates a default physics shape for the sprite.</param>\n    </member>\n    <member name=\"M:UnityEngine.Sprite.Create(UnityEngine.Texture2D,UnityEngine.Rect,UnityEngine.Vector2,System.Single,System.UInt32,UnityEngine.SpriteMeshType,UnityEngine.Vector4)\">\n      <summary>\n        <para>Create a new Sprite object.</para>\n      </summary>\n      <param name=\"texture\">Texture from which to obtain the sprite graphic.</param>\n      <param name=\"rect\">Rectangular section of the texture to use for the sprite.</param>\n      <param name=\"pivot\">Sprite's pivot point relative to its graphic rectangle.</param>\n      <param name=\"pixelsPerUnit\">The number of pixels in the sprite that correspond to one unit in world space.</param>\n      <param name=\"extrude\">Amount by which the sprite mesh should be expanded outwards.</param>\n      <param name=\"meshType\">Controls the type of mesh generated for the sprite.</param>\n      <param name=\"border\">The border sizes of the sprite (X=left, Y=bottom, Z=right, W=top).</param>\n      <param name=\"generateFallbackPhysicsShape\">Generates a default physics shape for the sprite.</param>\n    </member>\n    <member name=\"M:UnityEngine.Sprite.Create(UnityEngine.Texture2D,UnityEngine.Rect,UnityEngine.Vector2)\">\n      <summary>\n        <para>Create a new Sprite object.</para>\n      </summary>\n      <param name=\"texture\">Texture from which to obtain the sprite graphic.</param>\n      <param name=\"rect\">Rectangular section of the texture to use for the sprite.</param>\n      <param name=\"pivot\">Sprite's pivot point relative to its graphic rectangle.</param>\n      <param name=\"pixelsPerUnit\">The number of pixels in the sprite that correspond to one unit in world space.</param>\n      <param name=\"extrude\">Amount by which the sprite mesh should be expanded outwards.</param>\n      <param name=\"meshType\">Controls the type of mesh generated for the sprite.</param>\n      <param name=\"border\">The border sizes of the sprite (X=left, Y=bottom, Z=right, W=top).</param>\n      <param name=\"generateFallbackPhysicsShape\">Generates a default physics shape for the sprite.</param>\n    </member>\n    <member name=\"M:UnityEngine.Sprite.Create(UnityEngine.Texture2D,UnityEngine.Rect,UnityEngine.Vector2,System.Single)\">\n      <summary>\n        <para>Create a new Sprite object.</para>\n      </summary>\n      <param name=\"texture\">Texture from which to obtain the sprite graphic.</param>\n      <param name=\"rect\">Rectangular section of the texture to use for the sprite.</param>\n      <param name=\"pivot\">Sprite's pivot point relative to its graphic rectangle.</param>\n      <param name=\"pixelsPerUnit\">The number of pixels in the sprite that correspond to one unit in world space.</param>\n      <param name=\"extrude\">Amount by which the sprite mesh should be expanded outwards.</param>\n      <param name=\"meshType\">Controls the type of mesh generated for the sprite.</param>\n      <param name=\"border\">The border sizes of the sprite (X=left, Y=bottom, Z=right, W=top).</param>\n      <param name=\"generateFallbackPhysicsShape\">Generates a default physics shape for the sprite.</param>\n    </member>\n    <member name=\"M:UnityEngine.Sprite.GetPhysicsShape(System.Int32,System.Collections.Generic.List`1&lt;UnityEngine.Vector2&gt;)\">\n      <summary>\n        <para>Gets a physics shape from the Sprite by its index.</para>\n      </summary>\n      <param name=\"shapeIdx\">The index of the physics shape to retrieve.</param>\n      <param name=\"physicsShape\">An ordered list of the points in the selected physics shape to store points in.</param>\n      <returns>\n        <para>The number of points stored in the given list.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Sprite.GetPhysicsShapeCount\">\n      <summary>\n        <para>The number of physics shapes for the Sprite.</para>\n      </summary>\n      <returns>\n        <para>The number of physics shapes for the Sprite.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Sprite.GetPhysicsShapePointCount(System.Int32)\">\n      <summary>\n        <para>The number of points in the selected physics shape for the Sprite.</para>\n      </summary>\n      <param name=\"shapeIdx\">The index of the physics shape to retrieve the number of points from.</param>\n      <returns>\n        <para>The number of points in the selected physics shape for the Sprite.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Sprite.OverrideGeometry(UnityEngine.Vector2[],System.UInt16[])\">\n      <summary>\n        <para>Sets up new Sprite geometry.</para>\n      </summary>\n      <param name=\"vertices\">Array of vertex positions in Sprite Rect space.</param>\n      <param name=\"triangles\">Array of sprite mesh triangle indices.</param>\n    </member>\n    <member name=\"M:UnityEngine.Sprite.OverridePhysicsShape(System.Collections.Generic.IList`1&lt;UnityEngine.Vector2[]&gt;)\">\n      <summary>\n        <para>Sets up a new Sprite physics shape.</para>\n      </summary>\n      <param name=\"physicsShapes\">A multidimensional list of points in Sprite.rect space denoting the physics shape outlines.</param>\n    </member>\n    <member name=\"T:UnityEngine.SpriteAlignment\">\n      <summary>\n        <para>How a Sprite's graphic rectangle is aligned with its pivot point.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteAlignment.BottomCenter\">\n      <summary>\n        <para>Pivot is at the center of the bottom edge of the graphic rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteAlignment.BottomLeft\">\n      <summary>\n        <para>Pivot is at the bottom left corner of the graphic rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteAlignment.BottomRight\">\n      <summary>\n        <para>Pivot is at the bottom right corner of the graphic rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteAlignment.Center\">\n      <summary>\n        <para>Pivot is at the center of the graphic rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteAlignment.Custom\">\n      <summary>\n        <para>Pivot is at a custom position within the graphic rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteAlignment.LeftCenter\">\n      <summary>\n        <para>Pivot is at the center of the left edge of the graphic rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteAlignment.RightCenter\">\n      <summary>\n        <para>Pivot is at the center of the right edge of the graphic rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteAlignment.TopCenter\">\n      <summary>\n        <para>Pivot is at the center of the top edge of the graphic rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteAlignment.TopLeft\">\n      <summary>\n        <para>Pivot is at the top left corner of the graphic rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteAlignment.TopRight\">\n      <summary>\n        <para>Pivot is at the top right corner of the graphic rectangle.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SpriteDrawMode\">\n      <summary>\n        <para>SpriteRenderer draw mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteDrawMode.Simple\">\n      <summary>\n        <para>Displays the full sprite.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteDrawMode.Sliced\">\n      <summary>\n        <para>The SpriteRenderer will render the sprite as a 9-slice image where the corners will remain constant and the other sections will scale.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteDrawMode.Tiled\">\n      <summary>\n        <para>The SpriteRenderer will render the sprite as a 9-slice image where the corners will remain constant and the other sections will tile.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SpriteMask\">\n      <summary>\n        <para>A component for masking Sprites and Particles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpriteMask.alphaCutoff\">\n      <summary>\n        <para>The minimum alpha value used by the mask to select the area of influence defined over the mask's sprite.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpriteMask.backSortingLayerID\">\n      <summary>\n        <para>Unique ID of the sorting layer defining the end of the custom range.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpriteMask.backSortingOrder\">\n      <summary>\n        <para>Order within the back sorting layer defining the end of the custom range.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpriteMask.frontSortingLayerID\">\n      <summary>\n        <para>Unique ID of the sorting layer defining the start of the custom range.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpriteMask.frontSortingOrder\">\n      <summary>\n        <para>Order within the front sorting layer defining the start of the custom range.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpriteMask.isCustomRangeActive\">\n      <summary>\n        <para>Mask sprites from front to back sorting values only.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpriteMask.sprite\">\n      <summary>\n        <para>The Sprite used to define the mask.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpriteMask.spriteSortPoint\">\n      <summary>\n        <para>Determines the position of the Sprite used for sorting the SpriteMask.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SpriteMaskInteraction\">\n      <summary>\n        <para>This enum controls the mode under which the sprite will interact with the masking system.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteMaskInteraction.None\">\n      <summary>\n        <para>The sprite will not interact with the masking system.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteMaskInteraction.VisibleInsideMask\">\n      <summary>\n        <para>The sprite will be visible only in areas where a mask is present.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteMaskInteraction.VisibleOutsideMask\">\n      <summary>\n        <para>The sprite will be visible only in areas where no mask is present.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SpriteMeshType\">\n      <summary>\n        <para>Defines the type of mesh generated for a sprite.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteMeshType.FullRect\">\n      <summary>\n        <para>Rectangle mesh equal to the user specified sprite size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteMeshType.Tight\">\n      <summary>\n        <para>Tight mesh based on pixel alpha values. As many excess pixels are cropped as possible.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SpritePackingMode\">\n      <summary>\n        <para>Sprite packing modes for the Sprite Packer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpritePackingMode.Rectangle\">\n      <summary>\n        <para>Alpha-cropped ractangle packing.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpritePackingMode.Tight\">\n      <summary>\n        <para>Tight mesh based packing.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SpritePackingRotation\">\n      <summary>\n        <para>Sprite rotation modes for the Sprite Packer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpritePackingRotation.Any\">\n      <summary>\n        <para>Any rotation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpritePackingRotation.FlipHorizontal\">\n      <summary>\n        <para>Sprite is flipped horizontally when packed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpritePackingRotation.FlipVertical\">\n      <summary>\n        <para>Sprite is flipped vertically when packed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpritePackingRotation.None\">\n      <summary>\n        <para>No rotation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpritePackingRotation.Rotate180\">\n      <summary>\n        <para>Sprite is rotated 180 degree when packed.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SpriteRenderer\">\n      <summary>\n        <para>Renders a Sprite for 2D graphics.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpriteRenderer.adaptiveModeThreshold\">\n      <summary>\n        <para>The current threshold for Sprite Renderer tiling.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpriteRenderer.color\">\n      <summary>\n        <para>Rendering color for the Sprite graphic.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpriteRenderer.drawMode\">\n      <summary>\n        <para>The current draw mode of the Sprite Renderer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpriteRenderer.flipX\">\n      <summary>\n        <para>Flips the sprite on the X axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpriteRenderer.flipY\">\n      <summary>\n        <para>Flips the sprite on the Y axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpriteRenderer.maskInteraction\">\n      <summary>\n        <para>Specifies how the sprite interacts with the masks.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpriteRenderer.size\">\n      <summary>\n        <para>Property to set/get the size to render when the SpriteRenderer.drawMode is set to SpriteDrawMode.NineSlice.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpriteRenderer.sprite\">\n      <summary>\n        <para>The Sprite to render.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpriteRenderer.spriteSortPoint\">\n      <summary>\n        <para>Determines the position of the Sprite used for sorting the SpriteRenderer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SpriteRenderer.tileMode\">\n      <summary>\n        <para>The current tile mode of the Sprite Renderer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Sprites.DataUtility\">\n      <summary>\n        <para>Helper utilities for accessing Sprite data.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Sprites.DataUtility.GetInnerUV(UnityEngine.Sprite)\">\n      <summary>\n        <para>Inner UV's of the Sprite.</para>\n      </summary>\n      <param name=\"sprite\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Sprites.DataUtility.GetMinSize(UnityEngine.Sprite)\">\n      <summary>\n        <para>Minimum width and height of the Sprite.</para>\n      </summary>\n      <param name=\"sprite\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Sprites.DataUtility.GetOuterUV(UnityEngine.Sprite)\">\n      <summary>\n        <para>Outer UV's of the Sprite.</para>\n      </summary>\n      <param name=\"sprite\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Sprites.DataUtility.GetPadding(UnityEngine.Sprite)\">\n      <summary>\n        <para>Return the padding on the sprite.</para>\n      </summary>\n      <param name=\"sprite\"></param>\n    </member>\n    <member name=\"T:UnityEngine.SpriteSortPoint\">\n      <summary>\n        <para>Determines the position of the Sprite used for sorting the Renderer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteSortPoint.Center\">\n      <summary>\n        <para>The center of the Sprite is used as the point for sorting the Renderer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteSortPoint.Pivot\">\n      <summary>\n        <para>The pivot of the Sprite is used as the point for sorting the Renderer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SpriteTileMode\">\n      <summary>\n        <para>Tiling mode for SpriteRenderer.tileMode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteTileMode.Adaptive\">\n      <summary>\n        <para>Sprite Renderer tiles the sprite once the Sprite Renderer size is above SpriteRenderer.adaptiveModeThreshold.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SpriteTileMode.Continuous\">\n      <summary>\n        <para>Sprite Renderer tiles the sprite continuously when is set to SpriteRenderer.tileMode.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.StackTraceLogType\">\n      <summary>\n        <para>Stack trace logging options.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.StackTraceLogType.Full\">\n      <summary>\n        <para>Native and managed stack trace will be logged.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.StackTraceLogType.None\">\n      <summary>\n        <para>No stack trace will be outputed to log.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.StackTraceLogType.ScriptOnly\">\n      <summary>\n        <para>Only managed stack trace will be outputed.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.StateMachineBehaviour\">\n      <summary>\n        <para>StateMachineBehaviour is a component that can be added to a state machine state. It's the base class every script on a state derives from.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.StateMachineBehaviour.OnStateEnter\">\n      <summary>\n        <para>Called on the first Update frame when a statemachine evaluate this state.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.StateMachineBehaviour.OnStateExit\">\n      <summary>\n        <para>Called on the last update frame when a statemachine evaluate this state.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.StateMachineBehaviour.OnStateIK\">\n      <summary>\n        <para>Called right after MonoBehaviour.OnAnimatorIK.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.StateMachineBehaviour.OnStateMachineEnter(UnityEngine.Animator,System.Int32)\">\n      <summary>\n        <para>Called on the first Update frame when making a transition to a StateMachine. This is not called when making a transition into a StateMachine sub-state.</para>\n      </summary>\n      <param name=\"animator\">The Animator playing this state machine.</param>\n      <param name=\"stateMachinePathHash\">The full path hash for this state machine.</param>\n    </member>\n    <member name=\"M:UnityEngine.StateMachineBehaviour.OnStateMachineExit(UnityEngine.Animator,System.Int32)\">\n      <summary>\n        <para>Called on the last Update frame when making a transition out of a StateMachine. This is not called when making a transition into a StateMachine sub-state.</para>\n      </summary>\n      <param name=\"animator\">The Animator playing this state machine.</param>\n      <param name=\"stateMachinePathHash\">The full path hash for this state machine.</param>\n    </member>\n    <member name=\"M:UnityEngine.StateMachineBehaviour.OnStateMove\">\n      <summary>\n        <para>Called right after MonoBehaviour.OnAnimatorMove.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.StateMachineBehaviour.OnStateUpdate\">\n      <summary>\n        <para>Called at each Update frame except for the first and last frame.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.StaticBatchingUtility\">\n      <summary>\n        <para>StaticBatchingUtility can prepare your objects to take advantage of Unity's static batching.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.StaticBatchingUtility.Combine(UnityEngine.GameObject)\">\n      <summary>\n        <para>StaticBatchingUtility.Combine prepares all children of the staticBatchRoot for static batching.</para>\n      </summary>\n      <param name=\"staticBatchRoot\"></param>\n    </member>\n    <member name=\"M:UnityEngine.StaticBatchingUtility.Combine(UnityEngine.GameObject[],UnityEngine.GameObject)\">\n      <summary>\n        <para>StaticBatchingUtility.Combine prepares all gos for static batching. staticBatchRoot is treated as their parent.</para>\n      </summary>\n      <param name=\"gos\"></param>\n      <param name=\"staticBatchRoot\"></param>\n    </member>\n    <member name=\"T:UnityEngine.StereoTargetEyeMask\">\n      <summary>\n        <para>Enum values for the Camera's targetEye property.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.StereoTargetEyeMask.Both\">\n      <summary>\n        <para>Render both eyes to the HMD.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.StereoTargetEyeMask.Left\">\n      <summary>\n        <para>Render only the Left eye to the HMD.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.StereoTargetEyeMask.None\">\n      <summary>\n        <para>Do not render either eye to the HMD.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.StereoTargetEyeMask.Right\">\n      <summary>\n        <para>Render only the right eye to the HMD.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.StreamingController\">\n      <summary>\n        <para>A StreamingController controls the streaming settings for an individual camera location.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.StreamingController.streamingMipmapBias\">\n      <summary>\n        <para>Offset applied to the mipmap level chosen by the texture streaming system for any textures visible from this camera. This Offset can take either a positive or negative value.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.StreamingController.CancelPreloading\">\n      <summary>\n        <para>Abort preloading.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.StreamingController.IsPreloading\">\n      <summary>\n        <para>Used to find out whether the StreamingController is currently preloading texture mipmaps.</para>\n      </summary>\n      <returns>\n        <para>True if in a preloading state, otherwise False.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.StreamingController.SetPreloading(System.Single,System.Boolean,UnityEngine.Camera)\">\n      <summary>\n        <para>Initiate preloading of streaming data for this camera.</para>\n      </summary>\n      <param name=\"timeoutSeconds\">Optional timeout before stopping preloading. Set to 0.0f when no timeout is required.</param>\n      <param name=\"activateCameraOnTimeout\">Set to True to activate the connected Camera component when timeout expires.</param>\n      <param name=\"disableCameraCuttingFrom\">Camera to deactivate on timeout (if Camera.activateCameraOnTime is True). This parameter can be null.</param>\n    </member>\n    <member name=\"T:UnityEngine.SurfaceEffector2D\">\n      <summary>\n        <para>Applies tangent forces along the surfaces of colliders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SurfaceEffector2D.forceScale\">\n      <summary>\n        <para>The scale of the impulse force applied while attempting to reach the surface speed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SurfaceEffector2D.speed\">\n      <summary>\n        <para>The speed to be maintained along the surface.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SurfaceEffector2D.speedVariation\">\n      <summary>\n        <para>The speed variation (from zero to the variation) added to base speed to be applied.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SurfaceEffector2D.useBounce\">\n      <summary>\n        <para>Should bounce be used for any contact with the surface?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SurfaceEffector2D.useContactForce\">\n      <summary>\n        <para>Should the impulse force but applied to the contact point?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SurfaceEffector2D.useFriction\">\n      <summary>\n        <para>Should friction be used for any contact with the surface?</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.SystemInfo\">\n      <summary>\n        <para>Access system and hardware information.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.batteryLevel\">\n      <summary>\n        <para>The current battery level (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.batteryStatus\">\n      <summary>\n        <para>Returns the current status of the device's battery (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.copyTextureSupport\">\n      <summary>\n        <para>Support for various Graphics.CopyTexture cases (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.deviceModel\">\n      <summary>\n        <para>The model of the device (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.deviceName\">\n      <summary>\n        <para>The user defined name of the device (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.deviceType\">\n      <summary>\n        <para>Returns the kind of device the application is running on (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.deviceUniqueIdentifier\">\n      <summary>\n        <para>A unique device identifier. It is guaranteed to be unique for every device (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.graphicsDeviceID\">\n      <summary>\n        <para>The identifier code of the graphics device (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.graphicsDeviceName\">\n      <summary>\n        <para>The name of the graphics device (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.graphicsDeviceType\">\n      <summary>\n        <para>The graphics API type used by the graphics device (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.graphicsDeviceVendor\">\n      <summary>\n        <para>The vendor of the graphics device (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.graphicsDeviceVendorID\">\n      <summary>\n        <para>The identifier code of the graphics device vendor (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.graphicsDeviceVersion\">\n      <summary>\n        <para>The graphics API type and driver version used by the graphics device (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.graphicsMemorySize\">\n      <summary>\n        <para>Amount of video memory present (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.graphicsMultiThreaded\">\n      <summary>\n        <para>Is graphics device using multi-threaded rendering (Read Only)?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.graphicsShaderLevel\">\n      <summary>\n        <para>Graphics device shader capability level (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.graphicsUVStartsAtTop\">\n      <summary>\n        <para>Returns true if the texture UV coordinate convention for this platform has Y starting at the top of the image.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.maxCubemapSize\">\n      <summary>\n        <para>Maximum Cubemap texture size (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.maxTextureSize\">\n      <summary>\n        <para>Maximum texture size (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.npotSupport\">\n      <summary>\n        <para>What NPOT (non-power of two size) texture support does the GPU provide? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.operatingSystem\">\n      <summary>\n        <para>Operating system name with version (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.operatingSystemFamily\">\n      <summary>\n        <para>Returns the operating system family the game is running on (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.processorCount\">\n      <summary>\n        <para>Number of processors present (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.processorFrequency\">\n      <summary>\n        <para>Processor frequency in MHz (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.processorType\">\n      <summary>\n        <para>Processor name (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportedRenderTargetCount\">\n      <summary>\n        <para>How many simultaneous render targets (MRTs) are supported? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supports2DArrayTextures\">\n      <summary>\n        <para>Are 2D Array textures supported? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supports32bitsIndexBuffer\">\n      <summary>\n        <para>Are 32-bit index buffers supported? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supports3DRenderTextures\">\n      <summary>\n        <para>Are 3D (volume) RenderTextures supported? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supports3DTextures\">\n      <summary>\n        <para>Are 3D (volume) textures supported? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsAccelerometer\">\n      <summary>\n        <para>Is an accelerometer available on the device?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsAsyncCompute\">\n      <summary>\n        <para>Returns true when the platform supports asynchronous compute queues and false if otherwise.\n\nNote that asynchronous compute queues are only supported on PS4.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsAsyncGPUReadback\">\n      <summary>\n        <para>Returns true if asynchronous readback of GPU data is available for this device and false otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsAudio\">\n      <summary>\n        <para>Is there an Audio device available for playback?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsComputeShaders\">\n      <summary>\n        <para>Are compute shaders supported? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsCubemapArrayTextures\">\n      <summary>\n        <para>Are Cubemap Array textures supported? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsGPUFence\">\n      <summary>\n        <para>Returns true when the platform supports GPUFences and false if otherwise.\n\nNote that GPUFences are only supported on PS4.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsGyroscope\">\n      <summary>\n        <para>Is a gyroscope available on the device?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsHardwareQuadTopology\">\n      <summary>\n        <para>Does the hardware support quad topology? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsImageEffects\">\n      <summary>\n        <para>Are image effects supported? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsInstancing\">\n      <summary>\n        <para>Is GPU draw call instancing supported? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsLocationService\">\n      <summary>\n        <para>Is the device capable of reporting its location?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsMipStreaming\">\n      <summary>\n        <para>Is streaming of texture mip maps supported? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsMotionVectors\">\n      <summary>\n        <para>Whether motion vectors are supported on this platform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsMultisampleAutoResolve\">\n      <summary>\n        <para>Returns true if multisampled textures are resolved automatically</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsMultisampledTextures\">\n      <summary>\n        <para>Are multisampled textures supported? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsRawShadowDepthSampling\">\n      <summary>\n        <para>Is sampling raw depth from shadowmaps supported? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsRenderTextures\">\n      <summary>\n        <para>Are render textures supported? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsRenderToCubemap\">\n      <summary>\n        <para>Are cubemap render textures supported? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsShadows\">\n      <summary>\n        <para>Are built-in shadows supported? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsSparseTextures\">\n      <summary>\n        <para>Are sparse textures supported? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsStencil\">\n      <summary>\n        <para>Is the stencil buffer supported? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsTextureWrapMirrorOnce\">\n      <summary>\n        <para>Returns true if the 'Mirror Once' texture wrap mode is supported. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.supportsVibration\">\n      <summary>\n        <para>Is the device capable of providing the user haptic feedback by vibration?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.systemMemorySize\">\n      <summary>\n        <para>Amount of system memory present (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemInfo.unsupportedIdentifier\">\n      <summary>\n        <para>Value returned by SystemInfo string properties which are not supported on the current platform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.SystemInfo.usesReversedZBuffer\">\n      <summary>\n        <para>This property is true if the current platform uses a reversed depth buffer (where values range from 1 at the near plane and 0 at far plane), and false if the depth buffer is normal (0 is near, 1 is far). (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.SystemInfo.IsFormatSupported(UnityEngine.Experimental.Rendering.GraphicsFormat,UnityEngine.Experimental.Rendering.FormatUsage)\">\n      <summary>\n        <para>Verifies that the specified graphics format is supported for the specified usage.</para>\n      </summary>\n      <param name=\"format\">The GraphicsFormat format to look up.</param>\n      <param name=\"format\">The FormatUsage usage to look up.</param>\n      <param name=\"usage\"></param>\n      <returns>\n        <para>Returns true if the format is supported for the specific usage. Returns false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SystemInfo.SupportsBlendingOnRenderTextureFormat(UnityEngine.RenderTextureFormat)\">\n      <summary>\n        <para>Is blending supported on render texture format?</para>\n      </summary>\n      <param name=\"format\">The format to look up.</param>\n      <returns>\n        <para>True if blending is supported on the given format.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SystemInfo.SupportsRenderTextureFormat(UnityEngine.RenderTextureFormat)\">\n      <summary>\n        <para>Is render texture format supported?</para>\n      </summary>\n      <param name=\"format\">The format to look up.</param>\n      <returns>\n        <para>True if the format is supported.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.SystemInfo.SupportsTextureFormat(UnityEngine.TextureFormat)\">\n      <summary>\n        <para>Is texture format supported on this device?</para>\n      </summary>\n      <param name=\"format\">The TextureFormat format to look up.</param>\n      <returns>\n        <para>True if the format is supported.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.SystemLanguage\">\n      <summary>\n        <para>The language the user's operating system is running in. Returned by Application.systemLanguage.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Afrikaans\">\n      <summary>\n        <para>Afrikaans.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Arabic\">\n      <summary>\n        <para>Arabic.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Basque\">\n      <summary>\n        <para>Basque.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Belarusian\">\n      <summary>\n        <para>Belarusian.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Bulgarian\">\n      <summary>\n        <para>Bulgarian.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Catalan\">\n      <summary>\n        <para>Catalan.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Chinese\">\n      <summary>\n        <para>Chinese.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.ChineseSimplified\">\n      <summary>\n        <para>ChineseSimplified.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.ChineseTraditional\">\n      <summary>\n        <para>ChineseTraditional.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Czech\">\n      <summary>\n        <para>Czech.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Danish\">\n      <summary>\n        <para>Danish.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Dutch\">\n      <summary>\n        <para>Dutch.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.English\">\n      <summary>\n        <para>English.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Estonian\">\n      <summary>\n        <para>Estonian.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Faroese\">\n      <summary>\n        <para>Faroese.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Finnish\">\n      <summary>\n        <para>Finnish.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.French\">\n      <summary>\n        <para>French.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.German\">\n      <summary>\n        <para>German.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Greek\">\n      <summary>\n        <para>Greek.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Hebrew\">\n      <summary>\n        <para>Hebrew.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Hungarian\">\n      <summary>\n        <para>Hungarian.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Icelandic\">\n      <summary>\n        <para>Icelandic.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Indonesian\">\n      <summary>\n        <para>Indonesian.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Italian\">\n      <summary>\n        <para>Italian.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Japanese\">\n      <summary>\n        <para>Japanese.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Korean\">\n      <summary>\n        <para>Korean.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Latvian\">\n      <summary>\n        <para>Latvian.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Lithuanian\">\n      <summary>\n        <para>Lithuanian.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Norwegian\">\n      <summary>\n        <para>Norwegian.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Polish\">\n      <summary>\n        <para>Polish.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Portuguese\">\n      <summary>\n        <para>Portuguese.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Romanian\">\n      <summary>\n        <para>Romanian.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Russian\">\n      <summary>\n        <para>Russian.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.SerboCroatian\">\n      <summary>\n        <para>Serbo-Croatian.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Slovak\">\n      <summary>\n        <para>Slovak.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Slovenian\">\n      <summary>\n        <para>Slovenian.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Spanish\">\n      <summary>\n        <para>Spanish.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Swedish\">\n      <summary>\n        <para>Swedish.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Thai\">\n      <summary>\n        <para>Thai.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Turkish\">\n      <summary>\n        <para>Turkish.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Ukrainian\">\n      <summary>\n        <para>Ukrainian.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Unknown\">\n      <summary>\n        <para>Unknown.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.SystemLanguage.Vietnamese\">\n      <summary>\n        <para>Vietnamese.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TargetJoint2D\">\n      <summary>\n        <para>The joint attempts to move a Rigidbody2D to a specific target position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TargetJoint2D.anchor\">\n      <summary>\n        <para>The local-space anchor on the rigid-body the joint is attached to.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TargetJoint2D.autoConfigureTarget\">\n      <summary>\n        <para>Should the target be calculated automatically?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TargetJoint2D.dampingRatio\">\n      <summary>\n        <para>The amount by which the target spring force is reduced in proportion to the movement speed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TargetJoint2D.frequency\">\n      <summary>\n        <para>The frequency at which the target spring oscillates around the target position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TargetJoint2D.maxForce\">\n      <summary>\n        <para>The maximum force that can be generated when trying to maintain the target joint constraint.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TargetJoint2D.target\">\n      <summary>\n        <para>The world-space position that the joint will attempt to move the body to.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Terrain\">\n      <summary>\n        <para>The Terrain component renders the terrain.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.activeTerrain\">\n      <summary>\n        <para>The active terrain. This is a convenience function to get to the main terrain in the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.activeTerrains\">\n      <summary>\n        <para>The active terrains in the scene.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.bakeLightProbesForTrees\">\n      <summary>\n        <para>Specifies if an array of internal light probes should be baked for terrain trees. Available only in editor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.basemapDistance\">\n      <summary>\n        <para>Heightmap patches beyond basemap distance will use a precomputed low res basemap.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.castShadows\">\n      <summary>\n        <para>Should terrain cast shadows?.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.collectDetailPatches\">\n      <summary>\n        <para>Collect detail patches from memory.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.detailObjectDensity\">\n      <summary>\n        <para>Density of detail objects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.detailObjectDistance\">\n      <summary>\n        <para>Detail objects will be displayed up to this distance.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.drawHeightmap\">\n      <summary>\n        <para>Specify if terrain heightmap should be drawn.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.drawTreesAndFoliage\">\n      <summary>\n        <para>Specify if terrain trees and details should be drawn.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.editorRenderFlags\">\n      <summary>\n        <para>Controls what part of the terrain should be rendered.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.freeUnusedRenderingResources\">\n      <summary>\n        <para>Whether some per-camera rendering resources for the terrain should be freed after not being used for some frames.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.heightmapMaximumLOD\">\n      <summary>\n        <para>Lets you essentially lower the heightmap resolution used for rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.heightmapPixelError\">\n      <summary>\n        <para>An approximation of how many pixels the terrain will pop in the worst case when switching lod.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.legacyShininess\">\n      <summary>\n        <para>The shininess value of the terrain.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.legacySpecular\">\n      <summary>\n        <para>The specular color of the terrain.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.lightmapIndex\">\n      <summary>\n        <para>The index of the baked lightmap applied to this terrain.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.lightmapScaleOffset\">\n      <summary>\n        <para>The UV scale &amp; offset used for a baked lightmap.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.materialTemplate\">\n      <summary>\n        <para>The custom material used to render the terrain.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.materialType\">\n      <summary>\n        <para>The type of the material used to render the terrain. Could be one of the built-in types or custom. See Terrain.MaterialType.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.patchBoundsMultiplier\">\n      <summary>\n        <para>Set the terrain bounding box scale.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.preserveTreePrototypeLayers\">\n      <summary>\n        <para>Allows you to specify how Unity chooses the for tree instances.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.realtimeLightmapIndex\">\n      <summary>\n        <para>The index of the realtime lightmap applied to this terrain.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.realtimeLightmapScaleOffset\">\n      <summary>\n        <para>The UV scale &amp; offset used for a realtime lightmap.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.reflectionProbeUsage\">\n      <summary>\n        <para>How reflection probes are used for terrain. See Rendering.ReflectionProbeUsage.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.terrainData\">\n      <summary>\n        <para>The Terrain Data that stores heightmaps, terrain textures, detail meshes and trees.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.treeBillboardDistance\">\n      <summary>\n        <para>Distance from the camera where trees will be rendered as billboards only.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.treeCrossFadeLength\">\n      <summary>\n        <para>Total distance delta that trees will use to transition from billboard orientation to mesh orientation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.treeDistance\">\n      <summary>\n        <para>The maximum distance at which trees are rendered.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.treeLODBiasMultiplier\">\n      <summary>\n        <para>The multiplier to the current LOD bias used for rendering LOD trees (i.e. SpeedTree trees).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Terrain.treeMaximumFullLODCount\">\n      <summary>\n        <para>Maximum number of trees rendered at full LOD.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Terrain.AddTreeInstance(UnityEngine.TreeInstance)\">\n      <summary>\n        <para>Adds a tree instance to the terrain.</para>\n      </summary>\n      <param name=\"instance\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Terrain.ApplyDelayedHeightmapModification\">\n      <summary>\n        <para>Update the terrain's LOD and vegetation information after making changes with TerrainData.SetHeightsDelayLOD.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Terrain.CreateTerrainGameObject(UnityEngine.TerrainData)\">\n      <summary>\n        <para>Creates a Terrain including collider from TerrainData.</para>\n      </summary>\n      <param name=\"assignTerrain\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Terrain.Flush\">\n      <summary>\n        <para>Flushes any change done in the terrain so it takes effect.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Terrain.GetClosestReflectionProbes(System.Collections.Generic.List`1&lt;UnityEngine.Rendering.ReflectionProbeBlendInfo&gt;)\">\n      <summary>\n        <para>Fills the list with reflection probes whose AABB intersects with terrain's AABB. Their weights are also provided. Weight shows how much influence the probe has on the terrain, and is used when the blending between multiple reflection probes occurs.</para>\n      </summary>\n      <param name=\"result\">[in / out] A list to hold the returned reflection probes and their weights. See ReflectionProbeBlendInfo.</param>\n    </member>\n    <member name=\"M:UnityEngine.Terrain.GetPosition\">\n      <summary>\n        <para>Get the position of the terrain.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Terrain.GetSplatMaterialPropertyBlock(UnityEngine.MaterialPropertyBlock)\">\n      <summary>\n        <para>Get the previously set splat material properties by copying to the dest MaterialPropertyBlock object.</para>\n      </summary>\n      <param name=\"dest\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Terrain.MaterialType\">\n      <summary>\n        <para>The type of the material used to render a terrain object. Could be one of the built-in types or custom.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Terrain.MaterialType.BuiltInLegacyDiffuse\">\n      <summary>\n        <para>A built-in material that uses the legacy Lambert (diffuse) lighting model and has optional normal map support.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Terrain.MaterialType.BuiltInLegacySpecular\">\n      <summary>\n        <para>A built-in material that uses the legacy BlinnPhong (specular) lighting model and has optional normal map support.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Terrain.MaterialType.BuiltInStandard\">\n      <summary>\n        <para>A built-in material that uses the standard physically-based lighting model. Inputs supported: smoothness, metallic / specular, normal.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Terrain.MaterialType.Custom\">\n      <summary>\n        <para>Use a custom material given by Terrain.materialTemplate.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Terrain.SampleHeight(UnityEngine.Vector3)\">\n      <summary>\n        <para>Samples the height at the given position defined in world space, relative to the terrain space.</para>\n      </summary>\n      <param name=\"worldPosition\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Terrain.SetNeighbors(UnityEngine.Terrain,UnityEngine.Terrain,UnityEngine.Terrain,UnityEngine.Terrain)\">\n      <summary>\n        <para>Lets you setup the connection between neighboring Terrains.</para>\n      </summary>\n      <param name=\"left\"></param>\n      <param name=\"top\"></param>\n      <param name=\"right\"></param>\n      <param name=\"bottom\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Terrain.SetSplatMaterialPropertyBlock(UnityEngine.MaterialPropertyBlock)\">\n      <summary>\n        <para>Set the additional material properties when rendering the terrain heightmap using the splat material.</para>\n      </summary>\n      <param name=\"properties\"></param>\n    </member>\n    <member name=\"T:UnityEngine.TerrainChangedFlags\">\n      <summary>\n        <para>Indicate the types of changes to the terrain in OnTerrainChanged callback.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TerrainChangedFlags.DelayedHeightmapUpdate\">\n      <summary>\n        <para>Indicates a change to the heightmap data without computing LOD.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TerrainChangedFlags.FlushEverythingImmediately\">\n      <summary>\n        <para>Indicates that a change was made to the terrain that was so significant that the internal rendering data need to be flushed and recreated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TerrainChangedFlags.Heightmap\">\n      <summary>\n        <para>Indicates a change to the heightmap data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TerrainChangedFlags.RemoveDirtyDetailsImmediately\">\n      <summary>\n        <para>Indicates a change to the detail data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TerrainChangedFlags.TreeInstances\">\n      <summary>\n        <para>Indicates a change to the tree data.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TerrainChangedFlags.WillBeDestroyed\">\n      <summary>\n        <para>Indicates that the TerrainData object is about to be destroyed.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TerrainCollider\">\n      <summary>\n        <para>A heightmap based collider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainCollider.terrainData\">\n      <summary>\n        <para>The terrain that stores the heightmap.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TerrainData\">\n      <summary>\n        <para>The TerrainData class stores heightmaps, detail mesh positions, tree instances, and terrain texture alpha maps.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.alphamapHeight\">\n      <summary>\n        <para>Height of the alpha map.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.alphamapLayers\">\n      <summary>\n        <para>Number of alpha map layers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.alphamapResolution\">\n      <summary>\n        <para>Resolution of the alpha map.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.alphamapTextures\">\n      <summary>\n        <para>Alpha map textures used by the Terrain. Used by Terrain Inspector for undo.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.alphamapWidth\">\n      <summary>\n        <para>Width of the alpha map.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.baseMapResolution\">\n      <summary>\n        <para>Resolution of the base map used for rendering far patches on the terrain.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.bounds\">\n      <summary>\n        <para>The local bounding box of the TerrainData object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.detailHeight\">\n      <summary>\n        <para>Detail height of the TerrainData.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.detailPrototypes\">\n      <summary>\n        <para>Contains the detail texture/meshes that the terrain has.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.detailResolution\">\n      <summary>\n        <para>Detail Resolution of the TerrainData.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.detailWidth\">\n      <summary>\n        <para>Detail width of the TerrainData.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.heightmapHeight\">\n      <summary>\n        <para>Height of the terrain in samples (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.heightmapResolution\">\n      <summary>\n        <para>Resolution of the heightmap.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.heightmapScale\">\n      <summary>\n        <para>The size of each heightmap sample.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.heightmapWidth\">\n      <summary>\n        <para>Width of the terrain in samples (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.size\">\n      <summary>\n        <para>The total size in world units of the terrain.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.splatPrototypes\">\n      <summary>\n        <para>Splat texture used by the terrain.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.thickness\">\n      <summary>\n        <para>The thickness of the terrain used for collision detection.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.treeInstanceCount\">\n      <summary>\n        <para>Returns the number of tree instances.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.treeInstances\">\n      <summary>\n        <para>Contains the current trees placed in the terrain.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.treePrototypes\">\n      <summary>\n        <para>The list of tree prototypes this are the ones available in the inspector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.wavingGrassAmount\">\n      <summary>\n        <para>Amount of waving grass in the terrain.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.wavingGrassSpeed\">\n      <summary>\n        <para>Speed of the waving grass.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.wavingGrassStrength\">\n      <summary>\n        <para>Strength of the waving grass in the terrain.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TerrainData.wavingGrassTint\">\n      <summary>\n        <para>Color of the waving grass that the terrain has.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.GetAlphamaps(System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Returns the alpha map at a position x, y given a width and height.</para>\n      </summary>\n      <param name=\"x\">The x offset to read from.</param>\n      <param name=\"y\">The y offset to read from.</param>\n      <param name=\"width\">The width of the alpha map area to read.</param>\n      <param name=\"height\">The height of the alpha map area to read.</param>\n      <returns>\n        <para>A 3D array of floats, where the 3rd dimension represents the mixing weight of each splatmap at each x,y coordinate.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.GetDetailLayer(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Returns a 2D array of the detail object density in the specific location.</para>\n      </summary>\n      <param name=\"xBase\"></param>\n      <param name=\"yBase\"></param>\n      <param name=\"width\"></param>\n      <param name=\"height\"></param>\n      <param name=\"layer\"></param>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.GetHeight(System.Int32,System.Int32)\">\n      <summary>\n        <para>Gets the height at a certain point x,y.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.GetHeights(System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Get an array of heightmap samples.</para>\n      </summary>\n      <param name=\"xBase\">First x index of heightmap samples to retrieve.</param>\n      <param name=\"yBase\">First y index of heightmap samples to retrieve.</param>\n      <param name=\"width\">Number of samples to retrieve along the heightmap's x axis.</param>\n      <param name=\"height\">Number of samples to retrieve along the heightmap's y axis.</param>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.GetInterpolatedHeight(System.Single,System.Single)\">\n      <summary>\n        <para>Gets an interpolated height at a point x,y.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.GetInterpolatedNormal(System.Single,System.Single)\">\n      <summary>\n        <para>Get an interpolated normal at a given location.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.GetMaximumHeightError\">\n      <summary>\n        <para>Returns an array of tesselation maximum height error values per renderable terrain patch.  The returned array can be modified and passed to OverrideMaximumHeightError.</para>\n      </summary>\n      <returns>\n        <para>Float array of maximum height error values.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.GetPatchMinMaxHeights\">\n      <summary>\n        <para>Returns an array of min max height values for all the renderable patches in a terrain.  The returned array can be modified and then passed to OverrideMinMaxPatchHeights.</para>\n      </summary>\n      <returns>\n        <para>Minimum and maximum height values for each patch.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.GetSteepness(System.Single,System.Single)\">\n      <summary>\n        <para>Gets the gradient of the terrain at point (x,y).</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.GetSupportedLayers(System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Returns an array of all supported detail layer indices in the area.</para>\n      </summary>\n      <param name=\"xBase\"></param>\n      <param name=\"yBase\"></param>\n      <param name=\"totalWidth\"></param>\n      <param name=\"totalHeight\"></param>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.GetTreeInstance(System.Int32)\">\n      <summary>\n        <para>Get the tree instance at the specified index. It is used as a faster version of treeInstances[index] as this function doesn't create the entire tree instances array.</para>\n      </summary>\n      <param name=\"index\">The index of the tree instance.</param>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.OverrideMaximumHeightError(System.Single[])\">\n      <summary>\n        <para>Override the maximum tessellation height error with user provided values.  Note that the overriden values get reset when the terrain resolution is changed and stays unchanged when the terrain heightmap is painted or changed via script.</para>\n      </summary>\n      <param name=\"maxError\">Provided maximum height error values.</param>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.OverrideMinMaxPatchHeights(UnityEngine.PatchExtents[])\">\n      <summary>\n        <para>Override the minimum and maximum patch heights for every renderable terrain patch.  Note that the overriden values get reset when the terrain resolution is changed and stays unchanged when the terrain heightmap is painted or changed via script.</para>\n      </summary>\n      <param name=\"minMaxHeights\">Array of minimum and maximum terrain patch height values.</param>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.RefreshPrototypes\">\n      <summary>\n        <para>Reloads all the values of the available prototypes (ie, detail mesh assets) in the TerrainData Object.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.SetAlphamaps(System.Int32,System.Int32,System.Single[,,])\">\n      <summary>\n        <para>Assign all splat values in the given map area.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"map\"></param>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.SetDetailLayer(System.Int32,System.Int32,System.Int32,System.Int32[,])\">\n      <summary>\n        <para>Sets the detail layer density map.</para>\n      </summary>\n      <param name=\"xBase\"></param>\n      <param name=\"yBase\"></param>\n      <param name=\"layer\"></param>\n      <param name=\"details\"></param>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.SetDetailResolution(System.Int32,System.Int32)\">\n      <summary>\n        <para>Set the resolution of the detail map.</para>\n      </summary>\n      <param name=\"detailResolution\">Specifies the number of pixels in the detail resolution map. A larger detailResolution, leads to more accurate detail object painting.</param>\n      <param name=\"resolutionPerPatch\">Specifies the size in pixels of each individually rendered detail patch. A larger number reduces draw calls, but might increase triangle count since detail patches are culled on a per batch basis. A recommended value is 16. If you use a very large detail object distance and your grass is very sparse, it makes sense to increase the value.</param>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.SetHeights(System.Int32,System.Int32,System.Single[,])\">\n      <summary>\n        <para>Set an array of heightmap samples.</para>\n      </summary>\n      <param name=\"xBase\">First x index of heightmap samples to set.</param>\n      <param name=\"yBase\">First y index of heightmap samples to set.</param>\n      <param name=\"heights\">Array of heightmap samples to set (values range from 0 to 1, array indexed as [y,x]).</param>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.SetHeightsDelayLOD(System.Int32,System.Int32,System.Single[,])\">\n      <summary>\n        <para>Set an array of heightmap samples.</para>\n      </summary>\n      <param name=\"xBase\">First x index of heightmap samples to set.</param>\n      <param name=\"yBase\">First y index of heightmap samples to set.</param>\n      <param name=\"heights\">Array of heightmap samples to set (values range from 0 to 1, array indexed as [y,x]).</param>\n    </member>\n    <member name=\"M:UnityEngine.TerrainData.SetTreeInstance(System.Int32,UnityEngine.TreeInstance)\">\n      <summary>\n        <para>Set the tree instance with new parameters at the specified index. However, TreeInstance.prototypeIndex and TreeInstance.position can not be changed otherwise an ArgumentException will be thrown.</para>\n      </summary>\n      <param name=\"index\">The index of the tree instance.</param>\n      <param name=\"instance\">The new TreeInstance value.</param>\n    </member>\n    <member name=\"T:UnityEngine.TerrainExtensions\">\n      <summary>\n        <para>Extension methods to the Terrain class, used only for the UpdateGIMaterials method used by the Global Illumination System.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.TerrainExtensions.UpdateGIMaterials(UnityEngine.Terrain)\">\n      <summary>\n        <para>Schedules an update of the albedo and emissive Textures of a system that contains the Terrain.</para>\n      </summary>\n      <param name=\"terrain\"></param>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"width\"></param>\n      <param name=\"height\"></param>\n    </member>\n    <member name=\"M:UnityEngine.TerrainExtensions.UpdateGIMaterials(UnityEngine.Terrain,System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Schedules an update of the albedo and emissive Textures of a system that contains the Terrain.</para>\n      </summary>\n      <param name=\"terrain\"></param>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"width\"></param>\n      <param name=\"height\"></param>\n    </member>\n    <member name=\"T:UnityEngine.TerrainRenderFlags\">\n      <summary>\n        <para>Enum provding terrain rendering options.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TerrainRenderFlags.All\">\n      <summary>\n        <para>Render all options.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TerrainRenderFlags.Details\">\n      <summary>\n        <para>Render terrain details.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TerrainRenderFlags.Heightmap\">\n      <summary>\n        <para>Render heightmap.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TerrainRenderFlags.Trees\">\n      <summary>\n        <para>Render trees.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TextAlignment\">\n      <summary>\n        <para>How multiline text should be aligned.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextAlignment.Center\">\n      <summary>\n        <para>Text lines are centered.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextAlignment.Left\">\n      <summary>\n        <para>Text lines are aligned on the left side.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextAlignment.Right\">\n      <summary>\n        <para>Text lines are aligned on the right side.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TextAnchor\">\n      <summary>\n        <para>Where the anchor of the text is placed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextAnchor.LowerCenter\">\n      <summary>\n        <para>Text is anchored in lower side, centered horizontally.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextAnchor.LowerLeft\">\n      <summary>\n        <para>Text is anchored in lower left corner.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextAnchor.LowerRight\">\n      <summary>\n        <para>Text is anchored in lower right corner.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextAnchor.MiddleCenter\">\n      <summary>\n        <para>Text is centered both horizontally and vertically.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextAnchor.MiddleLeft\">\n      <summary>\n        <para>Text is anchored in left side, centered vertically.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextAnchor.MiddleRight\">\n      <summary>\n        <para>Text is anchored in right side, centered vertically.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextAnchor.UpperCenter\">\n      <summary>\n        <para>Text is anchored in upper side, centered horizontally.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextAnchor.UpperLeft\">\n      <summary>\n        <para>Text is anchored in upper left corner.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextAnchor.UpperRight\">\n      <summary>\n        <para>Text is anchored in upper right corner.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TextAreaAttribute\">\n      <summary>\n        <para>Attribute to make a string be edited with a height-flexible and scrollable text area.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextAreaAttribute.maxLines\">\n      <summary>\n        <para>The maximum amount of lines the text area can show before it starts using a scrollbar.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextAreaAttribute.minLines\">\n      <summary>\n        <para>The minimum amount of lines the text area will use.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.TextAreaAttribute.#ctor\">\n      <summary>\n        <para>Attribute to make a string be edited with a height-flexible and scrollable text area.</para>\n      </summary>\n      <param name=\"minLines\">The minimum amount of lines the text area will use.</param>\n      <param name=\"maxLines\">The maximum amount of lines the text area can show before it starts using a scrollbar.</param>\n    </member>\n    <member name=\"M:UnityEngine.TextAreaAttribute.#ctor(System.Int32,System.Int32)\">\n      <summary>\n        <para>Attribute to make a string be edited with a height-flexible and scrollable text area.</para>\n      </summary>\n      <param name=\"minLines\">The minimum amount of lines the text area will use.</param>\n      <param name=\"maxLines\">The maximum amount of lines the text area can show before it starts using a scrollbar.</param>\n    </member>\n    <member name=\"T:UnityEngine.TextAsset\">\n      <summary>\n        <para>Text file assets.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextAsset.bytes\">\n      <summary>\n        <para>The raw bytes of the text asset. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextAsset.text\">\n      <summary>\n        <para>The text contents of the .txt file as a string. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.TextAsset.#ctor(System.String)\">\n      <summary>\n        <para>Create a new TextAsset with the specified text contents.\n\nThis constructor creates a TextAsset, which is not the same as a plain text file. When saved to disk using the AssetDatabase class, the TextAsset should be saved with the .asset extension.</para>\n      </summary>\n      <param name=\"text\">The text contents for the TextAsset.</param>\n    </member>\n    <member name=\"M:UnityEngine.TextAsset.ToString\">\n      <summary>\n        <para>Returns the contents of the TextAsset.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TextClipping\">\n      <summary>\n        <para>Different methods for how the GUI system handles text being too large to fit the rectangle allocated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextClipping.Clip\">\n      <summary>\n        <para>Text gets clipped to be inside the element.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextClipping.Overflow\">\n      <summary>\n        <para>Text flows freely outside the element.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TextGenerationSettings\">\n      <summary>\n        <para>A struct that stores the settings for TextGeneration.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextGenerationSettings.alignByGeometry\">\n      <summary>\n        <para>Use the extents of glyph geometry to perform horizontal alignment rather than glyph metrics.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextGenerationSettings.color\">\n      <summary>\n        <para>The base color for the text generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextGenerationSettings.font\">\n      <summary>\n        <para>Font to use for generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextGenerationSettings.fontSize\">\n      <summary>\n        <para>Font size.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextGenerationSettings.fontStyle\">\n      <summary>\n        <para>Font style.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextGenerationSettings.generateOutOfBounds\">\n      <summary>\n        <para>Continue to generate characters even if the text runs out of bounds.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextGenerationSettings.generationExtents\">\n      <summary>\n        <para>Extents that the generator will attempt to fit the text in.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextGenerationSettings.horizontalOverflow\">\n      <summary>\n        <para>What happens to text when it reaches the horizontal generation bounds.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextGenerationSettings.lineSpacing\">\n      <summary>\n        <para>The line spacing multiplier.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextGenerationSettings.pivot\">\n      <summary>\n        <para>Generated vertices are offset by the pivot.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextGenerationSettings.resizeTextForBestFit\">\n      <summary>\n        <para>Should the text be resized to fit the configured bounds?</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextGenerationSettings.resizeTextMaxSize\">\n      <summary>\n        <para>Maximum size for resized text.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextGenerationSettings.resizeTextMinSize\">\n      <summary>\n        <para>Minimum size for resized text.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextGenerationSettings.richText\">\n      <summary>\n        <para>Allow rich text markup in generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextGenerationSettings.scaleFactor\">\n      <summary>\n        <para>A scale factor for the text. This is useful if the Text is on a Canvas and the canvas is scaled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextGenerationSettings.textAnchor\">\n      <summary>\n        <para>How is the generated text anchored.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextGenerationSettings.updateBounds\">\n      <summary>\n        <para>Should the text generator update the bounds from the generated text.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextGenerationSettings.verticalOverflow\">\n      <summary>\n        <para>What happens to text when it reaches the bottom generation bounds.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TextGenerator\">\n      <summary>\n        <para>Class that can be used to generate text for rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextGenerator.characterCount\">\n      <summary>\n        <para>The number of characters that have been generated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextGenerator.characterCountVisible\">\n      <summary>\n        <para>The number of characters that have been generated and are included in the visible lines.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextGenerator.characters\">\n      <summary>\n        <para>Array of generated characters.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextGenerator.fontSizeUsedForBestFit\">\n      <summary>\n        <para>The size of the font that was found if using best fit mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextGenerator.lineCount\">\n      <summary>\n        <para>Number of text lines generated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextGenerator.lines\">\n      <summary>\n        <para>Information about each generated text line.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextGenerator.rectExtents\">\n      <summary>\n        <para>Extents of the generated text in rect format.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextGenerator.vertexCount\">\n      <summary>\n        <para>Number of vertices generated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextGenerator.verts\">\n      <summary>\n        <para>Array of generated vertices.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.TextGenerator.#ctor\">\n      <summary>\n        <para>Create a TextGenerator.</para>\n      </summary>\n      <param name=\"initialCapacity\"></param>\n    </member>\n    <member name=\"M:UnityEngine.TextGenerator.#ctor(System.Int32)\">\n      <summary>\n        <para>Create a TextGenerator.</para>\n      </summary>\n      <param name=\"initialCapacity\"></param>\n    </member>\n    <member name=\"M:UnityEngine.TextGenerator.GetCharacters(System.Collections.Generic.List`1&lt;UnityEngine.UICharInfo&gt;)\">\n      <summary>\n        <para>Populate the given List with UICharInfo.</para>\n      </summary>\n      <param name=\"characters\">List to populate.</param>\n    </member>\n    <member name=\"M:UnityEngine.TextGenerator.GetCharactersArray\">\n      <summary>\n        <para>Returns the current UICharInfo.</para>\n      </summary>\n      <returns>\n        <para>Character information.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.TextGenerator.GetLines(System.Collections.Generic.List`1&lt;UnityEngine.UILineInfo&gt;)\">\n      <summary>\n        <para>Populate the given list with UILineInfo.</para>\n      </summary>\n      <param name=\"lines\">List to populate.</param>\n    </member>\n    <member name=\"M:UnityEngine.TextGenerator.GetLinesArray\">\n      <summary>\n        <para>Returns the current UILineInfo.</para>\n      </summary>\n      <returns>\n        <para>Line information.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.TextGenerator.GetPreferredHeight(System.String,UnityEngine.TextGenerationSettings)\">\n      <summary>\n        <para>Given a string and settings, returns the preferred height for a container that would hold this text.</para>\n      </summary>\n      <param name=\"str\">Generation text.</param>\n      <param name=\"settings\">Settings for generation.</param>\n      <returns>\n        <para>Preferred height.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.TextGenerator.GetPreferredWidth(System.String,UnityEngine.TextGenerationSettings)\">\n      <summary>\n        <para>Given a string and settings, returns the preferred width for a container that would hold this text.</para>\n      </summary>\n      <param name=\"str\">Generation text.</param>\n      <param name=\"settings\">Settings for generation.</param>\n      <returns>\n        <para>Preferred width.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.TextGenerator.GetVertices(System.Collections.Generic.List`1&lt;UnityEngine.UIVertex&gt;)\">\n      <summary>\n        <para>Populate the given list with generated Vertices.</para>\n      </summary>\n      <param name=\"vertices\">List to populate.</param>\n    </member>\n    <member name=\"M:UnityEngine.TextGenerator.GetVerticesArray\">\n      <summary>\n        <para>Returns the current UILineInfo.</para>\n      </summary>\n      <returns>\n        <para>Vertices.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.TextGenerator.Invalidate\">\n      <summary>\n        <para>Mark the text generator as invalid. This will force a full text generation the next time Populate is called.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.TextGenerator.Populate(System.String,UnityEngine.TextGenerationSettings)\">\n      <summary>\n        <para>Will generate the vertices and other data for the given string with the given settings.</para>\n      </summary>\n      <param name=\"str\">String to generate.</param>\n      <param name=\"settings\">Settings.</param>\n    </member>\n    <member name=\"M:UnityEngine.TextGenerator.PopulateWithErrors(System.String,UnityEngine.TextGenerationSettings,UnityEngine.GameObject)\">\n      <summary>\n        <para>Will generate the vertices and other data for the given string with the given settings.</para>\n      </summary>\n      <param name=\"str\">String to generate.</param>\n      <param name=\"settings\">Generation settings.</param>\n      <param name=\"context\">The object used as context of the error log message, if necessary.</param>\n      <returns>\n        <para>True if the generation is a success, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.TextMesh\">\n      <summary>\n        <para>A script interface for the.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextMesh.alignment\">\n      <summary>\n        <para>How lines of text are aligned (Left, Right, Center).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextMesh.anchor\">\n      <summary>\n        <para>Which point of the text shares the position of the Transform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextMesh.characterSize\">\n      <summary>\n        <para>The size of each character (This scales the whole text).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextMesh.color\">\n      <summary>\n        <para>The color used to render the text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextMesh.font\">\n      <summary>\n        <para>The Font used.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextMesh.fontSize\">\n      <summary>\n        <para>The font size to use (for dynamic fonts).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextMesh.fontStyle\">\n      <summary>\n        <para>The font style to use (for dynamic fonts).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextMesh.lineSpacing\">\n      <summary>\n        <para>How much space will be in-between lines of text.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextMesh.offsetZ\">\n      <summary>\n        <para>How far should the text be offset from the transform.position.z when drawing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextMesh.richText\">\n      <summary>\n        <para>Enable HTML-style tags for Text Formatting Markup.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextMesh.tabSize\">\n      <summary>\n        <para>How much space will be inserted for a tab '\\t' character. This is a multiplum of the 'spacebar' character offset.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TextMesh.text\">\n      <summary>\n        <para>The text that is displayed.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Texture\">\n      <summary>\n        <para>Base class for texture handling. Contains functionality that is common to both Texture2D and RenderTexture classes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.anisoLevel\">\n      <summary>\n        <para>Anisotropic filtering level of the texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.currentTextureMemory\">\n      <summary>\n        <para>The amount of memory currently being used by textures.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.desiredTextureMemory\">\n      <summary>\n        <para>This amount of texture memory would be used before the texture streaming budget is applied.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.dimension\">\n      <summary>\n        <para>Dimensionality (type) of the texture (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.filterMode\">\n      <summary>\n        <para>Filtering mode of the texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.height\">\n      <summary>\n        <para>Height of the texture in pixels. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.imageContentsHash\">\n      <summary>\n        <para>The hash value of the Texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.mipMapBias\">\n      <summary>\n        <para>Mip map bias of the texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.nonStreamingTextureCount\">\n      <summary>\n        <para>Number of non-streaming textures.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.nonStreamingTextureMemory\">\n      <summary>\n        <para>Total amount of memory being used by non-streaming textures.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.streamingMipmapUploadCount\">\n      <summary>\n        <para>How many times has a texture been uploaded due to texture mipmap streaming.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.streamingRendererCount\">\n      <summary>\n        <para>Number of renderers registered with the texture streaming system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.streamingTextureCount\">\n      <summary>\n        <para>Number of streaming textures.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.streamingTextureDiscardUnusedMips\">\n      <summary>\n        <para>Force the streaming texture system to discard all unused mipmaps immediately, rather than caching them until the texture memory budget is exceeded.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.streamingTextureForceLoadAll\">\n      <summary>\n        <para>Force streaming textures to load all mipmap levels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.streamingTextureLoadingCount\">\n      <summary>\n        <para>Number of streaming textures with mipmaps currently loading.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.streamingTexturePendingLoadCount\">\n      <summary>\n        <para>Number of streaming textures with outstanding mipmaps to be loaded.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.targetTextureMemory\">\n      <summary>\n        <para>The amount of memory used by textures after the mipmap streaming and budget are applied and loading is complete.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.totalTextureMemory\">\n      <summary>\n        <para>The total amount of memory that would be used by all textures at mipmap level 0.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.updateCount\">\n      <summary>\n        <para>This counter is incremented when the texture is updated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.width\">\n      <summary>\n        <para>Width of the texture in pixels. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.wrapMode\">\n      <summary>\n        <para>Texture coordinate wrapping mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.wrapModeU\">\n      <summary>\n        <para>Texture U coordinate wrapping mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.wrapModeV\">\n      <summary>\n        <para>Texture V coordinate wrapping mode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture.wrapModeW\">\n      <summary>\n        <para>Texture W coordinate wrapping mode for Texture3D.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Texture.GetNativeTexturePtr\">\n      <summary>\n        <para>Retrieve a native (underlying graphics API) pointer to the texture resource.</para>\n      </summary>\n      <returns>\n        <para>Pointer to an underlying graphics API texture resource.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Texture.IncrementUpdateCount\">\n      <summary>\n        <para>Increment the update counter.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Texture.SetGlobalAnisotropicFilteringLimits(System.Int32,System.Int32)\">\n      <summary>\n        <para>Sets Anisotropic limits.</para>\n      </summary>\n      <param name=\"forcedMin\"></param>\n      <param name=\"globalMax\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture.SetStreamingTextureMaterialDebugProperties\">\n      <summary>\n        <para>Uploads additional debug information to materials using textures set to stream mip maps.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Texture2D\">\n      <summary>\n        <para>Class for texture handling.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture2D.alphaIsTransparency\">\n      <summary>\n        <para>Indicates whether this texture was imported with TextureImporter.alphaIsTransparency enabled. This setting is available only in the Editor scripts. Note that changing this setting will have no effect; it must be enabled in TextureImporter instead.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture2D.blackTexture\">\n      <summary>\n        <para>Get a small texture with all black pixels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture2D.desiredMipmapLevel\">\n      <summary>\n        <para>The mipmap level which would have been loaded by the streaming system before memory budgets are applied.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture2D.format\">\n      <summary>\n        <para>The format of the pixel data in the texture (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture2D.loadedMipmapLevel\">\n      <summary>\n        <para>Which mipmap level is currently loaded by the streaming system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture2D.loadingMipmapLevel\">\n      <summary>\n        <para>Which mipmap level is in the process of being loaded by the mipmap streaming system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture2D.mipmapCount\">\n      <summary>\n        <para>How many mipmap levels are in this texture (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture2D.requestedMipmapLevel\">\n      <summary>\n        <para>The mipmap level to load.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture2D.streamingMipmaps\">\n      <summary>\n        <para>Has mipmap streaming been enabled for this texture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture2D.streamingMipmapsPriority\">\n      <summary>\n        <para>Relative priority for this texture when reducing memory size in order to hit the memory budget.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture2D.whiteTexture\">\n      <summary>\n        <para>Get a small texture with all white pixels.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.Apply(System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Actually apply all previous SetPixel and SetPixels changes.</para>\n      </summary>\n      <param name=\"updateMipmaps\">When set to true, mipmap levels are recalculated.</param>\n      <param name=\"makeNoLongerReadable\">When set to true, system memory copy of a texture is released.</param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.ClearRequestedMipmapLevel\">\n      <summary>\n        <para>Resets the requestedMipmapLevel field.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.Compress(System.Boolean)\">\n      <summary>\n        <para>Compress texture into DXT format.</para>\n      </summary>\n      <param name=\"highQuality\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.CreateExternalTexture(System.Int32,System.Int32,UnityEngine.TextureFormat,System.Boolean,System.Boolean,System.IntPtr)\">\n      <summary>\n        <para>Creates Unity Texture out of externally created native texture object.</para>\n      </summary>\n      <param name=\"nativeTex\">Native 2D texture object.</param>\n      <param name=\"width\">Width of texture in pixels.</param>\n      <param name=\"height\">Height of texture in pixels.</param>\n      <param name=\"format\">Format of underlying texture object.</param>\n      <param name=\"mipmap\">Does the texture have mipmaps?</param>\n      <param name=\"linear\">Is texture using linear color space?</param>\n      <param name=\"mipChain\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.#ctor(System.Int32,System.Int32)\">\n      <summary>\n        <para>Create a new empty texture.</para>\n      </summary>\n      <param name=\"width\"></param>\n      <param name=\"height\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.#ctor(System.Int32,System.Int32,UnityEngine.TextureFormat,System.Boolean)\">\n      <summary>\n        <para>Create a new empty texture.</para>\n      </summary>\n      <param name=\"width\"></param>\n      <param name=\"height\"></param>\n      <param name=\"textureFormat\"></param>\n      <param name=\"mipChain\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.#ctor(System.Int32,System.Int32,UnityEngine.TextureFormat,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Create a new empty texture.</para>\n      </summary>\n      <param name=\"width\"></param>\n      <param name=\"height\"></param>\n      <param name=\"textureFormat\"></param>\n      <param name=\"mipChain\"></param>\n      <param name=\"linear\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Texture2D.EXRFlags\">\n      <summary>\n        <para>Flags used to control the encoding to an EXR file.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Texture2D.EXRFlags.CompressPIZ\">\n      <summary>\n        <para>This texture will use Wavelet compression. This is best used for grainy images.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Texture2D.EXRFlags.CompressRLE\">\n      <summary>\n        <para>The texture will use RLE (Run Length Encoding) EXR compression format (similar to Targa RLE compression).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Texture2D.EXRFlags.CompressZIP\">\n      <summary>\n        <para>The texture will use the EXR ZIP compression format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Texture2D.EXRFlags.None\">\n      <summary>\n        <para>No flag. This will result in an uncompressed 16-bit float EXR file.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Texture2D.EXRFlags.OutputAsFloat\">\n      <summary>\n        <para>The texture will be exported as a 32-bit float EXR file (default is 16-bit).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.GenerateAtlas\">\n      <summary>\n        <para>Packs a set of rectangles into a square atlas, with optional padding between rectangles.</para>\n      </summary>\n      <param name=\"sizes\">An array of rectangle dimensions.</param>\n      <param name=\"padding\">Amount of padding to insert between adjacent rectangles in the atlas.</param>\n      <param name=\"atlasSize\">The size of the atlas.</param>\n      <returns>\n        <para>If the function succeeds, this will contain the packed rectangles.  Otherwise, the return value is null.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.GetPixel(System.Int32,System.Int32)\">\n      <summary>\n        <para>Returns pixel color at coordinates (x, y).</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.GetPixelBilinear(System.Single,System.Single)\">\n      <summary>\n        <para>Returns filtered pixel color at normalized coordinates (u, v).</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.GetPixels(System.Int32)\">\n      <summary>\n        <para>Get the pixel colors from the texture.</para>\n      </summary>\n      <param name=\"miplevel\">The mipmap level to fetch the pixels from. Defaults to zero.</param>\n      <returns>\n        <para>The array of all pixels in the mipmap level of the texture.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.GetPixels(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Get a block of pixel colors.</para>\n      </summary>\n      <param name=\"x\">The x position of the pixel array to fetch.</param>\n      <param name=\"y\">The y position of the pixel array to fetch.</param>\n      <param name=\"blockWidth\">The width length of the pixel array to fetch.</param>\n      <param name=\"blockHeight\">The height length of the pixel array to fetch.</param>\n      <param name=\"miplevel\">The mipmap level to fetch the pixels. Defaults to zero, and is\n        optional.</param>\n      <returns>\n        <para>The array of pixels in the texture that have been selected.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.GetPixels32(System.Int32)\">\n      <summary>\n        <para>Get a block of pixel colors in Color32 format.</para>\n      </summary>\n      <param name=\"miplevel\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.GetRawTextureData\">\n      <summary>\n        <para>Get raw data from a texture for reading or writing.</para>\n      </summary>\n      <returns>\n        <para>Raw texture data view.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.GetRawTextureData\">\n      <summary>\n        <para>Get raw data from a texture.</para>\n      </summary>\n      <returns>\n        <para>Raw texture data as a byte array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.IsRequestedMipmapLevelLoaded\">\n      <summary>\n        <para>Has the mipmap level requested by setting requestedMipmapLevel finished loading?</para>\n      </summary>\n      <returns>\n        <para>True if the mipmap level requested by setting requestedMipmapLevel has finished loading.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.LoadRawTextureData(System.Byte[])\">\n      <summary>\n        <para>Fills texture pixels with raw preformatted data.</para>\n      </summary>\n      <param name=\"data\">Raw data array to initialize texture pixels with.</param>\n      <param name=\"size\">Size of data in bytes.</param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.LoadRawTextureData(Unity.Collections.NativeArray`1&lt;T&gt;)\">\n      <summary>\n        <para>Fills texture pixels with raw preformatted data.</para>\n      </summary>\n      <param name=\"data\">Raw data array to initialize texture pixels with.</param>\n      <param name=\"size\">Size of data in bytes.</param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.LoadRawTextureData(System.IntPtr,System.Int32)\">\n      <summary>\n        <para>Fills texture pixels with raw preformatted data.</para>\n      </summary>\n      <param name=\"data\">Raw data array to initialize texture pixels with.</param>\n      <param name=\"size\">Size of data in bytes.</param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.PackTextures(UnityEngine.Texture2D[],System.Int32,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Packs multiple Textures into a texture atlas.</para>\n      </summary>\n      <param name=\"textures\">Array of textures to pack into the atlas.</param>\n      <param name=\"padding\">Padding in pixels between the packed textures.</param>\n      <param name=\"maximumAtlasSize\">Maximum size of the resulting texture.</param>\n      <param name=\"makeNoLongerReadable\">Should the texture be marked as no longer readable?</param>\n      <returns>\n        <para>An array of rectangles containing the UV coordinates in the atlas for each input texture, or null if packing fails.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.ReadPixels(UnityEngine.Rect,System.Int32,System.Int32,System.Boolean)\">\n      <summary>\n        <para>Read pixels from screen into the saved texture data.</para>\n      </summary>\n      <param name=\"source\">Rectangular region of the view to read from. Pixels are read from current render target.</param>\n      <param name=\"destX\">Horizontal pixel position in the texture to place the pixels that are read.</param>\n      <param name=\"destY\">Vertical pixel position in the texture to place the pixels that are read.</param>\n      <param name=\"recalculateMipMaps\">Should the texture's mipmaps be recalculated after reading?</param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.Resize(System.Int32,System.Int32,UnityEngine.TextureFormat,System.Boolean)\">\n      <summary>\n        <para>Resizes the texture.</para>\n      </summary>\n      <param name=\"width\"></param>\n      <param name=\"height\"></param>\n      <param name=\"format\"></param>\n      <param name=\"hasMipMap\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.Resize(System.Int32,System.Int32)\">\n      <summary>\n        <para>Resizes the texture.</para>\n      </summary>\n      <param name=\"width\"></param>\n      <param name=\"height\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.SetPixel(System.Int32,System.Int32,UnityEngine.Color)\">\n      <summary>\n        <para>Sets pixel color at coordinates (x,y).</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"color\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.SetPixels(UnityEngine.Color[],System.Int32)\">\n      <summary>\n        <para>Set a block of pixel colors.</para>\n      </summary>\n      <param name=\"colors\">The array of pixel colours to assign (a 2D image flattened to a 1D array).</param>\n      <param name=\"miplevel\">The mip level of the texture to write to.</param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.SetPixels(System.Int32,System.Int32,System.Int32,System.Int32,UnityEngine.Color[],System.Int32)\">\n      <summary>\n        <para>Set a block of pixel colors.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"blockWidth\"></param>\n      <param name=\"blockHeight\"></param>\n      <param name=\"colors\"></param>\n      <param name=\"miplevel\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.SetPixels32(UnityEngine.Color32[],System.Int32)\">\n      <summary>\n        <para>Set a block of pixel colors.</para>\n      </summary>\n      <param name=\"colors\"></param>\n      <param name=\"miplevel\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.SetPixels32(System.Int32,System.Int32,System.Int32,System.Int32,UnityEngine.Color32[],System.Int32)\">\n      <summary>\n        <para>Set a block of pixel colors.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"blockWidth\"></param>\n      <param name=\"blockHeight\"></param>\n      <param name=\"colors\"></param>\n      <param name=\"miplevel\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2D.UpdateExternalTexture(System.IntPtr)\">\n      <summary>\n        <para>Updates Unity texture to use different native texture object.</para>\n      </summary>\n      <param name=\"nativeTex\">Native 2D texture object.</param>\n    </member>\n    <member name=\"T:UnityEngine.Texture2DArray\">\n      <summary>\n        <para>Class for handling 2D texture arrays.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture2DArray.depth\">\n      <summary>\n        <para>Number of elements in a texture array (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture2DArray.format\">\n      <summary>\n        <para>Texture format (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Texture2DArray.Apply(System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Actually apply all previous SetPixels changes.</para>\n      </summary>\n      <param name=\"updateMipmaps\">When set to true, mipmap levels are recalculated.</param>\n      <param name=\"makeNoLongerReadable\">When set to true, system memory copy of a texture is released.</param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2DArray.#ctor(System.Int32,System.Int32,System.Int32,UnityEngine.TextureFormat,System.Boolean)\">\n      <summary>\n        <para>Create a new texture array.</para>\n      </summary>\n      <param name=\"width\">Width of texture array in pixels.</param>\n      <param name=\"height\">Height of texture array in pixels.</param>\n      <param name=\"depth\">Number of elements in the texture array.</param>\n      <param name=\"format\">Format of the texture.</param>\n      <param name=\"mipmap\">Should mipmaps be created?</param>\n      <param name=\"linear\">Does the texture contain non-color data (i.e. don't do any color space conversions when sampling)? Default is false.</param>\n      <param name=\"textureFormat\"></param>\n      <param name=\"mipChain\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2DArray.#ctor(System.Int32,System.Int32,System.Int32,UnityEngine.TextureFormat,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Create a new texture array.</para>\n      </summary>\n      <param name=\"width\">Width of texture array in pixels.</param>\n      <param name=\"height\">Height of texture array in pixels.</param>\n      <param name=\"depth\">Number of elements in the texture array.</param>\n      <param name=\"format\">Format of the texture.</param>\n      <param name=\"mipmap\">Should mipmaps be created?</param>\n      <param name=\"linear\">Does the texture contain non-color data (i.e. don't do any color space conversions when sampling)? Default is false.</param>\n      <param name=\"textureFormat\"></param>\n      <param name=\"mipChain\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2DArray.GetPixels(System.Int32,System.Int32)\">\n      <summary>\n        <para>Returns pixel colors of a single array slice.</para>\n      </summary>\n      <param name=\"arrayElement\">Array slice to read pixels from.</param>\n      <param name=\"miplevel\">Mipmap level to read pixels from.</param>\n      <returns>\n        <para>Array of pixel colors.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Texture2DArray.GetPixels32(System.Int32,System.Int32)\">\n      <summary>\n        <para>Returns pixel colors of a single array slice.</para>\n      </summary>\n      <param name=\"arrayElement\">Array slice to read pixels from.</param>\n      <param name=\"miplevel\">Mipmap level to read pixels from.</param>\n      <returns>\n        <para>Array of pixel colors in low precision (8 bits/channel) format.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Texture2DArray.SetPixels(UnityEngine.Color[],System.Int32,System.Int32)\">\n      <summary>\n        <para>Set pixel colors for the whole mip level.</para>\n      </summary>\n      <param name=\"colors\">An array of pixel colors.</param>\n      <param name=\"arrayElement\">The texture array element index.</param>\n      <param name=\"miplevel\">The mip level.</param>\n    </member>\n    <member name=\"M:UnityEngine.Texture2DArray.SetPixels32(UnityEngine.Color32[],System.Int32,System.Int32)\">\n      <summary>\n        <para>Set pixel colors for the whole mip level.</para>\n      </summary>\n      <param name=\"colors\">An array of pixel colors.</param>\n      <param name=\"arrayElement\">The texture array element index.</param>\n      <param name=\"miplevel\">The mip level.</param>\n    </member>\n    <member name=\"T:UnityEngine.Texture3D\">\n      <summary>\n        <para>Class for handling 3D Textures, Use this to create.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture3D.depth\">\n      <summary>\n        <para>The depth of the texture (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Texture3D.format\">\n      <summary>\n        <para>The format of the pixel data in the texture (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Texture3D.Apply(System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Actually apply all previous SetPixels changes.</para>\n      </summary>\n      <param name=\"updateMipmaps\">When set to true, mipmap levels are recalculated.</param>\n      <param name=\"makeNoLongerReadable\">When set to true, system memory copy of a texture is released.</param>\n    </member>\n    <member name=\"M:UnityEngine.Texture3D.#ctor(System.Int32,System.Int32,System.Int32,UnityEngine.TextureFormat,System.Boolean)\">\n      <summary>\n        <para>Create a new empty 3D Texture.</para>\n      </summary>\n      <param name=\"width\">Width of texture in pixels.</param>\n      <param name=\"height\">Height of texture in pixels.</param>\n      <param name=\"depth\">Depth of texture in pixels.</param>\n      <param name=\"format\">Texture data format.</param>\n      <param name=\"mipmap\">Should the texture have mipmaps?</param>\n      <param name=\"textureFormat\"></param>\n      <param name=\"mipChain\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture3D.GetPixels(System.Int32)\">\n      <summary>\n        <para>Returns an array of pixel colors representing one mip level of the 3D texture.</para>\n      </summary>\n      <param name=\"miplevel\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture3D.GetPixels32(System.Int32)\">\n      <summary>\n        <para>Returns an array of pixel colors representing one mip level of the 3D texture.</para>\n      </summary>\n      <param name=\"miplevel\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Texture3D.SetPixels(UnityEngine.Color[],System.Int32)\">\n      <summary>\n        <para>Sets pixel colors of a 3D texture.</para>\n      </summary>\n      <param name=\"colors\">The colors to set the pixels to.</param>\n      <param name=\"miplevel\">The mipmap level to be affected by the new colors.</param>\n    </member>\n    <member name=\"M:UnityEngine.Texture3D.SetPixels32(UnityEngine.Color32[],System.Int32)\">\n      <summary>\n        <para>Sets pixel colors of a 3D texture.</para>\n      </summary>\n      <param name=\"colors\">The colors to set the pixels to.</param>\n      <param name=\"miplevel\">The mipmap level to be affected by the new colors.</param>\n    </member>\n    <member name=\"T:UnityEngine.TextureCompressionQuality\">\n      <summary>\n        <para>Compression Quality.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureCompressionQuality.Best\">\n      <summary>\n        <para>Best compression.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureCompressionQuality.Fast\">\n      <summary>\n        <para>Fast compression.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureCompressionQuality.Normal\">\n      <summary>\n        <para>Normal compression (default).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TextureFormat\">\n      <summary>\n        <para>Format used when creating textures from scripts.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.Alpha8\">\n      <summary>\n        <para>Alpha-only texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ARGB32\">\n      <summary>\n        <para>Color with alpha texture format, 8-bits per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ARGB4444\">\n      <summary>\n        <para>A 16 bits/pixel texture format. Texture stores color with an alpha channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ASTC_RGB_10x10\">\n      <summary>\n        <para>ASTC (10x10 pixel block in 128 bits) compressed RGB texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ASTC_RGB_12x12\">\n      <summary>\n        <para>ASTC (12x12 pixel block in 128 bits) compressed RGB texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ASTC_RGB_4x4\">\n      <summary>\n        <para>ASTC (4x4 pixel block in 128 bits) compressed RGB texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ASTC_RGB_5x5\">\n      <summary>\n        <para>ASTC (5x5 pixel block in 128 bits) compressed RGB texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ASTC_RGB_6x6\">\n      <summary>\n        <para>ASTC (6x6 pixel block in 128 bits) compressed RGB texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ASTC_RGB_8x8\">\n      <summary>\n        <para>ASTC (8x8 pixel block in 128 bits) compressed RGB texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ASTC_RGBA_10x10\">\n      <summary>\n        <para>ASTC (10x10 pixel block in 128 bits) compressed RGBA texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ASTC_RGBA_12x12\">\n      <summary>\n        <para>ASTC (12x12 pixel block in 128 bits) compressed RGBA texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ASTC_RGBA_4x4\">\n      <summary>\n        <para>ASTC (4x4 pixel block in 128 bits) compressed RGBA texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ASTC_RGBA_5x5\">\n      <summary>\n        <para>ASTC (5x5 pixel block in 128 bits) compressed RGBA texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ASTC_RGBA_6x6\">\n      <summary>\n        <para>ASTC (6x6 pixel block in 128 bits) compressed RGBA texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ASTC_RGBA_8x8\">\n      <summary>\n        <para>ASTC (8x8 pixel block in 128 bits) compressed RGBA texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.BC4\">\n      <summary>\n        <para>Compressed one channel (R) texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.BC5\">\n      <summary>\n        <para>Compressed two-channel (RG) texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.BC6H\">\n      <summary>\n        <para>HDR compressed color texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.BC7\">\n      <summary>\n        <para>High quality compressed color texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.BGRA32\">\n      <summary>\n        <para>Color with alpha texture format, 8-bits per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.DXT1\">\n      <summary>\n        <para>Compressed color texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.DXT1Crunched\">\n      <summary>\n        <para>Compressed color texture format with Crunch compression for smaller storage sizes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.DXT5\">\n      <summary>\n        <para>Compressed color with alpha channel texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.DXT5Crunched\">\n      <summary>\n        <para>Compressed color with alpha channel texture format with Crunch compression for smaller storage sizes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.EAC_R\">\n      <summary>\n        <para>ETC2  EAC (GL ES 3.0) 4 bitspixel compressed unsigned single-channel texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.EAC_R_SIGNED\">\n      <summary>\n        <para>ETC2  EAC (GL ES 3.0) 4 bitspixel compressed signed single-channel texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.EAC_RG\">\n      <summary>\n        <para>ETC2  EAC (GL ES 3.0) 8 bitspixel compressed unsigned dual-channel (RG) texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.EAC_RG_SIGNED\">\n      <summary>\n        <para>ETC2  EAC (GL ES 3.0) 8 bitspixel compressed signed dual-channel (RG) texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ETC_RGB4\">\n      <summary>\n        <para>ETC (GLES2.0) 4 bits/pixel compressed RGB texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ETC_RGB4_3DS\">\n      <summary>\n        <para>ETC 4 bits/pixel compressed RGB texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ETC_RGB4Crunched\">\n      <summary>\n        <para>Compressed color texture format with Crunch compression for smaller storage sizes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ETC_RGBA8_3DS\">\n      <summary>\n        <para>ETC 4 bitspixel RGB + 4 bitspixel Alpha compressed texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ETC2_RGB\">\n      <summary>\n        <para>ETC2 (GL ES 3.0) 4 bits/pixel compressed RGB texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ETC2_RGBA1\">\n      <summary>\n        <para>ETC2 (GL ES 3.0) 4 bits/pixel RGB+1-bit alpha texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ETC2_RGBA8\">\n      <summary>\n        <para>ETC2 (GL ES 3.0) 8 bits/pixel compressed RGBA texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.ETC2_RGBA8Crunched\">\n      <summary>\n        <para>Compressed color with alpha channel texture format using Crunch compression for smaller storage sizes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.PVRTC_RGB2\">\n      <summary>\n        <para>PowerVR (iOS) 2 bits/pixel compressed color texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.PVRTC_RGB4\">\n      <summary>\n        <para>PowerVR (iOS) 4 bits/pixel compressed color texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.PVRTC_RGBA2\">\n      <summary>\n        <para>PowerVR (iOS) 2 bits/pixel compressed with alpha channel texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.PVRTC_RGBA4\">\n      <summary>\n        <para>PowerVR (iOS) 4 bits/pixel compressed with alpha channel texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.R16\">\n      <summary>\n        <para>A 16 bit color texture format that only has a red channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.R8\">\n      <summary>\n        <para>Scalar (R) render texture format, 8 bit fixed point.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.RFloat\">\n      <summary>\n        <para>Scalar (R) texture format, 32 bit floating point.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.RG16\">\n      <summary>\n        <para>Two color (RG) texture format, 8-bits per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.RGB24\">\n      <summary>\n        <para>Color texture format, 8-bits per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.RGB565\">\n      <summary>\n        <para>A 16 bit color texture format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.RGB9e5Float\">\n      <summary>\n        <para>RGB HDR format, with 9 bit mantissa per channel and a 5 bit shared exponent.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.RGBA32\">\n      <summary>\n        <para>Color with alpha texture format, 8-bits per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.RGBA4444\">\n      <summary>\n        <para>Color and alpha  texture format, 4 bit per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.RGBAFloat\">\n      <summary>\n        <para>RGB color and alpha texture format,  32-bit floats per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.RGBAHalf\">\n      <summary>\n        <para>RGB color and alpha texture format, 16 bit floating point per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.RGFloat\">\n      <summary>\n        <para>Two color (RG)  texture format, 32 bit floating point per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.RGHalf\">\n      <summary>\n        <para>Two color (RG)  texture format, 16 bit floating point per channel.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.RHalf\">\n      <summary>\n        <para>Scalar (R)  texture format, 16 bit floating point.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureFormat.YUY2\">\n      <summary>\n        <para>A format that uses the YUV color space and is often used for video encoding or playback.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TextureWrapMode\">\n      <summary>\n        <para>Wrap mode for textures.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureWrapMode.Clamp\">\n      <summary>\n        <para>Clamps the texture to the last pixel at the edge.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureWrapMode.Mirror\">\n      <summary>\n        <para>Tiles the texture, creating a repeating pattern by mirroring it at every integer boundary.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureWrapMode.MirrorOnce\">\n      <summary>\n        <para>Mirrors the texture once, then clamps to edge pixels.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TextureWrapMode.Repeat\">\n      <summary>\n        <para>Tiles the texture, creating a repeating pattern.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.ThreadPriority\">\n      <summary>\n        <para>Priority of a thread.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ThreadPriority.BelowNormal\">\n      <summary>\n        <para>Below normal thread priority.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ThreadPriority.High\">\n      <summary>\n        <para>Highest thread priority.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ThreadPriority.Low\">\n      <summary>\n        <para>Lowest thread priority.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.ThreadPriority.Normal\">\n      <summary>\n        <para>Normal thread priority.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Tilemaps.ITilemap\">\n      <summary>\n        <para>Class passed onto when information is queried from the tiles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.ITilemap.cellBounds\">\n      <summary>\n        <para>Returns the boundaries of the Tilemap in cell size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.ITilemap.localBounds\">\n      <summary>\n        <para>Returns the boundaries of the Tilemap in local space size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.ITilemap.origin\">\n      <summary>\n        <para>The origin of the Tilemap in cell position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.ITilemap.size\">\n      <summary>\n        <para>The size of the Tilemap in cells.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.ITilemap.GetColor(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the color of a.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <returns>\n        <para>Color of the at the XY coordinate.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.ITilemap.GetComponent\">\n      <summary>\n        <para>Returns the component of type T if the GameObject of the tile map has one attached, null if it doesn't.</para>\n      </summary>\n      <returns>\n        <para>The Component of type T to retrieve.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.ITilemap.GetSprite(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <returns>\n        <para>Sprite at the XY coordinate.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.ITilemap.GetTile(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <returns>\n        <para> placed at the cell.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.ITilemap.GetTile(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <returns>\n        <para> placed at the cell.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.ITilemap.GetTileFlags(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the TileFlags of the Tile at the given position.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <returns>\n        <para>TileFlags from the Tile.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.ITilemap.GetTransformMatrix(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the transform matrix of a.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <returns>\n        <para>The transform matrix.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.ITilemap.RefreshTile(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Refreshes a.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n    </member>\n    <member name=\"T:UnityEngine.Tilemaps.Tile\">\n      <summary>\n        <para>Class for a default tile in the Tilemap.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.Tile.color\">\n      <summary>\n        <para>Color of the Tile.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.Tile.flags\">\n      <summary>\n        <para>TileFlags of the Tile.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.Tile.gameObject\">\n      <summary>\n        <para>GameObject of the Tile.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.Tile.sprite\">\n      <summary>\n        <para>Sprite to be rendered at the Tile.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.Tile.transform\">\n      <summary>\n        <para>Matrix4x4|Transform matrix of the Tile.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Tilemaps.Tile.ColliderType\">\n      <summary>\n        <para>Enum for determining what collider shape is generated for this Tile by the TilemapCollider2D.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.Tile.ColliderType.Grid\">\n      <summary>\n        <para>The grid layout boundary outline is used as the collider shape for the Tile by the TilemapCollider2D.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.Tile.ColliderType.None\">\n      <summary>\n        <para>No collider shape is generated for the Tile by the TilemapCollider2D.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.Tile.ColliderType.Sprite\">\n      <summary>\n        <para>The Sprite outline is used as the collider shape for the Tile by the TilemapCollider2D.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tile.GetTileData(UnityEngine.Vector3Int,UnityEngine.Tilemaps.ITilemap,UnityEngine.Tilemaps.TileData&amp;)\">\n      <summary>\n        <para>Retrieves the tile rendering data for the Tile.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <param name=\"tilemap\">The Tilemap the tile is present on.</param>\n      <param name=\"tileData\">Data to render the tile. This is filled with Tile, Tile.color and Tile.transform.</param>\n      <returns>\n        <para>Whether the call was successful. This returns true for Tile.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Tilemaps.TileAnimationData\">\n      <summary>\n        <para>A Struct for the required data for animating a Tile.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.TileAnimationData.animatedSprites\">\n      <summary>\n        <para>The array of that are ordered by appearance in the animation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.TileAnimationData.animationSpeed\">\n      <summary>\n        <para>The animation speed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.TileAnimationData.animationStartTime\">\n      <summary>\n        <para>The start time of the animation. The animation will begin at this time offset.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Tilemaps.TileBase\">\n      <summary>\n        <para>Base class for a tile in the Tilemap.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.TileBase.GetTileAnimationData(UnityEngine.Vector3Int,UnityEngine.Tilemaps.ITilemap,UnityEngine.Tilemaps.TileAnimationData&amp;)\">\n      <summary>\n        <para>Retrieves any tile animation data from the scripted tile.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <param name=\"tilemap\">The Tilemap the tile is present on.</param>\n      <param name=\"tileAnimationData\">Data to run an animation on the tile.</param>\n      <returns>\n        <para>Whether the call was successful.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.TileBase.GetTileData(UnityEngine.Vector3Int,UnityEngine.Tilemaps.ITilemap,UnityEngine.Tilemaps.TileData&amp;)\">\n      <summary>\n        <para>Retrieves any tile rendering data from the scripted tile.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <param name=\"tilemap\">The Tilemap the tile is present on.</param>\n      <param name=\"tileData\">Data to render the tile.</param>\n      <returns>\n        <para>Whether the call was successful.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.TileBase.RefreshTile(UnityEngine.Vector3Int,UnityEngine.Tilemaps.ITilemap)\">\n      <summary>\n        <para>This method is called when the tile is refreshed.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <param name=\"tilemap\">The Tilemap the tile is present on.</param>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.TileBase.StartUp(UnityEngine.Vector3Int,UnityEngine.Tilemaps.ITilemap,UnityEngine.GameObject)\">\n      <summary>\n        <para>StartUp is called on the first frame of the running scene.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <param name=\"tilemap\">The Tilemap the tile is present on.</param>\n      <param name=\"go\">The GameObject instantiated for the Tile.</param>\n      <returns>\n        <para>Whether the call was successful.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Tilemaps.TileData\">\n      <summary>\n        <para>A Struct for the required data for rendering a Tile.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.TileData.color\">\n      <summary>\n        <para>Color of the Tile.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.TileData.flags\">\n      <summary>\n        <para>TileFlags of the Tile.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.TileData.gameObject\">\n      <summary>\n        <para>GameObject of the Tile.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.TileData.sprite\">\n      <summary>\n        <para>Sprite to be rendered at the Tile.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.TileData.transform\">\n      <summary>\n        <para>Matrix4x4|Transform matrix of the Tile.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Tilemaps.TileFlags\">\n      <summary>\n        <para>Flags controlling behavior for the TileBase.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.TileFlags.InstantiateGameObjectRuntimeOnly\">\n      <summary>\n        <para>TileBase does not instantiate its associated GameObject in editor mode and instantiates it only during play mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.TileFlags.LockAll\">\n      <summary>\n        <para>All lock flags.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.TileFlags.LockColor\">\n      <summary>\n        <para>TileBase locks any color set by brushes or the user.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.TileFlags.LockTransform\">\n      <summary>\n        <para>TileBase locks any transform matrix set by brushes or the user.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.TileFlags.None\">\n      <summary>\n        <para>No TileFlags are set.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Tilemaps.Tilemap\">\n      <summary>\n        <para>The tile map stores component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.Tilemap.animationFrameRate\">\n      <summary>\n        <para>The frame rate for all tile animations in the tile map.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.Tilemap.cellBounds\">\n      <summary>\n        <para>Returns the boundaries of the Tilemap in cell size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.Tilemap.color\">\n      <summary>\n        <para>The color of the tile map layer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.Tilemap.editorPreviewOrigin\">\n      <summary>\n        <para>The origin of the Tilemap in cell position inclusive of editor preview tiles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.Tilemap.editorPreviewSize\">\n      <summary>\n        <para>The size of the Tilemap in cells inclusive of editor preview tiles.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.Tilemap.layoutGrid\">\n      <summary>\n        <para>Gets the Grid associated with this tile map.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.Tilemap.layoutGrid\">\n      <summary>\n        <para>Gets the Grid associated with this tile map.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.Tilemap.localBounds\">\n      <summary>\n        <para>Returns the boundaries of the Tilemap in local space size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.Tilemap.orientation\">\n      <summary>\n        <para>Orientation of the tiles in the Tilemap.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.Tilemap.orientationMatrix\">\n      <summary>\n        <para>Orientation Matrix of the orientation of the tiles in the Tilemap.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.Tilemap.origin\">\n      <summary>\n        <para>The origin of the Tilemap in cell position.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.Tilemap.size\">\n      <summary>\n        <para>The size of the Tilemap in cells.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.Tilemap.tileAnchor\">\n      <summary>\n        <para>Gets the anchor point of tiles in the Tilemap.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.AddTileFlags(UnityEngine.Vector3Int,UnityEngine.Tilemaps.TileFlags)\">\n      <summary>\n        <para>Adds the TileFlags onto the Tile at the given position.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <param name=\"flags\">TileFlags to add (with bitwise or) onto the flags provided by Tile.TileBase.</param>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.BoxFill(UnityEngine.Vector3Int,UnityEngine.Tilemaps.TileBase,System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Does a box fill with the given. Starts from given coordinates and fills the limits from start to end (inclusive).</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <param name=\"tile\"> to place.</param>\n      <param name=\"startX\">The minimum X coordinate limit to fill to.</param>\n      <param name=\"startY\">The minimum Y coordinate limit to fill to.</param>\n      <param name=\"endX\">The maximum X coordinate limit to fill to.</param>\n      <param name=\"endY\">The maximum Y coordinate limit to fill to.</param>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.ClearAllEditorPreviewTiles\">\n      <summary>\n        <para>Clears all editor preview tiles that are placed in the Tilemap.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.ClearAllTiles\">\n      <summary>\n        <para>Clears all tiles that are placed in the Tilemap.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.CompressBounds\">\n      <summary>\n        <para>Compresses the origin and size of the Tilemap to bounds where tiles exist.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.ContainsTile(UnityEngine.Tilemaps.TileBase)\">\n      <summary>\n        <para>Returns true if the Tilemap contains the given. Returns false if not.</para>\n      </summary>\n      <param name=\"tileAsset\">Tile to check.</param>\n      <returns>\n        <para>Whether the Tilemap contains the tile.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.EditorPreviewBoxFill(UnityEngine.Vector3Int,UnityEngine.Object,System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Does an editor preview of a box fill with the given. Starts from given coordinates and fills the limits from start to end (inclusive).</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <param name=\"tile\"> to place.</param>\n      <param name=\"startX\">The start X coordinate limit to fill to.</param>\n      <param name=\"startY\">The start Y coordinate limit to fill to.</param>\n      <param name=\"endX\">The ending X coordinate limit to fill to.</param>\n      <param name=\"endY\">The ending Y coordinate limit to fill to.</param>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.EditorPreviewFloodFill(UnityEngine.Vector3Int,UnityEngine.Tilemaps.TileBase)\">\n      <summary>\n        <para>Does an editor preview of a flood fill with the given starting from the given coordinates.</para>\n      </summary>\n      <param name=\"position\">Start position of the flood fill on the Tilemap.</param>\n      <param name=\"tile\">TileBase to place.</param>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.FloodFill(UnityEngine.Vector3Int,UnityEngine.Tilemaps.TileBase)\">\n      <summary>\n        <para>Does a flood fill with the given starting from the given coordinates.</para>\n      </summary>\n      <param name=\"position\">Start position of the flood fill on the Tilemap.</param>\n      <param name=\"tile\"> to place.</param>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetCellCenterLocal(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Get the logical center coordinate of a grid cell in local space.</para>\n      </summary>\n      <param name=\"position\">Grid cell position.</param>\n      <returns>\n        <para>Center of the cell transformed into local space coordinates.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetCellCenterWorld(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Get the logical center coordinate of a grid cell in world space.</para>\n      </summary>\n      <param name=\"position\">Grid cell position.</param>\n      <returns>\n        <para>Center of the cell transformed into world space coordinates.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetColliderType(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the collider type of a.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <returns>\n        <para>Collider type of the at the XY coordinate.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetColor(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the color of a.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <returns>\n        <para>Color of the at the XY coordinate.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetEditorPreviewColor(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the Color of an editor preview.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <returns>\n        <para>Color of the editor preview at the XY coordinate.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetEditorPreviewSprite(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the.</para>\n      </summary>\n      <param name=\"position\">Position of the editor preview Tile on the Tilemap.</param>\n      <returns>\n        <para>Sprite at the XY coordinate.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetEditorPreviewTile(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the editor preview.</para>\n      </summary>\n      <param name=\"position\">Position of the editor preview Tile on the Tilemap.</param>\n      <returns>\n        <para>The editor preview placed at the cell.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetEditorPreviewTile(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the editor preview.</para>\n      </summary>\n      <param name=\"position\">Position of the editor preview Tile on the Tilemap.</param>\n      <returns>\n        <para>The editor preview placed at the cell.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetEditorPreviewTileFlags(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the TileFlags of the editor preview Tile at the given position.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <returns>\n        <para>TileFlags from the editor preview Tile.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetEditorPreviewTransformMatrix(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the transform matrix of an editor preview.</para>\n      </summary>\n      <param name=\"position\">Position of the editor preview Tile on the Tilemap.</param>\n      <returns>\n        <para>The transform matrix.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetInstantiatedObject(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <returns>\n        <para>GameObject instantiated by the Tile at the position.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetSprite(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <returns>\n        <para>Sprite at the XY coordinate.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetTile(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <returns>\n        <para>Tilemaps.TileBase placed at the cell.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetTile(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <returns>\n        <para>Tilemaps.TileBase|Tile of type T placed at the cell.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetTileFlags(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the TileFlags of the Tile at the given position.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <returns>\n        <para>TileFlags from the Tile.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetTilesBlock(UnityEngine.BoundsInt)\">\n      <summary>\n        <para>Retrieves an array of tiles with the given bounds.</para>\n      </summary>\n      <param name=\"bounds\">Bounds to retrieve from.</param>\n      <returns>\n        <para>An array of at the given bounds.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetTransformMatrix(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Gets the transform matrix of a.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <returns>\n        <para>The transform matrix.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetUsedTilesCount\">\n      <summary>\n        <para>Get the total number of different.</para>\n      </summary>\n      <returns>\n        <para>The total number of different.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.GetUsedTilesNonAlloc(UnityEngine.Tilemaps.TileBase[])\">\n      <summary>\n        <para>Fills the given array with the total number of different and returns the number of tiles filled.</para>\n      </summary>\n      <param name=\"usedTiles\">The array to be filled.</param>\n      <returns>\n        <para>The number of tiles filled.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.HasEditorPreviewTile(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Returns whether there is an editor preview tile at the position.</para>\n      </summary>\n      <param name=\"position\">Position to check.</param>\n      <returns>\n        <para>True if there is an editor preview tile at the position. False if not.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.HasTile(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Returns whether there is a tile at the position.</para>\n      </summary>\n      <param name=\"position\">Position to check.</param>\n      <returns>\n        <para>True if there is a tile at the position. False if not.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Tilemaps.Tilemap.Orientation\">\n      <summary>\n        <para>Determines the orientation of.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.Tilemap.Orientation.Custom\">\n      <summary>\n        <para>Use a custom orientation to all tiles in the tile map.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.Tilemap.Orientation.XY\">\n      <summary>\n        <para>Orients tiles in the XY plane.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.Tilemap.Orientation.XZ\">\n      <summary>\n        <para>Orients tiles in the XZ plane.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.Tilemap.Orientation.YX\">\n      <summary>\n        <para>Orients tiles in the YX plane.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.Tilemap.Orientation.YZ\">\n      <summary>\n        <para>Orients tiles in the YZ plane.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.Tilemap.Orientation.ZX\">\n      <summary>\n        <para>Orients tiles in the ZX plane.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.Tilemap.Orientation.ZY\">\n      <summary>\n        <para>Orients tiles in the ZY plane.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.RefreshAllTiles\">\n      <summary>\n        <para>Refreshes all. The tile map will retrieve the rendering data, animation data and other data for all tiles and update all relevant components.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.RefreshTile(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Refreshes a.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.RemoveTileFlags(UnityEngine.Vector3Int,UnityEngine.Tilemaps.TileFlags)\">\n      <summary>\n        <para>Removes the TileFlags onto the Tile at the given position.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <param name=\"flags\">TileFlags to remove from the Tile.</param>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.ResizeBounds\">\n      <summary>\n        <para>Resizes tiles in the Tilemap to bounds defined by origin and size.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.SetColliderType(UnityEngine.Vector3Int,UnityEngine.Tilemaps.Tile/ColliderType)\">\n      <summary>\n        <para>Sets the collider type of a.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <param name=\"colliderType\">Collider type to set the to at the XYZ coordinate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.SetColor(UnityEngine.Vector3Int,UnityEngine.Color)\">\n      <summary>\n        <para>Sets the color of a.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <param name=\"color\">Color to set the to at the XY coordinate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.SetEditorPreviewColor(UnityEngine.Vector3Int,UnityEngine.Color)\">\n      <summary>\n        <para>Sets the color of an editor preview.</para>\n      </summary>\n      <param name=\"position\">Position of the editor preview Tile on the Tilemap.</param>\n      <param name=\"color\">Color to set the editor preview to at the XY coordinate.</param>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.SetEditorPreviewTile(UnityEngine.Vector3Int,UnityEngine.Tilemaps.TileBase)\">\n      <summary>\n        <para>Sets an editor preview.</para>\n      </summary>\n      <param name=\"position\">Position of the editor preview Tile on the Tilemap.</param>\n      <param name=\"tile\">The editor preview to be placed the cell.</param>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.SetEditorPreviewTransformMatrix(UnityEngine.Vector3Int,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Sets the transform matrix of an editor preview tile given the XYZ coordinates of a cell in the.</para>\n      </summary>\n      <param name=\"position\">Position of the editor preview Tile on the Tilemap.</param>\n      <param name=\"transform\">The transform matrix.</param>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.SetTile(UnityEngine.Vector3Int,UnityEngine.Tilemaps.TileBase)\">\n      <summary>\n        <para>Sets a.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <param name=\"tile\"> to be placed the cell.</param>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.SetTileFlags(UnityEngine.Vector3Int,UnityEngine.Tilemaps.TileFlags)\">\n      <summary>\n        <para>Sets the TileFlags onto the Tile at the given position.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <param name=\"flags\">TileFlags to add onto the Tile.</param>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.SetTiles(UnityEngine.Vector3Int[],UnityEngine.Tilemaps.TileBase[])\">\n      <summary>\n        <para>Sets an array of.</para>\n      </summary>\n      <param name=\"positionArray\">An array of positions of Tiles on the Tilemap.</param>\n      <param name=\"tileArray\">An array of to be placed.</param>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.SetTilesBlock(UnityEngine.BoundsInt,UnityEngine.Tilemaps.TileBase[])\">\n      <summary>\n        <para>Fills bounds with array of tiles.</para>\n      </summary>\n      <param name=\"position\">Bounds to be filled.</param>\n      <param name=\"tileArray\">An array of to be placed.</param>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.SetTransformMatrix(UnityEngine.Vector3Int,UnityEngine.Matrix4x4)\">\n      <summary>\n        <para>Sets the transform matrix of a tile given the XYZ coordinates of a cell in the.</para>\n      </summary>\n      <param name=\"position\">Position of the Tile on the Tilemap.</param>\n      <param name=\"transform\">The transform matrix.</param>\n    </member>\n    <member name=\"M:UnityEngine.Tilemaps.Tilemap.SwapTile(UnityEngine.Tilemaps.TileBase,UnityEngine.Tilemaps.TileBase)\">\n      <summary>\n        <para>Swaps all existing tiles of changeTile to newTile and refreshes all the swapped tiles.</para>\n      </summary>\n      <param name=\"changeTile\">Tile to swap.</param>\n      <param name=\"newTile\">Tile to swap to.</param>\n    </member>\n    <member name=\"T:UnityEngine.Tilemaps.TilemapCollider2D\">\n      <summary>\n        <para>Collider for 2D physics representing shapes defined by the corresponding Tilemap.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Tilemaps.TilemapRenderer\">\n      <summary>\n        <para>The tile map renderer is used to render the tile map marked out by a component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.TilemapRenderer.chunkCullingBounds\">\n      <summary>\n        <para>Bounds used for culling of Tilemap chunks.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.TilemapRenderer.chunkSize\">\n      <summary>\n        <para>Size in number of tiles of each chunk created by the TilemapRenderer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.TilemapRenderer.detectChunkCullingBounds\">\n      <summary>\n        <para>Returns whether the TilemapRenderer automatically detects the bounds to extend chunk culling by.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.TilemapRenderer.maskInteraction\">\n      <summary>\n        <para>Specifies how the Tilemap interacts with the masks.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.TilemapRenderer.maxChunkCount\">\n      <summary>\n        <para>Maximum number of chunks the TilemapRenderer caches in memory.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.TilemapRenderer.maxFrameAge\">\n      <summary>\n        <para>Maximum number of frames the TilemapRenderer keeps unused chunks in memory.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tilemaps.TilemapRenderer.sortOrder\">\n      <summary>\n        <para>Active sort order for the TilemapRenderer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Tilemaps.TilemapRenderer.DetectChunkCullingBounds\">\n      <summary>\n        <para>Returns whether the TilemapRenderer automatically detects the bounds to extend chunk culling by.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.TilemapRenderer.DetectChunkCullingBounds.Auto\">\n      <summary>\n        <para>The TilemapRenderer will automatically detect the bounds of extension by inspecting the Sprite/s used in the Tilemap.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.TilemapRenderer.DetectChunkCullingBounds.Manual\">\n      <summary>\n        <para>The user adds in the values used for extend the bounds for culling of Tilemap chunks.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Tilemaps.TilemapRenderer.SortOrder\">\n      <summary>\n        <para>Sort order for all tiles rendered by the TilemapRenderer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.TilemapRenderer.SortOrder.BottomLeft\">\n      <summary>\n        <para>Sorts tiles for rendering starting from the tile with the lowest X and the lowest Y cell positions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.TilemapRenderer.SortOrder.BottomRight\">\n      <summary>\n        <para>Sorts tiles for rendering starting from the tile with the highest X and the lowest Y cell positions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.TilemapRenderer.SortOrder.TopLeft\">\n      <summary>\n        <para>Sorts tiles for rendering starting from the tile with the lowest X and the highest Y cell positions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Tilemaps.TilemapRenderer.SortOrder.TopRight\">\n      <summary>\n        <para>Sorts tiles for rendering starting from the tile with the highest X and the lowest Y cell positions.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Time\">\n      <summary>\n        <para>The interface to get time information from Unity.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Time.captureFramerate\">\n      <summary>\n        <para>Slows game playback time to allow screenshots to be saved between frames.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Time.deltaTime\">\n      <summary>\n        <para>The time in seconds it took to complete the last frame (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Time.fixedDeltaTime\">\n      <summary>\n        <para>The interval in seconds at which physics and other fixed frame rate updates (like MonoBehaviour's MonoBehaviour.FixedUpdate) are performed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Time.fixedTime\">\n      <summary>\n        <para>The time the latest MonoBehaviour.FixedUpdate has started (Read Only). This is the time in seconds since the start of the game.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Time.fixedUnscaledDeltaTime\">\n      <summary>\n        <para>The timeScale-independent interval in seconds from the last fixed frame to the current one (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Time.fixedUnscaledTime\">\n      <summary>\n        <para>The TimeScale-independant time the latest MonoBehaviour.FixedUpdate has started (Read Only). This is the time in seconds since the start of the game.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Time.frameCount\">\n      <summary>\n        <para>The total number of frames that have passed (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Time.inFixedTimeStep\">\n      <summary>\n        <para>Returns true if called inside a fixed time step callback (like MonoBehaviour's MonoBehaviour.FixedUpdate), otherwise returns false.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Time.maximumDeltaTime\">\n      <summary>\n        <para>The maximum time a frame can take. Physics and other fixed frame rate updates (like MonoBehaviour's MonoBehaviour.FixedUpdate).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Time.maximumParticleDeltaTime\">\n      <summary>\n        <para>The maximum time a frame can spend on particle updates. If the frame takes longer than this, then updates are split into multiple smaller updates.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Time.realtimeSinceStartup\">\n      <summary>\n        <para>The real time in seconds since the game started (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Time.smoothDeltaTime\">\n      <summary>\n        <para>A smoothed out Time.deltaTime (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Time.time\">\n      <summary>\n        <para>The time at the beginning of this frame (Read Only). This is the time in seconds since the start of the game.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Time.timeScale\">\n      <summary>\n        <para>The scale at which the time is passing. This can be used for slow motion effects.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Time.timeSinceLevelLoad\">\n      <summary>\n        <para>The time this frame has started (Read Only). This is the time in seconds since the last level has been loaded.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Time.unscaledDeltaTime\">\n      <summary>\n        <para>The timeScale-independent interval in seconds from the last frame to the current one (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Time.unscaledTime\">\n      <summary>\n        <para>The timeScale-independant time for this frame (Read Only). This is the time in seconds since the start of the game.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TooltipAttribute\">\n      <summary>\n        <para>Specify a tooltip for a field in the Inspector window.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TooltipAttribute.tooltip\">\n      <summary>\n        <para>The tooltip text.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.TooltipAttribute.#ctor(System.String)\">\n      <summary>\n        <para>Specify a tooltip for a field.</para>\n      </summary>\n      <param name=\"tooltip\">The tooltip text.</param>\n    </member>\n    <member name=\"T:UnityEngine.Touch\">\n      <summary>\n        <para>Structure describing the status of a finger touching the screen.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Touch.altitudeAngle\">\n      <summary>\n        <para>Value of 0 radians indicates that the stylus is parallel to the surface, pi/2 indicates that it is perpendicular.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Touch.azimuthAngle\">\n      <summary>\n        <para>Value of 0 radians indicates that the stylus is pointed along the x-axis of the device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Touch.deltaPosition\">\n      <summary>\n        <para>The position delta since last change.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Touch.deltaTime\">\n      <summary>\n        <para>Amount of time that has passed since the last recorded change in Touch values.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Touch.fingerId\">\n      <summary>\n        <para>The unique index for the touch.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Touch.maximumPossiblePressure\">\n      <summary>\n        <para>The maximum possible pressure value for a platform.  If Input.touchPressureSupported returns false, the value of this property will always be 1.0f.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Touch.phase\">\n      <summary>\n        <para>Describes the phase of the touch.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Touch.position\">\n      <summary>\n        <para>The position of the touch in pixel coordinates.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Touch.pressure\">\n      <summary>\n        <para>The current amount of pressure being applied to a touch.  1.0f is considered to be the pressure of an average touch.  If Input.touchPressureSupported returns false, the value of this property will always be 1.0f.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Touch.radius\">\n      <summary>\n        <para>An estimated value of the radius of a touch.  Add radiusVariance to get the maximum touch size, subtract it to get the minimum touch size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Touch.radiusVariance\">\n      <summary>\n        <para>This value determines the accuracy of the touch radius. Add this value to the radius to get the maximum touch size, subtract it to get the minimum touch size.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Touch.rawPosition\">\n      <summary>\n        <para>The raw position used for the touch.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Touch.tapCount\">\n      <summary>\n        <para>Number of taps.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Touch.type\">\n      <summary>\n        <para>A value that indicates whether a touch was of Direct, Indirect (or remote), or Stylus type.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TouchPhase\">\n      <summary>\n        <para>Describes phase of a finger touch.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchPhase.Began\">\n      <summary>\n        <para>A finger touched the screen.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchPhase.Canceled\">\n      <summary>\n        <para>The system cancelled tracking for the touch.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchPhase.Ended\">\n      <summary>\n        <para>A finger was lifted from the screen. This is the final phase of a touch.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchPhase.Moved\">\n      <summary>\n        <para>A finger moved on the screen.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchPhase.Stationary\">\n      <summary>\n        <para>A finger is touching the screen but hasn't moved.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TouchScreenKeyboard\">\n      <summary>\n        <para>Interface into the native iPhone, Android, Windows Phone and Windows Store Apps on-screen keyboards - it is not available on other platforms.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TouchScreenKeyboard.active\">\n      <summary>\n        <para>Is the keyboard visible or sliding into the position on the screen?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TouchScreenKeyboard.area\">\n      <summary>\n        <para>Returns portion of the screen which is covered by the keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TouchScreenKeyboard.canGetSelection\">\n      <summary>\n        <para>Specifies whether the TouchScreenKeyboard supports the selection property. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TouchScreenKeyboard.canSetSelection\">\n      <summary>\n        <para>Specifies whether the TouchScreenKeyboard supports the selection property. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TouchScreenKeyboard.characterLimit\">\n      <summary>\n        <para>How many characters the keyboard input field is limited to. 0 = infinite.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TouchScreenKeyboard.done\">\n      <summary>\n        <para>Specifies if input process was finished. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TouchScreenKeyboard.hideInput\">\n      <summary>\n        <para>Will text input field above the keyboard be hidden when the keyboard is on screen?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TouchScreenKeyboard.isSupported\">\n      <summary>\n        <para>Is touch screen keyboard supported.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TouchScreenKeyboard.selection\">\n      <summary>\n        <para>Gets or sets the character range of the selected text within the string currently being edited.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TouchScreenKeyboard.status\">\n      <summary>\n        <para>Returns the status of the on-screen keyboard. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TouchScreenKeyboard.targetDisplay\">\n      <summary>\n        <para>Specified on which display the software keyboard will appear.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TouchScreenKeyboard.text\">\n      <summary>\n        <para>Returns the text displayed by the input field of the keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TouchScreenKeyboard.type\">\n      <summary>\n        <para>Returns the TouchScreenKeyboardType of the keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TouchScreenKeyboard.visible\">\n      <summary>\n        <para>Returns true whenever any keyboard is completely visible on the screen.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TouchScreenKeyboard.wasCanceled\">\n      <summary>\n        <para>Specifies if input process was canceled. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.TouchScreenKeyboard.Open(System.String)\">\n      <summary>\n        <para>Opens the native keyboard provided by OS on the screen.</para>\n      </summary>\n      <param name=\"text\">Text to edit.</param>\n      <param name=\"keyboardType\">Type of keyboard (eg, any text, numbers only, etc).</param>\n      <param name=\"autocorrection\">Is autocorrection applied?</param>\n      <param name=\"multiline\">Can more than one line of text be entered?</param>\n      <param name=\"secure\">Is the text masked (for passwords, etc)?</param>\n      <param name=\"alert\">Is the keyboard opened in alert mode?</param>\n      <param name=\"textPlaceholder\">Text to be used if no other text is present.</param>\n      <param name=\"characterLimit\">How many characters the keyboard input field is limited to. 0 = infinite. (Android and iOS only)</param>\n    </member>\n    <member name=\"M:UnityEngine.TouchScreenKeyboard.Open(System.String,UnityEngine.TouchScreenKeyboardType)\">\n      <summary>\n        <para>Opens the native keyboard provided by OS on the screen.</para>\n      </summary>\n      <param name=\"text\">Text to edit.</param>\n      <param name=\"keyboardType\">Type of keyboard (eg, any text, numbers only, etc).</param>\n      <param name=\"autocorrection\">Is autocorrection applied?</param>\n      <param name=\"multiline\">Can more than one line of text be entered?</param>\n      <param name=\"secure\">Is the text masked (for passwords, etc)?</param>\n      <param name=\"alert\">Is the keyboard opened in alert mode?</param>\n      <param name=\"textPlaceholder\">Text to be used if no other text is present.</param>\n      <param name=\"characterLimit\">How many characters the keyboard input field is limited to. 0 = infinite. (Android and iOS only)</param>\n    </member>\n    <member name=\"M:UnityEngine.TouchScreenKeyboard.Open(System.String,UnityEngine.TouchScreenKeyboardType,System.Boolean)\">\n      <summary>\n        <para>Opens the native keyboard provided by OS on the screen.</para>\n      </summary>\n      <param name=\"text\">Text to edit.</param>\n      <param name=\"keyboardType\">Type of keyboard (eg, any text, numbers only, etc).</param>\n      <param name=\"autocorrection\">Is autocorrection applied?</param>\n      <param name=\"multiline\">Can more than one line of text be entered?</param>\n      <param name=\"secure\">Is the text masked (for passwords, etc)?</param>\n      <param name=\"alert\">Is the keyboard opened in alert mode?</param>\n      <param name=\"textPlaceholder\">Text to be used if no other text is present.</param>\n      <param name=\"characterLimit\">How many characters the keyboard input field is limited to. 0 = infinite. (Android and iOS only)</param>\n    </member>\n    <member name=\"M:UnityEngine.TouchScreenKeyboard.Open(System.String,UnityEngine.TouchScreenKeyboardType,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Opens the native keyboard provided by OS on the screen.</para>\n      </summary>\n      <param name=\"text\">Text to edit.</param>\n      <param name=\"keyboardType\">Type of keyboard (eg, any text, numbers only, etc).</param>\n      <param name=\"autocorrection\">Is autocorrection applied?</param>\n      <param name=\"multiline\">Can more than one line of text be entered?</param>\n      <param name=\"secure\">Is the text masked (for passwords, etc)?</param>\n      <param name=\"alert\">Is the keyboard opened in alert mode?</param>\n      <param name=\"textPlaceholder\">Text to be used if no other text is present.</param>\n      <param name=\"characterLimit\">How many characters the keyboard input field is limited to. 0 = infinite. (Android and iOS only)</param>\n    </member>\n    <member name=\"M:UnityEngine.TouchScreenKeyboard.Open(System.String,UnityEngine.TouchScreenKeyboardType,System.Boolean,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Opens the native keyboard provided by OS on the screen.</para>\n      </summary>\n      <param name=\"text\">Text to edit.</param>\n      <param name=\"keyboardType\">Type of keyboard (eg, any text, numbers only, etc).</param>\n      <param name=\"autocorrection\">Is autocorrection applied?</param>\n      <param name=\"multiline\">Can more than one line of text be entered?</param>\n      <param name=\"secure\">Is the text masked (for passwords, etc)?</param>\n      <param name=\"alert\">Is the keyboard opened in alert mode?</param>\n      <param name=\"textPlaceholder\">Text to be used if no other text is present.</param>\n      <param name=\"characterLimit\">How many characters the keyboard input field is limited to. 0 = infinite. (Android and iOS only)</param>\n    </member>\n    <member name=\"M:UnityEngine.TouchScreenKeyboard.Open(System.String,UnityEngine.TouchScreenKeyboardType,System.Boolean,System.Boolean,System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Opens the native keyboard provided by OS on the screen.</para>\n      </summary>\n      <param name=\"text\">Text to edit.</param>\n      <param name=\"keyboardType\">Type of keyboard (eg, any text, numbers only, etc).</param>\n      <param name=\"autocorrection\">Is autocorrection applied?</param>\n      <param name=\"multiline\">Can more than one line of text be entered?</param>\n      <param name=\"secure\">Is the text masked (for passwords, etc)?</param>\n      <param name=\"alert\">Is the keyboard opened in alert mode?</param>\n      <param name=\"textPlaceholder\">Text to be used if no other text is present.</param>\n      <param name=\"characterLimit\">How many characters the keyboard input field is limited to. 0 = infinite. (Android and iOS only)</param>\n    </member>\n    <member name=\"M:UnityEngine.TouchScreenKeyboard.Open(System.String,UnityEngine.TouchScreenKeyboardType,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.String)\">\n      <summary>\n        <para>Opens the native keyboard provided by OS on the screen.</para>\n      </summary>\n      <param name=\"text\">Text to edit.</param>\n      <param name=\"keyboardType\">Type of keyboard (eg, any text, numbers only, etc).</param>\n      <param name=\"autocorrection\">Is autocorrection applied?</param>\n      <param name=\"multiline\">Can more than one line of text be entered?</param>\n      <param name=\"secure\">Is the text masked (for passwords, etc)?</param>\n      <param name=\"alert\">Is the keyboard opened in alert mode?</param>\n      <param name=\"textPlaceholder\">Text to be used if no other text is present.</param>\n      <param name=\"characterLimit\">How many characters the keyboard input field is limited to. 0 = infinite. (Android and iOS only)</param>\n    </member>\n    <member name=\"M:UnityEngine.TouchScreenKeyboard.Open(System.String,UnityEngine.TouchScreenKeyboardType,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.String,System.Int32)\">\n      <summary>\n        <para>Opens the native keyboard provided by OS on the screen.</para>\n      </summary>\n      <param name=\"text\">Text to edit.</param>\n      <param name=\"keyboardType\">Type of keyboard (eg, any text, numbers only, etc).</param>\n      <param name=\"autocorrection\">Is autocorrection applied?</param>\n      <param name=\"multiline\">Can more than one line of text be entered?</param>\n      <param name=\"secure\">Is the text masked (for passwords, etc)?</param>\n      <param name=\"alert\">Is the keyboard opened in alert mode?</param>\n      <param name=\"textPlaceholder\">Text to be used if no other text is present.</param>\n      <param name=\"characterLimit\">How many characters the keyboard input field is limited to. 0 = infinite. (Android and iOS only)</param>\n    </member>\n    <member name=\"T:UnityEngine.TouchScreenKeyboard.Status\">\n      <summary>\n        <para>The status of the on-screen keyboard.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchScreenKeyboard.Status.Canceled\">\n      <summary>\n        <para>The on-screen keyboard was canceled.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchScreenKeyboard.Status.Done\">\n      <summary>\n        <para>The user has finished providing input.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchScreenKeyboard.Status.LostFocus\">\n      <summary>\n        <para>The on-screen keyboard has lost focus.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchScreenKeyboard.Status.Visible\">\n      <summary>\n        <para>The on-screen keyboard is visible.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TouchScreenKeyboardType\">\n      <summary>\n        <para>Enumeration of the different types of supported touchscreen keyboards.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchScreenKeyboardType.ASCIICapable\">\n      <summary>\n        <para>Keyboard with standard ASCII keys.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchScreenKeyboardType.Default\">\n      <summary>\n        <para>The default keyboard layout of the target platform.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchScreenKeyboardType.EmailAddress\">\n      <summary>\n        <para>Keyboard with additional keys suitable for typing email addresses.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchScreenKeyboardType.NamePhonePad\">\n      <summary>\n        <para>Keyboard with alphanumeric keys.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchScreenKeyboardType.NintendoNetworkAccount\">\n      <summary>\n        <para>Keyboard for the Nintendo Network (Deprecated).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchScreenKeyboardType.NumberPad\">\n      <summary>\n        <para>Keyboard with standard numeric keys.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchScreenKeyboardType.NumbersAndPunctuation\">\n      <summary>\n        <para>Keyboard with numbers and punctuation mark keys.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchScreenKeyboardType.PhonePad\">\n      <summary>\n        <para>Keyboard with a layout suitable for typing telephone numbers.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchScreenKeyboardType.Search\">\n      <summary>\n        <para>Keyboard with the \".\" key beside the space key, suitable for typing search terms.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchScreenKeyboardType.Social\">\n      <summary>\n        <para>Keyboard with symbol keys often used on social media, such as Twitter.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchScreenKeyboardType.URL\">\n      <summary>\n        <para>Keyboard with keys for URL entry.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TouchType\">\n      <summary>\n        <para>Describes whether a touch is direct, indirect (or remote), or from a stylus.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchType.Direct\">\n      <summary>\n        <para>A direct touch on a device.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchType.Indirect\">\n      <summary>\n        <para>An Indirect, or remote, touch on a device.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TouchType.Stylus\">\n      <summary>\n        <para>A touch from a stylus on a device.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TrailRenderer\">\n      <summary>\n        <para>The trail renderer is used to make trails behind objects in the scene as they move about.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TrailRenderer.alignment\">\n      <summary>\n        <para>Select whether the trail will face the camera, or the orientation of the Transform Component.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TrailRenderer.autodestruct\">\n      <summary>\n        <para>Does the GameObject of this Trail Renderer auto destruct?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TrailRenderer.colorGradient\">\n      <summary>\n        <para>Set the color gradient describing the color of the trail at various points along its length.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TrailRenderer.emitting\">\n      <summary>\n        <para>Creates trails when the GameObject moves.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TrailRenderer.endColor\">\n      <summary>\n        <para>Set the color at the end of the trail.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TrailRenderer.endWidth\">\n      <summary>\n        <para>The width of the trail at the end of the trail.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TrailRenderer.generateLightingData\">\n      <summary>\n        <para>Configures a trail to generate Normals and Tangents. With this data, Scene lighting can affect the trail via Normal Maps and the Unity Standard Shader, or your own custom-built Shaders.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TrailRenderer.minVertexDistance\">\n      <summary>\n        <para>Set the minimum distance the trail can travel before a new vertex is added to it.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TrailRenderer.numCapVertices\">\n      <summary>\n        <para>Set this to a value greater than 0, to get rounded corners on each end of the trail.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TrailRenderer.numCornerVertices\">\n      <summary>\n        <para>Set this to a value greater than 0, to get rounded corners between each segment of the trail.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TrailRenderer.numPositions\">\n      <summary>\n        <para>Get the number of line segments in the trail.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TrailRenderer.positionCount\">\n      <summary>\n        <para>Get the number of line segments in the trail.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TrailRenderer.startColor\">\n      <summary>\n        <para>Set the color at the start of the trail.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TrailRenderer.startWidth\">\n      <summary>\n        <para>The width of the trail at the spawning point.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TrailRenderer.textureMode\">\n      <summary>\n        <para>Choose whether the U coordinate of the trail texture is tiled or stretched.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TrailRenderer.time\">\n      <summary>\n        <para>How long does the trail take to fade out.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TrailRenderer.widthCurve\">\n      <summary>\n        <para>Set the curve describing the width of the trail at various points along its length.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TrailRenderer.widthMultiplier\">\n      <summary>\n        <para>Set an overall multiplier that is applied to the TrailRenderer.widthCurve to get the final width of the trail.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.TrailRenderer.AddPosition(UnityEngine.Vector3)\">\n      <summary>\n        <para>Adds a position to the trail.</para>\n      </summary>\n      <param name=\"position\">The position to add to the trail.</param>\n    </member>\n    <member name=\"M:UnityEngine.TrailRenderer.AddPositions(UnityEngine.Vector3[])\">\n      <summary>\n        <para>Add an array of positions to the trail.</para>\n      </summary>\n      <param name=\"positions\">The positions to add to the trail.</param>\n    </member>\n    <member name=\"M:UnityEngine.TrailRenderer.BakeMesh(UnityEngine.Mesh)\">\n      <summary>\n        <para>Creates a snapshot of TrailRenderer and stores it in mesh.</para>\n      </summary>\n      <param name=\"mesh\">A static mesh that will receive the snapshot of the trail.</param>\n      <param name=\"camera\">The camera used for determining which way view space trails will face.</param>\n      <param name=\"useTransform\">Include the rotation and scale of the Transform in the baked mesh.</param>\n    </member>\n    <member name=\"M:UnityEngine.TrailRenderer.BakeMesh(UnityEngine.Mesh,System.Boolean)\">\n      <summary>\n        <para>Creates a snapshot of TrailRenderer and stores it in mesh.</para>\n      </summary>\n      <param name=\"mesh\">A static mesh that will receive the snapshot of the trail.</param>\n      <param name=\"camera\">The camera used for determining which way view space trails will face.</param>\n      <param name=\"useTransform\">Include the rotation and scale of the Transform in the baked mesh.</param>\n    </member>\n    <member name=\"M:UnityEngine.TrailRenderer.BakeMesh(UnityEngine.Mesh,UnityEngine.Camera)\">\n      <summary>\n        <para>Creates a snapshot of TrailRenderer and stores it in mesh.</para>\n      </summary>\n      <param name=\"mesh\">A static mesh that will receive the snapshot of the trail.</param>\n      <param name=\"camera\">The camera used for determining which way view space trails will face.</param>\n      <param name=\"useTransform\">Include the rotation and scale of the Transform in the baked mesh.</param>\n    </member>\n    <member name=\"M:UnityEngine.TrailRenderer.BakeMesh(UnityEngine.Mesh,UnityEngine.Camera,System.Boolean)\">\n      <summary>\n        <para>Creates a snapshot of TrailRenderer and stores it in mesh.</para>\n      </summary>\n      <param name=\"mesh\">A static mesh that will receive the snapshot of the trail.</param>\n      <param name=\"camera\">The camera used for determining which way view space trails will face.</param>\n      <param name=\"useTransform\">Include the rotation and scale of the Transform in the baked mesh.</param>\n    </member>\n    <member name=\"M:UnityEngine.TrailRenderer.Clear\">\n      <summary>\n        <para>Removes all points from the TrailRenderer.\nUseful for restarting a trail from a new position.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.TrailRenderer.GetPosition(System.Int32)\">\n      <summary>\n        <para>Get the position of a vertex in the trail.</para>\n      </summary>\n      <param name=\"index\">The index of the position to retrieve.</param>\n      <returns>\n        <para>The position at the specified index in the array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.TrailRenderer.GetPositions(UnityEngine.Vector3[])\">\n      <summary>\n        <para>Get the positions of all vertices in the trail.</para>\n      </summary>\n      <param name=\"positions\">The array of positions to retrieve.</param>\n      <returns>\n        <para>How many positions were actually stored in the output array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.TrailRenderer.SetPosition(System.Int32,UnityEngine.Vector3)\">\n      <summary>\n        <para>Set the position of a vertex in the trail.</para>\n      </summary>\n      <param name=\"index\">Which position to set.</param>\n      <param name=\"position\">The new position.</param>\n    </member>\n    <member name=\"M:UnityEngine.TrailRenderer.SetPositions(UnityEngine.Vector3[])\">\n      <summary>\n        <para>Sets the positions of all vertices in the trail.</para>\n      </summary>\n      <param name=\"positions\">The array of positions to set.</param>\n    </member>\n    <member name=\"T:UnityEngine.Transform\">\n      <summary>\n        <para>Position, rotation and scale of an object.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.childCount\">\n      <summary>\n        <para>The number of children the Transform has.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.eulerAngles\">\n      <summary>\n        <para>The rotation as Euler angles in degrees.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.forward\">\n      <summary>\n        <para>The blue axis of the transform in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.hasChanged\">\n      <summary>\n        <para>Has the transform changed since the last time the flag was set to 'false'?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.hierarchyCapacity\">\n      <summary>\n        <para>The transform capacity of the transform's hierarchy data structure.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.hierarchyCount\">\n      <summary>\n        <para>The number of transforms in the transform's hierarchy data structure.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.localEulerAngles\">\n      <summary>\n        <para>The rotation as Euler angles in degrees relative to the parent transform's rotation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.localPosition\">\n      <summary>\n        <para>Position of the transform relative to the parent transform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.localRotation\">\n      <summary>\n        <para>The rotation of the transform relative to the parent transform's rotation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.localScale\">\n      <summary>\n        <para>The scale of the transform relative to the parent.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.localToWorldMatrix\">\n      <summary>\n        <para>Matrix that transforms a point from local space into world space (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.lossyScale\">\n      <summary>\n        <para>The global scale of the object (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.parent\">\n      <summary>\n        <para>The parent of the transform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.position\">\n      <summary>\n        <para>The position of the transform in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.right\">\n      <summary>\n        <para>The red axis of the transform in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.root\">\n      <summary>\n        <para>Returns the topmost transform in the hierarchy.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.rotation\">\n      <summary>\n        <para>The rotation of the transform in world space stored as a Quaternion.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.up\">\n      <summary>\n        <para>The green axis of the transform in world space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Transform.worldToLocalMatrix\">\n      <summary>\n        <para>Matrix that transforms a point from world space into local space (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Transform.DetachChildren\">\n      <summary>\n        <para>Unparents all children.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Transform.Find(System.String)\">\n      <summary>\n        <para>Finds a child by n and returns it.</para>\n      </summary>\n      <param name=\"n\">Name of child to be found.</param>\n      <returns>\n        <para>The returned child transform or null if no child is found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Transform.GetChild(System.Int32)\">\n      <summary>\n        <para>Returns a transform child by index.</para>\n      </summary>\n      <param name=\"index\">Index of the child transform to return. Must be smaller than Transform.childCount.</param>\n      <returns>\n        <para>Transform child by index.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Transform.GetSiblingIndex\">\n      <summary>\n        <para>Gets the sibling index.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Transform.InverseTransformDirection(UnityEngine.Vector3)\">\n      <summary>\n        <para>Transforms a direction from world space to local space. The opposite of Transform.TransformDirection.</para>\n      </summary>\n      <param name=\"direction\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.InverseTransformDirection(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Transforms the direction x, y, z from world space to local space. The opposite of Transform.TransformDirection.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"z\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.InverseTransformPoint(UnityEngine.Vector3)\">\n      <summary>\n        <para>Transforms position from world space to local space.</para>\n      </summary>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.InverseTransformPoint(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Transforms the position x, y, z from world space to local space. The opposite of Transform.TransformPoint.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"z\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.InverseTransformVector(UnityEngine.Vector3)\">\n      <summary>\n        <para>Transforms a vector from world space to local space. The opposite of Transform.TransformVector.</para>\n      </summary>\n      <param name=\"vector\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.InverseTransformVector(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Transforms the vector x, y, z from world space to local space. The opposite of Transform.TransformVector.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"z\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.IsChildOf(UnityEngine.Transform)\">\n      <summary>\n        <para>Is this transform a child of parent?</para>\n      </summary>\n      <param name=\"parent\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.LookAt(UnityEngine.Transform)\">\n      <summary>\n        <para>Rotates the transform so the forward vector points at target's current position.</para>\n      </summary>\n      <param name=\"target\">Object to point towards.</param>\n      <param name=\"worldUp\">Vector specifying the upward direction.</param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.LookAt(UnityEngine.Transform,UnityEngine.Vector3)\">\n      <summary>\n        <para>Rotates the transform so the forward vector points at target's current position.</para>\n      </summary>\n      <param name=\"target\">Object to point towards.</param>\n      <param name=\"worldUp\">Vector specifying the upward direction.</param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.LookAt(UnityEngine.Vector3)\">\n      <summary>\n        <para>Rotates the transform so the forward vector points at worldPosition.</para>\n      </summary>\n      <param name=\"worldPosition\">Point to look at.</param>\n      <param name=\"worldUp\">Vector specifying the upward direction.</param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.LookAt(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Rotates the transform so the forward vector points at worldPosition.</para>\n      </summary>\n      <param name=\"worldPosition\">Point to look at.</param>\n      <param name=\"worldUp\">Vector specifying the upward direction.</param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.Rotate(UnityEngine.Vector3,UnityEngine.Space)\">\n      <summary>\n        <para>Applies a rotation of eulerAngles.z degrees around the z axis, eulerAngles.x degrees around the x axis, and eulerAngles.y degrees around the y axis (in that order).</para>\n      </summary>\n      <param name=\"relativeTo\">Rotation is local to object or World.</param>\n      <param name=\"eulers\">Rotation to apply.</param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.Rotate(System.Single,System.Single,System.Single,UnityEngine.Space)\">\n      <summary>\n        <para>Applies a rotation of zAngle degrees around the z axis, xAngle degrees around the x axis, and yAngle degrees around the y axis (in that order).</para>\n      </summary>\n      <param name=\"xAngle\">Degrees to rotate around the X axis.</param>\n      <param name=\"yAngle\">Degrees to rotate around the Y axis.</param>\n      <param name=\"zAngle\">Degrees to rotate around the Z axis.</param>\n      <param name=\"relativeTo\">Rotation is local to object or World.</param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.Rotate(UnityEngine.Vector3,System.Single,UnityEngine.Space)\">\n      <summary>\n        <para>Rotates the object around axis by angle degrees.</para>\n      </summary>\n      <param name=\"axis\">Axis to apply rotation to.</param>\n      <param name=\"angle\">Degrees to rotation to apply.</param>\n      <param name=\"relativeTo\">Rotation is local to object or World.</param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.RotateAround(UnityEngine.Vector3,UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Rotates the transform about axis passing through point in world coordinates by angle degrees.</para>\n      </summary>\n      <param name=\"point\"></param>\n      <param name=\"axis\"></param>\n      <param name=\"angle\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.RotateAround(UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"axis\"></param>\n      <param name=\"angle\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.SetAsFirstSibling\">\n      <summary>\n        <para>Move the transform to the start of the local transform list.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Transform.SetAsLastSibling\">\n      <summary>\n        <para>Move the transform to the end of the local transform list.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Transform.SetParent(UnityEngine.Transform)\">\n      <summary>\n        <para>Set the parent of the transform.</para>\n      </summary>\n      <param name=\"parent\">The parent Transform to use.</param>\n      <param name=\"worldPositionStays\">If true, the parent-relative position, scale and\n        rotation are modified such that the object keeps the same world space position,\n        rotation and scale as before.</param>\n      <param name=\"p\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.SetParent(UnityEngine.Transform,System.Boolean)\">\n      <summary>\n        <para>Set the parent of the transform.</para>\n      </summary>\n      <param name=\"parent\">The parent Transform to use.</param>\n      <param name=\"worldPositionStays\">If true, the parent-relative position, scale and\n        rotation are modified such that the object keeps the same world space position,\n        rotation and scale as before.</param>\n      <param name=\"p\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.SetPositionAndRotation(UnityEngine.Vector3,UnityEngine.Quaternion)\">\n      <summary>\n        <para>Sets the world space position and rotation of the Transform component.</para>\n      </summary>\n      <param name=\"position\"></param>\n      <param name=\"rotation\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.SetSiblingIndex(System.Int32)\">\n      <summary>\n        <para>Sets the sibling index.</para>\n      </summary>\n      <param name=\"index\">Index to set.</param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.TransformDirection(UnityEngine.Vector3)\">\n      <summary>\n        <para>Transforms direction from local space to world space.</para>\n      </summary>\n      <param name=\"direction\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.TransformDirection(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Transforms direction x, y, z from local space to world space.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"z\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.TransformPoint(UnityEngine.Vector3)\">\n      <summary>\n        <para>Transforms position from local space to world space.</para>\n      </summary>\n      <param name=\"position\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.TransformPoint(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Transforms the position x, y, z from local space to world space.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"z\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.TransformVector(UnityEngine.Vector3)\">\n      <summary>\n        <para>Transforms vector from local space to world space.</para>\n      </summary>\n      <param name=\"vector\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.TransformVector(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Transforms vector x, y, z from local space to world space.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"z\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.Translate(UnityEngine.Vector3)\">\n      <summary>\n        <para>Moves the transform in the direction and distance of translation.</para>\n      </summary>\n      <param name=\"translation\"></param>\n      <param name=\"relativeTo\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.Translate(UnityEngine.Vector3,UnityEngine.Space)\">\n      <summary>\n        <para>Moves the transform in the direction and distance of translation.</para>\n      </summary>\n      <param name=\"translation\"></param>\n      <param name=\"relativeTo\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.Translate(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Moves the transform by x along the x axis, y along the y axis, and z along the z axis.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"z\"></param>\n      <param name=\"relativeTo\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.Translate(System.Single,System.Single,System.Single,UnityEngine.Space)\">\n      <summary>\n        <para>Moves the transform by x along the x axis, y along the y axis, and z along the z axis.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"z\"></param>\n      <param name=\"relativeTo\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.Translate(UnityEngine.Vector3,UnityEngine.Transform)\">\n      <summary>\n        <para>Moves the transform in the direction and distance of translation.</para>\n      </summary>\n      <param name=\"translation\"></param>\n      <param name=\"relativeTo\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Transform.Translate(System.Single,System.Single,System.Single,UnityEngine.Transform)\">\n      <summary>\n        <para>Moves the transform by x along the x axis, y along the y axis, and z along the z axis.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"z\"></param>\n      <param name=\"relativeTo\"></param>\n    </member>\n    <member name=\"T:UnityEngine.TransparencySortMode\">\n      <summary>\n        <para>Transparent object sorting mode of a Camera.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TransparencySortMode.CustomAxis\">\n      <summary>\n        <para>Sort objects based on distance along a custom axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TransparencySortMode.Default\">\n      <summary>\n        <para>Default transparency sorting mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TransparencySortMode.Orthographic\">\n      <summary>\n        <para>Orthographic transparency sorting mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TransparencySortMode.Perspective\">\n      <summary>\n        <para>Perspective transparency sorting mode.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Tree\">\n      <summary>\n        <para>Tree Component for the tree creator.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tree.data\">\n      <summary>\n        <para>Data asociated to the Tree.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Tree.hasSpeedTreeWind\">\n      <summary>\n        <para>Tells if there is wind data exported from SpeedTree are saved on this component.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TreeInstance\">\n      <summary>\n        <para>Contains information about a tree placed in the Terrain game object.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TreeInstance.color\">\n      <summary>\n        <para>Color of this instance.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TreeInstance.heightScale\">\n      <summary>\n        <para>Height scale of this instance (compared to the prototype's size).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TreeInstance.lightmapColor\">\n      <summary>\n        <para>Lightmap color calculated for this instance.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TreeInstance.position\">\n      <summary>\n        <para>Position of the tree.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TreeInstance.prototypeIndex\">\n      <summary>\n        <para>Index of this instance in the TerrainData.treePrototypes array.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TreeInstance.rotation\">\n      <summary>\n        <para>Read-only.\n\nRotation of the tree on X-Z plane (in radians).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.TreeInstance.widthScale\">\n      <summary>\n        <para>Width scale of this instance (compared to the prototype's size).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.TreePrototype\">\n      <summary>\n        <para>Simple class that contains a pointer to a tree prototype.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TreePrototype.bendFactor\">\n      <summary>\n        <para>Bend factor of the tree prototype.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.TreePrototype.prefab\">\n      <summary>\n        <para>Retrieves the actual GameObject used by the tree.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.tvOS.Device\">\n      <summary>\n        <para>Interface into tvOS specific functionality.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.tvOS.Device.advertisingIdentifier\">\n      <summary>\n        <para>Advertising ID.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.tvOS.Device.advertisingTrackingEnabled\">\n      <summary>\n        <para>Is advertising tracking enabled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.tvOS.Device.generation\">\n      <summary>\n        <para>The generation of the device. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.tvOS.Device.systemVersion\">\n      <summary>\n        <para>iOS version.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.tvOS.Device.vendorIdentifier\">\n      <summary>\n        <para>Vendor ID.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.tvOS.Device.ResetNoBackupFlag(System.String)\">\n      <summary>\n        <para>Reset \"no backup\" file flag: file will be synced with iCloud/iTunes backup and can be deleted by OS in low storage situations.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"M:UnityEngine.tvOS.Device.SetNoBackupFlag(System.String)\">\n      <summary>\n        <para>Set file flag to be excluded from iCloud/iTunes backup.</para>\n      </summary>\n      <param name=\"path\"></param>\n    </member>\n    <member name=\"T:UnityEngine.tvOS.DeviceGeneration\">\n      <summary>\n        <para>iOS device generation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.tvOS.DeviceGeneration.AppleTV1Gen\">\n      <summary>\n        <para>First generation Apple TV.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.tvOS.DeviceGeneration.AppleTV2Gen\">\n      <summary>\n        <para>Second generation (4K) Apple TV.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.tvOS.Remote\">\n      <summary>\n        <para>A class for Apple TV remote input configuration.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.tvOS.Remote.allowExitToHome\">\n      <summary>\n        <para>Configures how \"Menu\" button behaves on Apple TV Remote. If this property is set to true hitting \"Menu\" on Remote will exit to system home screen. When this property is false current application is responsible for handling \"Menu\" button. It is recommended to set this property to true on top level menus of your application.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.tvOS.Remote.allowRemoteRotation\">\n      <summary>\n        <para>Configures if Apple TV Remote should autorotate all the inputs when Remote is being held in horizontal orientation. Default is false.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.tvOS.Remote.reportAbsoluteDpadValues\">\n      <summary>\n        <para>Configures how touches are mapped to analog joystick axes in relative or absolute values. If set to true it will return +1 on Horizontal axis when very far right is being touched on Remote touch aread (and -1 when very left area is touched correspondingly). The same applies for Vertical axis too. When this property is set to false player should swipe instead of touching specific area of remote to generate Horizontal or Vertical input.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.tvOS.Remote.touchesEnabled\">\n      <summary>\n        <para>Disables Apple TV Remote touch propagation to Unity Input.touches API. Useful for 3rd party frameworks, which do not respect Touch.type == Indirect.\nDefault is false.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.U2D.SpriteAtlas\">\n      <summary>\n        <para>Sprite Atlas is an asset created within Unity. It is part of the built-in sprite packing solution.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.U2D.SpriteAtlas.isVariant\">\n      <summary>\n        <para>Return true if this SpriteAtlas is a variant.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.U2D.SpriteAtlas.spriteCount\">\n      <summary>\n        <para>Get the total number of Sprite packed into this atlas.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.U2D.SpriteAtlas.tag\">\n      <summary>\n        <para>Get the tag of this SpriteAtlas.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.U2D.SpriteAtlas.CanBindTo(UnityEngine.Sprite)\">\n      <summary>\n        <para>Return true if Sprite is packed into this SpriteAtlas.</para>\n      </summary>\n      <param name=\"sprite\"></param>\n    </member>\n    <member name=\"M:UnityEngine.U2D.SpriteAtlas.GetSprite(System.String)\">\n      <summary>\n        <para>Clone the first Sprite in this atlas that matches the name packed in this atlas and return it.</para>\n      </summary>\n      <param name=\"name\">The name of the Sprite.</param>\n    </member>\n    <member name=\"M:UnityEngine.U2D.SpriteAtlas.GetSprites(UnityEngine.Sprite[])\">\n      <summary>\n        <para>Clone all the Sprite in this atlas and fill them into the supplied array.</para>\n      </summary>\n      <param name=\"sprites\">Array of Sprite that will be filled.</param>\n      <returns>\n        <para>The size of the returned array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.U2D.SpriteAtlas.GetSprites(UnityEngine.Sprite[],System.String)\">\n      <summary>\n        <para>Clone all the Sprite matching the name in this atlas and fill them into the supplied array.</para>\n      </summary>\n      <param name=\"sprites\">Array of Sprite that will be filled.</param>\n      <param name=\"name\">The name of the Sprite.</param>\n    </member>\n    <member name=\"T:UnityEngine.U2D.SpriteAtlasManager\">\n      <summary>\n        <para>Manages SpriteAtlas during runtime.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.U2D.SpriteAtlasManager.atlasRegistered(System.Action`1&lt;UnityEngine.U2D.SpriteAtlas&gt;)\">\n      <summary>\n        <para>Trigger when a SpriteAtlas is registered via invoking the callback in U2D.SpriteAtlasManager.atlasRequested.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.U2D.SpriteAtlasManager.atlasRequested(UnityEngine.U2D.SpriteAtlasManager/RequestAtlasCallback)\">\n      <summary>\n        <para>Trigger when any Sprite was bound to SpriteAtlas but couldn't locate the atlas asset during runtime.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"T:UnityEngine.U2D.SpriteAtlasManager.RequestAtlasCallback\">\n      <summary>\n        <para>Delegate type for atlas request callback.</para>\n      </summary>\n      <param name=\"tag\">Tag of SpriteAtlas that needs to be provided by user.</param>\n      <param name=\"action\">An Action that takes user loaded SpriteAtlas.</param>\n    </member>\n    <member name=\"T:UnityEngine.UICharInfo\">\n      <summary>\n        <para>Class that specifies some information about a renderable character.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UICharInfo.charWidth\">\n      <summary>\n        <para>Character width.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UICharInfo.cursorPos\">\n      <summary>\n        <para>Position of the character cursor in local (text generated) space.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UILineInfo\">\n      <summary>\n        <para>Information about a generated line of text.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UILineInfo.height\">\n      <summary>\n        <para>Height of the line.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UILineInfo.leading\">\n      <summary>\n        <para>Space in pixels between this line and the next line.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UILineInfo.startCharIdx\">\n      <summary>\n        <para>Index of the first character in the line.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UILineInfo.topY\">\n      <summary>\n        <para>The upper Y position of the line in pixels. This is used for text annotation such as the caret and selection box in the InputField.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UIVertex\">\n      <summary>\n        <para>Vertex class used by a Canvas for managing vertices.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UIVertex.color\">\n      <summary>\n        <para>Vertex color.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UIVertex.normal\">\n      <summary>\n        <para>Normal.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UIVertex.position\">\n      <summary>\n        <para>Vertex position.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UIVertex.simpleVert\">\n      <summary>\n        <para>Simple UIVertex with sensible settings for use in the UI system.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UIVertex.tangent\">\n      <summary>\n        <para>Tangent.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UIVertex.uv0\">\n      <summary>\n        <para>The first texture coordinate set of the mesh. Used by UI elements by default.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UIVertex.uv1\">\n      <summary>\n        <para>The second texture coordinate set of the mesh, if present.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UIVertex.uv2\">\n      <summary>\n        <para>The Third texture coordinate set of the mesh, if present.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UIVertex.uv3\">\n      <summary>\n        <para>The forth texture coordinate set of the mesh, if present.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Burst.BurstDiscardAttribute\">\n      <summary>\n        <para>The BurstDiscard attribute lets you remove a method or property from being compiled to native code by the burst compiler.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Burst.BurstDiscardAttribute\">\n      <summary>\n        <para>The BurstDiscard attribute lets you remove a method or property from being compiled to native code by the burst compiler.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.Allocator\">\n      <summary>\n        <para>Used to specify allocation type for NativeArray.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Collections.Allocator.Invalid\">\n      <summary>\n        <para>Invalid allocation.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Collections.Allocator.None\">\n      <summary>\n        <para>No allocation.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Collections.Allocator.Persistent\">\n      <summary>\n        <para>Persistent allocation.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Collections.Allocator.Temp\">\n      <summary>\n        <para>Temporary allocation.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Collections.Allocator.TempJob\">\n      <summary>\n        <para>Temporary job allocation.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.DeallocateOnJobCompletionAttribute\">\n      <summary>\n        <para>DeallocateOnJobCompletionAttribute.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle\">\n      <summary>\n        <para>AtomicSafetyHandle is used by the job system to provide validation and full safety.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.CheckDeallocateAndThrow(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle)\">\n      <summary>\n        <para>Checks if the handle can be deallocated. Throws an exception if it has already been destroyed or a job is currently accessing the data.</para>\n      </summary>\n      <param name=\"handle\">Safety handle.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.CheckExistsAndThrow(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle)\">\n      <summary>\n        <para>Checks if the handle is still valid and throws an exception if it is already destroyed.</para>\n      </summary>\n      <param name=\"handle\">Safety handle.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.CheckGetSecondaryDataPointerAndThrow(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle)\">\n      <summary>\n        <para>CheckGetSecondaryDataPointerAndThrow.</para>\n      </summary>\n      <param name=\"handle\">Safety handle.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.CheckReadAndThrow(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle)\">\n      <summary>\n        <para>Checks if the handle can be read from. Throws an exception if already destroyed or a job is currently writing to the data.</para>\n      </summary>\n      <param name=\"handle\">Safety handle.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.CheckWriteAndBumpSecondaryVersion(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle)\">\n      <summary>\n        <para>Performs CheckWriteAndThrow and then bumps the secondary version.</para>\n      </summary>\n      <param name=\"handle\">Safety handle.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.CheckWriteAndThrow(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle)\">\n      <summary>\n        <para>Checks if the handle can be written to. Throws an exception if already destroyed or a job is currently reading or writing to the data.</para>\n      </summary>\n      <param name=\"handle\">Safety handle.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.Create\">\n      <summary>\n        <para>Creates a new AtomicSafetyHandle that is valid until AtomicSafetyHandle.Release is called.</para>\n      </summary>\n      <returns>\n        <para>Safety handle.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.EnforceAllBufferJobsHaveCompleted(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle)\">\n      <summary>\n        <para>Waits for all jobs running against this AtomicSafetyHandle to complete.</para>\n      </summary>\n      <param name=\"handle\"></param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.EnforceAllBufferJobsHaveCompletedAndDisableReadWrite(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle)\">\n      <summary>\n        <para>Waits for all jobs running against this AtomicSafetyHandle to complete and then disables the read and write access on this atomic safety handle.</para>\n      </summary>\n      <param name=\"handle\">Safety handle.</param>\n      <returns>\n        <para>Result.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.EnforceAllBufferJobsHaveCompletedAndRelease(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle)\">\n      <summary>\n        <para>Waits for all jobs running against this AtomicSafetyHandle to complete and then releases the atomic safety handle.</para>\n      </summary>\n      <param name=\"handle\">Safety handle.</param>\n      <returns>\n        <para>Result.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.GetAllowReadOrWriteAccess(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle)\">\n      <summary>\n        <para>Returns true if the AtomicSafetyHandle is configured to allow reading or writing.</para>\n      </summary>\n      <param name=\"handle\">Safety handle.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.GetReaderArray(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle,System.Int32,System.IntPtr)\">\n      <summary>\n        <para>Fetch the job handles of all jobs reading from the safety handle.</para>\n      </summary>\n      <param name=\"handle\">The atomic safety handle to return readers for.</param>\n      <param name=\"maxCount\">The maximum number of handles to be written to the output array.</param>\n      <param name=\"output\">A buffer where the job handles will be written.</param>\n      <returns>\n        <para>The actual number of readers on the handle, which can be greater than the maximum count provided.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.GetReaderName(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle,System.Int32)\">\n      <summary>\n        <para>Return the name of the specified reading job.</para>\n      </summary>\n      <param name=\"handle\">Safety handle.</param>\n      <param name=\"readerIndex\">Index of the reader.</param>\n      <returns>\n        <para>The debug name of the reader.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.GetTempUnsafePtrSliceHandle\">\n      <summary>\n        <para>Returns a single shared handle, that can be shared by for example NativeSlice pointing to stack memory.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.GetWriter(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle)\">\n      <summary>\n        <para>Return the writer (if any) on an atomic safety handle.</para>\n      </summary>\n      <param name=\"handle\">Safety handle.</param>\n      <returns>\n        <para>The job handle of the writer.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.GetWriterName(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle)\">\n      <summary>\n        <para>Return the debug name of the current writer on an atomic safety handle.</para>\n      </summary>\n      <param name=\"handle\">Safety handle.</param>\n      <returns>\n        <para>Name of the writer, if any.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.PrepareUndisposable(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle&amp;)\">\n      <summary>\n        <para>Marks the AtomicSafetyHandle so that it cannot be disposed of.</para>\n      </summary>\n      <param name=\"handle\">Safety handle.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.Release(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle)\">\n      <summary>\n        <para>Releases a previously created AtomicSafetyHandle.</para>\n      </summary>\n      <param name=\"handle\">Safety handle.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.SetAllowReadOrWriteAccess(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle,System.Boolean)\">\n      <summary>\n        <para>Lets you prevent read or write access on the atomic safety handle.</para>\n      </summary>\n      <param name=\"handle\">Safety handle.</param>\n      <param name=\"allowReadWriteAccess\">Use false to disallow read or write access, or true otherwise.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.SetAllowSecondaryVersionWriting(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle,System.Boolean)\">\n      <summary>\n        <para>Switches the AtomicSafetyHandle to the secondary version number.</para>\n      </summary>\n      <param name=\"handle\">Safety handle.</param>\n      <param name=\"allowWriting\">Allow writing.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.UseSecondaryVersion(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle&amp;)\">\n      <summary>\n        <para>Switches the AtomicSafetyHandle to the secondary version number.</para>\n      </summary>\n      <param name=\"handle\">Safety handle.</param>\n    </member>\n    <member name=\"T:Unity.Collections.LowLevel.Unsafe.DisposeSentinel\">\n      <summary>\n        <para>DisposeSentinel is used to detect memory leaks.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.DisposeSentinel.Clear(Unity.Collections.LowLevel.Unsafe.DisposeSentinel&amp;)\">\n      <summary>\n        <para>Clear sentinel.</para>\n      </summary>\n      <param name=\"sentinel\">Dispose sentinel.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.DisposeSentinel.Create\">\n      <summary>\n        <para>Create sentinel.</para>\n      </summary>\n      <param name=\"ptr\">Memory pointer.</param>\n      <param name=\"label\">Allocator.</param>\n      <param name=\"safety\">Safety handle.</param>\n      <param name=\"sentinel\">Resulting sentinel.</param>\n      <param name=\"callSiteStackDepth\">Call site stack depth.</param>\n      <param name=\"deallocateDelegate\">Deallocate delegate.</param>\n    </member>\n    <member name=\"T:Unity.Collections.LowLevel.Unsafe.DisposeSentinel.DeallocateDelegate\">\n      <summary>\n        <para>Deallocate delegate.</para>\n      </summary>\n      <param name=\"buffer\">Memory pointer.</param>\n      <param name=\"allocator\">Allocator.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.DisposeSentinel.Dispose(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle,Unity.Collections.LowLevel.Unsafe.DisposeSentinel&amp;)\">\n      <summary>\n        <para>Dispose safety handle and sentinel.</para>\n      </summary>\n      <param name=\"safety\">Safety handle.</param>\n      <param name=\"sentinel\">Dispose sentinel.</param>\n    </member>\n    <member name=\"T:Unity.Collections.LowLevel.Unsafe.EnforceJobResult\">\n      <summary>\n        <para>EnforceJobResult.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Collections.LowLevel.Unsafe.EnforceJobResult.AllJobsAlreadySynced\">\n      <summary>\n        <para>AllJobsAlreadySynced.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Collections.LowLevel.Unsafe.EnforceJobResult.DidSyncRunningJobs\">\n      <summary>\n        <para>DidSyncRunningJobs.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Collections.LowLevel.Unsafe.EnforceJobResult.HandleWasAlreadyDeallocated\">\n      <summary>\n        <para>HandleWasAlreadyDeallocated.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.LowLevel.Unsafe.NativeArrayUnsafeUtility\">\n      <summary>\n        <para>NativeArray Unsafe Utility.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray\">\n      <summary>\n        <para>ConvertExistingDataToNativeArray.</para>\n      </summary>\n      <param name=\"dataPointer\">Memory pointer.</param>\n      <param name=\"length\">Length.</param>\n      <param name=\"allocator\">Allocator.</param>\n      <returns>\n        <para>Native Array.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.NativeArrayUnsafeUtility.GetAtomicSafetyHandle(Unity.Collections.NativeArray`1&lt;T&gt;)\">\n      <summary>\n        <para>Get safety handle for native array.</para>\n      </summary>\n      <param name=\"array\">NativeArray.</param>\n      <returns>\n        <para>Safety handle.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(Unity.Collections.NativeArray`1&lt;T&gt;)\">\n      <summary>\n        <para>Get NativeArray memory buffer pointer without performing checks.</para>\n      </summary>\n      <param name=\"nativeArray\">NativeArray.</param>\n      <returns>\n        <para>NativeArray memory buffer pointer.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.NativeArrayUnsafeUtility.GetUnsafePtr(Unity.Collections.NativeArray`1&lt;T&gt;)\">\n      <summary>\n        <para>Get NativeArray memory buffer.  Checks whether the native array can be written to.</para>\n      </summary>\n      <param name=\"nativeArray\">NativeArray.</param>\n      <returns>\n        <para>NativeArray memory buffer pointer.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.NativeArrayUnsafeUtility.GetUnsafeReadOnlyPtr(Unity.Collections.NativeArray`1&lt;T&gt;)\">\n      <summary>\n        <para>Get NativeArray memory buffer pointer.  Checks whether the native array can be read from.</para>\n      </summary>\n      <param name=\"nativeArray\">NativeArray.</param>\n      <returns>\n        <para>NativeArray memory buffer pointer.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.NativeArrayUnsafeUtility.SetAtomicSafetyHandle(Unity.Collections.NativeArray`1&lt;T&gt;&amp;,Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle)\">\n      <summary>\n        <para>Set safetly handle on NativeArray.</para>\n      </summary>\n      <param name=\"array\">NativeArray.</param>\n      <param name=\"safety\">Safety handle.</param>\n    </member>\n    <member name=\"T:Unity.Collections.LowLevel.Unsafe.NativeContainerAttribute\">\n      <summary>\n        <para>Allows you to create your own custom native container.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.LowLevel.Unsafe.NativeContainerIsAtomicWriteOnlyAttribute\">\n      <summary>\n        <para>NativeContainerIsAtomicWriteOnlyAttribute.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.LowLevel.Unsafe.NativeContainerIsReadOnlyAttribute\">\n      <summary>\n        <para>NativeContainerIsReadOnlyAttribute.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.LowLevel.Unsafe.NativeContainerSupportsDeallocateOnJobCompletionAttribute\">\n      <summary>\n        <para>NativeContainerSupportsDeallocateOnJobCompletionAttribute.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.LowLevel.Unsafe.NativeContainerSupportsDeferredConvertListToArray\">\n      <summary>\n        <para>NativeContainerSupportsDeferredConvertListToArray.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.LowLevel.Unsafe.NativeContainerSupportsMinMaxWriteRestrictionAttribute\">\n      <summary>\n        <para>NativeContainerSupportsMinMaxWriteRestrictionAttribute.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.LowLevel.Unsafe.NativeDisableContainerSafetyRestrictionAttribute\">\n      <summary>\n        <para>By default native containers are tracked by the safety system to avoid race conditions. The safety system encapsulates the best practices and catches many race condition bugs from the start.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.LowLevel.Unsafe.NativeDisableUnsafePtrRestrictionAttribute\">\n      <summary>\n        <para>By default unsafe Pointers are not allowed to be used in a job since it is not possible for the Job Debugger to gurantee race condition free behaviour. This attribute lets you explicitly disable the restriction on a job.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.LowLevel.Unsafe.NativeSetClassTypeToNullOnScheduleAttribute\">\n      <summary>\n        <para>When this attribute is applied to a field in a job struct, the managed reference to the class will be set to null on the copy of the job struct that is passed to the job.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.LowLevel.Unsafe.NativeSetThreadIndexAttribute\">\n      <summary>\n        <para>This attribute can inject a worker thread index into an int on the job struct. This is usually used in the implementation of atomic containers. The index is guaranteed to be unique to any other job that might be running in parallel.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.LowLevel.Unsafe.NativeSliceUnsafeUtility\">\n      <summary>\n        <para>NativeSlice unsafe utility class.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.NativeSliceUnsafeUtility.ConvertExistingDataToNativeSlice\">\n      <summary>\n        <para>ConvertExistingDataToNativeSlice.</para>\n      </summary>\n      <param name=\"ptr\">Memory pointer.</param>\n      <param name=\"length\">Number of elements.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.NativeSliceUnsafeUtility.GetAtomicSafetyHandle(Unity.Collections.NativeSlice`1&lt;T&gt;)\">\n      <summary>\n        <para>Get safety handle for native slice.</para>\n      </summary>\n      <param name=\"slice\">NativeSlice.</param>\n      <returns>\n        <para>Safety handle.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.NativeSliceUnsafeUtility.GetUnsafePtr(Unity.Collections.NativeSlice`1&lt;T&gt;)\">\n      <summary>\n        <para>Get NativeSlice memory buffer pointer.  Checks whether the native array can be written to.</para>\n      </summary>\n      <param name=\"nativeSlice\">NativeSlice.</param>\n      <returns>\n        <para>Memory pointer.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.NativeSliceUnsafeUtility.GetUnsafeReadOnlyPtr(Unity.Collections.NativeSlice`1&lt;T&gt;)\">\n      <summary>\n        <para>Get NativeSlice memory buffer pointer.  Checks whether the native array can be read from.</para>\n      </summary>\n      <param name=\"nativeSlice\">NativeSlice.</param>\n      <returns>\n        <para>Memory pointer.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.NativeSliceUnsafeUtility.SetAtomicSafetyHandle(Unity.Collections.NativeSlice`1&lt;T&gt;&amp;,Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle)\">\n      <summary>\n        <para>Set safetly handle on NativeSlice.</para>\n      </summary>\n      <param name=\"slice\">NativeSlice.</param>\n      <param name=\"safety\">Safety handle.</param>\n    </member>\n    <member name=\"T:Unity.Collections.LowLevel.Unsafe.UnsafeUtility\">\n      <summary>\n        <para>Unsafe utility class.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.AddressOf(T&amp;)\">\n      <summary>\n        <para>The memory address of the struct.</para>\n      </summary>\n      <param name=\"output\">Struct.</param>\n      <returns>\n        <para>Memory pointer.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.AlignOf\">\n      <summary>\n        <para>Minimum alignment of a struct.</para>\n      </summary>\n      <returns>\n        <para>Memory pointer.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.CopyObjectAddressToPtr(System.Object,System.Void*)\">\n      <summary>\n        <para>Assigns an Object reference to a struct or pinned class. See Also: UnsafeUtility.PinGCObjectAndGetAddress.</para>\n      </summary>\n      <param name=\"target\"></param>\n      <param name=\"dstPtr\"></param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.CopyPtrToStructure(System.Void*,T&amp;)\">\n      <summary>\n        <para>Copies sizeof(T) bytes from ptr to output.</para>\n      </summary>\n      <param name=\"ptr\">Memory pointer.</param>\n      <param name=\"output\">Struct.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.CopyStructureToPtr(T&amp;,System.Void*)\">\n      <summary>\n        <para>Copies sizeof(T) bytes from input to ptr.</para>\n      </summary>\n      <param name=\"ptr\">Memory pointer.</param>\n      <param name=\"input\">Struct.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.Free(System.Void*,Unity.Collections.Allocator)\">\n      <summary>\n        <para>Free memory.</para>\n      </summary>\n      <param name=\"memory\">Memory pointer.</param>\n      <param name=\"allocator\">Allocator.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.GetFieldOffset(System.Reflection.FieldInfo)\">\n      <summary>\n        <para>Returns the offset of the field relative struct or class it is contained in.</para>\n      </summary>\n      <param name=\"field\"></param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.IsBlittable\">\n      <summary>\n        <para>Returns whether the struct is blittable.</para>\n      </summary>\n      <param name=\"type\">The System.Type of a struct.</param>\n      <returns>\n        <para>True if struct is blittable, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.IsBlittable(System.Type)\">\n      <summary>\n        <para>Returns whether the struct is blittable.</para>\n      </summary>\n      <param name=\"type\">The System.Type of a struct.</param>\n      <returns>\n        <para>True if struct is blittable, otherwise false.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.IsValidAllocator(Unity.Collections.Allocator)\">\n      <summary>\n        <para>Returns true if the allocator label is valid and can be used to allocate or deallocate memory.</para>\n      </summary>\n      <param name=\"allocator\"></param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.Malloc\">\n      <summary>\n        <para>Allocate memory.</para>\n      </summary>\n      <param name=\"size\">Size.</param>\n      <param name=\"alignment\">Alignment.</param>\n      <param name=\"allocator\">Allocator.</param>\n      <returns>\n        <para>Memory pointer.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.MemClear\">\n      <summary>\n        <para>Clear memory.</para>\n      </summary>\n      <param name=\"destination\">Memory pointer.</param>\n      <param name=\"size\">Size.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.MemCmp\">\n      <summary>\n        <para>Checks to see whether two memory regions are identical or not by comparing a specified memory region in the first given memory buffer with the same region in the second given memory buffer.</para>\n      </summary>\n      <param name=\"ptr1\">Pointer to the first memory buffer.</param>\n      <param name=\"ptr2\">Pointer to the second memory buffer to compare the first one to.</param>\n      <param name=\"size\">Number of bytes to compare.</param>\n      <returns>\n        <para>0 if the contents are identical, non-zero otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.MemCpy\">\n      <summary>\n        <para>Copy memory.</para>\n      </summary>\n      <param name=\"destination\">Destination memory pointer.</param>\n      <param name=\"source\">Source memory pointer.</param>\n      <param name=\"size\">Size.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.MemCpyReplicate\">\n      <summary>\n        <para>Copy memory and replicate.</para>\n      </summary>\n      <param name=\"destination\">Destination memory pointer.</param>\n      <param name=\"source\">Source memory pointer.</param>\n      <param name=\"size\">Size.</param>\n      <param name=\"count\">Count.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.MemCpyStride(System.Void*,System.Int32,System.Void*,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Similar to UnsafeUtility.MemCpy but can skip bytes via desinationStride and sourceStride.</para>\n      </summary>\n      <param name=\"destination\"></param>\n      <param name=\"destinationStride\"></param>\n      <param name=\"source\"></param>\n      <param name=\"sourceStride\"></param>\n      <param name=\"elementSize\"></param>\n      <param name=\"count\"></param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.MemMove\">\n      <summary>\n        <para>Move memory.</para>\n      </summary>\n      <param name=\"destination\">Destination memory pointer.</param>\n      <param name=\"source\">Source memory pointer.</param>\n      <param name=\"size\">Size.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.PinGCObjectAndGetAddress(System.Object,System.UInt64&amp;)\">\n      <summary>\n        <para>Keeps a strong GC reference to the object and pins it. The object is guranteed to not move its memory location in a moving GC. Returns the address of the memory location of the object.\n\nSee Also: UnsafeUtility.ReleaseGCObject.</para>\n      </summary>\n      <param name=\"target\"></param>\n      <param name=\"gcHandle\"></param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.ReadArrayElement(System.Void*,System.Int32)\">\n      <summary>\n        <para>Read array element.</para>\n      </summary>\n      <param name=\"source\">Memory pointer.</param>\n      <param name=\"index\">Array index.</param>\n      <returns>\n        <para>Array Element.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.ReadArrayElementWithStride(System.Void*,System.Int32,System.Int32)\">\n      <summary>\n        <para>Read array element with stride.</para>\n      </summary>\n      <param name=\"source\">Memory pointer.</param>\n      <param name=\"index\">Array index.</param>\n      <param name=\"stride\">Stride.</param>\n      <returns>\n        <para>Array element.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.ReleaseGCObject(System.UInt64)\">\n      <summary>\n        <para>Releases a GC Object Handle, previously aquired by UnsafeUtility.PinGCObjectAndGetAddress.</para>\n      </summary>\n      <param name=\"gcHandle\"></param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.SizeOf\">\n      <summary>\n        <para>Size of struct.</para>\n      </summary>\n      <returns>\n        <para>Size of struct.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.WriteArrayElement(System.Void*,System.Int32,T)\">\n      <summary>\n        <para>Write array element.</para>\n      </summary>\n      <param name=\"destination\">Memory pointer.</param>\n      <param name=\"index\">Array index.</param>\n      <param name=\"value\">Value to write.</param>\n    </member>\n    <member name=\"M:Unity.Collections.LowLevel.Unsafe.UnsafeUtility.WriteArrayElementWithStride(System.Void*,System.Int32,System.Int32,T)\">\n      <summary>\n        <para>Write array element with stride.</para>\n      </summary>\n      <param name=\"destination\">Memory pointer.</param>\n      <param name=\"index\">Array index.</param>\n      <param name=\"stride\">Stride.</param>\n      <param name=\"value\">Value to write.</param>\n    </member>\n    <member name=\"T:Unity.Collections.LowLevel.Unsafe.WriteAccessRequiredAttribute\">\n      <summary>\n        <para>Used in conjunction with the ReadOnlyAttribute, WriteAccessRequiredAttribute lets you specify which struct method and property require write access to be invoked.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.NativeArray`1\">\n      <summary>\n        <para>A NativeArray exposes a buffer of native memory to managed code, making it possible to share data between managed and native.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Collections.NativeArray_1.CopyFrom(T[])\">\n      <summary>\n        <para>Copy all the elements from another NativeArray or managed array of the same length.</para>\n      </summary>\n      <param name=\"array\">Source array.</param>\n    </member>\n    <member name=\"M:Unity.Collections.NativeArray_1.CopyFrom(Unity.Collections.NativeArray`1&lt;T&gt;)\">\n      <summary>\n        <para>Copy all the elements from another NativeArray or managed array of the same length.</para>\n      </summary>\n      <param name=\"array\">Source array.</param>\n    </member>\n    <member name=\"M:Unity.Collections.NativeArray_1.CopyTo(T[])\">\n      <summary>\n        <para>Copy all elements to another NativeArray or managed array of the same length.</para>\n      </summary>\n      <param name=\"array\">Destination array.</param>\n    </member>\n    <member name=\"M:Unity.Collections.NativeArray_1.CopyTo(Unity.Collections.NativeArray`1&lt;T&gt;)\">\n      <summary>\n        <para>Copy all elements to another NativeArray or managed array of the same length.</para>\n      </summary>\n      <param name=\"array\">Destination array.</param>\n    </member>\n    <member name=\"M:Unity.Collections.NativeArray_1.#ctor\">\n      <summary>\n        <para>Create NativeArray.</para>\n      </summary>\n      <param name=\"length\">Array length.</param>\n      <param name=\"allocator\">Allocator.</param>\n      <param name=\"clearMemory\">Should clear memory?</param>\n      <param name=\"array\">Source array to copy elements from.</param>\n    </member>\n    <member name=\"M:Unity.Collections.NativeArray_1.#ctor(T[],Unity.Collections.Allocator)\">\n      <summary>\n        <para>Create NativeArray.</para>\n      </summary>\n      <param name=\"length\">Array length.</param>\n      <param name=\"allocator\">Allocator.</param>\n      <param name=\"clearMemory\">Should clear memory?</param>\n      <param name=\"array\">Source array to copy elements from.</param>\n    </member>\n    <member name=\"M:Unity.Collections.NativeArray_1.#ctor(Unity.Collections.NativeArray`1&lt;T&gt;,Unity.Collections.Allocator)\">\n      <summary>\n        <para>Create NativeArray.</para>\n      </summary>\n      <param name=\"length\">Array length.</param>\n      <param name=\"allocator\">Allocator.</param>\n      <param name=\"clearMemory\">Should clear memory?</param>\n      <param name=\"array\">Source array to copy elements from.</param>\n    </member>\n    <member name=\"M:Unity.Collections.NativeArray_1.Dispose\">\n      <summary>\n        <para>Dispose array.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Collections.NativeArray_1.GetEnumerator\">\n      <summary>\n        <para>Get enumerator.</para>\n      </summary>\n      <returns>\n        <para>Enumerator.</para>\n      </returns>\n    </member>\n    <member name=\"P:Unity.Collections.NativeArray_1.IsCreated\">\n      <summary>\n        <para>Indicates that the NativeArray has an allocated memory buffer.</para>\n      </summary>\n    </member>\n    <member name=\"P:Unity.Collections.NativeArray_1.Length\">\n      <summary>\n        <para>Number of elements in the NativeArray.</para>\n      </summary>\n    </member>\n    <member name=\"P:Unity.Collections.NativeArray_1.this\">\n      <summary>\n        <para>Access NativeArray elements by index. Notice that structs are returned by value and not by reference.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Collections.NativeArray_1.ToArray\">\n      <summary>\n        <para>Convert NativeArray to array.</para>\n      </summary>\n      <returns>\n        <para>Array.</para>\n      </returns>\n    </member>\n    <member name=\"T:Unity.Collections.NativeArrayOptions\">\n      <summary>\n        <para>NativeArrayOptions lets you control if memory should be cleared on allocation or left uninitialized.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Collections.NativeArrayOptions.ClearMemory\">\n      <summary>\n        <para>Clear NativeArray memory on allocation.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Collections.NativeArrayOptions.UninitializedMemory\">\n      <summary>\n        <para>Uninitialized memory can improve performance, but results in the contents of the array elements being undefined.\nIn performance sensitive code it can make sense to use NativeArrayOptions.Uninitialized, if you are writing to the entire array right after creating it without reading any of the elements first.\n</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.NativeDisableParallelForRestrictionAttribute\">\n      <summary>\n        <para>NativeDisableParallelForRestrictionAttribute.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.NativeFixedLengthAttribute\">\n      <summary>\n        <para>The container has from start a size that will never change.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Collections.NativeFixedLengthAttribute.#ctor(System.Int32)\">\n      <summary>\n        <para>The specified number of elements will never change.</para>\n      </summary>\n      <param name=\"fixedLength\">The fixed number of elements in the container.</param>\n    </member>\n    <member name=\"F:Unity.Collections.NativeFixedLengthAttribute.FixedLength\">\n      <summary>\n        <para>The fixed number of elements in the container.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.NativeLeakDetection\">\n      <summary>\n        <para>Static class for native leak detection settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:Unity.Collections.NativeLeakDetection.Mode\">\n      <summary>\n        <para>Set whether native memory leak detection should be enabled or disabled.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.NativeLeakDetectionMode\">\n      <summary>\n        <para>Native leak memory leak detection mode enum.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Collections.NativeLeakDetectionMode.Disabled\">\n      <summary>\n        <para>Indicates that native memory leak detection is disabled.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Collections.NativeLeakDetectionMode.Enabled\">\n      <summary>\n        <para>Indicates that native memory leak detection is enabled.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.NativeSlice`1\">\n      <summary>\n        <para>Native Slice.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Collections.NativeSlice_1.CopyFrom(Unity.Collections.NativeSlice`1&lt;T&gt;)\">\n      <summary>\n        <para>Copy all the elements from a NativeSlice or managed array of the same length.</para>\n      </summary>\n      <param name=\"slice\">NativeSlice.</param>\n      <param name=\"array\">Array.</param>\n    </member>\n    <member name=\"M:Unity.Collections.NativeSlice_1.CopyFrom(T[])\">\n      <summary>\n        <para>Copy all the elements from a NativeSlice or managed array of the same length.</para>\n      </summary>\n      <param name=\"slice\">NativeSlice.</param>\n      <param name=\"array\">Array.</param>\n    </member>\n    <member name=\"M:Unity.Collections.NativeSlice_1.CopyTo(Unity.Collections.NativeArray`1&lt;T&gt;)\">\n      <summary>\n        <para>Copy all the elements of the slice to a NativeArray or managed array of the same length.</para>\n      </summary>\n      <param name=\"array\">Array.</param>\n    </member>\n    <member name=\"M:Unity.Collections.NativeSlice_1.CopyTo(T[])\">\n      <summary>\n        <para>Copy all the elements of the slice to a NativeArray or managed array of the same length.</para>\n      </summary>\n      <param name=\"array\">Array.</param>\n    </member>\n    <member name=\"M:Unity.Collections.NativeSlice_1.#ctor(Unity.Collections.NativeArray`1&lt;T&gt;)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"array\">NativeArray.</param>\n      <param name=\"start\">Start index.</param>\n      <param name=\"ptr\">Memory pointer.</param>\n      <param name=\"length\">Length.</param>\n    </member>\n    <member name=\"M:Unity.Collections.NativeSlice_1.#ctor(Unity.Collections.NativeArray`1&lt;T&gt;,System.Int32)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"array\">NativeArray.</param>\n      <param name=\"start\">Start index.</param>\n      <param name=\"ptr\">Memory pointer.</param>\n      <param name=\"length\">Length.</param>\n    </member>\n    <member name=\"M:Unity.Collections.NativeSlice_1.#ctor\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"array\">NativeArray.</param>\n      <param name=\"start\">Start index.</param>\n      <param name=\"ptr\">Memory pointer.</param>\n      <param name=\"length\">Length.</param>\n    </member>\n    <member name=\"M:Unity.Collections.NativeSlice_1.#ctor(Unity.Collections.NativeArray`1&lt;T&gt;,System.Int32,System.Int32)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"array\">NativeArray.</param>\n      <param name=\"start\">Start index.</param>\n      <param name=\"ptr\">Memory pointer.</param>\n      <param name=\"length\">Length.</param>\n    </member>\n    <member name=\"M:Unity.Collections.NativeSlice_1.GetEnumerator\">\n      <summary>\n        <para>GetEnumerator.</para>\n      </summary>\n      <returns>\n        <para>Enumerator.</para>\n      </returns>\n    </member>\n    <member name=\"P:Unity.Collections.NativeSlice_1.Length\">\n      <summary>\n        <para>Number of elements in the slice.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Collections.NativeSlice_1.SliceConvert\">\n      <summary>\n        <para>SliceConvert.</para>\n      </summary>\n      <returns>\n        <para>NativeSlice.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.NativeSlice_1.SliceWithStride(System.Int32)\">\n      <summary>\n        <para>SliceWithStride.</para>\n      </summary>\n      <param name=\"offset\">Stride offset.</param>\n      <param name=\"offsetFieldName\">Field name whos offset should be used as stride.</param>\n      <returns>\n        <para>NativeSlice.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.NativeSlice_1.SliceWithStride\">\n      <summary>\n        <para>SliceWithStride.</para>\n      </summary>\n      <param name=\"offset\">Stride offset.</param>\n      <param name=\"offsetFieldName\">Field name whos offset should be used as stride.</param>\n      <returns>\n        <para>NativeSlice.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Collections.NativeSlice_1.SliceWithStride\">\n      <summary>\n        <para>SliceWithStride.</para>\n      </summary>\n      <param name=\"offset\">Stride offset.</param>\n      <param name=\"offsetFieldName\">Field name whos offset should be used as stride.</param>\n      <returns>\n        <para>NativeSlice.</para>\n      </returns>\n    </member>\n    <member name=\"P:Unity.Collections.NativeSlice_1.Stride\">\n      <summary>\n        <para>Returns stride set for Slice.</para>\n      </summary>\n    </member>\n    <member name=\"P:Unity.Collections.NativeSlice_1.this\">\n      <summary>\n        <para>Access NativeSlice elements by index. Notice that structs are returned by value and not by reference.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Collections.NativeSlice_1.ToArray\">\n      <summary>\n        <para>Convert NativeSlice to array.</para>\n      </summary>\n      <returns>\n        <para>Array.</para>\n      </returns>\n    </member>\n    <member name=\"T:Unity.Collections.ReadOnlyAttribute\">\n      <summary>\n        <para>The ReadOnly attribute lets you mark a member of a struct used in a job as read-only.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.ReadOnlyAttribute\">\n      <summary>\n        <para>The ReadOnly attribute lets you mark a member of a struct used in a job as read-only.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Collections.WriteOnlyAttribute\">\n      <summary>\n        <para>The WriteOnly attribute lets you mark a member of a struct used in a job as write-only.</para>\n      </summary>\n    </member>\n    <member name=\"?:Unity.Jobs.IJob\">\n      <summary>\n        <para>IJob allows you to schedule a single job that runs in parallel to other jobs and the main thread.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Jobs.IJob.Execute\">\n      <summary>\n        <para>Implement this method to perform work on a worker thread.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Jobs.IJobExtensions\">\n      <summary>\n        <para>Extension methods for Jobs using the IJob interface.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Jobs.IJobExtensions.Run(T)\">\n      <summary>\n        <para>Perform the job's Execute method immediately on the same thread.</para>\n      </summary>\n      <param name=\"jobData\">The job and data to Run.</param>\n    </member>\n    <member name=\"M:Unity.Jobs.IJobExtensions.Schedule(T,Unity.Jobs.JobHandle)\">\n      <summary>\n        <para>Schedule the job for execution on a worker thread.</para>\n      </summary>\n      <param name=\"jobData\">The job and data to schedule.</param>\n      <param name=\"dependsOn\">Dependencies are used to ensure that a job executes on workerthreads after the dependency has completed execution. Making sure that two jobs reading or writing to same data do not run in parallel.</param>\n      <returns>\n        <para>The handle identifying the scheduled job. Can be used as a dependency for a later job or ensure completion on the main thread.</para>\n      </returns>\n    </member>\n    <member name=\"?:Unity.Jobs.IJobParallelFor\">\n      <summary>\n        <para>Parallel-for jobs allow you to perform the same independent operation for each element of a native container or for a fixed number of iterations.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Jobs.IJobParallelFor.Execute(System.Int32)\">\n      <summary>\n        <para>Implement this method to perform work against a specific iteration index.</para>\n      </summary>\n      <param name=\"index\">The index of the Parallel for loop at which to perform work.</param>\n    </member>\n    <member name=\"T:Unity.Jobs.IJobParallelForExtensions\">\n      <summary>\n        <para>Extension methods for Jobs using the IJobParallelFor.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Jobs.IJobParallelForExtensions.Run(T,System.Int32)\">\n      <summary>\n        <para>Perform the job's Execute method immediately on the same thread.</para>\n      </summary>\n      <param name=\"jobData\">The job and data to Run.</param>\n      <param name=\"arrayLength\">The number of iterations the for loop will execute.</param>\n    </member>\n    <member name=\"M:Unity.Jobs.IJobParallelForExtensions.Schedule(T,System.Int32,System.Int32,Unity.Jobs.JobHandle)\">\n      <summary>\n        <para>Schedule the job for execution on a worker thread.</para>\n      </summary>\n      <param name=\"jobData\">The job and data to Schedule.</param>\n      <param name=\"arrayLength\">The number of iterations the for loop will execute.</param>\n      <param name=\"innerloopBatchCount\">Granularity in which workstealing is performed. A value of 32, means the job queue will steal 32 iterations and then perform them in an efficient inner loop.</param>\n      <param name=\"dependsOn\">Dependencies are used to ensure that a job executes on workerthreads after the dependency has completed execution. Making sure that two jobs reading or writing to same data do not run in parallel.</param>\n      <returns>\n        <para>The handle identifying the scheduled job. Can be used as a dependency for a later job or ensure completion on the main thread.</para>\n      </returns>\n    </member>\n    <member name=\"T:Unity.Jobs.JobHandle\">\n      <summary>\n        <para>JobHandle.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Jobs.JobHandle.CheckFenceIsDependencyOrDidSyncFence(Unity.Jobs.JobHandle,Unity.Jobs.JobHandle)\">\n      <summary>\n        <para>CheckFenceIsDependencyOrDidSyncFence.</para>\n      </summary>\n      <param name=\"jobHandle\">Job handle.</param>\n      <param name=\"dependsOn\">Job handle dependency.</param>\n      <returns>\n        <para>Return value.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Jobs.JobHandle.CombineDependencies(Unity.Jobs.JobHandle,Unity.Jobs.JobHandle)\">\n      <summary>\n        <para>Combines multiple dependencies into a single one.</para>\n      </summary>\n      <param name=\"job0\"></param>\n      <param name=\"job1\"></param>\n      <param name=\"job2\"></param>\n      <param name=\"jobs\"></param>\n    </member>\n    <member name=\"M:Unity.Jobs.JobHandle.CombineDependencies(Unity.Jobs.JobHandle,Unity.Jobs.JobHandle,Unity.Jobs.JobHandle)\">\n      <summary>\n        <para>Combines multiple dependencies into a single one.</para>\n      </summary>\n      <param name=\"job0\"></param>\n      <param name=\"job1\"></param>\n      <param name=\"job2\"></param>\n      <param name=\"jobs\"></param>\n    </member>\n    <member name=\"M:Unity.Jobs.JobHandle.CombineDependencies(Unity.Collections.NativeArray`1&lt;Unity.Jobs.JobHandle&gt;)\">\n      <summary>\n        <para>Combines multiple dependencies into a single one.</para>\n      </summary>\n      <param name=\"job0\"></param>\n      <param name=\"job1\"></param>\n      <param name=\"job2\"></param>\n      <param name=\"jobs\"></param>\n    </member>\n    <member name=\"M:Unity.Jobs.JobHandle.Complete\">\n      <summary>\n        <para>Ensures that the job has completed.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Jobs.JobHandle.CompleteAll(Unity.Jobs.JobHandle&amp;,Unity.Jobs.JobHandle&amp;)\">\n      <summary>\n        <para>Ensures that all jobs have completed.</para>\n      </summary>\n      <param name=\"job0\"></param>\n      <param name=\"job1\"></param>\n      <param name=\"job2\"></param>\n      <param name=\"jobs\"></param>\n    </member>\n    <member name=\"M:Unity.Jobs.JobHandle.CompleteAll(Unity.Jobs.JobHandle&amp;,Unity.Jobs.JobHandle&amp;,Unity.Jobs.JobHandle&amp;)\">\n      <summary>\n        <para>Ensures that all jobs have completed.</para>\n      </summary>\n      <param name=\"job0\"></param>\n      <param name=\"job1\"></param>\n      <param name=\"job2\"></param>\n      <param name=\"jobs\"></param>\n    </member>\n    <member name=\"M:Unity.Jobs.JobHandle.CompleteAll(Unity.Collections.NativeArray`1&lt;Unity.Jobs.JobHandle&gt;)\">\n      <summary>\n        <para>Ensures that all jobs have completed.</para>\n      </summary>\n      <param name=\"job0\"></param>\n      <param name=\"job1\"></param>\n      <param name=\"job2\"></param>\n      <param name=\"jobs\"></param>\n    </member>\n    <member name=\"P:Unity.Jobs.JobHandle.IsCompleted\">\n      <summary>\n        <para>Returns false if the task is currently running. Returns true if the task has completed.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Jobs.JobHandle.ScheduleBatchedJobs\">\n      <summary>\n        <para>By default jobs are only put on a local queue when using Job Schedule functions, this actually makes them available to the worker threads to execute them.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Jobs.LowLevel.Unsafe.BatchQueryJob`2\">\n      <summary>\n        <para>Struct used to implement batch query jobs.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Jobs.LowLevel.Unsafe.BatchQueryJob_2.#ctor\">\n      <summary>\n        <para>Create BatchQueryJob.</para>\n      </summary>\n      <param name=\"commands\">NativeArray containing the commands to execute during a batch. The job executing the query will only read from the array, not write to it.</param>\n      <param name=\"results\">NativeArray which can contain the results from the commands. The job executing the query will write to the array.</param>\n    </member>\n    <member name=\"T:Unity.Jobs.LowLevel.Unsafe.BatchQueryJobStruct`1\">\n      <summary>\n        <para>Struct used to schedule batch query jobs.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Jobs.LowLevel.Unsafe.BatchQueryJobStruct_1.Initialize\">\n      <summary>\n        <para>Initializes a BatchQueryJobStruct and returns a pointer to an internal structure (System.IntPtr) which should be passed to JobsUtility.JobScheduleParameters.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Jobs.LowLevel.Unsafe.JobHandleUnsafeUtility\">\n      <summary>\n        <para>JobHandle Unsafe Utilities.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Jobs.LowLevel.Unsafe.JobHandleUnsafeUtility.CombineDependencies(Unity.Jobs.JobHandle*,System.Int32)\">\n      <summary>\n        <para>Combines multiple dependencies into a single one using an unsafe array of job handles.\nSee Also: JobHandle.CombineDependencies.</para>\n      </summary>\n      <param name=\"jobs\"></param>\n      <param name=\"count\"></param>\n    </member>\n    <member name=\"T:Unity.Jobs.LowLevel.Unsafe.JobProducerTypeAttribute\">\n      <summary>\n        <para>All job interface types must be marked with the JobProducerType. This is used to compile the Execute method by the Burst ASM inspector.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Jobs.LowLevel.Unsafe.JobProducerTypeAttribute.#ctor(System.Type)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"producerType\">The type containing a static method named \"Execute\" method which is the method invokes by the job system.</param>\n    </member>\n    <member name=\"P:Unity.Jobs.LowLevel.Unsafe.JobProducerTypeAttribute.ProducerType\">\n      <summary>\n        <para>ProducerType is the type containing a static method named \"Execute\" method which is the method invokes by the job system.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Jobs.LowLevel.Unsafe.JobRanges\">\n      <summary>\n        <para>Struct containing information about a range the job is allowed to work on.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Jobs.LowLevel.Unsafe.JobRanges.BatchSize\">\n      <summary>\n        <para>The size of the batch.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Jobs.LowLevel.Unsafe.JobRanges.IndicesPerPhase\">\n      <summary>\n        <para>Number of indices per phase.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Jobs.LowLevel.Unsafe.JobRanges.NumJobs\">\n      <summary>\n        <para>Number of jobs.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Jobs.LowLevel.Unsafe.JobRanges.NumPhases\">\n      <summary>\n        <para>Number of phases.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Jobs.LowLevel.Unsafe.JobRanges.PhaseData\">\n      <summary>\n        <para>Phase Data.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Jobs.LowLevel.Unsafe.JobRanges.StartEndIndex\">\n      <summary>\n        <para>The start and end index of the job range.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Jobs.LowLevel.Unsafe.JobRanges.TotalIterationCount\">\n      <summary>\n        <para>Total iteration count.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Jobs.LowLevel.Unsafe.JobsUtility\">\n      <summary>\n        <para>Static class containing functionality to create, run and debug jobs.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Jobs.LowLevel.Unsafe.JobsUtility.CacheLineSize\">\n      <summary>\n        <para>Size of a cache line.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Jobs.LowLevel.Unsafe.JobsUtility.CreateJobReflectionData\">\n      <summary>\n        <para>Creates job reflection data.</para>\n      </summary>\n      <returns>\n        <para>Returns pointer to internal JobReflectionData.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Jobs.LowLevel.Unsafe.JobsUtility.CreateJobReflectionData\">\n      <summary>\n        <para>Creates job reflection data.</para>\n      </summary>\n      <returns>\n        <para>Returns pointer to internal JobReflectionData.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Jobs.LowLevel.Unsafe.JobsUtility.GetJobRange(Unity.Jobs.LowLevel.Unsafe.JobRanges&amp;,System.Int32,System.Int32&amp;,System.Int32&amp;)\">\n      <summary>\n        <para>Returns the begin index and end index of the range.</para>\n      </summary>\n      <param name=\"ranges\"></param>\n      <param name=\"jobIndex\"></param>\n      <param name=\"beginIndex\"></param>\n      <param name=\"endIndex\"></param>\n    </member>\n    <member name=\"M:Unity.Jobs.LowLevel.Unsafe.JobsUtility.GetWorkStealingRange(Unity.Jobs.LowLevel.Unsafe.JobRanges&amp;,System.Int32,System.Int32&amp;,System.Int32&amp;)\">\n      <summary>\n        <para>Returns the work stealing range.</para>\n      </summary>\n      <param name=\"ranges\"></param>\n      <param name=\"jobIndex\"></param>\n      <param name=\"beginIndex\"></param>\n      <param name=\"endIndex\"></param>\n      <returns>\n        <para>Returns true if successful.</para>\n      </returns>\n    </member>\n    <member name=\"P:Unity.Jobs.LowLevel.Unsafe.JobsUtility.JobCompilerEnabled\">\n      <summary>\n        <para>When disabled, forces jobs that have already been compiled with burst to run in mono instead. For example if you want to debug the C# jobs or just want to compare behaviour or performance.</para>\n      </summary>\n    </member>\n    <member name=\"P:Unity.Jobs.LowLevel.Unsafe.JobsUtility.JobDebuggerEnabled\">\n      <summary>\n        <para>Enables and disables the job debugger at runtime. Note that currently the job debugger is only supported in the Editor. Thus this only has effect in the editor.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Jobs.LowLevel.Unsafe.JobsUtility.JobScheduleParameters\">\n      <summary>\n        <para>Struct containing job parameters for scheduling.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Jobs.LowLevel.Unsafe.JobsUtility.JobScheduleParameters.#ctor(System.Void*,System.IntPtr,Unity.Jobs.JobHandle,Unity.Jobs.LowLevel.Unsafe.ScheduleMode)\">\n      <summary>\n        <para>Constructor.</para>\n      </summary>\n      <param name=\"i_jobData\"></param>\n      <param name=\"i_reflectionData\"></param>\n      <param name=\"i_dependency\"></param>\n      <param name=\"i_scheduleMode\"></param>\n    </member>\n    <member name=\"F:Unity.Jobs.LowLevel.Unsafe.JobsUtility.JobScheduleParameters.Dependency\">\n      <summary>\n        <para>A JobHandle to any dependency this job would have.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Jobs.LowLevel.Unsafe.JobsUtility.JobScheduleParameters.JobDataPtr\">\n      <summary>\n        <para>Pointer to the job data.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Jobs.LowLevel.Unsafe.JobsUtility.JobScheduleParameters.ReflectionData\">\n      <summary>\n        <para>Pointer to the reflection data.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Jobs.LowLevel.Unsafe.JobsUtility.JobScheduleParameters.ScheduleMode\">\n      <summary>\n        <para>ScheduleMode option.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Jobs.LowLevel.Unsafe.JobsUtility.MaxJobThreadCount\">\n      <summary>\n        <para>Maximum job thread count.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Jobs.LowLevel.Unsafe.JobsUtility.PatchBufferMinMaxRanges\">\n      <summary>\n        <para>Injects debug checks for min and max ranges of native array.</para>\n      </summary>\n    </member>\n    <member name=\"M:Unity.Jobs.LowLevel.Unsafe.JobsUtility.Schedule(Unity.Jobs.LowLevel.Unsafe.JobsUtility/JobScheduleParameters&amp;)\">\n      <summary>\n        <para>Schedule a single IJob.</para>\n      </summary>\n      <param name=\"parameters\"></param>\n      <returns>\n        <para>Returns a JobHandle to the newly created Job.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Jobs.LowLevel.Unsafe.JobsUtility.ScheduleParallelFor(Unity.Jobs.LowLevel.Unsafe.JobsUtility/JobScheduleParameters&amp;,System.Int32,System.Int32)\">\n      <summary>\n        <para>Schedule a IJobParallelFor job.</para>\n      </summary>\n      <param name=\"parameters\"></param>\n      <param name=\"arrayLength\"></param>\n      <param name=\"innerloopBatchCount\"></param>\n      <returns>\n        <para>Returns a JobHandle to the newly created Job.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Jobs.LowLevel.Unsafe.JobsUtility.ScheduleParallelForDeferArraySize(Unity.Jobs.LowLevel.Unsafe.JobsUtility/JobScheduleParameters&amp;,System.Int32,System.Void*,System.Void*)\">\n      <summary>\n        <para>Schedule a IJobParallelFor job.</para>\n      </summary>\n      <param name=\"parameters\"></param>\n      <param name=\"innerloopBatchCount\"></param>\n      <param name=\"listData\"></param>\n      <param name=\"listDataAtomicSafetyHandle\"></param>\n      <returns>\n        <para>Returns a JobHandle to the newly created Job.</para>\n      </returns>\n    </member>\n    <member name=\"M:Unity.Jobs.LowLevel.Unsafe.JobsUtility.ScheduleParallelForTransform(Unity.Jobs.LowLevel.Unsafe.JobsUtility/JobScheduleParameters&amp;,System.IntPtr)\">\n      <summary>\n        <para>Schedule a IJobParallelForTransform job.</para>\n      </summary>\n      <param name=\"parameters\"></param>\n      <param name=\"transfromAccesssArray\"></param>\n      <returns>\n        <para>Returns a JobHandle to the newly created Job.</para>\n      </returns>\n    </member>\n    <member name=\"T:Unity.Jobs.LowLevel.Unsafe.JobType\">\n      <summary>\n        <para>Determines what the job is used for (ParallelFor or a single job).</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Jobs.LowLevel.Unsafe.JobType.ParallelFor\">\n      <summary>\n        <para>A parallel for job.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Jobs.LowLevel.Unsafe.JobType.Single\">\n      <summary>\n        <para>A single job.</para>\n      </summary>\n    </member>\n    <member name=\"T:Unity.Jobs.LowLevel.Unsafe.ScheduleMode\">\n      <summary>\n        <para>ScheduleMode options for scheduling a manage job.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Jobs.LowLevel.Unsafe.ScheduleMode.Batched\">\n      <summary>\n        <para>Schedule job as batched.</para>\n      </summary>\n    </member>\n    <member name=\"F:Unity.Jobs.LowLevel.Unsafe.ScheduleMode.Run\">\n      <summary>\n        <para>Schedule job as independent.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.UnityAPICompatibilityVersionAttribute\">\n      <summary>\n        <para>Declares an assembly to be compatible (API wise) with a specific Unity API. Used by internal tools to avoid processing the assembly in order to decide whether assemblies may be using old Unity API.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.UnityAPICompatibilityVersionAttribute.version\">\n      <summary>\n        <para>Version of Unity API.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.UnityAPICompatibilityVersionAttribute.#ctor(System.String)\">\n      <summary>\n        <para>Initializes a new instance of UnityAPICompatibilityVersionAttribute.</para>\n      </summary>\n      <param name=\"version\">Unity version that this assembly with compatible with.</param>\n    </member>\n    <member name=\"T:UnityEngine.UserAuthorization\">\n      <summary>\n        <para>Constants to pass to Application.RequestUserAuthorization.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UserAuthorization.Microphone\">\n      <summary>\n        <para>Request permission to use any audio input sources attached to the computer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.UserAuthorization.WebCam\">\n      <summary>\n        <para>Request permission to use any video input sources attached to the computer.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Vector2\">\n      <summary>\n        <para>Representation of 2D vectors and points.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2.down\">\n      <summary>\n        <para>Shorthand for writing Vector2(0, -1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2.left\">\n      <summary>\n        <para>Shorthand for writing Vector2(-1, 0).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2.magnitude\">\n      <summary>\n        <para>Returns the length of this vector (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2.negativeInfinity\">\n      <summary>\n        <para>Shorthand for writing Vector2(float.NegativeInfinity, float.NegativeInfinity).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2.normalized\">\n      <summary>\n        <para>Returns this vector with a magnitude of 1 (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2.one\">\n      <summary>\n        <para>Shorthand for writing Vector2(1, 1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2.positiveInfinity\">\n      <summary>\n        <para>Shorthand for writing Vector2(float.PositiveInfinity, float.PositiveInfinity).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2.right\">\n      <summary>\n        <para>Shorthand for writing Vector2(1, 0).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2.sqrMagnitude\">\n      <summary>\n        <para>Returns the squared length of this vector (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2.up\">\n      <summary>\n        <para>Shorthand for writing Vector2(0, 1).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Vector2.x\">\n      <summary>\n        <para>X component of the vector.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Vector2.y\">\n      <summary>\n        <para>Y component of the vector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2.zero\">\n      <summary>\n        <para>Shorthand for writing Vector2(0, 0).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.Angle(UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Returns the unsigned angle in degrees between from and to.</para>\n      </summary>\n      <param name=\"from\">The vector from which the angular difference is measured.</param>\n      <param name=\"to\">The vector to which the angular difference is measured.</param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.ClampMagnitude(UnityEngine.Vector2,System.Single)\">\n      <summary>\n        <para>Returns a copy of vector with its magnitude clamped to maxLength.</para>\n      </summary>\n      <param name=\"vector\"></param>\n      <param name=\"maxLength\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.#ctor(System.Single,System.Single)\">\n      <summary>\n        <para>Constructs a new vector with given x, y components.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.Distance(UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Returns the distance between a and b.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.Dot(UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Dot Product of two vectors.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.Equals(System.Object)\">\n      <summary>\n        <para>Returns true if the given vector is exactly equal to this vector.</para>\n      </summary>\n      <param name=\"other\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector2.implop_Vector2(Vector3)(UnityEngine.Vector3)\">\n      <summary>\n        <para>Converts a Vector3 to a Vector2.</para>\n      </summary>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector2.implop_Vector3(Vector2)(UnityEngine.Vector2)\">\n      <summary>\n        <para>Converts a Vector2 to a Vector3.</para>\n      </summary>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.Lerp(UnityEngine.Vector2,UnityEngine.Vector2,System.Single)\">\n      <summary>\n        <para>Linearly interpolates between vectors a and b by t.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.LerpUnclamped(UnityEngine.Vector2,UnityEngine.Vector2,System.Single)\">\n      <summary>\n        <para>Linearly interpolates between vectors a and b by t.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.Max(UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Returns a vector that is made from the largest components of two vectors.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.Min(UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Returns a vector that is made from the smallest components of two vectors.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.MoveTowards(UnityEngine.Vector2,UnityEngine.Vector2,System.Single)\">\n      <summary>\n        <para>Moves a point current towards target.</para>\n      </summary>\n      <param name=\"current\"></param>\n      <param name=\"target\"></param>\n      <param name=\"maxDistanceDelta\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.Normalize\">\n      <summary>\n        <para>Makes this vector have a magnitude of 1.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Vector2.op_Divide(UnityEngine.Vector2,System.Single)\">\n      <summary>\n        <para>Divides a vector by a number.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"d\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector2.op_Divide(UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Divides a vector by another vector.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector2.op_Equal(UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Returns true if two vectors are approximately equal.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector2.op_Minus(UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Subtracts one vector from another.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector2.op_Minus(UnityEngine.Vector2)\">\n      <summary>\n        <para>Negates a vector.</para>\n      </summary>\n      <param name=\"a\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector2.op_Multiply(UnityEngine.Vector2,System.Single)\">\n      <summary>\n        <para>Multiplies a vector by a number.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"d\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector2.op_Multiply(System.Single,UnityEngine.Vector2)\">\n      <summary>\n        <para>Multiplies a vector by a number.</para>\n      </summary>\n      <param name=\"d\"></param>\n      <param name=\"a\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector2.op_Multiply(UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Multiplies a vector by another vector.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector2.op_Plus(UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Adds two vectors.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.Perpendicular(UnityEngine.Vector2)\">\n      <summary>\n        <para>Returns the 2D vector perpendicular to this 2D vector. The result is always rotated 90-degrees in a counter-clockwise direction for a 2D coordinate system where the positive Y axis goes up.</para>\n      </summary>\n      <param name=\"inDirection\">The input direction.</param>\n      <returns>\n        <para>The perpendicular direction.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.Reflect(UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Reflects a vector off the vector defined by a normal.</para>\n      </summary>\n      <param name=\"inDirection\"></param>\n      <param name=\"inNormal\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.Scale(UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Multiplies two vectors component-wise.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.Scale(UnityEngine.Vector2)\">\n      <summary>\n        <para>Multiplies every component of this vector by the same component of scale.</para>\n      </summary>\n      <param name=\"scale\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.Set(System.Single,System.Single)\">\n      <summary>\n        <para>Set x and y components of an existing Vector2.</para>\n      </summary>\n      <param name=\"newX\"></param>\n      <param name=\"newY\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.SignedAngle(UnityEngine.Vector2,UnityEngine.Vector2)\">\n      <summary>\n        <para>Returns the signed angle in degrees between from and to.</para>\n      </summary>\n      <param name=\"from\">The vector from which the angular difference is measured.</param>\n      <param name=\"to\">The vector to which the angular difference is measured.</param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.SmoothDamp(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.Vector2&amp;,System.Single)\">\n      <summary>\n        <para>Gradually changes a vector towards a desired goal over time.</para>\n      </summary>\n      <param name=\"current\">The current position.</param>\n      <param name=\"target\">The position we are trying to reach.</param>\n      <param name=\"currentVelocity\">The current velocity, this value is modified by the function every time you call it.</param>\n      <param name=\"smoothTime\">Approximately the time it will take to reach the target. A smaller value will reach the target faster.</param>\n      <param name=\"maxSpeed\">Optionally allows you to clamp the maximum speed.</param>\n      <param name=\"deltaTime\">The time since the last call to this function. By default Time.deltaTime.</param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.SmoothDamp(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.Vector2&amp;,System.Single,System.Single)\">\n      <summary>\n        <para>Gradually changes a vector towards a desired goal over time.</para>\n      </summary>\n      <param name=\"current\">The current position.</param>\n      <param name=\"target\">The position we are trying to reach.</param>\n      <param name=\"currentVelocity\">The current velocity, this value is modified by the function every time you call it.</param>\n      <param name=\"smoothTime\">Approximately the time it will take to reach the target. A smaller value will reach the target faster.</param>\n      <param name=\"maxSpeed\">Optionally allows you to clamp the maximum speed.</param>\n      <param name=\"deltaTime\">The time since the last call to this function. By default Time.deltaTime.</param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.SmoothDamp(UnityEngine.Vector2,UnityEngine.Vector2,UnityEngine.Vector2&amp;,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Gradually changes a vector towards a desired goal over time.</para>\n      </summary>\n      <param name=\"current\">The current position.</param>\n      <param name=\"target\">The position we are trying to reach.</param>\n      <param name=\"currentVelocity\">The current velocity, this value is modified by the function every time you call it.</param>\n      <param name=\"smoothTime\">Approximately the time it will take to reach the target. A smaller value will reach the target faster.</param>\n      <param name=\"maxSpeed\">Optionally allows you to clamp the maximum speed.</param>\n      <param name=\"deltaTime\">The time since the last call to this function. By default Time.deltaTime.</param>\n    </member>\n    <member name=\"P:UnityEngine.Vector2.this\">\n      <summary>\n        <para>Access the x or y component using [0] or [1] respectively.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.ToString\">\n      <summary>\n        <para>Returns a nicely formatted string for this vector.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2.ToString(System.String)\">\n      <summary>\n        <para>Returns a nicely formatted string for this vector.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Vector2Int\">\n      <summary>\n        <para>Representation of 2D vectors and points using integers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2Int.down\">\n      <summary>\n        <para>Shorthand for writing Vector2Int (0, -1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2Int.left\">\n      <summary>\n        <para>Shorthand for writing Vector2Int (-1, 0).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2Int.magnitude\">\n      <summary>\n        <para>Returns the length of this vector (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2Int.one\">\n      <summary>\n        <para>Shorthand for writing Vector2Int (1, 1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2Int.right\">\n      <summary>\n        <para>Shorthand for writing Vector2Int (1, 0).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2Int.sqrMagnitude\">\n      <summary>\n        <para>Returns the squared length of this vector (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2Int.up\">\n      <summary>\n        <para>Shorthand for writing Vector2Int (0, 1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2Int.x\">\n      <summary>\n        <para>X component of the vector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2Int.y\">\n      <summary>\n        <para>Y component of the vector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector2Int.zero\">\n      <summary>\n        <para>Shorthand for writing Vector2Int (0, 0).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Vector2Int.CeilToInt(UnityEngine.Vector2)\">\n      <summary>\n        <para>Converts a  Vector2 to a Vector2Int by doing a Ceiling to each value.</para>\n      </summary>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2Int.Clamp(UnityEngine.Vector2Int,UnityEngine.Vector2Int)\">\n      <summary>\n        <para>Clamps the Vector2Int to the bounds given by min and max.</para>\n      </summary>\n      <param name=\"min\"></param>\n      <param name=\"max\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2Int.Distance(UnityEngine.Vector2Int,UnityEngine.Vector2Int)\">\n      <summary>\n        <para>Returns the distance between a and b.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2Int.Equals(System.Object)\">\n      <summary>\n        <para>Returns true if the objects are equal.</para>\n      </summary>\n      <param name=\"other\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2Int.FloorToInt(UnityEngine.Vector2)\">\n      <summary>\n        <para>Converts a Vector2 to a Vector2Int by doing a Floor to each value.</para>\n      </summary>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2Int.GetHashCode\">\n      <summary>\n        <para>Gets the hash code for the Vector2Int.</para>\n      </summary>\n      <returns>\n        <para>The hash code of the Vector2Int.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.Vector2Int.implop_Vector2(Vector2Int)(UnityEngine.Vector2Int)\">\n      <summary>\n        <para>Converts a Vector2Int to a Vector2.</para>\n      </summary>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2Int.Max(UnityEngine.Vector2Int,UnityEngine.Vector2Int)\">\n      <summary>\n        <para>Returns a vector that is made from the largest components of two vectors.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2Int.Min(UnityEngine.Vector2Int,UnityEngine.Vector2Int)\">\n      <summary>\n        <para>Returns a vector that is made from the smallest components of two vectors.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector2Int.op_Equal(UnityEngine.Vector2Int,UnityEngine.Vector2Int)\">\n      <summary>\n        <para>Returns true if the vectors are equal.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector2Int.op_Minus(UnityEngine.Vector2Int,UnityEngine.Vector2Int)\">\n      <summary>\n        <para>Subtracts one vector from another.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector2Int.op_Multiply(UnityEngine.Vector2Int,UnityEngine.Vector2Int)\">\n      <summary>\n        <para>Multiplies a vector by a number.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector2Int.op_Multiply(UnityEngine.Vector2Int,System.Int32)\">\n      <summary>\n        <para>Multiplies a vector by a number.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector2Int.op_NotEqual(UnityEngine.Vector2Int,UnityEngine.Vector2Int)\">\n      <summary>\n        <para>Returns true if vectors different.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector2Int.op_Plus(UnityEngine.Vector2Int,UnityEngine.Vector2Int)\">\n      <summary>\n        <para>Adds two vectors.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2Int.RoundToInt(UnityEngine.Vector2)\">\n      <summary>\n        <para>Converts a  Vector2 to a Vector2Int by doing a Round to each value.</para>\n      </summary>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2Int.Scale(UnityEngine.Vector2Int,UnityEngine.Vector2Int)\">\n      <summary>\n        <para>Multiplies two vectors component-wise.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2Int.Scale(UnityEngine.Vector2Int)\">\n      <summary>\n        <para>Multiplies every component of this vector by the same component of scale.</para>\n      </summary>\n      <param name=\"scale\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector2Int.Set(System.Int32,System.Int32)\">\n      <summary>\n        <para>Set x and y components of an existing Vector2Int.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Vector2Int.this\">\n      <summary>\n        <para>Access the x or y component using [0] or [1] respectively.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Vector2Int.ToString\">\n      <summary>\n        <para>Returns a nicely formatted string for this vector.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Vector3\">\n      <summary>\n        <para>Representation of 3D vectors and points.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3.back\">\n      <summary>\n        <para>Shorthand for writing Vector3(0, 0, -1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3.down\">\n      <summary>\n        <para>Shorthand for writing Vector3(0, -1, 0).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3.forward\">\n      <summary>\n        <para>Shorthand for writing Vector3(0, 0, 1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3.left\">\n      <summary>\n        <para>Shorthand for writing Vector3(-1, 0, 0).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3.magnitude\">\n      <summary>\n        <para>Returns the length of this vector (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3.negativeInfinity\">\n      <summary>\n        <para>Shorthand for writing Vector3(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3.normalized\">\n      <summary>\n        <para>Returns this vector with a magnitude of 1 (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3.one\">\n      <summary>\n        <para>Shorthand for writing Vector3(1, 1, 1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3.positiveInfinity\">\n      <summary>\n        <para>Shorthand for writing Vector3(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3.right\">\n      <summary>\n        <para>Shorthand for writing Vector3(1, 0, 0).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3.sqrMagnitude\">\n      <summary>\n        <para>Returns the squared length of this vector (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3.up\">\n      <summary>\n        <para>Shorthand for writing Vector3(0, 1, 0).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Vector3.x\">\n      <summary>\n        <para>X component of the vector.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Vector3.y\">\n      <summary>\n        <para>Y component of the vector.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Vector3.z\">\n      <summary>\n        <para>Z component of the vector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3.zero\">\n      <summary>\n        <para>Shorthand for writing Vector3(0, 0, 0).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.Angle(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Returns the angle in degrees between from and to.</para>\n      </summary>\n      <param name=\"from\">The vector from which the angular difference is measured.</param>\n      <param name=\"to\">The vector to which the angular difference is measured.</param>\n      <returns>\n        <para>The angle in degrees between the two vectors.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.ClampMagnitude(UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Returns a copy of vector with its magnitude clamped to maxLength.</para>\n      </summary>\n      <param name=\"vector\"></param>\n      <param name=\"maxLength\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.Cross(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Cross Product of two vectors.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.#ctor(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Creates a new vector with given x, y, z components.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"z\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.#ctor(System.Single,System.Single)\">\n      <summary>\n        <para>Creates a new vector with given x, y components and sets z to zero.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.Distance(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Returns the distance between a and b.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.Dot(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Dot Product of two vectors.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.Equals(System.Object)\">\n      <summary>\n        <para>Returns true if the given vector is exactly equal to this vector.</para>\n      </summary>\n      <param name=\"other\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.Lerp(UnityEngine.Vector3,UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Linearly interpolates between two vectors.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.LerpUnclamped(UnityEngine.Vector3,UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Linearly interpolates between two vectors.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.Max(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Returns a vector that is made from the largest components of two vectors.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.Min(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Returns a vector that is made from the smallest components of two vectors.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.MoveTowards(UnityEngine.Vector3,UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Moves a point current in a straight line towards a target point.</para>\n      </summary>\n      <param name=\"current\"></param>\n      <param name=\"target\"></param>\n      <param name=\"maxDistanceDelta\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.Normalize(UnityEngine.Vector3)\">\n      <summary>\n        <para>Makes this vector have a magnitude of 1.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector3.op_Divide(UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Divides a vector by a number.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"d\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector3.op_Equal(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Returns true if two vectors are approximately equal.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector3.op_Minus(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Subtracts one vector from another.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector3.op_Minus(UnityEngine.Vector3)\">\n      <summary>\n        <para>Negates a vector.</para>\n      </summary>\n      <param name=\"a\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector3.op_Multiply(UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Multiplies a vector by a number.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"d\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector3.op_Multiply(System.Single,UnityEngine.Vector3)\">\n      <summary>\n        <para>Multiplies a vector by a number.</para>\n      </summary>\n      <param name=\"d\"></param>\n      <param name=\"a\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector3.op_NotEqual(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Returns true if vectors different.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector3.op_Plus(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Adds two vectors.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.OrthoNormalize(UnityEngine.Vector3&amp;,UnityEngine.Vector3&amp;)\">\n      <summary>\n        <para>Makes vectors normalized and orthogonal to each other.</para>\n      </summary>\n      <param name=\"normal\"></param>\n      <param name=\"tangent\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.OrthoNormalize(UnityEngine.Vector3&amp;,UnityEngine.Vector3&amp;,UnityEngine.Vector3&amp;)\">\n      <summary>\n        <para>Makes vectors normalized and orthogonal to each other.</para>\n      </summary>\n      <param name=\"normal\"></param>\n      <param name=\"tangent\"></param>\n      <param name=\"binormal\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.Project(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Projects a vector onto another vector.</para>\n      </summary>\n      <param name=\"vector\"></param>\n      <param name=\"onNormal\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.ProjectOnPlane(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Projects a vector onto a plane defined by a normal orthogonal to the plane.</para>\n      </summary>\n      <param name=\"vector\"></param>\n      <param name=\"planeNormal\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.Reflect(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Reflects a vector off the plane defined by a normal.</para>\n      </summary>\n      <param name=\"inDirection\"></param>\n      <param name=\"inNormal\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.RotateTowards(UnityEngine.Vector3,UnityEngine.Vector3,System.Single,System.Single)\">\n      <summary>\n        <para>Rotates a vector current towards target.</para>\n      </summary>\n      <param name=\"current\">The vector being managed.</param>\n      <param name=\"target\">The vector.</param>\n      <param name=\"maxRadiansDelta\">The distance between the two vectors  in radians.</param>\n      <param name=\"maxMagnitudeDelta\">The length of the radian.</param>\n      <returns>\n        <para>The location that RotateTowards generates.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.Scale(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Multiplies two vectors component-wise.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.Scale(UnityEngine.Vector3)\">\n      <summary>\n        <para>Multiplies every component of this vector by the same component of scale.</para>\n      </summary>\n      <param name=\"scale\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.Set(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Set x, y and z components of an existing Vector3.</para>\n      </summary>\n      <param name=\"newX\"></param>\n      <param name=\"newY\"></param>\n      <param name=\"newZ\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.SignedAngle(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Returns the signed angle in degrees between from and to.</para>\n      </summary>\n      <param name=\"from\">The vector from which the angular difference is measured.</param>\n      <param name=\"to\">The vector to which the angular difference is measured.</param>\n      <param name=\"axis\">A vector around which the other vectors are rotated.</param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.Slerp(UnityEngine.Vector3,UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Spherically interpolates between two vectors.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.SlerpUnclamped(UnityEngine.Vector3,UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>Spherically interpolates between two vectors.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.SmoothDamp(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3&amp;,System.Single)\">\n      <summary>\n        <para>Gradually changes a vector towards a desired goal over time.</para>\n      </summary>\n      <param name=\"current\">The current position.</param>\n      <param name=\"target\">The position we are trying to reach.</param>\n      <param name=\"currentVelocity\">The current velocity, this value is modified by the function every time you call it.</param>\n      <param name=\"smoothTime\">Approximately the time it will take to reach the target. A smaller value will reach the target faster.</param>\n      <param name=\"maxSpeed\">Optionally allows you to clamp the maximum speed.</param>\n      <param name=\"deltaTime\">The time since the last call to this function. By default Time.deltaTime.</param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.SmoothDamp(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3&amp;,System.Single,System.Single)\">\n      <summary>\n        <para>Gradually changes a vector towards a desired goal over time.</para>\n      </summary>\n      <param name=\"current\">The current position.</param>\n      <param name=\"target\">The position we are trying to reach.</param>\n      <param name=\"currentVelocity\">The current velocity, this value is modified by the function every time you call it.</param>\n      <param name=\"smoothTime\">Approximately the time it will take to reach the target. A smaller value will reach the target faster.</param>\n      <param name=\"maxSpeed\">Optionally allows you to clamp the maximum speed.</param>\n      <param name=\"deltaTime\">The time since the last call to this function. By default Time.deltaTime.</param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.SmoothDamp(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3&amp;,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Gradually changes a vector towards a desired goal over time.</para>\n      </summary>\n      <param name=\"current\">The current position.</param>\n      <param name=\"target\">The position we are trying to reach.</param>\n      <param name=\"currentVelocity\">The current velocity, this value is modified by the function every time you call it.</param>\n      <param name=\"smoothTime\">Approximately the time it will take to reach the target. A smaller value will reach the target faster.</param>\n      <param name=\"maxSpeed\">Optionally allows you to clamp the maximum speed.</param>\n      <param name=\"deltaTime\">The time since the last call to this function. By default Time.deltaTime.</param>\n    </member>\n    <member name=\"P:UnityEngine.Vector3.this\">\n      <summary>\n        <para>Access the x, y, z components using [0], [1], [2] respectively.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.ToString\">\n      <summary>\n        <para>Returns a nicely formatted string for this vector.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3.ToString(System.String)\">\n      <summary>\n        <para>Returns a nicely formatted string for this vector.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Vector3Int\">\n      <summary>\n        <para>Representation of 3D vectors and points using integers.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3Int.down\">\n      <summary>\n        <para>Shorthand for writing Vector3Int (0, -1, 0).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3Int.left\">\n      <summary>\n        <para>Shorthand for writing Vector3Int (-1, 0, 0).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3Int.magnitude\">\n      <summary>\n        <para>Returns the length of this vector (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3Int.one\">\n      <summary>\n        <para>Shorthand for writing Vector3Int (1, 1, 1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3Int.right\">\n      <summary>\n        <para>Shorthand for writing Vector3Int (1, 0, 0).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3Int.sqrMagnitude\">\n      <summary>\n        <para>Returns the squared length of this vector (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3Int.up\">\n      <summary>\n        <para>Shorthand for writing Vector3Int (0, 1, 0).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3Int.x\">\n      <summary>\n        <para>X component of the vector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3Int.y\">\n      <summary>\n        <para>Y component of the vector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3Int.z\">\n      <summary>\n        <para>Z component of the vector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector3Int.zero\">\n      <summary>\n        <para>Shorthand for writing Vector3Int (0, 0, 0).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Vector3Int.CeilToInt(UnityEngine.Vector3)\">\n      <summary>\n        <para>Converts a  Vector3 to a Vector3Int by doing a Ceiling to each value.</para>\n      </summary>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3Int.Clamp(UnityEngine.Vector3Int,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Clamps the Vector3Int to the bounds given by min and max.</para>\n      </summary>\n      <param name=\"min\"></param>\n      <param name=\"max\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3Int.Distance(UnityEngine.Vector3Int,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Returns the distance between a and b.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3Int.Equals(System.Object)\">\n      <summary>\n        <para>Returns true if the objects are equal.</para>\n      </summary>\n      <param name=\"other\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3Int.FloorToInt(UnityEngine.Vector3)\">\n      <summary>\n        <para>Converts a  Vector3 to a Vector3Int by doing a Floor to each value.</para>\n      </summary>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3Int.GetHashCode\">\n      <summary>\n        <para>Gets the hash code for the Vector3Int.</para>\n      </summary>\n      <returns>\n        <para>The hash code of the Vector3Int.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.Vector3Int.implop_Vector3(Vector3Int)(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Converts a Vector3Int to a Vector3.</para>\n      </summary>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3Int.Max(UnityEngine.Vector3Int,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Returns a vector that is made from the largest components of two vectors.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3Int.Min(UnityEngine.Vector3Int,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Returns a vector that is made from the smallest components of two vectors.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector3Int.op_Equal(UnityEngine.Vector3Int,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Returns true if the vectors are equal.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector3Int.op_Minus(UnityEngine.Vector3Int,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Subtracts one vector from another.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector3Int.op_Multiply(UnityEngine.Vector3Int,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Multiplies a vector by a number.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector3Int.op_Multiply(UnityEngine.Vector3Int,System.Int32)\">\n      <summary>\n        <para>Multiplies a vector by a number.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector3Int.op_NotEqual(UnityEngine.Vector3Int,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Returns true if vectors different.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector3Int.op_Plus(UnityEngine.Vector3Int,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Adds two vectors.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3Int.RoundToInt(UnityEngine.Vector3)\">\n      <summary>\n        <para>Converts a  Vector3 to a Vector3Int by doing a Round to each value.</para>\n      </summary>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3Int.Scale(UnityEngine.Vector3Int,UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Multiplies two vectors component-wise.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3Int.Scale(UnityEngine.Vector3Int)\">\n      <summary>\n        <para>Multiplies every component of this vector by the same component of scale.</para>\n      </summary>\n      <param name=\"scale\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3Int.Set(System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Set x, y and z components of an existing Vector3Int.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"z\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Vector3Int.this\">\n      <summary>\n        <para>Access the x, y or z component using [0], [1] or [2] respectively.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Vector3Int.ToString\">\n      <summary>\n        <para>Returns a nicely formatted string for this vector.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector3Int.ToString(System.String)\">\n      <summary>\n        <para>Returns a nicely formatted string for this vector.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"T:UnityEngine.Vector4\">\n      <summary>\n        <para>Representation of four-dimensional vectors.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector4.magnitude\">\n      <summary>\n        <para>Returns the length of this vector (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector4.negativeInfinity\">\n      <summary>\n        <para>Shorthand for writing Vector4(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector4.normalized\">\n      <summary>\n        <para>Returns this vector with a magnitude of 1 (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector4.one\">\n      <summary>\n        <para>Shorthand for writing Vector4(1,1,1,1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector4.positiveInfinity\">\n      <summary>\n        <para>Shorthand for writing Vector4(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector4.sqrMagnitude\">\n      <summary>\n        <para>Returns the squared length of this vector (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Vector4.w\">\n      <summary>\n        <para>W component of the vector.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Vector4.x\">\n      <summary>\n        <para>X component of the vector.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Vector4.y\">\n      <summary>\n        <para>Y component of the vector.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Vector4.z\">\n      <summary>\n        <para>Z component of the vector.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Vector4.zero\">\n      <summary>\n        <para>Shorthand for writing Vector4(0,0,0,0).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.#ctor(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Creates a new vector with given x, y, z, w components.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"z\"></param>\n      <param name=\"w\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.#ctor(System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Creates a new vector with given x, y, z components and sets w to zero.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"z\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.#ctor(System.Single,System.Single)\">\n      <summary>\n        <para>Creates a new vector with given x, y components and sets z and w to zero.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.Distance(UnityEngine.Vector4,UnityEngine.Vector4)\">\n      <summary>\n        <para>Returns the distance between a and b.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.Dot(UnityEngine.Vector4,UnityEngine.Vector4)\">\n      <summary>\n        <para>Dot Product of two vectors.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.Equals(System.Object)\">\n      <summary>\n        <para>Returns true if the given vector is exactly equal to this vector.</para>\n      </summary>\n      <param name=\"other\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector4.implop_Vector2(Vector4)(UnityEngine.Vector4)\">\n      <summary>\n        <para>Converts a Vector4 to a Vector2.</para>\n      </summary>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector4.implop_Vector3(Vector4)(UnityEngine.Vector4)\">\n      <summary>\n        <para>Converts a Vector4 to a Vector3.</para>\n      </summary>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector4.implop_Vector4(Vector2)(UnityEngine.Vector2)\">\n      <summary>\n        <para>Converts a Vector2 to a Vector4.</para>\n      </summary>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector4.implop_Vector4(Vector3)(UnityEngine.Vector3)\">\n      <summary>\n        <para>Converts a Vector3 to a Vector4.</para>\n      </summary>\n      <param name=\"v\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.Lerp(UnityEngine.Vector4,UnityEngine.Vector4,System.Single)\">\n      <summary>\n        <para>Linearly interpolates between two vectors.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.LerpUnclamped(UnityEngine.Vector4,UnityEngine.Vector4,System.Single)\">\n      <summary>\n        <para>Linearly interpolates between two vectors.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n      <param name=\"t\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.Max(UnityEngine.Vector4,UnityEngine.Vector4)\">\n      <summary>\n        <para>Returns a vector that is made from the largest components of two vectors.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.Min(UnityEngine.Vector4,UnityEngine.Vector4)\">\n      <summary>\n        <para>Returns a vector that is made from the smallest components of two vectors.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.MoveTowards(UnityEngine.Vector4,UnityEngine.Vector4,System.Single)\">\n      <summary>\n        <para>Moves a point current towards target.</para>\n      </summary>\n      <param name=\"current\"></param>\n      <param name=\"target\"></param>\n      <param name=\"maxDistanceDelta\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.Normalize(UnityEngine.Vector4)\">\n      <summary>\n        <para></para>\n      </summary>\n      <param name=\"a\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.Normalize\">\n      <summary>\n        <para>Makes this vector have a magnitude of 1.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Vector4.op_Divide(UnityEngine.Vector4,System.Single)\">\n      <summary>\n        <para>Divides a vector by a number.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"d\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector4.op_Equal(UnityEngine.Vector4,UnityEngine.Vector4)\">\n      <summary>\n        <para>Returns true if two vectors are approximately equal.</para>\n      </summary>\n      <param name=\"lhs\"></param>\n      <param name=\"rhs\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector4.op_Minus(UnityEngine.Vector4,UnityEngine.Vector4)\">\n      <summary>\n        <para>Subtracts one vector from another.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector4.op_Minus(UnityEngine.Vector4)\">\n      <summary>\n        <para>Negates a vector.</para>\n      </summary>\n      <param name=\"a\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector4.op_Multiply(UnityEngine.Vector4,System.Single)\">\n      <summary>\n        <para>Multiplies a vector by a number.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"d\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector4.op_Multiply(System.Single,UnityEngine.Vector4)\">\n      <summary>\n        <para>Multiplies a vector by a number.</para>\n      </summary>\n      <param name=\"d\"></param>\n      <param name=\"a\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Vector4.op_Plus(UnityEngine.Vector4,UnityEngine.Vector4)\">\n      <summary>\n        <para>Adds two vectors.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.Project(UnityEngine.Vector4,UnityEngine.Vector4)\">\n      <summary>\n        <para>Projects a vector onto another vector.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.Scale(UnityEngine.Vector4,UnityEngine.Vector4)\">\n      <summary>\n        <para>Multiplies two vectors component-wise.</para>\n      </summary>\n      <param name=\"a\"></param>\n      <param name=\"b\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.Scale(UnityEngine.Vector4)\">\n      <summary>\n        <para>Multiplies every component of this vector by the same component of scale.</para>\n      </summary>\n      <param name=\"scale\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.Set(System.Single,System.Single,System.Single,System.Single)\">\n      <summary>\n        <para>Set x, y, z and w components of an existing Vector4.</para>\n      </summary>\n      <param name=\"newX\"></param>\n      <param name=\"newY\"></param>\n      <param name=\"newZ\"></param>\n      <param name=\"newW\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Vector4.this\">\n      <summary>\n        <para>Access the x, y, z, w components using [0], [1], [2], [3] respectively.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.ToString\">\n      <summary>\n        <para>Returns a nicely formatted string for this vector.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Vector4.ToString(System.String)\">\n      <summary>\n        <para>Returns a nicely formatted string for this vector.</para>\n      </summary>\n      <param name=\"format\"></param>\n    </member>\n    <member name=\"T:UnityEngine.VerticalWrapMode\">\n      <summary>\n        <para>Wrapping modes for text that reaches the vertical boundary.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.VerticalWrapMode.Overflow\">\n      <summary>\n        <para>Text well continue to generate when reaching vertical boundary.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.VerticalWrapMode.Truncate\">\n      <summary>\n        <para>Text will be clipped when reaching the vertical boundary.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Video.Video3DLayout\">\n      <summary>\n        <para>Types of 3D content layout within a video.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.Video3DLayout.No3D\">\n      <summary>\n        <para>Video does not have any 3D content.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.Video3DLayout.OverUnder3D\">\n      <summary>\n        <para>Video contains 3D content where the left eye occupies the upper half and right eye occupies the lower half of video frames.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.Video3DLayout.SideBySide3D\">\n      <summary>\n        <para>Video contains 3D content where the left eye occupies the left half and right eye occupies the right half of video frames.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Video.VideoAspectRatio\">\n      <summary>\n        <para>Methods used to fit a video in the target area.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoAspectRatio.FitHorizontally\">\n      <summary>\n        <para>Resize proportionally so that width fits the target area, cropping or adding black bars above and below if needed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoAspectRatio.FitInside\">\n      <summary>\n        <para>Resize proportionally so that content fits the target area, adding black bars if needed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoAspectRatio.FitOutside\">\n      <summary>\n        <para>Resize proportionally so that content fits the target area, cropping if needed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoAspectRatio.FitVertically\">\n      <summary>\n        <para>Resize proportionally so that height fits the target area, cropping or adding black bars on each side if needed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoAspectRatio.NoScaling\">\n      <summary>\n        <para>Preserve the pixel size without adjusting for target area.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoAspectRatio.Stretch\">\n      <summary>\n        <para>Resize non-proportionally to fit the target area.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Video.VideoAudioOutputMode\">\n      <summary>\n        <para>Places where the audio embedded in a video can be sent.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoAudioOutputMode.APIOnly\">\n      <summary>\n        <para>Send the embedded audio to the associated AudioSampleProvider.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoAudioOutputMode.AudioSource\">\n      <summary>\n        <para>Send the embedded audio into a specified AudioSource.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoAudioOutputMode.Direct\">\n      <summary>\n        <para>Send the embedded audio direct to the platform's audio hardware.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoAudioOutputMode.None\">\n      <summary>\n        <para>Disable the embedded audio.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Video.VideoClip\">\n      <summary>\n        <para>A container for video data.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoClip.audioTrackCount\">\n      <summary>\n        <para>Number of audio tracks in the clip.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoClip.frameCount\">\n      <summary>\n        <para>The length of the VideoClip in frames. (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoClip.frameRate\">\n      <summary>\n        <para>The frame rate of the clip in frames/second. (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoClip.height\">\n      <summary>\n        <para>The height of the images in the video clip in pixels. (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoClip.length\">\n      <summary>\n        <para>The length of the video clip in seconds. (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoClip.originalPath\">\n      <summary>\n        <para>The video clip path in the project's assets. (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoClip.pixelAspectRatioDenominator\">\n      <summary>\n        <para>Denominator of the pixel aspect ratio (num:den). (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoClip.pixelAspectRatioNumerator\">\n      <summary>\n        <para>Numerator of the pixel aspect ratio (num:den). (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoClip.width\">\n      <summary>\n        <para>The width of the images in the video clip in pixels. (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Video.VideoClip.GetAudioChannelCount(System.UInt16)\">\n      <summary>\n        <para>The number of channels in the audio track.  E.g. 2 for a stereo track.</para>\n      </summary>\n      <param name=\"audioTrackIdx\">Index of the audio queried audio track.</param>\n      <returns>\n        <para>The number of channels.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Video.VideoClip.GetAudioLanguage(System.UInt16)\">\n      <summary>\n        <para>Get the audio track language.  Can be unknown.</para>\n      </summary>\n      <param name=\"audioTrackIdx\">Index of the audio queried audio track.</param>\n      <returns>\n        <para>The abbreviated name of the language.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Video.VideoClip.GetAudioSampleRate(System.UInt16)\">\n      <summary>\n        <para>Get the audio track sampling rate in Hertz.</para>\n      </summary>\n      <param name=\"audioTrackIdx\">Index of the audio queried audio track.</param>\n      <returns>\n        <para>The sampling rate in Hertz.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Video.VideoPlayer\">\n      <summary>\n        <para>Plays video content onto a target.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.aspectRatio\">\n      <summary>\n        <para>Defines how the video content will be stretched to fill the target area.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.audioOutputMode\">\n      <summary>\n        <para>Destination for the audio embedded in the video.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.audioTrackCount\">\n      <summary>\n        <para>Number of audio tracks found in the data source currently configured.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.canSetDirectAudioVolume\">\n      <summary>\n        <para>Whether direct-output volume controls are supported for the current platform and video format. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.canSetPlaybackSpeed\">\n      <summary>\n        <para>Whether the playback speed can be changed. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.canSetSkipOnDrop\">\n      <summary>\n        <para>Determines whether the VideoPlayer skips frames to catch up with current time. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.canSetTime\">\n      <summary>\n        <para>Whether current time can be changed using the time or timeFrames property. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.canSetTimeSource\">\n      <summary>\n        <para>Whether the time source followed by the VideoPlayer can be changed. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.canStep\">\n      <summary>\n        <para>Returns true if the VideoPlayer can step forward through the video content. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.clip\">\n      <summary>\n        <para>The clip being played by the VideoPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Video.VideoPlayer.clockResyncOccurred(UnityEngine.Video.VideoPlayer/TimeEventHandler)\">\n      <summary>\n        <para>Invoked when the VideoPlayer's clock is synced back to its Video.VideoTimeReference.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.controlledAudioTrackCount\">\n      <summary>\n        <para>Number of audio tracks that this VideoPlayer will take control of. The other ones will be silenced. A maximum of 64 tracks are allowed.\nThe actual number of audio tracks cannot be known in advance when playing URLs, which is why this value is independent of the Video.VideoPlayer.audioTrackCount property.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.controlledAudioTrackMaxCount\">\n      <summary>\n        <para>Maximum number of audio tracks that can be controlled.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Video.VideoPlayer.errorReceived(UnityEngine.Video.VideoPlayer/ErrorEventHandler)\">\n      <summary>\n        <para>Errors such as HTTP connection problems are reported through this callback.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.externalReferenceTime\">\n      <summary>\n        <para>Reference time of the external clock the Video.VideoPlayer uses to correct its drift.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.frame\">\n      <summary>\n        <para>The frame index currently being displayed by the VideoPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.frameCount\">\n      <summary>\n        <para>Number of frames in the current video content.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Video.VideoPlayer.frameDropped(UnityEngine.Video.VideoPlayer/EventHandler)\">\n      <summary>\n        <para>[NOT YET IMPLEMENTED] Invoked when the video decoder does not produce a frame as per the time source during playback.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.frameRate\">\n      <summary>\n        <para>The frame rate of the clip or URL in frames/second. (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Video.VideoPlayer.frameReady(UnityEngine.Video.VideoPlayer/FrameReadyEventHandler)\">\n      <summary>\n        <para>Invoked when a new frame is ready.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.isLooping\">\n      <summary>\n        <para>Determines whether the VideoPlayer restarts from the beginning when it reaches the end of the clip.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.isPlaying\">\n      <summary>\n        <para>Whether content is being played. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.isPrepared\">\n      <summary>\n        <para>Whether the VideoPlayer has successfully prepared the content to be played. (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Video.VideoPlayer.loopPointReached(UnityEngine.Video.VideoPlayer/EventHandler)\">\n      <summary>\n        <para>Invoked when the VideoPlayer reaches the end of the content to play.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.playbackSpeed\">\n      <summary>\n        <para>Factor by which the basic playback rate will be multiplied.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.playOnAwake\">\n      <summary>\n        <para>Whether the content will start playing back as soon as the component awakes.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Video.VideoPlayer.prepareCompleted(UnityEngine.Video.VideoPlayer/EventHandler)\">\n      <summary>\n        <para>Invoked when the VideoPlayer preparation is complete.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.renderMode\">\n      <summary>\n        <para>Where the video content will be drawn.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Video.VideoPlayer.seekCompleted(UnityEngine.Video.VideoPlayer/EventHandler)\">\n      <summary>\n        <para>Invoke after a seek operation completes.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.sendFrameReadyEvents\">\n      <summary>\n        <para>Enables the frameReady events.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.skipOnDrop\">\n      <summary>\n        <para>Whether the VideoPlayer is allowed to skip frames to catch up with current time.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.source\">\n      <summary>\n        <para>The source that the VideoPlayer uses for playback.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Video.VideoPlayer.started(UnityEngine.Video.VideoPlayer/EventHandler)\">\n      <summary>\n        <para>Invoked immediately after Play is called.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.targetCamera\">\n      <summary>\n        <para>Camera component to draw to when Video.VideoPlayer.renderMode is set to either Video.VideoRenderMode.CameraFarPlane or Video.VideoRenderMode.CameraNearPlane.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.targetCamera3DLayout\">\n      <summary>\n        <para>Type of 3D content contained in the source video media.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.targetCameraAlpha\">\n      <summary>\n        <para>Overall transparency level of the target camera plane video.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.targetMaterialProperty\">\n      <summary>\n        <para>Material texture property which is targeted when Video.VideoPlayer.renderMode is set to Video.VideoTarget.MaterialOverride.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.targetMaterialRenderer\">\n      <summary>\n        <para>Renderer which is targeted when Video.VideoPlayer.renderMode is set to Video.VideoTarget.MaterialOverride</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.targetTexture\">\n      <summary>\n        <para>RenderTexture to draw to when Video.VideoPlayer.renderMode is set to Video.VideoTarget.RenderTexture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.texture\">\n      <summary>\n        <para>Internal texture in which video content is placed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.time\">\n      <summary>\n        <para>The VideoPlayer current time in seconds.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.timeReference\">\n      <summary>\n        <para>The clock that the Video.VideoPlayer observes to detect and correct drift.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.timeSource\">\n      <summary>\n        <para>[NOT YET IMPLEMENTED] The source used used by the VideoPlayer to derive its current time.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.url\">\n      <summary>\n        <para>The file or HTTP URL that the VideoPlayer will read content from.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Video.VideoPlayer.waitForFirstFrame\">\n      <summary>\n        <para>Determines whether the VideoPlayer will wait for the first frame to be loaded into the texture before starting playback when Video.VideoPlayer.playOnAwake is on.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Video.VideoPlayer.EnableAudioTrack(System.UInt16,System.Boolean)\">\n      <summary>\n        <para>Enable/disable audio track decoding. Only effective when the VideoPlayer is not currently playing.</para>\n      </summary>\n      <param name=\"trackIndex\">Index of the audio track to enable/disable.</param>\n      <param name=\"enabled\">True for enabling the track. False for disabling the track.</param>\n    </member>\n    <member name=\"T:UnityEngine.Video.VideoPlayer.ErrorEventHandler\">\n      <summary>\n        <para>Delegate type for VideoPlayer events that contain an error message.</para>\n      </summary>\n      <param name=\"source\">The VideoPlayer that is emitting the event.</param>\n      <param name=\"message\">Message describing the error just encountered.</param>\n    </member>\n    <member name=\"T:UnityEngine.Video.VideoPlayer.EventHandler\">\n      <summary>\n        <para>Delegate type for all parameter-less events emitted by VideoPlayers.</para>\n      </summary>\n      <param name=\"source\">The VideoPlayer that is emitting the event.</param>\n    </member>\n    <member name=\"T:UnityEngine.Video.VideoPlayer.FrameReadyEventHandler\">\n      <summary>\n        <para>Delegate type for VideoPlayer events that carry a frame number.</para>\n      </summary>\n      <param name=\"source\">The VideoPlayer that is emitting the event.</param>\n      <param name=\"frameNum\">The frame the VideoPlayer is now at.</param>\n      <param name=\"frameIdx\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Video.VideoPlayer.GetAudioChannelCount(System.UInt16)\">\n      <summary>\n        <para>The number of audio channels in the specified audio track.</para>\n      </summary>\n      <param name=\"trackIndex\">Index for the audio track being queried.</param>\n      <returns>\n        <para>Number of audio channels.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Video.VideoPlayer.GetAudioLanguageCode(System.UInt16)\">\n      <summary>\n        <para>Returns the language code, if any, for the specified track.</para>\n      </summary>\n      <param name=\"trackIndex\">Index of the audio track to query.</param>\n      <returns>\n        <para>Language code.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Video.VideoPlayer.GetDirectAudioMute(System.UInt16)\">\n      <summary>\n        <para>Get the direct-output audio mute status for the specified track.</para>\n      </summary>\n      <param name=\"trackIndex\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Video.VideoPlayer.GetDirectAudioVolume(System.UInt16)\">\n      <summary>\n        <para>Return the direct-output volume for specified track.</para>\n      </summary>\n      <param name=\"trackIndex\">Track index for which the volume is queried.</param>\n      <returns>\n        <para>Volume, between 0 and 1.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Video.VideoPlayer.GetTargetAudioSource(System.UInt16)\">\n      <summary>\n        <para>Gets the AudioSource that will receive audio samples for the specified track if Video.VideoPlayer.audioOutputMode is set to Video.VideoAudioOutputMode.AudioSource.</para>\n      </summary>\n      <param name=\"trackIndex\">Index of the audio track for which the AudioSource is wanted.</param>\n      <returns>\n        <para>The source associated with the audio track.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Video.VideoPlayer.IsAudioTrackEnabled(System.UInt16)\">\n      <summary>\n        <para>Returns whether decoding for the specified audio track is enabled. See Video.VideoPlayer.EnableAudioTrack for distinction with mute.</para>\n      </summary>\n      <param name=\"trackIndex\">Index of the audio track being queried.</param>\n      <returns>\n        <para>True if decoding for the specified audio track is enabled.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.Video.VideoPlayer.Pause\">\n      <summary>\n        <para>Pauses the playback and leaves the current time intact.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Video.VideoPlayer.Play\">\n      <summary>\n        <para>Starts playback.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Video.VideoPlayer.Prepare\">\n      <summary>\n        <para>Initiates playback engine prepration.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Video.VideoPlayer.SetDirectAudioMute(System.UInt16,System.Boolean)\">\n      <summary>\n        <para>Set the direct-output audio mute status for the specified track.</para>\n      </summary>\n      <param name=\"trackIndex\">Track index for which the mute is set.</param>\n      <param name=\"mute\">Mute on/off.</param>\n    </member>\n    <member name=\"M:UnityEngine.Video.VideoPlayer.SetDirectAudioVolume(System.UInt16,System.Single)\">\n      <summary>\n        <para>Set the direct-output audio volume for the specified track.</para>\n      </summary>\n      <param name=\"trackIndex\">Track index for which the volume is set.</param>\n      <param name=\"volume\">New volume, between 0 and 1.</param>\n    </member>\n    <member name=\"M:UnityEngine.Video.VideoPlayer.SetTargetAudioSource(System.UInt16,UnityEngine.AudioSource)\">\n      <summary>\n        <para>Sets the AudioSource that will receive audio samples for the specified track if this audio target is selected with Video.VideoPlayer.audioOutputMode.</para>\n      </summary>\n      <param name=\"trackIndex\">Index of the audio track to associate with the specified AudioSource.</param>\n      <param name=\"source\">AudioSource to associate with the audio track.</param>\n    </member>\n    <member name=\"M:UnityEngine.Video.VideoPlayer.StepForward\">\n      <summary>\n        <para>Advances the current time by one frame immediately.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Video.VideoPlayer.Stop\">\n      <summary>\n        <para>Pauses the playback and sets the current time to 0.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Video.VideoPlayer.TimeEventHandler\">\n      <summary>\n        <para>Delegate type for VideoPlayer events that carry a time position.</para>\n      </summary>\n      <param name=\"source\">The VideoPlayer that is emitting the event.</param>\n      <param name=\"seconds\">Time position.</param>\n    </member>\n    <member name=\"T:UnityEngine.Video.VideoRenderMode\">\n      <summary>\n        <para>Type of destination for the images read by a VideoPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoRenderMode.APIOnly\">\n      <summary>\n        <para>Don't draw the video content anywhere, but still make it available via the VideoPlayer's texture property in the API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoRenderMode.CameraFarPlane\">\n      <summary>\n        <para>Draw video content behind a camera's scene.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoRenderMode.CameraNearPlane\">\n      <summary>\n        <para>Draw video content in front of a camera's scene.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoRenderMode.MaterialOverride\">\n      <summary>\n        <para>Draw the video content into a user-specified property of the current GameObject's material.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoRenderMode.RenderTexture\">\n      <summary>\n        <para>Draw video content into a RenderTexture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Video.VideoSource\">\n      <summary>\n        <para>Source of the video content for a VideoPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoSource.Url\">\n      <summary>\n        <para>Use the current URL as the video content source.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoSource.VideoClip\">\n      <summary>\n        <para>Use the current clip as the video content source.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Video.VideoTimeReference\">\n      <summary>\n        <para>The clock that the Video.VideoPlayer observes to detect and correct drift.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoTimeReference.ExternalTime\">\n      <summary>\n        <para>External reference clock the Video.VideoPlayer observes to detect and correct drift.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoTimeReference.Freerun\">\n      <summary>\n        <para>Disables the drift detection.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoTimeReference.InternalTime\">\n      <summary>\n        <para>Internal reference clock the Video.VideoPlayer observes to detect and correct drift.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Video.VideoTimeSource\">\n      <summary>\n        <para>Time source followed by the Video.VideoPlayer when reading content.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoTimeSource.AudioDSPTimeSource\">\n      <summary>\n        <para>The audio hardware clock.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Video.VideoTimeSource.GameTimeSource\">\n      <summary>\n        <para>The unscaled game time as defined by Time.realtimeSinceStartup.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.VRTextureUsage\">\n      <summary>\n        <para>This enum describes how the RenderTexture is used as a VR eye texture. Instead of using the values of this enum manually, use the value returned by XR.XRSettings.eyeTextureDesc|eyeTextureDesc or other VR functions returning a RenderTextureDescriptor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.VRTextureUsage.None\">\n      <summary>\n        <para>The RenderTexture is not a VR eye texture. No special rendering behavior will occur.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.VRTextureUsage.OneEye\">\n      <summary>\n        <para>This texture corresponds to a single eye on a stereoscopic display.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.VRTextureUsage.TwoEyes\">\n      <summary>\n        <para>This texture corresponds to two eyes on a stereoscopic display. This will be taken into account when using Graphics.Blit and other rendering functions.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WaitForEndOfFrame\">\n      <summary>\n        <para>Waits until the end of the frame after all cameras and GUI is rendered, just before displaying the frame on screen.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WaitForFixedUpdate\">\n      <summary>\n        <para>Waits until next fixed frame rate update function. See Also: MonoBehaviour.FixedUpdate.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WaitForSeconds\">\n      <summary>\n        <para>Suspends the coroutine execution for the given amount of seconds using scaled time.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WaitForSeconds.#ctor(System.Single)\">\n      <summary>\n        <para>Creates a yield instruction to wait for a given number of seconds using scaled time.</para>\n      </summary>\n      <param name=\"seconds\"></param>\n    </member>\n    <member name=\"T:UnityEngine.WaitForSecondsRealtime\">\n      <summary>\n        <para>Suspends the coroutine execution for the given amount of seconds using unscaled time.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WaitForSecondsRealtime.#ctor(System.Single)\">\n      <summary>\n        <para>Creates a yield instruction to wait for a given number of seconds using unscaled time.</para>\n      </summary>\n      <param name=\"time\"></param>\n    </member>\n    <member name=\"T:UnityEngine.WaitUntil\">\n      <summary>\n        <para>Suspends the coroutine execution until the supplied delegate evaluates to true.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WaitUntil.#ctor(System.Func`1&lt;System.Boolean&gt;)\">\n      <summary>\n        <para>Initializes a yield instruction with a given delegate to be evaluated.</para>\n      </summary>\n      <param name=\"predicate\">Supplied delegate will be evaluated each frame after MonoBehaviour.Update and before MonoBehaviour.LateUpdate until delegate returns true.</param>\n    </member>\n    <member name=\"T:UnityEngine.WaitWhile\">\n      <summary>\n        <para>Suspends the coroutine execution until the supplied delegate evaluates to false.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WaitWhile.#ctor(System.Func`1&lt;System.Boolean&gt;)\">\n      <summary>\n        <para>Initializes a yield instruction with a given delegate to be evaluated.</para>\n      </summary>\n      <param name=\"predicate\">The supplied delegate will be evaluated each frame after MonoBehaviour.Update and before MonoBehaviour.LateUpdate until delegate returns false.</param>\n    </member>\n    <member name=\"T:UnityEngine.WebCamDevice\">\n      <summary>\n        <para>A structure describing the webcam device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WebCamDevice.isFrontFacing\">\n      <summary>\n        <para>True if camera faces the same direction a screen does, false otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WebCamDevice.name\">\n      <summary>\n        <para>A human-readable name of the device. Varies across different systems.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WebCamTexture\">\n      <summary>\n        <para>WebCam Textures are textures onto which the live video input is rendered.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WebCamTexture.deviceName\">\n      <summary>\n        <para>Set this to specify the name of the device to use.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WebCamTexture.devices\">\n      <summary>\n        <para>Return a list of available devices.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WebCamTexture.didUpdateThisFrame\">\n      <summary>\n        <para>Did the video buffer update this frame?</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WebCamTexture.isPlaying\">\n      <summary>\n        <para>Returns if the camera is currently playing.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WebCamTexture.isReadable\">\n      <summary>\n        <para>Returns if the WebCamTexture is non-readable. (iOS only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WebCamTexture.requestedFPS\">\n      <summary>\n        <para>Set the requested frame rate of the camera device (in frames per second).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WebCamTexture.requestedHeight\">\n      <summary>\n        <para>Set the requested height of the camera device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WebCamTexture.requestedWidth\">\n      <summary>\n        <para>Set the requested width of the camera device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WebCamTexture.videoRotationAngle\">\n      <summary>\n        <para>Returns an clockwise angle (in degrees), which can be used to rotate a polygon so camera contents are shown in correct orientation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WebCamTexture.videoVerticallyMirrored\">\n      <summary>\n        <para>Returns if the texture image is vertically flipped.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WebCamTexture.#ctor\">\n      <summary>\n        <para>Create a WebCamTexture.</para>\n      </summary>\n      <param name=\"deviceName\">The name of the video input device to be used.</param>\n      <param name=\"requestedWidth\">The requested width of the texture.</param>\n      <param name=\"requestedHeight\">The requested height of the texture.</param>\n      <param name=\"requestedFPS\">The requested frame rate of the texture.</param>\n    </member>\n    <member name=\"M:UnityEngine.WebCamTexture.#ctor(System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Create a WebCamTexture.</para>\n      </summary>\n      <param name=\"deviceName\">The name of the video input device to be used.</param>\n      <param name=\"requestedWidth\">The requested width of the texture.</param>\n      <param name=\"requestedHeight\">The requested height of the texture.</param>\n      <param name=\"requestedFPS\">The requested frame rate of the texture.</param>\n    </member>\n    <member name=\"M:UnityEngine.WebCamTexture.#ctor(System.Int32,System.Int32)\">\n      <summary>\n        <para>Create a WebCamTexture.</para>\n      </summary>\n      <param name=\"deviceName\">The name of the video input device to be used.</param>\n      <param name=\"requestedWidth\">The requested width of the texture.</param>\n      <param name=\"requestedHeight\">The requested height of the texture.</param>\n      <param name=\"requestedFPS\">The requested frame rate of the texture.</param>\n    </member>\n    <member name=\"M:UnityEngine.WebCamTexture.#ctor(System.String)\">\n      <summary>\n        <para>Create a WebCamTexture.</para>\n      </summary>\n      <param name=\"deviceName\">The name of the video input device to be used.</param>\n      <param name=\"requestedWidth\">The requested width of the texture.</param>\n      <param name=\"requestedHeight\">The requested height of the texture.</param>\n      <param name=\"requestedFPS\">The requested frame rate of the texture.</param>\n    </member>\n    <member name=\"M:UnityEngine.WebCamTexture.#ctor(System.String,System.Int32,System.Int32)\">\n      <summary>\n        <para>Create a WebCamTexture.</para>\n      </summary>\n      <param name=\"deviceName\">The name of the video input device to be used.</param>\n      <param name=\"requestedWidth\">The requested width of the texture.</param>\n      <param name=\"requestedHeight\">The requested height of the texture.</param>\n      <param name=\"requestedFPS\">The requested frame rate of the texture.</param>\n    </member>\n    <member name=\"M:UnityEngine.WebCamTexture.#ctor(System.String,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Create a WebCamTexture.</para>\n      </summary>\n      <param name=\"deviceName\">The name of the video input device to be used.</param>\n      <param name=\"requestedWidth\">The requested width of the texture.</param>\n      <param name=\"requestedHeight\">The requested height of the texture.</param>\n      <param name=\"requestedFPS\">The requested frame rate of the texture.</param>\n    </member>\n    <member name=\"M:UnityEngine.WebCamTexture.GetPixel(System.Int32,System.Int32)\">\n      <summary>\n        <para>Returns pixel color at coordinates (x, y).</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n    </member>\n    <member name=\"M:UnityEngine.WebCamTexture.GetPixels\">\n      <summary>\n        <para>Get a block of pixel colors.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WebCamTexture.GetPixels(System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        <para>Get a block of pixel colors.</para>\n      </summary>\n      <param name=\"x\"></param>\n      <param name=\"y\"></param>\n      <param name=\"blockWidth\"></param>\n      <param name=\"blockHeight\"></param>\n    </member>\n    <member name=\"M:UnityEngine.WebCamTexture.GetPixels32()\">\n      <summary>\n        <para>Returns the pixels data in raw format.</para>\n      </summary>\n      <param name=\"colors\">Optional array to receive pixel data.</param>\n    </member>\n    <member name=\"M:UnityEngine.WebCamTexture.GetPixels32(UnityEngine.Color32[])\">\n      <summary>\n        <para>Returns the pixels data in raw format.</para>\n      </summary>\n      <param name=\"colors\">Optional array to receive pixel data.</param>\n    </member>\n    <member name=\"M:UnityEngine.WebCamTexture.MarkNonReadable\">\n      <summary>\n        <para>Marks WebCamTexture as unreadable (no GetPixel* functions will be available (iOS only)).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WebCamTexture.Pause\">\n      <summary>\n        <para>Pauses the camera.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WebCamTexture.Play\">\n      <summary>\n        <para>Starts the camera.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WebCamTexture.Stop\">\n      <summary>\n        <para>Stops the camera.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WeightedMode\">\n      <summary>\n        <para>Sets which weights to use when calculating curve segments.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WeightedMode.Both\">\n      <summary>\n        <para>Include inWeight and outWeight when calculating curve segments.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WeightedMode.In\">\n      <summary>\n        <para>Include inWeight when calculating the previous curve segment.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WeightedMode.None\">\n      <summary>\n        <para>Exclude both inWeight or outWeight when calculating curve segments.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WeightedMode.Out\">\n      <summary>\n        <para>Include outWeight when calculating the next curve segment.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WheelCollider\">\n      <summary>\n        <para>A special collider for vehicle wheels.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelCollider.brakeTorque\">\n      <summary>\n        <para>Brake torque expressed in Newton metres.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelCollider.center\">\n      <summary>\n        <para>The center of the wheel, measured in the object's local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelCollider.forceAppPointDistance\">\n      <summary>\n        <para>Application point of the suspension and tire forces measured from the base of the resting wheel.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelCollider.forwardFriction\">\n      <summary>\n        <para>Properties of tire friction in the direction the wheel is pointing in.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelCollider.isGrounded\">\n      <summary>\n        <para>Indicates whether the wheel currently collides with something (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelCollider.mass\">\n      <summary>\n        <para>The mass of the wheel, expressed in kilograms. Must be larger than zero. Typical values would be in range (20,80).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelCollider.motorTorque\">\n      <summary>\n        <para>Motor torque on the wheel axle expressed in Newton metres. Positive or negative depending on direction.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelCollider.radius\">\n      <summary>\n        <para>The radius of the wheel, measured in local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelCollider.rpm\">\n      <summary>\n        <para>Current wheel axle rotation speed, in rotations per minute (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelCollider.sidewaysFriction\">\n      <summary>\n        <para>Properties of tire friction in the sideways direction.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelCollider.sprungMass\">\n      <summary>\n        <para>The mass supported by this WheelCollider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelCollider.steerAngle\">\n      <summary>\n        <para>Steering angle in degrees, always around the local y-axis.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelCollider.suspensionDistance\">\n      <summary>\n        <para>Maximum extension distance of wheel suspension, measured in local space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelCollider.suspensionSpring\">\n      <summary>\n        <para>The parameters of wheel's suspension. The suspension attempts to reach a target position by applying a linear force and a damping force.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelCollider.wheelDampingRate\">\n      <summary>\n        <para>The damping rate of the wheel. Must be larger than zero.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WheelCollider.ConfigureVehicleSubsteps(System.Single,System.Int32,System.Int32)\">\n      <summary>\n        <para>Configure vehicle sub-stepping parameters.</para>\n      </summary>\n      <param name=\"speedThreshold\">The speed threshold of the sub-stepping algorithm.</param>\n      <param name=\"stepsBelowThreshold\">Amount of simulation sub-steps when vehicle's speed is below speedThreshold.</param>\n      <param name=\"stepsAboveThreshold\">Amount of simulation sub-steps when vehicle's speed is above speedThreshold.</param>\n    </member>\n    <member name=\"M:UnityEngine.WheelCollider.GetGroundHit(UnityEngine.WheelHit&amp;)\">\n      <summary>\n        <para>Gets ground collision data for the wheel.</para>\n      </summary>\n      <param name=\"hit\"></param>\n    </member>\n    <member name=\"M:UnityEngine.WheelCollider.GetWorldPose(UnityEngine.Vector3&amp;,UnityEngine.Quaternion&amp;)\">\n      <summary>\n        <para>Gets the world space pose of the wheel accounting for ground contact, suspension limits, steer angle, and rotation angle (angles in degrees).</para>\n      </summary>\n      <param name=\"pos\">Position of the wheel in world space.</param>\n      <param name=\"quat\">Rotation of the wheel in world space.</param>\n    </member>\n    <member name=\"T:UnityEngine.WheelFrictionCurve\">\n      <summary>\n        <para>WheelFrictionCurve is used by the WheelCollider to describe friction properties of the wheel tire.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelFrictionCurve.asymptoteSlip\">\n      <summary>\n        <para>Asymptote point slip (default 2).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelFrictionCurve.asymptoteValue\">\n      <summary>\n        <para>Force at the asymptote slip (default 10000).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelFrictionCurve.extremumSlip\">\n      <summary>\n        <para>Extremum point slip (default 1).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelFrictionCurve.extremumValue\">\n      <summary>\n        <para>Force at the extremum slip (default 20000).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelFrictionCurve.stiffness\">\n      <summary>\n        <para>Multiplier for the extremumValue and asymptoteValue values (default 1).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WheelHit\">\n      <summary>\n        <para>Contact information for the wheel, reported by WheelCollider.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelHit.collider\">\n      <summary>\n        <para>The other Collider the wheel is hitting.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelHit.force\">\n      <summary>\n        <para>The magnitude of the force being applied for the contact.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelHit.forwardDir\">\n      <summary>\n        <para>The direction the wheel is pointing in.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelHit.forwardSlip\">\n      <summary>\n        <para>Tire slip in the rolling direction. Acceleration slip is negative, braking slip is positive.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelHit.normal\">\n      <summary>\n        <para>The normal at the point of contact.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelHit.point\">\n      <summary>\n        <para>The point of contact between the wheel and the ground.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelHit.sidewaysDir\">\n      <summary>\n        <para>The sideways direction of the wheel.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelHit.sidewaysSlip\">\n      <summary>\n        <para>Tire slip in the sideways direction.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WheelJoint2D\">\n      <summary>\n        <para>The wheel joint allows the simulation of wheels by providing a constraining suspension motion with an optional motor.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelJoint2D.jointAngle\">\n      <summary>\n        <para>The current joint angle (in degrees) defined as the relative angle between the two Rigidbody2D that the joint connects to.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelJoint2D.jointLinearSpeed\">\n      <summary>\n        <para>The current joint linear speed in meters/sec.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelJoint2D.jointSpeed\">\n      <summary>\n        <para>The current joint rotational speed in degrees/sec.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelJoint2D.jointTranslation\">\n      <summary>\n        <para>The current joint translation.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelJoint2D.motor\">\n      <summary>\n        <para>Parameters for a motor force that is applied automatically to the Rigibody2D along the line.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelJoint2D.suspension\">\n      <summary>\n        <para>Set the joint suspension configuration.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WheelJoint2D.useMotor\">\n      <summary>\n        <para>Should a motor force be applied automatically to the Rigidbody2D?</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WheelJoint2D.GetMotorTorque(System.Single)\">\n      <summary>\n        <para>Gets the motor torque of the joint given the specified timestep.</para>\n      </summary>\n      <param name=\"timeStep\">The time to calculate the motor torque for.</param>\n    </member>\n    <member name=\"T:UnityEngine.Windows.CrashReporting\">\n      <summary>\n        <para>Exposes useful information related to crash reporting on Windows platforms.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Windows.CrashReporting.crashReportFolder\">\n      <summary>\n        <para>Returns the path to the crash report folder on Windows.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Crypto\">\n      <summary>\n        <para>Class representing cryptography algorithms.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Crypto.ComputeMD5Hash(System.Byte[])\">\n      <summary>\n        <para>Computes MD5 hash value for the specified byte array.</para>\n      </summary>\n      <param name=\"buffer\">The input to compute the hash code for.</param>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Crypto.ComputeSHA1Hash(System.Byte[])\">\n      <summary>\n        <para>Computes SHA1 hash value for the specified byte array.</para>\n      </summary>\n      <param name=\"buffer\">The input to compute the hash code for.</param>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Directory\">\n      <summary>\n        <para>Exposes static methods for directory operations.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Windows.Directory.localFolder\">\n      <summary>\n        <para>Returns a path to local folder.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Windows.Directory.roamingFolder\">\n      <summary>\n        <para>Returns a path to roaming folder.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Windows.Directory.temporaryFolder\">\n      <summary>\n        <para>Returns a path to temporary folder.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Directory.CreateDirectory(System.String)\">\n      <summary>\n        <para>Creates directory in the specified path.</para>\n      </summary>\n      <param name=\"path\">The directory path to create.</param>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Directory.Delete(System.String)\">\n      <summary>\n        <para>Deletes a directory from a specified path.</para>\n      </summary>\n      <param name=\"path\">The name of the directory to remove.</param>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Directory.Exists(System.String)\">\n      <summary>\n        <para>Determines whether the given path refers to an existing directory.</para>\n      </summary>\n      <param name=\"path\">The path to test.</param>\n    </member>\n    <member name=\"T:UnityEngine.Windows.File\">\n      <summary>\n        <para>Provides static methods for file operations.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Windows.File.Delete(System.String)\">\n      <summary>\n        <para>Deletes the specified file.</para>\n      </summary>\n      <param name=\"path\">The name of the file to be deleted.</param>\n    </member>\n    <member name=\"M:UnityEngine.Windows.File.Exists(System.String)\">\n      <summary>\n        <para>Determines whether the specified file exists.</para>\n      </summary>\n      <param name=\"path\">The file to check.</param>\n    </member>\n    <member name=\"M:UnityEngine.Windows.File.ReadAllBytes(System.String)\">\n      <summary>\n        <para>Opens a binary file, reads the contents of the file into a byte array, and then closes the file.</para>\n      </summary>\n      <param name=\"path\">The file to open for reading.</param>\n    </member>\n    <member name=\"M:UnityEngine.Windows.File.WriteAllBytes(System.String,System.Byte[])\">\n      <summary>\n        <para>Creates a new file, writes the specified byte array to the file, and then closes the file. If the target file already exists, it is overwritten.</para>\n      </summary>\n      <param name=\"path\">The file to write to.</param>\n      <param name=\"bytes\">The bytes to write to the file.</param>\n    </member>\n    <member name=\"T:UnityEngine.Windows.LicenseInformation\">\n      <summary>\n        <para>This class provides information regarding application's trial status and allows initiating application purchase.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Windows.LicenseInformation.isOnAppTrial\">\n      <summary>\n        <para>Checks whether the application is installed in trial mode.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Windows.LicenseInformation.PurchaseApp\">\n      <summary>\n        <para>Attempts to purchase the app if it is in installed in trial mode.</para>\n      </summary>\n      <returns>\n        <para>Purchase receipt.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.ConfidenceLevel\">\n      <summary>\n        <para>Used by KeywordRecognizer, GrammarRecognizer, DictationRecognizer. Phrases under the specified minimum level will be ignored.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.ConfidenceLevel.High\">\n      <summary>\n        <para>High confidence level.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.ConfidenceLevel.Low\">\n      <summary>\n        <para>Low confidence level.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.ConfidenceLevel.Medium\">\n      <summary>\n        <para>Medium confidence level.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.ConfidenceLevel.Rejected\">\n      <summary>\n        <para>Everything is rejected.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.DictationCompletionCause\">\n      <summary>\n        <para>Represents the reason why dictation session has completed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.DictationCompletionCause.AudioQualityFailure\">\n      <summary>\n        <para>Dictation session completion was caused by bad audio quality.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.DictationCompletionCause.Canceled\">\n      <summary>\n        <para>Dictation session was either cancelled, or the application was paused while dictation session was in progress.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.DictationCompletionCause.Complete\">\n      <summary>\n        <para>Dictation session has completed successfully.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.DictationCompletionCause.MicrophoneUnavailable\">\n      <summary>\n        <para>Dictation session has finished because a microphone was not available.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.DictationCompletionCause.NetworkFailure\">\n      <summary>\n        <para>Dictation session has finished because network connection was not available.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.DictationCompletionCause.TimeoutExceeded\">\n      <summary>\n        <para>Dictation session has reached its timeout.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.DictationCompletionCause.UnknownError\">\n      <summary>\n        <para>Dictation session has completed due to an unknown error.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.DictationRecognizer\">\n      <summary>\n        <para>DictationRecognizer listens to speech input and attempts to determine what phrase was uttered.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Windows.Speech.DictationRecognizer.AutoSilenceTimeoutSeconds\">\n      <summary>\n        <para>The time length in seconds before dictation recognizer session ends due to lack of audio input.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Speech.DictationRecognizer.#ctor\">\n      <summary>\n        <para>Create a DictationRecognizer with the specified minimum confidence and dictation topic constraint. Phrases under the specified minimum level will be ignored.</para>\n      </summary>\n      <param name=\"minimumConfidence\">The confidence level at which the recognizer will begin accepting phrases.</param>\n      <param name=\"topic\">The dictation topic that this dictation recognizer should optimize its recognition for.</param>\n      <param name=\"confidenceLevel\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Speech.DictationRecognizer.#ctor(UnityEngine.Windows.Speech.ConfidenceLevel)\">\n      <summary>\n        <para>Create a DictationRecognizer with the specified minimum confidence and dictation topic constraint. Phrases under the specified minimum level will be ignored.</para>\n      </summary>\n      <param name=\"minimumConfidence\">The confidence level at which the recognizer will begin accepting phrases.</param>\n      <param name=\"topic\">The dictation topic that this dictation recognizer should optimize its recognition for.</param>\n      <param name=\"confidenceLevel\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Speech.DictationRecognizer.#ctor(UnityEngine.Windows.Speech.DictationTopicConstraint)\">\n      <summary>\n        <para>Create a DictationRecognizer with the specified minimum confidence and dictation topic constraint. Phrases under the specified minimum level will be ignored.</para>\n      </summary>\n      <param name=\"minimumConfidence\">The confidence level at which the recognizer will begin accepting phrases.</param>\n      <param name=\"topic\">The dictation topic that this dictation recognizer should optimize its recognition for.</param>\n      <param name=\"confidenceLevel\"></param>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Speech.DictationRecognizer.#ctor(UnityEngine.Windows.Speech.ConfidenceLevel,UnityEngine.Windows.Speech.DictationTopicConstraint)\">\n      <summary>\n        <para>Create a DictationRecognizer with the specified minimum confidence and dictation topic constraint. Phrases under the specified minimum level will be ignored.</para>\n      </summary>\n      <param name=\"minimumConfidence\">The confidence level at which the recognizer will begin accepting phrases.</param>\n      <param name=\"topic\">The dictation topic that this dictation recognizer should optimize its recognition for.</param>\n      <param name=\"confidenceLevel\"></param>\n    </member>\n    <member name=\"?:UnityEngine.Windows.Speech.DictationRecognizer.DictationComplete(UnityEngine.Windows.Speech.DictationRecognizer/DictationCompletedDelegate)\">\n      <summary>\n        <para>Event that is triggered when the recognizer session completes.</para>\n      </summary>\n      <param name=\"value\">Delegate that is to be invoked on DictationComplete event.</param>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.DictationRecognizer.DictationCompletedDelegate\">\n      <summary>\n        <para>Delegate for DictationComplete event.</para>\n      </summary>\n      <param name=\"cause\">The cause of dictation session completion.</param>\n    </member>\n    <member name=\"?:UnityEngine.Windows.Speech.DictationRecognizer.DictationError(UnityEngine.Windows.Speech.DictationRecognizer/DictationErrorHandler)\">\n      <summary>\n        <para>Event that is triggered when the recognizer session encouters an error.</para>\n      </summary>\n      <param name=\"value\">Delegate that is to be invoked on DictationError event.</param>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.DictationRecognizer.DictationErrorHandler\">\n      <summary>\n        <para>Delegate for DictationError event.</para>\n      </summary>\n      <param name=\"error\">The error mesage.</param>\n      <param name=\"hresult\">HRESULT code that corresponds to the error.</param>\n    </member>\n    <member name=\"?:UnityEngine.Windows.Speech.DictationRecognizer.DictationHypothesis(UnityEngine.Windows.Speech.DictationRecognizer/DictationHypothesisDelegate)\">\n      <summary>\n        <para>Event that is triggered when the recognizer changes its hypothesis for the current fragment.</para>\n      </summary>\n      <param name=\"value\">Delegate to be triggered in the event of a hypothesis changed event.</param>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.DictationRecognizer.DictationHypothesisDelegate\">\n      <summary>\n        <para>Callback indicating a hypothesis change event. You should register with DictationHypothesis event.</para>\n      </summary>\n      <param name=\"text\">The text that the recognizer believes may have been recognized.</param>\n    </member>\n    <member name=\"?:UnityEngine.Windows.Speech.DictationRecognizer.DictationResult(UnityEngine.Windows.Speech.DictationRecognizer/DictationResultDelegate)\">\n      <summary>\n        <para>Event indicating a phrase has been recognized with the specified confidence level.</para>\n      </summary>\n      <param name=\"value\">The delegate to be triggered when this event is triggered.</param>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.DictationRecognizer.DictationResultDelegate\">\n      <summary>\n        <para>Callback indicating a phrase has been recognized with the specified confidence level. You should register with DictationResult event.</para>\n      </summary>\n      <param name=\"text\">The recognized text.</param>\n      <param name=\"confidence\">The confidence level at which the text was recognized.</param>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Speech.DictationRecognizer.Dispose\">\n      <summary>\n        <para>Disposes the resources this dictation recognizer uses.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Windows.Speech.DictationRecognizer.InitialSilenceTimeoutSeconds\">\n      <summary>\n        <para>The time length in seconds before dictation recognizer session ends due to lack of audio input in case there was no audio heard in the current session.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Speech.DictationRecognizer.Start\">\n      <summary>\n        <para>Starts the dictation recognization session. Dictation recognizer can only be started if PhraseRecognitionSystem is not running.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Windows.Speech.DictationRecognizer.Status\">\n      <summary>\n        <para>Indicates the status of dictation recognizer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Speech.DictationRecognizer.Stop\">\n      <summary>\n        <para>Stops the dictation recognization session.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.DictationTopicConstraint\">\n      <summary>\n        <para>DictationTopicConstraint enum specifies the scenario for which a specific dictation recognizer should optimize.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.DictationTopicConstraint.Dictation\">\n      <summary>\n        <para>Dictation recognizer will optimize for dictation scenario.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.DictationTopicConstraint.Form\">\n      <summary>\n        <para>Dictation recognizer will optimize for form-filling scenario.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.DictationTopicConstraint.WebSearch\">\n      <summary>\n        <para>Dictation recognizer will optimize for web search scenario.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.GrammarRecognizer\">\n      <summary>\n        <para>The GrammarRecognizer is a complement to the KeywordRecognizer. In many cases developers will find the KeywordRecognizer fills all their development needs. However, in some cases, more complex grammars will be better expressed in the form of an xml file on disk.\nThe GrammarRecognizer uses Extensible Markup Language (XML) elements and attributes, as specified in the World Wide Web Consortium (W3C) Speech Recognition Grammar Specification (SRGS) Version 1.0. These XML elements and attributes represent the rule structures that define the words or phrases (commands) recognized by speech recognition engines.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Speech.GrammarRecognizer.#ctor(System.String)\">\n      <summary>\n        <para>Creates a grammar recognizer using specified file path and minimum confidence.</para>\n      </summary>\n      <param name=\"grammarFilePath\">Path of the grammar file.</param>\n      <param name=\"minimumConfidence\">The confidence level at which the recognizer will begin accepting phrases.</param>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Speech.GrammarRecognizer.#ctor(System.String,UnityEngine.Windows.Speech.ConfidenceLevel)\">\n      <summary>\n        <para>Creates a grammar recognizer using specified file path and minimum confidence.</para>\n      </summary>\n      <param name=\"grammarFilePath\">Path of the grammar file.</param>\n      <param name=\"minimumConfidence\">The confidence level at which the recognizer will begin accepting phrases.</param>\n    </member>\n    <member name=\"P:UnityEngine.Windows.Speech.GrammarRecognizer.GrammarFilePath\">\n      <summary>\n        <para>Returns the grammar file path which was supplied when the grammar recognizer was created.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.KeywordRecognizer\">\n      <summary>\n        <para>KeywordRecognizer listens to speech input and attempts to match uttered phrases to a list of registered keywords.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Speech.KeywordRecognizer.#ctor(System.String[])\">\n      <summary>\n        <para>Create a KeywordRecognizer which listens to specified keywords with the specified minimum confidence.  Phrases under the specified minimum level will be ignored.</para>\n      </summary>\n      <param name=\"keywords\">The keywords that the recognizer will listen to.</param>\n      <param name=\"minimumConfidence\">The minimum confidence level of speech recognition that the recognizer will accept.</param>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Speech.KeywordRecognizer.#ctor(System.String[],UnityEngine.Windows.Speech.ConfidenceLevel)\">\n      <summary>\n        <para>Create a KeywordRecognizer which listens to specified keywords with the specified minimum confidence.  Phrases under the specified minimum level will be ignored.</para>\n      </summary>\n      <param name=\"keywords\">The keywords that the recognizer will listen to.</param>\n      <param name=\"minimumConfidence\">The minimum confidence level of speech recognition that the recognizer will accept.</param>\n    </member>\n    <member name=\"P:UnityEngine.Windows.Speech.KeywordRecognizer.Keywords\">\n      <summary>\n        <para>Returns the list of keywords which was supplied when the keyword recognizer was created.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.PhraseRecognitionSystem\">\n      <summary>\n        <para>Phrase recognition system is responsible for managing phrase recognizers and dispatching recognition events to them.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Windows.Speech.PhraseRecognitionSystem.isSupported\">\n      <summary>\n        <para>Returns whether speech recognition is supported on the machine that the application is running on.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.PhraseRecognitionSystem.ErrorDelegate\">\n      <summary>\n        <para>Delegate for OnError event.</para>\n      </summary>\n      <param name=\"errorCode\">Error code for the error that occurred.</param>\n    </member>\n    <member name=\"?:UnityEngine.Windows.Speech.PhraseRecognitionSystem.OnError(UnityEngine.Windows.Speech.PhraseRecognitionSystem/ErrorDelegate)\">\n      <summary>\n        <para>Event that gets invoked when phrase recognition system encounters an error.</para>\n      </summary>\n      <param name=\"value\">Delegate that will be invoked when the event occurs.</param>\n    </member>\n    <member name=\"?:UnityEngine.Windows.Speech.PhraseRecognitionSystem.OnStatusChanged(UnityEngine.Windows.Speech.PhraseRecognitionSystem/StatusDelegate)\">\n      <summary>\n        <para>Event which occurs when the status of the phrase recognition system changes.</para>\n      </summary>\n      <param name=\"value\">Delegate that will be invoked when the event occurs.</param>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Speech.PhraseRecognitionSystem.Restart\">\n      <summary>\n        <para>Attempts to restart the phrase recognition system.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Speech.PhraseRecognitionSystem.Shutdown\">\n      <summary>\n        <para>Shuts phrase recognition system down.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Windows.Speech.PhraseRecognitionSystem.Status\">\n      <summary>\n        <para>Returns the current status of the phrase recognition system.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.PhraseRecognitionSystem.StatusDelegate\">\n      <summary>\n        <para>Delegate for OnStatusChanged event.</para>\n      </summary>\n      <param name=\"status\">The new status of the phrase recognition system.</param>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.PhraseRecognizedEventArgs\">\n      <summary>\n        <para>Provides information about a phrase recognized event.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.PhraseRecognizedEventArgs.confidence\">\n      <summary>\n        <para>A measure of correct recognition certainty.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.PhraseRecognizedEventArgs.phraseDuration\">\n      <summary>\n        <para>The time it took for the phrase to be uttered.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.PhraseRecognizedEventArgs.phraseStartTime\">\n      <summary>\n        <para>The moment in time when uttering of the phrase began.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.PhraseRecognizedEventArgs.semanticMeanings\">\n      <summary>\n        <para>A semantic meaning of recognized phrase.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.PhraseRecognizedEventArgs.text\">\n      <summary>\n        <para>The text that was recognized.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.PhraseRecognizer\">\n      <summary>\n        <para>A common base class for both keyword recognizer and grammar recognizer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Speech.PhraseRecognizer.Dispose\">\n      <summary>\n        <para>Disposes the resources used by phrase recognizer.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.Windows.Speech.PhraseRecognizer.IsRunning\">\n      <summary>\n        <para>Tells whether the phrase recognizer is listening for phrases.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.Windows.Speech.PhraseRecognizer.OnPhraseRecognized(UnityEngine.Windows.Speech.PhraseRecognizer/PhraseRecognizedDelegate)\">\n      <summary>\n        <para>Event that gets fired when the phrase recognizer recognizes a phrase.</para>\n      </summary>\n      <param name=\"value\">Delegate that will be invoked when the event occurs.</param>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.PhraseRecognizer.PhraseRecognizedDelegate\">\n      <summary>\n        <para>Delegate for OnPhraseRecognized event.</para>\n      </summary>\n      <param name=\"args\">Information about a phrase recognized event.</param>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Speech.PhraseRecognizer.Start\">\n      <summary>\n        <para>Makes the phrase recognizer start listening to phrases.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.Windows.Speech.PhraseRecognizer.Stop\">\n      <summary>\n        <para>Stops the phrase recognizer from listening to phrases.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.SemanticMeaning\">\n      <summary>\n        <para>Semantic meaning is a collection of semantic properties of a recognized phrase. These semantic properties can be specified in SRGS grammar files.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.SemanticMeaning.key\">\n      <summary>\n        <para>A key of semaning meaning.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.SemanticMeaning.values\">\n      <summary>\n        <para>Values of semantic property that the correspond to the semantic meaning key.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.SpeechError\">\n      <summary>\n        <para>Represents an error in a speech recognition system.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.SpeechError.AudioQualityFailure\">\n      <summary>\n        <para>Speech recognition engine failed because the audio quality was too low.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.SpeechError.GrammarCompilationFailure\">\n      <summary>\n        <para>Speech recognition engine failed to compiled specified grammar.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.SpeechError.MicrophoneUnavailable\">\n      <summary>\n        <para>Speech error occurred because a microphone was not available.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.SpeechError.NetworkFailure\">\n      <summary>\n        <para>Speech error occurred due to a network failure.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.SpeechError.NoError\">\n      <summary>\n        <para>No error occurred.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.SpeechError.TimeoutExceeded\">\n      <summary>\n        <para>A speech recognition system has timed out.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.SpeechError.TopicLanguageNotSupported\">\n      <summary>\n        <para>Supplied grammar file language is not supported.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.SpeechError.UnknownError\">\n      <summary>\n        <para>A speech recognition system has encountered an unknown error.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.Windows.Speech.SpeechSystemStatus\">\n      <summary>\n        <para>Represents the current status of the speech recognition system or a dictation recognizer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.SpeechSystemStatus.Failed\">\n      <summary>\n        <para>Speech recognition system has encountered an error and is in an indeterminate state.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.SpeechSystemStatus.Running\">\n      <summary>\n        <para>Speech recognition system is running.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.Windows.Speech.SpeechSystemStatus.Stopped\">\n      <summary>\n        <para>Speech recognition system is stopped.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WindZone\">\n      <summary>\n        <para>Wind Zones add realism to the trees you create by making them wave their branches and leaves as if blown by the wind.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WindZone.mode\">\n      <summary>\n        <para>Defines the type of wind zone to be used (Spherical or Directional).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WindZone.radius\">\n      <summary>\n        <para>Radius of the Spherical Wind Zone (only active if the WindZoneMode is set to Spherical).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WindZone.windMain\">\n      <summary>\n        <para>The primary wind force.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WindZone.windPulseFrequency\">\n      <summary>\n        <para>Defines the frequency of the wind changes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WindZone.windPulseMagnitude\">\n      <summary>\n        <para>Defines how much the wind changes over time.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WindZone.windTurbulence\">\n      <summary>\n        <para>The turbulence wind force.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WindZone.#ctor\">\n      <summary>\n        <para>The constructor.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WindZoneMode\">\n      <summary>\n        <para>Modes a Wind Zone can have, either Spherical or Directional.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WindZoneMode.Directional\">\n      <summary>\n        <para>Wind zone affects the entire scene in one direction.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WindZoneMode.Spherical\">\n      <summary>\n        <para>Wind zone only has an effect inside the radius, and has a falloff from the center towards the edge.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WrapMode\">\n      <summary>\n        <para>Determines how time is treated outside of the keyframed range of an AnimationClip or AnimationCurve.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WrapMode.ClampForever\">\n      <summary>\n        <para>Plays back the animation. When it reaches the end, it will keep playing the last frame and never stop playing.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WrapMode.Default\">\n      <summary>\n        <para>Reads the default repeat mode set higher up.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WrapMode.Loop\">\n      <summary>\n        <para>When time reaches the end of the animation clip, time will continue at the beginning.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WrapMode.Once\">\n      <summary>\n        <para>When time reaches the end of the animation clip, the clip will automatically stop playing and time will be reset to beginning of the clip.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WrapMode.PingPong\">\n      <summary>\n        <para>When time reaches the end of the animation clip, time will ping pong back between beginning and end.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WSA.AppCallbackItem\">\n      <summary>\n        <para>Delegate that can be invoked on specific thread.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WSA.Application\">\n      <summary>\n        <para>Provides essential methods related to Window Store application.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WSA.Application.advertisingIdentifier\">\n      <summary>\n        <para>Advertising ID.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WSA.Application.arguments\">\n      <summary>\n        <para>Arguments passed to application.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.WSA.Application.windowActivated(UnityEngine.WSA.WindowActivated)\">\n      <summary>\n        <para>Fired when application window is activated.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.WSA.Application.windowSizeChanged(UnityEngine.WSA.WindowSizeChanged)\">\n      <summary>\n        <para>Fired when window size changes.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Application.InvokeOnAppThread(UnityEngine.WSA.AppCallbackItem,System.Boolean)\">\n      <summary>\n        <para>Executes callback item on application thread.</para>\n      </summary>\n      <param name=\"item\">Item to execute.</param>\n      <param name=\"waitUntilDone\">Wait until item is executed.</param>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Application.InvokeOnUIThread(UnityEngine.WSA.AppCallbackItem,System.Boolean)\">\n      <summary>\n        <para>Executes callback item on UI thread.</para>\n      </summary>\n      <param name=\"item\">Item to execute.</param>\n      <param name=\"waitUntilDone\">Wait until item is executed.</param>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Application.RunningOnAppThread\">\n      <summary>\n        <para>Returns true if you're running on application thread.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Application.RunningOnUIThread\">\n      <summary>\n        <para>Returns true if you're running on UI thread.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Application.TryInvokeOnAppThread(UnityEngine.WSA.AppCallbackItem,System.Boolean)\">\n      <summary>\n        <para>[OBSOLETE] Tries to execute callback item on application thread.</para>\n      </summary>\n      <param name=\"item\">Item to execute.</param>\n      <param name=\"waitUntilDone\">Wait until item is executed.</param>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Application.TryInvokeOnUIThread(UnityEngine.WSA.AppCallbackItem,System.Boolean)\">\n      <summary>\n        <para>[OBSOLETE] Tries to execute callback item on UI thread.</para>\n      </summary>\n      <param name=\"item\">Item to execute.</param>\n      <param name=\"waitUntilDone\">Wait until item is executed.</param>\n    </member>\n    <member name=\"T:UnityEngine.WSA.Cursor\">\n      <summary>\n        <para>Cursor API for Windows Store Apps.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Cursor.SetCustomCursor(System.UInt32)\">\n      <summary>\n        <para>Set a custom cursor.</para>\n      </summary>\n      <param name=\"id\">The cursor resource id.</param>\n    </member>\n    <member name=\"T:UnityEngine.WSA.Folder\">\n      <summary>\n        <para>List of accessible folders on Windows Store Apps.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WSA.Launcher\">\n      <summary>\n        <para>Class which is capable of launching user's default app for file type or a protocol. See also PlayerSettings where you can specify file or URI associations.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Launcher.LaunchFile(UnityEngine.WSA.Folder,System.String,System.Boolean)\">\n      <summary>\n        <para>Launches the default app associated with specified file.</para>\n      </summary>\n      <param name=\"folder\">Folder type where the file is located.</param>\n      <param name=\"relativeFilePath\">Relative file path inside the specified folder.</param>\n      <param name=\"showWarning\">Shows user a warning that application will be switched.</param>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Launcher.LaunchFileWithPicker(System.String)\">\n      <summary>\n        <para>Opens a dialog for picking the file.</para>\n      </summary>\n      <param name=\"fileExtension\">File extension.</param>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Launcher.LaunchUri(System.String,System.Boolean)\">\n      <summary>\n        <para>Starts the default app associated with the URI scheme name for the specified URI, using the specified options.</para>\n      </summary>\n      <param name=\"uri\">The URI.</param>\n      <param name=\"showWarning\">Displays a warning that the URI is potentially unsafe.</param>\n    </member>\n    <member name=\"T:UnityEngine.WSA.SecondaryTileData\">\n      <summary>\n        <para>Defines the default look of secondary tile.\n</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.SecondaryTileData.arguments\">\n      <summary>\n        <para>Arguments to be passed for application when secondary tile is activated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WSA.SecondaryTileData.backgroundColor\">\n      <summary>\n        <para>Defines background color for secondary tile.\n</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.SecondaryTileData.backgroundColorSet\">\n      <summary>\n        <para>Defines, whether backgroundColor should be used.\n</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.SecondaryTileData.displayName\">\n      <summary>\n        <para>Display name for secondary tile.\n</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.SecondaryTileData.foregroundText\">\n      <summary>\n        <para>Defines the style for foreground text on a secondary tile.\n</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.SecondaryTileData.lockScreenBadgeLogo\">\n      <summary>\n        <para>Uri to logo, shown for secondary tile on lock screen.\n</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.SecondaryTileData.lockScreenDisplayBadgeAndTileText\">\n      <summary>\n        <para>Whether to show secondary tile on lock screen.\n</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.SecondaryTileData.phoneticName\">\n      <summary>\n        <para>Phonetic name for secondary tile.\n</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.SecondaryTileData.roamingEnabled\">\n      <summary>\n        <para>Defines whether secondary tile is copied to another device when application is installed by the same users account.\n</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.SecondaryTileData.showNameOnSquare150x150Logo\">\n      <summary>\n        <para>Defines whether the displayName should be shown on a medium secondary tile.\n</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.SecondaryTileData.showNameOnSquare310x310Logo\">\n      <summary>\n        <para>Defines whether the displayName should be shown on a large secondary tile.\n</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.SecondaryTileData.showNameOnWide310x150Logo\">\n      <summary>\n        <para>Defines whether the displayName should be shown on a wide secondary tile.\n</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.SecondaryTileData.square150x150Logo\">\n      <summary>\n        <para>Uri to the logo for medium size tile.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.SecondaryTileData.square30x30Logo\">\n      <summary>\n        <para>Uri to the logo shown on tile\n</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.SecondaryTileData.square310x310Logo\">\n      <summary>\n        <para>Uri to the logo for large size tile.\n</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.SecondaryTileData.square70x70Logo\">\n      <summary>\n        <para>Uri to the logo for small size tile.\n</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.SecondaryTileData.tileId\">\n      <summary>\n        <para>Unique identifier within application for a secondary tile.\n</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.SecondaryTileData.wide310x150Logo\">\n      <summary>\n        <para>Uri to the logo for wide tile.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WSA.SecondaryTileData.#ctor(System.String,System.String)\">\n      <summary>\n        <para>Constructor for SecondaryTileData, sets default values for all members.</para>\n      </summary>\n      <param name=\"id\">Unique identifier for secondary tile.</param>\n      <param name=\"displayName\">A display name for a tile.</param>\n    </member>\n    <member name=\"T:UnityEngine.WSA.Tile\">\n      <summary>\n        <para>Represents tile on Windows start screen\n</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WSA.Tile.exists\">\n      <summary>\n        <para>Whether secondary tile is pinned to start screen.\n</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WSA.Tile.hasUserConsent\">\n      <summary>\n        <para>Whether secondary tile was approved (pinned to start screen) or rejected by user.\n</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WSA.Tile.id\">\n      <summary>\n        <para>A unique string, identifying secondary tile</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WSA.Tile.main\">\n      <summary>\n        <para>Returns applications main tile\n</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.CreateOrUpdateSecondary(UnityEngine.WSA.SecondaryTileData)\">\n      <summary>\n        <para>Creates new or updates existing secondary tile.</para>\n      </summary>\n      <param name=\"data\">The data used to create or update secondary tile.</param>\n      <param name=\"pos\">The coordinates for a request to create new tile.</param>\n      <param name=\"area\">The area on the screen above which the request to create new tile will be displayed.</param>\n      <returns>\n        <para>New Tile object, that can be used for further work with the tile.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.CreateOrUpdateSecondary(UnityEngine.WSA.SecondaryTileData,UnityEngine.Vector2)\">\n      <summary>\n        <para>Creates new or updates existing secondary tile.</para>\n      </summary>\n      <param name=\"data\">The data used to create or update secondary tile.</param>\n      <param name=\"pos\">The coordinates for a request to create new tile.</param>\n      <param name=\"area\">The area on the screen above which the request to create new tile will be displayed.</param>\n      <returns>\n        <para>New Tile object, that can be used for further work with the tile.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.CreateOrUpdateSecondary(UnityEngine.WSA.SecondaryTileData,UnityEngine.Rect)\">\n      <summary>\n        <para>Creates new or updates existing secondary tile.</para>\n      </summary>\n      <param name=\"data\">The data used to create or update secondary tile.</param>\n      <param name=\"pos\">The coordinates for a request to create new tile.</param>\n      <param name=\"area\">The area on the screen above which the request to create new tile will be displayed.</param>\n      <returns>\n        <para>New Tile object, that can be used for further work with the tile.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.Delete\">\n      <summary>\n        <para>Show a request to unpin secondary tile from start screen.</para>\n      </summary>\n      <param name=\"pos\">The coordinates for a request to unpin tile.</param>\n      <param name=\"area\">The area on the screen above which the request to unpin tile will be displayed.</param>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.Delete(UnityEngine.Vector2)\">\n      <summary>\n        <para>Show a request to unpin secondary tile from start screen.</para>\n      </summary>\n      <param name=\"pos\">The coordinates for a request to unpin tile.</param>\n      <param name=\"area\">The area on the screen above which the request to unpin tile will be displayed.</param>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.Delete(UnityEngine.Rect)\">\n      <summary>\n        <para>Show a request to unpin secondary tile from start screen.</para>\n      </summary>\n      <param name=\"pos\">The coordinates for a request to unpin tile.</param>\n      <param name=\"area\">The area on the screen above which the request to unpin tile will be displayed.</param>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.DeleteSecondary(System.String)\">\n      <summary>\n        <para>Show a request to unpin secondary tile from start screen.</para>\n      </summary>\n      <param name=\"tileId\">An identifier for secondary tile.</param>\n      <param name=\"pos\">The coordinates for a request to unpin tile.</param>\n      <param name=\"area\">The area on the screen above which the request to unpin tile will be displayed.</param>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.DeleteSecondary(System.String,UnityEngine.Vector2)\">\n      <summary>\n        <para>Show a request to unpin secondary tile from start screen.</para>\n      </summary>\n      <param name=\"tileId\">An identifier for secondary tile.</param>\n      <param name=\"pos\">The coordinates for a request to unpin tile.</param>\n      <param name=\"area\">The area on the screen above which the request to unpin tile will be displayed.</param>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.DeleteSecondary(System.String,UnityEngine.Rect)\">\n      <summary>\n        <para>Show a request to unpin secondary tile from start screen.</para>\n      </summary>\n      <param name=\"tileId\">An identifier for secondary tile.</param>\n      <param name=\"pos\">The coordinates for a request to unpin tile.</param>\n      <param name=\"area\">The area on the screen above which the request to unpin tile will be displayed.</param>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.Exists(System.String)\">\n      <summary>\n        <para>Whether secondary tile is pinned to start screen.</para>\n      </summary>\n      <param name=\"tileId\">An identifier for secondary tile.</param>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.GetSecondaries\">\n      <summary>\n        <para>Gets all secondary tiles.</para>\n      </summary>\n      <returns>\n        <para>An array of Tile objects.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.GetSecondary(System.String)\">\n      <summary>\n        <para>Returns the secondary tile, identified by tile id.</para>\n      </summary>\n      <param name=\"tileId\">A tile identifier.</param>\n      <returns>\n        <para>A Tile object or null if secondary tile does not exist (not pinned to start screen and user request is complete).</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.GetTemplate(UnityEngine.WSA.TileTemplate)\">\n      <summary>\n        <para>Get template XML for tile notification.</para>\n      </summary>\n      <param name=\"templ\">A template identifier.</param>\n      <returns>\n        <para>String, which is an empty XML document to be filled and used for tile notification.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.PeriodicBadgeUpdate(System.String,System.Single)\">\n      <summary>\n        <para>Starts periodic update of a  badge on a tile.\n</para>\n      </summary>\n      <param name=\"uri\">A remote location from where to retrieve tile update</param>\n      <param name=\"interval\">A time interval in minutes, will be rounded to a value, supported by the system</param>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.PeriodicUpdate(System.String,System.Single)\">\n      <summary>\n        <para>Starts periodic update of a tile.\n</para>\n      </summary>\n      <param name=\"uri\">a remote location fromwhere to retrieve tile update</param>\n      <param name=\"interval\">a time interval in minutes, will be rounded to a value, supported by the system</param>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.RemoveBadge\">\n      <summary>\n        <para>Remove badge from tile.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.StopPeriodicBadgeUpdate\">\n      <summary>\n        <para>Stops previously started periodic update of a tile.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.StopPeriodicUpdate\">\n      <summary>\n        <para>Stops previously started periodic update of a tile.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.Update(System.String)\">\n      <summary>\n        <para>Send a notification for tile (update tiles look).</para>\n      </summary>\n      <param name=\"xml\">A string containing XML document for new tile look.</param>\n      <param name=\"medium\">An uri to 150x150 image, shown on medium tile.</param>\n      <param name=\"wide\">An uri to a 310x150 image to be shown on a wide tile (if such issupported).</param>\n      <param name=\"large\">An uri to a 310x310 image to be shown on a large tile (if such is supported).</param>\n      <param name=\"text\">A text to shown on a tile.</param>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.Update(System.String,System.String,System.String,System.String)\">\n      <summary>\n        <para>Send a notification for tile (update tiles look).</para>\n      </summary>\n      <param name=\"xml\">A string containing XML document for new tile look.</param>\n      <param name=\"medium\">An uri to 150x150 image, shown on medium tile.</param>\n      <param name=\"wide\">An uri to a 310x150 image to be shown on a wide tile (if such issupported).</param>\n      <param name=\"large\">An uri to a 310x310 image to be shown on a large tile (if such is supported).</param>\n      <param name=\"text\">A text to shown on a tile.</param>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.UpdateBadgeImage(System.String)\">\n      <summary>\n        <para>Sets or updates badge on a tile to an image.</para>\n      </summary>\n      <param name=\"image\">Image identifier.</param>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Tile.UpdateBadgeNumber(System.Single)\">\n      <summary>\n        <para>Set or update a badge on a tile to a number.</para>\n      </summary>\n      <param name=\"number\">Number to be shown on a badge.</param>\n    </member>\n    <member name=\"T:UnityEngine.WSA.TileForegroundText\">\n      <summary>\n        <para>Style for foreground text on a secondary tile.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WSA.TileTemplate\">\n      <summary>\n        <para>Templates for various tile styles.\n</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WSA.Toast\">\n      <summary>\n        <para>Represents a toast notification in Windows Store Apps.\n</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WSA.Toast.activated\">\n      <summary>\n        <para>true if toast was activated by user.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WSA.Toast.arguments\">\n      <summary>\n        <para>Arguments to be passed for application when toast notification is activated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WSA.Toast.dismissed\">\n      <summary>\n        <para>true if toast notification was dismissed (for any reason).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WSA.Toast.dismissedByUser\">\n      <summary>\n        <para>true if toast notification was explicitly dismissed by user.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Toast.Create(System.String)\">\n      <summary>\n        <para>Create toast notification.</para>\n      </summary>\n      <param name=\"xml\">XML document with tile data.</param>\n      <param name=\"image\">Uri to image to show on a toast, can be empty, in that case text-only notification will be shown.</param>\n      <param name=\"text\">A text to display on a toast notification.</param>\n      <returns>\n        <para>A toast object for further work with created notification or null, if creation of toast failed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Toast.Create(System.String,System.String)\">\n      <summary>\n        <para>Create toast notification.</para>\n      </summary>\n      <param name=\"xml\">XML document with tile data.</param>\n      <param name=\"image\">Uri to image to show on a toast, can be empty, in that case text-only notification will be shown.</param>\n      <param name=\"text\">A text to display on a toast notification.</param>\n      <returns>\n        <para>A toast object for further work with created notification or null, if creation of toast failed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Toast.GetTemplate(UnityEngine.WSA.ToastTemplate)\">\n      <summary>\n        <para>Get template XML for toast notification.\n</para>\n      </summary>\n      <param name=\"templ\">A template identifier.</param>\n      <returns>\n        <para>string, which is an empty XML document to be filled and used for toast notification.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Toast.Hide\">\n      <summary>\n        <para>Hide displayed toast notification.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WSA.Toast.Show\">\n      <summary>\n        <para>Show toast notification.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WSA.ToastTemplate\">\n      <summary>\n        <para>Templates for various toast styles.\n</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WSA.WindowActivated\">\n      <summary>\n        <para>This event occurs when window completes activation or deactivation, it also fires up when you snap and unsnap the application.</para>\n      </summary>\n      <param name=\"state\"></param>\n    </member>\n    <member name=\"T:UnityEngine.WSA.WindowActivationState\">\n      <summary>\n        <para>Specifies the set of reasons that a windowActivated event was raised.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.WindowActivationState.CodeActivated\">\n      <summary>\n        <para>The window was activated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.WindowActivationState.Deactivated\">\n      <summary>\n        <para>The window was deactivated.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.WSA.WindowActivationState.PointerActivated\">\n      <summary>\n        <para>The window was activated by pointer interaction.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.WSA.WindowSizeChanged\">\n      <summary>\n        <para>This event occurs when window rendering size changes.</para>\n      </summary>\n      <param name=\"width\"></param>\n      <param name=\"height\"></param>\n    </member>\n    <member name=\"T:UnityEngine.WWW\">\n      <summary>\n        <para>Simple access to web pages.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WWW.assetBundle\">\n      <summary>\n        <para>Streams an AssetBundle that can contain any kind of asset from the project folder.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WWW.audioClip\">\n      <summary>\n        <para>Returns a AudioClip generated from the downloaded data (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WWW.bytes\">\n      <summary>\n        <para>Returns the contents of the fetched web page as a byte array (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WWW.bytesDownloaded\">\n      <summary>\n        <para>The number of bytes downloaded by this WWW query (read only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WWW.error\">\n      <summary>\n        <para>Returns an error message if there was an error during the download (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WWW.isDone\">\n      <summary>\n        <para>Is the download already finished? (Read Only)</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WWW.movie\">\n      <summary>\n        <para>Returns a MovieTexture generated from the downloaded data (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WWW.oggVorbis\">\n      <summary>\n        <para>Load an Ogg Vorbis file into the audio clip.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WWW.progress\">\n      <summary>\n        <para>How far has the download progressed (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WWW.responseHeaders\">\n      <summary>\n        <para>Dictionary of headers returned by the request.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WWW.text\">\n      <summary>\n        <para>Returns the contents of the fetched web page as a string (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WWW.texture\">\n      <summary>\n        <para>Returns a Texture2D generated from the downloaded data (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WWW.textureNonReadable\">\n      <summary>\n        <para>Returns a non-readable Texture2D generated from the downloaded data (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WWW.threadPriority\">\n      <summary>\n        <para>Obsolete, has no effect.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WWW.uploadProgress\">\n      <summary>\n        <para>How far has the upload progressed (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WWW.url\">\n      <summary>\n        <para>The URL of this WWW request (Read Only).</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WWW.#ctor(System.String)\">\n      <summary>\n        <para>Creates a WWW request with the given URL.</para>\n      </summary>\n      <param name=\"url\">The url to download. Must be '%' escaped.</param>\n      <returns>\n        <para>A new WWW object. When it has been downloaded, the results can be fetched from the returned object.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WWW.#ctor(System.String,UnityEngine.WWWForm)\">\n      <summary>\n        <para>Creates a WWW request with the given URL.</para>\n      </summary>\n      <param name=\"url\">The url to download. Must be '%' escaped.</param>\n      <param name=\"form\">A WWWForm instance containing the form data to post.</param>\n      <returns>\n        <para>A new WWW object. When it has been downloaded, the results can be fetched from the returned object.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WWW.#ctor(System.String,System.Byte[])\">\n      <summary>\n        <para>Creates a WWW request with the given URL.</para>\n      </summary>\n      <param name=\"url\">The url to download. Must be '%' escaped.</param>\n      <param name=\"postData\">A byte array of data to be posted to the url.</param>\n      <returns>\n        <para>A new WWW object. When it has been downloaded, the results can be fetched from the returned object.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WWW.#ctor(System.String,System.Byte[],System.Collections.Hashtable)\">\n      <summary>\n        <para>Creates a WWW request with the given URL.</para>\n      </summary>\n      <param name=\"url\">The url to download. Must be '%' escaped.</param>\n      <param name=\"postData\">A byte array of data to be posted to the url.</param>\n      <param name=\"headers\">A hash table of custom headers to send with the request.</param>\n      <returns>\n        <para>A new WWW object. When it has been downloaded, the results can be fetched from the returned object.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WWW.#ctor(System.String,System.Byte[],System.Collections.Generic.Dictionary`2&lt;System.String,System.String&gt;)\">\n      <summary>\n        <para>Creates a WWW request with the given URL.</para>\n      </summary>\n      <param name=\"url\">The url to download. Must be '%' escaped.</param>\n      <param name=\"postData\">A byte array of data to be posted to the url.</param>\n      <param name=\"headers\">A dictionary that contains the header keys and values to pass to the server.</param>\n      <returns>\n        <para>A new WWW object. When it has been downloaded, the results can be fetched from the returned object.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WWW.Dispose\">\n      <summary>\n        <para>Disposes of an existing WWW object.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WWW.EscapeURL(System.String)\">\n      <summary>\n        <para>Escapes characters in a string to ensure they are URL-friendly.</para>\n      </summary>\n      <param name=\"s\">A string with characters to be escaped.</param>\n      <param name=\"e\">The text encoding to use.</param>\n    </member>\n    <member name=\"M:UnityEngine.WWW.EscapeURL(System.String,System.Text.Encoding)\">\n      <summary>\n        <para>Escapes characters in a string to ensure they are URL-friendly.</para>\n      </summary>\n      <param name=\"s\">A string with characters to be escaped.</param>\n      <param name=\"e\">The text encoding to use.</param>\n    </member>\n    <member name=\"M:UnityEngine.WWW.GetAudioClip(System.Boolean)\">\n      <summary>\n        <para>Returns an AudioClip generated from the downloaded data (Read Only).</para>\n      </summary>\n      <param name=\"threeD\">Use this to specify whether the clip should be a 2D or 3D clip\nthe .audioClip property defaults to 3D.</param>\n      <param name=\"stream\">Sets whether the clip should be completely downloaded before it's ready to play (false) or the stream can be played even if only part of the clip is downloaded (true).\nThe latter will disable seeking on the clip (with .time and/or .timeSamples).</param>\n      <param name=\"audioType\">The AudioType of the content your downloading. If this is not set Unity will try to determine the type from URL.</param>\n      <returns>\n        <para>The returned AudioClip.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WWW.GetAudioClip(System.Boolean,System.Boolean)\">\n      <summary>\n        <para>Returns an AudioClip generated from the downloaded data (Read Only).</para>\n      </summary>\n      <param name=\"threeD\">Use this to specify whether the clip should be a 2D or 3D clip\nthe .audioClip property defaults to 3D.</param>\n      <param name=\"stream\">Sets whether the clip should be completely downloaded before it's ready to play (false) or the stream can be played even if only part of the clip is downloaded (true).\nThe latter will disable seeking on the clip (with .time and/or .timeSamples).</param>\n      <param name=\"audioType\">The AudioType of the content your downloading. If this is not set Unity will try to determine the type from URL.</param>\n      <returns>\n        <para>The returned AudioClip.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WWW.GetAudioClip(System.Boolean,System.Boolean,UnityEngine.AudioType)\">\n      <summary>\n        <para>Returns an AudioClip generated from the downloaded data (Read Only).</para>\n      </summary>\n      <param name=\"threeD\">Use this to specify whether the clip should be a 2D or 3D clip\nthe .audioClip property defaults to 3D.</param>\n      <param name=\"stream\">Sets whether the clip should be completely downloaded before it's ready to play (false) or the stream can be played even if only part of the clip is downloaded (true).\nThe latter will disable seeking on the clip (with .time and/or .timeSamples).</param>\n      <param name=\"audioType\">The AudioType of the content your downloading. If this is not set Unity will try to determine the type from URL.</param>\n      <returns>\n        <para>The returned AudioClip.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WWW.GetAudioClipCompressed\">\n      <summary>\n        <para>Returns an AudioClip generated from the downloaded data that is compressed in memory (Read Only).</para>\n      </summary>\n      <param name=\"threeD\">Use this to specify whether the clip should be a 2D or 3D clip.</param>\n      <param name=\"audioType\">The AudioType of the content your downloading. If this is not set Unity will try to determine the type from URL.</param>\n      <returns>\n        <para>The returned AudioClip.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WWW.GetAudioClipCompressed(System.Boolean)\">\n      <summary>\n        <para>Returns an AudioClip generated from the downloaded data that is compressed in memory (Read Only).</para>\n      </summary>\n      <param name=\"threeD\">Use this to specify whether the clip should be a 2D or 3D clip.</param>\n      <param name=\"audioType\">The AudioType of the content your downloading. If this is not set Unity will try to determine the type from URL.</param>\n      <returns>\n        <para>The returned AudioClip.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WWW.GetAudioClipCompressed(System.Boolean,UnityEngine.AudioType)\">\n      <summary>\n        <para>Returns an AudioClip generated from the downloaded data that is compressed in memory (Read Only).</para>\n      </summary>\n      <param name=\"threeD\">Use this to specify whether the clip should be a 2D or 3D clip.</param>\n      <param name=\"audioType\">The AudioType of the content your downloading. If this is not set Unity will try to determine the type from URL.</param>\n      <returns>\n        <para>The returned AudioClip.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WWW.GetMovieTexture\">\n      <summary>\n        <para>MovieTexture has been deprecated. Refer to the new movie playback solution VideoPlayer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WWW.LoadFromCacheOrDownload(System.String,System.Int32)\">\n      <summary>\n        <para>Loads an AssetBundle with the specified version number from the cache. If the AssetBundle is not currently cached, it will automatically be downloaded and stored in the cache for future retrieval from local storage.</para>\n      </summary>\n      <param name=\"url\">The URL to download the AssetBundle from, if it is not present in the cache. Must be '%' escaped.</param>\n      <param name=\"version\">Version of the AssetBundle. The file will only be loaded from the disk cache if it has previously been downloaded with the same version parameter. By incrementing the version number requested by your application, you can force Caching to download a new copy of the AssetBundle from url.</param>\n      <param name=\"hash\">Hash128 which is used as the version of the AssetBundle.</param>\n      <param name=\"cachedBundle\">A structure used to download a given version of AssetBundle to a customized cache path.\n\nAnalogous to the cachedAssetBundle parameter for UnityWebRequestAssetBundle.GetAssetBundle.&lt;/param&gt;</param>\n      <param name=\"crc\">An optional CRC-32 Checksum of the uncompressed contents. If this is non-zero, then the content will be compared against the checksum before loading it, and give an error if it does not match. You can use this to avoid data corruption from bad downloads or users tampering with the cached files on disk. If the CRC does not match, Unity will try to redownload the data, and if the CRC on the server does not match it will fail with an error. Look at the error string returned to see the correct CRC value to use for an AssetBundle.</param>\n      <returns>\n        <para>A WWW instance, which can be used to access the data once the load/download operation is completed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WWW.LoadFromCacheOrDownload(System.String,System.Int32,System.UInt32)\">\n      <summary>\n        <para>Loads an AssetBundle with the specified version number from the cache. If the AssetBundle is not currently cached, it will automatically be downloaded and stored in the cache for future retrieval from local storage.</para>\n      </summary>\n      <param name=\"url\">The URL to download the AssetBundle from, if it is not present in the cache. Must be '%' escaped.</param>\n      <param name=\"version\">Version of the AssetBundle. The file will only be loaded from the disk cache if it has previously been downloaded with the same version parameter. By incrementing the version number requested by your application, you can force Caching to download a new copy of the AssetBundle from url.</param>\n      <param name=\"hash\">Hash128 which is used as the version of the AssetBundle.</param>\n      <param name=\"cachedBundle\">A structure used to download a given version of AssetBundle to a customized cache path.\n\nAnalogous to the cachedAssetBundle parameter for UnityWebRequestAssetBundle.GetAssetBundle.&lt;/param&gt;</param>\n      <param name=\"crc\">An optional CRC-32 Checksum of the uncompressed contents. If this is non-zero, then the content will be compared against the checksum before loading it, and give an error if it does not match. You can use this to avoid data corruption from bad downloads or users tampering with the cached files on disk. If the CRC does not match, Unity will try to redownload the data, and if the CRC on the server does not match it will fail with an error. Look at the error string returned to see the correct CRC value to use for an AssetBundle.</param>\n      <returns>\n        <para>A WWW instance, which can be used to access the data once the load/download operation is completed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WWW.LoadFromCacheOrDownload(System.String,UnityEngine.Hash128,System.UInt32)\">\n      <summary>\n        <para>Loads an AssetBundle with the specified version number from the cache. If the AssetBundle is not currently cached, it will automatically be downloaded and stored in the cache for future retrieval from local storage.</para>\n      </summary>\n      <param name=\"url\">The URL to download the AssetBundle from, if it is not present in the cache. Must be '%' escaped.</param>\n      <param name=\"version\">Version of the AssetBundle. The file will only be loaded from the disk cache if it has previously been downloaded with the same version parameter. By incrementing the version number requested by your application, you can force Caching to download a new copy of the AssetBundle from url.</param>\n      <param name=\"hash\">Hash128 which is used as the version of the AssetBundle.</param>\n      <param name=\"cachedBundle\">A structure used to download a given version of AssetBundle to a customized cache path.\n\nAnalogous to the cachedAssetBundle parameter for UnityWebRequestAssetBundle.GetAssetBundle.&lt;/param&gt;</param>\n      <param name=\"crc\">An optional CRC-32 Checksum of the uncompressed contents. If this is non-zero, then the content will be compared against the checksum before loading it, and give an error if it does not match. You can use this to avoid data corruption from bad downloads or users tampering with the cached files on disk. If the CRC does not match, Unity will try to redownload the data, and if the CRC on the server does not match it will fail with an error. Look at the error string returned to see the correct CRC value to use for an AssetBundle.</param>\n      <returns>\n        <para>A WWW instance, which can be used to access the data once the load/download operation is completed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WWW.LoadFromCacheOrDownload(System.String,UnityEngine.CachedAssetBundle,System.UInt32)\">\n      <summary>\n        <para>Loads an AssetBundle with the specified version number from the cache. If the AssetBundle is not currently cached, it will automatically be downloaded and stored in the cache for future retrieval from local storage.</para>\n      </summary>\n      <param name=\"url\">The URL to download the AssetBundle from, if it is not present in the cache. Must be '%' escaped.</param>\n      <param name=\"version\">Version of the AssetBundle. The file will only be loaded from the disk cache if it has previously been downloaded with the same version parameter. By incrementing the version number requested by your application, you can force Caching to download a new copy of the AssetBundle from url.</param>\n      <param name=\"hash\">Hash128 which is used as the version of the AssetBundle.</param>\n      <param name=\"cachedBundle\">A structure used to download a given version of AssetBundle to a customized cache path.\n\nAnalogous to the cachedAssetBundle parameter for UnityWebRequestAssetBundle.GetAssetBundle.&lt;/param&gt;</param>\n      <param name=\"crc\">An optional CRC-32 Checksum of the uncompressed contents. If this is non-zero, then the content will be compared against the checksum before loading it, and give an error if it does not match. You can use this to avoid data corruption from bad downloads or users tampering with the cached files on disk. If the CRC does not match, Unity will try to redownload the data, and if the CRC on the server does not match it will fail with an error. Look at the error string returned to see the correct CRC value to use for an AssetBundle.</param>\n      <returns>\n        <para>A WWW instance, which can be used to access the data once the load/download operation is completed.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.WWW.LoadImageIntoTexture(UnityEngine.Texture2D)\">\n      <summary>\n        <para>Replaces the contents of an existing Texture2D with an image from the downloaded data.</para>\n      </summary>\n      <param name=\"tex\">An existing texture object to be overwritten with the image data.</param>\n      <param name=\"texture\"></param>\n    </member>\n    <member name=\"M:UnityEngine.WWW.UnEscapeURL(System.String)\">\n      <summary>\n        <para>Converts URL-friendly escape sequences back to normal text.</para>\n      </summary>\n      <param name=\"s\">A string containing escaped characters.</param>\n      <param name=\"e\">The text encoding to use.</param>\n    </member>\n    <member name=\"M:UnityEngine.WWW.UnEscapeURL(System.String,System.Text.Encoding)\">\n      <summary>\n        <para>Converts URL-friendly escape sequences back to normal text.</para>\n      </summary>\n      <param name=\"s\">A string containing escaped characters.</param>\n      <param name=\"e\">The text encoding to use.</param>\n    </member>\n    <member name=\"T:UnityEngine.WWWForm\">\n      <summary>\n        <para>Helper class to generate form data to post to web servers using the UnityWebRequest or WWW classes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WWWForm.data\">\n      <summary>\n        <para>(Read Only) The raw data to pass as the POST request body when sending the form.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.WWWForm.headers\">\n      <summary>\n        <para>(Read Only) Returns the correct request headers for posting the form using the WWW class.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.WWWForm.AddBinaryData(System.String,System.Byte[])\">\n      <summary>\n        <para>Add binary data to the form.</para>\n      </summary>\n      <param name=\"fieldName\"></param>\n      <param name=\"contents\"></param>\n      <param name=\"fileName\"></param>\n      <param name=\"mimeType\"></param>\n    </member>\n    <member name=\"M:UnityEngine.WWWForm.AddBinaryData(System.String,System.Byte[],System.String)\">\n      <summary>\n        <para>Add binary data to the form.</para>\n      </summary>\n      <param name=\"fieldName\"></param>\n      <param name=\"contents\"></param>\n      <param name=\"fileName\"></param>\n      <param name=\"mimeType\"></param>\n    </member>\n    <member name=\"M:UnityEngine.WWWForm.AddBinaryData(System.String,System.Byte[],System.String,System.String)\">\n      <summary>\n        <para>Add binary data to the form.</para>\n      </summary>\n      <param name=\"fieldName\"></param>\n      <param name=\"contents\"></param>\n      <param name=\"fileName\"></param>\n      <param name=\"mimeType\"></param>\n    </member>\n    <member name=\"M:UnityEngine.WWWForm.AddField(System.String,System.String)\">\n      <summary>\n        <para>Add a simple field to the form.</para>\n      </summary>\n      <param name=\"fieldName\"></param>\n      <param name=\"value\"></param>\n      <param name=\"e\"></param>\n    </member>\n    <member name=\"M:UnityEngine.WWWForm.AddField(System.String,System.String,System.Text.Encoding)\">\n      <summary>\n        <para>Add a simple field to the form.</para>\n      </summary>\n      <param name=\"fieldName\"></param>\n      <param name=\"value\"></param>\n      <param name=\"e\"></param>\n    </member>\n    <member name=\"M:UnityEngine.WWWForm.AddField(System.String,System.Int32)\">\n      <summary>\n        <para>Adds a simple field to the form.</para>\n      </summary>\n      <param name=\"fieldName\"></param>\n      <param name=\"i\"></param>\n    </member>\n    <member name=\"M:UnityEngine.WWWForm.#ctor\">\n      <summary>\n        <para>Creates an empty WWWForm object.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.ARBackgroundRenderer\">\n      <summary>\n        <para>Class used to override a camera's default background rendering path to instead render a given Texture and/or Material. This will typically be used with images from the color camera for rendering the AR background on mobile devices.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.ARBackgroundRenderer.backgroundMaterial\">\n      <summary>\n        <para>The Material used for AR rendering.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.XR.ARBackgroundRenderer.backgroundRendererChanged(System.Action)\">\n      <summary>\n        <para>Called when any of the public properties of this class have been changed.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"P:UnityEngine.XR.ARBackgroundRenderer.backgroundTexture\">\n      <summary>\n        <para>An optional Texture used for AR rendering. If this property is not set then the texture set in XR.ARBackgroundRenderer._backgroundMaterial as \"_MainTex\" is used.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.ARBackgroundRenderer.camera\">\n      <summary>\n        <para>An optional Camera whose background rendering will be overridden by this class. If this property is not set then the main Camera in the scene is used.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.ARBackgroundRenderer.mode\">\n      <summary>\n        <para>When set to XR.ARRenderMode.StandardBackground (default) the camera is not overridden to display the background image. Setting this property to XR.ARRenderMode.MaterialAsBackground will render the texture specified by XR.ARBackgroundRenderer._backgroundMaterial and or XR.ARBackgroundRenderer._backgroundTexture as the background.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.ARBackgroundRenderer.DisableARBackgroundRendering\">\n      <summary>\n        <para>Disables AR background rendering. This method is called internally but can be overridden by users who wish to subclass XR.ARBackgroundRenderer to customize handling of AR background rendering.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.ARRenderMode\">\n      <summary>\n        <para>Enumeration describing the AR rendering mode used with XR.ARBackgroundRenderer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.ARRenderMode.MaterialAsBackground\">\n      <summary>\n        <para>The material associated with XR.ARBackgroundRenderer is being rendered as the background.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.ARRenderMode.StandardBackground\">\n      <summary>\n        <para>The standard background is rendered. (Skybox, Solid Color, etc.)</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.GameViewRenderMode\">\n      <summary>\n        <para>Enumeration of available modes for XR rendering in the Game view or in the main window on a host PC. XR rendering only occurs when the Unity Editor is in Play Mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.GameViewRenderMode.BothEyes\">\n      <summary>\n        <para>Renders both eyes of the XR device side-by-side in the Game view or in the main window on a host PC.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.GameViewRenderMode.LeftEye\">\n      <summary>\n        <para>Renders the left eye of the XR device in the Game View window or in main window on a host PC.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.GameViewRenderMode.OcclusionMesh\">\n      <summary>\n        <para>Renders both eyes of the XR device, and the occlusion mesh, side-by-side in the Game view or in the main window on a host PC.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.GameViewRenderMode.RightEye\">\n      <summary>\n        <para>Renders the right eye of the XR device in the Game View window or in main window on a host PC.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.InputTracking\">\n      <summary>\n        <para>A collection of methods and properties for interacting with the XR tracking system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.InputTracking.disablePositionalTracking\">\n      <summary>\n        <para>Disables positional tracking in XR. This takes effect the next time the head pose is sampled.  If set to true the camera only tracks headset rotation state.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.XR.InputTracking.nodeAdded(System.Action`1&lt;UnityEngine.XR.XRNodeState&gt;)\">\n      <summary>\n        <para>Called when a tracked node is added to the underlying XR system.</para>\n      </summary>\n      <param name=\"nodeState\">Describes the node that has been added.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.InputTracking.nodeRemoved(System.Action`1&lt;UnityEngine.XR.XRNodeState&gt;)\">\n      <summary>\n        <para>Called when a tracked node is removed from the underlying XR system.</para>\n      </summary>\n      <param name=\"nodeState\">Describes the node that has been removed.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.InputTracking.trackingAcquired(System.Action`1&lt;UnityEngine.XR.XRNodeState&gt;)\">\n      <summary>\n        <para>Called when a tracked node begins reporting tracking information.</para>\n      </summary>\n      <param name=\"nodeState\">Describes the node that has begun being tracked.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.InputTracking.trackingLost(System.Action`1&lt;UnityEngine.XR.XRNodeState&gt;)\">\n      <summary>\n        <para>Called when a tracked node stops reporting tracking information.</para>\n      </summary>\n      <param name=\"nodeState\">Describes the node that has lost tracking.</param>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"M:UnityEngine.XR.InputTracking.GetLocalPosition(UnityEngine.XR.XRNode)\">\n      <summary>\n        <para>Gets the position of a specific node.</para>\n      </summary>\n      <param name=\"node\">Specifies which node's position should be returned.</param>\n      <returns>\n        <para>The position of the node in its local tracking space.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.InputTracking.GetLocalRotation(UnityEngine.XR.XRNode)\">\n      <summary>\n        <para>Gets the rotation of a specific node.</para>\n      </summary>\n      <param name=\"node\">Specifies which node's rotation should be returned.</param>\n      <returns>\n        <para>The rotation of the node in its local tracking space.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.InputTracking.GetNodeName(System.UInt64)\">\n      <summary>\n        <para>Accepts the unique identifier for a tracked node and returns a friendly name for it.</para>\n      </summary>\n      <param name=\"uniqueID\">The unique identifier for the Node index.</param>\n      <returns>\n        <para>The name of the tracked node if the given 64-bit identifier maps to a currently tracked node. Empty string otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.InputTracking.GetNodeStates\">\n      <summary>\n        <para>Describes all currently connected XRNodes and provides available tracking states for each.</para>\n      </summary>\n      <param name=\"nodeStates\">A list that is populated with XR.XRNodeState objects.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.InputTracking.Recenter\">\n      <summary>\n        <para>Center tracking to the current position and orientation of the HMD.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.TrackingSpaceType\">\n      <summary>\n        <para>Represents the size of physical space available for XR.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.TrackingSpaceType.RoomScale\">\n      <summary>\n        <para>Represents a space large enough for free movement.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.TrackingSpaceType.Stationary\">\n      <summary>\n        <para>Represents a small space where movement may be constrained or positional tracking is unavailable.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.UserPresenceState\">\n      <summary>\n        <para>Represents the current user presence state detected by the device.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.UserPresenceState.NotPresent\">\n      <summary>\n        <para>The device does not detect that the user is present.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.UserPresenceState.Present\">\n      <summary>\n        <para>The device detects that the user is present.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.UserPresenceState.Unknown\">\n      <summary>\n        <para>The device is currently in a state where it cannot determine user presence.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.UserPresenceState.Unsupported\">\n      <summary>\n        <para>The device does not support detecting user presence.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.HolographicRemoting\">\n      <summary>\n        <para>he Holographic Remoting interface allows you to connect an application to a remote holographic device, and stream data between the application and that device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.HolographicRemoting.ConnectionState\">\n      <summary>\n        <para>Whether the app is displaying protected content.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.HolographicSettings\">\n      <summary>\n        <para>The Holographic Settings contain functions which effect the performance and presentation of Holograms on Windows Holographic platforms.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.HolographicSettings.ActivateLatentFramePresentation(System.Boolean)\">\n      <summary>\n        <para>Option to allow developers to achieve higher framerate at the cost of high latency.  By default this option is off.</para>\n      </summary>\n      <param name=\"activated\">True to enable or false to disable Low Latent Frame Presentation.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.HolographicSettings.HolographicReprojectionMode\">\n      <summary>\n        <para>Represents the kind of reprojection an app is requesting to stabilize its holographic rendering relative to the user's head motion.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.HolographicSettings.HolographicReprojectionMode.Disabled\">\n      <summary>\n        <para>The image should not be stabilized for the user's head motion, instead remaining fixed in the display. This is generally discouraged, as it is only comfortable for users when used sparingly, such as when the only visible content is a small cursor.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.HolographicSettings.HolographicReprojectionMode.OrientationOnly\">\n      <summary>\n        <para>The image should be stabilized only for changes to the user's head orientation, ignoring positional changes. This is best for body-locked content that should tag along with the user as they walk around, such as 360-degree video.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.HolographicSettings.HolographicReprojectionMode.PositionAndOrientation\">\n      <summary>\n        <para>The image should be stabilized for changes to both the user's head position and orientation. This is best for world-locked content that should remain physically stationary as the user walks around.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.HolographicSettings.IsContentProtectionEnabled\">\n      <summary>\n        <para>Whether the app is displaying protected content.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.HolographicSettings.IsDisplayOpaque\">\n      <summary>\n        <para>This method returns whether or not the display associated with the main camera reports as opaque.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.HolographicSettings.IsLatentFramePresentation\">\n      <summary>\n        <para>Returns true if Holographic rendering is currently running with Latent Frame Presentation.  Default value is false.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.HolographicSettings.ReprojectionMode\">\n      <summary>\n        <para>The kind of reprojection the app is requesting to stabilize its holographic rendering relative to the user's head motion.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.HolographicSettings.SetFocusPointForFrame(UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets a point in 3d space that is the focal point of the scene for the user for this frame. This helps improve the visual fidelity of content around this point. This must be set every frame.</para>\n      </summary>\n      <param name=\"position\">The position of the focal point in the scene, relative to the camera.</param>\n      <param name=\"normal\">Surface normal of the plane being viewed at the focal point.</param>\n      <param name=\"velocity\">A vector that describes how the focus point is moving in the scene at this point in time. This allows the HoloLens to compensate for both your head movement and the movement of the object in the scene.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.HolographicSettings.SetFocusPointForFrame(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets a point in 3d space that is the focal point of the scene for the user for this frame. This helps improve the visual fidelity of content around this point. This must be set every frame.</para>\n      </summary>\n      <param name=\"position\">The position of the focal point in the scene, relative to the camera.</param>\n      <param name=\"normal\">Surface normal of the plane being viewed at the focal point.</param>\n      <param name=\"velocity\">A vector that describes how the focus point is moving in the scene at this point in time. This allows the HoloLens to compensate for both your head movement and the movement of the object in the scene.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.HolographicSettings.SetFocusPointForFrame(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>Sets a point in 3d space that is the focal point of the scene for the user for this frame. This helps improve the visual fidelity of content around this point. This must be set every frame.</para>\n      </summary>\n      <param name=\"position\">The position of the focal point in the scene, relative to the camera.</param>\n      <param name=\"normal\">Surface normal of the plane being viewed at the focal point.</param>\n      <param name=\"velocity\">A vector that describes how the focus point is moving in the scene at this point in time. This allows the HoloLens to compensate for both your head movement and the movement of the object in the scene.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.HolographicStreamerConnectionFailureReason\">\n      <summary>\n        <para>Enum indicating the reason why connection to remote device has failed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.HolographicStreamerConnectionFailureReason.ConnectionLost\">\n      <summary>\n        <para>Enum indicating the reason why remote connection failed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.HolographicStreamerConnectionFailureReason.HandshakeFailed\">\n      <summary>\n        <para>Handskahe failed while traying to establish connection with remote device.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.HolographicStreamerConnectionFailureReason.None\">\n      <summary>\n        <para>No failure.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.HolographicStreamerConnectionFailureReason.ProtocolVersionMismatch\">\n      <summary>\n        <para>Protocol used by the app does not match remoting app running on remote device.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.HolographicStreamerConnectionFailureReason.Unknown\">\n      <summary>\n        <para>Couldn't identify the reason why connection failed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.HolographicStreamerConnectionFailureReason.Unreachable\">\n      <summary>\n        <para>Remove device is not reachable.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.HolographicStreamerConnectionState\">\n      <summary>\n        <para>Current state of the holographis streamer remote connection.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.HolographicStreamerConnectionState.Connected\">\n      <summary>\n        <para>Indicates app being connected to remote device.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.HolographicStreamerConnectionState.Connecting\">\n      <summary>\n        <para>Indicates app trying to connect to remote device.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.HolographicStreamerConnectionState.Disconnected\">\n      <summary>\n        <para>Indicates app being currently disconnected from any other remote device.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.GestureErrorEventArgs\">\n      <summary>\n        <para>Contains fields that are relevant during an error event.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.GestureErrorEventArgs.error\">\n      <summary>\n        <para>A readable error string (when possible).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.GestureErrorEventArgs.hresult\">\n      <summary>\n        <para>The HRESULT code from the platform.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.GestureRecognizer\">\n      <summary>\n        <para>Manager class with API for recognizing user gestures.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.GestureRecognizer.CancelGestures\">\n      <summary>\n        <para>Cancels any pending gesture events.  Additionally this will call StopCapturingGestures.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.GestureRecognizer.#ctor\">\n      <summary>\n        <para>Create a GestureRecognizer.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.GestureRecognizer.Dispose\">\n      <summary>\n        <para>Disposes the resources used by gesture recognizer.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.GestureError(System.Action`1&lt;UnityEngine.XR.WSA.Input.GestureErrorEventArgs&gt;)\">\n      <summary>\n        <para>Fires when Microsoft's gesture-recognition system encounters a warning or error.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.GestureRecognizer.GestureErrorDelegate\">\n      <summary>\n        <para>Callback indicating an error or warning occurred.</para>\n      </summary>\n      <param name=\"error\">A readable error string (when possible).</param>\n      <param name=\"hresult\">The HRESULT code from the platform.</param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.GestureErrorEvent(UnityEngine.XR.WSA.Input.GestureRecognizer/GestureErrorDelegate)\">\n      <summary>\n        <para>Fired when a warning or error is emitted by the GestureRecognizer.</para>\n      </summary>\n      <param name=\"value\">Delegate to be triggered to report warnings and errors.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.GestureRecognizer.GetRecognizableGestures\">\n      <summary>\n        <para>Retrieve a mask of the currently enabled gestures.</para>\n      </summary>\n      <returns>\n        <para>A mask indicating which Gestures are currently recognizable.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.HoldCanceled(System.Action`1&lt;UnityEngine.XR.WSA.Input.HoldCanceledEventArgs&gt;)\">\n      <summary>\n        <para>Fires when Microsoft's gesture-recognition system recognizers that a user has canceled a hold gesture.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.HoldCanceledEvent(UnityEngine.XR.WSA.Input.GestureRecognizer/HoldCanceledEventDelegate)\">\n      <summary>\n        <para>Fired when the user does a cancel event either using their hands or in speech.</para>\n      </summary>\n      <param name=\"value\">Delegate to be triggered when a cancel event is triggered.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.GestureRecognizer.HoldCanceledEventDelegate\">\n      <summary>\n        <para>Callback indicating a cancel event.</para>\n      </summary>\n      <param name=\"source\">Indicates which input medium triggered this event.</param>\n      <param name=\"headRay\">Ray (with normalized direction) from user at the time this gesture began.</param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.HoldCompleted(System.Action`1&lt;UnityEngine.XR.WSA.Input.HoldCompletedEventArgs&gt;)\">\n      <summary>\n        <para>Fires when Microsoft's gesture-recognition system recognizers that a user has completed a hold gesture.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.HoldCompletedEvent(UnityEngine.XR.WSA.Input.GestureRecognizer/HoldCompletedEventDelegate)\">\n      <summary>\n        <para>Fired when users complete a hold gesture.</para>\n      </summary>\n      <param name=\"value\">Delegate to be triggered when the user completes a hold gesture.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.GestureRecognizer.HoldCompletedEventDelegate\">\n      <summary>\n        <para>Callback indicating a hold completed event.</para>\n      </summary>\n      <param name=\"source\">Indicates which input medium triggered this event.</param>\n      <param name=\"headRay\">Ray (with normalized direction) from user at the time this gesture began.</param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.HoldStarted(System.Action`1&lt;UnityEngine.XR.WSA.Input.HoldStartedEventArgs&gt;)\">\n      <summary>\n        <para>Fires when Microsoft's gesture-recognition system recognizes that a user has started a hold gesture.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.HoldStartedEvent(UnityEngine.XR.WSA.Input.GestureRecognizer/HoldStartedEventDelegate)\">\n      <summary>\n        <para>Fired when users start a hold gesture.</para>\n      </summary>\n      <param name=\"value\">The delegate to be triggered when a user starts a hold gesture.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.GestureRecognizer.HoldStartedEventDelegate\">\n      <summary>\n        <para>Callback indicating a hold started event.</para>\n      </summary>\n      <param name=\"source\">Indicates which input medium triggered this event.</param>\n      <param name=\"headRay\">Ray (with normalized direction) from user at the time this gesture began.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.GestureRecognizer.IsCapturingGestures\">\n      <summary>\n        <para>Used to query if the GestureRecognizer is currently receiving Gesture events.</para>\n      </summary>\n      <returns>\n        <para>True if the GestureRecognizer is receiving events or false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.ManipulationCanceled(System.Action`1&lt;UnityEngine.XR.WSA.Input.ManipulationCanceledEventArgs&gt;)\">\n      <summary>\n        <para>Fires when Microsoft's gesture-recognition system recognizes that a user has canceled a manipulation gesture.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.ManipulationCanceledEvent(UnityEngine.XR.WSA.Input.GestureRecognizer/ManipulationCanceledEventDelegate)\">\n      <summary>\n        <para>Fires when a Manipulation gesture is canceled.</para>\n      </summary>\n      <param name=\"value\">Delegate to be triggered when a cancel event is triggered.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.GestureRecognizer.ManipulationCanceledEventDelegate\">\n      <summary>\n        <para>Callback indicating a cancel event.</para>\n      </summary>\n      <param name=\"source\">Indicates which input medium triggered this event.</param>\n      <param name=\"cumulativeDelta\">Total distance moved since the beginning of the manipulation gesture.</param>\n      <param name=\"headRay\">Ray (with normalized direction) from user at the time this gesture began.</param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.ManipulationCompleted(System.Action`1&lt;UnityEngine.XR.WSA.Input.ManipulationCompletedEventArgs&gt;)\">\n      <summary>\n        <para>Fires when Microsoft's gesture-recognition system recognizes that a user has completed a manipulation gesture.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.ManipulationCompletedEvent(UnityEngine.XR.WSA.Input.GestureRecognizer/ManipulationCompletedEventDelegate)\">\n      <summary>\n        <para>Fires when a Manipulation gesture is completed.</para>\n      </summary>\n      <param name=\"value\">Delegate to be triggered when a completed event is triggered.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.GestureRecognizer.ManipulationCompletedEventDelegate\">\n      <summary>\n        <para>Callback indicating a completed event.</para>\n      </summary>\n      <param name=\"source\">Indicates which input medium triggered this event.</param>\n      <param name=\"cumulativeDelta\">Total distance moved since the beginning of the manipulation gesture.</param>\n      <param name=\"headRay\">Ray (with normalized direction) from user at the time this gesture began.</param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.ManipulationStarted(System.Action`1&lt;UnityEngine.XR.WSA.Input.ManipulationStartedEventArgs&gt;)\">\n      <summary>\n        <para>Fires when Microsoft's gesture-recognition system recognizes that a user has started a manipulation gesture.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.ManipulationStartedEvent(UnityEngine.XR.WSA.Input.GestureRecognizer/ManipulationStartedEventDelegate)\">\n      <summary>\n        <para>Fires when an interaction becomes a Manipulation gesture.</para>\n      </summary>\n      <param name=\"value\">Delegate to be triggered when a started event is triggered.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.GestureRecognizer.ManipulationStartedEventDelegate\">\n      <summary>\n        <para>Callback indicating a started event.</para>\n      </summary>\n      <param name=\"source\">Indicates which input medium triggered this event.</param>\n      <param name=\"cumulativeDelta\">Total distance moved since the beginning of the manipulation gesture.</param>\n      <param name=\"headRay\">Ray (with normalized direction) from user at the time this gesture began.</param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.ManipulationUpdated(System.Action`1&lt;UnityEngine.XR.WSA.Input.ManipulationUpdatedEventArgs&gt;)\">\n      <summary>\n        <para>Fires when Microsoft's gesture-recognition system recognizes that a user has updated a manipulation gesture.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.ManipulationUpdatedEvent(UnityEngine.XR.WSA.Input.GestureRecognizer/ManipulationUpdatedEventDelegate)\">\n      <summary>\n        <para>Fires when a Manipulation gesture is updated due to hand movement.</para>\n      </summary>\n      <param name=\"value\">Delegate to be triggered when a updated event is triggered.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.GestureRecognizer.ManipulationUpdatedEventDelegate\">\n      <summary>\n        <para>Callback indicating a updated event.</para>\n      </summary>\n      <param name=\"source\">Indicates which input medium triggered this event.</param>\n      <param name=\"cumulativeDelta\">Total distance moved since the beginning of the manipulation gesture.</param>\n      <param name=\"headRay\">Ray (with normalized direction) from user at the time this gesture began.</param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.NavigationCanceled(System.Action`1&lt;UnityEngine.XR.WSA.Input.NavigationCanceledEventArgs&gt;)\">\n      <summary>\n        <para>Fires when Microsoft's gesture-recognition system recognizes that a user has canceled a navigation gesture.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.NavigationCanceledEvent(UnityEngine.XR.WSA.Input.GestureRecognizer/NavigationCanceledEventDelegate)\">\n      <summary>\n        <para>Fires when a Navigation gesture is canceled.</para>\n      </summary>\n      <param name=\"value\">Delegate to be triggered when a cancel event is triggered.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.GestureRecognizer.NavigationCanceledEventDelegate\">\n      <summary>\n        <para>Callback indicating a cancel event.</para>\n      </summary>\n      <param name=\"source\">Indicates which input medium triggered this event.</param>\n      <param name=\"normalizedOffset\">The last known normalized offset of the input within the unit cube for the navigation gesture.</param>\n      <param name=\"headRay\">Ray (with normalized direction) from user at the time this gesture began.</param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.NavigationCompleted(System.Action`1&lt;UnityEngine.XR.WSA.Input.NavigationCompletedEventArgs&gt;)\">\n      <summary>\n        <para>Fires when Microsoft's gesture-recognition system recognizes that a navigation gesture completes.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.NavigationCompletedEvent(UnityEngine.XR.WSA.Input.GestureRecognizer/NavigationCompletedEventDelegate)\">\n      <summary>\n        <para>Fires when a Navigation gesture is completed.</para>\n      </summary>\n      <param name=\"value\">Delegate to be triggered when a complete event is triggered.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.GestureRecognizer.NavigationCompletedEventDelegate\">\n      <summary>\n        <para>Callback indicating a completed event.</para>\n      </summary>\n      <param name=\"source\">Indicates which input medium triggered this event.</param>\n      <param name=\"normalizedOffset\">The last known normalized offset, since the navigation gesture began, of the input within the unit cube for the navigation gesture.</param>\n      <param name=\"headRay\">Ray (with normalized direction) from user at the time this gesture began.</param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.NavigationStarted(System.Action`1&lt;UnityEngine.XR.WSA.Input.NavigationStartedEventArgs&gt;)\">\n      <summary>\n        <para>Fires when Microsoft's gesture-recognition system recognizes that a user has started a navigation gesture.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.NavigationStartedEvent(UnityEngine.XR.WSA.Input.GestureRecognizer/NavigationStartedEventDelegate)\">\n      <summary>\n        <para>Fires when an interaction becomes a Navigation gesture.</para>\n      </summary>\n      <param name=\"value\">Delegate to be triggered when a started event is triggered.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.GestureRecognizer.NavigationStartedEventDelegate\">\n      <summary>\n        <para>Callback indicating a started event.</para>\n      </summary>\n      <param name=\"source\">Indicates which input medium triggered this event.</param>\n      <param name=\"normalizedOffset\">The normalized offset, since the navigation gesture began, of the input within the unit cube for the navigation gesture.</param>\n      <param name=\"headRay\">Ray (with normalized direction) from user at the time this gesture began.</param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.NavigationUpdated(System.Action`1&lt;UnityEngine.XR.WSA.Input.NavigationUpdatedEventArgs&gt;)\">\n      <summary>\n        <para>Fires when Microsoft's gesture-recognition system recognizes that navigation gesture has updated.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.NavigationUpdatedEvent(UnityEngine.XR.WSA.Input.GestureRecognizer/NavigationUpdatedEventDelegate)\">\n      <summary>\n        <para>Fires when a Navigation gesture is updated due to hand or controller movement.</para>\n      </summary>\n      <param name=\"value\">Delegate to be triggered when a update event is triggered.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.GestureRecognizer.NavigationUpdatedEventDelegate\">\n      <summary>\n        <para>Callback indicating a update event.</para>\n      </summary>\n      <param name=\"source\">Indicates which input medium triggered this event.</param>\n      <param name=\"normalizedOffset\">The last known normalized offset, since the navigation gesture began, of the input within the unit cube for the navigation gesture.</param>\n      <param name=\"headRay\">Ray (with normalized direction) from user at the time this gesture began.</param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.RecognitionEnded(System.Action`1&lt;UnityEngine.XR.WSA.Input.RecognitionEndedEventArgs&gt;)\">\n      <summary>\n        <para>Fires when recognition of gestures is done, either due to completion of a gesture or cancellation.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.RecognitionEndedEvent(UnityEngine.XR.WSA.Input.GestureRecognizer/RecognitionEndedEventDelegate)\">\n      <summary>\n        <para>Fires when recognition of gestures is done, either due to completion of a gesture or cancellation.</para>\n      </summary>\n      <param name=\"value\">Delegate to be triggered when an end event is triggered.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.GestureRecognizer.RecognitionEndedEventDelegate\">\n      <summary>\n        <para>Callback indicating the gesture event has completed.</para>\n      </summary>\n      <param name=\"source\">Indicates which input medium triggered this event.</param>\n      <param name=\"headRay\">Ray (with normalized direction) from user at the time a gesture began.</param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.RecognitionStarted(System.Action`1&lt;UnityEngine.XR.WSA.Input.RecognitionStartedEventArgs&gt;)\">\n      <summary>\n        <para>Fires when recognition of gestures begins.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.RecognitionStartedEvent(UnityEngine.XR.WSA.Input.GestureRecognizer/RecognitionStartedEventDelegate)\">\n      <summary>\n        <para>Fires when recognition of gestures begins.</para>\n      </summary>\n      <param name=\"value\">Delegate to be triggered when a start event is triggered.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.GestureRecognizer.RecognitionStartedEventDelegate\">\n      <summary>\n        <para>Callback indicating the gesture event has started.</para>\n      </summary>\n      <param name=\"source\">Indicates which input medium triggered this event.</param>\n      <param name=\"headRay\">Ray (with normalized direction) from user at the time a gesture began.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.GestureRecognizer.SetRecognizableGestures(UnityEngine.XR.WSA.Input.GestureSettings)\">\n      <summary>\n        <para>Set the recognizable gestures to the ones specified in newMaskValues and return the old settings.</para>\n      </summary>\n      <param name=\"newMaskValue\">A mask indicating which gestures are now recognizable.</param>\n      <returns>\n        <para>The previous value.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.GestureRecognizer.StartCapturingGestures\">\n      <summary>\n        <para>Call to begin receiving gesture events on this recognizer.  No events will be received until this method is called.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.GestureRecognizer.StopCapturingGestures\">\n      <summary>\n        <para>Call to stop receiving gesture events on this recognizer.</para>\n      </summary>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.Tapped(System.Action`1&lt;UnityEngine.XR.WSA.Input.TappedEventArgs&gt;)\">\n      <summary>\n        <para>Fires when Microsoft's gesture-recognition system recognizes that a user has done a tap gesture and after the system voice command \"Select\" has been processed. For controllers, this event fires when the primary button is released after it was pressed.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.GestureRecognizer.TappedEvent(UnityEngine.XR.WSA.Input.GestureRecognizer/TappedEventDelegate)\">\n      <summary>\n        <para>Occurs when a Tap gesture is recognized.</para>\n      </summary>\n      <param name=\"value\">Delegate to be triggered when a tap event is triggered.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.GestureRecognizer.TappedEventDelegate\">\n      <summary>\n        <para>Callback indicating a tap event.</para>\n      </summary>\n      <param name=\"source\">Indicates which input medium triggered this event.</param>\n      <param name=\"tapCount\">The count of taps (1 for single tap, 2 for double tap).</param>\n      <param name=\"headRay\">Ray (with normalized direction) from user at the time this event interaction began.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.GestureSettings\">\n      <summary>\n        <para>This enumeration represents the set of gestures that may be recognized by GestureRecognizer.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.GestureSettings.DoubleTap\">\n      <summary>\n        <para>Enable support for the double-tap gesture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.GestureSettings.Hold\">\n      <summary>\n        <para>Enable support for the hold gesture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.GestureSettings.ManipulationTranslate\">\n      <summary>\n        <para>Enable support for the manipulation gesture which tracks changes to the hand's position.  This gesture is relative to the start position of the gesture and measures an absolute movement through the world.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.GestureSettings.NavigationRailsX\">\n      <summary>\n        <para>Enable support for the navigation gesture, in the horizontal axis using rails (guides).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.GestureSettings.NavigationRailsY\">\n      <summary>\n        <para>Enable support for the navigation gesture, in the vertical axis using rails (guides).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.GestureSettings.NavigationRailsZ\">\n      <summary>\n        <para>Enable support for the navigation gesture, in the depth axis using rails (guides).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.GestureSettings.NavigationX\">\n      <summary>\n        <para>Enable support for the navigation gesture, in the horizontal axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.GestureSettings.NavigationY\">\n      <summary>\n        <para>Enable support for the navigation gesture, in the vertical axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.GestureSettings.NavigationZ\">\n      <summary>\n        <para>Enable support for the navigation gesture, in the depth axis.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.GestureSettings.None\">\n      <summary>\n        <para>Disable support for gestures.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.GestureSettings.Tap\">\n      <summary>\n        <para>Enable support for the tap gesture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.HoldCanceledEventArgs\">\n      <summary>\n        <para>Contains fields that are relevant when a user cancels a hold gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.HoldCanceledEventArgs.headPose\">\n      <summary>\n        <para>Head pose of the user at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.HoldCanceledEventArgs.source\">\n      <summary>\n        <para>The InteractionSource (hand, controller, or user's voice) that canceled the hold gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.HoldCanceledEventArgs.sourcePose\">\n      <summary>\n        <para>Represents pose data of the input source, such as a hand or controller, when the gesture occurred.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.HoldCompletedEventArgs\">\n      <summary>\n        <para>Contains fields that are relevant when a hold gesture completes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.HoldCompletedEventArgs.headPose\">\n      <summary>\n        <para>Head pose of the user at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.HoldCompletedEventArgs.source\">\n      <summary>\n        <para>The InteractionSource (hand, controller, or user's voice) that completed the hold gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.HoldCompletedEventArgs.sourcePose\">\n      <summary>\n        <para>Pose data of the interaction source at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.HoldStartedEventArgs\">\n      <summary>\n        <para>Contains fields that are relevant when a hold gesture starts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.HoldStartedEventArgs.headPose\">\n      <summary>\n        <para>Head pose of the user at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.HoldStartedEventArgs.source\">\n      <summary>\n        <para>The InteractionSource (hand, controller, or user's voice) that started the hold gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.HoldStartedEventArgs.sourcePose\">\n      <summary>\n        <para>Pose data of the interaction source at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.InteractionManager\">\n      <summary>\n        <para>Provides access to user input from hands, controllers, and system voice commands.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionManager.numSourceStates\">\n      <summary>\n        <para>(Read Only) The number of InteractionSourceState snapshots available for reading with InteractionManager.GetCurrentReading.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.InteractionManager.GetCurrentReading\">\n      <summary>\n        <para>Get the current SourceState.</para>\n      </summary>\n      <returns>\n        <para>An array of InteractionSourceState snapshots.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.InteractionManager.GetCurrentReading(UnityEngine.XR.WSA.Input.InteractionSourceState[])\">\n      <summary>\n        <para>Allows retrieving the current source states without allocating an array. The number of retrieved source states will be returned, up to a maximum of the size of the array.</para>\n      </summary>\n      <param name=\"sourceStates\">An array for storing InteractionSourceState snapshots.</param>\n      <returns>\n        <para>The number of snapshots stored in the array, up to the size of the array.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.InteractionManager.InteractionSourceDetected(System.Action`1&lt;UnityEngine.XR.WSA.Input.InteractionSourceDetectedEventArgs&gt;)\">\n      <summary>\n        <para>Occurs when a new hand, controller, or source of voice commands has been detected.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.InteractionManager.InteractionSourceDetectedLegacy(UnityEngine.XR.WSA.Input.InteractionManager/SourceEventHandler)\">\n      <summary>\n        <para>Occurs when a new hand, controller, or source of voice commands has been detected.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.InteractionManager.InteractionSourceLost(System.Action`1&lt;UnityEngine.XR.WSA.Input.InteractionSourceLostEventArgs&gt;)\">\n      <summary>\n        <para>Occurs when a hand, controller, or source of voice commands is no longer available.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.InteractionManager.InteractionSourceLostLegacy(UnityEngine.XR.WSA.Input.InteractionManager/SourceEventHandler)\">\n      <summary>\n        <para>Occurs when a hand, controller, or source of voice commands is no longer available.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.InteractionManager.InteractionSourcePressed(System.Action`1&lt;UnityEngine.XR.WSA.Input.InteractionSourcePressedEventArgs&gt;)\">\n      <summary>\n        <para>Occurs when a hand or controller has entered the pressed state.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.InteractionManager.InteractionSourcePressedLegacy(UnityEngine.XR.WSA.Input.InteractionManager/SourceEventHandler)\">\n      <summary>\n        <para>Occurs when a hand or controller has entered the pressed state.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.InteractionManager.InteractionSourceReleased(System.Action`1&lt;UnityEngine.XR.WSA.Input.InteractionSourceReleasedEventArgs&gt;)\">\n      <summary>\n        <para>Occurs when a hand or controller has exited the pressed state.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.InteractionManager.InteractionSourceReleasedLegacy(UnityEngine.XR.WSA.Input.InteractionManager/SourceEventHandler)\">\n      <summary>\n        <para>Occurs when a hand or controller has exited the pressed state.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.InteractionManager.InteractionSourceUpdated(System.Action`1&lt;UnityEngine.XR.WSA.Input.InteractionSourceUpdatedEventArgs&gt;)\">\n      <summary>\n        <para>Occurs when a hand or controller has experienced a change to its SourceState.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.Input.InteractionManager.InteractionSourceUpdatedLegacy(UnityEngine.XR.WSA.Input.InteractionManager/SourceEventHandler)\">\n      <summary>\n        <para>Occurs when a hand or controller has experienced a change to its SourceState.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.InteractionManager.SourceEventHandler\">\n      <summary>\n        <para>Callback to handle InteractionManager events.</para>\n      </summary>\n      <param name=\"state\"></param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.InteractionSource\">\n      <summary>\n        <para>Represents one detected instance of an interaction source (hand, controller, or user's voice) that can cause interactions and gestures.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSource.handedness\">\n      <summary>\n        <para>Denotes which hand was used as the input source.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSource.id\">\n      <summary>\n        <para>The identifier for the interaction source (hand, controller, or user's voice).</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSource.kind\">\n      <summary>\n        <para>Specifies the kind of an interaction source.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSource.productId\">\n      <summary>\n        <para>Following the make and model nomenclature of cars, this equates to the model number.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSource.productVersion\">\n      <summary>\n        <para>Following the make and model nomenclature of cars, this would be a minor update to the model.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSource.supportsGrasp\">\n      <summary>\n        <para>This property returns true when the interaction source has at least one grasp button, and false if otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSource.supportsMenu\">\n      <summary>\n        <para>This property returns true when the interaction source has a menu button, and false if otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSource.supportsPointing\">\n      <summary>\n        <para>This property returns true if the interaction source has a separate pose for the pointer, and false if otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSource.supportsThumbstick\">\n      <summary>\n        <para>Returns true if the interaction source has a thumbstick, and false if otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSource.supportsTouchpad\">\n      <summary>\n        <para>Returns true if the interaction source has a touchpad, and false if otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSource.vendorId\">\n      <summary>\n        <para>All interaction sources developed by the same company will have the same vendor ID.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.InteractionSourceDetectedEventArgs\">\n      <summary>\n        <para>Contains fields that are relevent when an interaction source is detected.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceDetectedEventArgs.state\">\n      <summary>\n        <para>The current state of the reported interaction source that was just detected.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.InteractionSourceHandedness\">\n      <summary>\n        <para>Denotes which hand was used as the input source.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.InteractionSourceKind\">\n      <summary>\n        <para>Specifies the kind of an interaction source.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.InteractionSourceKind.Controller\">\n      <summary>\n        <para>The interaction source is of a kind not known in this version of the API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.InteractionSourceKind.Hand\">\n      <summary>\n        <para>The interaction source is one of the user's hands.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.InteractionSourceKind.Other\">\n      <summary>\n        <para>The interaction source is of a kind not known in this version of the API.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.InteractionSourceKind.Voice\">\n      <summary>\n        <para>The interaction source is the user's speech.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.InteractionSourceLocation\">\n      <summary>\n        <para>Represents the position and velocity of a hand or controller - this has been deprecated. Use InteractionSourcePose instead.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.InteractionSourceLocation.TryGetPosition(UnityEngine.Vector3&amp;)\">\n      <summary>\n        <para>Get the position of the interaction - this has been deprecated. Use InteractionSourcePose instead.</para>\n      </summary>\n      <param name=\"position\">Supplied Vector3 to be populated with interaction position.</param>\n      <returns>\n        <para>True if the position is successfully returned.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.InteractionSourceLocation.TryGetVelocity(UnityEngine.Vector3&amp;)\">\n      <summary>\n        <para>Get the velocity of the interaction - this has been deprecated. Use InteractionSourcePose instead.</para>\n      </summary>\n      <param name=\"velocity\">Supplied Vector3 to be populated with interaction velocity.</param>\n      <returns>\n        <para>True if the velocity is successfully returned.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.InteractionSourceLostEventArgs\">\n      <summary>\n        <para>Contains fields that are relevent when an interaction source is lost.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceLostEventArgs.state\">\n      <summary>\n        <para>The current state of the reported interaction source that was just lost.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.InteractionSourceNode\">\n      <summary>\n        <para>Specifies which part of the controller to query pose information for.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.InteractionSourceNode.Grip\">\n      <summary>\n        <para>The grip of the controller.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.InteractionSourceNode.Pointer\">\n      <summary>\n        <para>The pointer of the controller.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.InteractionSourcePose\">\n      <summary>\n        <para>Pose data of the interaction source at the time of either the gesture or interaction.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourcePose.positionAccuracy\">\n      <summary>\n        <para>The position-tracking accuracy of the interaction source.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.InteractionSourcePose.TryGetAngularVelocity(UnityEngine.Vector3&amp;)\">\n      <summary>\n        <para>Attempts to retrieve a Vector3 representing the current angular velocity of the tracked node.</para>\n      </summary>\n      <param name=\"angularVelocity\">If the function returns true, this will be filled out with the angular velocity of the interaction source. If the function returns false, the value filled out should not be used.</param>\n      <returns>\n        <para>True if the angular velocity was set in the output parameter. False if the angular velocity is not available due to limitations of the underlying platform or if the node is not presently tracked.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.InteractionSourcePose.TryGetForward(UnityEngine.Vector3&amp;,UnityEngine.XR.WSA.Input.InteractionSourceNode)\">\n      <summary>\n        <para>Gets the forward vector of the interaction source, assuming rotation is valid.</para>\n      </summary>\n      <param name=\"forward\">The forward vector of the interaction source, if the function returns true.</param>\n      <param name=\"node\">Specifies which part of the controller to query for its forward vector.</param>\n      <returns>\n        <para>This method returns true when the rotation is valid and the Vector3 passed in was filled out correctly, and false if otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.InteractionSourcePose.TryGetPosition(UnityEngine.Vector3&amp;,UnityEngine.XR.WSA.Input.InteractionSourceNode)\">\n      <summary>\n        <para>Gets the position of the interaction source, assuming the backing data is valid.</para>\n      </summary>\n      <param name=\"position\">The position of the interaction source, is the function returns true.</param>\n      <param name=\"node\">Specifies which part of the controller to query for its position.</param>\n      <returns>\n        <para>This method returns true when the Vector3 passed in was filled out correctly, and false if otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.InteractionSourcePose.TryGetRight(UnityEngine.Vector3&amp;,UnityEngine.XR.WSA.Input.InteractionSourceNode)\">\n      <summary>\n        <para>Gets the right vector of the interaction source, assuming rotation is valid.</para>\n      </summary>\n      <param name=\"right\">The right vector of the interaction source, if the function returns true.</param>\n      <param name=\"node\">Specifies which part of the controller to query for its right vector.</param>\n      <returns>\n        <para>This method returns true if rotation is valid and the Vector3 passed in was filled out correctly, and false if otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.InteractionSourcePose.TryGetRotation(UnityEngine.Quaternion&amp;,UnityEngine.XR.WSA.Input.InteractionSourceNode)\">\n      <summary>\n        <para>Gets the rotation of the interaction source, assuming the backing data is valid.</para>\n      </summary>\n      <param name=\"node\">Specifies which part of the controller to query for its rotation.</param>\n      <param name=\"rotation\">The rotation of the interaction source, if the function returns true.</param>\n      <returns>\n        <para>This method returns true if the Quaternion passed in was filled out correctly, and false if otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.InteractionSourcePose.TryGetUp(UnityEngine.Vector3&amp;,UnityEngine.XR.WSA.Input.InteractionSourceNode)\">\n      <summary>\n        <para>Gets the up vector of the interaction source, assuming rotation is valid.</para>\n      </summary>\n      <param name=\"up\">The up vector of the interaction source, if the function returns true.</param>\n      <param name=\"node\">Specifies which part of the controller to query for its up vector.</param>\n      <returns>\n        <para>Returns true if the rotation is valid and the Vector3 passed in was filled out correctly, and false if otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Input.InteractionSourcePose.TryGetVelocity(UnityEngine.Vector3&amp;)\">\n      <summary>\n        <para>Gets the velocity of the interaction source, assuming the backing data is valid.</para>\n      </summary>\n      <param name=\"velocity\">The velocity of the interaction source, if the function returns true.</param>\n      <returns>\n        <para>Returns true if the Vector3 passed in was filled out correctly, and false if otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.InteractionSourcePositionAccuracy\">\n      <summary>\n        <para>Denotes the accuracy of tracking on the interaction source.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.InteractionSourcePositionAccuracy.Approximate\">\n      <summary>\n        <para>A position accuracy of Approximate reports that you may not want to fully trust the positions reported, as the position is inferred or synthesized in some way, such as the controller leaving the sensors' field of view and forcing the API to rely on the device's IMU instead of visual tracking.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.InteractionSourcePositionAccuracy.High\">\n      <summary>\n        <para>A position accuracy of High reports that you can fully trust the position, as the interaction source is within the sensors' visual field of view.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.InteractionSourcePositionAccuracy.None\">\n      <summary>\n        <para>A position accuracy of None reports that there is no position accuracy, as the interaction source unlocatable.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.InteractionSourcePressedEventArgs\">\n      <summary>\n        <para>Contains fields that are relevent when an interaction source enters the pressed state for one of its buttons.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourcePressedEventArgs.pressType\">\n      <summary>\n        <para>Denotes the type of button that was just pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourcePressedEventArgs.state\">\n      <summary>\n        <para>The current state of the reported interaction source that just had one of its buttons enter the pressed state.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.InteractionSourcePressType\">\n      <summary>\n        <para>The type of button or controller feature pressed, if any.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.InteractionSourcePressType.Grasp\">\n      <summary>\n        <para>These buttons are generally found on the side of the controller. Some hardware has more than one grasp button.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.InteractionSourcePressType.Menu\">\n      <summary>\n        <para>This button is marked with three horizontal lines, same as you would fine on an Xbox One controller.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.InteractionSourcePressType.Select\">\n      <summary>\n        <para>Depending on the InteractionSourceType of the interaction source, this could be a number of equivalent things: main button on a blicker, air-tap on a hand, and the trigger on a motion controller.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.InteractionSourcePressType.Thumbstick\">\n      <summary>\n        <para>Similar to the touchpad, moving the thumbstick won't count as pressing it - a press will occur when pressing down on the thumbstick enough.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Input.InteractionSourcePressType.Touchpad\">\n      <summary>\n        <para>A touchpad only counts as pressed when it's held down enough - otherwise, it's just touched, and will give a reading of the position through InteractionSourceState.touchpadPosition.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.InteractionSourceProperties\">\n      <summary>\n        <para>Represents the set of properties available to explore the current state of a hand or controller.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceProperties.location\">\n      <summary>\n        <para>The position and velocity of the hand, expressed in the specified coordinate system - this has been deprecated. Use InteractionSourcePose instead.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceProperties.sourceLossMitigationDirection\">\n      <summary>\n        <para>The direction you should suggest that the user move their hand if it is nearing the edge of the detection area.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceProperties.sourceLossRisk\">\n      <summary>\n        <para>Gets the risk that detection of the hand will be lost as a value from 0.0 to 1.0.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.InteractionSourceReleasedEventArgs\">\n      <summary>\n        <para>Contains fields that are relevent when an interaction source exits the pressed state for one of its buttons.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceReleasedEventArgs.pressType\">\n      <summary>\n        <para>Denotes the type of button that was just released.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceReleasedEventArgs.state\">\n      <summary>\n        <para>The current state of the reported interaction source that just had one of its buttons exit the pressed state.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.InteractionSourceState\">\n      <summary>\n        <para>Represents a snapshot of the state of a spatial interaction source (hand, voice or controller) at a given time.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceState.anyPressed\">\n      <summary>\n        <para>True if the source is in the pressed state.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceState.grasped\">\n      <summary>\n        <para>Whether the controller is grasped.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceState.headPose\">\n      <summary>\n        <para>Head pose of the user at the time of the interaction.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceState.headRay\">\n      <summary>\n        <para>The Ray at the time represented by this InteractionSourceState.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceState.menuPressed\">\n      <summary>\n        <para>Whether or not the menu button is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceState.pressed\">\n      <summary>\n        <para>True if the source is in the pressed state, false otherwise.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceState.properties\">\n      <summary>\n        <para>Additional properties to explore the state of the interaction source.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceState.selectPressed\">\n      <summary>\n        <para>Depending on the InteractionSourceType of the interaction source, this returning true could represent a number of equivalent things: main button on a clicker, air-tap on a hand, and the trigger on a motion controller. For hands, a select-press represents the user's index finger in the down position. For motion controllers, a select-press represents the controller's index-finger trigger (or primary face button, if no trigger) being fully pressed. Note that a voice command of \"Select\" causes an instant press and release, so you cannot poll for a voice press using this property - instead, you must use GestureRecognizer and subscribe to the Tapped event, or subscribe to the InteractionSourcePressed event from InteractionManager.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceState.selectPressedAmount\">\n      <summary>\n        <para>Normalized amount ([0, 1]) representing how much select is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceState.source\">\n      <summary>\n        <para>The interaction source that this state describes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceState.sourcePose\">\n      <summary>\n        <para>Pose data of the interaction source at the time of the interaction.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceState.thumbstickPosition\">\n      <summary>\n        <para>Normalized coordinates for the position of a thumbstick.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceState.thumbstickPressed\">\n      <summary>\n        <para>Whether or not the thumbstick is pressed.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceState.touchpadPosition\">\n      <summary>\n        <para>Normalized coordinates for the position of a touchpad interaction.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceState.touchpadPressed\">\n      <summary>\n        <para>Whether or not the touchpad is pressed, as if a button.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceState.touchpadTouched\">\n      <summary>\n        <para>Whether or not the touchpad is touched.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.InteractionSourceUpdatedEventArgs\">\n      <summary>\n        <para>Contains fields that are relevent when an interaction source updates.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.InteractionSourceUpdatedEventArgs.state\">\n      <summary>\n        <para>The current state of the reported interaction source that just updated.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.ManipulationCanceledEventArgs\">\n      <summary>\n        <para>Contains fields that are relevant when a manipulation gesture is canceled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.ManipulationCanceledEventArgs.headPose\">\n      <summary>\n        <para>Head pose of the user at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.ManipulationCanceledEventArgs.source\">\n      <summary>\n        <para>The InteractionSource (hand, controller, or user's voice) that canceled the manipulation gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.ManipulationCanceledEventArgs.sourcePose\">\n      <summary>\n        <para>Pose data of the interaction source at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.ManipulationCompletedEventArgs\">\n      <summary>\n        <para>Contains fields that are relevant when a manipulation gesture completes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.ManipulationCompletedEventArgs.cumulativeDelta\">\n      <summary>\n        <para>Total distance moved since the beginning of the manipulation gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.ManipulationCompletedEventArgs.headPose\">\n      <summary>\n        <para>Head pose of the user at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.ManipulationCompletedEventArgs.source\">\n      <summary>\n        <para>The InteractionSource (hand, controller, or user's voice) that completed the manipulation gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.ManipulationCompletedEventArgs.sourcePose\">\n      <summary>\n        <para>Pose data of the interaction source at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.ManipulationStartedEventArgs\">\n      <summary>\n        <para>Contains fields relevant when a manipulation gesture starts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.ManipulationStartedEventArgs.headPose\">\n      <summary>\n        <para>Head pose of the user at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.ManipulationStartedEventArgs.source\">\n      <summary>\n        <para>The InteractionSource (hand, controller, or user's voice) that started the manipulation gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.ManipulationStartedEventArgs.sourcePose\">\n      <summary>\n        <para>Pose data of the interaction source at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.ManipulationUpdatedEventArgs\">\n      <summary>\n        <para>Contains fields that are relevant when a manipulation gesture gets updated.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.ManipulationUpdatedEventArgs.cumulativeDelta\">\n      <summary>\n        <para>Total distance moved since the beginning of the manipulation gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.ManipulationUpdatedEventArgs.headPose\">\n      <summary>\n        <para>Head pose of the user at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.ManipulationUpdatedEventArgs.source\">\n      <summary>\n        <para>The InteractionSource (hand, controller, or user's voice) being used for the manipulation gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.ManipulationUpdatedEventArgs.sourcePose\">\n      <summary>\n        <para>Pose data of the interaction source at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.NavigationCanceledEventArgs\">\n      <summary>\n        <para>Contains fields that are relevant when a navigation gesture is canceled.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.NavigationCanceledEventArgs.headPose\">\n      <summary>\n        <para>Head pose of the user at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.NavigationCanceledEventArgs.source\">\n      <summary>\n        <para>The InteractionSource (hand, controller, or user's voice) that canceled the navigation gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.NavigationCanceledEventArgs.sourcePose\">\n      <summary>\n        <para>Pose data of the interaction source at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.NavigationCompletedEventArgs\">\n      <summary>\n        <para>Contains fields that are relevant when a navigation gesture completes.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.NavigationCompletedEventArgs.headPose\">\n      <summary>\n        <para>Head pose of the user at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.NavigationCompletedEventArgs.normalizedOffset\">\n      <summary>\n        <para>The normalized offset, since the navigation gesture began, of the input within the unit cube for the navigation gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.NavigationCompletedEventArgs.source\">\n      <summary>\n        <para>The InteractionSource (hand, controller, or user's voice) that completed the navigation gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.NavigationCompletedEventArgs.sourcePose\">\n      <summary>\n        <para>Pose data of the interaction source at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.NavigationStartedEventArgs\">\n      <summary>\n        <para>Contains fields that are relevant when a navigation gesture starts.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.NavigationStartedEventArgs.headPose\">\n      <summary>\n        <para>Head pose of the user at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.NavigationStartedEventArgs.source\">\n      <summary>\n        <para>The InteractionSource (hand, controller, or user's voice) that started the navigation gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.NavigationStartedEventArgs.sourcePose\">\n      <summary>\n        <para>Pose data of the interaction source at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.NavigationUpdatedEventArgs\">\n      <summary>\n        <para>Contains fields that are relevant when a navigation gesture updates.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.NavigationUpdatedEventArgs.headPose\">\n      <summary>\n        <para>Head pose of the user at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.NavigationUpdatedEventArgs.normalizedOffset\">\n      <summary>\n        <para>The normalized offset, since the navigation gesture began, of the input within the unit cube for the navigation gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.NavigationUpdatedEventArgs.source\">\n      <summary>\n        <para>The InteractionSource (hand, controller, or user's voice) being used for the navigation gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.NavigationUpdatedEventArgs.sourcePose\">\n      <summary>\n        <para>Pose data of the interaction source at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.RecognitionEndedEventArgs\">\n      <summary>\n        <para>Contains fields that are relevant when recognition of a gesture event ends.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.RecognitionEndedEventArgs.headPose\">\n      <summary>\n        <para>Head pose of the user at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.RecognitionEndedEventArgs.source\">\n      <summary>\n        <para>The InteractionSource (hand, controller, or user's voice) that ended the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.RecognitionEndedEventArgs.sourcePose\">\n      <summary>\n        <para>Pose data of the interaction source at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.RecognitionStartedEventArgs\">\n      <summary>\n        <para>Contains fields that are relevant when recognition of a gesture event begins.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.RecognitionStartedEventArgs.headPose\">\n      <summary>\n        <para>Head pose of the user at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.RecognitionStartedEventArgs.source\">\n      <summary>\n        <para>The InteractionSource (hand, controller, or user's voice) that started the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.RecognitionStartedEventArgs.sourcePose\">\n      <summary>\n        <para>Pose data of the interaction source at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Input.TappedEventArgs\">\n      <summary>\n        <para>Contains fields that are relevant when a tap gesture occurs.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.TappedEventArgs.headPose\">\n      <summary>\n        <para>Head pose of the user at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.TappedEventArgs.source\">\n      <summary>\n        <para>The InteractionSource (hand, controller, or user's voice) that initiated the tap gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.TappedEventArgs.sourcePose\">\n      <summary>\n        <para>Pose data of the interaction source at the time of the gesture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Input.TappedEventArgs.tapCount\">\n      <summary>\n        <para>The number of taps (1 for single-tap, 2 for double-tap).</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Persistence.WorldAnchorStore\">\n      <summary>\n        <para>The storage object for persisted WorldAnchors.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Persistence.WorldAnchorStore.anchorCount\">\n      <summary>\n        <para>(Read Only) Gets the number of persisted world anchors in this WorldAnchorStore.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Persistence.WorldAnchorStore.Clear\">\n      <summary>\n        <para>Clears all persisted WorldAnchors.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Persistence.WorldAnchorStore.Delete(System.String)\">\n      <summary>\n        <para>Deletes a persisted WorldAnchor from the store.</para>\n      </summary>\n      <param name=\"id\">The identifier of the WorldAnchor to delete.</param>\n      <returns>\n        <para>Whether or not the WorldAnchor was found and deleted.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Persistence.WorldAnchorStore.Dispose\">\n      <summary>\n        <para>Cleans up the WorldAnchorStore and releases memory.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Persistence.WorldAnchorStore.GetAllIds\">\n      <summary>\n        <para>Gets all of the identifiers of the currently persisted WorldAnchors.</para>\n      </summary>\n      <returns>\n        <para>An array of string identifiers.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Persistence.WorldAnchorStore.GetAllIds(System.String[])\">\n      <summary>\n        <para>Gets all of the identifiers of the currently persisted WorldAnchors.</para>\n      </summary>\n      <param name=\"ids\">A target array to receive the identifiers of the currently persisted world anchors.</param>\n      <returns>\n        <para>The number of identifiers stored in the target array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Persistence.WorldAnchorStore.GetAsync(UnityEngine.XR.WSA.Persistence.WorldAnchorStore/GetAsyncDelegate)\">\n      <summary>\n        <para>Gets the WorldAnchorStore instance.</para>\n      </summary>\n      <param name=\"onCompleted\">The handler to be called when the WorldAnchorStore is loaded.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Persistence.WorldAnchorStore.GetAsyncDelegate\">\n      <summary>\n        <para>The handler for when getting the WorldAnchorStore from GetAsync.</para>\n      </summary>\n      <param name=\"store\">The instance of the WorldAnchorStore once loaded.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Persistence.WorldAnchorStore.Load(System.String,UnityEngine.GameObject)\">\n      <summary>\n        <para>Loads a WorldAnchor from disk for given identifier and attaches it to the GameObject. If the GameObject has a WorldAnchor, that WorldAnchor will be updated. If the anchor is not found, null will be returned and the GameObject and any existing WorldAnchor attached to it will not be modified.</para>\n      </summary>\n      <param name=\"id\">The identifier of the WorldAnchor to load.</param>\n      <param name=\"go\">The object to attach the WorldAnchor to if found.</param>\n      <returns>\n        <para>The WorldAnchor loaded by the identifier or null if not found.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Persistence.WorldAnchorStore.Save(System.String,UnityEngine.XR.WSA.WorldAnchor)\">\n      <summary>\n        <para>Saves the provided WorldAnchor with the provided identifier. If the identifier is already in use, the method will return false.</para>\n      </summary>\n      <param name=\"id\">The identifier to save the anchor with. This needs to be unique for your app.</param>\n      <param name=\"anchor\">The anchor to save.</param>\n      <returns>\n        <para>Whether or not the save was successful. Will return false if the id conflicts with another already saved anchor's id.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.PositionalLocatorState\">\n      <summary>\n        <para>Indicates the lifecycle state of the device's spatial location system.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.PositionalLocatorState.Activating\">\n      <summary>\n        <para>The device is reporting its orientation and is preparing to locate its position in the user's surroundings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.PositionalLocatorState.Active\">\n      <summary>\n        <para>The device is reporting its orientation and position in the user's surroundings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.PositionalLocatorState.Inhibited\">\n      <summary>\n        <para>The device is reporting its orientation but cannot locate its position in the user's surroundings due to external factors like poor lighting conditions.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.PositionalLocatorState.OrientationOnly\">\n      <summary>\n        <para>The device is reporting its orientation and has not been asked to report its position in the user's surroundings.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.PositionalLocatorState.Unavailable\">\n      <summary>\n        <para>The device's spatial location system is not available.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Sharing.SerializationCompletionReason\">\n      <summary>\n        <para>This enum represents the result of a WorldAnchorTransferBatch operation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Sharing.SerializationCompletionReason.AccessDenied\">\n      <summary>\n        <para>The operation has failed because access was denied.  This occurs typically because the transfer batch was not readable when deserializing or writable when serializing.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Sharing.SerializationCompletionReason.NotSupported\">\n      <summary>\n        <para>The operation has failed because it was not supported.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Sharing.SerializationCompletionReason.Succeeded\">\n      <summary>\n        <para>The operation has completed successfully.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.Sharing.SerializationCompletionReason.UnknownError\">\n      <summary>\n        <para>The operation has failed in an unexpected way.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Sharing.WorldAnchorTransferBatch\">\n      <summary>\n        <para>A batch of WorldAnchors which can be exported and imported between apps.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.Sharing.WorldAnchorTransferBatch.anchorCount\">\n      <summary>\n        <para>(Read Only) Gets the number of world anchors in this WorldAnchorTransferBatch.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Sharing.WorldAnchorTransferBatch.AddWorldAnchor(System.String,UnityEngine.XR.WSA.WorldAnchor)\">\n      <summary>\n        <para>Adds a WorldAnchor to the batch with the specified identifier.</para>\n      </summary>\n      <param name=\"id\">The identifier associated with this anchor in the batch. This must be unique per batch.</param>\n      <param name=\"anchor\">The anchor to add to the batch.</param>\n      <returns>\n        <para>Whether or not the anchor was added successfully.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Sharing.WorldAnchorTransferBatch.DeserializationCompleteDelegate\">\n      <summary>\n        <para>The handler for when deserialization has completed.</para>\n      </summary>\n      <param name=\"completionReason\">The reason the deserialization completed (success or failure reason).</param>\n      <param name=\"deserializedTransferBatch\">The resulting transfer batch which is empty on error.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Sharing.WorldAnchorTransferBatch.Dispose\">\n      <summary>\n        <para>Cleans up the WorldAnchorTransferBatch and releases memory.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Sharing.WorldAnchorTransferBatch.ExportAsync(UnityEngine.XR.WSA.Sharing.WorldAnchorTransferBatch,UnityEngine.XR.WSA.Sharing.WorldAnchorTransferBatch/SerializationDataAvailableDelegate,UnityEngine.XR.WSA.Sharing.WorldAnchorTransferBatch/SerializationCompleteDelegate)\">\n      <summary>\n        <para>Exports the input WorldAnchorTransferBatch into a byte array which can be passed to WorldAnchorTransferBatch.ImportAsync to restore the original WorldAnchorTransferBatch.</para>\n      </summary>\n      <param name=\"transferBatch\">The WorldAnchorTransferBatch to export into a byte buffer.</param>\n      <param name=\"onDataAvailable\">The callback when some data is available.</param>\n      <param name=\"onCompleted\">The callback after the last bit of data was provided via onDataAvailable with a completion reason (success or failure reason).</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Sharing.WorldAnchorTransferBatch.GetAllIds\">\n      <summary>\n        <para>Gets all of the identifiers currently mapped in this WorldAnchorTransferBatch.</para>\n      </summary>\n      <returns>\n        <para>The identifiers of all of the WorldAnchors in this WorldAnchorTransferBatch.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Sharing.WorldAnchorTransferBatch.GetAllIds(System.String[])\">\n      <summary>\n        <para>Gets all of the identifiers currently mapped in this WorldAnchorTransferBatch. If the target array is not large enough to contain all the identifiers, then only those identifiers that fit within the array will be stored and the return value will equal the size of the array. You can detect this condition by checking for a return value less than WorldAnchorTransferBatch.anchorCount.</para>\n      </summary>\n      <param name=\"ids\">A target array to receive the identifiers of the currently mapped world anchors.</param>\n      <returns>\n        <para>The number of identifiers stored in the target array.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Sharing.WorldAnchorTransferBatch.ImportAsync(System.Byte[],UnityEngine.XR.WSA.Sharing.WorldAnchorTransferBatch/DeserializationCompleteDelegate)\">\n      <summary>\n        <para>Imports the provided bytes into a WorldAnchorTransferBatch.</para>\n      </summary>\n      <param name=\"serializedData\">The complete data to import.</param>\n      <param name=\"onComplete\">The handler when the data import is complete.</param>\n      <param name=\"offset\">The offset in the array from which to start reading.</param>\n      <param name=\"length\">The length of the data in the array.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Sharing.WorldAnchorTransferBatch.ImportAsync(System.Byte[],System.Int32,System.Int32,UnityEngine.XR.WSA.Sharing.WorldAnchorTransferBatch/DeserializationCompleteDelegate)\">\n      <summary>\n        <para>Imports the provided bytes into a WorldAnchorTransferBatch.</para>\n      </summary>\n      <param name=\"serializedData\">The complete data to import.</param>\n      <param name=\"onComplete\">The handler when the data import is complete.</param>\n      <param name=\"offset\">The offset in the array from which to start reading.</param>\n      <param name=\"length\">The length of the data in the array.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.Sharing.WorldAnchorTransferBatch.LockObject(System.String,UnityEngine.GameObject)\">\n      <summary>\n        <para>Locks the provided GameObject to the world by loading and applying the WorldAnchor from the TransferBatch for the provided id.</para>\n      </summary>\n      <param name=\"id\">The identifier for the WorldAnchor to load and apply to the GameObject.</param>\n      <param name=\"go\">The GameObject to apply the WorldAnchor to. If the GameObject already has a WorldAnchor, it will be updated.</param>\n      <returns>\n        <para>The loaded WorldAnchor or null if the id does not map to a WorldAnchor.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Sharing.WorldAnchorTransferBatch.SerializationCompleteDelegate\">\n      <summary>\n        <para>The handler for when serialization is completed.</para>\n      </summary>\n      <param name=\"completionReason\">Why the serialization completed (success or failure reason).</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.Sharing.WorldAnchorTransferBatch.SerializationDataAvailableDelegate\">\n      <summary>\n        <para>The handler for when some data is available from serialization.</para>\n      </summary>\n      <param name=\"data\">A set of bytes from the exported transfer batch.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.SurfaceChange\">\n      <summary>\n        <para>Enumeration of the different types of SurfaceChange events.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.SurfaceChange.Added\">\n      <summary>\n        <para>Surface was Added.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.SurfaceChange.Removed\">\n      <summary>\n        <para>Surface was removed.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.SurfaceChange.Updated\">\n      <summary>\n        <para>Surface was updated.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.SurfaceData\">\n      <summary>\n        <para>SurfaceData is a container struct used for requesting baked spatial mapping data and receiving that data once baked.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.SurfaceData.bakeCollider\">\n      <summary>\n        <para>Set this field to true when requesting data to bake collider data.  This field will be set to true when receiving baked data if it was requested.  Setting this field to true requires that a valid outputCollider is also specified.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.SurfaceData.id\">\n      <summary>\n        <para>This is the ID for the surface to be baked or the surface that was baked and being returned to the user.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.SurfaceData.outputAnchor\">\n      <summary>\n        <para>This WorldAnchor is used to lock the surface into place relative to real world objects.  It will be filled in when calling RequestMeshAsync to generate data for a surface and returned with the SurfaceDataReadyDelegate.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.SurfaceData.outputCollider\">\n      <summary>\n        <para>This MeshCollider will receive the baked physics mesh prepared by the system when requesting baked surface data through RequestMeshAsync.  The MeshCollider is returned in the SurfaceDataReadyDelegate for those users requiring advanced workflows.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.SurfaceData.outputMesh\">\n      <summary>\n        <para>This MeshFilter will receive the baked mesh prepared by the system when requesting baked surface data.  The MeshFilter is returned in the SurfaceDataReadyDelegate for those users requiring advanced workflows.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.SurfaceData.trianglesPerCubicMeter\">\n      <summary>\n        <para>This value controls the basic resolution of baked mesh data and is returned with the SurfaceDataReadyDelegate.  The device will deliver up to this number of triangles per cubic meter.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.SurfaceData.#ctor(UnityEngine.XR.WSA.SurfaceId,UnityEngine.MeshFilter,UnityEngine.XR.WSA.WorldAnchor,UnityEngine.MeshCollider,System.Single,System.Boolean)\">\n      <summary>\n        <para>Constructor for conveniently filling out a SurfaceData struct.</para>\n      </summary>\n      <param name=\"_id\">ID for the surface in question.</param>\n      <param name=\"_outputMesh\">MeshFilter to write Mesh data to.</param>\n      <param name=\"_outputAnchor\">WorldAnchor receiving the anchor point for the surface.</param>\n      <param name=\"_outputCollider\">MeshCollider to write baked physics data to (optional).</param>\n      <param name=\"_trianglesPerCubicMeter\">Requested resolution for the computed Mesh.  Actual resolution may be less than this value.</param>\n      <param name=\"_bakeCollider\">Set to true if collider baking is/has been requested.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.SurfaceId\">\n      <summary>\n        <para>SurfaceId is a structure wrapping the unique ID used to denote Surfaces.  SurfaceIds are provided through the onSurfaceChanged callback in Update and returned after a RequestMeshAsync call has completed.  SurfaceIds are guaranteed to be unique though Surfaces are sometimes replaced with a new Surface in the same location with a different ID.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.SurfaceId.handle\">\n      <summary>\n        <para>The actual integer ID referring to a single surface.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.SurfaceObserver\">\n      <summary>\n        <para>SurfaceObserver is the main API portal for spatial mapping functionality in Unity.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.SurfaceObserver.#ctor\">\n      <summary>\n        <para>Basic constructor for SurfaceObserver.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.SurfaceObserver.Dispose\">\n      <summary>\n        <para>Call Dispose when the SurfaceObserver is no longer needed.  This will ensure that the object is cleaned up appropriately but will not affect any Meshes, components, or objects returned by RequestMeshAsync.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.SurfaceObserver.RequestMeshAsync(UnityEngine.XR.WSA.SurfaceData,UnityEngine.XR.WSA.SurfaceObserver/SurfaceDataReadyDelegate)\">\n      <summary>\n        <para>Call RequestMeshAsync to start the process of baking mesh data for the specified surface.  This data may take several frames to create.  Baked data will be delivered through the specified SurfaceDataReadyDelegate.  This method will throw ArgumentNullExcpetion and ArgumentException if parameters specified in the dataRequest are invalid.</para>\n      </summary>\n      <param name=\"dataRequest\">Bundle of request data used to bake the specified surface.</param>\n      <param name=\"onDataReady\">Callback called when the baking of this surface is complete.</param>\n      <returns>\n        <para>Returns false if the request has failed, typically due to specifying a bad surface ID.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.SurfaceObserver.SetVolumeAsAxisAlignedBox(UnityEngine.Vector3,UnityEngine.Vector3)\">\n      <summary>\n        <para>This method sets the observation volume as an axis aligned box at the requested location.  Successive calls can be used to reshape the observation volume and/or to move it in the scene as needed.  Extents are the distance from the center of the box to its edges along each axis.</para>\n      </summary>\n      <param name=\"origin\">The origin of the requested observation volume.</param>\n      <param name=\"extents\">The extents in meters of the requested observation volume.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.SurfaceObserver.SetVolumeAsFrustum(UnityEngine.Plane[])\">\n      <summary>\n        <para>This method sets the observation volume as a frustum at the requested location.  Successive calls can be used to reshape the observation volume and/or to move it in the scene as needed.</para>\n      </summary>\n      <param name=\"planes\">Planes defining the frustum as returned from GeometryUtility.CalculateFrustumPlanes.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.SurfaceObserver.SetVolumeAsOrientedBox(UnityEngine.Vector3,UnityEngine.Vector3,UnityEngine.Quaternion)\">\n      <summary>\n        <para>This method sets the observation volume as an oriented box at the requested location.  Successive calls can be used to reshape the observation volume and/or to move it in the scene as needed.  Extents are the distance from the center of the box to its edges along each axis.</para>\n      </summary>\n      <param name=\"origin\">The origin of the requested observation volume.</param>\n      <param name=\"extents\">The extents in meters of the requested observation volume.</param>\n      <param name=\"orientation\">The orientation of the requested observation volume.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.SurfaceObserver.SetVolumeAsSphere(UnityEngine.Vector3,System.Single)\">\n      <summary>\n        <para>This method sets the observation volume as a sphere at the requested location.  Successive calls can be used to reshape the observation volume and/or to move it in the scene as needed.</para>\n      </summary>\n      <param name=\"origin\">The origin of the requested observation volume.</param>\n      <param name=\"radiusMeters\">The radius in meters of the requested observation volume.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.SurfaceObserver.SurfaceChangedDelegate\">\n      <summary>\n        <para>The SurfaceChanged delegate handles SurfaceChanged events as generated by calling Update on a SurfaceObserver.  Applications can use the bounds, changeType, and updateTime to selectively generate mesh data for the set of known surfaces.</para>\n      </summary>\n      <param name=\"surfaceId\">The ID of the surface that has changed.</param>\n      <param name=\"changeType\">The type of change this event represents (Added, Updated, Removed).</param>\n      <param name=\"bounds\">The bounds of the surface as reported by the device.</param>\n      <param name=\"updateTime\">The update time of the surface as reported by the device.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.SurfaceObserver.SurfaceDataReadyDelegate\">\n      <summary>\n        <para>The SurfaceDataReadyDelegate handles events generated when the engine has completed generating a mesh.  Mesh generation is requested through GetMeshAsync and may take many frames to complete.</para>\n      </summary>\n      <param name=\"bakedData\">Struct containing output data.</param>\n      <param name=\"outputWritten\">Set to true if output has been written and false otherwise.</param>\n      <param name=\"elapsedBakeTimeSeconds\">Elapsed seconds between mesh bake request and propagation of this event.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.SurfaceObserver.Update(UnityEngine.XR.WSA.SurfaceObserver/SurfaceChangedDelegate)\">\n      <summary>\n        <para>Update generates SurfaceChanged events which are propagated through the specified callback.  If no callback is specified, the system will throw an ArgumentNullException.  Generated callbacks are synchronous with this call.  Scenes containing multiple SurfaceObservers should consider using different callbacks so that events can be properly routed.</para>\n      </summary>\n      <param name=\"onSurfaceChanged\">Callback called when SurfaceChanged events are detected.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.CameraParameters\">\n      <summary>\n        <para>When calling PhotoCapture.StartPhotoModeAsync, you must pass in a CameraParameters object that contains the various settings that the web camera will use.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.WebCam.CameraParameters.cameraResolutionHeight\">\n      <summary>\n        <para>A valid height resolution for use with the web camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.WebCam.CameraParameters.cameraResolutionWidth\">\n      <summary>\n        <para>A valid width resolution for use with the web camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.WebCam.CameraParameters.frameRate\">\n      <summary>\n        <para>The framerate at which to capture video.  This is only for use with VideoCapture.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.WebCam.CameraParameters.hologramOpacity\">\n      <summary>\n        <para>The opacity of captured holograms.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.WebCam.CameraParameters.pixelFormat\">\n      <summary>\n        <para>The pixel format used to capture and record your image data.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.CapturePixelFormat\">\n      <summary>\n        <para>The encoded image or video pixel format to use for PhotoCapture and VideoCapture.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.CapturePixelFormat.BGRA32\">\n      <summary>\n        <para>8 bits per channel (blue, green, red, and alpha).</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.CapturePixelFormat.JPEG\">\n      <summary>\n        <para>Encode photo in JPEG format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.CapturePixelFormat.NV12\">\n      <summary>\n        <para>8-bit Y plane followed by an interleaved U/V plane with 2x2 subsampling.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.CapturePixelFormat.PNG\">\n      <summary>\n        <para>Portable Network Graphics Format.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.PhotoCapture\">\n      <summary>\n        <para>Captures a photo from the web camera and stores it in memory or on disk.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.PhotoCapture.CaptureResultType\">\n      <summary>\n        <para>Contains the result of the capture request.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.PhotoCapture.CaptureResultType.Success\">\n      <summary>\n        <para>Specifies that the desired operation was successful.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.PhotoCapture.CaptureResultType.UnknownError\">\n      <summary>\n        <para>Specifies that an unknown error occurred.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.PhotoCapture.CreateAsync(System.Boolean,UnityEngine.XR.WSA.WebCam.PhotoCapture/OnCaptureResourceCreatedCallback)\">\n      <summary>\n        <para>Asynchronously creates an instance of a PhotoCapture object that can be used to capture photos.</para>\n      </summary>\n      <param name=\"showHolograms\">Will allow you to capture holograms in your photo.</param>\n      <param name=\"onCreatedCallback\">This callback will be invoked when the PhotoCapture instance is created and ready to be used.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.PhotoCapture.Dispose\">\n      <summary>\n        <para>Dispose must be called to shutdown the PhotoCapture instance.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.PhotoCapture.GetUnsafePointerToVideoDeviceController\">\n      <summary>\n        <para>Provides a COM pointer to the native IVideoDeviceController.</para>\n      </summary>\n      <returns>\n        <para>A native COM pointer to the IVideoDeviceController.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.PhotoCapture.OnCapturedToDiskCallback\">\n      <summary>\n        <para>Called when a photo has been saved to the file system.</para>\n      </summary>\n      <param name=\"result\">Indicates whether or not the photo was successfully saved to the file system.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.PhotoCapture.OnCapturedToMemoryCallback\">\n      <summary>\n        <para>Called when a photo has been captured to memory.</para>\n      </summary>\n      <param name=\"result\">Indicates whether or not the photo was successfully captured to memory.</param>\n      <param name=\"photoCaptureFrame\">Contains the target texture.  If available, the spatial information will be accessible through this structure as well.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.PhotoCapture.OnCaptureResourceCreatedCallback\">\n      <summary>\n        <para>Called when a PhotoCapture resource has been created.</para>\n      </summary>\n      <param name=\"captureObject\">The PhotoCapture instance.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.PhotoCapture.OnPhotoModeStartedCallback\">\n      <summary>\n        <para>Called when photo mode has been started.</para>\n      </summary>\n      <param name=\"result\">Indicates whether or not photo mode was successfully activated.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.PhotoCapture.OnPhotoModeStoppedCallback\">\n      <summary>\n        <para>Called when photo mode has been stopped.</para>\n      </summary>\n      <param name=\"result\">Indicates whether or not photo mode was successfully deactivated.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.PhotoCapture.PhotoCaptureResult\">\n      <summary>\n        <para>A data container that contains the result information of a photo capture operation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.PhotoCapture.PhotoCaptureResult.hResult\">\n      <summary>\n        <para>The specific HResult value.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.PhotoCapture.PhotoCaptureResult.resultType\">\n      <summary>\n        <para>A generic result that indicates whether or not the PhotoCapture operation succeeded.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.WebCam.PhotoCapture.PhotoCaptureResult.success\">\n      <summary>\n        <para>Indicates whether or not the operation was successful.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.PhotoCapture.StartPhotoModeAsync(UnityEngine.XR.WSA.WebCam.CameraParameters,UnityEngine.XR.WSA.WebCam.PhotoCapture/OnPhotoModeStartedCallback)\">\n      <summary>\n        <para>Asynchronously starts photo mode.</para>\n      </summary>\n      <param name=\"setupParams\">The various settings that should be applied to the web camera.</param>\n      <param name=\"onPhotoModeStartedCallback\">This callback will be invoked once photo mode has been activated.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.PhotoCapture.StopPhotoModeAsync(UnityEngine.XR.WSA.WebCam.PhotoCapture/OnPhotoModeStoppedCallback)\">\n      <summary>\n        <para>Asynchronously stops photo mode.</para>\n      </summary>\n      <param name=\"onPhotoModeStoppedCallback\">This callback will be invoked once photo mode has been deactivated.</param>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.WebCam.PhotoCapture.SupportedResolutions\">\n      <summary>\n        <para>A list of all the supported device resolutions for taking pictures.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.PhotoCapture.TakePhotoAsync(System.String,UnityEngine.XR.WSA.WebCam.PhotoCaptureFileOutputFormat,UnityEngine.XR.WSA.WebCam.PhotoCapture/OnCapturedToDiskCallback)\">\n      <summary>\n        <para>Asynchronously captures a photo from the web camera and saves it to disk.</para>\n      </summary>\n      <param name=\"filename\">The location where the photo should be saved.  The filename must end with a png or jpg file extension.</param>\n      <param name=\"fileOutputFormat\">The encoding format that should be used.</param>\n      <param name=\"onCapturedPhotoToDiskCallback\">Invoked once the photo has been saved to disk.</param>\n      <param name=\"onCapturedPhotoToMemoryCallback\">Invoked once the photo has been copied to the target texture.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.PhotoCapture.TakePhotoAsync(UnityEngine.XR.WSA.WebCam.PhotoCapture/OnCapturedToMemoryCallback)\">\n      <summary>\n        <para>Asynchronously captures a photo from the web camera and saves it to disk.</para>\n      </summary>\n      <param name=\"filename\">The location where the photo should be saved.  The filename must end with a png or jpg file extension.</param>\n      <param name=\"fileOutputFormat\">The encoding format that should be used.</param>\n      <param name=\"onCapturedPhotoToDiskCallback\">Invoked once the photo has been saved to disk.</param>\n      <param name=\"onCapturedPhotoToMemoryCallback\">Invoked once the photo has been copied to the target texture.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.PhotoCaptureFileOutputFormat\">\n      <summary>\n        <para>Image Encoding Format.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.PhotoCaptureFileOutputFormat.JPG\">\n      <summary>\n        <para>JPEG Encoding.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.PhotoCaptureFileOutputFormat.PNG\">\n      <summary>\n        <para>PNG Encoding.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.PhotoCaptureFrame\">\n      <summary>\n        <para>Contains information captured from the web camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.WebCam.PhotoCaptureFrame.dataLength\">\n      <summary>\n        <para>The length of the raw IMFMediaBuffer which contains the image captured.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.WebCam.PhotoCaptureFrame.hasLocationData\">\n      <summary>\n        <para>Specifies whether or not spatial data was captured.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.WebCam.PhotoCaptureFrame.pixelFormat\">\n      <summary>\n        <para>The raw image data pixel format.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.PhotoCaptureFrame.CopyRawImageDataIntoBuffer(System.Collections.Generic.List`1&lt;System.Byte&gt;)\">\n      <summary>\n        <para>Will copy the raw IMFMediaBuffer image data into a byte list.</para>\n      </summary>\n      <param name=\"byteBuffer\">The destination byte list to which the raw captured image data will be copied to.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.PhotoCaptureFrame.Dispose\">\n      <summary>\n        <para>Disposes the PhotoCaptureFrame and any resources it uses.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.PhotoCaptureFrame.GetUnsafePointerToBuffer\">\n      <summary>\n        <para>Provides a COM pointer to the native IMFMediaBuffer that contains the image data.</para>\n      </summary>\n      <returns>\n        <para>A native COM pointer to the IMFMediaBuffer which contains the image data.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.PhotoCaptureFrame.TryGetCameraToWorldMatrix(UnityEngine.Matrix4x4&amp;)\">\n      <summary>\n        <para>This method will return the camera to world matrix at the time the photo was captured if location data if available.</para>\n      </summary>\n      <param name=\"cameraToWorldMatrix\">A matrix to be populated by the Camera to world Matrix.</param>\n      <returns>\n        <para>True if a valid matrix is returned or false otherwise.  This will be false if the frame has no location data.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.PhotoCaptureFrame.TryGetProjectionMatrix(System.Single,System.Single,UnityEngine.Matrix4x4&amp;)\">\n      <summary>\n        <para>This method will return the projection matrix at the time the photo was captured if location data if available.</para>\n      </summary>\n      <param name=\"nearClipPlane\">The near clip plane distance.</param>\n      <param name=\"farClipPlane\">The far clip plane distance.</param>\n      <param name=\"projectionMatrix\">A matrix to be populated by the Projection Matrix.</param>\n      <returns>\n        <para>True if a valid matrix is returned or false otherwise.  This will be false if the frame has no location data.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.PhotoCaptureFrame.TryGetProjectionMatrix(UnityEngine.Matrix4x4&amp;)\">\n      <summary>\n        <para>This method will return the projection matrix at the time the photo was captured if location data if available.</para>\n      </summary>\n      <param name=\"nearClipPlane\">The near clip plane distance.</param>\n      <param name=\"farClipPlane\">The far clip plane distance.</param>\n      <param name=\"projectionMatrix\">A matrix to be populated by the Projection Matrix.</param>\n      <returns>\n        <para>True if a valid matrix is returned or false otherwise.  This will be false if the frame has no location data.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.PhotoCaptureFrame.UploadImageDataToTexture(UnityEngine.Texture2D)\">\n      <summary>\n        <para>This method will copy the captured image data into a user supplied texture for use in Unity.</para>\n      </summary>\n      <param name=\"targetTexture\">The target texture that the captured image data will be copied to.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.VideoCapture\">\n      <summary>\n        <para>Records a video from the web camera directly to disk.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.VideoCapture.AudioState\">\n      <summary>\n        <para>Specifies what audio sources should be recorded while recording the video.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.VideoCapture.AudioState.ApplicationAndMicAudio\">\n      <summary>\n        <para>Include both the application audio as well as the mic audio in the video recording.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.VideoCapture.AudioState.ApplicationAudio\">\n      <summary>\n        <para>Only include the application audio in the video recording.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.VideoCapture.AudioState.MicAudio\">\n      <summary>\n        <para>Only include the mic audio in the video recording.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.VideoCapture.AudioState.None\">\n      <summary>\n        <para>Do not include any audio in the video recording.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.VideoCapture.CaptureResultType\">\n      <summary>\n        <para>Contains the result of the capture request.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.VideoCapture.CaptureResultType.Success\">\n      <summary>\n        <para>Specifies that the desired operation was successful.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.VideoCapture.CaptureResultType.UnknownError\">\n      <summary>\n        <para>Specifies that an unknown error occurred.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.VideoCapture.CreateAsync(System.Boolean,UnityEngine.XR.WSA.WebCam.VideoCapture/OnVideoCaptureResourceCreatedCallback)\">\n      <summary>\n        <para>Asynchronously creates an instance of a VideoCapture object that can be used to record videos from the web camera to disk.</para>\n      </summary>\n      <param name=\"showHolograms\">Will allow you to capture holograms in your video.</param>\n      <param name=\"onCreatedCallback\">This callback will be invoked when the VideoCapture instance is created and ready to be used.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.VideoCapture.Dispose\">\n      <summary>\n        <para>Dispose must be called to shutdown the PhotoCapture instance.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.VideoCapture.GetSupportedFrameRatesForResolution(UnityEngine.Resolution)\">\n      <summary>\n        <para>Returns the supported frame rates at which a video can be recorded given a resolution.</para>\n      </summary>\n      <param name=\"resolution\">A recording resolution.</param>\n      <returns>\n        <para>The frame rates at which the video can be recorded.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.VideoCapture.GetUnsafePointerToVideoDeviceController\">\n      <summary>\n        <para>Provides a COM pointer to the native IVideoDeviceController.</para>\n      </summary>\n      <returns>\n        <para>A native COM pointer to the IVideoDeviceController.</para>\n      </returns>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.WebCam.VideoCapture.IsRecording\">\n      <summary>\n        <para>Indicates whether or not the VideoCapture instance is currently recording video.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.VideoCapture.OnStartedRecordingVideoCallback\">\n      <summary>\n        <para>Called when the web camera begins recording the video.</para>\n      </summary>\n      <param name=\"result\">Indicates whether or not video recording started successfully.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.VideoCapture.OnStoppedRecordingVideoCallback\">\n      <summary>\n        <para>Called when the video recording has been saved to the file system.</para>\n      </summary>\n      <param name=\"result\">Indicates whether or not video recording was saved successfully to the file system.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.VideoCapture.OnVideoCaptureResourceCreatedCallback\">\n      <summary>\n        <para>Called when a VideoCapture resource has been created.</para>\n      </summary>\n      <param name=\"captureObject\">The VideoCapture instance.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.VideoCapture.OnVideoModeStartedCallback\">\n      <summary>\n        <para>Called when video mode has been started.</para>\n      </summary>\n      <param name=\"result\">Indicates whether or not video mode was successfully activated.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.VideoCapture.OnVideoModeStoppedCallback\">\n      <summary>\n        <para>Called when video mode has been stopped.</para>\n      </summary>\n      <param name=\"result\">Indicates whether or not video mode was successfully deactivated.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.VideoCapture.StartRecordingAsync(System.String,UnityEngine.XR.WSA.WebCam.VideoCapture/OnStartedRecordingVideoCallback)\">\n      <summary>\n        <para>Asynchronously records a video from the web camera to the file system.</para>\n      </summary>\n      <param name=\"filename\">The name of the video to be recorded to.</param>\n      <param name=\"onStartedRecordingVideoCallback\">Invoked as soon as the video recording begins.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.VideoCapture.StartVideoModeAsync(UnityEngine.XR.WSA.WebCam.CameraParameters,UnityEngine.XR.WSA.WebCam.VideoCapture/AudioState,UnityEngine.XR.WSA.WebCam.VideoCapture/OnVideoModeStartedCallback)\">\n      <summary>\n        <para>Asynchronously starts video mode.</para>\n      </summary>\n      <param name=\"setupParams\">The various settings that should be applied to the web camera.</param>\n      <param name=\"audioState\">Indicates how audio should be recorded.</param>\n      <param name=\"onVideoModeStartedCallback\">This callback will be invoked once video mode has been activated.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.VideoCapture.StopRecordingAsync(UnityEngine.XR.WSA.WebCam.VideoCapture/OnStoppedRecordingVideoCallback)\">\n      <summary>\n        <para>Asynchronously stops recording a video from the web camera to the file system.</para>\n      </summary>\n      <param name=\"onStoppedRecordingVideoCallback\">Invoked as soon as video recording has finished.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WebCam.VideoCapture.StopVideoModeAsync(UnityEngine.XR.WSA.WebCam.VideoCapture/OnVideoModeStoppedCallback)\">\n      <summary>\n        <para>Asynchronously stops video mode.</para>\n      </summary>\n      <param name=\"onVideoModeStoppedCallback\">This callback will be invoked once video mode has been deactivated.</param>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.WebCam.VideoCapture.SupportedResolutions\">\n      <summary>\n        <para>A list of all the supported device resolutions for recording videos.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.VideoCapture.VideoCaptureResult\">\n      <summary>\n        <para>A data container that contains the result information of a video recording operation.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.VideoCapture.VideoCaptureResult.hResult\">\n      <summary>\n        <para>The specific HResult value.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.VideoCapture.VideoCaptureResult.resultType\">\n      <summary>\n        <para>A generic result that indicates whether or not the VideoCapture operation succeeded.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.WebCam.VideoCapture.VideoCaptureResult.success\">\n      <summary>\n        <para>Indicates whether or not the operation was successful.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.WebCam\">\n      <summary>\n        <para>Contains general information about the current state of the web camera.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.WebCam.WebCam.Mode\">\n      <summary>\n        <para>Specifies what mode the Web Camera is currently in.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WebCam.WebCamMode\">\n      <summary>\n        <para>Describes the active mode of the Web Camera resource.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.WebCamMode.None\">\n      <summary>\n        <para>Resource is not in use.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.WebCamMode.PhotoMode\">\n      <summary>\n        <para>Resource is in Photo Mode.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.WSA.WebCam.WebCamMode.VideoMode\">\n      <summary>\n        <para>Resource is in Video Mode.</para>\n      </summary>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WorldAnchor\">\n      <summary>\n        <para>The WorldAnchor component allows a GameObject's position to be locked in physical space.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.WorldAnchor.isLocated\">\n      <summary>\n        <para>Returns true if this WorldAnchor is located (read only).  A return of false typically indicates a loss of tracking.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WorldAnchor.GetNativeSpatialAnchorPtr\">\n      <summary>\n        <para>Retrieve a native pointer to the &lt;a href=\"https:msdn.microsoft.comen-uslibrarywindowsappswindows.perception.spatial.spatialanchor.aspx\"&gt;Windows.Perception.Spatial.SpatialAnchor&lt;a&gt; COM object.\nThis function calls &lt;a href=\" https:msdn.microsoft.comen-uslibrarywindowsdesktopms691379.aspx\"&gt;IUnknown::AddRef&lt;a&gt; on the pointer before returning it. The pointer must be released by calling &lt;a href=\" https:msdn.microsoft.comen-uslibrarywindowsdesktopms682317.aspx\"&gt;IUnknown::Release&lt;a&gt;.</para>\n      </summary>\n      <returns>\n        <para>The native pointer to the &lt;a href=\" https:msdn.microsoft.comen-uslibrarywindowsappswindows.perception.spatial.spatialanchor.aspx\"&gt;Windows.Perception.Spatial.SpatialAnchor&lt;a&gt; COM object.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.WorldAnchor.OnTrackingChanged(UnityEngine.XR.WSA.WorldAnchor/OnTrackingChangedDelegate)\">\n      <summary>\n        <para>OnTrackingChanged notifies listeners when this object's tracking state changes.</para>\n      </summary>\n      <param name=\"value\">Event that fires when this object's tracking state changes.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WorldAnchor.OnTrackingChangedDelegate\">\n      <summary>\n        <para>Event that is fired when this object's tracking state changes.</para>\n      </summary>\n      <param name=\"located\">Set to true if the object is locatable.</param>\n      <param name=\"self\">The WorldAnchor reporting the tracking state change.</param>\n      <param name=\"worldAnchor\"></param>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WorldAnchor.SetNativeSpatialAnchorPtr(System.IntPtr)\">\n      <summary>\n        <para>Assigns the &lt;a href=\"https:msdn.microsoft.comen-uslibrarywindowsappswindows.perception.spatial.spatialanchor.aspx\"&gt;Windows.Perception.Spatial.SpatialAnchor&lt;a&gt; COM pointer maintained by this WorldAnchor.</para>\n      </summary>\n      <param name=\"spatialAnchorPtr\">A live &lt;a href=\"https:msdn.microsoft.comen-uslibrarywindowsappswindows.perception.spatial.spatialanchor.aspx\"&gt;Windows.Perception.Spatial.SpatialAnchor&lt;a&gt; COM pointer.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WorldManager\">\n      <summary>\n        <para>This class represents the state of the real world tracking system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.WSA.WorldManager.state\">\n      <summary>\n        <para>The current state of the world tracking systems.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.WSA.WorldManager.GetNativeISpatialCoordinateSystemPtr\">\n      <summary>\n        <para>Return the native pointer to Windows::Perception::Spatial::ISpatialCoordinateSystem which was retrieved from an Windows::Perception::Spatial::ISpatialStationaryFrameOfReference object underlying the Unity World Origin.</para>\n      </summary>\n      <returns>\n        <para>Pointer to Windows::Perception::Spatial::ISpatialCoordinateSystem.</para>\n      </returns>\n    </member>\n    <member name=\"?:UnityEngine.XR.WSA.WorldManager.OnPositionalLocatorStateChanged(UnityEngine.XR.WSA.WorldManager/OnPositionalLocatorStateChangedDelegate)\">\n      <summary>\n        <para>Event fired when the world tracking systems state has changed.</para>\n      </summary>\n      <param name=\"value\"></param>\n    </member>\n    <member name=\"T:UnityEngine.XR.WSA.WorldManager.OnPositionalLocatorStateChangedDelegate\">\n      <summary>\n        <para>Callback on when the world tracking systems state has changed.</para>\n      </summary>\n      <param name=\"oldState\">The previous state of the world tracking systems.</param>\n      <param name=\"newState\">The new state of the world tracking systems.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.XRDevice\">\n      <summary>\n        <para>Contains all functionality related to a XR device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRDevice.family\">\n      <summary>\n        <para>The name of the family of the loaded XR device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRDevice.fovZoomFactor\">\n      <summary>\n        <para>Zooms the XR projection.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRDevice.isPresent\">\n      <summary>\n        <para>Successfully detected a XR device in working order.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRDevice.model\">\n      <summary>\n        <para>Specific model of loaded XR device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRDevice.refreshRate\">\n      <summary>\n        <para>Refresh rate of the display in Hertz.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRDevice.userPresence\">\n      <summary>\n        <para>Indicates whether the user is present and interacting with the device.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.XRDevice.DisableAutoXRCameraTracking\">\n      <summary>\n        <para>Sets whether the camera passed in the first parameter is controlled implicitly by the XR Device</para>\n      </summary>\n      <param name=\"Camera\">The camera that we wish to change behavior on</param>\n      <param name=\"Disabled\">True if the camera's transform is set externally. False if the camera is to be driven implicitly by XRDevice, </param>\n      <returns>\n        <para>Nothing.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.XRDevice.GetNativePtr\">\n      <summary>\n        <para>This method returns an IntPtr representing the native pointer to the XR device if one is available, otherwise the value will be IntPtr.Zero.</para>\n      </summary>\n      <returns>\n        <para>The native pointer to the XR device.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.XRDevice.GetTrackingSpaceType\">\n      <summary>\n        <para>Returns the device's current TrackingSpaceType. This value determines how the camera is positioned relative to its starting position. For more, see the section \"Understanding the camera\" in.</para>\n      </summary>\n      <returns>\n        <para>The device's current TrackingSpaceType.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.XRDevice.SetTrackingSpaceType(UnityEngine.XR.TrackingSpaceType)\">\n      <summary>\n        <para>Sets the device's current TrackingSpaceType. Returns true on success. Returns false if the given TrackingSpaceType is not supported or the device fails to switch.</para>\n      </summary>\n      <param name=\"TrackingSpaceType\">The TrackingSpaceType the device should switch to.</param>\n      <param name=\"trackingSpaceType\"></param>\n      <returns>\n        <para>True on success. False if the given TrackingSpaceType is not supported or the device fails to switch.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.XR.XRNode\">\n      <summary>\n        <para>Enumeration of tracked XR nodes which can be updated by XR input.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.XRNode.CenterEye\">\n      <summary>\n        <para>Node representing a point between the left and right eyes.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.XRNode.GameController\">\n      <summary>\n        <para>Represents a tracked game Controller not associated with a specific hand.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.XRNode.HardwareTracker\">\n      <summary>\n        <para>Represents a physical device that provides tracking data for objects to which it is attached.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.XRNode.Head\">\n      <summary>\n        <para>Node representing the user's head.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.XRNode.LeftEye\">\n      <summary>\n        <para>Node representing the left eye.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.XRNode.LeftHand\">\n      <summary>\n        <para>Node representing the left hand.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.XRNode.RightEye\">\n      <summary>\n        <para>Node representing the right eye.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.XRNode.RightHand\">\n      <summary>\n        <para>Node representing the right hand.</para>\n      </summary>\n    </member>\n    <member name=\"F:UnityEngine.XR.XRNode.TrackingReference\">\n      <summary>\n        <para>Represents a stationary physical device that can be used as a point of reference in the tracked area.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRNodeState.acceleration\">\n      <summary>\n        <para>Sets the vector representing the current acceleration of the tracked node.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRNodeState.angularAcceleration\">\n      <summary>\n        <para>Sets the vector representing the current angular acceleration of the tracked node.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRNodeState.angularVelocity\">\n      <summary>\n        <para>Sets the vector representing the current angular velocity of the tracked node.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRNodeState.nodeType\">\n      <summary>\n        <para>The type of the tracked node as specified in XR.XRNode.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRNodeState.position\">\n      <summary>\n        <para>Sets the vector representing the current position of the tracked node.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRNodeState.rotation\">\n      <summary>\n        <para>Sets the quaternion representing the current rotation of the tracked node.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRNodeState.tracked\">\n      <summary>\n        <para>\n          Set to true if the node is presently being tracked by the underlying XR system,\nand false if the node is not presently being tracked by the underlying XR system.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRNodeState.uniqueID\">\n      <summary>\n        <para>The unique identifier of the tracked node.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRNodeState.velocity\">\n      <summary>\n        <para>Sets the vector representing the current velocity of the tracked node.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.XRNodeState.TryGetAcceleration\">\n      <summary>\n        <para>Attempt to retrieve a vector representing the current acceleration of the tracked node.</para>\n      </summary>\n      <returns>\n        <para>True if the acceleration was set in the output parameter. False if the acceleration is not available due to limitations of the underlying platform or if the node is not presently tracked.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.XRNodeState.TryGetAngularAcceleration(UnityEngine.Vector3&amp;)\">\n      <summary>\n        <para>Attempt to retrieve a Vector3 representing the current angular acceleration of the tracked node.</para>\n      </summary>\n      <param name=\"angularAcceleration\"></param>\n      <returns>\n        <para>True if the angular acceleration was set in the output parameter. False if the angular acceleration is not available due to limitations of the underlying platform or if the node is not presently tracked.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.XRNodeState.TryGetAngularVelocity(UnityEngine.Vector3&amp;)\">\n      <summary>\n        <para>Attempt to retrieve a Vector3 representing the current angular velocity of the tracked node.</para>\n      </summary>\n      <param name=\"angularVelocity\"></param>\n      <returns>\n        <para>True if the angular velocity was set in the output parameter. False if the angular velocity is not available due to limitations of the underlying platform or if the node is not presently tracked.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.XRNodeState.TryGetPosition\">\n      <summary>\n        <para>Attempt to retrieve a vector representing the current position of the tracked node.</para>\n      </summary>\n      <returns>\n        <para>True if the position was set in the output parameter. False if the position is not available due to limitations of the underlying platform or if the node is not presently tracked.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.XRNodeState.TryGetRotation\">\n      <summary>\n        <para>Attempt to retrieve a quaternion representing the current rotation of the tracked node.</para>\n      </summary>\n      <returns>\n        <para>True if the rotation was set in the output parameter. False if the rotation is not available due to limitations of the underlying platform or if the node is not presently tracked.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.XRNodeState.TryGetVelocity\">\n      <summary>\n        <para>Attempt to retrieve a vector representing the current velocity of the tracked node.</para>\n      </summary>\n      <returns>\n        <para>True if the velocity was set in the output parameter. False if the velocity is not available due to limitations of the underlying platform or if the node is not presently tracked.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.XR.XRSettings\">\n      <summary>\n        <para>Global XR related settings.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRSettings.enabled\">\n      <summary>\n        <para>Globally enables or disables XR for the application.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRSettings.eyeTextureDesc\">\n      <summary>\n        <para>Fetch the eye texture RenderTextureDescriptor from the active stereo device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRSettings.eyeTextureHeight\">\n      <summary>\n        <para>The current height of an eye texture for the loaded device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRSettings.eyeTextureResolutionScale\">\n      <summary>\n        <para>Controls the actual size of eye textures as a multiplier of the device's default resolution.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRSettings.eyeTextureWidth\">\n      <summary>\n        <para>The current width of an eye texture for the loaded device.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRSettings.gameViewRenderMode\">\n      <summary>\n        <para>Sets the render mode for the XR device. The render mode controls how the view of the XR device renders in the Game view and in the main window on a host PC.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRSettings.isDeviceActive\">\n      <summary>\n        <para>Read-only value that can be used to determine if the XR device is active.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRSettings.loadedDeviceName\">\n      <summary>\n        <para>Type of XR device that is currently loaded.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRSettings.occlusionMaskScale\">\n      <summary>\n        <para>A scale applied to the standard occulsion mask for each platform.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRSettings.renderScale\">\n      <summary>\n        <para>This field has been deprecated. Use XRSettings.eyeTextureResolutionScale instead.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRSettings.renderViewportScale\">\n      <summary>\n        <para>Controls how much of the allocated eye texture should be used for rendering.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRSettings.showDeviceView\">\n      <summary>\n        <para>This property has been deprecated. Use XRSettings.gameViewRenderMode instead.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRSettings.supportedDevices\">\n      <summary>\n        <para>Returns a list of supported XR devices that were included at build time.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRSettings.useOcclusionMesh\">\n      <summary>\n        <para>Specifies whether or not the occlusion mesh should be used when rendering. Enabled by default.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.XRSettings.LoadDeviceByName(System.String)\">\n      <summary>\n        <para>Loads the requested device at the beginning of the next frame.</para>\n      </summary>\n      <param name=\"deviceName\">Name of the device from XRSettings.supportedDevices.</param>\n      <param name=\"prioritizedDeviceNameList\">Prioritized list of device names from XRSettings.supportedDevices.</param>\n    </member>\n    <member name=\"M:UnityEngine.XR.XRSettings.LoadDeviceByName(System.String[])\">\n      <summary>\n        <para>Loads the requested device at the beginning of the next frame.</para>\n      </summary>\n      <param name=\"deviceName\">Name of the device from XRSettings.supportedDevices.</param>\n      <param name=\"prioritizedDeviceNameList\">Prioritized list of device names from XRSettings.supportedDevices.</param>\n    </member>\n    <member name=\"T:UnityEngine.XR.XRStats\">\n      <summary>\n        <para>Timing and other statistics from the XR subsystem.</para>\n      </summary>\n    </member>\n    <member name=\"P:UnityEngine.XR.XRStats.gpuTimeLastFrame\">\n      <summary>\n        <para>Total GPU time utilized last frame as measured by the XR subsystem.</para>\n      </summary>\n    </member>\n    <member name=\"M:UnityEngine.XR.XRStats.TryGetDroppedFrameCount(System.Int32&amp;)\">\n      <summary>\n        <para>Retrieves the number of dropped frames reported by the XR SDK.</para>\n      </summary>\n      <param name=\"droppedFrameCount\">Outputs the number of frames dropped since the last update.</param>\n      <returns>\n        <para>True if the dropped frame count is available, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.XRStats.TryGetFramePresentCount(System.Int32&amp;)\">\n      <summary>\n        <para>Retrieves the number of times the current frame has been drawn to the device as reported by the XR SDK.</para>\n      </summary>\n      <param name=\"framePresentCount\">Outputs the number of times the current frame has been presented.</param>\n      <returns>\n        <para>True if the frame present count is available, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"M:UnityEngine.XR.XRStats.TryGetGPUTimeLastFrame(System.Single&amp;)\">\n      <summary>\n        <para>Retrieves the time spent by the GPU last frame, in seconds, as reported by the XR SDK.</para>\n      </summary>\n      <param name=\"gpuTimeLastFrame\">Outputs the time spent by the GPU last frame.</param>\n      <returns>\n        <para>True if the GPU time spent last frame is available, false otherwise.</para>\n      </returns>\n    </member>\n    <member name=\"T:UnityEngine.YieldInstruction\">\n      <summary>\n        <para>Base class for all yield instructions.</para>\n      </summary>\n    </member>\n  </members>\n</doc>\n"
  },
  {
    "path": "Resources/version.txt",
    "content": "2018.2.1f1\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/AIController.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.AI.Sensors;\r\nusing com.spacepuppy.StateMachine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI\r\n{\r\n\r\n    /// <summary>\r\n    /// Generic state machine AIController.\r\n    /// </summary>\r\n    public class AIController : SPNotifyingComponent, IAIController, IAIStateMachine\r\n    {\r\n\r\n        public event System.EventHandler OnTick;\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private AIStateMachineSourceMode _stateSource;\r\n\r\n        [SerializeField()]\r\n        private Component _defaultState;\r\n\r\n        [SerializeField()]\r\n        [MinRange(0.02f)]\r\n        private float _interval = 0.1f;\r\n\r\n        [SerializeField()]\r\n        private AIVariableCollection _variables;\r\n\r\n        [System.NonSerialized()]\r\n        private ITypedStateMachine<IAIState> _stateMachine;\r\n\r\n        [System.NonSerialized()]\r\n        private float _t;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            this.InitStateMachine();\r\n        }\r\n\r\n        protected override void Start()\r\n        {\r\n            base.Start();\r\n\r\n            if (_stateMachine.Current == null)\r\n            {\r\n                var state = _defaultState as IAIState;\r\n                if (state.IsNullOrDestroyed() || !_stateMachine.Contains(state))\r\n                {\r\n                    state = _stateMachine.FirstOrDefault();\r\n                    _defaultState = state as Component;\r\n                }\r\n                _stateMachine.ChangeState(state);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ITypedStateMachine<IAIState> States { get { return _stateMachine; } }\r\n\r\n        public IAIState DefaultState\r\n        {\r\n            get { return _defaultState as IAIState; }\r\n            set\r\n            {\r\n                if (object.ReferenceEquals(_defaultState, value)) return;\r\n\r\n                if(value != null && _stateMachine.Contains(value))\r\n                {\r\n                    _defaultState = value as Component;\r\n                }\r\n                else\r\n                {\r\n                    _defaultState = null;\r\n                }\r\n            }\r\n        }\r\n\r\n        public AIVariableCollection Variables { get { return _variables; } }\r\n\r\n        public float Interval\r\n        {\r\n            get { return _interval; }\r\n            set\r\n            {\r\n                _interval = Mathf.Max(0f, value);\r\n            }\r\n        }\r\n\r\n        public AIStateMachineSourceMode StateSource\r\n        {\r\n            get { return _stateSource; }\r\n            set\r\n            {\r\n                if (_stateSource == value) return;\r\n\r\n                _stateSource = value;\r\n                if(this.started && _stateMachine != null)\r\n                {\r\n                    this.InitStateMachine();\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void OffsetTicker(float t)\r\n        {\r\n            _t = Time.time - t;\r\n        }\r\n\r\n        private void InitStateMachine()\r\n        {\r\n            IAIState state = null;\r\n            if(_stateMachine != null)\r\n            {\r\n                state = _stateMachine.Current;\r\n                _stateMachine.StateChanged -= this.OnStateChanged;\r\n                _stateMachine = null;\r\n            }\r\n\r\n            switch(_stateSource)\r\n            {\r\n                case AIStateMachineSourceMode.SelfSourced:\r\n                    _stateMachine = TypedStateMachine<IAIState>.CreateFromComponentSource(this.gameObject);\r\n                    break;\r\n                case AIStateMachineSourceMode.ChildSourced:\r\n                    _stateMachine = TypedStateMachine<IAIState>.CreateFromParentComponentSource(this.gameObject, false, true);\r\n                    break;\r\n            }\r\n            _stateMachine.StateChanged += this.OnStateChanged;\r\n            foreach(var st in _stateMachine)\r\n            {\r\n                st.Init(this);\r\n            }\r\n\r\n            if(this.started)\r\n            {\r\n                if(!state.IsNullOrDestroyed() && _stateMachine.Contains(state))\r\n                {\r\n                    _stateMachine.ChangeState(state);\r\n                }\r\n                else\r\n                {\r\n                    _stateMachine.ChangeState((IAIState)null);\r\n                }\r\n            }\r\n        }\r\n\r\n        protected void Update()\r\n        {\r\n            if (Time.time - _t > _interval)\r\n            {\r\n                _t = Time.time;\r\n                if(_stateMachine.Current != null)\r\n                {\r\n                    _stateMachine.Current.Tick(this);\r\n                }\r\n\r\n                this.OnTick?.Invoke(this, System.EventArgs.Empty);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Event Handlers\r\n\r\n        protected virtual void OnStateChanged(object sender, StateChangedEventArgs<IAIState> e)\r\n        {\r\n            if (e.FromState != null) e.FromState.OnStateExited(this, e.ToState);\r\n            if (e.ToState != null) e.ToState.OnStateEntered(this, e.FromState);\r\n\r\n            //Notification.PostNotification<AIStateChanged>(this, new AIStateChanged(e.FromState, e.ToState), true);\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region Notifications\r\n\r\n        /*\r\n        public class AIStateChanged : Notification\r\n        {\r\n\r\n            private IAIState _fromState;\r\n            private IAIState _toState;\r\n\r\n            public AIStateChanged(IAIState fromState, IAIState toState)\r\n            {\r\n                _fromState = fromState;\r\n                _toState = toState;\r\n            }\r\n\r\n            public IAIState FromState { get { return _fromState; } }\r\n\r\n            public IAIState ToState { get { return _toState; } }\r\n\r\n        }\r\n        */\r\n\r\n        #endregion\r\n\r\n\r\n\r\n\r\n\r\n\r\n        #region AIStateMachine Interface\r\n\r\n        event StateChangedEventHandler<IAIState> IStateMachine<IAIState>.StateChanged\r\n        {\r\n            add { _stateMachine.StateChanged += value; }\r\n            remove { _stateMachine.StateChanged -= value; }\r\n        }\r\n        \r\n        IAIState IStateMachine<IAIState>.Current\r\n        {\r\n            get { return _stateMachine.Current; }\r\n        }\r\n\r\n        bool IStateMachine<IAIState>.Contains(IAIState state)\r\n        {\r\n            return _stateMachine.Contains(state);\r\n        }\r\n\r\n        IAIState IStateMachine<IAIState>.ChangeState(IAIState state)\r\n        {\r\n            return _stateMachine.ChangeState(state);\r\n        }\r\n\r\n        IEnumerator<IAIState> IEnumerable<IAIState>.GetEnumerator()\r\n        {\r\n            return _stateMachine.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _stateMachine.GetEnumerator();\r\n        }\r\n\r\n        void IStateMachine<IAIState>.GetStates(ICollection<IAIState> coll)\r\n        {\r\n            _stateMachine.GetStates(coll);\r\n        }\r\n        \r\n        void com.spacepuppy.Collections.IForeachEnumerator<IAIState>.Foreach(System.Action<IAIState> callback)\r\n        {\r\n            _stateMachine.Foreach(callback);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/AISubController.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.AI;\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.StateMachine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI\r\n{\r\n    public class AISubController : SimpleAIStateComponent, IAIStateMachine\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private AIStateMachineSourceMode _stateSource;\r\n\r\n        [SerializeField()]\r\n        private Component _defaultState;\r\n\r\n        [System.NonSerialized()]\r\n        private ITypedStateMachine<IAIState> _stateMachine;\r\n        \r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n            \r\n            this.InitStateMachine();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ITypedStateMachine<IAIState> States { get { return _stateMachine; } }\r\n\r\n        public IAIState DefaultState\r\n        {\r\n            get { return _defaultState as IAIState; }\r\n            set\r\n            {\r\n                if (object.ReferenceEquals(_defaultState, value)) return;\r\n\r\n                if (value != null && _stateMachine.Contains(value))\r\n                {\r\n                    _defaultState = value as Component;\r\n                }\r\n                else\r\n                {\r\n                    _defaultState = null;\r\n                }\r\n            }\r\n        }\r\n        \r\n        public AIStateMachineSourceMode StateSource\r\n        {\r\n            get { return _stateSource; }\r\n            set\r\n            {\r\n                if (_stateSource == value) return;\r\n\r\n                _stateSource = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void InitStateMachine()\r\n        {\r\n            IAIState state = null;\r\n            if (_stateMachine != null)\r\n            {\r\n                state = _stateMachine.Current;\r\n                _stateMachine.StateChanged -= this.OnStateChanged;\r\n                _stateMachine = null;\r\n            }\r\n\r\n            switch (_stateSource)\r\n            {\r\n                case AIStateMachineSourceMode.SelfSourced:\r\n                    _stateMachine = TypedStateMachine<IAIState>.CreateFromComponentSource(this.gameObject);\r\n                    break;\r\n                case AIStateMachineSourceMode.ChildSourced:\r\n                    _stateMachine = TypedStateMachine<IAIState>.CreateFromParentComponentSource(this.gameObject, false, true);\r\n                    break;\r\n            }\r\n            _stateMachine.StateChanged += this.OnStateChanged;\r\n            foreach (var st in _stateMachine)\r\n            {\r\n                st.Init(this);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Event Handlers\r\n\r\n        protected virtual void OnStateChanged(object sender, StateChangedEventArgs<IAIState> e)\r\n        {\r\n            if (e.FromState != null) e.FromState.OnStateExited(this, e.ToState);\r\n            if (e.ToState != null) e.ToState.OnStateEntered(this, e.FromState);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIStateMachine Interface\r\n\r\n        event StateChangedEventHandler<IAIState> IStateMachine<IAIState>.StateChanged\r\n        {\r\n            add { _stateMachine.StateChanged += value; }\r\n            remove { _stateMachine.StateChanged -= value; }\r\n        }\r\n        \r\n        IAIState IStateMachine<IAIState>.Current\r\n        {\r\n            get { return _stateMachine.Current; }\r\n        }\r\n\r\n        bool IStateMachine<IAIState>.Contains(IAIState state)\r\n        {\r\n            return _stateMachine.Contains(state);\r\n        }\r\n\r\n        IAIState IStateMachine<IAIState>.ChangeState(IAIState state)\r\n        {\r\n            return _stateMachine.ChangeState(state);\r\n        }\r\n\r\n        IEnumerator<IAIState> IEnumerable<IAIState>.GetEnumerator()\r\n        {\r\n            return _stateMachine.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _stateMachine.GetEnumerator();\r\n        }\r\n\r\n        void IStateMachine<IAIState>.GetStates(ICollection<IAIState> coll)\r\n        {\r\n            _stateMachine.GetStates(coll);\r\n        }\r\n\r\n        void com.spacepuppy.Collections.IForeachEnumerator<IAIState>.Foreach(System.Action<IAIState> callback)\r\n        {\r\n            _stateMachine.Foreach(callback);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIState Interface\r\n\r\n        protected override void OnStateEntered(IAIStateMachine machine, IAIState lastState)\r\n        {\r\n            if (_defaultState is IAIState)\r\n            {\r\n                _stateMachine.ChangeState(_defaultState as IAIState);\r\n            }\r\n        }\r\n\r\n        protected override void OnStateExited(IAIStateMachine machine, IAIState nextState)\r\n        {\r\n            if (_stateMachine.Current != null)\r\n            {\r\n                _stateMachine.ChangeState((IAIState)null);\r\n            }\r\n        }\r\n\r\n        protected override void Tick(IAIController ai)\r\n        {\r\n            if (_stateMachine.Current != null)\r\n            {\r\n                _stateMachine.Current.Tick(ai);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/AIVariableCollection.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.AI\r\n{\r\n\r\n    [System.Serializable()]\r\n    public class AIVariableCollection : VariantCollection\r\n    {\r\n        \r\n        public AIVariableCollection()\r\n        {\r\n\r\n        }\r\n\r\n        \r\n        public ComplexTarget GetAsComplexTarget(string key)\r\n        {\r\n            var v = this.GetVariant(key);\r\n            if (v == null) return ComplexTarget.Null;\r\n\r\n            switch(v.ValueType)\r\n            {\r\n                case VariantType.Object:\r\n                    return ComplexTarget.FromObject(v.Value);\r\n                case VariantType.Vector2:\r\n                    return new ComplexTarget(v.Vector2Value);\r\n                case VariantType.Vector3:\r\n                case VariantType.Vector4:\r\n                    return new ComplexTarget(v.Vector3Value);\r\n                case VariantType.GameObject:\r\n                case VariantType.Component:\r\n                    return ComplexTarget.FromObject(v.Value);\r\n                default:\r\n                    return ComplexTarget.Null;\r\n            }\r\n        }\r\n\r\n        public void SetAsComplexTarget(string key, ComplexTarget target)\r\n        {\r\n            switch(target.TargetType)\r\n            {\r\n                case ComplexTargetType.Null:\r\n                    this.GetVariant(key, true).Value = null;\r\n                    break;\r\n                case ComplexTargetType.Aspect:\r\n                    this.GetVariant(key, true).Value = target.TargetAspect;\r\n                    break;\r\n                case ComplexTargetType.Transform:\r\n                    this.GetVariant(key, true).Value = target.Transform;\r\n                    break;\r\n                case ComplexTargetType.Vector2:\r\n                    this.GetVariant(key, true).Value = target.Position2D;\r\n                    break;\r\n                case ComplexTargetType.Vector3:\r\n                    this.GetVariant(key, true).Value = target.Position;\r\n                    break;\r\n            }\r\n        }\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/AIVariableNameAttribute.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppy.AI\r\n{\r\n\r\n    [System.Serializable()]\r\n    public class AIVariableNameAttribute : SPPropertyAttribute\r\n    {\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/ComplexTarget.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.AI.Sensors;\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI\r\n{\r\n\r\n    public enum ComplexTargetType\r\n    {\r\n        Null = 0,\r\n        Aspect = 1,\r\n        Transform = 2,\r\n        Vector2 = 3,\r\n        Vector3 = 4\r\n    }\r\n\r\n    public struct ComplexTarget\r\n    {\r\n\r\n        public static IPlanarSurface DefualtSurface;\r\n\r\n        #region Fields\r\n\r\n        public readonly ComplexTargetType TargetType;\r\n        private readonly object _target;\r\n        private readonly Vector3 _vector;\r\n        private readonly IPlanarSurface _surface;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public ComplexTarget(IAspect aspect)\r\n        {\r\n            if (aspect != null)\r\n            {\r\n                TargetType = ComplexTargetType.Aspect;\r\n                _target = aspect;\r\n            }\r\n            else\r\n            {\r\n                TargetType = ComplexTargetType.Null;\r\n                _target = null;\r\n            }\r\n            _vector = Vector3.zero;\r\n            _surface = DefualtSurface;\r\n        }\r\n\r\n        public ComplexTarget(Transform target)\r\n        {\r\n            if (target != null)\r\n            {\r\n                TargetType = ComplexTargetType.Transform;\r\n                _target = target;\r\n            }\r\n            else\r\n            {\r\n                TargetType = ComplexTargetType.Null;\r\n                _target = null;\r\n            }\r\n            _vector = Vector3.zero;\r\n            _surface = DefualtSurface;\r\n        }\r\n\r\n        public ComplexTarget(Vector2 location)\r\n        {\r\n            TargetType = ComplexTargetType.Vector2;\r\n            _target = null;\r\n            _vector = (Vector3)location;\r\n            _surface = DefualtSurface;\r\n        }\r\n\r\n        public ComplexTarget(Vector3 location)\r\n        {\r\n            TargetType = ComplexTargetType.Vector3;\r\n            _target = null;\r\n            _vector = location;\r\n            _surface = DefualtSurface;\r\n        }\r\n\r\n        public ComplexTarget(IAspect aspect, IPlanarSurface surface)\r\n        {\r\n            if (aspect != null)\r\n            {\r\n                TargetType = ComplexTargetType.Aspect;\r\n                _target = aspect;\r\n            }\r\n            else\r\n            {\r\n                TargetType = ComplexTargetType.Null;\r\n                _target = null;\r\n            }\r\n            _vector = Vector3.zero;\r\n            _surface = surface;\r\n        }\r\n\r\n        public ComplexTarget(Transform target, IPlanarSurface surface)\r\n        {\r\n            if (target != null)\r\n            {\r\n                TargetType = ComplexTargetType.Transform;\r\n                _target = target;\r\n            }\r\n            else\r\n            {\r\n                TargetType = ComplexTargetType.Null;\r\n                _target = null;\r\n            }\r\n            _vector = Vector3.zero;\r\n            _surface = surface;\r\n        }\r\n\r\n        public ComplexTarget(Vector2 location, IPlanarSurface surface)\r\n        {\r\n            TargetType = ComplexTargetType.Vector2;\r\n            _target = null;\r\n            _vector = (Vector3)location;\r\n            _surface = surface;\r\n        }\r\n\r\n        public ComplexTarget(Vector3 location, IPlanarSurface surface)\r\n        {\r\n            TargetType = ComplexTargetType.Vector2;\r\n            _target = null;\r\n            _vector = location;\r\n            _surface = surface;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Vector2 Position2D\r\n        {\r\n            get\r\n            {\r\n                switch (this.TargetType)\r\n                {\r\n                    case ComplexTargetType.Null:\r\n                        return Vector2.zero;\r\n                    case ComplexTargetType.Aspect:\r\n                        var a = _target as IAspect;\r\n                        if (a.IsNullOrDestroyed()) return Vector2.zero;\r\n                        else if (_surface == null) return ConvertUtil.ToVector2(a.transform.position);\r\n                        else return _surface.ProjectPosition2D(a.transform.position);\r\n                    case ComplexTargetType.Transform:\r\n                        var t = _target as Transform;\r\n                        if (t.IsNullOrDestroyed()) return Vector2.zero;\r\n                        else if (_surface == null) return ConvertUtil.ToVector2(t.position);\r\n                        else return _surface.ProjectPosition2D(t.position);\r\n                    case ComplexTargetType.Vector2:\r\n                        return ConvertUtil.ToVector2(_vector);\r\n                    case ComplexTargetType.Vector3:\r\n                        if (_surface == null) return ConvertUtil.ToVector2(_vector);\r\n                        else return _surface.ProjectPosition2D(_vector);\r\n                    default:\r\n                        return Vector2.zero;\r\n                }\r\n            }\r\n        }\r\n\r\n        public Vector3 Position\r\n        {\r\n            get\r\n            {\r\n                switch (this.TargetType)\r\n                {\r\n                    case ComplexTargetType.Null:\r\n                        return Vector3.zero;\r\n                    case ComplexTargetType.Aspect:\r\n                        var a = _target as IAspect;\r\n                        if (a == null) return Vector3.zero;\r\n                        else return a.transform.position;\r\n                    case ComplexTargetType.Transform:\r\n                        var t = _target as Transform;\r\n                        if (t == null) return Vector3.zero;\r\n                        else return t.position;\r\n                    case ComplexTargetType.Vector2:\r\n                        if (_surface == null) return _vector.SetZ(0f);\r\n                        else return _surface.ProjectPosition3D(ConvertUtil.ToVector2(_vector));\r\n                    case ComplexTargetType.Vector3:\r\n                        return _vector;\r\n                    default:\r\n                        return Vector3.zero;\r\n                }\r\n            }\r\n        }\r\n\r\n        public IAspect TargetAspect { get { return _target as IAspect; } }\r\n\r\n        public Transform Transform\r\n        {\r\n            get\r\n            {\r\n                switch (TargetType)\r\n                {\r\n                    case ComplexTargetType.Aspect:\r\n                        var a = _target as IAspect;\r\n                        if (a == null) return null;\r\n                        else return a.transform;\r\n                    case ComplexTargetType.Transform:\r\n                        return _target as Transform;\r\n                    default:\r\n                        return null;\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool IsNull\r\n        {\r\n            get\r\n            {\r\n                switch (this.TargetType)\r\n                {\r\n                    case ComplexTargetType.Null:\r\n                        return true;\r\n                    case ComplexTargetType.Aspect:\r\n                    case ComplexTargetType.Transform:\r\n                        return _target.IsNullOrDestroyed();\r\n                    case ComplexTargetType.Vector2:\r\n                    case ComplexTargetType.Vector3:\r\n                    default:\r\n                        return false;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Methods\r\n\r\n        public static ComplexTarget FromObject(object targ)\r\n        {\r\n            if (targ == null) return new ComplexTarget();\r\n\r\n            if (targ is Component)\r\n            {\r\n                if (targ is IAspect)\r\n                    return new ComplexTarget(targ as IAspect);\r\n                else if (targ is Transform)\r\n                    return new ComplexTarget(targ as Transform);\r\n                else\r\n                    return new ComplexTarget((targ as Component).transform);\r\n            }\r\n            else if (targ is GameObject)\r\n                return new ComplexTarget((targ as GameObject).transform);\r\n            else if (targ is Vector2)\r\n                return new ComplexTarget((Vector2)targ);\r\n            else if (targ is Vector3)\r\n                return new ComplexTarget((Vector3)targ);\r\n            else\r\n                return new ComplexTarget();\r\n        }\r\n\r\n        public static ComplexTarget Null { get { return new ComplexTarget(); } }\r\n\r\n        //public static implicit operator ComplexTarget(IAspect o)\r\n        //{\r\n        //    return new ComplexTarget(o);\r\n        //}\r\n\r\n        public static implicit operator ComplexTarget(Transform o)\r\n        {\r\n            return new ComplexTarget(o);\r\n        }\r\n\r\n        public static implicit operator ComplexTarget(Vector2 v)\r\n        {\r\n            return new ComplexTarget(v);\r\n        }\r\n\r\n        public static implicit operator ComplexTarget(Vector3 v)\r\n        {\r\n            return new ComplexTarget(v);\r\n        }\r\n\r\n        public static implicit operator ComplexTarget(GameObject go)\r\n        {\r\n            if (go == null) return new ComplexTarget();\r\n            else return new ComplexTarget(go.transform);\r\n        }\r\n\r\n        public static implicit operator ComplexTarget(Component c)\r\n        {\r\n            if (c == null) return new ComplexTarget();\r\n            if (c is IAspect)\r\n                return new ComplexTarget(c as IAspect);\r\n            else if (c is Transform)\r\n                return new ComplexTarget(c as Transform);\r\n            else\r\n                return new ComplexTarget(c.transform);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/Enums.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.AI\r\n{\r\n    public enum ActionResult\r\n    {\r\n        None = 0,\r\n        Waiting = 1,\r\n        Success = 2,\r\n        Failed = 3\r\n    }\r\n    \r\n    public enum AIStateMachineSourceMode\r\n    {\r\n        SelfSourced = 0,\r\n        ChildSourced = 1\r\n    }\r\n\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/IAIActionLoop.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.AI\r\n{\r\n    public interface IAIActionLoop\r\n    {\r\n    }\r\n\r\n    public class AIActionLoop\r\n    {\r\n\r\n        #region Fields\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/IAIController.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.AI\r\n{\r\n    public interface IAIController\r\n    {\r\n\r\n        AIVariableCollection Variables { get; }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/IAINode.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.AI\r\n{\r\n    public interface IAINode\r\n    {\r\n\r\n        string DisplayName { get; }\r\n\r\n        ActionResult Tick(IAIController ai);\r\n        void Reset();\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/IAIState.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.AI\r\n{\r\n\r\n    public interface IAIState : IAINode\r\n    {\r\n\r\n        bool IsActive { get; }\r\n        IAIStateMachine StateMachine { get; }\r\n\r\n        /// <summary>\r\n        /// Called anytime a state machine syncs and locates its states. This can be called multiple times if the machine is re-synced. Use it only to get a reference to the state machine.\r\n        /// </summary>\r\n        /// <param name=\"machine\"></param>\r\n        void Init(IAIStateMachine machine);\r\n\r\n        void OnStateEntered(IAIStateMachine machine, IAIState lastState);\r\n\r\n        void OnStateExited(IAIStateMachine machine, IAIState nextState);\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/IAIStateMachine.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.StateMachine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI\r\n{\r\n\r\n    public interface IAIStateMachine : IStateMachine<IAIState>\r\n    {\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/Scenario/i_ChangeAIState.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.Scenario\r\n{\r\n    public class i_ChangeAIState : TriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [TypeRestriction(typeof(IAIStateMachine))]\r\n        private UnityEngine.Object _stateMachine;\r\n\r\n        [SerializeField()]\r\n        [TypeRestriction(typeof(IAIState))]\r\n        private UnityEngine.Object _state;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IAIStateMachine StateMachine\r\n        {\r\n            get { return _stateMachine as IAIStateMachine; }\r\n        }\r\n\r\n        public IAIState State\r\n        {\r\n            get { return _state as IAIState; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITriggerableMechanism Interface\r\n\r\n        public override bool CanTrigger\r\n        {\r\n            get\r\n            {\r\n                return base.CanTrigger && _stateMachine != null;\r\n            }\r\n        }\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            this.StateMachine.ChangeState(this.State);\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/Scenario/i_SetAIVariable.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\n\nusing UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Scenario;\n\nnamespace com.spacepuppy.AI.Scenario\n{\n\n    public class i_SetAIVariable : TriggerableMechanism\n    {\n\n\n        #region Fields\n\n        [SerializeField()]\n        [TypeRestriction(typeof(IAIController))]\n        private UnityEngine.Object _aiController;\n\n        [SerializeField()]\n        [AIVariableName()]\n        private string _variable;\n        [SerializeField()]\n        private VariantReference _value;\n\n        #endregion\n\n        #region Properties\n\n        public IAIController AIController\n        {\n            get { return _aiController as IAIController; }\n            set { _aiController = value as UnityEngine.Object; }\n        }\n\n        #endregion\n\n        #region ITriggerableMechanism Interface\n\n        public override bool CanTrigger\n        {\n            get\n            {\n                return base.CanTrigger && _aiController != null && !string.IsNullOrEmpty(_variable);\n            }\n        }\n\n        public override bool Trigger(object sender, object arg)\n        {\n            if (!this.CanTrigger) return false;\n\n            this.AIController.Variables[_variable] = _value.Value;\n            return true;\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyAI/AI/Scenario/t_OnSense.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.AI.Sensors;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.Scenario\r\n{\r\n\r\n    [Infobox(\"Setting 'UseProximityTrigger' false will make this tick constantly, multiple t_OnSense configured this way can be very expensive.\", MessageType =InfoBoxMessageType.Warning)]\r\n    public class t_OnSense : TriggerComponent\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        [DefaultFromSelf]\r\n        private Sensor _sensor;\r\n        [SerializeField]\r\n        private float _interval = 1f;\r\n        [SerializeField]\r\n        private bool _useProximityTrigger = true;\r\n\r\n\r\n        [System.NonSerialized]\r\n        private RadicalCoroutine _routine;\r\n        [System.NonSerialized]\r\n        private HashSet<Collider> _nearColliders;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Start()\r\n        {\r\n            base.Start();\r\n\r\n            this.TryStartRoutine();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Sensor Sensor\r\n        {\r\n            get { return _sensor; }\r\n            set { _sensor = value; }\r\n        }\r\n\r\n        public float Interval\r\n        {\r\n            get { return _interval; }\r\n            set { _interval = value; }\r\n        }\r\n\r\n        public bool UseProximityTrigger\r\n        {\r\n            get { return _useProximityTrigger; }\r\n            set { _useProximityTrigger = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected void OnTriggerEnter(Collider other)\r\n        {\r\n            if (!_useProximityTrigger) return;\r\n            if (_sensor == null) return;\r\n            if (!_sensor.ConcernedWith(other.gameObject)) return;\r\n\r\n            if (_nearColliders == null) _nearColliders = new HashSet<Collider>();\r\n            _nearColliders.Add(other);\r\n\r\n            this.TryStartRoutine();\r\n        }\r\n\r\n        protected void OnTriggerExit(Collider other)\r\n        {\r\n            if (!_useProximityTrigger || _nearColliders == null) return;\r\n            if (_sensor == null) return;\r\n\r\n            _nearColliders.Remove(other);\r\n\r\n            if (_nearColliders.Count == 0 && _routine.Active)\r\n            {\r\n                _routine.Stop();\r\n            }\r\n        }\r\n\r\n\r\n\r\n\r\n        private void TryStartRoutine()\r\n        {\r\n            if (!this.isActiveAndEnabled) return;\r\n\r\n            if (!_useProximityTrigger || (_nearColliders != null && _nearColliders.Count > 0))\r\n            {\r\n                if (_routine == null || _routine.Finished)\r\n                {\r\n                    _routine = this.StartRadicalCoroutine(this.SenseRoutine(), RadicalCoroutineDisableMode.Pauses);\r\n                }\r\n                else if (!_routine.Active)\r\n                {\r\n                    _routine.Start(this, RadicalCoroutineDisableMode.Pauses);\r\n                }\r\n            }\r\n        }\r\n\r\n        private System.Collections.IEnumerator SenseRoutine()\r\n        {\r\n            while (true)\r\n            {\r\n                if (_sensor == null) yield break;\r\n\r\n                if (_sensor.SenseAny())\r\n                {\r\n                    this.ActivateTrigger();\r\n                }\r\n\r\n                yield return WaitForDuration.Seconds(_interval);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/Sensors/Audible/AudibleAspect.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Collections;\n\nnamespace com.spacepuppy.AI.Sensors.Audible\n{\n\n    public class AudibleAspect : SPEntityComponent, IAspect, IUpdateable\n    {\n\n        #region Static Multiton Interface\n\n        public static readonly MultitonPool<IAspect> Pool = new MultitonPool<IAspect>();\n\n        #endregion\n\n        #region Fields\n\n        [SerializeField()]\n        private float _precedence;\n\n        [SerializeField]\n        private float _range;\n\n        [SerializeField()]\n        private Color _aspectColor = Color.blue;\n\n        [SerializeField]\n        [Tooltip(\"This Aspect is always visible regardless.\")]\n        private bool _omniPresent;\n\n        [System.NonSerialized]\n        private SirenToken _currentToken;\n        [System.NonSerialized]\n        private HashSet<AudibleSensor> _activeSensors;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        protected override void OnEnable()\n        {\n            Pool.AddReference(this);\n\n            base.OnEnable();\n        }\n\n        protected override void OnDisable()\n        {\n            base.OnDisable();\n\n            if (_currentToken != null) this.EndSiren();\n            Pool.RemoveReference(this);\n        }\n\n        #endregion\n\n        #region Properties\n\n        public float Range\n        {\n            get { return _range; }\n            set { _range = value; }\n        }\n\n        public bool SirenIsActive\n        {\n            get { return _currentToken != null; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public void SignalBlip()\n        {\n            if (_currentToken != null) return;\n\n            var pos = this.transform.position;\n            float d, r;\n\n            var e = AudibleSensor.Pool.GetEnumerator();\n            while (e.MoveNext())\n            {\n                var sensor = e.Current;\n                if(_omniPresent)\n                {\n                    sensor.SignalBlip(this);\n                }\n                else\n                {\n                    d = (sensor.transform.position - pos).sqrMagnitude;\n                    r = (sensor.Range + _range);\n                    if (d < r * r)\n                    {\n                        sensor.SignalBlip(this);\n                    }\n                }\n            }\n        }\n\n        public SirenToken BeginSignalSiren()\n        {\n            if (_currentToken != null) return _currentToken;\n            if (_activeSensors == null) _activeSensors = new HashSet<AudibleSensor>();\n\n            _currentToken = new SirenToken(this);\n            (this as IUpdateable).Update();\n            GameLoopEntry.RegisterNextUpdate(this);\n            return _currentToken;\n        }\n\n        public void EndSiren()\n        {\n            GameLoopEntry.UpdatePump.Remove(this);\n            var token = _currentToken;\n            _currentToken = null;\n\n            if(_activeSensors != null && _activeSensors.Count > 0)\n            {\n                using (var lst = TempCollection.GetList(_activeSensors))\n                {\n                    _activeSensors.Clear();\n                    for(int i = 0; i < lst.Count; i++)\n                    {\n                        lst[i].SignalExitSiren(this);\n                    }\n                }\n            }\n\n            if (token != null && !token.IsComplete) token.SignalComplete();\n        }\n\n        #endregion\n\n        #region IAspect Interface\n\n        bool IAspect.IsActive\n        {\n            get { return this.isActiveAndEnabled; }\n        }\n        \n        public float Precedence\n        {\n            get { return _precedence; }\n            set { _precedence = value; }\n        }\n\n        public Color AspectColor\n        {\n            get { return _aspectColor; }\n            set { _aspectColor = value; }\n        }\n\n        public bool OmniPresent\n        {\n            get { return _omniPresent; }\n            set { _omniPresent = value; }\n        }\n\n        #endregion\n\n        #region IUpdateable Interface\n\n        void IUpdateable.Update()\n        {\n            if (_currentToken == null)\n            {\n                GameLoopEntry.UpdatePump.Remove(this);\n                return;\n            }\n\n            TempHashSet<AudibleSensor> activeSet = null;\n            if (_activeSensors.Count > 0) activeSet = TempCollection.GetSet(_activeSensors);\n\n            var pos = this.transform.position;\n            float d, r;\n\n            var e = AudibleSensor.Pool.GetEnumerator();\n            while(e.MoveNext())\n            {\n                var sensor = e.Current;\n                if (_activeSensors.Contains(sensor) || sensor.Ignores(this)) continue;\n\n                if(_omniPresent)\n                {\n                    _activeSensors.Add(sensor);\n                    sensor.SignalEnterSiren(this);\n                }\n                else\n                {\n                    d = (sensor.transform.position - pos).sqrMagnitude;\n                    r = (sensor.Range + _range);\n                    if (d < r * r)\n                    {\n                        _activeSensors.Add(sensor);\n                        sensor.SignalEnterSiren(this);\n                    }\n                }\n            }\n\n            if(activeSet != null)\n            {\n                var e2 = activeSet.GetEnumerator();\n                while(e2.MoveNext())\n                {\n                    var sensor = e.Current;\n\n                    if(!_omniPresent)\n                    {\n                        d = (sensor.transform.position - pos).sqrMagnitude;\n                        r = (sensor.Range + _range);\n                        if (d < r * r)\n                        {\n                            sensor.SignalSirenStay(this);\n                        }\n                        else\n                        {\n                            _activeSensors.Remove(sensor);\n                            sensor.SignalExitSiren(this);\n                        }\n                    }\n                }\n\n                activeSet.Dispose();\n            }\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyAI/AI/Sensors/Audible/AudibleSensor.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\n\nusing UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Collections;\nusing com.spacepuppy.Scenario;\nusing com.spacepuppy.Utils;\nusing System;\n\nnamespace com.spacepuppy.AI.Sensors.Audible\n{\n\n    public class AudibleSensor : ActiveSensor\n    {\n        \n        #region Static Multiton Interface\n\n        public static readonly MultitonPool<AudibleSensor> Pool = new MultitonPool<AudibleSensor>();\n\n        #endregion\n\n        #region Fields\n\n        [SerializeField()]\n        private Color _sensorColor = Color.red;\n\n        [SerializeField]\n        private float _range;\n\n        [SerializeField]\n        [Tooltip(\"Should we signal the entire entity if one exists?\")]\n        private bool _signalEntity = true;\n        [SerializeField()]\n        private bool _canDetectSelf;\n\n        [SerializeField()]\n        private LayerMask _aspectLayerMask = -1;\n        [SerializeField()]\n        private TagMask _aspectTagMask;\n\n        [SerializeField]\n        private Trigger _onHeardSound;\n\n        [System.NonSerialized]\n        private SPEntity _entity;\n\n        [System.NonSerialized]\n        private HashSet<AudibleAspect> _activeSirens;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        protected override void Awake()\n        {\n            base.Awake();\n            \n            _entity = SPEntity.Pool.GetFromSource(this);\n        }\n\n        protected override void OnEnable()\n        {\n            Pool.AddReference(this);\n\n            base.OnEnable();\n        }\n\n        protected override void OnDisable()\n        {\n            base.OnDisable();\n\n            Pool.RemoveReference(this);\n        }\n\n        #endregion\n\n        #region Properties\n\n        public Color SensorColor\n        {\n            get { return _sensorColor; }\n            set { _sensorColor = value; }\n        }\n\n        public float Range\n        {\n            get { return _range; }\n            set { _range = value; }\n        }\n\n        public bool CanDetectSelf\n        {\n            get { return _canDetectSelf; }\n            set { _canDetectSelf = value; }\n        }\n\n        public LayerMask AspectLayerMask\n        {\n            get { return _aspectLayerMask; }\n            set { _aspectLayerMask = value; }\n        }\n\n        public TagMask AspectTagMask\n        {\n            get { return _aspectTagMask; }\n        }\n\n        public Trigger OnHeardSound\n        {\n            get { return _onHeardSound; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public bool Ignores(IAspect aspect)\n        {\n            if (aspect == null) return true;\n            if (_aspectLayerMask != -1 && !aspect.gameObject.IntersectsLayerMask(_aspectLayerMask)) return true;\n            if (!_aspectTagMask.Intersects(aspect.gameObject)) return true;\n            return false;\n        }\n\n        public void SignalBlip(IAspect aspect)\n        {\n            var audible = aspect as AudibleAspect;\n            if (object.ReferenceEquals(audible, null) || !this.ConcernedWith(audible)) return;\n\n            this.OnSensedAspect(aspect);\n            if (_onHeardSound.Count > 0) _onHeardSound.ActivateTrigger(this, aspect);\n\n            if(_signalEntity && !object.ReferenceEquals(_entity, null))\n            {\n                Messaging.Broadcast<IAudibleResponder>(_entity.gameObject, (o) => o.OnSound(aspect, false));\n            }\n            else\n            {\n                Messaging.Execute<IAudibleResponder>(this.gameObject, (o) => o.OnSound(aspect, false));\n            }\n        }\n\n        public void SignalEnterSiren(IAspect aspect)\n        {\n            var audible = aspect as AudibleAspect;\n            if (object.ReferenceEquals(audible, null) || !this.ConcernedWith(audible)) return;\n\n            if (_activeSirens == null) _activeSirens = new HashSet<AudibleAspect>();\n            bool none = _activeSirens.Count == 0;\n            if (!_activeSirens.Add(audible)) return;\n            \n            this.OnSensedAspect(aspect);\n            if (none) this.OnSensorAlert();\n            if (_onHeardSound.Count > 0) _onHeardSound.ActivateTrigger(this, aspect);\n\n            if (_signalEntity && !object.ReferenceEquals(_entity, null))\n            {\n                Messaging.Broadcast<IAudibleResponder>(_entity.gameObject, (o) => o.OnSound(aspect, true));\n            }\n            else\n            {\n                Messaging.Execute<IAudibleResponder>(this.gameObject, (o) => o.OnSound(aspect, true));\n            }\n        }\n\n        public void SignalSirenStay(IAspect aspect)\n        {\n            var audible = aspect as AudibleAspect;\n            if (object.ReferenceEquals(audible, null) || _activeSirens == null || !_activeSirens.Contains(audible)) return;\n\n            if (_signalEntity && !object.ReferenceEquals(_entity, null))\n            {\n                Messaging.Broadcast<IAudibleSirenResponder>(_entity.gameObject, (o) => o.OnSoundStay(aspect));\n            }\n            else\n            {\n                Messaging.Execute<IAudibleSirenResponder>(this.gameObject, (o) => o.OnSoundStay(aspect));\n            }\n        }\n\n        public void SignalExitSiren(IAspect aspect)\n        {\n            var audible = aspect as AudibleAspect;\n            if (object.ReferenceEquals(audible, null) || _activeSirens == null || !_activeSirens.Contains(audible)) return;\n            \n            _activeSirens.Remove(audible);\n\n            if(_activeSirens.Count == 0)\n            {\n                this.OnSensorSleep();\n            }\n\n            if (_signalEntity && !object.ReferenceEquals(_entity, null))\n            {\n                Messaging.Broadcast<IAudibleSirenResponder>(_entity.gameObject, (o) => o.OnSoundExit(aspect));\n            }\n            else\n            {\n                Messaging.Execute<IAudibleSirenResponder>(this.gameObject, (o) => o.OnSoundExit(aspect));\n            }\n        }\n\n        #endregion\n\n        #region Sensor Interface\n\n        public override bool ConcernedWith(UnityEngine.Object obj)\n        {\n            if (obj is AudibleAspect)\n            {\n                return this.ConcernedWith(obj as AudibleAspect);\n            }\n            else\n            {\n                var go = GameObjectUtil.GetGameObjectFromSource(obj);\n                if (go == null) return false;\n                using (var set = com.spacepuppy.Collections.TempCollection.GetSet<AudibleAspect>())\n                {\n                    go.FindComponents<AudibleAspect>(set);\n                    var e = set.GetEnumerator();\n                    while (e.MoveNext())\n                    {\n                        if (this.ConcernedWith(e.Current))\n                            return true;\n                    }\n                    return false;\n                }\n            }\n        }\n        private bool ConcernedWith(AudibleAspect aspect)\n        {\n            if (aspect == null) return false;\n            if (!aspect.isActiveAndEnabled) return false;\n            if (_aspectLayerMask != -1 && !aspect.gameObject.IntersectsLayerMask(_aspectLayerMask)) return false;\n            if (!_aspectTagMask.Intersects(aspect)) return false;\n            if (!_canDetectSelf && aspect.entityRoot == this.entityRoot) return false;\n\n            return true;\n        }\n\n        public override bool SenseAny(Func<IAspect, bool> p = null)\n        {\n            if (_activeSirens == null || _activeSirens.Count == 0) return false;\n\n            if(p != null)\n            {\n                var e = _activeSirens.GetEnumerator();\n                while(e.MoveNext())\n                {\n                    if (p(e.Current)) return true;\n                }\n                return false;\n            }\n            else\n            {\n                return true;\n            }\n        }\n\n        public override bool Visible(IAspect aspect)\n        {\n            return _activeSirens != null && aspect is AudibleAspect && _activeSirens.Contains(aspect as AudibleAspect);\n        }\n\n        public override IAspect Sense(Func<IAspect, bool> p = null)\n        {\n            if (_activeSirens == null || _activeSirens.Count == 0) return null;\n\n            var e = _activeSirens.GetEnumerator();\n            while (e.MoveNext())\n            {\n                if (p == null || p(e.Current)) return e.Current;\n            }\n            return null;\n        }\n\n        public override IEnumerable<IAspect> SenseAll(Func<IAspect, bool> p = null)\n        {\n            if (_activeSirens == null || _activeSirens.Count == 0) yield break;\n\n            var e = _activeSirens.GetEnumerator();\n            while (e.MoveNext())\n            {\n                if (p == null || p(e.Current)) yield return e.Current;\n            }\n        }\n\n        public override int SenseAll(ICollection<IAspect> lst, Func<IAspect, bool> p = null)\n        {\n            if (_activeSirens == null || _activeSirens.Count == 0) return 0;\n\n            var e = _activeSirens.GetEnumerator();\n            int cnt = 0;\n            while (e.MoveNext())\n            {\n                if (p == null || p(e.Current))\n                {\n                    cnt++;\n                    lst.Add(e.Current);\n                }\n            }\n            return cnt;\n        }\n\n        public override int SenseAll<T>(ICollection<T> lst, Func<T, bool> p = null)\n        {\n            if (_activeSirens == null || _activeSirens.Count == 0) return 0;\n\n            var e = _activeSirens.GetEnumerator();\n            int cnt = 0;\n            while (e.MoveNext())\n            {\n                if (e.Current is T && (p == null || p(e.Current as T)))\n                {\n                    cnt++;\n                    lst.Add(e.Current as T);\n                }\n            }\n            return cnt;\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyAI/AI/Sensors/Audible/IAudibleResponder.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.AI.Sensors.Audible\n{\n\n    public interface IAudibleResponder\n    {\n\n        /// <summary>\n        /// Occurs when a blip occurs, or when entering a siren.\n        /// </summary>\n        /// <param name=\"aspect\">The sound source.</param>\n        /// <param name=\"isSiren\">If the sound is the the beginning of a siren.</param>\n        void OnSound(IAspect aspect, bool isSiren);\n\n    }\n\n    public interface IAudibleSirenResponder : IAudibleResponder\n    {\n\n        /// <summary>\n        /// Stayed in range of a siren.\n        /// </summary>\n        /// <param name=\"aspect\">The sound source.</param>\n        void OnSoundStay(IAspect aspect);\n\n        /// <summary>\n        /// Exited the range of a siren.\n        /// </summary>\n        /// <param name=\"aspect\">The sound source.</param>\n        void OnSoundExit(IAspect aspect);\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyAI/AI/Sensors/Audible/SirenToken.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.AI.Sensors.Audible\n{\n\n    public class SirenToken : IRadicalWaitHandle\n    {\n\n        #region Fields\n\n        private AudibleAspect _aspect;\n        private bool _complete;\n        private Action<IRadicalWaitHandle> _callback;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public SirenToken(AudibleAspect aspect)\n        {\n            if (object.ReferenceEquals(aspect, null)) throw new System.ArgumentNullException(\"aspect\");\n            _aspect = aspect;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public AudibleAspect Aspect\n        {\n            get { return _aspect; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public void SignalComplete()\n        {\n            if (_complete) return;\n\n            _complete = true;\n            _aspect.EndSiren();\n            if (_callback != null) _callback(this);\n        }\n\n        #endregion\n\n        #region IRadicalWaitHandle Interface\n        \n        bool IRadicalWaitHandle.Cancelled { get { return false; } }\n\n        public bool IsComplete { get { return _complete; } }\n\n        public void OnComplete(Action<IRadicalWaitHandle> callback)\n        {\n            _callback += callback;\n        }\n\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\n        {\n            yieldObject = null;\n            return !_complete;\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyAI/AI/Sensors/Collision/ColliderAspect.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.Sensors.Collision\r\n{\r\n\r\n    [RequireComponent(typeof(Collider))]\r\n    public class ColliderAspect : SPEntityComponent, IAspect\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Collider _collider;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            _collider = this.GetComponent<Collider>();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Collider Collider\r\n        {\r\n            get { return _collider; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAspect Interface\r\n\r\n        bool IAspect.IsActive\r\n        {\r\n            get { return _collider.IsActiveAndEnabled(); }\r\n        }\r\n\r\n        public float Precedence\r\n        {\r\n            get { return 0f; }\r\n        }\r\n\r\n        bool IAspect.OmniPresent\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n\r\n        public static ColliderAspect GetAspect(Collider coll)\r\n        {\r\n            if (coll == null) return null;\r\n\r\n            return coll.AddOrGetComponent<ColliderAspect>();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/Sensors/Collision/ColliderSensor.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.AI.Sensors.Collision\r\n{\r\n\r\n    [RequireCollider()]\r\n    public class ColliderSensor : ActiveSensor\r\n    {\r\n\r\n        [System.Flags()]\r\n        public enum AllowedColliderMode\r\n        {\r\n            Solid = 1,\r\n            Trigger = 2,\r\n            Both = 3\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private bool _canDetectSelf;\r\n        [SerializeField()]\r\n        [EnumFlags()]\r\n        private AllowedColliderMode _allowedColliders = AllowedColliderMode.Both;\r\n        [SerializeField()]\r\n        private LayerMask _aspectLayerMask = -1;\r\n        [SerializeField()]\r\n        private TagMask _aspectTagMask;\r\n\r\n        [SerializeField()]\r\n        [Tooltip(\"The line of sight is naive and works as from the position of this to the center of the bounds of the target collider.\")]\r\n        private bool _requiresLineOfSight;\r\n        [SerializeField()]\r\n        private LayerMask _lineOfSightMask;\r\n\r\n\r\n        [System.NonSerialized()]\r\n        private HashSet<Collider> _intersectingColliders = new HashSet<Collider>();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            _intersectingColliders.Clear();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool CanDetectSelf\r\n        {\r\n            get { return _canDetectSelf; }\r\n            set { _canDetectSelf = value; }\r\n        }\r\n        public AllowedColliderMode AllowedColliders\r\n        {\r\n            get { return _allowedColliders; }\r\n            set { _allowedColliders = value; }\r\n        }\r\n        public LayerMask AspectLayerMask\r\n        {\r\n            get { return _aspectLayerMask; }\r\n            set { _aspectLayerMask = value; }\r\n        }\r\n        public TagMask AspectTagMask\r\n        {\r\n            get { return _aspectTagMask; }\r\n        }\r\n\r\n        public bool RequiresLineOfSight\r\n        {\r\n            get { return _requiresLineOfSight; }\r\n            set { _requiresLineOfSight = value; }\r\n        }\r\n\r\n        public LayerMask LineOfSightMask\r\n        {\r\n            get { return _lineOfSightMask; }\r\n            set { _lineOfSightMask = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected void OnTriggerEnter(Collider coll)\r\n        {\r\n            if (!this.ConcernedWith(coll)) return;\r\n\r\n            bool none = _intersectingColliders.Count == 0;\r\n            if(_intersectingColliders.Add(coll))\r\n            {\r\n                if (this.HasSensedAspectListeners)\r\n                {\r\n                    this.OnSensedAspect(ColliderAspect.GetAspect(coll));\r\n                }\r\n                if(none)\r\n                {\r\n                    this.OnSensorAlert();\r\n                }\r\n            }\r\n        }\r\n\r\n        protected void OnTriggerExit(Collider coll)\r\n        {\r\n            if(_intersectingColliders.Remove(coll) && _intersectingColliders.Count == 0)\r\n            {\r\n                this.OnSensorSleep();\r\n            }\r\n        }\r\n\r\n        private bool ConcernedWith(Collider coll)\r\n        {\r\n            if (coll == null) return false;\r\n            var mode = (coll.isTrigger) ? AllowedColliderMode.Trigger : AllowedColliderMode.Solid;\r\n            if ((_allowedColliders & mode) == 0) return false;\r\n            if (_aspectLayerMask != -1 && !coll.gameObject.IntersectsLayerMask(_aspectLayerMask)) return false;\r\n            if (!_aspectTagMask.Intersects(coll)) return false;\r\n\r\n            if (!_canDetectSelf)\r\n            {\r\n                var root = coll.FindRoot();\r\n                if (root == this.entityRoot) return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        protected bool IsLineOfSight(Collider coll)\r\n        {\r\n            var v = coll.GetCenter() - this.transform.position;\r\n            //RaycastHit hit;\r\n            //if(Physics.Raycast(this.transform.position, v, out hit, v.magnitude, _lineOfSightMask))\r\n            //{\r\n            //    return (hit.collider == coll);\r\n            //}\r\n            using (var lst = com.spacepuppy.Collections.TempCollection.GetList<RaycastHit>())\r\n            {\r\n                int cnt = PhysicsUtil.RaycastAll(this.transform.position, v, lst, v.magnitude, _lineOfSightMask);\r\n                if(cnt > 0)\r\n                {\r\n                    var otherRoot = coll.FindRoot();\r\n                    for (int i = 0; i < cnt; i++)\r\n                    {\r\n                        //we ignore ourself\r\n                        var r = lst[i].collider.FindRoot();\r\n                        if (r != otherRoot && r != this.entityRoot) return false;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Sensor Interface\r\n\r\n        public override bool ConcernedWith(UnityEngine.Object obj)\r\n        {\r\n            if(obj is Collider)\r\n            {\r\n                return this.ConcernedWith(obj as Collider);\r\n            }\r\n            else\r\n            {\r\n                var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n                if (go == null) return false;\r\n                using (var set = com.spacepuppy.Collections.TempCollection.GetSet<Collider>())\r\n                {\r\n                    go.FindComponents<Collider>(set);\r\n                    var e = set.GetEnumerator();\r\n                    while(e.MoveNext())\r\n                    {\r\n                        if (this.ConcernedWith(e.Current))\r\n                            return true;\r\n                    }\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n\r\n        public override bool SenseAny(System.Func<IAspect, bool> p = null)\r\n        {\r\n            if(p == null && !_requiresLineOfSight)\r\n            {\r\n                return _intersectingColliders.Count > 0;\r\n            }\r\n            else\r\n            {\r\n                var e = _intersectingColliders.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    var a = ColliderAspect.GetAspect(e.Current);\r\n                    if ((p == null || p(a)) && (!_requiresLineOfSight || this.IsLineOfSight(e.Current))) return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public override bool Visible(IAspect aspect)\r\n        {\r\n            var colAspect = aspect as ColliderAspect;\r\n            if (colAspect == null) return false;\r\n\r\n            return _intersectingColliders.Contains(colAspect.Collider);\r\n        }\r\n\r\n        public override IAspect Sense(System.Func<IAspect, bool> p = null)\r\n        {\r\n            if (_intersectingColliders.Count == 0) return null;\r\n\r\n            if (p == null && !_requiresLineOfSight)\r\n                return ColliderAspect.GetAspect(_intersectingColliders.First());\r\n            else\r\n            {\r\n                var e = _intersectingColliders.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    var a = ColliderAspect.GetAspect(e.Current);\r\n                    if ((p == null || p(a)) && (!_requiresLineOfSight || this.IsLineOfSight(e.Current))) return a;\r\n                }\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public override IEnumerable<IAspect> SenseAll(System.Func<IAspect, bool> p = null)\r\n        {\r\n            if (p == null && !_requiresLineOfSight)\r\n            {\r\n                return (from c in _intersectingColliders select ColliderAspect.GetAspect(c)).ToArray();\r\n            }\r\n            else\r\n            {\r\n                return (from c in _intersectingColliders let a = ColliderAspect.GetAspect(c) where (p == null || p(a)) && (!_requiresLineOfSight || this.IsLineOfSight(c)) select a).ToArray();\r\n            }\r\n        }\r\n\r\n        public override int SenseAll(ICollection<IAspect> lst, System.Func<IAspect, bool> p = null)\r\n        {\r\n            if (lst == null) throw new System.ArgumentNullException(\"lst\");\r\n            if (lst.IsReadOnly) throw new System.ArgumentException(\"List to fill can not be read-only.\", \"lst\");\r\n            if (_intersectingColliders.Count == 0) return 0;\r\n\r\n            if(p == null && !_requiresLineOfSight)\r\n            {\r\n                var e = _intersectingColliders.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    lst.Add(ColliderAspect.GetAspect(e.Current));\r\n                }\r\n                return _intersectingColliders.Count;\r\n            }\r\n            else\r\n            {\r\n                var e = _intersectingColliders.GetEnumerator();\r\n                int cnt = 0;\r\n                while(e.MoveNext())\r\n                {\r\n                    var a = ColliderAspect.GetAspect(e.Current);\r\n                    if((p == null || p(a)) && (!_requiresLineOfSight || this.IsLineOfSight(e.Current)))\r\n                    {\r\n                        lst.Add(a);\r\n                        cnt++;\r\n                    }\r\n                }\r\n                return cnt;\r\n            }\r\n        }\r\n\r\n        public override int SenseAll<T>(ICollection<T> lst, System.Func<T, bool> p = null)\r\n        {\r\n            if (lst == null) throw new System.ArgumentNullException(\"lst\");\r\n            if (lst.IsReadOnly) throw new System.ArgumentException(\"List to fill can not be read-only.\", \"lst\");\r\n            if (_intersectingColliders.Count == 0) return 0;\r\n\r\n            if (p == null && !_requiresLineOfSight)\r\n            {\r\n                int cnt = 0;\r\n                var e = _intersectingColliders.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    var a = ColliderAspect.GetAspect(e.Current);\r\n                    var o = ObjUtil.GetAsFromSource<T>(a);\r\n                    if(o != null)\r\n                    {\r\n                        lst.Add(o);\r\n                        cnt++;\r\n                    }\r\n                }\r\n                return cnt;\r\n            }\r\n            else\r\n            {\r\n                var e = _intersectingColliders.GetEnumerator();\r\n                int cnt = 0;\r\n                while (e.MoveNext())\r\n                {\r\n                    var a = ColliderAspect.GetAspect(e.Current);\r\n                    var o = ObjUtil.GetAsFromSource<T>(a);\r\n                    if ((p == null || p(o)) && (!_requiresLineOfSight || this.IsLineOfSight(e.Current)))\r\n                    {\r\n                        lst.Add(e.Current as T);\r\n                        cnt++;\r\n                    }\r\n                }\r\n                return cnt;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/Sensors/Collision/RaycastSensor.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.Sensors.Collision\r\n{\r\n    public class RaycastSensor : Sensor\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private CartesianAxis _axis;\r\n        [SerializeField()]\r\n        [MinRange(0f)]\r\n        private float _distance = 1f;\r\n        [SerializeField()]\r\n        [MinRange(0f)]\r\n        [Tooltip(\"A radius greater than 0 will cast as a sphere. Note that testing visibility with a sphere cast can be very expensive, especially if inifinite distance.\")]\r\n        private float _radius;\r\n        [SerializeField()]\r\n        [Tooltip(\"When Sense is called should all overlaps be returned. Note this is MUCH slower, especially for rays of infinite distance.\")]\r\n        private bool _getAll;\r\n        [SerializeField()]\r\n        private LayerMask _layers = -1;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public CartesianAxis Axis\r\n        {\r\n            get { return _axis; }\r\n            set { _axis = value; }\r\n        }\r\n\r\n        public float Distance\r\n        {\r\n            get { return _distance; }\r\n            set { _distance = Mathf.Clamp(value, 0f, float.PositiveInfinity); }\r\n        }\r\n\r\n        public float Radius\r\n        {\r\n            get { return _radius; }\r\n            set { _radius = Mathf.Clamp(value, 0f, float.PositiveInfinity); }\r\n        }\r\n\r\n        public bool GetAll\r\n        {\r\n            get { return _getAll; }\r\n            set { _getAll = value; }\r\n        }\r\n\r\n        public LayerMask LayerMask\r\n        {\r\n            get { return _layers; }\r\n            set { _layers = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private Collider GetFirstHit()\r\n        {\r\n            var t = this.transform;\r\n            var ray = new Ray(t.position, t.GetAxis(_axis));\r\n            RaycastHit hit;\r\n            if (_radius > 0f)\r\n            {\r\n                if (Physics.SphereCast(ray, _radius, out hit, _distance, _layers))\r\n                {\r\n                    return hit.collider;\r\n                }\r\n                else\r\n                {\r\n                    return null;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (Physics.Raycast(ray, out hit, _distance, _layers))\r\n                {\r\n                    return hit.collider;\r\n                }\r\n                else\r\n                {\r\n                    return null;\r\n                }\r\n            }\r\n        }\r\n\r\n        private RaycastHit[] GetAllHits()\r\n        {\r\n            var t = this.transform;\r\n            var ray = new Ray(t.position, t.GetAxis(_axis));\r\n            if (_radius > 0f)\r\n            {\r\n                return Physics.SphereCastAll(ray, _radius, _distance, _layers);\r\n            }\r\n            else\r\n            {\r\n                return Physics.RaycastAll(ray, _distance, _layers);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Sensor Interface\r\n\r\n        public override bool ConcernedWith(UnityEngine.Object obj)\r\n        {\r\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n            if (go == null) return false;\r\n            if (!go.IntersectsLayerMask(_layers)) return false;\r\n\r\n            return true;\r\n        }\r\n\r\n        public override bool SenseAny(System.Func<IAspect, bool> p = null)\r\n        {\r\n            var t = this.transform;\r\n            var ray = new Ray(t.position, t.GetAxis(_axis));\r\n\r\n            if(p == null)\r\n            {\r\n                if (_radius > 0f)\r\n                {\r\n                    return Physics.SphereCast(ray, _radius, _distance, _layers);\r\n                }\r\n                else\r\n                {\r\n                    return Physics.Raycast(ray, _distance, _layers);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                RaycastHit[] arr;\r\n                if (_radius > 0f)\r\n                {\r\n                    arr = Physics.SphereCastAll(ray, _radius, _distance, _layers);\r\n                }\r\n                else\r\n                {\r\n                    arr = Physics.SphereCastAll(ray, _distance, _layers);\r\n                }\r\n\r\n                for(int i = 0; i < arr.Length; i++)\r\n                {\r\n                    var a = ColliderAspect.GetAspect(arr[i].collider);\r\n                    if (p(a)) return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public override IAspect Sense(System.Func<IAspect, bool> p = null)\r\n        {\r\n            if(p == null)\r\n            {\r\n                var hit = this.GetFirstHit();\r\n                return (hit != null) ? ColliderAspect.GetAspect(hit) : null;\r\n            }\r\n            else\r\n            {\r\n                return this.SenseAll(p).FirstOrDefault();\r\n            }\r\n        }\r\n\r\n        public override IEnumerable<IAspect> SenseAll(System.Func<IAspect, bool> p = null)\r\n        {\r\n            if(_getAll)\r\n            {\r\n                var hits = this.GetAllHits();\r\n                if(p == null)\r\n                {\r\n                    return (from h in hits select ColliderAspect.GetAspect(h.collider) as IAspect);\r\n                }\r\n                else\r\n                {\r\n                    return (from h in hits let a = ColliderAspect.GetAspect(h.collider) as IAspect where p(a) select a);\r\n                }\r\n            }\r\n            else if(p == null)\r\n            {\r\n                var hit = this.GetFirstHit();\r\n                return (hit != null) ? new IAspect[] { ColliderAspect.GetAspect(hit) } : Enumerable.Empty<IAspect>();\r\n            }\r\n            else\r\n            {\r\n                var hits = this.GetAllHits();\r\n                var hit = (from h in hits let a = ColliderAspect.GetAspect(h.collider) as IAspect where p(a) select a).FirstOrDefault();\r\n                return (hit != null) ? new IAspect[] { hit } : Enumerable.Empty<IAspect>();\r\n            }\r\n        }\r\n\r\n        public override int SenseAll(ICollection<IAspect> lst, System.Func<IAspect, bool> p = null)\r\n        {\r\n            if (lst == null) throw new System.ArgumentNullException(\"lst\");\r\n            if (lst.IsReadOnly) throw new System.ArgumentException(\"List to fill can not be read-only.\", \"lst\");\r\n\r\n            if(_getAll)\r\n            {\r\n                var hits = this.GetAllHits();\r\n                if (p == null)\r\n                {\r\n                    foreach(var h in hits)\r\n                    {\r\n                        lst.Add(ColliderAspect.GetAspect(h.collider));\r\n                    }\r\n                    return hits.Length;\r\n                }\r\n                else\r\n                {\r\n                    int cnt = 0;\r\n                    IAspect a;\r\n                    foreach(var h in hits)\r\n                    {\r\n                        a = ColliderAspect.GetAspect(h.collider);\r\n                        if(p(a))\r\n                        {\r\n                            lst.Add(a);\r\n                            cnt++;\r\n                        }\r\n                    }\r\n                    return cnt;\r\n                }\r\n            }\r\n            else if(p == null)\r\n            {\r\n                var hit = this.GetFirstHit();\r\n                if(hit != null)\r\n                {\r\n                    lst.Add(ColliderAspect.GetAspect(hit));\r\n                    return 1;\r\n                }\r\n                else\r\n                {\r\n                    return 0;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var hits = this.GetAllHits();\r\n                var hit = (from h in hits let a = ColliderAspect.GetAspect(h.collider) as IAspect where p(a) select a).FirstOrDefault();\r\n                if (hit != null)\r\n                {\r\n                    lst.Add(hit);\r\n                    return 1;\r\n                }\r\n                else\r\n                {\r\n                    return 0;\r\n                }\r\n            }\r\n        }\r\n\r\n        public override int SenseAll<T>(ICollection<T> lst, System.Func<T, bool> p = null)\r\n        {\r\n            if (lst == null) throw new System.ArgumentNullException(\"lst\");\r\n            if (lst.IsReadOnly) throw new System.ArgumentException(\"List to fill can not be read-only.\", \"lst\");\r\n            \r\n            int cnt = lst.Count;\r\n            using (var tc = com.spacepuppy.Collections.TempCollection.GetList<IAspect>())\r\n            {\r\n\r\n                if (this.SenseAll(tc, null) > 0)\r\n                {\r\n                    var e = tc.GetEnumerator();\r\n                    if (p == null)\r\n                    {\r\n                        while (e.MoveNext())\r\n                        {\r\n                            if (e.Current is T) lst.Add(e.Current as T);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        while (e.MoveNext())\r\n                        {\r\n                            if (e.Current is T && p(e.Current as T)) lst.Add(e.Current as T);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            return lst.Count - cnt;\r\n        }\r\n\r\n        public override bool Visible(IAspect aspect)\r\n        {\r\n            var colAspect = aspect as ColliderAspect;\r\n            if (colAspect == null || colAspect.Collider == null) return false;\r\n\r\n            if(_radius > 0f)\r\n            {\r\n                var c = colAspect.Collider;\r\n                var hits = this.GetAllHits();\r\n                foreach(var h in hits)\r\n                {\r\n                    if (h.collider == c) return true;\r\n                }\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                var t = this.transform;\r\n                var ray = new Ray(t.position, t.GetAxis(_axis));\r\n                RaycastHit hit;\r\n                return colAspect.Collider.Raycast(ray, out hit, _distance);\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/Sensors/CompositeSensor.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.Sensors\r\n{\r\n\r\n    public class CompositeSensor : Sensor, IEnumerable<Sensor>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private bool _mustBeVisibleByAll;\r\n\r\n        [System.NonSerialized()]\r\n        private Sensor[] _sensors;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnStartOrEnable()\r\n        {\r\n            base.OnStartOrEnable();\r\n\r\n            this.SyncChildSensors();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void SyncChildSensors()\r\n        {\r\n            //_sensors = (from c in this.GetAllChildrenAndSelf() from s in c.GetComponents<Sensor>() where !object.ReferenceEquals(s, this) select s).ToArray();\r\n            using (var lst = TempCollection.GetList<Sensor>())\r\n            {\r\n                this.GetComponentsInChildren<Sensor>(false, lst);\r\n                for(int i = 0; i < lst.Count; i++)\r\n                {\r\n                    if(lst[i] == this)\r\n                    {\r\n                        lst.RemoveAt(i);\r\n                        i--;\r\n                    }\r\n                }\r\n                _sensors = lst.ToArray();\r\n            }\r\n        }\r\n\r\n        public bool Contains(Sensor sensor)\r\n        {\r\n            if (_sensors == null) return false;\r\n\r\n            return System.Array.IndexOf(_sensors, sensor) >= 0;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Sensor Interface\r\n\r\n        public override bool ConcernedWith(UnityEngine.Object obj)\r\n        {\r\n            if (_sensors == null) this.SyncChildSensors();\r\n            if (_sensors.Length == 0) return false;\r\n\r\n            if (_mustBeVisibleByAll)\r\n            {\r\n                for (int i = 0; i < _sensors.Length; i++)\r\n                {\r\n                    if (!_sensors[i].ConcernedWith(obj)) return false;\r\n                }\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                for(int i = 0; i < _sensors.Length; i++)\r\n                {\r\n                    if (_sensors[i].ConcernedWith(obj)) return true;\r\n                }\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public override bool SenseAny(System.Func<IAspect, bool> p = null)\r\n        {\r\n            if (_sensors == null) this.SyncChildSensors();\r\n            if (_sensors.Length == 0) return false;\r\n\r\n            if(_mustBeVisibleByAll && _sensors.Length > 1)\r\n            {\r\n                using (var set = com.spacepuppy.Collections.TempCollection.GetSet<IAspect>())\r\n                {\r\n                    _sensors[0].SenseAll(set, p);\r\n                    var e = set.GetEnumerator();\r\n                    while(e.MoveNext())\r\n                    {\r\n                        int cnt = 1;\r\n                        for (int i = 1; i < _sensors.Length; i++)\r\n                        {\r\n                            if (!_sensors[i].Visible(e.Current)) cnt++;\r\n                        }\r\n                        if (cnt == _sensors.Length) return true;\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                for (int i = 0; i < _sensors.Length; i++)\r\n                {\r\n                    if (_sensors[i].SenseAny(p)) return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public override IAspect Sense(System.Func<IAspect, bool> p = null)\r\n        {\r\n            if (_sensors == null) this.SyncChildSensors();\r\n            if (_sensors.Length == 0) return null;\r\n\r\n            if (_mustBeVisibleByAll && _sensors.Length > 1)\r\n            {\r\n                using (var set = com.spacepuppy.Collections.TempCollection.GetSet<IAspect>())\r\n                {\r\n                    _sensors[0].SenseAll(set, p);\r\n                    var e = set.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        int cnt = 1;\r\n                        for (int i = 1; i < _sensors.Length; i++)\r\n                        {\r\n                            if (!_sensors[i].Visible(e.Current)) cnt++;\r\n                        }\r\n                        if (cnt == _sensors.Length) return e.Current;\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                for (int i = 0; i < _sensors.Length; i++)\r\n                {\r\n                    var a = _sensors[i].Sense(p);\r\n                    if (a != null) return a;\r\n                }\r\n            }\r\n            return null;\r\n        }\r\n\r\n        public override IEnumerable<IAspect> SenseAll(System.Func<IAspect, bool> p = null)\r\n        {\r\n            if (_sensors == null) this.SyncChildSensors();\r\n\r\n            if (_sensors.Length == 0)\r\n                return Enumerable.Empty<IAspect>();\r\n            else if (_sensors.Length == 1)\r\n                return _sensors[0].SenseAll(p);\r\n            else\r\n            {\r\n                if (_mustBeVisibleByAll && _sensors.Length > 1)\r\n                {\r\n                    using (var set = com.spacepuppy.Collections.TempCollection.GetSet<IAspect>())\r\n                    using(var results = com.spacepuppy.Collections.TempCollection.GetSet<IAspect>())\r\n                    {\r\n                        _sensors[0].SenseAll(set, p);\r\n                        var e = set.GetEnumerator();\r\n                        while (e.MoveNext())\r\n                        {\r\n                            int cnt = 1;\r\n                            for (int i = 1; i < _sensors.Length; i++)\r\n                            {\r\n                                if (!_sensors[i].Visible(e.Current)) cnt++;\r\n                            }\r\n                            if (cnt == _sensors.Length) results.Add(e.Current);\r\n                        }\r\n                        return results.ToArray();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    return (from s in _sensors from a in s.SenseAll(p) select a).Distinct();\r\n                }\r\n            }\r\n        }\r\n\r\n        public override int SenseAll(ICollection<IAspect> lst, System.Func<IAspect, bool> p = null)\r\n        {\r\n            if (lst == null) throw new System.ArgumentNullException(\"lst\");\r\n            if (lst.IsReadOnly) throw new System.ArgumentException(\"List to fill can not be read-only.\", \"lst\");\r\n            if (_sensors == null) this.SyncChildSensors();\r\n            if (_sensors.Length == 0) return 0;\r\n            \r\n            if (_mustBeVisibleByAll && _sensors.Length > 1)\r\n            {\r\n                using (var set = com.spacepuppy.Collections.TempCollection.GetSet<IAspect>())\r\n                {\r\n                    int resultCnt = 0;\r\n                    _sensors[0].SenseAll(set, p);\r\n                    var e = set.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        int cnt = 1;\r\n                        for (int i = 1; i < _sensors.Length; i++)\r\n                        {\r\n                            if (!_sensors[i].Visible(e.Current)) cnt++;\r\n                        }\r\n                        if (cnt == _sensors.Length)\r\n                        {\r\n                            resultCnt++;\r\n                            lst.Add(e.Current);\r\n                        }\r\n                    }\r\n                    return resultCnt;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                /*\r\n                //todo - make distinct\r\n                int cnt = 0;\r\n                for (int i = 0; i < _sensors.Length; i++)\r\n                {\r\n                    cnt += _sensors[i].SenseAll(lst, p);\r\n                }\r\n                return cnt;\r\n                */\r\n                using (var set = TempCollection.GetSet<IAspect>())\r\n                {\r\n                    for (int i = 0; i < _sensors.Length; i++)\r\n                    {\r\n                        _sensors[i].SenseAll(set, p);\r\n                    }\r\n\r\n                    var e = set.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        lst.Add(e.Current);\r\n                    }\r\n                    return set.Count;\r\n                }\r\n            }\r\n        }\r\n\r\n        public override int SenseAll<T>(ICollection<T> lst, System.Func<T, bool> p = null)\r\n        {\r\n            if (lst == null) throw new System.ArgumentNullException(\"lst\");\r\n            if (lst.IsReadOnly) throw new System.ArgumentException(\"List to fill can not be read-only.\", \"lst\");\r\n            if (_sensors == null) this.SyncChildSensors();\r\n            if (_sensors.Length == 0) return 0;\r\n\r\n            if (_mustBeVisibleByAll && _sensors.Length > 1)\r\n            {\r\n                using (var set = com.spacepuppy.Collections.TempCollection.GetSet<T>())\r\n                {\r\n                    int resultCnt = 0;\r\n                    _sensors[0].SenseAll<T>(set, p);\r\n                    var e = set.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        int cnt = 1;\r\n                        for (int i = 1; i < _sensors.Length; i++)\r\n                        {\r\n                            if (!_sensors[i].Visible(e.Current)) cnt++;\r\n                        }\r\n                        if (cnt == _sensors.Length)\r\n                        {\r\n                            resultCnt++;\r\n                            lst.Add(e.Current);\r\n                        }\r\n                    }\r\n                    return resultCnt;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                /*\r\n                //todo - make distinct\r\n                int cnt = 0;\r\n                for (int i = 0; i < _sensors.Length; i++)\r\n                {\r\n                    cnt += _sensors[i].SenseAll<T>(lst, p);\r\n                }\r\n                return cnt;\r\n                */\r\n                using (var set = TempCollection.GetSet<T>())\r\n                {\r\n                    for(int i = 0; i < _sensors.Length; i++)\r\n                    {\r\n                        _sensors[i].SenseAll<T>(set, p);\r\n                    }\r\n\r\n                    var e = set.GetEnumerator();\r\n                    while(e.MoveNext())\r\n                    {\r\n                        lst.Add(e.Current);\r\n                    }\r\n                    return set.Count;\r\n                }\r\n            }\r\n        }\r\n\r\n        public override bool Visible(IAspect aspect)\r\n        {\r\n            if (_sensors == null) this.SyncChildSensors();\r\n            if (_sensors.Length == 0) return false;\r\n\r\n            if (_mustBeVisibleByAll && _sensors.Length > 1)\r\n            {\r\n                for (int i = 0; i < _sensors.Length; i++)\r\n                {\r\n                    if (!_sensors[i].Visible(aspect)) return false;\r\n                }\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                for (int i = 0; i < _sensors.Length; i++)\r\n                {\r\n                    if (_sensors[i].Visible(aspect)) return true;\r\n                }\r\n            }\r\n                \r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public IEnumerator<Sensor> GetEnumerator()\r\n        {\r\n            return (_sensors != null) ? (_sensors as IEnumerable<Sensor>).GetEnumerator() : System.Linq.Enumerable.Empty<Sensor>().GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/Sensors/IAspect.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.AI.Sensors\r\n{\r\n\r\n    public interface IAspect : IGameObjectSource\r\n    {\r\n\r\n        bool IsActive { get; }\r\n\r\n        float Precedence { get; }\r\n\r\n        SPEntity Entity { get; }\r\n\r\n        bool OmniPresent { get; }\r\n\r\n    }\r\n\r\n    public abstract class AbstractAspect : SPEntityComponent, IAspect\r\n    {\r\n        \r\n        #region IAspect Interface\r\n\r\n        public virtual bool IsActive\r\n        {\r\n            get { return this.isActiveAndEnabled; }\r\n        }\r\n\r\n        public abstract float Precedence\r\n        {\r\n            get;\r\n            set;\r\n        }\r\n\r\n        public abstract bool OmniPresent\r\n        {\r\n            get;\r\n        }\r\n        \r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/Sensors/Sensor.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.Sensors\r\n{\r\n\r\n    public abstract class Sensor : SPEntityComponent\r\n    {\r\n\r\n        #region Fields\r\n        \r\n        [System.NonSerialized()]\r\n        private CompositeSensor _compositeSensorParent;\r\n        \r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n            \r\n            this.SyncCompositeSensorParent();\r\n        }\r\n\r\n        protected override void Start()\r\n        {\r\n            base.Start();\r\n\r\n            if (_compositeSensorParent != null && !_compositeSensorParent.Contains(this)) _compositeSensorParent.SyncChildSensors();\r\n        }\r\n\r\n        private void SyncCompositeSensorParent()\r\n        {\r\n            if (this is CompositeSensor)\r\n            {\r\n                _compositeSensorParent = null;\r\n                return;\r\n            }\r\n\r\n            _compositeSensorParent = this.GetComponent<CompositeSensor>();\r\n            if (_compositeSensorParent == null) _compositeSensorParent = this.GetComponentInParent<CompositeSensor>();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Since Sensors may filter out objects based on masks, this returns true if the sensor would even bother attempting to see a GameObject.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public abstract bool ConcernedWith(UnityEngine.Object obj);\r\n\r\n        public abstract bool SenseAny(System.Func<IAspect, bool> p = null);\r\n\r\n        public abstract bool Visible(IAspect aspect);\r\n\r\n        public abstract IAspect Sense(System.Func<IAspect, bool> p = null);\r\n\r\n        public abstract IEnumerable<IAspect> SenseAll(System.Func<IAspect, bool> p = null);\r\n\r\n        public abstract int SenseAll(ICollection<IAspect> lst, System.Func<IAspect, bool> p = null);\r\n\r\n        public abstract int SenseAll<T>(ICollection<T> lst, System.Func<T, bool> p = null) where T : class, IAspect;\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n    public abstract class ActiveSensor : Sensor\r\n    {\r\n\r\n        /// <summary>\r\n        /// Occurs if the sensor actively picks something up.\r\n        /// </summary>\r\n        public event System.EventHandler<TempEventArgs> SensedAspect;\r\n        /// <summary>\r\n        /// Occurs when a long term sensor event begins (i.e. a collider entered the sensor and is staying)\r\n        /// </summary>\r\n        public event System.EventHandler SensorAlert;\r\n        /// <summary>\r\n        /// Occurs when a long term sensor event exits (i.e. all colliders have exited the sensor)\r\n        /// </summary>\r\n        public event System.EventHandler SensorSleep;\r\n\r\n        protected bool HasSensedAspectListeners\r\n        {\r\n            get { return SensedAspect != null; }\r\n        }\r\n\r\n        protected bool HasSensorAlertListeners\r\n        {\r\n            get { return SensorSleep != null; }\r\n        }\r\n\r\n        protected bool HasSensorSleepListeners\r\n        {\r\n            get { return SensorSleep != null; }\r\n        }\r\n\r\n        protected void OnSensedAspect(IAspect aspect)\r\n        {\r\n            var d = this.SensedAspect;\r\n            if(d != null)\r\n            {\r\n                var ev = TempEventArgs.Create(aspect);\r\n                d(this, ev);\r\n                TempEventArgs.Release(ev);\r\n            }\r\n        }\r\n\r\n        protected void OnSensorAlert()\r\n        {\r\n            var d = this.SensorAlert;\r\n            if (d != null)\r\n            {\r\n                d(this, System.EventArgs.Empty);\r\n            }\r\n        }\r\n\r\n        protected void OnSensorSleep()\r\n        {\r\n            var d = this.SensorSleep;\r\n            if (d != null)\r\n            {\r\n                d(this, System.EventArgs.Empty);\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/Sensors/SensorCollection.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.Sensors\r\n{\r\n    public class SensorCollection : ICollection<Sensor>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private List<Sensor> _lst = new List<Sensor>();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Sensor this[string name]\r\n        {\r\n            get\r\n            {\r\n                return this.GetSensor(name);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public Sensor GetSensor(string name)\r\n        {\r\n            return (from s in _lst where s.CompareName(name) select s).FirstOrDefault();\r\n        }\r\n\r\n        public IAspect Sense()\r\n        {\r\n            IAspect a;\r\n            for(int i = 0; i < _lst.Count; i++)\r\n            {\r\n                a = _lst[i].Sense();\r\n                if (a != null) return a;\r\n            }\r\n            return null;\r\n        }\r\n\r\n        public IAspect Sense(string sensorName)\r\n        {\r\n            Sensor s;\r\n            IAspect a;\r\n            for (int i = 0; i < _lst.Count; i++ )\r\n            {\r\n                s = _lst[i];\r\n                if (s.name != sensorName) continue;\r\n\r\n                a = s.Sense();\r\n                if (a != null) return a;\r\n            }\r\n            return null;\r\n        }\r\n\r\n        public IAspect Sense(params string[] sensorNames)\r\n        {\r\n            Sensor s;\r\n            IAspect a;\r\n            for (int i = 0; i < _lst.Count; i++)\r\n            {\r\n                s = _lst[i];\r\n                if (System.Array.IndexOf(sensorNames, s.name) < 0) continue;\r\n\r\n                a = s.Sense();\r\n                if (a != null) return a;\r\n            }\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets a read-only list of all the aspects that can currently be seen by all the sensors.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public IEnumerable<IAspect> SenseAll()\r\n        {\r\n            return (from s in _lst from a in s.SenseAll() select a).Distinct();\r\n        }\r\n\r\n        public IEnumerable<IAspect> SenseAll(string sensorName)\r\n        {\r\n            return (from s in _lst where s.CompareName(sensorName) from a in s.SenseAll() select a).Distinct();\r\n        }\r\n\r\n        public IEnumerable<IAspect> SenseAll(params string[] sensorNames)\r\n        {\r\n            return (from s in _lst where sensorNames.Contains(s.name) from a in s.SenseAll() select a).Distinct();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Event Handlers\r\n\r\n        private void _sensor_Destroyed(object sender, System.EventArgs e)\r\n        {\r\n            var s = sender as Sensor;\r\n            if (Object.ReferenceEquals(s, null)) return;\r\n\r\n            s.ComponentDestroyed -= _sensor_Destroyed;\r\n            _lst.Remove(s);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        public int Count\r\n        {\r\n            get { return _lst.Count; }\r\n        }\r\n\r\n        public void Add(Sensor item)\r\n        {\r\n            if (_lst.Contains(item)) return;\r\n\r\n            item.ComponentDestroyed += _sensor_Destroyed;\r\n            _lst.Add(item);\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            foreach (var s in _lst)\r\n            {\r\n                s.ComponentDestroyed -= _sensor_Destroyed;\r\n            }\r\n            _lst.Clear();\r\n        }\r\n\r\n        public bool Contains(Sensor item)\r\n        {\r\n            return _lst.Contains(item);\r\n        }\r\n\r\n        public void CopyTo(Sensor[] array, int arrayIndex)\r\n        {\r\n            _lst.CopyTo(array, arrayIndex);\r\n        }\r\n\r\n        bool ICollection<Sensor>.IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        public bool Remove(Sensor item)\r\n        {\r\n            if (_lst.Remove(item))\r\n            {\r\n                item.ComponentDestroyed -= _sensor_Destroyed;\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public System.Collections.IEnumerator GetEnumerator()\r\n        {\r\n            return _lst.GetEnumerator();\r\n        }\r\n\r\n        IEnumerator<Sensor> IEnumerable<Sensor>.GetEnumerator()\r\n        {\r\n            return _lst.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/Sensors/SensorUtil.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Collections;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.AI.Sensors\n{\n\n    public static class SensorUtil\n    {\n\n        public static System.Comparison<IAspect> SortByPrecedenceDescending\n        {\n            get\n            {\n                return PrecedenceDelegateContainer<IAspect>.PrecedenceDescending;\n            }\n        }\n\n        public static System.Comparison<IAspect> SortByPrecedenceAscending\n        {\n            get\n            {\n                return PrecedenceDelegateContainer<IAspect>.PrecedenceAscending;\n            }\n        }\n\n        public static System.Comparison<T> GetSortByPrecedenceDescending<T>() where T : class, IAspect\n        {\n            return PrecedenceDelegateContainer<T>.PrecedenceDescending;\n        }\n\n        public static System.Comparison<T> GetSortByPrecedenceAscending<T>() where T : class, IAspect\n        {\n            return PrecedenceDelegateContainer<T>.PrecedenceAscending;\n        }\n\n\n\n        public static bool AnyVisible(this Sensor sensor, IEnumerable<IAspect> aspects)\n        {\n            if (sensor == null) throw new System.ArgumentNullException(\"sensor\");\n            if (aspects == null) return false;\n\n            var e = new LightEnumerator<IAspect>(aspects);\n            while (e.MoveNext())\n            {\n                if (e.Current != null && e.Current.IsActive)\n                {\n                    if (sensor.Visible(e.Current)) return true;\n                }\n            }\n\n            return false;\n        }\n\n        public static IAspect[] SenseAll(this Sensor sensor, System.Func<IAspect, bool> predicate, System.Comparison<IAspect> sortby)\n        {\n            if (sensor == null) throw new System.ArgumentNullException(\"sensor\");\n\n            using (var lst = TempCollection.GetList<IAspect>())\n            {\n                if (sensor.SenseAll(lst, predicate) > 0)\n                {\n                    if (sortby != null) lst.Sort(sortby);\n                    return lst.ToArray();\n                }\n                else\n                {\n                    return ArrayUtil.Empty<IAspect>();\n                }\n            }\n        }\n\n        public static T[] SenseAll<T>(this Sensor sensor, System.Func<T, bool> predicate, System.Comparison<T> sortby) where T : class, IAspect\n        {\n            if (sensor == null) throw new System.ArgumentNullException(\"sensor\");\n\n            using (var lst = TempCollection.GetList<T>())\n            {\n                if (sensor.SenseAll(lst, predicate) > 0)\n                {\n                    if (sortby != null) lst.Sort(sortby);\n                    return lst.ToArray();\n                }\n                else\n                {\n                    return ArrayUtil.Empty<T>();\n                }\n            }\n        }\n\n        public static IAspect Sense(this Sensor sensor, System.Func<IAspect, bool> predicate = null, System.Comparison<IAspect> precedence = null)\n        {\n            if (sensor == null) throw new System.ArgumentNullException(\"sensor\");\n\n            if (precedence == null)\n            {\n                return sensor.Sense(predicate);\n            }\n            else\n            {\n                using (var lst = TempCollection.GetList<IAspect>())\n                {\n                    if (sensor.SenseAll(lst, predicate) > 0)\n                    {\n                        lst.Sort(precedence);\n                        return lst[0];\n                    }\n                    else\n                    {\n                        return null;\n                    }\n                }\n            }\n        }\n\n        public static T Sense<T>(this Sensor sensor, System.Func<T, bool> predicate = null, System.Comparison<T> precedence = null) where T : class, IAspect\n        {\n            if (sensor == null) throw new System.ArgumentNullException(\"sensor\");\n\n            using (var lst = TempCollection.GetList<T>())\n            {\n                if (sensor.SenseAll<T>(lst, predicate) > 0)\n                {\n                    if (precedence != null) lst.Sort(precedence);\n                    return lst[0];\n                }\n                else\n                {\n                    return null;\n                }\n            }\n        }\n\n        public static IAspect SenseHighestPrecedence(this Sensor sensor, System.Func<IAspect, bool> predicate = null)\n        {\n            if (sensor == null) throw new System.ArgumentNullException(\"sensor\");\n\n            using (var lst = TempCollection.GetList<IAspect>())\n            {\n                if (sensor.SenseAll(lst, predicate) > 0)\n                {\n                    lst.Sort(PrecedenceDelegateContainer<IAspect>.PrecedenceDescending);\n                    return lst[0];\n                }\n                else\n                {\n                    return null;\n                }\n            }\n        }\n\n        public static T SenseHighestPrecedence<T>(this Sensor sensor, System.Func<T, bool> predicate = null) where T : class, IAspect\n        {\n            if (sensor == null) throw new System.ArgumentNullException(\"sensor\");\n\n            using (var lst = TempCollection.GetList<T>())\n            {\n                if (sensor.SenseAll(lst, predicate) > 0)\n                {\n                    lst.Sort(PrecedenceDelegateContainer<T>.PrecedenceDescending);\n                    return lst[0];\n                }\n                else\n                {\n                    return null;\n                }\n            }\n        }\n\n\n\n\n\n        private static class PrecedenceDelegateContainer<T> where T : class, IAspect\n        {\n            private static System.Comparison<T> _precedenceDesc;\n            public static System.Comparison<T> PrecedenceDescending\n            {\n                get\n                {\n                    if (_precedenceDesc == null) _precedenceDesc = (a, b) =>\n                    {\n                        if (a == null) return b == null ? 0 : 1;\n                        if (b == null) return -1;\n                        return -a.Precedence.CompareTo(b.Precedence);\n                    };\n\n                    return _precedenceDesc;\n                }\n            }\n\n            private static System.Comparison<T> _precedenceAsc;\n            public static System.Comparison<T> PrecedenceAscending\n            {\n                get\n                {\n                    if (_precedenceAsc == null) _precedenceAsc = (a, b) =>\n                    {\n                        if (a == null) return b == null ? 0 : -1;\n                        if (b == null) return 1;\n                        return a.Precedence.CompareTo(b.Precedence);\n                    };\n\n                    return _precedenceAsc;\n                }\n            }\n\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyAI/AI/Sensors/Visual/OmnispectiveSensor.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.Serialization;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.AI.Sensors.Visual\r\n{\r\n\r\n    public class OmnispectiveSensor : VisualSensor\r\n    {\r\n\r\n        public override BoundingSphere GetBoundingSphere()\r\n        {\r\n            return new BoundingSphere(Vector3.zero, float.PositiveInfinity);\r\n        }\r\n\r\n        public override bool SenseAny(System.Func<IAspect, bool> p = null)\r\n        {\r\n            return VisualAspect.Pool.Any(this.GetPredicate(p));\r\n        }\r\n\r\n        public override IAspect Sense(System.Func<IAspect, bool> p = null)\r\n        {\r\n            p = this.GetPredicate(p);\r\n            return VisualAspect.Pool.Find(p);\r\n        }\r\n\r\n        public override IEnumerable<IAspect> SenseAll(System.Func<IAspect, bool> p = null)\r\n        {\r\n            p = this.GetPredicate(p);\r\n            foreach (var a in VisualAspect.Pool)\r\n            {\r\n                if (p(a)) yield return a;\r\n            }\r\n        }\r\n\r\n        public override int SenseAll(ICollection<IAspect> results, System.Func<IAspect, bool> p = null)\r\n        {\r\n            p = this.GetPredicate(p);\r\n            return VisualAspect.Pool.FindAll(results, p);\r\n        }\r\n\r\n        public override int SenseAll<T>(ICollection<T> results, System.Func<T, bool> p = null)\r\n        {\r\n            System.Func<T, bool> p2;\r\n            if (p == null)\r\n                p2 = (a) => this.Visible(a);\r\n            else\r\n                p2 = (a) => this.Visible(a) && p(a);\r\n\r\n            return VisualAspect.Pool.FindAll<T>(results, p2);\r\n        }\r\n\r\n        protected override bool TestVisibility(VisualAspect aspect)\r\n        {\r\n            if (this.RequiresLineOfSight)\r\n            {\r\n                var v = aspect.transform.position - this.transform.position;\r\n                using (var lst = com.spacepuppy.Collections.TempCollection.GetList<RaycastHit>())\r\n                {\r\n                    int cnt = PhysicsUtil.RaycastAll(this.transform.position, v, lst, v.magnitude, this.LineOfSightMask);\r\n                    for (int i = 0; i < cnt; i++)\r\n                    {\r\n                        //we ignore ourself\r\n                        var r = lst[i].collider.FindRoot();\r\n                        if (r != aspect.entityRoot && r != this.entityRoot) return false;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/Sensors/Visual/RightCylindricalVisualSensor.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.Serialization;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.Sensors.Visual\r\n{\r\n\r\n    public class RightCylindricalVisualSensor : VisualSensor\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [FormerlySerializedAs(\"Radius\")]\r\n        [MinRange(0f)]\r\n        [SerializeField()]\r\n        private float _radius = 1.0f;\r\n\r\n        [Tooltip(\"An optional radius to carve out the center.\")]\r\n        [MinRange(0f)]\r\n        [SerializeField()]\r\n        private float _innerRadius = 0.0f;\r\n\r\n        [FormerlySerializedAs(\"Height\")]\r\n        [MinRange(0f)]\r\n        [SerializeField()]\r\n        private float _height = 1.0f;\r\n\r\n        [FormerlySerializedAs(\"Angle\")]\r\n        [Range(0f, 360f)]\r\n        [SerializeField()]\r\n        private float _angle = 360.0f;\r\n\r\n        [Tooltip(\"Allows offsetting the cylinder, useful for creating a frustum like view. Line of sight is still from the position of the gameobject this is attached to.\")]\r\n        [SerializeField()]\r\n        private Vector3 _center;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Vector3 Rod { get { return this.transform.right; } }\r\n\r\n        public float Radius\r\n        {\r\n            get { return _radius; }\r\n            set { _radius = Mathf.Max(value, 0f); }\r\n        }\r\n\r\n        public float InnerRadius\r\n        {\r\n            get { return _innerRadius; }\r\n            set { _innerRadius = Mathf.Clamp(value, 0f, _radius); }\r\n        }\r\n\r\n        public float Angle\r\n        {\r\n            get { return _angle; }\r\n            set { _angle = Mathf.Clamp(value, 0f, 360f); }\r\n        }\r\n\r\n        public float Height\r\n        {\r\n            get { return _height; }\r\n            set\r\n            {\r\n                _height = Mathf.Max(value, 0f);\r\n            }\r\n        }\r\n\r\n        public Vector3 Center\r\n        {\r\n            get { return _center; }\r\n            set { _center = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public Vector3 GetCenterInWorldSpace()\r\n        {\r\n            return this.transform.position + (this.transform.rotation * _center);\r\n        }\r\n\r\n        public override BoundingSphere GetBoundingSphere()\r\n        {\r\n            Vector3 pos = this.GetCenterInWorldSpace();\r\n            double rad = (_height / 2d);\r\n            rad = System.Math.Sqrt(rad * rad + (double)(_radius * _radius));\r\n\r\n            return new BoundingSphere(pos, (float)rad);\r\n        }\r\n\r\n        protected override bool TestVisibility(VisualAspect aspect)\r\n        {\r\n            //if not in cylinder, can not see it\r\n            var halfHeight = _height / 2.0f;\r\n            var rod = this.Rod;\r\n            var center = this.GetCenterInWorldSpace();\r\n            var otherPos = aspect.transform.position;\r\n\r\n            float aspRad = aspect.Radius;\r\n            if(aspRad > MathUtil.EPSILON)\r\n            {\r\n                if (!Cylinder.ContainsSphere(center - (rod * halfHeight),\r\n                                           center + (rod * halfHeight),\r\n                                           _radius,\r\n                                           _innerRadius,\r\n                                           otherPos,\r\n                                           aspRad))\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                if (this._angle < 360.0f)\r\n                {\r\n                    var v = VectorUtil.SetLengthOnAxis(otherPos - center, rod, 0f);\r\n                    var a = Vector3.Angle(this.transform.forward, v);\r\n                    float k = 2f * Mathf.Asin(aspRad / (Mathf.Sqrt(v.sqrMagnitude + (aspRad * aspRad) / 4f))) * Mathf.Rad2Deg;\r\n                    if (a > (_angle / 2.0f) - k) return false;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (!Cylinder.ContainsPoint(center - (rod * halfHeight),\r\n                                           center + (rod * halfHeight),\r\n                                           _radius,\r\n                                           _innerRadius,\r\n                                           otherPos))\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                if (this._angle < 360.0f)\r\n                {\r\n                    var v = VectorUtil.SetLengthOnAxis(otherPos - center, rod, 0f);\r\n                    var a = Vector3.Angle(this.transform.forward, v);\r\n                    if (a > this._angle / 2.0f) return false;\r\n                }\r\n            }\r\n            \r\n            if (this.RequiresLineOfSight)\r\n            {\r\n                var v = otherPos - center;\r\n                using (var lst = com.spacepuppy.Collections.TempCollection.GetList<RaycastHit>())\r\n                {\r\n                    int cnt = PhysicsUtil.RaycastAll(this.transform.position, v, lst, v.magnitude, this.LineOfSightMask);\r\n                    for (int i = 0; i < cnt; i++)\r\n                    {\r\n                        //we ignore ourself\r\n                        var r = lst[i].collider.FindRoot();\r\n                        if (r != aspect.entityRoot && r != this.entityRoot) return false;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/Sensors/Visual/SphericalVisualSensor.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.Serialization;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.Sensors.Visual\r\n{\r\n    public class SphericalVisualSensor : VisualSensor\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [FormerlySerializedAs(\"HorizontalAngle\")]\r\n        [Range(0f, 360f)]\r\n        [SerializeField()]\r\n        private float _horizontalAngle = 360f;\r\n        [FormerlySerializedAs(\"VerticalAngle\")]\r\n        [Range(0f, 180f)]\r\n        [SerializeField()]\r\n        private float _verticalAngle = 180f;\r\n        [FormerlySerializedAs(\"Range\")]\r\n        [MinRange(0f)]\r\n        [SerializeField()]\r\n        private float _radius = 5.0f;\r\n        [Tooltip(\"An optional radius to carve out the center.\")]\r\n        [MinRange(0f)]\r\n        [SerializeField()]\r\n        private float _innerRadius = 0f;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float HorizontalAngle\r\n        {\r\n            get { return _horizontalAngle; }\r\n            set { _horizontalAngle = Mathf.Clamp(value, 0, 360f); }\r\n        }\r\n\r\n        public float VerticalAngle\r\n        {\r\n            get { return _verticalAngle; }\r\n            set { _verticalAngle = Mathf.Clamp(value, 0f, 180f); }\r\n        }\r\n\r\n        public float Radius\r\n        {\r\n            get { return _radius; }\r\n            set { _radius = value; }\r\n        }\r\n\r\n        public float InnerRadius\r\n        {\r\n            get { return _innerRadius; }\r\n            set { _innerRadius = Mathf.Clamp(value, 0f, _radius); }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override BoundingSphere GetBoundingSphere()\r\n        {\r\n            return new BoundingSphere(this.transform.position, _radius);\r\n        }\r\n\r\n        protected override bool TestVisibility(VisualAspect aspect)\r\n        {\r\n            float aspRad = aspect.Radius;\r\n            float sqrRadius = _radius * _radius;\r\n            Vector3 v = aspect.transform.position - this.transform.position;\r\n            float sqrDist = v.sqrMagnitude;\r\n\r\n            if (sqrDist - (aspRad * aspRad) > sqrRadius) return false;\r\n            if (this._innerRadius > aspRad && sqrDist < this._innerRadius * this._innerRadius) return false;\r\n\r\n            if(this._horizontalAngle < 360.0f && this._verticalAngle < 360.0f)\r\n            {\r\n                Vector3 directionOfAspectInLocalSpace = this.transform.InverseTransformDirection(v); //Quaternion.Inverse(this.transform.rotation) * v;\r\n                float a;\r\n                if (aspRad > MathUtil.EPSILON)\r\n                {\r\n                    float k = 2f * Mathf.Asin(aspRad / (Mathf.Sqrt(sqrDist + (aspRad * aspRad) / 4f))) * Mathf.Rad2Deg;\r\n                    a = VectorUtil.AngleBetween(new Vector2(1f, 0f), new Vector2(directionOfAspectInLocalSpace.z, directionOfAspectInLocalSpace.x));\r\n                    \r\n                    if (a > (this._horizontalAngle / 2f) - k)\r\n                        return false;\r\n                    a = VectorUtil.AngleBetween(new Vector2(1f, 0f), new Vector2(directionOfAspectInLocalSpace.z, directionOfAspectInLocalSpace.y));\r\n                    if (a > (this._verticalAngle / 2f) - k)\r\n                        return false;\r\n                }\r\n                else\r\n                {\r\n                    a = VectorUtil.AngleBetween(new Vector2(1f, 0f), new Vector2(directionOfAspectInLocalSpace.z, directionOfAspectInLocalSpace.x));\r\n                    if (a > this._horizontalAngle / 2f)\r\n                        return false;\r\n                    a = VectorUtil.AngleBetween(new Vector2(1f, 0f), new Vector2(directionOfAspectInLocalSpace.z, directionOfAspectInLocalSpace.y));\r\n                    if (a > this._verticalAngle / 2f)\r\n                        return false;\r\n                }\r\n\r\n            }\r\n\r\n            if(this.RequiresLineOfSight)\r\n            {\r\n                using (var lst = com.spacepuppy.Collections.TempCollection.GetList<RaycastHit>())\r\n                {\r\n                    int cnt = PhysicsUtil.RaycastAll(this.transform.position, v, lst, v.magnitude, this.LineOfSightMask);\r\n                    for(int i = 0; i < cnt; i++)\r\n                    {\r\n                        //we ignore ourself\r\n                        var r = lst[i].collider.FindRoot();\r\n                        if (r != aspect.entityRoot && r != this.entityRoot) return false;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/Sensors/Visual/TunnelVisionVisualSensor.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.Serialization;\r\nusing System.Collections;\r\n\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.Sensors.Visual\r\n{\r\n\r\n    public class TunnelVisionVisualSensor : VisualSensor\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [FormerlySerializedAs(\"Range\")]\r\n        [MinRange(0f)]\r\n        [SerializeField()]\r\n        private float _range = 5.0f;\r\n        [FormerlySerializedAs(\"Radius\")]\r\n        [MinRange(0f)]\r\n        [SerializeField()]\r\n        private float _startRadius = 1.0f;\r\n        [MinRange(0f)]\r\n        [SerializeField]\r\n        private float _endRadius = 1.0f;\r\n        \r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float Range\r\n        {\r\n            get { return _range; }\r\n            set { _range = Mathf.Max(value, 0f); }\r\n        }\r\n\r\n        public float StartRadius\r\n        {\r\n            get { return _startRadius; }\r\n            set { _startRadius = Mathf.Max(value, 0f); }\r\n        }\r\n\r\n        public float EndRadius\r\n        {\r\n            get { return _endRadius; }\r\n            set { _endRadius = Mathf.Max(value, 0f); }\r\n        }\r\n\r\n        public Vector3 Direction { get { return this.transform.forward; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override BoundingSphere GetBoundingSphere()\r\n        {\r\n            var pos = this.transform.position + this.Direction * this.Range * 0.5f;\r\n\r\n            double r1 = this.Range / 2d;\r\n            double r2 = System.Math.Max(this.StartRadius, this.EndRadius);\r\n            return new BoundingSphere(pos, (float)System.Math.Sqrt(r1 * r1 + r2 * r2));\r\n        }\r\n\r\n        protected override bool TestVisibility(VisualAspect aspect)\r\n        {\r\n            //if not in cylinder, can not see it\r\n            float aspRad = aspect.Radius;\r\n            if (aspRad > MathUtil.EPSILON)\r\n            {\r\n                if (!Cone.ContainsSphere(this.transform.position,\r\n                                       this.transform.position + this.Direction * _range,\r\n                                       _startRadius,\r\n                                       _endRadius,\r\n                                       aspect.transform.position,\r\n                                       aspRad))\r\n                {\r\n                    return false;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (!Cone.ContainsPoint(this.transform.position,\r\n                                       this.transform.position + this.Direction * _range,\r\n                                       _startRadius,\r\n                                       _endRadius,\r\n                                       aspect.transform.position))\r\n                {\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            if (this.RequiresLineOfSight)\r\n            {\r\n                var v = aspect.transform.position - this.transform.position;\r\n                using (var lst = com.spacepuppy.Collections.TempCollection.GetList<RaycastHit>())\r\n                {\r\n                    int cnt = PhysicsUtil.RaycastAll(this.transform.position, v, lst, v.magnitude, this.LineOfSightMask);\r\n                    for (int i = 0; i < cnt; i++)\r\n                    {\r\n                        //we ignore ourself\r\n                        var r = lst[i].collider.FindRoot();\r\n                        if (r != aspect.entityRoot && r != this.entityRoot) return false;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyAI/AI/Sensors/Visual/VisualAspect.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\n\r\nnamespace com.spacepuppy.AI.Sensors.Visual\r\n{\r\n    public class VisualAspect : SPEntityComponent, IAspect\r\n    {\r\n\r\n        #region Static Multiton Interface\r\n\r\n        public static readonly MultitonPool<IAspect> Pool = new MultitonPool<IAspect>();\r\n\r\n        private static readonly PointOctree<IAspect> _staticOctree = new PointOctree<IAspect>(10, (a) => a != null ? a.transform.position : Vector3.zero);\r\n        private static readonly PointOctree<IAspect> _dynamicOctree = new PointOctree<IAspect>(10, (a) => a != null ? a.transform.position : Vector3.zero);\r\n        private static readonly HashSet<VisualAspect> _omniAspects = new HashSet<VisualAspect>();\r\n\r\n        public static int GetNearby(ICollection<IAspect> coll, Vector3 pos, float radius)\r\n        {\r\n            //TODO - replace this with the octree implementation once bug fixed\r\n\r\n            int cnt = 0;\r\n\r\n            var e = Pool.GetEnumerator();\r\n            float r2 = radius * radius;\r\n            while(e.MoveNext())\r\n            {\r\n                if(e.Current.OmniPresent || (e.Current.transform.position - pos).sqrMagnitude <= r2)\r\n                {\r\n                    cnt++;\r\n                    coll.Add(e.Current);\r\n                }\r\n            }\r\n\r\n            return cnt;\r\n        }\r\n\r\n        /*\r\n         * TODO - must first bug-fix Octree to use this.\r\n         * \r\n        \r\n        public static int GetNearby(ICollection<IAspect> coll, Vector3 pos, float radius)\r\n        {\r\n            int cnt = 0;\r\n\r\n            if(_omniAspects.Count > 0)\r\n            {\r\n                var e = _omniAspects.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    coll.Add(e.Current);\r\n                    cnt++;\r\n                }\r\n            }\r\n\r\n            if(_staticOctree.Count > 0)\r\n            {\r\n                cnt += _staticOctree.GetNearby(coll, pos, radius);\r\n            }\r\n\r\n            if (_dynamicOctree.Count > 0)\r\n            {\r\n                cnt += _dynamicOctree.GetNearby(coll, pos, radius);\r\n            }\r\n\r\n            return cnt;\r\n        }\r\n\r\n        static VisualAspect()\r\n        {\r\n            GameLoopEntry.EarlyUpdate += OnUpdate;\r\n        }\r\n\r\n        private static float _timer;\r\n        private static void OnUpdate(object sender, System.EventArgs ev)\r\n        {\r\n            _timer += Time.unscaledDeltaTime;\r\n            if(_timer > 0.1f)\r\n            {\r\n                _timer = 0f;\r\n                _dynamicOctree.Resync();\r\n            }\r\n        }\r\n         */\r\n\r\n        private void CategorizeAspect()\r\n        {\r\n            Pool.AddReference(this);\r\n            //if (_omniPresent)\r\n            //{\r\n            //    _omniAspects.Add(this);\r\n            //}\r\n            //else if (_dynamic)\r\n            //{\r\n            //    _dynamicOctree.Add(this);\r\n            //}\r\n            //else\r\n            //{\r\n            //    _staticOctree.Add(this);\r\n            //}\r\n        }\r\n\r\n        private void DecategorizeAspect()\r\n        {\r\n            Pool.RemoveReference(this);\r\n            //if (_omniPresent)\r\n            //{\r\n            //    _omniAspects.Remove(this);\r\n            //}\r\n            //else if (_dynamic)\r\n            //{\r\n            //    _dynamicOctree.Remove(this);\r\n            //}\r\n            //else\r\n            //{\r\n            //    _staticOctree.Remove(this);\r\n            //}\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private float _precedence;\r\n\r\n        [SerializeField]\r\n        [MinRange(0f)]\r\n        private float _radius;\r\n\r\n        [SerializeField()]\r\n        private Color _aspectColor = Color.blue;\r\n\r\n        [SerializeField]\r\n        [Tooltip(\"This Aspect is always visible regardless.\")]\r\n        private bool _omniPresent;\r\n\r\n        [SerializeField]\r\n        [Tooltip(\"This aspect can move and therefore should have the octree updated.\")]\r\n        private bool _dynamic;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            this.CategorizeAspect();\r\n\r\n            base.OnEnable();\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            this.DecategorizeAspect();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n        \r\n        public float Radius\r\n        {\r\n            get { return _radius; }\r\n            set { _radius = value = Mathf.Max(0f, value); }\r\n        }\r\n        \r\n        public bool OmniPresent\r\n        {\r\n            get { return _omniPresent; }\r\n            set\r\n            {\r\n                if (_omniPresent == value) return;\r\n\r\n                if (this.isActiveAndEnabled)\r\n                {\r\n                    this.DecategorizeAspect();\r\n                    _omniPresent = value;\r\n                    this.CategorizeAspect();\r\n                }\r\n                else\r\n                {\r\n                    _omniPresent = value;\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool Dynamic\r\n        {\r\n            get { return _dynamic; }\r\n            set\r\n            {\r\n                if (_dynamic == value) return;\r\n\r\n                if (this.isActiveAndEnabled)\r\n                {\r\n                    this.DecategorizeAspect();\r\n                    _dynamic = value;\r\n                    if (this.isActiveAndEnabled) this.CategorizeAspect();\r\n                }\r\n                else\r\n                {\r\n                    _dynamic = value;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAspect Interface\r\n\r\n        bool IAspect.IsActive\r\n        {\r\n            get { return this.isActiveAndEnabled; }\r\n        }\r\n\r\n        public float Precedence\r\n        {\r\n            get { return _precedence; }\r\n            set { _precedence = value; }\r\n        }\r\n\r\n        public Color AspectColor\r\n        {\r\n            get { return _aspectColor; }\r\n            set { _aspectColor = value; }\r\n        }\r\n        \r\n        #endregion\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/Sensors/Visual/VisualSensor.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.Serialization;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.Sensors.Visual\r\n{\r\n    public abstract class VisualSensor : Sensor\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [FormerlySerializedAs(\"SensorColor\")]\r\n        private Color _sensorColor = Color.blue;\r\n        [SerializeField()]\r\n        [FormerlySerializedAs(\"CanDetectSelf\")]\r\n        private bool _canDetectSelf;\r\n        [SerializeField()]\r\n        [FormerlySerializedAs(\"AspectLayerMask\")]\r\n        private LayerMask _aspectLayerMask = -1;\r\n        [SerializeField()]\r\n        [FormerlySerializedAs(\"AspectTagMask\")]\r\n        private TagMask _aspectTagMask = new TagMask();\r\n\r\n        [SerializeField()]\r\n        [FormerlySerializedAs(\"RequiresLineOfSight\")]\r\n        private bool _requiresLineOfSight;\r\n        [SerializeField()]\r\n        [FormerlySerializedAs(\"LineOfSightMask\")]\r\n        [Tooltip(\"Line of sight includes a raycast to the aspect. Radii of fat aspects are not respected.\")]\r\n        private LayerMask _lineOfSightMask;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Color SensorColor\r\n        {\r\n            get { return _sensorColor; }\r\n            set { _sensorColor = value; }\r\n        }\r\n        public bool CanDetectSelf\r\n        {\r\n            get { return _canDetectSelf; }\r\n            set { _canDetectSelf = value; }\r\n        }\r\n        public LayerMask AspectLayerMask\r\n        {\r\n            get { return _aspectLayerMask; }\r\n            set { _aspectLayerMask = value; }\r\n        }\r\n        public TagMask AspectTagMask\r\n        {\r\n            get { return _aspectTagMask; }\r\n        }\r\n\r\n        public bool RequiresLineOfSight\r\n        {\r\n            get { return _requiresLineOfSight; }\r\n            set { _requiresLineOfSight = value; }\r\n        }\r\n\r\n        public LayerMask LineOfSightMask\r\n        {\r\n            get { return _lineOfSightMask; }\r\n            set { _lineOfSightMask = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private System.Func<IAspect, bool> _cachedPred;\r\n        protected System.Func<IAspect, bool> GetPredicate(System.Func<IAspect, bool> p)\r\n        {\r\n            if(p == null)\r\n            {\r\n                if (_cachedPred == null) _cachedPred = this.Visible;\r\n                return _cachedPred;\r\n            }\r\n            else\r\n            {\r\n                return (a) => this.Visible(a) && p(a);\r\n            }\r\n        }\r\n\r\n        public abstract BoundingSphere GetBoundingSphere();\r\n\r\n        public override bool ConcernedWith(UnityEngine.Object obj)\r\n        {\r\n            if(obj is VisualAspect)\r\n            {\r\n                return this.ConcernedWith(obj as VisualAspect);\r\n            }\r\n            else\r\n            {\r\n                var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n                if (go == null) return false;\r\n                using (var set = com.spacepuppy.Collections.TempCollection.GetSet<VisualAspect>())\r\n                {\r\n                    go.FindComponents<VisualAspect>(set);\r\n                    var e = set.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (this.ConcernedWith(e.Current))\r\n                            return true;\r\n                    }\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n        private bool ConcernedWith(VisualAspect vaspect)\r\n        {\r\n            if (vaspect == null) return false;\r\n            if (!vaspect.isActiveAndEnabled) return false;\r\n            if (_aspectLayerMask != -1 && !vaspect.gameObject.IntersectsLayerMask(_aspectLayerMask)) return false;\r\n            if (!_aspectTagMask.Intersects(vaspect)) return false;\r\n            if (!_canDetectSelf && vaspect.entityRoot == this.entityRoot) return false;\r\n\r\n            return true;\r\n        }\r\n\r\n        public override bool SenseAny(System.Func<IAspect, bool> p = null)\r\n        {\r\n            //return VisualAspect.Pool.Any(this.GetPredicate(p));\r\n\r\n            var sphere = this.GetBoundingSphere();\r\n            using (var lst = TempCollection.GetList<IAspect>())\r\n            {\r\n                if(VisualAspect.GetNearby(lst, sphere.position, sphere.radius) > 0)\r\n                {\r\n                    p = this.GetPredicate(p);\r\n                    for(int i = 0; i < lst.Count; i++)\r\n                    {\r\n                        if (p(lst[i])) return true;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public override IAspect Sense(System.Func<IAspect, bool> p = null)\r\n        {\r\n            //p = this.GetPredicate(p);\r\n            //return VisualAspect.Pool.Find(p);\r\n\r\n            var sphere = this.GetBoundingSphere();\r\n            using (var lst = TempCollection.GetList<IAspect>())\r\n            {\r\n                if (VisualAspect.GetNearby(lst, sphere.position, sphere.radius) > 0)\r\n                {\r\n                    p = this.GetPredicate(p);\r\n                    for (int i = 0; i < lst.Count; i++)\r\n                    {\r\n                        if (p(lst[i])) return lst[i];\r\n                    }\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public override IEnumerable<IAspect> SenseAll(System.Func<IAspect, bool> p = null)\r\n        {\r\n            //p = this.GetPredicate(p);\r\n            //foreach(var a in VisualAspect.Pool)\r\n            //{\r\n            //    if (p(a)) yield return a;\r\n            //}\r\n\r\n            var sphere = this.GetBoundingSphere();\r\n            using (var lst = TempCollection.GetList<IAspect>())\r\n            {\r\n                if (VisualAspect.GetNearby(lst, sphere.position, sphere.radius) > 0)\r\n                {\r\n                    p = this.GetPredicate(p);\r\n                    for (int i = 0; i < lst.Count; i++)\r\n                    {\r\n                        if (p(lst[i])) yield return lst[i];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public override int SenseAll(ICollection<IAspect> results, System.Func<IAspect, bool> p = null)\r\n        {\r\n            //p = this.GetPredicate(p);\r\n            //return VisualAspect.Pool.FindAll(results, p);\r\n\r\n            int cnt = 0;\r\n            var sphere = this.GetBoundingSphere();\r\n            using (var lst = TempCollection.GetList<IAspect>())\r\n            {\r\n                if (VisualAspect.GetNearby(lst, sphere.position, sphere.radius) > 0)\r\n                {\r\n                    p = this.GetPredicate(p);\r\n                    for (int i = 0; i < lst.Count; i++)\r\n                    {\r\n                        if (p(lst[i]))\r\n                        {\r\n                            results.Add(lst[i]);\r\n                            cnt++;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            return cnt;\r\n        }\r\n\r\n        public override int SenseAll<T>(ICollection<T> results, System.Func<T, bool> p = null)\r\n        {\r\n            //System.Func<T, bool> p2;\r\n            //if (p == null)\r\n            //    p2 = (a) => this.Visible(a);\r\n            //else\r\n            //    p2 = (a) => this.Visible(a) && p(a);\r\n\r\n            //return VisualAspect.Pool.FindAll<T>(lst, p2);\r\n\r\n            int cnt = 0;\r\n            var sphere = this.GetBoundingSphere();\r\n            using (var lst = TempCollection.GetList<IAspect>())\r\n            {\r\n                if (VisualAspect.GetNearby(lst, sphere.position, sphere.radius) > 0)\r\n                {\r\n                    for (int i = 0; i < lst.Count; i++)\r\n                    {\r\n                        if (lst[i] is T && this.Visible(lst[i]))\r\n                        {\r\n                            if (p != null && !p(lst[i] as T)) continue;\r\n                            results.Add(lst[i] as T);\r\n                            cnt++;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            return cnt;\r\n        }\r\n\r\n        public override bool Visible(IAspect aspect)\r\n        {\r\n            var vaspect = aspect as VisualAspect;\r\n\r\n            if (vaspect == null) return false;\r\n            if (!vaspect.isActiveAndEnabled) return false;\r\n            if (_aspectLayerMask != -1 && !aspect.gameObject.IntersectsLayerMask(_aspectLayerMask)) return false;\r\n            if (!_aspectTagMask.Intersects(vaspect)) return false;\r\n            if (!_canDetectSelf && vaspect.entityRoot == this.entityRoot) return false;\r\n            return vaspect.OmniPresent || this.TestVisibility(vaspect);\r\n        }\r\n\r\n        protected abstract bool TestVisibility(VisualAspect aspect);\r\n\r\n        #endregion\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/AI/SimpleAIStateComponent.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI\r\n{\r\n\r\n    public abstract class SimpleAIStateComponent : SPComponent, IAIState\r\n    {\r\n\r\n        #region Fields\r\n        \r\n        [SerializeField()]\r\n        private Trigger _onEnterState;\r\n        [SerializeField]\r\n        private Trigger _onExitState;\r\n\r\n        [System.NonSerialized()]\r\n        private bool _isActive;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected abstract void OnStateEntered(IAIStateMachine machine, IAIState lastState);\r\n\r\n        protected abstract void OnStateExited(IAIStateMachine machine, IAIState nextState);\r\n\r\n        protected abstract void Tick(IAIController ai);\r\n\r\n        #endregion\r\n\r\n        #region IAIState Interface\r\n\r\n        string IAINode.DisplayName\r\n        {\r\n            get\r\n            {\r\n                if (Application.isPlaying)\r\n                    return string.Format(\"[State {0}] ({1})\", this.name, (this.IsActive) ? \"active\" : \"inactive\");\r\n                else\r\n                    return string.Format(\"[State {0}]\", this.name);\r\n            }\r\n        }\r\n        \r\n        public bool IsActive { get { return _isActive; } }\r\n\r\n        public IAIStateMachine StateMachine\r\n        {\r\n            get;\r\n            private set;\r\n        }\r\n\r\n        void IAIState.Init(IAIStateMachine machine)\r\n        {\r\n            this.StateMachine = machine;\r\n            this.OnInit(machine);\r\n        }\r\n\r\n        protected virtual void OnInit(IAIStateMachine machine)\r\n        {\r\n\r\n        }\r\n\r\n        void IAIState.OnStateEntered(IAIStateMachine machine, IAIState lastState)\r\n        {\r\n            _isActive = true;\r\n            this.OnStateEntered(machine, lastState);\r\n            _onEnterState.ActivateTrigger(this, null);\r\n        }\r\n\r\n        void IAIState.OnStateExited(IAIStateMachine machine, IAIState nextState)\r\n        {\r\n            this.OnStateExited(machine, nextState);\r\n            _isActive = false;\r\n            _onExitState.ActivateTrigger(this, null);\r\n        }\r\n\r\n\r\n\r\n\r\n        ActionResult IAINode.Tick(IAIController ai)\r\n        {\r\n            if(_isActive)\r\n            {\r\n                this.Tick(ai);\r\n                return ActionResult.Waiting;\r\n            }\r\n            else\r\n            {\r\n                return ActionResult.None;\r\n            }\r\n        }\r\n\r\n        void IAINode.Reset()\r\n        {\r\n\r\n        }\r\n        \r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAI/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"SpacepuppyAI\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"SpacepuppyAI\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"3ec848e2-cc34-47f4-aa0f-74fb5274cc20\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "SpacepuppyAI/SpacepuppyAI.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{65A3DF9E-1099-40D7-ACF3-4A3989026A3D}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>com.spacepuppy</RootNamespace>\r\n    <AssemblyName>SpacepuppyUnityFramework.AI</AssemblyName>\r\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile>\r\n    </TargetFrameworkProfile>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"UnityEngine, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"AI\\AISubController.cs\" />\r\n    <Compile Include=\"AI\\AIVariableCollection.cs\" />\r\n    <Compile Include=\"AI\\AIVariableNameAttribute.cs\" />\r\n    <Compile Include=\"AI\\ComplexTarget.cs\" />\r\n    <Compile Include=\"AI\\Enums.cs\" />\r\n    <Compile Include=\"AI\\IAIController.cs\" />\r\n    <Compile Include=\"AI\\IAINode.cs\" />\r\n    <Compile Include=\"AI\\Scenario\\i_ChangeAIState.cs\" />\r\n    <Compile Include=\"AI\\Scenario\\i_SetAIVariable.cs\" />\r\n    <Compile Include=\"AI\\Scenario\\t_OnSense.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Audible\\AudibleAspect.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Audible\\AudibleSensor.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Audible\\IAudibleResponder.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Audible\\SirenToken.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Collision\\ColliderAspect.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Collision\\ColliderSensor.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\IAspect.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Collision\\RaycastSensor.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\SensorUtil.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Visual\\OmnispectiveSensor.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Visual\\RightCylindricalVisualSensor.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Visual\\SphericalVisualSensor.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Visual\\TunnelVisionVisualSensor.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Visual\\VisualAspect.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Visual\\VisualSensor.cs\" />\r\n    <Compile Include=\"AI\\AIController.cs\" />\r\n    <Compile Include=\"AI\\IAIState.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\CompositeSensor.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Sensor.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\SensorCollection.cs\" />\r\n    <Compile Include=\"AI\\IAIStateMachine.cs\" />\r\n    <Compile Include=\"AI\\SimpleAIStateComponent.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\r\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\r\n      <Name>SpacepuppyBase</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <ItemGroup />\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>mkdir $(ProjectDir)..\\Builds\\FullLibrary\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.AI.dll\" \"$(ProjectDir)..\\Builds\\FullLibrary\\SpacepuppyUnityFramework.AI.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.AI.pdb\" \"$(ProjectDir)..\\Builds\\FullLibrary\\SpacepuppyUnityFramework.AI.pdb\"</PostBuildEvent>\r\n  </PropertyGroup>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/AINodeUtil.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree\r\n{\r\n    public static class AINodeUtil\r\n    {\r\n\r\n        public static IEnumerable<IAINode> GetAllNodes(IAIActionGroup grp, bool includeGrp)\r\n        {\r\n            if (includeGrp) yield return grp;\r\n\r\n            foreach(var n in grp)\r\n            {\r\n                yield return n;\r\n\r\n                if (n is IAIActionGroup)\r\n                {\r\n                    foreach (var cn in GetAllNodes(n as IAIActionGroup, false))\r\n                    {\r\n                        yield return cn;\r\n                    }\r\n                }\r\n\r\n                if (n is IAIStateMachine)\r\n                {\r\n                    foreach (var st in (n as IAIStateMachine))\r\n                    {\r\n                        yield return st as IAINode;\r\n                        foreach (var cn in GetAllNodes(st as IAIActionGroup, false))\r\n                        {\r\n                            yield return cn;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/AITreeController.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Dynamic;\r\nusing System;\r\nusing System.Reflection;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree\r\n{\r\n\r\n    [System.Serializable()]\r\n    public class AITreeController : SPComponent, IAIController, IAIActionGroup, IAIEditorSyncActionsCallbackReceiver\r\n    {\r\n\r\n        public enum Mode\r\n        {\r\n            ChildSourced = 0,\r\n            SelfSourced = 1\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private ConfigurableAIActionGroup _loop;\r\n\r\n        [SerializeField()]\r\n        [MinRange(0.02f)]\r\n        private float _interval = 0.1f;\r\n\r\n        [SerializeField()]\r\n        private AIVariableCollection _variables;\r\n\r\n        [System.NonSerialized()]\r\n        private float _t;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            this.SyncActions();\r\n        }\r\n\r\n        protected override void OnStartOrEnable()\r\n        {\r\n            base.OnStartOrEnable();\r\n\r\n            _t = Time.time;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IAIActionGroup ActionLoop { get { return _loop; } }\r\n\r\n        public ActionGroupType ActionLoopMode\r\n        {\r\n            get { return _loop.Mode; }\r\n            set { _loop.Mode = value; }\r\n        }\r\n\r\n        public AIVariableCollection Variables { get { return _variables; } }\r\n\r\n        public float Interval\r\n        {\r\n            get { return _interval; }\r\n            set\r\n            {\r\n                _interval = Mathf.Max(0.02f, value);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void SyncActions()\r\n        {\r\n            if (_loop == null)\r\n                _loop = new ConfigurableAIActionGroup(ActionGroupType.Sequential);\r\n            _loop.SyncActions(this.gameObject, true);\r\n        }\r\n\r\n        private void Update()\r\n        {\r\n            if (_loop == null) return;\r\n\r\n            if (Time.time - _t > _interval)\r\n            {\r\n                _t = Time.time;\r\n                if (_loop.Tick(this) > ActionResult.Waiting)\r\n                {\r\n                    _loop.Reset();\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIActionGroup Interface\r\n\r\n        string IAINode.DisplayName { get { return string.Format(\"ROOT ({0})\", this.name); } }\r\n\r\n        int IAIActionGroup.ActionCount { get { return (_loop != null) ? _loop.ActionCount : 0; } }\r\n\r\n        ActionResult IAINode.Tick(IAIController ai)\r\n        {\r\n            return ActionResult.Failed;\r\n        }\r\n\r\n        void IAINode.Reset()\r\n        {\r\n            //do nothing\r\n        }\r\n\r\n        public IEnumerator<IAIAction> GetEnumerator()\r\n        {\r\n            if (_loop == null) return Enumerable.Empty<IAIAction>().GetEnumerator();\r\n            return _loop.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Components/AIActionComponent.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree.Components\r\n{\r\n    public abstract class AIActionComponent : SPComponent, IAIAction\r\n    {\r\n\r\n        private enum OperationalState\r\n        {\r\n            Inactive = 0,\r\n            Active = 1,\r\n            CompleteAndWaitingToReset = 2\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private RepeatMode _repeat = RepeatMode.Never;\r\n        [SerializeField()]\r\n        private bool _alwaysSucceed;\r\n\r\n        [System.NonSerialized()]\r\n        private ActionResult _actionState = ActionResult.None;\r\n        [System.NonSerialized()]\r\n        private OperationalState _internalState;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Return false if should cancel immediately\r\n        /// </summary>\r\n        /// <param name=\"ai\"></param>\r\n        /// <returns></returns>\r\n        protected virtual ActionResult OnStart(IAIController ai)\r\n        {\r\n            return ActionResult.None;\r\n        }\r\n\r\n        protected virtual ActionResult OnTick(IAIController ai)\r\n        {\r\n            return ActionResult.Success;\r\n        }\r\n\r\n        protected virtual void OnComplete(IAIController ai)\r\n        {\r\n\r\n        }\r\n\r\n        protected virtual void OnReset()\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIAction\r\n\r\n        public virtual string DisplayName { get { return this.GetType().Name; } }\r\n\r\n        bool IAIAction.Enabled { get { return this.isActiveAndEnabled; } }\r\n\r\n        public RepeatMode Repeat\r\n        {\r\n            get { return _repeat; }\r\n            set { _repeat = value; }\r\n        }\r\n\r\n        public bool AlwaysSucceed\r\n        {\r\n            get { return _alwaysSucceed; }\r\n            set { _alwaysSucceed = value; }\r\n        }\r\n\r\n        public ActionResult ActionState\r\n        {\r\n            get { return _actionState; }\r\n            //protected set { _actionState = value; }\r\n        }\r\n\r\n        public ActionResult Tick(IAIController ai)\r\n        {\r\n            if (_internalState == OperationalState.CompleteAndWaitingToReset)\r\n            {\r\n                this.Reset();\r\n                _actionState = this.OnStart(ai);\r\n                if (_actionState > ActionResult.Waiting) return _actionState;\r\n            }\r\n            else if(_actionState == ActionResult.None)\r\n            {\r\n                _actionState = this.OnStart(ai);\r\n                if (_actionState > ActionResult.Waiting) return _actionState;\r\n            }\r\n\r\n            _internalState = OperationalState.Active;\r\n            _actionState = this.OnTick(ai);\r\n            if (_internalState == OperationalState.Inactive)\r\n            {\r\n                //Reset was called during tick, probably by a 'ChangeState' call on a parent state machine.\r\n                //exit cleanly\r\n                _actionState = ActionResult.None;\r\n                return _actionState;\r\n            }\r\n\r\n            if(_actionState > ActionResult.Waiting)\r\n            {\r\n                _internalState = OperationalState.CompleteAndWaitingToReset;\r\n\r\n                this.OnComplete(ai);\r\n                if(_repeat != RepeatMode.Never && (int)_repeat != (int)_actionState)\r\n                {\r\n                    _actionState = ActionResult.Waiting;\r\n                }\r\n\r\n                if (_alwaysSucceed && _actionState == ActionResult.Failed)\r\n                {\r\n                    _actionState = ActionResult.Success;\r\n                }\r\n            }\r\n\r\n            return _actionState;\r\n        }\r\n\r\n        public void Reset()\r\n        {\r\n            _actionState = ActionResult.None;\r\n            _internalState = OperationalState.Inactive;\r\n            this.OnReset();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Components/AIActionLoopStateComponent.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.StateMachine;\r\n\r\nnamespace com.spacepuppy.AI.Components\r\n{\r\n    public class AIActionLoopStateComponent : SPComponent, IAIState\r\n    {\r\n\r\n        #region Events\r\n\r\n        public event System.EventHandler StateEntered;\r\n        public event System.EventHandler StateExited;\r\n\r\n        #endregion\r\n\r\n        public enum LoopMode\r\n        {\r\n            WeightedRandom = 0,\r\n            Sequential = 1,\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private LoopMode _loopMode;\r\n\r\n        [System.NonSerialized()]\r\n        private AIController _controller;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected virtual void Init()\r\n        {\r\n\r\n        }\r\n\r\n        protected virtual void OnStateEntered(IAIState lastState)\r\n        {\r\n\r\n        }\r\n\r\n        protected virtual void OnStateExited(IAIState nextState)\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIActionLoopState Interface\r\n\r\n        public AIController AI\r\n        {\r\n            get { return _controller; }\r\n        }\r\n\r\n        void IAIState.Init(AIController controller)\r\n        {\r\n            _controller = controller;\r\n            this.Init();\r\n        }\r\n\r\n        void IAIState.OnStateEntered(IAIState lastState)\r\n        {\r\n            this.OnStateEntered(lastState);\r\n            if (this.StateEntered != null) this.StateEntered(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        void IAIState.OnStateExited(IAIState nextState)\r\n        {\r\n            this.OnStateExited(nextState);\r\n            if (this.StateExited != null) this.StateExited(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Components/AIActionWeightsComponent.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils.Diminish;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree.Components\r\n{\r\n    public class AIActionWeightsComponent : SPComponent, IAIActionWeightSupplier\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private float _defaultWeight = 1f;\r\n\r\n        [SerializeField()]\r\n        private Component[] _actions;\r\n        [SerializeField()]\r\n        private DiminishingWeightOverDuration[] _weights;\r\n\r\n        [System.NonSerialized()]\r\n        private bool _valid;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            _valid = (_actions != null && _weights != null && _actions.Length > 0 && _actions.Length < _weights.Length);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIActionWeightSupplier Interface\r\n\r\n        public float GetWeight(IAIAction action)\r\n        {\r\n            if(_valid)\r\n            {\r\n                int i = System.Array.IndexOf(_actions, action);\r\n                if (i >= 0) return _weights[i].GetAdjustedWeight();\r\n                else return _defaultWeight;\r\n            }\r\n            else\r\n            {\r\n                return _defaultWeight;\r\n            }\r\n        }\r\n\r\n        public void OnActionSuccess(IAIAction action)\r\n        {\r\n            if(_valid)\r\n            {\r\n                int i = System.Array.IndexOf(_actions, action);\r\n                if (i >= 0) _weights[i].Signal();\r\n            }\r\n        }\r\n\r\n        public void OnActionFailure(IAIAction action)\r\n        {\r\n            if (_valid)\r\n            {\r\n                int i = System.Array.IndexOf(_actions, action);\r\n                if (i >= 0) _weights[i].Signal();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Components/AIStateComponent.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree.Components\r\n{\r\n\r\n    /// <summary>\r\n    /// Used with AITreeComponent\r\n    /// </summary>\r\n    public class AIStateComponent : SPComponent, IAIState, IAIActionGroup, IAIEditorSyncActionsCallbackReceiver\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private ConfigurableAIActionGroup _loop;\r\n\r\n        [SerializeField()]\r\n        private Trigger _onEnterState;\r\n\r\n        [System.NonSerialized()]\r\n        private bool _isActive;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            this.SyncActions();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IAIActionGroup Loop { get { return _loop; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void SyncActions()\r\n        {\r\n            _loop.SyncActions(this.gameObject, true);\r\n        }\r\n\r\n        protected virtual void OnStateEntered(IAIStateMachine machine, IAIState lastState)\r\n        {\r\n\r\n        }\r\n\r\n        protected virtual void OnStateExited(IAIStateMachine machine, IAIState nextState)\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIState Interface\r\n\r\n        string IAINode.DisplayName\r\n        {\r\n            get\r\n            {\r\n                if (Application.isPlaying)\r\n                    return string.Format(\"[State {0} - {1}] ({2})\", _loop.Mode, this.name, (this.IsActive) ? \"active\" : \"inactive\");\r\n                else\r\n                    return string.Format(\"[State {0} - {1}]\", _loop.Mode, this.name);\r\n            }\r\n        }\r\n\r\n        int IAIActionGroup.ActionCount { get { return _loop.ActionCount; } }\r\n\r\n        public bool IsActive { get { return _isActive; } }\r\n\r\n        public IAIStateMachine StateMachine\r\n        {\r\n            get;\r\n            private set;\r\n        }\r\n\r\n        void IAIState.Init(IAIStateMachine machine)\r\n        {\r\n            this.StateMachine = machine;\r\n        }\r\n\r\n        void IAIState.OnStateEntered(IAIStateMachine machine, IAIState lastState)\r\n        {\r\n            _isActive = true;\r\n            this.OnStateEntered(machine, lastState);\r\n            _onEnterState.ActivateTrigger(this, null);\r\n        }\r\n\r\n        void IAIState.OnStateExited(IAIStateMachine machine, IAIState nextState)\r\n        {\r\n            _loop.Reset();\r\n            this.OnStateExited(machine, nextState);\r\n            _isActive = false;\r\n        }\r\n\r\n\r\n\r\n\r\n        ActionResult IAINode.Tick(IAIController ai)\r\n        {\r\n            return _loop.Tick(ai);\r\n        }\r\n\r\n        void IAINode.Reset()\r\n        {\r\n            _loop.Reset();\r\n        }\r\n        \r\n        public IEnumerator<IAIAction> GetEnumerator()\r\n        {\r\n            if (_loop == null) return Enumerable.Empty<IAIAction>().GetEnumerator();\r\n            return _loop.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Components/AIStateMachineComponent.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.StateMachine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree.Components\r\n{\r\n    public class AIStateMachineComponent : SPComponent, IAITreeStateMachine, IAIEditorSyncActionsCallbackReceiver\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private RepeatMode _repeat;\r\n        [SerializeField()]\r\n        private bool _alwaysSucceed;\r\n\r\n        [SerializeField()]\r\n        [ListAIStates()]\r\n        private Component _defaultState;\r\n\r\n        [System.NonSerialized()]\r\n        private AITreeStateMachine _stateMachine;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public AIStateMachineComponent()\r\n        {\r\n            _stateMachine = new AITreeStateMachine(this);\r\n        }\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n            \r\n            this.SyncStates();\r\n        }\r\n\r\n        protected override void Start()\r\n        {\r\n            base.Start();\r\n\r\n            _stateMachine.Repeat = _repeat;\r\n            _stateMachine.AlwaysSucceed = _alwaysSucceed;\r\n\r\n            if(_stateMachine.Current == null)\r\n            {\r\n                var state = _defaultState as IAIState;\r\n                if (state == null || !_stateMachine.Contains(state))\r\n                {\r\n                    state = _stateMachine.FirstOrDefault();\r\n                    _defaultState = state as Component;\r\n                }\r\n                _stateMachine.ChangeState(state);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void SyncStates()\r\n        {\r\n            var state = _stateMachine.Current;\r\n            _stateMachine.ChangeState((IAIState)null);\r\n            _stateMachine.SetStateMachine(TypedStateMachine<IAIState>.CreateFromParentComponentSource(this.gameObject, false, true));\r\n            if (state != null && _stateMachine.Contains(state)) _stateMachine.ChangeState(state);\r\n        }\r\n\r\n        void IAIEditorSyncActionsCallbackReceiver.SyncActions()\r\n        {\r\n            this.SyncStates();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIAction Interface\r\n\r\n        public virtual string DisplayName { get { return string.Format(\"{0} : {1}\", _stateMachine.DisplayName, this.name); } }\r\n\r\n        bool IAIAction.Enabled { get { return this.isActiveAndEnabled; } }\r\n\r\n        public RepeatMode Repeat\r\n        {\r\n            get { return _repeat; }\r\n            set\r\n            {\r\n                _repeat = value;\r\n                _stateMachine.Repeat = value;\r\n            }\r\n        }\r\n\r\n        public bool AlwaysSucceed\r\n        {\r\n            get { return _alwaysSucceed; }\r\n            set\r\n            {\r\n                _alwaysSucceed = value;\r\n                _stateMachine.AlwaysSucceed = value;\r\n            }\r\n        }\r\n\r\n        public ActionResult ActionState\r\n        {\r\n            get { return _stateMachine.ActionState; }\r\n        }\r\n\r\n        ActionResult IAINode.Tick(IAIController ai)\r\n        {\r\n            return _stateMachine.Tick(ai);\r\n        }\r\n\r\n        void IAINode.Reset()\r\n        {\r\n            _stateMachine.Reset();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIStateMachine Interface\r\n\r\n        public event StateChangedEventHandler<IAIState> StateChanged\r\n        {\r\n            add { _stateMachine.StateChanged += value; }\r\n            remove { _stateMachine.StateChanged -= value; }\r\n        }\r\n        \r\n        public IAIState Current\r\n        {\r\n            get { return _stateMachine.Current; }\r\n        }\r\n\r\n        public bool Contains(IAIState state)\r\n        {\r\n            return _stateMachine.Contains(state);\r\n        }\r\n\r\n        public IAIState ChangeState(IAIState state)\r\n        {\r\n            return _stateMachine.ChangeState(state);\r\n        }\r\n\r\n        public IEnumerator<IAIState> GetEnumerator()\r\n        {\r\n            return _stateMachine.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _stateMachine.GetEnumerator();\r\n        }\r\n\r\n        public void GetStates(ICollection<IAIState> coll)\r\n        {\r\n            _stateMachine.GetStates(coll);\r\n        }\r\n\r\n        public void Foreach(System.Action<IAIState> callback)\r\n        {\r\n            _stateMachine.Foreach(callback);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Components/AITrapActionComponent.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree.Components\r\n{\r\n\r\n    /// <summary>\r\n    /// A conditional branch in the behaviour tree. Works similar to a_ActionGroup, only that it resolves some condition before operating the branch.\r\n    /// </summary>\r\n    public abstract class AITrapActionComponent : SPComponent, IAIAction, IAIActionGroup, IAIEditorSyncActionsCallbackReceiver\r\n    {\r\n\r\n        private enum OperationalState\r\n        {\r\n            Inactive = 0,\r\n            Active = 1,\r\n            CompleteAndWaitingToReset = 2\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private GameObjectConfigurableAIActionGroup _onSucceed;\r\n\r\n        [System.NonSerialized()]\r\n        private ActionResult _trapState;\r\n        \r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            this.SyncActions();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ActionGroupType Mode\r\n        {\r\n            get { return _onSucceed.Mode; }\r\n            set { _onSucceed.Mode = value; }\r\n        }\r\n\r\n        public ParallelPassOptions PassOptions\r\n        {\r\n            get { return _onSucceed.PassOptions; }\r\n            set\r\n            {\r\n                _onSucceed.PassOptions = value;\r\n            }\r\n        }\r\n\r\n        public GameObject ActionSequenceContainer\r\n        {\r\n            get { return _onSucceed.ActionSequenceContainer; }\r\n            set { _onSucceed.ActionSequenceContainer = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void SyncActions()\r\n        {\r\n            _onSucceed.SyncActions();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns true if the trap should evaluate its group, false if should fail.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        protected abstract ActionResult EvaluateTrap(IAIController ai);\r\n\r\n        #endregion\r\n\r\n        #region IAIAction Interface\r\n\r\n        public virtual string DisplayName\r\n        {\r\n            get\r\n            {\r\n                //return _onSucceed.DisplayName;\r\n                if (_onSucceed.ActionSequenceContainer != null)\r\n                    return string.Format(\"[Trap {0}] : {1}\", _onSucceed.Mode, _onSucceed.ActionSequenceContainer.name);\r\n                else\r\n                    return string.Format(\"[Trap {0}] : ...\", _onSucceed.Mode);\r\n            }\r\n        }\r\n\r\n        public int ActionCount { get { return _onSucceed.ActionCount; } }\r\n\r\n        bool IAIAction.Enabled { get { return this.isActiveAndEnabled; } }\r\n\r\n        public RepeatMode Repeat\r\n        {\r\n            get { return _onSucceed.Repeat; }\r\n            set { _onSucceed.Repeat = value; }\r\n        }\r\n\r\n        public bool AlwaysSucceed\r\n        {\r\n            get { return _onSucceed.AlwaysSucceed; }\r\n            set { _onSucceed.AlwaysSucceed = value; }\r\n        }\r\n\r\n        public ActionResult ActionState\r\n        {\r\n            get\r\n            {\r\n                if(_trapState == ActionResult.Success)\r\n                {\r\n                    return _onSucceed.ActionState;\r\n                }\r\n                else\r\n                {\r\n                    return _trapState;\r\n                }\r\n            }\r\n        }\r\n\r\n        ActionResult IAINode.Tick(IAIController ai)\r\n        {\r\n            switch(_trapState)\r\n            {\r\n                case ActionResult.None:\r\n                case ActionResult.Waiting:\r\n                    {\r\n                        _trapState = this.EvaluateTrap(ai);\r\n                        switch(_trapState)\r\n                        {\r\n                            case ActionResult.None:\r\n                            case ActionResult.Waiting:\r\n                                return _trapState;\r\n                            case ActionResult.Success:\r\n                                if (_onSucceed.ActionCount > 0)\r\n                                {\r\n                                    return _onSucceed.Tick(ai);\r\n                                }\r\n                                else\r\n                                {\r\n                                    return _trapState;\r\n                                }\r\n                            case ActionResult.Failed:\r\n                            default:\r\n                                return ActionResult.Failed;\r\n                        }\r\n                    }\r\n                case ActionResult.Success:\r\n                    return _onSucceed.Tick(ai);\r\n                case ActionResult.Failed:\r\n                default:\r\n                    return ActionResult.Failed;\r\n            }\r\n\r\n\r\n\r\n        }\r\n\r\n        void IAINode.Reset()\r\n        {\r\n            _trapState = ActionResult.None;\r\n            _onSucceed.Reset();\r\n        }\r\n\r\n\r\n\r\n        \r\n        public IEnumerator<IAIAction> GetEnumerator()\r\n        {\r\n            if (_onSucceed == null) return Enumerable.Empty<IAIAction>().GetEnumerator();\r\n            return _onSucceed.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Components/GameObjectConfigurableAIActionGroup.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree.Components\r\n{\r\n\r\n    [System.Serializable()]\r\n    public class GameObjectConfigurableAIActionGroup : ConfigurableAIActionGroup\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private GameObject _actionSequenceContainer;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public GameObject ActionSequenceContainer\r\n        {\r\n            get { return _actionSequenceContainer; }\r\n            set { _actionSequenceContainer = value; }\r\n        }\r\n\r\n        public override string DisplayName\r\n        {\r\n            get\r\n            {\r\n                if (_actionSequenceContainer != null)\r\n                    return string.Format(\"{0} : {1}\", base.DisplayName, _actionSequenceContainer.name);\r\n                else\r\n                    return base.DisplayName;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void SyncActions()\r\n        {\r\n            if (_actionSequenceContainer.IsNullOrDestroyed())\r\n            {\r\n                this.SetEmpty();\r\n            }\r\n            else\r\n            {\r\n                this.SyncActions(_actionSequenceContainer, true);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Components/PropertyDrawerAttributes.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree.Components\r\n{\r\n    public class ListAIStatesAttribute : SPPropertyAttribute\r\n    {\r\n\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Components/a_ActionGroup.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree.Components\r\n{\r\n    public class a_ActionGroup : SPComponent, IAIAction, IAIActionGroup, IAIEditorSyncActionsCallbackReceiver\r\n    {\r\n\r\n        #region Fields\r\n        \r\n        [SerializeField()]\r\n        [ConfigurableAIActionGroup.Config(true)]\r\n        private GameObjectConfigurableAIActionGroup _loop;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            this.SyncActions();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ParallelPassOptions PassOptions\r\n        {\r\n            get { return _loop.PassOptions; }\r\n            set\r\n            {\r\n                _loop.PassOptions = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void SyncActions()\r\n        {\r\n            _loop.SyncActions();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIAction Interface\r\n\r\n        public string DisplayName\r\n        {\r\n            get\r\n            {\r\n                return _loop.DisplayName;\r\n            }\r\n        }\r\n\r\n        public int ActionCount\r\n        {\r\n            get\r\n            {\r\n                return _loop.ActionCount;\r\n            }\r\n        }\r\n\r\n        bool IAIAction.Enabled { get { return this.isActiveAndEnabled; } }\r\n\r\n        public RepeatMode Repeat\r\n        {\r\n            get { return _loop.Repeat; }\r\n            set { _loop.Repeat = value; }\r\n        }\r\n\r\n        public bool AlwaysSucceed\r\n        {\r\n            get { return _loop.AlwaysSucceed; }\r\n            set { _loop.AlwaysSucceed = value; }\r\n        }\r\n\r\n        public ActionResult ActionState\r\n        {\r\n            get { return _loop.ActionState; }\r\n        }\r\n\r\n        ActionResult IAINode.Tick(IAIController ai)\r\n        {\r\n            return _loop.Tick(ai);\r\n        }\r\n\r\n        void IAINode.Reset()\r\n        {\r\n            _loop.Reset();\r\n        }\r\n\r\n\r\n\r\n        \r\n        public IEnumerator<IAIAction> GetEnumerator()\r\n        {\r\n            if (_loop == null) return Enumerable.Empty<IAIAction>().GetEnumerator();\r\n            return _loop.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Components/a_ChangeAIState.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree.Components\r\n{\r\n    public class a_ChangeAIState : AIActionComponent\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [SelectableComponent(typeof(IAIStateMachine))]\r\n        private Component _stateMachine;\r\n\r\n        [SerializeField()]\r\n        private AIStateComponent _state;\r\n\r\n        [SerializeField()]\r\n        [OneOrMany()]\r\n        [SelectableComponent(typeof(IAIAction))]\r\n        private Component[] _waitOn;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IAIStateMachine StateMachine\r\n        {\r\n            get { return _stateMachine as IAIStateMachine; }\r\n            set { _stateMachine = ComponentUtil.GetComponentFromSourceAsComponent<IAIStateMachine>(value) as Component; }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region IAIAction Interface\r\n\r\n        public override string DisplayName\r\n        {\r\n            get\r\n            {\r\n                return string.Format(\"{0} ({1})\", base.DisplayName, (_state != null) ? _state.name : \"null\");\r\n            }\r\n        }\r\n\r\n        protected override ActionResult OnTick(IAIController ai)\r\n        {\r\n            if (this.StateMachine == null) return ActionResult.Failed;\r\n\r\n            if (_waitOn != null && _waitOn.Length > 0)\r\n            {\r\n                IAIAction a;\r\n                for(int i = 0; i < _waitOn.Length; i++)\r\n                {\r\n                    a = _waitOn[i] as IAIAction;\r\n                    if (a != null && a.ActionState == ActionResult.Waiting) return ActionResult.Waiting;\r\n                }\r\n            }\r\n\r\n            if(_state == null)\r\n            {\r\n                this.StateMachine.ChangeState((IAIState)null);\r\n                return ActionResult.Success;\r\n            }\r\n            else if (this.StateMachine.Contains(_state))\r\n            {\r\n                this.StateMachine.ChangeState(_state);\r\n                return ActionResult.Success;\r\n            }\r\n            else\r\n            {\r\n                return ActionResult.Failed;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Components/a_IfCurrentStateIs.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree.Components\r\n{\r\n    public class a_IfCurrentStateIs : AITrapActionComponent\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private AIStateMachineComponent _machine;\r\n        [SerializeField()]\r\n        [OneOrMany()]\r\n        private AIStateComponent[] _component;\r\n\r\n        #endregion\r\n\r\n        #region IAIAction Interface\r\n\r\n        protected override ActionResult EvaluateTrap(IAIController ai)\r\n        {\r\n            if (_machine == null) return ActionResult.Failed;\r\n\r\n            return (System.Array.IndexOf(_component, _machine.Current) >= 0) ? ActionResult.Success : ActionResult.Failed;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Components/a_NullAction.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree.Components\r\n{\r\n    public class a_NullAction : AIActionComponent\r\n    {\r\n\r\n        [SerializeField()]\r\n        private bool _fail;\r\n\r\n        public bool FailOnTick\r\n        {\r\n            get { return _fail; }\r\n            set { _fail = value; }\r\n        }\r\n\r\n        protected override ActionResult OnStart(IAIController ai)\r\n        {\r\n            return (_fail) ? ActionResult.Failed : ActionResult.Success;\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Components/a_RandomSuccess.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree.Components\r\n{\r\n    public class a_RandomSuccess : AIActionComponent\r\n    {\r\n\r\n        [SerializeField()]\r\n        [Range(0f, 1f)]\r\n        private float _oddsOfSuccess = 0.5f;\r\n\r\n        public float Odds\r\n        {\r\n            get { return _oddsOfSuccess; }\r\n            set { _oddsOfSuccess = Mathf.Clamp01(value); }\r\n        }\r\n\r\n        protected override ActionResult OnStart(IAIController ai)\r\n        {\r\n            return RandomUtil.Standard.Bool(_oddsOfSuccess) ? ActionResult.Success : ActionResult.Failed;\r\n        }\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Components/a_Sense.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.AI.Sensors;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree.Components\r\n{\r\n    public class a_Sense : AIActionComponent\r\n    {\r\n\r\n        public enum SelectionStyle\r\n        {\r\n            First = 0,\r\n            Random = 1,\r\n            Nearest = 2,\r\n            Farthest = 3\r\n        }\r\n\r\n        [System.Flags()]\r\n        public enum VariableUpdateOptions\r\n        {\r\n            ClearPreviousAspectIfUnseen = 1,\r\n            OnlyUpdateAspectIfPreviousUnseen = 2,\r\n            StoreOnlyPosition = 4,\r\n            AlwaysUpdate = 8\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private Sensor _sensor;\r\n\r\n        [SerializeField()]\r\n        [AIVariableName()]\r\n        [Tooltip(\"Name of the variable to set the found target to.\")]\r\n        private string _variable;\r\n\r\n        [SerializeField()]\r\n        [EnumFlags()]\r\n        private VariableUpdateOptions _variableUpdateParams = VariableUpdateOptions.ClearPreviousAspectIfUnseen | VariableUpdateOptions.OnlyUpdateAspectIfPreviousUnseen;\r\n\r\n        [SerializeField()]\r\n        private SelectionStyle _selection;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Sensor Sensor\r\n        {\r\n            get { return _sensor; }\r\n            set { _sensor = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIAction Interface\r\n\r\n        protected override ActionResult OnTick(IAIController ai)\r\n        {\r\n            if (_sensor == null) return ActionResult.Failed;\r\n\r\n            if (string.IsNullOrEmpty(_variable))\r\n            {\r\n                //siple find, no storing of found target\r\n                return (_sensor.SenseAny()) ? ActionResult.Success : ActionResult.Failed;\r\n            }\r\n            else\r\n            {\r\n                if((_variableUpdateParams & VariableUpdateOptions.OnlyUpdateAspectIfPreviousUnseen) != 0)\r\n                {\r\n                    var old = ai.Variables[_variable] as IAspect;\r\n                    if (old != null && _sensor.Visible(old)) return ActionResult.Success;\r\n                }\r\n\r\n                if((_variableUpdateParams & VariableUpdateOptions.ClearPreviousAspectIfUnseen) != 0)\r\n                {\r\n                    var old = ai.Variables[_variable] as IAspect;\r\n                    if (old != null && !_sensor.Visible(old)) ai.Variables[_variable] = null;\r\n                }\r\n\r\n                IAspect target = null;\r\n                switch (_selection)\r\n                {\r\n                    case SelectionStyle.First:\r\n                        target = _sensor.Sense();\r\n                        break;\r\n                    case SelectionStyle.Random:\r\n                        target = _sensor.SenseAll().PickRandom();\r\n                        break;\r\n                    case SelectionStyle.Nearest:\r\n                        {\r\n                            var pos = _sensor.transform.position;\r\n                            target = (from a in _sensor.SenseAll() orderby (a.transform.position - pos).sqrMagnitude ascending select a).FirstOrDefault();\r\n                        }\r\n                        break;\r\n                    case SelectionStyle.Farthest:\r\n                        {\r\n                            var pos = _sensor.transform.position;\r\n                            target = (from a in _sensor.SenseAll() orderby (a.transform.position - pos).sqrMagnitude descending select a).FirstOrDefault();\r\n                        }\r\n                        break;\r\n                }\r\n\r\n                if (target == null)\r\n                {\r\n                    if ((_variableUpdateParams & VariableUpdateOptions.AlwaysUpdate) != 0)\r\n                        ai.Variables[_variable] = null;\r\n\r\n                    return ActionResult.Failed;\r\n                }\r\n                else\r\n                {\r\n                    if ((_variableUpdateParams & VariableUpdateOptions.StoreOnlyPosition) != 0)\r\n                        ai.Variables[_variable] = target.transform.position;\r\n                    else\r\n                        ai.Variables[_variable] = target;\r\n\r\n                    return ActionResult.Success;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Components/a_SenseExit.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.AI.Sensors;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree.Components\r\n{\r\n    public class a_SenseExit : AIActionComponent\r\n    {\r\n\r\n        public enum VariableUpdateOptions\r\n        {\r\n            DoNothing = -1,\r\n            SetNullOnExit = 0,\r\n            SetLastPositionOnExit = 1\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private Sensor _sensor;\r\n\r\n        [SerializeField()]\r\n        [AIVariableName()]\r\n        [Tooltip(\"Name of the variable to set the found target to.\")]\r\n        private string _variable;\r\n\r\n        [SerializeField()]\r\n        private VariableUpdateOptions _variableUpdateParams;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Sensor Sensor\r\n        {\r\n            get { return _sensor; }\r\n            set { _sensor = value; }\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region IAIAction Interface\r\n\r\n        protected override ActionResult OnTick(IAIController ai)\r\n        {\r\n            if (_sensor.IsNullOrDestroyed()) return ActionResult.Failed;\r\n\r\n            if (string.IsNullOrEmpty(_variable))\r\n            {\r\n                return ActionResult.Failed;\r\n            }\r\n\r\n            var aspect = ai.Variables[_variable] as IAspect;\r\n            if (aspect.IsNullOrDestroyed())\r\n            {\r\n                return ActionResult.Success;\r\n            }\r\n\r\n            if(_sensor.Visible(aspect))\r\n            {\r\n                return ActionResult.Waiting;\r\n            }\r\n            else\r\n            {\r\n                switch (_variableUpdateParams)\r\n                {\r\n                    case VariableUpdateOptions.SetNullOnExit:\r\n                        ai.Variables[_variable] = null;\r\n                        break;\r\n                    case VariableUpdateOptions.SetLastPositionOnExit:\r\n                        ai.Variables[_variable] = (aspect.IsAlive()) ? (object)aspect.transform.position : null;\r\n                        break;\r\n                }\r\n\r\n                return ActionResult.Success;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Components/a_SetVariable.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree.Components\r\n{\r\n    public class a_SetVariable : AIActionComponent\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [AIVariableName()]\r\n        private string _variable;\r\n        [SerializeField()]\r\n        private VariantReference _value;\r\n\r\n        #endregion\r\n\r\n\r\n        #region IAIAction Interface\r\n\r\n        protected override ActionResult OnTick(IAIController ai)\r\n        {\r\n            if (string.IsNullOrEmpty(_variable)) return ActionResult.Failed;\r\n\r\n            ai.Variables[_variable] = _value.Value;\r\n            return ActionResult.Success;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Components/a_Trigger.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Scenario;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree.Components\r\n{\r\n    public class a_Trigger : AIActionComponent\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private Trigger _trigger = new Trigger(true);\r\n\r\n        #endregion\r\n\r\n        #region IAIAction Interface\r\n\r\n        protected override ActionResult OnTick(IAIController ai)\r\n        {\r\n            _trigger.ActivateTrigger(this, null);\r\n            return ActionResult.Success;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Components/a_WaitTimer.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree.Components\r\n{\r\n\r\n    /// <summary>\r\n    /// TODO - remove obsolete deltaType\r\n    /// </summary>\r\n    public class a_WaitTimer : AIActionComponent\r\n    {\r\n\r\n        #region Fields\r\n        \r\n        [SerializeField()]\r\n        private float _duration;\r\n\r\n        [SerializeField()]\r\n        private SPTime _timeSupplier;\r\n\r\n        [System.NonSerialized()]\r\n        private float _startTime;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float Duration\r\n        {\r\n            get { return _duration; }\r\n            set { _duration = value; }\r\n        }\r\n        \r\n        public ITimeSupplier TimeSupplier\r\n        {\r\n            get\r\n            {\r\n                return _timeSupplier.TimeSupplier;\r\n            }\r\n            set\r\n            {\r\n                _timeSupplier.TimeSupplier = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIAction Interface\r\n\r\n        protected override ActionResult OnStart(IAIController ai)\r\n        {\r\n            var ts = _timeSupplier.TimeSupplier;\r\n            if (ts == null) return ActionResult.Failed;\r\n\r\n            _startTime = ts.Total;\r\n            return ActionResult.None;\r\n        }\r\n\r\n        protected override ActionResult OnTick(IAIController ai)\r\n        {\r\n            var ts = _timeSupplier.TimeSupplier;\r\n            if (ts == null) return ActionResult.Failed;\r\n\r\n            var t = ts.Total - _startTime;\r\n            return (t >= _duration) ? ActionResult.Success : ActionResult.Waiting;\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/ConfigurableAIActionGroup.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree\r\n{\r\n\r\n    [System.Serializable()]\r\n    public class ConfigurableAIActionGroup : IAIAction, IAIActionGroup\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private RepeatMode _repeat;\r\n        [SerializeField()]\r\n        private bool _alwaysSucceed;\r\n\r\n        [SerializeField()]\r\n        [Tooltip(\"Sequential - performs each action in order until one fails\\nSelector - performs each action in order until one succeeds\\nParrallel - performs all action at the same time\\nRandom - performs a random action, include an AIActionWeightSupplier to assign odds\")]\r\n        private ActionGroupType _loopMode;\r\n        [SerializeField()]\r\n        private ParallelPassOptions _passOptions = ParallelPassOptions.FailOnAny;\r\n\r\n        [System.NonSerialized()]\r\n        private AIActionGroup _loop = AIActionGroup.Null;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        /// <summary>\r\n        /// protected constructor used when deserialized by unity. If inheriting from this class, \r\n        /// make sure this is being called also as a deserialized call, OR you must call SyncActions.\r\n        /// </summary>\r\n        protected ConfigurableAIActionGroup()\r\n        {\r\n            //protected constructor used when deserialized by unity\r\n        }\r\n\r\n        public ConfigurableAIActionGroup(ActionGroupType loopMode)\r\n        {\r\n            _loopMode = loopMode;\r\n            this.SetEmpty();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ActionGroupType Mode\r\n        {\r\n            get { return _loopMode; }\r\n            set\r\n            {\r\n                if (_loopMode == value) return;\r\n\r\n                _loopMode = value;\r\n                this.Resync();\r\n            }\r\n        }\r\n\r\n        public ParallelPassOptions PassOptions\r\n        {\r\n            get { return _passOptions; }\r\n            set\r\n            {\r\n                _passOptions = value;\r\n                if (_loop is ParallelAction) (_loop as ParallelAction).PassOptions = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void SetEmpty()\r\n        {\r\n            _loop = AIActionGroup.SyncActions(_loopMode, _loop, Enumerable.Empty<IAIAction>(), _passOptions);\r\n        }\r\n\r\n        public void SyncActions(IEnumerable<IAIAction> actions)\r\n        {\r\n            _loop = AIActionGroup.SyncActions(_loopMode, _loop, actions, _passOptions);\r\n        }\r\n\r\n        public void SyncActions(GameObject source, bool findWeightSupplier)\r\n        {\r\n            _loop = AIActionGroup.SyncActions(_loopMode, _loop, source, findWeightSupplier, _passOptions);\r\n        }\r\n\r\n        private void Resync()\r\n        {\r\n            var actions = (_loop != null) ? _loop : Enumerable.Empty<IAIAction>();\r\n            _loop = AIActionGroup.SyncActions(_loopMode, _loop, actions, _passOptions);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIActionGroup Interface\r\n\r\n        public virtual string DisplayName\r\n        {\r\n            get { return string.Format(\"[{0}]\", _loopMode); }\r\n        }\r\n\r\n        public int ActionCount { get { return _loop.ActionCount; } }\r\n\r\n        bool IAIAction.Enabled { get { return true; } }\r\n\r\n        public RepeatMode Repeat\r\n        {\r\n            get { return _repeat; }\r\n            set\r\n            {\r\n                _repeat = value;\r\n                _loop.Repeat = value;\r\n            }\r\n        }\r\n\r\n        public bool AlwaysSucceed\r\n        {\r\n            get { return _alwaysSucceed; }\r\n            set\r\n            {\r\n                _alwaysSucceed = value;\r\n                _loop.AlwaysSucceed = value;\r\n            }\r\n        }\r\n\r\n        public ActionResult ActionState\r\n        {\r\n            get { return _loop.ActionState; }\r\n        }\r\n\r\n        public ActionResult Tick(IAIController ai)\r\n        {\r\n            return _loop.Tick(ai);\r\n        }\r\n\r\n        public void Reset()\r\n        {\r\n            _loop.Reset();\r\n        }\r\n        \r\n        public IEnumerator<IAIAction> GetEnumerator()\r\n        {\r\n            return _loop.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n\r\n        #region Special Types\r\n\r\n        [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n        public class ConfigAttribute : System.Attribute\r\n        {\r\n\r\n            public bool DrawFlat;\r\n\r\n            public ConfigAttribute(bool drawFlat)\r\n            {\r\n                this.DrawFlat = drawFlat;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/Enums.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree\r\n{\r\n\r\n    /// <summary>\r\n    /// When a state succeeds or fails, this will help determine if they state should repeat instead of moving on.\r\n    /// </summary>\r\n    public enum RepeatMode\r\n    {\r\n        Never = ActionResult.None,\r\n        UntilSuccess = ActionResult.Success,\r\n        UntilFailed = ActionResult.Failed,\r\n        Forever = ActionResult.Waiting\r\n    }\r\n\r\n    public enum ActionGroupType\r\n    {\r\n        Sequential = 0, //performs each action in order until one fails\r\n        Selector = 1, //performs each action in order until one succeeds\r\n        Parrallel = 2, //performs all actions at the same time\r\n        Random = 3, //performs a random action, can be modifiered with the IAIActionWeightSupplier\r\n    }\r\n\r\n    [System.Flags()]\r\n    public enum ParallelPassOptions\r\n    {\r\n        FailOnAny = 1,\r\n        SucceedOnAny = 2,\r\n        SucceedOnTie = 4\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/IAIAction.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree\r\n{\r\n\r\n    public interface IAIAction : IAINode\r\n    {\r\n\r\n        bool Enabled { get; }\r\n\r\n        RepeatMode Repeat { get; set; }\r\n        bool AlwaysSucceed { get; set; }\r\n        ActionResult ActionState { get; }\r\n\r\n    }\r\n\r\n    public abstract class AIAction : IAIAction\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private RepeatMode _repeat = RepeatMode.Never;\r\n        private bool _alwaysSucceed;\r\n\r\n        [System.NonSerialized()]\r\n        private ActionResult _actionState = ActionResult.None;\r\n        [System.NonSerialized()]\r\n        private bool _resetOnRepeat;\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected abstract ActionResult OnTick(IAIController ai);\r\n\r\n        protected virtual void OnReset()\r\n        {\r\n            \r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIAction Interface\r\n\r\n        public virtual string DisplayName\r\n        {\r\n            get { return this.GetType().Name; }\r\n        }\r\n\r\n        bool IAIAction.Enabled { get { return true; } }\r\n\r\n        public RepeatMode Repeat\r\n        {\r\n            get { return _repeat; }\r\n            set { _repeat = value; }\r\n        }\r\n\r\n        public bool AlwaysSucceed\r\n        {\r\n            get { return _alwaysSucceed; }\r\n            set { _alwaysSucceed = value; }\r\n        }\r\n\r\n        public ActionResult ActionState\r\n        {\r\n            get { return _actionState; }\r\n            set { _actionState = value; }\r\n        }\r\n\r\n        public ActionResult Tick(IAIController ai)\r\n        {\r\n            if (_resetOnRepeat)\r\n            {\r\n                this.Reset();\r\n            }\r\n            _actionState = this.OnTick(ai);\r\n            if (_actionState > ActionResult.Waiting)\r\n            {\r\n                _resetOnRepeat = true;\r\n\r\n                if (_repeat != RepeatMode.Never && (int)_repeat != (int)_actionState)\r\n                {\r\n                    _actionState = ActionResult.Waiting;\r\n                }\r\n\r\n                if(_alwaysSucceed && _actionState == ActionResult.Failed)\r\n                {\r\n                    _actionState = ActionResult.Success;\r\n                }\r\n            }\r\n            return _actionState;\r\n        }\r\n\r\n        public void Reset()\r\n        {\r\n            _resetOnRepeat = false;\r\n            _actionState = ActionResult.None;\r\n            this.OnReset();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/IAIActionGroup.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree\r\n{\r\n\r\n    public interface IAIActionGroup : IAINode, IEnumerable<IAIAction>\r\n    {\r\n\r\n        int ActionCount { get; }\r\n        \r\n    }\r\n\r\n    public abstract class AIActionGroup : AIAction, IAIAction, IAIActionGroup\r\n    {\r\n\r\n        #region Methods\r\n\r\n        public abstract void SetActions(IEnumerable<IAIAction> actions);\r\n\r\n        #endregion\r\n\r\n        #region IAIActionGroup Interface\r\n\r\n        public abstract int ActionCount { get; }\r\n\r\n        protected abstract IEnumerable<IAIAction> GetActions();\r\n\r\n        public IEnumerator<IAIAction> GetEnumerator()\r\n        {\r\n            var e = this.GetActions();\r\n            if (e == null) return Enumerable.Empty<IAIAction>().GetEnumerator();\r\n\r\n            return e.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Factory\r\n\r\n        private static AIActionGroup _nullGrp;\r\n        public static AIActionGroup Null\r\n        {\r\n            get\r\n            {\r\n                if (_nullGrp == null) _nullGrp = new NullAIActionGroup();\r\n                return _nullGrp;\r\n            }\r\n        }\r\n\r\n        public static AIActionGroup CreateGroup(ActionGroupType type, IEnumerable<IAIAction> actions, ParallelPassOptions parPassOptions = 0)\r\n        {\r\n            switch (type)\r\n            {\r\n                case ActionGroupType.Sequential:\r\n                    return new SequenceAction(actions);\r\n                case ActionGroupType.Selector:\r\n                    return new SelectorAction(actions);\r\n                case ActionGroupType.Parrallel:\r\n                    return new ParallelAction(actions) { PassOptions = parPassOptions };\r\n                case ActionGroupType.Random:\r\n                    return new RandomAction(actions);\r\n                default:\r\n                    throw new System.ArgumentException(\"Unknown ActionGroupType.\");\r\n            }\r\n        }\r\n\r\n        public static AIActionGroup SyncActions(ActionGroupType type, AIActionGroup group, IEnumerable<IAIAction> actions, ParallelPassOptions parPassOptions = 0)\r\n        {\r\n            var repeat = (group != null) ? group.Repeat : RepeatMode.Never;\r\n            var always = (group != null) ? group.AlwaysSucceed : false;\r\n\r\n            switch (type)\r\n            {\r\n                case ActionGroupType.Sequential:\r\n                    {\r\n                        if (group is SequenceAction)\r\n                            group.SetActions(actions);\r\n                        else\r\n                            group = new SequenceAction(actions);\r\n                        break;\r\n                    }\r\n                case ActionGroupType.Selector:\r\n                    {\r\n                        if (group is SelectorAction)\r\n                            group.SetActions(actions);\r\n                        else\r\n                            group = new SelectorAction(actions);\r\n                        break;\r\n                    }\r\n                case ActionGroupType.Parrallel:\r\n                    {\r\n                        if (group is ParallelAction)\r\n                        {\r\n                            group.SetActions(actions);\r\n                            (group as ParallelAction).PassOptions = parPassOptions;\r\n                        }\r\n                        else\r\n                            group = new ParallelAction(actions) { PassOptions = parPassOptions };\r\n                        break;\r\n                    }\r\n                case ActionGroupType.Random:\r\n                    {\r\n                        if (group is RandomAction)\r\n                            group.SetActions(actions);\r\n                        else\r\n                            group = new RandomAction(actions);\r\n                        break;\r\n                    }\r\n                default:\r\n                    throw new System.ArgumentException(\"Unknown ActionGroupType.\");\r\n            }\r\n\r\n            group.Repeat = repeat;\r\n            group.AlwaysSucceed = always;\r\n            return group;\r\n        }\r\n\r\n        public static AIActionGroup SyncActions(ActionGroupType type, AIActionGroup group, GameObject source, bool findWeightSupplier, ParallelPassOptions parPassOptions = 0)\r\n        {\r\n            var repeat = (group != null) ? group.Repeat : RepeatMode.Never;\r\n            var always = (group != null) ? group.AlwaysSucceed : false;\r\n\r\n            //var actions = source.GetComponentsAlt<IAIAction>();\r\n            using (var actions = com.spacepuppy.Collections.TempCollection.GetList<IAIAction>())\r\n            {\r\n                source.GetComponents<IAIAction>(actions, (c) =>\r\n                {\r\n                    if (c is IAIAction) return c as IAIAction;\r\n                    else if (c is com.spacepuppy.Scenario.ITriggerableMechanism) return new TriggerableMechanismAsAIActionWrapper(c as com.spacepuppy.Scenario.ITriggerableMechanism);\r\n                    else return null;\r\n                });\r\n\r\n                switch (type)\r\n                {\r\n                    case ActionGroupType.Sequential:\r\n                        {\r\n                            if (group is SequenceAction)\r\n                                group.SetActions(actions);\r\n                            else\r\n                                group = new SequenceAction(actions);\r\n                            break;\r\n                        }\r\n                    case ActionGroupType.Selector:\r\n                        {\r\n                            if (group is SelectorAction)\r\n                                group.SetActions(actions);\r\n                            else\r\n                                group = new SelectorAction(actions);\r\n                            break;\r\n                        }\r\n                    case ActionGroupType.Parrallel:\r\n                        {\r\n                            if (group is ParallelAction)\r\n                            {\r\n                                group.SetActions(actions);\r\n                                (group as ParallelAction).PassOptions = parPassOptions;\r\n                            }\r\n                            else\r\n                                group = new ParallelAction(actions) { PassOptions = parPassOptions };\r\n                            break;\r\n                        }\r\n                    case ActionGroupType.Random:\r\n                        {\r\n                            if (group is RandomAction)\r\n                                group.SetActions(actions);\r\n                            else\r\n                                group = new RandomAction(actions);\r\n\r\n                            if (findWeightSupplier)\r\n                            {\r\n                                IAIActionWeightSupplier supplier;\r\n                                if (source.GetComponent<IAIActionWeightSupplier>(out supplier))\r\n                                {\r\n                                    (group as RandomAction).WeightSupplier = supplier;\r\n                                }\r\n                            }\r\n                            break;\r\n                        }\r\n                    default:\r\n                        throw new System.ArgumentException(\"Unknown ActionGroupType.\");\r\n                }\r\n            }\r\n\r\n            group.Repeat = repeat;\r\n            group.AlwaysSucceed = always;\r\n            return group;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private class NullAIActionGroup : AIActionGroup\r\n        {\r\n\r\n            public override int ActionCount { get { return 0; } }\r\n\r\n            public override void SetActions(IEnumerable<IAIAction> actions)\r\n            {\r\n            }\r\n\r\n            protected override IEnumerable<IAIAction> GetActions()\r\n            {\r\n                return Enumerable.Empty<IAIAction>();\r\n            }\r\n\r\n            protected override ActionResult OnTick(IAIController ai)\r\n            {\r\n                return ActionResult.Success;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/IAIActionWeightSupplier.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree\r\n{\r\n    public interface IAIActionWeightSupplier\r\n    {\r\n\r\n        float GetWeight(IAIAction action);\r\n\r\n        void OnActionSuccess(IAIAction action);\r\n        void OnActionFailure(IAIAction action);\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/IAIEditorSyncActionsCallbackReceiver.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree\r\n{\r\n    public interface IAIEditorSyncActionsCallbackReceiver\r\n    {\r\n\r\n        void SyncActions();\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/IAITreeStateMachine.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.StateMachine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree\r\n{\r\n\r\n    public interface IAITreeStateMachine : IAIStateMachine, IAIAction\r\n    {\r\n\r\n    }\r\n\r\n\r\n    public class AITreeStateMachine : AIAction, IAITreeStateMachine\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [System.NonSerialized()]\r\n        private IStateMachine<IAIState> _stateMachine;\r\n        [System.NonSerialized()]\r\n        private IAIStateMachine _owner;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public AITreeStateMachine()\r\n        {\r\n            _owner = this;\r\n        }\r\n\r\n        public AITreeStateMachine(IAIStateMachine owner)\r\n        {\r\n            _owner = owner ?? this;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n        \r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void SetStateMachine(IStateMachine<IAIState> machine)\r\n        {\r\n            if (_stateMachine != null)\r\n            {\r\n                _stateMachine.StateChanged -= this.OnStateChanged;\r\n                _stateMachine = null;\r\n            }\r\n\r\n            _stateMachine = machine;\r\n            if (_stateMachine != null)\r\n            {\r\n                _stateMachine.StateChanged += this.OnStateChanged;\r\n                foreach (var st in _stateMachine)\r\n                {\r\n                    st.Init(_owner);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Event Handlers\r\n\r\n        private void OnStateChanged(object sender, StateChangedEventArgs<IAIState> e)\r\n        {\r\n            if (e.FromState != null) e.FromState.OnStateExited(_owner, e.ToState);\r\n            if (e.ToState != null) e.ToState.OnStateEntered(_owner, e.FromState);\r\n\r\n            if (this.StateChanged != null) this.StateChanged(this, e);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIAction Interface\r\n\r\n        public override string DisplayName\r\n        {\r\n            get\r\n            {\r\n                return \"[State Machine]\";\r\n            }\r\n        }\r\n\r\n        protected override ActionResult OnTick(IAIController ai)\r\n        {\r\n            if (_stateMachine != null && _stateMachine.Current != null)\r\n            {\r\n                return _stateMachine.Current.Tick(ai);\r\n            }\r\n            else\r\n            {\r\n                return ActionResult.Success;\r\n            }\r\n        }\r\n\r\n        protected override void OnReset()\r\n        {\r\n            foreach (var state in _stateMachine)\r\n            {\r\n                state.Reset();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IStateMachine Interface\r\n\r\n        public event StateChangedEventHandler<IAIState> StateChanged;\r\n\r\n        public IAIState Current\r\n        {\r\n            get { return (_stateMachine != null) ? _stateMachine.Current : null; }\r\n        }\r\n\r\n        public bool Contains(IAIState state)\r\n        {\r\n            if (_stateMachine == null) return false;\r\n            return _stateMachine.Contains(state);\r\n        }\r\n\r\n        public IAIState ChangeState(IAIState state)\r\n        {\r\n            if (_stateMachine == null) return null;\r\n            if (_stateMachine.Current == state) return state;\r\n            return _stateMachine.ChangeState(state);\r\n        }\r\n\r\n        public IEnumerator<IAIState> GetEnumerator()\r\n        {\r\n            if (_stateMachine == null) return Enumerable.Empty<IAIState>().GetEnumerator();\r\n            return _stateMachine.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        public void GetStates(ICollection<IAIState> coll)\r\n        {\r\n            _stateMachine.GetStates(coll);\r\n        }\r\n\r\n        public void Foreach(System.Action<IAIState> callback)\r\n        {\r\n            _stateMachine.Foreach(callback);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/ParallelAction.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree\r\n{\r\n\r\n    /// <summary>\r\n    /// Operates each child action at the same time.\r\n    /// </summary>\r\n    public class ParallelAction : AIActionGroup\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private ParallelPassOptions _passOption;\r\n\r\n        private IAIAction[] _actions;\r\n\r\n        private bool _inTick;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public ParallelAction()\r\n        {\r\n\r\n        }\r\n\r\n        public ParallelAction(IEnumerable<IAIAction> actions)\r\n        {\r\n            this.SetActions(actions);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ParallelPassOptions PassOptions\r\n        {\r\n            get { return _passOption; }\r\n            set { _passOption = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override void SetActions(IEnumerable<IAIAction> actions)\r\n        {\r\n            if (actions == null)\r\n            {\r\n                _actions = null;\r\n            }\r\n            else\r\n            {\r\n                _actions = actions.ToArray();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIAction Interface\r\n\r\n        public override string DisplayName { get { return \"[Parrallel]\"; } }\r\n\r\n        public override int ActionCount { get { return (_actions != null) ? _actions.Length : 0; } }\r\n\r\n        protected override IEnumerable<IAIAction> GetActions()\r\n        {\r\n            return _actions;\r\n        }\r\n\r\n        protected override ActionResult OnTick(IAIController ai)\r\n        {\r\n            if (_actions == null || _actions.Length == 0) return ActionResult.Success;\r\n\r\n            int cntFail = 0;\r\n            int cntSucc = 0;\r\n            int cntWait = 0;\r\n            _inTick = true;\r\n            for(int i = 0; i < _actions.Length; i++)\r\n            {\r\n                if (!_actions[i].Enabled) continue;\r\n\r\n                switch(_actions[i].Tick(ai))\r\n                {\r\n                    case ActionResult.Success:\r\n                        cntSucc++;\r\n                        break;\r\n                    case ActionResult.Failed:\r\n                        cntFail++;\r\n                        break;\r\n                    case ActionResult.Waiting:\r\n                        cntWait++;\r\n                        break;\r\n                }\r\n\r\n                if(!_inTick)\r\n                {\r\n                    //an action cancelled us\r\n                    return ActionResult.Failed;\r\n                }\r\n            }\r\n            _inTick = false;\r\n\r\n            const ParallelPassOptions mask = ParallelPassOptions.SucceedOnAny | ParallelPassOptions.FailOnAny;\r\n            if ((_passOption & mask) > 0)\r\n            {\r\n                if ((_passOption & ParallelPassOptions.SucceedOnTie) != 0)\r\n                {\r\n                    if ((_passOption & ParallelPassOptions.FailOnAny) != 0 && cntFail > 0)\r\n                        return ActionResult.Failed;\r\n                    if ((_passOption & ParallelPassOptions.SucceedOnAny) != 0 && cntSucc > 0)\r\n                        return ActionResult.Success;\r\n                }\r\n                else\r\n                {\r\n                    if ((_passOption & ParallelPassOptions.SucceedOnAny) != 0 && cntSucc > 0)\r\n                        return ActionResult.Success;\r\n                    if ((_passOption & ParallelPassOptions.FailOnAny) != 0 && cntFail > 0)\r\n                        return ActionResult.Failed;\r\n                }\r\n            }\r\n\r\n            if (cntWait > 0)\r\n                return ActionResult.Waiting;\r\n            else if (cntFail == _actions.Length)\r\n                return ActionResult.Failed;\r\n            else\r\n                return ActionResult.Success;\r\n        }\r\n\r\n        protected override void OnReset()\r\n        {\r\n            if (_actions != null)\r\n            {\r\n                foreach (var a in _actions)\r\n                {\r\n                    a.Reset();\r\n                }\r\n            }\r\n            _inTick = false;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/RandomAction.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.StateMachine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree\r\n{\r\n\r\n    /// <summary>\r\n    /// Selects a random action and performs it, include a weight supplier to create odds.\r\n    /// </summary>\r\n    public class RandomAction : AIActionGroup\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private IAIAction[] _actions;\r\n        private IAIAction _currentAction;\r\n\r\n        private IAIActionWeightSupplier _weightSupplier;\r\n\r\n        #endregion\r\n        \r\n        #region CONSTRUCTOR\r\n\r\n        public RandomAction()\r\n        {\r\n        }\r\n\r\n        public RandomAction(IEnumerable<IAIAction> actions)\r\n        {\r\n            this.SetActions(actions);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IAIActionWeightSupplier WeightSupplier\r\n        {\r\n            get { return _weightSupplier; }\r\n            set { _weightSupplier = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override void SetActions(IEnumerable<IAIAction> actions)\r\n        {\r\n            if (actions == null)\r\n                _actions = null;\r\n            else\r\n                _actions = actions.ToArray();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIAction Interface\r\n\r\n        public override string DisplayName { get { return \"[Random]\"; } }\r\n\r\n        public override int ActionCount { get { return (_actions != null) ? _actions.Length : 0; } }\r\n\r\n        protected override IEnumerable<IAIAction> GetActions()\r\n        {\r\n            return _actions;\r\n        }\r\n\r\n        protected override ActionResult OnTick(IAIController ai)\r\n        {\r\n            if(_currentAction == null)\r\n            {\r\n                if (_actions == null) return ActionResult.Success;\r\n                this.Reset();\r\n\r\n                if (_weightSupplier != null)\r\n                {\r\n                    _currentAction = _actions.PickRandom((a) =>\r\n                    {\r\n                        return _weightSupplier.GetWeight(a);\r\n                    });\r\n                }\r\n                else\r\n                {\r\n                    _currentAction = _actions.PickRandom();\r\n                }\r\n                if (_currentAction == null) return ActionResult.Success;\r\n            }\r\n\r\n            if(!_currentAction.Enabled)\r\n            {\r\n                _currentAction = null;\r\n                return ActionResult.Failed;\r\n            }\r\n\r\n            var result = _currentAction.Tick(ai);\r\n            if (result != ActionResult.Waiting)\r\n            {\r\n                if (_weightSupplier != null)\r\n                {\r\n                    switch(result)\r\n                    {\r\n                        case ActionResult.Failed:\r\n                            _weightSupplier.OnActionFailure(_currentAction);\r\n                            break;\r\n                        case ActionResult.Success:\r\n                            _weightSupplier.OnActionSuccess(_currentAction);\r\n                            break;\r\n                    }\r\n                }\r\n                _currentAction = null;\r\n            }\r\n            return result;\r\n        }\r\n\r\n        protected override void OnReset()\r\n        {\r\n            if (_actions != null)\r\n            {\r\n                foreach (var a in _actions)\r\n                {\r\n                    a.Reset();\r\n                }\r\n            }\r\n            _currentAction = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/SelectorAction.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree\r\n{\r\n\r\n    /// <summary>\r\n    /// Iterates over children until a child succeeds.\r\n    /// </summary>\r\n    public class SelectorAction : AIActionGroup\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private IAIAction[] _actions;\r\n        private int _currentActionIndex;\r\n\r\n        #endregion\r\n        \r\n        #region CONSTRUCTOR\r\n\r\n        public SelectorAction()\r\n        {\r\n\r\n        }\r\n\r\n        public SelectorAction(IEnumerable<IAIAction> actions)\r\n        {\r\n            this.SetActions(actions);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Methods\r\n\r\n        public override void SetActions(IEnumerable<IAIAction> actions)\r\n        {\r\n            if (actions == null)\r\n            {\r\n                _actions = null;\r\n            }\r\n            else\r\n            {\r\n                _actions = actions.ToArray();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIAction Interface\r\n\r\n        public override string DisplayName { get { return \"[Selector]\"; } }\r\n\r\n        public override int ActionCount { get { return (_actions != null) ? _actions.Length : 0; } }\r\n\r\n        protected override IEnumerable<IAIAction> GetActions()\r\n        {\r\n            return _actions;\r\n        }\r\n\r\n        protected override ActionResult OnTick(IAIController ai)\r\n        {\r\n            if (_actions == null || _actions.Length == 0) return ActionResult.Success;\r\n\r\n            if (_currentActionIndex < 0)\r\n            {\r\n                _currentActionIndex = 0;\r\n            }\r\n\r\n            var result = ActionResult.Failed;\r\n            var a = _actions[_currentActionIndex];\r\n            while (a != null)\r\n            {\r\n                if (!a.Enabled)\r\n                {\r\n                    _currentActionIndex++;\r\n                    if (_currentActionIndex < _actions.Length)\r\n                    {\r\n                        a = _actions[_currentActionIndex];\r\n                    }\r\n                    else\r\n                    {\r\n                        a = null;\r\n                        _currentActionIndex = -1;\r\n                    }\r\n                    continue;\r\n                }\r\n\r\n                result = a.Tick(ai);\r\n                if (result == ActionResult.Failed)\r\n                {\r\n                    _currentActionIndex++;\r\n                    if (_currentActionIndex < _actions.Length)\r\n                    {\r\n                        a = _actions[_currentActionIndex];\r\n                    }\r\n                    else\r\n                    {\r\n                        a = null;\r\n                        _currentActionIndex = -1;\r\n                    }\r\n                }\r\n                else if (result == ActionResult.Success)\r\n                {\r\n                    _currentActionIndex = -1;\r\n                    break;\r\n                }\r\n                else\r\n                {\r\n                    break;\r\n                }\r\n            }\r\n            return result;\r\n        }\r\n\r\n        protected override void OnReset()\r\n        {\r\n            if (_actions != null)\r\n            {\r\n                foreach (var a in _actions)\r\n                {\r\n                    a.Reset();\r\n                }\r\n            }\r\n            _currentActionIndex = -1;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/SequenceAction.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.StateMachine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree\r\n{\r\n\r\n    /// <summary>\r\n    /// Iterates over children until one fails.\r\n    /// </summary>\r\n    public class SequenceAction : AIActionGroup\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private IAIAction[] _actions;\r\n        private int _currentActionIndex;\r\n\r\n        #endregion\r\n        \r\n        #region CONSTRUCTOR\r\n\r\n        public SequenceAction()\r\n        {\r\n        }\r\n\r\n        public SequenceAction(IEnumerable<IAIAction> actions)\r\n        {\r\n            this.SetActions(actions);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override void SetActions(IEnumerable<IAIAction> actions)\r\n        {\r\n            if (actions == null)\r\n                _actions = null;\r\n            else\r\n                _actions = actions.ToArray();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIAction Interface\r\n\r\n        public override string DisplayName { get { return \"[Sequence]\"; } }\r\n\r\n        public override int ActionCount { get { return (_actions != null) ? _actions.Length : 0; } }\r\n\r\n        protected override IEnumerable<IAIAction> GetActions()\r\n        {\r\n            return _actions;\r\n        }\r\n\r\n        protected override ActionResult OnTick(IAIController ai)\r\n        {\r\n            if (_actions == null || _actions.Length == 0) return ActionResult.Success;\r\n\r\n            if (_currentActionIndex < 0)\r\n            {\r\n                _currentActionIndex = 0;\r\n            }\r\n\r\n            var result = ActionResult.Success;\r\n            var a = _actions[_currentActionIndex];\r\n            while(a != null)\r\n            {\r\n                if(!a.Enabled)\r\n                {\r\n                    _currentActionIndex++;\r\n                    if (_currentActionIndex < _actions.Length)\r\n                    {\r\n                        a = _actions[_currentActionIndex];\r\n                    }\r\n                    else\r\n                    {\r\n                        a = null;\r\n                        _currentActionIndex = -1;\r\n                    }\r\n                    continue;\r\n                }\r\n\r\n                result = a.Tick(ai);\r\n                if(result == ActionResult.Success)\r\n                {\r\n                    _currentActionIndex++;\r\n                    if(_currentActionIndex < _actions.Length)\r\n                    {\r\n                        a = _actions[_currentActionIndex];\r\n                    }\r\n                    else\r\n                    {\r\n                        a = null;\r\n                        _currentActionIndex = -1;\r\n                    }\r\n                }\r\n                else if(result == ActionResult.Failed)\r\n                {\r\n                    _currentActionIndex = -1;\r\n                    break;\r\n                }\r\n                else\r\n                {\r\n                    break;\r\n                }\r\n            }\r\n            return result;\r\n        }\r\n\r\n        protected override void OnReset()\r\n        {\r\n            if (_actions != null)\r\n            {\r\n                foreach (var a in _actions)\r\n                {\r\n                    a.Reset();\r\n                }\r\n            }\r\n            _currentActionIndex = -1;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/AI/BehaviourTree/TriggerableMechanismAsAIActionWrapper.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Scenario;\r\n\r\nnamespace com.spacepuppy.AI.BehaviourTree\r\n{\r\n    \r\n    public class TriggerableMechanismAsAIActionWrapper : IAIAction\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private ITriggerableMechanism _mechanism;\r\n        private ActionResult _state;\r\n        private BlockingTriggerYieldInstruction _blocking;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TriggerableMechanismAsAIActionWrapper(ITriggerableMechanism mechanism)\r\n        {\r\n            if (mechanism == null) throw new System.ArgumentNullException(\"mechanism\");\r\n            _mechanism = mechanism;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAIAction Interface\r\n\r\n        bool IAIAction.Enabled { get { return _mechanism.CanTrigger; } }\r\n\r\n        public ActionResult ActionState\r\n        {\r\n            get\r\n            {\r\n                return _state;\r\n            }\r\n        }\r\n\r\n        public bool AlwaysSucceed\r\n        {\r\n            get\r\n            {\r\n                return true;\r\n            }\r\n            set\r\n            {\r\n            }\r\n        }\r\n\r\n        public string DisplayName\r\n        {\r\n            get\r\n            {\r\n                var go = com.spacepuppy.Utils.GameObjectUtil.GetGameObjectFromSource(_mechanism);\r\n                if (go != null)\r\n                    return go.name + \"(a_i_Triggerable_Wrapper)\";\r\n                else\r\n                    return \"null (a_i_Triggerable_Wrapper)\";\r\n            }\r\n        }\r\n\r\n        public RepeatMode Repeat\r\n        {\r\n            get\r\n            {\r\n                return RepeatMode.Never;\r\n            }\r\n            set\r\n            {\r\n\r\n            }\r\n        }\r\n\r\n        public void Reset()\r\n        {\r\n            _state = ActionResult.None;\r\n        }\r\n\r\n        public ActionResult Tick(IAIController ai)\r\n        {\r\n            if (_blocking != null)\r\n            {\r\n                if(_blocking.IsComplete)\r\n                {\r\n                    _blocking = null;\r\n                    _state = ActionResult.Success;\r\n                }\r\n                else\r\n                {\r\n                    _state = ActionResult.Waiting;\r\n                }\r\n            }\r\n            else if(_mechanism != null)\r\n            {\r\n                _state = ActionResult.Success;\r\n                if (_mechanism.CanTrigger)\r\n                {\r\n                    if(_mechanism is IBlockingTriggerableMechanism)\r\n                    {\r\n                        var obj = BlockingTriggerYieldInstruction.Create();\r\n                        (_mechanism as IBlockingTriggerableMechanism).Trigger(ai, ai, obj);\r\n                        if(obj.Count > 0)\r\n                        {\r\n                            _state = ActionResult.Waiting;\r\n                            _blocking = obj;\r\n                        }\r\n                        else\r\n                        {\r\n                            (obj as System.IDisposable).Dispose();\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        _mechanism.Trigger(ai, ai);\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                _state = ActionResult.Failed;\r\n            }\r\n\r\n            return _state;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"SpacepuppyAIBehaviourTree\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"SpacepuppyAIBehaviourTree\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"b9807eba-396e-4379-800f-65cba0c47bd9\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTree/SpacepuppyAIBehaviourTree.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{B9807EBA-396E-4379-800F-65CBA0C47BD9}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>com.spacepuppy</RootNamespace>\r\n    <AssemblyName>SpacepuppyUnityFramework.AI.BehaviourTree</AssemblyName>\r\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"UnityEngine\">\r\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"AI\\BehaviourTree\\AINodeUtil.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\AITreeController.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\AIActionComponent.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\AIActionWeightsComponent.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\AIStateComponent.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\AIStateMachineComponent.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\AITrapActionComponent.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\a_ActionGroup.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\a_ChangeAIState.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\a_IfCurrentStateIs.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\a_NullAction.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\a_RandomSuccess.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\a_Sense.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\a_SenseExit.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\a_SetVariable.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\a_Trigger.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\a_WaitTimer.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\GameObjectConfigurableAIActionGroup.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\PropertyDrawerAttributes.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\ConfigurableAIActionGroup.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Enums.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\IAIAction.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\IAIActionGroup.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\IAIActionWeightSupplier.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\IAIEditorSyncActionsCallbackReceiver.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\IAITreeStateMachine.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\ParallelAction.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\RandomAction.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\SelectorAction.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\SequenceAction.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\TriggerableMechanismAsAIActionWrapper.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\SpacepuppyAI\\SpacepuppyAI.csproj\">\r\n      <Project>{65a3df9e-1099-40d7-acf3-4a3989026a3d}</Project>\r\n      <Name>SpacepuppyAI</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\r\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\r\n      <Name>SpacepuppyBase</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <ItemGroup />\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>mkdir $(ProjectDir)..\\Builds\\FullLibrary\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.AI.BehaviourTree.dll\" \"$(ProjectDir)..\\Builds\\FullLibrary\\SpacepuppyUnityFramework.AI.BehaviourTree.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.AI.BehaviourTree.pdb\" \"$(ProjectDir)..\\Builds\\FullLibrary\\SpacepuppyUnityFramework.AI.BehaviourTree.pdb\"</PostBuildEvent>\r\n  </PropertyGroup>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "SpacepuppyAIBehaviourTreeEditor/AI/BehaviourTree/AITreeControllerInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.AI.BehaviourTree;\r\n\r\nnamespace com.spacepuppyeditor.AI.BehaviourTree\r\n{\r\n\r\n    [CustomEditor(typeof(AITreeController), true)]\r\n    public class AITreeControllerInspector : SPEditor\r\n    {\r\n\r\n        public override bool RequiresConstantRepaint()\r\n        {\r\n            return Application.isPlaying;\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTreeEditor/AI/BehaviourTree/AITreeDebugWindow.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.AI;\r\nusing com.spacepuppy.AI.BehaviourTree;\r\nusing com.spacepuppy.AI.BehaviourTree.Components;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.AI.BehaviourTree\r\n{\r\n\r\n    public class AITreeDebugWindow : EditorWindow\r\n    {\r\n\r\n        public const string MENU_NAME = SPMenu.MENU_NAME_TOOLS + \"/AI Tree Debug Window\";\r\n        public const int MENU_PRIORITY = SPMenu.MENU_PRIORITY_TOOLS;\r\n\r\n        #region Menu\r\n\r\n        private static AITreeDebugWindow _window;\r\n\r\n        [MenuItem(MENU_NAME, priority = MENU_PRIORITY)]\r\n        private static void OpenWindow()\r\n        {\r\n            if (_window == null)\r\n            {\r\n                _window = EditorWindow.GetWindow<AITreeDebugWindow>();\r\n                _window.Show();\r\n                _window.position = new Rect(20, 80, 500, 300);\r\n            }\r\n            else\r\n            {\r\n                _window.Focus();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        private AITreeController _ai;\r\n\r\n        private Color _failedColor = Color.red.SetAlpha(0.1f);\r\n        private Color _waitingColor = Color.yellow.SetAlpha(0.1f);\r\n        private Color _successColor = Color.green.SetAlpha(0.1f);\r\n        private Color _activeStateColor = Color.blue.SetAlpha(0.1f);\r\n        private Color _selectedColor = Color.grey.SetAlpha(0.5f);\r\n\r\n        private Dictionary<int, AITreeExpandedLookupTable> _allTables = new Dictionary<int, AITreeExpandedLookupTable>();\r\n        private AITreeExpandedLookupTable _currentTable;\r\n        private int _currentSelectionId;\r\n\r\n        private Vector2 _scrollPosition;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private void OnEnable()\r\n        {\r\n            this.titleContent = new GUIContent(\"AI Tree Debug Window\");\r\n            this.autoRepaintOnSceneChange = true;\r\n            this.UpdateAIFromSelection();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region OnGUI\r\n\r\n        private void OnGUI()\r\n        {\r\n            //draw header\r\n            if (Application.isPlaying)\r\n            {\r\n                var cache = SPGUI.Disable();\r\n                EditorGUILayout.ObjectField(\"Current Target: \", _ai, typeof(AITreeController), true);\r\n                cache.Reset();\r\n            }\r\n            else\r\n            {\r\n                var rect = EditorGUILayout.GetControlRect();\r\n                Rect r1, r2;\r\n                const float BTN_WIDTH = 150f;\r\n                if (rect.width > BTN_WIDTH * 2f)\r\n                {\r\n                    r1 = new Rect(rect.xMin, rect.yMin, rect.width - BTN_WIDTH, rect.height);\r\n                    r2 = new Rect(r1.xMax, rect.yMin, BTN_WIDTH, rect.height);\r\n                }\r\n                else\r\n                {\r\n                    var w = rect.width / 2f;\r\n                    r1 = new Rect(rect.xMin, rect.yMin, w, rect.height);\r\n                    r2 = new Rect(r1.xMax, rect.yMin, w, rect.height);\r\n                }\r\n\r\n                var cache = SPGUI.Disable();\r\n                EditorGUI.ObjectField(r1, \"Current Target: \", _ai, typeof(AITreeController), true);\r\n                cache.Reset();\r\n\r\n                if (GUI.Button(r2, \"Sync Actions\"))\r\n                {\r\n                    this.SyncActions();\r\n                }\r\n            }\r\n\r\n            //if we're not configured correctly, stop\r\n            if (_ai == null) return;\r\n            if (_currentTable == null) this.CleanCurrentState();\r\n\r\n            //draw actions\r\n            _scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition);\r\n            try\r\n            {\r\n                this.DrawNode(_ai);\r\n                //this.DrawActionGroup(_ai);\r\n            }\r\n            catch (System.Exception ex)\r\n            {\r\n                Debug.LogException(ex);\r\n            }\r\n            EditorGUILayout.EndScrollView();\r\n\r\n        }\r\n\r\n        private void OnSelectionChange()\r\n        {\r\n            this.UpdateAIFromSelection();\r\n        }\r\n\r\n        private void OnFocus()\r\n        {\r\n            this.UpdateAIFromSelection();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Commands\r\n\r\n        private void UpdateAIFromSelection()\r\n        {\r\n            if (Selection.activeGameObject == null) return;\r\n            \r\n            var c = Selection.activeGameObject.GetComponentInParent<AITreeController>();\r\n            if (c != null)\r\n            {\r\n                _ai = c;\r\n                this.SyncActions();\r\n                this.CleanCurrentState();\r\n                this.Repaint();\r\n                return;\r\n            }\r\n        }\r\n\r\n        private void SyncActions()\r\n        {\r\n            if (Application.isPlaying) return;\r\n            if (_ai == null) return;\r\n\r\n            _ai.SyncActions();\r\n\r\n            foreach(var n in AINodeUtil.GetAllNodes(_ai.ActionLoop, false))\r\n            {\r\n                if (n is IAIEditorSyncActionsCallbackReceiver) (n as IAIEditorSyncActionsCallbackReceiver).SyncActions();\r\n            }\r\n        }\r\n\r\n        private void CleanCurrentState()\r\n        {\r\n            //var deadTreeIds = (from pair in _allTables where !pair.Value.GetIsAlive() select pair.Key).ToArray();\r\n            //foreach (var id in deadTreeIds)\r\n            //{\r\n            //    _allTables.Remove(id);\r\n            //}\r\n\r\n            if(_ai != null)\r\n            {\r\n                int id = _ai.GetInstanceID();\r\n                AITreeExpandedLookupTable table;\r\n                if(!_allTables.TryGetValue(id, out table))\r\n                {\r\n                    table = new AITreeExpandedLookupTable(id);\r\n                    _allTables.Add(id, table);\r\n                }\r\n                _currentTable = table;\r\n            }\r\n            else\r\n            {\r\n                _currentTable = null;\r\n            }\r\n\r\n            //_currentSelectionId = 0;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Draw Methods\r\n\r\n        private void DrawNode(IAINode node)\r\n        {\r\n            var rect = EditorGUILayout.GetControlRect();\r\n            bool hasChildren = (node is IAIActionGroup || node is IAIStateMachine);\r\n\r\n            //first click region\r\n            if (MouseUtil.GuiClicked(Event.current, MouseUtil.BTN_LEFT, rect))\r\n            {\r\n                _currentSelectionId = AITreeDebugWindow.GetNodeHash(node);\r\n                if (node is Component)\r\n                {\r\n                    Selection.activeGameObject = (node as Component).gameObject;\r\n                    EditorGUIUtility.PingObject(node as Component);\r\n                }\r\n                this.Repaint();\r\n            }\r\n            else if (MouseUtil.GuiClicked(Event.current, MouseUtil.BTN_RIGHT, rect))\r\n            {\r\n                this.DrawPopup(node);\r\n            }\r\n\r\n            //draw selection rect\r\n            if (_currentSelectionId == AITreeDebugWindow.GetNodeHash(node))\r\n            {\r\n                EditorGUI.DrawRect(rect, _selectedColor);\r\n            }\r\n\r\n            //draw label\r\n            if (hasChildren)\r\n            {\r\n                _currentTable[node] = EditorGUI.Foldout(rect, _currentTable[node], node.DisplayName);\r\n            }\r\n            else\r\n            {\r\n                EditorGUI.LabelField(rect, node.DisplayName);\r\n            }\r\n\r\n            //highlight if running\r\n            if(node is IAIAction)\r\n            {\r\n                var act = node as IAIAction;\r\n                switch (act.ActionState)\r\n                {\r\n                    case ActionResult.Waiting:\r\n                        EditorGUI.DrawRect(rect, _waitingColor);\r\n                        break;\r\n                    case ActionResult.Success:\r\n                        EditorGUI.DrawRect(rect, _successColor);\r\n                        break;\r\n                    case ActionResult.Failed:\r\n                        EditorGUI.DrawRect(rect, _failedColor);\r\n                        break;\r\n                }\r\n            }\r\n            else if(node is IAIState)\r\n            {\r\n                var state = node as IAIState;\r\n                if(state.IsActive)\r\n                {\r\n                    EditorGUI.DrawRect(rect, _activeStateColor);\r\n                }\r\n            }\r\n\r\n\r\n            if (hasChildren && _currentTable[node])\r\n            {\r\n                EditorGUI.indentLevel++;\r\n                if(node is IAIActionGroup)\r\n                {\r\n                    foreach(var child in (node as IAIActionGroup))\r\n                    {\r\n                        this.DrawNode(child);\r\n                    }\r\n                }\r\n                else if(node is IAIStateMachine)\r\n                {\r\n                    foreach (var child in (node as IAIStateMachine))\r\n                    {\r\n                        this.DrawNode(child);\r\n                    }\r\n                }\r\n                EditorGUI.indentLevel--;\r\n            }\r\n        }\r\n        \r\n        private void DrawPopup(IAINode node)\r\n        {\r\n            \r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region Static Utils\r\n\r\n        private static int GetNodeHash(IAINode node)\r\n        {\r\n            if (node is Component)\r\n            {\r\n                return (node as Component).GetInstanceID();\r\n            }\r\n            else\r\n            {\r\n                //TODO - need better method of doing this\r\n                return node.GetHashCode();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private class AITreeExpandedLookupTable\r\n        {\r\n\r\n            #region Fields\r\n\r\n            private int _ownerInstanceId;\r\n            private Dictionary<int, bool> _table = new Dictionary<int, bool>();\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            public AITreeExpandedLookupTable(AITreeController controller)\r\n            {\r\n                _ownerInstanceId = controller.GetInstanceID();\r\n            }\r\n\r\n            public AITreeExpandedLookupTable(int id)\r\n            {\r\n                _ownerInstanceId = id;\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Properties\r\n\r\n            public bool this[IAINode node]\r\n            {\r\n                get\r\n                {\r\n                    if (node.IsNullOrDestroyed()) return true;\r\n\r\n                    bool result;\r\n                    if (_table.TryGetValue(AITreeDebugWindow.GetNodeHash(node), out result))\r\n                    {\r\n                        return result;\r\n                    }\r\n                    return true;\r\n                }\r\n                set\r\n                {\r\n                    if (node.IsNullOrDestroyed()) return;\r\n\r\n                    _table[AITreeDebugWindow.GetNodeHash(node)] = value;\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Methods\r\n\r\n            public bool GetIsAlive()\r\n            {\r\n                return !EditorUtility.InstanceIDToObject(_ownerInstanceId).IsNullOrDestroyed();\r\n            }\r\n\r\n            public void Clean()\r\n            {\r\n\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTreeEditor/AI/BehaviourTree/Components/AIActionWeightsComponentInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.AI.BehaviourTree;\r\nusing com.spacepuppy.AI.BehaviourTree.Components;\r\nusing com.spacepuppy.StateMachine;\r\nusing com.spacepuppy.Utils;\r\nusing com.spacepuppy.Utils.Diminish;\r\n\r\nusing com.spacepuppyeditor.Internal;\r\nusing com.spacepuppyeditor.Utils.Diminish;\r\n\r\nnamespace com.spacepuppyeditor.AI.BehaviourTree.Components\r\n{\r\n\r\n    [CustomEditor(typeof(AIActionWeightsComponent), true)]\r\n    public class AIActionWeightsComponentInspector : SPEditor\r\n    {\r\n\r\n        #region Fields\r\n\r\n        public const string PROP_DEFAULTWEIGHT = \"_defaultWeight\";\r\n        public const string PROP_ACTIONS = \"_actions\";\r\n        public const string PROP_WEIGHTS = \"_weights\";\r\n\r\n        private SPReorderableList _lst;\r\n        private DiminishingWeightOverDurationPropertyDrawer _weightDrawer;\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            this.serializedObject.Update();\r\n            this.NormalizeActionAndWeightArrays();\r\n\r\n            _weightDrawer = new DiminishingWeightOverDurationPropertyDrawer();\r\n            _weightDrawer.DrawFoldout = false;\r\n\r\n            _lst = new SPReorderableList(this.serializedObject, this.serializedObject.FindProperty(PROP_ACTIONS));\r\n            _lst.displayAdd = false;\r\n            _lst.displayRemove = false;\r\n            _lst.draggable = false;\r\n            _lst.drawHeaderCallback += this.OnDrawHeader;\r\n            _lst.drawElementCallback += this.OnDrawElement;\r\n            _lst.elementHeight = EditorGUIUtility.singleLineHeight * 2f + 3f;\r\n        }\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n            this.NormalizeActionAndWeightArrays();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n            this.DrawPropertyField(PROP_DEFAULTWEIGHT);\r\n\r\n            _lst.DoLayoutList();\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_DEFAULTWEIGHT, PROP_ACTIONS, PROP_WEIGHTS);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n\r\n\r\n        private void NormalizeActionAndWeightArrays()\r\n        {\r\n            var go = GameObjectUtil.GetGameObjectFromSource(this.serializedObject.targetObject);\r\n            if (go == null) return;\r\n\r\n            var propActions = this.serializedObject.FindProperty(PROP_ACTIONS);\r\n            var propWeights = this.serializedObject.FindProperty(PROP_WEIGHTS);\r\n            var currentActions = go.GetComponents<IAIAction>();\r\n            IAIAction[] serializedActions = new IAIAction[propActions.arraySize];\r\n            for(int i = 0; i < serializedActions.Length; i++)\r\n            {\r\n                serializedActions[i] = propActions.GetArrayElementAtIndex(i).objectReferenceValue as IAIAction;\r\n            }\r\n\r\n            if (currentActions.Length == serializedActions.Length && currentActions.Compare(serializedActions))\r\n            {\r\n                if (propWeights.arraySize != serializedActions.Length) propWeights.arraySize = serializedActions.Length;\r\n                return;\r\n            }\r\n\r\n            var serializedWeights = (EditorHelper.GetTargetObjectOfProperty(propWeights) as DiminishingWeightOverDuration[]);\r\n            if (serializedWeights == null) serializedWeights = new DiminishingWeightOverDuration[] { };\r\n            else serializedWeights = serializedWeights.ToArray();\r\n\r\n            propActions.arraySize = currentActions.Length;\r\n            var weights = new List<DiminishingWeightOverDuration>();\r\n            float defaultWeight = this.serializedObject.FindProperty(PROP_DEFAULTWEIGHT).floatValue;\r\n            for(int i = 0; i < currentActions.Length; i++)\r\n            {\r\n                propActions.GetArrayElementAtIndex(i).objectReferenceValue = currentActions[i] as Component;\r\n\r\n                int j = serializedActions.IndexOf(currentActions[i]);\r\n                if (j >= 0 && j < serializedWeights.Length && serializedWeights[j] != null)\r\n                    weights.Add(serializedWeights[j]);\r\n                else\r\n                {\r\n                    Debug.Log(currentActions[i].GetType().Name + \" had no weight\");\r\n                    weights.Add(new DiminishingWeightOverDuration(defaultWeight));\r\n                }\r\n            }\r\n            this.serializedObject.ApplyModifiedProperties();\r\n            EditorHelper.SetTargetObjectOfProperty(propWeights, weights.ToArray());\r\n            this.serializedObject.Update();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region List Handlers\r\n\r\n        private void OnDrawHeader(Rect rect)\r\n        {\r\n            EditorGUI.LabelField(rect, \"Weights\");\r\n        }\r\n\r\n        private void OnDrawElement(Rect rect, int index, bool isActive, bool isFocused)\r\n        {\r\n            //var wl = EditorGUIUtility.labelWidth;\r\n            //var wr = Mathf.Max(rect.width - EditorGUIUtility.labelWidth, 0f);\r\n            //var wr1 = Mathf.Min(50f, wr);\r\n            //var wr2 = Mathf.Max(wr - wr1, 0f);\r\n            //var r1 = new Rect(rect.xMin, rect.yMin, wl, EditorGUIUtility.singleLineHeight);\r\n            //var r2 = new Rect(r1.xMax, rect.yMin, wr1, EditorGUIUtility.singleLineHeight);\r\n            //var r3 = new Rect(r2.xMax, rect.yMin, wr2, EditorGUIUtility.singleLineHeight);\r\n\r\n            //var propAction = this.serializedObject.FindProperty(PROP_ACTIONS).GetArrayElementAtIndex(index);\r\n            //var propWeight = this.serializedObject.FindProperty(PROP_WEIGHTS).GetArrayElementAtIndex(index);\r\n\r\n            //GUI.Label(r1, propAction.objectReferenceValue.GetType().Name);\r\n            //GUI.Label(r2, \"Weight:\");\r\n            //EditorGUI.PropertyField(r3, propWeight.FindPropertyRelative(DiminishingWeightOverDurationPropertyDrawer.PROP_WEIGHT), GUIContent.none);\r\n\r\n\r\n            //float margin = Mathf.Min(50f, rect.width * 0.1f);\r\n            //const float LBL_WIDTH = 100f;\r\n            //wl = rect.width - margin - 2f;\r\n            //wr = wl / 2f;\r\n            //wr1 = Mathf.Min(LBL_WIDTH, wr);\r\n            //wr2 = Mathf.Max(wr - wr1, 0f);\r\n\r\n            //r1 = new Rect(rect.xMin + margin, rect.yMin + EditorGUIUtility.singleLineHeight + 1f, wr1, EditorGUIUtility.singleLineHeight);\r\n            //r2 = new Rect(r1.xMax, r1.yMin, wr2, EditorGUIUtility.singleLineHeight);\r\n            //r3 = new Rect(r2.xMax + 2f, r1.yMin, wr1, EditorGUIUtility.singleLineHeight);\r\n            //var r4 = new Rect(r3.xMax, r1.yMin, wr2, EditorGUIUtility.singleLineHeight);\r\n\r\n            //GUI.Label(r1, \"Diminish Rate:\");\r\n            //EditorGUI.PropertyField(r2, propWeight.FindPropertyRelative(DiminishingWeightOverDurationPropertyDrawer.PROP_DIMINISHRATE), GUIContent.none);\r\n            //GUI.Label(r3, \"Diminish Period:\");\r\n            //EditorGUI.PropertyField(r4, propWeight.FindPropertyRelative(DiminishingWeightOverDurationPropertyDrawer.PROP_DIMINISHPERIOD), GUIContent.none);\r\n\r\n            var propAction = this.serializedObject.FindProperty(PROP_ACTIONS).GetArrayElementAtIndex(index);\r\n            var propWeight = this.serializedObject.FindProperty(PROP_WEIGHTS).GetArrayElementAtIndex(index);\r\n            _weightDrawer.OnGUI(rect, propWeight, EditorHelper.TempContent(propAction.objectReferenceValue.GetType().Name));\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTreeEditor/AI/BehaviourTree/Components/AIStateMachineComponentInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.AI.BehaviourTree;\r\nusing com.spacepuppy.AI.BehaviourTree.Components;\r\nusing com.spacepuppy.StateMachine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.AI.BehaviourTree\r\n{\r\n\r\n    [CustomEditor(typeof(AIStateMachineComponent), true)]\r\n    public class AIStateMachineComponentInspector : SPEditor\r\n    {\r\n\r\n        public const string PROP_DEFAULTSTATE = \"_defaultState\";\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            //this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n\r\n            //var cache = SPGUI.DisableIfPlaying();\r\n            //var stateProp = this.serializedObject.FindProperty(PROP_DEFAULTSTATE);\r\n\r\n            //Component[] states = null;\r\n            //var src = GameObjectUtil.GetGameObjectFromSource(this.serializedObject.targetObject);\r\n            //if (src != null) states = ParentComponentStateSupplier<IAIState>.GetComponentsOnTarg(src, false).Cast<Component>().ToArray();\r\n            //else states = new Component[] { };\r\n\r\n            //var componentLabels = (from c in states select string.Format(\"{0} ({1})\", c.name, c.GetType().Name)).ToArray();\r\n            //stateProp.objectReferenceValue = SPEditorGUILayout.SelectComponentField(stateProp.displayName, states, componentLabels, stateProp.objectReferenceValue as Component);\r\n            //cache.Reset();\r\n\r\n            //this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_DEFAULTSTATE);\r\n\r\n            this.DrawDefaultInspector();\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n\r\n\r\n            if (Application.isPlaying)\r\n            {\r\n                var machine = this.target as  AIStateMachineComponent;\r\n                if (machine.Current != null)\r\n                {\r\n                    var state = machine.Current;\r\n                    var msg = string.Format(\"Currently active state is '{0} ({1})'.\", state.DisplayName, state.GetType().Name);\r\n                    EditorGUILayout.HelpBox(msg, MessageType.Info);\r\n                }\r\n                else\r\n                {\r\n                    EditorGUILayout.HelpBox(\"Currently active state is null.\", MessageType.Info);\r\n                }\r\n            }\r\n        }\r\n\r\n        public override bool RequiresConstantRepaint()\r\n        {\r\n            return Application.isPlaying;\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTreeEditor/AI/BehaviourTree/Components/GameObjectConfigurableAIActionGroupPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.AI.BehaviourTree;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppy.AI.BehaviourTree.Components;\r\n\r\nnamespace com.spacepuppyeditor.AI.BehaviourTree.Components\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(GameObjectConfigurableAIActionGroup), true)]\r\n    public class GameObjectConfigurableAIActionGroupPropertyDrawer : ConfigurableAIActionGroupPropertyDrawer\r\n    {\r\n\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            var h = base.GetPropertyHeight(property, label);\r\n            if(this.DrawFlat || property.isExpanded)\r\n            {\r\n                h += EditorGUIUtility.singleLineHeight;\r\n            }\r\n            return h;\r\n        }\r\n\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            this.Init();\r\n\r\n            if (!this.DrawFlat)\r\n            {\r\n                var r0 = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n                position = new Rect(position.xMin, r0.yMax, position.width, position.height - r0.height);\r\n\r\n                property.isExpanded = EditorGUI.Foldout(r0, property.isExpanded, label);\r\n                if (!property.isExpanded) return;\r\n\r\n                EditorGUI.indentLevel++;\r\n            }\r\n\r\n            position = this.DrawPrimaryPortionOfInspector(position, property);\r\n\r\n            var goProp = property.FindPropertyRelative(\"_actionSequenceContainer\");\r\n            EditorGUI.PropertyField(position, goProp);\r\n\r\n            if (!this.DrawFlat)\r\n            {\r\n                EditorGUI.indentLevel--;\r\n            }\r\n        }\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTreeEditor/AI/BehaviourTree/Components/ListAIStatesPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.AI;\r\nusing com.spacepuppy.AI.BehaviourTree;\r\nusing com.spacepuppy.AI.BehaviourTree.Components;\r\nusing com.spacepuppy.StateMachine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.AI.BehaviourTree.Components\r\n{\r\n    [CustomPropertyDrawer(typeof(ListAIStatesAttribute))]\r\n    public class ListAIStatesPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var cache = SPGUI.DisableIfPlaying();\r\n\r\n            /*\r\n            Component[] states = null;\r\n            var src = GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n            if (src != null) states = ParentComponentStateSupplier<IAIState>.GetComponentsOnTarg(src, false).Cast<Component>().ToArray();\r\n            else states = new Component[] { };\r\n\r\n            var componentLabels = (from c in states select EditorHelper.TempContent(string.Format(\"{0} ({1})\", c.name, c.GetType().Name))).ToArray();\r\n            property.objectReferenceValue = SPEditorGUI.SelectComponentField(position, label, states, componentLabels, property.objectReferenceValue as Component);\r\n\r\n            cache.Reset();\r\n            */\r\n\r\n            Component[] states = null;\r\n            var src = GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n            if (src != null) states = ParentComponentStateSupplier<IAIState>.GetComponentsOnTarg(src, false).Cast<Component>().Prepend(null).ToArray();\r\n            else states = new Component[] { };\r\n\r\n            var componentLabels = (from c in states select (c != null) ? EditorHelper.TempContent(string.Format(\"{0} ({1})\", c.name, c.GetType().Name)) : EditorHelper.TempContent(\"...Nothing\")).ToArray();\r\n            property.objectReferenceValue = SPEditorGUI.SelectComponentField(position, label, states, componentLabels, property.objectReferenceValue as Component);\r\n\r\n            cache.Reset();\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTreeEditor/AI/BehaviourTree/Components/a_ChangeAIStateInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.AI;\r\nusing com.spacepuppy.AI.BehaviourTree;\r\nusing com.spacepuppy.AI.BehaviourTree.Components;\r\nusing com.spacepuppy.StateMachine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.AI.BehaviourTree.Components\r\n{\r\n\r\n    [CustomEditor(typeof(a_ChangeAIState), true)]\r\n    public class a_ChangeAIStateInspector : SPEditor\r\n    {\r\n\r\n        public static string PROP_STATEMACHINE = \"_stateMachine\";\r\n        public static string PROP_STATE = \"_state\";\r\n        public static string PROP_WAITON = \"_waitOn\";\r\n\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n\r\n            this.DrawDefaultInspectorExcept(PROP_STATEMACHINE, PROP_STATE, PROP_WAITON);\r\n\r\n            var stateMachineProp = this.serializedObject.FindProperty(PROP_STATEMACHINE);\r\n            SPEditorGUILayout.PropertyField(stateMachineProp);\r\n\r\n            var src = GameObjectUtil.GetGameObjectFromSource(stateMachineProp.objectReferenceValue);\r\n            if(src != null)\r\n            {\r\n                var states = ParentComponentStateSupplier<IAIState>.GetComponentsOnTarg(src, false).ToArray();\r\n                var stateProp = this.serializedObject.FindProperty(PROP_STATE);\r\n\r\n                int index = System.Array.IndexOf(states, stateProp.objectReferenceValue);\r\n                var names = (from s in states select EditorHelper.TempContent(s.DisplayName)).ToArray();\r\n\r\n                EditorGUI.BeginChangeCheck();\r\n                index = EditorGUILayout.Popup(EditorHelper.TempContent(\"State\"), index, names);\r\n                if(EditorGUI.EndChangeCheck())\r\n                {\r\n                    stateProp.objectReferenceValue = (index >= 0) ? states[index] as UnityEngine.Object : null;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                EditorGUILayout.LabelField(\"State\", \"*Select a State Machine first*\");\r\n            }\r\n\r\n\r\n            this.DrawPropertyField(PROP_WAITON);\r\n\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTreeEditor/AI/BehaviourTree/Components/a_IfCurrentStateIsInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.AI.BehaviourTree;\r\nusing com.spacepuppy.AI.BehaviourTree.Components;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.AI.BehaviourTree.Components\r\n{\r\n\r\n    //[CustomEditor(typeof(a_IfCurrentStateIs), true)]\r\n    public class a_IfCurrentStateIsInspector : SPEditor\r\n    {\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTreeEditor/AI/BehaviourTree/Components/a_SenseInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.AI.BehaviourTree;\r\nusing com.spacepuppy.AI.BehaviourTree.Components;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.AI.BehaviourTree.Components\r\n{\r\n\r\n    [CustomEditor(typeof(a_Sense), true)]\r\n    public class a_SenseInspector : SPEditor\r\n    {\r\n\r\n        public const string PROP_REPEAT = \"_repeat\";\r\n        public const string PROP_ALWAYSSUCCEED = \"_alwaysSucceed\";\r\n        public const string PROP_SENSOR = \"_sensor\";\r\n        public const string PROP_VARIABLE = \"_variable\";\r\n        public const string PROP_VARIABLEUPDATEPARAMS = \"_variableUpdateParams\";\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n            this.DrawPropertyField(PROP_REPEAT);\r\n            this.DrawPropertyField(PROP_ALWAYSSUCCEED);\r\n            this.DrawPropertyField(PROP_SENSOR);\r\n            this.DrawPropertyField(PROP_VARIABLE);\r\n\r\n            var prop = this.serializedObject.FindProperty(PROP_VARIABLEUPDATEPARAMS);\r\n            var e = (a_Sense.VariableUpdateOptions)prop.intValue; //prop.GetEnumValue<a_Sense.VariableUpdateOptions>();\r\n            EditorGUI.BeginChangeCheck();\r\n\r\n            bool clearPrev = EditorGUILayout.Toggle(EditorHelper.TempContent(\"Clear Previous Aspect If Unseen\", \"Purge the currently stored aspect if it's not visible. If the current field is not an aspect, it may persist if no aspect is found and this sensor is not configured to always update.\"), e.HasFlag(a_Sense.VariableUpdateOptions.ClearPreviousAspectIfUnseen));\r\n            bool onlyUpdate = EditorGUILayout.Toggle(EditorHelper.TempContent(\"Only Update Aspect If Previous Unseen\", \"The sensor will only test for a new aspect if, and only if, the previous aspect is null or unseen.\"), e.HasFlag(a_Sense.VariableUpdateOptions.OnlyUpdateAspectIfPreviousUnseen));\r\n            bool storeOnly = EditorGUILayout.Toggle(EditorHelper.TempContent(\"Store Only Position\", \"Store only the current position of the found aspect.\"), e.HasFlag(a_Sense.VariableUpdateOptions.StoreOnlyPosition));\r\n            bool alwaysUpdate = EditorGUILayout.Toggle(EditorHelper.TempContent(\"Always Update\", \"Update the variable even if no aspect is found.\"), e.HasFlag(a_Sense.VariableUpdateOptions.AlwaysUpdate));\r\n            \r\n            if(EditorGUI.EndChangeCheck())\r\n            {\r\n                e = 0;\r\n                if (clearPrev) e |= a_Sense.VariableUpdateOptions.ClearPreviousAspectIfUnseen;\r\n                if (onlyUpdate) e |= a_Sense.VariableUpdateOptions.OnlyUpdateAspectIfPreviousUnseen;\r\n                if (storeOnly) e |= a_Sense.VariableUpdateOptions.StoreOnlyPosition;\r\n                if (alwaysUpdate) e |= a_Sense.VariableUpdateOptions.AlwaysUpdate;\r\n                prop.intValue = (int)e;\r\n            }\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_REPEAT, PROP_ALWAYSSUCCEED, PROP_SENSOR, PROP_VARIABLE, PROP_VARIABLEUPDATEPARAMS);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTreeEditor/AI/BehaviourTree/ConfigurableAIActionGroupPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.AI.BehaviourTree;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.AI.BehaviourTree\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(ConfigurableAIActionGroup), true)]\r\n    public class ConfigurableAIActionGroupPropertyDrawer : PropertyDrawer\r\n    {\r\n        private const ParallelPassOptions BOTH_ANY = ParallelPassOptions.FailOnAny | ParallelPassOptions.SucceedOnAny;\r\n\r\n        private const string PROP_REPEAT = \"_repeat\";\r\n        private const string PROP_ALWAYSSUCEED = \"_alwaysSucceed\";\r\n        private const string PROP_MODE = \"_loopMode\";\r\n        private const string PROP_OPTIONS = \"_passOptions\";\r\n\r\n        public bool DrawFlat;\r\n\r\n\r\n\r\n        protected void Init()\r\n        {\r\n            if (this.fieldInfo != null)\r\n            {\r\n                var attrib = this.fieldInfo.GetCustomAttributes(typeof(ConfigurableAIActionGroup.ConfigAttribute), false).FirstOrDefault() as ConfigurableAIActionGroup.ConfigAttribute;\r\n                if (attrib != null) this.DrawFlat = attrib.DrawFlat;\r\n            }\r\n        }\r\n\r\n\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            this.Init();\r\n\r\n            if(this.DrawFlat)\r\n            {\r\n                var h = EditorGUIUtility.singleLineHeight * 3f;\r\n\r\n                var e = property.FindPropertyRelative(PROP_MODE).GetEnumValue<ActionGroupType>();\r\n                if (e == ActionGroupType.Parrallel)\r\n                {\r\n                    h += EditorGUIUtility.singleLineHeight * 3f;\r\n                }\r\n\r\n                return h;\r\n            }\r\n            else\r\n            {\r\n                if (property.isExpanded)\r\n                {\r\n                    var h = EditorGUIUtility.singleLineHeight * 4f;\r\n\r\n                    var e = property.FindPropertyRelative(PROP_MODE).GetEnumValue<ActionGroupType>();\r\n                    if (e == ActionGroupType.Parrallel)\r\n                    {\r\n                        h += EditorGUIUtility.singleLineHeight * 3f;\r\n                    }\r\n\r\n                    return h;\r\n                }\r\n                else\r\n                {\r\n                    return EditorGUIUtility.singleLineHeight;\r\n                }\r\n            }\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            this.Init();\r\n\r\n\r\n            if(!this.DrawFlat)\r\n            {\r\n                var r0 = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n                position = new Rect(position.xMin, r0.yMax, position.width, position.height - r0.height);\r\n\r\n                if (!property.isExpanded) label.text = string.Format(\"{0} ({1})\", label.text, property.FindPropertyRelative(PROP_MODE).GetEnumValue<ActionGroupType>());\r\n                property.isExpanded = EditorGUI.Foldout(r0, property.isExpanded, label);\r\n                if (!property.isExpanded) return;\r\n\r\n                EditorGUI.indentLevel++;\r\n            }\r\n\r\n            this.DrawPrimaryPortionOfInspector(position, property);\r\n\r\n            if(!this.DrawFlat)\r\n            {\r\n                EditorGUI.indentLevel--;\r\n            }\r\n        }\r\n        \r\n        protected Rect DrawPrimaryPortionOfInspector(Rect position, SerializedProperty property)\r\n        {\r\n            var r0 = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n            var r1 = new Rect(position.xMin, r0.yMax, position.width, EditorGUIUtility.singleLineHeight);\r\n            var r2 = new Rect(position.xMin, r1.yMax, position.width, EditorGUIUtility.singleLineHeight);\r\n\r\n            EditorGUI.PropertyField(r0, property.FindPropertyRelative(PROP_REPEAT));\r\n            EditorGUI.PropertyField(r1, property.FindPropertyRelative(PROP_ALWAYSSUCEED));\r\n\r\n            var eloop = property.FindPropertyRelative(PROP_MODE).GetEnumValue<ActionGroupType>();\r\n            EditorGUI.PropertyField(r2, property.FindPropertyRelative(PROP_MODE), EditorHelper.TempContent(\"Loop Mode\"));\r\n\r\n            if (eloop == ActionGroupType.Parrallel)\r\n            {\r\n                EditorGUI.indentLevel++;\r\n\r\n                var propOptions = property.FindPropertyRelative(PROP_OPTIONS);\r\n                var e = (ParallelPassOptions)propOptions.intValue;\r\n                bool both = ((e & BOTH_ANY) == BOTH_ANY);\r\n\r\n                bool failAny = e.HasFlag(ParallelPassOptions.FailOnAny);\r\n                bool passAny = e.HasFlag(ParallelPassOptions.SucceedOnAny);\r\n                bool passOnTie = e.HasFlag(ParallelPassOptions.SucceedOnTie);\r\n\r\n                var r3 = new Rect(position.xMin, r2.yMax, position.width, EditorGUIUtility.singleLineHeight);\r\n                var r4 = new Rect(position.xMin, r3.yMax, position.width, EditorGUIUtility.singleLineHeight);\r\n                var r5 = new Rect(position.xMin, r4.yMax, position.width, EditorGUIUtility.singleLineHeight);\r\n\r\n                EditorGUI.BeginChangeCheck();\r\n\r\n                failAny = EditorGUI.Popup(r3, \"Fail\", (failAny) ? 1 : 0, new string[] { \"All\", \"Any\" }) == 1;\r\n                passAny = EditorGUI.Popup(r4, \"Succeed\", (passAny) ? 1 : 0, new string[] { \"All\", \"Any\" }) == 1;\r\n                \r\n                var cache = SPGUI.DisableIf(both);\r\n                passOnTie = EditorGUI.Popup(r5, \"Tie Breaker\", (passOnTie) ? 1 : 0, new string[] { \"Fail\", \"Succeed\" }) == 1;\r\n                cache.Reset();\r\n\r\n                if (EditorGUI.EndChangeCheck())\r\n                {\r\n                    e = 0;\r\n                    if (failAny) e |= ParallelPassOptions.FailOnAny;\r\n                    if (passAny) e |= ParallelPassOptions.SucceedOnAny;\r\n                    if (passOnTie) e |= ParallelPassOptions.SucceedOnTie;\r\n                    propOptions.intValue = (int)e;\r\n                }\r\n\r\n                EditorGUI.indentLevel--;\r\n\r\n                return new Rect(position.xMin, r5.yMax, position.width, position.yMax - r5.yMax);\r\n            }\r\n            else\r\n            {\r\n                return new Rect(position.xMin, r2.yMax, position.width, position.yMax - r2.yMax);\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTreeEditor/AI/BehaviourTree/ParallelPassOptionsPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.AI.BehaviourTree;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.AI.BehaviourTree\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(ParallelPassOptions))]\r\n    public class ParallelPassOptionsPropertyDrawer : PropertyDrawer\r\n    {\r\n        private const ParallelPassOptions BOTH_ANY = ParallelPassOptions.FailOnAny | ParallelPassOptions.SucceedOnAny;\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            return EditorGUIUtility.singleLineHeight * 3f;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var e = (ParallelPassOptions)property.intValue;\r\n            bool both = ((e & BOTH_ANY) == BOTH_ANY);\r\n\r\n            bool failAny = e.HasFlag(ParallelPassOptions.FailOnAny);\r\n            bool passAny = e.HasFlag(ParallelPassOptions.SucceedOnAny);\r\n            bool passOnTie = e.HasFlag(ParallelPassOptions.SucceedOnTie);\r\n\r\n            var r1 = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n            var r2 = new Rect(position.xMin, r1.yMax, position.width, EditorGUIUtility.singleLineHeight);\r\n            var r3 = new Rect(position.xMin, r2.yMax, position.width, EditorGUIUtility.singleLineHeight);\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n\r\n            failAny = EditorGUI.Popup(r1, \"Fail\", (failAny) ? 1 : 0, new string[] { \"All\", \"Any\" }) == 1;\r\n            passAny = EditorGUI.Popup(r2, \"Succeed\", (passAny) ? 1 : 0, new string[] { \"All\", \"Any\" }) == 1;\r\n\r\n            var cache = SPGUI.DisableIf(both);\r\n            passOnTie = EditorGUI.Popup(r3, \"Tie Breaker\", (passOnTie) ? 1 : 0, new string[] { \"Fail\", \"Succeed\" }) == 1;\r\n            cache.Reset();\r\n\r\n            if(EditorGUI.EndChangeCheck())\r\n            {\r\n                e = 0;\r\n                if (failAny) e |= ParallelPassOptions.FailOnAny;\r\n                if (passAny) e |= ParallelPassOptions.SucceedOnAny;\r\n                if (passOnTie) e |= ParallelPassOptions.SucceedOnTie;\r\n                property.intValue = (int)e;\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTreeEditor/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"SpacepuppyAIBehaviourTreeEditor\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"SpacepuppyAIBehaviourTreeEditor\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"67a86be8-190b-4d68-a080-683df9d4cf09\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "SpacepuppyAIBehaviourTreeEditor/SpacepuppyAIBehaviourTreeEditor.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{67A86BE8-190B-4D68-A080-683DF9D4CF09}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>com.spacepuppyeditor</RootNamespace>\r\n    <AssemblyName>SpacepuppyUnityFrameworkEditor.AI.BehaviourTree</AssemblyName>\r\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"UnityEditor\">\r\n      <HintPath>..\\Resources\\UnityEditor.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"UnityEngine\">\r\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"AI\\BehaviourTree\\AITreeControllerInspector.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\AITreeDebugWindow.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\AIActionWeightsComponentInspector.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\AIStateMachineComponentInspector.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\a_ChangeAIStateInspector.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\a_IfCurrentStateIsInspector.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\a_SenseInspector.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\GameObjectConfigurableAIActionGroupPropertyDrawer.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\Components\\ListAIStatesPropertyDrawer.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\ConfigurableAIActionGroupPropertyDrawer.cs\" />\r\n    <Compile Include=\"AI\\BehaviourTree\\ParallelPassOptionsPropertyDrawer.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\SpacepuppyAIBehaviourTree\\SpacepuppyAIBehaviourTree.csproj\">\r\n      <Project>{b9807eba-396e-4379-800f-65cba0c47bd9}</Project>\r\n      <Name>SpacepuppyAIBehaviourTree</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppyAI\\SpacepuppyAI.csproj\">\r\n      <Project>{65a3df9e-1099-40d7-acf3-4a3989026a3d}</Project>\r\n      <Name>SpacepuppyAI</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppyBaseEditor\\SpacepuppyBaseEditor.csproj\">\r\n      <Project>{a0466ee3-9582-4c0d-965d-e2d2f9006971}</Project>\r\n      <Name>SpacepuppyBaseEditor</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\r\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\r\n      <Name>SpacepuppyBase</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>mkdir $(ProjectDir)..\\Builds\\FullLibrary\\Editor\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.AI.BehaviourTree.dll\" \"$(ProjectDir)..\\Builds\\FullLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.AI.BehaviourTree.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.AI.BehaviourTree.pdb\" \"$(ProjectDir)..\\Builds\\FullLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.AI.BehaviourTree.pdb\"</PostBuildEvent>\r\n  </PropertyGroup>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "SpacepuppyAIEditor/AI/AIControllerInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.AI;\r\nusing com.spacepuppy.StateMachine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.AI\r\n{\r\n\r\n    /// <summary>\r\n    /// \r\n    /// </summary>\r\n    /// <notes>\r\n    /// </notes>\r\n    [CustomEditor(typeof(AIController), true)]\r\n    public class AIControllerInspector : SPEditor\r\n    {\r\n\r\n        public const string PROP_STATESOURCE = \"_stateSource\";\r\n        public const string PROP_DEFAULTSTATE = \"_defaultState\";\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            var targ = this.target as AIController;\r\n            if (targ == null) return;\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n\r\n            var sourceProp = this.serializedObject.FindProperty(PROP_STATESOURCE);\r\n            SPEditorGUILayout.PropertyField(sourceProp);\r\n            \r\n            var cache = SPGUI.DisableIfPlaying();\r\n            var stateProp = this.serializedObject.FindProperty(PROP_DEFAULTSTATE);\r\n            \r\n            switch(sourceProp.GetEnumValue<AIStateMachineSourceMode>())\r\n            {\r\n                case AIStateMachineSourceMode.SelfSourced:\r\n                    {\r\n                        var states = ComponentStateSupplier<IAIState>.GetComponentsOnTarg(targ.gameObject).Cast<Component>().ToArray();\r\n                        stateProp.objectReferenceValue = SPEditorGUILayout.SelectComponentField(stateProp.displayName, states, stateProp.objectReferenceValue as Component);\r\n                    }\r\n                    break;\r\n                case AIStateMachineSourceMode.ChildSourced:\r\n                    {\r\n                        var states = ParentComponentStateSupplier<IAIState>.GetComponentsOnTarg(targ.gameObject, false);\r\n                        var names = (from s in states select EditorHelper.TempContent(GameObjectUtil.GetGameObjectFromSource(s).name + \" (\" + s.GetType().Name + \")\")).ToArray();\r\n                        int i = states.IndexOf(stateProp.objectReferenceValue);\r\n                        i = EditorGUILayout.Popup(EditorHelper.TempContent(stateProp.displayName), i, names);\r\n                        stateProp.objectReferenceValue = (i >= 0) ? states[i] as UnityEngine.Object : null;\r\n                    }\r\n                    break;\r\n                default:\r\n                    {\r\n                        var states = ArrayUtil.Empty<Component>();\r\n                        stateProp.objectReferenceValue = SPEditorGUILayout.SelectComponentField(stateProp.displayName, states, stateProp.objectReferenceValue as Component);\r\n                    }\r\n                    break;\r\n            }\r\n\r\n            cache.Reset();\r\n\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_STATESOURCE, PROP_DEFAULTSTATE);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n\r\n\r\n            if (Application.isPlaying)\r\n            {\r\n                if (targ.States != null && targ.States.Current != null)\r\n                {\r\n                    var c = targ.States.Current;\r\n                    var msg = string.Format(\"Currently active state is {0} ({1}).\", c.DisplayName, c.GetType().Name);\r\n                    EditorGUILayout.HelpBox(msg, MessageType.Info);\r\n                }\r\n                else\r\n                {\r\n                    EditorGUILayout.HelpBox(\"Currently active state is null.\", MessageType.Info);\r\n                }\r\n            }\r\n        }\r\n\r\n        public override bool RequiresConstantRepaint()\r\n        {\r\n            return Application.isPlaying;\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIEditor/AI/AISubControllerInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.AI;\r\nusing com.spacepuppy.StateMachine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.AI\r\n{\r\n\r\n    /// <summary>\r\n    /// \r\n    /// </summary>\r\n    /// <notes>\r\n    /// </notes>\r\n    [CustomEditor(typeof(AISubController), true)]\r\n    public class AISubControllerInspector : SPEditor\r\n    {\r\n\r\n        public const string PROP_STATESOURCE = \"_stateSource\";\r\n        public const string PROP_DEFAULTSTATE = \"_defaultState\";\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            var targ = this.target as AISubController;\r\n            if (targ == null) return;\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n\r\n            var sourceProp = this.serializedObject.FindProperty(PROP_STATESOURCE);\r\n            SPEditorGUILayout.PropertyField(sourceProp);\r\n\r\n            var cache = SPGUI.DisableIfPlaying();\r\n            var stateProp = this.serializedObject.FindProperty(PROP_DEFAULTSTATE);\r\n\r\n            switch (sourceProp.GetEnumValue<AIStateMachineSourceMode>())\r\n            {\r\n                case AIStateMachineSourceMode.SelfSourced:\r\n                    {\r\n                        var states = ComponentStateSupplier<IAIState>.GetComponentsOnTarg(targ.gameObject).Cast<Component>().ToArray();\r\n                        stateProp.objectReferenceValue = SPEditorGUILayout.SelectComponentField(stateProp.displayName, states, stateProp.objectReferenceValue as Component);\r\n                    }\r\n                    break;\r\n                case AIStateMachineSourceMode.ChildSourced:\r\n                    {\r\n                        var states = ParentComponentStateSupplier<IAIState>.GetComponentsOnTarg(targ.gameObject, false);\r\n                        var names = (from s in states select EditorHelper.TempContent(GameObjectUtil.GetGameObjectFromSource(s).name + \" (\" + s.GetType().Name + \")\")).ToArray();\r\n                        int i = states.IndexOf(stateProp.objectReferenceValue);\r\n                        i = EditorGUILayout.Popup(EditorHelper.TempContent(stateProp.displayName), i, names);\r\n                        stateProp.objectReferenceValue = (i >= 0) ? states[i] as UnityEngine.Object : null;\r\n                    }\r\n                    break;\r\n                default:\r\n                    {\r\n                        var states = ArrayUtil.Empty<Component>();\r\n                        stateProp.objectReferenceValue = SPEditorGUILayout.SelectComponentField(stateProp.displayName, states, stateProp.objectReferenceValue as Component);\r\n                    }\r\n                    break;\r\n            }\r\n\r\n            cache.Reset();\r\n\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_STATESOURCE, PROP_DEFAULTSTATE);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n\r\n\r\n            if (Application.isPlaying)\r\n            {\r\n                if (targ.States != null && targ.States.Current != null)\r\n                {\r\n                    EditorGUILayout.HelpBox(\"Currently active state is '\" + targ.States.Current.GetType().Name + \"'.\", MessageType.Info);\r\n                }\r\n                else\r\n                {\r\n                    EditorGUILayout.HelpBox(\"Currently active state is null.\", MessageType.Info);\r\n                }\r\n            }\r\n        }\r\n\r\n        public override bool RequiresConstantRepaint()\r\n        {\r\n            return Application.isPlaying;\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIEditor/AI/AIVariableNamePropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.AI;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.AI\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(AIVariableNameAttribute))]\r\n    public class AIVariableNamePropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n\r\n        #region Methods\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            if(property.propertyType != SerializedPropertyType.String)\r\n            {\r\n                SPEditorGUI.DefaultPropertyField(position, property, label);\r\n                return;\r\n            }\r\n\r\n            var tr = GameObjectUtil.GetTransformFromSource(property.serializedObject.targetObject);\r\n            if (tr == null)\r\n            {\r\n                SPEditorGUI.DefaultPropertyField(position, property, label);\r\n                return;\r\n            }\r\n\r\n            IAIController controller = tr.GetComponentInParent<IAIController>() ?? tr.FindComponent<IAIController>();\r\n            if(controller == null)\r\n            {\r\n                SPEditorGUI.DefaultPropertyField(position, property, label);\r\n                return;\r\n            }\r\n\r\n            var names = (controller.Variables == null) ? ArrayUtil.Empty<string>() : controller.Variables.Names.ToArray();\r\n            /*\r\n            var guiNames = (from n in names select EditorHelper.TempContent(n)).Append(EditorHelper.TempContent(\"Custom...\")).ToArray();\r\n            int index = names.IndexOf(property.stringValue);\r\n            if (index < 0) index = names.Length;\r\n            if(index == names.Length)\r\n            {\r\n                var fw = position.width - EditorGUIUtility.labelWidth;\r\n                var wl = EditorGUIUtility.labelWidth + (fw / 4f);\r\n                var wr = position.width - wl - 1f;\r\n\r\n                var rl = new Rect(position.xMin, position.yMin, wl, EditorGUIUtility.singleLineHeight);\r\n                var rr = new Rect(rl.xMax + 1f, rl.yMin, wr, EditorGUIUtility.singleLineHeight);\r\n\r\n                index = EditorGUI.Popup(rl, label, index, guiNames);\r\n                if (index >= 0 && index < names.Length)\r\n                {\r\n                    property.stringValue = names[index];\r\n                }\r\n                else\r\n                {\r\n                    property.stringValue = EditorGUI.TextField(rr, property.stringValue);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                index = EditorGUI.Popup(position, label, index, guiNames);\r\n                property.stringValue = (index >= 0 && index < names.Length) ? names[index] : null;\r\n            }\r\n            */\r\n            property.stringValue = SPEditorGUI.OptionPopupWithCustom(position, label, property.stringValue, names);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIEditor/AI/IAIStateHierarchyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.AI;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.AI\r\n{\r\n\r\n    [CustomHierarchyDrawer(typeof(IAIState))]\r\n    public class IAIStateHierarchyDrawer : HierarchyDrawer\r\n    {\r\n\r\n\r\n        private Color _activeColor = Color.blue.SetAlpha(0.1f);\r\n        private Color _inactiveColor = Color.red.SetAlpha(0.1f);\r\n\r\n        public override void OnHierarchyGUI(Rect selectionRect)\r\n        {\r\n            if (!Application.isPlaying) return;\r\n\r\n            var targ = this.Target as IAIState;\r\n            if (targ == null) return;\r\n\r\n            if(targ.IsActive)\r\n            {\r\n                EditorGUI.DrawRect(selectionRect, _activeColor);\r\n            }\r\n            else\r\n            {\r\n                EditorGUI.DrawRect(selectionRect, _inactiveColor);\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIEditor/AI/Sensors/Audible/AudibleAspectInspector.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.AI.Sensors;\nusing com.spacepuppy.AI.Sensors.Audible;\nusing com.spacepuppy.Collections;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.AI.Sensors.Audible\n{\n\n    [InitializeOnLoad]\n    [CustomEditor(typeof(AudibleAspect), true)]\n    public class AudibleAspectInspector : SPEditor\n    {\n\n        /*\n        #region OnSceneGUI\n\n        void OnSceneGUI()\n        {\n            var targ = this.target as AudibleAspect;\n            if (targ == null) return;\n            if (!targ.enabled) return;\n\n            Vector3 pos = targ.transform.position;\n            Quaternion rot = targ.transform.rotation;\n\n            var color = targ.AspectColor;\n            color.a = 0.4f;\n\n            //draw ring\n            var mat = SensorRenderUtil.ArcMaterial;\n            mat.SetColor(\"_Color\", color);\n            mat.SetFloat(\"_angle\", 1f);\n            for (int i = 0; i < mat.passCount; ++i)\n            {\n                mat.SetFloat(\"_tiltAngle\", 0f);\n                mat.SetPass(i);\n                Graphics.DrawMeshNow(PrimitiveUtil.RingMesh, Matrix4x4.TRS(pos, rot, Vector3.one * targ.Range * 2f));\n            }\n\n            var rot2 = rot * Quaternion.Euler(0f, 0f, 90f);\n            mat.SetFloat(\"_angle\", 1f);\n            mat.SetFloat(\"_tiltAngle\", 0f);\n            for (int i = 0; i < mat.passCount; ++i)\n            {\n                mat.SetPass(i);\n                Graphics.DrawMeshNow(PrimitiveUtil.RingMesh, Matrix4x4.TRS(pos, rot2, Vector3.one * targ.Range * 2f));\n                Graphics.DrawMeshNow(PrimitiveUtil.RingMesh, Matrix4x4.TRS(pos, rot2 * Quaternion.Euler(180f, 0f, 0f), Vector3.one * targ.Range * 2f));\n            }\n        }\n\n        #endregion\n        */\n\n\n        [DrawGizmo(GizmoType.Selected | GizmoType.InSelectionHierarchy | GizmoType.Active | GizmoType.Pickable)]\n        static void DrawGizmoForMyScript(AudibleAspect targ, GizmoType gizmoType)\n        {\n            Vector3 pos = targ.transform.position;\n            var color = targ.AspectColor;\n            color.a = 0.4f;\n\n            Gizmos.color = color;\n            Gizmos.DrawSphere(pos, targ.Range);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyAIEditor/AI/Sensors/Audible/AudibleSensorInspector.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.AI.Sensors;\nusing com.spacepuppy.AI.Sensors.Audible;\nusing com.spacepuppy.Collections;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.AI.Sensors.Audible\n{\n\n    [InitializeOnLoad]\n    [CustomEditor(typeof(AudibleSensor), true)]\n    public class AudibleSensorInspector : SPEditor\n    {\n\n        /*\n\n        #region OnSceneGUI\n\n        void OnSceneGUI()\n        {\n            var targ = this.target as AudibleSensor;\n            if (targ == null) return;\n            if (!targ.enabled) return;\n            \n            Vector3 pos = targ.transform.position;\n            Quaternion rot = targ.transform.rotation;\n            \n            var color = targ.SensorColor;\n            color.a = 0.4f;\n\n            //draw ring\n            var mat = SensorRenderUtil.ArcMaterial;\n            mat.SetColor(\"_Color\", color);\n            mat.SetFloat(\"_angle\", 1f);\n            for (int i = 0; i < mat.passCount; ++i)\n            {\n                mat.SetFloat(\"_tiltAngle\", 0f);\n                mat.SetPass(i);\n                Graphics.DrawMeshNow(PrimitiveUtil.RingMesh, Matrix4x4.TRS(pos, rot, Vector3.one * targ.Range * 2f));\n            }\n\n            var rot2 = rot * Quaternion.Euler(0f, 0f, 90f);\n            mat.SetFloat(\"_angle\", 1f);\n            mat.SetFloat(\"_tiltAngle\", 0f);\n            for (int i = 0; i < mat.passCount; ++i)\n            {\n                mat.SetPass(i);\n                Graphics.DrawMeshNow(PrimitiveUtil.RingMesh, Matrix4x4.TRS(pos, rot2, Vector3.one * targ.Range * 2f));\n                Graphics.DrawMeshNow(PrimitiveUtil.RingMesh, Matrix4x4.TRS(pos, rot2 * Quaternion.Euler(180f, 0f, 0f), Vector3.one * targ.Range * 2f));\n            }\n        }\n\n        #endregion\n\n        */\n\n\n        [DrawGizmo(GizmoType.Selected | GizmoType.InSelectionHierarchy | GizmoType.Active | GizmoType.Pickable)]\n        static void DrawGizmoForMyScript(AudibleSensor targ, GizmoType gizmoType)\n        {\n            Vector3 pos = targ.transform.position;\n            var color = targ.SensorColor;\n            color.a = 0.4f;\n\n            Gizmos.color = color;\n            Gizmos.DrawSphere(pos, targ.Range);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyAIEditor/AI/Sensors/SensorRenderUtil.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\n\nnamespace com.spacepuppyeditor.AI.Sensors\n{\n\n    internal static class SensorRenderUtil\n    {\n\n        #region Fields\n\n        private static Material _arcMaterial;\n        public static Material ArcMaterial\n        {\n            get\n            {\n                if (_arcMaterial == null)\n                {\n                    var shader = Shader.Find(\"SPEditor/VisualSensorArcShader\");\n                    if (shader == null)\n                    {\n                        shader = MaterialHelper.DefaultMaterial.shader;\n                    }\n                    _arcMaterial = new Material(shader);\n                    _arcMaterial.hideFlags = HideFlags.HideAndDontSave;\n                    _arcMaterial.shader.hideFlags = HideFlags.HideAndDontSave;\n                }\n                return _arcMaterial;\n            }\n        }\n\n        private static Material _lineMaterial;\n        public static Material LineMaterial\n        {\n            get\n            {\n                if (_lineMaterial == null)\n                {\n                    var shader = Shader.Find(\"SPEditor/VisualSensorLineShader\");\n                    if (shader == null)\n                    {\n                        shader = MaterialHelper.DefaultLineMaterial.shader;\n                    }\n                    _lineMaterial = new Material(shader);\n                    _lineMaterial.hideFlags = HideFlags.HideAndDontSave;\n                    _lineMaterial.shader.hideFlags = HideFlags.HideAndDontSave;\n                }\n                return _lineMaterial;\n            }\n        }\n\n        private static Material _aspectMaterial;\n        public static Material AspectMaterial\n        {\n            get\n            {\n                if (_aspectMaterial == null)\n                {\n                    var shader = Shader.Find(\"SPEditor/VisualAspectShader\");\n                    if (shader == null)\n                    {\n                        shader = MaterialHelper.DefaultMaterial.shader;\n                    }\n                    _aspectMaterial = new Material(shader);\n                    _aspectMaterial.hideFlags = HideFlags.HideAndDontSave;\n                    _aspectMaterial.shader.hideFlags = HideFlags.HideAndDontSave;\n                }\n                return _aspectMaterial;\n            }\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyAIEditor/AI/Sensors/Visual/RightCylindricalVisualSensorInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.AI.Sensors;\r\nusing com.spacepuppy.AI.Sensors.Visual;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.AI.Sensors.Visual\r\n{\r\n\r\n    [CustomEditor(typeof(RightCylindricalVisualSensor))]\r\n    public class RightCylindricalVisualSensorInspector : SPEditor\r\n    {\r\n        \r\n        #region OnInspector\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            base.OnSPInspectorGUI();\r\n\r\n            var radiusProp = this.serializedObject.FindProperty(\"_radius\");\r\n            var innerRadProp = this.serializedObject.FindProperty(\"_innerRadius\");\r\n            if (innerRadProp.floatValue < 0f) innerRadProp.floatValue = 0f;\r\n            else if (innerRadProp.floatValue > radiusProp.floatValue) innerRadProp.floatValue = radiusProp.floatValue;\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region OnSceneGUI\r\n\r\n        void OnSceneGUI()\r\n        {\r\n            var targ = this.target as RightCylindricalVisualSensor;\r\n            if (targ == null) return;\r\n            if (!targ.enabled) return;\r\n\r\n            var color = targ.SensorColor;\r\n            color.a = 0.4f;\r\n\r\n            var globalMat = Matrix4x4.TRS(targ.GetCenterInWorldSpace(), targ.transform.rotation, Vector3.one);\r\n            //var globalMat = Matrix4x4.TRS(targ.Center, Quaternion.identity, Vector3.one);\r\n            var halfHeight = targ.Height / 2.0f;\r\n\r\n            var localStart = new Vector3(halfHeight, 0f, 0f);\r\n            var localEnd = new Vector3(-halfHeight, 0f, 0f);\r\n\r\n            if (targ.Angle < 360f)\r\n            {\r\n                //##################\r\n                //PARTIAL CYLINDER\r\n\r\n                var halfAngle = targ.Angle / 2.0f;\r\n                int cnt = (int)Mathf.Floor(halfAngle / 45f);\r\n\r\n                var lineMat = SensorRenderUtil.LineMaterial;\r\n                lineMat.SetColor(\"_Color\", color);\r\n                for (int i = 0; i < lineMat.passCount; ++i)\r\n                {\r\n                    lineMat.SetPass(i);\r\n\r\n                    Vector3 linePos;\r\n                    Quaternion lineRot;\r\n                    Vector3 scale = new Vector3(1f, 0.5f, targ.Height) * 2f;\r\n                    Matrix4x4 m;\r\n\r\n                    for (int j = -cnt; j <= cnt; j++)\r\n                    {\r\n                        linePos = new Vector3(0, Mathf.Sin(j * MathUtil.PI_4), Mathf.Cos(j * MathUtil.PI_4));\r\n                        linePos *= targ.Radius - 0.05f;\r\n                        linePos.x += halfHeight;\r\n                        lineRot = Quaternion.Euler(0f, -90f, 45f * j - 90f);\r\n                        m = Matrix4x4.TRS(linePos, lineRot, scale);\r\n                        Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, globalMat * m);\r\n                    }\r\n\r\n                    //Draw Ends\r\n                    var halfRadian = halfAngle * Mathf.Deg2Rad;\r\n\r\n                    //CW END LINE\r\n                    linePos = new Vector3(0, Mathf.Sin(halfRadian), Mathf.Cos(halfRadian));\r\n                    linePos *= targ.Radius - 0.05f;\r\n                    linePos.x += halfHeight;\r\n                    lineRot = Quaternion.Euler(0f, -90f, halfAngle - 90f);\r\n                    m = Matrix4x4.TRS(linePos, lineRot, scale);\r\n                    Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, globalMat * m);\r\n\r\n                    //CW END LINE\r\n                    linePos = new Vector3(0, Mathf.Sin(-halfRadian), Mathf.Cos(-halfRadian));\r\n                    linePos *= targ.Radius - 0.05f;\r\n                    linePos.x += halfHeight;\r\n                    lineRot = Quaternion.Euler(0f, -90f, -halfAngle - 90f);\r\n                    m = Matrix4x4.TRS(linePos, lineRot, scale);\r\n                    Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, globalMat * m);\r\n\r\n                    //DRAW EXTENTS\r\n                    if(targ.InnerRadius > 0f)\r\n                    {\r\n                        var extRotUp = Quaternion.Euler(halfAngle - 2.5f, 0f, 0f);\r\n                        var extRotDown = Quaternion.Euler(-halfAngle + 2.5f, 0f, 0f);\r\n                        var r = (targ.Radius - targ.InnerRadius);\r\n                        var vUp = extRotUp * Vector3.forward * targ.InnerRadius;\r\n                        var vDown = extRotDown * Vector3.forward * targ.InnerRadius;\r\n                        var extScale = new Vector3(1f, 0.5f, r - 0.1f) * 2f;\r\n                        m = Matrix4x4.TRS(localStart + vUp, extRotUp, extScale);\r\n                        Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, globalMat * m);\r\n                        m = Matrix4x4.TRS(localEnd + vUp, extRotUp, extScale);\r\n                        Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, globalMat * m);\r\n                        m = Matrix4x4.TRS(localStart + vDown, extRotDown, extScale);\r\n                        Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, globalMat * m);\r\n                        m = Matrix4x4.TRS(localEnd + vDown, extRotDown, extScale);\r\n                        Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, globalMat * m);\r\n                    }\r\n                    else\r\n                    {\r\n                        var extRotUp = Quaternion.Euler(halfAngle - 2.5f, 0f, 0f);\r\n                        var extRotDown = Quaternion.Euler(-halfAngle + 2.5f, 0f, 0f);\r\n                        var extScale = new Vector3(1f, 0.5f, targ.Radius - 0.1f) * 2f;\r\n                        m = Matrix4x4.TRS(localStart, extRotUp, extScale);\r\n                        Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, globalMat * m);\r\n                        m = Matrix4x4.TRS(localEnd, extRotUp, extScale);\r\n                        Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, globalMat * m);\r\n                        m = Matrix4x4.TRS(localStart, extRotDown, extScale);\r\n                        Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, globalMat * m);\r\n                        m = Matrix4x4.TRS(localEnd, extRotDown, extScale);\r\n                        Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, globalMat * m);\r\n                    }\r\n                }\r\n\r\n                //Ring Caps\r\n                this.DrawCap(globalMat, color, localStart, targ.Radius, targ.Angle);\r\n                this.DrawCap(globalMat, color, localEnd, targ.Radius, targ.Angle);\r\n\r\n                //inner ring caps\r\n                if (targ.InnerRadius > 0f)\r\n                {\r\n                    this.DrawCap(globalMat, color, localStart, targ.InnerRadius, targ.Angle);\r\n                    this.DrawCap(globalMat, color, localEnd, targ.InnerRadius, targ.Angle);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                //##################\r\n                //FULL CYLINDER\r\n\r\n                var lineMat = SensorRenderUtil.LineMaterial;\r\n                lineMat.SetColor(\"_Color\", color);\r\n                for (int i = 0; i < lineMat.passCount; ++i)\r\n                {\r\n                    lineMat.SetPass(i);\r\n\r\n                    Vector3 linePos;\r\n                    Quaternion lineRot;\r\n                    Vector3 scale = new Vector3(1f, 0.5f, targ.Height) * 2f;\r\n                    Matrix4x4 m;\r\n\r\n                    for (int j = 0; j < 8; j++)\r\n                    {\r\n                        linePos = new Vector3(0, Mathf.Sin(j * MathUtil.PI_4), Mathf.Cos(j * MathUtil.PI_4));\r\n                        linePos *= targ.Radius - 0.05f;\r\n                        linePos.x += halfHeight;\r\n                        lineRot = Quaternion.Euler(0f, -90f, 45f * j - 90f);\r\n\r\n                        m = Matrix4x4.TRS(linePos, lineRot, scale);\r\n\r\n                        Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, globalMat * m);\r\n                    }\r\n                }\r\n\r\n                //Ring Caps\r\n                this.DrawCap(globalMat, color, localStart, targ.Radius, 360f);\r\n                this.DrawCap(globalMat, color, localEnd, targ.Radius, 360f);\r\n\r\n                //inner ring caps\r\n                if(targ.InnerRadius > 0f)\r\n                {\r\n                    this.DrawCap(globalMat, color, localStart, targ.InnerRadius, 360f);\r\n                    this.DrawCap(globalMat, color, localEnd, targ.InnerRadius, 360f);\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n        private void DrawCap(Matrix4x4 globalMat, Color color, Vector3 center, float radius, float angle)\r\n        {\r\n            var mat = SensorRenderUtil.ArcMaterial;\r\n            mat.SetColor(\"_Color\", color);\r\n            mat.SetFloat(\"_angle\", angle / 360f);\r\n            mat.SetFloat(\"_tiltAngle\", 0f);\r\n            for (int i = 0; i < mat.passCount; ++i)\r\n            {\r\n                mat.SetPass(i);\r\n\r\n                //get local\r\n                var arcRot = Quaternion.Euler(0f, 0f, 90f);\r\n                var scale = Vector3.one * radius * 2f;\r\n\r\n                var m = Matrix4x4.TRS(center, arcRot, scale);\r\n                Graphics.DrawMeshNow(PrimitiveUtil.RingMesh, globalMat * m);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIEditor/AI/Sensors/Visual/SphericalVisionVisualSensorInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.AI.Sensors;\r\nusing com.spacepuppy.AI.Sensors.Visual;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.AI.Sensors.Visual\r\n{\r\n\r\n    [CustomEditor(typeof(SphericalVisualSensor))]\r\n    public class SphericalVisualSensorInspector : VisualSensorInspector\r\n    {\r\n        \r\n        #region OnInspector\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            base.OnSPInspectorGUI();\r\n\r\n            var radiusProp = this.serializedObject.FindProperty(\"_radius\");\r\n            var innerRadProp = this.serializedObject.FindProperty(\"_innerRadius\");\r\n            if (innerRadProp.floatValue < 0f) innerRadProp.floatValue = 0f;\r\n            else if (innerRadProp.floatValue > radiusProp.floatValue) innerRadProp.floatValue = radiusProp.floatValue;\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region OnSceneGUI\r\n\r\n        void OnSceneGUI()\r\n        {\r\n            var targ = this.target as SphericalVisualSensor;\r\n            if (targ == null) return;\r\n            if (!targ.enabled) return;\r\n\r\n            Vector3 pos = targ.transform.position;\r\n            Quaternion rot = targ.transform.rotation;\r\n            float horAngle = Mathf.Clamp(targ.HorizontalAngle, 0f, 360f);\r\n            float verAngle = Mathf.Clamp(targ.VerticalAngle, 0f, 360f);\r\n\r\n            if(horAngle <= 0f || verAngle <= 0f)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var color = targ.SensorColor;\r\n            color.a = 0.4f;\r\n\r\n            //draw lines\r\n            var lineMat = SensorRenderUtil.LineMaterial;\r\n            lineMat.SetColor(\"_Color\", color);\r\n            for (int i = 0; i < lineMat.passCount; ++i)\r\n            {\r\n                lineMat.SetPass(i);\r\n                if(horAngle < 360f)\r\n                {\r\n                    Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, Matrix4x4.TRS(pos, rot * Quaternion.Euler(0, horAngle * 0.5f, 0f), new Vector3(1f, 1f, targ.Radius * 1.8f)));\r\n                    Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, Matrix4x4.TRS(pos, rot * Quaternion.Euler(0, horAngle * -0.5f, 0f), new Vector3(1f, 1f, targ.Radius * 1.8f)));\r\n                    if(verAngle >= 180f)\r\n                    {\r\n                        Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, Matrix4x4.TRS(pos, rot * Quaternion.Euler(90f, 0f, 90f), new Vector3(1f, 1f, targ.Radius * 1.8f)));\r\n                        Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, Matrix4x4.TRS(pos, rot * Quaternion.Euler(-90f, 0f, 90f), new Vector3(1f, 1f, targ.Radius * 1.8f)));\r\n                    }\r\n                }\r\n                if(verAngle < 180f)\r\n                {\r\n                    Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, Matrix4x4.TRS(pos, rot * Quaternion.Euler(verAngle * 0.5f, 0f, 90f), new Vector3(1f, 1f, targ.Radius * 1.8f)));\r\n                    Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, Matrix4x4.TRS(pos, rot * Quaternion.Euler(verAngle * -0.5f, 0f, 90f), new Vector3(1f, 1f, targ.Radius * 1.8f)));\r\n                    if(horAngle >= 360f)\r\n                    {\r\n                        Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, Matrix4x4.TRS(pos, rot * Quaternion.Euler(verAngle * 0.5f, 180f, 90f), new Vector3(1f, 1f, targ.Radius * 1.8f)));\r\n                        Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, Matrix4x4.TRS(pos, rot * Quaternion.Euler(verAngle * -0.5f, 180f, 90f), new Vector3(1f, 1f, targ.Radius * 1.8f)));\r\n                    }\r\n                }\r\n                if(horAngle < 360f)\r\n                {\r\n                    Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, Matrix4x4.TRS(pos, rot * Quaternion.Euler(verAngle * 0.5f, horAngle * 0.5f, 90f), new Vector3(1f, 1f, targ.Radius * 1.8f)));\r\n                    Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, Matrix4x4.TRS(pos, rot * Quaternion.Euler(verAngle * 0.5f, horAngle * -0.5f, 90f), new Vector3(1f, 1f, targ.Radius * 1.8f)));\r\n                    Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, Matrix4x4.TRS(pos, rot * Quaternion.Euler(verAngle * -0.5f, horAngle * 0.5f, 90f), new Vector3(1f, 1f, targ.Radius * 1.8f)));\r\n                    Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, Matrix4x4.TRS(pos, rot * Quaternion.Euler(verAngle * -0.5f, horAngle * -0.5f, 90f), new Vector3(1f, 1f, targ.Radius * 1.8f)));\r\n                }\r\n            }\r\n\r\n            //draw ring\r\n            var mat = SensorRenderUtil.ArcMaterial;\r\n            mat.SetColor(\"_Color\", color);\r\n            mat.SetFloat(\"_angle\", horAngle / 360f);\r\n            for (int i = 0; i < mat.passCount; ++i)\r\n            {\r\n                mat.SetFloat(\"_tiltAngle\", 0f);\r\n                mat.SetPass(i);\r\n                Graphics.DrawMeshNow(PrimitiveUtil.RingMesh, Matrix4x4.TRS(pos, rot, Vector3.one * targ.Radius * 2f));\r\n                if(verAngle < 180.0f)\r\n                {\r\n                    mat.SetFloat(\"_tiltAngle\", verAngle * 0.5f * Mathf.Deg2Rad);\r\n                    mat.SetPass(i);\r\n                    Graphics.DrawMeshNow(PrimitiveUtil.RingMesh, Matrix4x4.TRS(pos, rot, Vector3.one * targ.Radius * 2f));\r\n                    Graphics.DrawMeshNow(PrimitiveUtil.RingMesh, Matrix4x4.TRS(pos, rot, new Vector3(1f, -1f, 1f) * targ.Radius * 2f));\r\n                }\r\n            }\r\n\r\n            var rot2 = rot * Quaternion.Euler(0f, 0f, 90f);\r\n            mat.SetFloat(\"_angle\", verAngle / 360f);\r\n            mat.SetFloat(\"_tiltAngle\", 0f);\r\n            for(int i = 0; i < mat.passCount; ++i)\r\n            {\r\n                mat.SetPass(i);\r\n                Graphics.DrawMeshNow(PrimitiveUtil.RingMesh, Matrix4x4.TRS(pos, rot2, Vector3.one * targ.Radius * 2f));\r\n                if(horAngle >= 360f)\r\n                {\r\n                    Graphics.DrawMeshNow(PrimitiveUtil.RingMesh, Matrix4x4.TRS(pos, rot2 * Quaternion.Euler(180f, 0f, 0f), Vector3.one * targ.Radius * 2f));\r\n                }\r\n                else\r\n                {\r\n                    Graphics.DrawMeshNow(PrimitiveUtil.RingMesh, Matrix4x4.TRS(pos, rot2 * Quaternion.Euler(horAngle * 0.5f, 0f, 0f), Vector3.one * targ.Radius * 2f));\r\n                    Graphics.DrawMeshNow(PrimitiveUtil.RingMesh, Matrix4x4.TRS(pos, rot2 * Quaternion.Euler(horAngle * -0.5f, 0f, 0f), Vector3.one * targ.Radius * 2f));\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIEditor/AI/Sensors/Visual/TunnelVisionVisualSensorInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.AI.Sensors;\r\nusing com.spacepuppy.AI.Sensors.Visual;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.AI.Sensors.Visual\r\n{\r\n\r\n    [CustomEditor(typeof(TunnelVisionVisualSensor))]\r\n    public class TunnelVisionVisualSensorInspector : SPEditor\r\n    {\r\n        \r\n        #region OnInspector\r\n\r\n        #endregion\r\n\r\n        #region OnSceneGUI\r\n\r\n        void OnSceneGUI()\r\n        {\r\n            var targ = this.target as TunnelVisionVisualSensor;\r\n            if (targ == null) return;\r\n            if (!targ.enabled) return;\r\n\r\n            var color = targ.SensorColor;\r\n            color.a = 0.4f;\r\n\r\n            var globalMat = Matrix4x4.TRS(targ.transform.position, targ.transform.rotation, Vector3.one);\r\n\r\n            var localStart = new Vector3(0, 0f, 0f);\r\n            var localEnd = new Vector3(0f, 0f, targ.Range);\r\n\r\n\r\n            var lineMat = SensorRenderUtil.LineMaterial;\r\n            lineMat.SetColor(\"_Color\", color);\r\n            for (int i = 0; i < lineMat.passCount; ++i)\r\n            {\r\n                lineMat.SetPass(i);\r\n\r\n                Vector3 linePos;\r\n                Quaternion lineRot;\r\n                //Vector3 scale = new Vector3(1f, 0.5f, targ.Range) * 2f;\r\n                var l = targ.EndRadius - targ.StartRadius;\r\n                Vector3 scale = new Vector3(1f, 0.5f, Mathf.Sqrt(targ.Range * targ.Range + l * l)) * 2f;\r\n\r\n                for (int j = 0; j < 8; j++)\r\n                {\r\n                    //get local\r\n                    linePos = new Vector3(Mathf.Cos(j * MathUtil.PI_4), Mathf.Sin(j * MathUtil.PI_4), 0f);\r\n                    linePos *= targ.StartRadius - 0.05f;\r\n                    float angle = Mathf.Atan2(targ.StartRadius - targ.EndRadius, targ.Range) * Mathf.Rad2Deg;\r\n                    lineRot = Quaternion.Euler(0f, 0f, 45f * j - 90f) * Quaternion.Euler(angle, 0f, 0f);  //Quaternion.Euler(angle, 0f, 45f * j - 90f);\r\n\r\n                    var m = Matrix4x4.TRS(linePos, lineRot, scale);\r\n\r\n                    Graphics.DrawMeshNow(PrimitiveUtil.LineMesh, globalMat * m);\r\n                }\r\n            }\r\n\r\n            var mat = SensorRenderUtil.ArcMaterial;\r\n            mat.SetColor(\"_Color\", color);\r\n            mat.SetFloat(\"_angle\", 360f / 360f);\r\n            for (int i = 0; i < mat.passCount; ++i)\r\n            {\r\n                mat.SetFloat(\"_tiltAngle\", 0f);\r\n                mat.SetPass(i);\r\n                mat.SetPass(i);\r\n\r\n                //get local\r\n                var start = localStart;\r\n                var end = localEnd;\r\n                var arcRot = Quaternion.Euler(90f, 0f, 0f);\r\n                var scale1 = Vector3.one * targ.StartRadius * 2f;\r\n                var scale2 = Vector3.one * targ.EndRadius * 2f;\r\n\r\n                var m1 = Matrix4x4.TRS(start, arcRot, scale1);\r\n                var m2 = Matrix4x4.TRS(end, arcRot, scale2);\r\n\r\n                Graphics.DrawMeshNow(PrimitiveUtil.RingMesh, globalMat * m1);\r\n                Graphics.DrawMeshNow(PrimitiveUtil.RingMesh, globalMat * m2);\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIEditor/AI/Sensors/Visual/VisualAspectInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.AI.Sensors;\r\nusing com.spacepuppy.AI.Sensors.Visual;\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.AI.Sensors.Visual\r\n{\r\n\r\n    [InitializeOnLoad]\r\n    [CustomEditor(typeof(VisualAspect), true)]\r\n    public class VisualAspectInspector : SPEditor\r\n    {\r\n        \r\n        static VisualAspectInspector()\r\n        {\r\n            SceneView.onSceneGUIDelegate -= OnGlobalSceneGUI;\r\n            SceneView.onSceneGUIDelegate += OnGlobalSceneGUI;\r\n        }\r\n        private static void OnGlobalSceneGUI(SceneView view)\r\n        {\r\n            var go = Selection.activeGameObject;\r\n            if (go == null) return;\r\n\r\n            using (var lst = TempCollection.GetList<VisualAspect>())\r\n            {\r\n                go.FindComponents<VisualAspect>(lst);\r\n                if(lst.Count > 0)\r\n                {\r\n                    var e = lst.GetEnumerator();\r\n                    while(e.MoveNext())\r\n                    {\r\n                        DrawIcon(e.Current);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        private static void DrawIcon(VisualAspect targ)\r\n        {\r\n            SensorRenderUtil.AspectMaterial.SetColor(\"_colorSolid\", Color.black);\r\n            SensorRenderUtil.AspectMaterial.SetFloat(\"_colorAlpha\", 0.4f);\r\n\r\n            Matrix4x4 mat = Matrix4x4.TRS(targ.transform.position, Quaternion.identity, Vector3.one * 0.1f);\r\n\r\n            for (int i = 0; i < SensorRenderUtil.AspectMaterial.passCount; ++i)\r\n            {\r\n                SensorRenderUtil.AspectMaterial.SetPass(i);\r\n                Graphics.DrawMeshNow(PrimitiveUtil.GetMesh(PrimitiveType.Sphere), mat);\r\n            }\r\n\r\n            SensorRenderUtil.AspectMaterial.SetColor(\"_colorSolid\", targ.AspectColor);\r\n            SensorRenderUtil.AspectMaterial.SetFloat(\"_colorAlpha\", 0.8f);\r\n\r\n            mat = Matrix4x4.TRS(targ.transform.position, Quaternion.identity, Vector3.one * 0.08f);\r\n\r\n            for (int i = 0; i < SensorRenderUtil.AspectMaterial.passCount; ++i)\r\n            {\r\n                SensorRenderUtil.AspectMaterial.SetPass(i);\r\n                Graphics.DrawMeshNow(PrimitiveUtil.GetMesh(PrimitiveType.Sphere), mat);\r\n            }\r\n        }\r\n\r\n        [DrawGizmo(GizmoType.Selected | GizmoType.InSelectionHierarchy | GizmoType.Active)]\r\n        private static void DrawSphereGizmo(VisualAspect aspect, GizmoType gizmoType)\r\n        {\r\n            if(aspect.Radius > 0f)\r\n            {\r\n                Gizmos.color = aspect.AspectColor;\r\n                Gizmos.DrawWireSphere(aspect.transform.position, aspect.Radius);\r\n            }\r\n        }\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIEditor/AI/Sensors/Visual/VisualSensorInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.AI.Sensors;\r\nusing com.spacepuppy.AI.Sensors.Visual;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.AI.Sensors.Visual\r\n{\r\n\r\n    [CustomEditor(typeof(RightCylindricalVisualSensor), true)]\r\n    public class VisualSensorInspector : SPEditor\r\n    {\r\n\r\n        public const string PROP_LOS = \"_requiresLineOfSight\";\r\n        public const string PROP_LOS_MASK = \"_lineOfSightMask\";\r\n\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawDefaultInspectorExcept(PROP_LOS, PROP_LOS_MASK);\r\n\r\n            this.DrawPropertyField(PROP_LOS);\r\n            this.DrawPropertyField(PROP_LOS_MASK);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIEditor/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"SpacepuppyAIEditor\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"SpacepuppyAIEditor\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"1d328b9a-4f58-4c30-a8e6-38329e048055\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "SpacepuppyAIEditor/Shaders/VisualAspectShader.shader",
    "content": "﻿Shader \"SPEditor/VisualAspectShader\"\r\n{\r\n    SubShader\r\n    {\r\n\t\tBlend SrcAlpha OneMinusSrcAlpha\r\n\t\tZTest Off\r\n\t\tZWrite Off\r\n\t\tPass\r\n\t\t{\r\n\t\t\tCGPROGRAM\r\n\t\t\t\r\n\t\t\t#pragma vertex vert\r\n\t\t\t#pragma fragment frag\r\n\t\t\t\r\n\t\t\t#include \"UnityCG.cginc\"\r\n\t\r\n\t\t\tfloat4 _colorSolid;\r\n\t\t\tfloat _colorAlpha;\r\n\t\t\t\r\n\t\t\tstruct vert_out\r\n\t\t\t{\r\n\t\t\t\tfloat4 position : POSITION;\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tvert_out vert(appdata_base v)\r\n\t\t\t{\r\n\t\t\t\tvert_out tOut;\r\n\t\t\t\ttOut.position = mul(UNITY_MATRIX_MVP, v.vertex);\r\n\t\t\t\t\r\n\t\t\t\treturn tOut;\r\n\t\t\t}\r\n\t\r\n\t\t\tfloat4 frag(vert_out f) : COLOR\r\n\t\t\t{\r\n\t\t\t\treturn float4(_colorSolid.rgb, _colorAlpha);\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\tENDCG\r\n\t\t}\r\n\r\n\t\tBlend One Zero\r\n\t\tZTest LEqual\r\n\t\tPass\r\n\t\t{\r\n\t\t\tCGPROGRAM\r\n\t\t\t\r\n\t\t\t#pragma vertex vert\r\n\t\t\t#pragma fragment frag\r\n\t\t\t\r\n\t\t\t#include \"UnityCG.cginc\"\r\n\t\r\n\t\t\tfloat4 _colorSolid;\r\n\t\t\t\r\n\t\t\tstruct vert_out\r\n\t\t\t{\r\n\t\t\t\tfloat4 position : POSITION;\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tvert_out vert(appdata_base v)\r\n\t\t\t{\r\n\t\t\t\tvert_out tOut;\r\n\t\t\t\ttOut.position = mul(UNITY_MATRIX_MVP, v.vertex);\r\n\t\t\t\t\r\n\t\t\t\treturn tOut;\r\n\t\t\t}\r\n\t\r\n\t\t\tfloat4 frag(vert_out f) : COLOR\r\n\t\t\t{\r\n\t\t\t\treturn _colorSolid;\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\tENDCG\r\n\t\t}\r\n    }\r\n    FallBack \"Diffuse\"\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIEditor/Shaders/VisualAspectShader.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 2ebf07ea708244e4f8588d9b32abfbbb\nShaderImporter:\n  defaultTextures: []\n  userData: \n"
  },
  {
    "path": "SpacepuppyAIEditor/Shaders/VisualSensorArcShader.shader",
    "content": "﻿Shader \"SPEditor/VisualSensorArcShader\"\r\n{\r\n    SubShader\r\n    {\r\n\t\tBlend SrcAlpha OneMinusSrcAlpha\r\n\t\tPass\r\n\t\t{\r\n\t\t\tCGPROGRAM\r\n\t\t\t\r\n\t\t\t#pragma vertex vert\r\n\t\t\t#pragma fragment frag\r\n\t\t\t\r\n\t\t\t#include \"UnityCG.cginc\"\r\n\t\t\t\r\n\t\t\tfloat4 _Color;\r\n\r\n\t\t\tfloat _angle;\r\n\t\t\tfloat _tiltAngle;\r\n\t\t\t\r\n\t\t\tstruct vert_out\r\n\t\t\t{\r\n\t\t\t\tfloat4 position : POSITION;\r\n\t\t\t\tfloat4 texcoord : TEXCOORD0;\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tvert_out vert(appdata_base v)\r\n\t\t\t{\r\n\t\t\t\tfloat tBackAngle = 3.14159265 * 2 * (v.texcoord.y - 0.5);\r\n\t\t\t\tfloat tForwardAngle = 3.14159265 * 2 * (v.texcoord.y - 0.5) * _angle;\r\n\t\t\t\t\r\n\t\t\t\tfloat4x4 tBackRotation = float4x4(cos(-tBackAngle), 0, sin(-tBackAngle), 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  0, 1, 0, 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  -sin(-tBackAngle), 0, cos(-tBackAngle), 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  0, 0, 0, 1);\r\n\t\t\t\tfloat4x4 tTiltRotation = float4x4(1, 0, 0, 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  0, cos(_tiltAngle), -sin(_tiltAngle), 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  0, sin(_tiltAngle), cos(_tiltAngle), 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  0, 0, 0, 1);\r\n\t\t\t\tfloat4x4 tForwardRotation = float4x4(cos(tForwardAngle), 0, sin(tForwardAngle), 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t 0, 1, 0, 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t -sin(tForwardAngle), 0, cos(tForwardAngle), 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t 0, 0, 0, 1);\r\n\t\t\t\t\r\n\t\t\t\tvert_out tOut;\r\n\t\t\t\ttOut.position = mul(UNITY_MATRIX_MVP, mul(tForwardRotation, mul(tTiltRotation, mul(tBackRotation, v.vertex))));\r\n\t\t\t\ttOut.texcoord = v.texcoord;\r\n\t\t\t\t\r\n\t\t\t\treturn tOut;\r\n\t\t\t}\r\n\t\r\n\t\t\tfloat4 frag(vert_out f) : COLOR\r\n\t\t\t{\r\n\t\t\t\treturn _Color;\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\tENDCG\r\n\t\t}\r\n    }\r\n    FallBack \"Diffuse\"\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIEditor/Shaders/VisualSensorArcShader.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 168a36d19fe1a4f43acab1e8045678b5\nShaderImporter:\n  defaultTextures: []\n  userData: \n"
  },
  {
    "path": "SpacepuppyAIEditor/Shaders/VisualSensorLineShader.shader",
    "content": "﻿Shader \"SPEditor/VisualSensorLineShader\"\r\n{\r\n    SubShader\r\n    {\r\n\t\tBlend SrcAlpha OneMinusSrcAlpha\r\n\t\tPass\r\n\t\t{\r\n\t\t\tCGPROGRAM\r\n// Upgrade NOTE: excluded shader from OpenGL ES 2.0 because it does not contain a surface program or both vertex and fragment programs.\n#pragma exclude_renderers gles\n\r\n\t\t\t#pragma fragment frag\r\n\t\t\t\r\n\t\t\t#include \"UnityCG.cginc\"\r\n\t\t\t\r\n\t\t\tfloat4 _Color;\r\n\r\n\t\t\tfloat4 frag() : COLOR\r\n\t\t\t{\r\n\t\t\t\treturn _Color;\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\tENDCG\r\n\t\t}\r\n    }\r\n    FallBack \"Diffuse\"\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAIEditor/Shaders/VisualSensorLineShader.shader.meta",
    "content": "fileFormatVersion: 2\nguid: ee588280453a76b4eabd4518ada346fb\nShaderImporter:\n  defaultTextures: []\n  userData: \n"
  },
  {
    "path": "SpacepuppyAIEditor/SpacepuppyAIEditor.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{03D1E04B-9D37-4F26-9C77-4E54ADC24722}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>com.spacepuppyeditor</RootNamespace>\r\n    <AssemblyName>SpacepuppyUnityFrameworkEditor.AI</AssemblyName>\r\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile>\r\n    </TargetFrameworkProfile>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"UnityEditor, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEditor.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"UnityEngine, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"AI\\AIControllerInspector.cs\" />\r\n    <Compile Include=\"AI\\AISubControllerInspector.cs\" />\r\n    <Compile Include=\"AI\\AIVariableNamePropertyDrawer.cs\" />\r\n    <Compile Include=\"AI\\IAIStateHierarchyDrawer.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Audible\\AudibleAspectInspector.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Audible\\AudibleSensorInspector.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\SensorRenderUtil.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Visual\\RightCylindricalVisualSensorInspector.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Visual\\SphericalVisionVisualSensorInspector.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Visual\\TunnelVisionVisualSensorInspector.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Visual\\VisualAspectInspector.cs\" />\r\n    <Compile Include=\"AI\\Sensors\\Visual\\VisualSensorInspector.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\SpacepuppyAI\\SpacepuppyAI.csproj\">\r\n      <Project>{65a3df9e-1099-40d7-acf3-4a3989026a3d}</Project>\r\n      <Name>SpacepuppyAI</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppyBaseEditor\\SpacepuppyBaseEditor.csproj\">\r\n      <Project>{a0466ee3-9582-4c0d-965d-e2d2f9006971}</Project>\r\n      <Name>SpacepuppyBaseEditor</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\r\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\r\n      <Name>SpacepuppyBase</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Shaders\\VisualAspectShader.shader\" />\r\n    <None Include=\"Shaders\\VisualAspectShader.shader.meta\" />\r\n    <None Include=\"Shaders\\VisualSensorArcShader.shader\" />\r\n    <None Include=\"Shaders\\VisualSensorArcShader.shader.meta\" />\r\n    <None Include=\"Shaders\\VisualSensorLineShader.shader\" />\r\n    <None Include=\"Shaders\\VisualSensorLineShader.shader.meta\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>mkdir $(ProjectDir)..\\Builds\\FullLibrary\\Editor\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.AI.dll\" \"$(ProjectDir)..\\Builds\\FullLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.AI.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.AI.pdb\" \"$(ProjectDir)..\\Builds\\FullLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.AI.pdb\"\r\nmkdir $(ProjectDir)..\\Builds\\FullLibrary\\Editor\\Shaders\\\r\nxcopy /Y /S \"$(ProjectDir)Shaders\" \"$(ProjectDir)\\..\\Builds\\FullLibrary\\Editor\\Shaders\\\"</PostBuildEvent>\r\n  </PropertyGroup>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "SpacepuppyAnim/Anim/AnimEventScheduler.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n    public class AnimEventScheduler : System.IDisposable, IUpdateable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private ISPAnim _state;\r\n        \r\n        private CallbackInfo _endOfLineCallback;\r\n        private HashSet<CallbackInfo> _timeoutInfos = new HashSet<CallbackInfo>();\r\n        private ITempCollection<CallbackInfo> _toAddOrRemove;\r\n        private bool _inUpdate = false;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public AnimEventScheduler(ISPAnim state)\r\n        {\r\n            if (state == null) throw new System.ArgumentNullException(\"state\");\r\n            _state = state;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        internal ISPAnim Owner { get { return _state; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Clear()\r\n        {\r\n            if (_endOfLineCallback != null) _endOfLineCallback.callback = null;\r\n            if (_timeoutInfos != null && _timeoutInfos.Count > 0)\r\n            {\r\n                if (_inUpdate)\r\n                {\r\n                    if (_toAddOrRemove == null) _toAddOrRemove = TempCollection.GetList<CallbackInfo>();\r\n\r\n                    var e = _timeoutInfos.GetEnumerator();\r\n                    while(e.MoveNext())\r\n                    {\r\n                        e.Current.callback = null;\r\n                        _toAddOrRemove.Add(e.Current);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    var e = _timeoutInfos.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        _pool.Release(e.Current);\r\n                    }\r\n                    _timeoutInfos.Clear();\r\n                }\r\n            }\r\n            GameLoopEntry.UpdatePump.Remove(this);\r\n        }\r\n        \r\n        public void Schedule(System.Action<ISPAnim> callback)\r\n        {\r\n            //if (!_state.IsPlaying) throw new System.InvalidOperationException(\"Can only schedule a callback on a playing animation.\");\r\n            if (callback == null) throw new System.ArgumentNullException(\"callback\");\r\n\r\n            if (_endOfLineCallback == null) _endOfLineCallback = new CallbackInfo() { timeout = float.NaN };\r\n            _endOfLineCallback.callback += callback;\r\n\r\n            GameLoopEntry.UpdatePump.Add(this);\r\n        }\r\n\r\n        public void Schedule(System.Action<ISPAnim> callback, float timeout, ITimeSupplier timeSupplier)\r\n        {\r\n            //if (!_state.IsPlaying) throw new System.InvalidOperationException(\"Can only schedule a callback on a playing animation.\");\r\n            if (callback == null) throw new System.ArgumentNullException(\"callback\");\r\n\r\n            if(float.IsPositiveInfinity(timeout) || float.IsNaN(timeout))\r\n            {\r\n                if (_endOfLineCallback == null) _endOfLineCallback = new CallbackInfo() { timeout = float.NaN };\r\n                _endOfLineCallback.callback += callback;\r\n            }\r\n            else\r\n            {\r\n                var info = _pool.GetInstance();\r\n                info.callback = callback;\r\n                info.current = 0f;\r\n                info.timeout = timeout;\r\n                info.supplier = (timeSupplier != null) ? timeSupplier : SPTime.Normal;\r\n                if (_inUpdate)\r\n                {\r\n                    if (_toAddOrRemove == null) _toAddOrRemove = TempCollection.GetList<CallbackInfo>();\r\n                    _toAddOrRemove.Add(info);\r\n                }\r\n                else\r\n                {\r\n                    _timeoutInfos.Add(info);\r\n                }\r\n            }\r\n\r\n            GameLoopEntry.UpdatePump.Add(this);\r\n        }\r\n        \r\n        private bool ContainsWaitHandles()\r\n        {\r\n            if (_endOfLineCallback != null && _endOfLineCallback.callback != null) return true;\r\n            return _timeoutInfos.Count != 0;\r\n        }\r\n        \r\n        private void CloseOutAllEventCallbacks()\r\n        {\r\n            if (_endOfLineCallback != null && _endOfLineCallback.callback != null)\r\n            {\r\n                var a = _endOfLineCallback.callback;\r\n                _endOfLineCallback.callback = null;\r\n                try\r\n                {\r\n                    a(_state);\r\n                }\r\n                catch (System.Exception ex)\r\n                {\r\n                    Debug.LogException(ex);\r\n                }\r\n            }\r\n\r\n            if (_timeoutInfos != null && _timeoutInfos.Count > 0)\r\n            {\r\n                var e = _timeoutInfos.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    e.Current.callback(_state);\r\n                    _pool.Release(e.Current);\r\n                }\r\n                _timeoutInfos.Clear();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IUpdateable Interface\r\n\r\n        void IUpdateable.Update()\r\n        {\r\n            _inUpdate = true;\r\n            if (TestAnimComplete(_state))\r\n            {\r\n                //close them all down\r\n                this.CloseOutAllEventCallbacks();\r\n            }\r\n            else\r\n            {\r\n                if (_timeoutInfos != null && _timeoutInfos.Count > 0)\r\n                {\r\n                    var e = _timeoutInfos.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        e.Current.current += e.Current.supplier.Delta;\r\n                        if (e.Current.current >= e.Current.timeout)\r\n                        {\r\n                            var a = e.Current.callback;\r\n                            e.Current.callback = null;\r\n                            if (_toAddOrRemove == null) _toAddOrRemove = TempCollection.GetList<CallbackInfo>();\r\n                            _toAddOrRemove.Add(e.Current);\r\n\r\n                            try\r\n                            {\r\n                                a(_state);\r\n                            }\r\n                            catch (System.Exception ex)\r\n                            {\r\n                                Debug.LogException(ex);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            _inUpdate = false;\r\n\r\n            //check if any timeouts wanted to get registered while calling update\r\n            if (_toAddOrRemove != null)\r\n            {\r\n                var e = _toAddOrRemove.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (e.Current.callback == null)\r\n                    {\r\n                        //I set it null in the loop above to flag it as 'remove' rather than 'add'\r\n                        _timeoutInfos.Remove(e.Current);\r\n                        _pool.Release(e.Current);\r\n                    }\r\n                    else\r\n                    {\r\n                        _timeoutInfos.Add(e.Current);\r\n                    }\r\n                }\r\n                _toAddOrRemove.Dispose();\r\n                _toAddOrRemove = null;\r\n            }\r\n\r\n\r\n            //stop us\r\n            if (!this.ContainsWaitHandles())\r\n            {\r\n                GameLoopEntry.UpdatePump.Remove(this);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public void Dispose()\r\n        {\r\n            this.Clear();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n\r\n        private static ObjectCachePool<CallbackInfo> _pool = new ObjectCachePool<CallbackInfo>(-1, \r\n            () => new CallbackInfo(),\r\n            (info) =>\r\n            {\r\n                info.callback = null;\r\n                info.current = 0f;\r\n                info.timeout = 0f;\r\n                info.supplier = null;\r\n            });\r\n\r\n        private class CallbackInfo\r\n        {\r\n            public System.Action<ISPAnim> callback;\r\n            public float current;\r\n            public float timeout;\r\n            public ITimeSupplier supplier;\r\n        }\r\n\r\n        public static bool TestAnimComplete(ISPAnim anim)\r\n        {\r\n            if (anim == null) throw new System.ArgumentNullException(\"anim\");\r\n\r\n            if (!anim.IsPlaying) return true;\r\n\r\n            var a = anim as SPAnim;\r\n            if(a != null)\r\n            {\r\n                if (a.Controller == null || !a.Controller.isActiveAndEnabled) return true;\r\n\r\n                switch(a.WrapMode)\r\n                {\r\n                    case WrapMode.Default:\r\n                    case WrapMode.Once:\r\n                        return Time.time > (a.StartTime + a.ScaledDuration);\r\n                    case WrapMode.Loop:\r\n                    case WrapMode.PingPong:\r\n                    case WrapMode.ClampForever:\r\n                    default:\r\n                        return true;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/AnimPrimitives.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n\r\n    /// <summary>\r\n    /// In what way should the Threshold of a selector be treated.\r\n    /// A = 0.1, B = 0.5, C = 1.0\r\n    /// \r\n    /// Threshold - standard where the threshold is the max value the entry should be selected at, 0.4 would result in selection B\r\n    /// Discrete - the threshold is the initial value that it should be selected at, 0.4 would result in selection A\r\n    /// </summary>\r\n    public enum SelectorThresholdStyle\r\n    {\r\n        Threshold = 0,\r\n        Discrete = 1\r\n    }\r\n\r\n    public enum SelectorIndexStyle\r\n    {\r\n        Clamp = 0,\r\n        Wrap = 1\r\n    }\r\n\r\n    public delegate void AnimationEventCallback(object token);\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/AnimPropertyAttributes.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n    public class AnimLayerAttribute : PropertyAttribute\r\n    {\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/AnimSettings.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n\r\n    [System.Flags]\r\n    public enum AnimSettingsMask\r\n    {\r\n        Weight = 1,\r\n        Speed = 2,\r\n        Layer = 4,\r\n        WrapMode = 8,\r\n        BlendMode = 16,\r\n        TimeSupplier = 32\r\n    }\r\n\r\n    [System.Serializable]\r\n    public struct AnimSettings\r\n    {\r\n\r\n        #region Fields\r\n\r\n        public float weight;\r\n        public float speed;\r\n        public int layer;\r\n        public WrapMode wrapMode;\r\n        public AnimationBlendMode blendMode;\r\n        public SPTime timeSupplier;\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Apply(SPAnim anim)\r\n        {\r\n            anim.Weight = this.weight;\r\n            anim.Speed = this.speed;\r\n            anim.Layer = this.layer;\r\n            anim.WrapMode = this.wrapMode;\r\n            anim.BlendMode = this.blendMode;\r\n            anim.TimeSupplier = this.timeSupplier.TimeSupplier;\r\n        }\r\n\r\n        public void Apply(AnimationState anim)\r\n        {\r\n            anim.weight = this.weight;\r\n            anim.speed = this.speed;\r\n            anim.layer = this.layer;\r\n            anim.wrapMode = this.wrapMode;\r\n            anim.blendMode = this.blendMode;\r\n            if(this.timeSupplier.IsCustom)\r\n            {\r\n                anim.speed = this.speed * SPTime.GetInverseScale(this.timeSupplier.TimeSupplier);\r\n            }\r\n        }\r\n        \r\n        public void Apply(ISPAnim anim)\r\n        {\r\n            if(anim is SPAnim)\r\n            {\r\n                this.Apply(anim as SPAnim);\r\n                return;\r\n            }\r\n            //can't set weight\r\n            anim.Speed = this.speed;\r\n            anim.Layer = this.layer;\r\n            anim.WrapMode = this.wrapMode;\r\n            //can't set blend mode\r\n            anim.TimeSupplier = this.timeSupplier.TimeSupplier;\r\n        }\r\n\r\n        public void Apply(SPAnim anim, AnimSettingsMask mask)\r\n        {\r\n            if ((mask & AnimSettingsMask.Weight) != 0) anim.Weight = this.weight;\r\n            if ((mask & AnimSettingsMask.Speed) != 0) anim.Speed = this.speed;\r\n            if ((mask & AnimSettingsMask.Layer) != 0) anim.Layer = this.layer;\r\n            if ((mask & AnimSettingsMask.WrapMode) != 0) anim.WrapMode = this.wrapMode;\r\n            if ((mask & AnimSettingsMask.BlendMode) != 0) anim.BlendMode = this.blendMode;\r\n            if ((mask & AnimSettingsMask.TimeSupplier) != 0) anim.TimeSupplier = this.timeSupplier.TimeSupplier;\r\n        }\r\n\r\n        public void Apply(AnimationState anim, AnimSettingsMask mask)\r\n        {\r\n            if ((mask & AnimSettingsMask.Weight) != 0) anim.weight = this.weight;\r\n            if ((mask & AnimSettingsMask.Speed) != 0) anim.speed = this.speed;\r\n            if ((mask & AnimSettingsMask.Layer) != 0) anim.layer = this.layer;\r\n            if ((mask & AnimSettingsMask.WrapMode) != 0) anim.wrapMode = this.wrapMode;\r\n            if ((mask & AnimSettingsMask.BlendMode) != 0) anim.blendMode = this.blendMode;\r\n            if ((mask & AnimSettingsMask.TimeSupplier) != 0 && this.timeSupplier.IsCustom)\r\n            {\r\n                anim.speed = this.speed * SPTime.GetInverseScale(this.timeSupplier.TimeSupplier);\r\n            }\r\n        }\r\n\r\n        public void Apply(ISPAnim anim, AnimSettingsMask mask)\r\n        {\r\n            if (anim is SPAnim)\r\n            {\r\n                this.Apply(anim as SPAnim, mask);\r\n                return;\r\n            }\r\n            //can't set weight\r\n            if ((mask & AnimSettingsMask.Speed) != 0) anim.Speed = this.speed;\r\n            if ((mask & AnimSettingsMask.Layer) != 0) anim.Layer = this.layer;\r\n            if ((mask & AnimSettingsMask.WrapMode) != 0) anim.WrapMode = this.wrapMode;\r\n            //can't set blend mode\r\n            if ((mask & AnimSettingsMask.TimeSupplier) != 0) anim.TimeSupplier = this.timeSupplier.TimeSupplier;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n\r\n        public static readonly AnimSettings Default = new AnimSettings()\r\n        {\r\n            weight = 1f,\r\n            speed = 1f,\r\n            layer = 0,\r\n            wrapMode = WrapMode.Default,\r\n            blendMode = AnimationBlendMode.Blend\r\n        };\r\n\r\n        public static AnimSettings From(SPAnim anim)\r\n        {\r\n            return new AnimSettings()\r\n            {\r\n                weight = anim.Weight,\r\n                speed = anim.Speed,\r\n                layer = anim.Layer,\r\n                wrapMode = anim.WrapMode,\r\n                blendMode = anim.BlendMode,\r\n                timeSupplier = new SPTime(anim.TimeSupplier)\r\n            };\r\n        }\r\n\r\n        public static AnimSettings From(AnimationState anim)\r\n        {\r\n            return new AnimSettings()\r\n            {\r\n                weight = anim.weight,\r\n                speed = anim.speed,\r\n                layer = anim.layer,\r\n                wrapMode = anim.wrapMode,\r\n                blendMode = anim.blendMode\r\n            };\r\n        }\r\n\r\n        public static AnimSettings Intersect(AnimSettings settings, AnimSettings with, AnimSettingsMask mask)\r\n        {\r\n            if ((mask & AnimSettingsMask.Weight) != 0) settings.weight = with.weight;\r\n            if ((mask & AnimSettingsMask.Speed) != 0) settings.speed = with.speed;\r\n            if ((mask & AnimSettingsMask.Layer) != 0) settings.layer = with.layer;\r\n            if ((mask & AnimSettingsMask.WrapMode) != 0) settings.wrapMode = with.wrapMode;\r\n            if ((mask & AnimSettingsMask.BlendMode) != 0) settings.blendMode = with.blendMode;\r\n            if ((mask & AnimSettingsMask.TimeSupplier) != 0) settings.timeSupplier = with.timeSupplier;\r\n            return settings;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/AnimUtil.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n\r\n    public enum AnimatorType\r\n    {\r\n        Unknown = 0,\r\n        Animation,\r\n        Animator,\r\n        SPAnimController,\r\n        SPAnimator,\r\n        SPAnimSource\r\n    }\r\n\r\n    public static class AnimUtil\r\n    {\r\n\r\n        #region AnimatorType Enum\r\n\r\n        public static AnimatorType GetAnimatorType(System.Type tp)\r\n        {\r\n            if (tp == null)\r\n                return AnimatorType.Unknown;\r\n            else if (TypeUtil.IsType(tp, typeof(Animation)))\r\n                return AnimatorType.Animation;\r\n            else if (TypeUtil.IsType(tp, typeof(Animator)))\r\n                return AnimatorType.Animator;\r\n            else if (TypeUtil.IsType(tp, typeof(SPAnimationController)))\r\n                return AnimatorType.SPAnimController;\r\n            else if (TypeUtil.IsType(tp, typeof(ISPAnimator)))\r\n                return AnimatorType.SPAnimator;\r\n            else if (TypeUtil.IsType(tp, typeof(ISPAnimationSource)))\r\n                return AnimatorType.SPAnimSource;\r\n            else\r\n                return AnimatorType.Unknown;\r\n        }\r\n\r\n        public static AnimatorType GetAnimatorType(object obj)\r\n        {\r\n            if (obj == null) return AnimatorType.Unknown;\r\n            if (obj is System.Type) return GetAnimatorType(obj as System.Type);\r\n\r\n            if (obj is Animation)\r\n                return AnimatorType.Animation;\r\n            else if (obj is Animator)\r\n                return AnimatorType.Animator;\r\n            else if (obj is SPAnimationController)\r\n                return AnimatorType.SPAnimController;\r\n            else if (obj is ISPAnimator)\r\n                return AnimatorType.SPAnimator;\r\n            else if (obj is ISPAnimationSource)\r\n                return AnimatorType.SPAnimSource;\r\n            else if (obj is IProxy)\r\n                return GetAnimatorType((obj as IProxy).GetTargetType());\r\n            else\r\n                return AnimatorType.Unknown;\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region Animation Extension Methods\r\n\r\n        public static void ClearAnimations(Animation anim)\r\n        {\r\n            if (anim != null)\r\n            {\r\n                var clips = (from a in anim.Cast<AnimationState>() select a.clip).Distinct().ToArray();\r\n                foreach (var c in clips)\r\n                {\r\n                    anim.RemoveClip(c);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void Stop(this Animation animation, int layer)\r\n        {\r\n            foreach (AnimationState a in animation)\r\n            {\r\n                if (a.enabled && a.layer == layer)\r\n                {\r\n                    var nm = a.name;\r\n                    if (animation.IsPlaying(nm))\r\n                    {\r\n                        //if it was a queued animation, we need to redact... otherwise the Animation can't stop it... cause it's stupid\r\n                        int i = nm.IndexOf(\" - Queued Clone\");\r\n                        if (i >= 0) nm = nm.Substring(0, i);\r\n                        animation.Stop(nm);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISPAnim Extension Methods\r\n\r\n        public static void Play(this ISPAnim anim, float speed, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            if (anim == null) throw new System.ArgumentNullException(\"anim\");\r\n            anim.Speed = speed;\r\n            anim.Play(queueMode, playMode);\r\n        }\r\n\r\n        public static void Play(this ISPAnim anim, float speed, float startTime, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            if (anim == null) throw new System.ArgumentNullException(\"anim\");\r\n            anim.Speed = speed;\r\n            anim.Play(queueMode, playMode);\r\n            anim.Time = Mathf.Clamp(startTime, 0f, anim.Duration);\r\n        }\r\n\r\n        public static void CrossFade(this ISPAnim anim, float speed, float fadeLength, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            if (anim == null) throw new System.ArgumentNullException(\"anim\");\r\n            anim.Speed = speed;\r\n            anim.CrossFade(fadeLength, queueMode, playMode);\r\n        }\r\n\r\n        public static void CrossFade(this ISPAnim anim, float speed, float fadeLength, float startTime, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            if (anim == null) throw new System.ArgumentNullException(\"anim\");\r\n            anim.Speed = speed;\r\n            anim.CrossFade(fadeLength, queueMode, playMode);\r\n            anim.Time = Mathf.Clamp(startTime, 0f, anim.Duration);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Scheduling Methods\r\n\r\n        public static bool TrySchedule(object animtoken, System.Action<object> callback)\r\n        {\r\n            if (callback == null) throw new System.ArgumentNullException(\"callback\");\r\n            if (animtoken.IsNullOrDestroyed()) return false;\r\n\r\n            if (animtoken is ISPAnim)\r\n            {\r\n                (animtoken as ISPAnim).Schedule((a) => callback(a));\r\n                return true;\r\n            }\r\n            else if (animtoken is IRadicalWaitHandle)\r\n            {\r\n                var handle = animtoken as IRadicalWaitHandle;\r\n                if (handle.IsComplete)\r\n                {\r\n                    callback(animtoken);\r\n                }\r\n                else\r\n                {\r\n                    handle.OnComplete((h) => callback(h));\r\n                }\r\n\r\n                return true;\r\n            }\r\n            else if (animtoken is AnimationState)\r\n            {\r\n                //GameLoopEntry.Hook.StartCoroutine((animtoken as AnimationState).ScheduleLegacy((a) => callback(a)));\r\n                InvokeHandle.Begin(GameLoopEntry.UpdatePump, () => callback(animtoken), ScheduleLegacyForInvokeHandle(animtoken as AnimationState));\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                GameLoopEntry.Hook.StartCoroutine(CoroutineUtil.Wait(animtoken, callback));\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static void Schedule(this ISPAnim anim, System.Action<ISPAnim> callback, SPTimePeriod period)\r\n        {\r\n            if (anim == null) throw new System.ArgumentNullException(\"anim\");\r\n\r\n            anim.Schedule(callback, period.Seconds, period.TimeSupplier);\r\n        }\r\n\r\n        public static IRadicalYieldInstruction Wait(this ISPAnim anim, SPTimePeriod period)\r\n        {\r\n            if (anim == null) throw new System.ArgumentNullException(\"anim\");\r\n\r\n            if (!anim.IsPlaying || period.Seconds <= 0f) return null; //yielding to when a non-playing anim finishes is just one frame, yield null\r\n\r\n            if (period.Seconds == float.PositiveInfinity && anim is IRadicalYieldInstruction)\r\n                return anim as IRadicalYieldInstruction; //SPAnim can be used directly as a yield instruction to its end\r\n            else\r\n            {\r\n                var handle = RadicalWaitHandle.Create();\r\n                anim.Schedule((a) =>\r\n                {\r\n                    handle.SignalComplete();\r\n                }, period.Seconds, period.TimeSupplier);\r\n                return handle;\r\n            }\r\n        }\r\n\r\n        public static IRadicalYieldInstruction Wait(this ISPAnim anim, SPTimePeriod period, bool stopAnimOnComplete)\r\n        {\r\n            if (anim == null) throw new System.ArgumentNullException(\"anim\");\r\n\r\n            if (!anim.IsPlaying || period.Seconds <= 0f) return null; //yielding to when a non-playing anim finishes is just one frame, yield null\r\n\r\n            if (period.Seconds == float.PositiveInfinity && anim is IRadicalYieldInstruction)\r\n                return anim as IRadicalYieldInstruction; //SPAnim can be used directly as a yield instruction to its end\r\n            else\r\n            {\r\n                var handle = RadicalWaitHandle.Create();\r\n                anim.Schedule((a) =>\r\n                {\r\n                    if (stopAnimOnComplete && a.IsPlaying) a.Stop();\r\n                    handle.SignalComplete();\r\n                }, period.Seconds, period.TimeSupplier);\r\n                return handle;\r\n            }\r\n        }\r\n\r\n        public static System.Collections.IEnumerator ScheduleLegacy(this AnimationState state, System.Action<AnimationState> callback)\r\n        {\r\n            if (callback == null) throw new System.ArgumentNullException(\"callback\");\r\n\r\n            while (state != null)\r\n            {\r\n                yield return null;\r\n            }\r\n\r\n            callback(state);\r\n        }\r\n\r\n        private static System.Collections.IEnumerator ScheduleLegacyForInvokeHandle(AnimationState state)\r\n        {\r\n            while (state != null) yield return null;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/Blend/AnimationBlendGraph.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Anim.Blend\r\n{\r\n    public class AnimationBlendGraph : ISPAnim\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private AnimEventScheduler _scheduler;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n\r\n        #region ISPAnim Interface\r\n\r\n        public SPAnimationController Controller\r\n        {\r\n            get\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n        }\r\n\r\n        public int Layer\r\n        {\r\n            get\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n            set\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n        }\r\n\r\n        public float Speed\r\n        {\r\n            get\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n            set\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n        }\r\n\r\n        public ITimeSupplier TimeSupplier\r\n        {\r\n            get\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n            set\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n        }\r\n\r\n        public WrapMode WrapMode\r\n        {\r\n            get\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n            set\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n        }\r\n\r\n        public bool IsPlaying\r\n        {\r\n            get { throw new System.NotImplementedException(); }\r\n        }\r\n\r\n        public float Time\r\n        {\r\n            get\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n            set\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n        }\r\n\r\n        public float Duration\r\n        {\r\n            get\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n        }\r\n\r\n        public float ScaledTime\r\n        {\r\n            get\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n            set\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n        }\r\n\r\n        public float ScaledDuration\r\n        {\r\n            get\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n        }\r\n\r\n        public void Play(QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            throw new System.NotImplementedException();\r\n        }\r\n\r\n        public void CrossFade(float fadeLength, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            throw new System.NotImplementedException();\r\n        }\r\n        \r\n        public void Stop()\r\n        {\r\n            throw new System.NotImplementedException();\r\n        }\r\n\r\n        public void Schedule(System.Action<ISPAnim> callback)\r\n        {\r\n            if (_scheduler == null) _scheduler = new AnimEventScheduler(this);\r\n            _scheduler.Schedule(callback);\r\n        }\r\n\r\n        public void Schedule(System.Action<ISPAnim> callback, float timeout, ITimeSupplier supplier)\r\n        {\r\n            if (_scheduler == null) _scheduler = new AnimEventScheduler(this);\r\n            _scheduler.Schedule(callback, timeout, supplier);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalWaitHandle Interface\r\n\r\n        bool IRadicalYieldInstruction.IsComplete\r\n        {\r\n            get { return !this.IsPlaying; }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            yieldObject = null;\r\n            return this.IsPlaying;\r\n        }\r\n\r\n        void IRadicalWaitHandle.OnComplete(System.Action<IRadicalWaitHandle> callback)\r\n        {\r\n            if (callback == null) throw new System.ArgumentNullException(\"callback\");\r\n            if (!this.IsPlaying) throw new System.InvalidOperationException(\"Can not wait for complete on an already completed IRadicalWaitHandle.\");\r\n\r\n            this.Schedule((a) => callback(this));\r\n        }\r\n\r\n        bool IRadicalWaitHandle.Cancelled\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public bool IsDisposed\r\n        {\r\n            get;\r\n            private set;\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            if (_scheduler != null) _scheduler.Dispose();\r\n            this.IsDisposed = true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/Blend/IndexedAnimationSelector.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Anim.Blend\r\n{\r\n\r\n    /// <summary>\r\n    /// Select an animation from a indexed collection.\r\n    /// \r\n    /// Assumes that all anims in the collection operate on the same TimeSupplier.\r\n    /// </summary>\r\n    public class IndexedAnimationSelector : ICollection<ISPAnim>, ISPAnim\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private SelectorIndexStyle _indexStyle;\r\n        private List<ISPAnim> _states = new List<ISPAnim>();\r\n\r\n        private int _layer;\r\n        private float _speed = 1f;\r\n        private ITimeSupplier _timeSupplier;\r\n        private float _fadeLength;\r\n        private int _currentIndex;\r\n        private ISPAnim _currentState;\r\n\r\n        private SPAnimationController _controller;\r\n        private AnimEventScheduler _scheduler;\r\n\r\n        #endregion\r\n        \r\n        #region CONSTRUCTOR\r\n\r\n        public IndexedAnimationSelector(SPAnimationController controller, int layer = 0)\r\n        {\r\n            _controller = controller;\r\n            _indexStyle = SelectorIndexStyle.Clamp;\r\n            _layer = layer;\r\n        }\r\n\r\n        public IndexedAnimationSelector(SPAnimationController controller, SelectorIndexStyle indexStyle, int layer = 0)\r\n        {\r\n            _controller = controller;\r\n            _indexStyle = indexStyle;\r\n            _layer = layer;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public SelectorIndexStyle IndexStyle\r\n        {\r\n            get { return _indexStyle; }\r\n            set\r\n            {\r\n                _indexStyle = value;\r\n            }\r\n        }\r\n\r\n        public float FadeLength\r\n        {\r\n            get { return _fadeLength; }\r\n            set { _fadeLength = value; }\r\n        }\r\n\r\n        public int Index\r\n        {\r\n            get { return _currentIndex; }\r\n            set\r\n            {\r\n                if (_states.Count == 0)\r\n                {\r\n                    _currentIndex = 0;\r\n                }\r\n                else\r\n                {\r\n                    switch(_indexStyle)\r\n                    {\r\n                        case SelectorIndexStyle.Clamp:\r\n                            _currentIndex = Mathf.Clamp(value, _states.Count - 1, 0);\r\n                            break;\r\n                        case SelectorIndexStyle.Wrap:\r\n                            _currentIndex = MathUtil.Wrap(value, _states.Count, 0);\r\n                            break;\r\n                        default:\r\n                            _currentIndex = 0;\r\n                            break;\r\n                    }\r\n                    if (this.IsPlaying) this.PlayAnimationAtCurrentPosition();\r\n                }\r\n            }\r\n        }\r\n\r\n        public ISPAnim this[int index]\r\n        {\r\n            get { return _states[index]; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public ISPAnim GetAnimAtIndex(int index)\r\n        {\r\n            return _states[index];\r\n        }\r\n\r\n        private void PlayAnimationAtCurrentPosition(QueueMode queueMode = QueueMode.CompleteOthers, PlayMode playMode = PlayMode.StopSameLayer, float? crossFadeOverride = null)\r\n        {\r\n            if (_states.Count == 0)\r\n            {\r\n                this.Stop();\r\n                return;\r\n            }\r\n\r\n            switch (_indexStyle)\r\n            {\r\n                case SelectorIndexStyle.Clamp:\r\n                    _currentIndex = Mathf.Clamp(_currentIndex, _states.Count - 1, 0);\r\n                    break;\r\n                case SelectorIndexStyle.Wrap:\r\n                    _currentIndex = MathUtil.Wrap(_currentIndex, _states.Count, 0);\r\n                    break;\r\n                default:\r\n                    _currentIndex = 0;\r\n                    break;\r\n            }\r\n\r\n            var state = _states[_currentIndex];\r\n\r\n            if (state == null)\r\n            {\r\n                if (_currentState != null) _currentState.Stop();\r\n                _currentState = null;\r\n                return;\r\n            }\r\n            else if (state == _currentState && state.IsPlaying)\r\n            {\r\n                if (state.Speed != _speed) state.Speed = _speed;\r\n                return;\r\n            }\r\n\r\n            _currentState = state;\r\n            _currentState.TimeSupplier = _timeSupplier;\r\n            _currentState.Layer = _layer;\r\n            float fade = (crossFadeOverride != null) ? crossFadeOverride.Value : _fadeLength;\r\n            if (fade <= 0f)\r\n            {\r\n                _currentState.Play(_speed, queueMode, playMode);\r\n            }\r\n            else\r\n            {\r\n                _currentState.CrossFade(_speed, fade, queueMode, playMode);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISPAnim Interface\r\n\r\n        public SPAnimationController Controller\r\n        {\r\n            get { return _controller; }\r\n        }\r\n\r\n        public int Layer\r\n        {\r\n            get { return _layer; }\r\n            set { _layer = value; }\r\n        }\r\n\r\n        public float Speed\r\n        {\r\n            get { return _speed; }\r\n            set\r\n            {\r\n                _speed = value;\r\n                if (_currentState != null) _currentState.Speed = _speed;\r\n            }\r\n        }\r\n\r\n        public WrapMode WrapMode\r\n        {\r\n            get\r\n            {\r\n                return WrapMode.Default;\r\n            }\r\n            set\r\n            {\r\n                //do nothing\r\n            }\r\n        }\r\n\r\n        public ITimeSupplier TimeSupplier\r\n        {\r\n            get { return _timeSupplier ?? SPTime.Normal; }\r\n            set\r\n            {\r\n                if (_timeSupplier == value) return;\r\n\r\n                _timeSupplier = value;\r\n                if (_currentState != null)\r\n                    _currentState.TimeSupplier = _timeSupplier;\r\n            }\r\n        }\r\n\r\n        public bool IsPlaying\r\n        {\r\n            get { return _currentState != null && _currentState.IsPlaying; }\r\n        }\r\n\r\n        public float Time\r\n        {\r\n            get\r\n            {\r\n                return (_currentState != null) ? _currentState.Time : 0f;\r\n            }\r\n            set\r\n            {\r\n                if (_currentState != null) _currentState.Time = value;\r\n            }\r\n        }\r\n\r\n        public float Duration\r\n        {\r\n            get\r\n            {\r\n                return (_currentState != null) ? _currentState.Duration : 0f;\r\n            }\r\n        }\r\n\r\n        public float ScaledTime\r\n        {\r\n            get\r\n            {\r\n                var spd = this.Speed;\r\n                if (spd == 0f) return 0f;\r\n\r\n                return this.Time / spd;\r\n            }\r\n            set\r\n            {\r\n                this.Time = value * this.Speed;\r\n            }\r\n        }\r\n\r\n        public float ScaledDuration\r\n        {\r\n            get\r\n            {\r\n                var spd = this.Speed;\r\n                if (spd == 0f) return float.PositiveInfinity;\r\n\r\n                return Mathf.Abs(this.Duration / spd);\r\n            }\r\n        }\r\n\r\n        public void Play(QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            this.PlayAnimationAtCurrentPosition(queueMode, playMode);\r\n        }\r\n        \r\n        public void CrossFade(float fadeLength, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            this.PlayAnimationAtCurrentPosition(queueMode, playMode, fadeLength);\r\n        }\r\n        \r\n        public void Stop()\r\n        {\r\n            if (_currentState != null)\r\n            {\r\n                _currentState.Stop();\r\n                _currentState = null;\r\n            }\r\n        }\r\n\r\n        public void Schedule(System.Action<ISPAnim> callback)\r\n        {\r\n            if (_scheduler == null) _scheduler = new AnimEventScheduler(this);\r\n            _scheduler.Schedule(callback);\r\n        }\r\n\r\n        public void Schedule(System.Action<ISPAnim> callback, float timeout, ITimeSupplier supplier)\r\n        {\r\n            if (_scheduler == null) _scheduler = new AnimEventScheduler(this);\r\n            _scheduler.Schedule(callback, timeout, supplier);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalWaitHandle Interface\r\n\r\n        bool IRadicalYieldInstruction.IsComplete\r\n        {\r\n            get { return !this.IsPlaying; }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            yieldObject = null;\r\n            return this.IsPlaying;\r\n        }\r\n\r\n        void IRadicalWaitHandle.OnComplete(System.Action<IRadicalWaitHandle> callback)\r\n        {\r\n            if (callback == null) throw new System.ArgumentNullException(\"callback\");\r\n            if (!this.IsPlaying) throw new System.InvalidOperationException(\"Can not wait for complete on an already completed IRadicalWaitHandle.\");\r\n\r\n            this.Schedule((a) => callback(this));\r\n        }\r\n\r\n        bool IRadicalWaitHandle.Cancelled\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        public void Add(ISPAnim item)\r\n        {\r\n            if (item == null) throw new System.ArgumentNullException(\"item\");\r\n            _states.Add(item);\r\n        }\r\n\r\n        public bool Contains(ISPAnim state)\r\n        {\r\n            return _states.Contains(state);\r\n        }\r\n\r\n        public bool Remove(ISPAnim state)\r\n        {\r\n            if(_states.Remove(state))\r\n            {\r\n                if (this.IsPlaying) this.PlayAnimationAtCurrentPosition();\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            this.Stop();\r\n            _states.Clear();\r\n        }\r\n\r\n        public void CopyTo(ISPAnim[] array, int arrayIndex)\r\n        {\r\n            _states.CopyTo(array);\r\n        }\r\n\r\n        public int Count\r\n        {\r\n            get { return _states.Count; }\r\n        }\r\n\r\n        bool ICollection<ISPAnim>.IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        public IEnumerator<ISPAnim> GetEnumerator()\r\n        {\r\n            return _states.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _states.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public bool IsDisposed\r\n        {\r\n            get\r\n            {\r\n                if (object.ReferenceEquals(_controller, null)) return true;\r\n                if (_controller == null)\r\n                {\r\n                    //dead but still active\r\n                    this.Dispose();\r\n                    return true;\r\n                }\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            _controller = null;\r\n            if (_scheduler != null) _scheduler.Dispose();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/Blend/LinearAnimationBlend.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Anim.Blend\r\n{\r\n\r\n    /// <summary>\r\n    /// Select an animation across a linear gradient and blends them together.\r\n    /// \r\n    /// Assumes that all anims in the collection operate on the same TimeSupplier.\r\n    /// </summary>\r\n    public class LinearAnimationBlend : ICollection<LinearAnimationBlend.StateData>, ISPAnim\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private List<StateData> _states = new List<StateData>();\r\n\r\n        private int _layer;\r\n        private float _speed = 1f;\r\n        private ITimeSupplier _timeSupplier;\r\n        private float _currentT;\r\n        private StateData _currentStateL;\r\n        private StateData _currentStateH;\r\n\r\n        private SPAnimationController _controller;\r\n        private AnimEventScheduler _scheduler;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public LinearAnimationBlend(SPAnimationController controller, int layer = 0)\r\n        {\r\n            _controller = controller;\r\n            _layer = layer;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float Position\r\n        {\r\n            get { return _currentT; }\r\n            set\r\n            {\r\n                if(_states.Count == 0)\r\n                {\r\n                    _currentT = 0;\r\n                }\r\n                else\r\n                {\r\n                    _currentT = Mathf.Clamp(value, 0f, _states.Last().Position);\r\n                    if (_currentStateL != null) this.PlayAnimationAtCurrentPosition();\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public StateData Add(ISPAnim state, float pos)\r\n        {\r\n            if (state == null) throw new System.ArgumentNullException(\"state\");\r\n\r\n            var data = new StateData(this, state, pos);\r\n            _states.Add(data);\r\n            _states.Sort(SortSubStates);\r\n\r\n            if (_currentStateL != null) this.PlayAnimationAtCurrentPosition();\r\n\r\n            return data;\r\n        }\r\n\r\n        private void PlayAnimationAtCurrentPosition(QueueMode queueMode = QueueMode.CompleteOthers, PlayMode mode = PlayMode.StopSameLayer)\r\n        {\r\n            if(_states.Count == 0)\r\n            {\r\n                this.Stop();\r\n                return;\r\n            }\r\n\r\n            StateData stateL = null;\r\n            StateData stateH = null;\r\n            for (int i = 0; i < _states.Count; i++)\r\n            {\r\n                if (_currentT <= _states[i].Position)\r\n                {\r\n                    stateH = _states[i];\r\n                    stateL = (i - 1 >= 0) ? _states[i - 1] : null;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            //TODO - implement blend\r\n            if (stateL != null)\r\n            {\r\n                stateL.Anim.Play(QueueMode.PlayNow);\r\n                if (stateH != null)\r\n                {\r\n                    float w = MathUtil.PercentageMinMax(_currentT, stateH.Position, stateL.Position);\r\n                    Debug.Log(string.Format(\"{0}, {1}, {2}, {3}\", _currentT, stateH.Position, stateL.Position, w));\r\n                    stateH.Anim.Controller.animation.Blend((stateH.Anim as SPAnim).ClipId, w);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                stateH.Anim.Play(QueueMode.PlayNow);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISPAnim Interface\r\n\r\n        public SPAnimationController Controller\r\n        {\r\n            get { return _controller; }\r\n        }\r\n\r\n        public int Layer\r\n        {\r\n            get { return _layer; }\r\n            set { _layer = value; }\r\n        }\r\n\r\n        public float Speed\r\n        {\r\n            get { return _speed; }\r\n            set\r\n            {\r\n                _speed = value;\r\n                if (_currentStateL != null) _currentStateL.Anim.Speed = _speed;\r\n                if (_currentStateH != null) _currentStateH.Anim.Speed = _speed;\r\n            }\r\n        }\r\n\r\n        public ITimeSupplier TimeSupplier\r\n        {\r\n            get { return _timeSupplier ?? SPTime.Normal; }\r\n            set\r\n            {\r\n                if (_timeSupplier == value) return;\r\n\r\n                _timeSupplier = value;\r\n                if (_currentStateL != null)\r\n                    _currentStateL.Anim.TimeSupplier = _timeSupplier;\r\n                if (_currentStateH != null)\r\n                    _currentStateH.Anim.TimeSupplier = _timeSupplier;\r\n            }\r\n        }\r\n\r\n        public WrapMode WrapMode\r\n        {\r\n            get\r\n            {\r\n                return WrapMode.Default;\r\n            }\r\n            set\r\n            {\r\n                //do nothing\r\n            }\r\n        }\r\n\r\n        public bool IsPlaying\r\n        {\r\n            get { return _currentStateL != null; }\r\n        }\r\n\r\n        public float Time\r\n        {\r\n            get\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n            set\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n        }\r\n\r\n        public float Duration\r\n        {\r\n            get\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n        }\r\n\r\n        public float ScaledTime\r\n        {\r\n            get\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n            set\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n        }\r\n\r\n        public float ScaledDuration\r\n        {\r\n            get\r\n            {\r\n                throw new System.NotImplementedException();\r\n            }\r\n        }\r\n\r\n        public void Play(QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            this.PlayAnimationAtCurrentPosition(queueMode, playMode);\r\n        }\r\n        \r\n        public void CrossFade(float fadeLength, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            this.PlayAnimationAtCurrentPosition(queueMode, playMode);\r\n        }\r\n        \r\n        public void Stop()\r\n        {\r\n            if (_currentStateL != null)\r\n            {\r\n                _currentStateL.Anim.Stop();\r\n                _currentStateL = null;\r\n            }\r\n            if (_currentStateH != null)\r\n            {\r\n                _currentStateH.Anim.Stop();\r\n                _currentStateH = null;\r\n            }\r\n        }\r\n\r\n        public void Schedule(System.Action<ISPAnim> callback)\r\n        {\r\n            if (_scheduler == null) _scheduler = new AnimEventScheduler(this);\r\n            _scheduler.Schedule(callback);\r\n        }\r\n\r\n        public void Schedule(System.Action<ISPAnim> callback, float timeout, ITimeSupplier supplier)\r\n        {\r\n            if (_scheduler == null) _scheduler = new AnimEventScheduler(this);\r\n            _scheduler.Schedule(callback, timeout, supplier);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalWaitHandle Interface\r\n\r\n        bool IRadicalYieldInstruction.IsComplete\r\n        {\r\n            get { return !this.IsPlaying; }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            yieldObject = null;\r\n            return this.IsPlaying;\r\n        }\r\n\r\n        void IRadicalWaitHandle.OnComplete(System.Action<IRadicalWaitHandle> callback)\r\n        {\r\n            if (callback == null) throw new System.ArgumentNullException(\"callback\");\r\n            if (!this.IsPlaying) throw new System.InvalidOperationException(\"Can not wait for complete on an already completed IRadicalWaitHandle.\");\r\n\r\n            this.Schedule((a) => callback(this));\r\n        }\r\n\r\n        bool IRadicalWaitHandle.Cancelled\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        void ICollection<StateData>.Add(StateData item)\r\n        {\r\n            throw new System.NotSupportedException();\r\n        }\r\n\r\n        public bool Contains(StateData state)\r\n        {\r\n            return _states.Contains(state);\r\n        }\r\n\r\n        public bool Remove(StateData state)\r\n        {\r\n            if(_states.Remove(state))\r\n            {\r\n                state.Purge();\r\n                return _states.Remove(state);\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            this.Stop();\r\n            foreach (var s in _states) s.Purge();\r\n            _states.Clear();\r\n        }\r\n\r\n        public void CopyTo(StateData[] array, int arrayIndex)\r\n        {\r\n            _states.CopyTo(array);\r\n        }\r\n\r\n        public int Count\r\n        {\r\n            get { return _states.Count; }\r\n        }\r\n\r\n        bool ICollection<StateData>.IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        public IEnumerator<StateData> GetEnumerator()\r\n        {\r\n            return _states.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _states.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public bool IsDisposed\r\n        {\r\n            get\r\n            {\r\n                if (object.ReferenceEquals(_controller, null)) return true;\r\n                if (_controller == null)\r\n                {\r\n                    //dead but still active\r\n                    this.Dispose();\r\n                    return true;\r\n                }\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            _controller = null;\r\n            if (_scheduler != null) _scheduler.Dispose();\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n\r\n        #region Static Utils\r\n\r\n        private static int SortSubStates(StateData a, StateData b)\r\n        {\r\n            if (a.Position < b.Position) return -1;\r\n            else if (a.Position > b.Position) return 1;\r\n            else return 0;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public class StateData\r\n        {\r\n            private LinearAnimationBlend _owner;\r\n            private ISPAnim _anim;\r\n            private float _pos;\r\n\r\n\r\n            internal StateData(LinearAnimationBlend owner, ISPAnim anim, float pos)\r\n            {\r\n                _owner = owner;\r\n                _anim = anim;\r\n                _pos = pos;\r\n            }\r\n\r\n            public ISPAnim Anim\r\n            {\r\n                get { return _anim; }\r\n                set\r\n                {\r\n                    if (value == null) throw new System.ArgumentNullException(\"value\");\r\n                    _anim = value;\r\n                    if(_owner != null && _owner.IsPlaying && (_owner._currentStateL == this || _owner._currentStateH == this))\r\n                    {\r\n                        _owner.PlayAnimationAtCurrentPosition();\r\n                    }\r\n                }\r\n            }\r\n\r\n            public float Position\r\n            {\r\n                get { return _pos; }\r\n                set\r\n                {\r\n                    _pos = value;\r\n                    if(_owner != null && _owner.IsPlaying) _owner.PlayAnimationAtCurrentPosition();\r\n                }\r\n            }\r\n\r\n\r\n            internal void Purge()\r\n            {\r\n                _owner = null;\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/Blend/LinearAnimationSelector.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Anim.Blend\r\n{\r\n\r\n    /// <summary>\r\n    /// Select an animation across a linear gradient.\r\n    /// \r\n    /// Assumes that all anims in the collection operate on the same TimeSupplier.\r\n    /// </summary>\r\n    public class LinearAnimationSelector : ICollection<LinearAnimationSelector.StateData>, ISPAnim\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        private SelectorThresholdStyle _thresholdStyle;\r\n        private List<StateData> _states = new List<StateData>();\r\n\r\n        private int _layer;\r\n        private float _speed = 1f;\r\n        private ITimeSupplier _timeSupplier;\r\n        private float _currentT;\r\n        private StateData _currentState;\r\n\r\n        private SPAnimationController _controller;\r\n        private AnimEventScheduler _scheduler;\r\n\r\n        private Queue<QueueData> _positionQueue = new Queue<QueueData>();\r\n        private bool _queuePositionScheduledCallbackIsActive = false;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public LinearAnimationSelector(SPAnimationController controller, int layer = 0)\r\n        {\r\n            _controller = controller;\r\n            _thresholdStyle = SelectorThresholdStyle.Threshold;\r\n            _layer = layer;\r\n        }\r\n\r\n        public LinearAnimationSelector(SPAnimationController controller, SelectorThresholdStyle thresholdStyle, int layer = 0)\r\n        {\r\n            _controller = controller;\r\n            _thresholdStyle = thresholdStyle;\r\n            _layer = layer;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public SelectorThresholdStyle ThresholdStyle\r\n        {\r\n            get { return _thresholdStyle; }\r\n            set\r\n            {\r\n                _thresholdStyle = value;\r\n                if (this.IsPlaying) this.PlayAnimationAtCurrentPosition();\r\n            }\r\n        }\r\n\r\n        public float Position\r\n        {\r\n            get { return _currentT; }\r\n            set\r\n            {\r\n                if (_states.Count == 0)\r\n                {\r\n                    _currentT = 0;\r\n                }\r\n                else\r\n                {\r\n                    //_currentT = Mathf.Clamp(value, Mathf.Min(_states[0].Threshold, 0f), _states.Last().Threshold);\r\n                    _currentT = value;\r\n                    if (this.IsPlaying) this.PlayAnimationAtCurrentPosition();\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public StateData Add(ISPAnim state, float threshold, float fadeLength = 0f)\r\n        {\r\n            if (state == null) throw new System.ArgumentNullException(\"state\");\r\n\r\n            var data = new StateData(this, state, threshold, fadeLength);\r\n            _states.Add(data);\r\n            _states.Sort(SortSubStates);\r\n\r\n            if (this.IsPlaying) this.PlayAnimationAtCurrentPosition();\r\n\r\n            return data;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Change the position value once the currently selected animation is done. \r\n        /// </summary>\r\n        /// <param name=\"pos\"></param>\r\n        public void QueuePositionChange(float pos, PlayMode playMode = PlayMode.StopSameLayer, bool overwritePreviouslyQueued = false)\r\n        {\r\n            if(!this.IsPlaying)\r\n            {\r\n                this.Position = pos;\r\n                this.Play(QueueMode.PlayNow, playMode);\r\n            }\r\n            else\r\n            {\r\n                if (overwritePreviouslyQueued) _positionQueue.Clear();\r\n                _positionQueue.Enqueue(new QueueData(pos, playMode));\r\n                if(!_queuePositionScheduledCallbackIsActive)\r\n                {\r\n                    this.Schedule(this.QueuePositionScheduledCallback);\r\n                    _queuePositionScheduledCallbackIsActive = true;\r\n                }\r\n            }\r\n        }\r\n\r\n        private void QueuePositionScheduledCallback(ISPAnim state)\r\n        {\r\n            if(_positionQueue.Count == 0) return;\r\n\r\n            var data = _positionQueue.Dequeue();\r\n            this.Position = data.Position;\r\n            this.Play(QueueMode.PlayNow, data.PlayMode);\r\n\r\n            if(_positionQueue.Count > 0)\r\n            {\r\n                this.Schedule(this.QueuePositionScheduledCallback);\r\n            }\r\n            else\r\n            {\r\n                _queuePositionScheduledCallbackIsActive = false;\r\n            }\r\n        }\r\n\r\n        public ISPAnim GetAnimationAtPosition(float pos)\r\n        {\r\n            var data = this.GetAnimationDataAtPosition(pos);\r\n            if (data == null) return null;\r\n            return data.Anim;\r\n        }\r\n\r\n        private StateData GetAnimationDataAtPosition(float pos)\r\n        {\r\n            if (_states.Count == 0)\r\n            {\r\n                return null;\r\n            }\r\n\r\n            switch (_thresholdStyle)\r\n            {\r\n                case SelectorThresholdStyle.Threshold:\r\n                    for (int i = 0; i < _states.Count; i++)\r\n                    {\r\n                        if (pos <= _states[i].Threshold)\r\n                        {\r\n                            return _states[i];\r\n                        }\r\n                    }\r\n                    break;\r\n                case SelectorThresholdStyle.Discrete:\r\n                    for (int i = _states.Count - 1; i > -1; i--)\r\n                    {\r\n                        if (pos >= _states[i].Threshold)\r\n                        {\r\n                            return _states[i];\r\n                        }\r\n                    }\r\n                    break;\r\n            }\r\n            return null;\r\n        }\r\n\r\n        private void PlayAnimationAtCurrentPosition(QueueMode queueMode = QueueMode.CompleteOthers, PlayMode playMode = PlayMode.StopSameLayer, float? crossFadeOverride = null)\r\n        {\r\n            if (_states.Count == 0)\r\n            {\r\n                this.Stop();\r\n                return;\r\n            }\r\n\r\n            var state = this.GetAnimationDataAtPosition(_currentT);\r\n\r\n            if (state == null) return;\r\n            if (state.Anim == null) return;\r\n            if (state == _currentState && state.Anim.IsPlaying)\r\n            {\r\n                if (state.Anim.Speed != _speed) state.Anim.Speed = _speed;\r\n                return;\r\n            }\r\n            \r\n            _currentState = state;\r\n            _currentState.Anim.TimeSupplier = _timeSupplier;\r\n            _currentState.Anim.Layer = _layer;\r\n            float fade = (crossFadeOverride != null) ? crossFadeOverride.Value : state.FadeLength;\r\n            if (fade <= 0f)\r\n            {\r\n                _currentState.Anim.Play(_speed, queueMode, playMode);\r\n            }\r\n            else\r\n            {\r\n                _currentState.Anim.CrossFade(_speed, fade, queueMode, playMode);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISPAnim Interface\r\n\r\n        public SPAnimationController Controller\r\n        {\r\n            get { return _controller; }\r\n        }\r\n\r\n        public int Layer\r\n        {\r\n            get { return _layer; }\r\n            set { _layer = value; }\r\n        }\r\n\r\n        public float Speed\r\n        {\r\n            get { return _speed; }\r\n            set\r\n            {\r\n                _speed = value;\r\n                if (_currentState != null) _currentState.Anim.Speed = _speed;\r\n            }\r\n        }\r\n\r\n        public ITimeSupplier TimeSupplier\r\n        {\r\n            get { return _timeSupplier ?? SPTime.Normal; }\r\n            set\r\n            {\r\n                if (_timeSupplier == value) return;\r\n\r\n                _timeSupplier = value;\r\n                if (_currentState != null)\r\n                    _currentState.Anim.TimeSupplier = _timeSupplier;\r\n            }\r\n        }\r\n\r\n        public WrapMode WrapMode\r\n        {\r\n            get\r\n            {\r\n                return WrapMode.Default;\r\n            }\r\n            set\r\n            {\r\n                //do nothing\r\n            }\r\n        }\r\n\r\n        public bool IsPlaying\r\n        {\r\n            get { return _currentState != null && _currentState.Anim.IsPlaying; }\r\n        }\r\n\r\n        public float Time\r\n        {\r\n            get\r\n            {\r\n                return (_currentState != null) ? _currentState.Anim.Time : 0f;\r\n            }\r\n            set\r\n            {\r\n                if (_currentState != null) _currentState.Anim.Time = value;\r\n            }\r\n        }\r\n\r\n        public float Duration\r\n        {\r\n            get\r\n            {\r\n                return (_currentState != null) ? _currentState.Anim.Duration : 0f;\r\n            }\r\n        }\r\n\r\n        public float ScaledTime\r\n        {\r\n            get\r\n            {\r\n                var spd = this.Speed;\r\n                if (spd == 0f) return 0f;\r\n\r\n                return this.Time / spd;\r\n            }\r\n            set\r\n            {\r\n                this.Time = value * this.Speed;\r\n            }\r\n        }\r\n\r\n        public float ScaledDuration\r\n        {\r\n            get\r\n            {\r\n                var spd = this.Speed;\r\n                if (spd == 0f) return float.PositiveInfinity;\r\n\r\n                return Mathf.Abs(this.Duration / spd);\r\n            }\r\n        }\r\n\r\n        public void Play(QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            this.PlayAnimationAtCurrentPosition(queueMode, playMode);\r\n        }\r\n        \r\n        public void CrossFade(float fadeLength, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            this.PlayAnimationAtCurrentPosition(queueMode, playMode, fadeLength);\r\n        }\r\n        \r\n        public void Stop()\r\n        {\r\n            if (_currentState != null)\r\n            {\r\n                _currentState.Anim.Stop();\r\n                _currentState = null;\r\n            }\r\n        }\r\n\r\n        public void Schedule(System.Action<ISPAnim> callback)\r\n        {\r\n            if (_scheduler == null) _scheduler = new AnimEventScheduler(this);\r\n            _scheduler.Schedule(callback);\r\n        }\r\n\r\n        public void Schedule(System.Action<ISPAnim> callback, float timeout, ITimeSupplier supplier)\r\n        {\r\n            if (_scheduler == null) _scheduler = new AnimEventScheduler(this);\r\n            _scheduler.Schedule(callback, timeout, supplier);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalWaitHandle Interface\r\n\r\n        bool IRadicalYieldInstruction.IsComplete\r\n        {\r\n            get { return !this.IsPlaying; }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            yieldObject = null;\r\n            return this.IsPlaying;\r\n        }\r\n\r\n        void IRadicalWaitHandle.OnComplete(System.Action<IRadicalWaitHandle> callback)\r\n        {\r\n            if (callback == null) throw new System.ArgumentNullException(\"callback\");\r\n            if (!this.IsPlaying) throw new System.InvalidOperationException(\"Can not wait for complete on an already completed IRadicalWaitHandle.\");\r\n\r\n            this.Schedule((a) => callback(this));\r\n        }\r\n\r\n        bool IRadicalWaitHandle.Cancelled\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        void ICollection<StateData>.Add(StateData item)\r\n        {\r\n            throw new System.NotSupportedException();\r\n        }\r\n\r\n        public bool Contains(StateData state)\r\n        {\r\n            return _states.Contains(state);\r\n        }\r\n\r\n        public bool Remove(StateData state)\r\n        {\r\n            if(_states.Remove(state))\r\n            {\r\n                state.Purge();\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            this.Stop();\r\n            foreach (var s in _states) s.Purge();\r\n            _states.Clear();\r\n        }\r\n\r\n        public void CopyTo(StateData[] array, int arrayIndex)\r\n        {\r\n            _states.CopyTo(array);\r\n        }\r\n\r\n        public int Count\r\n        {\r\n            get { return _states.Count; }\r\n        }\r\n\r\n        bool ICollection<StateData>.IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        public IEnumerator<StateData> GetEnumerator()\r\n        {\r\n            return _states.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _states.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public bool IsDisposed\r\n        {\r\n            get\r\n            {\r\n                if (object.ReferenceEquals(_controller, null)) return true;\r\n                if (_controller == null)\r\n                {\r\n                    //dead but still active\r\n                    this.Dispose();\r\n                    return true;\r\n                }\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            _controller = null;\r\n            if(_scheduler != null)\r\n            {\r\n                _scheduler.Dispose();\r\n                _scheduler = null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Utils\r\n\r\n        private static int SortSubStates(StateData a, StateData b)\r\n        {\r\n            if (a.Threshold < b.Threshold) return -1;\r\n            else if (a.Threshold > b.Threshold) return 1;\r\n            else return 0;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public class StateData\r\n        {\r\n            private LinearAnimationSelector _owner;\r\n            private ISPAnim _anim;\r\n            private float _threshold;\r\n            private float _fadeLength;\r\n\r\n\r\n            internal StateData(LinearAnimationSelector owner, ISPAnim anim, float threshold, float fadeLength)\r\n            {\r\n                _owner = owner;\r\n                _anim = anim;\r\n                _threshold = threshold;\r\n                _fadeLength = fadeLength;\r\n            }\r\n\r\n            public ISPAnim Anim\r\n            {\r\n                get { return _anim; }\r\n                set\r\n                {\r\n                    if (value == null) throw new System.ArgumentNullException(\"value\");\r\n                    _anim = value;\r\n                    if(_owner != null && _owner._currentState == this)\r\n                    {\r\n                        _anim.Play();\r\n                    }\r\n                }\r\n            }\r\n\r\n            public float Threshold\r\n            {\r\n                get { return _threshold; }\r\n                set\r\n                {\r\n                    _threshold = value;\r\n                    if (_owner != null && _owner._currentState != null) _owner.PlayAnimationAtCurrentPosition();\r\n                }\r\n            }\r\n\r\n            public float FadeLength\r\n            {\r\n                get { return _fadeLength; }\r\n                set { _fadeLength = value; }\r\n            }\r\n\r\n\r\n\r\n\r\n            internal void Purge()\r\n            {\r\n                _owner = null;\r\n            }\r\n\r\n        }\r\n\r\n        private struct QueueData\r\n        {\r\n            public float Position;\r\n            public PlayMode PlayMode;\r\n\r\n            public QueueData(float pos, PlayMode mode)\r\n            {\r\n                this.Position = pos;\r\n                this.PlayMode = mode;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/Blend/StaticFrameAnimation.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Anim.Blend\r\n{\r\n\r\n    /// <summary>\r\n    /// Plays a single frame of animation at a single point in time on the animation until Stop is called. \r\n    /// The position is a percentage from 0->1, a scale can be applied for quick setting of values in some range from 0->scale.\r\n    /// </summary>\r\n    public class StaticFrameAnimation : ISPAnim\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private SPAnim _state;\r\n        private float _scale;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public StaticFrameAnimation(SPAnim state)\r\n            : this(state, 1.0f)\r\n        {\r\n        }\r\n\r\n        public StaticFrameAnimation(SPAnim state, float scale)\r\n        {\r\n            if (state == null) throw new System.ArgumentNullException(\"state\");\r\n            _state = state;\r\n            _scale = scale;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public SPAnim Anim\r\n        {\r\n            get { return _state; }\r\n        }\r\n\r\n        public float Scale\r\n        {\r\n            get { return _scale; }\r\n            set\r\n            {\r\n                if (_scale == value) return;\r\n\r\n                float p = this.Position;\r\n                _scale = value;\r\n                this.Position = p;\r\n            }\r\n        }\r\n\r\n        public float Position\r\n        {\r\n            get { return (_state.Time / _state.Duration) * _scale; }\r\n            set\r\n            {\r\n                _state.Time = ((value / _scale) % 1f) * _state.Duration;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISPAnim Interface\r\n\r\n        public SPAnimationController Controller\r\n        {\r\n            get { return _state.Controller; }\r\n        }\r\n\r\n        public int Layer\r\n        {\r\n            get\r\n            {\r\n                return _state.Layer;\r\n            }\r\n            set\r\n            {\r\n                _state.Layer = value;\r\n            }\r\n        }\r\n\r\n        public float Speed\r\n        {\r\n            get { return 0f; }\r\n            set\r\n            {\r\n                //do nothing\r\n            }\r\n        }\r\n\r\n        public WrapMode WrapMode\r\n        {\r\n            get\r\n            {\r\n                return WrapMode.Loop;\r\n            }\r\n            set\r\n            {\r\n                //do nothing\r\n            }\r\n        }\r\n\r\n        public bool IsPlaying\r\n        {\r\n            get { return _state.IsPlaying; }\r\n        }\r\n\r\n        public void Play(QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            _state.WrapMode = WrapMode.Loop;\r\n            _state.Speed = 0f;\r\n            _state.Play(queueMode, playMode);\r\n        }\r\n\r\n        public void CrossFade(float fadeLength, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            _state.WrapMode = WrapMode.Loop;\r\n            _state.Speed = 0f;\r\n            _state.CrossFade(fadeLength, queueMode, playMode);\r\n        }\r\n        \r\n        public void Stop()\r\n        {\r\n            _state.Stop();\r\n        }\r\n\r\n        public void Schedule(System.Action<ISPAnim> callback)\r\n        {\r\n            _state.Schedule((s) => { callback(this); });\r\n        }\r\n\r\n        public void Schedule(System.Action<ISPAnim> callback, float timeout, ITimeSupplier supplier)\r\n        {\r\n            _state.Schedule((s) => { callback(this); }, timeout, supplier);\r\n        }\r\n\r\n        ITimeSupplier ISPAnim.TimeSupplier\r\n        {\r\n            get { return SPTime.Normal; }\r\n            set\r\n            {\r\n                //do nothing\r\n            }\r\n        }\r\n\r\n        float ISPAnim.Time\r\n        {\r\n            get { return 0f; }\r\n            set\r\n            {\r\n                //do nothing\r\n            }\r\n        }\r\n\r\n        float IAnimatable.Duration\r\n        {\r\n            get { return 0f; }\r\n        }\r\n\r\n        public float ScaledTime\r\n        {\r\n            get { return 0f; }\r\n            set\r\n            {\r\n                //do nothing\r\n            }\r\n        }\r\n\r\n        public float ScaledDuration\r\n        {\r\n            get\r\n            {\r\n                return 0f;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalWaitHandle Interface\r\n\r\n        bool IRadicalYieldInstruction.IsComplete\r\n        {\r\n            get { return !this.IsPlaying; }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            yieldObject = null;\r\n            return this.IsPlaying;\r\n        }\r\n\r\n        void IRadicalWaitHandle.OnComplete(System.Action<IRadicalWaitHandle> callback)\r\n        {\r\n            if (callback == null) throw new System.ArgumentNullException(\"callback\");\r\n            if (!this.IsPlaying) throw new System.InvalidOperationException(\"Can not wait for complete on an already completed IRadicalWaitHandle.\");\r\n\r\n            this.Schedule((a) => callback(this));\r\n        }\r\n\r\n        bool IRadicalWaitHandle.Cancelled\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n        \r\n        public bool IsDisposed\r\n        {\r\n            get\r\n            {\r\n                return _state == null;\r\n            }\r\n        }\r\n        \r\n        public void Dispose()\r\n        {\r\n            _state = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/Exceptions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n\r\n    public class UnknownStateException : System.ArgumentException\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private string _stateName;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public UnknownStateException(string stateName) :\r\n            base(\"Unknown state of name '\" + stateName + \"'.\")\r\n        {\r\n            _stateName = stateName;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public string StateName { get { return _stateName; } }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    public class AnimationInvalidAccessException : System.InvalidOperationException\r\n    {\r\n\r\n        public AnimationInvalidAccessException()\r\n            : base(\"Can not access SPAnimationController until it has been initialized.\")\r\n        {\r\n\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/IAnimControllerMask.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.Anim\n{\n\n    public interface IAnimControllerMask\n    {\n\n        bool CanPlay(IAnimatable anim);\n        bool CanPlay(AnimationClip clip, AnimSettings settings);\n\n    }\n\n    [CreateAssetMenu(fileName = \"SPAnimControllerLayerMask\", menuName = \"Spacepuppy/SPAnimControllerLayerMask\")]\n    public sealed class SPAnimControllerLayerMask : ScriptableObject, IAnimControllerMask\n    {\n\n        #region Fields\n\n        [SerializeField]\n        [TextArea()]\n        [Tooltip(\"Comma delimited integers or hyphanated ranges: 10,20,100-200,304\")]\n        [InsertButton(\"Reload Data\", \"InitData\", PrecedeProperty = false, RuntimeOnly = true)]\n        private string _layers;\n\n        [System.NonSerialized]\n        private bool _clean = false;\n        [System.NonSerialized]\n        private HashSet<int> _layerSet = new HashSet<int>();\n        [System.NonSerialized]\n        private List<Range> _ranges = new List<Range>();\n\n        #endregion\n        \n        #region Properties\n\n        public string Data\n        {\n            get { return _layers; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public void SetData(string layers)\n        {\n            _layers = layers;\n            _clean = false;\n        }\n\n        private void InitData()\n        {\n            _layerSet.Clear();\n            _ranges.Clear();\n\n            if(!string.IsNullOrEmpty(_layers))\n            {\n                var arr = _layers.Split(',');\n                for(int i = 0; i < arr.Length; i++)\n                {\n                    if(arr[i].Contains('-'))\n                    {\n                        var sarr = arr[i].Split('-');\n                        int l, h;\n                        if(int.TryParse(sarr[0], out l) && int.TryParse(sarr[1], out h))\n                        {\n                            if(l > h)\n                            {\n                                int t = l;\n                                l = h;\n                                h = t;\n                            }\n                            _ranges.Add(new Range()\n                            {\n                                Min = l,\n                                Max = h\n                            });\n                        }\n                    }\n                    else\n                    {\n                        int l;\n                        if(int.TryParse(arr[i].Trim(), out l))\n                        {\n                            _layerSet.Add(l);\n                        }\n                    }\n                }\n            }\n\n            _layerSet.TrimExcess();\n            _ranges.TrimExcess();\n            _clean = true;\n        }\n\n        private bool TestLayer(int layer)\n        {\n            if (!_clean) this.InitData();\n\n            if (_layerSet.Contains(layer)) return true;\n            for (int i = 0; i < _ranges.Count; i++)\n            {\n                if (layer >= _ranges[i].Min && layer <= _ranges[i].Max) return true;\n            }\n            return false;\n        }\n\n        #endregion\n\n        #region IAnimControllerMask Interface\n\n        public bool CanPlay(IAnimatable anim)\n        {\n            if (anim == null) return false;\n            return TestLayer(anim.Layer);\n        }\n\n        public bool CanPlay(AnimationClip clip, AnimSettings settings)\n        {\n            return TestLayer(settings.layer);\n        }\n\n        #endregion\n        \n        #region Special Types\n\n        private struct Range\n        {\n            public int Min;\n            public int Max;\n        }\n\n        #endregion\n\n    }\n\n    [System.Serializable]\n    public class AnimControllerMaskSerializedRef : com.spacepuppy.Project.SerializableInterfaceRef<IAnimControllerMask>\n    {\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/IKSolver.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n    public class IKSolver\r\n    {\r\n        \r\n\r\n        public static void CalculateIK(Transform upperArm, Transform foreArm, Transform hand, Vector3 target, float lerpT = 1f, float elbowAngle = 0f)\r\n        {\r\n            Vector3 dir = target - upperArm.position;\r\n            Quaternion r;\r\n\r\n            //upper arm looks target\r\n            r = Quaternion.LookRotation(foreArm.position - upperArm.position);\r\n            r = Quaternion.Inverse(r) * upperArm.rotation;\r\n            var upperArmRot = Quaternion.LookRotation(dir) * r;\r\n\r\n            //upper arm IK angle\r\n            var upperArmLength = Vector3.Distance(upperArm.position, foreArm.position);\r\n            var forearmLength = Vector3.Distance(foreArm.position, hand.position);\r\n            float dist = Mathf.Min(dir.magnitude, upperArmLength + forearmLength - 0.00001f);\r\n            float adj = (upperArmLength * upperArmLength - forearmLength * forearmLength + dist * dist) / (2 * dist);\r\n            float angle = Mathf.Acos(adj / upperArmLength) * Mathf.Rad2Deg;\r\n            upperArmRot *= Quaternion.AngleAxis(-angle, upperArmRot * Vector3.forward);\r\n\r\n\r\n            //forearm looks target\r\n            r = Quaternion.LookRotation(hand.position - foreArm.position);\r\n            r = Quaternion.Inverse(r) * foreArm.rotation;\r\n            var foreArmRot = Quaternion.LookRotation(target - foreArm.position) * r;\r\n\r\n            //elbow angle\r\n            if (elbowAngle != 0f)\r\n                upperArmRot *= Quaternion.AngleAxis(elbowAngle, dir);\r\n\r\n            if (lerpT < 1f)\r\n            {\r\n                upperArm.rotation = Quaternion.Slerp(upperArm.rotation, upperArmRot, lerpT);\r\n                foreArm.rotation = Quaternion.Slerp(foreArm.rotation, foreArmRot, lerpT);\r\n            }\r\n            else\r\n            {\r\n                upperArm.rotation = upperArmRot;\r\n                foreArm.rotation = foreArmRot;\r\n            }\r\n        }\r\n\r\n        public static void CalculateIK(Transform upperArm, Transform foreArm, Transform hand, Vector3 target, Vector3 forwardAxis, float lerpT = 1f, float elbowAngle = 0f)\r\n        {\r\n            Vector3 dir = target - upperArm.position;\r\n            Quaternion r;\r\n\r\n            //upper arm looks target\r\n            r = Quaternion.LookRotation(foreArm.position - upperArm.position);\r\n            r = Quaternion.Inverse(r) * upperArm.rotation;\r\n            var upperArmRot = Quaternion.LookRotation(dir) * r;\r\n\r\n            //upper arm IK angle\r\n            var upperArmLength = Vector3.Distance(upperArm.position, foreArm.position);\r\n            var forearmLength = Vector3.Distance(foreArm.position, hand.position);\r\n            float dist = Mathf.Min(dir.magnitude, upperArmLength + forearmLength - 0.00001f);\r\n            float adj = (upperArmLength * upperArmLength - forearmLength * forearmLength + dist * dist) / (2 * dist);\r\n            float angle = Mathf.Acos(adj / upperArmLength) * Mathf.Rad2Deg;\r\n            upperArmRot *= Quaternion.AngleAxis(-angle, upperArmRot * Vector3.forward);\r\n\r\n\r\n            //forearm looks target\r\n            r = Quaternion.LookRotation(hand.position - foreArm.position);\r\n            r = Quaternion.Inverse(r) * foreArm.rotation;\r\n            var foreArmRot = Quaternion.LookRotation(target - foreArm.position) * r;\r\n\r\n            //elbow angle\r\n            if (elbowAngle != 0f)\r\n                upperArmRot *= Quaternion.AngleAxis(elbowAngle, dir);\r\n\r\n\r\n            Quaternion adjust = Quaternion.FromToRotation(forwardAxis, Vector3.forward);\r\n            upperArmRot *= adjust;\r\n            foreArmRot *= adjust;\r\n\r\n            if (lerpT < 1f)\r\n            {\r\n                upperArm.rotation = Quaternion.Slerp(upperArm.rotation, upperArmRot, lerpT);\r\n                foreArm.rotation = Quaternion.Slerp(foreArm.rotation, foreArmRot, lerpT);\r\n            }\r\n            else\r\n            {\r\n                upperArm.rotation = upperArmRot;\r\n                foreArm.rotation = foreArmRot;\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/ISPAnim.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n\r\n    public interface IAnimatable\r\n    {\r\n\r\n        int Layer { get; set; }\r\n        float Duration { get; }\r\n\r\n    }\r\n\r\n    /// <summary>\r\n    /// An animation state generated from a clip. Similar to Unity AnimationState.\r\n    /// </summary>\r\n    public interface ISPAnim : IAnimatable, IRadicalWaitHandle, ISPDisposable\r\n    {\r\n\r\n        SPAnimationController Controller { get; }\r\n\r\n        WrapMode WrapMode { get; set; }\r\n        float Speed { get; set; }\r\n        float Time { get; set; }\r\n        float ScaledTime { get; set; }\r\n        float ScaledDuration { get; }\r\n        ITimeSupplier TimeSupplier { get; set; }\r\n        bool IsPlaying { get; }\r\n\r\n        void Play(QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer);\r\n        void CrossFade(float fadeLength, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer);\r\n        void Stop();\r\n\r\n        /// <summary>\r\n        /// React when this animation is complete.\r\n        /// </summary>\r\n        /// <param name=\"callback\"></param>\r\n        void Schedule(System.Action<ISPAnim> callback);\r\n\r\n        /// <summary>\r\n        /// React when this animation is complete, or some timeout is reached, whichever comes first.\r\n        /// </summary>\r\n        /// <param name=\"callback\"></param>\r\n        /// <param name=\"timeout\">If the animation is still playing after some duration, stop waiting, and call the callback.</param>\r\n        /// <param name=\"time\">The timesupplier to use, null will use 'Normal' time</param>\r\n        void Schedule(System.Action<ISPAnim> callback, float timeout, ITimeSupplier time);\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/ISPAnimationMask.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\nusing UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Anim\n{\n\n    public interface ISPAnimationMask\n    {\n        \n        void Apply(SPAnimationController controller, AnimationState state);\n        void Redact(SPAnimationController controller, AnimationState state);\n\n    }\n\n    [CreateAssetMenu(fileName = \"SPAnimMask\", menuName = \"Spacepuppy/SPAnim Mask\")]\n    public sealed class SPAnimationMaskAsset : ScriptableObject, ICollection<SPAnimationMaskAsset.MaskEntry>, ISPAnimationMask\n    {\n\n        #region Fields\n\n        [SerializeField]\n        private Transform _avatar;\n        [SerializeField]\n        private List<MaskEntry> _masks;\n        \n        #endregion\n\n        #region CONSTRUCTOR\n        \n        #endregion\n\n        #region Properties\n\n        public int Count\n        {\n            get { return _masks.Count; }\n        }\n        \n        public Transform Avatar\n        {\n            get { return _avatar; }\n            set { _avatar = value; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public void Apply(SPAnimationController controller, AnimationState state)\n        {\n            foreach(var entry in _masks)\n            {\n                var t = controller.transform.Find(entry.Path);\n                if(t != null)\n                {\n                    state.AddMixingTransform(t, entry.Recurse);\n                }\n            }\n        }\n\n        public void Redact(SPAnimationController controller, AnimationState state)\n        {\n            foreach (var entry in _masks)\n            {\n                var t = controller.transform.Find(entry.Path);\n                if (t != null)\n                {\n                    state.RemoveMixingTransform(t);\n                }\n            }\n        }\n\n        public IEnumerable<Transform> GetTransforms(SPAnimationController controller)\n        {\n            foreach (var entry in _masks)\n            {\n                var t = controller.transform.Find(entry.Path);\n                if (t != null)\n                {\n                    yield return t;\n                }\n            }\n        }\n\n\n        public MaskEntry Find(string path)\n        {\n            for (int i = 0; i < _masks.Count; i++)\n            {\n                if (_masks[i].Path == path) return _masks[i];\n            }\n\n            return default(MaskEntry);\n        }\n\n        public void Add(string path, bool recurse)\n        {\n            this.Add(new MaskEntry()\n            {\n                Path = path,\n                Recurse = recurse\n            });\n        }\n\n        public void Remove(string path)\n        {\n            for (int i = 0; i < _masks.Count; i++)\n            {\n                if (_masks[i].Path == path)\n                {\n                    _masks.RemoveAt(i);\n                    i--;\n                }\n            }\n        }\n\n        #endregion\n\n        #region ICollection Interface\n\n        bool ICollection<MaskEntry>.IsReadOnly\n        {\n            get { return false; }\n        }\n\n        public void Add(MaskEntry entry)\n        {\n            if (!entry.IsValid) return;\n\n            _masks.Add(entry);\n        }\n\n        public bool Remove(MaskEntry entry)\n        {\n            return _masks.Remove(entry);\n        }\n\n        public void Clear()\n        {\n            _masks.Clear();\n        }\n\n        public bool Contains(MaskEntry entry)\n        {\n            return _masks.Contains(entry);\n        }\n\n        public void CopyTo(MaskEntry[] array, int arrayIndex)\n        {\n            _masks.CopyTo(array, arrayIndex);\n        }\n        \n        #endregion\n\n        #region IEnumerable Interface\n\n        public List<MaskEntry>.Enumerator GetEnumerator()\n        {\n            return _masks.GetEnumerator();\n        }\n\n        IEnumerator<MaskEntry> IEnumerable<MaskEntry>.GetEnumerator()\n        {\n            return this.GetEnumerator();\n        }\n\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n        {\n            return this.GetEnumerator();\n        }\n\n        #endregion\n\n        #region Special Types\n\n        [System.Serializable]\n        public struct MaskEntry\n        {\n            public string Path;\n            public bool Recurse;\n\n            public bool IsValid\n            {\n                get { return !string.IsNullOrEmpty(Path); }\n            }\n\n        }\n\n        internal struct Mask\n        {\n            public Transform Transform;\n            public bool Recurse;\n        }\n\n        #endregion\n\n    }\n    \n    [System.Serializable]\n    public sealed class SPAnimMaskSerializedRef : Project.SerializableInterfaceRef<ISPAnimationMask>\n    {\n        \n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/ISPAnimationSource.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n\r\n    /// <summary>\r\n    /// A source of SPAnim's, like SPAnimationController.\r\n    /// </summary>\r\n    public interface ISPAnimationSource\r\n    {\r\n\r\n        /// <summary>\r\n        /// If the source can return valid animations that are playable. \r\n        /// Can be false if for instance the component is disabled, or being destroyed (if it's a component).\r\n        /// </summary>\r\n        bool CanPlayAnim { get; }\r\n\r\n        ISPAnim GetAnim(string name);\r\n\r\n    }\r\n\r\n    //public interface ISPAnimClipSource\r\n    //{\r\n\r\n    //    SPAnimClip this[string name] { get; }\r\n\r\n    //    SPAnimClip GetClip(string name);\r\n\r\n    //}\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/ISPAnimator.cs",
    "content": "﻿using System;\r\nusing UnityEngine;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n\r\n    /// <summary>\r\n    /// A specialized animation controller that plays specific animation sequences.\r\n    /// \r\n    /// Example, you may have a PlayWalkAnimator, which calls Idle/Walk/Run in the correct order depending on the state of the player.\r\n    /// </summary>\r\n    public interface ISPAnimator\r\n    {\r\n\r\n        SPAnimationController Controller { get; }\r\n        bool IsInitialized { get; }\r\n\r\n        void Configure(SPAnimationController controller);\r\n\r\n    }\r\n\r\n\r\n    /// <summary>\r\n    /// A specialized animation controller that plays specific animation sequences.\r\n    /// \r\n    /// Example, you may have a PlayWalkAnimator, which calls Idle/Walk/Run in the correct order depending on the state of the player.\r\n    /// </summary>\r\n    public abstract class SPAnimatorComponent : SPComponent, ISPAnimator //, IEntityAwakeHandler\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [DefaultFromSelf(Relativity = EntityRelativity.Entity)]\r\n        private SPAnimationController _controller;\r\n\r\n        [System.NonSerialized]\r\n        private bool _initialized;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n        \r\n        protected override void Start()\r\n        {\r\n            if (!_initialized)\r\n            {\r\n                _initialized = true;\r\n                this.Init(_controller);\r\n            }\r\n\r\n            base.Start();\r\n        }\r\n\r\n        protected abstract void Init(SPAnimationController controller);\r\n\r\n        #endregion\r\n        \r\n        #region ISPAnimator Interface\r\n\r\n        public SPAnimationController Controller\r\n        {\r\n            get\r\n            {\r\n                return _controller;\r\n            }\r\n        }\r\n\r\n        public bool IsInitialized\r\n        {\r\n            get { return _initialized; }\r\n        }\r\n\r\n        public void Configure(SPAnimationController controller)\r\n        {\r\n            if (_initialized) throw new System.InvalidOperationException(\"Can not change the Controller of an SPAnimator once it's been initialized.\");\r\n            _controller = controller;\r\n        }\r\n        \r\n        #endregion\r\n\r\n    }\r\n\r\n    public class SPAnimatorMethodAttribute : System.Attribute\r\n    {\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/ISPAnimatorState.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n    public interface ISPAnimatorState : IComponent\r\n    {\r\n\r\n        bool IsActiveState { get; }\r\n\r\n        void Activate();\r\n        void Deactivate();\r\n        void UpdateState();\r\n\r\n    }\r\n\r\n\r\n    public abstract class SPAnimatorState : SPNotifyingComponent, ISPAnimatorState\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [System.NonSerialized()]\r\n        private SPAnimatorStateMachine _machine;\r\n        [System.NonSerialized()]\r\n        private bool _isActive;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            _machine = this.GetComponent<SPAnimatorStateMachine>();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        public SPAnimatorStateMachine StateMachine { get { return _machine; } }\r\n\r\n        #endregion\r\n\r\n        #region ISPAnimatorState Interface\r\n\r\n        public bool IsActiveState\r\n        {\r\n            get { return _isActive; }\r\n        }\r\n\r\n        protected virtual void Activate()\r\n        {\r\n\r\n        }\r\n        void ISPAnimatorState.Activate()\r\n        {\r\n            _isActive = true;\r\n            this.Activate();\r\n        }\r\n\r\n        protected virtual void Deactivate()\r\n        {\r\n        }\r\n        void ISPAnimatorState.Deactivate()\r\n        {\r\n            this.Deactivate();\r\n            _isActive = false;\r\n        }\r\n\r\n        protected virtual void UpdateState()\r\n        {\r\n\r\n        }\r\n        void ISPAnimatorState.UpdateState()\r\n        {\r\n            if (_isActive) this.UpdateState();\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/IScriptableAnimationClip.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n\r\n\r\n    /// <summary>\r\n    /// Represents a non-standard AnimationClip that isn't a UnityEngine.AnimationClip. \r\n    /// This could be a animation blend tree, or a scriptable animation, or any other custom implementation of a clip.\r\n    /// </summary>\r\n    public interface IScriptableAnimationClip : IAnimatable\r\n    {\r\n        \r\n        ISPAnim CreateState(SPAnimationController controller);\r\n\r\n    }\r\n    \r\n    public interface IScriptableAnimationCallback : IDisposable\r\n    {\r\n\r\n        int Layer { get; }\r\n        bool Tick(bool layerIsObscured);\r\n\r\n    }\r\n\r\n    \r\n    public abstract class ScriptableAnimState : ISPAnim, ISPDisposable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private SPAnimationController _controller;\r\n        private AnimEventScheduler _scheduler;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public ScriptableAnimState(SPAnimationController controller)\r\n        {\r\n            if (object.ReferenceEquals(controller, null)) throw new System.ArgumentNullException(\"controller\");\r\n            _controller = controller;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISPAnim Interface\r\n\r\n        public SPAnimationController Controller { get { return _controller; } }\r\n        public virtual int Layer { get; set; }\r\n        public virtual float Speed { get; set; }\r\n        public virtual ITimeSupplier TimeSupplier { get; set; }\r\n        public virtual WrapMode WrapMode { get; set; }\r\n\r\n\r\n        public abstract float Duration { get; }\r\n        public abstract bool IsPlaying { get; }\r\n        public abstract float Time { get; set; }\r\n\r\n        public abstract void CrossFade(float fadeLength, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer);\r\n        public abstract void Play(QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer);\r\n        public abstract void Stop();\r\n\r\n\r\n        public float ScaledTime\r\n        {\r\n            get\r\n            {\r\n                var spd = this.Speed;\r\n                if (spd == 0f) return 0f;\r\n\r\n                return this.Time / spd;\r\n            }\r\n            set\r\n            {\r\n                this.Time = value * this.Speed;\r\n            }\r\n        }\r\n\r\n        public float ScaledDuration\r\n        {\r\n            get\r\n            {\r\n                var spd = this.Speed;\r\n                if (spd == 0f) return float.PositiveInfinity;\r\n\r\n                return Mathf.Abs(this.Duration / spd);\r\n            }\r\n        }\r\n\r\n\r\n\r\n        public void Schedule(System.Action<ISPAnim> callback)\r\n        {\r\n            if (_scheduler == null) _scheduler = new AnimEventScheduler(this);\r\n            _scheduler.Schedule(callback);\r\n        }\r\n\r\n        public void Schedule(System.Action<ISPAnim> callback, float timeout, ITimeSupplier supplier)\r\n        {\r\n            if (_scheduler == null) _scheduler = new AnimEventScheduler(this);\r\n            _scheduler.Schedule(callback, timeout, supplier);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalWaitHandle Interface\r\n\r\n        bool IRadicalYieldInstruction.IsComplete\r\n        {\r\n            get { return !this.IsPlaying; }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            yieldObject = null;\r\n            return this.IsPlaying;\r\n        }\r\n\r\n        void IRadicalWaitHandle.OnComplete(System.Action<IRadicalWaitHandle> callback)\r\n        {\r\n            if (callback == null) throw new System.ArgumentNullException(\"callback\");\r\n            if (!this.IsPlaying) throw new System.InvalidOperationException(\"Can not wait for complete on an already completed IRadicalWaitHandle.\");\r\n\r\n            this.Schedule((a) => callback(this));\r\n        }\r\n\r\n        bool IRadicalWaitHandle.Cancelled\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public bool IsDisposed\r\n        {\r\n            get\r\n            {\r\n                if (object.ReferenceEquals(_controller, null)) return true;\r\n                if (_controller == null)\r\n                {\r\n                    //dead but still active\r\n                    this.Dispose();\r\n                    return true;\r\n                }\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public virtual void Dispose()\r\n        {\r\n            _controller = null;\r\n            if (_scheduler != null) _scheduler.Dispose();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/Legacy/SPLegacyAnimation.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\n\r\nnamespace com.spacepuppy.Anim.Legacy\r\n{\r\n\r\n    /// <summary>\r\n    /// Use in tandem with the Animation class to have more control over Animation at both design time and runtime. \r\n    /// Note, when this is being used DO NOT directly access the Animation class for adding and removing clips, this will cause \r\n    /// the two to go out of sync and require this to be resynced.\r\n    /// </summary>\r\n    /// <remarks>\r\n    /// Note - when refreshing animator at design time this attempts to clear out animations. Thing is the Animation component \r\n    /// from unity initializes the states on load, but not when the animation list is edited. So if you clear the animations \r\n    /// in the Animation component then select to Sync you will get a warning message from unity. There is nothing that can be \r\n    /// done about it. It doesn't hurt anything, so just ignore.\r\n    /// </remarks>\r\n    [System.Obsolete(\"Use SPAnimationController instead!\")]\r\n    public class SPLegacyAnimation : SPAnimationController\r\n    {\r\n\r\n        #region Fields\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public ISPAnim CreateAnimatableState(string name)\r\n        {\r\n            if (this.animation == null) throw new AnimationInvalidAccessException();\r\n            var state = this.States[name];\r\n            if (state == null) throw new UnknownStateException(name);\r\n\r\n            return state.CreateAnimatableState();\r\n        }\r\n\r\n        [System.Obsolete(\"Doesn't support latest SPAnimationMask\")]\r\n        public void PlayDirectly(string name, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            if (this.animation == null) throw new AnimationInvalidAccessException();\r\n            var state = this.States[name];\r\n            if (state == null) throw new UnknownStateException(name);\r\n\r\n            this.animation.Play(state.Name, playMode);\r\n        }\r\n\r\n        [System.Obsolete(\"Doesn't support latest SPAnimationMask\")]\r\n        public AnimationState QueueDirectly(string name, QueueMode queueMode = QueueMode.CompleteOthers, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            if (this.animation == null) throw new AnimationInvalidAccessException();\r\n            var state = this.States[name];\r\n            if (state == null) throw new UnknownStateException(name);\r\n\r\n            var s = this.animation.PlayQueued(state.Name, queueMode, playMode);\r\n            s.weight = state.Weight;\r\n            s.speed = state.Speed;\r\n            s.layer = state.Layer;\r\n            s.wrapMode = state.WrapMode;\r\n            s.blendMode = state.BlendMode;\r\n            return s;\r\n        }\r\n\r\n        [System.Obsolete(\"Doesn't support latest SPAnimationMask\")]\r\n        public void CrossFadeDirectly(string name, float fadeLength, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            if (this.animation == null) throw new AnimationInvalidAccessException();\r\n            var state = this.States[name];\r\n            if (state == null) throw new UnknownStateException(name);\r\n\r\n            this.animation.CrossFade(state.Name, fadeLength, playMode);\r\n        }\r\n\r\n        [System.Obsolete(\"Doesn't support latest SPAnimationMask\")]\r\n        public AnimationState QueueCrossFadeDirectly(string name, float fadeLength, QueueMode queueMode = QueueMode.CompleteOthers, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            if (this.animation == null) throw new AnimationInvalidAccessException();\r\n            var state = this.States[name];\r\n            if (state == null) throw new UnknownStateException(name);\r\n\r\n            var s = this.animation.CrossFadeQueued(state.Name, fadeLength, queueMode, playMode);\r\n            s.weight = state.Weight;\r\n            s.speed = state.Speed;\r\n            s.layer = state.Layer;\r\n            s.wrapMode = state.WrapMode;\r\n            s.blendMode = state.BlendMode;\r\n            return s;\r\n        }\r\n\r\n        public new void Stop(string name)\r\n        {\r\n            if (this.animation == null) throw new AnimationInvalidAccessException();\r\n            var state = this.States[name];\r\n            if (state == null) throw new UnknownStateException(name);\r\n\r\n            this.animation.Stop(state.Name);\r\n        }\r\n\r\n        public new void StopAll()\r\n        {\r\n            if (this.animation == null) throw new AnimationInvalidAccessException();\r\n            this.animation.Stop();\r\n        }\r\n\r\n        public void StopLayer(int layer)\r\n        {\r\n            if (this.animation == null) throw new AnimationInvalidAccessException();\r\n\r\n            foreach (AnimationState a in this.animation)\r\n            {\r\n                if (a.layer == layer) this.animation.Stop(a.name);\r\n            }\r\n        }\r\n\r\n        public bool IsPlaying(string name)\r\n        {\r\n            return (this.animation != null) ? this.animation.IsPlaying(name) : false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Event Callback\r\n\r\n        public void AddEvent(string anim, float time, AnimationEventCallback callback, object token)\r\n        {\r\n            var state = this.States[anim];\r\n            if (state == null) throw new UnknownStateException(name);\r\n\r\n            state.AddEvent(time, callback, token);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/MaskCollection.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n\r\n    [System.Obsolete(\"Use SPAnimationMask Intead\")]\r\n    [System.Serializable()]\r\n    public class MaskCollection : ICollection<TransformMask>\r\n    {\r\n\r\n        public System.EventHandler Changed;\r\n\r\n        #region Fields\r\n\r\n        [System.NonSerialized()]\r\n        private AnimationState _owner;\r\n        [SerializeField()]\r\n        private List<TransformMask> _masks = new List<TransformMask>();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public MaskCollection()\r\n        {\r\n\r\n        }\r\n\r\n        internal void SetState(AnimationState state)\r\n        {\r\n            _owner = state;\r\n            if (_owner != null && _masks.Count > 0) this.Apply(_owner);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Add(Transform t, bool recursive)\r\n        {\r\n            this.Add(new TransformMask(t, recursive));\r\n        }\r\n\r\n        public bool Remove(Transform t)\r\n        {\r\n            int i = this.IndexOfTransform(t);\r\n            if (i >= 0)\r\n            {\r\n                _masks.RemoveAt(i);\r\n                if (this.Changed != null) this.Changed(this, System.EventArgs.Empty);\r\n                return true;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        internal int IndexOfTransform(Transform t)\r\n        {\r\n            for (int i = 0; i < _masks.Count; i++)\r\n            {\r\n                if (_masks[i].Transform == t) return i;\r\n            }\r\n            return -1;\r\n        }\r\n\r\n        internal void RemoveAt(int index)\r\n        {\r\n            var m = _masks[index];\r\n            _masks.RemoveAt(index);\r\n            if (_owner != null && m.Transform != null) _owner.RemoveMixingTransform(m.Transform);\r\n            if (this.Changed != null) this.Changed(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        public void AddRange(IEnumerable<TransformMask> coll)\r\n        {\r\n            foreach (var m in coll)\r\n            {\r\n                this.Add(m);\r\n            }\r\n            if (this.Changed != null) this.Changed(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        public void AddRange(MaskCollection coll)\r\n        {\r\n            for (int i = 0; i < coll._masks.Count; i++)\r\n            {\r\n                this.Add(coll._masks[i]);\r\n            }\r\n            if (this.Changed != null) this.Changed(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        public void Copy(IEnumerable<TransformMask> coll)\r\n        {\r\n            this.SilentClear();\r\n            foreach (var m in coll)\r\n            {\r\n                this.Add(m);\r\n            }\r\n            if (this.Changed != null) this.Changed(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        public void Copy(MaskCollection coll)\r\n        {\r\n            this.SilentClear();\r\n            for(int i = 0; i < coll._masks.Count; i++)\r\n            {\r\n                this.Add(coll._masks[i]);\r\n            }\r\n            if (this.Changed != null) this.Changed(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        public void Apply(AnimationState state)\r\n        {\r\n            foreach (var m in _masks)\r\n            {\r\n                if (m.Transform != null) state.AddMixingTransform(m.Transform, m.Recursive);\r\n            }\r\n        }\r\n\r\n\r\n\r\n        private void SilentClear()\r\n        {\r\n            if (_owner != null)\r\n            {\r\n                foreach (var m in _masks)\r\n                {\r\n                    if (m.Transform != null) _owner.RemoveMixingTransform(m.Transform);\r\n                }\r\n            }\r\n            _masks.Clear();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        public void Add(TransformMask item)\r\n        {\r\n            if (item.Transform == null) throw new System.ArgumentException(\"Mask contains no transform.\");\r\n\r\n            var i = this.IndexOfTransform(item.Transform);\r\n            if (i >= 0)\r\n            {\r\n                _masks.RemoveAt(i);\r\n                if (_owner != null && item.Transform != null) _owner.RemoveMixingTransform(item.Transform);\r\n            }\r\n\r\n            _masks.Add(item);\r\n            if (_owner != null && item.Transform != null) _owner.AddMixingTransform(item.Transform, item.Recursive);\r\n            if (this.Changed != null) this.Changed(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            if (_owner != null)\r\n            {\r\n                foreach (var m in _masks)\r\n                {\r\n                    if (m.Transform != null) _owner.RemoveMixingTransform(m.Transform);\r\n                }\r\n            }\r\n            _masks.Clear();\r\n            if (this.Changed != null) this.Changed(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        public bool Contains(TransformMask item)\r\n        {\r\n            return _masks.Contains(item);\r\n        }\r\n\r\n        public void CopyTo(TransformMask[] array, int arrayIndex)\r\n        {\r\n            _masks.CopyTo(array, arrayIndex);\r\n        }\r\n\r\n        public int Count\r\n        {\r\n            get { return _masks.Count; }\r\n        }\r\n\r\n        public bool IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        public bool Remove(TransformMask item)\r\n        {\r\n            if (_masks.Contains(item))\r\n            {\r\n                _masks.Remove(item);\r\n                if (_owner != null && item.Transform != null) _owner.RemoveMixingTransform(item.Transform);\r\n                if (this.Changed != null) this.Changed(this, System.EventArgs.Empty);\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public IEnumerator<TransformMask> GetEnumerator()\r\n        {\r\n            return _masks.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _masks.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/PropertyAttributes.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class AnimTimePeriodAttribute : SPPropertyAttribute\r\n    {\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/SPAnim.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n\r\n    public class SPAnim : ISPAnim, IRadicalWaitHandle, System.ICloneable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private SPAnimationController _controller;\r\n\r\n        private string _clipId;\r\n        private float _weight = 1.0f;\r\n        private float _speed = 1.0f;\r\n        private int _layer;\r\n        private WrapMode _wrapMode;\r\n        private AnimationBlendMode _blendMode = AnimationBlendMode.Blend;\r\n        private ITimeSupplier _timeSupplier;\r\n        private ISPAnimationMask _mask;\r\n\r\n        private float _startTime;\r\n        private AnimationState _state;\r\n        private AnimEventScheduler _scheduler;\r\n        private bool _timeSupplierScaleEventRegistered;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private SPAnim()\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public string ClipId\r\n        {\r\n            get\r\n            {\r\n                return _clipId;\r\n            }\r\n        }\r\n\r\n        public float Weight\r\n        {\r\n            get { return _weight; }\r\n            set\r\n            {\r\n                _weight = value;\r\n                if (_state != null) _state.weight = value;\r\n            }\r\n        }\r\n\r\n        public float Speed\r\n        {\r\n            get { return _speed; }\r\n            set\r\n            {\r\n                _speed = value;\r\n                if (_state != null) _state.speed = this.RealSpeed;\r\n            }\r\n        }\r\n\r\n        public int Layer\r\n        {\r\n            get { return _layer; }\r\n            set\r\n            {\r\n                _layer = Mathf.Max(0, value);\r\n                if (_state != null) _state.layer = value;\r\n            }\r\n        }\r\n\r\n        public WrapMode WrapMode\r\n        {\r\n            get { return _wrapMode; }\r\n            set\r\n            {\r\n                _wrapMode = value;\r\n                if (_state != null) _state.wrapMode = value;\r\n            }\r\n        }\r\n\r\n        public AnimationBlendMode BlendMode\r\n        {\r\n            get { return _blendMode; }\r\n            set\r\n            {\r\n                _blendMode = value;\r\n                if (_state != null) _state.blendMode = value;\r\n            }\r\n        }\r\n        \r\n        public ITimeSupplier TimeSupplier\r\n        {\r\n            get { return (_timeSupplier == null) ? SPTime.Normal : _timeSupplier; }\r\n            set\r\n            {\r\n                if (_timeSupplier == value) return;\r\n\r\n                this.UnregisterTimeScaleChangedEvent();\r\n                _timeSupplier = value;\r\n                if (_timeSupplier != null && this.IsPlaying)\r\n                {\r\n                    this.RegisterTimeScaleChangedEvent();\r\n                    this.OnTimeScaleChanged(null, null);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The speed the animation is actually playing at in real time, all timescales applied\r\n        /// </summary>\r\n        public float RealSpeed\r\n        {\r\n            get\r\n            {\r\n                return _controller.Speed * _speed * SPTime.GetInverseScale(_timeSupplier);\r\n            }\r\n        }\r\n\r\n        public float Time\r\n        {\r\n            get { return (_state == null) ? 0f : _state.time; }\r\n            set { if (_state != null) _state.time = value; }\r\n        }\r\n\r\n        public float Duration\r\n        {\r\n            get\r\n            {\r\n                if (_state != null) return _state.length;\r\n\r\n                var st = _controller.States[_clipId];\r\n                return (st != null) ? st.Duration : 0f;\r\n            }\r\n        }\r\n\r\n        public float ScaledTime\r\n        {\r\n            get\r\n            {\r\n                var spd = this.Speed;\r\n                if (spd == 0f) return 0f;\r\n\r\n                return this.Time / spd;\r\n            }\r\n            set\r\n            {\r\n                this.Time = value * this.Speed;\r\n            }\r\n        }\r\n\r\n        public float ScaledDuration\r\n        {\r\n            get\r\n            {\r\n                var spd = this.Speed;\r\n                if (spd == 0f) return float.PositiveInfinity;\r\n\r\n                return Mathf.Abs(this.Duration / spd);\r\n            }\r\n        }\r\n\r\n        public ISPAnimationMask Mask\r\n        {\r\n            get { return _mask; }\r\n            set { _mask = value; }\r\n        }\r\n\r\n        ///// <summary>\r\n        ///// Don't actually modify this thing, here for debug purposes.\r\n        ///// </summary>\r\n        //public AnimationState UnityAnimState\r\n        //{\r\n        //    get { return _state; }\r\n        //}\r\n\r\n        /// <summary>\r\n        /// The game time that the animation started playing at.\r\n        /// </summary>\r\n        public float StartTime\r\n        {\r\n            get { return _startTime; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void PlayReverse(PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            if (_controller.ControllerMask != null && !_controller.ControllerMask.CanPlay(this)) return;\r\n\r\n            if (this.IsPlaying)\r\n            {\r\n                this.Speed = -this.Speed;\r\n            }\r\n            else\r\n            {\r\n                _speed = -_speed;\r\n                this.Play(QueueMode.PlayNow, playMode);\r\n            }\r\n        }\r\n\r\n\r\n        public SPAnim Queue(QueueMode queueMode = QueueMode.CompleteOthers, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            if (_controller.ControllerMask != null && !_controller.ControllerMask.CanPlay(this)) return null;\r\n\r\n            var a = this.Clone();\r\n            a.Play(queueMode, playMode);\r\n            return a;\r\n        }\r\n\r\n        public SPAnim QueueCrossFade(float fadeLength, QueueMode queueMode = QueueMode.CompleteOthers, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            if (_controller.ControllerMask != null && !_controller.ControllerMask.CanPlay(this)) return null;\r\n\r\n            var a = this.Clone();\r\n            a.CrossFade(fadeLength, queueMode, playMode);\r\n            return a;\r\n        }\r\n\r\n        public SPAnim QueueInReverse(QueueMode queueMode = QueueMode.CompleteOthers, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            if (_controller.ControllerMask != null && !_controller.ControllerMask.CanPlay(this)) return null;\r\n\r\n            var a = this.Clone();\r\n            if (this.IsPlaying)\r\n            {\r\n                float t = _state.time;\r\n                float sp = -_state.speed;\r\n                a.Play(queueMode, playMode);\r\n                a.Time = t;\r\n                a.Speed = sp;\r\n            }\r\n            else\r\n            {\r\n                a.Play(queueMode, playMode);\r\n                a.Time = (_speed > 0f) ? a.Duration : 0f;\r\n                a.Speed = -_speed;\r\n            }\r\n            return a;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISPAnim Interface\r\n\r\n        public SPAnimationController Controller\r\n        {\r\n            get { return _controller; }\r\n        }\r\n\r\n        public bool IsPlaying\r\n        {\r\n            get\r\n            {\r\n                return _state != null; //&& _state.enabled; //when the anim is done playing... it equates to null\r\n                //return _state != null && _anim.IsPlaying(_state.name);\r\n            }\r\n        }\r\n\r\n        public void Play(QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            if (this.IsPlaying) return;\r\n            if (_controller.ControllerMask != null && !_controller.ControllerMask.CanPlay(this)) return;\r\n\r\n            _startTime = UnityEngine.Time.time;\r\n            _state = _controller.PlayQueuedInternal(_clipId, queueMode, playMode, _layer);\r\n            _state.weight = _weight;\r\n            _state.speed = this.RealSpeed;\r\n            _state.time = (_state.speed >= 0f) ? 0f : _state.length;\r\n            _state.layer = _layer;\r\n            _state.wrapMode = _wrapMode;\r\n            _state.blendMode = _blendMode;\r\n            if (_mask != null) _mask.Apply(_controller, _state);\r\n            this.RegisterTimeScaleChangedEvent();\r\n        }\r\n        \r\n        public void CrossFade(float fadeLength, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            if (this.IsPlaying) return;\r\n            if (_controller.ControllerMask != null && !_controller.ControllerMask.CanPlay(this)) return;\r\n\r\n            _startTime = UnityEngine.Time.time;\r\n            _state = _controller.CrossFadeQueuedInternal(_clipId, fadeLength, queueMode, playMode, _layer);\r\n            _state.weight = _weight;\r\n            _state.speed = this.RealSpeed;\r\n            _state.time = (_state.speed >= 0f) ? 0f : _state.length;\r\n            _state.layer = _layer;\r\n            _state.wrapMode = _wrapMode;\r\n            _state.blendMode = _blendMode;\r\n            if (_mask != null) _mask.Apply(_controller, _state);\r\n            this.RegisterTimeScaleChangedEvent();\r\n        }\r\n\r\n        public void Stop()\r\n        {\r\n            if (this.IsPlaying)\r\n            {\r\n                //_anim.Stop(_state.name);\r\n                _controller.animation.Stop(_clipId);\r\n                _state = null;\r\n                this.UnregisterTimeScaleChangedEvent();\r\n            }\r\n        }\r\n\r\n        public void Schedule(System.Action<ISPAnim> callback)\r\n        {\r\n            if (_scheduler == null) _scheduler = new AnimEventScheduler(this);\r\n            _scheduler.Schedule(callback);\r\n        }\r\n\r\n        public void Schedule(System.Action<ISPAnim> callback, float timeout, ITimeSupplier supplier)\r\n        {\r\n            if (_scheduler == null) _scheduler = new AnimEventScheduler(this);\r\n            _scheduler.Schedule(callback, timeout, supplier);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalWaitHandle Interface\r\n\r\n        bool IRadicalYieldInstruction.IsComplete\r\n        {\r\n            get { return !this.IsPlaying; }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            yieldObject = null;\r\n            return this.IsPlaying;\r\n        }\r\n\r\n        void IRadicalWaitHandle.OnComplete(System.Action<IRadicalWaitHandle> callback)\r\n        {\r\n            if (callback == null) throw new System.ArgumentNullException(\"callback\");\r\n            if (!this.IsPlaying) throw new System.InvalidOperationException(\"Can not wait for complete on an already completed IRadicalWaitHandle.\");\r\n\r\n            this.Schedule((a) => callback(this));\r\n        }\r\n\r\n        bool IRadicalWaitHandle.Cancelled\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        #endregion \r\n\r\n        #region IScalableTimeSupplier ScaleChanged Callback\r\n\r\n        private void RegisterTimeScaleChangedEvent()\r\n        {\r\n            if (_timeSupplierScaleEventRegistered) return;\r\n            _timeSupplierScaleEventRegistered = true;\r\n            //if (_timeSupplier != null && _timeSupplier != SPTime.Normal) _timeSupplier.TimeScaleChanged += this.OnTimeScaleChanged;\r\n            if (_timeSupplier is IScalableTimeSupplier && _timeSupplier != SPTime.Normal) (_timeSupplier as IScalableTimeSupplier).TimeScaleChanged += this.OnTimeScaleChanged;\r\n        }\r\n\r\n        private void UnregisterTimeScaleChangedEvent()\r\n        {\r\n            if (!_timeSupplierScaleEventRegistered) return;\r\n            _timeSupplierScaleEventRegistered = false;\r\n            //if (_timeSupplier != null && _timeSupplier != SPTime.Normal) _timeSupplier.TimeScaleChanged -= this.OnTimeScaleChanged;\r\n            if (_timeSupplier is IScalableTimeSupplier && _timeSupplier != SPTime.Normal) (_timeSupplier as IScalableTimeSupplier).TimeScaleChanged -= this.OnTimeScaleChanged;\r\n        }\r\n\r\n        private void OnTimeScaleChanged(object sender, System.EventArgs e)\r\n        {\r\n            if (!this.IsPlaying)\r\n            {\r\n                this.UnregisterTimeScaleChangedEvent();\r\n                return;\r\n            }\r\n\r\n            _state.speed = this.RealSpeed;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region ICloneable Interface\r\n\r\n        public SPAnim Clone()\r\n        {\r\n            var a = SPAnim.Create(_controller, _clipId);\r\n            a._weight = _weight;\r\n            a._speed = _speed;\r\n            a._layer = _layer;\r\n            a._wrapMode = _wrapMode;\r\n            a._blendMode = _blendMode;\r\n            a._mask = _mask;\r\n            a._timeSupplier = _timeSupplier;\r\n            return a;\r\n        }\r\n\r\n        object System.ICloneable.Clone()\r\n        {\r\n            return this.Clone();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public bool IsDisposed\r\n        {\r\n            get\r\n            {\r\n                if (object.ReferenceEquals(_controller, null)) return true;\r\n                if (_controller == null)\r\n                {\r\n                    //dead but still active\r\n                    this.Dispose();\r\n                    return true;\r\n                }\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            _controller = null;\r\n            _clipId = null;\r\n            _weight = 1f;\r\n            _speed = 1f;\r\n            _layer = 0;\r\n            _wrapMode = UnityEngine.WrapMode.Default;\r\n            _blendMode = AnimationBlendMode.Blend;\r\n            _mask = null;\r\n            this.UnregisterTimeScaleChangedEvent();\r\n            _timeSupplier = null;\r\n\r\n            _state = null;\r\n            if (_scheduler != null) _scheduler.Clear();\r\n\r\n            _pool.Release(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region Static Interface\r\n\r\n        private static ObjectCachePool<SPAnim> _pool = new ObjectCachePool<SPAnim>(-1, () => new SPAnim());\r\n\r\n        public static SPAnim Create(Animation anim, string clipId)\r\n        {\r\n            if (anim == null) throw new System.ArgumentNullException(\"anim\");\r\n            var a = _pool.GetInstance();\r\n            a._controller = anim.AddOrGetComponent<SPAnimationController>();\r\n            a._clipId = clipId;\r\n            return a;\r\n        }\r\n\r\n        public static SPAnim Create(SPAnimationController anim, string clipId)\r\n        {\r\n            if (anim == null) throw new System.ArgumentNullException(\"anim\");\r\n            var a = _pool.GetInstance();\r\n            a._controller = anim;\r\n            a._clipId = clipId;\r\n            a._timeSupplier = anim.TimeSupplier as ITimeSupplier;\r\n            return a;\r\n        }\r\n\r\n        \r\n\r\n        #endregion\r\n\r\n        #region Null Interface\r\n\r\n        private static NullSPAnim _null = new NullSPAnim();\r\n        public static ISPAnim Null\r\n        {\r\n            get\r\n            {\r\n                return _null;\r\n            }\r\n        }\r\n\r\n        private sealed class NullSPAnim : ISPAnim, IRadicalWaitHandle\r\n        {\r\n\r\n            #region ISPAnim Interface\r\n\r\n            public SPAnimationController Controller { get { return null; } }\r\n\r\n            public int Layer\r\n            {\r\n                get { return 0; }\r\n                set { }\r\n            }\r\n\r\n            public float Speed\r\n            {\r\n                get { return 0f; }\r\n                set { }\r\n            }\r\n\r\n            public WrapMode WrapMode\r\n            {\r\n                get\r\n                {\r\n                    return WrapMode.Default;\r\n                }\r\n                set\r\n                {\r\n                    //do nothing\r\n                }\r\n            }\r\n\r\n            public bool IsPlaying\r\n            {\r\n                get { return false; }\r\n            }\r\n\r\n            public float Time\r\n            {\r\n                get { return 0f; }\r\n                set\r\n                {\r\n                    //do nothing\r\n                }\r\n            }\r\n\r\n            public float Duration\r\n            {\r\n                get { return 0f; }\r\n            }\r\n\r\n            public float ScaledTime\r\n            {\r\n                get { return 0f; }\r\n                set\r\n                {\r\n                    //do nothing\r\n                }\r\n            }\r\n\r\n            public float ScaledDuration\r\n            {\r\n                get { return 0f; }\r\n            }\r\n\r\n            public void Play(QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n            {\r\n            }\r\n\r\n            public void Play(float speed, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n            {\r\n            }\r\n\r\n            public void CrossFade(float fadeLength, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n            {\r\n            }\r\n\r\n            public void CrossFade(float speed, float fadeLength, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n            {\r\n            }\r\n\r\n            public void Stop()\r\n            {\r\n            }\r\n\r\n            public void Schedule(System.Action<ISPAnim> callback)\r\n            {\r\n            }\r\n\r\n            public void Schedule(System.Action<ISPAnim> callback, float timeout, ITimeSupplier supplier)\r\n            {\r\n            }\r\n\r\n            ITimeSupplier ISPAnim.TimeSupplier\r\n            {\r\n                get { return SPTime.Normal; }\r\n                set\r\n                {\r\n                    //do nothing\r\n                }\r\n            }\r\n            \r\n            #endregion\r\n\r\n            #region IRadicalWaitHandle Interface\r\n\r\n            public void OnComplete(Action<IRadicalWaitHandle> callback)\r\n            {\r\n\r\n            }\r\n\r\n            public bool Tick(out object yieldObject)\r\n            {\r\n                yieldObject = null;\r\n                return false;\r\n            }\r\n\r\n            public bool Cancelled\r\n            {\r\n                get\r\n                {\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            public bool IsComplete\r\n            {\r\n                get\r\n                {\r\n                    return true;\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IDisposable Interface\r\n\r\n            bool ISPDisposable.IsDisposed\r\n            {\r\n                get { return false; }\r\n            }\r\n\r\n            void System.IDisposable.Dispose()\r\n            {\r\n                //do nothing\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/SPAnimClip.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n\r\n    /// <summary>\r\n    /// Represents an AnimationClip reference that can be used by Spacepuppy Animation.\r\n    /// </summary>\r\n    /// <remarks>\r\n    /// We attempted to implement the ability to define which frames of the AnimationClip to use so that you could use code to break apart a large animation into a segmented animation. \r\n    /// Unfortunately in Unity 4, about the time Mecanim was released, the method Animation.AddClip(name,clip,firstFrame,lastFrame) was broken. It adds an animation with the correct frames, \r\n    /// but the length of the animation is made to be 1 second, even though it's not. Unity does not appear to have any plans to fix this... since Mecanim is available. So I removed the support \r\n    /// but left it in comments just in case unity decides to get off their ass and fix it.\r\n    /// \r\n    /// \r\n    /// Furthermore, in regards of scaled time layers. When calling to play an animation 'directly' on this clip, it will only respect the timescale of the 'normal' time. The value exists solely \r\n    /// for when calling 'PlayQueued', as this is the preferred way of playing animations.\r\n    /// \r\n    /// About the Mask!\r\n    /// If you plan to modify the Mask associated with this, make sure to set the Mask property null THEN make the changes THEN set the Mask property back to the updated mask.\r\n    /// This has to occur because there is no way for us to 'clear' all masks from an AnimationState. So instead when you set Mask to null we call Redact on the mask removing the known transforms.\r\n    /// We can thank Unity for this ass backwards way of doing things.\r\n    /// \r\n    /// Honestly, you shouldn't be changing masks at runtime that are already assigned to an animation. Create a new mask if you really need to.\r\n    /// </remarks>\r\n    [System.Serializable()]\r\n    public class SPAnimClip : ISPDisposable, IAnimatable\r\n    {\r\n\r\n        public const string PROP_WEIGHT = \"_weight\";\r\n        public const string PROP_SPEED = \"_speed\";\r\n        public const string PROP_LAYER = \"_layer\";\r\n        public const string PROP_WRAPMODE = \"_wrapMode\";\r\n        public const string PROP_BLENDMODE = \"_blendMode\";\r\n        public const string PROP_TIMESUPPLIER = \"_timeSupplier\";\r\n        public const string PROP_SCALEDDURATION = \"ScaledDuration\";\r\n        public const string PROP_MASK = \"_mask\";\r\n        //public const string PROP_MASKS = \"_masks\";\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private string _name;\r\n        [SerializeField()]\r\n        private UnityEngine.Object _clip;\r\n        [SerializeField()]\r\n        private float _weight = 1.0f;\r\n        [SerializeField()]\r\n        private float _speed = 1.0f;\r\n        [SerializeField()]\r\n        [AnimLayer()]\r\n        private int _layer;\r\n        [SerializeField()]\r\n        private WrapMode _wrapMode;\r\n        [SerializeField()]\r\n        private AnimationBlendMode _blendMode = AnimationBlendMode.Blend;\r\n        [SerializeField()]\r\n        private SPTime _timeSupplier;\r\n\r\n        [SerializeField]\r\n        private SPAnimMaskSerializedRef _mask;\r\n\r\n        [System.NonSerialized()]\r\n        private string _id;\r\n\r\n        //***SEE NOTES IN CLASS DESCRIPTION\r\n\r\n        //[System.NonSerialized()]\r\n        //private int _firstFrame = 0;\r\n        //[System.NonSerialized()]\r\n        //private int _lastFrame = -1;\r\n\r\n\r\n\r\n        [System.NonSerialized()]\r\n        private SPAnimationController _controller;\r\n        [System.NonSerialized()]\r\n        private AnimationState _state;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n        \r\n        /// <summary>\r\n        /// For deserializer ONLY\r\n        /// </summary>\r\n        private SPAnimClip()\r\n        {\r\n            //_name = null;\r\n            //_clip = null;\r\n            //_masks = new MaskCollection();\r\n            //_firstFrame = 0;\r\n            //_lastFrame = -1;\r\n        }\r\n\r\n        public SPAnimClip(string name)\r\n        {\r\n            _name = name;\r\n            _clip = null;\r\n            _timeSupplier = new SPTime();\r\n            _mask = new SPAnimMaskSerializedRef();\r\n            //_firstFrame = 0;\r\n            //_lastFrame = -1;\r\n        }\r\n\r\n        public SPAnimClip(string name, AnimationClip clip)\r\n        {\r\n            _name = name;\r\n            _clip = clip;\r\n            _timeSupplier = new SPTime();\r\n            _mask = new SPAnimMaskSerializedRef();\r\n            //_firstFrame = 0;\r\n            //_lastFrame = -1;\r\n        }\r\n\r\n        public SPAnimClip(string name, AnimationClip clip, ITimeSupplier timeSupplier)\r\n        {\r\n            _name = name;\r\n            _clip = clip;\r\n            _timeSupplier = new SPTime(timeSupplier);\r\n            _mask = new SPAnimMaskSerializedRef();\r\n            //_firstFrame = 0;\r\n            //_lastFrame = -1;\r\n        }\r\n\r\n        public void Init(SPAnimationController controller, string uniqueHash = null)\r\n        {\r\n            if (_controller != null) throw new System.InvalidOperationException(\"Cannot initialize a clip that has already been initialized.\");\r\n            if (controller == null) throw new System.ArgumentNullException(\"controller\");\r\n            //if (_clip == null) return;\r\n            //if (_clip == null) _clip = SPAnimClip.EmptyClip;\r\n\r\n            _controller = controller;\r\n            _id = (string.IsNullOrEmpty(uniqueHash)) ? _name : _name + uniqueHash;\r\n            _controller.States.AddToMasterList(_id, this);\r\n        }\r\n\r\n        /// <summary>\r\n        /// This is only called from the Master List after the AnimationClip has been added and initialized.\r\n        /// Do not call for any other reason.\r\n        /// </summary>\r\n        /// <param name=\"controller\"></param>\r\n        /// <param name=\"id\"></param>\r\n        /// <param name=\"state\"></param>\r\n        internal void SetAnimState(SPAnimationController controller, string id, AnimationState state)\r\n        {\r\n            //we reset the controller and id to what the SPAnimationController decided it should be\r\n            _controller = controller;\r\n            _id = id;\r\n            _state = state;\r\n            if (_state != null)\r\n            {\r\n                _state.weight = _weight;\r\n                _state.speed = _speed;\r\n                _state.layer = _layer;\r\n                _state.wrapMode = _wrapMode;\r\n                _state.blendMode = _blendMode;\r\n                if (this.Mask != null) this.Mask.Apply(_controller, _state);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        #region Serialized Properties\r\n\r\n        public string Name\r\n        {\r\n            get\r\n            {\r\n                return _name;\r\n            }\r\n        }\r\n\r\n        public string ClipID\r\n        {\r\n            get\r\n            {\r\n                return _id;\r\n            }\r\n        }\r\n\r\n        public UnityEngine.Object Clip { get { return _clip; } }\r\n\r\n        public AnimationClip AnimationClip { get { return _clip as AnimationClip; } }\r\n\r\n        public AnimationState State { get { return _state; } }\r\n\r\n        public float Weight\r\n        {\r\n            get { return _weight; }\r\n            set\r\n            {\r\n                _weight = value;\r\n                if (_state != null) _state.weight = value;\r\n            }\r\n        }\r\n\r\n        public float Speed\r\n        {\r\n            get { return _speed; }\r\n            set\r\n            {\r\n                _speed = value;\r\n                if (_state != null) _state.speed = value;\r\n            }\r\n        }\r\n\r\n        public int Layer\r\n        {\r\n            get { return _layer; }\r\n            set\r\n            {\r\n                _layer = value;\r\n                if (_state != null) _state.layer = value;\r\n            }\r\n        }\r\n\r\n        public WrapMode WrapMode\r\n        {\r\n            get { return _wrapMode; }\r\n            set\r\n            {\r\n                _wrapMode = value;\r\n                if (_state != null) _state.wrapMode = value;\r\n            }\r\n        }\r\n\r\n        public AnimationBlendMode BlendMode\r\n        {\r\n            get { return _blendMode; }\r\n            set\r\n            {\r\n                _blendMode = value;\r\n                if (_state != null) _state.blendMode = value;\r\n            }\r\n        }\r\n\r\n        public ITimeSupplier TimeSupplier\r\n        {\r\n            get { return _timeSupplier.TimeSupplier; }\r\n            set { _timeSupplier.TimeSupplier = value; }\r\n        }\r\n        \r\n        /// <summary>\r\n        /// The mask attached to this SPAnimClip. Note this mask may be a shared mask, so be careful when modifying it.\r\n        /// </summary>\r\n        public ISPAnimationMask Mask\r\n        {\r\n            get\r\n            {\r\n                return _mask.Value;\r\n            }\r\n            set\r\n            {\r\n                if (_mask.Value == value) return;\r\n\r\n                if (_controller != null && _mask.Value != null)\r\n                {\r\n                    _mask.Value.Redact(_controller, _state);\r\n                    if (value != null) value.Apply(_controller, _state);\r\n                    _mask.Value = value;\r\n                }\r\n                else\r\n                {\r\n                    _mask.Value = value;\r\n                }\r\n            }\r\n        }\r\n\r\n        //***SEE NOTES IN CLASS DESCRIPTION\r\n\r\n        //public int FirstFrame\r\n        //{\r\n        //    get { return _firstFrame; }\r\n        //}\r\n\r\n        //public int LastFrame\r\n        //{\r\n        //    get { return _lastFrame; }\r\n        //}\r\n\r\n        #endregion\r\n\r\n        public bool IsPlaying { get { return (_controller != null) ? _controller.animation.IsPlaying(_id) : false; } }\r\n\r\n        public float Time\r\n        {\r\n            get { return (_state != null) ? _state.time : 0f; }\r\n            set\r\n            {\r\n                if (_state != null) _state.time = value;\r\n            }\r\n        }\r\n\r\n        public float Duration\r\n        {\r\n            get\r\n            {\r\n                if (_state != null)\r\n                    return _state.length;\r\n                if (_clip != null)\r\n                {\r\n                    if (_clip is AnimationClip)\r\n                        return (_clip as AnimationClip).length;\r\n                    else if (_clip is IScriptableAnimationClip)\r\n                        return (_clip as IScriptableAnimationClip).Duration;\r\n                }\r\n\r\n                return 0f;\r\n                //return (_state != null) ? _state.length : ((_clip != null) ? _clip.length : 0f);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The duration of the clip at the current speed. When set modifies the speed property.\r\n        /// </summary>\r\n        public float ScaledDuration\r\n        {\r\n            get\r\n            {\r\n                if (this.Speed == 0f)\r\n                    return float.PositiveInfinity;\r\n                else\r\n                    return Mathf.Abs(this.Duration / this.Speed);\r\n            }\r\n            set\r\n            {\r\n                if (value <= 0f)\r\n                    this.Speed = 0f;\r\n                else\r\n                    this.Speed = this.Duration / value;\r\n            }\r\n        }\r\n\r\n        public bool Enabled\r\n        {\r\n            get { return (_state != null) ? _state.enabled : false; }\r\n            set\r\n            {\r\n                if (_state != null) _state.enabled = value;\r\n            }\r\n        }\r\n\r\n        public SPAnimationController Controller { get { return _controller; } }\r\n\r\n        //public Animation Container { get { return _container; } }\r\n\r\n        //public bool Initialized { get { return !object.ReferenceEquals(_controller, null); } }\r\n        public bool Initialized { get { return _controller != null; } }\r\n        \r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        //***SEE NOTES IN CLASS DESCRIPTION\r\n\r\n        //public void SetFrameClamp(int firstFrame, int lastFrame)\r\n        //{\r\n        //    if (_container != null) throw new System.InvalidOperationException(\"The frame clamp can only be set on a clip that has not been initialized.\");\r\n\r\n        //    _firstFrame = firstFrame;\r\n        //    _lastFrame = lastFrame;\r\n        //    if (_firstFrame < 0) _firstFrame = 0;\r\n        //    if (_lastFrame < 0) _lastFrame = -1;\r\n        //    else if (_lastFrame < _firstFrame) _lastFrame = _firstFrame + 1;\r\n        //}\r\n\r\n        //public void ResetFrameClamp()\r\n        //{\r\n        //    _firstFrame = 0;\r\n        //    _lastFrame = -1;\r\n        //}\r\n\r\n        /// <summary>\r\n        /// Creates a state for use in animating.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public ISPAnim CreateAnimatableState()\r\n        {\r\n            if (_controller == null) throw new System.InvalidOperationException(\"This clip has not been initialized.\");\r\n            if (_controller.ControllerMask != null && !_controller.ControllerMask.CanPlay(this)) return null;\r\n\r\n            if (_clip is AnimationClip)\r\n            {\r\n                if (_state == null)\r\n                {\r\n                    //this.Dispose();\r\n                    //throw new System.InvalidOperationException(\"This clip was unexpectedly destroyed, make sure the animation hasn't been destroyed, or another clip was added with the same name.\");\r\n                    return null;\r\n                }\r\n\r\n                var a = SPAnim.Create(_controller, _id);\r\n                a.Weight = _weight;\r\n                a.Speed = _speed;\r\n                a.Layer = _layer;\r\n                a.WrapMode = _wrapMode;\r\n                a.BlendMode = _blendMode;\r\n                a.Mask = this.Mask;\r\n                if (_timeSupplier.IsCustom) a.TimeSupplier = _timeSupplier.TimeSupplier as ITimeSupplier;\r\n                return a;\r\n            }\r\n            else if (_clip is IScriptableAnimationClip)\r\n            {\r\n                var a = (_clip as IScriptableAnimationClip).CreateState(_controller) ?? SPAnim.Null;\r\n                a.Speed = _speed;\r\n                a.Layer = _layer;\r\n                if (_timeSupplier.IsCustom) a.TimeSupplier = _timeSupplier.TimeSupplier as ITimeSupplier;\r\n                return a;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        #region Playback\r\n\r\n        public void PlayDirectly(PlayMode mode = PlayMode.StopSameLayer)\r\n        {\r\n            if (_controller == null) return;\r\n            if (_controller.ControllerMask != null && !_controller.ControllerMask.CanPlay(this)) return;\r\n\r\n            if (_clip is AnimationClip)\r\n            {\r\n                if (_state == null)\r\n                {\r\n                    //this.Dispose();\r\n                    //throw new System.InvalidOperationException(\"This clip was unexpectedly destroyed, make sure the animation hasn't been destroyed, or another clip was added with the same name.\");\r\n                    return;\r\n                }\r\n\r\n                _state.weight = _weight;\r\n                _state.speed = _speed * _controller.Speed;\r\n                _state.layer = _layer;\r\n                _state.wrapMode = _wrapMode;\r\n                _state.blendMode = _blendMode;\r\n                //_controller.PlayInternal(_state.name, mode, _layer);\r\n                _controller.PlayInternal(_id, mode, _layer);\r\n            }\r\n            else if (_clip is IScriptableAnimationClip)\r\n            {\r\n                var state = (_clip as IScriptableAnimationClip).CreateState(_controller) ?? SPAnim.Null;\r\n                state.Speed = _speed;\r\n                state.Layer = _layer;\r\n                if (_timeSupplier.IsCustom) state.TimeSupplier = _timeSupplier.TimeSupplier as ITimeSupplier;\r\n                state.Play(QueueMode.PlayNow, mode);\r\n            }\r\n        }\r\n\r\n        public ISPAnim Play(QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            var a = this.CreateAnimatableState();\r\n            if (a != null) a.Play(queueMode, playMode);\r\n            return a;\r\n        }\r\n\r\n        public ISPAnim Play(float speed, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            var a = this.CreateAnimatableState();\r\n            if (a != null) a.Play(speed, queueMode, playMode);\r\n            return a;\r\n        }\r\n\r\n        public void CrossFadeDirectly(float fadeLength, PlayMode mode = PlayMode.StopSameLayer)\r\n        {\r\n            if (_controller == null) return;\r\n            if (_controller.ControllerMask != null && !_controller.ControllerMask.CanPlay(this)) return;\r\n\r\n            if (_clip is AnimationClip)\r\n            {\r\n                if (_state == null)\r\n                {\r\n                    //this.Dispose();\r\n                    //throw new System.InvalidOperationException(\"This clip was unexpectedly destroyed, make sure the animation hasn't been destroyed, or another clip was added with the same name.\");\r\n                    return;\r\n                }\r\n\r\n                _state.weight = _weight;\r\n                _state.speed = _speed * _controller.Speed;\r\n                _state.layer = _layer;\r\n                _state.wrapMode = _wrapMode;\r\n                _state.blendMode = _blendMode;\r\n                //_controller.CrossFadeInternal(_state.name, fadeLength, mode, _layer);\r\n                _controller.CrossFadeInternal(_id, fadeLength, mode, _layer);\r\n            }\r\n            else\r\n            {\r\n                var state = (_clip as IScriptableAnimationClip).CreateState(_controller) ?? SPAnim.Null;\r\n                state.Speed = _speed;\r\n                state.Layer = _layer;\r\n                if (_timeSupplier.IsCustom) state.TimeSupplier = _timeSupplier.TimeSupplier as ITimeSupplier;\r\n                state.CrossFade(fadeLength, QueueMode.PlayNow, mode);\r\n            }\r\n        }\r\n\r\n        public ISPAnim CrossFade(float fadeLength, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            var a = this.CreateAnimatableState();\r\n            if (a != null) a.CrossFade(fadeLength, queueMode, playMode);\r\n            return a;\r\n        }\r\n\r\n        public ISPAnim CrossFade(float speed, float fadeLength, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            var a = this.CreateAnimatableState();\r\n            if (a != null) a.CrossFade(speed, fadeLength, queueMode, playMode);\r\n            return a;\r\n        }\r\n\r\n        public void Rewind()\r\n        {\r\n            if (_controller == null) throw new System.InvalidOperationException(\"This clip has not been initialized.\");\r\n            if (_state == null)\r\n            {\r\n                //this.Dispose();\r\n                //throw new System.InvalidOperationException(\"This clip was unexpectedly destroyed, make sure the animation hasn't been destroyed, or another clip was added with the same name.\");\r\n                return;\r\n            }\r\n            if (_controller.ControllerMask != null && !_controller.ControllerMask.CanPlay(this)) return;\r\n            _controller.animation.Rewind(_id);\r\n        }\r\n\r\n        public void Stop()\r\n        {\r\n            if (_controller == null) throw new System.InvalidOperationException(\"This clip has not been initialized.\");\r\n            if (_state == null)\r\n            {\r\n                //this.Dispose();\r\n                //throw new System.InvalidOperationException(\"This clip was unexpectedly destroyed, make sure the animation hasn't been destroyed, or another clip was added with the same name.\");\r\n                return;\r\n            }\r\n            _controller.animation.Stop(_id);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Events\r\n\r\n        public void AddEvent(float time, AnimationEventCallback callback, object token)\r\n        {\r\n            if (_controller == null) throw new System.InvalidOperationException(\"This clip has not been initialized.\");\r\n            if (callback == null) throw new System.ArgumentNullException(\"callback\");\r\n\r\n            if (_clip is AnimationClip)\r\n                _controller.CreateAnimationEvent(_clip as AnimationClip, time, callback, token);\r\n            else\r\n                throw new System.InvalidOperationException(\"ISPAnimationClip does not support AddEvent.\");\r\n        }\r\n\r\n        #endregion\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public bool IsDisposed\r\n        {\r\n            get\r\n            {\r\n                return _clip == null;\r\n            }\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            var nm = _id; // _state.name;\r\n            if (_controller != null && _state != null && _controller.animation[nm] == _state)\r\n            {\r\n                _controller.animation.RemoveClip(nm);\r\n            }\r\n            _controller = null;\r\n            _state = null;\r\n            _mask.Value = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public class ConfigAttribute : System.Attribute\r\n        {\r\n            public bool HideDetailRegion;\r\n            public string[] VisibleProps;\r\n\r\n            public ConfigAttribute(bool hideDetailRegion)\r\n            {\r\n                this.HideDetailRegion = hideDetailRegion;\r\n                this.VisibleProps = null;\r\n            }\r\n\r\n            public ConfigAttribute(params string[] visibleProps)\r\n            {\r\n                this.HideDetailRegion = false;\r\n                this.VisibleProps = visibleProps;\r\n            }\r\n        }\r\n\r\n        public class ReadOnlyNameAttribute : System.Attribute\r\n        {\r\n            private string _name;\r\n\r\n            public ReadOnlyNameAttribute(string name)\r\n            {\r\n                _name = name;\r\n            }\r\n\r\n            public string Name { get { return _name; } }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Utils\r\n\r\n        public static bool IsValid(SPAnimClip clip)\r\n        {\r\n            return clip != null && clip.Clip != null;\r\n        }\r\n\r\n        public static bool IsValidAndInitialized(SPAnimClip clip)\r\n        {\r\n            return clip != null && clip.Clip != null && clip.Initialized;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/SPAnimClipCollection.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n\r\n\r\n    [System.Serializable()]\r\n    public class SPAnimClipCollection : ICollection<SPAnimClip>, System.IDisposable, ISerializationCallbackReceiver\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [System.NonSerialized()]\r\n        private SPAnimationController _controller;\r\n        [System.NonSerialized()]\r\n        private Dictionary<string, SPAnimClip> _dict = new Dictionary<string, SPAnimClip>();\r\n        [System.NonSerialized()]\r\n        private string _uniqueHash;\r\n\r\n        [SerializeField()]\r\n        private SPAnimClip[] _serializedStates;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected internal SPAnimClipCollection()\r\n        {\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool Initialized { get { return !object.ReferenceEquals(_controller, null); } }\r\n\r\n        public SPAnimationController Controller { get { return _controller; } }\r\n\r\n        public string UniqueHash { get { return _uniqueHash; } }\r\n\r\n        public SPAnimClip this[string name]\r\n        {\r\n            get\r\n            {\r\n                SPAnimClip result = null;\r\n                _dict.TryGetValue(name, out result);\r\n                return result;\r\n            }\r\n        }\r\n\r\n        public SPAnimClip this[int index]\r\n        {\r\n            get\r\n            {\r\n                if (index < 0 || index >= _dict.Count) throw new System.IndexOutOfRangeException();\r\n\r\n                var e = _dict.GetEnumerator();\r\n                int j = 0;\r\n                while (e.MoveNext())\r\n                {\r\n                    if (index == j) return e.Current.Value;\r\n                    j++;\r\n                }\r\n\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public ICollection<string> Keys { get { return _dict.Keys; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Associate the collection as a master collection for an SPAnimationController\r\n        /// </summary>\r\n        /// <param name=\"controller\"></param>\r\n        internal void InitMasterCollection(SPAnimationController controller)\r\n        {\r\n            if (controller == null) throw new System.ArgumentNullException(\"container\");\r\n            if (this.Initialized) throw new System.InvalidOperationException(\"SPAnimClipCollection already has been initilized.\");\r\n            _controller = controller;\r\n            _uniqueHash = null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Call only once to add all animations from a master collection with the SPAnimationController.\r\n        /// </summary>\r\n        internal void SyncMasterAnims()\r\n        {\r\n            if (!this.Initialized) throw new System.InvalidOperationException(\"SPAnimationClipCollection must be initialized as a master collection first.\");\r\n            if (_controller.States != this) throw new System.InvalidOperationException(\"Attempted to sync non-master SPAnimClipCollection as if it were a master collection.\");\r\n\r\n            //var e = _dict.GetEnumerator();\r\n            //while (e.MoveNext())\r\n            //{\r\n            //    this.AddToMasterList(e.Current.Value.Name, e.Current.Value, true);\r\n            //}\r\n\r\n            //we loop the serialized states in-case anims were added in between InitMasterCollection and SyncMasterAnims\r\n            foreach (var st in _serializedStates)\r\n            {\r\n                this.AddToMasterList(st.Name, st, true);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Initialize a SPAnimClipCollection with a SPAnimationController.\r\n        /// \r\n        /// (internal: this is only used for non-master collections)\r\n        /// </summary>\r\n        /// <param name=\"controller\"></param>\r\n        /// <param name=\"uniqueHash\"></param>\r\n        public void Init(SPAnimationController controller, string uniqueHash = null)\r\n        {\r\n            if (controller == null) throw new System.ArgumentNullException(\"controller\");\r\n            if (this.Initialized) throw new System.InvalidOperationException(\"SPAnimClipCollection already has been initilized.\");\r\n            _controller = controller;\r\n            _uniqueHash = uniqueHash;\r\n\r\n            var e = _dict.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                e.Current.Value.Init(_controller, _uniqueHash);\r\n            }\r\n        }\r\n\r\n        internal void AddToMasterList(string id, SPAnimClip clip)\r\n        {\r\n            if (!this.Initialized) throw new System.InvalidOperationException(\"Unauthorized attempt to initialize the SPAnimationController SPAnimClip master list, no SPAnimationController found.\");\r\n            if (clip.Controller != _controller) throw new System.InvalidOperationException(\"Unauthorized attempt to initialize the SPAnimationController SPAnimClip master list, clip's controller is not the same as master controller.\");\r\n            if (_dict.ContainsKey(id)) throw new DuplicateKeyException();\r\n\r\n            this.AddToMasterList(id, clip, false);\r\n        }\r\n\r\n        /// <summary>\r\n        /// This is only ever called on the spanim clip master list when SPAnimClips are initialized...\r\n        /// </summary>\r\n        /// <param name=\"clip\"></param>\r\n        private void AddToMasterList(string id, SPAnimClip clip, bool isSelfInitializing)\r\n        {\r\n            //***SEE NOTES IN SPAnimClip DESCRIPTION\r\n            //if (_firstFrame > 0 || _lastFrame >= 0)\r\n            //{\r\n            //    int total = Mathf.RoundToInt(_clip.length * _clip.frameRate);\r\n            //    int s = (_firstFrame < 0) ? 0 : _firstFrame;\r\n            //    int l = (_lastFrame < 0) ? total : _lastFrame;\r\n            //    if (l <= s) l = s + 1;\r\n            //    _controller.animation.AddClip(_clip, _name, s, l, _wrapMode == UnityEngine.WrapMode.Loop);\r\n            //}\r\n            //else\r\n            //{\r\n            //    _controller.animation.AddClip(_clip, _name);\r\n            //}\r\n\r\n            var ac = clip.AnimationClip;\r\n            AnimationState st = null;\r\n            if (ac != null)\r\n            {\r\n                _controller.animation.AddClip(ac, id);\r\n                st = _controller.animation[id];\r\n                if (st == null)\r\n                {\r\n                    Debug.LogWarning(\"An added animation failed to be generated.\");\r\n                }\r\n            }\r\n            clip.SetAnimState(_controller, id, st);\r\n\r\n            if (!isSelfInitializing)\r\n            {\r\n                _dict[id] = clip;\r\n            }\r\n        }\r\n\r\n\r\n\r\n\r\n        public ISPAnim Play(string clipId, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            if (_controller == null) throw new AnimationInvalidAccessException();\r\n            var state = this[clipId];\r\n            //if (state == null) throw new UnknownStateException(clipId);\r\n            if (state == null) return null;\r\n\r\n            return state.Play(queueMode, playMode);\r\n        }\r\n\r\n        public ISPAnim CrossFade(string clipId, float fadeLength, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            if (_controller == null) throw new AnimationInvalidAccessException();\r\n            var state = this[clipId];\r\n            //if (state == null) throw new UnknownStateException(clipId);\r\n            if (state == null) return null;\r\n\r\n            return state.CrossFade(fadeLength, queueMode, playMode);\r\n        }\r\n\r\n\r\n        public SPAnimClip Add(string name, AnimationClip clip)\r\n        {\r\n            if (name == null) throw new System.ArgumentNullException(\"name\");\r\n            if (clip == null) throw new System.ArgumentNullException(\"clip\");\r\n\r\n            if (_dict.ContainsKey(name))\r\n            {\r\n                throw new DuplicateKeyException();\r\n            }\r\n\r\n            var spclip = new SPAnimClip(name, clip);\r\n            if (this.Initialized)\r\n            {\r\n                spclip.Init(_controller, _uniqueHash);\r\n                if (_controller.States != this) _dict[spclip.Name] = spclip; //if not master, then add by name\r\n            }\r\n            else\r\n            {\r\n                _dict[name] = spclip;\r\n            }\r\n            return spclip;\r\n        }\r\n\r\n        public SPAnimClip[] ToArray()\r\n        {\r\n            return _dict.Values.ToArray();\r\n        }\r\n\r\n        public bool ContainsKey(string name)\r\n        {\r\n            if (name == null) return false;\r\n            return _dict.ContainsKey(name);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection\r\n\r\n        public void Add(SPAnimClip clip)\r\n        {\r\n            if (_dict.ContainsKey(clip.ClipID))\r\n            {\r\n                throw new DuplicateKeyException();\r\n            }\r\n\r\n            if (this.Initialized)\r\n            {\r\n                if (!clip.Initialized)\r\n                    clip.Init(_controller, _uniqueHash);\r\n                else if (clip.Controller != _controller)\r\n                    throw new System.ArgumentException(\"The added clip is already registered with another SPAnimationController.\");\r\n\r\n                if (_controller.States != this) _dict[clip.Name] = clip; //if not master, then add by name\r\n            }\r\n            else\r\n            {\r\n                _dict[clip.Name] = clip;\r\n            }\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            foreach (var a in _dict.Values)\r\n            {\r\n                a.Dispose();\r\n            }\r\n            _dict.Clear();\r\n        }\r\n\r\n        public bool Contains(SPAnimClip item)\r\n        {\r\n            return _dict.Values.Contains(item);\r\n        }\r\n\r\n        public void CopyTo(SPAnimClip[] array, int arrayIndex)\r\n        {\r\n            _dict.Values.CopyTo(array, arrayIndex);\r\n        }\r\n\r\n        public int Count\r\n        {\r\n            get { return _dict.Count; }\r\n        }\r\n\r\n        public bool IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        public bool Remove(SPAnimClip item)\r\n        {\r\n            if (item == null) return false;\r\n            if (_dict.Remove(item.Name))\r\n            {\r\n                item.Dispose();\r\n                return true;\r\n            }\r\n            else\r\n                return false;\r\n        }\r\n\r\n        public Enumerator GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator<SPAnimClip> IEnumerable<SPAnimClip>.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public void Dispose()\r\n        {\r\n            if (object.ReferenceEquals(_controller, null)) return;\r\n\r\n            var e = _dict.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                e.Current.Value.Dispose();\r\n            }\r\n            _controller = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISerializationCallbackReceiver Interface\r\n\r\n        void ISerializationCallbackReceiver.OnAfterDeserialize()\r\n        {\r\n            _dict.Clear();\r\n            for (int i = 0; i < _serializedStates.Length; i++)\r\n            {\r\n                _dict.Add(_serializedStates[i].Name, _serializedStates[i]);\r\n            }\r\n        }\r\n\r\n        void ISerializationCallbackReceiver.OnBeforeSerialize()\r\n        {\r\n            //do nothing\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region SpecialTypes\r\n\r\n        public struct Enumerator : IEnumerator<SPAnimClip>\r\n        {\r\n\r\n            private SPAnimClipCollection _coll;\r\n            private Dictionary<string, SPAnimClip>.Enumerator _e;\r\n\r\n            public Enumerator(SPAnimClipCollection coll)\r\n            {\r\n                if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n                _coll = coll;\r\n                _e = _coll._dict.GetEnumerator();\r\n            }\r\n\r\n            public SPAnimClip Current\r\n            {\r\n                get { return _e.Current.Value; }\r\n            }\r\n\r\n            object System.Collections.IEnumerator.Current\r\n            {\r\n                get { return _e.Current.Value; }\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                return _e.MoveNext();\r\n            }\r\n\r\n            void System.Collections.IEnumerator.Reset()\r\n            {\r\n                (_e as System.Collections.IEnumerator).Reset();\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                _e.Dispose();\r\n            }\r\n        }\r\n\r\n        public class ConfigAttribute : System.Attribute\r\n        {\r\n            public bool HideDetailRegion;\r\n            public int DefaultLayer;\r\n            public string Prefix;\r\n            public string Hash;\r\n        }\r\n\r\n        public class StaticCollectionAttribute : System.Attribute\r\n        {\r\n\r\n            public string[] Names;\r\n\r\n            public StaticCollectionAttribute(params string[] names)\r\n            {\r\n                this.Names = names;\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/SPAnimationController.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\nusing System.Collections;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n\r\n    /// <summary>\r\n    /// This is a special class that gets attached to an Animation when any special relational data needs to be associated with that object.\r\n    /// \r\n    /// TODO LIST -\r\n    /// Add SPAnim disposal to this to allow auto-complete of animations.\r\n    /// \r\n    /// Add more efficient Scaled Time Layer handling here rather than where it is.\r\n    /// \r\n    /// Add a way to update all playing animations if 'speed' changes at runtime\r\n    /// </summary>\r\n    [DisallowMultipleComponent()]\r\n    public class SPAnimationController : SPComponent, ISPAnimationSource\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private bool _animatePhysics;\r\n        [SerializeField()]\r\n        private AnimationCullingType _animCullingType = AnimationCullingType.BasedOnRenderers;\r\n\r\n        [SerializeField()]\r\n        private SPTime _timeSupplier;\r\n        [SerializeField()]\r\n        private float _speed = 1f;\r\n        [SerializeField]\r\n        private AnimControllerMaskSerializedRef _mask;\r\n\r\n        [SerializeField()]\r\n        private SPAnimClipCollection _states;\r\n\r\n        [SerializeField()]\r\n        private string _animToPlayOnStart = null;\r\n\r\n\r\n\r\n\r\n        [System.NonSerialized()]\r\n        private Animation _animation;\r\n\r\n        [System.NonSerialized]\r\n        private bool _initialized;\r\n\r\n        [System.NonSerialized()]\r\n        private Dictionary<string, AnimationCallbackData> _animEventTable;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            if (_mask == null) _mask = new AnimControllerMaskSerializedRef();\r\n            if (_states == null) _states = new SPAnimClipCollection();\r\n\r\n            _animation = this.AddOrGetComponent<Animation>();\r\n            _animation.playAutomatically = false;\r\n\r\n            _states.InitMasterCollection(this);\r\n            //_states.Init(this, null);\r\n        }\r\n\r\n        protected override void Start()\r\n        {\r\n            if (!_initialized) this.Init();\r\n            \r\n            base.Start();\r\n\r\n            if (this.States.ContainsKey(_animToPlayOnStart))\r\n            {\r\n                var state = this.States[_animToPlayOnStart];\r\n                if (state != null) state.PlayDirectly(PlayMode.StopAll);\r\n            }\r\n        }\r\n\r\n        private void Init()\r\n        {\r\n            _states.SyncMasterAnims();\r\n            _initialized = true;\r\n\r\n            //_animation.playAutomatically = false;\r\n            _animation.animatePhysics = _animatePhysics;\r\n            _animation.cullingType = _animCullingType;\r\n            //this.enabled = false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public new Animation animation { get { return _animation; } }\r\n\r\n        public SPAnimClipCollection States { get { return _states; } }\r\n\r\n        public ITimeSupplier TimeSupplier { get { return _timeSupplier.TimeSupplier; } }\r\n\r\n        public float Speed { get { return _speed; } }\r\n\r\n        public bool AnimatePhysics\r\n        {\r\n            get\r\n            {\r\n                return (_animation != null) ? _animation.animatePhysics : _animatePhysics;\r\n            }\r\n            set\r\n            {\r\n                _animatePhysics = value;\r\n                if (_animation != null) _animation.animatePhysics = value;\r\n            }\r\n        }\r\n\r\n        public AnimationCullingType CullingType\r\n        {\r\n            get { return (_animation != null) ? _animation.cullingType : _animCullingType; }\r\n            set\r\n            {\r\n                _animCullingType = value;\r\n                if (_animation != null) _animation.cullingType = value;\r\n            }\r\n        }\r\n\r\n        public IAnimControllerMask ControllerMask\r\n        {\r\n            get { return _mask.Value; }\r\n            set { _mask.Value = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public ISPAnim Play(string clipId, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (!_initialized) this.Init();\r\n\r\n            var state = _states[clipId];\r\n            //if (state == null) throw new UnknownStateException(clipId);\r\n            if (state == null) return null;\r\n            if (this.ControllerMask != null && !this.ControllerMask.CanPlay(state)) return null;\r\n\r\n            return state.Play(queueMode, playMode);\r\n        }\r\n\r\n        public ISPAnim CrossFade(string clipId, float fadeLength, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer)\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (!_initialized) this.Init();\r\n\r\n            var state = _states[clipId];\r\n            //if (state == null) throw new UnknownStateException(clipId);\r\n            if (state == null) return null;\r\n            if (this.ControllerMask != null && !this.ControllerMask.CanPlay(state)) return null;\r\n\r\n            return state.CrossFade(fadeLength, queueMode, playMode);\r\n        }\r\n\r\n        public ISPAnim Play(IScriptableAnimationClip clip, PlayMode mode = PlayMode.StopSameLayer)\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (clip == null) throw new System.ArgumentNullException(\"clip\");\r\n            if (!_initialized) this.Init();\r\n            if (this.ControllerMask != null && !this.ControllerMask.CanPlay(clip)) return SPAnim.Null;\r\n\r\n            var state = clip.CreateState(this) ?? SPAnim.Null;\r\n            state.Play(QueueMode.PlayNow, mode);\r\n            return state;\r\n        }\r\n\r\n        public void Stop(string id)\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (!_initialized) this.Init();\r\n            \r\n            _animation.Stop(id);\r\n        }\r\n\r\n        public void Stop(int layer)\r\n        {\r\n            this.StopInternal(layer, PlayMode.StopSameLayer);\r\n        }\r\n\r\n        public void StopAll()\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (!_initialized) this.Init();\r\n\r\n            _animation.Stop();\r\n        }\r\n\r\n\r\n        /// <summary>\r\n        /// Play an AnimationClip on the AnimationController that doesn't already exist on it. If the same clip is called multiple times, it will not be readded.\r\n        /// </summary>\r\n        /// <param name=\"clip\"></param>\r\n        /// <param name=\"queueMode\"></param>\r\n        /// <param name=\"playMode\"></param>\r\n        /// <returns></returns>\r\n        public ISPAnim PlayAuxiliary(SPAnimClip clip, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer, string auxId = null)\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (clip == null) throw new System.ArgumentNullException(\"clip\");\r\n            if (!_initialized) this.Init();\r\n\r\n            if (clip.Clip is AnimationClip)\r\n            {\r\n                if (this.ControllerMask != null && !this.ControllerMask.CanPlay(clip)) return null;\r\n\r\n                var id = this.AddAuxiliaryClip(clip.Clip as AnimationClip, auxId);\r\n                var anim = SPAnim.Create(_animation, id);\r\n                anim.Weight = clip.Weight;\r\n                anim.Speed = clip.Speed;\r\n                anim.Layer = clip.Layer;\r\n                anim.WrapMode = clip.WrapMode;\r\n                anim.BlendMode = clip.BlendMode;\r\n                anim.TimeSupplier = (clip.TimeSupplier != SPTime.Normal) ? anim.TimeSupplier : null;\r\n                anim.Play(queueMode, playMode);\r\n                return anim;\r\n            }\r\n            else if(clip.Clip is IScriptableAnimationClip)\r\n            {\r\n                return this.Play(clip.Clip as IScriptableAnimationClip, playMode);\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public ISPAnim CrossFadeAuxiliary(SPAnimClip clip, float fadeLength, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer, string auxId = null)\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (clip == null) throw new System.ArgumentNullException(\"clip\");\r\n            if (!_initialized) this.Init();\r\n\r\n            if (clip.Clip is AnimationClip)\r\n            {\r\n                if (this.ControllerMask != null && !this.ControllerMask.CanPlay(clip)) return null;\r\n\r\n                var id = this.AddAuxiliaryClip(clip.Clip as AnimationClip, auxId);\r\n                var anim = SPAnim.Create(_animation, id);\r\n                anim.Weight = clip.Weight;\r\n                anim.Speed = clip.Speed;\r\n                anim.Layer = clip.Layer;\r\n                anim.WrapMode = clip.WrapMode;\r\n                anim.BlendMode = clip.BlendMode;\r\n                anim.TimeSupplier = (clip.TimeSupplier != SPTime.Normal) ? anim.TimeSupplier : null;\r\n                anim.CrossFade(fadeLength, queueMode, playMode);\r\n                return anim;\r\n            }\r\n            else if (clip.Clip is IScriptableAnimationClip)\r\n            {\r\n                return this.Play(clip.Clip as IScriptableAnimationClip, playMode);\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public SPAnim PlayAuxiliary(AnimationClip clip, AnimSettings settings, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer, string auxId = null)\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (clip == null) throw new System.ArgumentNullException(\"clip\");\r\n            if (!_initialized) this.Init();\r\n            if (this.ControllerMask != null && !this.ControllerMask.CanPlay(clip, settings)) return null;\r\n\r\n            var id = this.AddAuxiliaryClip(clip, auxId);\r\n            var anim = SPAnim.Create(_animation, id);\r\n            settings.Apply(anim);\r\n            anim.Play(queueMode, playMode);\r\n            return anim;\r\n        }\r\n\r\n        public SPAnim CrossFadeAuxiliary(AnimationClip clip, AnimSettings settings, float fadeLength, QueueMode queueMode = QueueMode.PlayNow, PlayMode playMode = PlayMode.StopSameLayer, string auxId = null)\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (clip == null) throw new System.ArgumentNullException(\"clip\");\r\n            if (!_initialized) this.Init();\r\n            if (this.ControllerMask != null && !this.ControllerMask.CanPlay(clip, settings)) return null;\r\n\r\n            var id = this.AddAuxiliaryClip(clip, auxId);\r\n            var anim = SPAnim.Create(_animation, id);\r\n            settings.Apply(anim);\r\n            anim.CrossFade(fadeLength, queueMode, playMode);\r\n            return anim;\r\n        }\r\n\r\n\r\n\r\n        public string PlayAuxiliaryDirectly(SPAnimClip clip, PlayMode playMode = PlayMode.StopSameLayer, string auxId = null)\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (clip == null) throw new System.ArgumentNullException(\"clip\");\r\n            if (!_initialized) this.Init();\r\n\r\n            if (clip.Clip is AnimationClip)\r\n            {\r\n                if (this.ControllerMask != null && !this.ControllerMask.CanPlay(clip)) return null;\r\n\r\n                var id = this.AddAuxiliaryClip(clip.Clip as AnimationClip, auxId);\r\n                var anim = _animation[id];\r\n                anim.weight = clip.Weight;\r\n                anim.speed = clip.Speed * this.Speed;\r\n                anim.layer = clip.Layer;\r\n                anim.wrapMode = clip.WrapMode;\r\n                anim.blendMode = clip.BlendMode;\r\n                this.PlayInternal(anim.name, playMode, clip.Layer);\r\n                return id;\r\n            }\r\n            else if (clip.Clip is IScriptableAnimationClip)\r\n            {\r\n                this.Play(clip.Clip as IScriptableAnimationClip, playMode);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public string CrossFadeAuxiliaryDirectly(SPAnimClip clip, float fadeLength, PlayMode playMode = PlayMode.StopSameLayer, string auxId = null)\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (clip == null) throw new System.ArgumentNullException(\"clip\");\r\n            if (!_initialized) this.Init();\r\n\r\n            if (clip.Clip is AnimationClip)\r\n            {\r\n                if (this.ControllerMask != null && !this.ControllerMask.CanPlay(clip)) return null;\r\n\r\n                var id = this.AddAuxiliaryClip(clip.Clip as AnimationClip, auxId);\r\n                var anim = _animation[id];\r\n                anim.weight = clip.Weight;\r\n                anim.speed = clip.Speed * this.Speed;\r\n                anim.layer = clip.Layer;\r\n                anim.wrapMode = clip.WrapMode;\r\n                anim.blendMode = clip.BlendMode;\r\n                this.CrossFadeInternal(id, fadeLength, playMode, clip.Layer);\r\n                return id;\r\n            }\r\n            else if (clip.Clip is IScriptableAnimationClip)\r\n            {\r\n                this.Play(clip.Clip as IScriptableAnimationClip, playMode);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public string PlayAuxiliaryDirectly(AnimationClip clip, AnimSettings settings, PlayMode playMode = PlayMode.StopSameLayer, string auxId = null)\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (clip == null) throw new System.ArgumentNullException(\"clip\");\r\n            if (!_initialized) this.Init();\r\n            if (this.ControllerMask != null && !this.ControllerMask.CanPlay(clip, settings)) return null;\r\n\r\n            var id = this.AddAuxiliaryClip(clip, auxId);\r\n            var anim = _animation[id];\r\n            settings.Apply(anim);\r\n            this.PlayInternal(id, playMode, anim.layer);\r\n            return id;\r\n        }\r\n\r\n        public string CrossFadeAuxiliaryDirectly(AnimationClip clip, AnimSettings settings, float fadeLength, PlayMode playMode = PlayMode.StopSameLayer, string auxId = null)\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (clip == null) throw new System.ArgumentNullException(\"clip\");\r\n            if (!_initialized) this.Init();\r\n            if (this.ControllerMask != null && !this.ControllerMask.CanPlay(clip, settings)) return null;\r\n\r\n            var id = this.AddAuxiliaryClip(clip, auxId);\r\n            var anim = _animation[id];\r\n            settings.Apply(anim);\r\n            this.CrossFadeInternal(id, fadeLength, playMode, anim.layer);\r\n            return id;\r\n        }\r\n\r\n\r\n\r\n\r\n        internal void PlayInternal(string clipId, PlayMode mode, int layer)\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (!_initialized) this.Init();\r\n            \r\n            _animation.Play(clipId, mode);\r\n            if(_scriptableAnims != null && _scriptableAnims.Count > 0)\r\n            {\r\n                if (mode == PlayMode.StopAll)\r\n                {\r\n                    _scriptableAnims.Clear(true);\r\n                }\r\n                else\r\n                {\r\n                    _scriptableAnims.Remove(layer, true);\r\n                }\r\n            }\r\n        }\r\n\r\n        internal void CrossFadeInternal(string clipId, float fadeLength, PlayMode mode, int layer)\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (!_initialized) this.Init();\r\n\r\n            _animation.CrossFade(clipId, fadeLength, mode);\r\n\r\n            if (_scriptableAnims != null && _scriptableAnims.Count > 0)\r\n            {\r\n                if (mode == PlayMode.StopAll)\r\n                {\r\n                    _scriptableAnims.Clear(true);\r\n                }\r\n                else\r\n                {\r\n                    _scriptableAnims.Remove(layer, true);\r\n                }\r\n            }\r\n        }\r\n\r\n        internal AnimationState PlayQueuedInternal(string clipId, QueueMode queueMode, PlayMode playMode, int layer)\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (!_initialized) this.Init();\r\n\r\n            //HACK - StopSameLayer respects the base state's layer...\r\n            AnimationState result;\r\n            if(playMode == PlayMode.StopSameLayer)\r\n            {\r\n                var st = _animation[clipId];\r\n                if (!object.ReferenceEquals(st, null) && st.layer != layer)\r\n                {\r\n                    int cache = st.layer;\r\n                    st.layer = layer;\r\n                    result = _animation.PlayQueued(clipId, queueMode, playMode);\r\n                    st.layer = cache;\r\n                }\r\n                else\r\n                {\r\n                    result = _animation.PlayQueued(clipId, queueMode, playMode);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                result = _animation.PlayQueued(clipId, queueMode, playMode);\r\n            }\r\n\r\n\r\n            if (_scriptableAnims != null && _scriptableAnims.Count > 0)\r\n            {\r\n                if (playMode == PlayMode.StopAll)\r\n                {\r\n                    _scriptableAnims.Clear(true);\r\n                }\r\n                else\r\n                {\r\n                    _scriptableAnims.Remove(layer, true);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        internal AnimationState CrossFadeQueuedInternal(string clipId, float fadeLength, QueueMode queueMode, PlayMode playMode, int layer)\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (!_initialized) this.Init();\r\n\r\n            var anim = _animation.CrossFadeQueued(clipId, fadeLength, queueMode, playMode);\r\n\r\n            if (_scriptableAnims != null && _scriptableAnims.Count > 0)\r\n            {\r\n                if (playMode == PlayMode.StopAll)\r\n                {\r\n                    _scriptableAnims.Clear(true);\r\n                }\r\n                else\r\n                {\r\n                    _scriptableAnims.Remove(layer, true);\r\n                }\r\n            }\r\n\r\n            return anim;\r\n        }\r\n\r\n        internal void StopInternal(int layer, PlayMode mode)\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (!_initialized) this.Init();\r\n\r\n            if (mode == PlayMode.StopAll)\r\n            {\r\n                _animation.Stop();\r\n            }\r\n            else\r\n            {\r\n                _animation.Stop(layer);\r\n            }\r\n        }\r\n\r\n\r\n        private string AddAuxiliaryClip(AnimationClip clip, string auxId)\r\n        {\r\n            string id = string.IsNullOrEmpty(auxId) ? \"aux*\" + clip.GetInstanceID() : auxId;\r\n            var a = _animation[id];\r\n            if (a == null || a.clip != clip)\r\n            {\r\n                _animation.AddClip(clip, id);\r\n            }\r\n\r\n            return id;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region Internal Event Registering\r\n\r\n        internal void CreateAnimationEvent(AnimationClip clip, float time, AnimationEventCallback callback, object token)\r\n        {\r\n            //TODO - just realized, this might actually create multiple events on the same clip if 2 different gameobjects call to add it... not sure if 'AnimationClip' is a shared asset or not. Need to test!\r\n\r\n            var ev = new AnimationEvent();\r\n            ev.time = time;\r\n            ev.functionName = \"SPAnimationEventHook33417\";\r\n            ev.stringParameter = ShortUid.NewId().ToString();\r\n\r\n            if (_animEventTable == null) _animEventTable = new Dictionary<string, AnimationCallbackData>();\r\n            _animEventTable.Add(ev.stringParameter, new AnimationCallbackData(callback, token));\r\n\r\n            clip.AddEvent(ev);\r\n        }\r\n\r\n        private void SPAnimationEventHook33417(string id)\r\n        {\r\n            if (_animEventTable == null) return;\r\n\r\n            AnimationCallbackData data;\r\n            if(_animEventTable.TryGetValue(id, out data))\r\n            {\r\n                _animEventTable.Remove(id);\r\n                data.Callback(data.Token);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISPAnimationSource Interface\r\n\r\n        public bool CanPlayAnim\r\n        {\r\n            get { return this != null && _animation != null && this.isActiveAndEnabled; }\r\n        }\r\n\r\n        public virtual ISPAnim GetAnim(string name)\r\n        {\r\n            if (_animation == null) throw new AnimationInvalidAccessException();\r\n            if (!_initialized) this.Init();\r\n\r\n            var state = _states[name];\r\n            if (state != null) return state.CreateAnimatableState();\r\n            else return null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n        \r\n        private class AnimationCallbackData\r\n        {\r\n            public AnimationEventCallback Callback;\r\n            public object Token;\r\n\r\n            public AnimationCallbackData(AnimationEventCallback callback, object token)\r\n            {\r\n                this.Callback = callback;\r\n                this.Token = token;\r\n            }\r\n        }\r\n\r\n        private struct InUpdateInfo\r\n        {\r\n            public AnimEventScheduler Scheduler;\r\n            public bool Add;\r\n\r\n            public InUpdateInfo(AnimEventScheduler s, bool add)\r\n            {\r\n                this.Scheduler = s;\r\n                this.Add = add;\r\n            }\r\n        }\r\n        \r\n        #endregion\r\n\r\n\r\n\r\n        #region Scriptable Animation Interface\r\n\r\n        [System.NonSerialized]\r\n        private ScriptableAnimCollection _scriptableAnims;\r\n        \r\n        /// <summary>\r\n        /// Starts an IScriptableAnimationCallback stopping animations according to PlayMode, this acts like 'Animation.Play'.\r\n        /// </summary>\r\n        /// <param name=\"state\"></param>\r\n        /// <param name=\"mode\"></param>\r\n        public void StartScriptableAnim(IScriptableAnimationCallback state, PlayMode mode)\r\n        {\r\n            if (state == null) throw new System.ArgumentNullException(\"state\");\r\n\r\n            if (_scriptableAnims == null)\r\n                _scriptableAnims = new ScriptableAnimCollection(this);\r\n\r\n            this.StopInternal(state.Layer, mode);\r\n            if (mode == PlayMode.StopAll)\r\n                _scriptableAnims.Clear(true);\r\n            else\r\n                _scriptableAnims.Remove(state.Layer, true);\r\n\r\n            _scriptableAnims.Add(state);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Starts an IScriptableAnimationCallback, but doesn't stop any other animations. This is similar to enabling an AnimationState, or calling Animation.Blend.\r\n        /// </summary>\r\n        /// <param name=\"state\"></param>\r\n        public void EnableScriptableAnim(IScriptableAnimationCallback state)\r\n        {\r\n            if (state == null) throw new System.ArgumentNullException(\"state\");\r\n\r\n            if (_scriptableAnims == null)\r\n                _scriptableAnims = new ScriptableAnimCollection(this);\r\n\r\n            _scriptableAnims.Add(state);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Stops the IScriptableAnimationCallback, usually we do not dispose as this should be called from within the IScriptableAnimationCallback when 'Stop' is called. \r\n        /// But an overload is allowed if needed.\r\n        /// </summary>\r\n        /// <param name=\"state\"></param>\r\n        /// <param name=\"dispose\"></param>\r\n        public void StopScriptableAnim(IScriptableAnimationCallback state, bool dispose = false)\r\n        {\r\n            if (state == null) throw new System.ArgumentNullException(\"state\");\r\n\r\n            if(_scriptableAnims != null)\r\n            {\r\n                _scriptableAnims.Remove(state, dispose);\r\n            }\r\n        }\r\n\r\n        private class ScriptableAnimCollection : IUpdateable, IEnumerable<IScriptableAnimationCallback>\r\n        {\r\n            private SPAnimationController _controller;\r\n            private HashSet<IScriptableAnimationCallback> _set = new HashSet<IScriptableAnimationCallback>();\r\n            private HashSet<IScriptableAnimationCallback> _toAdd = new HashSet<IScriptableAnimationCallback>();\r\n            private HashSet<IScriptableAnimationCallback> _toRemove = new HashSet<IScriptableAnimationCallback>();\r\n            private HashSet<IScriptableAnimationCallback> _toRemoveAndDispose = new HashSet<IScriptableAnimationCallback>();\r\n            private bool _inUpdate;\r\n\r\n            public ScriptableAnimCollection(SPAnimationController controller)\r\n            {\r\n                _controller = controller;\r\n            }\r\n\r\n            public int Count\r\n            {\r\n                get { return _set.Count; }\r\n            }\r\n\r\n            public void Add(IScriptableAnimationCallback wrapper)\r\n            {\r\n                if (_inUpdate)\r\n                {\r\n                    _toAdd.Add(wrapper);\r\n                }\r\n                else\r\n                {\r\n                    _set.Add(wrapper);\r\n                }\r\n                if (!GameLoopEntry.LateUpdatePump.Contains(this))\r\n                    GameLoopEntry.LateUpdatePump.Add(this);\r\n            }\r\n            \r\n            public void Remove(IScriptableAnimationCallback callback, bool dispose)\r\n            {\r\n                if (!_set.Contains(callback)) return;\r\n\r\n                if (_inUpdate)\r\n                {\r\n                    if (dispose)\r\n                        _toRemoveAndDispose.Add(callback);\r\n                    else\r\n                        _toRemove.Add(callback);\r\n                }\r\n                else\r\n                {\r\n                    if (_set.Remove(callback) && dispose)\r\n                    {\r\n                        callback.Dispose();\r\n                    }\r\n                }\r\n            }\r\n\r\n            public void Remove(int layer, bool dispose)\r\n            {\r\n                var e = _set.GetEnumerator();\r\n                var rmSet = dispose ? _toRemoveAndDispose : _toRemove;\r\n                while (e.MoveNext())\r\n                {\r\n                    if (e.Current.Layer == layer)\r\n                    {\r\n                        rmSet.Add(e.Current);\r\n                    }\r\n                }\r\n\r\n                if (!_inUpdate)\r\n                {\r\n                    e = rmSet.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if(dispose)\r\n                            e.Current.Dispose();\r\n                        _set.Remove(e.Current);\r\n                    }\r\n                    rmSet.Clear();\r\n                }\r\n            }\r\n\r\n            public void Clear(bool dispose)\r\n            {\r\n                var rmSet = dispose ? _toRemoveAndDispose : _toRemove;\r\n                if (_inUpdate)\r\n                {\r\n                    var e = _set.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        rmSet.Add(e.Current);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if(dispose)\r\n                    {\r\n                        using (var lst = TempCollection.GetList(_set))\r\n                        {\r\n                            _set.Clear();\r\n                            GameLoopEntry.LateUpdatePump.Remove(this);\r\n\r\n                            var e = lst.GetEnumerator();\r\n                            while(e.MoveNext())\r\n                            {\r\n                                e.Current.Dispose();\r\n                            }\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        _set.Clear();\r\n                        GameLoopEntry.LateUpdatePump.Remove(this);\r\n                    }\r\n                }\r\n            }\r\n\r\n            public void Update()\r\n            {\r\n                _inUpdate = true;\r\n                var e = _set.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (!e.Current.Tick(false))\r\n                        _toRemove.Add(e.Current);\r\n                }\r\n                _inUpdate = false;\r\n\r\n                if (_toAdd.Count > 0)\r\n                {\r\n                    e = _toAdd.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        _set.Add(e.Current);\r\n                    }\r\n                    _toAdd.Clear();\r\n                }\r\n\r\n                if (_toRemove.Count > 0)\r\n                {\r\n                    e = _toRemove.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (_set.Remove(e.Current)) e.Current.Dispose();\r\n                    }\r\n                    _toRemove.Clear();\r\n                }\r\n\r\n                if (_set.Count == 0)\r\n                {\r\n                    GameLoopEntry.LateUpdatePump.Remove(this);\r\n                }\r\n            }\r\n\r\n\r\n            public HashSet<IScriptableAnimationCallback>.Enumerator GetEnumerator()\r\n            {\r\n                return _set.GetEnumerator();\r\n            }\r\n\r\n            IEnumerator<IScriptableAnimationCallback> IEnumerable<IScriptableAnimationCallback>.GetEnumerator()\r\n            {\r\n                return this.GetEnumerator();\r\n            }\r\n\r\n            IEnumerator IEnumerable.GetEnumerator()\r\n            {\r\n                return this.GetEnumerator();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/SPAnimatorStateMachine.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.StateMachine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n    public class SPAnimatorStateMachine : SPAnimationController, ISPAnimationSource\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [System.NonSerialized()]\r\n        private ITypedStateMachine<ISPAnimatorState> _states;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            this.animation.playAutomatically = false;\r\n\r\n            _states = TypedStateMachine<ISPAnimatorState>.CreateFromComponentSource(this.gameObject); //new ComponentStateMachine<ISPAnimatorState>(this.gameObject);\r\n            _states.StateChanged += this.OnStateChanged;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ITypedStateMachine<ISPAnimatorState> AnimatorStates { get { return _states; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public new void Stop(string name)\r\n        {\r\n            this.animation.Stop(name);\r\n        }\r\n\r\n        public new void StopAll()\r\n        {\r\n            this.animation.Stop();\r\n        }\r\n\r\n        public bool IsPlaying(string name)\r\n        {\r\n            return this.animation.IsPlaying(name);\r\n        }\r\n\r\n\r\n        private void OnStateChanged(object sender, StateChangedEventArgs<ISPAnimatorState> e)\r\n        {\r\n            if (e.FromState != null) e.FromState.Deactivate();\r\n            if (e.ToState != null) e.ToState.Activate();\r\n        }\r\n\r\n        protected virtual void Update()\r\n        {\r\n            if (_states.Current != null) _states.Current.UpdateState();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISPAnimationSource Interface\r\n\r\n        public override ISPAnim GetAnim(string name)\r\n        {\r\n            var cur = this.AnimatorStates.Current;\r\n            if (cur != null && cur is ISPAnimationSource) return (cur as ISPAnimationSource).GetAnim(name);\r\n            else return base.GetAnim(name);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/TransformMask.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n\r\n    [System.Obsolete(\"Use SPAnimationMask Intead\")]\r\n    [System.Serializable()]\r\n    public struct TransformMask\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        public Transform Transform;\r\n        [SerializeField()]\r\n        public bool Recursive;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TransformMask(Transform t, bool recursive)\r\n        {\r\n            this.Transform = t;\r\n            this.Recursive = recursive;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/i_PlayAnimation.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing UnityEngine.Serialization;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Anim;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n    public class i_PlayAnimation : TriggerableMechanism, IObservableTrigger, IBlockingTriggerableMechanism, ISerializationCallbackReceiver\r\n    {\r\n\r\n        private const string TRG_ONANIMCOMPLETE = \"OnAnimComplete\";\r\n\r\n        public enum PlayByMode\r\n        {\r\n            PlayAnim,\r\n            PlayAnimByID,\r\n            PlayAnimFromResource\r\n        }\r\n        \r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private PlayByMode _mode;\r\n\r\n        [SerializeField]\r\n        private TriggerableTargetObject _targetAnimator;\r\n\r\n        [SerializeField]\r\n        private string _id;\r\n\r\n        [SerializeField]\r\n        private UnityEngine.Object _clip;\r\n\r\n        [SerializeField]\r\n        private bool _applyCustomSettings; //OBSOLETE\r\n        [SerializeField]\r\n        private AnimSettingsMask _settingsMask;\r\n        [SerializeField]\r\n        private AnimSettings _settings = AnimSettings.Default;\r\n\r\n        [SerializeField]\r\n        private QueueMode _queueMode = QueueMode.PlayNow;\r\n        [SerializeField]\r\n        private PlayMode _playMode = PlayMode.StopSameLayer;\r\n        [SerializeField]\r\n        private float _crossFadeDur = 0f;\r\n\r\n        [SerializeField()]\r\n        private Trigger _onAnimComplete = new Trigger(TRG_ONANIMCOMPLETE);\r\n        [SerializeField()]\r\n        [Tooltip(\"If an animation doesn't play, should we signal complete. This is useful if the animation is supposed to be chaining to another i_ that MUST run.\")]\r\n        private bool _triggerCompleteIfNoAnim = true;\r\n        [SerializeField()]\r\n        [Tooltip(\"If this is called as a BlockingTriggerableMechanims, should it actually block?\")]\r\n        private bool _useAsBlockingYieldInstruction = true;\r\n        [SerializeField()]\r\n        [Tooltip(\"When this mechanism is called as a BlockingTriggerableMechanims, it will block the caller until complete. Set this true to allow the next step in the daisy chain to also block.\")]\r\n        private bool _daisyChainBlockingYieldInstruction = true;\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private object PlayClip(SPAnimationController controller, UnityEngine.Object clip)\r\n        {\r\n            if (controller == null || !controller.isActiveAndEnabled || clip == null) return null;\r\n\r\n            if (clip is AnimationClip)\r\n            {\r\n                if (_crossFadeDur > 0f)\r\n                    return controller.CrossFadeAuxiliary(clip as AnimationClip,\r\n                                                         (_settingsMask != 0) ? AnimSettings.Intersect(AnimSettings.Default, _settings, _settingsMask) : AnimSettings.Default,\r\n                                                         _crossFadeDur, _queueMode, _playMode);\r\n                else\r\n                    return controller.PlayAuxiliary(clip as AnimationClip,\r\n                                                    (_settingsMask != 0) ? AnimSettings.Intersect(AnimSettings.Default, _settings, _settingsMask) : AnimSettings.Default,\r\n                                                    _queueMode, _playMode);\r\n            }\r\n            else if (clip is IScriptableAnimationClip)\r\n            {\r\n                return controller.Play(clip as IScriptableAnimationClip);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        private object PlayClip(Animation controller, AnimationClip clip)\r\n        {\r\n            if (controller == null || !controller.isActiveAndEnabled || clip == null) return null;\r\n\r\n            var id = \"aux*\" + clip.GetInstanceID();\r\n            var a = controller[id];\r\n            if (a == null || a.clip != clip)\r\n            {\r\n                controller.AddClip(clip, id);\r\n            }\r\n\r\n            AnimationState anim;\r\n            if (_crossFadeDur > 0f)\r\n                anim = controller.CrossFadeQueued(id, _crossFadeDur, _queueMode, _playMode);\r\n            else\r\n                anim = controller.PlayQueued(id, _queueMode, _playMode);\r\n            if (_settingsMask != 0) _settings.Apply(anim, _settingsMask);\r\n            return anim;\r\n        }\r\n\r\n        private object TryPlay(object controller)\r\n        {\r\n            if(controller is SPAnimationController)\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case PlayByMode.PlayAnim:\r\n                        return PlayClip(controller as SPAnimationController, _clip);\r\n                    case PlayByMode.PlayAnimByID:\r\n                        var anim = (controller as SPAnimationController).GetAnim(_id);\r\n                        if (anim != null)\r\n                        {\r\n                            if (_crossFadeDur > 0f)\r\n                                anim.CrossFade(_crossFadeDur, _queueMode, _playMode);\r\n                            else\r\n                                anim.Play(_queueMode, _playMode);\r\n                            if (_settingsMask != 0) _settings.Apply(anim, _settingsMask);\r\n                            return anim;\r\n                        }\r\n                        return null;\r\n                    case PlayByMode.PlayAnimFromResource:\r\n                        return this.PlayClip(controller as SPAnimationController, Resources.Load<UnityEngine.Object>(_id));\r\n                }\r\n            }\r\n            else if(controller is Animation)\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case PlayByMode.PlayAnim:\r\n                        return PlayClip(controller as Animation, _clip as AnimationClip);\r\n                    case PlayByMode.PlayAnimByID:\r\n                        var comp = controller as Animation;\r\n                        if (comp[_id] != null)\r\n                        {\r\n                            AnimationState anim;\r\n                            if (_crossFadeDur > 0f)\r\n                                anim = comp.CrossFadeQueued(_id, _crossFadeDur, _queueMode, _playMode);\r\n                            else\r\n                                anim = comp.PlayQueued(_id, _queueMode, _playMode);\r\n                            if (_settingsMask != 0) _settings.Apply(anim, _settingsMask);\r\n                            return anim;\r\n                        }\r\n                        return null;\r\n                    case PlayByMode.PlayAnimFromResource:\r\n                        return this.PlayClip(controller as Animation, Resources.Load<AnimationClip>(_id));\r\n                }\r\n            }\r\n            else if(controller is ISPAnimationSource)\r\n            {\r\n                if(_mode == PlayByMode.PlayAnimByID)\r\n                {\r\n                    var anim = (controller as ISPAnimationSource).GetAnim(_id);\r\n                    if (anim != null)\r\n                    {\r\n                        if (_crossFadeDur > 0f)\r\n                            anim.CrossFade(_crossFadeDur, _queueMode, _playMode);\r\n                        else\r\n                            anim.Play(_queueMode, _playMode);\r\n                        if (_settingsMask != 0) _settings.Apply(anim, _settingsMask);\r\n                        return anim;\r\n                    }\r\n                    return null;\r\n                }\r\n            }\r\n            else if(controller is ISPAnimator)\r\n            {\r\n                if (string.IsNullOrEmpty(_id)) return null;\r\n                return com.spacepuppy.Dynamic.DynamicUtil.InvokeMethod(controller, _id);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        private object ResolveTargetAnimator(object arg)\r\n        {\r\n            var obj = _targetAnimator.GetTarget<UnityEngine.Object>(arg);\r\n\r\n            ISPAnimationSource src = null;\r\n            ISPAnimator spanim = null;\r\n            Animation anim = null;\r\n\r\n            if (ObjUtil.GetAsFromSource<ISPAnimationSource>(obj, out src))\r\n                return src;\r\n            if (ObjUtil.GetAsFromSource<ISPAnimator>(obj, out spanim))\r\n                return spanim;\r\n            if (ObjUtil.GetAsFromSource<Animation>(obj, out anim))\r\n                return anim;\r\n\r\n            if (obj is SPEntity || _targetAnimator.ImplicityReducesEntireEntity)\r\n            {\r\n                var go = obj is SPEntity ? (obj as SPEntity).gameObject : GameObjectUtil.FindRoot(GameObjectUtil.GetGameObjectFromSource(obj));\r\n                if (go == null) return null;\r\n\r\n                SPAnimationController spcont;\r\n                if (go.FindComponent<SPAnimationController>(out spcont))\r\n                    return spcont;\r\n                \r\n                if (go.FindComponent<Animation>(out anim))\r\n                    return anim;\r\n            }\r\n            \r\n            return null;\r\n        }\r\n\r\n\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var targ = this.ResolveTargetAnimator(arg);\r\n            if (targ == null) return false;\r\n\r\n            var anim = this.TryPlay(targ);\r\n            if (anim.IsNullOrDestroyed())\r\n            {\r\n                if (_triggerCompleteIfNoAnim) this.Invoke(() => { _onAnimComplete.ActivateTrigger(this, arg); }, 0f);\r\n                return false;\r\n            }\r\n\r\n            if (_onAnimComplete.Count > 0)\r\n            {\r\n                AnimUtil.TrySchedule(anim, (a) =>\r\n                {\r\n                    _onAnimComplete.ActivateTrigger(this, arg);\r\n                });\r\n            }\r\n\r\n            return false;\r\n        }\r\n        \r\n        public bool Trigger(object sender, object arg, BlockingTriggerYieldInstruction instruction)\r\n        {\r\n            if (!_useAsBlockingYieldInstruction || instruction == null) return this.Trigger(sender, arg);\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var targ = this.ResolveTargetAnimator(arg);\r\n            if (targ == null) return false;\r\n\r\n            var anim = this.TryPlay(targ);\r\n            if (anim == null)\r\n            {\r\n                if (_triggerCompleteIfNoAnim) this.Invoke(() => { _onAnimComplete.ActivateTrigger(this, arg); }, 0f);\r\n                return false;\r\n            }\r\n\r\n            instruction.BeginBlock();\r\n            AnimUtil.TrySchedule(anim, (a) =>\r\n            {\r\n                if (_daisyChainBlockingYieldInstruction)\r\n                    _onAnimComplete.DaisyChainTriggerYielding(this, arg, instruction);\r\n                else\r\n                    _onAnimComplete.ActivateTrigger(this, arg);\r\n                instruction.EndBlock();\r\n            });\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IObservableTrigger Interface\r\n\r\n        Trigger[] IObservableTrigger.GetTriggers()\r\n        {\r\n            return new Trigger[] { _onAnimComplete };\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISerializationCallbackReceiver Interface\r\n\r\n        void ISerializationCallbackReceiver.OnAfterDeserialize()\r\n        {\r\n            if(_applyCustomSettings)\r\n            {\r\n                _applyCustomSettings = false;\r\n                _settingsMask = (AnimSettingsMask)(-1);\r\n            }\r\n        }\r\n\r\n        void ISerializationCallbackReceiver.OnBeforeSerialize()\r\n        {\r\n            if (_applyCustomSettings)\r\n            {\r\n                _applyCustomSettings = false;\r\n                _settingsMask = (AnimSettingsMask)(-1);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n\r\n        public static bool IsAcceptibleAnimator(object obj)\r\n        {\r\n            return obj is ISPAnimationSource || obj is ISPAnimator || obj is Animation;\r\n        }\r\n        \r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/i_PlaySPAnimation.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing UnityEngine.Serialization;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Anim;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n\r\n    [System.Obsolete(\"Use i_PlayAnimation instead!\")]\r\n    [Infobox(\"Be aware that this is a BlockingTriggerableMechanism, if called from a BlockingTrigger (in a coroutine for example), it will block that sequence until complete is fired. If it shouldn't block, be sure to uncheck 'UseAsBlockingYieldInstruction'.\", MessageType = InfoBoxMessageType.Info)]\r\n    public class i_PlaySPAnimation : TriggerableMechanism, IObservableTrigger, IBlockingTriggerableMechanism\r\n    {\r\n\r\n        private const string TRG_ONANIMCOMPLETE = \"OnAnimComplete\";\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [TriggerableTargetObject.Config(typeof(ISPAnimationSource))]\r\n        [FormerlySerializedAs(\"TargetAnimator\")]\r\n        private TriggerableTargetObject _targetAnimator;\r\n        [SerializeField()]\r\n        [FormerlySerializedAs(\"ClipIDs\")]\r\n        [OneOrMany()]\r\n        private string[] _clipIDs;\r\n        [SerializeField()]\r\n        [FormerlySerializedAs(\"PlayMode\")]\r\n        private PlayMode _playMode = PlayMode.StopSameLayer;\r\n        [SerializeField()]\r\n        [FormerlySerializedAs(\"Speed\")]\r\n        private float _speed = 1f;\r\n        [SerializeField()]\r\n        private SPTime _timeSupplier;\r\n        [SerializeField()]\r\n        [FormerlySerializedAs(\"OnAnimComplete\")]\r\n        private Trigger _onAnimComplete = new Trigger(TRG_ONANIMCOMPLETE);\r\n        [SerializeField()]\r\n        [Tooltip(\"If an animation doesn't play, should we signal complete. This is useful if the animation is supposed to be chaining to another i_ that MUST run.\")]\r\n        [FormerlySerializedAs(\"TriggerCompleteIfNoAnim\")]\r\n        private bool _triggerCompleteIfNoAnim = true;\r\n        [SerializeField()]\r\n        [Tooltip(\"If this is called as a BlockingTriggerableMechanims, should it actually block?\")]\r\n        private bool _useAsBlockingYieldInstruction = true;\r\n        [SerializeField()]\r\n        [Tooltip(\"When this mechanism is called as a BlockingTriggerableMechanims, it will block the caller until complete. Set this true to allow the next step in the daisy chain to also block.\")]\r\n        private bool _daisyChainBlockingYieldInstruction = true;\r\n        [SerializeField()]\r\n        private float _startTime;\r\n\r\n        [System.NonSerialized()]\r\n        private ISPAnim _currentAnimState;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n        \r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public TriggerableTargetObject TargetAnimator\r\n        {\r\n            get { return _targetAnimator; }\r\n        }\r\n\r\n        public PlayMode PlayMode\r\n        {\r\n            get { return _playMode; }\r\n            set { _playMode = value; }\r\n        }\r\n\r\n        public float Speed\r\n        {\r\n            get { return _speed; }\r\n            set { _speed = value; }\r\n        }\r\n\r\n        public ITimeSupplier TimeSupplier\r\n        {\r\n            get { return _timeSupplier.TimeSupplier; }\r\n            set { _timeSupplier.TimeSupplier = value; }\r\n        }\r\n\r\n        public Trigger OnAnimComplete\r\n        {\r\n            get { return _onAnimComplete; }\r\n        }\r\n\r\n        public bool TriggerCompleteIfNoAnim\r\n        {\r\n            get { return _triggerCompleteIfNoAnim; }\r\n            set { _triggerCompleteIfNoAnim = value; }\r\n        }\r\n\r\n        public float StartTime\r\n        {\r\n            get { return _startTime; }\r\n            set { _startTime = value; }\r\n        }\r\n\r\n        public ISPAnim CurrentAnimState\r\n        {\r\n            get { return _currentAnimState; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        #endregion\r\n\r\n        #region TriggerableMechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var anim = _targetAnimator.GetTarget<ISPAnimationSource>(arg);\r\n            if (anim == null || !anim.CanPlayAnim) return false;\r\n\r\n            var id = _clipIDs.PickRandom();\r\n            _currentAnimState = anim.GetAnim(id);\r\n            if (_currentAnimState == null)\r\n            {\r\n                //this.Invoke(() => { this.OnAnimCompleteCallback(null); }, 0f);\r\n                if (_triggerCompleteIfNoAnim) this.Invoke(() => { _onAnimComplete.ActivateTrigger(this, arg); }, 0f);\r\n                return false;\r\n            }\r\n            \r\n            _currentAnimState.TimeSupplier = _timeSupplier.TimeSupplier;\r\n            _currentAnimState.Play(_speed, _startTime, QueueMode.PlayNow, _playMode);\r\n            _currentAnimState.Schedule((s) =>\r\n            {\r\n                _currentAnimState = null;\r\n                _onAnimComplete.ActivateTrigger(this, arg);\r\n            });\r\n\r\n            return true;\r\n        }\r\n\r\n        public bool Trigger(object sender, object arg, BlockingTriggerYieldInstruction instruction)\r\n        {\r\n            if (!_useAsBlockingYieldInstruction || instruction == null) return this.Trigger(sender, arg);\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var anim = _targetAnimator.GetTarget<ISPAnimationSource>(arg);\r\n            if (anim == null) return false;\r\n\r\n            var id = _clipIDs.PickRandom();\r\n            _currentAnimState = anim.GetAnim(id);\r\n            if (_currentAnimState == null)\r\n            {\r\n                //this.Invoke(() => { this.OnAnimCompleteCallback(null); }, 0f);\r\n                if (_triggerCompleteIfNoAnim) this.Invoke(() => { _onAnimComplete.ActivateTrigger(this, arg); }, 0f);\r\n                return false;\r\n            }\r\n\r\n            instruction.BeginBlock();\r\n            _currentAnimState.TimeSupplier = _timeSupplier.TimeSupplier;\r\n            _currentAnimState.Play(_speed, _startTime, QueueMode.PlayNow, _playMode);\r\n            _currentAnimState.Schedule((s) =>\r\n            {\r\n                _currentAnimState = null;\r\n                if (_daisyChainBlockingYieldInstruction)\r\n                    _onAnimComplete.DaisyChainTriggerYielding(this, arg, instruction);\r\n                else\r\n                    _onAnimComplete.ActivateTrigger(this, arg);\r\n                instruction.EndBlock();\r\n            });\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IObservableTrigger Interface\r\n        \r\n        Trigger[] IObservableTrigger.GetTriggers()\r\n        {\r\n            return new Trigger[] { _onAnimComplete };\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Anim/i_StopAnimation.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing UnityEngine.Serialization;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Anim;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Anim\r\n{\r\n    public class i_StopAnimation : TriggerableMechanism\r\n    {\r\n\r\n        public enum StopMode\r\n        {\r\n            All,\r\n            Id,\r\n            Layer\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private TriggerableTargetObject _targetAnimator;\r\n\r\n        [SerializeField]\r\n        private StopMode _mode;\r\n\r\n        [SerializeField()]\r\n        private string _id;\r\n        [SerializeField()]\r\n        private int _layer;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public TriggerableTargetObject TargetAnimator\r\n        {\r\n            get { return _targetAnimator; }\r\n        }\r\n\r\n        public StopMode Mode\r\n        {\r\n            get { return _mode; }\r\n            set { _mode = value; }\r\n        }\r\n\r\n        public string Id\r\n        {\r\n            get { return _id; }\r\n            set { _id = value; }\r\n        }\r\n\r\n        public int Layer\r\n        {\r\n            get { return _layer; }\r\n            set { _layer = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private object ResolveTargetAnimator(object arg)\r\n        {\r\n            var obj = _targetAnimator.GetTarget<UnityEngine.Object>(arg);\r\n\r\n            ISPAnimationSource src = null;\r\n            ISPAnimator spanim = null;\r\n            Animation anim = null;\r\n\r\n            if (ObjUtil.GetAsFromSource<ISPAnimationSource>(obj, out src))\r\n                return src;\r\n            if (ObjUtil.GetAsFromSource<ISPAnimator>(obj, out spanim))\r\n                return spanim;\r\n            if (ObjUtil.GetAsFromSource<Animation>(obj, out anim))\r\n                return anim;\r\n\r\n            if (obj is SPEntity || _targetAnimator.ImplicityReducesEntireEntity)\r\n            {\r\n                var go = obj is SPEntity ? (obj as SPEntity).gameObject : GameObjectUtil.FindRoot(GameObjectUtil.GetGameObjectFromSource(obj));\r\n                if (go == null) return null;\r\n\r\n                SPAnimationController spcont;\r\n                if (go.FindComponent<SPAnimationController>(out spcont))\r\n                    return spcont;\r\n\r\n                if (go.FindComponent<Animation>(out anim))\r\n                    return anim;\r\n            }\r\n\r\n            /*\r\n            var obj = _targetAnimator.GetTarget<UnityEngine.Object>(arg);\r\n            if (obj == null || obj is SPAnimationController || obj is Animation)\r\n            {\r\n                return obj;\r\n            }\r\n            else if (_targetAnimator.ImplicityReducesEntireEntity)\r\n            {\r\n                var go = GameObjectUtil.FindRoot(GameObjectUtil.GetGameObjectFromSource(obj));\r\n                if (go == null) return null;\r\n\r\n                SPAnimationController spcont;\r\n                if (go.FindComponent<SPAnimationController>(out spcont))\r\n                    return spcont;\r\n\r\n                Animation anim;\r\n                if (go.FindComponent<Animation>(out anim))\r\n                    return anim;\r\n            }\r\n            */\r\n\r\n            return null;\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var animator = this.ResolveTargetAnimator(arg);\r\n            if (animator == null) return false;\r\n\r\n            switch(_mode)\r\n            {\r\n                case StopMode.All:\r\n                    if(animator is Animation)\r\n                    {\r\n                        (animator as Animation).Stop();\r\n                        return true;\r\n                    }\r\n                    else if(animator is SPAnimationController)\r\n                    {\r\n                        (animator as SPAnimationController).StopAll();\r\n                        return true;\r\n                    }\r\n                    break;\r\n                case StopMode.Id:\r\n                    if (animator is Animation)\r\n                    {\r\n                        (animator as Animation).Stop(_id);\r\n                        return true;\r\n                    }\r\n                    else if (animator is SPAnimationController)\r\n                    {\r\n                        (animator as SPAnimationController).Stop(_id);\r\n                        return true;\r\n                    }\r\n                    break;\r\n                case StopMode.Layer:\r\n                    if (animator is Animation)\r\n                    {\r\n                        (animator as Animation).Stop(_layer);\r\n                        return true;\r\n                    }\r\n                    else if (animator is SPAnimationController)\r\n                    {\r\n                        (animator as SPAnimationController).Stop(_layer);\r\n                        return true;\r\n                    }\r\n                    break;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n\r\n        #region Static Interface\r\n\r\n        public static bool IsAcceptibleAnimator(object obj)\r\n        {\r\n            return obj is SPAnimationController || obj is Animation;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Mecanim/MecanimSpeedScaler.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Mecanim\r\n{\r\n    public class MecanimSpeedScaler : SPComponent\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [DefaultFromSelf()]\r\n        private Animator _animator;\r\n        [SerializeField()]\r\n        private SPTime _timeSupplier;\r\n        [SerializeField()]\r\n        private float _speed;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnStartOrEnable()\r\n        {\r\n            base.OnStartOrEnable();\r\n\r\n            if (!_timeSupplier.IsCustom) return;\r\n\r\n            var ts = _timeSupplier.TimeSupplier as IScalableTimeSupplier;\r\n            if (ts != null || _animator != null) ts.TimeScaleChanged += this.OnTimeScaleChanged;\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            var ts = _timeSupplier.TimeSupplier as IScalableTimeSupplier;\r\n            if (ts != null) ts.TimeScaleChanged -= this.OnTimeScaleChanged;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Callbacks\r\n\r\n        private void OnTimeScaleChanged(object sender, System.EventArgs e)\r\n        {\r\n            if(_animator == null)\r\n            {\r\n                var ts = _timeSupplier.TimeSupplier as IScalableTimeSupplier;\r\n                if (ts != null) ts.TimeScaleChanged -= this.OnTimeScaleChanged;\r\n                return;\r\n            }\r\n\r\n            _animator.speed = _speed * SPTime.GetInverseScale(_timeSupplier.TimeSupplier as ITimeSupplier);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnim/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"SpacepuppyAnim\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"SpacepuppyAnim\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"36071398-8eeb-469f-9cdf-a2d06f6c5dbb\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "SpacepuppyAnim/SpacepuppyAnim.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{48C79480-359D-4215-9EDE-3D4E9D8190B3}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>com.spacepuppy</RootNamespace>\r\n    <AssemblyName>SpacepuppyUnityFramework.Anim</AssemblyName>\r\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile>\r\n    </TargetFrameworkProfile>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"UnityEngine, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Anim\\AnimPropertyAttributes.cs\" />\r\n    <Compile Include=\"Anim\\AnimSettings.cs\" />\r\n    <Compile Include=\"Anim\\AnimUtil.cs\" />\r\n    <Compile Include=\"Anim\\Blend\\AnimationBlendGraph.cs\" />\r\n    <Compile Include=\"Anim\\Blend\\IndexedAnimationSelector.cs\" />\r\n    <Compile Include=\"Anim\\Exceptions.cs\" />\r\n    <Compile Include=\"Anim\\IAnimControllerMask.cs\" />\r\n    <Compile Include=\"Anim\\IKSolver.cs\" />\r\n    <Compile Include=\"Anim\\IScriptableAnimationClip.cs\" />\r\n    <Compile Include=\"Anim\\ISPAnimator.cs\" />\r\n    <Compile Include=\"Anim\\ISPAnim.cs\" />\r\n    <Compile Include=\"Anim\\AnimEventScheduler.cs\" />\r\n    <Compile Include=\"Anim\\ISPAnimationSource.cs\" />\r\n    <Compile Include=\"Anim\\ISPAnimatorState.cs\" />\r\n    <Compile Include=\"Anim\\i_PlayAnimation.cs\" />\r\n    <Compile Include=\"Anim\\i_PlaySPAnimation.cs\" />\r\n    <Compile Include=\"Anim\\AnimPrimitives.cs\" />\r\n    <Compile Include=\"Anim\\Blend\\LinearAnimationBlend.cs\" />\r\n    <Compile Include=\"Anim\\Blend\\LinearAnimationSelector.cs\" />\r\n    <Compile Include=\"Anim\\i_StopAnimation.cs\" />\r\n    <Compile Include=\"Anim\\Legacy\\SPLegacyAnimation.cs\" />\r\n    <Compile Include=\"Anim\\MaskCollection.cs\" />\r\n    <Compile Include=\"Anim\\PropertyAttributes.cs\" />\r\n    <Compile Include=\"Anim\\ISPAnimationMask.cs\" />\r\n    <Compile Include=\"Mecanim\\MecanimSpeedScaler.cs\" />\r\n    <Compile Include=\"Anim\\SPAnimationController.cs\" />\r\n    <Compile Include=\"Anim\\SPAnimClip.cs\" />\r\n    <Compile Include=\"Anim\\SPAnimClipCollection.cs\" />\r\n    <Compile Include=\"Anim\\Blend\\StaticFrameAnimation.cs\" />\r\n    <Compile Include=\"Anim\\SPAnim.cs\" />\r\n    <Compile Include=\"Anim\\SPAnimatorStateMachine.cs\" />\r\n    <Compile Include=\"Anim\\TransformMask.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\r\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\r\n      <Name>SpacepuppyBase</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>mkdir $(ProjectDir)..\\Builds\\FullLibrary\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.Anim.dll\" \"$(ProjectDir)..\\Builds\\FullLibrary\\SpacepuppyUnityFramework.Anim.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.Anim.pdb\" \"$(ProjectDir)..\\Builds\\FullLibrary\\SpacepuppyUnityFramework.Anim.pdb\"</PostBuildEvent>\r\n  </PropertyGroup>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "SpacepuppyAnimEditor/Anim/AnimLayerPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Anim;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Anim\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(AnimLayerAttribute))]\r\n    public class AnimLayerPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        #region Drawer Instance Interface\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            if(_supplier == null)\r\n            {\r\n                SPEditorGUI.DefaultPropertyField(position, property, label);\r\n                return;\r\n            }\r\n\r\n            var infos = _supplier.GetLayers();\r\n            if (infos == null || infos.Length == 0)\r\n            {\r\n                SPEditorGUI.DefaultPropertyField(position, property, label);\r\n                return;\r\n            }\r\n\r\n            position = EditorGUI.PrefixLabel(position, label);\r\n\r\n            var names = (from info in infos select info.Name).Append(\"Custom...\").ToArray();\r\n            int i = this.GetCurrentIndex(infos, property.intValue);\r\n            if (i < 0) i = infos.Length;\r\n\r\n            var r1 = new Rect(position.xMin, position.yMin, position.width * 0.7f, position.height);\r\n            var r2 = new Rect(r1.xMax, r1.yMin, position.width - r1.width, r1.height);\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            i = EditorGUI.Popup(r1, i, names);\r\n            if (EditorGUI.EndChangeCheck())\r\n            {\r\n                if (i == infos.Length)\r\n                {\r\n                    property.intValue = (from info in infos select info.Layer).Max() + 1;\r\n                }\r\n                else\r\n                {\r\n                    property.intValue = infos[i].Layer;\r\n                }\r\n            }\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            int layer = EditorGUI.IntField(r2, property.intValue);\r\n            if (EditorGUI.EndChangeCheck())\r\n            {\r\n                property.intValue = layer;\r\n            }\r\n        }\r\n\r\n        private int GetCurrentIndex(AnimLayerInformation[] infos, int currentLayer)\r\n        {\r\n            for(int i = 0; i < infos.Length; i++)\r\n            {\r\n                if (infos[i].Layer == currentLayer) return i;\r\n            }\r\n            return -1;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n\r\n        #region Static Interface\r\n\r\n        private static IAnimLayerInformationSupplier _supplier;\r\n\r\n        static AnimLayerPropertyDrawer()\r\n        {\r\n            SyncLayerData();\r\n        }\r\n\r\n        public static void SyncLayerData()\r\n        {\r\n            _supplier = null;\r\n            var tp = TypeUtil.GetTypesAssignableFrom(typeof(IAnimLayerInformationSupplier))\r\n                             .Where((t) =>\r\n                             {\r\n                                 return t.IsClass && !t.IsAbstract;\r\n                             })\r\n                             .OrderByDescending((t) =>\r\n                             {\r\n                                 var attrib = t.GetCustomAttributes(typeof(AnimLayerInformationSupplierConfigAttribute), false).FirstOrDefault() as AnimLayerInformationSupplierConfigAttribute;\r\n                                 if (attrib == null) return 0;\r\n                                 else return attrib.Priority;\r\n                             })\r\n                             .FirstOrDefault();\r\n\r\n            if(tp != null)\r\n            {\r\n                try\r\n                {\r\n                    _supplier = System.Activator.CreateInstance(tp) as IAnimLayerInformationSupplier;\r\n                }\r\n                catch\r\n                {\r\n                    Debug.LogWarning(\"Failed to create IAnimLayerInformationSupplier with highest priority. Make sure a constructor with zero parameters exists and doesn't throw an exception.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnimEditor/Anim/AnimTimePeriodPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Anim;\r\n\r\nusing com.spacepuppyeditor.Base;\r\n\r\nnamespace com.spacepuppyeditor.Anim\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(AnimTimePeriodAttribute))]\r\n    public class AnimTimePeriodPropertyDrawer : SPTimePeriodPropertyDrawer\r\n    {\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            position = EditorGUI.PrefixLabel(position, label);\r\n\r\n            var secondsProp = property.FindPropertyRelative(PROP_SECONDS);\r\n            if(secondsProp != null && secondsProp.propertyType == SerializedPropertyType.Float)\r\n            {\r\n                var choices = new GUIContent[] { EditorHelper.TempContent(\"To Complete\"), EditorHelper.TempContent(\"For Duration\") };\r\n                int index = (secondsProp.floatValue == float.PositiveInfinity) ? 0 : 1;\r\n                if(index == 0)\r\n                {\r\n                    index = EditorGUI.Popup(position, index, choices);\r\n                    if (index == 1) secondsProp.floatValue = 0f;\r\n                }\r\n                else\r\n                {\r\n                    var r = new Rect(position.xMin, position.yMin, Mathf.Min(position.width, 80f), EditorGUIUtility.singleLineHeight);\r\n                    index = EditorGUI.Popup(r, index, choices);\r\n\r\n                    if(index == 0)\r\n                    {\r\n                        secondsProp.floatValue = float.PositiveInfinity;\r\n                        property.FindPropertyRelative(SPTimePropertyDrawer.PROP_TIMESUPPLIERNAME).stringValue = null;\r\n                    }\r\n                    else\r\n                    {\r\n                        position = new Rect(r.xMax, position.yMin, position.width - r.width, position.height);\r\n                        this.DrawTimePeriodSansLabel(position, property);\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                this.DrawTimePeriodSansLabel(position, property);\r\n            }\r\n\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnimEditor/Anim/IAnimLayerInformationSupplier.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppyeditor.Anim\r\n{\r\n\r\n    public struct AnimLayerInformation\r\n    {\r\n        public string Name;\r\n        public int Layer;\r\n\r\n        public AnimLayerInformation(string name, int layer)\r\n        {\r\n            this.Name = name;\r\n            this.Layer = layer;\r\n        }\r\n    }\r\n\r\n    [System.AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=false)]\r\n    public class AnimLayerInformationSupplierConfigAttribute : System.Attribute\r\n    {\r\n\r\n        public readonly int Priority;\r\n\r\n        public AnimLayerInformationSupplierConfigAttribute(int priority)\r\n        {\r\n            this.Priority = priority;\r\n        }\r\n\r\n    }\r\n\r\n    public interface IAnimLayerInformationSupplier\r\n    {\r\n\r\n        AnimLayerInformation[] GetLayers();\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnimEditor/Anim/Legacy/SPLegacyAnimationInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Anim;\r\nusing com.spacepuppy.Anim.Legacy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Anim.Legacy\r\n{\r\n\r\n    [System.Obsolete()]\r\n    [CustomEditor(typeof(SPLegacyAnimation), true)]\r\n    public class SPLegacyAnimationInspector : SPAnimationControllerInspector\r\n    {\r\n        \r\n        //protected override void OnSPInspectorGUI()\r\n        //{\r\n        //    this.serializedObject.Update();\r\n\r\n        //    this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n        //    this.DrawPlayAnimPopup();\r\n        //    this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_STATES, PROP_ANIMATEPHYSICS, PROP_ANIMCULLING, PROP_TIMESUPPLIER, PROP_SPEED, PROP_ANIMTOPLAYONSTART);\r\n        //    this.DrawSPAnimationControllerProps();\r\n\r\n        //    this.serializedObject.ApplyModifiedProperties();\r\n        //}\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnimEditor/Anim/MaskCollectionPropertyDrawer.cs",
    "content": "﻿#pragma warning disable 0618 // ignore obsolete warning\r\nusing UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Anim;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Anim\r\n{\r\n\r\n    [System.Obsolete(\"MaskCollection is obsolete, so is its inspector.\")]\r\n    [CustomPropertyDrawer(typeof(MaskCollection))]\r\n    public class MaskCollectionPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n\r\n        #region Fields\r\n\r\n        public string Label;\r\n\r\n        private CachedReorderableList _maskList;\r\n        private GUIContent _currentLabel;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private void Init(SerializedProperty property, GUIContent label)\r\n        {\r\n            _currentLabel = label;\r\n            _maskList = CachedReorderableList.GetListDrawer(property.FindPropertyRelative(\"_masks\"), _maskList_DrawHeader, _maskList_DrawElement);\r\n\r\n            if (_maskList.index >= _maskList.count) _maskList.index = -1;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region OnGUI\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            float h;\r\n            if (EditorHelper.AssertMultiObjectEditingNotSupportedHeight(property, label, out h)) return h;\r\n\r\n            this.Init(property, label);\r\n\r\n            return _maskList.GetHeight();\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            if (EditorHelper.AssertMultiObjectEditingNotSupported(position, property, label)) return;\r\n\r\n            this.Init(property, label);\r\n            \r\n            var cache = SPGUI.DisableIfPlaying();\r\n\r\n            _maskList.DoList(position);\r\n\r\n            cache.Reset();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Masks ReorderableList Handlers\r\n\r\n        private void _maskList_DrawHeader(Rect area)\r\n        {\r\n            if (this.Label != null)\r\n                EditorGUI.LabelField(area, this.Label);\r\n            else\r\n                EditorGUI.LabelField(area, _currentLabel);\r\n        }\r\n\r\n        private void _maskList_DrawElement(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            var element = _maskList.serializedProperty.GetArrayElementAtIndex(index);\r\n            if (element == null) return;\r\n\r\n            const float RECURS_WIDTH = 80f;\r\n            const float RECURS_LABEL_WIDTH = 60f;\r\n\r\n            //DRAW TRANSFORM\r\n            var transProp = element.FindPropertyRelative(\"Transform\");\r\n            var transRect = new Rect(area.xMin, area.yMin, area.width - RECURS_WIDTH, EditorGUIUtility.singleLineHeight);\r\n            EditorGUI.PropertyField(transRect, transProp, GUIContent.none);\r\n\r\n            //DRAW RECURSIVE TOGGLE\r\n            var recursProp = element.FindPropertyRelative(\"Recursive\");\r\n            var recursTotalRect = new Rect(transRect.xMax + 2f, area.yMin, RECURS_WIDTH - 2f, EditorGUIUtility.singleLineHeight);\r\n            var recursLabelRect = new Rect(recursTotalRect.xMin, recursTotalRect.yMin, RECURS_LABEL_WIDTH, recursTotalRect.height);\r\n            var recursToggleRect = new Rect(recursLabelRect.xMax, recursTotalRect.yMin, recursTotalRect.xMax - recursLabelRect.xMax, recursTotalRect.height);\r\n            var recursLabel = new GUIContent(\"Recurses\");\r\n            EditorGUI.BeginProperty(recursTotalRect, recursLabel, recursProp);\r\n            EditorGUI.LabelField(recursLabelRect, recursLabel);\r\n            recursProp.boolValue = EditorGUI.Toggle(recursToggleRect, GUIContent.none, recursProp.boolValue);\r\n            EditorGUI.EndProperty();\r\n\r\n            if (GUI.enabled) ReorderableListHelper.DrawDraggableElementDeleteContextMenu(_maskList, area, index, isActive, isFocused);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnimEditor/Anim/SPAnimClipCollectionPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Anim;\r\n\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Anim\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(SPAnimClipCollection), true)]\r\n    public class SPAnimClipCollectionPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        //SPAnimationState._masks is a MaskCollection wich has a list inside it called _masks\r\n        private const string PROP_ANIMSTATES = \"_serializedStates\";\r\n\r\n        private static GUIStyle _nameLabelGUIStyle = new GUIStyle(\"Label\")\r\n        {\r\n            alignment = TextAnchor.MiddleRight\r\n        };\r\n\r\n        #region Fields\r\n\r\n        private CachedReorderableList _animList;\r\n\r\n        private SPAnimClipCollection _target;\r\n        private GUIContent _currentLabel;\r\n        private int _defaultLayer;\r\n        private bool _isStaticColl;\r\n        private bool _hideDetailRegion;\r\n        private string _entryPrefix;\r\n\r\n        private SPAnimClipPropertyDrawer _clipDrawer = new SPAnimClipPropertyDrawer();\r\n\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private void Init(SerializedProperty property, GUIContent label, bool searchForAttribs)\r\n        {\r\n            _target = EditorHelper.GetTargetObjectOfProperty(property) as SPAnimClipCollection;\r\n            _currentLabel = label;\r\n            _defaultLayer = 0;\r\n            _isStaticColl = false;\r\n            _hideDetailRegion = false;\r\n\r\n            _animList = CachedReorderableList.GetListDrawer(property.FindPropertyRelative(PROP_ANIMSTATES), _animList_DrawHeader, _animList_DrawElement, _animList_OnAdded);\r\n            if (_animList.index >= _animList.count) _animList.index = -1;\r\n\r\n            if (searchForAttribs && this.fieldInfo != null)\r\n            {\r\n                //config\r\n                var configAttrib = this.fieldInfo.GetCustomAttributes(typeof(SPAnimClipCollection.ConfigAttribute), false).FirstOrDefault() as SPAnimClipCollection.ConfigAttribute;\r\n                if (configAttrib != null)\r\n                {\r\n                    _hideDetailRegion = configAttrib.HideDetailRegion;\r\n                    _defaultLayer = configAttrib.DefaultLayer;\r\n                    _entryPrefix = configAttrib.Prefix;\r\n                    if (!string.IsNullOrEmpty(configAttrib.Hash))\r\n                        _currentLabel.text = string.Format(\"{0} - ({1})\", _currentLabel.text, configAttrib.Hash);\r\n                }\r\n                else\r\n                {\r\n                    _entryPrefix = null;\r\n                }\r\n\r\n                var staticCollAttrib = this.fieldInfo.GetCustomAttributes(typeof(SPAnimClipCollection.StaticCollectionAttribute), false).FirstOrDefault() as SPAnimClipCollection.StaticCollectionAttribute;\r\n                if (staticCollAttrib != null)\r\n                {\r\n                    _isStaticColl = true;\r\n                    var statesProp = property.FindPropertyRelative(PROP_ANIMSTATES);\r\n                    int cnt = staticCollAttrib.Names.Length;\r\n                    if (statesProp.arraySize > cnt)\r\n                    {\r\n                        statesProp.arraySize = cnt;\r\n                    }\r\n                    else if (statesProp.arraySize < cnt)\r\n                    {\r\n                        int sz = statesProp.arraySize;\r\n                        statesProp.arraySize = cnt;\r\n                        for (int i = sz; i < cnt; i++)\r\n                        {\r\n                            var stateProp = statesProp.GetArrayElementAtIndex(i);\r\n                            stateProp.FindPropertyRelative(\"_name\").stringValue = staticCollAttrib.Names[i];\r\n                            stateProp.FindPropertyRelative(\"_clip\").objectReferenceValue = null;\r\n                            stateProp.FindPropertyRelative(SPAnimClip.PROP_WEIGHT).floatValue = 1f;\r\n                            stateProp.FindPropertyRelative(SPAnimClip.PROP_SPEED).floatValue = 1f;\r\n                            stateProp.FindPropertyRelative(SPAnimClip.PROP_LAYER).intValue = _defaultLayer;\r\n                            stateProp.FindPropertyRelative(SPAnimClip.PROP_WRAPMODE).intValue = 0;\r\n                            stateProp.FindPropertyRelative(SPAnimClip.PROP_BLENDMODE).intValue = 0;\r\n                            stateProp.FindPropertyRelative(SPAnimClip.PROP_MASK).objectReferenceValue = null;\r\n                        }\r\n                    }\r\n                    for (int i = 0; i < statesProp.arraySize; i++)\r\n                    {\r\n                        statesProp.GetArrayElementAtIndex(i).FindPropertyRelative(\"_name\").stringValue = staticCollAttrib.Names[i];\r\n                    }\r\n\r\n                    _animList.displayAdd = false;\r\n                    _animList.displayRemove = false;\r\n                    _animList.draggable = false;\r\n                    if (_animList.index >= cnt) _animList.index = cnt - 1;\r\n                }\r\n                else\r\n                {\r\n                    _isStaticColl = false;\r\n                    _animList.displayAdd = true;\r\n                    _animList.displayRemove = true;\r\n                    _animList.draggable = true;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private float GetDetailHeight()\r\n        {\r\n            if (_hideDetailRegion) return 0f;\r\n\r\n            if (_animList.index >= 0)\r\n            {\r\n                try\r\n                {\r\n                    return _clipDrawer.GetDetailHeight(_animList.serializedProperty.GetArrayElementAtIndex(_animList.index)) + EditorGUIUtility.singleLineHeight + 2f;\r\n                }\r\n                catch\r\n                {\r\n                    return 0f;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return 0f;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region OnGUI\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            float h;\r\n            if (EditorHelper.AssertMultiObjectEditingNotSupportedHeight(property, label, out h)) return h;\r\n\r\n            this.Init(property, label, true);\r\n\r\n            h = 0f;\r\n            if (!property.isExpanded)\r\n            {\r\n                h = EditorGUIUtility.singleLineHeight;\r\n            }\r\n            else\r\n            {\r\n                h = _animList.GetHeight() + this.GetDetailHeight();\r\n            }\r\n\r\n            return h;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            if (EditorHelper.AssertMultiObjectEditingNotSupported(position, property, label)) return;\r\n\r\n            this.Init(property, label, true);\r\n            _currentLabel = label;\r\n            if (this.fieldInfo.DeclaringType == typeof(SPAnimationController)) _currentLabel.text = \"Animation States\";\r\n\r\n            property.isExpanded = SPEditorGUI.PrefixFoldoutLabel(position, property.isExpanded, GUIContent.none);\r\n\r\n            if (!property.isExpanded)\r\n            {\r\n                //here we emulate the ReorderableList header\r\n                //ReorderableListHelper.DrawRetractedHeader(EditorGUI.IndentedRect(position), label);\r\n                ReorderableListHelper.DrawRetractedHeader(position, label);\r\n            }\r\n            else\r\n            {\r\n                //var cache = SPGUI.DisableIfPlaying();\r\n                _animList.displayAdd = !Application.isPlaying;\r\n                _animList.displayRemove = !Application.isPlaying;\r\n                _animList.draggable = !Application.isPlaying;\r\n\r\n                EditorGUI.BeginChangeCheck();\r\n                //_animList.DoList(EditorGUI.IndentedRect(position));\r\n                _animList.DoList(position);\r\n                if (EditorGUI.EndChangeCheck()) property.serializedObject.ApplyModifiedProperties();\r\n\r\n                if (!_hideDetailRegion && _animList.index >= 0)\r\n                {\r\n                    try\r\n                    {\r\n                        var detailRect = new Rect(position.xMin, position.yMin + _animList.GetHeight(), position.width, this.GetDetailHeight());\r\n                        var stateProp = _animList.serializedProperty.GetArrayElementAtIndex(_animList.index);\r\n                        var nameProp = stateProp.FindPropertyRelative(\"_name\");\r\n\r\n                        GUI.BeginGroup(detailRect, nameProp.stringValue, GUI.skin.box);\r\n                        GUI.EndGroup();\r\n\r\n                        //draw basic details\r\n                        var buffer = EditorGUIUtility.singleLineHeight + 2f;\r\n                        detailRect = new Rect(detailRect.xMin, detailRect.yMin + buffer, detailRect.width, detailRect.height - buffer);\r\n                        _clipDrawer.DrawDetails(detailRect, stateProp);\r\n                    }\r\n                    catch\r\n                    {\r\n                        //failed to draw details because poorly selected nonsense\r\n                    }\r\n                }\r\n\r\n                //cache.Reset();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Anim ReorderableList Handlers\r\n\r\n        private void _animList_DrawHeader(Rect area)\r\n        {\r\n            EditorGUI.LabelField(area, _currentLabel);\r\n        }\r\n\r\n        private void _animList_DrawElement(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            var element = _animList.serializedProperty.GetArrayElementAtIndex(index);\r\n\r\n            _clipDrawer.DrawClip(area, element, EditorHelper.TempContent(index.ToString()), Mathf.Min(area.width * 0.08f, 30f), _nameLabelGUIStyle, _isStaticColl);\r\n\r\n            if (GUI.enabled) ReorderableListHelper.DrawDraggableElementDeleteContextMenu(_animList, area, index, isActive, isFocused);\r\n        }\r\n\r\n        private void _animList_OnAdded(ReorderableList lst)\r\n        {\r\n            lst.serializedProperty.arraySize++;\r\n            lst.index = lst.serializedProperty.arraySize - 1;\r\n\r\n            var stateProp = lst.serializedProperty.GetArrayElementAtIndex(lst.index);\r\n\r\n            string prefix = string.IsNullOrEmpty(_entryPrefix) ? \"State\" : _entryPrefix;\r\n            int cnt = lst.serializedProperty.arraySize;\r\n            while (_target.Keys.Contains(prefix + cnt.ToString(\"00\")))\r\n            {\r\n                cnt++;\r\n            }\r\n\r\n            stateProp.FindPropertyRelative(\"_name\").stringValue = prefix + cnt.ToString(\"00\");\r\n            stateProp.FindPropertyRelative(\"_clip\").objectReferenceValue = null;\r\n            stateProp.FindPropertyRelative(SPAnimClip.PROP_WEIGHT).floatValue = 1f;\r\n            stateProp.FindPropertyRelative(SPAnimClip.PROP_SPEED).floatValue = 1f;\r\n            stateProp.FindPropertyRelative(SPAnimClip.PROP_LAYER).intValue = _defaultLayer;\r\n            stateProp.FindPropertyRelative(SPAnimClip.PROP_WRAPMODE).intValue = 0;\r\n            stateProp.FindPropertyRelative(SPAnimClip.PROP_BLENDMODE).intValue = 0;\r\n            stateProp.FindPropertyRelative(SPAnimClip.PROP_MASK).objectReferenceValue = null;\r\n        }\r\n        \r\n        #endregion\r\n\r\n    }\r\n\r\n    /*\r\n     * OBSOLETE - held onto for posterity/ease\r\n     * \r\n    [CustomPropertyDrawer(typeof(SPAnimClipCollection), true)]\r\n    public class SPAnimClipCollectionPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        //SPAnimationState._masks is a MaskCollection wich has a list inside it called _masks\r\n        private const string PROP_ANIMSTATES = \"_serializedStates\";\r\n\r\n        private static GUIStyle _nameLabelGUIStyle = new GUIStyle(\"Label\")\r\n                                                         {\r\n                                                             alignment = TextAnchor.MiddleRight\r\n                                                         };\r\n\r\n        #region Fields\r\n\r\n        private CachedReorderableList _animList;\r\n\r\n        private SPAnimClipCollection _target;\r\n        private GUIContent _currentLabel;\r\n        private int _defaultLayer;\r\n        private bool _isStaticColl;\r\n        private bool _hideDetailRegion;\r\n        private string _entryPrefix;\r\n\r\n        private SPAnimClipPropertyDrawer _clipDrawer = new SPAnimClipPropertyDrawer();\r\n\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private void Init(SerializedProperty property, GUIContent label, bool searchForAttribs)\r\n        {\r\n            _target = EditorHelper.GetTargetObjectOfProperty(property) as SPAnimClipCollection;\r\n            _currentLabel = label;\r\n            _defaultLayer = 0;\r\n            _isStaticColl = false;\r\n            _hideDetailRegion = false;\r\n\r\n            _animList = CachedReorderableList.GetListDrawer(property.FindPropertyRelative(PROP_ANIMSTATES), _animList_DrawHeader, _animList_DrawElement, _animList_OnAdded, null, _animList_OnSelect);\r\n            if (_animList.index >= _animList.count) _animList.index = -1;\r\n\r\n            if(searchForAttribs && this.fieldInfo != null)\r\n            {\r\n                //config\r\n                var configAttrib = this.fieldInfo.GetCustomAttributes(typeof(SPAnimClipCollection.ConfigAttribute), false).FirstOrDefault() as SPAnimClipCollection.ConfigAttribute;\r\n                if(configAttrib != null)\r\n                {\r\n                    _hideDetailRegion = configAttrib.HideDetailRegion;\r\n                    _defaultLayer = configAttrib.DefaultLayer;\r\n                    _entryPrefix = configAttrib.Prefix;\r\n                    if(!string.IsNullOrEmpty(configAttrib.Hash))\r\n                        _currentLabel.text= string.Format(\"{0} - ({1})\", _currentLabel.text, configAttrib.Hash);\r\n                }\r\n                else\r\n                {\r\n                    _entryPrefix = null;\r\n                }\r\n\r\n                var staticCollAttrib = this.fieldInfo.GetCustomAttributes(typeof(SPAnimClipCollection.StaticCollectionAttribute), false).FirstOrDefault() as SPAnimClipCollection.StaticCollectionAttribute;\r\n                if (staticCollAttrib != null)\r\n                {\r\n                    _isStaticColl = true;\r\n                    var statesProp = property.FindPropertyRelative(PROP_ANIMSTATES);\r\n                    int cnt = staticCollAttrib.Names.Length;\r\n                    if (statesProp.arraySize > cnt)\r\n                    {\r\n                        statesProp.arraySize = cnt;\r\n                    }\r\n                    else if (statesProp.arraySize < cnt)\r\n                    {\r\n                        int sz = statesProp.arraySize;\r\n                        statesProp.arraySize = cnt;\r\n                        for (int i = sz; i < cnt; i++)\r\n                        {\r\n                            var stateProp = statesProp.GetArrayElementAtIndex(i);\r\n                            stateProp.FindPropertyRelative(\"_name\").stringValue = staticCollAttrib.Names[i];\r\n                            stateProp.FindPropertyRelative(\"_clip\").objectReferenceValue = null;\r\n                            stateProp.FindPropertyRelative(\"_weight\").floatValue = 1f;\r\n                            stateProp.FindPropertyRelative(\"_speed\").floatValue = 1f;\r\n                            stateProp.FindPropertyRelative(\"_layer\").intValue = _defaultLayer;\r\n                            stateProp.FindPropertyRelative(\"_wrapMode\").intValue = 0;\r\n                            stateProp.FindPropertyRelative(\"_blendMode\").intValue = 0;\r\n                            stateProp.FindPropertyRelative(SPAnimClipPropertyDrawer.PROP_ANIMSTATE_MASKS).arraySize = 0;\r\n                        }\r\n                    }\r\n                    for (int i = 0; i < statesProp.arraySize; i++)\r\n                    {\r\n                        statesProp.GetArrayElementAtIndex(i).FindPropertyRelative(\"_name\").stringValue = staticCollAttrib.Names[i];\r\n                    }\r\n\r\n                    _animList.displayAdd = false;\r\n                    _animList.displayRemove = false;\r\n                    _animList.draggable = false;\r\n                    if (_animList.index >= cnt) _animList.index = cnt - 1;\r\n                }\r\n                else\r\n                {\r\n                    _isStaticColl = false;\r\n                    _animList.displayAdd = true;\r\n                    _animList.displayRemove = true;\r\n                    _animList.draggable = true;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private float GetDetailHeight()\r\n        {\r\n            if (_hideDetailRegion) return 0f;\r\n\r\n            if (_animList.index >= 0)\r\n            {\r\n                try\r\n                {\r\n                    return _clipDrawer.GetDetailHeight(_animList.serializedProperty.GetArrayElementAtIndex(_animList.index)) + EditorGUIUtility.singleLineHeight + 2f;\r\n                }\r\n                catch\r\n                {\r\n                    return 0f;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return 0f;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region OnGUI\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            float h;\r\n            if (EditorHelper.AssertMultiObjectEditingNotSupportedHeight(property, label, out h)) return h;\r\n\r\n            this.Init(property, label, true);\r\n\r\n            h = 0f;\r\n            if (!property.isExpanded)\r\n            {\r\n                h = EditorGUIUtility.singleLineHeight;\r\n            }\r\n            else\r\n            {\r\n                h = _animList.GetHeight() + this.GetDetailHeight();\r\n            }\r\n\r\n            return h;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            if (EditorHelper.AssertMultiObjectEditingNotSupported(position, property, label)) return;\r\n\r\n            this.Init(property, label, true);\r\n            _currentLabel = label;\r\n            if (this.fieldInfo.DeclaringType == typeof(SPAnimationController)) _currentLabel.text = \"Animation States\";\r\n\r\n            property.isExpanded = EditorGUI.Foldout(new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight), property.isExpanded, GUIContent.none);\r\n\r\n            if (!property.isExpanded)\r\n            {\r\n                //here we emulate the ReorderableList header\r\n                //ReorderableListHelper.DrawRetractedHeader(EditorGUI.IndentedRect(position), label);\r\n                ReorderableListHelper.DrawRetractedHeader(position, label);\r\n            }\r\n            else\r\n            {\r\n                //var cache = SPGUI.DisableIfPlaying();\r\n                _animList.displayAdd = !Application.isPlaying;\r\n                _animList.displayRemove = !Application.isPlaying;\r\n                _animList.draggable = !Application.isPlaying;\r\n\r\n                EditorGUI.BeginChangeCheck();\r\n                //_animList.DoList(EditorGUI.IndentedRect(position));\r\n                _animList.DoList(position);\r\n                if (EditorGUI.EndChangeCheck()) property.serializedObject.ApplyModifiedProperties();\r\n\r\n                if (!_hideDetailRegion && _animList.index >= 0)\r\n                {\r\n                    try\r\n                    {\r\n                        var detailRect = new Rect(position.xMin, position.yMin + _animList.GetHeight(), position.width, this.GetDetailHeight());\r\n                        var stateProp = _animList.serializedProperty.GetArrayElementAtIndex(_animList.index);\r\n                        var nameProp = stateProp.FindPropertyRelative(\"_name\");\r\n\r\n                        GUI.BeginGroup(detailRect, nameProp.stringValue, GUI.skin.box);\r\n                        GUI.EndGroup();\r\n\r\n                        //draw basic details\r\n                        var buffer = EditorGUIUtility.singleLineHeight + 2f;\r\n                        detailRect = new Rect(detailRect.xMin, detailRect.yMin + buffer, detailRect.width, detailRect.height - buffer);\r\n                        _clipDrawer.DrawDetails(detailRect, stateProp);\r\n                    }\r\n                    catch\r\n                    {\r\n                        //failed to draw details because poorly selected nonsense\r\n                    }\r\n                }\r\n                \r\n                //cache.Reset();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Anim ReorderableList Handlers\r\n\r\n        private void _animList_DrawHeader(Rect area)\r\n        {\r\n            EditorGUI.LabelField(area, _currentLabel);\r\n        }\r\n\r\n        private void _animList_DrawElement(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            var element = _animList.serializedProperty.GetArrayElementAtIndex(index);\r\n\r\n            _clipDrawer.DrawClip(area, element, EditorHelper.TempContent(index.ToString()), Mathf.Min(area.width * 0.08f, 30f), _nameLabelGUIStyle, _isStaticColl);\r\n\r\n            if (GUI.enabled) ReorderableListHelper.DrawDraggableElementDeleteContextMenu(_animList, area, index, isActive, isFocused);\r\n        }\r\n\r\n        private void _animList_OnAdded(ReorderableList lst)\r\n        {\r\n            lst.serializedProperty.arraySize++;\r\n            lst.index = lst.serializedProperty.arraySize - 1;\r\n\r\n            var stateProp = lst.serializedProperty.GetArrayElementAtIndex(lst.index);\r\n\r\n            string prefix = string.IsNullOrEmpty(_entryPrefix) ? \"State\" : _entryPrefix;\r\n            int cnt = lst.serializedProperty.arraySize;\r\n            while (_target.Keys.Contains(prefix + cnt.ToString(\"00\")))\r\n            {\r\n                cnt++;\r\n            }\r\n\r\n            stateProp.FindPropertyRelative(\"_name\").stringValue = prefix + cnt.ToString(\"00\");\r\n            stateProp.FindPropertyRelative(\"_clip\").objectReferenceValue = null;\r\n            stateProp.FindPropertyRelative(\"_weight\").floatValue = 1f;\r\n            stateProp.FindPropertyRelative(\"_speed\").floatValue = 1f;\r\n            stateProp.FindPropertyRelative(\"_layer\").intValue = _defaultLayer;\r\n            stateProp.FindPropertyRelative(\"_wrapMode\").intValue = 0;\r\n            stateProp.FindPropertyRelative(\"_blendMode\").intValue = 0;\r\n            stateProp.FindPropertyRelative(SPAnimClipPropertyDrawer.PROP_ANIMSTATE_MASKS).arraySize = 0;\r\n        }\r\n\r\n        private void _animList_OnSelect(ReorderableList lst)\r\n        {\r\n            _clipDrawer.Reset();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n    */\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnimEditor/Anim/SPAnimClipPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Anim;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\nusing com.spacepuppyeditor.Components;\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Anim\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(SPAnimClip))]\r\n    public class SPAnimClipPropertyDrawer : PropertyDrawer\r\n    {\r\n        private const string PROP_NAME = \"_name\";\r\n        private const string PROP_CLIP = \"_clip\";\r\n        private static string[] FULL_DETAIL_PROPS = new string[] {SPAnimClip.PROP_WEIGHT,\r\n                                                            SPAnimClip.PROP_SPEED,\r\n                                                            \"ScaledDuration\",\r\n                                                            SPAnimClip.PROP_LAYER,\r\n                                                            SPAnimClip.PROP_WRAPMODE,\r\n                                                            SPAnimClip.PROP_BLENDMODE,\r\n                                                            SPAnimClip.PROP_TIMESUPPLIER,\r\n                                                            SPAnimClip.PROP_MASK};\r\n        \r\n        private bool _nameIsReadOnly;\r\n        private string[] _detailProps;\r\n\r\n        private SelectableComponentPropertyDrawer _selectComponentDrawer;\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private void Init(SerializedProperty property, bool searchForAttribs)\r\n        {\r\n            _detailProps = FULL_DETAIL_PROPS;\r\n            if (searchForAttribs && this.fieldInfo != null)\r\n            {\r\n                var readonlyNameAttrib = this.fieldInfo.GetCustomAttributes(typeof(SPAnimClip.ReadOnlyNameAttribute), false).FirstOrDefault() as SPAnimClip.ReadOnlyNameAttribute;\r\n                if (readonlyNameAttrib != null)\r\n                {\r\n                    property.FindPropertyRelative(PROP_NAME).stringValue = readonlyNameAttrib.Name;\r\n                    _nameIsReadOnly = true;\r\n                }\r\n                else\r\n                {\r\n                    _nameIsReadOnly = false;\r\n                }\r\n\r\n                var configAttrib = this.fieldInfo.GetCustomAttributes(typeof(SPAnimClip.ConfigAttribute), false).FirstOrDefault() as SPAnimClip.ConfigAttribute;\r\n                if (configAttrib != null)\r\n                {\r\n                    if (configAttrib.HideDetailRegion)\r\n                        _detailProps = null;\r\n                    else if (configAttrib.VisibleProps != null && configAttrib.VisibleProps.Length > 0)\r\n                        _detailProps = configAttrib.VisibleProps;\r\n                }\r\n            }\r\n        }\r\n        \r\n        public float GetDetailHeight(SerializedProperty property)\r\n        {\r\n            this.Init(property, true);\r\n\r\n            return this.GetDetailHeight();\r\n        }\r\n\r\n        private float GetDetailHeight()\r\n        {\r\n            if (this.HideAllDetails) return 0f;\r\n\r\n            float h = _detailProps.Length * EditorGUIUtility.singleLineHeight;\r\n            return h;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool HideAllDetails\r\n        {\r\n            get { return _detailProps == null || _detailProps.Length == 0; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region OnGUI\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            this.Init(property, true);\r\n\r\n            if (!this.HideAllDetails && property.isExpanded)\r\n            {\r\n                return this.GetDetailHeight() + EditorGUIUtility.singleLineHeight;\r\n            }\r\n            else\r\n            {\r\n                return EditorGUIUtility.singleLineHeight;\r\n            }\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            this.Init(property, true);\r\n\r\n            //var cache = SPGUI.DisableIfPlaying();\r\n\r\n            if (this.HideAllDetails)\r\n            {\r\n                var clipPos = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n                //this.DrawClip(EditorGUI.IndentedRect(clipPos), property, label, EditorGUIUtility.labelWidth, GUI.skin.label, _nameIsReadOnly);\r\n                this.DrawClip(clipPos, property, label, EditorGUIUtility.labelWidth, GUI.skin.label, _nameIsReadOnly);\r\n            }\r\n            else\r\n            {\r\n                property.isExpanded = SPEditorGUI.PrefixFoldoutLabel(position, property.isExpanded, GUIContent.none);\r\n                var clipPos = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n                //this.DrawClip(EditorGUI.IndentedRect(clipPos), property, label, EditorGUIUtility.labelWidth, GUI.skin.label, _nameIsReadOnly);\r\n                this.DrawClip(clipPos, property, label, EditorGUIUtility.labelWidth, GUI.skin.label, _nameIsReadOnly);\r\n\r\n                if (property.isExpanded)\r\n                {\r\n                    var detailRect = new Rect(position.xMin + 5f, position.yMin + EditorGUIUtility.singleLineHeight, position.width - 5f, this.GetDetailHeight());\r\n                    this.DrawDetails(detailRect, property);\r\n                }\r\n            }\r\n\r\n            //cache.Reset();\r\n        }\r\n\r\n        public void DrawClip(Rect area, SerializedProperty property, GUIContent label, float labelWidth, GUIStyle labelStyle, bool nameIsReadonly)\r\n        {\r\n            //Draw Name\r\n            var nameProp = property.FindPropertyRelative(PROP_NAME);\r\n\r\n            var labelRect = new Rect(area.xMin, area.yMin, labelWidth, EditorGUIUtility.singleLineHeight);\r\n            var textRect = new Rect(labelRect.xMax, area.yMin, (area.width - labelWidth) * 0.4f, EditorGUIUtility.singleLineHeight);\r\n            EditorGUI.BeginProperty(area, label, nameProp);\r\n            //EditorGUI.LabelField(labelRect, label, labelStyle);\r\n            GUI.Label(labelRect, label, labelStyle);\r\n            if (nameIsReadonly || _nameIsReadOnly || Application.isPlaying)\r\n            {\r\n                //EditorGUI.LabelField(textRect, nameProp.stringValue, GUI.skin.textField);\r\n                GUI.Label(textRect, nameProp.stringValue, GUI.skin.textField);\r\n            }\r\n            else\r\n            {\r\n                //nameProp.stringValue = EditorGUI.TextField(textRect, nameProp.stringValue);\r\n                nameProp.stringValue = GUI.TextField(textRect, nameProp.stringValue);\r\n            }\r\n            //EditorGUI.EndProperty();\r\n\r\n            var cache = SPGUI.DisableIfPlaying();\r\n\r\n            //Draw Animation Clip Reference\r\n            var clipProp = property.FindPropertyRelative(PROP_CLIP);\r\n            var xmin = textRect.xMax + 2f;\r\n            var clipRect = new Rect(xmin, area.yMin, area.xMax - xmin, EditorGUIUtility.singleLineHeight);\r\n            var clipLabel = GUIContent.none;\r\n            //EditorGUI.BeginProperty(clipRect, clipLabel, clipProp);\r\n            //clipProp.objectReferenceValue = EditorGUI.ObjectField(clipRect, clipProp.objectReferenceValue, typeof(AnimationClip), false);\r\n            var obj = clipProp.objectReferenceValue;\r\n            if (GameObjectUtil.IsGameObjectSource(obj))\r\n            {\r\n                if (_selectComponentDrawer == null)\r\n                {\r\n                    _selectComponentDrawer = new SelectableComponentPropertyDrawer();\r\n                    _selectComponentDrawer.RestrictionType = typeof(IScriptableAnimationClip);\r\n                    _selectComponentDrawer.ShowXButton = true;\r\n                }\r\n                _selectComponentDrawer.OnGUI(clipRect, clipProp, GUIContent.none);\r\n            }\r\n            else\r\n            {\r\n                obj = EditorGUI.ObjectField(clipRect, obj, typeof(UnityEngine.Object), true);\r\n                if (obj == null || obj is AnimationClip || obj is IScriptableAnimationClip)\r\n                    clipProp.objectReferenceValue = obj;\r\n                else if (GameObjectUtil.IsGameObjectSource(obj))\r\n                    clipProp.objectReferenceValue = ObjUtil.GetAsFromSource<IScriptableAnimationClip>(obj) as UnityEngine.Object;\r\n            }\r\n            EditorGUI.EndProperty();\r\n\r\n            cache.Reset();\r\n\r\n\r\n\r\n            if (Application.isPlaying && !property.hasMultipleDifferentValues && property.serializedObject.targetObject is SPAnimationController)\r\n            {\r\n                if (GUI.Button(new Rect(area.xMin, area.yMin, 20f, EditorGUIUtility.singleLineHeight), \">\"))\r\n                {\r\n                    var targ = property.serializedObject.targetObject as SPAnimationController;\r\n                    targ.Play(nameProp.stringValue);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void DrawDetails(Rect position, SerializedProperty property)\r\n        {\r\n            var cache = SPGUI.DisableIfPlaying();\r\n\r\n            //draw basic details\r\n            var yMin = position.yMin;\r\n            for (int i = 0; i < _detailProps.Length; i++)\r\n            {\r\n                //var r = new Rect(position.xMin, yMin + i * EditorGUIUtility.singleLineHeight, position.width, EditorGUIUtility.singleLineHeight);\r\n                switch (_detailProps[i])\r\n                {\r\n                    case SPAnimClip.PROP_WRAPMODE:\r\n                        {\r\n                            var r = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n                            position = new Rect(position.xMin, r.yMax, position.width, Mathf.Max(position.height - r.height, 0f));\r\n\r\n                            var wrapModeProp = property.FindPropertyRelative(SPAnimClip.PROP_WRAPMODE);\r\n                            wrapModeProp.SetEnumValue(SPEditorGUI.WrapModeField(r, wrapModeProp.displayName, wrapModeProp.GetEnumValue<WrapMode>(), true));\r\n                        }\r\n                        break;\r\n                    case \"ScaledDuration\":\r\n                        {\r\n                            var r = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n                            position = new Rect(position.xMin, r.yMax, position.width, Mathf.Max(position.height - r.height, 0f));\r\n\r\n                            var label = EditorHelper.TempContent(\"Scaled Duration\", \"The duration of the clip with the speed applied. Modifying this alters the 'speed' property.\");\r\n                            var clip = property.FindPropertyRelative(PROP_CLIP).objectReferenceValue as AnimationClip;\r\n                            if (clip == null)\r\n                            {\r\n                                EditorGUI.FloatField(r, label, 0f);\r\n                                continue;\r\n                            }\r\n\r\n                            var speedProp = property.FindPropertyRelative(SPAnimClip.PROP_SPEED);\r\n                            float dur = (speedProp.floatValue == 0f) ? float.PositiveInfinity : Mathf.Abs(clip.length / speedProp.floatValue);\r\n                            EditorGUI.BeginChangeCheck();\r\n\r\n                            dur = EditorGUI.FloatField(r, label, dur);\r\n\r\n                            if (EditorGUI.EndChangeCheck())\r\n                                speedProp.floatValue = (dur <= 0f) ? 0f : clip.length / dur;\r\n                        }\r\n                        break;\r\n                    default:\r\n                        {\r\n                            var r = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n                            position = new Rect(position.xMin, r.yMax, position.width, Mathf.Max(position.height - r.height, 0f));\r\n\r\n                            EditorGUI.PropertyField(r, property.FindPropertyRelative(_detailProps[i]));\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n\r\n            cache.Reset();\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n    /*\r\n     * OBSOLETE - held onto for posterity/ease\r\n     * \r\n    [CustomPropertyDrawer(typeof(SPAnimClip))]\r\n    public class SPAnimClipPropertyDrawer : PropertyDrawer\r\n    {\r\n        private const string PROP_NAME = \"_name\";\r\n        private const string PROP_CLIP = \"_clip\";\r\n        public const string PROP_ANIMSTATE_MASKS = \"_masks._masks\";\r\n        private static string[] FULL_DETAIL_PROPS = new string[] {SPAnimClip.PROP_WEIGHT,\r\n                                                            SPAnimClip.PROP_SPEED,\r\n                                                            \"ScaledDuration\",\r\n                                                            SPAnimClip.PROP_LAYER,\r\n                                                            SPAnimClip.PROP_WRAPMODE,\r\n                                                            SPAnimClip.PROP_BLENDMODE,\r\n                                                            SPAnimClip.PROP_TIMESUPPLIER,\r\n                                                            SPAnimClip.PROP_MASKS};\r\n\r\n        private SPReorderableList _maskList;\r\n        private bool _nameIsReadOnly;\r\n        private string[] _detailProps;\r\n\r\n        private SelectableComponentPropertyDrawer _selectComponentDrawer;\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private void Init(SerializedProperty property, bool searchForAttribs)\r\n        {\r\n            if(_maskList == null)\r\n            {\r\n                _maskList = new SPReorderableList(property.serializedObject, property.FindPropertyRelative(PROP_ANIMSTATE_MASKS), true, true, true, true);\r\n                _maskList.drawHeaderCallback = this._maskList_DrawHeader;\r\n                _maskList.drawElementCallback = this._maskList_DrawElement;\r\n            }\r\n            else\r\n            {\r\n                _maskList.serializedProperty = property.FindPropertyRelative(PROP_ANIMSTATE_MASKS);\r\n            }\r\n\r\n            _detailProps = FULL_DETAIL_PROPS;\r\n            if (searchForAttribs && this.fieldInfo != null)\r\n            {\r\n                var readonlyNameAttrib = this.fieldInfo.GetCustomAttributes(typeof(SPAnimClip.ReadOnlyNameAttribute), false).FirstOrDefault() as SPAnimClip.ReadOnlyNameAttribute;\r\n                if (readonlyNameAttrib != null)\r\n                {\r\n                    property.FindPropertyRelative(PROP_NAME).stringValue = readonlyNameAttrib.Name;\r\n                    _nameIsReadOnly = true;\r\n                }\r\n                else\r\n                {\r\n                    _nameIsReadOnly = false;\r\n                }\r\n\r\n                var configAttrib = this.fieldInfo.GetCustomAttributes(typeof(SPAnimClip.ConfigAttribute), false).FirstOrDefault() as SPAnimClip.ConfigAttribute;\r\n                if(configAttrib != null)\r\n                {\r\n                    if (configAttrib.HideDetailRegion)\r\n                        _detailProps = null;\r\n                    else if(configAttrib.VisibleProps != null && configAttrib.VisibleProps.Length > 0)\r\n                        _detailProps = configAttrib.VisibleProps;\r\n                }\r\n            }\r\n        }\r\n\r\n        public void Reset()\r\n        {\r\n            if(_maskList != null)\r\n            {\r\n                _maskList.serializedProperty = null;\r\n                _maskList.index = -1;\r\n            }\r\n        }\r\n\r\n        public float GetDetailHeight(SerializedProperty property)\r\n        {\r\n            this.Init(property, true);\r\n\r\n            return this.GetDetailHeight();\r\n        }\r\n\r\n        private float GetDetailHeight()\r\n        {\r\n            if (this.HideAllDetails) return 0f;\r\n\r\n            float h = _detailProps.Length * EditorGUIUtility.singleLineHeight;\r\n            if(_detailProps.Contains(SPAnimClip.PROP_MASKS))\r\n            {\r\n                h += _maskList.GetHeight() + 2f - EditorGUIUtility.singleLineHeight; //we remove one line because it was included in the multiply\r\n            }\r\n            return h;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool HideAllDetails\r\n        {\r\n            get { return _detailProps == null || _detailProps.Length == 0; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region OnGUI\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            this.Init(property, true);\r\n            \r\n            if (!this.HideAllDetails && property.isExpanded)\r\n            {\r\n                return this.GetDetailHeight() + EditorGUIUtility.singleLineHeight;\r\n            }\r\n            else\r\n            {\r\n                return EditorGUIUtility.singleLineHeight;\r\n            }\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            this.Init(property, true);\r\n            \r\n            //var cache = SPGUI.DisableIfPlaying();\r\n\r\n            if (this.HideAllDetails)\r\n            {\r\n                var clipPos = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n                //this.DrawClip(EditorGUI.IndentedRect(clipPos), property, label, EditorGUIUtility.labelWidth, GUI.skin.label, _nameIsReadOnly);\r\n                this.DrawClip(clipPos, property, label, EditorGUIUtility.labelWidth, GUI.skin.label, _nameIsReadOnly);\r\n            }\r\n            else\r\n            {\r\n                property.isExpanded = EditorGUI.Foldout(new Rect(position.xMin, position.yMin, EditorGUIUtility.labelWidth, EditorGUIUtility.singleLineHeight), property.isExpanded, GUIContent.none);\r\n                var clipPos = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n                //this.DrawClip(EditorGUI.IndentedRect(clipPos), property, label, EditorGUIUtility.labelWidth, GUI.skin.label, _nameIsReadOnly);\r\n                this.DrawClip(clipPos, property, label, EditorGUIUtility.labelWidth, GUI.skin.label, _nameIsReadOnly);\r\n\r\n                if (property.isExpanded)\r\n                {\r\n                    var detailRect = new Rect(position.xMin + 5f, position.yMin + EditorGUIUtility.singleLineHeight, position.width - 5f, this.GetDetailHeight());\r\n                    this.DrawDetails(detailRect, property);\r\n                }\r\n            }\r\n            \r\n            //cache.Reset();\r\n        }\r\n\r\n        public void DrawClip(Rect area, SerializedProperty property, GUIContent label, float labelWidth, GUIStyle labelStyle, bool nameIsReadonly)\r\n        {\r\n            //Draw Name\r\n            var nameProp = property.FindPropertyRelative(PROP_NAME);\r\n\r\n            var labelRect = new Rect(area.xMin, area.yMin, labelWidth, EditorGUIUtility.singleLineHeight);\r\n            var textRect = new Rect(labelRect.xMax, area.yMin, (area.width - labelWidth) * 0.4f, EditorGUIUtility.singleLineHeight);\r\n            EditorGUI.BeginProperty(area, label, nameProp);\r\n            //EditorGUI.LabelField(labelRect, label, labelStyle);\r\n            GUI.Label(labelRect, label, labelStyle);\r\n            if (nameIsReadonly || _nameIsReadOnly || Application.isPlaying)\r\n            {\r\n                //EditorGUI.LabelField(textRect, nameProp.stringValue, GUI.skin.textField);\r\n                GUI.Label(textRect, nameProp.stringValue, GUI.skin.textField);\r\n            }\r\n            else\r\n            {\r\n                //nameProp.stringValue = EditorGUI.TextField(textRect, nameProp.stringValue);\r\n                nameProp.stringValue = GUI.TextField(textRect, nameProp.stringValue);\r\n            }\r\n            //EditorGUI.EndProperty();\r\n\r\n            var cache = SPGUI.DisableIfPlaying();\r\n\r\n            //Draw Animation Clip Reference\r\n            var clipProp = property.FindPropertyRelative(PROP_CLIP);\r\n            var xmin = textRect.xMax + 2f;\r\n            var clipRect = new Rect(xmin, area.yMin, area.xMax - xmin, EditorGUIUtility.singleLineHeight);\r\n            var clipLabel = GUIContent.none;\r\n            //EditorGUI.BeginProperty(clipRect, clipLabel, clipProp);\r\n            //clipProp.objectReferenceValue = EditorGUI.ObjectField(clipRect, clipProp.objectReferenceValue, typeof(AnimationClip), false);\r\n            var obj = clipProp.objectReferenceValue;\r\n            if(GameObjectUtil.IsGameObjectSource(obj))\r\n            {\r\n                if (_selectComponentDrawer == null) \r\n                {\r\n                    _selectComponentDrawer = new SelectableComponentPropertyDrawer();\r\n                    _selectComponentDrawer.RestrictionType = typeof(IScriptableAnimationClip);\r\n                    _selectComponentDrawer.ShowXButton = true;\r\n                }\r\n                _selectComponentDrawer.OnGUI(clipRect, clipProp, GUIContent.none);\r\n            }\r\n            else\r\n            {\r\n                obj = EditorGUI.ObjectField(clipRect, obj, typeof(UnityEngine.Object), true);\r\n                if (obj == null || obj is AnimationClip || obj is IScriptableAnimationClip)\r\n                    clipProp.objectReferenceValue = obj;\r\n                else if (GameObjectUtil.IsGameObjectSource(obj))\r\n                    clipProp.objectReferenceValue = ObjUtil.GetAsFromSource<IScriptableAnimationClip>(obj) as UnityEngine.Object;\r\n            }\r\n            EditorGUI.EndProperty();\r\n\r\n            cache.Reset();\r\n\r\n\r\n\r\n            if (Application.isPlaying && !property.hasMultipleDifferentValues && property.serializedObject.targetObject is SPAnimationController)\r\n            {\r\n                if(GUI.Button(new Rect(area.xMin, area.yMin, 20f, EditorGUIUtility.singleLineHeight),\">\"))\r\n                {\r\n                    var targ = property.serializedObject.targetObject as SPAnimationController;\r\n                    targ.Play(nameProp.stringValue);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void DrawDetails(Rect position, SerializedProperty property)\r\n        {\r\n            var cache = SPGUI.DisableIfPlaying();\r\n\r\n            //draw basic details\r\n            var yMin = position.yMin;\r\n            for (int i = 0; i < _detailProps.Length; i++)\r\n            {\r\n                //var r = new Rect(position.xMin, yMin + i * EditorGUIUtility.singleLineHeight, position.width, EditorGUIUtility.singleLineHeight);\r\n                switch(_detailProps[i])\r\n                {\r\n                    case SPAnimClip.PROP_WRAPMODE:\r\n                        {\r\n                            var r = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n                            position = new Rect(position.xMin, r.yMax, position.width, Mathf.Max(position.height - r.height, 0f));\r\n\r\n                            var wrapModeProp = property.FindPropertyRelative(SPAnimClip.PROP_WRAPMODE);\r\n                            wrapModeProp.SetEnumValue(SPEditorGUI.WrapModeField(r, wrapModeProp.displayName, wrapModeProp.GetEnumValue<WrapMode>(), true));\r\n                        }\r\n                        break;\r\n                    case \"ScaledDuration\":\r\n                        {\r\n                            var r = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n                            position = new Rect(position.xMin, r.yMax, position.width, Mathf.Max(position.height - r.height, 0f));\r\n\r\n                            var label = EditorHelper.TempContent(\"Scaled Duration\", \"The duration of the clip with the speed applied. Modifying this alters the 'speed' property.\");\r\n                            var clip = property.FindPropertyRelative(PROP_CLIP).objectReferenceValue as AnimationClip;\r\n                            if(clip == null)\r\n                            {\r\n                                EditorGUI.FloatField(r, label, 0f);\r\n                                continue;\r\n                            }\r\n\r\n                            var speedProp = property.FindPropertyRelative(SPAnimClip.PROP_SPEED);\r\n                            float dur = (speedProp.floatValue == 0f) ? float.PositiveInfinity : Mathf.Abs(clip.length / speedProp.floatValue);\r\n                            EditorGUI.BeginChangeCheck();\r\n                            \r\n                            dur = EditorGUI.FloatField(r, label, dur);\r\n                            \r\n                            if (EditorGUI.EndChangeCheck())\r\n                                speedProp.floatValue = (dur <= 0f) ? 0f : clip.length / dur;\r\n                        }\r\n                        break;\r\n                    case SPAnimClip.PROP_MASKS:\r\n                        {\r\n                            //draw masks\r\n                            var masksProp = property.FindPropertyRelative(PROP_ANIMSTATE_MASKS);\r\n                            //var r = new Rect(position.xMin + 4f, yMin + _detailProps.Length * EditorGUIUtility.singleLineHeight, position.width - 8f, _maskList.GetHeight());\r\n                            var r = new Rect(position.xMin + 4f, position.yMin, position.width - 8f, _maskList.GetHeight());\r\n                            position = new Rect(position.xMin, r.yMax, position.width, Mathf.Max(position.height - r.height, 0f));\r\n\r\n                            _maskList.serializedProperty = masksProp;\r\n                            //_maskList.DoList(EditorGUI.IndentedRect(r));\r\n                            _maskList.DoList(r);\r\n                        }\r\n                        break;\r\n                    default:\r\n                        {\r\n                            var r = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n                            position = new Rect(position.xMin, r.yMax, position.width, Mathf.Max(position.height - r.height, 0f));\r\n\r\n                            EditorGUI.PropertyField(r, property.FindPropertyRelative(_detailProps[i]));\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n\r\n            cache.Reset();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Masks ReorderableList Handlers\r\n\r\n        private void _maskList_DrawHeader(Rect area)\r\n        {\r\n            EditorGUI.LabelField(area, \"Masks\");\r\n        }\r\n\r\n        private void _maskList_DrawElement(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            var element = _maskList.serializedProperty.GetArrayElementAtIndex(index);\r\n            if (element == null) return;\r\n            \r\n            const float RECURS_WIDTH_MAX = 110f;\r\n            const float RECURS_TOGGLE_WIDTH = 30f;\r\n\r\n            var recursWidth = Mathf.Min(area.width * 0.4f, RECURS_WIDTH_MAX);\r\n            var recursLabelWidth = Mathf.Max(0f, recursWidth - RECURS_TOGGLE_WIDTH);\r\n            var recursToggleWidth = recursWidth - recursLabelWidth;\r\n\r\n            //DRAW TRANSFORM\r\n            var transProp = element.FindPropertyRelative(\"Transform\");\r\n            var transRect = new Rect(area.xMin, area.yMin, area.width - recursWidth, EditorGUIUtility.singleLineHeight);\r\n            EditorGUI.PropertyField(transRect, transProp, GUIContent.none);\r\n\r\n            //DRAW RECURSIVE TOGGLE\r\n            var recursProp = element.FindPropertyRelative(\"Recursive\");\r\n            var recursTotalRect = new Rect(transRect.xMax, area.yMin, recursWidth, EditorGUIUtility.singleLineHeight);\r\n            var recursLabelRect = new Rect(recursTotalRect.xMin, recursTotalRect.yMin, recursLabelWidth, recursTotalRect.height);\r\n            var recursToggleRect = new Rect(recursLabelRect.xMax, recursTotalRect.yMin, recursToggleWidth, recursTotalRect.height);\r\n            var recursLabel = new GUIContent(\"Recurses\");\r\n            EditorGUI.BeginProperty(recursTotalRect, recursLabel, recursProp);\r\n            EditorGUI.LabelField(recursLabelRect, recursLabel);\r\n            recursProp.boolValue = EditorGUI.Toggle(recursToggleRect, recursProp.boolValue);\r\n            EditorGUI.EndProperty();\r\n            \r\n            if (GUI.enabled) ReorderableListHelper.DrawDraggableElementDeleteContextMenu(_maskList, area, index, isActive, isFocused);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n    */\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnimEditor/Anim/SPAnimationControllerInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Anim;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Anim\r\n{\r\n\r\n    [CustomEditor(typeof(SPAnimationController), true)]\r\n    public class SPAnimationControllerInspector : SPEditor\r\n    {\r\n\r\n        public const string PROP_STATES = \"_states\";\r\n        public const string PROP_ANIMATEPHYSICS = \"_animatePhysics\";\r\n        public const string PROP_ANIMCULLING = \"_animCullingType\";\r\n        public const string PROP_TIMESUPPLIER = \"_timeSupplier\";\r\n        public const string PROP_SPEED = \"_speed\";\r\n        public const string PROP_MASK = \"_mask\";\r\n        public const string PROP_STATES_SERIALIZEDSTATES = \"_serializedStates\";\r\n        public const string PROP_ANIMTOPLAYONSTART = \"_animToPlayOnStart\";\r\n\r\n\r\n        private GUIContent _playOnStartLabel = new GUIContent(\"Play On Start\", \"Which animation to play if any when this component starts.\");\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n            this.DrawPlayAnimPopup();\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_ANIMTOPLAYONSTART, PROP_STATES, PROP_ANIMATEPHYSICS, PROP_ANIMCULLING, PROP_TIMESUPPLIER, PROP_SPEED);\r\n            this.DrawSPAnimationControllerProps();\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n\r\n        private void DrawPlayAnimPopup()\r\n        {\r\n            var statesProp = this.serializedObject.FindProperty(PROP_STATES);\r\n            var serialStatesProp = statesProp.FindPropertyRelative(PROP_STATES_SERIALIZEDSTATES);\r\n            var names = new List<string>();\r\n            for (int i = 0; i < serialStatesProp.arraySize; i++)\r\n            {\r\n                names.Add(serialStatesProp.GetArrayElementAtIndex(i).FindPropertyRelative(\"_name\").stringValue);\r\n            }\r\n\r\n            var animToPlayProp = this.serializedObject.FindProperty(\"_animToPlayOnStart\");\r\n            int index = names.IndexOf(animToPlayProp.stringValue) + 1;\r\n            index = EditorGUILayout.Popup(_playOnStartLabel, index, (from n in names.Prepend(\"Play Nothing\") select new GUIContent(n)).ToArray());\r\n            animToPlayProp.stringValue = (index > 0) ? names[index - 1] : \"\";\r\n        }\r\n\r\n        protected void DrawSPAnimationControllerProps()\r\n        {\r\n            if(Application.isPlaying)\r\n            {\r\n                var targ = this.target as SPAnimationController;\r\n                if (targ == null) return;\r\n\r\n                EditorGUI.BeginChangeCheck();\r\n                var b1 = EditorGUILayout.Toggle(\"Animate Physics\", targ.AnimatePhysics);\r\n                if (EditorGUI.EndChangeCheck())\r\n                    targ.AnimatePhysics = b1;\r\n\r\n\r\n                EditorGUI.BeginChangeCheck();\r\n                var ectp = (AnimationCullingType)EditorGUILayout.EnumPopup(\"Culling Type\", targ.CullingType);\r\n                if (EditorGUI.EndChangeCheck())\r\n                    targ.CullingType = ectp;\r\n                \r\n                var cache = SPGUI.Disable();\r\n                this.DrawPropertyField(PROP_TIMESUPPLIER);\r\n                this.DrawPropertyField(PROP_SPEED);\r\n                this.DrawPropertyField(PROP_MASK);\r\n                cache.Reset();\r\n                this.DrawPropertyField(PROP_STATES);\r\n            }\r\n            else\r\n            {\r\n                this.DrawPropertyField(PROP_ANIMATEPHYSICS, \"Animate Physics\", false);\r\n                this.DrawPropertyField(PROP_ANIMCULLING, \"Culling Type\", false);\r\n                this.DrawPropertyField(PROP_TIMESUPPLIER);\r\n                this.DrawPropertyField(PROP_SPEED);\r\n                this.DrawPropertyField(PROP_MASK);\r\n                this.DrawPropertyField(PROP_STATES);\r\n            }\r\n        }\r\n\r\n        #region Utils\r\n\r\n        private static SkinnedMeshRenderer FindRenderer(GameObject targ)\r\n        {\r\n            foreach (Transform child in targ.transform)\r\n            {\r\n                var c = child.GetComponent<SkinnedMeshRenderer>();\r\n                if (c != null) return c;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnimEditor/Anim/SPAnimationMaskAssetInspector.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing UnityEditorInternal;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Anim;\nusing com.spacepuppy.Collections;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Anim\n{\n\n    [CustomEditor(typeof(SPAnimationMaskAsset), true)]\n    public class SPAnimationMaskAssetInspector : SPEditor\n    {\n\n        public const string PROP_AVATAR = \"_avatar\";\n        public const string PROP_MASKS = \"_masks\";\n        public const string PROP_ENTRY_PATH = \"Path\";\n        public const string PROP_ENTRY_RECURSE = \"Recurse\";\n\n        const float RECURSE_TOGGLE_WIDTH = 64f;\n        const float RECURSE_TOGGLE_PAD = 2f;\n        \n        private ReorderableList _lstDrawer;\n        private bool _lstElementReadonly;\n\n\n        protected override void OnEnable()\n        {\n            base.OnEnable();\n\n            _lstDrawer = new ReorderableList(this.serializedObject, this.serializedObject.FindProperty(PROP_MASKS))\n            {\n                draggable = true,\n                elementHeight = EditorGUIUtility.singleLineHeight,\n                drawHeaderCallback = _lstDrawer_DrawHeader,\n                drawElementCallback = _lstDrawer_DrawElement\n            };\n        }\n\n        protected override void OnSPInspectorGUI()\n        {\n            this.serializedObject.Update();\n\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\n\n            var avatarProp = this.serializedObject.FindProperty(PROP_AVATAR);\n            \n            avatarProp.objectReferenceValue = EditorGUILayout.ObjectField(\"Avatar\", avatarProp.objectReferenceValue, typeof(Transform), false);\n\n            EditorGUILayout.HelpBox(\"Add bones to define what bones are included in the animation.\\n\\nAn empty mask means all bones play.\", MessageType.Info);\n\n            var avatar = avatarProp.objectReferenceValue as Transform;\n            var expanded = GetExpandedHierarchy(avatar);\n            if (avatar == null)\n            {\n                _lstDrawer.draggable = true;\n                _lstDrawer.displayAdd = true;\n                _lstDrawer.displayRemove = true;\n                _lstElementReadonly = false;\n            }\n            else\n            {\n                if (!expanded.Contains(avatar)) expanded.Add(avatar);\n\n                _lstDrawer.draggable = true;\n                _lstDrawer.displayAdd = false;\n                _lstDrawer.displayRemove = true;\n                _lstElementReadonly = true;\n            }\n\n            _lstDrawer.DoLayoutList();\n\n            this.DrawTree(avatar);\n            \n\n\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_AVATAR, PROP_MASKS);\n            this.serializedObject.ApplyModifiedProperties();\n        }\n        \n        #region List Drawer Methods\n\n        private void _lstDrawer_DrawHeader(Rect area)\n        {\n            EditorGUI.LabelField(area, \"Masks\");\n        }\n\n        private void _lstDrawer_DrawElement(Rect area, int index, bool isActive, bool isFocused)\n        {\n            var prop = _lstDrawer.serializedProperty.GetArrayElementAtIndex(index);\n            var r0 = new Rect(area.xMin, area.yMin, Mathf.Max(area.width - RECURSE_TOGGLE_WIDTH - RECURSE_TOGGLE_PAD, 0f), EditorGUIUtility.singleLineHeight);\n            var r1 = new Rect(r0.xMax + RECURSE_TOGGLE_PAD, area.yMin, Mathf.Max(area.xMax - r0.xMax - RECURSE_TOGGLE_PAD, 0f), EditorGUIUtility.singleLineHeight);\n\n            var pathProp = prop.FindPropertyRelative(PROP_ENTRY_PATH);\n            var recurseProp = prop.FindPropertyRelative(PROP_ENTRY_RECURSE);\n\n            if (_lstElementReadonly)\n                EditorGUI.SelectableLabel(r0, pathProp.stringValue);\n            else\n                pathProp.stringValue = EditorGUI.TextField(r0, pathProp.stringValue);\n            recurseProp.boolValue = EditorGUI.ToggleLeft(r1, \"Recurse\", recurseProp.boolValue);\n        }\n\n        #endregion\n\n        #region Tree Drawer Methods\n        \n        private Dictionary<Transform, bool> _masks = new Dictionary<Transform, bool>();\n\n        private void DrawTree(Transform avatar)\n        {\n            EditorGUILayout.LabelField(\"Mask Tree\", EditorStyles.boldLabel);\n\n            _masks.Clear();\n            for(int i = 0; i < _lstDrawer.serializedProperty.arraySize; i++)\n            {\n                var prop = _lstDrawer.serializedProperty.GetArrayElementAtIndex(i);\n                var pathProp = prop.FindPropertyRelative(PROP_ENTRY_PATH);\n                var recurseProp = prop.FindPropertyRelative(PROP_ENTRY_RECURSE);\n\n                var t = avatar.Find(pathProp.stringValue);\n                if (t != null) _masks[t] = recurseProp.boolValue;\n            }\n\n            EditorGUI.BeginChangeCheck();\n            this.DrawTreeRecurse(avatar, avatar, false);\n            \n            if (EditorGUI.EndChangeCheck())\n            {\n                _lstDrawer.serializedProperty.arraySize = _masks.Count;\n                int i = 0;\n                foreach(var entry in _masks)\n                {\n                    var prop = _lstDrawer.serializedProperty.GetArrayElementAtIndex(i);\n                    var pathProp = prop.FindPropertyRelative(PROP_ENTRY_PATH);\n                    var recurseProp = prop.FindPropertyRelative(PROP_ENTRY_RECURSE);\n\n                    pathProp.stringValue = GameObjectUtil.GetPathNameRelativeTo(entry.Key, avatar);\n                    recurseProp.boolValue = entry.Value;\n\n                    i++;\n                }\n            }\n        }\n\n        private void DrawTreeRecurse(Transform root, Transform trans, bool parentIsRecursingMask)\n        {\n            const float MASK_TOGGLE_WIDTH = 18f;\n\n            var rect = EditorGUILayout.GetControlRect();\n            var area = EditorGUI.IndentedRect(rect);\n            area = new Rect(area.xMin + 2f, area.yMin, area.width - 2f, area.height);\n            var frect = new Rect(rect.xMin, rect.yMin, area.xMin - rect.xMin, EditorGUIUtility.singleLineHeight);\n\n            bool expanded = GetExpandedHierarchy(root).Contains(trans);\n            if (trans.childCount > 0)\n            {\n                bool newValue = EditorGUI.Foldout(frect, expanded, GUIContent.none);\n                if(expanded != newValue)\n                {\n                    if(newValue)\n                        GetExpandedHierarchy(root).Add(trans);\n                    else\n                        GetExpandedHierarchy(root).Remove(trans);\n                }\n            }\n            else if (expanded)\n            {\n                expanded = false;\n                GetExpandedHierarchy(root).Remove(trans);\n            }\n\n\n            bool recurse;\n            bool isMask = _masks.TryGetValue(trans, out recurse);\n\n            //do draw\n            int cache = EditorGUI.indentLevel;\n            EditorGUI.indentLevel = 0;\n\n            if (root == trans)\n            {\n                var r0 = new Rect(area.xMin, area.yMin, Mathf.Max(area.width - RECURSE_TOGGLE_WIDTH - RECURSE_TOGGLE_PAD, 0f), EditorGUIUtility.singleLineHeight);\n                var r1 = new Rect(r0.xMax + RECURSE_TOGGLE_PAD, area.yMin, Mathf.Max(area.xMax - r0.xMax - RECURSE_TOGGLE_PAD, 0f), EditorGUIUtility.singleLineHeight);\n                \n                EditorGUI.SelectableLabel(r0, trans.name);\n\n                bool playAll = _masks.Count == 0;\n                playAll = EditorGUI.ToggleLeft(r1, \"Play All\", playAll);\n                if (playAll && _masks.Count > 0) _masks.Clear();\n\n                _masks.Remove(trans);\n            }\n            else if(parentIsRecursingMask)\n            {\n                var r0 = new Rect(area.xMin, area.yMin, MASK_TOGGLE_WIDTH, EditorGUIUtility.singleLineHeight);\n                var r1 = new Rect(r0.xMax, area.yMin, area.xMax - r0.xMax, EditorGUIUtility.singleLineHeight);\n\n                EditorGUI.LabelField(r0, \"X\");\n                EditorGUI.SelectableLabel(r1, trans.name, EditorStyles.boldLabel);\n                _masks.Remove(trans);\n            }\n            else\n            {\n                var r0 = new Rect(area.xMin, area.yMin, MASK_TOGGLE_WIDTH, EditorGUIUtility.singleLineHeight);\n\n                isMask = EditorGUI.Toggle(r0, isMask);\n\n                if(isMask)\n                {\n                    var r1 = new Rect(r0.xMax, area.yMin, Mathf.Max(area.xMax - r0.xMax - RECURSE_TOGGLE_WIDTH - RECURSE_TOGGLE_PAD, 0f), EditorGUIUtility.singleLineHeight);\n                    var r2 = new Rect(r1.xMax, area.yMin, Mathf.Max(area.xMax - r1.xMax - RECURSE_TOGGLE_PAD, 0f), EditorGUIUtility.singleLineHeight);\n                    \n                    EditorGUI.SelectableLabel(r1, trans.name, isMask || parentIsRecursingMask ? EditorStyles.boldLabel : EditorStyles.label);\n\n                    recurse = EditorGUI.ToggleLeft(r2, \"Recurse\", recurse);\n                    _masks[trans] = recurse;\n                }\n                else\n                {\n                    var r1 = new Rect(r0.xMax, area.yMin, Mathf.Max(area.xMax - r0.xMax, 0f), EditorGUIUtility.singleLineHeight);\n                    EditorGUI.SelectableLabel(r1, trans.name, isMask || parentIsRecursingMask ? EditorStyles.boldLabel : EditorStyles.label);\n                    _masks.Remove(trans);\n                }\n            }\n\n            EditorGUI.indentLevel = cache;\n\n\n            //recurse\n            if (expanded)\n            {\n                EditorGUI.indentLevel++;\n                try\n                {\n                    foreach (Transform t in trans)\n                    {\n                        this.DrawTreeRecurse(root, t, (isMask && recurse) || parentIsRecursingMask);\n                    }\n                }\n                finally\n                {\n                    EditorGUI.indentLevel--;\n                }\n            }\n        }\n        \n        #endregion\n\n\n\n        #region Static Utils\n\n        private static Dictionary<Transform, List<Transform>> _expandedHierarchyListTable = new Dictionary<Transform, List<Transform>>();\n        private static List<Transform> GetExpandedHierarchy(Transform t)\n        {\n            if (t == null) return null;\n\n            List<Transform> result;\n            if(!_expandedHierarchyListTable.TryGetValue(t, out result))\n            {\n                result = new List<Transform>();\n                result.Add(t);\n                _expandedHierarchyListTable[t] = result;\n            }\n            return result;\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyAnimEditor/Anim/i_PlayAnimationInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Anim;\r\nusing com.spacepuppyeditor.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Anim\r\n{\r\n\r\n    [CustomEditor(typeof(i_PlayAnimation), true)]\r\n    public class i_PlayAnimationInspector : SPEditor\r\n    {\r\n        \r\n        public const string PROP_ORDER = \"_order\";\r\n        public const string PROP_MODE = \"_mode\";\r\n        public const string PROP_TARGETANIMATOR = \"_targetAnimator\";\r\n        public const string PROP_ID = \"_id\";\r\n        public const string PROP_CLIP = \"_clip\";\r\n        private const string PROP_APPLYSETTINGS = \"_applyCustomSettings\"; //OBSOLETE\r\n        public const string PROP_SETTINGSMASK = \"_settingsMask\";\r\n        public const string PROP_SETTINGS = \"_settings\";\r\n        public const string PROP_QUEUEMODE = \"_queueMode\";\r\n        public const string PROP_PLAYMODE = \"_playMode\";\r\n        public const string PROP_CROSSFADEDUR = \"_crossFadeDur\";\r\n        private static string[] PROPS_ANIMSETTINGS = new string[] { \"weight\", \"speed\", \"layer\", \"wrapMode\", \"blendMode\", \"timeSupplier\" };\r\n\r\n\r\n        private TriggerableTargetObjectPropertyDrawer _targetDrawer = new TriggerableTargetObjectPropertyDrawer()\r\n        {\r\n            ManuallyConfigured = true,\r\n            SearchChildren = false,\r\n            ChoiceSelector = new com.spacepuppyeditor.Components.MultiTypeComponentChoiceSelector()\r\n            {\r\n                AllowedTypes = new System.Type[] { typeof(Animation), typeof(ISPAnimationSource), typeof(ISPAnimator) }\r\n            }\r\n        };\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n            this.DrawPropertyField(PROP_ORDER);\r\n\r\n            this.DrawTargetAnimatorProperty();\r\n\r\n            var propTarget = this.serializedObject.FindProperty(PROP_TARGETANIMATOR);\r\n            var controller = propTarget.FindPropertyRelative(TriggerableTargetObjectPropertyDrawer.PROP_TARGET).objectReferenceValue;\r\n            System.Type tp;\r\n            switch(GetAnimatorType(controller, out tp))\r\n            {\r\n                case AnimatorType.Unknown:\r\n                case AnimatorType.Animation:\r\n                case AnimatorType.SPAnimController:\r\n                    {\r\n                        var propMode = this.serializedObject.FindProperty(PROP_MODE);\r\n                        SPEditorGUILayout.PropertyField(propMode);\r\n\r\n                        switch (propMode.GetEnumValue<i_PlayAnimation.PlayByMode>())\r\n                        {\r\n                            case i_PlayAnimation.PlayByMode.PlayAnim:\r\n                                {\r\n                                    this.serializedObject.FindProperty(PROP_ID).stringValue = string.Empty;\r\n\r\n                                    var clipProp = this.serializedObject.FindProperty(PROP_CLIP);\r\n                                    var obj = EditorGUILayout.ObjectField(EditorHelper.TempContent(clipProp.displayName), clipProp.objectReferenceValue, typeof(UnityEngine.Object), true);\r\n                                    if (obj == null || obj is AnimationClip || obj is IScriptableAnimationClip)\r\n                                        clipProp.objectReferenceValue = obj;\r\n                                    else if (GameObjectUtil.IsGameObjectSource(obj))\r\n                                        clipProp.objectReferenceValue = ObjUtil.GetAsFromSource<IScriptableAnimationClip>(obj) as UnityEngine.Object;\r\n                                }\r\n                                break;\r\n                            case i_PlayAnimation.PlayByMode.PlayAnimByID:\r\n                                {\r\n                                    this.serializedObject.FindProperty(PROP_CLIP).objectReferenceValue = null;\r\n\r\n                                    //this.DrawPropertyField(PROP_ID);\r\n                                    this.DrawAnimIdSelector(controller);\r\n                                }\r\n                                break;\r\n                            case i_PlayAnimation.PlayByMode.PlayAnimFromResource:\r\n                                {\r\n                                    this.serializedObject.FindProperty(PROP_CLIP).objectReferenceValue = null;\r\n\r\n                                    this.DrawPropertyField(PROP_ID);\r\n                                }\r\n                                break;\r\n                        }\r\n\r\n                        this.DrawAnimSettings();\r\n                        this.DrawPropertyField(PROP_QUEUEMODE);\r\n                        this.DrawPropertyField(PROP_PLAYMODE);\r\n                        this.DrawPropertyField(PROP_CROSSFADEDUR);\r\n                    }\r\n                    break;\r\n                case AnimatorType.SPAnimator:\r\n                    {\r\n                        var propId = this.serializedObject.FindProperty(PROP_ID);\r\n                        propId.stringValue = DrawSPAnimatorFunctionPopup(EditorGUILayout.GetControlRect(), tp, propId.stringValue);\r\n                    }\r\n                    break;\r\n                case AnimatorType.SPAnimSource:\r\n                    {\r\n                        this.serializedObject.FindProperty(PROP_MODE).SetEnumValue<i_PlayAnimation.PlayByMode>(i_PlayAnimation.PlayByMode.PlayAnimByID);\r\n                        this.serializedObject.FindProperty(PROP_CLIP).objectReferenceValue = null;\r\n\r\n                        this.DrawPropertyField(PROP_ID);\r\n                        this.DrawAnimSettings();\r\n                        this.DrawPropertyField(PROP_QUEUEMODE);\r\n                        this.DrawPropertyField(PROP_PLAYMODE);\r\n                        this.DrawPropertyField(PROP_CROSSFADEDUR);\r\n                    }\r\n                    break;\r\n            }\r\n            \r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_ORDER, PROP_MODE, PROP_TARGETANIMATOR, PROP_ID, PROP_CLIP, PROP_APPLYSETTINGS, PROP_SETTINGSMASK, PROP_SETTINGS, PROP_QUEUEMODE, PROP_PLAYMODE, PROP_CROSSFADEDUR);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n\r\n        private void DrawTargetAnimatorProperty()\r\n        {\r\n            var targWrapperProp = this.serializedObject.FindProperty(PROP_TARGETANIMATOR);\r\n            \r\n            var label = EditorHelper.TempContent(targWrapperProp.displayName);\r\n            var rect = EditorGUILayout.GetControlRect(true, _targetDrawer.GetPropertyHeight(targWrapperProp, label));\r\n            _targetDrawer.OnGUI(rect, targWrapperProp, label);\r\n            \r\n\r\n            var targProp = targWrapperProp.FindPropertyRelative(TriggerableTargetObjectPropertyDrawer.PROP_TARGET);\r\n            var obj = targProp.objectReferenceValue;\r\n            if (obj == null || i_PlayAnimation.IsAcceptibleAnimator(obj))\r\n                return;\r\n\r\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n\r\n            ISPAnimationSource src;\r\n            if (go.GetComponent<ISPAnimationSource>(out src))\r\n            {\r\n                targProp.objectReferenceValue = src as UnityEngine.Object;\r\n                return;\r\n            }\r\n\r\n            Animation anim;\r\n            if (go.GetComponent<Animation>(out anim))\r\n            {\r\n                targProp.objectReferenceValue = anim;\r\n                return;\r\n            }\r\n\r\n            ISPAnimator animator;\r\n            if (go.GetComponent<ISPAnimator>(out animator))\r\n            {\r\n                targProp.objectReferenceValue = animator as UnityEngine.Object;\r\n                return;\r\n            }\r\n        }\r\n\r\n        private void DrawAnimSettings()\r\n        {\r\n            /*\r\n            var propApply = this.serializedObject.FindProperty(PROP_APPLYSETTINGS);\r\n            SPEditorGUILayout.PropertyField(propApply);\r\n            if (propApply.boolValue)\r\n            {\r\n                //this.DrawPropertyField(PROP_SETTINGS);\r\n                EditorGUI.indentLevel++;\r\n                SPEditorGUILayout.FlatChildPropertyField(this.serializedObject.FindProperty(PROP_SETTINGS));\r\n                EditorGUI.indentLevel--;\r\n            }\r\n            */\r\n\r\n            var propMask = this.serializedObject.FindProperty(PROP_SETTINGSMASK);\r\n            var propSettings = this.serializedObject.FindProperty(PROP_SETTINGS);\r\n\r\n            int mask = propMask.intValue;\r\n            propSettings.isExpanded = EditorGUILayout.Foldout(propSettings.isExpanded, mask != 0 ? \"Custom Settings : Active\" : \"Custom Settings\");\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            for (int i = 0; i < PROPS_ANIMSETTINGS.Length; i++)\r\n            {\r\n                int m = 1 << i;\r\n                bool active = (mask & m) != 0;\r\n                if (!propSettings.isExpanded && !active) continue;\r\n\r\n                var propSet = propSettings.FindPropertyRelative(PROPS_ANIMSETTINGS[i]);\r\n                EditorGUILayout.BeginHorizontal();\r\n                if (EditorGUILayout.Toggle(active, GUILayout.MaxWidth(20f)))\r\n                {\r\n                    mask |= m;\r\n                    EditorGUILayout.PropertyField(propSet);\r\n                }\r\n                else\r\n                {\r\n                    mask &= ~m;\r\n                    EditorGUILayout.PrefixLabel(EditorHelper.TempContent(propSet.displayName, propSet.tooltip));\r\n                }\r\n\r\n                EditorGUILayout.EndHorizontal();\r\n            }\r\n            if (EditorGUI.EndChangeCheck())\r\n                propMask.intValue = mask;\r\n        }\r\n\r\n        private void DrawAnimIdSelector(object animator)\r\n        {\r\n            if(animator == null)\r\n            {\r\n                this.DrawPropertyField(PROP_ID);\r\n                return;\r\n            }\r\n\r\n            using (var lst = com.spacepuppy.Collections.TempCollection.GetList<string>())\r\n            {\r\n                GetAnimationIds(lst, animator);\r\n                if(lst.Count == 0)\r\n                {\r\n                    this.DrawPropertyField(PROP_ID);\r\n                    return;\r\n                }\r\n                else\r\n                {\r\n                    var propId = this.serializedObject.FindProperty(PROP_ID);\r\n                    propId.stringValue = SPEditorGUILayout.OptionPopupWithCustom(propId.displayName, propId.stringValue, lst.ToArray());\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n        public static string DrawSPAnimatorFunctionPopup(Rect position, System.Type animatorType, string functionName)\r\n        {\r\n            var methods = (from m in animatorType.GetMethods(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic)\r\n                           let attrib = m.GetCustomAttributes(typeof(SPAnimatorMethodAttribute), true).FirstOrDefault()\r\n                           where attrib != null && m.GetParameters().Length == 0\r\n                           select new { attrib, m }).ToArray();\r\n            if (methods.Length > 0)\r\n            {\r\n                var names = (from o in methods select o.m.Name).ToArray();\r\n\r\n                int index = System.Array.IndexOf(names, functionName);\r\n                index = EditorGUI.Popup(position, \"Function\", index, names);\r\n                if (index < 0) index = 0;\r\n                return names[index];\r\n            }\r\n            else\r\n            {\r\n                EditorGUI.LabelField(position, \"Function\", \"No functions found on animator\");\r\n                return string.Empty;\r\n            }\r\n        }\r\n\r\n        private static AnimatorType GetAnimatorType(object obj, out System.Type tp)\r\n        {\r\n            if(obj is IProxy)\r\n            {\r\n                tp = (obj as IProxy).GetTargetType();\r\n                return AnimUtil.GetAnimatorType(tp);\r\n            }\r\n            else if (obj != null)\r\n            {\r\n                tp = obj.GetType();\r\n                return AnimUtil.GetAnimatorType(tp);\r\n            }\r\n            else\r\n            {\r\n                tp = null;\r\n                return AnimatorType.Unknown;\r\n            }\r\n        }\r\n\r\n\r\n        private static void GetAnimationIds(List<string> results, object animator)\r\n        {\r\n            if (animator is IProxy) animator = (animator as IProxy).GetTarget();\r\n            if (animator == null) return;\r\n\r\n            if(animator is Animation)\r\n            {\r\n                results.AddRange(from AnimationState st in (animator as System.Collections.IEnumerable) select (st as AnimationState).name);\r\n            }\r\n            else if (animator is SPAnimationController)\r\n            {\r\n                results.AddRange((animator as SPAnimationController).States.Keys);\r\n            }\r\n        }\r\n\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnimEditor/Anim/i_PlaySPAnimationInspector.cs",
    "content": "﻿#pragma warning disable 0618 // ignore obsolete since this is the editor for said obsolete type\r\nusing UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Anim;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Anim\r\n{\r\n\r\n    [CustomEditor(typeof(i_PlaySPAnimation), true)]\r\n    [CanEditMultipleObjects()]\r\n    public class i_PlaySPAnimationInspector : SPEditor\r\n    {\r\n\r\n        public const string PROP_STARTTIME = \"_startTime\";\r\n\r\n\r\n        \r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawDefaultInspector();\r\n\r\n\r\n            if(Application.isPlaying && !this.serializedObject.isEditingMultipleObjects)\r\n            {\r\n                var targ = this.serializedObject.targetObject as i_PlaySPAnimation;\r\n                if (targ == null) return;\r\n\r\n                var anim = targ.CurrentAnimState;\r\n                if (anim != null)\r\n                {\r\n                    EditorGUI.BeginChangeCheck();\r\n                    float t = EditorGUILayout.Slider(\"Current Time\", anim.Time, 0f, anim.Duration);\r\n                    if (EditorGUI.EndChangeCheck())\r\n                        anim.Time = t;\r\n                }\r\n            }\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n\r\n        public override bool RequiresConstantRepaint()\r\n        {\r\n            if (base.RequiresConstantRepaint()) return true;\r\n\r\n            var targ = this.serializedObject.targetObject as i_PlaySPAnimation;\r\n            if (targ == null) return false;\r\n\r\n            var anim = targ.CurrentAnimState;\r\n            if (anim == null) return false;\r\n\r\n            return anim.IsPlaying;\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnimEditor/Anim/i_StopAnimationInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Anim;\r\nusing com.spacepuppyeditor.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Anim\r\n{\r\n\r\n    [CustomEditor(typeof(i_StopAnimation), true)]\r\n    public class i_StopAnimationInspector : SPEditor\r\n    {\r\n\r\n        public const string PROP_ORDER = EditorHelper.PROP_ORDER;\r\n        public const string PROP_TARGETANIMATOR = \"_targetAnimator\";\r\n        public const string PROP_MODE = \"_mode\";\r\n        public const string PROP_ID = \"_id\";\r\n        public const string PROP_LAYER = \"_layer\";\r\n\r\n        private TriggerableTargetObjectPropertyDrawer _targetDrawer = new TriggerableTargetObjectPropertyDrawer();\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n            this.DrawPropertyField(PROP_ORDER);\r\n\r\n            this.DrawTargetAnimatorProperty();\r\n\r\n            var propMode = this.serializedObject.FindProperty(PROP_MODE);\r\n            SPEditorGUILayout.PropertyField(propMode);\r\n            \r\n            switch(propMode.GetEnumValue<i_StopAnimation.StopMode>())\r\n            {\r\n                case i_StopAnimation.StopMode.Id:\r\n                    this.DrawPropertyField(PROP_ID);\r\n                    break;\r\n                case i_StopAnimation.StopMode.Layer:\r\n                    this.DrawPropertyField(PROP_LAYER);\r\n                    break;\r\n            }\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_ORDER, PROP_TARGETANIMATOR, PROP_MODE, PROP_ID, PROP_LAYER);\r\n           \r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n\r\n\r\n        private void DrawTargetAnimatorProperty()\r\n        {\r\n            var targWrapperProp = this.serializedObject.FindProperty(PROP_TARGETANIMATOR);\r\n            var targProp = targWrapperProp.FindPropertyRelative(TriggerableTargetObjectPropertyDrawer.PROP_TARGET);\r\n\r\n            _targetDrawer.ManuallyConfigured = true;\r\n\r\n            var label = EditorHelper.TempContent(targWrapperProp.displayName);\r\n            var rect = EditorGUILayout.GetControlRect(true, _targetDrawer.GetPropertyHeight(targWrapperProp, label));\r\n            _targetDrawer.OnGUI(rect, targWrapperProp, label);\r\n\r\n\r\n            var obj = targProp.objectReferenceValue;\r\n            if (obj == null || i_StopAnimation.IsAcceptibleAnimator(obj))\r\n                return;\r\n\r\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n\r\n            SPAnimationController src;\r\n            if (go.GetComponent<SPAnimationController>(out src))\r\n            {\r\n                targProp.objectReferenceValue = src as UnityEngine.Object;\r\n                return;\r\n            }\r\n\r\n            Animation anim;\r\n            if (go.GetComponent<Animation>(out anim))\r\n            {\r\n                targProp.objectReferenceValue = anim;\r\n                return;\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyAnimEditor/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"SpacepuppyAnimEditor\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"SpacepuppyAnimEditor\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"9347683c-9d27-4a43-9e0e-864fd63d4d3a\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "SpacepuppyAnimEditor/SpacepuppyAnimEditor.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{EC2096FE-8D75-483B-A6D9-10B9AB1F3819}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>com.spacepuppyeditor</RootNamespace>\r\n    <AssemblyName>SpacepuppyUnityFrameworkEditor.Anim</AssemblyName>\r\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile>\r\n    </TargetFrameworkProfile>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"UnityEditor\">\r\n      <HintPath>..\\Resources\\UnityEditor.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"UnityEngine\">\r\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Anim\\AnimLayerPropertyDrawer.cs\" />\r\n    <Compile Include=\"Anim\\AnimTimePeriodPropertyDrawer.cs\" />\r\n    <Compile Include=\"Anim\\IAnimLayerInformationSupplier.cs\" />\r\n    <Compile Include=\"Anim\\i_PlayAnimationInspector.cs\" />\r\n    <Compile Include=\"Anim\\i_PlaySPAnimationInspector.cs\" />\r\n    <Compile Include=\"Anim\\i_StopAnimationInspector.cs\" />\r\n    <Compile Include=\"Anim\\Legacy\\SPLegacyAnimationInspector.cs\" />\r\n    <Compile Include=\"Anim\\MaskCollectionPropertyDrawer.cs\" />\r\n    <Compile Include=\"Anim\\SPAnimationControllerInspector.cs\" />\r\n    <Compile Include=\"Anim\\SPAnimationMaskAssetInspector.cs\" />\r\n    <Compile Include=\"Anim\\SPAnimClipCollectionPropertyDrawer.cs\" />\r\n    <Compile Include=\"Anim\\SPAnimClipPropertyDrawer.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\SpacepuppyAnim\\SpacepuppyAnim.csproj\">\r\n      <Project>{48c79480-359d-4215-9ede-3d4e9d8190b3}</Project>\r\n      <Name>SpacepuppyAnim</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppyBaseEditor\\SpacepuppyBaseEditor.csproj\">\r\n      <Project>{a0466ee3-9582-4c0d-965d-e2d2f9006971}</Project>\r\n      <Name>SpacepuppyBaseEditor</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\r\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\r\n      <Name>SpacepuppyBase</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>mkdir $(ProjectDir)..\\Builds\\FullLibrary\\Editor\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.Anim.dll\" \"$(ProjectDir)..\\Builds\\FullLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.Anim.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.Anim.pdb\" \"$(ProjectDir)..\\Builds\\FullLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.Anim.pdb\"</PostBuildEvent>\r\n  </PropertyGroup>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "SpacepuppyBase/Async/AsyncOperationWrapper.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Async\r\n{\r\n    public class AsyncOperationWrapper : IProgressingYieldInstruction\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private AsyncOperation[] _operations;\r\n        private AsyncOperation _recentOperation;\r\n        private bool _complete;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public AsyncOperationWrapper(params AsyncOperation[] operations)\r\n        {\r\n            if (operations == null) throw new System.ArgumentNullException(\"operations\");\r\n            _operations = operations;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IProgressingAsyncOperation Interface\r\n\r\n        public float Progress\r\n        {\r\n            get\r\n            {\r\n                if (_operations.Length == 0) return 1f;\r\n                else if (_operations.Length == 1) return _operations[0].progress;\r\n                else\r\n                {\r\n                    float p = 0f;\r\n                    for (int i = 0; i < _operations.Length; i++)\r\n                    {\r\n                        p += _operations[i].progress;\r\n                    }\r\n                    return p / _operations.Length;\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool IsComplete\r\n        {\r\n            get\r\n            {\r\n                if (_complete) return true;\r\n                else\r\n                {\r\n                    for (int i = 0; i < _operations.Length; i++)\r\n                    {\r\n                        if (!_operations[i].isDone) return false;\r\n                    }\r\n                    _complete = true;\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            if (_recentOperation == null || _recentOperation.isDone)\r\n            {\r\n                for (int i = 0; i < _operations.Length; i++)\r\n                {\r\n                    if (!_operations[i].isDone)\r\n                    {\r\n                        _recentOperation = _operations[i];\r\n                        yieldObject = _recentOperation;\r\n                        return true;\r\n                    }\r\n                }\r\n            }\r\n\r\n            yieldObject = null;\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Async/InvokePump.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Threading;\r\n\r\nnamespace com.spacepuppy.Async\r\n{\r\n\r\n    /// <summary>\r\n    /// Queue actions up to be called during some other threads update pump.\r\n    /// </summary>\r\n    public class InvokePump : WaitHandle\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private int _threadId;\r\n\r\n        //private Action _invoking;\r\n        private Queue<Action> _invoking;\r\n        private object _invokeLock = new object();\r\n        private EventWaitHandle _waitHandle = new EventWaitHandle(false, EventResetMode.AutoReset);\r\n        //private EventWaitHandle _waitHandleAlt = new EventWaitHandle(false, EventResetMode.AutoReset);\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n        \r\n        public InvokePump()\r\n            : this(null)\r\n        {\r\n\r\n        }\r\n\r\n        public InvokePump(Thread ownerThread)\r\n        {\r\n            _threadId = (ownerThread != null) ? ownerThread.ManagedThreadId : System.Threading.Thread.CurrentThread.ManagedThreadId;\r\n\r\n            _invoking = new Queue<Action>();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        /// <summary>\r\n        /// Returns true if on a thread other than the one that owns this pump.\r\n        /// </summary>\r\n        public bool InvokeRequired\r\n        {\r\n            get { return _threadId != 0 && Thread.CurrentThread.ManagedThreadId != _threadId; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Queues an action to be invoked next time Update is called. This method will block until that occurs.\r\n        /// </summary>\r\n        /// <param name=\"action\"></param>\r\n        public void Invoke(Action action)\r\n        {\r\n            if (_threadId == 0) throw new System.InvalidOperationException(\"InvokePump has been closed.\");\r\n            if (Thread.CurrentThread.ManagedThreadId == _threadId) throw new System.InvalidOperationException(\"Never call WaitOne on an InvokePump from the thread that owns it, this will freeze that thread indefinitely.\");\r\n            if (action == null) throw new System.ArgumentNullException(\"action\");\r\n\r\n            lock (_invokeLock)\r\n            {\r\n                //_invoking += action;\r\n                _invoking.Enqueue(action);\r\n            }\r\n            _waitHandle.WaitOne(); //block until it's called\r\n        }\r\n\r\n        /// <summary>\r\n        /// Queues an action to be invoked next time Update is called. This method does not block.\r\n        /// </summary>\r\n        /// <param name=\"action\"></param>\r\n        public void BeginInvoke(Action action)\r\n        {\r\n            if (_threadId == 0) throw new System.InvalidOperationException(\"InvokePump has been closed.\");\r\n            if (action == null) throw new System.ArgumentNullException(\"action\");\r\n\r\n            lock (_invokeLock)\r\n            {\r\n                //_invoking += action;\r\n                _invoking.Enqueue(action);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Can only be called by the thread that owns this InvokePump, this will run all queued actions.\r\n        /// </summary>\r\n        public void Update()\r\n        {\r\n            if (_threadId == 0) return; //we're destroyed\r\n            if (this.InvokeRequired) throw new System.InvalidOperationException(\"InvokePump.Update can only be updated on the thread that was designated its owner.\");\r\n            \r\n            //record the current length so we only activate those actions added at this point\r\n            //any newly added actions should wait until NEXT update\r\n            int cnt = _invoking.Count;\r\n            for(int i = 0; i < cnt; i++)\r\n            {\r\n                Action act;\r\n                lock (_invokeLock)\r\n                {\r\n                    act = _invoking.Dequeue();\r\n                }\r\n\r\n                if (act != null) act();\r\n            }\r\n\r\n            //release waits\r\n            _waitHandle.Set();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Overrides\r\n\r\n        public override void Close()\r\n        {\r\n            base.Close();\r\n\r\n            if (_threadId == 0) return; //already was destroyed\r\n            //_invoking = null;\r\n            _invoking.Clear();\r\n            _waitHandle.Close();\r\n            //_waitHandleAlt.Close();\r\n            _threadId = 0;\r\n        }\r\n\r\n        protected override void Dispose(bool explicitDisposing)\r\n        {\r\n            base.Dispose(explicitDisposing);\r\n\r\n            if (_threadId == 0) return; //already was destroyed\r\n            //_invoking = null;\r\n            _invoking.Clear();\r\n            (_waitHandle as IDisposable).Dispose();\r\n            //(_waitHandleAlt as IDisposable).Dispose();\r\n            _threadId = 0;\r\n        }\r\n\r\n        public override bool WaitOne()\r\n        {\r\n            if (_threadId == 0) throw new System.InvalidOperationException(\"InvokePump has been closed.\");\r\n            if (Thread.CurrentThread.ManagedThreadId == _threadId) throw new System.InvalidOperationException(\"Never call WaitOne on an InvokePump from the thread that owns it, this will freeze that thread indefinitely.\");\r\n            return _waitHandle.WaitOne();\r\n        }\r\n\r\n        public override bool WaitOne(int millisecondsTimeout)\r\n        {\r\n            if (_threadId == 0) throw new System.InvalidOperationException(\"InvokePump has been closed.\");\r\n            if (Thread.CurrentThread.ManagedThreadId == _threadId) throw new System.InvalidOperationException(\"Never call WaitOne on an InvokePump from the thread that owns it, this will freeze that thread indefinitely.\");\r\n            return _waitHandle.WaitOne(millisecondsTimeout);\r\n        }\r\n\r\n        public override bool WaitOne(int millisecondsTimeout, bool exitContext)\r\n        {\r\n            if (_threadId == 0) throw new System.InvalidOperationException(\"InvokePump has been closed.\");\r\n            if (Thread.CurrentThread.ManagedThreadId == _threadId) throw new System.InvalidOperationException(\"Never call WaitOne on an InvokePump from the thread that owns it, this will freeze that thread indefinitely.\");\r\n            return _waitHandle.WaitOne(millisecondsTimeout, exitContext);\r\n        }\r\n\r\n        public override bool WaitOne(TimeSpan timeout)\r\n        {\r\n            if (_threadId == 0) throw new System.InvalidOperationException(\"InvokePump has been closed.\");\r\n            if (Thread.CurrentThread.ManagedThreadId == _threadId) throw new System.InvalidOperationException(\"Never call WaitOne on an InvokePump from the thread that owns it, this will freeze that thread indefinitely.\");\r\n            return _waitHandle.WaitOne(timeout);\r\n        }\r\n\r\n        public override bool WaitOne(TimeSpan timeout, bool exitContext)\r\n        {\r\n            if (_threadId == 0) throw new System.InvalidOperationException(\"InvokePump has been closed.\");\r\n            if (Thread.CurrentThread.ManagedThreadId == _threadId) throw new System.InvalidOperationException(\"Never call WaitOne on an InvokePump from the thread that owns it, this will freeze that thread indefinitely.\");\r\n            return _waitHandle.WaitOne(timeout, exitContext);\r\n        }\r\n\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Async/RadicalAsyncOperation.cs",
    "content": "﻿\r\nnamespace com.spacepuppy.Async\r\n{\r\n\r\n    public abstract class RadicalAsyncOperation : IRadicalYieldInstruction\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private bool _complete;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public RadicalAsyncOperation()\r\n        {\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Begin()\r\n        {\r\n            System.Threading.ThreadPool.QueueUserWorkItem(this.AsyncCallback, null);\r\n        }\r\n        \r\n        private void AsyncCallback(object state)\r\n        {\r\n            this.DoAsyncWork();\r\n        }\r\n\r\n        protected abstract void DoAsyncWork();\r\n\r\n        protected void SetSignal()\r\n        {\r\n            _complete = true;\r\n        }\r\n\r\n        protected virtual bool Tick(out object yieldObject)\r\n        {\r\n            yieldObject = null;\r\n            return !_complete;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalYieldInstruction Interface\r\n\r\n        public bool IsComplete\r\n        {\r\n            get { return _complete; }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            if(_complete)\r\n            {\r\n                yieldObject = null;\r\n                return false;\r\n            }\r\n\r\n            return this.Tick(out yieldObject);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Factory\r\n        \r\n        public static RadicalAsyncOperation QueueUserWorkItem(System.Threading.WaitCallback callback, object token = null)\r\n        {\r\n            var op = new SimpleAsyncAction();\r\n            op._callback = callback;\r\n            op._token = token;\r\n            op.Begin();\r\n            return op;\r\n        }\r\n        \r\n        private class SimpleAsyncAction : RadicalAsyncOperation\r\n        {\r\n\r\n            internal System.Threading.WaitCallback _callback;\r\n            internal object _token;\r\n            \r\n            protected override void DoAsyncWork()\r\n            {\r\n                if(_callback != null)\r\n                {\r\n                    _callback(_token);\r\n                }\r\n                this.SetSignal();\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Async/RadicalTask.cs",
    "content": "﻿using System;\r\n\r\nnamespace com.spacepuppy.Async\r\n{\r\n\r\n    /// <summary>\r\n    /// Facilitates the multi-threading feature of RadicalCoroutine. Access the static interface to easily \r\n    /// jump between a pooled thread and the main unity thread.\r\n    /// \r\n    /// yield RadicalTask.JumpToAsync to operate on a pooled thread\r\n    /// yield RadicalTask.JumpToUnityThread (or anything for that matter) to return to the unity thread\r\n    /// \r\n    /// If you yield a JumpToAsync in an already threaded routine, it'll just remain in the thread, with no wait.\r\n    /// </summary>\r\n    public sealed class RadicalTask : IRadicalYieldInstruction\r\n    {\r\n\r\n        public enum OperationState\r\n        {\r\n            Inactive,\r\n            Initializing,\r\n            RunningAsync,\r\n            WaitingOnYield\r\n        }\r\n\r\n\r\n        #region Fields\r\n\r\n        private OperationState _state;\r\n        private RadicalCoroutine _routine;\r\n        private object _yieldObject;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n        \r\n        public RadicalTask(RadicalCoroutine routine)\r\n        {\r\n            this.Init(routine);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public OperationState State\r\n        {\r\n            get\r\n            {\r\n                return _state;\r\n            }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void Init(RadicalCoroutine routine)\r\n        {\r\n            if (_state != OperationState.Inactive) throw new InvalidOperationException(\"RadicalTask is already operating.\");\r\n\r\n            _routine = routine;\r\n        }\r\n\r\n        private void Clear()\r\n        {\r\n            _state = OperationState.Inactive;\r\n            _routine = null;\r\n            _yieldObject = null;\r\n        }\r\n\r\n\r\n        private void AsyncWorkerCallback(object state)\r\n        {\r\n            _state = OperationState.RunningAsync;\r\n\r\n            if (_state == OperationState.Inactive || \r\n                _routine == null || \r\n                _routine.OperatingState != RadicalCoroutineOperatingState.Active || \r\n                _routine.OperationStack.CurrentOperation != this)\r\n            {\r\n                this.Clear();\r\n                return;\r\n            }\r\n            \r\n        WorkerLoopback:\r\n            var op = _routine.OperationStack.PeekSubOperation();\r\n            if (op == null)\r\n            {\r\n                this.Clear();\r\n                return;\r\n            }\r\n            \r\n            object yieldObject;\r\n            if(op.Tick(out yieldObject))\r\n            {\r\n                if(yieldObject == RadicalTask.JumpToAsync && \r\n                   _state == OperationState.RunningAsync && \r\n                   _routine != null && \r\n                   _routine.OperatingState == RadicalCoroutineOperatingState.Active &&\r\n                   _routine.OperationStack.CurrentOperation == this)\r\n                {\r\n                    goto WorkerLoopback;\r\n                }\r\n                else\r\n                {\r\n                    _yieldObject = yieldObject;\r\n                    _state = OperationState.WaitingOnYield;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if(_routine.OperationStack.PeekSubOperation() == op) _routine.OperationStack.PopSubOperation();\r\n                _yieldObject = null;\r\n                _state = OperationState.Inactive;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalYieldInstruction Interface\r\n\r\n        bool IRadicalYieldInstruction.IsComplete\r\n        {\r\n            get\r\n            {\r\n                return _state == OperationState.Inactive;\r\n            }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            switch(_state)\r\n            {\r\n                case OperationState.Inactive:\r\n                    if (_routine != null && SPThreadPool.QueueUserWorkItem(this.AsyncWorkerCallback))\r\n                    {\r\n                        _state = OperationState.Initializing;\r\n                        yieldObject = null;\r\n                        return true;\r\n                    }\r\n                    else\r\n                    {\r\n                        yieldObject = null;\r\n                        return false;\r\n                    }\r\n                case OperationState.Initializing:\r\n                case OperationState.RunningAsync:\r\n                    yieldObject = null;\r\n                    return true;\r\n                case OperationState.WaitingOnYield:\r\n                    yieldObject = _yieldObject;\r\n                    this.Clear();\r\n                    return true;\r\n                default:\r\n                    yieldObject = null;\r\n                    return false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Static Coroutine Hooks\r\n\r\n        private static object _jumpToAsync = new object();\r\n        private static object _jumpToUnityThreadCommand = new object();\r\n        \r\n        public static object JumpToAsync\r\n        {\r\n            get { return _jumpToAsync; }\r\n        }\r\n\r\n        public static object JumpToUnityThread\r\n        {\r\n            get { return _jumpToUnityThreadCommand; }\r\n        }\r\n\r\n\r\n\r\n        public static RadicalTask Create(RadicalCoroutine routine)\r\n        {\r\n            //TODO - possibly implment pooling system to reduce gc\r\n            return new RadicalTask(routine);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Async/SPThreadPool.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Threading;\r\n\r\nnamespace com.spacepuppy.Async\r\n{\r\n\r\n    /// <summary>\r\n    /// SPThreadPool manages a set pool of threads to be used within your game just like System.Threading.ThreadPool. \r\n    /// Unlike System.Threading.ThreadPool though, it reacts to the various events in Unity when managing its threads. \r\n    /// This way a task can be cancelled automatically if needed.\r\n    /// \r\n    /// The default thread counts are as followed:\r\n    /// WebGL - not supported, 1 thread\r\n    /// Mobile - Max(coreCount, 5)\r\n    /// PC/Mac/Console - Max(coreCount, 10)\r\n    /// \r\n    /// More threads are managed than cores in most cases. This is because a thread isn't necessarily meant to eek out more \r\n    /// speed from a processor by using another core (though it can be used for that), but rather to allow asynchronous coding \r\n    /// of two tasks.\r\n    /// \r\n    /// Better speed could be accomplished by matching the core count if so desired. You can resize the number of available \r\n    /// threads by calling the 'Resize' method.\r\n    /// </summary>\r\n    public static class SPThreadPool\r\n    {\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        static SPThreadPool()\r\n        {\r\n            UnityEngine.SceneManagement.SceneManager.sceneLoaded += (sc, m) =>\r\n            {\r\n                PurgeCancellableTasks();\r\n            };\r\n            Resize(0);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Public Interface\r\n        \r\n        public static void Resize(int maxThreads)\r\n        {\r\n            if (maxThreads <= 0)\r\n            {\r\n                //thread-count higher than core-count can be useful on low-core systems\r\n                //otherwise a scheduled task will have to wait for a previously scheduled task\r\n                //async isn't necessarily about using all the cores, but more about performing a task asynchronously\r\n                //of course, you can set the 'maxThreads' manually if you prefer\r\n                if (UnityEngine.Application.isMobilePlatform)\r\n                {\r\n                    maxThreads = Math.Max(UnityEngine.SystemInfo.processorCount, 5);\r\n                }\r\n                else\r\n                {\r\n                    maxThreads = Math.Max(UnityEngine.SystemInfo.processorCount, 10);\r\n                }\r\n\r\n\r\n                //else if (UnityEngine.Application.isWebPlayer)\r\n                //{\r\n                //    //WARNING - this mode technically not supported!\r\n                //    maxThreads = 1;\r\n                //}\r\n            }\r\n\r\n            lock (_lock)\r\n            {\r\n                if (_activeThreads != null)\r\n                {\r\n                    _maxThreadCount = maxThreads;\r\n                    //remove any unneeded waiting threads\r\n                    while (_openThreads.Count > _maxThreadCount)\r\n                    {\r\n                        var thread = _openThreads.Pop();\r\n                        thread.Thread.Interrupt();\r\n                    }\r\n\r\n                    //terminate any threads that are over count\r\n                    int cnt = _maxThreadCount - _openThreads.Count;\r\n                    if (_activeThreads.Count > cnt)\r\n                    {\r\n                        var old = _activeThreads;\r\n                        _activeThreads = new HashSet<ThreadState>();\r\n                        var e = old.GetEnumerator();\r\n                        int i = 0;\r\n                        while (i < cnt && e.MoveNext())\r\n                        {\r\n                            _activeThreads.Add(e.Current);\r\n                            i++;\r\n                        }\r\n                        while (e.MoveNext())\r\n                        {\r\n                            e.Current.IsTerminating = true;\r\n                        }\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    _maxThreadCount = maxThreads;\r\n                    _openThreads = new Stack<ThreadState>(_maxThreadCount);\r\n                    _activeThreads = new HashSet<ThreadState>();\r\n                    _taskQueue = new Queue<TaskInfo>();\r\n                }\r\n            }\r\n        }\r\n\r\n        public static bool QueueUserWorkItem(WaitCallback callback)\r\n        {\r\n            return EnqueueTask(callback, null, false);\r\n        }\r\n\r\n        public static bool QueueUserWorkItem(WaitCallback callback, bool cancelOnLevelLoaded)\r\n        {\r\n            return EnqueueTask(callback, null, cancelOnLevelLoaded);\r\n        }\r\n\r\n        public static bool QueueUserWorkItem(WaitCallback callback, object state)\r\n        {\r\n            return EnqueueTask(callback, state, false);\r\n        }\r\n\r\n        public static bool QueueUserWorkItem(WaitCallback callback, object state, bool cancelOnLevelLoaded)\r\n        {\r\n            return EnqueueTask(callback, state, cancelOnLevelLoaded);\r\n        }\r\n\r\n        public static int GetMaxThreadCount()\r\n        {\r\n            return _maxThreadCount;\r\n        }\r\n\r\n        public static int GetAvailableThreadCount()\r\n        {\r\n            lock (_lock)\r\n            {\r\n                return _maxThreadCount - _activeThreads.Count;\r\n            }\r\n        }\r\n\r\n        public static int GetQueueLength()\r\n        {\r\n            return _taskQueue.Count;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Private Interface\r\n\r\n        #region Fields\r\n\r\n        private static int _maxThreadCount;\r\n        private static Stack<ThreadState> _openThreads;\r\n        private static HashSet<ThreadState> _activeThreads;\r\n        private static Queue<TaskInfo> _taskQueue;\r\n\r\n        private static object _lock = new object();\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n        \r\n        private static bool EnqueueTask(WaitCallback callback, object state, bool cancellable)\r\n        {\r\n            lock (_lock)\r\n            {\r\n                _taskQueue.Enqueue(new TaskInfo(callback, state, cancellable));\r\n                if (_openThreads.Count > 0)\r\n                {\r\n                    var thread = _openThreads.Pop();\r\n                    thread.WaitHandle.Set();\r\n                }\r\n                else if (_activeThreads.Count < _maxThreadCount)\r\n                {\r\n                    var thread = new ThreadState();\r\n                    thread.Thread = new Thread(MultiThreadedTaskCallback);\r\n                    thread.WaitHandle = new AutoResetEvent(true);\r\n                    _activeThreads.Add(thread);\r\n                    thread.Thread.Start(thread);\r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        private static void PurgeThreads()\r\n        {\r\n            lock (_lock)\r\n            {\r\n                if (_activeThreads != null && _activeThreads.Count > 0)\r\n                {\r\n                    var e = _activeThreads.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        e.Current.IsTerminating = true;\r\n                    }\r\n\r\n                    _activeThreads.Clear();\r\n                }\r\n                if (_openThreads != null && _openThreads.Count > 0)\r\n                {\r\n                    var e = _openThreads.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        e.Current.Thread.Interrupt();\r\n                    }\r\n\r\n                    _openThreads.Clear();\r\n                }\r\n\r\n                _maxThreadCount = 0;\r\n                _activeThreads = null;\r\n                _taskQueue = null;\r\n            }\r\n        }\r\n\r\n        private static void PurgeCancellableTasks()\r\n        {\r\n            lock (_lock)\r\n            {\r\n                if (_taskQueue.Count > 0)\r\n                {\r\n                    bool anyCancellable = false;\r\n                    var e = _taskQueue.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (e.Current.Cancellable)\r\n                        {\r\n                            anyCancellable = true;\r\n                            break;\r\n                        }\r\n                    }\r\n\r\n                    if (anyCancellable)\r\n                    {\r\n                        var old = _taskQueue;\r\n                        _taskQueue = new Queue<TaskInfo>();\r\n                        e = old.GetEnumerator();\r\n                        while (e.MoveNext())\r\n                        {\r\n                            if (!e.Current.Cancellable) _taskQueue.Enqueue(e.Current);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n\r\n        private static void MultiThreadedTaskCallback(object data)\r\n        {\r\n            ThreadState state = data as ThreadState;\r\n            if (state == null) return;\r\n\r\n            WaitUntilNextTask:\r\n            state.WaitHandle.WaitOne();\r\n\r\n            GetNextTask:\r\n            if (state.IsTerminating) return;\r\n\r\n            TaskInfo task = default(TaskInfo);\r\n            lock (_lock)\r\n            {\r\n                if (_taskQueue.Count > 0)\r\n                {\r\n                    task = _taskQueue.Dequeue();\r\n                }\r\n                else\r\n                {\r\n                    _activeThreads.Remove(state);\r\n                    if (state.IsTerminating) return;\r\n                    _openThreads.Push(state);\r\n                    goto WaitUntilNextTask;\r\n                }\r\n            }\r\n            if (task.Callback != null) task.Callback(task.State);\r\n\r\n            goto GetNextTask;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private struct TaskInfo\r\n        {\r\n            public WaitCallback Callback;\r\n            public object State;\r\n            public bool Cancellable;\r\n\r\n            public TaskInfo(WaitCallback callback, object state, bool cancellable)\r\n            {\r\n                this.Callback = callback;\r\n                this.State = state;\r\n                this.Cancellable = cancellable;\r\n            }\r\n        }\r\n\r\n        private class ThreadState\r\n        {\r\n\r\n            public Thread Thread;\r\n            public AutoResetEvent WaitHandle;\r\n            public volatile bool IsTerminating;\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n\r\n\r\n    /*\r\n#if SP_LIB\r\n    [Singleton.Config(SingletonLifeCycleRule.LivesForever, ExcludeFromSingletonManager = true, LifeCycleReadOnly = true)]\r\n    public class SPThreadPool : Singleton\r\n    {\r\n\r\n    #region Singleton Interface\r\n\r\n        private static SPThreadPool _instance;\r\n        private static SPThreadPool CreateInstance()\r\n        {\r\n            if (object.ReferenceEquals(_instance, null))\r\n            {\r\n                _instance = Singleton.CreateSpecialInstance<SPThreadPool>(\"Spacepuppy.SPThreadPool\", SingletonLifeCycleRule.LivesForever);\r\n            }\r\n\r\n            return _instance;\r\n        }\r\n\r\n    #endregion\r\n\r\n#else\r\n    public class SPThreadPool : SPComponent\r\n    {\r\n\r\n\r\n        #region Singleton Interface\r\n\r\n        private static SPThreadPool _instance;\r\n        private static SPThreadPool CreateInstance()\r\n        {\r\n            if (object.ReferenceEquals(_instance, null))\r\n            {\r\n                var go = new UnityEngine.GameObject(\"Spacepuppy.SPThreadPool\");\r\n                _instance = go.AddComponent<SPThreadPool>();\r\n                UnityEngine.Object.DontDestroyOnLoad(go);\r\n            }\r\n\r\n            return _instance;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n#endif\r\n\r\n\r\n\r\n        #region Static Interface\r\n\r\n        public static bool Initialized\r\n        {\r\n            get { return _instance != null; }\r\n        }\r\n\r\n        public static void Resize(int maxThreads)\r\n        {\r\n            if(!Initialized)\r\n            {\r\n                CreateInstance();\r\n            }\r\n            _instance.ResizePool(maxThreads);\r\n        }\r\n\r\n        public static bool QueueUserWorkItem(WaitCallback callback)\r\n        {\r\n            if (!Initialized)\r\n            {\r\n                CreateInstance();\r\n                _instance.ResizePool(0);\r\n            }\r\n            return _instance.EnqueueTask(callback, null, false);\r\n        }\r\n\r\n        public static bool QueueUserWorkItem(WaitCallback callback, bool cancelOnLevelLoaded)\r\n        {\r\n            if (!Initialized)\r\n            {\r\n                CreateInstance();\r\n                _instance.ResizePool(0);\r\n            }\r\n            return _instance.EnqueueTask(callback, null, cancelOnLevelLoaded);\r\n        }\r\n\r\n        public static bool QueueUserWorkItem(WaitCallback callback, object state)\r\n        {\r\n            if (!Initialized)\r\n            {\r\n                CreateInstance();\r\n                _instance.ResizePool(0);\r\n            }\r\n            return _instance.EnqueueTask(callback, state, false);\r\n        }\r\n\r\n        public static bool QueueUserWorkItem(WaitCallback callback, object state, bool cancelOnLevelLoaded)\r\n        {\r\n            if (!Initialized)\r\n            {\r\n                CreateInstance();\r\n                _instance.ResizePool(0);\r\n            }\r\n            return _instance.EnqueueTask(callback, state, cancelOnLevelLoaded);\r\n        }\r\n\r\n        public static int GetMaxThreadCount()\r\n        {\r\n            if (!Initialized)\r\n            {\r\n                CreateInstance();\r\n                _instance.ResizePool(0);\r\n            }\r\n            return _instance._maxThreadCount;\r\n        }\r\n\r\n        public static int GetAvailableThreadCount()\r\n        {\r\n            if (!Initialized)\r\n            {\r\n                CreateInstance();\r\n                _instance.ResizePool(0);\r\n            }\r\n            lock (_instance._lock)\r\n            {\r\n                return _instance._maxThreadCount - _instance._activeThreads.Count;\r\n            }\r\n        }\r\n\r\n        public static int GetQueueLength()\r\n        {\r\n            if (!Initialized)\r\n            {\r\n                CreateInstance();\r\n                _instance.ResizePool(0);\r\n            }\r\n            return _instance._taskQueue.Count;\r\n        }\r\n        \r\n#endregion\r\n\r\n#region Instance Interface\r\n        \r\n#region Fields\r\n        \r\n        private int _maxThreadCount;\r\n        private Stack<ThreadState> _openThreads;\r\n        private HashSet<ThreadState> _activeThreads;\r\n        private Queue<TaskInfo> _taskQueue;\r\n\r\n        private object _lock = new object();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnValidAwake()\r\n        {\r\n            base.OnValidAwake();\r\n\r\n            UnityEngine.SceneManagement.SceneManager.sceneLoaded += this.OnSceneWasLoaded;\r\n        }\r\n\r\n        protected override void OnDestroy()\r\n        {\r\n            base.OnDestroy();\r\n\r\n            this.PurgeThreads();\r\n            UnityEngine.SceneManagement.SceneManager.sceneLoaded -= this.OnSceneWasLoaded;\r\n        }\r\n        \r\n        private void OnSceneWasLoaded(UnityEngine.SceneManagement.Scene sc, UnityEngine.SceneManagement.LoadSceneMode mode)\r\n        {\r\n            this.PurgeCancellableTasks();\r\n        }\r\n\r\n#endregion\r\n        \r\n#region Methods\r\n\r\n        private void ResizePool(int maxThreads)\r\n        {\r\n            if (maxThreads <= 0)\r\n            {\r\n                //thread-count higher than core-count can be useful on low-core systems\r\n                //otherwise a scheduled task will have to wait for a previously scheduled task\r\n                //async isn't necessarily about using all the cores, but more about performing a task asynchronously\r\n                //of course, you can set the 'maxThreads' manually if you prefer\r\n                if (UnityEngine.Application.isMobilePlatform)\r\n                {\r\n                    maxThreads = Math.Max(UnityEngine.SystemInfo.processorCount, 5);\r\n                }\r\n                else if(UnityEngine.Application.isWebPlayer)\r\n                {\r\n                    //WARNING - this mode technically not supported!\r\n                    maxThreads = 1;\r\n                }\r\n                else\r\n                {\r\n                    maxThreads = Math.Max(UnityEngine.SystemInfo.processorCount, 10);\r\n                }\r\n            }\r\n\r\n            lock (_lock)\r\n            {\r\n                if(_activeThreads != null)\r\n                {\r\n                    _maxThreadCount = maxThreads;\r\n                    //remove any unneeded waiting threads\r\n                    while(_openThreads.Count > _maxThreadCount)\r\n                    {\r\n                        var thread = _openThreads.Pop();\r\n                        thread.Thread.Interrupt();\r\n                    }\r\n\r\n                    //terminate any threads that are over count\r\n                    int cnt = _maxThreadCount - _openThreads.Count;\r\n                    if(_activeThreads.Count > cnt)\r\n                    {\r\n                        var old = _activeThreads;\r\n                        _activeThreads = new HashSet<ThreadState>();\r\n                        var e = old.GetEnumerator();\r\n                        int i = 0;\r\n                        while(i < cnt && e.MoveNext())\r\n                        {\r\n                            _activeThreads.Add(e.Current);\r\n                            i++;\r\n                        }\r\n                        while(e.MoveNext())\r\n                        {\r\n                            e.Current.IsTerminating = true;\r\n                        }\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    _maxThreadCount = maxThreads;\r\n                    _openThreads = new Stack<ThreadState>(_maxThreadCount);\r\n                    _activeThreads = new HashSet<ThreadState>();\r\n                    _taskQueue = new Queue<TaskInfo>();\r\n                }\r\n            }\r\n        }\r\n\r\n        private bool EnqueueTask(WaitCallback callback, object state, bool cancellable)\r\n        {\r\n            lock(_lock)\r\n            {\r\n                _taskQueue.Enqueue(new TaskInfo(callback, state, cancellable));\r\n                if(_openThreads.Count > 0)\r\n                {\r\n                    var thread = _openThreads.Pop();\r\n                    thread.WaitHandle.Set();\r\n                }\r\n                else if(_activeThreads.Count < _maxThreadCount)\r\n                {\r\n                    var thread = new ThreadState();\r\n                    thread.Thread = new Thread(MultiThreadedTaskCallback);\r\n                    thread.WaitHandle = new AutoResetEvent(true);\r\n                    _activeThreads.Add(thread);\r\n                    thread.Thread.Start(thread);\r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        private void PurgeThreads()\r\n        {\r\n            lock(_lock)\r\n            {\r\n                if(_activeThreads != null && _activeThreads.Count > 0)\r\n                {\r\n                    var e = _activeThreads.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        e.Current.IsTerminating = true;\r\n                    }\r\n\r\n                    _activeThreads.Clear();\r\n                }\r\n                if(_openThreads != null && _openThreads.Count > 0)\r\n                {\r\n                    var e = _openThreads.GetEnumerator();\r\n                    while(e.MoveNext())\r\n                    {\r\n                        e.Current.Thread.Interrupt();\r\n                    }\r\n\r\n                    _openThreads.Clear();\r\n                }\r\n\r\n                _maxThreadCount = 0;\r\n                _activeThreads = null;\r\n                _taskQueue = null;\r\n            }\r\n        }\r\n\r\n        private void PurgeCancellableTasks()\r\n        {\r\n            lock (_lock)\r\n            {\r\n                if (_taskQueue.Count > 0)\r\n                {\r\n                    bool anyCancellable = false;\r\n                    var e = _taskQueue.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (e.Current.Cancellable)\r\n                        {\r\n                            anyCancellable = true;\r\n                            break;\r\n                        }\r\n                    }\r\n\r\n                    if (anyCancellable)\r\n                    {\r\n                        var old = _taskQueue;\r\n                        _taskQueue = new Queue<TaskInfo>();\r\n                        e = old.GetEnumerator();\r\n                        while (e.MoveNext())\r\n                        {\r\n                            if (!e.Current.Cancellable) _taskQueue.Enqueue(e.Current);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n\r\n        private void MultiThreadedTaskCallback(object data)\r\n        {\r\n            ThreadState state = data as ThreadState;\r\n            if (state == null) return;\r\n\r\nWaitUntilNextTask:\r\n            state.WaitHandle.WaitOne();\r\n\r\nGetNextTask:\r\n            if (state.IsTerminating) return;\r\n\r\n            TaskInfo task = default(TaskInfo);\r\n            lock (_lock)\r\n            {\r\n                if (_taskQueue.Count > 0)\r\n                {\r\n                    task = _taskQueue.Dequeue();\r\n                }\r\n                else\r\n                {\r\n                    _activeThreads.Remove(state);\r\n                    if (state.IsTerminating) return;\r\n                    _openThreads.Push(state);\r\n                    goto WaitUntilNextTask;\r\n                }\r\n            }\r\n            if (task.Callback != null) task.Callback(task.State);\r\n\r\n            goto GetNextTask;\r\n        }\r\n\r\n#endregion\r\n\r\n        private struct TaskInfo\r\n        {\r\n            public WaitCallback Callback;\r\n            public object State;\r\n            public bool Cancellable;\r\n\r\n            public TaskInfo(WaitCallback callback, object state, bool cancellable)\r\n            {\r\n                this.Callback = callback;\r\n                this.State = state;\r\n                this.Cancellable = cancellable;\r\n            }\r\n        }\r\n\r\n        private class ThreadState\r\n        {\r\n            \r\n            public Thread Thread;\r\n            public AutoResetEvent WaitHandle;\r\n            public volatile bool IsTerminating;\r\n            \r\n        }\r\n        \r\n#endregion\r\n\r\n    }\r\n    */\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Attributes.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Reflection;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    #region Notification Attributes\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Class, Inherited = false, AllowMultiple = false)]\r\n    public class RequireNotificationReceiverAttribute : System.Attribute\r\n    {\r\n\r\n        public bool GlobalObserverConsidered;\r\n\r\n    }\r\n\r\n    //[System.AttributeUsage(System.AttributeTargets.Method | System.AttributeTargets.Class, AllowMultiple=false, Inherited=true)]\r\n    //public class AutoNotificationHandler : System.Attribute\r\n    //{\r\n\r\n    //}\r\n\r\n    #endregion\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Method)]\r\n    public class SPRemoteCallAttribute : System.Attribute\r\n    {\r\n\r\n\r\n        public static object CallMethod(GameObject target, string methodName, object[] args)\r\n        {\r\n            if (target == null) return null;\r\n\r\n            var arglen = (args != null) ? args.Length : 0;\r\n            var attribType = typeof(SPRemoteCallAttribute);\r\n            const BindingFlags methodBinding = (BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);\r\n\r\n            foreach (var comp in target.GetComponents<Component>())\r\n            {\r\n                var methods = comp.GetType().GetMethods(methodBinding);\r\n\r\n                foreach (var meth in methods)\r\n                {\r\n                    if (meth.Name != methodName) continue;\r\n\r\n                    var attrib = System.Attribute.GetCustomAttribute(meth, attribType);\r\n                    if (attrib == null) continue;\r\n\r\n                    var paramInfos = meth.GetParameters();\r\n                    if (paramInfos.Length != arglen) continue;\r\n\r\n                    bool bFail = false;\r\n                    for (int i = 0; i < arglen; i++)\r\n                    {\r\n                        if (!com.spacepuppy.Utils.TypeUtil.IsType(args[i].GetType(), paramInfos[i].ParameterType))\r\n                        {\r\n                            bFail = true;\r\n                            break;\r\n                        }\r\n                    }\r\n\r\n                    if (bFail) continue;\r\n\r\n                    return meth.Invoke(comp, args);\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n    }\r\n\r\n    //[System.AttributeUsage(System.AttributeTargets.Property | System.AttributeTargets.Field, AllowMultiple = false)]\r\n    //public class DynamicallyAccessibleMemberAttribute : System.Attribute\r\n    //{\r\n\r\n    //}\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/Audio/AudioGroup.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Audio\r\n{\r\n\r\n    [DisallowMultipleComponent()]\r\n    public class AudioGroup : SPComponent, IAudioGroup, ICollection<AudioSource>\r\n    {\r\n\r\n        #region Multiton Interface\r\n\r\n        private static AudioGroupPool _pool = new AudioGroupPool();\r\n        public static AudioGroupPool Pool\r\n        {\r\n            get { return _pool; }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Fields\r\n\r\n        [ReorderableArray()]\r\n        [SerializeField()]\r\n        private List<AudioSource> _managedAudioSources = new List<AudioSource>();\r\n\r\n        [SerializeField()]\r\n        private bool _ignoreGlobalPause = true;\r\n        [SerializeField()]\r\n        private bool _ignoreGlobalVolume = true;\r\n\r\n        [Range(0, 1f)]\r\n        [SerializeField()]\r\n        private float _volume = 1.0f;\r\n        [SerializeField()]\r\n        private bool _paused;\r\n\r\n        [System.NonSerialized()]\r\n        private bool _globallyPaused;\r\n\r\n        [System.NonSerialized()]\r\n        private List<AudioSource> _pausedPool;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            _pool.AddReference(this);\r\n            _volume = Mathf.Clamp01(_volume);\r\n        }\r\n\r\n        protected override void Start()\r\n        {\r\n            base.Start();\r\n\r\n            foreach (var src in this.transform.GetChildComponents<AudioSource>(true))\r\n            {\r\n                this.Add(src);\r\n            }\r\n        }\r\n\r\n        protected override void OnDestroy()\r\n        {\r\n            base.OnDestroy();\r\n\r\n            for (int i = 0; i < _managedAudioSources.Count; i++)\r\n            {\r\n                if (_managedAudioSources[i] != null) Object.Destroy(_managedAudioSources[i]);\r\n            }\r\n            _managedAudioSources.Clear();\r\n            _pool.RemoveReference(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool IgnoreGlobalPause\r\n        {\r\n            get { return _ignoreGlobalPause; }\r\n            set\r\n            {\r\n                if (_ignoreGlobalPause == value) return;\r\n                _ignoreGlobalPause = value;\r\n                for (int i = 0; i < _managedAudioSources.Count; i++)\r\n                {\r\n                    _managedAudioSources[i].ignoreListenerPause = _ignoreGlobalPause;\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool IgnoreGlobalVolume\r\n        {\r\n            get { return _ignoreGlobalVolume; }\r\n            set\r\n            {\r\n                if (_ignoreGlobalVolume == value) return;\r\n                _ignoreGlobalVolume = value;\r\n                for(int i = 0; i < _managedAudioSources.Count; i++)\r\n                {\r\n                    _managedAudioSources[i].ignoreListenerVolume = _ignoreGlobalVolume;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        internal void SetGloballyPaused(bool paused)\r\n        {\r\n            if (_globallyPaused == paused) return;\r\n            _globallyPaused = paused;\r\n            \r\n        }\r\n\r\n        public bool TryAdd(AudioSource item)\r\n        {\r\n            if (_pool.IsManaged(item))\r\n            {\r\n                //Debug.LogWarning(\"AudioSource is already managed by another group. An AudioSource can only be a member of one group at a time.\", item);\r\n                return false;\r\n            }\r\n\r\n            this.Add_Imp(item);\r\n            return true;\r\n        }\r\n\r\n        private void Add_Imp(AudioSource item)\r\n        {\r\n            item.ignoreListenerPause = _ignoreGlobalPause;\r\n            item.ignoreListenerVolume = _ignoreGlobalVolume;\r\n            item.volume = _volume;\r\n            _managedAudioSources.Add(item);\r\n\r\n            if (_paused && item.isPlaying)\r\n            {\r\n                if (_pausedPool == null) _pausedPool = new List<AudioSource>();\r\n                item.Pause();\r\n                _pausedPool.Add(item);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAudioGroup Interface\r\n\r\n        public float Volume\r\n        {\r\n            get { return _volume; }\r\n            set\r\n            {\r\n                _volume = Mathf.Clamp01(value);\r\n                for (int i = 0; i < _managedAudioSources.Count; i++)\r\n                {\r\n                    _managedAudioSources[i].volume = _volume;\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool Paused\r\n        {\r\n            get { return _paused; }\r\n        }\r\n\r\n        public void Pause()\r\n        {\r\n            _paused = true;\r\n            if (_pausedPool == null) _pausedPool = new List<AudioSource>();\r\n\r\n            for (int i = 0; i < _managedAudioSources.Count; i++)\r\n            {\r\n                var src = _managedAudioSources[i];\r\n                if (src.isPlaying)\r\n                {\r\n                    src.Pause();\r\n                    _pausedPool.Add(src);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void UnPause()\r\n        {\r\n            _paused = false;\r\n            if (_pausedPool == null) return;\r\n\r\n            for (int i = 0; i < _pausedPool.Count; i++)\r\n            {\r\n                _pausedPool[i].Play();\r\n            }\r\n            _pausedPool.Clear();\r\n        }\r\n\r\n        public void PlayAll()\r\n        {\r\n            for(int i = 0; i < _managedAudioSources.Count; i++)\r\n            {\r\n                _managedAudioSources[i].Play();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        public int Count\r\n        {\r\n            get { return _managedAudioSources.Count; }\r\n        }\r\n\r\n        bool ICollection<AudioSource>.IsReadOnly\r\n        {\r\n            get { throw new System.NotImplementedException(); }\r\n        }\r\n\r\n        public void Add(AudioSource item)\r\n        {\r\n            if (_pool.IsManaged(item))\r\n            {\r\n                throw new System.ArgumentException(\"AudioSource is already managed by another group. An AudioSource can only be a member of one group at a time.\", \"item\");\r\n                //Debug.LogWarning(\"AudioSource is already managed by another group. An AudioSource can only be a member of one group at a time.\", item);\r\n                //return;\r\n            }\r\n\r\n            this.Add_Imp(item);\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            for(int i = 0; i < _managedAudioSources.Count; i++)\r\n            {\r\n                _managedAudioSources[i].ignoreListenerPause = false;\r\n                _managedAudioSources[i].ignoreListenerVolume = false;\r\n            }\r\n            _managedAudioSources.Clear();\r\n        }\r\n\r\n        public bool Contains(AudioSource item)\r\n        {\r\n            return _managedAudioSources.Contains(item);\r\n        }\r\n\r\n        public void CopyTo(AudioSource[] array, int arrayIndex)\r\n        {\r\n            _managedAudioSources.CopyTo(array, arrayIndex);\r\n        }\r\n\r\n        public bool Remove(AudioSource item)\r\n        {\r\n            if(_managedAudioSources.Remove(item))\r\n            {\r\n                if(item != null)\r\n                {\r\n                    //because the AudioSource may have been destroyed\r\n                    item.ignoreListenerPause = false;\r\n                    item.ignoreListenerVolume = false;\r\n                }\r\n                return true;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        public IEnumerator<AudioSource> GetEnumerator()\r\n        {\r\n            return _managedAudioSources.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public class AudioGroupPool : com.spacepuppy.Collections.MultitonPool<AudioGroup>\r\n        {\r\n            public bool IsManaged(AudioSource src)\r\n            {\r\n                if (src == null) return false;\r\n\r\n                var e = this.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    if (e.Current.Contains(src)) return true;\r\n                }\r\n                return false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Audio/AudioManager.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Audio\r\n{\r\n\r\n    public interface IAudioManager : IService\r\n    {\r\n\r\n        /// <summary>\r\n        /// The configured volume of the game. This is the volume that if all audio sources were at max, this is what it would sound at.\r\n        /// </summary>\r\n        float MasterVolume { get; set; }\r\n        /// <summary>\r\n        /// Allows you to fade the MasterVolume with out actually modifying it.\r\n        /// </summary>\r\n        float FadeVolume { get; set; }\r\n\r\n        AudioSource BackgroundAmbientAudioSource { get; }\r\n\r\n    }\r\n\r\n    [RequireComponent(typeof(AudioSource))]\r\n    public class AudioManager : ServiceComponent<IAudioManager>, IAudioManager\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [System.NonSerialized]\r\n        private float _masterVolume;\r\n        [System.NonSerialized]\r\n        private float _fadeVolume;\r\n\r\n        [System.NonSerialized]\r\n        private AudioSource _backgroundAmbientAudioSource;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnValidAwake()\r\n        {\r\n            base.OnValidAwake();\r\n\r\n            _masterVolume = AudioListener.volume;\r\n            _fadeVolume = 1f;\r\n            _backgroundAmbientAudioSource = this.AddOrGetComponent<AudioSource>();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IAudioManager Interface\r\n\r\n        public float MasterVolume\r\n        {\r\n            get { return _masterVolume; }\r\n            set\r\n            {\r\n                _masterVolume = Mathf.Clamp01(value);\r\n                AudioListener.volume = _masterVolume * _fadeVolume;\r\n            }\r\n        }\r\n\r\n        public float FadeVolume\r\n        {\r\n            get { return _fadeVolume; }\r\n            set\r\n            {\r\n                _fadeVolume = Mathf.Clamp01(value);\r\n                AudioListener.volume = _masterVolume * _fadeVolume;\r\n            }\r\n        }\r\n\r\n        public AudioSource BackgroundAmbientAudioSource\r\n        {\r\n            get { return _backgroundAmbientAudioSource; }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n\r\n\r\n\r\n    [System.Obsolete]\r\n    internal static class AudioManager_Old\r\n    {\r\n\r\n        #region Singleton Interface\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        private static GlobalAudioSourceGroup _globalAudioSources = new GlobalAudioSourceGroup();\r\n        private static UnmanagedAudioSourceGroup _unmanagedAudioSources = new UnmanagedAudioSourceGroup();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        /// <summary>\r\n        /// A group that represents all audiosources globally. This can be used for controlling the global volume and pausing. \r\n        /// Those groups flagged to ignore the global pausing/volume will not be effected here. \r\n        /// Note, looping over this can be very expensive as it utilizes Object.FindObjectsOfType, do not do so unless necessary.\r\n        /// </summary>\r\n        public static IAudioGroup Global { get { return _globalAudioSources; } }\r\n\r\n        /// <summary>\r\n        /// A collection that represents all AudioSources that aren't otherwise part of a group. \r\n        /// Looping over the entries in this collection is expensive as it utilizes a Object.FindObjectsOfType call, do not do so unless necessary!\r\n        /// </summary>\r\n        public static IEnumerable<AudioSource> Unmanaged { get { return _unmanagedAudioSources; } }\r\n        \r\n        #endregion\r\n        \r\n        #region Special Types\r\n        \r\n        private class GlobalAudioSourceGroup : IAudioGroup\r\n        {\r\n\r\n            internal GlobalAudioSourceGroup()\r\n            {\r\n\r\n            }\r\n\r\n            #region IAudioGroup INterface\r\n\r\n            public float Volume\r\n            {\r\n                get\r\n                {\r\n                    return AudioListener.volume;\r\n                }\r\n                set\r\n                {\r\n                    AudioListener.volume = value;\r\n                }\r\n            }\r\n\r\n            public bool Paused\r\n            {\r\n                get { return AudioListener.pause; }\r\n            }\r\n\r\n            public void Pause()\r\n            {\r\n                AudioListener.pause = true;\r\n            }\r\n\r\n            public void UnPause()\r\n            {\r\n                AudioListener.pause = false;\r\n            }\r\n\r\n            public void PlayAll()\r\n            {\r\n                foreach(var src in this)\r\n                {\r\n                    src.Play();\r\n                }\r\n            }\r\n            \r\n            public bool Contains(AudioSource src)\r\n            {\r\n                return true;\r\n            }\r\n\r\n            public IEnumerator<AudioSource> GetEnumerator()\r\n            {\r\n                return (Object.FindObjectsOfType<AudioSource>() as IEnumerable<AudioSource>).GetEnumerator();\r\n            }\r\n\r\n            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n            {\r\n                return this.GetEnumerator();\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        /// <summary>\r\n        /// Represents all the audiosources that aren't part of a group.\r\n        /// </summary>\r\n        private class UnmanagedAudioSourceGroup : IEnumerable<AudioSource>\r\n        {\r\n\r\n            internal UnmanagedAudioSourceGroup()\r\n            {\r\n\r\n            }\r\n\r\n            #region IEnumerable Interface\r\n\r\n            public IEnumerator<AudioSource> GetEnumerator()\r\n            {\r\n                var e = AudioGroup.Pool.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    var e2 = e.Current.GetEnumerator();\r\n                    while(e2.MoveNext())\r\n                    {\r\n                        yield return e2.Current;\r\n                    }\r\n                }\r\n            }\r\n\r\n            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n            {\r\n                return this.GetEnumerator();\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Audio/IAudioGroup.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Audio\r\n{\r\n\r\n    public interface IAudioGroup : IEnumerable<AudioSource>\r\n    {\r\n\r\n        float Volume { get; set; }\r\n        bool Paused { get; }\r\n\r\n        void Pause();\r\n        void UnPause();\r\n        void PlayAll();\r\n        bool Contains(AudioSource src);\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Audio/i_PlayAmbientAudio.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Audio\r\n{\r\n    \r\n    public class i_PlayAmbientAudio : AutoTriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n        \r\n        [SerializeField()]\r\n        [ReorderableArray()]\r\n        private AudioClip[] _clips;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Interrupt\")]\r\n        private AudioInterruptMode _interrupt = AudioInterruptMode.StopIfPlaying;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Delay\")]\r\n        [TimeUnitsSelector()]\r\n        private float _delay;\r\n\r\n        [Tooltip(\"Trigger something at the end of the sound effect. This is NOT perfectly accurate and really just starts a timer for the duration of the sound being played.\")]\r\n        [SerializeField()]\r\n        private Trigger _onAudioComplete;\r\n\r\n        [System.NonSerialized()]\r\n        private System.IDisposable _completeRoutine;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float Delay\r\n        {\r\n            get { return _delay; }\r\n        }\r\n\r\n        public AudioInterruptMode Interrupt\r\n        {\r\n            get { return _interrupt; }\r\n            set { _interrupt = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void OnAudioComplete()\r\n        {\r\n            _completeRoutine = null;\r\n            _onAudioComplete.ActivateTrigger(this, null);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITriggerableMechanism Interface\r\n\r\n        public override bool CanTrigger\r\n        {\r\n            get\r\n            {\r\n                return base.CanTrigger && _clips != null && _clips.Length > 0;\r\n            }\r\n        }\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var manager = Services.Get<IAudioManager>();\r\n            if (manager == null || manager.BackgroundAmbientAudioSource == null)\r\n            {\r\n                Debug.LogWarning(\"Failed to play audio due to a lack of AudioManager.\", this);\r\n                return false;\r\n            }\r\n\r\n            var src = manager.BackgroundAmbientAudioSource;\r\n            if (src == null)\r\n            {\r\n                Debug.LogWarning(\"Failed to play audio due to a lack of BackgroundAmbientAudioSource on the AudioManager.\", this);\r\n                return false;\r\n            }\r\n\r\n            if (src.isPlaying)\r\n            {\r\n                switch (this.Interrupt)\r\n                {\r\n                    case AudioInterruptMode.StopIfPlaying:\r\n                        if (_completeRoutine != null) _completeRoutine.Dispose();\r\n                        _completeRoutine = null;\r\n                        src.Stop();\r\n                        break;\r\n                    case AudioInterruptMode.DoNotPlayIfPlaying:\r\n                        return false;\r\n                    case AudioInterruptMode.PlayOverExisting:\r\n                        //play one shot over existing audio\r\n                        break;\r\n                }\r\n            }\r\n\r\n            var clip = _clips[Random.Range(0, _clips.Length)];\r\n            //src.clip = clip;\r\n\r\n            if (clip != null)\r\n            {\r\n                if (_delay > 0)\r\n                {\r\n                    this.InvokeGuaranteed(() =>\r\n                    {\r\n                        if (src != null)\r\n                        {\r\n                            _completeRoutine = this.InvokeGuaranteed(this.OnAudioComplete, clip.length, SPTime.Real);\r\n                            //src.Play();\r\n                            src.PlayOneShot(clip);\r\n                        }\r\n                    }, _delay);\r\n                }\r\n                else\r\n                {\r\n                    _completeRoutine = this.InvokeGuaranteed(this.OnAudioComplete, clip.length, SPTime.Real);\r\n                    //src.Play();\r\n                    src.PlayOneShot(clip);\r\n                }\r\n\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/AudioSettings.cs",
    "content": "﻿using UnityEngine;\n\nnamespace com.spacepuppy\n{\n\n    [System.Flags]\n    public enum AudioSettingsMask\n    {\n        Clip = 1,\n        Volume = 2,\n        Loop = 4\n    }\n\n    [System.Serializable]\n    public struct AudioSettings\n    {\n\n        #region Fields\n\n        public AudioClip clip;\n        [Range(0f, 1f)]\n        public float volume;\n        public bool loop;\n\n        #endregion\n\n        #region Methods\n        \n        public void Apply(AudioSource src)\n        {\n            src.clip = this.clip;\n            src.volume = this.volume;\n            src.loop = this.loop;\n        }\n\n        public void Apply(AudioSource src, AudioSettingsMask mask)\n        {\n            if ((mask & AudioSettingsMask.Clip) != 0) src.clip = this.clip;\n            if ((mask & AudioSettingsMask.Volume) != 0) src.volume = this.volume;\n            if ((mask & AudioSettingsMask.Loop) != 0) src.loop = this.loop;\n        }\n\n        #endregion\n\n        #region Static Interface\n\n        public static readonly AudioSettings Default = new AudioSettings()\n        {\n            clip = null,\n            volume = 1f,\n            loop = false\n        };\n\n        public static AudioSettings From(AudioSource src)\n        {\n            return new AudioSettings()\n            {\n                clip = src.clip,\n                volume = src.volume,\n                loop = src.loop\n            };\n        }\n\n        #endregion\n\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/AutoNotificationManager.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n    internal class AutoNotificationManager\r\n    {\r\n\r\n        private MonoBehaviour _behaviour;\r\n        private Dictionary<System.Type, System.Delegate> _handlers;\r\n\r\n        public AutoNotificationManager(MonoBehaviour behaviour)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            _behaviour = behaviour;\r\n            _handlers = new Dictionary<System.Type, System.Delegate>();\r\n            this.Init();\r\n        }\r\n\r\n        private void Init()\r\n        {\r\n            var baseDelType = typeof(System.Action<>);\r\n            foreach (var m in GetMethodInfos(_behaviour.GetType()))\r\n            {\r\n                var notifType = m.GetParameters()[0].ParameterType;\r\n                var delType = baseDelType.MakeGenericType(notifType);\r\n                var deleg = System.Delegate.CreateDelegate(delType, _behaviour, m, false);\r\n                if (deleg == null) continue;\r\n\r\n                if (!_handlers.ContainsKey(notifType))\r\n                {\r\n                    _handlers.Add(notifType, deleg);\r\n                }\r\n                else\r\n                {\r\n                    _handlers[notifType] = System.Delegate.Combine(_handlers[notifType], deleg);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void OnNotification(object sender, Notification n)\r\n        {\r\n            var notifType = n.GetType();\r\n            var baseNotifType = typeof(Notification);\r\n            while (baseNotifType.IsAssignableFrom(notifType))\r\n            {\r\n                if (_handlers.ContainsKey(notifType))\r\n                {\r\n                    _handlers[notifType].DynamicInvoke(sender, n);\r\n                }\r\n                notifType = notifType.BaseType;\r\n            }\r\n        }\r\n\r\n\r\n\r\n\r\n        private static Dictionary<System.Type, System.Reflection.MethodInfo[]> _quickLookupTable;\r\n        private static void LoadLookupTable()\r\n        {\r\n            _quickLookupTable = new Dictionary<System.Type, System.Reflection.MethodInfo[]>();\r\n\r\n            //var behTp = typeof(MonoBehaviour);\r\n            //var attribType = typeof(AutoNotificationHandler);\r\n            //var baseNotifType = typeof(Notification);\r\n            //var voidType = typeof(void);\r\n            //var types = from ass in System.AppDomain.CurrentDomain.GetAssemblies()\r\n            //            from tp in ass.GetTypes()\r\n            //            where behTp.IsAssignableFrom(tp) && System.Attribute.IsDefined(tp, attribType, true)\r\n            //            select tp;\r\n            //foreach (var tp in types)\r\n            //{\r\n            //    var methods = from m in tp.GetMethods(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic)\r\n            //                  where m.ReturnType == voidType &&\r\n            //                  System.Attribute.IsDefined(m, attribType, true)\r\n            //                  let p = m.GetParameters()\r\n            //                  where p.Length == 1 && baseNotifType.IsAssignableFrom(p[0].ParameterType)\r\n            //                  select m;\r\n            //    if (methods.Count() > 0)\r\n            //    {\r\n            //        _quickLookupTable.Add(tp, methods.ToArray());\r\n            //    }\r\n            //}\r\n        }\r\n\r\n        private static System.Reflection.MethodInfo[] GetMethodInfos(System.Type tp)\r\n        {\r\n            if (_quickLookupTable == null) LoadLookupTable();\r\n\r\n            if (_quickLookupTable.ContainsKey(tp)) return _quickLookupTable[tp];\r\n            else return new System.Reflection.MethodInfo[0];\r\n        }\r\n\r\n        public static bool TypeHasAutoHandlers(System.Type tp)\r\n        {\r\n            if (_quickLookupTable == null) LoadLookupTable();\r\n\r\n            return _quickLookupTable.ContainsKey(tp);\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Cameras/CameraCategory.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Cameras\r\n{\r\n    public enum CameraCategory\r\n    {\r\n        Other = 31,\r\n        Gameplay = 0,\r\n        UI = 1\r\n    }\r\n\r\n    [System.Flags]\r\n    public enum CameraCategoryMask\r\n    {\r\n        Gameplay = 1,\r\n        UI = 2,\r\n        Other = (1 << 31)\r\n    }\r\n    \r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Cameras/CameraManager.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.SceneManagement;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\nusing System.Collections;\r\n\r\nnamespace com.spacepuppy.Cameras\r\n{\r\n\r\n    public static class CameraPool\r\n    {\r\n\r\n        #region Static Interface\r\n\r\n        private static HashSet<ICamera> _cameras = new HashSet<ICamera>();\r\n\r\n        #endregion\r\n\r\n        #region Events\r\n\r\n        public static event System.EventHandler<CameraRegistrationEvent> CameraRegistered;\r\n        public static event System.EventHandler<CameraRegistrationEvent> CameraUnregistered;\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Camera considered the main currently. This is the first camera found with 'MainCamera' tag, if not manually set.\r\n        /// </summary>\r\n        public static ICamera Main\r\n        {\r\n            get\r\n            {\r\n                var manager = Services.Get<ICameraManager>();\r\n                if (manager != null)\r\n                    return manager.Main;\r\n\r\n                var cam = Camera.main;\r\n                if (cam != null)\r\n                    return cam.AddOrGetComponent<UnityCamera>();\r\n\r\n                return null;\r\n            }\r\n            set\r\n            {\r\n                var manager = Services.Get<ICameraManager>();\r\n                if (manager != null)\r\n                    manager.Main = value;\r\n            }\r\n        }\r\n\r\n        public static void Register(ICamera cam)\r\n        {\r\n            if (cam == null) throw new System.ArgumentNullException(\"cam\");\r\n            if (GameLoopEntry.ApplicationClosing) return;\r\n            if(_cameras.Add(cam))\r\n            {\r\n                var e = CameraRegistered;\r\n                if (e != null)\r\n                {\r\n                    var ev = CameraRegistrationEvent.GetTemp(cam);\r\n                    e(null, ev);\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n        public static void Unregister(ICamera cam)\r\n        {\r\n            if (cam == null) throw new System.ArgumentNullException(\"cam\");\r\n            if (GameLoopEntry.ApplicationClosing) return;\r\n            if(_cameras.Remove(cam))\r\n            {\r\n                var e = CameraUnregistered;\r\n                if(e != null)\r\n                {\r\n                    var ev = CameraRegistrationEvent.GetTemp(cam);\r\n                    e(null, ev);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<ICamera> All\r\n        {\r\n            get\r\n            {\r\n                return _cameras;\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<ICamera> Group(string tag)\r\n        {\r\n            var e = _cameras.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                if (e.Current.gameObject.HasTag(tag)) yield return e.Current;\r\n            }\r\n        }\r\n\r\n\r\n        public static ICamera[] FindAllCameraControllers(System.Func<ICamera, bool> predicate = null)\r\n        {\r\n            using (var coll = com.spacepuppy.Collections.TempCollection.GetCollection<ICamera>())\r\n            {\r\n                FindAllCameraControllers(coll, predicate);\r\n                return coll.ToArray();\r\n            }\r\n        }\r\n\r\n        public static void FindAllCameraControllers(System.Collections.Generic.ICollection<ICamera> coll, System.Func<ICamera, bool> predicate = null)\r\n        {\r\n            if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n\r\n            if (predicate == null)\r\n            {\r\n                var e = _cameras.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    coll.Add(e.Current);\r\n                }\r\n\r\n                var ucams = Camera.allCameras;\r\n                foreach (var c in ucams)\r\n                {\r\n                    coll.Add(c.AddOrGetComponent<UnityCamera>());\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var e = _cameras.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (predicate(e.Current)) coll.Add(e.Current);\r\n                }\r\n\r\n                var ucams = Camera.allCameras;\r\n                foreach (var c in ucams)\r\n                {\r\n                    var uc = c.AddOrGetComponent<UnityCamera>();\r\n                    if (predicate(uc)) coll.Add(uc);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static ICamera FindCameraController(System.Func<ICamera, bool> predicate)\r\n        {\r\n            var e = _cameras.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                if (predicate(e.Current)) return e.Current;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static ICamera FindCameraController(Camera cam)\r\n        {\r\n            var e = _cameras.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                if (e.Current.Contains(cam)) return e.Current;\r\n            }\r\n\r\n            return cam.AddOrGetComponent<UnityCamera>();\r\n        }\r\n\r\n        public static ICamera FindTaggedMainCamera()\r\n        {\r\n            var e = _cameras.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                if (e.Current.gameObject.HasTag(SPConstants.TAG_MAINCAMERA))\r\n                {\r\n                    return e.Current;\r\n                }\r\n            }\r\n\r\n            var cams = Camera.allCameras;\r\n            foreach (var cam in cams)\r\n            {\r\n                if (cam.HasTag(SPConstants.TAG_MAINCAMERA))\r\n                {\r\n                    return cam.AddOrGetComponent<UnityCamera>();\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n\r\n        public static Enumerator GetEnumerator()\r\n        {\r\n            return new Enumerator(_cameras);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public struct Enumerator : IEnumerator<ICamera>\r\n        {\r\n\r\n            #region Fields\r\n\r\n            private HashSet<ICamera>.Enumerator _e;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            internal Enumerator(HashSet<ICamera> set)\r\n            {\r\n                _e = set.GetEnumerator();\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IEnumerator Interface\r\n\r\n            public ICamera Current\r\n            {\r\n                get\r\n                {\r\n                    return _e.Current;\r\n                }\r\n            }\r\n\r\n            object IEnumerator.Current\r\n            {\r\n                get\r\n                {\r\n                    return _e.Current;\r\n                }\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                return _e.MoveNext();\r\n            }\r\n\r\n            void IEnumerator.Reset()\r\n            {\r\n                (_e as IEnumerator).Reset();\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                _e.Dispose();\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    public interface ICameraManager : IService\r\n    {\r\n\r\n        ICamera Main { get; set; }\r\n        \r\n    }\r\n\r\n    public class CameraManager : ServiceComponent<ICameraManager>, ICameraManager\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        private ICamera _main;\r\n        private bool _overrideAsNull;\r\n        \r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnValidAwake()\r\n        {\r\n            base.OnValidAwake();\r\n\r\n            if (this.MainNeedsSyncing())\r\n            {\r\n                this.ForceSyncTaggedMainCamera();\r\n            }\r\n\r\n            CameraPool.CameraRegistered += OnRegistered;\r\n            CameraPool.CameraUnregistered += OnUnregistered;\r\n            SceneManager.sceneLoaded += this.OnSceneWasLoaded;\r\n        }\r\n\r\n        protected override void OnDestroy()\r\n        {\r\n            base.OnDestroy();\r\n\r\n            CameraPool.CameraRegistered -= OnRegistered;\r\n            CameraPool.CameraUnregistered -= OnUnregistered;\r\n            SceneManager.sceneLoaded -= this.OnSceneWasLoaded;\r\n        }\r\n\r\n        private void OnSceneWasLoaded(Scene sc, LoadSceneMode mode)\r\n        {\r\n            if (this.MainNeedsSyncing())\r\n            {\r\n                this.ForceSyncTaggedMainCamera();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void ForceSyncTaggedMainCamera()\r\n        {\r\n            _main = CameraPool.FindTaggedMainCamera();\r\n            _overrideAsNull = false;\r\n        }\r\n\r\n        private bool MainNeedsSyncing()\r\n        {\r\n            if (_main == null)\r\n                return !_overrideAsNull;\r\n            else\r\n                return !_main.IsAlive;\r\n        }\r\n\r\n        private bool AnyNonUnityCamerasContains(Camera c)\r\n        {\r\n            var e = CameraPool.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                if (!(e.Current is UnityCamera) && e.Current.Contains(c)) return true;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Event Handlers\r\n\r\n        private void OnRegistered(object sender, CameraRegistrationEvent e)\r\n        {\r\n            if (this.started && this.MainNeedsSyncing())\r\n            {\r\n                this.ForceSyncTaggedMainCamera();\r\n            }\r\n        }\r\n\r\n        private void OnUnregistered(object sender, CameraRegistrationEvent e)\r\n        {\r\n            var cam = e.Camera;\r\n            if (_main == cam)\r\n            {\r\n                _main = null;\r\n                if (this.started && !GameLoopEntry.ApplicationClosing)\r\n                {\r\n                    this.ForceSyncTaggedMainCamera();\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICameraManager Interface\r\n\r\n        public ICamera Main\r\n        {\r\n            get\r\n            {\r\n                if (this.MainNeedsSyncing()) this.ForceSyncTaggedMainCamera();\r\n                return _main;\r\n            }\r\n            set\r\n            {\r\n                _main = value;\r\n                _overrideAsNull = (value == null);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    /*\r\n    [Singleton.Config(SingletonLifeCycleRule.LivesForever, ExcludeFromSingletonManager = true, LifeCycleReadOnly = true)]\r\n    public class CameraManager : Singleton, IEnumerable<ICamera>\r\n    {\r\n\r\n        #region Singleton Interface\r\n\r\n        private static CameraManager _instance;\r\n        internal static CameraManager Instance\r\n        {\r\n            get\r\n            {\r\n                if (object.ReferenceEquals(_instance, null)) _instance = Singleton.CreateSpecialInstance<CameraManager>(\"Spacepuppy.CameraManager\", SingletonLifeCycleRule.LivesForever);\r\n                return _instance;\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<ICamera> Cameras\r\n        {\r\n            get\r\n            {\r\n                return Instance;\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<ICamera> CameraGroup(string tag)\r\n        {\r\n            var e = Instance.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if (e.Current.gameObject.HasTag(tag)) yield return e.Current;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n        \r\n        /// <summary>\r\n        /// Camera considered the main currently. This is the first camera found with 'MainCamera' tag, if not manually set.\r\n        /// </summary>\r\n        public static ICamera Main\r\n        {\r\n            get\r\n            {\r\n                var inst = CameraManager.Instance;\r\n                if (inst.MainNeedsSyncing()) CameraManager.ForceSyncTaggedMainCamera();\r\n                return inst._main;\r\n            }\r\n            set\r\n            {\r\n                var inst = CameraManager.Instance;\r\n                inst._main = value;\r\n                inst._overrideAsNull = (value == null);\r\n            }\r\n        }\r\n\r\n        public static ICamera[] FindAllCameraControllers(System.Func<ICamera, bool> predicate = null)\r\n        {\r\n            using (var coll = com.spacepuppy.Collections.TempCollection.GetCollection<ICamera>())\r\n            {\r\n                FindAllCameraControllers(coll, predicate);\r\n                return coll.ToArray();\r\n            }\r\n        }\r\n\r\n        public static void FindAllCameraControllers(System.Collections.Generic.ICollection<ICamera> coll, System.Func<ICamera, bool> predicate = null)\r\n        {\r\n            if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n\r\n            if(predicate == null)\r\n            {\r\n                var e = CameraManager.Instance._cameras.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    coll.Add(e.Current);\r\n                }\r\n\r\n                var ucams = Camera.allCameras;\r\n                foreach (var c in ucams)\r\n                {\r\n                    coll.Add(c.AddOrGetComponent<UnityCamera>());\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var e = CameraManager.Instance._cameras.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (predicate(e.Current)) coll.Add(e.Current);\r\n                }\r\n\r\n                var ucams = Camera.allCameras;\r\n                foreach (var c in ucams)\r\n                {\r\n                    var uc = c.AddOrGetComponent<UnityCamera>();\r\n                    if (predicate(uc)) coll.Add(uc);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static ICamera FindCameraController(System.Func<ICamera, bool> predicate)\r\n        {\r\n            var e = CameraManager.Instance._cameras.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if (predicate(e.Current)) return e.Current;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static ICamera FindCameraController(Camera cam)\r\n        {\r\n            var lst = CameraManager.Instance._cameras;\r\n            var e = lst.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if (e.Current.Contains(cam)) return e.Current;\r\n            }\r\n\r\n            return cam.AddOrGetComponent<UnityCamera>();\r\n        }\r\n\r\n        public static ICamera FindTaggedMainCamera()\r\n        {\r\n            var e = CameraManager.Instance._cameras.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                if (e.Current.gameObject.HasTag(SPConstants.TAG_MAINCAMERA))\r\n                {\r\n                    return e.Current;\r\n                }\r\n            }\r\n\r\n            var cams = Camera.allCameras;\r\n            foreach (var cam in cams)\r\n            {\r\n                if (cam.HasTag(SPConstants.TAG_MAINCAMERA))\r\n                {\r\n                    return cam.AddOrGetComponent<UnityCamera>();\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static void ForceSyncTaggedMainCamera()\r\n        {\r\n            var inst = CameraManager.Instance;\r\n            inst._main = CameraManager.FindTaggedMainCamera();\r\n            inst._overrideAsNull = false;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n\r\n        #region Instance Interface\r\n\r\n        #region Fields\r\n\r\n        private HashSet<ICamera> _cameras = new HashSet<ICamera>();\r\n\r\n        private ICamera _main;\r\n        private bool _overrideAsNull;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnValidAwake()\r\n        {\r\n            if(this.MainNeedsSyncing())\r\n            {\r\n                CameraManager.ForceSyncTaggedMainCamera();\r\n            }\r\n\r\n            SceneManager.sceneLoaded += this.OnSceneWasLoaded;\r\n        }\r\n\r\n        protected override void OnDestroy()\r\n        {\r\n            base.OnDestroy();\r\n\r\n            SceneManager.sceneLoaded -= this.OnSceneWasLoaded;\r\n        }\r\n        \r\n        private void OnSceneWasLoaded(Scene sc, LoadSceneMode mode)\r\n        {\r\n            if (this.MainNeedsSyncing())\r\n            {\r\n                CameraManager.ForceSyncTaggedMainCamera();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        internal static void Register(ICamera cam)\r\n        {\r\n            if (GameLoopEntry.ApplicationClosing) return;\r\n            CameraManager.Instance.Register_Imp(cam);\r\n        }\r\n        private void Register_Imp(ICamera cam)\r\n        {\r\n            if (_cameras.Contains(cam)) return;\r\n\r\n            _cameras.Add(cam);\r\n            if (this.started && this.MainNeedsSyncing())\r\n            {\r\n                CameraManager.ForceSyncTaggedMainCamera();\r\n            }\r\n        }\r\n\r\n        internal static void UnRegister(ICamera cam)\r\n        {\r\n            if (GameLoopEntry.ApplicationClosing) return;\r\n            CameraManager.Instance.UnRegister_Imp(cam);\r\n        }\r\n        private void UnRegister_Imp(ICamera cam)\r\n        {\r\n            if (cam == null) return;\r\n\r\n            if (_cameras.Contains(cam)) _cameras.Remove(cam);\r\n            if (_main == cam)\r\n            {\r\n                _main = null;\r\n                if (this.started && !GameLoopEntry.ApplicationClosing)\r\n                {\r\n                    CameraManager.ForceSyncTaggedMainCamera();\r\n                }\r\n            }\r\n        }\r\n        \r\n\r\n\r\n        private bool MainNeedsSyncing()\r\n        {\r\n            if (_main == null)\r\n                return !_overrideAsNull;\r\n            else\r\n                return !_main.IsAlive;\r\n        }\r\n\r\n        private bool AnyNonUnityCamerasContains(Camera c)\r\n        {\r\n            var e = _cameras.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                if (!(e.Current is UnityCamera) && e.Current.Contains(c)) return true;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public IEnumerator<ICamera> GetEnumerator()\r\n        {\r\n            return _cameras.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _cameras.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #endregion\r\n\r\n    }\r\n    */\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Cameras/CameraNode.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.Cameras\r\n{\r\n    public class CameraNode : SPComponent, IStateModifier\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [VariantCollection.AsPropertyList(typeof(CameraToken))]\r\n        private VariantCollection _cameraSettings = new VariantCollection();\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n        \r\n        public VariantCollection CameraSettings\r\n        {\r\n            get { return _cameraSettings; }\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region IModifier Interface\r\n\r\n        void IStateModifier.CopyTo(object targ)\r\n        {\r\n            _cameraSettings.CopyTo(targ);\r\n        }\r\n\r\n        void IStateModifier.LerpTo(object targ, float t)\r\n        {\r\n            _cameraSettings.LerpTo(targ, t);\r\n        }\r\n\r\n        void IStateModifier.Modify(object targ)\r\n        {\r\n            var cam = ComponentUtil.GetComponentFromSource<Camera>(targ);\r\n            if (cam == null) return;\r\n\r\n            _cameraSettings.CopyTo(cam);\r\n        }\r\n\r\n        void IStateModifier.ModifyWith(object targ, object source)\r\n        {\r\n            var cam = ComponentUtil.GetComponentFromSource<Camera>(targ);\r\n            if (cam == null) return;\r\n\r\n            DynamicUtil.CopyState(cam, source);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Cameras/CameraToken.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Cameras\r\n{\r\n\r\n    /// <summary>\r\n    /// Stores the state of a Camera.\r\n    /// </summary>\r\n    [System.Serializable()]\r\n    public struct CameraToken\r\n    {\r\n\r\n        #region Fields\r\n\r\n        public CameraClearFlags clearFlags;\r\n        public Color backgroundColor;\r\n        public LayerMask cullingMask;\r\n        public bool orthographic;\r\n        public float orthographicSize;\r\n        public float fieldOfView;\r\n        public float nearClipPlane;\r\n        public float farClipPlane;\r\n        public Rect rect;\r\n        public float depth;\r\n        public RenderingPath renderingPath;\r\n        public RenderTexture targetTexture;\r\n        public bool useOcclusionCulling;\r\n        public bool hdr;\r\n\r\n        #endregion\r\n        \r\n        #region Methods\r\n        \r\n        public void Apply(Camera camera)\r\n        {\r\n            camera.clearFlags = this.clearFlags;\r\n            camera.backgroundColor = this.backgroundColor;\r\n            camera.cullingMask = this.cullingMask;\r\n            camera.orthographic = this.orthographic;\r\n            camera.orthographicSize = this.orthographicSize;\r\n            camera.fieldOfView = this.fieldOfView;\r\n            camera.nearClipPlane = this.nearClipPlane;\r\n            camera.farClipPlane = this.farClipPlane;\r\n            camera.rect = this.rect;\r\n            camera.depth = this.depth;\r\n            camera.renderingPath = this.renderingPath;\r\n            camera.targetTexture = this.targetTexture;\r\n            camera.useOcclusionCulling = this.useOcclusionCulling;\r\n            //camera.hdr = this.hdr;\r\n            camera.allowHDR = this.hdr;\r\n        }\r\n\r\n        public static CameraToken FromCamera(Camera camera)\r\n        {\r\n            return new CameraToken() {\r\n                clearFlags = camera.clearFlags,\r\n                backgroundColor = camera.backgroundColor,\r\n                cullingMask = camera.cullingMask,\r\n                orthographic = camera.orthographic,\r\n                orthographicSize = camera.orthographicSize,\r\n                fieldOfView = camera.fieldOfView,\r\n                nearClipPlane = camera.nearClipPlane,\r\n                farClipPlane = camera.farClipPlane,\r\n                rect = camera.rect,\r\n                depth = camera.depth,\r\n                renderingPath = camera.renderingPath,\r\n                targetTexture = camera.targetTexture,\r\n                useOcclusionCulling = camera.useOcclusionCulling,\r\n                hdr = camera.allowHDR // camera.hdr\r\n            };\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Cameras/Events.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Cameras\r\n{\r\n\r\n    /// <summary>\r\n    /// This event is considered temporary, only use for the life of the event handler, and no longer.\r\n    /// </summary>\r\n    public class CameraRegistrationEvent : System.EventArgs\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private ICamera _camera;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public CameraRegistrationEvent(ICamera camera)\r\n        {\r\n            _camera = camera;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ICamera Camera\r\n        {\r\n            get { return _camera; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n\r\n        private static CameraRegistrationEvent _event;\r\n\r\n        public static CameraRegistrationEvent GetTemp(ICamera cam)\r\n        {\r\n            if(_event != null)\r\n            {\r\n                var ev = _event;\r\n                _event = null;\r\n                ev._camera = cam;\r\n                return ev;\r\n            }\r\n            else\r\n            {\r\n                return new CameraRegistrationEvent(cam);\r\n            }\r\n        }\r\n\r\n        public static void Release(CameraRegistrationEvent ev)\r\n        {\r\n            if (ev == null) return;\r\n\r\n            ev._camera = null;\r\n            if(_event == null)\r\n            {\r\n                _event = ev;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Cameras/ICamera.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Cameras\r\n{\r\n    public interface ICamera : IGameObjectSource\r\n    {\r\n\r\n        CameraCategory Category { get; set; }\r\n\r\n        /// <summary>\r\n        /// The camera this ICamera currently represents. Can vary if this ICamera handles multiple cameras. \r\n        /// If this ICamera currnetly handles multiple active cameras, this is the one considered most important.\r\n        /// </summary>\r\n        Camera camera { get; }\r\n        \r\n        bool IsAlive { get; }\r\n\r\n        /// <summary>\r\n        /// Does this ICamera manage the supplied camera.\r\n        /// </summary>\r\n        /// <param name=\"cam\"></param>\r\n        /// <returns></returns>\r\n        bool Contains(Camera cam);\r\n\r\n    }\r\n\r\n    public interface IMultiCamera : ICamera, IEnumerable<Camera>\r\n    {\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Cameras/LegacyRender/GlobalPostProcessorHook.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Cameras.LegacyRender\r\n{\r\n\r\n    /*\r\n    [RequireComponent(typeof(Camera))]\r\n    internal sealed class GlobalPostProcessorHook : SPComponent\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private ICamera _camera;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnStartOrEnable()\r\n        {\r\n            base.OnStartOrEnable();\r\n\r\n            if (_camera.IsNullOrDestroyed())\r\n            {\r\n                ObjUtil.SmartDestroy(this);\r\n            }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void OnRenderImage(RenderTexture source, RenderTexture destination)\r\n        {\r\n            if(_camera == null)\r\n            {\r\n                Graphics.Blit(source, destination);\r\n                ObjUtil.SmartDestroy(this);\r\n                return;\r\n            }\r\n\r\n            var manager = Services.Get<IPostProcessingManager>();\r\n            if(manager == null)\r\n            {\r\n                Graphics.Blit(source, destination);\r\n                this.enabled = false;\r\n                return;\r\n            }\r\n\r\n            if(!manager.ApplyGlobalPostProcessing(_camera, source, destination))\r\n            {\r\n                manager.SetDirty();\r\n                Graphics.Blit(source, destination);\r\n                this.enabled = false;\r\n                return;\r\n            }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Static Interface\r\n        \r\n        public static void EnableHook(ICamera camera)\r\n        {\r\n            if (camera == null) throw new System.ArgumentNullException(\"camera\");\r\n\r\n            if(camera is IMultiCamera)\r\n            {\r\n                foreach(var c in (camera as IMultiCamera))\r\n                {\r\n                    var hook = c.AddOrGetComponent<GlobalPostProcessorHook>();\r\n                    hook._camera = camera;\r\n                    hook.enabled = true;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var hook = camera.camera.AddOrGetComponent<GlobalPostProcessorHook>();\r\n                hook._camera = camera;\r\n                hook.enabled = true;\r\n            }\r\n        }\r\n\r\n        public static void DisableHook(ICamera camera)\r\n        {\r\n            if (camera == null) throw new System.ArgumentNullException(\"camera\");\r\n\r\n            if (camera is IMultiCamera)\r\n            {\r\n                foreach (var c in (camera as IMultiCamera))\r\n                {\r\n                    var hook = c.GetComponent<GlobalPostProcessorHook>();\r\n                    if (hook != null) hook.enabled = false;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var hook = camera.camera.GetComponent<GlobalPostProcessorHook>();\r\n                if (hook != null) hook.enabled = false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n    */\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Cameras/LegacyRender/IPostProcessingEffect.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Cameras.LegacyRender\r\n{\r\n\r\n    public interface IPostProcessingEffect\r\n    {\r\n\r\n        bool enabled { get; set; }\r\n\r\n        void RenderImage(ICamera camera, RenderTexture source, RenderTexture destination);\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Cameras/LegacyRender/PostProcessingManager.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.Cameras.LegacyRender\r\n{\r\n\r\n    public interface IPostProcessingManager : IService\r\n    {\r\n\r\n        IList<IPostProcessingEffect> GlobalEffects { get; }\r\n\r\n        /// <summary>\r\n        /// Applies all global post processing effects.\r\n        /// </summary>\r\n        /// <param name=\"source\"></param>\r\n        /// <param name=\"destination\"></param>\r\n        /// <param name=\"callback\"></param>\r\n        /// <returns>Returns true if effects were processed.</returns>\r\n        bool ApplyGlobalPostProcessing(ICamera camera, RenderTexture source, RenderTexture destination);\r\n\r\n    }\r\n\r\n    public class PostProcessingManager : ServiceComponent<IPostProcessingManager>, IPostProcessingManager\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        [TypeRestriction(typeof(IPostProcessingEffect))]\r\n        private List<UnityEngine.Object> _globalEffects;\r\n\r\n        [System.NonSerialized]\r\n        private GlobalEffectsList _globalEffectsBindingList;\r\n        [System.NonSerialized]\r\n        private GlobalEffectCamera _globalEffectsCamera;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnValidAwake()\r\n        {\r\n            base.OnValidAwake();\r\n\r\n            if (_globalEffects == null)\r\n            {\r\n                _globalEffects = new List<UnityEngine.Object>();\r\n            }\r\n            else\r\n            {\r\n                for (int i = 0; i < _globalEffects.Count; i++)\r\n                {\r\n                    if (_globalEffects[i] == null)\r\n                    {\r\n                        _globalEffects.RemoveAt(i);\r\n                        i--;\r\n                    }\r\n                }\r\n            }\r\n\r\n            _globalEffectsBindingList = new GlobalEffectsList(this);\r\n            if (_globalEffects.Count > 0) this.EffectsListChanged();\r\n        }\r\n\r\n        protected override void OnDestroy()\r\n        {\r\n            base.OnDestroy();\r\n\r\n            if(_globalEffectsCamera != null)\r\n            {\r\n                ObjUtil.SmartDestroy(_globalEffectsCamera.gameObject);\r\n                ObjUtil.SmartDestroy(_globalEffectsCamera);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void EffectsListChanged()\r\n        {\r\n            if(_globalEffects.Count == 0)\r\n            {\r\n                if(_globalEffectsCamera != null && _globalEffectsCamera.gameObject.activeSelf)\r\n                {\r\n                    _globalEffectsCamera.gameObject.SetActive(false);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if(_globalEffectsCamera == null)\r\n                {\r\n                    var go = new GameObject(\"Spacepuppy.GlobalPostProcessingEffects\");\r\n                    UnityEngine.Object.DontDestroyOnLoad(go);\r\n\r\n                    _globalEffectsCamera = go.AddComponent<GlobalEffectCamera>();\r\n                    _globalEffectsCamera.Init(this);\r\n                    go.SetActive(true);\r\n                }\r\n                else\r\n                {\r\n                    _globalEffectsCamera.enabled = true;\r\n                    _globalEffectsCamera.gameObject.SetActive(true);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region IPostProcessingManager Interface\r\n\r\n        public IList<IPostProcessingEffect> GlobalEffects { get { return _globalEffectsBindingList; } }\r\n\r\n        public bool ApplyGlobalPostProcessing(ICamera camera, RenderTexture source, RenderTexture destination)\r\n        {\r\n            if (_globalEffects.Count == 0) return false;\r\n            \r\n            if(_globalEffects.Count == 1)\r\n            {\r\n                var effect = _globalEffects[0] as IPostProcessingEffect;\r\n                if(_globalEffects[0] == null || effect == null)\r\n                {\r\n                    _globalEffects.RemoveAt(0);\r\n                    this.EffectsListChanged();\r\n                    Graphics.Blit(source, destination);\r\n                }\r\n                else if(effect.enabled)\r\n                {\r\n                    effect.RenderImage(camera, source, destination);\r\n                }\r\n                else\r\n                {\r\n                    Graphics.Blit(source, destination);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                using (var set = com.spacepuppy.Collections.TempCollection.GetSet<RenderTexture>())\r\n                {\r\n                    var src = source;\r\n\r\n                    for (int i = 0; i < _globalEffects.Count; i++)\r\n                    {\r\n                        var effect = _globalEffects[i] as IPostProcessingEffect;\r\n                        if (_globalEffects[i] == null || effect == null)\r\n                        {\r\n                            _globalEffects.RemoveAt(i);\r\n                            this.EffectsListChanged();\r\n                            i--;\r\n                        }\r\n                        else if(effect.enabled)\r\n                        {\r\n                            var dest = RenderTexture.GetTemporary(src.width, src.height);\r\n                            set.Add(dest);\r\n\r\n                            effect.RenderImage(camera, src, dest);\r\n\r\n                            src = dest;\r\n                        }\r\n                    }\r\n\r\n                    Graphics.Blit(src, destination);\r\n\r\n                    var e = set.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        RenderTexture.ReleaseTemporary(e.Current);\r\n                    }\r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private class GlobalEffectsList : IList<IPostProcessingEffect>\r\n        {\r\n\r\n            #region Fields\r\n\r\n            private PostProcessingManager _owner;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            public GlobalEffectsList(PostProcessingManager owner)\r\n            {\r\n                _owner = owner;\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Properties\r\n\r\n            public int Count\r\n            {\r\n                get { return _owner._globalEffects.Count; }\r\n            }\r\n\r\n            public bool IsReadOnly\r\n            {\r\n                get { return false; }\r\n            }\r\n\r\n            public IPostProcessingEffect this[int index]\r\n            {\r\n                get { return _owner._globalEffects[index] as IPostProcessingEffect; }\r\n                set\r\n                {\r\n                    if (value == null) throw new System.ArgumentNullException(\"value\");\r\n                    var obj = ObjUtil.GetAsFromSource<UnityEngine.Object>(value);\r\n                    if (obj == null) throw new System.ArgumentException(\"value must be a UnityEngine.Object\", \"value\");\r\n                    _owner._globalEffects[index] = obj;\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Methods\r\n\r\n            public void Add(IPostProcessingEffect item)\r\n            {\r\n                if (item == null) throw new System.ArgumentNullException(\"item\");\r\n                var obj = ObjUtil.GetAsFromSource<UnityEngine.Object>(item);\r\n                if (obj == null) throw new System.ArgumentException(\"item must be a UnityEngine.Object\", \"value\");\r\n\r\n                _owner._globalEffects.Add(obj);\r\n                _owner.EffectsListChanged();\r\n            }\r\n\r\n            public void Insert(int index, IPostProcessingEffect item)\r\n            {\r\n                if (item == null) throw new System.ArgumentNullException(\"item\");\r\n                var obj = ObjUtil.GetAsFromSource<UnityEngine.Object>(item);\r\n                if (obj == null) throw new System.ArgumentException(\"item must be a UnityEngine.Object\", \"value\");\r\n\r\n                _owner._globalEffects.Insert(index, obj);\r\n                _owner.EffectsListChanged();\r\n            }\r\n\r\n            public bool Remove(IPostProcessingEffect item)\r\n            {\r\n                var obj = ObjUtil.GetAsFromSource<UnityEngine.Object>(item);\r\n                if (obj == null) return false;\r\n\r\n                if (_owner._globalEffects.Remove(obj))\r\n                {\r\n                    if (_owner._globalEffects.Count == 0)\r\n                    {\r\n                        _owner.EffectsListChanged();\r\n                    }\r\n                    return true;\r\n                }\r\n\r\n                return false;\r\n            }\r\n\r\n            public void RemoveAt(int index)\r\n            {\r\n                _owner._globalEffects.RemoveAt(index);\r\n                if (_owner._globalEffects.Count == 0)\r\n                {\r\n                    _owner.EffectsListChanged();\r\n                }\r\n            }\r\n\r\n            public void Clear()\r\n            {\r\n                if (_owner._globalEffects.Count == 0) return;\r\n\r\n                _owner._globalEffects.Clear();\r\n                _owner.EffectsListChanged();\r\n            }\r\n\r\n            public bool Contains(IPostProcessingEffect item)\r\n            {\r\n                return _owner._globalEffects.Contains(item);\r\n            }\r\n\r\n            public void CopyTo(IPostProcessingEffect[] array, int arrayIndex)\r\n            {\r\n                if (array == null) throw new System.ArgumentNullException(\"array\");\r\n\r\n                for(int i = 0; i < _owner._globalEffects.Count; i++)\r\n                {\r\n                    int j = i + arrayIndex;\r\n                    if (j >= array.Length) return;\r\n\r\n                    array[j] = _owner._globalEffects[i] as IPostProcessingEffect;\r\n                }\r\n            }\r\n\r\n            public int IndexOf(IPostProcessingEffect item)\r\n            {\r\n                var obj = ObjUtil.GetAsFromSource<UnityEngine.Object>(item);\r\n                if (obj == null) return -1;\r\n\r\n                return _owner._globalEffects.IndexOf(obj);\r\n            }\r\n\r\n            public IEnumerator<IPostProcessingEffect> GetEnumerator()\r\n            {\r\n                for(int i = 0; i < _owner._globalEffects.Count; i++)\r\n                {\r\n                    yield return _owner._globalEffects[i] as IPostProcessingEffect;\r\n                }\r\n            }\r\n\r\n            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n            {\r\n                return _owner._globalEffects.GetEnumerator();\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        private class GlobalEffectCamera : MonoBehaviour, ICamera\r\n        {\r\n\r\n            #region Fields\r\n\r\n            private PostProcessingManager _manager;\r\n            private Camera _camera;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            private void Awake()\r\n            {\r\n                _camera = this.AddOrGetComponent<Camera>();\r\n                _camera.clearFlags = CameraClearFlags.Nothing;\r\n                _camera.cullingMask = 0;\r\n                _camera.depth = float.MaxValue;\r\n            }\r\n\r\n            public void Init(PostProcessingManager manager)\r\n            {\r\n                _manager = manager;\r\n            }\r\n\r\n            private void OnEnable()\r\n            {\r\n                _camera.enabled = true;\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Methods\r\n\r\n            private void OnRenderImage(RenderTexture source, RenderTexture destination)\r\n            {\r\n                if (_manager == null) return;\r\n\r\n                if (_manager._globalEffects.Count == 0)\r\n                {\r\n                    _manager.EffectsListChanged();\r\n                    return;\r\n                }\r\n\r\n                _manager.ApplyGlobalPostProcessing(this, source, destination);\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region ICamera Interface\r\n\r\n            CameraCategory ICamera.Category\r\n            {\r\n                get { return CameraCategory.Other; }\r\n                set { }\r\n            }\r\n\r\n            bool ICamera.IsAlive\r\n            {\r\n                get { return this.gameObject != null && this.gameObject.activeInHierarchy; }\r\n            }\r\n\r\n            Camera ICamera.camera\r\n            {\r\n                get { return _camera; }\r\n            }\r\n\r\n            bool ICamera.Contains(Camera cam)\r\n            {\r\n                return !object.ReferenceEquals(cam, null) && object.ReferenceEquals(cam, _camera);\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n\r\n    /*\r\n    public interface IPostProcessingManager : IService\r\n    {\r\n\r\n        void SetDirty();\r\n        \r\n        /// <summary>\r\n        /// Applies all global post processing effects.\r\n        /// </summary>\r\n        /// <param name=\"source\"></param>\r\n        /// <param name=\"destination\"></param>\r\n        /// <param name=\"callback\"></param>\r\n        /// <returns>Returns true if effects were processed.</returns>\r\n        bool ApplyGlobalPostProcessing(ICamera camera, RenderTexture source, RenderTexture destination);\r\n\r\n    }\r\n\r\n    public class PostProcessingManager : ServiceComponent<IPostProcessingManager>, IPostProcessingManager\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private GlobalEffectsList _globalEffects;\r\n\r\n        private bool _dirty;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnValidAwake()\r\n        {\r\n            base.OnValidAwake();\r\n\r\n            _globalEffects = new GlobalEffectsList(this);\r\n            CameraPool.CameraRegistered += OnRegistered;\r\n            CameraPool.CameraUnregistered += OnUnregistered;\r\n        }\r\n\r\n        protected override void OnDestroy()\r\n        {\r\n            base.OnDestroy();\r\n\r\n            CameraPool.CameraRegistered -= OnRegistered;\r\n            CameraPool.CameraUnregistered -= OnUnregistered;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IList<IPostProcessingEffect> GlobalEffects\r\n        {\r\n            get { return _globalEffects; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void EnableGlobalHooks()\r\n        {\r\n            var e = CameraPool.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                GlobalPostProcessorHook.EnableHook(e.Current);\r\n            }\r\n            _dirty = false;\r\n        }\r\n\r\n        private void DisableGlobalHooks()\r\n        {\r\n            var e = CameraPool.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                GlobalPostProcessorHook.DisableHook(e.Current);\r\n            }\r\n            _dirty = false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Event Handlers\r\n\r\n        private void OnRegistered(object sender, CameraRegistrationEvent e)\r\n        {\r\n            if(_globalEffects.Count > 0)\r\n            {\r\n                GlobalPostProcessorHook.EnableHook(e.Camera);\r\n            }\r\n            else\r\n            {\r\n                _dirty = true;\r\n            }\r\n        }\r\n\r\n        private void OnUnregistered(object sender, CameraRegistrationEvent e)\r\n        {\r\n            if (e.Camera != null) GlobalPostProcessorHook.DisableHook(e.Camera);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IPostProcessingManager Interface\r\n\r\n        public void SetDirty()\r\n        {\r\n            _dirty = true;\r\n        }\r\n        \r\n        public bool ApplyGlobalPostProcessing(ICamera camera, RenderTexture source, RenderTexture destination)\r\n        {\r\n            if (_globalEffects.Count == 0) return false;\r\n\r\n            using (var set = com.spacepuppy.Collections.TempCollection.GetSet<RenderTexture>())\r\n            {\r\n                var src = source;\r\n\r\n                for (int i = 0; i < _globalEffects.Count; i++)\r\n                {\r\n                    var effect = _globalEffects[i];\r\n                    if (effect != null && effect.enabled)\r\n                    {\r\n                        var dest = RenderTexture.GetTemporary(src.width, src.height);\r\n                        set.Add(dest);\r\n\r\n                        effect.RenderImage(camera, src, dest);\r\n\r\n                        src = dest;\r\n                    }\r\n                }\r\n\r\n                Graphics.Blit(src, destination);\r\n\r\n                var e = set.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    RenderTexture.ReleaseTemporary(e.Current);\r\n                }\r\n            }\r\n                \r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private class GlobalEffectsList : IList<IPostProcessingEffect>\r\n        {\r\n\r\n            #region Fields\r\n\r\n            private PostProcessingManager _owner;\r\n            private List<IPostProcessingEffect> _lst = new List<IPostProcessingEffect>();\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            public GlobalEffectsList(PostProcessingManager owner)\r\n            {\r\n                _owner = owner;\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Properties\r\n\r\n            public int Count\r\n            {\r\n                get { return _lst.Count; }\r\n            }\r\n\r\n            public bool IsReadOnly\r\n            {\r\n                get { return false; }\r\n            }\r\n\r\n            public IPostProcessingEffect this[int index]\r\n            {\r\n                get { return _lst[index]; }\r\n                set\r\n                {\r\n                    if (value == null) throw new System.ArgumentNullException(\"value\");\r\n                    _lst[index] = value;\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Methods\r\n\r\n            public void Add(IPostProcessingEffect item)\r\n            {\r\n                if (item == null) throw new System.ArgumentNullException(\"item\");\r\n\r\n                _lst.Add(item);\r\n                if (_owner._dirty)\r\n                {\r\n                    _owner.EnableGlobalHooks();\r\n                }\r\n            }\r\n\r\n            public void Insert(int index, IPostProcessingEffect item)\r\n            {\r\n                if (item == null) throw new System.ArgumentNullException(\"item\");\r\n\r\n                _lst.Insert(index, item);\r\n                if(_owner._dirty)\r\n                {\r\n                    _owner.EnableGlobalHooks();\r\n                }\r\n            }\r\n\r\n            public bool Remove(IPostProcessingEffect item)\r\n            {\r\n                if(_lst.Remove(item))\r\n                {\r\n                    if(_lst.Count == 0)\r\n                    {\r\n                        _owner.DisableGlobalHooks();\r\n                    }\r\n                    return true;\r\n                }\r\n\r\n                return false;\r\n            }\r\n\r\n            public void RemoveAt(int index)\r\n            {\r\n                _lst.RemoveAt(index);\r\n                if(_lst.Count == 0)\r\n                {\r\n                    _owner.DisableGlobalHooks();\r\n                }\r\n            }\r\n\r\n            public void Clear()\r\n            {\r\n                if (_lst.Count == 0) return;\r\n\r\n                _lst.Clear();\r\n                _owner.DisableGlobalHooks();\r\n            }\r\n\r\n            public bool Contains(IPostProcessingEffect item)\r\n            {\r\n                return _lst.Contains(item);\r\n            }\r\n\r\n            public void CopyTo(IPostProcessingEffect[] array, int arrayIndex)\r\n            {\r\n                _lst.CopyTo(array, arrayIndex);\r\n            }\r\n\r\n            public int IndexOf(IPostProcessingEffect item)\r\n            {\r\n                return _lst.IndexOf(item);\r\n            }\r\n\r\n            public IEnumerator<IPostProcessingEffect> GetEnumerator()\r\n            {\r\n                return _lst.GetEnumerator();\r\n            }\r\n\r\n            IEnumerator IEnumerable.GetEnumerator()\r\n            {\r\n                return _lst.GetEnumerator();\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n    */\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Cameras/Movement/CameraMovementController.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.StateMachine;\r\n\r\nnamespace com.spacepuppy.Cameras.Movement\r\n{\r\n\r\n    /// <summary>\r\n    /// A state machine for moving a camera.\r\n    /// </summary>\r\n    public class CameraMovementController : SPComponent\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"TargetCamera\")]\r\n        [DefaultFromSelf()]\r\n        private Transform _targetCamera;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"TetherTarget\")]\r\n        [Tooltip(\"A target that can be used by a movement style when updating the camera position.\")]\r\n        private Transform _tetherTarget;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"UseUpdateSequence\")]\r\n        private UpdateSequence _useUpdateSequence = UpdateSequence.Update;\r\n\r\n        [DisableOnPlay()]\r\n        [SerializeField()]\r\n        [Tooltip(\"Camera states can be attached to GameObject children of this. Note - this makes changing states slower.\")]\r\n        private bool _allowStatesAsChildren;\r\n        \r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"StartingCameraStyle\")]\r\n        private Component _startingCameraStyle;\r\n\r\n\r\n\r\n        [System.NonSerialized()]\r\n        private ITypedStateMachine<ICameraMovementControllerState> _stateMachine;\r\n\r\n        [System.NonSerialized()]\r\n        private Coroutine _updateRoutine;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            if(_allowStatesAsChildren)\r\n            {\r\n                _stateMachine = TypedStateMachine<ICameraMovementControllerState>.CreateFromParentComponentSource(this.gameObject, true, false);\r\n            }\r\n            else\r\n            {\r\n                _stateMachine = TypedStateMachine<ICameraMovementControllerState>.CreateFromComponentSource(this.gameObject);\r\n            }\r\n            _stateMachine.StateChanged += this.OnStateChanged_Internal;\r\n        }\r\n\r\n        protected override void Start()\r\n        {\r\n            base.Start();\r\n\r\n            if (_startingCameraStyle is ICameraMovementControllerState)\r\n            {\r\n                if (_stateMachine.Contains(_startingCameraStyle as ICameraMovementControllerState))\r\n                {\r\n                    _stateMachine.ChangeState(_startingCameraStyle as ICameraMovementControllerState);\r\n                }\r\n            }\r\n        }\r\n\r\n        protected override void OnStartOrEnable()\r\n        {\r\n            base.OnStartOrEnable();\r\n\r\n            _updateRoutine = this.StartCoroutine(this.UpdateRoutine());\r\n        }\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            if (!this.started) return;\r\n            if (_stateMachine.Current != null) _stateMachine.Current.OnResumed();\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            if (_stateMachine.Current != null) _stateMachine.Current.OnPaused();\r\n\r\n            if (_updateRoutine != null) this.StopCoroutine(_updateRoutine);\r\n            _updateRoutine = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Transform TargetCamera\r\n        {\r\n            get { return _targetCamera; }\r\n            set { _targetCamera = value; }\r\n        }\r\n\r\n        public Transform TetherTarget\r\n        {\r\n            get { return _tetherTarget; }\r\n            set { _tetherTarget = value; }\r\n        }\r\n\r\n        public UpdateSequence UseUpdateSequence\r\n        {\r\n            get { return _useUpdateSequence; }\r\n            set { _useUpdateSequence = value; }\r\n        }\r\n\r\n        public ICameraMovementControllerState StartingCameraStyle\r\n        {\r\n            get { return _startingCameraStyle as ICameraMovementControllerState; }\r\n            set { _startingCameraStyle = value as Component; }\r\n        }\r\n\r\n        public ITypedStateMachine<ICameraMovementControllerState> States { get { return _stateMachine; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void SnapToTarget()\r\n        {\r\n            if (_stateMachine.Current != null)\r\n            {\r\n                _stateMachine.Current.SnapToTarget();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region UpdateRoutine\r\n\r\n        private System.Collections.IEnumerator UpdateRoutine()\r\n        {\r\n            var waitForFixed = new WaitForFixedUpdate();\r\n            var waitForLate = new WaitForEndOfFrame();\r\n\r\n            Restart:\r\n\r\n            switch(_useUpdateSequence)\r\n            {\r\n                case UpdateSequence.None:\r\n                case UpdateSequence.Update:\r\n                    yield return null;\r\n                    break;\r\n                case UpdateSequence.FixedUpdate:\r\n                    yield return waitForFixed;\r\n                    break;\r\n                case UpdateSequence.LateUpdate:\r\n                    yield return waitForLate;\r\n                    break;\r\n            }\r\n\r\n            if (_useUpdateSequence != UpdateSequence.None && _stateMachine.Current != null)\r\n            {\r\n                _stateMachine.Current.UpdateMovement();\r\n            }\r\n\r\n            goto Restart;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Handlers\r\n        \r\n        private void OnStateChanged_Internal(object sender, StateChangedEventArgs<ICameraMovementControllerState> e)\r\n        {\r\n            if (e.FromState != null)\r\n            {\r\n                e.FromState.Deactivate();\r\n            }\r\n\r\n            this.OnStateChanged(e);\r\n\r\n            if (e.ToState != null)\r\n            {\r\n                e.ToState.Activate(this);\r\n            }\r\n        }\r\n\r\n        protected virtual void OnStateChanged(StateChangedEventArgs<ICameraMovementControllerState> e)\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Cameras/Movement/ICameraMovementControllerState.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Cameras.Movement\r\n{\r\n\r\n    public interface ICameraMovementControllerState\r\n    {\r\n\r\n        /// <summary>\r\n        /// Entering this state.\r\n        /// </summary>\r\n        /// <param name=\"controller\"></param>\r\n        void Activate(CameraMovementController controller);\r\n\r\n        /// <summary>\r\n        /// Exiting this state.\r\n        /// </summary>\r\n        void Deactivate();\r\n\r\n        /// <summary>\r\n        /// The controller has been paused, react accordingly if necessary.\r\n        /// </summary>\r\n        void OnPaused();\r\n\r\n        /// <summary>\r\n        /// The controller resumed after being paused, react accordingly.\r\n        /// </summary>\r\n        void OnResumed();\r\n\r\n        /// <summary>\r\n        /// Update the movement per frame.\r\n        /// </summary>\r\n        void UpdateMovement();\r\n\r\n        /// <summary>\r\n        /// If the movement style follows some target (like the TetherTarget), snap to it immediately.\r\n        /// </summary>\r\n        void SnapToTarget();\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Cameras/MultiCameraController.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.StateMachine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Cameras\r\n{\r\n\r\n    /// <summary>\r\n    /// A state machine of multiple cameras that are children of this. Only one is ever enabled, allowing multiple cameras to act as one. \r\n    /// It's easiest if you move just the GameObject this is attached to, rather than the child cameras individually. Zeroing out the local \r\n    /// position of the various cameras inside of this.\r\n    /// </summary>\r\n    public class MultiCameraController : SPComponent, IMultiCamera\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private TypedStateMachine<Camera> _stateMachine;\r\n\r\n        [SerializeField]\r\n        private CameraCategory _type;\r\n\r\n        [SerializeField()]\r\n        private Camera _defaultCamera;\r\n\r\n        [SerializeField()]\r\n        private Camera[] _ignoreCameras;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            CameraPool.Register(this);\r\n\r\n            _stateMachine = TypedStateMachine<Camera>.CreateFromParentComponentSource(this.gameObject, false, false);\r\n            _stateMachine.StateChanged += this.OnStateChanged;\r\n        }\r\n\r\n        protected override void Start()\r\n        {\r\n            base.Start();\r\n\r\n            if(_stateMachine.Current == null)\r\n            {\r\n                _stateMachine.ChangeState(this.DefaultCamera);\r\n            }\r\n        }\r\n\r\n        protected override void OnDestroy()\r\n        {\r\n            base.OnDestroy();\r\n\r\n            CameraPool.Unregister(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Camera CurrentCamera\r\n        {\r\n            get { return _stateMachine.Current; }\r\n        }\r\n\r\n        public IStateMachine<Camera> States\r\n        {\r\n            get { return _stateMachine; }\r\n        }\r\n\r\n        public Camera DefaultCamera\r\n        {\r\n            get { return _defaultCamera; }\r\n            set\r\n            {\r\n                _defaultCamera = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Handlers\r\n\r\n        private void OnStateChanged(object sender, StateChangedEventArgs<Camera> e)\r\n        {\r\n            if (_ignoreCameras != null && _ignoreCameras.Length > 0)\r\n            {\r\n                foreach (var c in _stateMachine)\r\n                {\r\n                    if (c != e.ToState && _ignoreCameras.IndexOf(c) < 0) c.gameObject.SetActive(false);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                foreach (var c in _stateMachine)\r\n                {\r\n                    if (c != e.ToState) c.gameObject.SetActive(false);\r\n                }\r\n            }\r\n\r\n            if (e.ToState != null)\r\n            {\r\n                if (!e.ToState.gameObject.activeSelf) e.ToState.gameObject.SetActive(true);\r\n                //if (this.HasTag(SPConstants.TAG_MAINCAMERA))\r\n                //{\r\n                //    if(Camera.main == null || _stateMachine.Contains(Camera.main))\r\n                //    {\r\n                        \r\n                //    }\r\n                //}\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICamera Interface\r\n\r\n        public CameraCategory Category\r\n        {\r\n            get { return _type; }\r\n            set { _type = value; }\r\n        }\r\n        \r\n        public new Camera camera\r\n        {\r\n            get { return _stateMachine.Current; }\r\n        }\r\n        Camera ICamera.camera\r\n        {\r\n            get { return _stateMachine.Current; }\r\n        }\r\n\r\n        public bool IsAlive { get { return _stateMachine.Current != null; } }\r\n\r\n        public bool Contains(Camera cam)\r\n        {\r\n            return _stateMachine.Contains(cam);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n        \r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _stateMachine.GetEnumerator();\r\n        }\r\n\r\n        public IEnumerator<Camera> GetEnumerator()\r\n        {\r\n            return _stateMachine.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n        \r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Cameras/Transition/CameraFade.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Tween;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Cameras.Transition\r\n{\r\n    public abstract class CameraFade : SPComponent\r\n    {\r\n\r\n        #region Static Interface\r\n\r\n        private static HashSet<CameraFade> _fades;\r\n\r\n        static CameraFade()\r\n        {\r\n            _fades = new HashSet<CameraFade>(com.spacepuppy.Collections.ObjectReferenceEqualityComparer<CameraFade>.Default);\r\n        }\r\n\r\n        public static int ActiveFadeCount { get { return _fades.Count; } }\r\n\r\n        public static CameraFade[] GetActiveFades()\r\n        {\r\n            return _fades.ToArray();\r\n        }\r\n\r\n        public static void FadeInActiveFades(float dur, EaseStyle ease = EaseStyle.LinearEaseIn)\r\n        {\r\n            foreach(var f in _fades)\r\n            {\r\n                f.FadeIn(dur, ease);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Events\r\n\r\n        public event System.EventHandler FadeOutComplete;\r\n        public event System.EventHandler FadeInComplete;\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"DestroyOnComplete\")]\r\n        private bool _destroyOnComplete;\r\n\r\n        private ITimeSupplier _timeSupplier;\r\n\r\n        private bool _active;\r\n        private Tweener _tween;\r\n        private float _totalDuration;\r\n        private int _direction;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool DestroyOnComplete\r\n        {\r\n            get { return _destroyOnComplete; }\r\n            set { _destroyOnComplete = value; }\r\n        }\r\n        \r\n        public ITimeSupplier TimeSupplier\r\n        {\r\n            get { return _timeSupplier; }\r\n            set { _timeSupplier = value ?? SPTime.Real; }\r\n        }\r\n\r\n        public bool IsActiveFade { get { return _active; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void FadeOut(float dur, EaseStyle ease = EaseStyle.LinearEaseOut)\r\n        {\r\n            _active = true;\r\n            _fades.Add(this);\r\n\r\n            if (_tween != null)\r\n            {\r\n                _tween.Stop();\r\n                _tween = null;\r\n            }\r\n            _totalDuration = dur;\r\n            _direction = 1;\r\n            if(dur <= 0f)\r\n            {\r\n                this.OnFadeOutComplete(null, null);\r\n            }\r\n            else\r\n            {\r\n                _tween = SPTween.Tween(this.OnTweenStep, dur)\r\n                                .Use(_timeSupplier ?? SPTime.Real)\r\n                                .OnFinish(this.OnFadeOutComplete)\r\n                                .Play(false);\r\n            }\r\n        }\r\n\r\n        public void FadeIn(float dur, EaseStyle ease = EaseStyle.LinearEaseIn, bool destroyOnComplete = true)\r\n        {\r\n            if (!_active) throw new System.InvalidOperationException(\"Cannot FadeIn a CameraFade that isnot currently faded out.\");\r\n\r\n            if (_tween != null)\r\n            {\r\n                _tween.Stop();\r\n                _tween = null;\r\n            }\r\n            _totalDuration = dur;\r\n            _direction = -1;\r\n\r\n            _tween = SPTween.Tween(this.OnTweenStep, dur)\r\n                            .Use(_timeSupplier ?? SPTime.Real)\r\n                            .OnFinish(this.OnFadeInComplete)\r\n                            .Play(false);\r\n        }\r\n\r\n        private void OnTweenStep(Tweener twn, float dt, float t)\r\n        {\r\n            if(_direction > 0)\r\n            {\r\n                this.UpdateFade(Mathf.Clamp01(t / _totalDuration));\r\n            }\r\n            else\r\n            {\r\n                this.UpdateFade(Mathf.Clamp01((_totalDuration - t) / _totalDuration));\r\n            }\r\n        }\r\n\r\n        private void OnFadeOutComplete(object sender, System.EventArgs e)\r\n        {\r\n            this.UpdateFade(1.0f);\r\n            if (this.FadeOutComplete != null) this.FadeOutComplete(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        private void OnFadeInComplete(object sender, System.EventArgs e)\r\n        {\r\n            _active = false;\r\n            _fades.Remove(this);\r\n            if (this.FadeInComplete != null) this.FadeInComplete(this, System.EventArgs.Empty);\r\n            if (this.DestroyOnComplete && !this.IsNullOrDestroyed()) this.gameObject.Kill();\r\n        }\r\n\r\n        protected abstract void UpdateFade(float percentage);\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Cameras/Transition/ColorAlphaCameraFade.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Cameras.Transition\r\n{\r\n    public class ColorAlphaCameraFade : CameraFade\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Color\")]\r\n        private Color _color;\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"DrawDepth\")]\r\n        private int _drawDepth;\r\n\r\n        private float _currentOpacity = 0f;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Color Color\r\n        {\r\n            get { return _color; }\r\n            set { _color = value; }\r\n        }\r\n\r\n        public int DrawDepth\r\n        {\r\n            get { return _drawDepth; }\r\n            set { _drawDepth = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected override void UpdateFade(float percentage)\r\n        {\r\n            _currentOpacity = percentage;\r\n        }\r\n\r\n        void OnGUI()\r\n        {\r\n            if (!this.IsActiveFade) return;\r\n\r\n            var c = _color;\r\n            c.a = _currentOpacity;\r\n            GUI.color = c;\r\n            GUI.depth = _drawDepth;\r\n            GUI.DrawTexture(new Rect(0f, 0f, Screen.width, Screen.height), SPAssets.WhiteTexture);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Factory\r\n\r\n        public static ColorAlphaCameraFade Create(Color c, int drawDepth = 0, bool persistBetweenLoads = true)\r\n        {\r\n            var go = new GameObject(\"ColorAlphaCameraFade\");\r\n            if (persistBetweenLoads) GameObject.DontDestroyOnLoad(go);\r\n            var fade = go.AddComponent<ColorAlphaCameraFade>();\r\n            fade.DestroyOnComplete = true;\r\n            fade.Color = c;\r\n            fade.DrawDepth = drawDepth;\r\n            return fade;\r\n        }\r\n\r\n        public static ColorAlphaCameraFade StartFade(float dur, Color c, int drawDepth = 0, bool persistBetweenLoads = true)\r\n        {\r\n            var fade = Create(c, drawDepth, persistBetweenLoads);\r\n            fade.FadeOut(dur);\r\n            return fade;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Cameras/UnityCamera.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Cameras\r\n{\r\n\r\n    [RequireComponentInEntity(typeof(Camera))]\r\n    [DisallowMultipleComponent()]\r\n    public class UnityCamera : SPComponent, ICamera\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private CameraCategory _type;\r\n\r\n        [SerializeField]\r\n        [DefaultFromSelf(Relativity = EntityRelativity.Entity)]\r\n        private Camera _camera;\r\n        \r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            //_camera = this.GetComponent<Camera>();\r\n            //if (_camera == null)\r\n            //{\r\n            //    ObjUtil.SmartDestroy(this);\r\n            //}\r\n            //else\r\n            //{\r\n            //    CameraManager.Register(this);\r\n            //}\r\n\r\n\r\n            if(_camera != null)\r\n            {\r\n                CameraPool.Register(this);\r\n            }\r\n        }\r\n\r\n        protected override void OnDestroy()\r\n        {\r\n            base.OnDestroy();\r\n\r\n            CameraPool.Unregister(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICamera Interface\r\n\r\n        public CameraCategory Category\r\n        {\r\n            get { return _type; }\r\n            set { _type = value; }\r\n        }\r\n\r\n        public new Camera camera\r\n        {\r\n            get { return _camera; }\r\n        }\r\n        Camera ICamera.camera\r\n        {\r\n            get { return _camera; }\r\n        }\r\n\r\n        public bool IsAlive { get { return _camera != null; } }\r\n\r\n        public bool Contains(Camera cam)\r\n        {\r\n            return object.ReferenceEquals(_camera, cam);\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/CancellableNotification.cs",
    "content": "﻿\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Represents a Notification that can be cancelled.\r\n    /// </summary>\r\n    public abstract class CancellableNotification : Notification\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private bool _cancelled;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public CancellableNotification()\r\n        {\r\n\r\n        }\r\n\r\n        public CancellableNotification(bool cancelFlagDefault)\r\n        {\r\n            _cancelled = cancelFlagDefault;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool Cancelled { get { return _cancelled; } set { _cancelled = value; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Reset()\r\n        {\r\n            _cancelled = false;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/BiDictionary.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n\r\n    public class BiDictionary<TFirst, TSecond> : IDictionary<TFirst, TSecond>, IDictionary\r\n    {\r\n\r\n        private readonly IDictionary<TFirst, TSecond> _firstToSecond = new Dictionary<TFirst, TSecond>();\r\n        private readonly IDictionary<TSecond, TFirst> _secondToFirst = new Dictionary<TSecond, TFirst>();\r\n        private readonly ReverseDictionary _reverseDictionary;\r\n\r\n        public BiDictionary()\r\n        {\r\n            _reverseDictionary = new ReverseDictionary(this);\r\n        }\r\n\r\n        public IDictionary<TSecond, TFirst> Reverse\r\n        {\r\n            get { return _reverseDictionary; }\r\n        }\r\n\r\n        public int Count\r\n        {\r\n            get { return _firstToSecond.Count; }\r\n        }\r\n\r\n        object ICollection.SyncRoot\r\n        {\r\n            get { return ((ICollection)_firstToSecond).SyncRoot; }\r\n        }\r\n\r\n        bool ICollection.IsSynchronized\r\n        {\r\n            get { return ((ICollection)_firstToSecond).IsSynchronized; }\r\n        }\r\n\r\n        bool IDictionary.IsFixedSize\r\n        {\r\n            get { return ((IDictionary)_firstToSecond).IsFixedSize; }\r\n        }\r\n\r\n        public bool IsReadOnly\r\n        {\r\n            get { return _firstToSecond.IsReadOnly || _secondToFirst.IsReadOnly; }\r\n        }\r\n\r\n        public TSecond this[TFirst key]\r\n        {\r\n            get { return _firstToSecond[key]; }\r\n            set\r\n            {\r\n                _firstToSecond[key] = value;\r\n                _secondToFirst[value] = key;\r\n            }\r\n        }\r\n\r\n        object IDictionary.this[object key]\r\n        {\r\n            get { return ((IDictionary)_firstToSecond)[key]; }\r\n            set\r\n            {\r\n                ((IDictionary)_firstToSecond)[key] = value;\r\n                ((IDictionary)_secondToFirst)[value] = key;\r\n            }\r\n        }\r\n\r\n        public ICollection<TFirst> Keys\r\n        {\r\n            get { return _firstToSecond.Keys; }\r\n        }\r\n\r\n        ICollection IDictionary.Keys\r\n        {\r\n            get { return ((IDictionary)_firstToSecond).Keys; }\r\n        }\r\n\r\n        public ICollection<TSecond> Values\r\n        {\r\n            get { return _firstToSecond.Values; }\r\n        }\r\n\r\n        ICollection IDictionary.Values\r\n        {\r\n            get { return ((IDictionary)_firstToSecond).Values; }\r\n        }\r\n\r\n        public IEnumerator<KeyValuePair<TFirst, TSecond>> GetEnumerator()\r\n        {\r\n            return _firstToSecond.GetEnumerator();\r\n        }\r\n\r\n        IEnumerator IEnumerable.GetEnumerator()\r\n        {\r\n            return GetEnumerator();\r\n        }\r\n\r\n        IDictionaryEnumerator IDictionary.GetEnumerator()\r\n        {\r\n            return ((IDictionary)_firstToSecond).GetEnumerator();\r\n        }\r\n\r\n        public void Add(TFirst key, TSecond value)\r\n        {\r\n            _firstToSecond.Add(key, value);\r\n            _secondToFirst.Add(value, key);\r\n        }\r\n\r\n        void IDictionary.Add(object key, object value)\r\n        {\r\n            ((IDictionary)_firstToSecond).Add(key, value);\r\n            ((IDictionary)_secondToFirst).Add(value, key);\r\n        }\r\n\r\n        public void Add(KeyValuePair<TFirst, TSecond> item)\r\n        {\r\n            _firstToSecond.Add(item);\r\n            _secondToFirst.Add(item.Reverse());\r\n        }\r\n\r\n        public bool ContainsKey(TFirst key)\r\n        {\r\n            return _firstToSecond.ContainsKey(key);\r\n        }\r\n\r\n        public bool Contains(KeyValuePair<TFirst, TSecond> item)\r\n        {\r\n            return _firstToSecond.Contains(item);\r\n        }\r\n\r\n        public bool TryGetValue(TFirst key, out TSecond value)\r\n        {\r\n            return _firstToSecond.TryGetValue(key, out value);\r\n        }\r\n\r\n        public bool Remove(TFirst key)\r\n        {\r\n            TSecond value;\r\n            if (_firstToSecond.TryGetValue(key, out value))\r\n            {\r\n                _firstToSecond.Remove(key);\r\n                _secondToFirst.Remove(value);\r\n                return true;\r\n            }\r\n            else\r\n                return false;\r\n        }\r\n\r\n        void IDictionary.Remove(object key)\r\n        {\r\n            var firstToSecond = (IDictionary)_firstToSecond;\r\n            if (!firstToSecond.Contains(key))\r\n                return;\r\n            var value = firstToSecond[key];\r\n            firstToSecond.Remove(key);\r\n            ((IDictionary)_secondToFirst).Remove(value);\r\n        }\r\n\r\n        public bool Remove(KeyValuePair<TFirst, TSecond> item)\r\n        {\r\n            return _firstToSecond.Remove(item);\r\n        }\r\n\r\n        public bool Contains(object key)\r\n        {\r\n            return ((IDictionary)_firstToSecond).Contains(key);\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _firstToSecond.Clear();\r\n            _secondToFirst.Clear();\r\n        }\r\n\r\n        public void CopyTo(KeyValuePair<TFirst, TSecond>[] array, int arrayIndex)\r\n        {\r\n            _firstToSecond.CopyTo(array, arrayIndex);\r\n        }\r\n\r\n        void ICollection.CopyTo(Array array, int index)\r\n        {\r\n            ((IDictionary)_firstToSecond).CopyTo(array, index);\r\n        }\r\n\r\n        private class ReverseDictionary : IDictionary<TSecond, TFirst>, IDictionary\r\n        {\r\n            private readonly BiDictionary<TFirst, TSecond> _owner;\r\n\r\n            public ReverseDictionary(BiDictionary<TFirst, TSecond> owner)\r\n            {\r\n                _owner = owner;\r\n            }\r\n\r\n            public int Count\r\n            {\r\n                get { return _owner._secondToFirst.Count; }\r\n            }\r\n\r\n            object ICollection.SyncRoot\r\n            {\r\n                get { return ((ICollection)_owner._secondToFirst).SyncRoot; }\r\n            }\r\n\r\n            bool ICollection.IsSynchronized\r\n            {\r\n                get { return ((ICollection)_owner._secondToFirst).IsSynchronized; }\r\n            }\r\n\r\n            bool IDictionary.IsFixedSize\r\n            {\r\n                get { return ((IDictionary)_owner._secondToFirst).IsFixedSize; }\r\n            }\r\n\r\n            public bool IsReadOnly\r\n            {\r\n                get { return _owner._secondToFirst.IsReadOnly || _owner._firstToSecond.IsReadOnly; }\r\n            }\r\n\r\n            public TFirst this[TSecond key]\r\n            {\r\n                get { return _owner._secondToFirst[key]; }\r\n                set\r\n                {\r\n                    _owner._secondToFirst[key] = value;\r\n                    _owner._firstToSecond[value] = key;\r\n                }\r\n            }\r\n\r\n            object IDictionary.this[object key]\r\n            {\r\n                get { return ((IDictionary)_owner._secondToFirst)[key]; }\r\n                set\r\n                {\r\n                    ((IDictionary)_owner._secondToFirst)[key] = value;\r\n                    ((IDictionary)_owner._firstToSecond)[value] = key;\r\n                }\r\n            }\r\n\r\n            public ICollection<TSecond> Keys\r\n            {\r\n                get { return _owner._secondToFirst.Keys; }\r\n            }\r\n\r\n            ICollection IDictionary.Keys\r\n            {\r\n                get { return ((IDictionary)_owner._secondToFirst).Keys; }\r\n            }\r\n\r\n            public ICollection<TFirst> Values\r\n            {\r\n                get { return _owner._secondToFirst.Values; }\r\n            }\r\n\r\n            ICollection IDictionary.Values\r\n            {\r\n                get { return ((IDictionary)_owner._secondToFirst).Values; }\r\n            }\r\n\r\n            public IEnumerator<KeyValuePair<TSecond, TFirst>> GetEnumerator()\r\n            {\r\n                return _owner._secondToFirst.GetEnumerator();\r\n            }\r\n\r\n            IEnumerator IEnumerable.GetEnumerator()\r\n            {\r\n                return GetEnumerator();\r\n            }\r\n\r\n            IDictionaryEnumerator IDictionary.GetEnumerator()\r\n            {\r\n                return ((IDictionary)_owner._secondToFirst).GetEnumerator();\r\n            }\r\n\r\n            public void Add(TSecond key, TFirst value)\r\n            {\r\n                _owner._secondToFirst.Add(key, value);\r\n                _owner._firstToSecond.Add(value, key);\r\n            }\r\n\r\n            void IDictionary.Add(object key, object value)\r\n            {\r\n                ((IDictionary)_owner._secondToFirst).Add(key, value);\r\n                ((IDictionary)_owner._firstToSecond).Add(value, key);\r\n            }\r\n\r\n            public void Add(KeyValuePair<TSecond, TFirst> item)\r\n            {\r\n                _owner._secondToFirst.Add(item);\r\n                _owner._firstToSecond.Add(item.Reverse());\r\n            }\r\n\r\n            public bool ContainsKey(TSecond key)\r\n            {\r\n                return _owner._secondToFirst.ContainsKey(key);\r\n            }\r\n\r\n            public bool Contains(KeyValuePair<TSecond, TFirst> item)\r\n            {\r\n                return _owner._secondToFirst.Contains(item);\r\n            }\r\n\r\n            public bool TryGetValue(TSecond key, out TFirst value)\r\n            {\r\n                return _owner._secondToFirst.TryGetValue(key, out value);\r\n            }\r\n\r\n            public bool Remove(TSecond key)\r\n            {\r\n                TFirst value;\r\n                if (_owner._secondToFirst.TryGetValue(key, out value))\r\n                {\r\n                    _owner._secondToFirst.Remove(key);\r\n                    _owner._firstToSecond.Remove(value);\r\n                    return true;\r\n                }\r\n                else\r\n                    return false;\r\n            }\r\n\r\n            void IDictionary.Remove(object key)\r\n            {\r\n                var firstToSecond = (IDictionary)_owner._secondToFirst;\r\n                if (!firstToSecond.Contains(key))\r\n                    return;\r\n                var value = firstToSecond[key];\r\n                firstToSecond.Remove(key);\r\n                ((IDictionary)_owner._firstToSecond).Remove(value);\r\n            }\r\n\r\n            public bool Remove(KeyValuePair<TSecond, TFirst> item)\r\n            {\r\n                return _owner._secondToFirst.Remove(item);\r\n            }\r\n\r\n            public bool Contains(object key)\r\n            {\r\n                return ((IDictionary)_owner._secondToFirst).Contains(key);\r\n            }\r\n\r\n            public void Clear()\r\n            {\r\n                _owner._secondToFirst.Clear();\r\n                _owner._firstToSecond.Clear();\r\n            }\r\n\r\n            public void CopyTo(KeyValuePair<TSecond, TFirst>[] array, int arrayIndex)\r\n            {\r\n                _owner._secondToFirst.CopyTo(array, arrayIndex);\r\n            }\r\n\r\n            void ICollection.CopyTo(Array array, int index)\r\n            {\r\n                ((IDictionary)_owner._secondToFirst).CopyTo(array, index);\r\n            }\r\n        }\r\n    }\r\n\r\n    internal static class KeyValuePairExts\r\n    {\r\n        public static KeyValuePair<TValue, TKey> Reverse<TKey, TValue>(this KeyValuePair<TKey, TValue> @this)\r\n        {\r\n            return new KeyValuePair<TValue, TKey>(@this.Value, @this.Key);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/BinaryHeap.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n    public class BinaryHeap<T> : ICollection<T>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private static T[] _zeroArray = new T[0];\r\n\r\n        private T[] _heap;\r\n        private int _tail;\r\n        private IComparer<T> _comparer;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public BinaryHeap()\r\n        {\r\n            _heap = _zeroArray;\r\n            _tail = 0;\r\n            _comparer = Comparer<T>.Default;\r\n        }\r\n\r\n        public BinaryHeap(int capacity)\r\n            : this(capacity, null)\r\n        {\r\n\r\n        }\r\n\r\n        public BinaryHeap(IEnumerable<T> e)\r\n            : this(e, null)\r\n        {\r\n\r\n        }\r\n\r\n        public BinaryHeap(IComparer<T> comparer)\r\n        {\r\n            _heap = _zeroArray;\r\n            _tail = 0;\r\n            _comparer = comparer ?? Comparer<T>.Default;\r\n        }\r\n\r\n        public BinaryHeap(int capacity, IComparer<T> comparer)\r\n        {\r\n            _heap = new T[capacity];\r\n            _tail = 0;\r\n            _comparer = comparer ?? Comparer<T>.Default;\r\n        }\r\n\r\n        public BinaryHeap(IEnumerable<T> e, IComparer<T> comparer)\r\n        {\r\n            _heap = new T[e.Count()];\r\n            _tail = 0;\r\n            _comparer = comparer ?? Comparer<T>.Default;\r\n\r\n            foreach (var v in e)\r\n            {\r\n                _heap[_tail++] = v;\r\n            }\r\n\r\n            for (int i = GetParent(_tail - 1); i >= 0; i--)\r\n            {\r\n                this.BubbleDown(i);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int Count\r\n        {\r\n            get { return _tail; }\r\n        }\r\n\r\n        public IComparer<T> Comparer\r\n        {\r\n            get { return _comparer; }\r\n        }\r\n\r\n        public T this[int index]\r\n        {\r\n            get\r\n            {\r\n                if (index < 0 || index >= _tail) throw new IndexOutOfRangeException();\r\n                return _heap[index];\r\n            }\r\n            set\r\n            {\r\n                if (index < 0 || index >= _tail) throw new IndexOutOfRangeException();\r\n                _heap[index] = value;\r\n                if (_tail > 1)\r\n                {\r\n                    this.Update(index);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Add(T item)\r\n        {\r\n            if (_tail == _heap.Length)\r\n            {\r\n                var arr = new T[_heap.Length == 0 ? 4 : 2 * _heap.Length];\r\n                Array.Copy(_heap, 0, arr, 0, _tail);\r\n                _heap = arr;\r\n            }\r\n\r\n            _heap[_tail++] = item;\r\n            this.BubbleUp(_tail - 1);\r\n        }\r\n\r\n        public T Peek()\r\n        {\r\n            if (_tail == 0) throw new InvalidOperationException(\"Heap is empty.\");\r\n            return _heap[0];\r\n        }\r\n\r\n        public T Pop()\r\n        {\r\n            if (_tail == 0) throw new InvalidOperationException(\"Heap is empty.\");\r\n            T result = _heap[0];\r\n            _heap[0] = default(T);\r\n            _tail--;\r\n            this.Swap(_tail, 0);\r\n            this.BubbleDown(0);\r\n            return result;\r\n        }\r\n\r\n        public int IndexOf(T item)\r\n        {\r\n            if (_tail == 0) return -1;\r\n            int i = Array.IndexOf(_heap, item);\r\n            if (i < _tail) return i;\r\n            else return -1;\r\n        }\r\n\r\n        public void RemoveAt(int index)\r\n        {\r\n            if (index < 0 || index >= _tail) throw new IndexOutOfRangeException();\r\n            _heap[index] = default(T);\r\n            _tail--;\r\n            if (_tail > 0)\r\n            {\r\n                this.Swap(index, _tail);\r\n                this.BubbleUp(_tail);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Force the collection to reassert the status of an element.\r\n        /// </summary>\r\n        /// <param name=\"item\"></param>\r\n        public void Update(T item)\r\n        {\r\n            if (_tail <= 1) return;\r\n\r\n            int i = Array.IndexOf(_heap, item);\r\n            if (i < 0) return;\r\n\r\n            this.Update(i);\r\n        }\r\n\r\n        public void Update(int index)\r\n        {\r\n            if (_tail <= 1) return;\r\n            if (index < 0 || index >= _tail) return;\r\n\r\n            int p = GetParent(index);\r\n            if (p == 0 || _comparer.Compare(_heap[p], _heap[index]) >= 0)\r\n            {\r\n                this.BubbleDown(index);\r\n            }\r\n            else\r\n            {\r\n                this.BubbleUp(index);\r\n            }\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n        private void BubbleUp(int i)\r\n        {\r\n            while (true)\r\n            {\r\n                int p = GetParent(i);\r\n                if (i == 0 || _comparer.Compare(_heap[p], _heap[i]) >= 0)\r\n                    return;\r\n\r\n                this.Swap(i, p);\r\n                i = p;\r\n            }\r\n        }\r\n\r\n        private void BubbleDown(int i)\r\n        {\r\n            while (true)\r\n            {\r\n                int dominant = GetDominantRelative(i);\r\n                if (dominant == i) return;\r\n\r\n                this.Swap(i, dominant);\r\n                i = dominant;\r\n            }\r\n        }\r\n\r\n        private void Swap(int i, int j)\r\n        {\r\n            T tmp = _heap[i];\r\n            _heap[i] = _heap[j];\r\n            _heap[j] = tmp;\r\n        }\r\n\r\n        private int GetDominantRelative(int i)\r\n        {\r\n            int dominating = i;\r\n            int c = GetLeftChild(i);\r\n            if (c < _tail && _comparer.Compare(_heap[dominating], _heap[c]) < 0)\r\n                dominating = c;\r\n            c = GetRightChild(i);\r\n            if (c < _tail && _comparer.Compare(_heap[dominating], _heap[c]) < 0)\r\n                dominating = c;\r\n            return dominating;\r\n        }\r\n\r\n        private static int GetParent(int i)\r\n        {\r\n            return (i - 1) / 2;\r\n        }\r\n\r\n        private static int GetLeftChild(int i)\r\n        {\r\n            return 2 * i + 1;\r\n        }\r\n\r\n        private static int GetRightChild(int i)\r\n        {\r\n            return 2 * i + 2;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        void ICollection<T>.Add(T item)\r\n        {\r\n            this.Add(item);\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            Array.Clear(_heap, 0, _tail);\r\n            _tail = 0;\r\n        }\r\n\r\n        public bool Contains(T item)\r\n        {\r\n            if (_tail == 0) return false;\r\n            int i = Array.IndexOf(_heap, item);\r\n            return i >= 0 && i < _tail;\r\n        }\r\n\r\n        public void CopyTo(T[] array, int arrayIndex)\r\n        {\r\n            Array.Copy(_heap, 0, array, arrayIndex, _tail);\r\n        }\r\n\r\n        public bool Remove(T item)\r\n        {\r\n            int i = this.IndexOf(item);\r\n            if (i < 0) return false;\r\n\r\n            this.RemoveAt(i);\r\n            return true;\r\n        }\r\n\r\n        bool ICollection<T>.IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public Enumerator GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator<T> IEnumerable<T>.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator IEnumerable.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        public struct Enumerator : IEnumerator<T>\r\n        {\r\n\r\n            private BinaryHeap<T> _heap;\r\n            private int _index;\r\n\r\n            public Enumerator(BinaryHeap<T> heap)\r\n            {\r\n                if (heap == null) throw new ArgumentNullException(\"heap\");\r\n\r\n                _heap = heap;\r\n                _index = -1;\r\n            }\r\n\r\n            public T Current\r\n            {\r\n                get\r\n                {\r\n                    if (_heap == null) return default(T);\r\n                    return _heap._heap[_index];\r\n                }\r\n            }\r\n\r\n            object IEnumerator.Current\r\n            {\r\n                get\r\n                {\r\n                    if (_heap == null) return default(T);\r\n                    return _heap._heap[_index];\r\n                }\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                if (_heap == null) return false;\r\n                if (_index >= _heap._tail - 1) return false;\r\n\r\n                _index++;\r\n                return true;\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                _heap = null;\r\n                _index = 0;\r\n            }\r\n\r\n            void IEnumerator.Reset()\r\n            {\r\n                _index = -1;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/CircularQueue.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n\r\n    /// <summary>\r\n    /// Represents a queue of static length. As entries are pushed onto the collection and reach the length of the queue, \r\n    /// they are automatically removed from the collection. \r\n    /// </summary>\r\n    /// <typeparam name=\"T\"></typeparam>\r\n    public class CircularQueue<T> : IEnumerable<T>, ICollection<T>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private T[] _values;\r\n        private int _count;\r\n        private int _head;\r\n        private int _rear;\r\n\r\n        private IEqualityComparer<T> _comparer;\r\n        private int _version;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public CircularQueue(int size)\r\n        {\r\n            if (size < 0) throw new System.ArgumentException(\"Size must be non-negative.\", \"size\");\r\n            _values = new T[size];\r\n            _count = 0;\r\n            _head = 0;\r\n            _rear = 0;\r\n            _comparer = EqualityComparer<T>.Default;\r\n        }\r\n\r\n        public CircularQueue(int size, IEqualityComparer<T> comparer)\r\n        {\r\n            if (size < 0) throw new System.ArgumentException(\"Size must be non-negative.\", \"size\");\r\n            _values = new T[size];\r\n            _count = 0;\r\n            _head = 0;\r\n            _rear = 0;\r\n            _comparer = comparer ?? EqualityComparer<T>.Default;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int Size { get { return _values.Length; } }\r\n\r\n        public int Count { get { return _count; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Enqueue(T value)\r\n        {\r\n            if (_values.Length == 0) return;\r\n\r\n            _values[_rear] = value;\r\n\r\n            if (_count == _values.Length)\r\n                _head = (_head + 1) % _values.Length;\r\n            _rear = (_rear + 1) % _values.Length;\r\n            _count = Math.Min(_count + 1, _values.Length);\r\n            _version++;\r\n        }\r\n\r\n        public T Dequeue()\r\n        {\r\n            if (_count == 0) throw new InvalidOperationException(\"CircularQueue is empty.\");\r\n\r\n            T result = _values[_head];\r\n            _values[_head] = default(T);\r\n            _head = (_head + 1) % _values.Length;\r\n            _count--;\r\n            _version++;\r\n\r\n            return result;\r\n        }\r\n\r\n        public T Peek()\r\n        {\r\n            if (_count == 0) throw new InvalidOperationException(\"CircularQueue is empty.\");\r\n\r\n            return _values[_head];\r\n        }\r\n\r\n        public T PopLast()\r\n        {\r\n            if (_count == 0) throw new InvalidOperationException(\"CircularQueue is empty.\");\r\n\r\n            _rear = (_rear > 0) ? _rear - 1 : _values.Length - 1;\r\n            T result = _values[_rear];\r\n            _values[_rear] = default(T);\r\n            _count--;\r\n            _version++;\r\n\r\n            return result;\r\n        }\r\n\r\n        public T PeekLast()\r\n        {\r\n            if (_count == 0) throw new InvalidOperationException(\"CircularQueue is empty.\");\r\n\r\n            int index = (_rear > 0) ? _rear - 1 : _values.Length - 1;\r\n            return _values[index];\r\n        }\r\n\r\n        public void Resize(int size)\r\n        {\r\n            if (size < 0) throw new System.ArgumentException(\"Size must be non-negative.\", \"size\");\r\n\r\n            if(size > _values.Length && _head < _rear)\r\n            {\r\n                //if growing, and the queue doesn't wrap, we can just resize\r\n                System.Array.Resize(ref _values, size);\r\n            }\r\n            else if(size < _values.Length && _head < _rear && size > _rear)\r\n            {\r\n                //if shrinking, and the queue doesn't wrap, and the size we're resizing to still fits the queue, we can just resize\r\n                System.Array.Resize(ref _values, size);\r\n            }\r\n            else\r\n            {\r\n                T[] arr = new T[size];\r\n                int index = _head;\r\n                _count = Math.Min(size, _count);\r\n                for (int i = 0; i < _count; i++)\r\n                {\r\n                    arr[i] = _values[index];\r\n                    index = (index + 1) % _values.Length;\r\n                }\r\n                _values = arr;\r\n                _head = 0;\r\n                _rear = _count;\r\n            }\r\n\r\n            _version++;\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            for (int i = 0; i < _values.Length; i++)\r\n            {\r\n                _values[i] = default(T);\r\n            }\r\n            _count = 0;\r\n            _head = 0;\r\n            _rear = 0;\r\n            _version++;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public Enumerator GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator<T> IEnumerable<T>.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        void ICollection<T>.Add(T item)\r\n        {\r\n            this.Enqueue(item);\r\n        }\r\n\r\n        public bool Contains(T item)\r\n        {\r\n            int index = _head;\r\n            for (int i = 0; i < _count; i++)\r\n            {\r\n                if (_comparer.Equals(_values[index], item)) return true;\r\n                index = (index + 1) % _values.Length;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        void ICollection<T>.CopyTo(T[] array, int arrayIndex)\r\n        {\r\n            int index = _head;\r\n            for(int i = 0; i < _count; i++)\r\n            {\r\n                array[arrayIndex + i] = _values[index];\r\n                index = (index + 1) % _values.Length;\r\n            }\r\n        }\r\n\r\n        bool ICollection<T>.IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        bool ICollection<T>.Remove(T item)\r\n        {\r\n            throw new System.NotSupportedException();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public struct Enumerator : IEnumerator<T>\r\n        {\r\n\r\n            #region Fields\r\n\r\n            private CircularQueue<T> _que;\r\n            private int _index;\r\n            private int _ver;\r\n            private T _current;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            public Enumerator(CircularQueue<T> que)\r\n            {\r\n                _que = que;\r\n                _index = que._head;\r\n                _ver = que._version;\r\n                _current = default(T);\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IEnumerator Interface\r\n\r\n            public T Current\r\n            {\r\n                get { return _current; }\r\n            }\r\n\r\n            object System.Collections.IEnumerator.Current\r\n            {\r\n                get { return _current; }\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                if (_ver != _que._version) throw new System.InvalidOperationException(\"CirculeQueue was modified while enumerating.\");\r\n                if (_index >= _que._count)\r\n                {\r\n                    _current = default(T);\r\n                    return false;\r\n                }\r\n                _current = _que._values[_index];\r\n                _index = (_index + 1) % _que._values.Length;\r\n                return true;\r\n            }\r\n\r\n            public void Reset()\r\n            {\r\n                if (_ver != _que._version) throw new System.InvalidOperationException(\"CirculeQueue was modified while enumerating.\");\r\n                _index = _que._head;\r\n                _current = default(T);\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/ComponentCollection.cs",
    "content": "﻿using System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n\r\n    /// <summary>\r\n    /// A collection of like objects that only one of can exist. This is similar to Unity's components (behaviors), but in its own framework.\r\n    /// </summary>\r\n    public class ComponentCollection<TBase> : IEnumerable<TBase>\r\n    {\r\n\r\n        #region Events\r\n\r\n        public event ComponentCollectionChangedEventHandler ComponentAdded;\r\n        public event ComponentCollectionChangedEventHandler ComponentRemoved;\r\n\r\n        public delegate void ComponentCollectionChangedEventHandler(object sender, TBase component);\r\n\r\n        protected virtual void OnComponentAdded(TBase comp)\r\n        {\r\n            if (ComponentAdded != null) ComponentAdded(this, comp);\r\n        }\r\n\r\n        protected virtual void OnComponentRemoved(TBase comp)\r\n        {\r\n            if (ComponentRemoved != null) ComponentRemoved(this, comp);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        private Dictionary<System.Type, TBase> _coll = new Dictionary<System.Type, TBase>();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public ComponentCollection()\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int Count { get { return _coll.Count; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Add<T>(T comp) where T : class, TBase\r\n        {\r\n            if (comp == null) throw new System.ArgumentNullException(\"comp\");\r\n            var tp = typeof(T);\r\n\r\n            if (_coll.ContainsKey(tp))\r\n            {\r\n                //remove old component\r\n                var old = _coll[tp];\r\n                _coll.Remove(tp);\r\n                this.OnComponentRemoved(old);\r\n            }\r\n\r\n            _coll[tp] = comp;\r\n            this.OnComponentAdded(comp);\r\n        }\r\n\r\n        public T Add<T>() where T : class, TBase\r\n        {\r\n            T comp = this.Get<T>();\r\n            if (comp != null) return comp;\r\n\r\n            try\r\n            {\r\n                comp = System.Activator.CreateInstance<T>();\r\n            }\r\n            catch (System.Exception ex)\r\n            {\r\n                throw new System.ArgumentException(\"Failed to create instance of component \" + typeof(T).Name, ex);\r\n            }\r\n\r\n            var tp = typeof(T);\r\n            if (_coll.ContainsKey(tp))\r\n            {\r\n                //remove old component\r\n                var old = _coll[tp];\r\n                _coll.Remove(tp);\r\n                this.OnComponentRemoved(old);\r\n            }\r\n\r\n            _coll[tp] = comp;\r\n            this.OnComponentAdded(comp);\r\n            return comp;\r\n        }\r\n\r\n        public TBase Add(System.Type tp)\r\n        {\r\n            if (tp == null || !TypeUtil.IsType(tp, typeof(TBase))) throw new TypeArgumentMismatchException(tp, typeof(TBase), \"tp\");\r\n\r\n            var comp = this.Get(tp);\r\n            if (comp != null) return comp;\r\n\r\n            try\r\n            {\r\n                comp = (TBase)System.Activator.CreateInstance(tp);\r\n            }\r\n            catch (System.Exception ex)\r\n            {\r\n                throw new System.ArgumentException(\"Failed to create instance of component \" + tp.Name, ex);\r\n            }\r\n\r\n            if (_coll.ContainsKey(tp))\r\n            {\r\n                //remove old component\r\n                var old = _coll[tp];\r\n                _coll.Remove(tp);\r\n                this.OnComponentRemoved(old);\r\n            }\r\n\r\n            _coll[tp] = comp;\r\n            this.OnComponentAdded(comp);\r\n            return comp;\r\n        }\r\n\r\n        public bool Contains(TBase comp)\r\n        {\r\n            return _coll.Values.Contains(comp);\r\n        }\r\n\r\n        public bool Has<T>(bool allowIndirectHit = false) where T : class, TBase\r\n        {\r\n            var tp = typeof(T);\r\n\r\n            //direct type hit\r\n            if (_coll.ContainsKey(tp)) return true;\r\n\r\n            if (allowIndirectHit)\r\n            {\r\n                //indirect type hit second\r\n                foreach (var obj in _coll.Values)\r\n                {\r\n                    if (obj is T) return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public bool Has(System.Type tp, bool allowIndirectHit = false)\r\n        {\r\n            if (tp == null || !TypeUtil.IsType(tp, typeof(TBase))) throw new TypeArgumentMismatchException(tp, typeof(TBase), \"tp\");\r\n\r\n            //direct type hit\r\n            if (_coll.ContainsKey(tp)) return true;\r\n\r\n            if (allowIndirectHit)\r\n            {\r\n                //indirect type hit second\r\n                foreach (var obj in _coll.Values)\r\n                {\r\n                    if (TypeUtil.IsType(obj.GetType(), tp)) return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public T Get<T>(bool allowIndirectHit = false) where T : class, TBase\r\n        {\r\n            var tp = typeof(T);\r\n\r\n            //direct type hit first\r\n            if (_coll.ContainsKey(tp)) return _coll[tp] as T;\r\n\r\n            if (allowIndirectHit)\r\n            {\r\n                //indirect type hit second\r\n                foreach (var obj in _coll.Values)\r\n                {\r\n                    if (obj is T) return obj as T;\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public TBase Get(System.Type tp, bool allowIndirectHit = false)\r\n        {\r\n            if (tp == null || !TypeUtil.IsType(tp, typeof(TBase))) throw new TypeArgumentMismatchException(tp, typeof(TBase), \"tp\");\r\n\r\n            //direct type hit first\r\n            if (_coll.ContainsKey(tp)) return _coll[tp];\r\n\r\n            if (allowIndirectHit)\r\n            {\r\n                //indirect type hit second\r\n                foreach (var obj in _coll.Values)\r\n                {\r\n                    if (TypeUtil.IsType(obj.GetType(), tp)) return obj;\r\n                }\r\n            }\r\n\r\n            return default(TBase);\r\n        }\r\n\r\n        public bool Remove<T>() where T : class, TBase\r\n        {\r\n            var tp = typeof(T);\r\n\r\n            //direct type hit only\r\n            if (_coll.ContainsKey(tp))\r\n            {\r\n                var old = _coll[tp];\r\n                if (_coll.Remove(tp))\r\n                {\r\n                    this.OnComponentRemoved(old);\r\n                    return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public bool Remove(System.Type tp)\r\n        {\r\n            if (tp == null || !TypeUtil.IsType(tp, typeof(TBase))) throw new TypeArgumentMismatchException(tp, typeof(TBase), \"tp\");\r\n\r\n            //direct type hit only\r\n            if (_coll.ContainsKey(tp))\r\n            {\r\n                var old = _coll[tp];\r\n                if (_coll.Remove(tp))\r\n                {\r\n                    this.OnComponentRemoved(old);\r\n                    return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public bool Remove(TBase comp)\r\n        {\r\n            System.Type hit = null;\r\n            foreach (var pair in _coll)\r\n            {\r\n                if(object.Equals(pair.Value, comp))\r\n                {\r\n                    hit = pair.Key;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if (hit != null)\r\n            {\r\n                if (_coll.Remove(hit))\r\n                {\r\n                    this.OnComponentRemoved(comp);\r\n                    return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        //TODO - implement propert Enumerator, remember dict.Values allocates mem in mono... ugh\r\n        protected Dictionary<System.Type, TBase>.ValueCollection.Enumerator GetEnumeratorDirect()\r\n        {\r\n            return _coll.Values.GetEnumerator();\r\n        }\r\n\r\n        public IEnumerator<TBase> GetEnumerator()\r\n        {\r\n            return _coll.Values.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _coll.Values.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/CooldownPool.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n\r\n    /// <summary>\r\n    /// Used to store temporary references for a duration of time. Call Update to update the pool \r\n    /// releasing objects that are old enough. Always call Update on the unity main thread!\r\n    /// </summary>\r\n    /// <typeparam name=\"T\"></typeparam>\r\n    public class CooldownPool<T> : IEnumerable<CooldownPool<T>.CooldownInfo> where T : class\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Dictionary<T, CooldownInfo> _table = new Dictionary<T, CooldownInfo>();\r\n        private ITimeSupplier _time;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public CooldownPool()\r\n        {\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int Count { get { return _table.Count; } }\r\n\r\n        public ITimeSupplier UpdateTimeSupplier\r\n        {\r\n            get\r\n            {\r\n                if (_time == null) _time = SPTime.Normal;\r\n                return _time;\r\n            }\r\n            set\r\n            {\r\n                if (value == null) throw new System.ArgumentNullException(\"value\");\r\n                _time = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Add(T obj, float duration)\r\n        {\r\n            CooldownInfo info;\r\n            if(_table.TryGetValue(obj, out info))\r\n            {\r\n                info.Duration += duration;\r\n            }\r\n            else\r\n            {\r\n                _table[obj] = new CooldownInfo(obj, this.UpdateTimeSupplier.Total, duration);\r\n            }\r\n        }\r\n\r\n        public bool Contains(T obj)\r\n        {\r\n            return _table.ContainsKey(obj);\r\n        }\r\n\r\n        public void Update()\r\n        {\r\n            var t = this.UpdateTimeSupplier.Total;\r\n            CooldownInfo info;\r\n\r\n            using (var toRemove = TempCollection.GetList<T>())\r\n            {\r\n                var e1 = _table.GetEnumerator();\r\n                while (e1.MoveNext())\r\n                {\r\n                    info = e1.Current.Value;\r\n                    if (info.Object == null || t - info.StartTime > info.Duration)\r\n                    {\r\n                        toRemove.Add(info.Object);\r\n                    }\r\n                }\r\n\r\n                if (toRemove.Count > 0)\r\n                {\r\n                    var e2 = toRemove.GetEnumerator();\r\n                    while (e2.MoveNext())\r\n                    {\r\n                        _table.Remove(e2.Current);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _table.Clear();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public Enumerator GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator<CooldownPool<T>.CooldownInfo> IEnumerable<CooldownInfo>.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public struct CooldownInfo\r\n        {\r\n            private T _obj;\r\n            private float _startTime;\r\n            private float _dur;\r\n\r\n            public CooldownInfo(T obj, float startTime, float dur)\r\n            {\r\n                _obj = obj;\r\n                _startTime = startTime;\r\n                _dur = dur;\r\n            }\r\n\r\n            public T Object { get { return _obj; } }\r\n            public float StartTime\r\n            {\r\n                get { return _startTime; }\r\n                internal set { _startTime = value; }\r\n            }\r\n            public float Duration\r\n            {\r\n                get { return _dur; }\r\n                internal set { _dur = value; }\r\n            }\r\n\r\n        }\r\n\r\n        public struct Enumerator : IEnumerator<CooldownInfo>\r\n        {\r\n\r\n            private Dictionary<T, CooldownInfo>.Enumerator _e;\r\n\r\n            public Enumerator(CooldownPool<T> pool)\r\n            {\r\n                if (pool == null) throw new System.ArgumentNullException();\r\n                _e = pool._table.GetEnumerator();\r\n            }\r\n\r\n            public CooldownInfo Current\r\n            {\r\n                get\r\n                {\r\n                    return _e.Current.Value;\r\n                }\r\n            }\r\n\r\n            object IEnumerator.Current\r\n            {\r\n                get\r\n                {\r\n                    return _e.Current.Value;\r\n                }\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                _e.Dispose();\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                return _e.MoveNext();\r\n            }\r\n\r\n            void System.Collections.IEnumerator.Reset()\r\n            {\r\n                throw new System.NotSupportedException();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/CovariantCollections.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Collections\n{\n\n    public class CovariantCollection<TInner, TOuter> : ICollection<TOuter> where TInner : class, TOuter\n    {\n\n        #region Fields\n\n        private ICollection<TInner> _coll;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public CovariantCollection(ICollection<TInner> coll)\n        {\n            if (coll == null) throw new System.ArgumentNullException(\"coll\");\n            _coll = coll;\n        }\n\n        #endregion\n\n        #region ICollection Interface\n\n        public ICollection<TInner> InnerCollection { get { return _coll; } }\n\n        public int Count { get { return _coll.Count; } }\n\n        public bool IsReadOnly { get { return _coll.IsReadOnly; } }\n\n        public void Add(TOuter item)\n        {\n            if (item != null && !(item is TInner)) throw new System.ArgumentException(\"item must be of type \" + typeof(TInner).Name + \" to be added to this collection.\", \"item\");\n\n            _coll.Add(item as TInner);\n        }\n\n        public void Clear()\n        {\n            _coll.Clear();\n        }\n\n        public bool Contains(TOuter item)\n        {\n            if (item != null && !(item is TInner)) return false;\n\n            return _coll.Contains(item as TInner);\n        }\n\n        public void CopyTo(TOuter[] array, int arrayIndex)\n        {\n            int i = arrayIndex;\n            foreach(var item in _coll)\n            {\n                if (i >= array.Length) return;\n\n                array[i] = item;\n                i++;\n            }\n        }\n\n        public bool Remove(TOuter item)\n        {\n            if (item != null && !(item is TInner)) return false;\n\n            return _coll.Remove(item as TInner);\n        }\n\n        public IEnumerator<TOuter> GetEnumerator()\n        {\n            return _coll.Cast<TOuter>().GetEnumerator();\n        }\n\n        IEnumerator IEnumerable.GetEnumerator()\n        {\n            return _coll.GetEnumerator();\n        }\n\n        #endregion\n\n\n\n        public static CovariantCollection<TInner, TOuter> Sync(ref CovariantCollection<TInner, TOuter> covariantColl, ICollection<TInner> innerColl)\n        {\n            if (covariantColl == null || covariantColl.InnerCollection != innerColl)\n            {\n                covariantColl = new CovariantCollection<TInner, TOuter>(innerColl);\n            }\n\n            return covariantColl;\n        }\n\n    }\n\n    public class CovariantList<TInner, TOuter> : IList<TOuter> where TInner : class, TOuter\n    {\n\n        #region Fields\n\n        private IList<TInner> _coll;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public CovariantList(IList<TInner> coll)\n        {\n            if (coll == null) throw new System.ArgumentNullException(\"coll\");\n            _coll = coll;\n        }\n\n        #endregion\n\n        #region IList Interface\n\n        public IList<TInner> InnerCollection { get { return _coll; } }\n\n        public int Count { get { return _coll.Count; } }\n\n        public bool IsReadOnly { get { return _coll.IsReadOnly; } }\n\n        public TOuter this[int index]\n        {\n            get { return _coll[index]; }\n            set\n            {\n                if(value != null && !(value is TInner)) throw new System.ArgumentException(\"item must be of type \" + typeof(TInner).Name + \" to be added to this collection.\", \"value\");\n                _coll[index] = value as TInner;\n            }\n        }\n\n        public void Add(TOuter item)\n        {\n            if (item != null && !(item is TInner)) throw new System.ArgumentException(\"item must be of type \" + typeof(TInner).Name + \" to be added to this collection.\", \"item\");\n\n            _coll.Add(item as TInner);\n        }\n\n        public void Clear()\n        {\n            _coll.Clear();\n        }\n\n        public bool Contains(TOuter item)\n        {\n            if (item != null && !(item is TInner)) return false;\n\n            return _coll.Contains(item as TInner);\n        }\n\n        public void CopyTo(TOuter[] array, int arrayIndex)\n        {\n            int i = arrayIndex;\n            foreach (var item in _coll)\n            {\n                if (i >= array.Length) return;\n\n                array[i] = item;\n                i++;\n            }\n        }\n        \n        public int IndexOf(TOuter item)\n        {\n            if (item != null && !(item is TInner)) return -1;\n\n            return _coll.IndexOf(item as TInner);\n        }\n\n        public void Insert(int index, TOuter item)\n        {\n            if (item != null && !(item is TInner)) throw new System.ArgumentException(\"item must be of type \" + typeof(TInner).Name + \" to be added to this collection.\", \"item\");\n        }\n\n        public bool Remove(TOuter item)\n        {\n            if (!(item is TInner)) return false;\n\n            return _coll.Remove(item as TInner);\n        }\n\n        public void RemoveAt(int index)\n        {\n            _coll.RemoveAt(index);\n        }\n\n        public IEnumerator<TOuter> GetEnumerator()\n        {\n            return _coll.Cast<TOuter>().GetEnumerator();\n        }\n\n        IEnumerator IEnumerable.GetEnumerator()\n        {\n            return _coll.GetEnumerator();\n        }\n\n        #endregion\n\n        public static CovariantList<TInner, TOuter> Sync(ref CovariantList<TInner, TOuter> covariantColl, IList<TInner> innerColl)\n        {\n            if (covariantColl == null || covariantColl.InnerCollection != innerColl)\n            {\n                covariantColl = new CovariantList<TInner, TOuter>(innerColl);\n            }\n\n            return covariantColl;\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Collections/Deque.cs",
    "content": "﻿/*\r\n * Deque is taken from Stephen Cleary's project available here, with some slight modifications made to it by Dylan Engelman (namely renaming some methods, and rearranging the code to be more readable for Dylan Engelman).\r\n * http://nitodeque.codeplex.com/\r\n * \r\n * It is used under the Microsoft Public License:\r\n * http://nitodeque.codeplex.com/license\r\n * \r\nMicrosoft Public License (Ms-PL)\r\n\r\nThis license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.\r\n\r\n1. Definitions\r\n\r\nThe terms \"reproduce,\" \"reproduction,\" \"derivative works,\" and \"distribution\" have the same meaning here as under U.S. copyright law.\r\n\r\nA \"contribution\" is the original software, or any additions or changes to the software.\r\n\r\nA \"contributor\" is any person that distributes its contribution under this license.\r\n\r\n\"Licensed patents\" are a contributor's patent claims that read directly on its contribution.\r\n\r\n2. Grant of Rights\r\n\r\n(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.\r\n\r\n(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.\r\n\r\n3. Conditions and Limitations\r\n\r\n(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.\r\n\r\n(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.\r\n\r\n(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.\r\n\r\n(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.\r\n\r\n(E) The software is licensed \"as-is.\" You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.\r\n */\r\n\r\nusing System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n    /// <summary>\r\n    /// A double-ended queue (deque), which provides O(1) indexed access, O(1) removals from the front and back, amortized O(1) insertions to the front and back, and O(N) insertions and removals anywhere else (with the operations getting slower as the index approaches the middle).\r\n    /// </summary>\r\n    /// <typeparam name=\"T\">The type of elements contained in the deque.</typeparam>\r\n    [DebuggerDisplay(\"Count = {Count}, Capacity = {Capacity}\")]\r\n    [DebuggerTypeProxy(typeof(Deque<>.DebugView))]\r\n    public sealed class Deque<T> : IList<T>, System.Collections.IList\r\n    {\r\n\r\n        #region Fields\r\n\r\n        /// <summary>\r\n        /// The default capacity.\r\n        /// </summary>\r\n        private const int DefaultCapacity = 8;\r\n\r\n        /// <summary>\r\n        /// The circular buffer that holds the view.\r\n        /// </summary>\r\n        private T[] buffer;\r\n\r\n        /// <summary>\r\n        /// The offset into <see cref=\"buffer\"/> where the view begins.\r\n        /// </summary>\r\n        private int offset;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        /// <summary>\r\n        /// Initializes a new instance of the <see cref=\"Deque&lt;T&gt;\"/> class with the specified capacity.\r\n        /// </summary>\r\n        /// <param name=\"capacity\">The initial capacity. Must be greater than <c>0</c>.</param>\r\n        public Deque(int capacity)\r\n        {\r\n            if (capacity < 1)\r\n                throw new ArgumentOutOfRangeException(\"capacity\", \"Capacity must be greater than 0.\");\r\n            buffer = new T[capacity];\r\n        }\r\n\r\n        /// <summary>\r\n        /// Initializes a new instance of the <see cref=\"Deque&lt;T&gt;\"/> class with the elements from the specified collection.\r\n        /// </summary>\r\n        /// <param name=\"collection\">The collection.</param>\r\n        public Deque(IEnumerable<T> collection)\r\n        {\r\n            int count = collection.Count();\r\n            if (count > 0)\r\n            {\r\n                buffer = new T[count];\r\n                DoInsertRange(0, collection, count);\r\n            }\r\n            else\r\n            {\r\n                buffer = new T[DefaultCapacity];\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Initializes a new instance of the <see cref=\"Deque&lt;T&gt;\"/> class.\r\n        /// </summary>\r\n        public Deque()\r\n            : this(DefaultCapacity)\r\n        {\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region GenericListImplementations\r\n\r\n        /// <summary>\r\n        /// Gets a value indicating whether this list is read-only. This implementation always returns <c>false</c>.\r\n        /// </summary>\r\n        /// <returns>true if this list is read-only; otherwise, false.</returns>\r\n        bool ICollection<T>.IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets or sets the item at the specified index.\r\n        /// </summary>\r\n        /// <param name=\"index\">The index of the item to get or set.</param>\r\n        /// <exception cref=\"T:System.ArgumentOutOfRangeException\"><paramref name=\"index\"/> is not a valid index in this list.</exception>\r\n        /// <exception cref=\"T:System.NotSupportedException\">This property is set and the list is read-only.</exception>\r\n        public T this[int index]\r\n        {\r\n            get\r\n            {\r\n                CheckExistingIndexArgument(this.Count, index);\r\n                return DoGetItem(index);\r\n            }\r\n\r\n            set\r\n            {\r\n                CheckExistingIndexArgument(this.Count, index);\r\n                DoSetItem(index, value);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Inserts an item to this list at the specified index.\r\n        /// </summary>\r\n        /// <param name=\"index\">The zero-based index at which <paramref name=\"item\"/> should be inserted.</param>\r\n        /// <param name=\"item\">The object to insert into this list.</param>\r\n        /// <exception cref=\"T:System.ArgumentOutOfRangeException\">\r\n        /// <paramref name=\"index\"/> is not a valid index in this list.\r\n        /// </exception>\r\n        /// <exception cref=\"T:System.NotSupportedException\">\r\n        /// This list is read-only.\r\n        /// </exception>\r\n        public void Insert(int index, T item)\r\n        {\r\n            CheckNewIndexArgument(Count, index);\r\n            DoInsert(index, item);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Removes the item at the specified index.\r\n        /// </summary>\r\n        /// <param name=\"index\">The zero-based index of the item to remove.</param>\r\n        /// <exception cref=\"T:System.ArgumentOutOfRangeException\">\r\n        /// <paramref name=\"index\"/> is not a valid index in this list.\r\n        /// </exception>\r\n        /// <exception cref=\"T:System.NotSupportedException\">\r\n        /// This list is read-only.\r\n        /// </exception>\r\n        public void RemoveAt(int index)\r\n        {\r\n            CheckExistingIndexArgument(Count, index);\r\n            DoRemoveAt(index);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Determines the index of a specific item in this list.\r\n        /// </summary>\r\n        /// <param name=\"item\">The object to locate in this list.</param>\r\n        /// <returns>The index of <paramref name=\"item\"/> if found in this list; otherwise, -1.</returns>\r\n        public int IndexOf(T item)\r\n        {\r\n            var comparer = EqualityComparer<T>.Default;\r\n            int ret = 0;\r\n            foreach (var sourceItem in this)\r\n            {\r\n                if (comparer.Equals(item, sourceItem))\r\n                    return ret;\r\n                ++ret;\r\n            }\r\n\r\n            return -1;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Adds an item to the end of this list.\r\n        /// </summary>\r\n        /// <param name=\"item\">The object to add to this list.</param>\r\n        /// <exception cref=\"T:System.NotSupportedException\">\r\n        /// This list is read-only.\r\n        /// </exception>\r\n        void ICollection<T>.Add(T item)\r\n        {\r\n            DoInsert(Count, item);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Determines whether this list contains a specific value.\r\n        /// </summary>\r\n        /// <param name=\"item\">The object to locate in this list.</param>\r\n        /// <returns>\r\n        /// true if <paramref name=\"item\"/> is found in this list; otherwise, false.\r\n        /// </returns>\r\n        bool ICollection<T>.Contains(T item)\r\n        {\r\n            return this.Contains(item, null);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Copies the elements of this list to an <see cref=\"T:System.Array\"/>, starting at a particular <see cref=\"T:System.Array\"/> index.\r\n        /// </summary>\r\n        /// <param name=\"array\">The one-dimensional <see cref=\"T:System.Array\"/> that is the destination of the elements copied from this slice. The <see cref=\"T:System.Array\"/> must have zero-based indexing.</param>\r\n        /// <param name=\"arrayIndex\">The zero-based index in <paramref name=\"array\"/> at which copying begins.</param>\r\n        /// <exception cref=\"T:System.ArgumentNullException\">\r\n        /// <paramref name=\"array\"/> is null.\r\n        /// </exception>\r\n        /// <exception cref=\"T:System.ArgumentOutOfRangeException\">\r\n        /// <paramref name=\"arrayIndex\"/> is less than 0.\r\n        /// </exception>\r\n        /// <exception cref=\"T:System.ArgumentException\">\r\n        /// <paramref name=\"arrayIndex\"/> is equal to or greater than the length of <paramref name=\"array\"/>.\r\n        /// -or-\r\n        /// The number of elements in the source <see cref=\"T:System.Collections.Generic.ICollection`1\"/> is greater than the available space from <paramref name=\"arrayIndex\"/> to the end of the destination <paramref name=\"array\"/>.\r\n        /// </exception>\r\n        void ICollection<T>.CopyTo(T[] array, int arrayIndex)\r\n        {\r\n            if (array == null)\r\n                throw new ArgumentNullException(\"array\", \"Array is null\");\r\n\r\n            int count = this.Count;\r\n            CheckRangeArguments(array.Length, arrayIndex, count);\r\n            for (int i = 0; i != count; ++i)\r\n            {\r\n                array[arrayIndex + i] = this[i];\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Removes the first occurrence of a specific object from this list.\r\n        /// </summary>\r\n        /// <param name=\"item\">The object to remove from this list.</param>\r\n        /// <returns>\r\n        /// true if <paramref name=\"item\"/> was successfully removed from this list; otherwise, false. This method also returns false if <paramref name=\"item\"/> is not found in this list.\r\n        /// </returns>\r\n        /// <exception cref=\"T:System.NotSupportedException\">\r\n        /// This list is read-only.\r\n        /// </exception>\r\n        public bool Remove(T item)\r\n        {\r\n            int index = IndexOf(item);\r\n            if (index == -1)\r\n                return false;\r\n\r\n            DoRemoveAt(index);\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public Enumerator GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns an enumerator that iterates through the collection.\r\n        /// </summary>\r\n        /// <returns>\r\n        /// A <see cref=\"T:System.Collections.Generic.IEnumerator`1\"/> that can be used to iterate through the collection.\r\n        /// </returns>\r\n        IEnumerator<T> IEnumerable<T>.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns an enumerator that iterates through a collection.\r\n        /// </summary>\r\n        /// <returns>\r\n        /// An <see cref=\"T:System.Collections.IEnumerator\"/> object that can be used to iterate through the collection.\r\n        /// </returns>\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        public struct Enumerator : IEnumerator<T>\r\n        {\r\n            private Deque<T> _coll;\r\n            private T _current;\r\n            private int _index;\r\n\r\n            public Enumerator(Deque<T> coll)\r\n            {\r\n                if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n                _coll = coll;\r\n                _current = default(T);\r\n                _index = 0;\r\n            }\r\n\r\n            public T Current\r\n            {\r\n                get\r\n                {\r\n                    return _current;\r\n                }\r\n            }\r\n\r\n            object IEnumerator.Current\r\n            {\r\n                get\r\n                {\r\n                    return _current;\r\n                }\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                if (_index >= _coll.Count) return false;\r\n\r\n                _current = _coll.DoGetItem(_index);\r\n                _index++;\r\n                return true;\r\n            }\r\n\r\n            void IEnumerator.Reset()\r\n            {\r\n                _index = 0;\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                _coll = null;\r\n                _current = default(T);\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ObjectListImplementations\r\n\r\n        /// <summary>\r\n        /// Returns whether or not the type of a given item indicates it is appropriate for storing in this container.\r\n        /// </summary>\r\n        /// <param name=\"item\">The item to test.</param>\r\n        /// <returns><c>true</c> if the item is appropriate to store in this container; otherwise, <c>false</c>.</returns>\r\n        private bool ObjectIsT(object item)\r\n        {\r\n            if (item is T)\r\n            {\r\n                return true;\r\n            }\r\n\r\n            if (item == null)\r\n            {\r\n                var type = typeof(T);\r\n                if (type.IsClass && !type.IsPointer)\r\n                    return true; // classes, arrays, and delegates\r\n                if (type.IsInterface)\r\n                    return true; // interfaces\r\n                if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))\r\n                    return true; // nullable value types\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        int System.Collections.IList.Add(object value)\r\n        {\r\n            if (!ObjectIsT(value))\r\n                throw new ArgumentException(\"Item is not of the correct type.\", \"value\");\r\n            this.Push((T)value);\r\n            return Count - 1;\r\n        }\r\n\r\n        bool System.Collections.IList.Contains(object value)\r\n        {\r\n            if (!ObjectIsT(value))\r\n                throw new ArgumentException(\"Item is not of the correct type.\", \"value\");\r\n            return this.Contains((T)value);\r\n        }\r\n\r\n        int System.Collections.IList.IndexOf(object value)\r\n        {\r\n            if (!ObjectIsT(value))\r\n                throw new ArgumentException(\"Item is not of the correct type.\", \"value\");\r\n            return IndexOf((T)value);\r\n        }\r\n\r\n        void System.Collections.IList.Insert(int index, object value)\r\n        {\r\n            if (!ObjectIsT(value))\r\n                throw new ArgumentException(\"Item is not of the correct type.\", \"value\");\r\n            Insert(index, (T)value);\r\n        }\r\n\r\n        bool System.Collections.IList.IsFixedSize\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        bool System.Collections.IList.IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        void System.Collections.IList.Remove(object value)\r\n        {\r\n            if (!ObjectIsT(value))\r\n                throw new ArgumentException(\"Item is not of the correct type.\", \"value\");\r\n            Remove((T)value);\r\n        }\r\n\r\n        object System.Collections.IList.this[int index]\r\n        {\r\n            get\r\n            {\r\n                return this[index];\r\n            }\r\n\r\n            set\r\n            {\r\n                if (!ObjectIsT(value))\r\n                    throw new ArgumentException(\"Item is not of the correct type.\", \"value\");\r\n                this[index] = (T)value;\r\n            }\r\n        }\r\n\r\n        void System.Collections.ICollection.CopyTo(Array array, int index)\r\n        {\r\n            if (array == null)\r\n                throw new ArgumentNullException(\"array\", \"Destination array cannot be null.\");\r\n            CheckRangeArguments(array.Length, index, Count);\r\n\r\n            for (int i = 0; i != Count; ++i)\r\n            {\r\n                try\r\n                {\r\n                    array.SetValue(this[i], index + i);\r\n                }\r\n                catch (InvalidCastException ex)\r\n                {\r\n                    throw new ArgumentException(\"Destination array is of incorrect type.\", ex);\r\n                }\r\n            }\r\n        }\r\n\r\n        bool System.Collections.ICollection.IsSynchronized\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        object System.Collections.ICollection.SyncRoot\r\n        {\r\n            get { return this; }\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region GenericListHelpers\r\n\r\n        /// <summary>\r\n        /// Checks the <paramref name=\"index\"/> argument to see if it refers to a valid insertion point in a source of a given length.\r\n        /// </summary>\r\n        /// <param name=\"sourceLength\">The length of the source. This parameter is not checked for validity.</param>\r\n        /// <param name=\"index\">The index into the source.</param>\r\n        /// <exception cref=\"ArgumentOutOfRangeException\"><paramref name=\"index\"/> is not a valid index to an insertion point for the source.</exception>\r\n        private static void CheckNewIndexArgument(int sourceLength, int index)\r\n        {\r\n            if (index < 0 || index > sourceLength)\r\n            {\r\n                throw new ArgumentOutOfRangeException(\"index\", \"Invalid new index \" + index + \" for source length \" + sourceLength);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Checks the <paramref name=\"index\"/> argument to see if it refers to an existing element in a source of a given length.\r\n        /// </summary>\r\n        /// <param name=\"sourceLength\">The length of the source. This parameter is not checked for validity.</param>\r\n        /// <param name=\"index\">The index into the source.</param>\r\n        /// <exception cref=\"ArgumentOutOfRangeException\"><paramref name=\"index\"/> is not a valid index to an existing element for the source.</exception>\r\n        private static void CheckExistingIndexArgument(int sourceLength, int index)\r\n        {\r\n            if (index < 0 || index >= sourceLength)\r\n            {\r\n                throw new ArgumentOutOfRangeException(\"index\", \"Invalid existing index \" + index + \" for source length \" + sourceLength);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Checks the <paramref name=\"offset\"/> and <paramref name=\"count\"/> arguments for validity when applied to a source of a given length. Allows 0-element ranges, including a 0-element range at the end of the source.\r\n        /// </summary>\r\n        /// <param name=\"sourceLength\">The length of the source. This parameter is not checked for validity.</param>\r\n        /// <param name=\"offset\">The index into source at which the range begins.</param>\r\n        /// <param name=\"count\">The number of elements in the range.</param>\r\n        /// <exception cref=\"ArgumentOutOfRangeException\">Either <paramref name=\"offset\"/> or <paramref name=\"count\"/> is less than 0.</exception>\r\n        /// <exception cref=\"ArgumentException\">The range [offset, offset + count) is not within the range [0, sourceLength).</exception>\r\n        private static void CheckRangeArguments(int sourceLength, int offset, int count)\r\n        {\r\n            if (offset < 0)\r\n            {\r\n                throw new ArgumentOutOfRangeException(\"offset\", \"Invalid offset \" + offset);\r\n            }\r\n\r\n            if (count < 0)\r\n            {\r\n                throw new ArgumentOutOfRangeException(\"count\", \"Invalid count \" + count);\r\n            }\r\n\r\n            if (sourceLength - offset < count)\r\n            {\r\n                throw new ArgumentException(\"Invalid offset (\" + offset + \") or count + (\" + count + \") for source length \" + sourceLength);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        /// <summary>\r\n        /// Gets a value indicating whether this instance is empty.\r\n        /// </summary>\r\n        private bool IsEmpty\r\n        {\r\n            get { return Count == 0; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets a value indicating whether this instance is at full capacity.\r\n        /// </summary>\r\n        private bool IsFull\r\n        {\r\n            get { return Count == Capacity; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets a value indicating whether the buffer is \"split\" (meaning the beginning of the view is at a later index in <see cref=\"buffer\"/> than the end).\r\n        /// </summary>\r\n        private bool IsSplit\r\n        {\r\n            get\r\n            {\r\n                // Overflow-safe version of \"(offset + Count) > Capacity\"\r\n                return offset > (Capacity - Count);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets or sets the capacity for this deque. This value must always be greater than zero, and this property cannot be set to a value less than <see cref=\"Count\"/>.\r\n        /// </summary>\r\n        /// <exception cref=\"InvalidOperationException\"><c>Capacity</c> cannot be set to a value less than <see cref=\"Count\"/>.</exception>\r\n        public int Capacity\r\n        {\r\n            get\r\n            {\r\n                return buffer.Length;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (value < 1)\r\n                    throw new ArgumentOutOfRangeException(\"value\", \"Capacity must be greater than 0.\");\r\n\r\n                if (value < Count)\r\n                    throw new InvalidOperationException(\"Capacity cannot be set to a value less than Count\");\r\n\r\n                if (value == buffer.Length)\r\n                    return;\r\n\r\n                // Create the new buffer and copy our existing range.\r\n                T[] newBuffer = new T[value];\r\n                if (IsSplit)\r\n                {\r\n                    // The existing buffer is split, so we have to copy it in parts\r\n                    int length = Capacity - offset;\r\n                    Array.Copy(buffer, offset, newBuffer, 0, length);\r\n                    Array.Copy(buffer, 0, newBuffer, length, Count - length);\r\n                }\r\n                else\r\n                {\r\n                    // The existing buffer is whole\r\n                    Array.Copy(buffer, offset, newBuffer, 0, Count);\r\n                }\r\n\r\n                // Set up to use the new buffer.\r\n                buffer = newBuffer;\r\n                offset = 0;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets the number of elements contained in this deque.\r\n        /// </summary>\r\n        /// <returns>The number of elements contained in this deque.</returns>\r\n        public int Count { get; private set; }\r\n\r\n        #endregion\r\n\r\n        #region Public Methods\r\n\r\n        /// <summary>\r\n        /// Inserts a single element at the back of this deque.\r\n        /// </summary>\r\n        /// <param name=\"value\">The element to insert.</param>\r\n        public void Push(T value)\r\n        {\r\n            EnsureCapacityForOneElement();\r\n            DoAddToBack(value);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Inserts a single element at the front of this deque.\r\n        /// </summary>\r\n        /// <param name=\"value\">The element to insert.</param>\r\n        public void Shift(T value)\r\n        {\r\n            EnsureCapacityForOneElement();\r\n            DoAddToFront(value);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Inserts a collection of elements into this deque.\r\n        /// </summary>\r\n        /// <param name=\"index\">The index at which the collection is inserted.</param>\r\n        /// <param name=\"collection\">The collection of elements to insert.</param>\r\n        /// <exception cref=\"ArgumentOutOfRangeException\"><paramref name=\"index\"/> is not a valid index to an insertion point for the source.</exception>\r\n        public void InsertRange(int index, IEnumerable<T> collection)\r\n        {\r\n            int collectionCount = collection.Count();\r\n            CheckNewIndexArgument(Count, index);\r\n\r\n            // Overflow-safe check for \"this.Count + collectionCount > this.Capacity\"\r\n            if (collectionCount > Capacity - Count)\r\n            {\r\n                this.Capacity = checked(Count + collectionCount);\r\n            }\r\n\r\n            if (collectionCount == 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            this.DoInsertRange(index, collection, collectionCount);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Removes a range of elements from this deque.\r\n        /// </summary>\r\n        /// <param name=\"offset\">The index into the deque at which the range begins.</param>\r\n        /// <param name=\"count\">The number of elements to remove.</param>\r\n        /// <exception cref=\"ArgumentOutOfRangeException\">Either <paramref name=\"offset\"/> or <paramref name=\"count\"/> is less than 0.</exception>\r\n        /// <exception cref=\"ArgumentException\">The range [<paramref name=\"offset\"/>, <paramref name=\"offset\"/> + <paramref name=\"count\"/>) is not within the range [0, <see cref=\"Count\"/>).</exception>\r\n        public void RemoveRange(int offset, int count)\r\n        {\r\n            CheckRangeArguments(Count, offset, count);\r\n\r\n            if (count == 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            this.DoRemoveRange(offset, count);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Removes and returns the last element of this deque.\r\n        /// </summary>\r\n        /// <returns>The former last element.</returns>\r\n        /// <exception cref=\"InvalidOperationException\">The deque is empty.</exception>\r\n        public T Pop()\r\n        {\r\n            if (this.IsEmpty)\r\n                throw new InvalidOperationException(\"The deque is empty.\");\r\n\r\n            return this.DoRemoveFromBack();\r\n        }\r\n\r\n        public T PeekPop()\r\n        {\r\n            if (this.IsEmpty)\r\n                throw new InvalidOperationException(\"The deque is empty.\");\r\n\r\n            return this.DoGetItem(Count - 1);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Removes and returns the first element of this deque.\r\n        /// </summary>\r\n        /// <returns>The former first element.</returns>\r\n        /// <exception cref=\"InvalidOperationException\">The deque is empty.</exception>\r\n        public T Unshift()\r\n        {\r\n            if (this.IsEmpty)\r\n                throw new InvalidOperationException(\"The deque is empty.\");\r\n\r\n            return this.DoRemoveFromFront();\r\n        }\r\n\r\n        public T PeekUnshift()\r\n        {\r\n            if (this.IsEmpty)\r\n                throw new InvalidOperationException(\"The deque is empty.\");\r\n\r\n            return this.DoGetItem(0);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Removes all items from this deque.\r\n        /// </summary>\r\n        public void Clear()\r\n        {\r\n            this.offset = 0;\r\n            this.Count = 0;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Private Methods\r\n\r\n        /// <summary>\r\n        /// Applies the offset to <paramref name=\"index\"/>, resulting in a buffer index.\r\n        /// </summary>\r\n        /// <param name=\"index\">The deque index.</param>\r\n        /// <returns>The buffer index.</returns>\r\n        private int DequeIndexToBufferIndex(int index)\r\n        {\r\n            return (index + offset) % Capacity;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets an element at the specified view index.\r\n        /// </summary>\r\n        /// <param name=\"index\">The zero-based view index of the element to get. This index is guaranteed to be valid.</param>\r\n        /// <returns>The element at the specified index.</returns>\r\n        private T DoGetItem(int index)\r\n        {\r\n            return buffer[DequeIndexToBufferIndex(index)];\r\n        }\r\n\r\n        /// <summary>\r\n        /// Sets an element at the specified view index.\r\n        /// </summary>\r\n        /// <param name=\"index\">The zero-based view index of the element to get. This index is guaranteed to be valid.</param>\r\n        /// <param name=\"item\">The element to store in the list.</param>\r\n        private void DoSetItem(int index, T item)\r\n        {\r\n            buffer[DequeIndexToBufferIndex(index)] = item;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Inserts an element at the specified view index.\r\n        /// </summary>\r\n        /// <param name=\"index\">The zero-based view index at which the element should be inserted. This index is guaranteed to be valid.</param>\r\n        /// <param name=\"item\">The element to store in the list.</param>\r\n        private void DoInsert(int index, T item)\r\n        {\r\n            EnsureCapacityForOneElement();\r\n\r\n            if (index == 0)\r\n            {\r\n                DoAddToFront(item);\r\n                return;\r\n            }\r\n            else if (index == Count)\r\n            {\r\n                DoAddToBack(item);\r\n                return;\r\n            }\r\n\r\n            DoInsertRange(index, new[] { item }, 1);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Removes an element at the specified view index.\r\n        /// </summary>\r\n        /// <param name=\"index\">The zero-based view index of the element to remove. This index is guaranteed to be valid.</param>\r\n        private void DoRemoveAt(int index)\r\n        {\r\n            if (index == 0)\r\n            {\r\n                DoRemoveFromFront();\r\n                return;\r\n            }\r\n            else if (index == Count - 1)\r\n            {\r\n                DoRemoveFromBack();\r\n                return;\r\n            }\r\n\r\n            DoRemoveRange(index, 1);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Increments <see cref=\"offset\"/> by <paramref name=\"value\"/> using modulo-<see cref=\"Capacity\"/> arithmetic.\r\n        /// </summary>\r\n        /// <param name=\"value\">The value by which to increase <see cref=\"offset\"/>. May not be negative.</param>\r\n        /// <returns>The value of <see cref=\"offset\"/> after it was incremented.</returns>\r\n        private int PostIncrement(int value)\r\n        {\r\n            int ret = offset;\r\n            offset += value;\r\n            offset %= Capacity;\r\n            return ret;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Decrements <see cref=\"offset\"/> by <paramref name=\"value\"/> using modulo-<see cref=\"Capacity\"/> arithmetic.\r\n        /// </summary>\r\n        /// <param name=\"value\">The value by which to reduce <see cref=\"offset\"/>. May not be negative or greater than <see cref=\"Capacity\"/>.</param>\r\n        /// <returns>The value of <see cref=\"offset\"/> before it was decremented.</returns>\r\n        private int PreDecrement(int value)\r\n        {\r\n            offset -= value;\r\n            if (offset < 0)\r\n                offset += Capacity;\r\n            return offset;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Inserts a single element to the back of the view. <see cref=\"IsFull\"/> must be false when this method is called.\r\n        /// </summary>\r\n        /// <param name=\"value\">The element to insert.</param>\r\n        private void DoAddToBack(T value)\r\n        {\r\n            buffer[DequeIndexToBufferIndex(Count)] = value;\r\n            ++Count;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Inserts a single element to the front of the view. <see cref=\"IsFull\"/> must be false when this method is called.\r\n        /// </summary>\r\n        /// <param name=\"value\">The element to insert.</param>\r\n        private void DoAddToFront(T value)\r\n        {\r\n            buffer[PreDecrement(1)] = value;\r\n            ++Count;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Removes and returns the last element in the view. <see cref=\"IsEmpty\"/> must be false when this method is called.\r\n        /// </summary>\r\n        /// <returns>The former last element.</returns>\r\n        private T DoRemoveFromBack()\r\n        {\r\n            T ret = buffer[DequeIndexToBufferIndex(Count - 1)];\r\n            --Count;\r\n            return ret;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Removes and returns the first element in the view. <see cref=\"IsEmpty\"/> must be false when this method is called.\r\n        /// </summary>\r\n        /// <returns>The former first element.</returns>\r\n        private T DoRemoveFromFront()\r\n        {\r\n            --Count;\r\n            int index = PostIncrement(1);\r\n            var result = buffer[index];\r\n            buffer[index] = default(T);\r\n            return result;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Inserts a range of elements into the view.\r\n        /// </summary>\r\n        /// <param name=\"index\">The index into the view at which the elements are to be inserted.</param>\r\n        /// <param name=\"collection\">The elements to insert.</param>\r\n        /// <param name=\"collectionCount\">The number of elements in <paramref name=\"collection\"/>. Must be greater than zero, and the sum of <paramref name=\"collectionCount\"/> and <see cref=\"Count\"/> must be less than or equal to <see cref=\"Capacity\"/>.</param>\r\n        private void DoInsertRange(int index, IEnumerable<T> collection, int collectionCount)\r\n        {\r\n            // Make room in the existing list\r\n            if (index < Count / 2)\r\n            {\r\n                // Inserting into the first half of the list\r\n\r\n                // Move lower items down: [0, index) -> [Capacity - collectionCount, Capacity - collectionCount + index)\r\n                // This clears out the low \"index\" number of items, moving them \"collectionCount\" places down;\r\n                //   after rotation, there will be a \"collectionCount\"-sized hole at \"index\".\r\n                int copyCount = index;\r\n                int writeIndex = Capacity - collectionCount;\r\n                for (int j = 0; j != copyCount; ++j)\r\n                    buffer[DequeIndexToBufferIndex(writeIndex + j)] = buffer[DequeIndexToBufferIndex(j)];\r\n\r\n                // Rotate to the new view\r\n                this.PreDecrement(collectionCount);\r\n            }\r\n            else\r\n            {\r\n                // Inserting into the second half of the list\r\n\r\n                // Move higher items up: [index, count) -> [index + collectionCount, collectionCount + count)\r\n                int copyCount = Count - index;\r\n                int writeIndex = index + collectionCount;\r\n                for (int j = copyCount - 1; j != -1; --j)\r\n                    buffer[DequeIndexToBufferIndex(writeIndex + j)] = buffer[DequeIndexToBufferIndex(index + j)];\r\n            }\r\n\r\n            // Copy new items into place\r\n            int i = index;\r\n            foreach (T item in collection)\r\n            {\r\n                buffer[DequeIndexToBufferIndex(i)] = item;\r\n                ++i;\r\n            }\r\n\r\n            // Adjust valid count\r\n            Count += collectionCount;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Removes a range of elements from the view.\r\n        /// </summary>\r\n        /// <param name=\"index\">The index into the view at which the range begins.</param>\r\n        /// <param name=\"collectionCount\">The number of elements in the range. This must be greater than 0 and less than or equal to <see cref=\"Count\"/>.</param>\r\n        private void DoRemoveRange(int index, int collectionCount)\r\n        {\r\n            if (index == 0)\r\n            {\r\n                // Removing from the beginning: rotate to the new view\r\n                this.PostIncrement(collectionCount);\r\n                Count -= collectionCount;\r\n                return;\r\n            }\r\n            else if (index == Count - collectionCount)\r\n            {\r\n                // Removing from the ending: trim the existing view\r\n                Count -= collectionCount;\r\n                return;\r\n            }\r\n\r\n            if ((index + (collectionCount / 2)) < Count / 2)\r\n            {\r\n                // Removing from first half of list\r\n\r\n                // Move lower items up: [0, index) -> [collectionCount, collectionCount + index)\r\n                int copyCount = index;\r\n                int writeIndex = collectionCount;\r\n                for (int j = copyCount - 1; j != -1; --j)\r\n                    buffer[DequeIndexToBufferIndex(writeIndex + j)] = buffer[DequeIndexToBufferIndex(j)];\r\n\r\n                // Rotate to new view\r\n                this.PostIncrement(collectionCount);\r\n            }\r\n            else\r\n            {\r\n                // Removing from second half of list\r\n\r\n                // Move higher items down: [index + collectionCount, count) -> [index, count - collectionCount)\r\n                int copyCount = Count - collectionCount - index;\r\n                int readIndex = index + collectionCount;\r\n                for (int j = 0; j != copyCount; ++j)\r\n                    buffer[DequeIndexToBufferIndex(index + j)] = buffer[DequeIndexToBufferIndex(readIndex + j)];\r\n            }\r\n\r\n            // Adjust valid count\r\n            Count -= collectionCount;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Doubles the capacity if necessary to make room for one more element. When this method returns, <see cref=\"IsFull\"/> is false.\r\n        /// </summary>\r\n        private void EnsureCapacityForOneElement()\r\n        {\r\n            if (this.IsFull)\r\n            {\r\n                this.Capacity = this.Capacity * 2;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        [DebuggerNonUserCode]\r\n        private sealed class DebugView\r\n        {\r\n            private readonly Deque<T> deque;\r\n\r\n            public DebugView(Deque<T> deque)\r\n            {\r\n                this.deque = deque;\r\n            }\r\n\r\n            [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]\r\n            public T[] Items\r\n            {\r\n                get\r\n                {\r\n                    var array = new T[deque.Count];\r\n                    ((ICollection<T>)deque).CopyTo(array, 0);\r\n                    return array;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/EventForwardingPool.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Reflection;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n    public class EventForwardingPool<T, TEvent> : ICollection<T> where TEvent : class\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Delegate _handler;\r\n        private EventInfo _event;\r\n        private List<T> _lst = new List<T>();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public EventForwardingPool(TEvent handler, string eventName)\r\n        {\r\n            if (!TypeUtil.IsType(typeof(TEvent), typeof(Delegate))) throw new InvalidOperationException(\"TEvent must be a Delegate of some type.\");\r\n            if (handler == null) throw new ArgumentNullException(\"handler\");\r\n            _handler = handler as Delegate;\r\n\r\n            var tp = typeof(T);\r\n            try\r\n            {\r\n                _event = tp.GetEvent(eventName);\r\n            }\r\n            catch\r\n            {\r\n                _event = null;\r\n            }\r\n            if (_event == null) throw new ArgumentException(\"No event of name '\" + eventName + \"' was found on type '\" + tp.Name + \"'.\");\r\n        }\r\n\r\n        public EventForwardingPool(TEvent handler, string eventName, BindingFlags binding)\r\n        {\r\n            if (!TypeUtil.IsType(typeof(TEvent), typeof(Delegate))) throw new InvalidOperationException(\"TEvent must be a Delegate of some type.\");\r\n            if (handler == null) throw new ArgumentNullException(\"handler\");\r\n            _handler = handler as Delegate;\r\n\r\n            var tp = typeof(T);\r\n            try\r\n            {\r\n                _event = tp.GetEvent(eventName, binding);\r\n            }\r\n            catch\r\n            {\r\n                _event = null;\r\n            }\r\n            if (_event == null) throw new ArgumentException(\"No event of name '\" + eventName + \"' was found on type '\" + tp.Name + \"'.\");\r\n        }\r\n\r\n        public EventForwardingPool(TEvent handler, EventInfo info)\r\n        {\r\n            if (!TypeUtil.IsType(typeof(TEvent), typeof(Delegate))) throw new InvalidOperationException(\"TEvent must be a Delegate of some type.\");\r\n            if (handler == null) throw new ArgumentNullException(\"handler\");\r\n            if (info == null) throw new ArgumentNullException(\"info\");\r\n            if (!TypeUtil.IsType(typeof(T), info.DeclaringType)) throw new ArgumentException(\"EventInfo must be from a type that T can be assigned to.\");\r\n\r\n            _handler = handler as Delegate;\r\n            _event = info;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        public void Add(T item)\r\n        {\r\n            if (item == null) throw new ArgumentNullException(\"item\");\r\n            if (_lst.Contains(item)) return;\r\n\r\n            _event.AddEventHandler(this, _handler);\r\n            _lst.Add(item);\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            var arr = _lst.ToArray();\r\n            _lst.Clear();\r\n            foreach(var item in arr)\r\n            {\r\n                _event.RemoveEventHandler(item, _handler);\r\n            }\r\n        }\r\n\r\n        public bool Contains(T item)\r\n        {\r\n            return _lst.Contains(item);\r\n        }\r\n\r\n        public void CopyTo(T[] array, int arrayIndex)\r\n        {\r\n            _lst.CopyTo(array, arrayIndex);\r\n        }\r\n\r\n        public int Count\r\n        {\r\n            get { return _lst.Count; }\r\n        }\r\n\r\n        public bool IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        public bool Remove(T item)\r\n        {\r\n            if (_lst.Remove(item))\r\n            {\r\n                _event.RemoveEventHandler(item, _handler);\r\n                return true;\r\n            }\r\n            else\r\n                return false;\r\n        }\r\n\r\n        public System.Collections.IEnumerator GetEnumerator()\r\n        {\r\n            return _lst.GetEnumerator();\r\n        }\r\n\r\n        IEnumerator<T> IEnumerable<T>.GetEnumerator()\r\n        {\r\n            return _lst.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/GameObjectCollection.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n    public class GameObjectCollection : IEnumerable<GameObject>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private string _name;\r\n        private List<GameObject> _roots = new List<GameObject>();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public GameObjectCollection()\r\n        {\r\n        }\r\n\r\n        public GameObjectCollection(IEnumerable<GameObject> roots)\r\n        {\r\n            _roots.AddRange(roots);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public string Name\r\n        {\r\n            get { return _name; }\r\n            set { _name = value; }\r\n        }\r\n\r\n        public bool IsAlive\r\n        {\r\n            get\r\n            {\r\n                var e = _roots.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    return e.Current != null;\r\n                }\r\n                return false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Returns all the gameobjects in this collection as well as their children.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public IEnumerable<GameObject> GetAll()\r\n        {\r\n            return (from r in _roots where r != null from child in r.GetAllChildrenAndSelf() where child.gameObject != null select child.gameObject).Distinct();\r\n        }\r\n\r\n        public void Unload()\r\n        {\r\n            foreach (var r in _roots)\r\n            {\r\n                GameObject.Destroy(r);\r\n            }\r\n            _roots.Clear();\r\n        }\r\n\r\n        public void Unload(float t)\r\n        {\r\n            foreach (var r in _roots)\r\n            {\r\n                GameObject.Destroy(r, t);\r\n            }\r\n            _roots.Clear();\r\n        }\r\n\r\n        public GameObject Find(string spath, bool bIgnoreCase = false)\r\n        {\r\n            if (spath == null) return null;\r\n\r\n            if (spath.StartsWith(\"./\")) spath = spath.Substring(2);\r\n\r\n            if (spath.Contains(\"/\"))\r\n            {\r\n                int i = spath.IndexOf(\"/\");\r\n                var sParName = spath.Substring(0, i);\r\n                var sChildPath = spath.Substring(i + 1);\r\n                foreach (var r in _roots)\r\n                {\r\n                    if (r != null && StringUtil.Equals(r.name, sParName, bIgnoreCase))\r\n                    {\r\n                        var child = r.Find(sChildPath, bIgnoreCase);\r\n                        if (child != null) return child;\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                foreach (var r in _roots)\r\n                {\r\n                    if (r != null && StringUtil.Equals(r.name, spath, bIgnoreCase))\r\n                    {\r\n                        return r;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public GameObject Search(string spath, bool bIgnoreCase = false)\r\n        {\r\n            if (spath == null) return null;\r\n\r\n            if (spath.StartsWith(\"./\")) spath = spath.Substring(2);\r\n\r\n            if (spath.Contains(\"/\"))\r\n            {\r\n                int i = spath.IndexOf(\"/\");\r\n                var sParName = spath.Substring(0, i);\r\n                var sChildPath = spath.Substring(i + 1);\r\n                foreach (var r in _roots)\r\n                {\r\n                    if (r != null && (sParName == \"*\" || StringUtil.Equals(r.name, sParName, bIgnoreCase)))\r\n                    {\r\n                        var child = r.Search(sChildPath, bIgnoreCase);\r\n                        if (child != null) return child;\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                foreach (var r in _roots)\r\n                {\r\n                    if (r != null && (spath == \"*\" || StringUtil.Equals(r.name, spath, bIgnoreCase)))\r\n                    {\r\n                        return r;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public GameObject FindByName(string sname, bool bIgnoreCase = false)\r\n        {\r\n            if (sname == null) return null;\r\n\r\n            if (sname == \"*\") return (from r in _roots where r != null select r).FirstOrDefault();\r\n\r\n            foreach (var r in _roots)\r\n            {\r\n                if (r != null && StringUtil.Equals(r.name, sname, bIgnoreCase)) return r;\r\n            }\r\n\r\n            foreach (var r in _roots)\r\n            {\r\n                if (r != null)\r\n                {\r\n                    var child = r.FindByName(sname, bIgnoreCase);\r\n                    if (child != null) return child;\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public IEnumerable<GameObject> FindWithTag(string tag)\r\n        {\r\n            foreach (var r in _roots)\r\n            {\r\n                if (r != null)\r\n                {\r\n                    foreach (var go in r.FindAllWithMultiTag(tag))\r\n                    {\r\n                        if (go != null) yield return go;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public IEnumerable<GameObject> FindOnLayer(int layerMask)\r\n        {\r\n            foreach (var r in _roots)\r\n            {\r\n                if (r != null)\r\n                {\r\n                    foreach (var go in r.FindGameObjectOnLayer(layerMask))\r\n                    {\r\n                        if (go != null) yield return go;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public IEnumerator<GameObject> GetEnumerator()\r\n        {\r\n            return (from r in _roots where r != null select r).GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/ICachePool.cs",
    "content": "﻿\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n    public interface ICachePool<T> where T : class\r\n    {\r\n\r\n        T GetInstance();\r\n\r\n        void Release(T obj);\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/IForeachEnumerator.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.Collections\n{\n    public interface IForeachEnumerator<T>\n    {\n\n        void Foreach(System.Action<T> callback);\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyBase/Collections/IIndexedEnumerable.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Collections\n{\n\n    public interface IIndexedEnumerable<T> : IEnumerable<T>\n    {\n\n        int Count { get; }\n        T this[int index] { get; }\n\n        bool Contains(T item);\n        void CopyTo(T[] array, int startIndex);\n        int IndexOf(T item);\n\n    }\n\n    public class ReadOnlyList<T> : IIndexedEnumerable<T>, IList<T>\n    {\n\n        #region Fields\n\n        private IList<T> _lst;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public ReadOnlyList(IList<T> lst)\n        {\n            if (lst == null) throw new ArgumentNullException(\"lst\");\n            _lst = lst;\n        }\n\n        #endregion\n\n        #region IIndexedEnumerable Interface\n\n        public T this[int index] { get { return _lst[index]; } }\n\n        public int Count { get { return _lst.Count; } }\n\n        public bool Contains(T item)\n        {\n            return _lst.Contains(item);\n        }\n\n        public void CopyTo(T[] array, int startIndex)\n        {\n            _lst.CopyTo(array, startIndex);\n        }\n\n        public int IndexOf(T item)\n        {\n            return _lst.IndexOf(item);\n        }\n\n        public IEnumerator<T> GetEnumerator()\n        {\n            return _lst.GetEnumerator();\n        }\n\n        IEnumerator IEnumerable.GetEnumerator()\n        {\n            return this.GetEnumerator();\n        }\n\n        #endregion\n\n        #region IList Interface\n\n        T IList<T>.this[int index] { get { return _lst[index]; } set { throw new NotSupportedException(); } }\n\n        bool ICollection<T>.IsReadOnly { get { return true; } }\n\n        int IIndexedEnumerable<T>.Count { get { return _lst.Count; } }\n\n        T IIndexedEnumerable<T>.this[int index] { get { return _lst[index]; } }\n\n        void ICollection<T>.Add(T item)\n        {\n            throw new NotSupportedException();\n        }\n\n        void ICollection<T>.Clear()\n        {\n            throw new NotSupportedException();\n        }\n\n        void IList<T>.Insert(int index, T item)\n        {\n            throw new NotSupportedException();\n        }\n\n        bool ICollection<T>.Remove(T item)\n        {\n            throw new NotSupportedException();\n        }\n\n        void IList<T>.RemoveAt(int index)\n        {\n            throw new NotSupportedException();\n        }\n\n        #endregion\n\n        #region Utils\n\n        public static ReadOnlyList<T> Validate(ref ReadOnlyList<T> pointer, IList<T> consumable)\n        {\n            if (pointer == null) pointer = new ReadOnlyList<T>(consumable);\n            else if (pointer._lst != consumable) pointer._lst = consumable;\n            return pointer;\n        }\n\n        #endregion\n\n    }\n\n    public class ReadOnlyMemberList<TOwner, TMember> : IIndexedEnumerable<TMember>, IList<TMember>\n    {\n\n        #region Fields\n\n        private IList<TOwner> _lst;\n        private System.Func<TOwner, TMember> _getter;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public ReadOnlyMemberList(IList<TOwner> lst, System.Func<TOwner, TMember> getter)\n        {\n            if (lst == null) throw new ArgumentNullException(\"lst\");\n            if (getter == null) throw new ArgumentNullException(\"getter\");\n            _lst = lst;\n            _getter = getter;\n        }\n\n        #endregion\n\n        #region IIndexedEnumerable Interface\n\n        public TMember this[int index] { get { return _getter(_lst[index]); } }\n\n        public int Count { get { return _lst.Count; } }\n\n        public bool Contains(TMember item)\n        {\n            var comparer = EqualityComparer<TMember>.Default;\n            for(int i = 0; i < _lst.Count; i++)\n            {\n                if (comparer.Equals(item, _getter(_lst[i]))) return true;\n            }\n            return false;\n        }\n\n        public void CopyTo(TMember[] array, int startIndex)\n        {\n            for (int i = 0; i < _lst.Count; i++)\n            {\n                array[startIndex] = _getter(_lst[i]);\n                startIndex++;\n            }\n        }\n\n        public int IndexOf(TMember item)\n        {\n            var comparer = EqualityComparer<TMember>.Default;\n            for (int i = 0; i < _lst.Count; i++)\n            {\n                if (comparer.Equals(item, _getter(_lst[i]))) return i;\n                i++;\n            }\n\n            return -1;\n        }\n\n        public IEnumerator<TMember> GetEnumerator()\n        {\n            return _lst.Select(o => _getter(o)).GetEnumerator();\n        }\n\n        IEnumerator IEnumerable.GetEnumerator()\n        {\n            return this.GetEnumerator();\n        }\n\n        #endregion\n\n        #region IList Interface\n\n        TMember IList<TMember>.this[int index] { get { return _getter(_lst[index]); } set { throw new NotSupportedException(); } }\n\n        bool ICollection<TMember>.IsReadOnly { get { return true; } }\n\n        int IIndexedEnumerable<TMember>.Count { get { return _lst.Count; } }\n\n        TMember IIndexedEnumerable<TMember>.this[int index]\n        {\n            get { return _getter(_lst[index]); }\n        }\n\n        void ICollection<TMember>.Add(TMember item)\n        {\n            throw new NotSupportedException();\n        }\n\n        void ICollection<TMember>.Clear()\n        {\n            throw new NotSupportedException();\n        }\n\n        void IList<TMember>.Insert(int index, TMember item)\n        {\n            throw new NotSupportedException();\n        }\n\n        bool ICollection<TMember>.Remove(TMember item)\n        {\n            throw new NotSupportedException();\n        }\n\n        void IList<TMember>.RemoveAt(int index)\n        {\n            throw new NotSupportedException();\n        }\n\n        #endregion\n\n        #region Utils\n\n        public static ReadOnlyMemberList<TOwner, TMember> Validate(ref ReadOnlyMemberList<TOwner, TMember> pointer, IList<TOwner> consumable, Func<TOwner, TMember> getter)\n        {\n            if (pointer == null) pointer = new ReadOnlyMemberList<TOwner, TMember>(consumable, getter);\n            else if (pointer._lst != consumable) pointer._lst = consumable;\n            return pointer;\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Collections/LightEnumerator.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n\r\n    public struct LightEnumerator : IEnumerator\r\n    {\r\n\r\n        private object _e;\r\n        private object _current;\r\n        private int _index;\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public LightEnumerator(IEnumerable e)\r\n        {\r\n            if (e is IList)\r\n            {\r\n                _e = e;\r\n                _index = 0;\r\n            }\r\n            else\r\n            {\r\n                _e = e.GetEnumerator();\r\n                _index = -1;\r\n            }\r\n            _current = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region IEnumerator Interface\r\n\r\n        public object Current\r\n        {\r\n            get\r\n            {\r\n                return _current;\r\n            }\r\n        }\r\n        \r\n        public void Dispose()\r\n        {\r\n            _e = null;\r\n            _current = null;\r\n            _index = -1;\r\n        }\r\n\r\n        public bool MoveNext()\r\n        {\r\n            if (_e == null) return false;\r\n\r\n            if (_index < 0)\r\n            {\r\n                var e = _e as IEnumerator;\r\n                if (e.MoveNext())\r\n                {\r\n                    _current = e.Current;\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    _current = null;\r\n                    return false;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var lst = _e as IList;\r\n                if (_index < lst.Count)\r\n                {\r\n                    _current = lst[_index];\r\n                    _index++;\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    _current = null;\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n\r\n        void IEnumerator.Reset()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        public static LightEnumerator Create(IEnumerable e)\r\n        {\r\n            return new LightEnumerator(e);\r\n        }\r\n\r\n        public static LightEnumerator<T> Create<T>(IEnumerable<T> e)\r\n        {\r\n            return new LightEnumerator<T>(e);\r\n        }\r\n\r\n    }\r\n\r\n    public struct LightEnumerator<T> : IEnumerator<T>\r\n    {\r\n\r\n        private object _e;\r\n        private T _current;\r\n        private int _index;\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public LightEnumerator(IEnumerable<T> e)\r\n        {\r\n            if(e is IList<T>)\r\n            {\r\n                _e = e;\r\n                _index = 0;\r\n            }\r\n            else\r\n            {\r\n                _e = e.GetEnumerator();\r\n                _index = -1;\r\n            }\r\n            _current = default(T);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region IEnumerator Interface\r\n\r\n        public T Current\r\n        {\r\n            get\r\n            {\r\n                return _current;\r\n            }\r\n        }\r\n\r\n        object IEnumerator.Current\r\n        {\r\n            get\r\n            {\r\n                return _current;\r\n            }\r\n        }\r\n        \r\n        public void Dispose()\r\n        {\r\n            _e = null;\r\n            _current = default(T);\r\n            _index = -1;\r\n        }\r\n\r\n        public bool MoveNext()\r\n        {\r\n            if (_e == null) return false;\r\n\r\n            if (_index < 0)\r\n            {\r\n                var e = _e as IEnumerator<T>;\r\n                if (e.MoveNext())\r\n                {\r\n                    _current = e.Current;\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    _current = default(T);\r\n                    return false;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var lst = _e as IList<T>;\r\n                if (_index < lst.Count)\r\n                {\r\n                    _current = lst[_index];\r\n                    _index++;\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    _current = default(T);\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n        \r\n        void IEnumerator.Reset()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/ListDictionary.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n    public class ListDictionary<TKey, TValue> : IDictionary<TKey, IList<TValue>>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Dictionary<TKey, IList<TValue>> _dict;\r\n        private Func<IList<TValue>> _listConstructor;\r\n        private ListCollection _listRedirectColl;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public ListDictionary()\r\n        {\r\n            _dict = new Dictionary<TKey, IList<TValue>>();\r\n            _listConstructor = DefaultListConstructor;\r\n            _listRedirectColl = new ListCollection(this);\r\n        }\r\n\r\n        public ListDictionary(Func<IList<TValue>> listConstructor)\r\n        {\r\n            _dict = new Dictionary<TKey, IList<TValue>>();\r\n            _listConstructor = (listConstructor != null) ? listConstructor : DefaultListConstructor;\r\n            _listRedirectColl = new ListCollection(this);\r\n        }\r\n\r\n        private static IList<TValue> DefaultListConstructor()\r\n        {\r\n            return new List<TValue>();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int Count { get { return _dict.Count; } }\r\n\r\n        public TValue this[TKey key, int index]\r\n        {\r\n            get\r\n            {\r\n                //if (!_dict.ContainsKey(key)) throw new KeyNotFoundException();\r\n                //var lst = _dict[key];\r\n                //if (index < 0 || index >= lst.Count) throw new IndexOutOfRangeException();\r\n                //return lst[index];\r\n                IList<TValue> lst;\r\n                if (_dict.TryGetValue(key, out lst))\r\n                {\r\n                    if (index < 0 || index >= lst.Count) throw new IndexOutOfRangeException();\r\n                    return lst[index];\r\n                }\r\n                else\r\n                {\r\n                    throw new KeyNotFoundException();\r\n                }\r\n            }\r\n            set\r\n            {\r\n                //if (!_dict.ContainsKey(key)) throw new KeyNotFoundException();\r\n                //var lst = _dict[key];\r\n                //if (index < 0 || index >= lst.Count) throw new IndexOutOfRangeException();\r\n                //lst[index] = value;\r\n                IList<TValue> lst;\r\n                if (_dict.TryGetValue(key, out lst))\r\n                {\r\n                    if (index < 0 || index >= lst.Count) throw new IndexOutOfRangeException();\r\n                    lst[index] = value;\r\n                }\r\n                else\r\n                {\r\n                    throw new KeyNotFoundException();\r\n                }\r\n            }\r\n        }\r\n\r\n        public ICollection<TKey> Keys\r\n        {\r\n            get { return _dict.Keys; }\r\n        }\r\n\r\n        public ListCollection Lists\r\n        {\r\n            get { return _listRedirectColl; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void AddKey(TKey key)\r\n        {\r\n            if (!_dict.ContainsKey(key))\r\n            {\r\n                _dict.Add(key, _listConstructor());\r\n            }\r\n        }\r\n\r\n        public void Add(TKey key, TValue value)\r\n        {\r\n            if (!_dict.ContainsKey(key))\r\n            {\r\n                var lst = _listConstructor();\r\n                lst.Add(value);\r\n                _dict.Add(key, lst);\r\n            }\r\n            else\r\n            {\r\n                _dict[key].Add(value);\r\n            }\r\n        }\r\n\r\n        public bool ContainsKey(TKey key)\r\n        {\r\n            return _dict.ContainsKey(key);\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _dict.Clear();\r\n        }\r\n\r\n        public bool Remove(TKey key)\r\n        {\r\n            return _dict.Remove(key);\r\n        }\r\n\r\n        public bool Remove(TKey key, TValue value)\r\n        {\r\n            if (!_dict.ContainsKey(key)) return false;\r\n            return _dict[key].Remove(value);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Purges all keys that contain empty lists\r\n        /// </summary>\r\n        public void Purge()\r\n        {\r\n            //var keys = this.Keys.ToArray();\r\n            //foreach (var key in keys)\r\n            //{\r\n            //    if (_dict[key] == null || _dict[key].Count == 0) _dict.Remove(key);\r\n            //}\r\n\r\n            using (var lst = TempCollection.GetList<TKey>(this.Keys))\r\n            {\r\n                var e = lst.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    var sublst = _dict[e.Current];\r\n                    if (sublst == null || sublst.Count == 0) _dict.Remove(e.Current);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Purges key if the related list is empty.\r\n        /// </summary>\r\n        /// <param name=\"key\"></param>\r\n        public bool Purge(TKey key)\r\n        {\r\n            if (_dict.ContainsKey(key) && _dict[key].Count == 0)\r\n            {\r\n                return _dict.Remove(key);\r\n            }\r\n            return false;\r\n        }\r\n\r\n        public IEnumerable<TValue> GetValues()\r\n        {\r\n            foreach (var lst in _dict.Values)\r\n            {\r\n                foreach (var obj in lst)\r\n                {\r\n                    yield return obj;\r\n                }\r\n            }\r\n        }\r\n\r\n        public IEnumerable<TValue> GetValues(TKey key)\r\n        {\r\n            //if (!_dict.ContainsKey(key)) yield break;\r\n\r\n            //foreach (var obj in _dict[key])\r\n            //{\r\n            //    yield return obj;\r\n            //}\r\n\r\n            return _dict[key];\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDictionary Interface\r\n\r\n        void IDictionary<TKey, IList<TValue>>.Add(TKey key, IList<TValue> value)\r\n        {\r\n            throw new NotImplementedException(\"Mutating ListDictionary IList entry directly is not supported.\");\r\n        }\r\n\r\n        bool IDictionary<TKey, IList<TValue>>.ContainsKey(TKey key)\r\n        {\r\n            return this.ContainsKey(key);\r\n        }\r\n\r\n        ICollection<TKey> IDictionary<TKey, IList<TValue>>.Keys\r\n        {\r\n            get { return this.Keys; }\r\n        }\r\n\r\n        bool IDictionary<TKey, IList<TValue>>.Remove(TKey key)\r\n        {\r\n            return this.Remove(key);\r\n        }\r\n\r\n        bool IDictionary<TKey, IList<TValue>>.TryGetValue(TKey key, out IList<TValue> value)\r\n        {\r\n            return _dict.TryGetValue(key, out value);\r\n        }\r\n\r\n        ICollection<IList<TValue>> IDictionary<TKey, IList<TValue>>.Values\r\n        {\r\n            get { return this.Lists; }\r\n        }\r\n\r\n        IList<TValue> IDictionary<TKey, IList<TValue>>.this[TKey key]\r\n        {\r\n            get\r\n            {\r\n                return _dict[key];\r\n            }\r\n            set\r\n            {\r\n                throw new NotImplementedException(\"Mutating ListDictionary IList entry directly is not supported.\");\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        void ICollection<KeyValuePair<TKey, IList<TValue>>>.Add(KeyValuePair<TKey, IList<TValue>> item)\r\n        {\r\n            throw new NotImplementedException(\"Mutating ListDictionary IList entry directly is not supported.\");\r\n        }\r\n\r\n        void ICollection<KeyValuePair<TKey, IList<TValue>>>.Clear()\r\n        {\r\n            this.Clear();\r\n        }\r\n\r\n        bool ICollection<KeyValuePair<TKey, IList<TValue>>>.Contains(KeyValuePair<TKey, IList<TValue>> item)\r\n        {\r\n            var e = _dict.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if (object.ReferenceEquals(e.Current, item)) return true;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        void ICollection<KeyValuePair<TKey, IList<TValue>>>.CopyTo(KeyValuePair<TKey, IList<TValue>>[] array, int arrayIndex)\r\n        {\r\n            (_dict as ICollection<KeyValuePair<TKey, IList<TValue>>>).CopyTo(array, arrayIndex);\r\n        }\r\n\r\n        int ICollection<KeyValuePair<TKey, IList<TValue>>>.Count\r\n        {\r\n            get { return this.Count; }\r\n        }\r\n\r\n        bool ICollection<KeyValuePair<TKey, IList<TValue>>>.IsReadOnly\r\n        {\r\n            get { return true; }\r\n        }\r\n\r\n        bool ICollection<KeyValuePair<TKey, IList<TValue>>>.Remove(KeyValuePair<TKey, IList<TValue>> item)\r\n        {\r\n            throw new NotImplementedException(\"Mutating ListDictionary IList entry directly is not supported.\");\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnum Interface\r\n\r\n        public IEnumerator<KeyValuePair<TKey, IList<TValue>>> GetEnumerator()\r\n        {\r\n            return _dict.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _dict.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public class ListCollection : ICollection<IList<TValue>>\r\n        {\r\n\r\n            private ListDictionary<TKey, TValue> _listDict;\r\n\r\n            internal ListCollection(ListDictionary<TKey, TValue> listDict)\r\n            {\r\n                _listDict = listDict;\r\n            }\r\n\r\n            public IList<TValue> this[TKey key]\r\n            {\r\n                get\r\n                {\r\n                    IList<TValue> result;\r\n                    if (_listDict._dict.TryGetValue(key, out result))\r\n                    {\r\n                        return result;\r\n                    }\r\n                    else\r\n                    {\r\n                        throw new KeyNotFoundException();\r\n                    }\r\n                }\r\n            }\r\n\r\n            public bool TryGetList(TKey key, out IList<TValue> lst)\r\n            {\r\n                return _listDict._dict.TryGetValue(key, out lst);\r\n            }\r\n\r\n            #region ICollection Interface\r\n\r\n            void ICollection<IList<TValue>>.Add(IList<TValue> item)\r\n            {\r\n                throw new NotImplementedException(\"Mutating a value collection derived from a dictionary is not allowed.\");\r\n            }\r\n\r\n            void ICollection<IList<TValue>>.Clear()\r\n            {\r\n                throw new NotImplementedException(\"Mutating a value collection derived from a dictionary is not allowed.\");\r\n            }\r\n\r\n            public bool Contains(IList<TValue> item)\r\n            {\r\n                var e = _listDict._dict.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (e.Current.Value == item) return true;\r\n                }\r\n                return false;\r\n            }\r\n\r\n            public void CopyTo(IList<TValue>[] array, int arrayIndex)\r\n            {\r\n                _listDict._dict.Values.CopyTo(array, arrayIndex);\r\n            }\r\n\r\n            public int Count\r\n            {\r\n                get { return _listDict._dict.Count; }\r\n            }\r\n\r\n            public bool IsReadOnly\r\n            {\r\n                get { return true; }\r\n            }\r\n\r\n            bool ICollection<IList<TValue>>.Remove(IList<TValue> item)\r\n            {\r\n                throw new NotImplementedException(\"Mutating a value collection derived from a dictionary is not allowed.\");\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IEnumerable Interface\r\n\r\n            //TODO - implement propert Enumerator, remember dict.Values allocates mem in mono... ugh\r\n\r\n            public IEnumerator<IList<TValue>> GetEnumerator()\r\n            {\r\n                return _listDict._dict.Values.GetEnumerator();\r\n            }\r\n\r\n            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n            {\r\n                return _listDict._dict.Values.GetEnumerator();\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/MultitonPool.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\nusing System.Collections;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n\r\n    public interface IMultitonPool<T> : IEnumerable<T> where T : class\r\n    {\r\n\r\n        int Count { get; }\r\n\r\n        void AddReference(T obj);\r\n        bool RemoveReference(T obj);\r\n        bool Contains(T obj);\r\n\r\n        T Find(System.Func<T, bool> predicate);\r\n\r\n        T[] FindAll(System.Func<T, bool> predicate);\r\n        int FindAll(ICollection<T> coll, System.Func<T, bool> predicate);\r\n        int FindAll<TSub>(ICollection<TSub> coll, System.Func<TSub, bool> predicate) where TSub : class, T;\r\n\r\n        /// <summary>\r\n        /// Use for linq if you want to enumerate a specific subtype.\r\n        /// </summary>\r\n        /// <typeparam name=\"TSub\"></typeparam>\r\n        /// <returns></returns>\r\n        IEnumerable<TSub> Enumerate<TSub>() where TSub : class, T;\r\n\r\n    }\r\n\r\n    public class MultitonPool<T> : IMultitonPool<T> where T : class\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private HashSet<T> _pool;\r\n        private bool _querying;\r\n        private System.Action _queryCompleteAction;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public MultitonPool()\r\n        {\r\n            _pool = new HashSet<T>();\r\n        }\r\n\r\n        public MultitonPool(IEqualityComparer<T> comparer)\r\n        {\r\n            _pool = new HashSet<T>(comparer);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool IsQuerying\r\n        {\r\n            get { return _querying; }\r\n        }\r\n\r\n        protected System.Action QueryCompleteAction\r\n        {\r\n            get { return _queryCompleteAction; }\r\n            set { _queryCompleteAction = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IMultitonPool Interface\r\n\r\n        public int Count\r\n        {\r\n            get { return _pool.Count; }\r\n        }\r\n\r\n        public virtual void AddReference(T obj)\r\n        {\r\n            if (object.ReferenceEquals(obj, null)) throw new System.ArgumentNullException();\r\n\r\n            if (_querying)\r\n            {\r\n                if (!_pool.Contains(obj)) _queryCompleteAction += () => _pool.Add(obj);\r\n            }\r\n            else\r\n            {\r\n                _pool.Add(obj);\r\n            }\r\n        }\r\n\r\n        public virtual bool RemoveReference(T obj)\r\n        {\r\n            if (object.ReferenceEquals(obj, null)) throw new System.ArgumentNullException();\r\n\r\n            if (_querying)\r\n            {\r\n                if (_pool.Contains(obj))\r\n                {\r\n                    _queryCompleteAction += () => _pool.Remove(obj);\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    return false;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return _pool.Remove(obj);\r\n            }\r\n        }\r\n\r\n        public bool Contains(T obj)\r\n        {\r\n            return _pool.Contains(obj);\r\n        }\r\n\r\n        public T Find(System.Func<T, bool> predicate)\r\n        {\r\n            if (_querying) throw new System.InvalidOperationException(\"MultitonPool is already in the process of a query.\");\r\n            _querying = true;\r\n\r\n            try\r\n            {\r\n                var e = _pool.GetEnumerator();\r\n                if (predicate == null)\r\n                {\r\n                    if (e.MoveNext())\r\n                        return e.Current;\r\n                    else\r\n                        return null;\r\n                }\r\n\r\n                while (e.MoveNext())\r\n                {\r\n                    if (predicate(e.Current)) return e.Current;\r\n                }\r\n                return null;\r\n            }\r\n            finally\r\n            {\r\n                if (_queryCompleteAction != null)\r\n                {\r\n                    _queryCompleteAction();\r\n                    _queryCompleteAction = null;\r\n                }\r\n                _querying = false;\r\n            }\r\n        }\r\n\r\n        public TSub Find<TSub>(System.Func<TSub, bool> predicate) where TSub : class, T\r\n        {\r\n            if (_querying) throw new System.InvalidOperationException(\"MultitonPool is already in the process of a query.\");\r\n            _querying = true;\r\n\r\n            try\r\n            {\r\n                var e = _pool.GetEnumerator();\r\n                if (predicate == null)\r\n                {\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (e.Current is TSub) return e.Current as TSub;\r\n                    }\r\n                }\r\n\r\n                while (e.MoveNext())\r\n                {\r\n                    if (e.Current is TSub && predicate(e.Current as TSub)) return e.Current as TSub;\r\n                }\r\n                return null;\r\n            }\r\n            finally\r\n            {\r\n                if (_queryCompleteAction != null)\r\n                {\r\n                    _queryCompleteAction();\r\n                    _queryCompleteAction = null;\r\n                }\r\n                _querying = false;\r\n            }\r\n        }\r\n\r\n        public T[] FindAll(System.Func<T, bool> predicate)\r\n        {\r\n            if (_querying) throw new System.InvalidOperationException(\"MultitonPool is already in the process of a query.\");\r\n\r\n            try\r\n            {\r\n                if (predicate == null)\r\n                {\r\n                    _querying = true;\r\n\r\n                    T[] arr = new T[_pool.Count];\r\n                    var e = _pool.GetEnumerator();\r\n                    int i = 0;\r\n                    while (e.MoveNext())\r\n                    {\r\n                        arr[i] = e.Current;\r\n                        i++;\r\n                    }\r\n                    return arr;\r\n                }\r\n                else\r\n                {\r\n                    using (var lst = TempCollection.GetList<T>())\r\n                    {\r\n                        FindAll(lst, predicate);\r\n                        return lst.ToArray();\r\n                    }\r\n                }\r\n            }\r\n            finally\r\n            {\r\n                if (_queryCompleteAction != null)\r\n                {\r\n                    _queryCompleteAction();\r\n                    _queryCompleteAction = null;\r\n                }\r\n                _querying = false;\r\n            }\r\n        }\r\n\r\n        public TSub[] FindAll<TSub>(System.Func<TSub, bool> predicate) where TSub : class, T\r\n        {\r\n            if (_querying) throw new System.InvalidOperationException(\"MultitonPool is already in the process of a query.\");\r\n\r\n            try\r\n            {\r\n                using (var lst = TempCollection.GetList<TSub>())\r\n                {\r\n                    FindAll<TSub>(lst, predicate);\r\n                    return lst.ToArray();\r\n                }\r\n            }\r\n            finally\r\n            {\r\n                if (_queryCompleteAction != null)\r\n                {\r\n                    _queryCompleteAction();\r\n                    _queryCompleteAction = null;\r\n                }\r\n                _querying = false;\r\n            }\r\n        }\r\n\r\n        public int FindAll(ICollection<T> coll, System.Func<T, bool> predicate)\r\n        {\r\n            if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n            if (_querying) throw new System.InvalidOperationException(\"MultitonPool is already in the process of a query.\");\r\n            _querying = true;\r\n\r\n            try\r\n            {\r\n                int cnt = 0;\r\n                var e = _pool.GetEnumerator();\r\n                if (predicate == null)\r\n                {\r\n                    while (e.MoveNext())\r\n                    {\r\n                        coll.Add(e.Current);\r\n                        cnt++;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (predicate(e.Current))\r\n                        {\r\n                            coll.Add(e.Current);\r\n                            cnt++;\r\n                        }\r\n                    }\r\n                }\r\n                return cnt;\r\n            }\r\n            finally\r\n            {\r\n                if (_queryCompleteAction != null)\r\n                {\r\n                    _queryCompleteAction();\r\n                    _queryCompleteAction = null;\r\n                }\r\n                _querying = false;\r\n            }\r\n        }\r\n\r\n        public int FindAll<TSub>(ICollection<TSub> coll, System.Func<TSub, bool> predicate) where TSub : class, T\r\n        {\r\n            if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n            if (_querying) throw new System.InvalidOperationException(\"MultitonPool is already in the process of a query.\");\r\n            _querying = true;\r\n\r\n            try\r\n            {\r\n                int cnt = 0;\r\n                var e = _pool.GetEnumerator();\r\n                if (predicate == null)\r\n                {\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (e.Current is TSub)\r\n                        {\r\n                            coll.Add((TSub)e.Current);\r\n                            cnt++;\r\n                        }\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (e.Current is TSub && predicate((TSub)e.Current))\r\n                        {\r\n                            coll.Add((TSub)e.Current);\r\n                            cnt++;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                return cnt;\r\n            }\r\n            finally\r\n            {\r\n                if (_queryCompleteAction != null)\r\n                {\r\n                    _queryCompleteAction();\r\n                    _queryCompleteAction = null;\r\n                }\r\n                _querying = false;\r\n            }\r\n        }\r\n\r\n        public IEnumerable<TSub> Enumerate<TSub>() where TSub : class, T\r\n        {\r\n            var e = _pool.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                if (e.Current is TSub) yield return e.Current as TSub;\r\n            }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public Enumerator GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        IEnumerator<T> IEnumerable<T>.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public struct Enumerator : IEnumerator<T>\r\n        {\r\n\r\n            #region Fields\r\n\r\n            private HashSet<T>.Enumerator _e;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            public Enumerator(MultitonPool<T> multi)\r\n            {\r\n                if (multi == null) throw new System.ArgumentNullException();\r\n                _e = multi._pool.GetEnumerator();\r\n            }\r\n\r\n            #endregion\r\n\r\n            public T Current\r\n            {\r\n                get\r\n                {\r\n                    return _e.Current;\r\n                }\r\n            }\r\n\r\n            object IEnumerator.Current\r\n            {\r\n                get\r\n                {\r\n                    return _e.Current;\r\n                }\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                _e.Dispose();\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                return _e.MoveNext();\r\n            }\r\n\r\n            void IEnumerator.Reset()\r\n            {\r\n                (_e as IEnumerator).Reset();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n    \r\n    public class UniqueToEntityMultitonPool<T> : MultitonPool<T> where T : class\r\n    {\r\n        \r\n        #region CONSTRUCTOR\r\n\r\n        public UniqueToEntityMultitonPool() : base()\r\n        {\r\n        }\r\n\r\n        public UniqueToEntityMultitonPool(IEqualityComparer<T> comparer) : base(comparer)\r\n        {\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public bool IsSource(object obj)\r\n        {\r\n            return GetFromSource(obj) != null;\r\n        }\r\n\r\n        public T GetFromSource(object obj)\r\n        {\r\n            if (obj == null) return null;\r\n            if (obj is T) return this.Contains(obj as T) ? obj as T : null;\r\n\r\n            var entity = SPEntity.Pool.GetFromSource(obj);\r\n            if (entity == null) return null;\r\n            //if (entity is T) return this.Contains(entity as T) ? entity as T : null;\r\n            if (entity is T) return entity as T;\r\n\r\n            var result = entity.GetComponentInChildren<T>();\r\n            return this.Contains(result) ? result : null;\r\n        }\r\n\r\n        public bool GetFromSource(object obj, out T comp)\r\n        {\r\n            comp = GetFromSource(obj);\r\n            return comp != null;\r\n        }\r\n\r\n\r\n\r\n\r\n        public bool IsSource<TSub>(object obj) where TSub : class, T\r\n        {\r\n            if (obj is TSub) return true;\r\n\r\n            return GetFromSource<TSub>(obj) != null;\r\n        }\r\n\r\n        public TSub GetFromSource<TSub>(object obj) where TSub : class, T\r\n        {\r\n            if (obj == null) return null;\r\n            if (obj is TSub) return obj as TSub;\r\n\r\n            var entity = SPEntity.Pool.GetFromSource(obj);\r\n            if (entity == null) return null;\r\n            //if (entity is TSub) return this.Contains(entity as TSub) ? entity as TSub : null;\r\n            if (entity is TSub) return entity as TSub;\r\n\r\n            var result = entity.GetComponentInChildren<TSub>();\r\n            return this.Contains(result) ? result : null;\r\n        }\r\n        \r\n        public bool GetFromSource<TSub>(object obj, out TSub comp) where TSub : class, T\r\n        {\r\n            comp = GetFromSource<TSub>(obj);\r\n            return comp != null;\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/NotificationPool.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n    public class NotificationPool : ICollection<INotificationDispatcher>\r\n    {\r\n\r\n        #region Events\r\n\r\n        public event NotificationHandler OnNotification;\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        private HashSet<INotificationDispatcher> _coll = new HashSet<INotificationDispatcher>();\r\n        private List<System.Type> _registeredNotifications = new List<System.Type>();\r\n        private NotificationHandler _genericHandler;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public NotificationPool()\r\n        {\r\n            _genericHandler = new NotificationHandler(this.HandleGenericNotification);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void RegisterNotificationType<T>() where T : Notification\r\n        {\r\n            var notificationType = typeof(T);\r\n            if (_registeredNotifications.Contains(notificationType)) return;\r\n            _registeredNotifications.Add(notificationType);\r\n\r\n            var e = _coll.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                e.Current.Observers.UnsafeRegisterObserver(notificationType, _genericHandler);\r\n            }\r\n        }\r\n\r\n        public void RegisterNotificationType(System.Type notificationType)\r\n        {\r\n            if (notificationType == null || !TypeUtil.IsType(notificationType, typeof(Notification))) throw new TypeArgumentMismatchException(notificationType, typeof(Notification), \"notificationType\");\r\n            if (_registeredNotifications.Contains(notificationType)) return;\r\n            _registeredNotifications.Add(notificationType);\r\n\r\n            var e = _coll.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                e.Current.Observers.UnsafeRegisterObserver(notificationType, _genericHandler);\r\n            }\r\n        }\r\n\r\n        public void UnRegisterNotification<T>() where T : Notification\r\n        {\r\n            var notificationType = typeof(T);\r\n            if (_registeredNotifications.Remove(notificationType))\r\n            {\r\n                var e = _coll.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    e.Current.Observers.UnsafeRemoveObserver(notificationType, _genericHandler);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void UnRegisterNotification(System.Type notificationType)\r\n        {\r\n            if (notificationType == null || !TypeUtil.IsType(notificationType, typeof(Notification))) throw new TypeArgumentMismatchException(notificationType, typeof(Notification), \"notificationType\");\r\n            if (_registeredNotifications.Remove(notificationType))\r\n            {\r\n                var e = _coll.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    e.Current.Observers.UnsafeRemoveObserver(notificationType, _genericHandler);\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool ContainsNotificationType<T>() where T : Notification\r\n        {\r\n            return _registeredNotifications.Contains(typeof(T));\r\n        }\r\n\r\n        public bool ContainsNotificationType(System.Type notificationType)\r\n        {\r\n            if (notificationType == null || !TypeUtil.IsType(notificationType, typeof(Notification))) throw new TypeArgumentMismatchException(notificationType, typeof(Notification), \"notificationType\");\r\n            return _registeredNotifications.Contains(notificationType);\r\n        }\r\n\r\n        public void Add(GameObject go)\r\n        {\r\n            if (go == null) throw new System.ArgumentNullException(\"go\");\r\n\r\n            var d = go.AddOrGetComponent<GameObjectNotificationDispatcher>();\r\n            this.Add(d);\r\n        }\r\n\r\n        public bool Contains(GameObject go)\r\n        {\r\n            if (go == null) throw new System.ArgumentNullException(\"go\");\r\n            \r\n            using (var lst = TempCollection.GetList<INotificationDispatcher>())\r\n            {\r\n                go.GetComponents<INotificationDispatcher>(lst);\r\n                var e = lst.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    if (this.Contains(e.Current)) return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public void Remove(GameObject go)\r\n        {\r\n            if (go == null) throw new System.ArgumentNullException(\"go\");\r\n            \r\n            using (var lst = TempCollection.GetList<INotificationDispatcher>())\r\n            {\r\n                go.GetComponents<INotificationDispatcher>(lst);\r\n                var e = lst.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (_coll.Contains(e.Current)) this.Remove(e.Current);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Notification Forwarding Handler\r\n\r\n        private void HandleGenericNotification(object sender, Notification n)\r\n        {\r\n            if (this.OnNotification != null) this.OnNotification(sender, n);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        public int Count\r\n        {\r\n            get { return _coll.Count; }\r\n        }\r\n\r\n        public bool IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        public void Add(INotificationDispatcher item)\r\n        {\r\n            if (item == null) throw new System.ArgumentNullException(\"item\");\r\n            if (_coll.Contains(item)) return;\r\n\r\n            _coll.Add(item);\r\n            var e = _registeredNotifications.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                item.Observers.UnsafeRegisterObserver(e.Current, _genericHandler);\r\n            }\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            var e = _coll.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                var e2 = _registeredNotifications.GetEnumerator();\r\n                while(e2.MoveNext())\r\n                {\r\n                    e.Current.Observers.UnsafeRemoveObserver(e2.Current, _genericHandler);\r\n                }\r\n            }\r\n\r\n            _coll.Clear();\r\n        }\r\n\r\n        public bool Contains(INotificationDispatcher item)\r\n        {\r\n            return _coll.Contains(item);\r\n        }\r\n\r\n        public void CopyTo(INotificationDispatcher[] array, int arrayIndex)\r\n        {\r\n            _coll.CopyTo(array, arrayIndex);\r\n        }\r\n\r\n        public bool Remove(INotificationDispatcher item)\r\n        {\r\n            if (_coll.Remove(item))\r\n            {\r\n                var e = _registeredNotifications.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    item.Observers.UnsafeRemoveObserver(e.Current, _genericHandler);\r\n                }\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _coll.GetEnumerator();\r\n        }\r\n\r\n        public IEnumerator<INotificationDispatcher> GetEnumerator()\r\n        {\r\n            return _coll.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/ObjectCachePool.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n\r\n    /// <summary>\r\n    /// Creates a pool that will cache instances of objects for later use so that you don't have to construct them again. \r\n    /// There is a max cache size, if set to 0 or less, it's considered endless in size.\r\n    /// </summary>\r\n    /// <typeparam name=\"T\"></typeparam>\r\n    public class ObjectCachePool<T> : ICachePool<T> where T : class\r\n    {\r\n\r\n        #region Fields\r\n        \r\n        private HashSet<T> _inactive;\r\n\r\n        private int _cacheSize;\r\n        private Func<T> _constructorDelegate;\r\n        private Action<T> _resetObjectDelegate;\r\n        private bool _resetOnGet;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public ObjectCachePool(int cacheSize)\r\n        {\r\n            _cacheSize = cacheSize;\r\n            //_inactive = (_cacheSize <= 0) ? new Bag<T>() : new Bag<T>(_cacheSize);\r\n            _inactive = new HashSet<T>();\r\n            _constructorDelegate = this.SimpleConstructor;\r\n        }\r\n\r\n        public ObjectCachePool(int cacheSize, Func<T> constructorDelegate)\r\n        {\r\n            _cacheSize = cacheSize;\r\n            //_inactive = (_cacheSize <= 0) ? new Bag<T>() : new Bag<T>(_cacheSize);\r\n            _inactive = new HashSet<T>();\r\n            _constructorDelegate = (constructorDelegate != null) ? constructorDelegate : this.SimpleConstructor;\r\n        }\r\n\r\n        public ObjectCachePool(int cacheSize, Func<T> constructorDelegate, Action<T> resetObjectDelegate)\r\n        {\r\n            _cacheSize = cacheSize;\r\n            //_inactive = (_cacheSize <= 0) ? new Bag<T>() : new Bag<T>(_cacheSize);\r\n            _inactive = new HashSet<T>();\r\n            _constructorDelegate = (constructorDelegate != null) ? constructorDelegate : this.SimpleConstructor;\r\n            _resetObjectDelegate = resetObjectDelegate;\r\n        }\r\n\r\n        public ObjectCachePool(int cacheSize, Func<T> constructorDelegate, Action<T> resetObjectDelegate, bool resetOnGet)\r\n        {\r\n            _cacheSize = cacheSize;\r\n            //_inactive = (_cacheSize <= 0) ? new Bag<T>() : new Bag<T>(_cacheSize);\r\n            _inactive = new HashSet<T>();\r\n            _constructorDelegate = (constructorDelegate != null) ? constructorDelegate : this.SimpleConstructor;\r\n            _resetObjectDelegate = resetObjectDelegate;\r\n            _resetOnGet = resetOnGet;\r\n        }\r\n\r\n        private T SimpleConstructor()\r\n        {\r\n            return Activator.CreateInstance<T>();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int CacheSize\r\n        {\r\n            get { return _cacheSize; }\r\n            set\r\n            {\r\n                _cacheSize = value;\r\n            }\r\n        }\r\n\r\n        public bool ResetOnGet\r\n        {\r\n            get { return _resetOnGet; }\r\n            set { _resetOnGet = value; }\r\n        }\r\n\r\n        public int InactiveCount\r\n        {\r\n            get { return _inactive.Count; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public bool TryGetInstance(out T result)\r\n        {\r\n            result = null;\r\n            lock(_inactive)\r\n            {\r\n                if(_inactive.Count > 0)\r\n                {\r\n                    result = _inactive.Pop();\r\n                }\r\n            }\r\n            if (result != null)\r\n            {\r\n                if(_resetOnGet && _resetObjectDelegate != null)\r\n                    _resetObjectDelegate(result);\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public T GetInstance()\r\n        {\r\n            T result = null;\r\n            lock(_inactive)\r\n            {\r\n                if(_inactive.Count > 0)\r\n                {\r\n                    result = _inactive.Pop();\r\n                }\r\n            }\r\n            if (result != null)\r\n            {\r\n                if (_resetOnGet && _resetObjectDelegate != null)\r\n                    _resetObjectDelegate(result);\r\n                return result;\r\n            }\r\n            else\r\n            {\r\n                return _constructorDelegate();\r\n            }\r\n        }\r\n\r\n        public bool Release(T obj)\r\n        {\r\n            if (obj == null) throw new System.ArgumentNullException(\"obj\");\r\n            \r\n            int cacheSize = _cacheSize > 0 ? _cacheSize : 1024; //we actually don't allow the cache size to get out of hand\r\n            if (!_resetOnGet && _resetObjectDelegate != null && _inactive.Count < cacheSize) _resetObjectDelegate(obj);\r\n\r\n            lock(_inactive)\r\n            {\r\n                if(_inactive.Count < cacheSize)\r\n                {\r\n                    _inactive.Add(obj);\r\n                    return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        void ICachePool<T>.Release(T obj)\r\n        {\r\n            this.Release(obj);\r\n        }\r\n\r\n        public bool IsTreatedAsInactive(T obj)\r\n        {\r\n            return _inactive.Contains(obj);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/ObjectInstanceIDEqualityComparer.cs",
    "content": "﻿using System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n\r\n    /// <summary>\r\n    /// Tests for equality based solely on if the references are equal. This is useful for UnityEngine.Objects that overrides the default Equals \r\n    /// operator returning false if it's been destroyed.\r\n    /// </summary>\r\n    /// <typeparam name=\"T\"></typeparam>\r\n    public class ObjectInstanceIDEqualityComparer<T> : EqualityComparer<T> where T : UnityEngine.Object\r\n    {\r\n        private static IEqualityComparer<T> _defaultComparer;\r\n\r\n        public new static IEqualityComparer<T> Default\r\n        {\r\n            get { return _defaultComparer ?? (_defaultComparer = new ObjectInstanceIDEqualityComparer<T>()); }\r\n        }\r\n\r\n        #region IEqualityComparer<T> Members\r\n\r\n        public override bool Equals(T x, T y)\r\n        {\r\n            return GetHashCode(x) == GetHashCode(y);\r\n        }\r\n\r\n        public override int GetHashCode(T obj)\r\n        {\r\n            if (object.ReferenceEquals(obj, null)) return 0;\r\n            return obj.GetInstanceID();\r\n        }\r\n\r\n        #endregion\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/ObjectReferenceEqualityComparer.cs",
    "content": "﻿using System.Collections.Generic;\r\nusing System.Runtime.CompilerServices;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n\r\n    /// <summary>\r\n    /// Tests for equality based solely on if the references are equal. This is useful for UnityEngine.Objects that overrides the default Equals \r\n    /// operator returning false if it's been destroyed.\r\n    /// </summary>\r\n    /// <typeparam name=\"T\"></typeparam>\r\n    public class ObjectReferenceEqualityComparer<T> : EqualityComparer<T> where T : class\r\n    {\r\n        private static IEqualityComparer<T> _defaultComparer;\r\n\r\n        public new static IEqualityComparer<T> Default\r\n        {\r\n            get { return _defaultComparer ?? (_defaultComparer = new ObjectReferenceEqualityComparer<T>()); }\r\n        }\r\n\r\n        #region IEqualityComparer<T> Members\r\n\r\n        public override bool Equals(T x, T y)\r\n        {\r\n            return ReferenceEquals(x, y);\r\n        }\r\n\r\n        public override int GetHashCode(T obj)\r\n        {\r\n            return RuntimeHelpers.GetHashCode(obj);\r\n        }\r\n\r\n        #endregion\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/OrderedDelegate.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n\r\n    public class OrderedDelegate : IEnumerable<OrderedDelegate.DelegateEntry>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private List<DelegateEntry> _delegates = new List<DelegateEntry>();\r\n        private Delegate _callback;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public OrderedDelegate()\r\n        {\r\n\r\n        }\r\n\r\n        public OrderedDelegate(Delegate del)\r\n        {\r\n            this.Add(del);\r\n        }\r\n\r\n        public OrderedDelegate(Delegate del, int precedence)\r\n        {\r\n            this.Add(del, precedence);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool HasEntries\r\n        {\r\n            get { return _delegates.Count > 0; }\r\n        }\r\n\r\n        public float HighestPrecedence\r\n        {\r\n            get\r\n            {\r\n                if (_delegates.Count == 0) return float.NaN;\r\n                return _delegates[0].Precedence;\r\n            }\r\n        }\r\n\r\n        public float MinPrecedence\r\n        {\r\n            get\r\n            {\r\n                if (_delegates.Count == 0) return float.NaN;\r\n                return _delegates[_delegates.Count - 1].Precedence;\r\n            }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected Delegate GetDelegate()\r\n        {\r\n            if(_callback == null && _delegates.Count > 0)\r\n            {\r\n                Delegate[] arr = new Delegate[_delegates.Count];\r\n                for(int i = 0; i < _delegates.Count; i++)\r\n                {\r\n                    arr[i] = _delegates[i].Delegate;\r\n                }\r\n                _callback = Delegate.Combine(arr);\r\n            }\r\n            return _callback;\r\n        }\r\n\r\n        public void DynamicInvoke(params object[] args)\r\n        {\r\n            var d = this.GetDelegate();\r\n            if (d != null) d.DynamicInvoke(args);\r\n        }\r\n\r\n        public void Add(Delegate del)\r\n        {\r\n            if (del == null) throw new System.ArgumentNullException(\"del\");\r\n\r\n            float prec = (_delegates.Count > 0) ? _delegates[_delegates.Count - 1].Precedence : 0f;\r\n            _delegates.Add(new DelegateEntry(del, prec, null));\r\n            _callback = null;\r\n        }\r\n\r\n        public void Add(Delegate del, float precedence, object tag = null)\r\n        {\r\n            if (del == null) throw new System.ArgumentNullException(\"del\");\r\n\r\n            int i = this.FindInsertLocationOfPrecedence(precedence);\r\n            _delegates.Insert(i, new DelegateEntry(del, precedence, tag));\r\n            _callback = null;\r\n        }\r\n\r\n        public bool Contains(Delegate del)\r\n        {\r\n            return FindIndexOf(del) >= 0;\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _delegates.Clear();\r\n            _callback = null;\r\n        }\r\n\r\n        public bool Remove(Delegate del)\r\n        {\r\n            int index = FindIndexOf(del);\r\n            if (index >= 0)\r\n            {\r\n                _delegates.RemoveAt(index);\r\n                _callback = null;\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n\r\n\r\n        private int FindIndexOf(Delegate del)\r\n        {\r\n            for (int i = 0; i < _delegates.Count; i++)\r\n            {\r\n                if (_delegates[i].Delegate == del) return i;\r\n            }\r\n            return -1;\r\n        }\r\n\r\n        private int FindInsertLocationOfPrecedence(float precedence)\r\n        {\r\n            for (int i = 0; i < _delegates.Count; i++)\r\n            {\r\n                if (precedence > _delegates[i].Precedence)\r\n                {\r\n                    return i;\r\n                }\r\n            }\r\n            return _delegates.Count;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public IEnumerator<OrderedDelegate.DelegateEntry> GetEnumerator()\r\n        {\r\n            return _delegates.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Operators\r\n\r\n        public static OrderedDelegate operator +(OrderedDelegate a, Delegate b)\r\n        {\r\n            if (a == null) throw new System.ArgumentNullException(\"a\");\r\n            if (b == null) throw new System.ArgumentNullException(\"b\");\r\n            a.Add(b);\r\n            return a;\r\n        }\r\n\r\n        public static OrderedDelegate operator -(OrderedDelegate a, Delegate b)\r\n        {\r\n            if (a == null) throw new System.ArgumentNullException(\"a\");\r\n            if (b == null) throw new System.ArgumentNullException(\"b\");\r\n            a.Remove(b);\r\n            return a;\r\n        }\r\n\r\n        public static implicit operator OrderedDelegate(Delegate d)\r\n        {\r\n            return new OrderedDelegate(d);\r\n        }\r\n\r\n        //public static explicit operator OrderedDelegate(Delegate d)\r\n        //{\r\n        //    return new OrderedDelegate(d);\r\n        //}\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public struct DelegateEntry\r\n        {\r\n            public Delegate Delegate;\r\n            public float Precedence;\r\n            public object Tag;\r\n\r\n            public DelegateEntry(Delegate del, float prec, object tag)\r\n            {\r\n                this.Delegate = del;\r\n                this.Precedence = prec;\r\n                this.Tag = tag;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    public class OrderedDelegate<T> : OrderedDelegate where T : class\r\n    {\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public OrderedDelegate()\r\n        {\r\n            if (!com.spacepuppy.Utils.TypeUtil.IsType(typeof(T), typeof(Delegate)))\r\n            {\r\n                throw new System.InvalidOperationException(\"Cannot create an OrderedDelegate<T> where T does not inherit from System.Delegate.\");\r\n            }\r\n        }\r\n\r\n        public OrderedDelegate(T del)\r\n            : this()\r\n        {\r\n            this.Add(del);\r\n        }\r\n\r\n        public OrderedDelegate(T del, int precedence)\r\n            : this()\r\n        {\r\n            this.Add(del, precedence);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public T Invoke\r\n        {\r\n            get\r\n            {\r\n                return this.GetDelegate() as T;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Add(T del)\r\n        {\r\n            base.Add(del as Delegate);\r\n        }\r\n\r\n        public void Add(T del, float precedence, object tag = null)\r\n        {\r\n            base.Add(del as Delegate, precedence, tag);\r\n        }\r\n\r\n        public bool Remove(T del)\r\n        {\r\n            return base.Remove(del as Delegate);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Operators\r\n\r\n        public static OrderedDelegate<T> operator +(OrderedDelegate<T> a, T b)\r\n        {\r\n            if (a == null) throw new System.ArgumentNullException(\"a\");\r\n            if (b == null) throw new System.ArgumentNullException(\"b\");\r\n            a.Add(b);\r\n            return a;\r\n        }\r\n\r\n        public static T operator +(T a, OrderedDelegate<T> b)\r\n        {\r\n            if (a == null) throw new System.ArgumentNullException(\"a\");\r\n            if (b == null) throw new System.ArgumentNullException(\"b\");\r\n            foreach (var d in b)\r\n            {\r\n                //a = Delegate.Combine(a as Delegate, d) as T;\r\n            }\r\n            return a;\r\n        }\r\n\r\n        public static OrderedDelegate<T> operator -(OrderedDelegate<T> a, T b)\r\n        {\r\n            if (a == null) throw new System.ArgumentNullException(\"a\");\r\n            if (b == null) throw new System.ArgumentNullException(\"b\");\r\n            a.Remove(b);\r\n            return a;\r\n        }\r\n\r\n        public static T operator -(T a, OrderedDelegate<T> b)\r\n        {\r\n            if (a == null) throw new System.ArgumentNullException(\"a\");\r\n            if (b == null) throw new System.ArgumentNullException(\"b\");\r\n            foreach (var d in b)\r\n            {\r\n                //a = Delegate.Remove(a as Delegate, d) as T;\r\n            }\r\n            return a;\r\n        }\r\n\r\n        public static implicit operator OrderedDelegate<T>(T d)\r\n        {\r\n            return new OrderedDelegate<T>(d);\r\n        }\r\n\r\n        //public static explicit operator OrderedDelegate<T>(T d)\r\n        //{\r\n        //    return new OrderedDelegate<T>(d);\r\n        //}\r\n\r\n        #endregion\r\n\r\n    }\r\n    \r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/PointOctree.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Collections\n{\n\n    public class PointOctree<T> where T : class\n    {\n\n        public const float DEFAULT_MINSIZE = 1f;\n\n        const int CHILD_COUNT = 8;\n\n        #region Fields\n\n        private System.Func<T, Vector3> _getPositionFunc;\n        private IEqualityComparer<T> _comparer;\n\n        private float _minSize;\n\n        private int _count;\n        private Octant _root;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public PointOctree(System.Func<T, Vector3> getPosFunc)\n        {\n            if (getPosFunc == null) throw new System.ArgumentNullException(\"getPosFunc\");\n            _minSize = DEFAULT_MINSIZE;\n            _getPositionFunc = getPosFunc;\n            _comparer = EqualityComparer<T>.Default;\n\n            _root = new Octant(this, _minSize, Vector3.zero);\n        }\n\n        public PointOctree(System.Func<T, Vector3> getPosFunc, IEqualityComparer<T> comparer)\n        {\n            if (getPosFunc == null) throw new System.ArgumentNullException(\"getPosFunc\");\n            _minSize = DEFAULT_MINSIZE;\n            _getPositionFunc = getPosFunc;\n            _comparer = comparer ?? EqualityComparer<T>.Default;\n\n            _root = new Octant(this, _minSize, Vector3.zero);\n        }\n\n        public PointOctree(float minSize, System.Func<T, Vector3> getPosFunc)\n        {\n            if (getPosFunc == null) throw new System.ArgumentNullException(\"getPosFunc\");\n            _minSize = minSize;\n            _getPositionFunc = getPosFunc;\n            _comparer = EqualityComparer<T>.Default;\n\n            _root = new Octant(this, _minSize, Vector3.zero);\n        }\n\n        public PointOctree(float minSize, System.Func<T, Vector3> getPosFunc, IEqualityComparer<T> comparer)\n        {\n            if (getPosFunc == null) throw new System.ArgumentNullException(\"getPosFunc\");\n            _minSize = minSize;\n            _getPositionFunc = getPosFunc;\n            _comparer = comparer ?? EqualityComparer<T>.Default;\n\n            _root = new Octant(this, _minSize, Vector3.zero);\n        }\n\n        #endregion\n\n        #region Properties\n\n        public int Count\n        {\n            get { return _count; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public void Add(T obj)\n        {\n            // Add object or expand the octree until it can be added\n            int count = 0; // Safety check against infinite/excessive growth\n            var pos = _getPositionFunc(obj);\n            while (!_root.Add(obj, pos))\n            {\n                Grow(pos - _root.center);\n                if (++count > 20)\n                {\n                    Debug.LogError(\"Aborted Add operation as it seemed to be going on forever (\" + (count - 1) + \") attempts at growing the octree.\");\n                    return;\n                }\n            }\n            _count++;\n        }\n\n        public bool Contains(T obj)\n        {\n            return _root.Contains(obj);\n        }\n\n        public bool Remove(T obj)\n        {\n            bool removed = _root.Remove(obj);\n\n            // See if we can shrink the octree down now that we've removed the item\n            if (removed)\n            {\n                _count--;\n                Shrink();\n            }\n\n            return removed;\n        }\n\n        /// <summary>\n        /// Recalculates the entire octree by re-polling the positions of all members.\n        /// </summary>\n        public void Resync()\n        {\n            //TODO - do this less naively, need a simple working fix for now\n            //TODO - we should probably store the 'pos' of the object in the 'objects' list so that way we can test if it's moved\n            using (var lst = TempCollection.GetList<T>())\n            {\n                if(_root.GetAll(lst) > 0)\n                {\n                    foreach(var obj in lst)\n                    {\n                        _root.Remove(obj);\n                        _root.Add(obj, _getPositionFunc(obj));\n                    }\n                }\n            }\n        }\n\n        private void Grow(Vector3 direction)\n        {\n            int xDirection = direction.x >= 0 ? 1 : -1;\n            int yDirection = direction.y >= 0 ? 1 : -1;\n            int zDirection = direction.z >= 0 ? 1 : -1;\n            Octant oldRoot = _root;\n            float half = _root.sideLength / 2;\n            float newLength = _root.sideLength * 2;\n            Vector3 newCenter = _root.center + new Vector3(xDirection * half, yDirection * half, zDirection * half);\n\n            // Create a new, bigger octree root node\n            _root = new Octant(this, newLength, newCenter);\n\n            // Create 7 new octree children to go with the old root as children of the new root\n            int rootPos = GetRootPosIndex(xDirection, yDirection, zDirection);\n            Octant[] children = new Octant[8];\n            for (int i = 0; i < 8; i++)\n            {\n                if (i == rootPos)\n                {\n                    children[i] = oldRoot;\n                }\n                else\n                {\n                    xDirection = i % 2 == 0 ? -1 : 1;\n                    yDirection = i > 3 ? -1 : 1;\n                    zDirection = (i < 2 || (i > 3 && i < 6)) ? -1 : 1;\n                    children[i] = new Octant(this, _root.sideLength, newCenter + new Vector3(xDirection * half, yDirection * half, zDirection * half));\n                }\n            }\n\n            // Attach the new children to the new root node\n            _root.children = children;\n        }\n\n        private void Shrink()\n        {\n            _root = _root.ShrinkIfPossible(_minSize);\n        }\n\n\n        public T[] GetNearby(Vector3 position, float maxDistance)\n        {\n            using (var lst = TempCollection.GetList<T>())\n            {\n                _root.GetNearby(lst, ref position, ref maxDistance);\n                return lst.ToArray();\n            }\n        }\n\n        public int GetNearby(ICollection<T> coll, Vector3 position, float maxDistance)\n        {\n            return _root.GetNearby(coll, ref position, ref maxDistance);\n        }\n\n        public T[] GetNearby(Ray ray, float maxDistance)\n        {\n            using (var lst = TempCollection.GetList<T>())\n            {\n                _root.GetNearby(lst, ref ray, ref maxDistance);\n                return lst.ToArray();\n            }\n        }\n\n        public int GetNearby(ICollection<T> coll, Ray ray, float maxDistance)\n        {\n            return _root.GetNearby(coll, ref ray, ref maxDistance);\n        }\n\n        #endregion\n\n        #region Draw Gizmos\n\n        private static int _nestCount;\n\n        /// <summary>\n        /// Draw gizmos for all bounds.\n        /// </summary>\n        public void DrawAllBounds()\n        {\n            _nestCount = 0;\n            _root.DrawAllBounds();\n        }\n\n        /// <summary>\n        /// Draws gizmos for the bounds of all objects in the tree visually for debugging.\n        /// Must be called from OnDrawGizmos externally. See also: DrawAllBounds.\n        /// </summary>\n        public void DrawAllObjects()\n        {\n            _root.DrawAllObjects();\n        }\n\n        #endregion\n\n        #region Static Utils\n\n        /// <summary>\n        /// Used when growing the octree. Works out where the old root node would fit inside a new, larger root node.\n        /// </summary>\n        /// <param name=\"xDir\">X direction of growth. 1 or -1.</param>\n        /// <param name=\"yDir\">Y direction of growth. 1 or -1.</param>\n        /// <param name=\"zDir\">Z direction of growth. 1 or -1.</param>\n        /// <returns>Octant where the root node should be.</returns>\n        static int GetRootPosIndex(int xDir, int yDir, int zDir)\n        {\n            int result = xDir > 0 ? 1 : 0;\n            if (yDir < 0) result += 4;\n            if (zDir > 0) result += 2;\n            return result;\n        }\n\n        #endregion\n\n\n        #region Special Types\n\n        private class Octant\n        {\n\n            #region Fields\n\n            private PointOctree<T> _owner;\n\n            public Bounds bounds;\n            public Vector3 center;\n            public float sideLength;\n\n            public readonly List<T> objects = new List<T>();\n            public Octant[] children;\n\n            #endregion\n\n            #region CONSTRUCTOR\n\n            public Octant(PointOctree<T> owner, float side, Vector3 cent)\n            {\n                _owner = owner;\n                this.SetValues(side, cent);\n\n            }\n\n            #endregion\n\n            #region Methods\n\n            public bool Add(T obj, Vector3 pos)\n            {\n                if (!this.bounds.Contains(pos))\n                {\n                    return false;\n                }\n                this.SubAdd(obj, pos);\n                return true;\n            }\n\n            public bool Contains(T obj)\n            {\n                for (int i = 0; i < objects.Count; i++)\n                {\n                    if (_owner._comparer.Equals(objects[i], obj)) return true;\n                }\n\n                if(children != null)\n                {\n                    for (int i = 0; i < children.Length; i++)\n                    {\n                        if (children[i] != null && children[i].Contains(obj)) return true;\n                    }\n                }\n\n                return false;\n            }\n\n            public bool Remove(T obj)\n            {\n                bool removed = false;\n\n                for (int i = 0; i < objects.Count; i++)\n                {\n                    if (_owner._comparer.Equals(objects[i], obj))\n                    {\n                        objects.RemoveAt(i);\n                        removed = true;\n                        break;\n                    }\n                }\n\n                if (!removed && children != null)\n                {\n                    for (int i = 0; i < 8; i++)\n                    {\n                        removed = children[i].Remove(obj);\n                        if (removed) break;\n                    }\n                }\n\n                if (removed && children != null)\n                {\n                    // Check if we should merge nodes now that we've removed an item\n                    if (ShouldMerge())\n                    {\n                        Merge();\n                    }\n                }\n\n                return removed;\n            }\n\n            public Octant ShrinkIfPossible(float minLength)\n            {\n                if (this.sideLength < (2 * minLength))\n                {\n                    return this;\n                }\n                if (objects.Count == 0 && (children == null || children.Length == 0))\n                {\n                    return this;\n                }\n\n                // Check objects in root\n                int bestFit = -1;\n                for (int i = 0; i < objects.Count; i++)\n                {\n                    int newBestFit = BestFitChild(_owner._getPositionFunc(objects[i]));\n                    if (i == 0 || newBestFit == bestFit)\n                    {\n                        if (bestFit < 0)\n                        {\n                            bestFit = newBestFit;\n                        }\n                    }\n                    else\n                    {\n                        return this; // Can't reduce - objects fit in different octants\n                    }\n                }\n\n                // Check objects in children if there are any\n                if (children != null)\n                {\n                    // Check objects in children if there are any\n                    bool childHadContent = false;\n                    for (int i = 0; i < children.Length; i++)\n                    {\n                        if (children[i].HasAnyObjects())\n                        {\n                            if (childHadContent)\n                            {\n                                return this; // Can't shrink - another child had content already\n                            }\n                            if (bestFit >= 0 && bestFit != i)\n                            {\n                                return this; // Can't reduce - objects in root are in a different octant to objects in child\n                            }\n                            childHadContent = true;\n                            bestFit = i;\n                        }\n                    }\n                }\n\n                //can reduce\n                if(children == null || bestFit < 0)\n                {\n                    // We don't have any children, so just shrink this node to the new size\n                    // We already know that everything will still fit in it\n                    this.SetValues(this.sideLength / 2, this.GetChildCenter(bestFit));\n                    return this;\n                }\n\n                // We have children. Use the appropriate child as the new root node\n                return children[bestFit];\n            }\n\n            public int GetNearby(ICollection<T> coll, ref Vector3 position, ref float maxDistance)\n            {\n                int cnt = 0;\n\n                var b = bounds;\n                b.Expand(new Vector3(maxDistance * 2, maxDistance * 2, maxDistance * 2));\n                if (!b.Contains(position))\n                {\n                    return cnt;\n                }\n                bounds.size = new Vector3(this.sideLength, this.sideLength, this.sideLength);\n\n                // Check against any objects in this node\n                float sqrDist = maxDistance * maxDistance;\n                for (int i = 0; i < objects.Count; i++)\n                {\n                    if ((position - _owner._getPositionFunc(objects[i])).sqrMagnitude <= sqrDist)\n                    {\n                        coll.Add(objects[i]);\n                        cnt++;\n                    }\n                }\n\n                // Check children\n                if (children != null)\n                {\n                    for (int i = 0; i < 8; i++)\n                    {\n                        if (children[i] != null) cnt += children[i].GetNearby(coll, ref position, ref maxDistance);\n                    }\n                }\n\n                return cnt;\n            }\n\n            public int GetNearby(ICollection<T> coll, ref Ray ray, ref float maxDistance)\n            {\n                int cnt = 0;\n\n                var b = bounds;\n                b.Expand(new Vector3(maxDistance * 2, maxDistance * 2, maxDistance * 2));\n                if (!b.IntersectRay(ray))\n                {\n                    return cnt;\n                }\n\n                // Check against any objects in this node\n                float sqrDist = maxDistance * maxDistance;\n                for (int i = 0; i < objects.Count; i++)\n                {\n                    if (Vector3.Cross(ray.direction, _owner._getPositionFunc(objects[i]) - ray.origin).sqrMagnitude <= sqrDist)\n                    {\n                        coll.Add(objects[i]);\n                        cnt++;\n                    }\n                }\n\n                // Check children\n                if (children != null)\n                {\n                    for (int i = 0; i < 8; i++)\n                    {\n                        if (children[i] != null) cnt += children[i].GetNearby(coll, ref ray, ref maxDistance);\n                    }\n                }\n\n                return cnt;\n            }\n\n            public int GetAll(ICollection<T> coll)\n            {\n                int cnt = 0;\n                for(int i = 0; i < objects.Count; i++)\n                {\n                    cnt++;\n                    coll.Add(objects[i]);\n                }\n\n                if(children != null)\n                {\n                    for (int i = 0; i < children.Length; i++)\n                    {\n                        if (children[i] != null)\n                        {\n                            cnt += children[i].GetAll(coll);\n                        }\n                    }\n                }\n                return cnt;\n            }\n\n            #endregion\n\n            #region Internal Utils\n\n            void SetValues(float side, Vector3 cent)\n            {\n                this.sideLength = side;\n                this.center = cent;\n\n                // Create the bounding box.\n                this.bounds = new Bounds(center, new Vector3(side, side, side));\n            }\n\n\n            private void SubAdd(T obj, Vector3 pos)\n            {\n                // We know it fits at this level if we've got this far\n                // Just add if few objects are here, or children would be below min size\n                if (objects.Count < CHILD_COUNT || (this.sideLength / 2) < _owner._minSize)\n                {\n                    objects.Add(obj);\n                }\n                else\n                { // Enough objects in this node already: Create new children\n                  // Create the 8 children\n                    int bestFitChild;\n                    if (children == null)\n                    {\n                        Split();\n                        if (children == null)\n                        {\n                            Debug.Log(\"Child creation failed for an unknown reason. Early exit.\");\n                            return;\n                        }\n\n                        // Now that we have the new children, see if this node's existing objects would fit there\n                        for (int i = objects.Count - 1; i >= 0; i--)\n                        {\n                            var p = _owner._getPositionFunc(objects[i]);\n                            // Find which child the object is closest to based on where the\n                            // object's center is located in relation to the octree's center.\n                            bestFitChild = BestFitChild(p);\n                            children[bestFitChild].SubAdd(objects[i], p); // Go a level deeper\t\t\t\t\t\n                            objects.RemoveAt(i);\n                        }\n                    }\n\n                    // Now handle the new object we're adding now\n                    bestFitChild = BestFitChild(pos);\n                    children[bestFitChild].SubAdd(obj, pos);\n                }\n            }\n\n            private void Split()\n            {\n                float quarter = this.sideLength / 4f;\n                float newLength = this.sideLength / 2;\n                children = new Octant[8];\n                children[0] = new Octant(_owner, newLength, center + new Vector3(-quarter, quarter, -quarter));\n                children[1] = new Octant(_owner, newLength, center + new Vector3(quarter, quarter, -quarter));\n                children[2] = new Octant(_owner, newLength, center + new Vector3(-quarter, quarter, quarter));\n                children[3] = new Octant(_owner, newLength, center + new Vector3(quarter, quarter, quarter));\n                children[4] = new Octant(_owner, newLength, center + new Vector3(-quarter, -quarter, -quarter));\n                children[5] = new Octant(_owner, newLength, center + new Vector3(quarter, -quarter, -quarter));\n                children[6] = new Octant(_owner, newLength, center + new Vector3(-quarter, -quarter, quarter));\n                children[7] = new Octant(_owner, newLength, center + new Vector3(quarter, -quarter, quarter));\n            }\n\n\n            private int BestFitChild(Vector3 pos)\n            {\n                return (pos.x <= center.x ? 0 : 1) + (pos.y >= center.y ? 0 : 4) + (pos.z <= center.z ? 0 : 2);\n            }\n\n            private bool ShouldMerge()\n            {\n                int totalObjects = objects.Count;\n                if (children != null)\n                {\n                    foreach (Octant child in children)\n                    {\n                        if (child != null && child.children != null)\n                        {\n                            // If any of the *children* have children, there are definitely too many to merge,\n                            // or the child woudl have been merged already\n                            return false;\n                        }\n                        totalObjects += child.objects.Count;\n                    }\n                }\n                return totalObjects <= CHILD_COUNT;\n            }\n\n            private void Merge()\n            {\n                // Note: We know children != null or we wouldn't be merging\n                foreach (var child in children)\n                {\n                    if (child == null) continue;\n\n                    int numObjects = child.objects.Count;\n                    for (int j = numObjects - 1; j >= 0; j--)\n                    {\n                        objects.Add(child.objects[j]);\n                    }\n                }\n                // Remove the child nodes (and the objects in them - they've been added elsewhere now)\n                children = null;\n            }\n\n            private bool HasAnyObjects()\n            {\n                if (objects.Count > 0) return true;\n\n                if (children != null)\n                {\n                    for (int i = 0; i < 8; i++)\n                    {\n                        if (children[i] != null && children[i].HasAnyObjects()) return true;\n                    }\n                }\n\n                return false;\n            }\n\n\n            private Vector3 GetChildCenter(int i)\n            {\n                float quarter = sideLength / 4f;\n                float childActualLength = sideLength / 2f;\n                Vector3 size = new Vector3(childActualLength, childActualLength, childActualLength);\n                switch (i)\n                {\n                    case 0:\n                        return center + new Vector3(-quarter, quarter, -quarter);\n                    case 1:\n                        return center + new Vector3(quarter, quarter, -quarter);\n                    case 2:\n                        return center + new Vector3(-quarter, quarter, quarter);\n                    case 3:\n                        return center + new Vector3(quarter, quarter, quarter);\n                    case 4:\n                        return center + new Vector3(-quarter, -quarter, -quarter);\n                    case 5:\n                        return center + new Vector3(quarter, -quarter, -quarter);\n                    case 6:\n                        return center + new Vector3(-quarter, -quarter, quarter);\n                    case 7:\n                        return center + new Vector3(quarter, -quarter, quarter);\n                    default:\n                        return center;\n                }\n            }\n\n            private Bounds GetChildBounds(int i)\n            {\n                float quarter = sideLength / 4f;\n                float childActualLength = sideLength / 2f;\n                Vector3 size = new Vector3(childActualLength, childActualLength, childActualLength);\n                switch (i)\n                {\n                    case 0:\n                        return new Bounds(center + new Vector3(-quarter, quarter, -quarter), size);\n                    case 1:\n                        return new Bounds(center + new Vector3(quarter, quarter, -quarter), size);\n                    case 2:\n                        return new Bounds(center + new Vector3(-quarter, quarter, quarter), size);\n                    case 3:\n                        return new Bounds(center + new Vector3(quarter, quarter, quarter), size);\n                    case 4:\n                        return new Bounds(center + new Vector3(-quarter, -quarter, -quarter), size);\n                    case 5:\n                        return new Bounds(center + new Vector3(quarter, -quarter, -quarter), size);\n                    case 6:\n                        return new Bounds(center + new Vector3(-quarter, -quarter, quarter), size);\n                    case 7:\n                        return new Bounds(center + new Vector3(quarter, -quarter, quarter), size);\n                    default:\n                        return default(Bounds);\n                }\n            }\n\n            #endregion\n\n            #region Gizmos\n\n            public void DrawAllBounds(float depth = 0)\n            {\n                _nestCount++;\n                float tintVal = depth / 7; // Will eventually get values > 1. Color rounds to 1 automatically\n                Gizmos.color = new Color(tintVal, 0, 1.0f - tintVal);\n\n                Bounds thisBounds = new Bounds(this.center, new Vector3(this.sideLength, this.sideLength, this.sideLength));\n                Gizmos.DrawWireCube(thisBounds.center, thisBounds.size);\n\n                if (children != null)\n                {\n                    depth++;\n                    for (int i = 0; i < 8; i++)\n                    {\n                        children[i].DrawAllBounds(depth);\n                    }\n                }\n                Gizmos.color = Color.white;\n            }\n\n            public void DrawAllObjects()\n            {\n                float tintVal = this.sideLength / 20;\n                Gizmos.color = new Color(0, 1.0f - tintVal, tintVal, 0.25f);\n\n                foreach (var obj in objects)\n                {\n                    Gizmos.DrawIcon(_owner._getPositionFunc(obj), \"marker.tif\", true);\n                }\n\n                if (children != null)\n                {\n                    for (int i = 0; i < 8; i++)\n                    {\n                        if (children != null) children[i].DrawAllObjects();\n                    }\n                }\n\n                Gizmos.color = Color.white;\n            }\n            #endregion\n\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Collections/PrimeHelper.cs",
    "content": "﻿using System;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n\r\n    public static class PrimeHelper\r\n    {\r\n        private static readonly int[] primes = new int[]\r\n        {\r\n            3,\r\n            7,\r\n            11,\r\n            17,\r\n            23,\r\n            29,\r\n            37,\r\n            47,\r\n            59,\r\n            71,\r\n            89,\r\n            107,\r\n            131,\r\n            163,\r\n            197,\r\n            239,\r\n            293,\r\n            353,\r\n            431,\r\n            521,\r\n            631,\r\n            761,\r\n            919,\r\n            1103,\r\n            1327,\r\n            1597,\r\n            1931,\r\n            2333,\r\n            2801,\r\n            3371,\r\n            4049,\r\n            4861,\r\n            5839,\r\n            7013,\r\n            8419,\r\n            10103,\r\n            12143,\r\n            14591,\r\n            17519,\r\n            21023,\r\n            25229,\r\n            30293,\r\n            36353,\r\n            43627,\r\n            52361,\r\n            62851,\r\n            75431,\r\n            90523,\r\n            108631,\r\n            130363,\r\n            156437,\r\n            187751,\r\n            225307,\r\n            270371,\r\n            324449,\r\n            389357,\r\n            467237,\r\n            560689,\r\n            672827,\r\n            807403,\r\n            968897,\r\n            1162687,\r\n            1395263,\r\n            1674319,\r\n            2009191,\r\n            2411033,\r\n            2893249,\r\n            3471899,\r\n            4166287,\r\n            4999559,\r\n            5999471,\r\n            7199369\r\n        };\r\n\r\n        public static bool IsPrime(int i)\r\n        {\r\n            if ((i & 1) == 0)\r\n                return i == 2;\r\n            int num1 = (int)Math.Sqrt((double)i);\r\n            int num2 = 3;\r\n            while (num2 <= num1)\r\n            {\r\n                if (i % num2 == 0)\r\n                    return false;\r\n                num2 += 2;\r\n            }\r\n            return true;\r\n        }\r\n\r\n        public static int GetPrime(int min)\r\n        {\r\n            if (min < 0)\r\n                throw new ArgumentException(\"Value must be non-negative.\");\r\n            for (int index = 0; index < PrimeHelper.primes.Length; ++index)\r\n            {\r\n                int num = PrimeHelper.primes[index];\r\n                if (num >= min)\r\n                    return num;\r\n            }\r\n            int candidate = min | 1;\r\n            while (candidate < int.MaxValue)\r\n            {\r\n                if (PrimeHelper.IsPrime(candidate) && (candidate - 1) % 101 != 0)\r\n                    return candidate;\r\n                candidate += 2;\r\n            }\r\n            return min;\r\n        }\r\n\r\n        public static int ExpandPrime(int oldSize)\r\n        {\r\n            int min = 2 * oldSize;\r\n            if ((uint)min > 2146435069U && 2146435069 > oldSize)\r\n                return 2146435069;\r\n            else\r\n                return PrimeHelper.GetPrime(min);\r\n        }\r\n\r\n        public static int GetMinPrime()\r\n        {\r\n            return PrimeHelper.primes[0];\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/ReusableStringReader.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n    public class ReusableStringReader : System.IO.TextReader\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        private string _source;\r\n        private int _nextChar;\r\n        private int _sourceLength;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public ReusableStringReader()\r\n        {\r\n            this.Reset(string.Empty);\r\n        }\r\n\r\n        public ReusableStringReader(string s)\r\n        {\r\n            this.Reset(s);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Reset(string str)\r\n        {\r\n            _source = str ?? string.Empty;\r\n            _nextChar = 0;\r\n            _sourceLength = _source.Length;\r\n        }\r\n\r\n        private void CheckObjectDisposedException()\r\n        {\r\n            if (_source == null)\r\n                throw new ObjectDisposedException(\"StringReader\", \"Cannot read from a closed StringReader\");\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region TextReader Interface\r\n\r\n        public override void Close()\r\n        {\r\n            this.Dispose(true);\r\n        }\r\n\r\n        protected override void Dispose(bool disposing)\r\n        {\r\n            _source = (string)null;\r\n        }\r\n\r\n        public override int Peek()\r\n        {\r\n            this.CheckObjectDisposedException();\r\n            if (_nextChar >= _sourceLength)\r\n                return -1;\r\n            return (int)_source[_nextChar];\r\n        }\r\n\r\n        public override int Read()\r\n        {\r\n            this.CheckObjectDisposedException();\r\n            if (_nextChar >= _sourceLength)\r\n                return -1;\r\n            return (int)_source[_nextChar++];\r\n        }\r\n\r\n        public override int Read(char[] buffer, int index, int count)\r\n        {\r\n            this.CheckObjectDisposedException();\r\n            if (buffer == null)\r\n                throw new ArgumentNullException(\"buffer\");\r\n            if (buffer.Length - index < count)\r\n                throw new ArgumentException();\r\n            if (index < 0 || count < 0)\r\n                throw new ArgumentOutOfRangeException();\r\n            int count1 = _nextChar <= _sourceLength - count ? count : _sourceLength - _nextChar;\r\n            _source.CopyTo(_nextChar, buffer, index, count1);\r\n            _nextChar += count1;\r\n            return count1;\r\n        }\r\n\r\n        public override string ReadLine()\r\n        {\r\n            this.CheckObjectDisposedException();\r\n            if (_nextChar >= _source.Length)\r\n                return (string)null;\r\n            int num1 = _source.IndexOf('\\r', _nextChar);\r\n            int num2 = _source.IndexOf('\\n', _nextChar);\r\n            bool flag = false;\r\n            int num3;\r\n            if (num1 == -1)\r\n            {\r\n                if (num2 == -1)\r\n                    return this.ReadToEnd();\r\n                num3 = num2;\r\n            }\r\n            else if (num2 == -1)\r\n            {\r\n                num3 = num1;\r\n            }\r\n            else\r\n            {\r\n                num3 = num1 <= num2 ? num1 : num2;\r\n                flag = num1 + 1 == num2;\r\n            }\r\n            string str = _source.Substring(_nextChar, num3 - _nextChar);\r\n            _nextChar = num3 + (!flag ? 1 : 2);\r\n            return str;\r\n        }\r\n\r\n        public override string ReadToEnd()\r\n        {\r\n            this.CheckObjectDisposedException();\r\n            string str = _source.Substring(_nextChar, _sourceLength - _nextChar);\r\n            _nextChar = _sourceLength;\r\n            return str;\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/SamplingCharEnumerator.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n\r\n    /// <summary>\r\n    /// Allows sampling over a string of chars\r\n    /// </summary>\r\n    public class SamplingCharEnumerator : IEnumerator<char>, ICloneable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private string _str;\r\n        private int _index;\r\n        private char _currentElement;\r\n\r\n        private int _capturePoint;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public SamplingCharEnumerator()\r\n        {\r\n            _str = string.Empty;\r\n            _index = -1;\r\n        }\r\n\r\n        public SamplingCharEnumerator(string str)\r\n        {\r\n            _str = str ?? string.Empty;\r\n            _index = -1;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public string String\r\n        {\r\n            get { return _str; }\r\n        }\r\n\r\n        public int Position\r\n        {\r\n            get { return _index; }\r\n            set\r\n            {\r\n                _index = value;\r\n                if (_index < -1) _index = -1;\r\n                else if (_index > _str.Length) _index = _str.Length;\r\n            }\r\n        }\r\n\r\n        public int CapturePosition\r\n        {\r\n            get { return _capturePoint; }\r\n            set\r\n            {\r\n                _capturePoint = value;\r\n                if (_capturePoint < -1) _capturePoint = -1;\r\n                else if (_capturePoint > _str.Length) _capturePoint = _str.Length;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Reset(string str)\r\n        {\r\n            _str = str ?? string.Empty;\r\n            _index = -1;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get the next character with out \r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public char Peek()\r\n        {\r\n            return this.Peek(1);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get a character 'dist' positions ahead, without moving the head.\r\n        /// </summary>\r\n        /// <param name=\"dist\"></param>\r\n        /// <returns></returns>\r\n        public char Peek(int dist)\r\n        {\r\n            int i = _index + dist;\r\n            if (i > 0 && i < _str.Length)\r\n                return _str[i];\r\n            else\r\n                return char.MinValue;\r\n        }\r\n\r\n        public char PeekPrevious()\r\n        {\r\n            return this.Peek(-1);\r\n        }\r\n\r\n        public char PeekPrevious(int dist)\r\n        {\r\n            return this.Peek(-dist);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Move 'dist' chars ahead.\r\n        /// </summary>\r\n        /// <param name=\"dist\"></param>\r\n        /// <returns></returns>\r\n        public bool MoveNext(int dist)\r\n        {\r\n            _index += dist;\r\n            if(_index < 0)\r\n            {\r\n                _index = -1;\r\n                _currentElement = char.MinValue;\r\n                return false;\r\n            }\r\n            else if(_index >= _str.Length)\r\n            {\r\n                _index = _str.Length;\r\n                _currentElement = char.MinValue;\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                _currentElement = _str[_index];\r\n                return true;\r\n            }\r\n        }\r\n\r\n        public bool MovePrevious()\r\n        {\r\n            return this.MoveNext(-1);\r\n        }\r\n\r\n        public bool MovePrevious(int dist)\r\n        {\r\n            return this.MoveNext(-dist);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Saves the current position so that you can return a substring in the range of the current index and the index the enumerator is on when 'EndCapture' is called.\r\n        /// </summary>\r\n        public void StartCapture()\r\n        {\r\n            if (_index < 0)\r\n                throw new InvalidOperationException();\r\n\r\n            _capturePoint = _index;\r\n        }\r\n\r\n        public string EndCapture()\r\n        {\r\n            int start;\r\n            int end;\r\n            if(_index < _capturePoint)\r\n            {\r\n                start = _index;\r\n                end = _capturePoint;\r\n            }\r\n            else\r\n            {\r\n                start = _capturePoint;\r\n                end = _index;\r\n            }\r\n\r\n            if (start < 0) start = 0;\r\n            if (end < 0) end = 0;\r\n\r\n            if (start == 0 && end == _str.Length)\r\n                return _str;\r\n            else\r\n                return _str.Substring(start, end - start);\r\n        }\r\n\r\n        public int CaptureCompare(string str, bool ignoreCase)\r\n        {\r\n            int start;\r\n            int end;\r\n            if (_index < _capturePoint)\r\n            {\r\n                start = _index;\r\n                end = _capturePoint;\r\n            }\r\n            else\r\n            {\r\n                start = _capturePoint;\r\n                end = _index;\r\n            }\r\n\r\n            if (start < 0) start = 0;\r\n            if (end < 0) end = 0;\r\n\r\n            int len = end - start;\r\n            if (len == 0 && str.Length == 0) return 0;\r\n\r\n            return string.Compare(_str, start, str, 0, len, ignoreCase);\r\n        }\r\n\r\n        public bool CaptureEquals(string str, bool ignoreCase)\r\n        {\r\n            return this.CaptureCompare(str, ignoreCase) == 0;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerator Interface\r\n\r\n        object IEnumerator.Current\r\n        {\r\n            get\r\n            {\r\n                return this.Current;\r\n            }\r\n        }\r\n        \r\n        public char Current\r\n        {\r\n            get\r\n            {\r\n                if (_index < 0)\r\n                    throw new InvalidOperationException();\r\n                if (_index >= _str.Length)\r\n                    throw new InvalidOperationException();\r\n                else\r\n                    return _currentElement;\r\n            }\r\n        }\r\n        \r\n        public object Clone()\r\n        {\r\n            return this.MemberwiseClone();\r\n        }\r\n        \r\n        public bool MoveNext()\r\n        {\r\n            if (_index < _str.Length - 1)\r\n            {\r\n                _index = _index + 1;\r\n                _currentElement = _str[_index];\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                _index = _str.Length;\r\n                _currentElement = char.MinValue;\r\n                return false;\r\n            }\r\n        }\r\n        \r\n        public void Dispose()\r\n        {\r\n            _str = string.Empty;\r\n            _index = 0;\r\n            _currentElement = char.MinValue;\r\n        }\r\n        \r\n        public void Reset()\r\n        {\r\n            _currentElement = char.MinValue;\r\n            _index = -1;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/SamplingStack.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n\r\n    /// <summary>\r\n    /// Represents a stack of static size. If you push a value onto the stack when it's full, the value at the bottom (oldest) of the stack is removed.\r\n    /// </summary>\r\n    /// <typeparam name=\"T\"></typeparam>\r\n    public class SamplingStack<T> : IEnumerable<T>, ICollection<T>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private T[] _values;\r\n        private int _count;\r\n        private int _head;\r\n        private int _version;\r\n\r\n        #endregion\r\n        \r\n        #region CONSTRUCTOR\r\n\r\n        public SamplingStack(int size)\r\n        {\r\n            if (size < 0) throw new System.ArgumentException(\"Size must be non-negative.\", \"size\");\r\n            _values = new T[size];\r\n            _count = 0;\r\n            _head = -1;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int Size { get { return _values.Length; } }\r\n\r\n        public int Count { get { return _count; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Push(T value)\r\n        {\r\n            if (_values.Length == 0) return;\r\n\r\n            _head = (_head + 1) % _values.Length;\r\n            _values[_head] = value;\r\n            if(_count < _values.Length)\r\n                _count++;\r\n\r\n            _version++;\r\n        }\r\n\r\n        public T Pop()\r\n        {\r\n            if (_count == 0) throw new InvalidOperationException(\"SamplingStack is empty.\");\r\n\r\n            var result = _values[_head];\r\n            _values[_head] = default(T);\r\n            _head = (_head > 0) ? _head - 1 : _values.Length - 1;\r\n            _count--;\r\n            _version++;\r\n            return result;\r\n        }\r\n\r\n        public bool TryPop(out T result)\r\n        {\r\n            if(_count == 0)\r\n            {\r\n                result = default(T);\r\n                return false;\r\n            }\r\n\r\n            result = _values[_head];\r\n            _values[_head] = default(T);\r\n            _head = (_head > 0) ? _head - 1 : _values.Length - 1;\r\n            _count--;\r\n            _version++;\r\n            return true;\r\n        }\r\n\r\n        public T Shift()\r\n        {\r\n            if (_count == 0) throw new InvalidOperationException(\"SamplingStack is empty.\");\r\n\r\n            int index = (_head - _count + 1);\r\n            if (index < 0) index += _values.Length;\r\n            var result = _values[index];\r\n            _values[index] = default(T);\r\n            _count--;\r\n            _version++;\r\n            return result;\r\n        }\r\n\r\n        public bool TryShift(out T result)\r\n        {\r\n            if (_count == 0)\r\n            {\r\n                result = default(T);\r\n                return false;\r\n            }\r\n\r\n            int index = (_head - _count + 1);\r\n            if (index < 0) index += _values.Length;\r\n            result = _values[index];\r\n            _values[index] = default(T);\r\n            _count--;\r\n            _version++;\r\n            return true;\r\n        }\r\n\r\n        public T Peek()\r\n        {\r\n            if (_count == 0) throw new InvalidOperationException(\"SamplingStack is empty.\");\r\n\r\n            return _values[_head];\r\n        }\r\n\r\n        public IEnumerable<T> Peek(int cnt)\r\n        {\r\n            int index = _head;\r\n            if (cnt > _count) cnt = _count;\r\n            for(int i = 0; i < cnt; i++)\r\n            {\r\n                yield return _values[index];\r\n                _head = (_head > 0) ? _head - 1 : _values.Length - 1;\r\n            }\r\n        }\r\n\r\n        public T PeekShift()\r\n        {\r\n            if (_count == 0) throw new InvalidOperationException(\"SamplingStack is empty.\");\r\n\r\n            int index = (_head - _count + 1);\r\n            if (index < 0) index += _values.Length;\r\n            _version++;\r\n            return _values[index];\r\n        }\r\n\r\n        public void Resize(int size)\r\n        {\r\n            if (size < 0) throw new System.ArgumentException(\"Size must be non-negative.\", \"size\");\r\n\r\n            if(_head >= _count - 1)\r\n            {\r\n                System.Array.Resize(ref _values, size);\r\n                _version++;\r\n            }\r\n            else\r\n            {\r\n                T[] arr = new T[size];\r\n                int index = _head;\r\n                _count = Math.Min(size, _count);\r\n                for (int i = 0; i < _count; i++)\r\n                {\r\n                    arr[i] = _values[index];\r\n                    index = (index > 0) ? index - 1 : _values.Length - 1;\r\n                }\r\n                _values = arr;\r\n                _head = _count - 1;\r\n                _version++;\r\n            }\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            for (int i = 0; i < _values.Length; i++)\r\n            {\r\n                _values[i] = default(T);\r\n            }\r\n            _count = 0;\r\n            _head = -1;\r\n            _version++;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public Enumerator GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator<T> IEnumerable<T>.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        void ICollection<T>.Add(T item)\r\n        {\r\n            this.Push(item);\r\n        }\r\n\r\n        public bool Contains(T item)\r\n        {\r\n            return Array.IndexOf(_values, item) >= 0;\r\n        }\r\n\r\n        void ICollection<T>.CopyTo(T[] array, int arrayIndex)\r\n        {\r\n            int index = _head;\r\n            for (int i = 0; i < _count; i++)\r\n            {\r\n                array[arrayIndex + 1] = _values[index];\r\n                index = (index > 0) ? index - 1 : _values.Length - 1;\r\n            }\r\n        }\r\n\r\n        bool ICollection<T>.IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        bool ICollection<T>.Remove(T item)\r\n        {\r\n            throw new System.NotSupportedException();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public struct Enumerator : IEnumerator<T>\r\n        {\r\n\r\n            private SamplingStack<T> _stack;\r\n            private int _index;\r\n            private T _current;\r\n            private int _ver;\r\n\r\n\r\n            internal Enumerator(SamplingStack<T> stack)\r\n            {\r\n                _stack = stack;\r\n                _index = -1;\r\n                _current = default(T);\r\n                _ver = _stack._version;\r\n            }\r\n\r\n\r\n\r\n            public T Current\r\n            {\r\n                get\r\n                {\r\n                    return _current;\r\n                }\r\n            }\r\n\r\n            object IEnumerator.Current\r\n            {\r\n                get\r\n                {\r\n                    return _current;\r\n                }\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                if (_stack == null) return false;\r\n                if (_ver != _stack._version) throw new System.InvalidOperationException(\"SamplingStack was modified while enumerating.\");\r\n                if (_index >= _stack._count - 1) return false;\r\n\r\n                _index++;\r\n                int i = _stack._head - _index;\r\n                if (i < 0) i += _stack._values.Length;\r\n                _current = _stack._values[i];\r\n                return true;\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                _stack = null;\r\n                _index = -1;\r\n                _current = default(T);\r\n                _ver = 0;\r\n            }\r\n\r\n            public void Reset()\r\n            {\r\n                throw new NotImplementedException();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/SerializableDictionaryBase.cs",
    "content": "﻿using System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n\r\n    public abstract class DrawableDictionary\r\n    {\r\n        \r\n    }\r\n\r\n    [System.Serializable()]\r\n    public class SerializableDictionaryBase<TKey, TValue> : DrawableDictionary, IDictionary<TKey, TValue>, UnityEngine.ISerializationCallbackReceiver\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [System.NonSerialized()]\r\n        private Dictionary<TKey, TValue> _dict;\r\n        [System.NonSerialized()]\r\n        private IEqualityComparer<TKey> _comparer;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public SerializableDictionaryBase()\r\n        {\r\n\r\n        }\r\n\r\n        public SerializableDictionaryBase(IEqualityComparer<TKey> comparer)\r\n        {\r\n            _comparer = comparer;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IEqualityComparer<TKey> Comparer\r\n        {\r\n            get { return _comparer; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDictionary Interface\r\n\r\n        public int Count\r\n        {\r\n            get { return (_dict != null) ? _dict.Count : 0; }\r\n        }\r\n\r\n        public void Add(TKey key, TValue value)\r\n        {\r\n            if (_dict == null) _dict = new Dictionary<TKey, TValue>(_comparer);\r\n            _dict.Add(key, value);\r\n        }\r\n\r\n        public bool ContainsKey(TKey key)\r\n        {\r\n            if (_dict == null) return false;\r\n            return _dict.ContainsKey(key);\r\n        }\r\n\r\n        public ICollection<TKey> Keys\r\n        {\r\n            get\r\n            {\r\n                if (_dict == null) _dict = new Dictionary<TKey, TValue>(_comparer);\r\n                return _dict.Keys;\r\n            }\r\n        }\r\n\r\n        public bool Remove(TKey key)\r\n        {\r\n            if (_dict == null) return false;\r\n            return _dict.Remove(key);\r\n        }\r\n\r\n        public bool TryGetValue(TKey key, out TValue value)\r\n        {\r\n            if(_dict == null)\r\n            {\r\n                value = default(TValue);\r\n                return false;\r\n            }\r\n            return _dict.TryGetValue(key, out value);\r\n        }\r\n\r\n        public ICollection<TValue> Values\r\n        {\r\n            get\r\n            {\r\n                if (_dict == null) _dict = new Dictionary<TKey, TValue>(_comparer);\r\n                return _dict.Values;\r\n            }\r\n        }\r\n\r\n        public TValue this[TKey key]\r\n        {\r\n            get\r\n            {\r\n                if (_dict == null) throw new KeyNotFoundException();\r\n                return _dict[key];\r\n            }\r\n            set\r\n            {\r\n                if (_dict == null) _dict = new Dictionary<TKey, TValue>(_comparer);\r\n                _dict[key] = value;\r\n            }\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            if (_dict != null) _dict.Clear();\r\n        }\r\n\r\n        void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> item)\r\n        {\r\n            if (_dict == null) _dict = new Dictionary<TKey, TValue>(_comparer);\r\n            (_dict as ICollection<KeyValuePair<TKey, TValue>>).Add(item);\r\n        }\r\n\r\n        bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> item)\r\n        {\r\n            if (_dict == null) return false;\r\n            return (_dict as ICollection<KeyValuePair<TKey, TValue>>).Contains(item);\r\n        }\r\n\r\n        void ICollection<KeyValuePair<TKey, TValue>>.CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)\r\n        {\r\n            if (_dict == null) return;\r\n            (_dict as ICollection<KeyValuePair<TKey, TValue>>).CopyTo(array, arrayIndex);\r\n        }\r\n\r\n        bool ICollection<KeyValuePair<TKey, TValue>>.Remove(KeyValuePair<TKey, TValue> item)\r\n        {\r\n            if (_dict == null) return false;\r\n            return (_dict as ICollection<KeyValuePair<TKey, TValue>>).Remove(item);\r\n        }\r\n\r\n        bool ICollection<KeyValuePair<TKey, TValue>>.IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        public Dictionary<TKey, TValue>.Enumerator GetEnumerator()\r\n        {\r\n            if (_dict == null) return default(Dictionary<TKey, TValue>.Enumerator);\r\n            return _dict.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            if (_dict == null) return Enumerable.Empty<KeyValuePair<TKey, TValue>>().GetEnumerator();\r\n            return _dict.GetEnumerator();\r\n        }\r\n\r\n        IEnumerator<KeyValuePair<TKey, TValue>> IEnumerable<KeyValuePair<TKey, TValue>>.GetEnumerator()\r\n        {\r\n            if (_dict == null) return Enumerable.Empty<KeyValuePair<TKey, TValue>>().GetEnumerator();\r\n            return _dict.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISerializationCallbackReceiver\r\n\r\n        [UnityEngine.SerializeField()]\r\n        private TKey[] _keys;\r\n        [UnityEngine.SerializeField()]\r\n        private TValue[] _values;\r\n\r\n        void UnityEngine.ISerializationCallbackReceiver.OnAfterDeserialize()\r\n        {\r\n            if(_keys != null && _values != null)\r\n            {\r\n                if (_dict == null) _dict = new Dictionary<TKey, TValue>(_keys.Length, _comparer);\r\n                else _dict.Clear();\r\n                for(int i = 0; i < _keys.Length; i++)\r\n                {\r\n                    if (i < _values.Length)\r\n                        _dict[_keys[i]] = _values[i];\r\n                    else\r\n                        _dict[_keys[i]] = default(TValue);\r\n                }\r\n            }\r\n\r\n            _keys = null;\r\n            _values = null;\r\n        }\r\n\r\n        void UnityEngine.ISerializationCallbackReceiver.OnBeforeSerialize()\r\n        {\r\n            if(_dict == null || _dict.Count == 0)\r\n            {\r\n                _keys = null;\r\n                _values = null;\r\n            }\r\n            else\r\n            {\r\n                int cnt = _dict.Count;\r\n                _keys = new TKey[cnt];\r\n                _values = new TValue[cnt];\r\n                int i = 0;\r\n                var e = _dict.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    _keys[i] = e.Current.Key;\r\n                    _values[i] = e.Current.Value;\r\n                    i++;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/StateFlagStack.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.Collections\n{\n    \n    /// <summary>\n    /// Represents a triggerable state that can be active/inactive. \n    /// If the state can be activated by multiple sources that overlap, this allows tracking how many \n    /// sources have activated the state.\n    /// \n    /// For example if a player can be stunned, it might get stunned by multiple mobs at once. If performed as a boolean \n    /// an overlap may occur where it gets stuck in a 'stunned' state due to ordering.\n    /// \n    /// This instead allows each mob to register that it is stunning, and the state turns inactive once all mobs have popped themselves from the stack.\n    /// </summary>\n    public class StateFlagStack : IEnumerable<object>\n    {\n\n        public event System.EventHandler ActiveChanged;\n\n        #region Fields\n\n        private HashSet<object> _stack;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public StateFlagStack()\n        {\n            _stack = new HashSet<object>();\n        }\n\n        public StateFlagStack(IEqualityComparer<object> tokenComparer)\n        {\n            _stack = new HashSet<object>(tokenComparer);\n        }\n\n        #endregion\n\n        #region Properties\n\n        public bool Active\n        {\n            get { return _stack.Count > 0; }\n        }\n\n        public int ActiveCount\n        {\n            get { return _stack.Count; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public void Begin(object token)\n        {\n            if (token == null) throw new System.ArgumentNullException(\"token\");\n            if(_stack.Count == 0)\n            {\n                _stack.Add(token);\n                if(_stack.Count > 0 && this.ActiveChanged != null)\n                {\n                    this.ActiveChanged?.Invoke(this, EventArgs.Empty);\n                }\n            }\n            else\n            {\n                _stack.Add(token);\n            }\n        }\n\n        public void End(object token)\n        {\n            if (token == null) throw new System.ArgumentNullException(\"token\");\n            if (_stack.Count == 0) return;\n\n            _stack.Remove(token);\n            if(_stack.Count == 0 && this.ActiveChanged != null)\n            {\n                this.ActiveChanged?.Invoke(this, EventArgs.Empty);\n            }\n        }\n\n        public void Clear()\n        {\n            if (_stack.Count == 0) return;\n\n            _stack.Clear();\n            if (this.ActiveChanged != null)\n            {\n                this.ActiveChanged?.Invoke(this, EventArgs.Empty);\n            }\n        }\n\n        #endregion\n\n        #region IEnumerable Interface\n        \n        public IEnumerator<object> GetEnumerator()\n        {\n            return ((IEnumerable<object>)_stack).GetEnumerator();\n        }\n\n        IEnumerator IEnumerable.GetEnumerator()\n        {\n            return ((IEnumerable<object>)_stack).GetEnumerator();\n        }\n\n        #endregion\n\n    }\n    \n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Collections/TempCollection.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n\r\n    public interface ITempCollection<T> : ICollection<T>, IDisposable\r\n    {\r\n\r\n    }\r\n\r\n    /// <summary>\r\n    /// This is intended for a short lived collection that needs to be memory efficient and fast. \r\n    /// Call the static 'GetCollection' method to get a cached collection for use. \r\n    /// When you're done with the collection you call Release to make it available for reuse again later. \r\n    /// Do NOT use it again after calling Release.\r\n    /// \r\n    /// Due to the design of this, it should only ever be used in a single threaded manner. Primarily intended \r\n    /// for the main Unity thread. \r\n    /// \r\n    /// If you're in a separate thread, it's best to cache your own list local to there, and don't even bother with \r\n    /// this.\r\n    /// </summary>\r\n    public static class TempCollection\r\n    {\r\n\r\n        #region Static Interface\r\n        \r\n        /// <summary>\r\n        /// Returns the any available collection for use generically. \r\n        /// The collection could be a HashSet, List, or any temp implementation. \r\n        /// This is intended to reduce the need for creating a new collection \r\n        /// unnecessarily.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public static ITempCollection<T> GetCollection<T>()\r\n        {\r\n            return GetList<T>();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns the any available collection for use generically. \r\n        /// The collection could be a HashSet, List, or any temp implementation. \r\n        /// This is intended to reduce the need for creating a new collection \r\n        /// unnecessarily.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public static ITempCollection<T> GetCollection<T>(IEnumerable<T> e)\r\n        {\r\n            return GetList<T>(e);\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n\r\n        public static TempList<T> GetList<T>()\r\n        {\r\n            return TempList<T>.GetList();\r\n        }\r\n\r\n        public static TempList<T> GetList<T>(IEnumerable<T> e)\r\n        {\r\n            return TempList<T>.GetList(e);\r\n        }\r\n\r\n        public static TempList<T> GetList<T>(int count)\r\n        {\r\n            return TempList<T>.GetList(count);\r\n        }\r\n\r\n        public static TempHashSet<T> GetSet<T>()\r\n        {\r\n            return TempHashSet<T>.GetSet();\r\n        }\r\n\r\n        public static TempHashSet<T> GetSet<T>(IEnumerable<T> e)\r\n        {\r\n            return TempHashSet<T>.GetSet(e);\r\n        }\r\n\r\n        public static TempDictionary<TKey, TValue> GetDict<TKey, TValue>()\r\n        {\r\n            return TempDictionary<TKey, TValue>.GetDict();\r\n        }\r\n\r\n        public static TempDictionary<TKey, TValue> GetDict<TKey, TValue>(IDictionary<TKey, TValue> dict)\r\n        {\r\n            return TempDictionary<TKey, TValue>.GetDict(dict);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/TempDictionary.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy.Collections\n{\n\n    public class TempDictionary<TKey, TValue> : Dictionary<TKey, TValue>, ITempCollection<KeyValuePair<TKey, TValue>>\n    {\n\n        private const int MAX_SIZE_INBYTES = 1024;\n\n        #region Fields\n\n        private static ObjectCachePool<TempDictionary<TKey, TValue>> _pool = new ObjectCachePool<TempDictionary<TKey, TValue>>(10, () => new TempDictionary<TKey, TValue>());\n\n        private int _maxCapacityOnRelease;\n        //private int _version;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public TempDictionary()\n            : base()\n        {\n            var tp = typeof(TKey);\n            int sz = (tp.IsValueType && !tp.IsEnum) ? System.Runtime.InteropServices.Marshal.SizeOf(tp) : 4;\n            _maxCapacityOnRelease = MAX_SIZE_INBYTES / sz;\n            //_version = 1;\n        }\n\n        public TempDictionary(IDictionary<TKey, TValue> dict)\n            : base()\n        {\n            var tp = typeof(TKey);\n            int sz = (tp.IsValueType && !tp.IsEnum) ? System.Runtime.InteropServices.Marshal.SizeOf(tp) : 4;\n            _maxCapacityOnRelease = MAX_SIZE_INBYTES / sz;\n            //_version = 1;\n        }\n\n        #endregion\n\n        #region IDisposable Interface\n\n        public void Dispose()\n        {\n            this.Clear();\n            _pool.Release(this);\n        }\n\n        #endregion\n\n        #region Static Methods\n\n        public static TempDictionary<TKey, TValue> GetDict()\n        {\n            return _pool.GetInstance();\n        }\n\n        public static TempDictionary<TKey, TValue> GetDict(IDictionary<TKey, TValue> dict)\n        {\n            TempDictionary<TKey, TValue> result;\n            if (_pool.TryGetInstance(out result))\n            {\n                var le = LightEnumerator.Create(dict);\n                while (le.MoveNext())\n                {\n                    result.Add(le.Current.Key, le.Current.Value);\n                }\n            }\n            else\n            {\n                result = new TempDictionary<TKey, TValue>(dict);\n            }\n            return result;\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Collections/TempHashSet.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n    public class TempHashSet<T> : HashSet<T>, ITempCollection<T>\r\n    {\r\n\r\n        private const int MAX_SIZE_INBYTES = 1024;\r\n\r\n        #region Fields\r\n\r\n        private static ObjectCachePool<TempHashSet<T>> _pool = new ObjectCachePool<TempHashSet<T>>(10, () => new TempHashSet<T>());\r\n\r\n        private int _maxCapacityOnRelease;\r\n        //private int _version;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TempHashSet()\r\n            : base()\r\n        {\r\n            var tp = typeof(T);\r\n            int sz = (tp.IsValueType && !tp.IsEnum) ? System.Runtime.InteropServices.Marshal.SizeOf(tp) : 4;\r\n            _maxCapacityOnRelease = MAX_SIZE_INBYTES / sz;\r\n            //_version = 1;\r\n        }\r\n\r\n        public TempHashSet(IEnumerable<T> e)\r\n            : base(e)\r\n        {\r\n            var tp = typeof(T);\r\n            int sz = (tp.IsValueType && !tp.IsEnum) ? System.Runtime.InteropServices.Marshal.SizeOf(tp) : 4;\r\n            _maxCapacityOnRelease = MAX_SIZE_INBYTES / sz;\r\n            //_version = 1;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public void Dispose()\r\n        {\r\n            this.Clear();\r\n            _pool.Release(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Methods\r\n\r\n        public static TempHashSet<T> GetSet()\r\n        {\r\n            return _pool.GetInstance();\r\n        }\r\n\r\n        public static TempHashSet<T> GetSet(IEnumerable<T> e)\r\n        {\r\n            TempHashSet<T> result;\r\n            if (_pool.TryGetInstance(out result))\r\n            {\r\n                var le = LightEnumerator.Create<T>(e);\r\n                while(le.MoveNext())\r\n                {\r\n                    result.Add(le.Current);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                result = new TempHashSet<T>(e);\r\n            }\r\n            return result;\r\n        }\r\n        \r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/TempList.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n\r\n    public class TempList<T> : List<T>, ITempCollection<T>\r\n    {\r\n\r\n        private const int MAX_SIZE_INBYTES = 1024;\r\n\r\n        #region Fields\r\n\r\n        private static ObjectCachePool<TempList<T>> _pool = new ObjectCachePool<TempList<T>>(10, () => new TempList<T>());\r\n\r\n        private int _maxCapacityOnRelease;\r\n        private int _version;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TempList()\r\n            : base()\r\n        {\r\n            var tp = typeof(T);\r\n            int sz = (tp.IsValueType && !tp.IsEnum) ? System.Runtime.InteropServices.Marshal.SizeOf(tp) : 4;\r\n            _maxCapacityOnRelease = MAX_SIZE_INBYTES / sz;\r\n            _version = 1;\r\n        }\r\n\r\n        public TempList(IEnumerable<T> e)\r\n            : base(e)\r\n        {\r\n            var tp = typeof(T);\r\n            int sz = (tp.IsValueType && !tp.IsEnum) ? System.Runtime.InteropServices.Marshal.SizeOf(tp) : 4;\r\n            _maxCapacityOnRelease = MAX_SIZE_INBYTES / sz;\r\n            _version = 1;\r\n        }\r\n\r\n        public TempList(int count)\r\n            : base(count)\r\n        {\r\n            var tp = typeof(T);\r\n            int sz = (tp.IsValueType && !tp.IsEnum) ? System.Runtime.InteropServices.Marshal.SizeOf(tp) : 4;\r\n            _maxCapacityOnRelease = MAX_SIZE_INBYTES / sz;\r\n            _version = 1;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public void Dispose()\r\n        {\r\n            this.Clear();\r\n            if(_pool.Release(this))\r\n            {\r\n                if(this.Capacity > _maxCapacityOnRelease / Math.Min(_version, 4))\r\n                {\r\n                    this.Capacity = _maxCapacityOnRelease / Math.Min(_version, 4);\r\n                    _version = 1;\r\n                }\r\n                else\r\n                {\r\n                    _version++;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Methods\r\n\r\n        public static TempList<T> GetList()\r\n        {\r\n            return _pool.GetInstance();\r\n        }\r\n\r\n        public static TempList<T> GetList(IEnumerable<T> e)\r\n        {\r\n            TempList<T> result;\r\n            if(_pool.TryGetInstance(out result))\r\n            {\r\n                //result.AddRange(e);\r\n                var e2 = new LightEnumerator<T>(e);\r\n                while(e2.MoveNext())\r\n                {\r\n                    result.Add(e2.Current);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                result = new TempList<T>(e);\r\n            }\r\n            return result;\r\n        }\r\n\r\n        public static TempList<T> GetList(int count)\r\n        {\r\n            TempList<T> result;\r\n            if (_pool.TryGetInstance(out result))\r\n            {\r\n                if (result.Capacity < count) result.Capacity = count;\r\n                return result;\r\n            }\r\n            else\r\n            {\r\n                result = new TempList<T>(count);\r\n            }\r\n            return result;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/TrackablObjectCachePool.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n    public class TrackablObjectCachePool<T> : ICachePool<T> where T : class\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Stack<T> _inactive = new Stack<T>();\r\n        private HashSet<T> _active = new HashSet<T>();\r\n\r\n        private Func<T> _constructorDelegate;\r\n        private Action<T> _resetObjectDelegate;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TrackablObjectCachePool(int cacheSize)\r\n        {\r\n            this.CacheSize = cacheSize;\r\n            _constructorDelegate = this.SimpleConstructor;\r\n        }\r\n\r\n        public TrackablObjectCachePool(int cacheSize, Func<T> constructorDelegate)\r\n        {\r\n            this.CacheSize = cacheSize;\r\n            _constructorDelegate = (constructorDelegate != null) ? constructorDelegate : this.SimpleConstructor;\r\n        }\r\n\r\n        public TrackablObjectCachePool(int cacheSize, Func<T> constructorDelegate, Action<T> resetObjectDelegate)\r\n        {\r\n            this.CacheSize = cacheSize;\r\n            _constructorDelegate = (constructorDelegate != null) ? constructorDelegate : this.SimpleConstructor;\r\n            _resetObjectDelegate = resetObjectDelegate;\r\n        }\r\n\r\n        private T SimpleConstructor()\r\n        {\r\n            return Activator.CreateInstance<T>();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int CacheSize { get; set; }\r\n\r\n        public IEnumerable<T> ActiveMembers { get { return _active; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public T GetInstance()\r\n        {\r\n            lock(_inactive)\r\n            {\r\n                if (_inactive.Count > 0)\r\n                {\r\n                    var o = _inactive.Pop();\r\n                    _active.Add(o);\r\n                    return o;\r\n                }\r\n                else\r\n                {\r\n                    var o = _constructorDelegate();\r\n                    _active.Add(o);\r\n                    return o;\r\n                }\r\n            }\r\n        }\r\n\r\n        public void Release(T obj)\r\n        {\r\n            if (obj == null) throw new System.ArgumentNullException(\"obj\");\r\n            if (!_active.Contains(obj)) throw new System.ArgumentException(\"ObjectCachePool does not consider this object to be an active member.\", \"obj\");\r\n\r\n            int cacheSize = (this.CacheSize > 0) ? this.CacheSize : 1024;\r\n            lock(_active)\r\n            {\r\n                _active.Remove(obj);\r\n                if (_active.Count + _inactive.Count < cacheSize)\r\n                {\r\n                    if (_resetObjectDelegate != null) _resetObjectDelegate(obj);\r\n                    _inactive.Push(obj);\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool IsActive(T obj)\r\n        {\r\n            return _active.Contains(obj);\r\n        }\r\n\r\n        public bool Manages(T obj)\r\n        {\r\n            return _active.Contains(obj) || _inactive.Contains(obj);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/UniqueHashSet.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n\r\n    /// <summary>\r\n    /// Represents a HashSet whose members always generate unique hash values.\r\n    /// </summary>\r\n    /// <typeparam name=\"T\"></typeparam>\r\n    public class UniqueHashSet<T> : ICollection<T>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private const int INITIAL_SIZE = 10;\r\n        private const float DEFAULT_LOAD_FACTOR = 0.9f;\r\n        private const int NO_SLOT = -1;\r\n        private const int HASH_FLAG = -2147483648;\r\n\r\n        private int[] _table;\r\n        private Link[] _links;\r\n        private T[] _slots;\r\n        private int _touched;\r\n        private int _empty_slot;\r\n        private int _count;\r\n        private int _threshold;\r\n        private IEqualityComparer<T> _comparer;\r\n        private int _generation;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public UniqueHashSet()\r\n        {\r\n            _comparer = EqualityComparer<T>.Default;\r\n            this.Init(0);\r\n        }\r\n\r\n        public UniqueHashSet(IEqualityComparer<T> comparer)\r\n        {\r\n            _comparer = comparer ?? EqualityComparer<T>.Default;\r\n            this.Init(0);\r\n        }\r\n\r\n        public UniqueHashSet(IEnumerable<T> collection)\r\n            : this(collection, (IEqualityComparer<T>) null)\r\n        {\r\n        }\r\n\r\n        public UniqueHashSet(IEnumerable<T> collection, IEqualityComparer<T> comparer)\r\n        {\r\n            if (collection == null)\r\n                throw new ArgumentNullException(\"collection\");\r\n            int capacity = 0;\r\n            ICollection<T> collection1 = collection as ICollection<T>;\r\n            if (collection1 != null)\r\n                capacity = collection1.Count;\r\n\r\n            _comparer = comparer ?? EqualityComparer<T>.Default;\r\n            this.Init(capacity);\r\n\r\n            foreach (T obj in collection)\r\n                this.Add(obj);\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IEqualityComparer<T> Comparer\r\n        {\r\n            get { return _comparer; }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public bool Add(T item)\r\n        {\r\n            int itemHashCode = _comparer.GetHashCode(item);\r\n            int index1 = (itemHashCode & int.MaxValue) % _table.Length;\r\n            if (this.SlotsContainsAt(index1, itemHashCode, item))\r\n                return false;\r\n            if (++_count > _threshold)\r\n            {\r\n                this.Resize();\r\n                index1 = (itemHashCode & int.MaxValue) % _table.Length;\r\n            }\r\n            int index2 = _empty_slot;\r\n            if (index2 == -1)\r\n                index2 = _touched++;\r\n            else\r\n                _empty_slot = _links[index2].Next;\r\n            _links[index2].HashCode = itemHashCode;\r\n            _links[index2].Next = _table[index1] - 1;\r\n            _table[index1] = index2 + 1;\r\n            _slots[index2] = item;\r\n            ++_generation;\r\n            return true;\r\n        }\r\n\r\n        public void TrimExcess()\r\n        {\r\n            this.Resize();\r\n        }\r\n\r\n        public T GetValue(int hash)\r\n        {\r\n            T result;\r\n            this.TryGetValue(hash, out result);\r\n            return result;\r\n        }\r\n\r\n        public bool TryGetValue(int hash, out T result)\r\n        {\r\n            int ti = (hash & int.MaxValue) % _table.Length;\r\n            var i = _table[ti] - 1;\r\n            if (i < 0)\r\n            {\r\n                result = default(T);\r\n                return false;\r\n            }\r\n\r\n            var link = _links[i];\r\n            if (link.HashCode != hash)\r\n            {\r\n                result = default(T);\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                result = _slots[i];\r\n                return true;\r\n            }\r\n        }\r\n\r\n        public bool ContainsHashCode(int hash)\r\n        {\r\n            int ti = (hash & int.MaxValue) % _table.Length;\r\n            var i = _table[ti] - 1;\r\n            if (i < 0) return false;\r\n\r\n            var link = _links[i];\r\n            return link.HashCode == hash;\r\n        }\r\n\r\n\r\n\r\n        private void Init(int size)\r\n        {\r\n            if (size < 0)\r\n                throw new ArgumentOutOfRangeException(\"capacity\");\r\n            else if (size == 0)\r\n                size = 5; //set nominal start size\r\n            size = PrimeHelper.GetPrime(size);\r\n\r\n            _table = new int[size];\r\n            _links = new Link[size];\r\n            _empty_slot = -1;\r\n            _slots = new T[size];\r\n            _touched = 0;\r\n            _threshold = (int)((double)_table.Length * 0.899999976158142);\r\n            if (_threshold != 0 || _table.Length <= 0)\r\n                return;\r\n            _threshold = 1;\r\n            _generation = 0;\r\n        }\r\n\r\n        private void InitArrays(int size)\r\n        {\r\n            \r\n        }\r\n\r\n        private bool SlotsContainsAt(int index, int hash, T item)\r\n        {\r\n            Link link;\r\n            for (int i = _table[index] - 1; i != -1; i = link.Next)\r\n            {\r\n                link = _links[i];\r\n                if (link.HashCode == hash && _comparer.Equals(_slots[i], item))\r\n                    return true;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        private int GetLinkHashCode(int index)\r\n        {\r\n            return _links[index].HashCode & int.MinValue;\r\n        }\r\n\r\n        private void Resize()\r\n        {\r\n            int length = PrimeHelper.ExpandPrime(_table.Length);\r\n            int[] numArray = new int[length];\r\n            Link[] linkArray = new Link[length];\r\n            for (int index1 = 0; index1 < _table.Length; ++index1)\r\n            {\r\n                for (int index2 = _table[index1] - 1; index2 != -1; index2 = _links[index2].Next)\r\n                {\r\n                    int index3 = ((linkArray[index2].HashCode = _comparer.GetHashCode(_slots[index2])) & int.MaxValue) % length;\r\n                    linkArray[index2].Next = numArray[index3] - 1;\r\n                    numArray[index3] = index2 + 1;\r\n                }\r\n            }\r\n            _table = numArray;\r\n            _links = linkArray;\r\n            T[] objArray = new T[length];\r\n            Array.Copy((Array)_slots, 0, (Array)objArray, 0, _touched);\r\n            _slots = objArray;\r\n            _threshold = (int)((double)length * 0.899999976158142);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region ICollection Interface\r\n\r\n        public int Count\r\n        {\r\n            get\r\n            {\r\n                return _count;\r\n            }\r\n        }\r\n\r\n        bool ICollection<T>.IsReadOnly\r\n        {\r\n            get\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        void ICollection<T>.Add(T item)\r\n        {\r\n            this.Add(item);\r\n        }\r\n\r\n        public bool Contains(T item)\r\n        {\r\n            int itemHashCode = _comparer.GetHashCode(item);\r\n            return this.SlotsContainsAt((itemHashCode & int.MaxValue) % _table.Length, itemHashCode, item);\r\n        }\r\n\r\n        public bool Remove(T item)\r\n        {\r\n            int itemHashCode = _comparer.GetHashCode(item);\r\n            int index1 = (itemHashCode & int.MaxValue) % _table.Length;\r\n            int index2 = _table[index1] - 1;\r\n            if (index2 == -1)\r\n                return false;\r\n            int index3 = -1;\r\n            do\r\n            {\r\n                Link link = _links[index2];\r\n                if (link.HashCode != itemHashCode || !_comparer.Equals(_slots[index2], item))\r\n                {\r\n                    index3 = index2;\r\n                    index2 = link.Next;\r\n                }\r\n                else\r\n                    break;\r\n            }\r\n            while (index2 != -1);\r\n            if (index2 == -1)\r\n                return false;\r\n            --_count;\r\n            if (index3 == -1)\r\n                _table[index1] = _links[index2].Next + 1;\r\n            else\r\n                _links[index3].Next = _links[index2].Next;\r\n            _links[index2].Next = _empty_slot;\r\n            _empty_slot = index2;\r\n            _links[index2].HashCode = 0;\r\n            _slots[index2] = default(T);\r\n            ++_generation;\r\n            return true;\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _count = 0;\r\n            Array.Clear((Array)_table, 0, _table.Length);\r\n            Array.Clear((Array)_slots, 0, _slots.Length);\r\n            Array.Clear((Array)_links, 0, _links.Length);\r\n            _empty_slot = -1;\r\n            _touched = 0;\r\n            ++_generation;\r\n        }\r\n\r\n        public void CopyTo(T[] array, int index)\r\n        {\r\n            this.CopyTo(array, index, _count);\r\n        }\r\n\r\n        public void CopyTo(T[] array, int index, int count)\r\n        {\r\n            if (array == null)\r\n                throw new ArgumentNullException(\"array\");\r\n            if (index < 0)\r\n                throw new ArgumentOutOfRangeException(\"index\");\r\n            if (index > array.Length)\r\n                throw new ArgumentException(\"index larger than largest valid index of array\");\r\n            if (array.Length - index < count)\r\n                throw new ArgumentException(\"Destination array cannot hold the requested elements!\");\r\n            int index1 = 0;\r\n            for (int index2 = 0; index1 < _touched && index2 < count; ++index1)\r\n            {\r\n                if (this.GetLinkHashCode(index1) != 0)\r\n                    array[index++] = _slots[index1];\r\n            }\r\n        }\r\n\r\n        public Enumerator GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator<T> IEnumerable<T>.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator IEnumerable.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private struct Link\r\n        {\r\n            public int HashCode;\r\n            public int Next;\r\n        }\r\n\r\n        public struct Enumerator : IEnumerator<T>\r\n        {\r\n\r\n            private UniqueHashSet<T> _coll;\r\n            private int _next;\r\n            private int _stamp;\r\n            private T _current;\r\n\r\n            internal Enumerator(UniqueHashSet<T> coll)\r\n            {\r\n                if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n                _coll = coll;\r\n                _stamp = coll._generation;\r\n                _next = 0;\r\n                _current = default(T);\r\n            }\r\n\r\n            public T Current\r\n            {\r\n                get\r\n                {\r\n                    return _current;\r\n                }\r\n            }\r\n\r\n            object IEnumerator.Current\r\n            {\r\n                get\r\n                {\r\n                    return _current;\r\n                }\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                _coll = null;\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                this.CheckState();\r\n                if (_next < 0)\r\n                    return false;\r\n                while (_next < _coll._touched)\r\n                {\r\n                    int index = _next++;\r\n                    if (_coll.GetLinkHashCode(index) != 0)\r\n                    {\r\n                        _current = _coll._slots[index];\r\n                        return true;\r\n                    }\r\n                }\r\n                _next = -1;\r\n                return false;\r\n            }\r\n\r\n            void IEnumerator.Reset()\r\n            {\r\n                this.CheckState();\r\n                _next = 0;\r\n            }\r\n\r\n\r\n            private void CheckState()\r\n            {\r\n                if (_coll == null)\r\n                    throw new ObjectDisposedException(null);\r\n                if (_coll._generation != _stamp)\r\n                    throw new InvalidOperationException(\"HashSet have been modified while it was iterated over\");\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/UniqueList.cs",
    "content": "using System;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n    public class UniqueList<T> : IList<T>, System.Collections.IList\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private IList<T> _lst;\r\n        private IEqualityComparer<T> _comparer;\r\n\r\n        private bool _bMoveDuplicatesToTopOnAdd = true;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public UniqueList()\r\n            : this(null as IEqualityComparer<T>)\r\n        {\r\n        }\r\n\r\n        public UniqueList(int capacity)\r\n            : this(capacity, null as IEqualityComparer<T>)\r\n        {\r\n        }\r\n\r\n        public UniqueList(IEnumerable<T> collection)\r\n            : this(collection, null as IEqualityComparer<T>)\r\n        {\r\n        }\r\n\r\n        public UniqueList(IEqualityComparer<T> comparer)\r\n        {\r\n            _lst = new List<T>();\r\n            _comparer = (comparer == null) ? EqualityComparer<T>.Default : comparer;\r\n        }\r\n\r\n        public UniqueList(int capacity, IEqualityComparer<T> comparer)\r\n        {\r\n            _lst = new List<T>(capacity);\r\n            _comparer = (comparer == null) ? EqualityComparer<T>.Default : comparer;\r\n        }\r\n\r\n        public UniqueList(IEnumerable<T> collection, IEqualityComparer<T> comparer)\r\n        {\r\n            _lst = new List<T>(collection);\r\n            _comparer = (comparer == null) ? EqualityComparer<T>.Default : comparer;\r\n\r\n            this.AddRange(collection);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool MoveDuplicatesToTopOnAdd\r\n        {\r\n            get { return _bMoveDuplicatesToTopOnAdd; }\r\n            set { _bMoveDuplicatesToTopOnAdd = value; }\r\n        }\r\n\r\n        public bool Empty\r\n        {\r\n            get { return _lst.Count == 0; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region UniqueList Methods\r\n\r\n        public T[] ToArray()\r\n        {\r\n            if (_lst is List<T>)\r\n                return (_lst as List<T>).ToArray();\r\n            else\r\n                return System.Linq.Enumerable.ToArray(_lst);\r\n        }\r\n\r\n        public void AddRange(IEnumerable<T> collection)\r\n        {\r\n            foreach (var obj in collection)\r\n            {\r\n                this.Add(obj);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Removes any duplicates in a wrapped IList that may have creeped in.\r\n        /// </summary>\r\n        public void Clean()\r\n        {\r\n            for (int i = 0; i < _lst.Count; i++)\r\n            {\r\n                for (int j = i + 1; j < _lst.Count; j++)\r\n                {\r\n                    if (_comparer.Equals(_lst[i], _lst[j]))\r\n                    {\r\n                        _lst.RemoveAt(j);\r\n                        j--;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public void RemoveAll(Predicate<T> func)\r\n        {\r\n            if (func == null) throw new ArgumentNullException(\"func\");\r\n\r\n            if (_lst is List<T>)\r\n                (_lst as List<T>).RemoveAll(func);\r\n            else\r\n            {\r\n                for (int i = 0; i < _lst.Count; i++)\r\n                {\r\n                    if (func(_lst[i]))\r\n                    {\r\n                        _lst.RemoveAt(i);\r\n                        i--;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IList<T> Members\r\n\r\n        public int IndexOf(T item)\r\n        {\r\n            for (int i = 0; i < _lst.Count; i++)\r\n            {\r\n                if (_comparer.Equals(item, _lst[i])) return i;\r\n            }\r\n            return -1;\r\n        }\r\n\r\n        public void Insert(int index, T item)\r\n        {\r\n            int i = this.IndexOf(item);\r\n            if (i >= 0)\r\n            {\r\n                this.RemoveAt(i);\r\n                if (i < index) index--;\r\n            }\r\n\r\n            _lst.Insert(index, item);\r\n        }\r\n\r\n        public void RemoveAt(int index)\r\n        {\r\n            _lst.RemoveAt(index);\r\n        }\r\n\r\n        public T this[int index]\r\n        {\r\n            get\r\n            {\r\n                return _lst[index];\r\n            }\r\n            set\r\n            {\r\n                if (this.Contains(value) && !_comparer.Equals(_lst[index], value))\r\n                {\r\n                    int i = this.IndexOf(value);\r\n                    if (i < index) index--;\r\n                    _lst.RemoveAt(i);\r\n                }\r\n\r\n                _lst[index] = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection<T> Members\r\n\r\n        public int Count\r\n        {\r\n            get { return _lst.Count; }\r\n        }\r\n\r\n        public bool IsReadOnly\r\n        {\r\n            get { return _lst.IsReadOnly; }\r\n        }\r\n\r\n        public void Add(T item)\r\n        {\r\n            if (_bMoveDuplicatesToTopOnAdd)\r\n            {\r\n                if (this.Contains(item)) this.Remove(item);\r\n\r\n                _lst.Add(item);\r\n            }\r\n            else\r\n            {\r\n                if (!this.Contains(item)) _lst.Add(item);\r\n            }\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _lst.Clear();\r\n        }\r\n\r\n        public bool Contains(T item)\r\n        {\r\n            foreach (var obj in _lst)\r\n            {\r\n                if (_comparer.Equals(obj, item)) return true;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        public void CopyTo(T[] array, int arrayIndex)\r\n        {\r\n            _lst.CopyTo(array, arrayIndex);\r\n        }\r\n\r\n        public bool Remove(T item)\r\n        {\r\n            //use indexof using comparer, then remove at that index\r\n            int index = this.IndexOf(item);\r\n            if (index < 0) return false;\r\n            _lst.RemoveAt(index);\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Members\r\n\r\n        public IEnumerator<T> GetEnumerator()\r\n        {\r\n            return _lst.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _lst.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region IList Interface\r\n\r\n        int System.Collections.IList.Add(object value)\r\n        {\r\n            if (!(value is T)) throw new ArgumentException(\"item is of a type that is not assignable to this IList.\");\r\n\r\n            this.Add((T)value);\r\n            return this.IndexOf((T)value);\r\n        }\r\n\r\n        void System.Collections.IList.Clear()\r\n        {\r\n            this.Clear();\r\n        }\r\n\r\n        bool System.Collections.IList.Contains(object value)\r\n        {\r\n            if (!(value is T)) return false;\r\n\r\n            return this.Contains((T)value);\r\n        }\r\n\r\n        int System.Collections.IList.IndexOf(object value)\r\n        {\r\n            if (!(value is T)) return -1;\r\n\r\n            return this.IndexOf((T)value);\r\n        }\r\n\r\n        void System.Collections.IList.Insert(int index, object value)\r\n        {\r\n            if (!(value is T)) throw new ArgumentException(\"item is of a type that is not assignable to this IList.\");\r\n\r\n            this.Insert(index, (T)value);\r\n        }\r\n\r\n        bool System.Collections.IList.IsFixedSize\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        bool System.Collections.IList.IsReadOnly\r\n        {\r\n            get { return this.IsReadOnly; }\r\n        }\r\n\r\n        void System.Collections.IList.Remove(object value)\r\n        {\r\n            if (!(value is T)) throw new ArgumentException(\"item is of a type that is not assignable to this IList.\");\r\n\r\n            this.Remove((T)value);\r\n        }\r\n\r\n        void System.Collections.IList.RemoveAt(int index)\r\n        {\r\n            this.RemoveAt(index);\r\n        }\r\n\r\n        object System.Collections.IList.this[int index]\r\n        {\r\n            get\r\n            {\r\n                return this[index];\r\n            }\r\n            set\r\n            {\r\n                if (!(value is T)) throw new ArgumentException(\"item is of a type that is not assignable to this IList.\");\r\n\r\n                this[index] = (T)value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        void System.Collections.ICollection.CopyTo(Array array, int index)\r\n        {\r\n            ArrayUtil.Copy(_lst, array, index);\r\n        }\r\n\r\n        int System.Collections.ICollection.Count\r\n        {\r\n            get { return this.Count; }\r\n        }\r\n\r\n        bool System.Collections.ICollection.IsSynchronized\r\n        {\r\n            get\r\n            {\r\n                if (_lst is System.Collections.ICollection)\r\n                    return (_lst as System.Collections.ICollection).IsSynchronized;\r\n                else\r\n                    return false;\r\n            }\r\n        }\r\n\r\n        object System.Collections.ICollection.SyncRoot\r\n        {\r\n            get\r\n            {\r\n                if (_lst is System.Collections.ICollection)\r\n                    return (_lst as System.Collections.ICollection).SyncRoot;\r\n                else\r\n                    return _lst;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/WeakInternalTypes.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n\r\n    internal class WeakReference<T> : WeakReference where T : class\r\n    {\r\n        public static WeakReference<T> Create(T target)\r\n        {\r\n            if (target == null) return WeakNullReference<T>.Singleton;\r\n\r\n            return new WeakReference<T>(target);\r\n        }\r\n\r\n        protected WeakReference(T target)\r\n            : base(target, false)\r\n        {\r\n\r\n        }\r\n\r\n        public new T Target\r\n        {\r\n            get { return base.Target as T; }\r\n        }\r\n    }\r\n\r\n    internal class WeakNullReference<T> : WeakReference<T> where T : class\r\n    {\r\n        public static WeakNullReference<T> Singleton = new WeakNullReference<T>();\r\n\r\n        private WeakNullReference()\r\n            : base(null)\r\n        {\r\n\r\n        }\r\n\r\n        public override bool IsAlive\r\n        {\r\n            get\r\n            {\r\n                return true;\r\n            }\r\n        }\r\n    }\r\n\r\n    internal class WeakKeyReference<T> : WeakReference<T> where T : class\r\n    {\r\n        public readonly int HashCode;\r\n\r\n        public WeakKeyReference(T key, WeakKeyComparer<T> comparer)\r\n            : base(key)\r\n        {\r\n            HashCode = comparer.GetHashCode(key);\r\n        }\r\n    }\r\n\r\n    internal class WeakKeyComparer<T> : IEqualityComparer<object> where T : class\r\n    {\r\n        private IEqualityComparer<T> _comparer;\r\n\r\n        internal WeakKeyComparer(IEqualityComparer<T> comparer = null)\r\n        {\r\n            if (comparer == null) comparer = EqualityComparer<T>.Default;\r\n\r\n            _comparer = comparer;\r\n        }\r\n\r\n        #region IEqualityComparer Interface\r\n\r\n        public int GetHashCode(object obj)\r\n        {\r\n            if (obj is WeakKeyReference<T>) return (obj as WeakKeyReference<T>).HashCode;\r\n            if (obj is WeakReference) return _comparer.GetHashCode((obj as WeakReference<T>).Target);\r\n            return _comparer.GetHashCode(obj as T);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Compares two object by this WeakKey rule.\r\n        /// </summary>\r\n        /// <param name=\"x\"></param>\r\n        /// <param name=\"y\"></param>\r\n        /// <returns>\r\n        /// There are 9 cases to handle here (3 state, 3^2 permutations, 9).\r\n        /// \r\n        /// Wa == Alive Weak Reference\r\n        /// Wd == Dead Weak Reference\r\n        /// S  == Strong Reference\r\n        ///   x  |  y  |  Equals(x,y)\r\n        /// ------------------------------------\r\n        ///  Wa  | Wa  |  comparer.Equals(x.Target, y.Target)\r\n        ///  Wa  | Wd  |  False\r\n        ///  Wa  | S   |  comparer.Equals(x.Target, y)\r\n        ///  Wd  | Wa  |  False\r\n        ///  Wd  | Wd  |  x == y\r\n        ///  Wd  | S   |  False\r\n        ///  S   | Wa  |  comparer.Equals(x, y.Target)\r\n        ///  S   | Wd  |  False\r\n        ///  S   | S   |  comparer.Equals(x, y)\r\n        /// </returns>\r\n        bool IEqualityComparer<object>.Equals(object x, object y)\r\n        {\r\n            bool xIsDead = false;\r\n            bool yIsDead = false;\r\n            var a = GetTarget(x, out xIsDead);\r\n            var b = GetTarget(y, out yIsDead);\r\n\r\n            if (xIsDead) return (yIsDead) ? (x == y) : false;\r\n\r\n            if (yIsDead) return false;\r\n\r\n            return _comparer.Equals(a, b);\r\n        }\r\n\r\n        #endregion\r\n\r\n        private static T GetTarget(object obj, out bool outIsDead)\r\n        {\r\n            var wref = obj as WeakKeyReference<T>;\r\n            T target;\r\n\r\n            if (wref != null)\r\n            {\r\n                target = wref.Target;\r\n                outIsDead = !wref.IsAlive;\r\n            }\r\n            else\r\n            {\r\n                target = obj as T;\r\n                outIsDead = false;\r\n            }\r\n            return target;\r\n        }\r\n\r\n    }\r\n\r\n    internal class WeakReferenceComparer : IEqualityComparer<object>\r\n    {\r\n\r\n        private System.Collections.IEqualityComparer _comparer;\r\n\r\n        internal WeakReferenceComparer(System.Collections.IEqualityComparer comparer = null)\r\n        {\r\n            if (comparer == null) comparer = EqualityComparer<object>.Default;\r\n\r\n            _comparer = comparer;\r\n        }\r\n\r\n        #region IEqualityComparer Interface\r\n\r\n        public int GetHashCode(object obj)\r\n        {\r\n            if (obj is WeakReference) return _comparer.GetHashCode((obj as WeakReference).Target);\r\n            return _comparer.GetHashCode(obj);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Compares two object by this WeakKey rule.\r\n        /// </summary>\r\n        /// <param name=\"x\"></param>\r\n        /// <param name=\"y\"></param>\r\n        /// <returns>\r\n        /// There are 9 cases to handle here (3 state, 3^2 permutations, 9).\r\n        /// \r\n        /// Wa == Alive Weak Reference\r\n        /// Wd == Dead Weak Reference\r\n        /// S  == Strong Reference\r\n        ///   x  |  y  |  Equals(x,y)\r\n        /// ------------------------------------\r\n        ///  Wa  | Wa  |  comparer.Equals(x.Target, y.Target)\r\n        ///  Wa  | Wd  |  False\r\n        ///  Wa  | S   |  comparer.Equals(x.Target, y)\r\n        ///  Wd  | Wa  |  False\r\n        ///  Wd  | Wd  |  x == y\r\n        ///  Wd  | S   |  False\r\n        ///  S   | Wa  |  comparer.Equals(x, y.Target)\r\n        ///  S   | Wd  |  False\r\n        ///  S   | S   |  comparer.Equals(x, y)\r\n        /// </returns>\r\n        bool IEqualityComparer<object>.Equals(object x, object y)\r\n        {\r\n            bool xIsDead = false;\r\n            bool yIsDead = false;\r\n            var a = GetTarget(x, out xIsDead);\r\n            var b = GetTarget(y, out yIsDead);\r\n\r\n            if (xIsDead) return (yIsDead) ? (x == y) : false;\r\n\r\n            if (yIsDead) return false;\r\n\r\n            return _comparer.Equals(a, b);\r\n        }\r\n\r\n        #endregion\r\n\r\n        private static object GetTarget(object obj, out bool outIsDead)\r\n        {\r\n            var wref = obj as WeakReference;\r\n            object target;\r\n\r\n            if (wref != null)\r\n            {\r\n                target = wref.Target;\r\n                outIsDead = !wref.IsAlive;\r\n            }\r\n            else\r\n            {\r\n                target = obj;\r\n                outIsDead = false;\r\n            }\r\n            return target;\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/WeakKeyDictionary.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n    public class WeakKeyDictionary<TKey, TValue> : IDictionary<TKey, TValue> where TKey : class\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Dictionary<object, TValue> _dict;\r\n        private WeakKeyComparer<TKey> _comparer;\r\n        private KeyCollection _keyColl;\r\n        private ValueCollection _valueColl;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public WeakKeyDictionary()\r\n            : this(0, null)\r\n        {\r\n\r\n        }\r\n\r\n        public WeakKeyDictionary(int capacity)\r\n            : this(capacity, null)\r\n        {\r\n\r\n        }\r\n\r\n        public WeakKeyDictionary(IEqualityComparer<TKey> comparer)\r\n            : this(0, comparer)\r\n        {\r\n\r\n        }\r\n\r\n        public WeakKeyDictionary(int capacity, IEqualityComparer<TKey> comparer)\r\n        {\r\n            _comparer = new WeakKeyComparer<TKey>(comparer);\r\n            _dict = new Dictionary<object, TValue>(capacity, _comparer);\r\n            _keyColl = new KeyCollection(this);\r\n            _valueColl = new ValueCollection(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Weak Methods\r\n\r\n        public void Clean()\r\n        {\r\n            using (var lst = TempCollection.GetList<object>())\r\n            {\r\n                var e = _dict.Keys.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    var weakKey = e.Current as WeakKeyReference<TKey>;\r\n                    if (weakKey == null || !weakKey.IsAlive) lst.Add(e.Current);\r\n                }\r\n\r\n                var e2 = lst.GetEnumerator();\r\n                while(e2.MoveNext())\r\n                {\r\n                    _dict.Remove(e2.Current);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDictionary Interface\r\n\r\n        // ********************\r\n        // PROPS\r\n\r\n        public TValue this[TKey key]\r\n        {\r\n            get\r\n            {\r\n                try\r\n                {\r\n                    return _dict[key];\r\n                }\r\n                catch\r\n                {\r\n                    throw new KeyNotFoundException();\r\n                }\r\n            }\r\n            set\r\n            {\r\n                if (key == null) throw new ArgumentNullException(\"key\");\r\n                var weakKey = new WeakKeyReference<TKey>(key, _comparer);\r\n                _dict[weakKey] = value;\r\n            }\r\n        }\r\n\r\n        public ICollection<TKey> Keys\r\n        {\r\n            get { return _keyColl; }\r\n        }\r\n\r\n        public ICollection<TValue> Values\r\n        {\r\n            get { return _valueColl; }\r\n        }\r\n\r\n        // ********************\r\n        // Methods\r\n\r\n        public void Add(TKey key, TValue value)\r\n        {\r\n            if (key == null) throw new ArgumentNullException(\"key\");\r\n            var weakKey = new WeakKeyReference<TKey>(key, _comparer);\r\n            _dict.Add(weakKey, value);\r\n        }\r\n\r\n        public bool ContainsKey(TKey key)\r\n        {\r\n            return _dict.ContainsKey(key);\r\n        }\r\n\r\n        public bool Remove(TKey key)\r\n        {\r\n            return _dict.Remove(key);\r\n        }\r\n\r\n        public bool TryGetValue(TKey key, out TValue value)\r\n        {\r\n            return _dict.TryGetValue(key, out value);\r\n        }\r\n\r\n        public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()\r\n        {\r\n            foreach (var pair in _dict)\r\n            {\r\n                var weakKey = pair.Key as WeakKeyReference<TKey>;\r\n                if (weakKey != null && weakKey.IsAlive)\r\n                {\r\n                    yield return new KeyValuePair<TKey, TValue>(weakKey.Target, pair.Value);\r\n                }\r\n            }\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        public int Count\r\n        {\r\n            get { throw new NotImplementedException(); }\r\n        }\r\n\r\n        bool ICollection<KeyValuePair<TKey, TValue>>.IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _dict.Clear();\r\n        }\r\n\r\n        void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> item)\r\n        {\r\n            this.Add(item.Key, item.Value);\r\n        }\r\n\r\n        bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> item)\r\n        {\r\n            foreach (var pair in _dict)\r\n            {\r\n                var weakKey = pair.Key as WeakKeyReference<TKey>;\r\n                if (weakKey != null && weakKey.IsAlive)\r\n                {\r\n                    if (item.Key == weakKey.Target && object.Equals(item.Value, pair.Value)) return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        void ICollection<KeyValuePair<TKey, TValue>>.CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)\r\n        {\r\n            foreach (var pair in _dict)\r\n            {\r\n                var weakKey = pair.Key as WeakKeyReference<TKey>;\r\n                if (weakKey != null && weakKey.IsAlive)\r\n                {\r\n                    var item = new KeyValuePair<TKey, TValue>(weakKey.Target, pair.Value);\r\n                    array[arrayIndex] = item;\r\n                }\r\n                else\r\n                    array[arrayIndex] = default(KeyValuePair<TKey, TValue>);\r\n\r\n                arrayIndex++;\r\n            }\r\n        }\r\n\r\n        bool ICollection<KeyValuePair<TKey, TValue>>.Remove(KeyValuePair<TKey, TValue> item)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private class KeyCollection : ICollection<TKey>\r\n        {\r\n            private WeakKeyDictionary<TKey, TValue> _dict;\r\n\r\n            public KeyCollection(WeakKeyDictionary<TKey, TValue> dict)\r\n            {\r\n                _dict = dict;\r\n            }\r\n\r\n            #region ICollection Interface\r\n\r\n            public void Add(TKey item)\r\n            {\r\n                throw new NotImplementedException(\"Mutating a key collection derived from a dictionary is not allowed.\");\r\n            }\r\n\r\n            public void Clear()\r\n            {\r\n                throw new NotImplementedException(\"Mutating a key collection derived from a dictionary is not allowed.\");\r\n            }\r\n\r\n            public bool Contains(TKey item)\r\n            {\r\n                return _dict.ContainsKey(item);\r\n            }\r\n\r\n            public void CopyTo(TKey[] array, int arrayIndex)\r\n            {\r\n                foreach (var pair in _dict._dict)\r\n                {\r\n                    var weakKey = pair.Key as WeakKeyReference<TKey>;\r\n                    if (weakKey != null && weakKey.IsAlive)\r\n                        array[arrayIndex] = weakKey.Target;\r\n                    else\r\n                        array[arrayIndex] = null;\r\n\r\n                    arrayIndex++;\r\n                }\r\n            }\r\n\r\n            public int Count\r\n            {\r\n                get { return _dict.Count; }\r\n            }\r\n\r\n            public bool IsReadOnly\r\n            {\r\n                get { return true; }\r\n            }\r\n\r\n            public bool Remove(TKey item)\r\n            {\r\n                throw new NotImplementedException(\"Mutating a key collection derived from a dictionary is not allowed.\");\r\n            }\r\n\r\n            public IEnumerator<TKey> GetEnumerator()\r\n            {\r\n                foreach(var pair in _dict)\r\n                {\r\n                    yield return pair.Key;\r\n                }\r\n            }\r\n\r\n            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n            {\r\n                return this.GetEnumerator();\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        private class ValueCollection : ICollection<TValue>\r\n        {\r\n\r\n            private WeakKeyDictionary<TKey, TValue> _dict;\r\n\r\n            public ValueCollection(WeakKeyDictionary<TKey, TValue> dict)\r\n            {\r\n                _dict = dict;\r\n            }\r\n\r\n            #region ICollection Interface\r\n\r\n            public void Add(TValue item)\r\n            {\r\n                throw new NotImplementedException(\"Mutating a value collection derived from a dictionary is not allowed.\");\r\n            }\r\n\r\n            public void Clear()\r\n            {\r\n                throw new NotImplementedException(\"Mutating a value collection derived from a dictionary is not allowed.\");\r\n            }\r\n\r\n            public bool Contains(TValue item)\r\n            {\r\n                foreach (var pair in _dict)\r\n                {\r\n                    if (object.Equals(pair.Value, item)) return true;\r\n                }\r\n                return false;\r\n            }\r\n\r\n            public void CopyTo(TValue[] array, int arrayIndex)\r\n            {\r\n                foreach (var pair in _dict._dict)\r\n                {\r\n                    if (pair.Key is WeakReference && (pair.Key as WeakReference).IsAlive)\r\n                        array[arrayIndex] = pair.Value;\r\n                    else\r\n                        array[arrayIndex] = default(TValue);\r\n\r\n                    arrayIndex++;\r\n                }\r\n            }\r\n\r\n            public int Count\r\n            {\r\n                get { return _dict.Count; }\r\n            }\r\n\r\n            public bool IsReadOnly\r\n            {\r\n                get { return true; }\r\n            }\r\n\r\n            public bool Remove(TValue item)\r\n            {\r\n                throw new NotImplementedException(\"Mutating a value collection derived from a dictionary is not allowed.\");\r\n            }\r\n\r\n            public IEnumerator<TValue> GetEnumerator()\r\n            {\r\n                foreach (var pair in _dict)\r\n                {\r\n                    yield return pair.Value;\r\n                }\r\n            }\r\n\r\n            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n            {\r\n                return this.GetEnumerator();\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/WeakList.cs",
    "content": "using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n    /// <summary>\r\n    /// A generic collection of weak references to a type of object. The objects are stored weakly allowing them to still be garbage collected. \r\n    /// If an object is garbage collected its position in the list is made null, you can call WeakList.Clean() to clear out all dead objects.\r\n    /// </summary>\r\n    /// <typeparam name=\"T\"></typeparam>\r\n    public class WeakList<T> : IList<T>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private List<WeakReference> _lst;\r\n        private bool _trackResurrection;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public WeakList()\r\n        {\r\n            _lst = new List<WeakReference>();\r\n            _trackResurrection = false;\r\n        }\r\n\r\n        public WeakList(int capacity)\r\n        {\r\n            _lst = new List<WeakReference>(capacity);\r\n            _trackResurrection = false;\r\n        }\r\n\r\n        public WeakList(IEnumerable<T> collection)\r\n        {\r\n            _lst = new List<WeakReference>();\r\n            _trackResurrection = false;\r\n\r\n            this.AddRange(collection);\r\n        }\r\n\r\n        public WeakList(bool trackResurrection)\r\n        {\r\n            _lst = new List<WeakReference>();\r\n            _trackResurrection = trackResurrection;\r\n        }\r\n\r\n        public WeakList(int capacity, bool trackResurrection)\r\n        {\r\n            _lst = new List<WeakReference>(capacity);\r\n            _trackResurrection = trackResurrection;\r\n        }\r\n\r\n        public WeakList(IEnumerable<T> collection, bool trackResurrection)\r\n        {\r\n            _lst = new List<WeakReference>();\r\n            _trackResurrection = trackResurrection;\r\n\r\n            this.AddRange(collection);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool Empty\r\n        {\r\n            get { return _lst.Count == 0; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region WeakList Methods\r\n\r\n        public T[] ToArray()\r\n        {\r\n            var arr = new T[_lst.Count];\r\n            for (int i = 0; i < arr.Length; i++)\r\n            {\r\n                if (_lst[i].IsAlive)\r\n                    arr[i] = (T)_lst[i].Target;\r\n                else\r\n                    arr[i] = default(T);\r\n            }\r\n            return arr;\r\n        }\r\n\r\n        public void AddRange(IEnumerable<T> collection)\r\n        {\r\n            foreach (var obj in collection)\r\n            {\r\n                _lst.Add(new WeakReference(obj, _trackResurrection));\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// removes all contained objects that are dead\r\n        /// </summary>\r\n        public bool Clean()\r\n        {\r\n            bool result = false;\r\n            foreach (var weak in _lst.ToArray())\r\n            {\r\n                if (!weak.IsAlive)\r\n                {\r\n                    _lst.Remove(weak);\r\n                    result = true;\r\n                }\r\n            }\r\n            return result;\r\n        }\r\n\r\n        public bool IsAlive(int index)\r\n        {\r\n            return _lst[index].IsAlive;\r\n        }\r\n\r\n        public bool TrackResurrection(int index)\r\n        {\r\n            return _lst[index].TrackResurrection;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region IList<T> Members\r\n\r\n        public int IndexOf(T item)\r\n        {\r\n            for (int i = 0; i < _lst.Count; i++)\r\n            {\r\n                if (_lst[i].IsAlive && _lst[i].Target.Equals(item)) return i;\r\n            }\r\n\r\n            return -1;\r\n        }\r\n\r\n        public void Insert(int index, T item)\r\n        {\r\n            _lst.Insert(index, new WeakReference(item, _trackResurrection));\r\n        }\r\n\r\n        public void RemoveAt(int index)\r\n        {\r\n            _lst.RemoveAt(index);\r\n        }\r\n\r\n        public T this[int index]\r\n        {\r\n            get\r\n            {\r\n                if (_lst[index].IsAlive)\r\n                    return (T)_lst[index].Target;\r\n                else\r\n                    return default(T);\r\n            }\r\n            set\r\n            {\r\n                _lst[index].Target = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection<T> Members\r\n\r\n        public void Add(T item)\r\n        {\r\n            _lst.Add(new WeakReference(item, _trackResurrection));\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _lst.Clear();\r\n        }\r\n\r\n        public bool Contains(T item)\r\n        {\r\n            for (int i = 0; i < _lst.Count; i++)\r\n            {\r\n                if (_lst[i].IsAlive && _lst[i].Target.Equals(item)) return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public void CopyTo(T[] array, int arrayIndex)\r\n        {\r\n            if (array.Length - arrayIndex < _lst.Count) throw new ArgumentException(\"Destination array was not long enough. Check destIndex and length, and the array's lower bounds.\");\r\n\r\n            for (int i = 0; i < _lst.Count; i++)\r\n            {\r\n                if (_lst[i].IsAlive)\r\n                    array[i + arrayIndex] = (T)_lst[i].Target;\r\n                else\r\n                    array[i + arrayIndex] = default(T);\r\n            }\r\n\r\n        }\r\n\r\n        public int Count\r\n        {\r\n            get { return _lst.Count; }\r\n        }\r\n\r\n        bool ICollection<T>.IsReadOnly\r\n        {\r\n            get { return ((IList<T>)_lst).IsReadOnly; }\r\n        }\r\n\r\n        public bool Remove(T item)\r\n        {\r\n            int i = this.IndexOf(item);\r\n            if (i >= 0)\r\n            {\r\n                _lst.RemoveAt(i);\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable<T> Members\r\n\r\n        public IEnumerator<T> GetEnumerator()\r\n        {\r\n            T[] arr = new T[_lst.Count];\r\n\r\n            for (int i = 0; i < _lst.Count; i++)\r\n            {\r\n                if (_lst[i].IsAlive)\r\n                    arr[i] = (T)_lst[i].Target;\r\n                else\r\n                    arr[i] = default(T);\r\n            }\r\n\r\n            return ((IEnumerable<T>)arr).GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Members\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            T[] arr = new T[_lst.Count];\r\n\r\n            for (int i = 0; i < _lst.Count; i++)\r\n            {\r\n                if (_lst[i].IsAlive)\r\n                    arr[i] = (T)_lst[i].Target;\r\n                else\r\n                    arr[i] = default(T);\r\n            }\r\n\r\n            return arr.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Collections/WeakValueDictionary.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Collections\r\n{\r\n    public class WeakValueDictionary<TKey, TValue> : IDictionary<TKey, TValue> where TValue : class\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Dictionary<TKey, WeakReference<TValue>> _dict;\r\n        private KeyCollection _keyColl;\r\n        private ValueCollection _valueColl;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public WeakValueDictionary()\r\n            : this(0, null)\r\n        {\r\n\r\n        }\r\n\r\n        public WeakValueDictionary(int capacity)\r\n            : this(capacity, null)\r\n        {\r\n\r\n        }\r\n\r\n        public WeakValueDictionary(IEqualityComparer<TKey> comparer)\r\n            : this(0, comparer)\r\n        {\r\n\r\n        }\r\n\r\n        public WeakValueDictionary(int capacity, IEqualityComparer<TKey> comparer)\r\n        {\r\n            _dict = new Dictionary<TKey, WeakReference<TValue>>(capacity, comparer);\r\n            _keyColl = new KeyCollection(this);\r\n            _valueColl = new ValueCollection(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Weak Methods\r\n\r\n        public void Clean()\r\n        {\r\n            using (var lst = TempCollection.GetList<TKey>())\r\n            {\r\n                var e = _dict.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    if (!e.Current.Value.IsAlive) lst.Add(e.Current.Key);\r\n                }\r\n\r\n                var e2 = lst.GetEnumerator();\r\n                while(e2.MoveNext())\r\n                {\r\n                    _dict.Remove(e2.Current);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDictionary Interface\r\n\r\n        //******************\r\n        // Props\r\n\r\n        public TValue this[TKey key]\r\n        {\r\n            get\r\n            {\r\n                if (key == null) throw new ArgumentNullException(\"key\");\r\n                try\r\n                {\r\n                    var weakValue = _dict[key];\r\n                    if (weakValue.IsAlive)\r\n                        return weakValue.Target;\r\n                    else\r\n                        return null;\r\n                }\r\n                catch (KeyNotFoundException)\r\n                {\r\n                    throw new KeyNotFoundException();\r\n                }\r\n                catch (Exception ex)\r\n                {\r\n                    throw new KeyNotFoundException(\"The given key resulted in corrupted information.\", ex);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                _dict[key] = WeakReference<TValue>.Create(value);\r\n            }\r\n        }\r\n\r\n        public ICollection<TKey> Keys\r\n        {\r\n            get { return _keyColl; }\r\n        }\r\n\r\n        public ICollection<TValue> Values\r\n        {\r\n            get { return _valueColl; }\r\n        }\r\n\r\n        //*****************\r\n        // Methods\r\n\r\n        public void Add(TKey key, TValue value)\r\n        {\r\n            if (key == null) throw new ArgumentNullException(\"key\");\r\n            _dict.Add(key, WeakReference<TValue>.Create(value));\r\n        }\r\n\r\n        public bool ContainsKey(TKey key)\r\n        {\r\n            return _dict.ContainsKey(key);\r\n        }\r\n\r\n        public bool Remove(TKey key)\r\n        {\r\n            return _dict.Remove(key);\r\n        }\r\n\r\n        public bool TryGetValue(TKey key, out TValue value)\r\n        {\r\n            if (_dict.ContainsKey(key))\r\n            {\r\n                var weakValue = _dict[key];\r\n                if (weakValue.IsAlive)\r\n                {\r\n                    value = weakValue.Target;\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    value = null;\r\n                    return false;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                value = null;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()\r\n        {\r\n            foreach (var pair in _dict)\r\n            {\r\n                if (pair.Value.IsAlive)\r\n                {\r\n                    yield return new KeyValuePair<TKey, TValue>(pair.Key, pair.Value.Target);\r\n                }\r\n            }\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        public int Count\r\n        {\r\n            get { return _dict.Count; }\r\n        }\r\n\r\n        bool ICollection<KeyValuePair<TKey, TValue>>.IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _dict.Clear();\r\n        }\r\n\r\n        void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> item)\r\n        {\r\n            this.Add(item.Key, item.Value);\r\n        }\r\n\r\n        bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> item)\r\n        {\r\n            foreach (var pair in _dict)\r\n            {\r\n                if (pair.Value.IsAlive)\r\n                {\r\n                    if (_dict.Comparer.Equals(item.Key, pair.Key) && item.Value == pair.Value.Target) return true;\r\n                }\r\n            }\r\n            return false;\r\n        }\r\n\r\n        void ICollection<KeyValuePair<TKey, TValue>>.CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)\r\n        {\r\n            foreach (var pair in _dict)\r\n            {\r\n                if (pair.Value.IsAlive)\r\n                {\r\n                    var item = new KeyValuePair<TKey, TValue>(pair.Key, pair.Value.Target);\r\n                    array[arrayIndex] = item;\r\n                }\r\n                else\r\n                    array[arrayIndex] = default(KeyValuePair<TKey, TValue>);\r\n\r\n                arrayIndex++;\r\n            }\r\n        }\r\n\r\n        bool ICollection<KeyValuePair<TKey, TValue>>.Remove(KeyValuePair<TKey, TValue> item)\r\n        {\r\n            if ((this as ICollection<KeyValuePair<TKey, TValue>>).Contains(item))\r\n            {\r\n                return _dict.Remove(item.Key);\r\n            }\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private class KeyCollection : ICollection<TKey>\r\n        {\r\n            private WeakValueDictionary<TKey, TValue> _dict;\r\n\r\n            public KeyCollection(WeakValueDictionary<TKey, TValue> dict)\r\n            {\r\n                _dict = dict;\r\n            }\r\n\r\n            #region ICollection Interface\r\n\r\n            public void Add(TKey item)\r\n            {\r\n                throw new NotImplementedException(\"Mutating a key collection derived from a dictionary is not allowed.\");\r\n            }\r\n\r\n            public void Clear()\r\n            {\r\n                throw new NotImplementedException(\"Mutating a key collection derived from a dictionary is not allowed.\");\r\n            }\r\n\r\n            public bool Contains(TKey item)\r\n            {\r\n                return _dict.ContainsKey(item);\r\n            }\r\n\r\n            public void CopyTo(TKey[] array, int arrayIndex)\r\n            {\r\n                foreach (var pair in _dict._dict)\r\n                {\r\n                    if (pair.Value.IsAlive)\r\n                        array[arrayIndex] = pair.Key;\r\n                    else\r\n                        array[arrayIndex] = default(TKey);\r\n\r\n                    arrayIndex++;\r\n                }\r\n            }\r\n\r\n            public int Count\r\n            {\r\n                get { return _dict.Count; }\r\n            }\r\n\r\n            public bool IsReadOnly\r\n            {\r\n                get { return true; }\r\n            }\r\n\r\n            public bool Remove(TKey item)\r\n            {\r\n                throw new NotImplementedException(\"Mutating a key collection derived from a dictionary is not allowed.\");\r\n            }\r\n\r\n            public IEnumerator<TKey> GetEnumerator()\r\n            {\r\n                foreach (var pair in _dict)\r\n                {\r\n                    yield return pair.Key;\r\n                }\r\n            }\r\n\r\n            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n            {\r\n                return this.GetEnumerator();\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        private class ValueCollection : ICollection<TValue>\r\n        {\r\n\r\n            private WeakValueDictionary<TKey, TValue> _dict;\r\n\r\n            public ValueCollection(WeakValueDictionary<TKey, TValue> dict)\r\n            {\r\n                _dict = dict;\r\n            }\r\n\r\n            #region ICollection Interface\r\n\r\n            public void Add(TValue item)\r\n            {\r\n                throw new NotImplementedException(\"Mutating a value collection derived from a dictionary is not allowed.\");\r\n            }\r\n\r\n            public void Clear()\r\n            {\r\n                throw new NotImplementedException(\"Mutating a value collection derived from a dictionary is not allowed.\");\r\n            }\r\n\r\n            public bool Contains(TValue item)\r\n            {\r\n                foreach (var pair in _dict)\r\n                {\r\n                    if (object.Equals(pair.Value, item)) return true;\r\n                }\r\n                return false;\r\n            }\r\n\r\n            public void CopyTo(TValue[] array, int arrayIndex)\r\n            {\r\n                foreach (var pair in _dict._dict)\r\n                {\r\n                    if (pair.Value.IsAlive)\r\n                        array[arrayIndex] = pair.Value.Target;\r\n                    else\r\n                        array[arrayIndex] = null;\r\n\r\n                    arrayIndex++;\r\n                }\r\n            }\r\n\r\n            public int Count\r\n            {\r\n                get { return _dict.Count; }\r\n            }\r\n\r\n            public bool IsReadOnly\r\n            {\r\n                get { return true; }\r\n            }\r\n\r\n            public bool Remove(TValue item)\r\n            {\r\n                throw new NotImplementedException(\"Mutating a value collection derived from a dictionary is not allowed.\");\r\n            }\r\n\r\n            public IEnumerator<TValue> GetEnumerator()\r\n            {\r\n                foreach (var pair in _dict)\r\n                {\r\n                    yield return pair.Value;\r\n                }\r\n            }\r\n\r\n            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n            {\r\n                return this.GetEnumerator();\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/CollisionExclusion.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// An object identity for 2 Colliders or IIgnorableCollision objects ignoring one another. \r\n    /// This also allows you to not have to track ignore relationships. If 2 objects are flagged to ignore in 2 different segments \r\n    /// of code, this will track them stacking, and won't unignore until BOTH places call to stop the ignoring.\r\n    /// </summary>\r\n    public class CollisionExclusion : System.IDisposable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private IIgnorableCollision _collA;\r\n        private IIgnorableCollision _collB;\r\n        private bool _active;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public CollisionExclusion(Collider a, Collider b)\r\n        {\r\n            if (a == null) throw new System.ArgumentNullException(\"a\");\r\n            if (b == null) throw new System.ArgumentNullException(\"b\");\r\n\r\n            _collA = IgnorableCollider.GetIgnorableCollision(a);\r\n            _collB = IgnorableCollider.GetIgnorableCollision(b);\r\n        }\r\n\r\n        public CollisionExclusion(IIgnorableCollision a, IIgnorableCollision b)\r\n        {\r\n            if (a == null) throw new System.ArgumentNullException(\"a\");\r\n            if (b == null) throw new System.ArgumentNullException(\"b\");\r\n\r\n            _collA = a;\r\n            _collB = b;\r\n        }\r\n\r\n        public CollisionExclusion(Collider a, IIgnorableCollision b)\r\n        {\r\n            if (a == null) throw new System.ArgumentNullException(\"a\");\r\n            if (b == null) throw new System.ArgumentNullException(\"b\");\r\n\r\n            _collA = IgnorableCollider.GetIgnorableCollision(a);\r\n            _collB = b;\r\n        }\r\n\r\n        public CollisionExclusion(IIgnorableCollision a, Collider b)\r\n        {\r\n            if (a == null) throw new System.ArgumentNullException(\"a\");\r\n            if (b == null) throw new System.ArgumentNullException(\"b\");\r\n\r\n            _collA = a;\r\n            _collB = IgnorableCollider.GetIgnorableCollision(b);\r\n        }\r\n\r\n        ~CollisionExclusion()\r\n        {\r\n            if (GameLoopEntry.ApplicationClosing) return;\r\n\r\n            if (_active) PurgeWhenCan(_collA, _collB);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IIgnorableCollision ColliderA { get { return _collA; } }\r\n\r\n        public IIgnorableCollision ColliderB { get { return _collB; } }\r\n\r\n        public bool Active { get { return _active; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void BeginExclusion()\r\n        {\r\n            if (_active) return;\r\n            if (_collA == null || _collB == null) throw new System.InvalidOperationException(\"One or more referenced collider is null or destroyed.\");\r\n\r\n            var token = new PairToken(_collA, _collB);\r\n            int cnt;\r\n            if (_table.TryGetValue(token, out cnt))\r\n            {\r\n                _table[token] = cnt + 1;\r\n            }\r\n            else\r\n            {\r\n                _collA.IgnoreCollision(_collB, true);\r\n                _table[token] = 1;\r\n            }\r\n            _active = true;\r\n        }\r\n\r\n        public void EndExclusion()\r\n        {\r\n            var token = new PairToken(_collA, _collB);\r\n            if (token.IsDead)\r\n            {\r\n                _table.Remove(token);\r\n                return;\r\n            }\r\n            if (!_active) return;\r\n\r\n            int cnt;\r\n            if (_table.TryGetValue(token, out cnt))\r\n            {\r\n                cnt--;\r\n                if (cnt <= 0)\r\n                {\r\n                    _collA.IgnoreCollision(_collB, false);\r\n                    _table.Remove(token);\r\n                }\r\n                else\r\n                {\r\n                    _table[token] = cnt;\r\n                }\r\n            }\r\n            _active = false;\r\n        }\r\n\r\n        public void ForceEndExclusion()\r\n        {\r\n            var token = new PairToken(_collA, _collB);\r\n            if (token.IsDead)\r\n            {\r\n                _table.Remove(token);\r\n                return;\r\n            }\r\n\r\n            if(_table.Remove(token))\r\n            {\r\n                _collA.IgnoreCollision(_collB, false);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public void Dispose()\r\n        {\r\n            this.EndExclusion();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n\r\n        private static Dictionary<PairToken, int> _table = new Dictionary<PairToken, int>(new PairTokenComparer());\r\n\r\n        static CollisionExclusion()\r\n        {\r\n            UnityEngine.SceneManagement.SceneManager.sceneLoaded += OnGlobalLevelWasLoaded;\r\n        }\r\n\r\n        public static void CleanLinks()\r\n        {\r\n            using (var toRemove = com.spacepuppy.Collections.TempCollection.GetList<PairToken>())\r\n            {\r\n                var e1 = _table.Keys.GetEnumerator();\r\n                while (e1.MoveNext())\r\n                {\r\n                    if (e1.Current.IsDead) toRemove.Add(e1.Current);\r\n                }\r\n\r\n                if (toRemove.Count > 0)\r\n                {\r\n                    var e2 = toRemove.GetEnumerator();\r\n                    while (e2.MoveNext())\r\n                    {\r\n                        _table.Remove(e2.Current);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        \r\n        private static void OnGlobalLevelWasLoaded(UnityEngine.SceneManagement.Scene sc, UnityEngine.SceneManagement.LoadSceneMode mode)\r\n        {\r\n            CleanLinks();\r\n        }\r\n\r\n        private static void PurgeWhenCan(IIgnorableCollision a, IIgnorableCollision b)\r\n        {\r\n            GameLoopEntry.UpdateHandle.BeginInvoke(() =>\r\n                {\r\n                    var token = new PairToken(a, b);\r\n                    if (token.IsDead)\r\n                    {\r\n                        _table.Remove(token);\r\n                        return;\r\n                    }\r\n\r\n                    int cnt;\r\n                    if (_table.TryGetValue(token, out cnt))\r\n                    {\r\n                        cnt--;\r\n                        if (cnt <= 0)\r\n                        {\r\n                            a.IgnoreCollision(b, false);\r\n                            _table.Remove(token);\r\n                        }\r\n                        else\r\n                        {\r\n                            _table[token] = cnt;\r\n                        }\r\n                    }\r\n                });\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private struct PairToken\r\n        {\r\n            public IIgnorableCollision CollA;\r\n            public IIgnorableCollision CollB;\r\n\r\n            public PairToken(IIgnorableCollision a, IIgnorableCollision b)\r\n            {\r\n                CollA = a;\r\n                CollB = b;\r\n            }\r\n\r\n            public bool IsDead\r\n            {\r\n                get\r\n                {\r\n                    return this.CollA.IsNullOrDestroyed() || this.CollB.IsNullOrDestroyed();\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n        private class PairTokenComparer : IEqualityComparer<PairToken>\r\n        {\r\n\r\n            public bool Equals(PairToken x, PairToken y)\r\n            {\r\n                //NOTE - this scenario should never happen as long as properly used... so lets not waste the time even testing\r\n                //if (object.ReferenceEquals(x.CollA, null) || object.ReferenceEquals(y.CollA, null) || object.ReferenceEquals(x.CollB, null) || object.ReferenceEquals(y.CollB, null)) return false;\r\n\r\n                if (x.CollA.Equals(y.CollB))\r\n                    return x.CollB.Equals(y.CollA);\r\n                else if (x.CollA.Equals(y.CollA))\r\n                    return x.CollA.Equals(y.CollB);\r\n                else\r\n                    return false;\r\n            }\r\n\r\n            public int GetHashCode(PairToken obj)\r\n            {\r\n                //NOTE - this scenario should never happen as long as properly used... so lets not waste the time even testing\r\n                //if (object.ReferenceEquals(obj.CollA, null)) return 0;\r\n                //if (object.ReferenceEquals(obj.CollB, null)) return 0;\r\n\r\n                return obj.CollA.GetHashCode() ^ obj.CollB.GetHashCode();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n    \r\n    public class ColliderExclusion : System.IDisposable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Collider _collA;\r\n        private Collider _collB;\r\n        private bool _active;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public ColliderExclusion(Collider a, Collider b)\r\n        {\r\n            _collA = a;\r\n            _collB = b;\r\n        }\r\n\r\n        ~ColliderExclusion()\r\n        {\r\n            if (GameLoopEntry.ApplicationClosing) return;\r\n\r\n            if (_active) PurgeWhenCan(_collA, _collB);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Collider ColliderA { get { return _collA; } }\r\n\r\n        public Collider ColliderB { get { return _collB; } }\r\n\r\n        public bool Active { get { return _active; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void BeginExclusion()\r\n        {\r\n            if (_active) return;\r\n            if (_collA == null || _collB == null) throw new System.InvalidOperationException(\"One or more referenced collider is null or destroyed.\");\r\n\r\n            var token = new PairToken(_collA, _collB);\r\n            int cnt;\r\n            if (_table.TryGetValue(token, out cnt))\r\n            {\r\n                _table[token] = cnt + 1;\r\n            }\r\n            else\r\n            {\r\n                Physics.IgnoreCollision(_collA, _collB, true);\r\n                _table[token] = 1;\r\n            }\r\n            _active = true;\r\n        }\r\n\r\n        public void EndExclusion()\r\n        {\r\n            var token = new PairToken(_collA, _collB);\r\n            if (token.IsDead)\r\n            {\r\n                _table.Remove(token);\r\n                return;\r\n            }\r\n            if (!_active) return;\r\n\r\n            int cnt;\r\n            if (_table.TryGetValue(token, out cnt))\r\n            {\r\n                cnt--;\r\n                if (cnt <= 0)\r\n                {\r\n                    Physics.IgnoreCollision(_collA, _collB, false);\r\n                    _table.Remove(token);\r\n                }\r\n                else\r\n                {\r\n                    _table[token] = cnt;\r\n                }\r\n            }\r\n            _active = false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public void Dispose()\r\n        {\r\n            this.EndExclusion();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n\r\n        private static Dictionary<PairToken, int> _table = new Dictionary<PairToken, int>(new PairTokenComparer());\r\n\r\n        static ColliderExclusion()\r\n        {\r\n            UnityEngine.SceneManagement.SceneManager.sceneLoaded += OnGlobalLevelWasLoaded;\r\n        }\r\n\r\n        public static void CleanLinks()\r\n        {\r\n            using (var toRemove = com.spacepuppy.Collections.TempCollection.GetList<PairToken>())\r\n            {\r\n                var e1 = _table.Keys.GetEnumerator();\r\n                while (e1.MoveNext())\r\n                {\r\n                    if (e1.Current.IsDead) toRemove.Add(e1.Current);\r\n                }\r\n\r\n                if (toRemove.Count > 0)\r\n                {\r\n                    var e2 = toRemove.GetEnumerator();\r\n                    while (e2.MoveNext())\r\n                    {\r\n                        _table.Remove(e2.Current);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        \r\n        private static void OnGlobalLevelWasLoaded(UnityEngine.SceneManagement.Scene sc, UnityEngine.SceneManagement.LoadSceneMode mode)\r\n        {\r\n            CleanLinks();\r\n        }\r\n\r\n        private static void PurgeWhenCan(Collider a, Collider b)\r\n        {\r\n            GameLoopEntry.UpdateHandle.BeginInvoke(() =>\r\n            {\r\n                var token = new PairToken(a, b);\r\n                if (token.IsDead)\r\n                {\r\n                    _table.Remove(token);\r\n                    return;\r\n                }\r\n\r\n                int cnt;\r\n                if (_table.TryGetValue(token, out cnt))\r\n                {\r\n                    cnt--;\r\n                    if (cnt <= 0)\r\n                    {\r\n                        Physics.IgnoreCollision(token.CollA, token.CollB, false);\r\n                        _table.Remove(token);\r\n                    }\r\n                    else\r\n                    {\r\n                        _table[token] = cnt;\r\n                    }\r\n                }\r\n            });\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private struct PairToken\r\n        {\r\n            public Collider CollA;\r\n            public Collider CollB;\r\n\r\n            public PairToken(Collider a, Collider b)\r\n            {\r\n                CollA = a;\r\n                CollB = b;\r\n            }\r\n\r\n            public bool IsDead\r\n            {\r\n                get\r\n                {\r\n                    return this.CollA == null || this.CollB == null;\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n        private class PairTokenComparer : IEqualityComparer<PairToken>\r\n        {\r\n\r\n            public bool Equals(PairToken x, PairToken y)\r\n            {\r\n                //NOTE - this scenario should never happen as long as properly used... so lets not waste the time even testing\r\n                //if (object.ReferenceEquals(x.CollA, null) || object.ReferenceEquals(y.CollA, null) || object.ReferenceEquals(x.CollB, null) || object.ReferenceEquals(y.CollB, null)) return false;\r\n\r\n                int a = x.CollA.GetInstanceID();\r\n                int b = x.CollB.GetInstanceID();\r\n                int c = y.CollA.GetInstanceID();\r\n                int d = y.CollA.GetInstanceID();\r\n\r\n                if (a == c)\r\n                    return b == d;\r\n                else if (a == d)\r\n                    return b == c;\r\n                else\r\n                    return false;\r\n            }\r\n\r\n            public int GetHashCode(PairToken obj)\r\n            {\r\n                //NOTE - this scenario should never happen as long as properly used... so lets not waste the time even testing\r\n                //if (object.ReferenceEquals(obj.CollA, null)) return 0;\r\n                //if (obj.CollB == null) return 0;\r\n\r\n                return obj.CollA.GetInstanceID() ^ obj.CollB.GetInstanceID();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/ColorHSV.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Represents a colour in HSV colour space. 'Hue' is stored as a percentage, multiply by 360 to get the angle.\r\n    /// </summary>\r\n    public struct ColorHSV : System.IEquatable<ColorHSV>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        public float h;\r\n        public float s;\r\n        public float v;\r\n        public float a;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public ColorHSV(float h, float s, float v)\r\n        {\r\n            this.h = h;\r\n            this.s = s;\r\n            this.v = v;\r\n            this.a = 1f;\r\n        }\r\n\r\n        public ColorHSV(float h, float s, float v, float a)\r\n        {\r\n            this.h = h;\r\n            this.s = s;\r\n            this.v = v;\r\n            this.a = a;\r\n        }\r\n\r\n        public ColorHSV(Color c)\r\n        {\r\n            float r = Mathf.Clamp01(c.r);\r\n            float g = Mathf.Clamp01(c.g);\r\n            float b = Mathf.Clamp01(c.b);\r\n            var max = Mathf.Max(r, Mathf.Max(g, b));\r\n            var min = Mathf.Min(r, Mathf.Min(g, b));\r\n            var delta = max - min;\r\n\r\n            if (Mathf.Abs(delta) < 0.001f)\r\n            {\r\n                this.h = 0f;\r\n            }\r\n            else if (r >= g && r >= b)\r\n            {\r\n                this.h = (((g - b) / delta) % 6f) / 6f;\r\n            }\r\n            else if (g >= b)\r\n            {\r\n                this.h = ((b - r) / delta + 2f) / 6f;\r\n            }\r\n            else\r\n            {\r\n                this.h = ((r - g) / delta + 4f) / 6f;\r\n            }\r\n            \r\n            this.s = (max > 0f) ? delta / max : 0f;\r\n            this.v = max;\r\n            this.a = Mathf.Clamp01(c.a);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float HueAngle\r\n        {\r\n            get { return this.h * 360f; }\r\n        }\r\n\r\n        public ColorHSV normalized\r\n        {\r\n            get { return Normalize(this); }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Pulls in each field so that it's in a logical range. Hue is wrapped around 0->1 (as it's an angle) where as \r\n        /// all other values are clamped to 0->1.\r\n        /// </summary>\r\n        public void Normalize()\r\n        {\r\n            this.h = this.h % 1f;\r\n            if (this.h < 0f) this.h += 1f;\r\n            this.s = Mathf.Clamp01(this.s);\r\n            this.v = Mathf.Clamp01(this.v);\r\n            this.a = Mathf.Clamp01(this.a);\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return string.Format(\"HSVA({0:0.000}, {1:0.000}, {2:0.000},{3:0.000})\", this.h, this.s, this.v, this.a);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEquatable Interface\r\n\r\n        public override bool Equals(object obj)\r\n        {\r\n            if (obj is ColorHSV)\r\n            {\r\n                return this == (ColorHSV)obj;\r\n            }\r\n            else if (obj is Color)\r\n            {\r\n                return this == (ColorHSV)((Color)obj);\r\n            }\r\n            else if (obj is Vector4)\r\n            {\r\n                return this == (ColorHSV)((Vector4)obj);\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public bool Equals(ColorHSV b)\r\n        {\r\n            return this == b;\r\n        }\r\n\r\n        public override int GetHashCode()\r\n        {\r\n            return this.h.GetHashCode() ^ this.s.GetHashCode() << 2 ^ this.v.GetHashCode() >> 2 ^ this.a.GetHashCode() >> 1;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Conversion\r\n\r\n        public static explicit operator ColorHSV(Color c)\r\n        {\r\n            return new ColorHSV(c);\r\n        }\r\n\r\n        public static explicit operator Color(ColorHSV hsv)\r\n        {\r\n            return ToColor(hsv);\r\n        }\r\n\r\n        public static implicit operator ColorHSV(Vector4 c)\r\n        {\r\n            return new ColorHSV(c.x, c.y, c.z, c.w);\r\n        }\r\n\r\n        public static implicit operator Vector4(ColorHSV hsv)\r\n        {\r\n            return new Vector4(hsv.h, hsv.s, hsv.v, hsv.a);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Operators\r\n\r\n        public static ColorHSV operator +(ColorHSV a, ColorHSV b)\r\n        {\r\n            //var r = new ColorHSV();\r\n            //r.h = (a.h + b.h) % 1f;\r\n            //r.s = Mathf.Clamp01(a.s + b.s);\r\n            //r.v = Mathf.Clamp01(a.v + b.v);\r\n            //r.a = Mathf.Clamp01(a.a + b.a);\r\n            //return r;\r\n            var r = new ColorHSV();\r\n            r.h = a.h + b.h;\r\n            r.s = a.s + b.s;\r\n            r.v = a.v + b.v;\r\n            r.a = a.a + b.a;\r\n            return r;\r\n        }\r\n\r\n        public static ColorHSV operator -(ColorHSV a, ColorHSV b)\r\n        {\r\n            //var r = new ColorHSV();\r\n            //r.h = a.h - b.h;\r\n            //if (r.h < 0f) r.h += 1f;\r\n            //r.s = Mathf.Clamp01(a.s - b.s);\r\n            //r.v = Mathf.Clamp01(a.v - b.v);\r\n            //r.a = Mathf.Clamp01(a.a - b.a);\r\n            //return r;\r\n            var r = new ColorHSV();\r\n            r.h = a.h - b.h;\r\n            r.s = a.s - b.s;\r\n            r.v = a.v - b.v;\r\n            r.a = a.a - b.a;\r\n            return r;\r\n        }\r\n\r\n        public static ColorHSV operator *(ColorHSV a, ColorHSV b)\r\n        {\r\n            var r = new ColorHSV();\r\n            r.h = a.h * b.h;\r\n            r.s = a.s * b.s;\r\n            r.v = a.v * b.v;\r\n            r.a = a.a * b.a;\r\n            return r;\r\n        }\r\n\r\n        public static ColorHSV operator *(ColorHSV a, float b)\r\n        {\r\n            //var r = new ColorHSV();\r\n            //r.h = (a.h * b) % 1f;\r\n            //if (r.h < 0f) r.h += 1f;\r\n            //r.s = Mathf.Clamp01(a.s * b);\r\n            //r.v = Mathf.Clamp01(a.v * b);\r\n            //r.a = Mathf.Clamp01(a.a * b);\r\n            //return r;\r\n            var r = new ColorHSV();\r\n            r.h = a.h * b;\r\n            r.s = a.s * b;\r\n            r.v = a.v * b;\r\n            r.a = a.a * b;\r\n            return r;\r\n        }\r\n\r\n        public static ColorHSV operator /(ColorHSV a, float b)\r\n        {\r\n            if (float.IsNaN(b) || b == 0f) return new ColorHSV();\r\n\r\n            //var r = new ColorHSV();\r\n            //r.h = (a.h / b) % 1f;\r\n            //if (r.h < 0f) r.h += 1f;\r\n            //r.s = Mathf.Clamp01(a.s / b);\r\n            //r.v = Mathf.Clamp01(a.v / b);\r\n            //r.a = Mathf.Clamp01(a.a / b);\r\n            //return r;\r\n\r\n            var r = new ColorHSV();\r\n            r.h = a.h / b;\r\n            r.s = a.s / b;\r\n            r.v = a.v / b;\r\n            r.a = a.a / b;\r\n            return r;\r\n        }\r\n\r\n        public static bool operator ==(ColorHSV a, ColorHSV b)\r\n        {\r\n            return a.h == b.h && a.s == b.s && a.v == b.v && a.a == b.a;\r\n        }\r\n\r\n        public static bool operator !=(ColorHSV a, ColorHSV b)\r\n        {\r\n            return a.h != b.h || a.s != b.s || a.v != b.v || a.a != b.a;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Utils\r\n\r\n        public static ColorHSV Normalize(ColorHSV c)\r\n        {\r\n            c.Normalize();\r\n            return c;\r\n        }\r\n\r\n        public static Color ToColor(ColorHSV hsv)\r\n        {\r\n            hsv.Normalize();\r\n\r\n            var hprime = (hsv.h % 1f) * 360f / 60f;\r\n            if (hprime < 0f) hprime += 60f;\r\n            var chroma = hsv.v * hsv.s;\r\n            var x = chroma * (1f - Mathf.Abs(hprime % 2f - 1f));\r\n            float r = 0f;\r\n            float g = 0f;\r\n            float b = 0f;\r\n\r\n            switch (Mathf.FloorToInt(hprime))\r\n            {\r\n                case 0:\r\n                    {\r\n                        r = chroma;\r\n                        g = x;\r\n                    }\r\n                    break;\r\n                case 1:\r\n                    {\r\n                        r = x;\r\n                        g = chroma;\r\n                    }\r\n                    break;\r\n                case 2:\r\n                    {\r\n                        g = chroma;\r\n                        b = x;\r\n                    }\r\n                    break;\r\n                case 3:\r\n                    {\r\n                        g = x;\r\n                        b = chroma;\r\n                    }\r\n                    break;\r\n                case 4:\r\n                    {\r\n                        r = x;\r\n                        b = chroma;\r\n                    }\r\n                    break;\r\n                case 5:\r\n                    {\r\n                        r = chroma;\r\n                        b = x;\r\n                    }\r\n                    break;\r\n            }\r\n\r\n            var m = hsv.v - chroma;\r\n            return new Color(r + m, g + m, b + m, hsv.a);\r\n        }\r\n\r\n        public static ColorHSV Lerp(ColorHSV start, ColorHSV end, float t)\r\n        {\r\n            start.h += (end.h - start.h) * t;\r\n            start.s += (end.s - start.s) * t;\r\n            start.v += (end.v - start.v) * t;\r\n            start.a += (end.a - start.a) * t;\r\n            return start;\r\n        }\r\n\r\n        public static ColorHSV Slerp(ColorHSV start, ColorHSV end, float t)\r\n        {\r\n            ColorHSV r = new ColorHSV();\r\n\r\n            if (start.v <= 0f)\r\n            {\r\n                r.h = end.h;\r\n                r.s = end.s;\r\n            }\r\n            else if (end.v <= 0f)\r\n            {\r\n                r.h = start.h;\r\n                r.s = start.s;\r\n            }\r\n            else\r\n            {\r\n                if (start.s <= 0f)\r\n                {\r\n                    r.h = end.h;\r\n                }\r\n                else if (end.s <= 0f)\r\n                {\r\n                    r.h = start.h;\r\n                }\r\n                else\r\n                {\r\n                    var delta = (end.h - start.h) % 1f;\r\n                    //r.h = start.h + delta * (t % 1f);\r\n                    //if (r.h < 0f)\r\n                    //    r.h += 1f;\r\n                    r.h = start.h + delta * t;\r\n                    r.h -= Mathf.Floor(r.h); //wrap the value 0->1\r\n                }\r\n                r.s = Mathf.Clamp01(start.s + (end.s - start.s) * t);\r\n            }\r\n\r\n            r.v = Mathf.Clamp01(start.v + (end.v - start.v) * t);\r\n            r.a = Mathf.Clamp01(start.a + (end.a - start.a) * t);\r\n\r\n            return r;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns the value of t that would give 'current' if Slerp(start, end, t). \r\n        /// If any input is invalid, NaN is returned.\r\n        /// </summary>\r\n        /// <param name=\"start\"></param>\r\n        /// <param name=\"end\"></param>\r\n        /// <returns></returns>\r\n        public static float InverseSlerp(ColorHSV current, ColorHSV start, ColorHSV end)\r\n        {\r\n            if(start.v < 0f || end.v < 0f || current.v < 0f || start.s < 0f || end.s < 0f || current.s < 0f)\r\n            {\r\n                return float.NaN;\r\n            }\r\n            else\r\n            {\r\n                var total = (end.h - start.h) % 1f;\r\n                var sub = (current.h - start.h) % 1f;\r\n                return System.Math.Abs(total) < 0.0001f ? 0f : sub / total;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Colors\r\n\r\n        public static ColorHSV black { get { return new ColorHSV(0f, 0f, 0f); } }\r\n\r\n        public static ColorHSV white { get { return new ColorHSV(0f, 0f, 1f); } }\r\n\r\n        public static ColorHSV red { get { return new ColorHSV(0f, 1f, 1f); } }\r\n\r\n        public static ColorHSV green { get { return new ColorHSV(0.33333333f, 1f, 1f); } }\r\n\r\n        public static ColorHSV blue { get { return new ColorHSV(0.66666667f, 1f, 1f); } }\r\n\r\n        public static ColorHSV cyan { get { return new ColorHSV(0.5f, 1f, 1f); } }\r\n\r\n        public static ColorHSV magenta { get { return new ColorHSV(-0.1666667f, 1f, 1f); } }\r\n\r\n        public static ColorHSV gray { get { return new ColorHSV(0f, 0f, 0.5f); } }\r\n\r\n        public static ColorHSV grey { get { return new ColorHSV(0f, 0f, 0.5f); } }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/CompoundStateLedger.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\n\nusing UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Dynamic;\nusing com.spacepuppy.Dynamic.Accessors;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy\n{\n\n    /// <summary>\n    /// Allows stacking modifiers onto a specific stat/property in a tracked manner. For example if you want to increase the max health of a HealthMeter temporarily.\n    /// </summary>\n    public class CompoundStateLedger : SPComponent\n    {\n\n        #region Fields\n\n        [System.NonSerialized]\n        private Dictionary<Token, TargetLedger> _table = new Dictionary<Token, TargetLedger>();\n\n        #endregion\n\n        #region CONSTRUCTOR\n        \n        protected override void OnDestroy()\n        {\n            base.OnDestroy();\n\n            var values = _table.Values.ToArray();\n            _table.Clear();\n            foreach(var e in values)\n            {\n                e.Dispose();\n            }\n            _table.Clear();\n        }\n\n        #endregion\n\n        #region Methods\n\n        public TargetLedger TryGetLedger(Component target, string memberName)\n        {\n            if (target == null || target.gameObject != this.gameObject) return null;\n\n            var token = new Token(target, memberName);\n            TargetLedger result;\n            if (_table.TryGetValue(token, out result))\n                return result;\n            else\n                return null;\n        }\n\n        #endregion\n\n        #region Static Members\n\n        public static TargetLedger GetLedger(Component target, string memberName)\n        {\n            if (target == null) return null;\n\n            var ledger = target.GetComponent<CompoundStateLedger>();\n            if (ledger == null) ledger = target.AddComponent<CompoundStateLedger>();\n\n            var token = new Token(target, memberName);\n            TargetLedger result;\n            if (ledger._table.TryGetValue(token, out result)) return result;\n\n            result = TargetLedger.Create(ledger, target, memberName);\n            ledger._table[new Token(target, memberName)] = result;\n            return result;\n        }\n\n        #endregion\n\n        #region Special Types\n\n        private struct Token\n        {\n            public Component Target;\n            public string MemberName;\n\n            public Token(Component targ, string member)\n            {\n                this.Target = targ;\n                this.MemberName = member;\n            }\n\n        }\n\n        public class TargetLedger : System.IDisposable\n        {\n\n            #region Fields\n\n            private CompoundStateLedger _owner;\n            private Component _target;\n            private string _memberName;\n            private IMemberAccessor _accessor;\n            \n            private Dictionary<object, double> _entries = new Dictionary<object, double>();\n            private double _baseValue;\n            private double _balance;\n\n            #endregion\n\n            #region CONSTRUCTOR\n            \n            private TargetLedger()\n            {\n\n            }\n\n            #endregion\n\n            #region Properties\n\n            public double BaseValue\n            {\n                get { return _baseValue; }\n            }\n\n            public double Balance\n            {\n                get { return _balance; }\n            }\n            \n            #endregion\n\n            #region Methods\n            \n            public void ApplyModifier(object token, double value)\n            {\n                _entries[token] = value;\n                this.TallyBalance();\n            }\n\n            public bool RemoveModifier(object token)\n            {\n                if (_entries.Remove(token))\n                {\n                    this.TallyBalance();\n                    return true;\n                }\n                else\n                {\n                    return false;\n                }\n            }\n\n            public void Clear()\n            {\n                _entries.Clear();\n                _entries[this] = _baseValue;\n                this.TallyBalance();\n            }\n\n            /// <summary>\n            /// Applies balance to target if this is active.\n            /// </summary>\n            public void ForceApplyBalance()\n            {\n                if (_accessor != null) _accessor.Set(_target, _balance);\n            }\n\n            public void ResetTargetToBaseValue()\n            {\n                if (_accessor != null) _accessor.Set(_target, _baseValue);\n            }\n\n            /// <summary>\n            /// Sets the base value to the current state. This should only be called if you've modified what you'd like the base value to be on the target.\n            /// </summary>\n            public void ReinitBaseValue()\n            {\n                if (_accessor != null)\n                {\n                    _baseValue = ConvertUtil.ToDouble(_accessor.Get(_target));\n                    this.ApplyModifier(this, _baseValue);\n                }\n            }\n\n            private void TallyBalance()\n            {\n                double total = 0d;\n                var e = _entries.GetEnumerator();\n                while (e.MoveNext())\n                {\n                    total += e.Current.Value;\n                }\n                _balance = total;\n\n                if (_accessor != null)\n                {\n                    _accessor.Set(_target, _balance);\n                }\n            }\n\n            #endregion\n\n            #region IDisposable Interface\n\n            public void Dispose()\n            {\n                _entries.Clear();\n                if (_accessor != null) _accessor.Set(_target, _baseValue);\n                if (_owner != null)\n                {\n                    var token = new Token(_target, _memberName);\n                    TargetLedger obj;\n                    if (_owner._table.TryGetValue(token, out obj) && obj == this)\n                        _owner._table.Remove(token);\n                }\n\n                _owner = null;\n                _target = null;\n                _memberName = null;\n                _accessor = null;\n                _baseValue = 0d;\n                _baseValue = 0d;\n            }\n\n            #endregion\n\n            #region Factory\n\n            internal static TargetLedger Create(CompoundStateLedger owner, Component target, string memberName)\n            {\n                if (target == null || string.IsNullOrEmpty(memberName)) return null;\n\n                var member = DynamicUtil.GetMember(target, memberName, true);\n                if (member == null) return null;\n                \n                var entry = new TargetLedger();\n                entry._owner = owner;\n                entry._target = target;\n                entry._memberName = memberName;\n                entry._accessor = new DynamicMemberAccessor(memberName);\n                entry.ReinitBaseValue();\n                return entry;\n            }\n\n            #endregion\n\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/CompoundTrigger.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n    \r\n    public interface ICompoundTriggerEnterResponder\r\n    {\r\n        void OnCompoundTriggerEnter(Collider other);\r\n    }\r\n\r\n    public interface ICompoundTriggerExitResponder\r\n    {\r\n        void OnCompoundTriggerExit(Collider other);\r\n    }\r\n    \r\n    public class CompoundTrigger : SPComponent\r\n    {\r\n\r\n        #region Fields\r\n        \r\n        private Dictionary<Collider, CompoundTriggerMember> _colliders = new Dictionary<Collider, CompoundTriggerMember>(ObjectInstanceIDEqualityComparer<Collider>.Default);\r\n        private HashSet<Collider> _active = new HashSet<Collider>();\r\n        private System.Action<ICompoundTriggerEnterResponder, Collider> _onEnter;\r\n        private System.Action<ICompoundTriggerExitResponder, Collider> _onExit;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Start()\r\n        {\r\n            base.Start();\r\n\r\n            this.SyncTriggers();\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            this.PurgeActiveState();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ICollection<Collider> Colliders\r\n        {\r\n            get { return _colliders.Keys; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void SyncTriggers()\r\n        {\r\n            using (var lst = TempCollection.GetList<Collider>())\r\n            {\r\n                this.GetComponentsInChildren<Collider>(true, lst);\r\n\r\n                //purge entries if necessary\r\n                if (_colliders.Count > 0)\r\n                {\r\n                    using (var purge = TempCollection.GetList<Collider>())\r\n                    {\r\n                        var ed = _colliders.GetEnumerator();\r\n                        while (ed.MoveNext())\r\n                        {\r\n                            if(!ObjUtil.IsObjectAlive(ed.Current.Key) || ed.Current.Value == null || !lst.Contains(ed.Current.Key))\r\n                            {\r\n                                purge.Add(ed.Current.Key);\r\n                                ObjUtil.SmartDestroy(ed.Current.Value);\r\n                            }\r\n                        }\r\n                        if(purge.Count > 0)\r\n                        {\r\n                            var e = purge.GetEnumerator();\r\n                            while(e.MoveNext())\r\n                            {\r\n                                _colliders.Remove(e.Current);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                //fill unknowns\r\n                if(lst.Count > 0)\r\n                {\r\n                    var e = lst.GetEnumerator();\r\n                    while(e.MoveNext())\r\n                    {\r\n                        if(!_colliders.Contains(e.Current))\r\n                        {\r\n                            var m = e.Current.AddComponent<CompoundTriggerMember>();\r\n                            m.Init(this, e.Current);\r\n                            _colliders.Add(e.Current, m);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public Collider[] GetActiveColliders()\r\n        {\r\n            return _active.Count > 0 ? _active.ToArray() : ArrayUtil.Empty<Collider>();\r\n        }\r\n\r\n        public int GetActiveColliders(ICollection<Collider> output)\r\n        {\r\n            int cnt = _active.Count;\r\n            if (cnt == 0) return 0;\r\n\r\n            var e = _active.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                output.Add(e.Current);\r\n            }\r\n            return cnt;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Dumps state of what member colliders are intersected currently. \r\n        /// Caution using this, any member collider currently intersected will not refire OnTriggerEnter. \r\n        /// This is usually reserved for OnDisable to revert state.\r\n        /// </summary>\r\n        protected void PurgeActiveState()\r\n        {\r\n            _active.Clear();\r\n            var e = _colliders.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                e.Current.Value.Active.Clear();\r\n            }\r\n        }\r\n        \r\n        private void SignalTriggerEnter(CompoundTriggerMember member, Collider other)\r\n        {\r\n            if(_active.Add(other))\r\n            {\r\n                this.OnCompoundTriggerEnter(other);\r\n            }\r\n        }\r\n\r\n        private void SignalTriggerExit(CompoundTriggerMember member, Collider other)\r\n        {\r\n            var e = _colliders.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if (e.Current.Value.Active.Contains(other)) return;\r\n            }\r\n\r\n            if(_active.Remove(other))\r\n            {\r\n                this.OnCompoundTriggerExit(other);\r\n            }\r\n        }\r\n\r\n        protected virtual void OnCompoundTriggerEnter(Collider other)\r\n        {\r\n            if (_onEnter == null) _onEnter = (x, y) => x.OnCompoundTriggerEnter(y);\r\n            Messaging.Execute<ICompoundTriggerEnterResponder, Collider>(this.gameObject, other, _onEnter);\r\n        }\r\n\r\n        protected virtual void OnCompoundTriggerExit(Collider other)\r\n        {\r\n            if (_onExit == null) _onExit = (x, y) => x.OnCompoundTriggerExit(y);\r\n            Messaging.Execute<ICompoundTriggerExitResponder, Collider>(this.gameObject, other, _onExit);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Special Types\r\n\r\n        private class CompoundTriggerMember : MonoBehaviour\r\n        {\r\n\r\n            [System.NonSerialized]\r\n            private CompoundTrigger _owner;\r\n            [System.NonSerialized]\r\n            private Collider _collider;\r\n            [System.NonSerialized]\r\n            private HashSet<Collider> _active;\r\n\r\n            internal CompoundTrigger Owner\r\n            {\r\n                get { return _owner; }\r\n            }\r\n\r\n            internal Collider Collider\r\n            {\r\n                get { return _collider; }\r\n            }\r\n\r\n            internal HashSet<Collider> Active\r\n            {\r\n                get { return _active; }\r\n            }\r\n\r\n            internal void Init(CompoundTrigger owner, Collider collider)\r\n            {\r\n                _owner = owner;\r\n                _collider = collider;\r\n                _active = new HashSet<Collider>(ObjectInstanceIDEqualityComparer<Collider>.Default);\r\n            }\r\n            \r\n            private void OnTriggerEnter(Collider other)\r\n            {\r\n                if (_active.Add(other))\r\n                {\r\n                    if (_owner != null) _owner.SignalTriggerEnter(this, other);\r\n                }\r\n            }\r\n\r\n            private void OnTriggerExit(Collider other)\r\n            {\r\n                if (_active.Remove(other))\r\n                {\r\n                    if (_owner != null) _owner.SignalTriggerExit(this, other);\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/ConfigurableForce.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    [System.Serializable()]\r\n    public class ConfigurableForce\r\n    {\r\n\r\n        public enum ForceDirection\r\n        {\r\n            Relative = 0,\r\n            Random = 1,\r\n            Forward = 2\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private ForceDirection _direction;\r\n        [SerializeField()]\r\n        private float _strength;\r\n        [SerializeField()]\r\n        private ForceMode _forceMode;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public ConfigurableForce()\r\n        { \r\n        }\r\n\r\n        public ConfigurableForce(float strength)\r\n        {\r\n            _strength = strength;\r\n        }\r\n\r\n        public ConfigurableForce(float strength, ForceMode mode, ForceDirection dir)\r\n        {\r\n            _direction = dir;\r\n            _strength = strength;\r\n            _forceMode = mode;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ForceDirection Direction { get { return _direction; } set { _direction = value; } }\r\n\r\n        public float Strength { get { return _strength; } set { _strength = value; } }\r\n\r\n        public ForceMode ForceMode { get { return _forceMode; } set { _forceMode = value; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public Vector3 GetForce(Trans forceOrigin, Trans forceTarget)\r\n        {\r\n            switch (_direction)\r\n            {\r\n                case ForceDirection.Relative:\r\n                    return (forceTarget.Position - forceOrigin.Position).normalized * _strength;\r\n                case ForceDirection.Random:\r\n                    return RandomUtil.Standard.OnUnitSphere() * _strength;\r\n                case ForceDirection.Forward:\r\n                    return forceOrigin.Forward * _strength;\r\n            }\r\n            return Vector3.zero;\r\n        }\r\n\r\n        public Vector3 GetForce(Transform forceOrigin, Transform forceTarget)\r\n        {\r\n            switch (_direction)\r\n            {\r\n                case ForceDirection.Relative:\r\n                    return (forceTarget.position - forceOrigin.position).normalized * _strength;\r\n                case ForceDirection.Random:\r\n                    return RandomUtil.Standard.OnUnitSphere() * _strength;\r\n                case ForceDirection.Forward:\r\n                    return forceOrigin.forward * _strength;\r\n            }\r\n            return Vector3.zero;\r\n        }\r\n\r\n        public void ApplyForce(Trans forceOrigin, Rigidbody body)\r\n        {\r\n            var force = this.GetForce(forceOrigin, Trans.GetGlobal(body.transform));\r\n            body.AddForce(force, _forceMode);\r\n        }\r\n\r\n        public void ApplyForce(Transform forceOrigin, Rigidbody body)\r\n        {\r\n            var force = this.GetForce(forceOrigin, body.transform);\r\n            body.AddForce(force, _forceMode);\r\n        }\r\n\r\n        public void ApplyForce(Transform forceOrigin, IForceReceiver body)\r\n        {\r\n            var force = this.GetForce(forceOrigin, body.transform);\r\n            body.AddForce(force, _forceMode);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Methods\r\n\r\n        public static Vector3 GetDirection(ForceDirection dir, Transform forceOrigin, Transform forceTarget)\r\n        {\r\n            switch (dir)\r\n            {\r\n                case ForceDirection.Relative:\r\n                    return (forceTarget.position - forceOrigin.position).normalized;\r\n                case ForceDirection.Random:\r\n                    return RandomUtil.Standard.OnUnitSphere();\r\n                case ForceDirection.Forward:\r\n                    return forceOrigin.forward;\r\n            }\r\n            return Vector3.zero;\r\n        }\r\n\r\n        public static Vector3 GetDirection(ForceDirection dir, Trans forceOrigin, Trans forceTarget)\r\n        {\r\n            switch (dir)\r\n            {\r\n                case ForceDirection.Relative:\r\n                    return (forceTarget.Position - forceOrigin.Position).normalized;\r\n                case ForceDirection.Random:\r\n                    return RandomUtil.Standard.OnUnitSphere();\r\n                case ForceDirection.Forward:\r\n                    return forceOrigin.Forward;\r\n            }\r\n            return Vector3.zero;\r\n        }\r\n\r\n        public static Vector2 GetDirection(IPlanarSurface surface, ForceDirection dir, Transform forceOrigin, Transform forceTarget)\r\n        {\r\n            if (surface == null) return Vector2.zero;\r\n            switch (dir)\r\n            {\r\n                case ForceDirection.Relative:\r\n                    return surface.ProjectVectorTo2D(forceOrigin.position, (forceTarget.position - forceOrigin.position)).normalized;\r\n                case ForceDirection.Random:\r\n                    return RandomUtil.Standard.OnUnitCircle();\r\n                case ForceDirection.Forward:\r\n                    return surface.ProjectVectorTo2D(forceOrigin.position, forceOrigin.forward).normalized;\r\n            }\r\n            return Vector2.zero;\r\n        }\r\n\r\n        public static Vector2 GetDirection(IPlanarSurface surface, ForceDirection dir, Trans forceOrigin, Trans forceTarget)\r\n        {\r\n            if (surface == null) return Vector2.zero;\r\n            switch (dir)\r\n            {\r\n                case ForceDirection.Relative:\r\n                    return surface.ProjectVectorTo2D(forceOrigin.Position, (forceTarget.Position - forceOrigin.Position)).normalized;\r\n                case ForceDirection.Random:\r\n                    return RandomUtil.Standard.OnUnitCircle();\r\n                case ForceDirection.Forward:\r\n                    return surface.ProjectVectorTo2D(forceOrigin.Position, forceOrigin.Forward).normalized;\r\n            }\r\n            return Vector2.zero;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/CustomTimeSupplier.cs",
    "content": "﻿using UnityEngine;\r\nusing System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// A TimeSupplier that allows for individual scaling. You may have to scale the world time to 0 for pause \r\n    /// or other various effects, but you still want time to tick normally for other aspects like the menu or \r\n    /// something. BUT, lets say you want to be able to scale that time as well for various effects, independent \r\n    /// of the world time. By using a custom TimeSupplier you can scale that time independent of the world time. \r\n    /// \r\n    /// Furthermore you can stack time scales, just like described in com.spacepuppy.SPTime.\r\n    /// \r\n    /// Allows for approximately 29,247 years of simulation, twice that if you include negative time, while \r\n    /// maintaining at minimum 3 digits of fractional precision for seconds (millisecond precision) when at the \r\n    /// extents of its range.\r\n    /// </summary>\r\n    public class CustomTimeSupplier : ICustomTimeSupplier, IScalableTimeSupplier, System.IDisposable\r\n    {\r\n\r\n        private const long SECONDS_TO_TICKS = 10000000L;\r\n        private const double TICKS_TO_SECONDS = 1E-07d;\r\n\r\n        private static long GetTicksSafe(double value)\r\n        {\r\n            if (double.IsNaN(value))\r\n                return 0;\r\n\r\n            value *= (double)SECONDS_TO_TICKS;\r\n            if (value <= (double)long.MinValue)\r\n                return long.MinValue;\r\n            else if (value >= (double)long.MaxValue)\r\n                return long.MaxValue;\r\n            else\r\n            {\r\n                try\r\n                {\r\n                    return (long)value;\r\n                }\r\n                catch\r\n                {\r\n                    return 0;\r\n                }\r\n            }\r\n        }\r\n\r\n        #region Fields\r\n\r\n        private string _id;\r\n        private long _startTime;\r\n        private long _t;\r\n        private long _ft;\r\n        private double _scale = 1.0;\r\n        private bool _paused;\r\n        private Dictionary<string, double> _scales = new Dictionary<string, double>();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        internal CustomTimeSupplier(string id)\r\n        {\r\n            _id = id;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public string Id { get { return _id; } }\r\n\r\n        public bool Valid { get { return _id != null; } }\r\n\r\n        public double StartTime\r\n        {\r\n            get { return _startTime * TICKS_TO_SECONDS; }\r\n            set\r\n            {\r\n                _startTime = GetTicksSafe(value);\r\n            }\r\n        }\r\n\r\n        public TimeSpan TotalSpan\r\n        {\r\n            get\r\n            {\r\n                if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\r\n                {\r\n                    return new TimeSpan(_ft + _startTime);\r\n                }\r\n                else\r\n                {\r\n                    return new TimeSpan(_t + _startTime);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// When updating should the world time scale be respected as well? Use this to cause the timer to pause when the normal time is paused.\r\n        /// </summary>\r\n        public bool TrackNormalTimeScale { get; set; }\r\n\r\n\r\n        /// <summary>\r\n        /// The total time passed since the CustomTime was created. Value is relative to the Update sequence.\r\n        /// </summary>\r\n        public double UpdateTotal { get { return (_t + _startTime) * TICKS_TO_SECONDS; } }\r\n\r\n        public TimeSpan UpdateTotalSpan { get { return new TimeSpan(_t + _startTime); } }\r\n\r\n        /// <summary>\r\n        /// The delta time since the call to standard update. This will always return the delta since last update, regardless of if you call it in update/fixedupdate.\r\n        /// </summary>\r\n        public double UpdateDelta { get { return Time.unscaledDeltaTime * _scale; } }\r\n\r\n\r\n\r\n\r\n        /// <summary>\r\n        /// The total time passed since the CustomTime was created. Value is relative to the FixedUpdate sequence;\r\n        /// </summary>\r\n        public double FixedTotal { get { return (_ft + _startTime) * TICKS_TO_SECONDS; } }\r\n        \r\n        public TimeSpan FixedTotalSpan { get { return new TimeSpan(_ft + _startTime); } }\r\n\r\n        /// <summary>\r\n        /// The delta time since the call to fixed update. This will always return the delta since last fixedupdate, regardless of if you call it in update/fixedupdate.\r\n        /// </summary>\r\n        public double FixedDelta { get { return Time.fixedDeltaTime * _scale; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public bool Destroy()\r\n        {\r\n            if( SPTime.RemoveCustomTime(this))\r\n            {\r\n                _id = null;\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        private void SyncTimeScale()\r\n        {\r\n            double result = 1d;\r\n            if (_scales.Count > 0)\r\n            {\r\n                var e = _scales.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    result *= e.Current.Value;\r\n                }\r\n            }\r\n            if(System.Math.Abs(result - _scale) > 0.0000001d)\r\n            {\r\n                _scale = result;\r\n                if (this.TimeScaleChanged != null) this.TimeScaleChanged(this, System.EventArgs.Empty);\r\n            }\r\n            else\r\n            {\r\n                _scale = result;\r\n            }\r\n        }\r\n\r\n        public void Reset()\r\n        {\r\n            _startTime = 0;\r\n            _t = 0;\r\n            _ft = 0;\r\n        }\r\n\r\n        public void Reset(double startTime)\r\n        {\r\n            _startTime = GetTicksSafe(startTime);\r\n            _t = 0;\r\n            _ft = 0;\r\n        }\r\n\r\n\r\n        /// <summary>\r\n        /// Adjust the current 'TotalTime' by some amount. \r\n        /// WARNING - delta is not effected\r\n        /// WARNING - time based event systems might be adversely impacted\r\n        /// Especially if the value is negative.\r\n        /// USE AT OWN RISK!\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        public void AdjustTime(double value)\r\n        {\r\n            _startTime += GetTicksSafe(value);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITimeSupplier Interface\r\n\r\n        public event System.EventHandler TimeScaleChanged;\r\n\r\n        /// <summary>\r\n        /// The total time passed since thie CustomTime was created. Value is dependent on the UpdateSequence being accessed from.\r\n        /// </summary>\r\n        public float Total\r\n        {\r\n            get\r\n            {\r\n                if(GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\r\n                {\r\n                    return (float)((_ft + _startTime) * TICKS_TO_SECONDS);\r\n                }\r\n                else\r\n                {\r\n                    return (float)((_t + _startTime) * TICKS_TO_SECONDS);\r\n                }\r\n            }\r\n        }\r\n\r\n        public double TotalPrecise\r\n        {\r\n            get\r\n            {\r\n                if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\r\n                {\r\n                    return (_ft + _startTime) * TICKS_TO_SECONDS;\r\n                }\r\n                else\r\n                {\r\n                    return (_t + _startTime) * TICKS_TO_SECONDS;\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The delta time since the last call to update/fixedupdate, relative to in which update/fixedupdate you call.\r\n        /// </summary>\r\n        public float Delta\r\n        {\r\n            get\r\n            {\r\n                if (_paused)\r\n                    return 0f;\r\n                else\r\n                    return (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate) ? (float)(Time.fixedDeltaTime * _scale) : (float)(Time.unscaledDeltaTime * _scale);\r\n            }\r\n        }\r\n\r\n        public bool Paused\r\n        {\r\n            get { return _paused; }\r\n            set\r\n            {\r\n                if (_paused == value) return;\r\n                _paused = value;\r\n                if (this.TimeScaleChanged != null) this.TimeScaleChanged(this, System.EventArgs.Empty);\r\n            }\r\n        }\r\n\r\n        public float Scale\r\n        {\r\n            get { return (float)_scale; }\r\n        }\r\n\r\n        public IEnumerable<string> ScaleIds\r\n        {\r\n            get { return _scales.Keys; }\r\n        }\r\n\r\n        public void SetScale(string id, float scale)\r\n        {\r\n            _scales[id] = (double)scale;\r\n            this.SyncTimeScale();\r\n        }\r\n\r\n        public float GetScale(string id)\r\n        {\r\n            double result;\r\n            if (_scales.TryGetValue(id, out result))\r\n            {\r\n                return (float)result;\r\n            }\r\n            else\r\n            {\r\n                return float.NaN;\r\n            }\r\n        }\r\n\r\n        public bool RemoveScale(string id)\r\n        {\r\n            if (_scales.Remove(id))\r\n            {\r\n                this.SyncTimeScale();\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public bool HasScale(string id)\r\n        {\r\n            return _scales.ContainsKey(id);\r\n        }\r\n\r\n        void ICustomTimeSupplier.Update(bool isFixed)\r\n        {\r\n            if (_paused) return;\r\n\r\n            double scale = _scale;\r\n            if (this.TrackNormalTimeScale) scale *= SPTime.Normal.Scale;\r\n            if (isFixed)\r\n            {\r\n                _ft += (long)(Time.fixedUnscaledDeltaTime * scale * SECONDS_TO_TICKS);\r\n            }\r\n            else\r\n            {\r\n                _t += (long)(Time.unscaledDeltaTime * scale * SECONDS_TO_TICKS);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        void System.IDisposable.Dispose()\r\n        {\r\n            this.Destroy();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n    \r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Delegates.cs",
    "content": "﻿namespace com.spacepuppy\r\n{\r\n\r\n    public static class ActionHelper\r\n    {\r\n        public static System.Action Null()\r\n        {\r\n            return null;\r\n        }\r\n        public static System.Action<T> Null<T>()\r\n        {\r\n            return null;\r\n        }\r\n        public static System.Action<T1, T2> Null<T1, T2>()\r\n        {\r\n            return null;\r\n        }\r\n        public static System.Action<T1, T2, T3> Null<T1, T2, T3>()\r\n        {\r\n            return null;\r\n        }\r\n        public static System.Action<T1, T2, T3, T4> Null<T1, T2, T3, T4>()\r\n        {\r\n            return null;\r\n        }\r\n        public static Action<T1, T2, T3, T4, T5> Null<T1, T2, T3, T4, T5>()\r\n        {\r\n            return null;\r\n        }\r\n    }\r\n\r\n    public delegate void Action<T1, T2, T3, T4, T5>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);\r\n    public delegate void Action<T1, T2, T3, T4, T5, T6>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6);\r\n    public delegate void Action<T1, T2, T3, T4, T5, T6, T7>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7);\r\n    public delegate void Action<T1, T2, T3, T4, T5, T6, T7, T8>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8);\r\n    \r\n    public delegate void NotificationHandler(object sender, Notification n);\r\n    public delegate void NotificationHandler<T>(object sender, T notification) where T : Notification;\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/Accessors/BasicMemberAccessor.cs",
    "content": "﻿using System.Reflection;\r\n\r\nnamespace com.spacepuppy.Dynamic.Accessors\r\n{\r\n    public class BasicMemberAccessor : IMemberAccessor\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private MemberInfo _memberInfo;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public BasicMemberAccessor(MemberInfo info)\r\n        {\r\n            _memberInfo = info;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IMemberAccessor Interface\r\n\r\n        public object Get(object target)\r\n        {\r\n            if (_memberInfo is PropertyInfo)\r\n            {\r\n                return (_memberInfo as PropertyInfo).GetValue(target, null);\r\n            }\r\n            else if (_memberInfo is FieldInfo)\r\n            {\r\n                return (_memberInfo as FieldInfo).GetValue(target);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public void Set(object target, object value)\r\n        {\r\n            if (_memberInfo is PropertyInfo)\r\n            {\r\n                try\r\n                {\r\n                    (_memberInfo as PropertyInfo).SetValue(target, value, null);\r\n                }\r\n                catch (System.InvalidCastException)\r\n                {\r\n                    // This happens only if a float is being assigned to an int.\r\n                    (_memberInfo as PropertyInfo).SetValue(target, (int)System.Math.Floor((double)(float)value), null);\r\n                }\r\n                catch (System.ArgumentException)\r\n                {\r\n                    // This happens only on iOS if a float is being assigned to an int.\r\n                    (_memberInfo as PropertyInfo).SetValue(target, (int)System.Math.Floor((double)(float)value), null);\r\n                }\r\n            }\r\n            else if (_memberInfo is FieldInfo)\r\n            {\r\n                try\r\n                {\r\n                    (_memberInfo as FieldInfo).SetValue(target, value);\r\n                }\r\n                catch (System.InvalidCastException)\r\n                {\r\n                    // This happens only if a float is being assigned to an int.\r\n                    (_memberInfo as FieldInfo).SetValue(target, (int)System.Math.Floor((double)(float)value));\r\n                }\r\n                catch (System.ArgumentException)\r\n                {\r\n                    // This happens only on iOS if a float is being assigned to an int.\r\n                    (_memberInfo as FieldInfo).SetValue(target, (int)System.Math.Floor((double)(float)value));\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/Accessors/DynamicMemberAccessor.cs",
    "content": "﻿namespace com.spacepuppy.Dynamic.Accessors\r\n{\r\n\r\n    /// <summary>\r\n    /// Acts as a IMemberAccessor that accesses IDynamic objects.\r\n    /// \r\n    /// NOTE - when updating DynamicUtil later to use IMemberAccessors for speed... we need to reverse this implementation.\r\n    /// </summary>\r\n    public class DynamicMemberAccessor : IMemberAccessor\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private string _memberName;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public DynamicMemberAccessor(string memberName)\r\n        {\r\n            _memberName = memberName;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        public object Get(object target)\r\n        {\r\n            return DynamicUtil.GetValue(target, _memberName);\r\n        }\r\n\r\n        public void Set(object target, object value)\r\n        {\r\n            DynamicUtil.SetValue(target, _memberName, value);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/Accessors/FastTransformMemberAccessor.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Reflection;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Dynamic.Accessors\r\n{\r\n    internal class FastTransformMemberAccessor : IMemberAccessor\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private System.Action<Transform, object> _setter;\r\n        private System.Func<Transform, object> _getter;\r\n        private IMemberAccessor _alternate;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private FastTransformMemberAccessor()\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void SetPosition(Transform targ, object value)\r\n        {\r\n            targ.position = ConvertUtil.ToVector3(value);\r\n        }\r\n\r\n        private object GetPosition(Transform targ)\r\n        {\r\n            return targ.position;\r\n        }\r\n\r\n        private void SetLocalPosition(Transform targ, object value)\r\n        {\r\n            targ.localPosition = ConvertUtil.ToVector3(value);\r\n        }\r\n\r\n        private object GetLocalPosition(Transform targ)\r\n        {\r\n            return targ.localPosition;\r\n        }\r\n\r\n        private void SetLocalScale(Transform targ, object value)\r\n        {\r\n            targ.localScale = ConvertUtil.ToVector3(value);\r\n        }\r\n\r\n        private object GetLocalScale(Transform targ)\r\n        {\r\n            return targ.localScale;\r\n        }\r\n\r\n        private void SetEulerAngles(Transform targ, object value)\r\n        {\r\n            //targ.eulerAngles = ConvertUtil.ToVector3(value);\r\n            targ.rotation = QuaternionUtil.MassageAsQuaternion(value);\r\n        }\r\n\r\n        private object GetEulerAngles(Transform targ)\r\n        {\r\n            return targ.eulerAngles;\r\n        }\r\n\r\n        private void SetLocalEulerAngles(Transform targ, object value)\r\n        {\r\n            //targ.localEulerAngles = ConvertUtil.ToVector3(value);\r\n            targ.localRotation = QuaternionUtil.MassageAsQuaternion(value);\r\n        }\r\n\r\n        private object GetLocalEulerAngles(Transform targ)\r\n        {\r\n            return targ.localEulerAngles;\r\n        }\r\n\r\n        private void SetRotation(Transform targ, object value)\r\n        {\r\n            //targ.rotation = ConvertUtil.ToQuaternion(value);\r\n            targ.rotation = QuaternionUtil.MassageAsQuaternion(value);\r\n        }\r\n\r\n        private object GetRotation(Transform targ)\r\n        {\r\n            return targ.rotation;\r\n        }\r\n\r\n        private void SetLocalRotation(Transform targ, object value)\r\n        {\r\n            //targ.localRotation = ConvertUtil.ToQuaternion(value);\r\n            targ.localRotation = QuaternionUtil.MassageAsQuaternion(value);\r\n        }\r\n\r\n        private object GetLocalRotation(Transform targ)\r\n        {\r\n            return targ.localRotation;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IMemberAccessor Interface\r\n\r\n        public object Get(object target)\r\n        {\r\n            return (_alternate != null) ? _alternate.Get(target) : _getter(target as Transform);\r\n        }\r\n\r\n        public void Set(object target, object value)\r\n        {\r\n            if (_alternate != null)\r\n                _alternate.Set(target, value);\r\n            else\r\n                _setter(target as Transform, value);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Factory\r\n\r\n        public static FastTransformMemberAccessor Create(MemberInfo info, bool useBasicMemberAccessor = false)\r\n        {\r\n            if(info == null) throw new System.ArgumentNullException(\"info\");\r\n            if(info.MemberType != MemberTypes.Property && info.MemberType != MemberTypes.Field) throw new System.ArgumentException(\"MemberInfo must be of type FieldInfo or PropertyInfo\", \"info\");\r\n\r\n            FastTransformMemberAccessor obj = null;\r\n            switch(info.Name)\r\n            {\r\n                case \"position\" :\r\n                    obj = new FastTransformMemberAccessor();\r\n                    obj._setter = obj.SetPosition;\r\n                    obj._getter = obj.GetPosition;\r\n                    break;\r\n                case \"localPosition\":\r\n                    obj = new FastTransformMemberAccessor();\r\n                    obj._setter = obj.SetLocalPosition;\r\n                    obj._getter = obj.GetLocalPosition;\r\n                    break;\r\n                case \"localScale\":\r\n                    obj = new FastTransformMemberAccessor();\r\n                    obj._setter = obj.SetLocalScale;\r\n                    obj._getter = obj.GetLocalScale;\r\n                    break;\r\n                case \"eulerAngles\":\r\n                    obj = new FastTransformMemberAccessor();\r\n                    obj._setter = obj.SetEulerAngles;\r\n                    obj._getter = obj.GetEulerAngles;\r\n                    break;\r\n                case \"localEulerAngles\":\r\n                    obj = new FastTransformMemberAccessor();\r\n                    obj._setter = obj.SetLocalEulerAngles;\r\n                    obj._getter = obj.GetLocalEulerAngles;\r\n                    break;\r\n                case \"rotation\":\r\n                    obj = new FastTransformMemberAccessor();\r\n                    obj._setter = obj.SetRotation;\r\n                    obj._getter = obj.GetRotation;\r\n                    break;\r\n                case \"localRotation\":\r\n                    obj = new FastTransformMemberAccessor();\r\n                    obj._setter = obj.SetLocalRotation;\r\n                    obj._getter = obj.GetLocalRotation;\r\n                    break;\r\n                default:\r\n                    obj = new FastTransformMemberAccessor();\r\n                    if (useBasicMemberAccessor)\r\n                    {\r\n                        obj._alternate = new BasicMemberAccessor(info);\r\n                    }\r\n                    else\r\n                    {\r\n                        if (info.MemberType == MemberTypes.Field)\r\n                            obj._alternate = new FieldAccessor(info as FieldInfo);\r\n                        else\r\n                            obj._alternate = new PropertyAccessor(info as PropertyInfo);\r\n                    }\r\n                    break;\r\n            }\r\n\r\n            return obj;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/Accessors/FieldAccessor.cs",
    "content": "﻿//\r\n// FieldAccessor.cs\r\n//\r\n// Author: James Nies\r\n// Licensed under The Code Project Open License (CPOL): http://www.codeproject.com/info/cpol10.aspx\r\n\r\nusing System;\r\nusing System.Reflection;\r\nusing System.Reflection.Emit;\r\n\r\nnamespace com.spacepuppy.Dynamic.Accessors\r\n{\r\n    /// <summary>\r\n    /// The PropertyAccessor class provides fast dynamic access\r\n    /// to a property of a specified target class.\r\n    /// </summary>\r\n    internal class FieldAccessor : MemberAccessor\r\n    {\r\n        /// <summary>\r\n        /// Creates a new property accessor.\r\n        /// </summary>\r\n        internal FieldAccessor(FieldInfo fieldInfo)\r\n            : base(fieldInfo)\r\n        {\r\n            _canRead = true;\r\n            _canWrite = !(fieldInfo.IsLiteral || fieldInfo.IsInitOnly);\r\n            _propertyType = fieldInfo.FieldType;\r\n        }\r\n\r\n        /// <summary>\r\n        /// The Type of the Property being accessed.\r\n        /// </summary>\r\n        internal override Type MemberType\r\n        {\r\n            get\r\n            {\r\n                return _propertyType;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Whether or not the Property supports read access.\r\n        /// </summary>\r\n        internal override bool CanRead\r\n        {\r\n            get\r\n            {\r\n                return _canRead;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Whether or not the Property supports write access.\r\n        /// </summary>\r\n        internal override bool CanWrite\r\n        {\r\n            get\r\n            {\r\n                return _canWrite;\r\n            }\r\n        }\r\n\r\n        //\r\n        readonly Type _propertyType;\r\n        readonly bool _canRead;\r\n        readonly bool _canWrite;\r\n\r\n        protected override void _EmitSetter(TypeBuilder myType)\r\n        {\r\n            //\r\n            // Define a method for the set operation.\r\n            //\r\n            Type[] setParamTypes = new[] { typeof(object), typeof(object) };\r\n            Type setReturnType = null;\r\n            MethodBuilder setMethod =\r\n                myType.DefineMethod(\"Set\",\r\n                                    MethodAttributes.Public | MethodAttributes.Virtual,\r\n                                    setReturnType,\r\n                                    setParamTypes);\r\n\r\n            //\r\n            // From the method, get an ILGenerator. This is used to\r\n            // emit the IL that we want.\r\n            //\r\n            ILGenerator setIL = setMethod.GetILGenerator();\r\n            //\r\n            // Emit the IL.\r\n            //\r\n\r\n            FieldInfo targetField = _targetType.GetField(_fieldName);\r\n            if (targetField != null)\r\n            {\r\n                Type paramType = targetField.FieldType;\r\n\r\n                setIL.DeclareLocal(paramType);\r\n                setIL.Emit(OpCodes.Ldarg_1); //Load the first argument\r\n                //(target object)\r\n\r\n                setIL.Emit(OpCodes.Castclass, _targetType); //Cast to the source type\r\n\r\n                setIL.Emit(OpCodes.Ldarg_2); //Load the second argument\r\n                //(value object)\r\n\r\n                if (paramType.IsValueType)\r\n                {\r\n                    setIL.Emit(OpCodes.Unbox, paramType); //Unbox it\r\n                    if (s_TypeHash[paramType] != null) //and load\r\n                    {\r\n                        OpCode load = (OpCode)s_TypeHash[paramType];\r\n                        setIL.Emit(load);\r\n                    }\r\n                    else\r\n                    {\r\n                        setIL.Emit(OpCodes.Ldobj, paramType);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    setIL.Emit(OpCodes.Castclass, paramType); //Cast class\r\n                }\r\n\r\n                setIL.Emit(OpCodes.Stfld, targetField); //Set the property value\r\n            }\r\n            else\r\n            {\r\n                setIL.ThrowException(typeof(MissingMethodException));\r\n            }\r\n\r\n            setIL.Emit(OpCodes.Ret);\r\n        }\r\n\r\n        protected override void _EmitGetter(TypeBuilder myType)\r\n        {\r\n            //\r\n            // Define a method for the get operation.\r\n            //\r\n            Type[] getParamTypes = new[] { typeof(object) };\r\n            Type getReturnType = typeof(object);\r\n            MethodBuilder getMethod =\r\n                myType.DefineMethod(\"Get\",\r\n                                    MethodAttributes.Public | MethodAttributes.Virtual,\r\n                                    getReturnType,\r\n                                    getParamTypes);\r\n\r\n            //\r\n            // From the method, get an ILGenerator. This is used to\r\n            // emit the IL that we want.\r\n            //\r\n            ILGenerator getIL = getMethod.GetILGenerator();\r\n\r\n\r\n            //\r\n            // Emit the IL.\r\n            //\r\n            FieldInfo targetField = _targetType.GetField(_fieldName);\r\n\r\n            if (targetField != null)\r\n            {\r\n                getIL.DeclareLocal(typeof(object));\r\n                getIL.Emit(OpCodes.Ldarg_1); //Load the first argument\r\n                //(target object)\r\n\r\n                getIL.Emit(OpCodes.Castclass, _targetType); //Cast to the source type\r\n\r\n                getIL.Emit(OpCodes.Ldfld, targetField); //Get the property value\r\n\r\n                if (targetField.FieldType.IsValueType)\r\n                {\r\n                    getIL.Emit(OpCodes.Box, targetField.FieldType); //Box if necessary\r\n                }\r\n\r\n                getIL.Emit(OpCodes.Stloc_0); //Store it\r\n\r\n                getIL.Emit(OpCodes.Ldloc_0);\r\n            }\r\n            else\r\n            {\r\n                getIL.ThrowException(typeof(MissingMethodException));\r\n            }\r\n\r\n            getIL.Emit(OpCodes.Ret);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/Accessors/IMemberAccessor.cs",
    "content": "﻿//\r\n// IMemberAccessor.cs\r\n//\r\n// Author: James Nies\r\n// Licensed under The Code Project Open License (CPOL): http://www.codeproject.com/info/cpol10.aspx\r\n\r\nnamespace com.spacepuppy.Dynamic.Accessors\r\n{\r\n    /// <summary>\r\n    /// The IMemberAccessor interface defines a member\r\n    /// accessor.\r\n    /// </summary>\r\n    public interface IMemberAccessor\r\n    {\r\n        /// <summary>\r\n        /// Gets the value stored in the member for\r\n        /// the specified target.\r\n        /// </summary>\r\n        /// <param name=\"target\">Object to retrieve\r\n        /// the member from.</param>\r\n        /// <returns>Member value.</returns>\r\n        object Get(object target);\r\n\r\n        /// <summary>\r\n        /// Sets the value for the member of\r\n        /// the specified target.\r\n        /// </summary>\r\n        /// <param name=\"target\">Object to set the\r\n        /// member on.</param>\r\n        /// <param name=\"value\">Member value.</param>\r\n        void Set(object target, object value);\r\n    }\r\n    \r\n}"
  },
  {
    "path": "SpacepuppyBase/Dynamic/Accessors/MemberAccessor.cs",
    "content": "﻿//\r\n// FastDynamicMemberAccessor.cs\r\n//\r\n// Author: James Nies\r\n// Licensed under The Code Project Open License (CPOL): http://www.codeproject.com/info/cpol10.aspx\r\n\r\nusing System;\r\nusing System.Collections;\r\nusing System.Reflection;\r\nusing System.Reflection.Emit;\r\nusing System.Threading;\r\n\r\nnamespace com.spacepuppy.Dynamic.Accessors\r\n{\r\n    internal sealed class ChainingAccessor : IMemberAccessor\r\n    {\r\n        //example:\r\n        //transform.position.x\r\n        //position is chain\r\n        //x is pimp\r\n\r\n        readonly IMemberAccessor _pimp;\r\n        readonly IMemberAccessor _chain;\r\n\r\n        internal ChainingAccessor(IMemberAccessor impl, IMemberAccessor chain)\r\n        {\r\n            _pimp = impl;\r\n            _chain = chain;\r\n        }\r\n\r\n        public object Get(object target)\r\n        {\r\n            return _pimp.Get(_chain.Get(target));\r\n        }\r\n\r\n        public void Set(object target, object value)\r\n        {\r\n            //_pimp.Set(_chain.Get(target), value);\r\n\r\n            var obj = _chain.Get(target); //get the value we modify\r\n            _pimp.Set(obj, value); //modify the value\r\n            _chain.Set(target, obj); //set it back to the target, this is so structs write correctly\r\n        }\r\n    }\r\n\r\n    internal abstract class MemberAccessor : IMemberAccessor\r\n    {\r\n        const string emmitedTypeName = \"Member\";\r\n\r\n        /// <summary>\r\n        /// Creates a new member accessor.\r\n        /// </summary>\r\n        /// <param name=\"member\">Member</param>\r\n        protected MemberAccessor(MemberInfo member)\r\n        {\r\n            _targetType = member.ReflectedType;\r\n            _fieldName = member.Name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Thanks to Ben Ratzlaff for this snippet of code\r\n        /// http://www.codeproject.com/cs/miscctrl/CustomPropGrid.asp\r\n        ///\r\n        /// \"Initialize a private hashtable with type-opCode pairs\r\n        /// so i dont have to write a long if/else statement when outputting msil\"\r\n        /// </summary>\r\n        static MemberAccessor()\r\n        {\r\n            s_TypeHash = new Hashtable();\r\n            s_TypeHash[typeof(sbyte)] = OpCodes.Ldind_I1;\r\n            s_TypeHash[typeof(byte)] = OpCodes.Ldind_U1;\r\n            s_TypeHash[typeof(char)] = OpCodes.Ldind_U2;\r\n            s_TypeHash[typeof(short)] = OpCodes.Ldind_I2;\r\n            s_TypeHash[typeof(ushort)] = OpCodes.Ldind_U2;\r\n            s_TypeHash[typeof(int)] = OpCodes.Ldind_I4;\r\n            s_TypeHash[typeof(uint)] = OpCodes.Ldind_U4;\r\n            s_TypeHash[typeof(long)] = OpCodes.Ldind_I8;\r\n            s_TypeHash[typeof(ulong)] = OpCodes.Ldind_I8;\r\n            s_TypeHash[typeof(bool)] = OpCodes.Ldind_I1;\r\n            s_TypeHash[typeof(double)] = OpCodes.Ldind_R8;\r\n            s_TypeHash[typeof(float)] = OpCodes.Ldind_R4;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets the member value from the specified target.\r\n        /// </summary>\r\n        /// <param name=\"target\">Target object.</param>\r\n        /// <returns>Member value.</returns>\r\n        public object Get(object target)\r\n        {\r\n            if (CanRead)\r\n            {\r\n                EnsureInit();\r\n\r\n                return _emittedMemberAccessor.Get(target);\r\n            }\r\n            else\r\n            {\r\n                throw new MemberAccessorException(\r\n                    string.Format(\"Member \\\"{0}\\\" does not have a get method.\",\r\n                                  _fieldName));\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Sets the member for the specified target.\r\n        /// </summary>\r\n        /// <param name=\"target\">Target object.</param>\r\n        /// <param name=\"value\">Value to set.</param>\r\n        public void Set(object target, object value)\r\n        {\r\n            if (CanWrite)\r\n            {\r\n                EnsureInit();\r\n\r\n                //\r\n                // Set the member value\r\n                //\r\n                _emittedMemberAccessor.Set(target, value);\r\n            }\r\n            else\r\n            {\r\n                throw new MemberAccessorException(\r\n                    string.Format(\"Member \\\"{0}\\\" does not have a set method.\",\r\n                                  _fieldName));\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Whether or not the Member supports read access.\r\n        /// </summary>\r\n        internal abstract bool CanRead { get; }\r\n\r\n        /// <summary>\r\n        /// Whether or not the Member supports write access.\r\n        /// </summary>\r\n        internal abstract bool CanWrite { get; }\r\n\r\n        /// <summary>\r\n        /// The Type of object this member accessor was\r\n        /// created for.\r\n        /// </summary>\r\n        internal Type TargetType\r\n        {\r\n            get\r\n            {\r\n                return _targetType;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The Type of the Member being accessed.\r\n        /// </summary>\r\n        internal abstract Type MemberType { get; }\r\n\r\n        //\r\n        protected readonly Type _targetType;\r\n        protected readonly string _fieldName;\r\n        protected static readonly Hashtable s_TypeHash;\r\n        //\r\n        IMemberAccessor _emittedMemberAccessor;\r\n\r\n        /// <summary>\r\n        /// This method generates creates a new assembly containing\r\n        /// the Type that will provide dynamic access.\r\n        /// </summary>\r\n        void EnsureInit()\r\n        {\r\n            if (_emittedMemberAccessor == null)\r\n            {\r\n                // Create the assembly and an instance of the\r\n                // member accessor class.\r\n                Assembly assembly = EmitAssembly();\r\n\r\n                _emittedMemberAccessor = assembly.CreateInstance(emmitedTypeName) as IMemberAccessor;\r\n\r\n                if (_emittedMemberAccessor == null)\r\n                {\r\n                    throw new Exception(\"Unable to create member accessor.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Create an assembly that will provide the get and set methods.\r\n        /// </summary>\r\n        Assembly EmitAssembly()\r\n        {\r\n            //\r\n            // Create an assembly name\r\n            //\r\n            AssemblyName assemblyName = new AssemblyName();\r\n            assemblyName.Name = \"PropertyAccessorAssembly\";\r\n\r\n            //\r\n            // Create a new assembly with one module\r\n            //\r\n            AssemblyBuilder newAssembly = Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);\r\n            ModuleBuilder newModule = newAssembly.DefineDynamicModule(\"Module\");\r\n\r\n            //\r\n            //  Define a public class named emmitedTypeName in the assembly.\r\n            //\r\n            TypeBuilder myType =\r\n                newModule.DefineType(emmitedTypeName, TypeAttributes.Public | TypeAttributes.Sealed);\r\n\r\n            //\r\n            // Mark the class as implementing IMemberAccessor.\r\n            //\r\n            myType.AddInterfaceImplementation(typeof(IMemberAccessor));\r\n\r\n            // Add a constructor\r\n            /*ConstructorBuilder constructor = */\r\n            myType.DefineDefaultConstructor(MethodAttributes.Public);\r\n\r\n            _EmitGetter(myType);\r\n            _EmitSetter(myType);\r\n\r\n            //\r\n            // Load the type\r\n            //\r\n            myType.CreateType();\r\n\r\n            return newAssembly;\r\n        }\r\n\r\n        protected abstract void _EmitGetter(TypeBuilder type);\r\n        protected abstract void _EmitSetter(TypeBuilder type);\r\n    }\r\n}"
  },
  {
    "path": "SpacepuppyBase/Dynamic/Accessors/MemberAccessorException.cs",
    "content": "﻿//\r\n// MemberAccessorException.cs\r\n//\r\n// Author: James Nies\r\n// Licensed under The Code Project Open License (CPOL): http://www.codeproject.com/info/cpol10.aspx\r\n\r\nusing System;\r\n\r\nnamespace com.spacepuppy.Dynamic.Accessors\r\n{\r\n    /// <summary>\r\n    /// PropertyAccessorException class.\r\n    /// </summary>\r\n    public class MemberAccessorException : Exception\r\n    {\r\n        internal MemberAccessorException(string message)\r\n            : base(message)\r\n        {\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "SpacepuppyBase/Dynamic/Accessors/MemberAccessorPool.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Reflection;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Dynamic.Accessors\r\n{\r\n    public static class MemberAccessorPool\r\n    {\r\n\r\n        static MemberAccessorPool()\r\n        {\r\n            switch (UnityEngine.Application.platform)\r\n            {\r\n                case UnityEngine.RuntimePlatform.OSXEditor:\r\n                case UnityEngine.RuntimePlatform.OSXPlayer:\r\n                case UnityEngine.RuntimePlatform.WindowsPlayer:\r\n                //case UnityEngine.RuntimePlatform.OSXDashboardPlayer:\r\n                case UnityEngine.RuntimePlatform.WindowsEditor:\r\n                case UnityEngine.RuntimePlatform.LinuxPlayer:\r\n                case UnityEngine.RuntimePlatform.LinuxEditor:\r\n                case UnityEngine.RuntimePlatform.WSAPlayerX86:\r\n                case UnityEngine.RuntimePlatform.WSAPlayerX64:\r\n                case UnityEngine.RuntimePlatform.WSAPlayerARM:\r\n                    _ignoreEmit = false;\r\n                    break;\r\n                default:\r\n                    _ignoreEmit = true;\r\n                    break;\r\n            }\r\n        }\r\n\r\n        public static bool UseEmitCompiledMemerAccessorIfSupported = true;\r\n        private static bool _ignoreEmit;\r\n        private static Dictionary<MemberInfo, IMemberAccessor> _pool;\r\n        private static Queue<IMemberAccessor> _chainBuilder = new Queue<IMemberAccessor>();\r\n        private static Dictionary<string, DynamicMemberAccessor> _dynPool;\r\n\r\n        public static IMemberAccessor GetAccessor(MemberInfo memberInfo)\r\n        {\r\n            return GetAccessor(memberInfo, _ignoreEmit || !UseEmitCompiledMemerAccessorIfSupported);\r\n        }\r\n\r\n        public static IMemberAccessor GetAccessor(MemberInfo memberInfo, bool useBasicMemberAccessor)\r\n        {\r\n            if (memberInfo == null) throw new System.ArgumentNullException(\"memberInfo\");\r\n\r\n            if (_pool != null && _pool.ContainsKey(memberInfo))\r\n            {\r\n                return _pool[memberInfo];\r\n            }\r\n\r\n            if (_pool == null) _pool = new Dictionary<MemberInfo, IMemberAccessor>(new MemberInfoEqualityComparer());\r\n\r\n            IMemberAccessor result;\r\n            if(typeof(UnityEngine.Transform).IsAssignableFrom(memberInfo.DeclaringType))\r\n            {\r\n                result = FastTransformMemberAccessor.Create(memberInfo, useBasicMemberAccessor);\r\n            }\r\n            else if (useBasicMemberAccessor)\r\n            {\r\n                if (memberInfo is PropertyInfo || memberInfo is FieldInfo)\r\n                {\r\n                    result = new BasicMemberAccessor(memberInfo);\r\n                }\r\n                else\r\n                {\r\n                    throw new System.ArgumentException(\"MemberInfo must be either a PropertyInfo or a FieldInfo.\");\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (memberInfo is PropertyInfo)\r\n                {\r\n                    result = new PropertyAccessor(memberInfo as PropertyInfo);\r\n                }\r\n                else if (memberInfo is FieldInfo)\r\n                {\r\n                    result = new FieldAccessor(memberInfo as FieldInfo);\r\n                }\r\n                else\r\n                {\r\n                    throw new System.ArgumentException(\"MemberInfo must be either a PropertyInfo or a FieldInfo.\");\r\n                }\r\n            }\r\n\r\n            _pool.Add(memberInfo, result);\r\n            return result;\r\n        }\r\n\r\n        public static IMemberAccessor GetAccessor(Type objectType, string memberName, out System.Type effectivelyAlteredValueType)\r\n        {\r\n            if (objectType == null) throw new System.ArgumentNullException(\"objectType\");\r\n            const MemberTypes MASK_MEMBERTYPES = MemberTypes.Field | MemberTypes.Property;\r\n            const BindingFlags MASK_BINDINGS = BindingFlags.Public | BindingFlags.Instance;\r\n\r\n            if(memberName.Contains('.'))\r\n            {\r\n                var arr = memberName.Split('.');\r\n                _chainBuilder.Clear();\r\n                for(int i = 0; i < arr.Length; i++)\r\n                {\r\n                    var matches = objectType.GetMember(arr[i],\r\n                                                       MASK_MEMBERTYPES,\r\n                                                       MASK_BINDINGS);\r\n                    if (matches == null || matches.Length == 0)\r\n                        throw new MemberAccessorException(string.Format(\"Member \\\"{0}\\\" does not exist for type {1}.\", memberName, objectType));\r\n\r\n                    objectType = DynamicUtil.GetReturnType(matches[0]);\r\n                    _chainBuilder.Enqueue(GetAccessor(matches[0], true));\r\n                }\r\n\r\n                //the currentObjectType value will be the type effectively being manipulated\r\n                effectivelyAlteredValueType = objectType;\r\n                IMemberAccessor accessor = _chainBuilder.Dequeue();\r\n                while(_chainBuilder.Count > 0)\r\n                {\r\n                    accessor = new ChainingAccessor(_chainBuilder.Dequeue(), accessor);\r\n                }\r\n                return accessor;\r\n            }\r\n            else\r\n            {\r\n                var matches = objectType.GetMember(memberName,\r\n                                                   MASK_MEMBERTYPES,\r\n                                                   MASK_BINDINGS);\r\n                if (matches == null || matches.Length == 0)\r\n                    throw new MemberAccessorException(string.Format(\"Member \\\"{0}\\\" does not exist for type {1}.\", memberName, objectType));\r\n\r\n                effectivelyAlteredValueType = DynamicUtil.GetReturnType(matches[0]);\r\n                return GetAccessor(matches[0]);\r\n            }\r\n\r\n        }\r\n        \r\n        public static IMemberAccessor GetAccessor(Type objectType, string memberName)\r\n        {\r\n            Type memberType;\r\n            return GetAccessor(objectType, memberName, out memberType);\r\n        }\r\n        \r\n        public static IMemberAccessor GetDynamicAccessor(object target, string memberName, out System.Type memberType)\r\n        {\r\n            memberType = null;\r\n            if (target == null) return null;\r\n\r\n            if(!(target is IDynamic)) return GetAccessor(target.GetType(), memberName, out memberType);\r\n\r\n            var dyn = target as IDynamic;\r\n            var info = dyn.GetMember(memberName, false);\r\n            if(info == null) return GetAccessor(target.GetType(), memberName, out memberType);\r\n\r\n            memberType = DynamicUtil.GetReturnType(info);\r\n            DynamicMemberAccessor accessor;\r\n            if (_dynPool != null && _dynPool.TryGetValue(memberName, out accessor)) return accessor;\r\n\r\n            accessor = new DynamicMemberAccessor(memberName);\r\n            if (_dynPool == null) _dynPool = new Dictionary<string, DynamicMemberAccessor>();\r\n            _dynPool[memberName] = accessor;\r\n            return accessor;\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n\r\n        #region Special Types\r\n\r\n        private class MemberInfoEqualityComparer : IEqualityComparer<MemberInfo>\r\n        {\r\n            public bool Equals(MemberInfo x, MemberInfo y)\r\n            {\r\n                if (x == null) return y == null;\r\n                if (y == null) return false;\r\n\r\n                if (x is IDynamicMemberInfo && y is IDynamicMemberInfo)\r\n                    return x.DeclaringType == y.DeclaringType && x.Name == y.Name && x.MemberType == y.MemberType;\r\n                else\r\n                    return x == y;\r\n            }\r\n\r\n            public int GetHashCode(MemberInfo obj)\r\n            {\r\n                if (obj == null) return 0;\r\n\r\n                return obj.DeclaringType.GetHashCode() ^ obj.Name.GetHashCode();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/Accessors/PropertyAccessor.cs",
    "content": "﻿//\r\n// FastDynamicMemberAccessor.cs\r\n//\r\n// Author: James Nies\r\n// Licensed under The Code Project Open License (CPOL): http://www.codeproject.com/info/cpol10.aspx\r\n\r\nusing System;\r\nusing System.Reflection;\r\nusing System.Reflection.Emit;\r\n\r\nnamespace com.spacepuppy.Dynamic.Accessors\r\n{\r\n    /// <summary>\r\n    /// The PropertyAccessor class provides fast dynamic access\r\n    /// to a property of a specified target class.\r\n    /// </summary>\r\n    internal class PropertyAccessor : MemberAccessor\r\n    {\r\n        /// <summary>\r\n        /// Creates a new property accessor.\r\n        /// </summary>\r\n        internal PropertyAccessor(PropertyInfo info)\r\n            : base(info)\r\n        {\r\n            _canRead = info.CanRead;\r\n            _canWrite = info.CanWrite;\r\n            _propertyType = info.PropertyType;\r\n        }\r\n\r\n        /// <summary>\r\n        /// The Type of the Property being accessed.\r\n        /// </summary>\r\n        internal override Type MemberType\r\n        {\r\n            get\r\n            {\r\n                return _propertyType;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Whether or not the Property supports read access.\r\n        /// </summary>\r\n        internal override bool CanRead\r\n        {\r\n            get\r\n            {\r\n                return _canRead;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Whether or not the Property supports write access.\r\n        /// </summary>\r\n        internal override bool CanWrite\r\n        {\r\n            get\r\n            {\r\n                return _canWrite;\r\n            }\r\n        }\r\n\r\n        //\r\n        readonly Type _propertyType;\r\n        readonly bool _canRead;\r\n        readonly bool _canWrite;\r\n\r\n        protected override void _EmitSetter(TypeBuilder myType)\r\n        {\r\n            //\r\n            // Define a method for the set operation.\r\n            //\r\n            Type[] setParamTypes = new[] { typeof(object), typeof(object) };\r\n            Type setReturnType = null;\r\n            MethodBuilder setMethod =\r\n                myType.DefineMethod(\"Set\",\r\n                                    MethodAttributes.Public | MethodAttributes.Virtual,\r\n                                    setReturnType,\r\n                                    setParamTypes);\r\n\r\n            //\r\n            // From the method, get an ILGenerator. This is used to\r\n            // emit the IL that we want.\r\n            //\r\n            ILGenerator setIL = setMethod.GetILGenerator();\r\n            //\r\n            // Emit the IL.\r\n            //\r\n\r\n            MethodInfo targetSetMethod = _targetType.GetMethod(\"set_\" + _fieldName);\r\n            if (targetSetMethod != null)\r\n            {\r\n                Type paramType = targetSetMethod.GetParameters()[0].ParameterType;\r\n\r\n                setIL.DeclareLocal(paramType);\r\n                setIL.Emit(OpCodes.Ldarg_1); //Load the first argument\r\n                //(target object)\r\n\r\n                setIL.Emit(OpCodes.Castclass, _targetType); //Cast to the source type\r\n\r\n                setIL.Emit(OpCodes.Ldarg_2); //Load the second argument\r\n                //(value object)\r\n\r\n                if (paramType.IsValueType)\r\n                {\r\n                    setIL.Emit(OpCodes.Unbox, paramType); //Unbox it\r\n                    if (s_TypeHash[paramType] != null) //and load\r\n                    {\r\n                        OpCode load = (OpCode)s_TypeHash[paramType];\r\n                        setIL.Emit(load);\r\n                    }\r\n                    else\r\n                    {\r\n                        setIL.Emit(OpCodes.Ldobj, paramType);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    setIL.Emit(OpCodes.Castclass, paramType); //Cast class\r\n                }\r\n\r\n                setIL.EmitCall(OpCodes.Callvirt,\r\n                               targetSetMethod, null); //Set the property value\r\n            }\r\n            else\r\n            {\r\n                setIL.ThrowException(typeof(MissingMethodException));\r\n            }\r\n\r\n            setIL.Emit(OpCodes.Ret);\r\n        }\r\n\r\n        protected override void _EmitGetter(TypeBuilder myType)\r\n        {\r\n            //\r\n            // Define a method for the get operation.\r\n            //\r\n            Type[] getParamTypes = new[] { typeof(object) };\r\n            Type getReturnType = typeof(object);\r\n            MethodBuilder getMethod =\r\n                myType.DefineMethod(\"Get\",\r\n                                    MethodAttributes.Public | MethodAttributes.Virtual,\r\n                                    getReturnType,\r\n                                    getParamTypes);\r\n\r\n            //\r\n            // From the method, get an ILGenerator. This is used to\r\n            // emit the IL that we want.\r\n            //\r\n            ILGenerator getIL = getMethod.GetILGenerator();\r\n\r\n\r\n            //\r\n            // Emit the IL.\r\n            //\r\n            MethodInfo targetGetMethod = _targetType.GetMethod(\"get_\" + _fieldName);\r\n\r\n            if (targetGetMethod != null)\r\n            {\r\n                getIL.DeclareLocal(typeof(object));\r\n                getIL.Emit(OpCodes.Ldarg_1); //Load the first argument\r\n                //(target object)\r\n\r\n                getIL.Emit(OpCodes.Castclass, _targetType); //Cast to the source type\r\n\r\n                getIL.EmitCall(OpCodes.Call, targetGetMethod, null); //Get the property value\r\n\r\n                if (targetGetMethod.ReturnType.IsValueType)\r\n                {\r\n                    getIL.Emit(OpCodes.Box, targetGetMethod.ReturnType); //Box if necessary\r\n                }\r\n                getIL.Emit(OpCodes.Stloc_0); //Store it\r\n\r\n                getIL.Emit(OpCodes.Ldloc_0);\r\n            }\r\n            else\r\n            {\r\n                getIL.ThrowException(typeof(MissingMethodException));\r\n            }\r\n\r\n            getIL.Emit(OpCodes.Ret);\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "SpacepuppyBase/Dynamic/DoubleEvaluator.cs",
    "content": "﻿using System;\r\nusing System.Text;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Dynamic\r\n{\r\n\r\n    /// <summary>\r\n    /// ##Statements\r\n    /// (...)\r\n    /// ##Operators\r\n    /// +\r\n    /// *\r\n    /// -\r\n    /// /\r\n    /// %\r\n    /// ^\r\n    /// >\r\n    /// <\r\n    /// >=\r\n    /// <=\r\n    /// ==\r\n    /// !=\r\n    /// ||\r\n    /// &&\r\n    /// \r\n    /// Does not respect order of operations, use parens to define order.\r\n    /// \r\n    /// ##Functions\r\n    /// Abs(...)\r\n    /// Sqrt(...)\r\n    /// Cos(...)\r\n    /// Sin(...)\r\n    /// Tan(...)\r\n    /// Acos(...)\r\n    /// Asin(...)\r\n    /// Atan(...)\r\n    /// Atan2(y, x)\r\n    /// Rand(max)\r\n    /// Rand(min, max)\r\n    /// RandInt(max)\r\n    /// RandInt(min, max)\r\n    /// \r\n    /// These function names are not case sensitive\r\n    /// \r\n    /// #Variables\r\n    /// $pi\r\n    /// $2pi\r\n    /// $pi_2\r\n    /// $rad2deg\r\n    /// $deg2rad\r\n    /// $secsInMin\r\n    /// $secsInHour\r\n    /// $secsInDay\r\n    /// $secsInWeek\r\n    /// $secsInYear\r\n    /// $infinity\r\n    /// $inf\r\n    /// $-infinity\r\n    /// $-inf\r\n    /// $time\r\n    /// $unscaledtime\r\n    /// $fixedtime\r\n    /// $deltatime\r\n    /// $fixeddeltatime\r\n    /// \r\n    /// These are global values, they are not case sensitive\r\n    /// \r\n    /// #Special Case - local variable\r\n    /// $.nameOfProperty\r\n    /// \r\n    /// In the case of the object referenced on a VariantReference, you can access its properties by typing $ followed by a dot (.) \r\n    /// and the name of the property. The property is case sensitive and must be spelled as it appears in code.\r\n    /// \r\n    /// $.CurrentTime / $secsInHour % 24\r\n    /// \r\n    /// #Special Case - cast local variable\r\n    /// $(Type).nameOfProperty\r\n    /// \r\n    /// You can grab a component from the local variable before evaluating a property with the parens following $.\r\n    /// </summary>\r\n    public class DoubleEvaluator\r\n    {\r\n\r\n        #region Static Interface\r\n\r\n        private static com.spacepuppy.Collections.ObjectCachePool<DoubleEvaluator> _pool = new ObjectCachePool<DoubleEvaluator>(64);\r\n        private static com.spacepuppy.Collections.ObjectCachePool<ReusableStringReader> _readerPool = new ObjectCachePool<ReusableStringReader>(64);\r\n\r\n        public static double Eval(string command, object x)\r\n        {\r\n            var obj = _pool.GetInstance();\r\n            try\r\n            {\r\n                return obj.EvalStatement(command, x);\r\n            }\r\n            finally\r\n            {\r\n                _pool.Release(obj);\r\n            }\r\n        }\r\n        \r\n        #endregion\r\n\r\n\r\n        #region Fields\r\n\r\n        private System.IO.TextReader _reader;\r\n        private object _x;\r\n        private StringBuilder _strBuilder = new StringBuilder();\r\n        private int _parenCount;\r\n        private char _current;\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public double EvalStatement(string command, object x)\r\n        {\r\n            var r = _readerPool.GetInstance();\r\n            r.Reset(command);\r\n\r\n            _reader = r;\r\n            _x = x;\r\n            _strBuilder.Length = 0;\r\n            _parenCount = 0;\r\n            _current = (char)0;\r\n\r\n            double result = this.EvalStatement();\r\n\r\n            _reader.Dispose();\r\n            _readerPool.Release(_reader as ReusableStringReader);\r\n            _x = null;\r\n            _strBuilder.Length = 0;\r\n            _parenCount = 0;\r\n            _current = (char)0;\r\n\r\n            return result;\r\n        }\r\n\r\n        public double EvalStatement(System.IO.TextReader command, object x)\r\n        {\r\n            if (command == null) throw new System.ArgumentNullException(\"command\");\r\n\r\n            _reader = command;\r\n            _x = x;\r\n            _strBuilder.Length = 0;\r\n            _parenCount = 0;\r\n            _current = (char)0;\r\n\r\n            double result = this.EvalStatement();\r\n\r\n            _reader.Dispose();\r\n            _x = null;\r\n            _strBuilder.Length = 0;\r\n            _parenCount = 0;\r\n            _current = (char)0;\r\n\r\n            return result;\r\n        }\r\n\r\n        private double EvalStatement()\r\n        {\r\n            double result = this.EvalNextValue();\r\n\r\n            if (_current == ')')\r\n            {\r\n                int c = _reader.Read();\r\n                if (c >= 0) _current = (char)c;\r\n                _parenCount--;\r\n                return result;\r\n            }\r\n\r\n            for (int i = _current; i >= 0; i = _reader.Read())\r\n            {\r\n                _current = (char)i;\r\n\r\n                if (char.IsWhiteSpace(_current)) continue;\r\n\r\n                switch (_current)\r\n                {\r\n                    case '+':\r\n                        result += this.EvalNextValue();\r\n                        break;\r\n                    case '*':\r\n                        result *= this.EvalNextValue();\r\n                        break;\r\n                    case '-':\r\n                        result -= this.EvalNextValue();\r\n                        break;\r\n                    case '/':\r\n                        result /= this.EvalNextValue();\r\n                        break;\r\n                    case '^':\r\n                        result = Math.Pow(result, this.EvalNextValue());\r\n                        break;\r\n                    case '%':\r\n                        result %= this.EvalNextValue();\r\n                        break;\r\n                    case '=':\r\n                        {\r\n                            if (_reader.Peek() == '=')\r\n                            {\r\n                                _reader.Read();\r\n                                result = MathUtil.FuzzyEqual((float)result, (float)this.EvalNextValue()) ? 1d : 0d;\r\n                            }\r\n                            else\r\n                            {\r\n                                result = MathUtil.FuzzyEqual((float)result, (float)this.EvalNextValue()) ? 1d : 0d;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case '<':\r\n                        {\r\n                            if (_reader.Peek() == '=')\r\n                            {\r\n                                _reader.Read();\r\n                                result = (result <= this.EvalNextValue()) ? 1d : 0d;\r\n                            }\r\n                            else\r\n                            {\r\n                                result = (result < this.EvalNextValue()) ? 1d : 0d;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case '>':\r\n                        {\r\n                            if (_reader.Peek() == '=')\r\n                            {\r\n                                _reader.Read();\r\n                                result = (result >= this.EvalNextValue()) ? 1d : 0d;\r\n                            }\r\n                            else\r\n                            {\r\n                                result = (result > this.EvalNextValue()) ? 1d : 0d;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case '|':\r\n                        {\r\n                            if (_reader.Peek() == '|')\r\n                            {\r\n                                _reader.Read();\r\n                                result = (ConvertUtil.ToBool(result) || ConvertUtil.ToBool(this.EvalNextValue())) ? 1d : 0d;\r\n                            }\r\n                            else\r\n                            {\r\n                                result = (double)((int)result | (int)this.EvalNextValue());\r\n                            }\r\n                        }\r\n                        break;\r\n                    case '&':\r\n                        {\r\n                            if (_reader.Peek() == '&')\r\n                            {\r\n                                _reader.Read();\r\n                                result = (ConvertUtil.ToBool(result) && ConvertUtil.ToBool(this.EvalNextValue())) ? 1d : 0d;\r\n                            }\r\n                            else\r\n                            {\r\n                                result = (double)((int)result & (int)this.EvalNextValue());\r\n                            }\r\n                        }\r\n                        break;\r\n                    case ')':\r\n                        //reached the end of the statement\r\n                        i = _reader.Read();\r\n                        if (i >= 0) _current = (char)i;\r\n                        return result;\r\n                }\r\n\r\n                if (_current == ')')\r\n                {\r\n                    int c = _reader.Read();\r\n                    if (c >= 0) _current = (char)c;\r\n                    _parenCount--;\r\n                    return result;\r\n                }\r\n            }\r\n\r\n            //ran out of statement with no errors, must be the end\r\n            return result;\r\n        }\r\n\r\n        private double EvalNextValue()\r\n        {\r\n            int i = _reader.Read();\r\n            for (; i >= 0 && char.IsWhiteSpace((char)i); i = _reader.Read())\r\n            {\r\n            }\r\n            if (i < 0) return 0d;\r\n\r\n            _current = (char)i;\r\n            if (!IsValidWordPrefix(_current)) throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n\r\n            if (char.IsDigit(_current))\r\n            {\r\n                return EvalNumber();\r\n            }\r\n            if (char.IsLetter(_current))\r\n            {\r\n                return EvalFunc();\r\n            }\r\n\r\n            switch (_current)\r\n            {\r\n                case '$':\r\n                    return this.EvalVariable();\r\n                case '(':\r\n                    _parenCount++;\r\n                    return this.EvalStatement();\r\n                case '+':\r\n                    return this.EvalNextValue();\r\n                case '-':\r\n                    return -this.EvalNextValue();\r\n                case ')':\r\n                    return 0d;\r\n                default:\r\n                    throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n            }\r\n        }\r\n\r\n        private double EvalNumber()\r\n        {\r\n            const int CHAR_0 = (int)'0';\r\n            long high = ((int)_current - CHAR_0);\r\n            long low = 0;\r\n            int lowLen = -1;\r\n\r\n            for (int i = _reader.Read(); i >= 0; i = _reader.Read())\r\n            {\r\n                _current = (char)i;\r\n\r\n                if (char.IsDigit(_current))\r\n                {\r\n                    if (lowLen < 0)\r\n                        high = (high * 10) + ((int)_current - CHAR_0);\r\n                    else\r\n                    {\r\n                        low = (low * 10) + ((int)_current - CHAR_0);\r\n                        lowLen++;\r\n                    }\r\n                }\r\n                else if (_current == '.')\r\n                {\r\n                    if (lowLen < 0)\r\n                        lowLen = 0;\r\n                    else\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n                }\r\n                else if (char.IsWhiteSpace(_current))\r\n                {\r\n                    break;\r\n                }\r\n                else if (_current == ')' || _current == ',')\r\n                {\r\n                    break;\r\n                }\r\n                else if (IsArithmeticSymbol(_current))\r\n                {\r\n                    break;\r\n                }\r\n                else\r\n                    throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n\r\n            }\r\n\r\n            if (low != 0)\r\n                return (double)high + ((double)low / Math.Pow(10, lowLen));\r\n            else\r\n                return (double)high;\r\n        }\r\n\r\n        private double EvalVariable()\r\n        {\r\n            _strBuilder.Length = 0;\r\n            int i = _reader.Read();\r\n            if (i < 0) return ConvertUtil.ToDouble(_x);\r\n\r\n            _current = (char)i;\r\n            if (_current == '.')\r\n            {\r\n                var target = _x;\r\n                string sprop;\r\n\r\n                //access x\r\n                for (i = _reader.Read(); i >= 0; i = _reader.Read())\r\n                {\r\n                    _current = (char)i;\r\n\r\n                    if (char.IsLetterOrDigit(_current) || _current == '_')\r\n                    {\r\n                        _strBuilder.Append(_current);\r\n                    }\r\n                    else if (_current == '.')\r\n                    {\r\n                        sprop = _strBuilder.ToString();\r\n                        _strBuilder.Length = 0;\r\n                        target = DynamicUtil.GetValue(target, sprop);\r\n                    }\r\n                    else if (char.IsWhiteSpace(_current) || IsArithmeticSymbol(_current) || _current == ')' || _current == ',')\r\n                        break;\r\n                    else\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n                }\r\n\r\n                sprop = _strBuilder.ToString();\r\n                _strBuilder.Length = 0;\r\n                return ConvertUtil.ToDouble(DynamicUtil.GetValue(target, sprop));\r\n            }\r\n            else if (_current == '(')\r\n            {\r\n                for (i = _reader.Read(); i >= 0; i = _reader.Read())\r\n                {\r\n                    _current = (char)i;\r\n\r\n                    if (char.IsLetterOrDigit(_current) || _current == '_')\r\n                    {\r\n                        _strBuilder.Append(_current);\r\n                    }\r\n                    else if (_current == ')')\r\n                    {\r\n                        break;\r\n                    }\r\n                    else\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n                }\r\n\r\n                i = _reader.Read();\r\n                if (i < 0 || (char)i != '.')\r\n                    throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n\r\n                string stp = _strBuilder.ToString();\r\n                _strBuilder.Length = 0;\r\n\r\n                var go = GameObjectUtil.GetGameObjectFromSource(_x);\r\n                object target = go != null ? go.GetComponent(stp) : null;\r\n                string sprop;\r\n\r\n                //access target\r\n                for (i = _reader.Read(); i >= 0; i = _reader.Read())\r\n                {\r\n                    _current = (char)i;\r\n\r\n                    if (char.IsLetterOrDigit(_current) || _current == '_')\r\n                    {\r\n                        _strBuilder.Append(_current);\r\n                    }\r\n                    else if (_current == '.')\r\n                    {\r\n                        sprop = _strBuilder.ToString();\r\n                        _strBuilder.Length = 0;\r\n                        target = DynamicUtil.GetValue(target, sprop);\r\n                    }\r\n                    else if (char.IsWhiteSpace(_current) || IsArithmeticSymbol(_current) || _current == ')' || _current == ',' || _current == ']')\r\n                        break;\r\n                    else\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n                }\r\n\r\n                sprop = _strBuilder.ToString();\r\n                _strBuilder.Length = 0;\r\n                return ConvertUtil.ToDouble(DynamicUtil.GetValue(target, sprop));\r\n            }\r\n            else if (char.IsLetterOrDigit(_current) || _current == '_' || _current == '-')\r\n            {\r\n                //global\r\n                _strBuilder.Append(char.ToLower(_current));\r\n\r\n                for (i = _reader.Read(); i >= 0; i = _reader.Read())\r\n                {\r\n                    _current = (char)i;\r\n\r\n                    if (char.IsLetterOrDigit(_current) || _current == '_')\r\n                    {\r\n                        _strBuilder.Append(char.ToLower(_current));\r\n                    }\r\n                    else if (char.IsWhiteSpace(_current) || IsArithmeticSymbol(_current) || _current == ')' || _current == ',')\r\n                        break;\r\n                    else\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n                }\r\n\r\n\r\n                var str = _strBuilder.ToString();\r\n                _strBuilder.Length = 0;\r\n\r\n                switch (str)\r\n                {\r\n                    case \"pi\":\r\n                        return System.Math.PI;\r\n                    case \"2pi\":\r\n                        const double TWO_PI = System.Math.PI * 2d;\r\n                        return TWO_PI;\r\n                    case \"pi_2\":\r\n                        const double PI_TWO = System.Math.PI / 2d;\r\n                        return PI_TWO;\r\n                    case \"rad2deg\":\r\n                        const double RAD2DEG = 180d / System.Math.PI;\r\n                        return RAD2DEG;\r\n                    case \"deg2rad\":\r\n                        const double DEG2RAD = System.Math.PI / 180d;\r\n                        return DEG2RAD;\r\n                    case \"secsinmin\":\r\n                        return 60d;\r\n                    case \"secsinhour\":\r\n                        return 3600d;\r\n                    case \"secsinday\":\r\n                        return 86400d;\r\n                    case \"secsinweek\":\r\n                        return 604800d;\r\n                    case \"secsinyear\":\r\n                        return 31536000d;\r\n                    case \"infinity\":\r\n                    case \"inf\":\r\n                        return double.PositiveInfinity;\r\n                    case \"-infinity\":\r\n                    case \"-inf\":\r\n                        return double.NegativeInfinity;\r\n                    case \"time\":\r\n                        return UnityEngine.Time.time;\r\n                    case \"unscaledtime\":\r\n                        return UnityEngine.Time.unscaledTime;\r\n                    case \"fixedtime\":\r\n                        return UnityEngine.Time.fixedTime;\r\n                    case \"deltatime\":\r\n                        return UnityEngine.Time.deltaTime;\r\n                    case \"fixeddeltatime\":\r\n                        return UnityEngine.Time.fixedDeltaTime;\r\n                    default:\r\n                        return 0d;\r\n                }\r\n            }\r\n            else if (char.IsWhiteSpace(_current) || IsArithmeticSymbol(_current) || _current == ')' || _current == ',')\r\n            {\r\n                return ConvertUtil.ToDouble(_x);\r\n            }\r\n            else\r\n            {\r\n                throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n            }\r\n\r\n        }\r\n\r\n        private double EvalFunc()\r\n        {\r\n            _strBuilder.Length = 0;\r\n            _strBuilder.Append(char.ToLower(_current));\r\n\r\n            for (int i = _reader.Read(); i >= 0; i = _reader.Read())\r\n            {\r\n                _current = (char)i;\r\n\r\n                if (char.IsLetterOrDigit(_current))\r\n                {\r\n                    _strBuilder.Append(char.ToLower(_current));\r\n                }\r\n                else if (_current == '(')\r\n                    break;\r\n                else\r\n                    throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n            }\r\n\r\n            var name = _strBuilder.ToString();\r\n            _strBuilder.Length = 0;\r\n\r\n            _parenCount++;\r\n\r\n            bool reachedEnd;\r\n            double result;\r\n            switch (name)\r\n            {\r\n                case \"abs\":\r\n                    result = Math.Abs(EvalParams(out reachedEnd));\r\n                    if (!reachedEnd)\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                    break;\r\n                case \"sqrt\":\r\n                    result = Math.Sqrt(EvalParams(out reachedEnd));\r\n                    if (!reachedEnd)\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                    break;\r\n                case \"cos\":\r\n                    result = Math.Cos(EvalParams(out reachedEnd));\r\n                    if (!reachedEnd)\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                    break;\r\n                case \"sin\":\r\n                    result = Math.Sin(EvalParams(out reachedEnd));\r\n                    if (!reachedEnd)\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                    break;\r\n                case \"tan\":\r\n                    result = Math.Tan(EvalParams(out reachedEnd));\r\n                    if (!reachedEnd)\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                    break;\r\n                case \"acos\":\r\n                    result = Math.Acos(EvalParams(out reachedEnd));\r\n                    if (!reachedEnd)\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                    break;\r\n                case \"asin\":\r\n                    result = Math.Asin(EvalParams(out reachedEnd));\r\n                    if (!reachedEnd)\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                    break;\r\n                case \"atan\":\r\n                    result = Math.Atan(EvalParams(out reachedEnd));\r\n                    if (!reachedEnd)\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                    break;\r\n                case \"atan2\":\r\n                    {\r\n                        double y = this.EvalParams(out reachedEnd);\r\n                        if (reachedEnd)\r\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                        double x = this.EvalParams(out reachedEnd);\r\n                        if (!reachedEnd)\r\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                        result = Math.Atan2(y, x);\r\n                    }\r\n                    break;\r\n                case \"rand\":\r\n                    {\r\n                        double x = this.EvalParams(out reachedEnd);\r\n                        if (reachedEnd)\r\n                            return RandomUtil.Standard.Range((float)x);\r\n                        double y = this.EvalParams(out reachedEnd);\r\n                        if (!reachedEnd)\r\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                        result = RandomUtil.Standard.Range((float)y, (float)x);\r\n                    }\r\n                    break;\r\n                case \"randint\":\r\n                    {\r\n                        double x = this.EvalParams(out reachedEnd);\r\n                        if (reachedEnd)\r\n                            return RandomUtil.Standard.Next((int)x);\r\n                        double y = this.EvalParams(out reachedEnd);\r\n                        if (!reachedEnd)\r\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                        result = RandomUtil.Standard.Next((int)x, (int)y);\r\n                    }\r\n                    break;\r\n                default:\r\n                    throw new System.InvalidOperationException(\"Failed to parse the command: Unknown Function\");\r\n            }\r\n            return result;\r\n        }\r\n\r\n        private double EvalParams(out bool reachedEndOfParams, bool ignoreNecessityOfClosingParen = false)\r\n        {\r\n            double result = this.EvalNextValue();\r\n\r\n            if (_current == ')')\r\n            {\r\n                int c = _reader.Read();\r\n                if (c >= 0) _current = (char)c;\r\n                _parenCount--;\r\n                reachedEndOfParams = true;\r\n                return result;\r\n            }\r\n\r\n            for (int i = _current; i >= 0; i = _reader.Read())\r\n            {\r\n                _current = (char)i;\r\n\r\n                if (char.IsWhiteSpace(_current)) continue;\r\n\r\n                switch (_current)\r\n                {\r\n                    case '+':\r\n                        result += this.EvalNextValue();\r\n                        break;\r\n                    case '*':\r\n                        result *= this.EvalNextValue();\r\n                        break;\r\n                    case '-':\r\n                        result -= this.EvalNextValue();\r\n                        break;\r\n                    case '/':\r\n                        result /= this.EvalNextValue();\r\n                        break;\r\n                    case '^':\r\n                        result = Math.Pow(result, this.EvalNextValue());\r\n                        break;\r\n                    case '%':\r\n                        result %= this.EvalNextValue();\r\n                        break;\r\n                    case '=':\r\n                        {\r\n                            if (_reader.Peek() == '=')\r\n                            {\r\n                                _reader.Read();\r\n                                result = MathUtil.FuzzyEqual((float)result, (float)this.EvalNextValue()) ? 1d : 0d;\r\n                            }\r\n                            else\r\n                            {\r\n                                result = MathUtil.FuzzyEqual((float)result, (float)this.EvalNextValue()) ? 1d : 0d;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case '<':\r\n                        {\r\n                            if (_reader.Peek() == '=')\r\n                            {\r\n                                _reader.Read();\r\n                                result = (result <= this.EvalNextValue()) ? 1d : 0d;\r\n                            }\r\n                            else\r\n                            {\r\n                                result = (result < this.EvalNextValue()) ? 1d : 0d;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case '>':\r\n                        {\r\n                            if (_reader.Peek() == '=')\r\n                            {\r\n                                _reader.Read();\r\n                                result = (result >= this.EvalNextValue()) ? 1d : 0d;\r\n                            }\r\n                            else\r\n                            {\r\n                                result = (result > this.EvalNextValue()) ? 1d : 0d;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case '|':\r\n                        {\r\n                            if (_reader.Peek() == '|')\r\n                            {\r\n                                _reader.Read();\r\n                                result = (ConvertUtil.ToBool(result) || ConvertUtil.ToBool(this.EvalNextValue())) ? 1d : 0d;\r\n                            }\r\n                            else\r\n                            {\r\n                                result = (double)((int)result | (int)this.EvalNextValue());\r\n                            }\r\n                        }\r\n                        break;\r\n                    case '&':\r\n                        {\r\n                            if (_reader.Peek() == '&')\r\n                            {\r\n                                _reader.Read();\r\n                                result = (ConvertUtil.ToBool(result) && ConvertUtil.ToBool(this.EvalNextValue())) ? 1d : 0d;\r\n                            }\r\n                            else\r\n                            {\r\n                                result = (double)((int)result & (int)this.EvalNextValue());\r\n                            }\r\n                        }\r\n                        break;\r\n                    case ',':\r\n                        //reached the end of the first parameter\r\n                        reachedEndOfParams = false;\r\n                        return result;\r\n                    case ')':\r\n                        //reached the end of the statement\r\n                        int c = _reader.Read();\r\n                        if (c >= 0) _current = (char)c;\r\n                        _parenCount--;\r\n                        reachedEndOfParams = true;\r\n                        return result;\r\n                }\r\n\r\n                if (_current == ',')\r\n                {\r\n                    reachedEndOfParams = false;\r\n                    return result;\r\n                }\r\n                if (_current == ')')\r\n                {\r\n                    int c = _reader.Read();\r\n                    if (c >= 0) _current = (char)c;\r\n                    _parenCount--;\r\n                    reachedEndOfParams = true;\r\n                    return result;\r\n                }\r\n            }\r\n\r\n            //ran out of statement with no errors, must be the end\r\n            if (ignoreNecessityOfClosingParen)\r\n            {\r\n                reachedEndOfParams = true;\r\n                return result;\r\n            }\r\n\r\n            throw new System.InvalidOperationException(\"Failed to parse the command: malformed function parameters.\");\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Utils\r\n\r\n        public static object TrySum(object a, object b)\r\n        {\r\n            if (a == null) return b;\r\n            if (b == null) return a;\r\n\r\n            var atp = a.GetType();\r\n            if (ConvertUtil.IsNumericType(atp))\r\n            {\r\n                return ConvertUtil.ToPrim(ConvertUtil.ToDouble(a) + ConvertUtil.ToDouble(b), atp);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Vector2))\r\n            {\r\n                return ConvertUtil.ToVector2(a) + ConvertUtil.ToVector2(b);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Vector3))\r\n            {\r\n                return ConvertUtil.ToVector3(a) + ConvertUtil.ToVector3(b);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Vector4))\r\n            {\r\n                return ConvertUtil.ToVector4(a) + ConvertUtil.ToVector4(b);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Quaternion))\r\n            {\r\n                return ConvertUtil.ToQuaternion(a) * ConvertUtil.ToQuaternion(b);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Color))\r\n            {\r\n                return ConvertUtil.ToColor(a) + ConvertUtil.ToColor(b);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Color32))\r\n            {\r\n                return ConvertUtil.ToColor32(ConvertUtil.ToColor(a) + ConvertUtil.ToColor(b));\r\n            }\r\n            else\r\n            {\r\n                return b;\r\n            }\r\n        }\r\n\r\n        public static object TryDifference(object a, object b)\r\n        {\r\n            if (a == null) return b;\r\n            if (b == null) return a;\r\n\r\n            var atp = a.GetType();\r\n            if (ConvertUtil.IsNumericType(atp))\r\n            {\r\n                return ConvertUtil.ToPrim(ConvertUtil.ToDouble(a) - ConvertUtil.ToDouble(b), atp);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Vector2))\r\n            {\r\n                return ConvertUtil.ToVector2(a) - ConvertUtil.ToVector2(b);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Vector3))\r\n            {\r\n                return ConvertUtil.ToVector3(a) - ConvertUtil.ToVector3(b);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Vector4))\r\n            {\r\n                return ConvertUtil.ToVector4(a) - ConvertUtil.ToVector4(b);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Quaternion))\r\n            {\r\n                return ConvertUtil.ToQuaternion(a) * UnityEngine.Quaternion.Inverse(ConvertUtil.ToQuaternion(b));\r\n            }\r\n            else if (atp == typeof(UnityEngine.Color))\r\n            {\r\n                return ConvertUtil.ToColor(a) - ConvertUtil.ToColor(b);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Color32))\r\n            {\r\n                return ConvertUtil.ToColor32(ConvertUtil.ToColor(a) - ConvertUtil.ToColor(b));\r\n            }\r\n            else\r\n            {\r\n                return b;\r\n            }\r\n        }\r\n\r\n        public static object TryToggle(object value)\r\n        {\r\n            if (value == null) return null;\r\n\r\n            var tp = value.GetType();\r\n            if (ConvertUtil.IsNumericType(tp))\r\n            {\r\n                return ConvertUtil.ToPrim(ConvertUtil.ToDouble(value) * -1.0, tp);\r\n            }\r\n            else if (tp == typeof(UnityEngine.Vector2))\r\n            {\r\n                return ConvertUtil.ToVector2(value) * -1f;\r\n            }\r\n            else if (tp == typeof(UnityEngine.Vector3))\r\n            {\r\n                return ConvertUtil.ToVector3(value) * -1f;\r\n            }\r\n            else if (tp == typeof(UnityEngine.Vector4))\r\n            {\r\n                return ConvertUtil.ToVector4(value) * -1f;\r\n            }\r\n            else if (tp == typeof(UnityEngine.Quaternion))\r\n            {\r\n                return UnityEngine.Quaternion.Inverse(ConvertUtil.ToQuaternion(value));\r\n            }\r\n            else\r\n            {\r\n                return value;\r\n            }\r\n        }\r\n\r\n        public static object TryLerp(object a, object b, float t)\r\n        {\r\n            if (a == null) return b;\r\n            if (b == null) return a;\r\n\r\n            var atp = a.GetType();\r\n            if (ConvertUtil.IsNumericType(atp))\r\n            {\r\n                return ConvertUtil.ToPrim(MathUtil.Interpolate(ConvertUtil.ToSingle(a), ConvertUtil.ToSingle(b), t), atp);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Vector2))\r\n            {\r\n                return UnityEngine.Vector2.LerpUnclamped(ConvertUtil.ToVector2(a), ConvertUtil.ToVector2(b), t);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Vector3))\r\n            {\r\n                return UnityEngine.Vector3.LerpUnclamped(ConvertUtil.ToVector3(a), ConvertUtil.ToVector3(b), t);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Vector4))\r\n            {\r\n                return UnityEngine.Vector4.LerpUnclamped(ConvertUtil.ToVector4(a), ConvertUtil.ToVector4(b), t);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Quaternion))\r\n            {\r\n                return UnityEngine.Quaternion.LerpUnclamped(ConvertUtil.ToQuaternion(a), ConvertUtil.ToQuaternion(b), t);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Color))\r\n            {\r\n                return UnityEngine.Color.LerpUnclamped(ConvertUtil.ToColor(a), ConvertUtil.ToColor(b), t);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Color32))\r\n            {\r\n                return UnityEngine.Color32.LerpUnclamped(ConvertUtil.ToColor32(a), ConvertUtil.ToColor32(b), t);\r\n            }\r\n            else\r\n            {\r\n                return (t < 0.5f) ? a : b;\r\n            }\r\n        }\r\n\r\n        public static bool WillArithmeticallyCompute(System.Type tp)\r\n        {\r\n            if (ConvertUtil.IsNumericType(tp)) return true;\r\n            if (tp == typeof(UnityEngine.Vector2)) return true;\r\n            if (tp == typeof(UnityEngine.Vector3)) return true;\r\n            if (tp == typeof(UnityEngine.Vector4)) return true;\r\n            if (tp == typeof(UnityEngine.Quaternion)) return true;\r\n\r\n            return false;\r\n        }\r\n\r\n        private static bool IsArithmeticSymbol(char c)\r\n        {\r\n            switch (c)\r\n            {\r\n                case '+':\r\n                case '*':\r\n                case '-':\r\n                case '/':\r\n                case '%':\r\n                case '^':\r\n                    return true;\r\n                default:\r\n                    return false;\r\n            }\r\n        }\r\n\r\n        private static bool IsValidWordPrefix(char c)\r\n        {\r\n            return char.IsLetterOrDigit(c) || c == '$' || c == '_' || c == '+' || c == '-' || c == '(';\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/DynamicMethodInfo.cs",
    "content": "﻿using System;\r\nusing System.Reflection;\r\n\r\nusing com.spacepuppy.Dynamic.Accessors;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Dynamic\r\n{\r\n    public class DynamicMethodInfo : MethodInfo, IDynamicMemberInfo\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private string _name;\r\n        private Type _declaringType;\r\n        private Type _returnType;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public DynamicMethodInfo(string name, Type declaringType)\r\n        {\r\n            _name = name;\r\n            _declaringType = declaringType;\r\n            _returnType = null;\r\n        }\r\n\r\n        public DynamicMethodInfo(string name, Type declaringType, Type returnType)\r\n        {\r\n            _name = name;\r\n            _declaringType = declaringType;\r\n            _returnType = returnType;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region MethodInfo Interface\r\n\r\n        public override string Name\r\n        {\r\n            get { return _name; }\r\n        }\r\n\r\n        public override Type DeclaringType\r\n        {\r\n            get { return _declaringType; }\r\n        }\r\n\r\n        public override Type ReflectedType\r\n        {\r\n            get { return _declaringType; }\r\n        }\r\n\r\n        public override MethodAttributes Attributes\r\n        {\r\n            get { return MethodAttributes.Final | MethodAttributes.Public; }\r\n        }\r\n\r\n        public override MethodInfo GetBaseDefinition()\r\n        {\r\n            return this;\r\n        }\r\n\r\n        public override Type ReturnType\r\n        {\r\n            get\r\n            {\r\n                return (_returnType != null) ? _returnType : base.ReturnType;\r\n            }\r\n        }\r\n\r\n        public override ICustomAttributeProvider ReturnTypeCustomAttributes\r\n        {\r\n            get { return DynamicCustomAttributeProvider.Instance; }\r\n        }\r\n\r\n        public override MethodImplAttributes GetMethodImplementationFlags()\r\n        {\r\n            return MethodImplAttributes.ForwardRef;\r\n        }\r\n\r\n        public override ParameterInfo[] GetParameters()\r\n        {\r\n            return ArrayUtil.Empty<ParameterInfo>();\r\n        }\r\n\r\n        public override object Invoke(object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, System.Globalization.CultureInfo culture)\r\n        {\r\n            //return DynamicUtil.InvokeMethod(obj, _name);\r\n            if (obj is IDynamic)\r\n                return (obj as IDynamic).InvokeMethod(_name, parameters);\r\n            else\r\n                return null;\r\n        }\r\n\r\n        public override RuntimeMethodHandle MethodHandle\r\n        {\r\n            get { return new RuntimeMethodHandle(); }\r\n        }\r\n\r\n        public override object[] GetCustomAttributes(Type attributeType, bool inherit)\r\n        {\r\n            return ArrayUtil.Empty<object>();\r\n        }\r\n\r\n        public override object[] GetCustomAttributes(bool inherit)\r\n        {\r\n            return ArrayUtil.Empty<object>();\r\n        }\r\n\r\n        public override bool IsDefined(Type attributeType, bool inherit)\r\n        {\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Special Types\r\n\r\n        private class DynamicCustomAttributeProvider : ICustomAttributeProvider\r\n        {\r\n\r\n            public readonly static DynamicCustomAttributeProvider Instance = new DynamicCustomAttributeProvider();\r\n\r\n            public object[] GetCustomAttributes(Type attributeType, bool inherit)\r\n            {\r\n                return ArrayUtil.Empty<object>();\r\n            }\r\n\r\n            public object[] GetCustomAttributes(bool inherit)\r\n            {\r\n                return ArrayUtil.Empty<object>();\r\n            }\r\n\r\n            public bool IsDefined(Type attributeType, bool inherit)\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/DynamicObjectAccessor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Dynamic\r\n{\r\n    class DynamicObjectAccessor\r\n    {\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/DynamicParameterInfo.cs",
    "content": "﻿using System;\r\nusing System.Reflection;\r\n\r\nnamespace com.spacepuppy.Dynamic\r\n{\r\n    public struct DynamicParameterInfo\r\n    {\r\n        public MemberInfo Member;\r\n        public string ParameterName;\r\n        public Type ParameterType;\r\n\r\n        public DynamicParameterInfo(MemberInfo member, string parameterName, Type parameterType)\r\n        {\r\n            this.Member = member;\r\n            this.ParameterName = parameterName;\r\n            this.ParameterType = parameterType;\r\n        }\r\n\r\n        public DynamicParameterInfo(ParameterInfo info)\r\n        {\r\n            this.Member = info.Member;\r\n            this.ParameterName = info.Name;\r\n            this.ParameterType = info.ParameterType;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/DynamicPropertyInfo.cs",
    "content": "﻿using System;\r\nusing System.Reflection;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Dynamic\r\n{\r\n\r\n    public class DynamicPropertyInfo : PropertyInfo, IDynamicMemberInfo\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private string _name;\r\n        private Type _declaringType;\r\n        private Type _propertyType;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public DynamicPropertyInfo(string name, Type declaringType)\r\n        {\r\n            _name = name;\r\n            _declaringType = declaringType;\r\n            _propertyType = typeof(object);\r\n        }\r\n\r\n        public DynamicPropertyInfo(string name, Type declaringType, Type propertyType)\r\n        {\r\n            _name = name;\r\n            _declaringType = declaringType;\r\n            _propertyType = propertyType;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region PropertyInfo Interface\r\n\r\n        public override string Name\r\n        {\r\n            get { return _name; }\r\n        }\r\n\r\n        public override System.Reflection.PropertyAttributes Attributes\r\n        {\r\n            get { return PropertyAttributes.None; }\r\n        }\r\n\r\n        public override bool CanRead\r\n        {\r\n            get { return true; }\r\n        }\r\n\r\n        public override bool CanWrite\r\n        {\r\n            get { return true; }\r\n        }\r\n\r\n        public override Type PropertyType\r\n        {\r\n            get { return _propertyType; }\r\n        }\r\n\r\n        public override Type DeclaringType\r\n        {\r\n            get { return _declaringType; }\r\n        }\r\n\r\n        public override Type ReflectedType\r\n        {\r\n            get { return _declaringType; }\r\n        }\r\n\r\n\r\n\r\n        public override object GetValue(object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object[] index, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (obj is IDynamic)\r\n            {\r\n                return (obj as IDynamic).GetValue(_name);\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public override void SetValue(object obj, object value, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object[] index, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (obj is IDynamic)\r\n            {\r\n                (obj as IDynamic).SetValue(_name, value);\r\n            }\r\n        }\r\n\r\n        public override MethodInfo[] GetAccessors(bool nonPublic)\r\n        {\r\n            return ArrayUtil.Empty<MethodInfo>();\r\n        }\r\n\r\n        public override MethodInfo GetGetMethod(bool nonPublic)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public override ParameterInfo[] GetIndexParameters()\r\n        {\r\n            return ArrayUtil.Empty<ParameterInfo>();\r\n        }\r\n\r\n        public override System.Reflection.MethodInfo GetSetMethod(bool nonPublic)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public override object[] GetCustomAttributes(Type attributeType, bool inherit)\r\n        {\r\n            return ArrayUtil.Empty<object>();\r\n        }\r\n\r\n        public override object[] GetCustomAttributes(bool inherit)\r\n        {\r\n            return ArrayUtil.Empty<object>();\r\n        }\r\n\r\n        public override bool IsDefined(Type attributeType, bool inherit)\r\n        {\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        Type IDynamicMemberInfo.ReturnType { get { return this.PropertyType; } }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/DynamicTweenExtension.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nusing com.spacepuppy.Tween;\n\nnamespace com.spacepuppy.Dynamic\n{\n\n    public static class DynamicTweenExtension\n    {\n\n        public static TweenHash TweenWithToken(this TweenHash hash, TweenHash.AnimMode mode, com.spacepuppy.Tween.Ease ease, float dur, object valueToken, object valueAltToken)\n        {\n            if (hash == null || valueToken == null) return hash;\n\n            object value;\n            if (valueToken is IStateToken)\n            {\n                var st = valueToken as IStateToken;\n                foreach (var sname in st.GetMemberNames(false))\n                {\n                    value = st.GetValue(sname);\n                    if (value == null) continue;\n\n                    switch (VariantReference.GetVariantType(value.GetType()))\n                    {\n                        case VariantType.String:\n                        case VariantType.Boolean:\n                        case VariantType.Integer:\n                        case VariantType.Float:\n                        case VariantType.Double:\n                        case VariantType.Vector2:\n                        case VariantType.Vector3:\n                        case VariantType.Vector4:\n                        case VariantType.Quaternion:\n                        case VariantType.Color:\n                        case VariantType.Rect:\n                            hash.ByAnimMode(mode, sname, ease, dur, value, DynamicUtil.GetValue(valueAltToken, sname));\n                            break;\n                    }\n                }\n            }\n            else\n            {\n                foreach (var sname in DynamicUtil.GetMemberNames(valueToken, false, System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property))\n                {\n                    value = DynamicUtil.GetValue(valueToken, sname);\n                    if (value == null) continue;\n\n                    switch (VariantReference.GetVariantType(value.GetType()))\n                    {\n                        case VariantType.String:\n                        case VariantType.Boolean:\n                        case VariantType.Integer:\n                        case VariantType.Float:\n                        case VariantType.Double:\n                        case VariantType.Vector2:\n                        case VariantType.Vector3:\n                        case VariantType.Vector4:\n                        case VariantType.Quaternion:\n                        case VariantType.Color:\n                        case VariantType.Rect:\n                            hash.ByAnimMode(mode, sname, ease, dur, value, DynamicUtil.GetValue(valueAltToken, sname));\n                            break;\n                    }\n                }\n            }\n\n            return hash;\n        }\n\n        public static TweenHash TweenToToken(this TweenHash hash, com.spacepuppy.Tween.Ease ease, float dur, object token)\n        {\n            if (hash == null || token == null) return hash;\n\n            object value;\n            if (token is IStateToken)\n            {\n                var st = token as IStateToken;\n                foreach (var sname in st.GetMemberNames(false))\n                {\n                    value = st.GetValue(sname);\n                    if (value == null) continue;\n\n                    switch (VariantReference.GetVariantType(value.GetType()))\n                    {\n                        case VariantType.String:\n                        case VariantType.Boolean:\n                        case VariantType.Integer:\n                        case VariantType.Float:\n                        case VariantType.Double:\n                        case VariantType.Vector2:\n                        case VariantType.Vector3:\n                        case VariantType.Vector4:\n                        case VariantType.Quaternion:\n                        case VariantType.Color:\n                        case VariantType.Rect:\n                            hash.To(sname, ease, dur, value);\n                            break;\n                    }\n                }\n            }\n            else\n            {\n                foreach (var sname in DynamicUtil.GetMemberNames(token, false, System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property))\n                {\n                    value = DynamicUtil.GetValue(token, sname);\n                    if (value == null) continue;\n\n                    switch (VariantReference.GetVariantType(value.GetType()))\n                    {\n                        case VariantType.String:\n                        case VariantType.Boolean:\n                        case VariantType.Integer:\n                        case VariantType.Float:\n                        case VariantType.Double:\n                        case VariantType.Vector2:\n                        case VariantType.Vector3:\n                        case VariantType.Vector4:\n                        case VariantType.Quaternion:\n                        case VariantType.Color:\n                        case VariantType.Rect:\n                            hash.To(sname, ease, dur, value);\n                            break;\n                    }\n                }\n            }\n\n            return hash;\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/Evaluator.cs",
    "content": "﻿using System;\r\nusing System.Text;\r\n\r\nusing Vector4 = UnityEngine.Vector4;\r\nusing Quaternion = UnityEngine.Quaternion;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Dynamic\r\n{\r\n\r\n    /// <summary>\r\n    /// ##Statements\r\n    /// (...)\r\n    /// \"...\"\r\n    /// ##Operators\r\n    /// +\r\n    /// *\r\n    /// -\r\n    /// /\r\n    /// %\r\n    /// ^\r\n    /// >\r\n    /// <\r\n    /// >=\r\n    /// <=\r\n    /// ==\r\n    /// !=\r\n    /// ||\r\n    /// &&\r\n    /// \r\n    /// Does not respect order of operations, use parens to define order.\r\n    /// \r\n    /// ##Functions\r\n    /// Str(x)\r\n    /// Abs(x)\r\n    /// Sqrt(x)\r\n    /// Cos(x)\r\n    /// Sin(x)\r\n    /// Tan(x)\r\n    /// Acos(x)\r\n    /// Asin(x)\r\n    /// Atan(x)\r\n    /// Atan2(y, x)\r\n    /// Rand(max)\r\n    /// Rand(min, max)\r\n    /// RandInt(max)\r\n    /// RandInt(min, max)\r\n    /// vec(x)\r\n    /// vec(x,y)\r\n    /// vec(x,y,z)\r\n    /// vec(x,y,z,w)\r\n    /// rot(x,y,z)\r\n    /// \r\n    /// These function names are not case sensitive\r\n    /// \r\n    /// #Constants\r\n    /// $null\r\n    /// $true\r\n    /// $false\r\n    /// $pi\r\n    /// $2pi\r\n    /// $pi_2\r\n    /// $rad2deg\r\n    /// $deg2rad\r\n    /// $secsInMin\r\n    /// $secsInHour\r\n    /// $secsInDay\r\n    /// $secsInWeek\r\n    /// $secsInYear\r\n    /// $infinity\r\n    /// $inf\r\n    /// $-infinity\r\n    /// $-inf\r\n    /// $time\r\n    /// $unscaledtime\r\n    /// $fixedtime\r\n    /// $deltatime\r\n    /// \r\n    /// These are global values, they are not case sensitive\r\n    /// \r\n    /// #Special Case - local variable\r\n    /// $.nameOfProperty\r\n    /// \r\n    /// In the case of the object referenced on a VariantReference, you can access its properties by typing $ followed by a dot (.) \r\n    /// and the name of the property. The property is case sensitive and must be spelled as it appears in code.\r\n    /// \r\n    /// $.CurrentTime / $secsInHour % 24\r\n    /// \r\n    /// #Special Case - cast local variable\r\n    /// $(Type).nameOfProperty\r\n    /// \r\n    /// You can grab a component from the local variable before evaluating a property with the parens following $.\r\n    /// \r\n    /// rotation summation requires using the * operator instead of +\r\n    /// </summary>\r\n    public class Evaluator\r\n    {\r\n\r\n        #region Static Interface\r\n\r\n        private static com.spacepuppy.Collections.ObjectCachePool<Evaluator> _pool = new ObjectCachePool<Evaluator>(64);\r\n        private static com.spacepuppy.Collections.ObjectCachePool<VariantReference> _variantPool = new ObjectCachePool<VariantReference>(128, () => new VariantReference(), (v) => v.Value = null);\r\n        private static com.spacepuppy.Collections.ObjectCachePool<ReusableStringReader> _readerPool = new ObjectCachePool<ReusableStringReader>(64);\r\n\r\n        public static object EvalValue(string command, object x)\r\n        {\r\n            var obj = _pool.GetInstance();\r\n            try\r\n            {\r\n                return obj.EvalStatement(command, x);\r\n            }\r\n            finally\r\n            {\r\n                _pool.Release(obj);\r\n            }\r\n        }\r\n\r\n        public static float EvalNumber(string command, object x)\r\n        {\r\n            var obj = _pool.GetInstance();\r\n            var temp = _variantPool.GetInstance();\r\n            try\r\n            {\r\n                var r = _readerPool.GetInstance();\r\n                r.Reset(command);\r\n\r\n                obj._reader = r;\r\n                obj._x = x;\r\n                obj._strBuilder.Length = 0;\r\n                obj._parenCount = 0;\r\n                obj._current = (char)0;\r\n\r\n                bool t2 = obj.EvalStatement(temp);\r\n                var result = temp.FloatValue;\r\n\r\n                obj._reader.Dispose();\r\n                _readerPool.Release(obj._reader as ReusableStringReader);\r\n                obj._x = null;\r\n                obj._strBuilder.Length = 0;\r\n                obj._parenCount = 0;\r\n                obj._current = (char)0;\r\n\r\n                return result;\r\n            }\r\n            finally\r\n            {\r\n                _pool.Release(obj);\r\n                _variantPool.Release(temp);\r\n            }\r\n        }\r\n\r\n        public static UnityEngine.Vector2 EvalVector2(string command, object x)\r\n        {\r\n            var obj = _pool.GetInstance();\r\n            var temp = _variantPool.GetInstance();\r\n            try\r\n            {\r\n                var r = _readerPool.GetInstance();\r\n                r.Reset(command);\r\n\r\n                obj._reader = r;\r\n                obj._x = x;\r\n                obj._strBuilder.Length = 0;\r\n                obj._parenCount = 0;\r\n                obj._current = (char)0;\r\n\r\n                bool t2 = obj.EvalStatement(temp);\r\n                var result = temp.Vector2Value;\r\n\r\n                obj._reader.Dispose();\r\n                _readerPool.Release(obj._reader as ReusableStringReader);\r\n                obj._x = null;\r\n                obj._strBuilder.Length = 0;\r\n                obj._parenCount = 0;\r\n                obj._current = (char)0;\r\n\r\n                return result;\r\n            }\r\n            finally\r\n            {\r\n                _pool.Release(obj);\r\n                _variantPool.Release(temp);\r\n            }\r\n        }\r\n\r\n        public static UnityEngine.Vector3 EvalVector3(string command, object x)\r\n        {\r\n            var obj = _pool.GetInstance();\r\n            var temp = _variantPool.GetInstance();\r\n            try\r\n            {\r\n                var r = _readerPool.GetInstance();\r\n                r.Reset(command);\r\n\r\n                obj._reader = r;\r\n                obj._x = x;\r\n                obj._strBuilder.Length = 0;\r\n                obj._parenCount = 0;\r\n                obj._current = (char)0;\r\n\r\n                bool t2 = obj.EvalStatement(temp);\r\n                var result = temp.Vector3Value;\r\n\r\n                obj._reader.Dispose();\r\n                _readerPool.Release(obj._reader as ReusableStringReader);\r\n                obj._x = null;\r\n                obj._strBuilder.Length = 0;\r\n                obj._parenCount = 0;\r\n                obj._current = (char)0;\r\n\r\n                return result;\r\n            }\r\n            finally\r\n            {\r\n                _pool.Release(obj);\r\n                _variantPool.Release(temp);\r\n            }\r\n        }\r\n\r\n        public static Vector4 EvalVector4(string command, object x)\r\n        {\r\n            var obj = _pool.GetInstance();\r\n            var temp = _variantPool.GetInstance();\r\n            try\r\n            {\r\n                var r = _readerPool.GetInstance();\r\n                r.Reset(command);\r\n\r\n                obj._reader = r;\r\n                obj._x = x;\r\n                obj._strBuilder.Length = 0;\r\n                obj._parenCount = 0;\r\n                obj._current = (char)0;\r\n\r\n                bool t2 = obj.EvalStatement(temp);\r\n                var result = temp.Vector4Value;\r\n\r\n                obj._reader.Dispose();\r\n                _readerPool.Release(obj._reader as ReusableStringReader);\r\n                obj._x = null;\r\n                obj._strBuilder.Length = 0;\r\n                obj._parenCount = 0;\r\n                obj._current = (char)0;\r\n\r\n                return result;\r\n            }\r\n            finally\r\n            {\r\n                _pool.Release(obj);\r\n                _variantPool.Release(temp);\r\n            }\r\n        }\r\n\r\n        public static Quaternion EvalQuaternion(string command, object x)\r\n        {\r\n            var obj = _pool.GetInstance();\r\n            var temp = _variantPool.GetInstance();\r\n            try\r\n            {\r\n                var r = _readerPool.GetInstance();\r\n                r.Reset(command);\r\n\r\n                obj._reader = r;\r\n                obj._x = x;\r\n                obj._strBuilder.Length = 0;\r\n                obj._parenCount = 0;\r\n                obj._current = (char)0;\r\n\r\n                bool t2 = obj.EvalStatement(temp);\r\n                var result = temp.QuaternionValue;\r\n\r\n                obj._reader.Dispose();\r\n                _readerPool.Release(obj._reader as ReusableStringReader);\r\n                obj._x = null;\r\n                obj._strBuilder.Length = 0;\r\n                obj._parenCount = 0;\r\n                obj._current = (char)0;\r\n\r\n                return result;\r\n            }\r\n            finally\r\n            {\r\n                _pool.Release(obj);\r\n                _variantPool.Release(temp);\r\n            }\r\n        }\r\n\r\n        public static UnityEngine.Color EvalColor(string command, object x)\r\n        {\r\n            var obj = _pool.GetInstance();\r\n            var temp = _variantPool.GetInstance();\r\n            try\r\n            {\r\n                var r = _readerPool.GetInstance();\r\n                r.Reset(command);\r\n\r\n                obj._reader = r;\r\n                obj._x = x;\r\n                obj._strBuilder.Length = 0;\r\n                obj._parenCount = 0;\r\n                obj._current = (char)0;\r\n\r\n                bool t2 = obj.EvalStatement(temp);\r\n                var result = temp.ColorValue;\r\n\r\n                obj._reader.Dispose();\r\n                _readerPool.Release(obj._reader as ReusableStringReader);\r\n                obj._x = null;\r\n                obj._strBuilder.Length = 0;\r\n                obj._parenCount = 0;\r\n                obj._current = (char)0;\r\n\r\n                return result;\r\n            }\r\n            finally\r\n            {\r\n                _pool.Release(obj);\r\n                _variantPool.Release(temp);\r\n            }\r\n        }\r\n\r\n        public static bool EvalBool(string command, object x)\r\n        {\r\n            var obj = _pool.GetInstance();\r\n            var temp = _variantPool.GetInstance();\r\n            try\r\n            {\r\n                var r = _readerPool.GetInstance();\r\n                r.Reset(command);\r\n\r\n                obj._reader = r;\r\n                obj._x = x;\r\n                obj._strBuilder.Length = 0;\r\n                obj._parenCount = 0;\r\n                obj._current = (char)0;\r\n\r\n                bool t2 = obj.EvalStatement(temp);\r\n                var result = temp.BoolValue;\r\n\r\n                obj._reader.Dispose();\r\n                _readerPool.Release(obj._reader as ReusableStringReader);\r\n                obj._x = null;\r\n                obj._strBuilder.Length = 0;\r\n                obj._parenCount = 0;\r\n                obj._current = (char)0;\r\n\r\n                return result;\r\n            }\r\n            finally\r\n            {\r\n                _pool.Release(obj);\r\n                _variantPool.Release(temp);\r\n            }\r\n        }\r\n\r\n        public static UnityEngine.Rect EvalRect(string command, object x)\r\n        {\r\n            var obj = _pool.GetInstance();\r\n            var temp = _variantPool.GetInstance();\r\n            try\r\n            {\r\n                var r = _readerPool.GetInstance();\r\n                r.Reset(command);\r\n\r\n                obj._reader = r;\r\n                obj._x = x;\r\n                obj._strBuilder.Length = 0;\r\n                obj._parenCount = 0;\r\n                obj._current = (char)0;\r\n\r\n                bool t2 = obj.EvalStatement(temp);\r\n                var result = temp.RectValue;\r\n\r\n                obj._reader.Dispose();\r\n                _readerPool.Release(obj._reader as ReusableStringReader);\r\n                obj._x = null;\r\n                obj._strBuilder.Length = 0;\r\n                obj._parenCount = 0;\r\n                obj._current = (char)0;\r\n\r\n                return result;\r\n            }\r\n            finally\r\n            {\r\n                _pool.Release(obj);\r\n                _variantPool.Release(temp);\r\n            }\r\n        }\r\n\r\n        public static string EvalString(string command, object x)\r\n        {\r\n            var obj = _pool.GetInstance();\r\n            var temp = _variantPool.GetInstance();\r\n            try\r\n            {\r\n                var r = _readerPool.GetInstance();\r\n                r.Reset(command);\r\n\r\n                obj._reader = r;\r\n                obj._x = x;\r\n                obj._strBuilder.Length = 0;\r\n                obj._parenCount = 0;\r\n                obj._current = (char)0;\r\n\r\n                bool t2 = obj.EvalStatement(temp);\r\n                var result = temp.StringValue;\r\n\r\n                obj._reader.Dispose();\r\n                _readerPool.Release(obj._reader as ReusableStringReader);\r\n                obj._x = null;\r\n                obj._strBuilder.Length = 0;\r\n                obj._parenCount = 0;\r\n                obj._current = (char)0;\r\n\r\n                return result;\r\n            }\r\n            finally\r\n            {\r\n                _pool.Release(obj);\r\n                _variantPool.Release(temp);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Fields\r\n\r\n        private System.IO.TextReader _reader;\r\n        private object _x;\r\n        private StringBuilder _strBuilder = new StringBuilder();\r\n        private int _parenCount;\r\n        private char _current;\r\n        \r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public object EvalStatement(string command, object x)\r\n        {\r\n            var r = _readerPool.GetInstance();\r\n            r.Reset(command);\r\n\r\n            _reader = r;\r\n            _x = x;\r\n            _strBuilder.Length = 0;\r\n            _parenCount = 0;\r\n            _current = (char)0;\r\n\r\n            var temp = _variantPool.GetInstance();\r\n            bool t2 = this.EvalStatement(temp);\r\n            var result = temp.Value;\r\n            _variantPool.Release(temp);\r\n\r\n            _reader.Dispose();\r\n            _readerPool.Release(_reader as ReusableStringReader);\r\n            _x = null;\r\n            _strBuilder.Length = 0;\r\n            _parenCount = 0;\r\n            _current = (char)0;\r\n\r\n            return result;\r\n        }\r\n\r\n        public object EvalStatement(System.IO.TextReader command, object x)\r\n        {\r\n            if (command == null) throw new System.ArgumentNullException(\"command\");\r\n\r\n            _reader = command;\r\n            _x = x;\r\n            _strBuilder.Length = 0;\r\n            _parenCount = 0;\r\n            _current = (char)0;\r\n\r\n            var temp = _variantPool.GetInstance();\r\n            bool t2 = this.EvalStatement(temp);\r\n            var result = temp.Value;\r\n            _variantPool.Release(temp);\r\n\r\n            _reader.Dispose();\r\n            _x = null;\r\n            _strBuilder.Length = 0;\r\n            _parenCount = 0;\r\n            _current = (char)0;\r\n\r\n            return result;\r\n        }\r\n        \r\n        /// <summary>\r\n        /// \r\n        /// </summary>\r\n        /// <param name=\"state\"></param>\r\n        /// <param name=\"requireClosingParen\"></param>\r\n        /// <returns>Returns true if successfully evaluated the entire statement</returns>\r\n        private bool EvalStatement(VariantReference state, bool requireClosingParen = false)\r\n        {\r\n            this.EvalNextValue(state);\r\n\r\n            if (_current == ')')\r\n            {\r\n                int c = _reader.Read();\r\n                if (c >= 0) _current = (char)c;\r\n                _parenCount--;\r\n                return true;\r\n            }\r\n\r\n            VariantReference temp = _variantPool.GetInstance();\r\n            try\r\n            {\r\n                for (int i = _current; i >= 0; i = _reader.Read())\r\n                {\r\n                    _current = (char)i;\r\n\r\n                    if (char.IsWhiteSpace(_current)) continue;\r\n\r\n                    switch (_current)\r\n                    {\r\n                        case '+':\r\n                            this.EvalNextValue(temp);\r\n                            DoSum(state, temp);\r\n                            break;\r\n                        case '-':\r\n                            this.EvalNextValue(temp);\r\n                            DoMinus(state, temp);\r\n                            break;\r\n                        case '*':\r\n                            this.EvalNextValue(temp);\r\n                            DoProduct(state, temp);\r\n                            break;\r\n                        case '/':\r\n                            this.EvalNextValue(temp);\r\n                            DoDivide(state, temp);\r\n                            break;\r\n                        case '^':\r\n                            this.EvalNextValue(temp);\r\n                            state.DoubleValue = Math.Pow(state.DoubleValue, temp.DoubleValue);\r\n                            break;\r\n                        case '%':\r\n                            this.EvalNextValue(temp);\r\n                            state.DoubleValue = state.DoubleValue % temp.DoubleValue;\r\n                            break;\r\n                        case '=':\r\n                            {\r\n                                if (_reader.Peek() == '=')\r\n                                {\r\n                                    _reader.Read();\r\n                                    this.EvalNextValue(temp);\r\n                                    state.BoolValue = TryEquals(state, temp);\r\n                                }\r\n                                else\r\n                                {\r\n                                    this.EvalNextValue(temp);\r\n                                    state.BoolValue = TryEquals(state, temp);\r\n                                }\r\n                            }\r\n                            break;\r\n                        case '!':\r\n                            {\r\n                                if (_reader.Peek() == '=')\r\n                                {\r\n                                    _reader.Read();\r\n                                    this.EvalNextValue(temp);\r\n                                    state.BoolValue = !TryEquals(state, temp);\r\n                                }\r\n                                else\r\n                                {\r\n                                    throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n                                }\r\n                            }\r\n                            break;\r\n                        case '<':\r\n                            {\r\n                                if (_reader.Peek() == '=')\r\n                                {\r\n                                    _reader.Read();\r\n                                    this.EvalNextValue(temp);\r\n                                    state.BoolValue = (state.DoubleValue <= temp.DoubleValue);\r\n                                }\r\n                                else\r\n                                {\r\n                                    this.EvalNextValue(temp);\r\n                                    state.BoolValue = (state.DoubleValue < temp.DoubleValue);\r\n                                }\r\n                            }\r\n                            break;\r\n                        case '>':\r\n                            {\r\n                                if (_reader.Peek() == '=')\r\n                                {\r\n                                    _reader.Read();\r\n                                    this.EvalNextValue(temp);\r\n                                    state.BoolValue = (state.DoubleValue >= temp.DoubleValue);\r\n                                }\r\n                                else\r\n                                {\r\n                                    this.EvalNextValue(temp);\r\n                                    state.BoolValue = (state.DoubleValue > temp.DoubleValue);\r\n                                }\r\n                            }\r\n                            break;\r\n                        case '|':\r\n                            {\r\n                                if (_reader.Peek() == '|')\r\n                                {\r\n                                    _reader.Read();\r\n                                    this.EvalNextValue(temp);\r\n                                    state.BoolValue = state.BoolValue || temp.BoolValue;\r\n                                }\r\n                                else\r\n                                {\r\n                                    this.EvalNextValue(temp);\r\n                                    state.IntValue = state.IntValue | temp.IntValue;\r\n                                }\r\n                            }\r\n                            break;\r\n                        case '&':\r\n                            {\r\n                                if (_reader.Peek() == '&')\r\n                                {\r\n                                    _reader.Read();\r\n                                    this.EvalNextValue(temp);\r\n                                    state.BoolValue = state.BoolValue && temp.BoolValue;\r\n                                }\r\n                                else\r\n                                {\r\n                                    this.EvalNextValue(temp);\r\n                                    state.IntValue = state.IntValue & temp.IntValue;\r\n                                }\r\n                            }\r\n                            break;\r\n                        case ',':\r\n                            //reached the end of the first parameter\r\n                            return false;\r\n                        case ')':\r\n                            //reached the end of the statement\r\n                            int c = _reader.Read();\r\n                            if (c >= 0) _current = (char)c;\r\n                            _parenCount--;\r\n                            return true;\r\n                    }\r\n\r\n                    if (_current == ',')\r\n                    {\r\n                        return false;\r\n                    }\r\n                    if (_current == ')')\r\n                    {\r\n                        int c = _reader.Read();\r\n                        if (c >= 0) _current = (char)c;\r\n                        _parenCount--;\r\n                        return true;\r\n                    }\r\n                }\r\n            }\r\n            finally\r\n            {\r\n                _variantPool.Release(temp);\r\n            }\r\n\r\n            //ran out of statement with no errors, must be the end\r\n            if (requireClosingParen)\r\n                throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n\r\n            return true;\r\n        }\r\n\r\n        private void EvalNextValue(VariantReference state)\r\n        {\r\n            int i = _reader.Read();\r\n            for (; i >= 0 && char.IsWhiteSpace((char)i); i = _reader.Read())\r\n            {\r\n            }\r\n            if (i < 0)\r\n            {\r\n                state.Value = null;\r\n                return;\r\n            }\r\n\r\n            _current = (char)i;\r\n            if (!IsValidWordPrefix(_current)) throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n\r\n            if (char.IsDigit(_current))\r\n            {\r\n                state.DoubleValue = EvalNumber();\r\n                return;\r\n            }\r\n            if (char.IsLetter(_current))\r\n            {\r\n                EvalFunc(state);\r\n                return;\r\n            }\r\n\r\n            switch (_current)\r\n            {\r\n                case '$':\r\n                    this.EvalVariable(state);\r\n                    return;\r\n                case '(':\r\n                    _parenCount++;\r\n                    bool temp = this.EvalStatement(state);\r\n                    return;\r\n                case '+':\r\n                    this.EvalNextValue(state);\r\n                    return;\r\n                case '-':\r\n                    this.EvalNextValue(state);\r\n                    DoNegate(state);\r\n                    return;\r\n                case '\\\"':\r\n                    EvalString(state);\r\n                    return;\r\n                case ')':\r\n                    return;\r\n                default:\r\n                    throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n            }\r\n        }\r\n\r\n        private double EvalNumber()\r\n        {\r\n            const int CHAR_0 = (int)'0';\r\n            long high = ((int)_current - CHAR_0);\r\n            long low = 0;\r\n            int lowLen = -1;\r\n\r\n            for (int i = _reader.Read(); i >= 0; i = _reader.Read())\r\n            {\r\n                _current = (char)i;\r\n\r\n                if (char.IsDigit(_current))\r\n                {\r\n                    if (lowLen < 0)\r\n                        high = (high * 10) + ((int)_current - CHAR_0);\r\n                    else\r\n                    {\r\n                        low = (low * 10) + ((int)_current - CHAR_0);\r\n                        lowLen++;\r\n                    }\r\n                }\r\n                else if (_current == '.')\r\n                {\r\n                    if (lowLen < 0)\r\n                        lowLen = 0;\r\n                    else\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n                }\r\n                else if (char.IsWhiteSpace(_current))\r\n                {\r\n                    break;\r\n                }\r\n                else if (_current == ')' || _current == ',')\r\n                {\r\n                    break;\r\n                }\r\n                else if (IsArithmeticSymbol(_current))\r\n                {\r\n                    break;\r\n                }\r\n                else\r\n                    throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n\r\n            }\r\n\r\n            if (low != 0)\r\n                return ((double)high + ((double)low / Math.Pow(10, lowLen)));\r\n            else\r\n                return (double)high;\r\n        }\r\n\r\n        private void EvalVariable(VariantReference state)\r\n        {\r\n            _strBuilder.Length = 0;\r\n            int i = _reader.Read();\r\n            if (i < 0)\r\n            {\r\n                state.Value = _x;\r\n                return;\r\n            }\r\n\r\n            _current = (char)i;\r\n            if (_current == '.')\r\n            {\r\n                var target = _x;\r\n                string sprop;\r\n\r\n                //access x\r\n                for (i = _reader.Read(); i >= 0; i = _reader.Read())\r\n                {\r\n                    _current = (char)i;\r\n\r\n                    if (char.IsLetterOrDigit(_current) || _current == '_')\r\n                    {\r\n                        _strBuilder.Append(_current);\r\n                    }\r\n                    else if (_current == '.')\r\n                    {\r\n                        sprop = _strBuilder.ToString();\r\n                        _strBuilder.Length = 0;\r\n                        target = DynamicUtil.GetValue(target, sprop);\r\n                    }\r\n                    else if(_current == '(')\r\n                    {\r\n                        //it's a function!\r\n                        while (_reader.Peek() != 0 && char.IsWhiteSpace((char)_reader.Peek())) _reader.Read(); //consume whitespace\r\n\r\n                        if((char)_reader.Peek() == ')')\r\n                        {\r\n                            _reader.Read();\r\n                            sprop = _strBuilder.ToString();\r\n                            _strBuilder.Length = 0;\r\n                            state.Value = DynamicUtil.GetValue(target, sprop);\r\n                            return;\r\n                        }\r\n                        else\r\n                        {\r\n                            using (var lst = TempCollection.GetList<object>())\r\n                            {\r\n                                VariantReference temp = _variantPool.GetInstance();\r\n                                try\r\n                                {\r\n                                    bool complete = false;\r\n                                    while (!complete)\r\n                                    {\r\n                                        complete = this.EvalStatement(temp, true);\r\n                                        lst.Add(temp.Value);\r\n                                    }\r\n                                }\r\n                                finally\r\n                                {\r\n                                    _variantPool.Release(temp);\r\n                                }\r\n\r\n                                sprop = _strBuilder.ToString();\r\n                                _strBuilder.Length = 0;\r\n                                state.Value = DynamicUtil.GetValue(target, sprop, lst.ToArray());\r\n                                return;\r\n                            }\r\n                        }\r\n                    }\r\n                    else if (char.IsWhiteSpace(_current) || IsArithmeticSymbol(_current) || _current == ')' || _current == ',' || _current == ']')\r\n                        break;\r\n                    else\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n                }\r\n\r\n                sprop = _strBuilder.ToString();\r\n                _strBuilder.Length = 0;\r\n                state.Value = DynamicUtil.GetValue(target, sprop);\r\n                return;\r\n            }\r\n            else if(_current == '(')\r\n            {\r\n                for (i = _reader.Read(); i >= 0; i = _reader.Read())\r\n                {\r\n                    _current = (char)i;\r\n\r\n                    if (char.IsLetterOrDigit(_current) || _current == '_')\r\n                    {\r\n                        _strBuilder.Append(_current);\r\n                    }\r\n                    else if(_current == ')')\r\n                    {\r\n                        break;\r\n                    }\r\n                    else\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n                }\r\n\r\n                i = _reader.Read();\r\n                if(i < 0 || (char)i != '.')\r\n                    throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n\r\n                string stp = _strBuilder.ToString();\r\n                _strBuilder.Length = 0;\r\n\r\n                var go = GameObjectUtil.GetGameObjectFromSource(_x);\r\n                object target = go != null ? go.GetComponent(stp) : null;\r\n                string sprop;\r\n\r\n                //access target\r\n                for (i = _reader.Read(); i >= 0; i = _reader.Read())\r\n                {\r\n                    _current = (char)i;\r\n\r\n                    if (char.IsLetterOrDigit(_current) || _current == '_')\r\n                    {\r\n                        _strBuilder.Append(_current);\r\n                    }\r\n                    else if (_current == '.')\r\n                    {\r\n                        sprop = _strBuilder.ToString();\r\n                        _strBuilder.Length = 0;\r\n                        target = DynamicUtil.GetValue(target, sprop);\r\n                    }\r\n                    else if (_current == '(')\r\n                    {\r\n                        //it's a function!\r\n                        while (_reader.Peek() != 0 && char.IsWhiteSpace((char)_reader.Peek())) _reader.Read(); //consume whitespace\r\n\r\n                        if ((char)_reader.Peek() == ')')\r\n                        {\r\n                            _reader.Read();\r\n                            sprop = _strBuilder.ToString();\r\n                            _strBuilder.Length = 0;\r\n                            state.Value = DynamicUtil.GetValue(target, sprop);\r\n                            return;\r\n                        }\r\n                        else\r\n                        {\r\n                            using (var lst = TempCollection.GetList<object>())\r\n                            {\r\n                                VariantReference temp = _variantPool.GetInstance();\r\n                                try\r\n                                {\r\n                                    bool complete = false;\r\n                                    while (!complete)\r\n                                    {\r\n                                        complete = this.EvalStatement(temp, true);\r\n                                        lst.Add(temp.Value);\r\n                                    }\r\n                                }\r\n                                finally\r\n                                {\r\n                                    _variantPool.Release(temp);\r\n                                }\r\n\r\n                                sprop = _strBuilder.ToString();\r\n                                _strBuilder.Length = 0;\r\n                                state.Value = DynamicUtil.GetValue(target, sprop, lst.ToArray());\r\n                                return;\r\n                            }\r\n                        }\r\n                    }\r\n                    else if (char.IsWhiteSpace(_current) || IsArithmeticSymbol(_current) || _current == ')' || _current == ',' || _current == ']')\r\n                        break;\r\n                    else\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n                }\r\n\r\n                sprop = _strBuilder.ToString();\r\n                _strBuilder.Length = 0;\r\n                state.Value = DynamicUtil.GetValue(target, sprop);\r\n                return;\r\n            }\r\n            else if (char.IsLetterOrDigit(_current) || _current == '_' || _current == '-')\r\n            {\r\n                //global\r\n                _strBuilder.Append(char.ToLower(_current));\r\n\r\n                for (i = _reader.Read(); i >= 0; i = _reader.Read())\r\n                {\r\n                    _current = (char)i;\r\n\r\n                    if (char.IsLetterOrDigit(_current) || _current == '_')\r\n                    {\r\n                        _strBuilder.Append(char.ToLower(_current));\r\n                    }\r\n                    else if (char.IsWhiteSpace(_current) || IsArithmeticSymbol(_current) || _current == ')' || _current == ',' || _current == ']')\r\n                        break;\r\n                    else\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n                }\r\n\r\n\r\n                var str = _strBuilder.ToString();\r\n                _strBuilder.Length = 0;\r\n\r\n                switch (str)\r\n                {\r\n                    case \"true\":\r\n                        state.BoolValue = true;\r\n                        return;\r\n                    case \"false\":\r\n                        state.BoolValue = false;\r\n                        return;\r\n                    case \"null\":\r\n                        state.Value = null;\r\n                        return;\r\n                    case \"pi\":\r\n                        state.DoubleValue = Math.PI;\r\n                        return;\r\n                    case \"2pi\":\r\n                        const double TWO_PI = (System.Math.PI * 2d);\r\n                        state.DoubleValue = TWO_PI;\r\n                        return;\r\n                    case \"pi_2\":\r\n                        const double PI_TWO = (System.Math.PI / 2d);\r\n                        state.DoubleValue = PI_TWO;\r\n                        return;\r\n                    case \"rad2deg\":\r\n                        const double RAD2DEG = (180d / System.Math.PI);\r\n                        state.DoubleValue = RAD2DEG;\r\n                        return;\r\n                    case \"deg2rad\":\r\n                        const double DEG2RAD = (System.Math.PI / 180d);\r\n                        state.DoubleValue = DEG2RAD;\r\n                        return;\r\n                    case \"secsinmin\":\r\n                        state.DoubleValue = 60d;\r\n                        return;\r\n                    case \"secsinhour\":\r\n                        state.DoubleValue = 3600d;\r\n                        return;\r\n                    case \"secsinday\":\r\n                        state.DoubleValue = 86400d;\r\n                        return;\r\n                    case \"secsinweek\":\r\n                        state.DoubleValue = 604800d;\r\n                        return;\r\n                    case \"secsinyear\":\r\n                        state.DoubleValue = 31536000d;\r\n                        return;\r\n                    case \"infinity\":\r\n                    case \"inf\":\r\n                        state.DoubleValue = double.PositiveInfinity;\r\n                        return;\r\n                    case \"-infinity\":\r\n                    case \"-inf\":\r\n                        state.DoubleValue = double.NegativeInfinity;\r\n                        return;\r\n                    case \"time\":\r\n                        state.DoubleValue = UnityEngine.Time.time;\r\n                        return;\r\n                    case \"unscaledtime\":\r\n                        state.DoubleValue = UnityEngine.Time.unscaledTime;\r\n                        return;\r\n                    case \"fixedtime\":\r\n                        state.DoubleValue = UnityEngine.Time.fixedTime;\r\n                        return;\r\n                    case \"deltatime\":\r\n                        state.DoubleValue = UnityEngine.Time.deltaTime;\r\n                        return;\r\n                    case \"fixeddeltatime\":\r\n                        state.DoubleValue = UnityEngine.Time.fixedDeltaTime;\r\n                        return;\r\n                    default:\r\n                        state.Value = null;\r\n                        return;\r\n                }\r\n            }\r\n            else if (char.IsWhiteSpace(_current) || IsArithmeticSymbol(_current) || _current == ')' || _current == ',' || _current == ']')\r\n            {\r\n                state.Value = _x;\r\n                return;\r\n            }\r\n            else\r\n            {\r\n                throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n            }\r\n\r\n        }\r\n\r\n        private void EvalFunc(VariantReference state)\r\n        {\r\n            _strBuilder.Length = 0;\r\n            _strBuilder.Append(char.ToLower(_current));\r\n\r\n            for (int i = _reader.Read(); i >= 0; i = _reader.Read())\r\n            {\r\n                _current = (char)i;\r\n\r\n                if (char.IsLetterOrDigit(_current))\r\n                {\r\n                    _strBuilder.Append(char.ToLower(_current));\r\n                }\r\n                else if (_current == '(')\r\n                    break;\r\n                else\r\n                    throw new System.InvalidOperationException(\"Failed to parse the command.\");\r\n            }\r\n\r\n            var name = _strBuilder.ToString();\r\n            _strBuilder.Length = 0;\r\n\r\n            _parenCount++;\r\n\r\n            VariantReference temp = _variantPool.GetInstance();\r\n            try\r\n            {\r\n                bool reachedEnd;\r\n                switch (name)\r\n                {\r\n                    case \"str\":\r\n                        {\r\n                            reachedEnd = EvalStatement(temp, true);\r\n                            if (!reachedEnd)\r\n                                throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                            state.StringValue = temp.StringValue;\r\n                            return;\r\n                        }\r\n                    case \"abs\":\r\n                        {\r\n                            reachedEnd = EvalStatement(temp, true);\r\n                            if (!reachedEnd)\r\n                                throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                            state.DoubleValue = Math.Abs(temp.DoubleValue);\r\n                            return;\r\n                        }\r\n                    case \"sqrt\":\r\n                        {\r\n                            reachedEnd = EvalStatement(temp, true);\r\n                            if (!reachedEnd)\r\n                                throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                            state.DoubleValue = Math.Sqrt(temp.DoubleValue);\r\n                            return;\r\n                        }\r\n                    case \"cos\":\r\n                        {\r\n                            reachedEnd = EvalStatement(temp, true);\r\n                            if (!reachedEnd)\r\n                                throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                            state.DoubleValue = Math.Cos(temp.DoubleValue);\r\n                            return;\r\n                        }\r\n                    case \"sin\":\r\n                        {\r\n                            reachedEnd = EvalStatement(temp, true);\r\n                            if (!reachedEnd)\r\n                                throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                            state.DoubleValue = Math.Sin(temp.DoubleValue);\r\n                            return;\r\n                        }\r\n                    case \"tan\":\r\n                        {\r\n                            reachedEnd = EvalStatement(temp, true);\r\n                            if (!reachedEnd)\r\n                                throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                            state.DoubleValue = Math.Tan(temp.DoubleValue);\r\n                            return;\r\n                        }\r\n                    case \"acos\":\r\n                        {\r\n                            reachedEnd = EvalStatement(temp, true);\r\n                            if (!reachedEnd)\r\n                                throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                            state.DoubleValue = Math.Acos(temp.DoubleValue);\r\n                            return;\r\n                        }\r\n                    case \"asin\":\r\n                        {\r\n                            reachedEnd = EvalStatement(temp, true);\r\n                            if (!reachedEnd)\r\n                                throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                            state.DoubleValue = Math.Asin(temp.DoubleValue);\r\n                            return;\r\n                        }\r\n                    case \"atan\":\r\n                        {\r\n                            reachedEnd = EvalStatement(temp, true);\r\n                            if (!reachedEnd)\r\n                                throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                            state.DoubleValue = Math.Atan(temp.DoubleValue);\r\n                            return;\r\n                        }\r\n                    case \"atan2\":\r\n                        {\r\n                            reachedEnd = this.EvalStatement(temp, true);\r\n                            if (reachedEnd)\r\n                                throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                            double y = temp.DoubleValue;\r\n\r\n                            reachedEnd = EvalStatement(temp, true);\r\n                            if (!reachedEnd)\r\n                                throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                            double x = temp.DoubleValue;\r\n\r\n                            state.DoubleValue = Math.Atan2(y, x);\r\n                            return;\r\n                        }\r\n                    case \"rand\":\r\n                        {\r\n                            reachedEnd = this.EvalStatement(temp, true);\r\n                            if (temp.ValueType == VariantType.Quaternion)\r\n                            {\r\n                                if (reachedEnd)\r\n                                {\r\n                                    state.QuaternionValue = Quaternion.Slerp(Quaternion.identity, temp.QuaternionValue, RandomUtil.Standard.Next());\r\n                                    return;\r\n                                }\r\n\r\n                                var x = temp.QuaternionValue;\r\n                                reachedEnd = this.EvalStatement(temp, true);\r\n                                if (reachedEnd)\r\n                                {\r\n                                    state.QuaternionValue = Quaternion.Slerp(x, temp.QuaternionValue, RandomUtil.Standard.Next());\r\n                                    return;\r\n                                }\r\n                                \r\n                                throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                            }\r\n                            else\r\n                            {\r\n                                if(reachedEnd)\r\n                                {\r\n                                    DoProductInterlerp(temp, RandomUtil.Standard.NextDouble());\r\n                                    state.CopyValue(temp);\r\n                                    return;\r\n                                }\r\n\r\n                                var x = temp.Value;\r\n                                reachedEnd = this.EvalStatement(temp, true);\r\n                                if(reachedEnd)\r\n                                {\r\n                                    state.Value = TryLerp(x, temp.Value, RandomUtil.Standard.Next());\r\n                                    return;\r\n                                }\r\n\r\n                                throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                            }\r\n                        }\r\n                    case \"randint\":\r\n                        {\r\n                            reachedEnd = this.EvalStatement(temp, true);\r\n                            if(reachedEnd)\r\n                            {\r\n                                state.IntValue = RandomUtil.Standard.Next(temp.IntValue);\r\n                                return;\r\n                            }\r\n\r\n                            int x = temp.IntValue;\r\n                            reachedEnd = this.EvalStatement(temp, true);\r\n                            if(!reachedEnd)\r\n                                throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n\r\n                            state.IntValue = RandomUtil.Standard.Next(x, temp.IntValue);\r\n                            return;\r\n                        }\r\n                    case \"vec\":\r\n                        {\r\n                            reachedEnd = this.EvalStatement(temp, true);\r\n                            if(reachedEnd)\r\n                            {\r\n                                switch(temp.ValueType)\r\n                                {\r\n                                    case VariantType.Vector2:\r\n                                    case VariantType.Vector3:\r\n                                    case VariantType.Vector4:\r\n                                    case VariantType.Quaternion:\r\n                                        state.CopyValue(temp);\r\n                                        break;\r\n                                    default:\r\n                                        state.Vector2Value = new UnityEngine.Vector2(temp.FloatValue, 0f);\r\n                                        break;\r\n                                }\r\n                                return;\r\n                            }\r\n\r\n                            float x = temp.FloatValue;\r\n                            reachedEnd = this.EvalStatement(temp, true);\r\n                            if(reachedEnd)\r\n                            {\r\n                                switch(temp.ValueType)\r\n                                {\r\n                                    case VariantType.Vector2:\r\n                                        state.Vector3Value = new UnityEngine.Vector3(x, temp.Vector2Value.x, temp.Vector2Value.y);\r\n                                        break;\r\n                                    case VariantType.Vector3:\r\n                                        state.Vector4Value = new UnityEngine.Vector4(x, temp.Vector3Value.x, temp.Vector3Value.y, temp.Vector3Value.z);\r\n                                        break;\r\n                                    case VariantType.Vector4:\r\n                                        state.Vector4Value = new UnityEngine.Vector4(x, temp.Vector4Value.x, temp.Vector4Value.y, temp.Vector4Value.z);\r\n                                        break;\r\n                                    default:\r\n                                        state.Vector2Value = new UnityEngine.Vector2(x, temp.FloatValue);\r\n                                        break;\r\n                                }\r\n                                return;\r\n                            }\r\n\r\n                            float y = temp.FloatValue;\r\n                            reachedEnd = this.EvalStatement(temp, true);\r\n                            if(reachedEnd)\r\n                            {\r\n                                switch (temp.ValueType)\r\n                                {\r\n                                    case VariantType.Vector2:\r\n                                        state.Vector4Value = new UnityEngine.Vector4(x, y, temp.Vector2Value.x, temp.Vector2Value.y);\r\n                                        break;\r\n                                    case VariantType.Vector3:\r\n                                        state.Vector4Value = new UnityEngine.Vector4(x, y, temp.Vector3Value.x, temp.Vector3Value.y);\r\n                                        break;\r\n                                    case VariantType.Vector4:\r\n                                        state.Vector4Value = new UnityEngine.Vector4(x, y, temp.Vector4Value.x, temp.Vector4Value.y);\r\n                                        break;\r\n                                    default:\r\n                                        state.Vector3Value = new UnityEngine.Vector3(x, y, temp.FloatValue);\r\n                                        break;\r\n                                }\r\n                                return;\r\n                            }\r\n\r\n                            float z = temp.FloatValue;\r\n                            reachedEnd = this.EvalStatement(temp, true);\r\n                            if (reachedEnd)\r\n                            {\r\n                                state.Vector4Value = new UnityEngine.Vector4(x, y, z, temp.FloatValue);\r\n                                return;\r\n                            }\r\n\r\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                        }\r\n                    case \"rot\":\r\n                        {\r\n                            reachedEnd = this.EvalStatement(temp, true);\r\n                            if (reachedEnd)\r\n                            {\r\n                                switch (temp.ValueType)\r\n                                {\r\n                                    case VariantType.Vector2:\r\n                                    case VariantType.Vector3:\r\n                                    case VariantType.Vector4:\r\n                                        state.QuaternionValue = Quaternion.Euler(temp.Vector3Value);\r\n                                        break;\r\n                                    case VariantType.Quaternion:\r\n                                        state.QuaternionValue = temp.QuaternionValue;\r\n                                        break;\r\n                                    default:\r\n                                        state.QuaternionValue = Quaternion.Euler(temp.FloatValue, 0f, 0f);\r\n                                        break;\r\n                                }\r\n                                return;\r\n                            }\r\n\r\n                            float x = temp.FloatValue;\r\n                            reachedEnd = this.EvalStatement(temp, true);\r\n                            if(reachedEnd)\r\n                            {\r\n                                switch (temp.ValueType)\r\n                                {\r\n                                    case VariantType.Vector2:\r\n                                    case VariantType.Vector3:\r\n                                    case VariantType.Vector4:\r\n                                    case VariantType.Quaternion:\r\n                                        state.QuaternionValue = Quaternion.Euler(x, temp.Vector2Value.x, temp.Vector2Value.y);\r\n                                        break;\r\n                                    default:\r\n                                        state.QuaternionValue = Quaternion.Euler(x, temp.FloatValue, 0f);\r\n                                        break;\r\n                                }\r\n                                return;\r\n                            }\r\n\r\n                            float y = temp.FloatValue;\r\n                            reachedEnd = this.EvalStatement(temp, true);\r\n                            if (reachedEnd)\r\n                            {\r\n                                state.QuaternionValue = Quaternion.Euler(x, y, temp.FloatValue);\r\n                                return;\r\n                            }\r\n\r\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\r\n                        }\r\n                    default:\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command: Unknown Function\");\r\n                }\r\n            }\r\n            finally\r\n            {\r\n                _variantPool.Release(temp);\r\n            }\r\n        }\r\n        \r\n        private void EvalString(VariantReference state)\r\n        {\r\n            _strBuilder.Length = 0;\r\n\r\n            bool successfulClose = false;\r\n            for (int i = _reader.Read(); i >= 0; i = _reader.Read())\r\n            {\r\n                _current = (char)i;\r\n                \r\n                if(_current == '\\\"')\r\n                {\r\n                    successfulClose = true;\r\n                    break;\r\n                }\r\n                else if (_current == '\\\\')\r\n                {\r\n                    i = _reader.Read();\r\n                    if(i < 0)\r\n                    {\r\n                        throw new System.InvalidOperationException(\"Failed to parse the command: string statement syntax error.\");\r\n                    }\r\n\r\n                    _current = (char)i;\r\n                    _strBuilder.Append(_current);\r\n                }\r\n                else\r\n                {\r\n                    _strBuilder.Append(_current);\r\n                }\r\n            }\r\n\r\n            if(!successfulClose)\r\n            {\r\n                throw new System.InvalidOperationException(\"Failed to parse the command: string statement syntax error.\");\r\n            }\r\n\r\n            state.StringValue = _strBuilder.ToString();\r\n            _strBuilder.Length = 0;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Utils\r\n        \r\n        private static bool IsArithmeticSymbol(char c)\r\n        {\r\n            switch (c)\r\n            {\r\n                case '+':\r\n                case '*':\r\n                case '-':\r\n                case '/':\r\n                case '%':\r\n                case '^':\r\n                    return true;\r\n                default:\r\n                    return false;\r\n            }\r\n        }\r\n\r\n        private static bool IsValidWordPrefix(char c)\r\n        {\r\n            return char.IsLetterOrDigit(c) || c == '$' || c == '_' || c == '+' || c == '-' || c == '(' || c == '\\\"' || c == ')';\r\n        }\r\n\r\n\r\n        //these operations modify the state of 'left'\r\n\r\n        private static void DoNegate(VariantReference value)\r\n        {\r\n            switch (value.ValueType)\r\n            {\r\n                case VariantType.Boolean:\r\n                    value.BoolValue = !value.BoolValue;\r\n                    break;\r\n                case VariantType.Integer:\r\n                    value.IntValue = -value.IntValue;\r\n                    break;\r\n                case VariantType.Float:\r\n                    value.FloatValue = -value.FloatValue;\r\n                    break;\r\n                case VariantType.Double:\r\n                    value.DoubleValue = -value.DoubleValue;\r\n                    break;\r\n                case VariantType.Vector2:\r\n                    value.Vector2Value = -value.Vector2Value;\r\n                    break;\r\n                case VariantType.Vector3:\r\n                    value.Vector3Value = -value.Vector3Value;\r\n                    break;\r\n                case VariantType.Vector4:\r\n                    value.Vector4Value = -value.Vector4Value;\r\n                    break;\r\n                case VariantType.Quaternion:\r\n                    value.QuaternionValue = Quaternion.Inverse(value.QuaternionValue);\r\n                    break;\r\n                case VariantType.Color:\r\n                    value.ColorValue = UnityEngine.Color.white - value.ColorValue;\r\n                    break;\r\n                case VariantType.LayerMask:\r\n                    value.LayerMaskValue = -value.LayerMaskValue;\r\n                    break;\r\n                case VariantType.Numeric:\r\n                    value.DoubleValue = -value.DoubleValue;\r\n                    break;\r\n            }\r\n        }\r\n\r\n        private static void DoSum(VariantReference left, VariantReference right)\r\n        {\r\n            if(left.ValueType == VariantType.String || right.ValueType == VariantType.String)\r\n            {\r\n                left.StringValue += right.StringValue;\r\n                return;\r\n            }\r\n\r\n            switch (left.ValueType)\r\n            {\r\n                case VariantType.Integer:\r\n                    if (right.ValueType == VariantType.Integer)\r\n                        left.IntValue += right.IntValue;\r\n                    else\r\n                        left.DoubleValue += right.DoubleValue;\r\n                    break;\r\n                case VariantType.Float:\r\n                    left.FloatValue += right.FloatValue;\r\n                    break;\r\n                case VariantType.Double:\r\n                    left.DoubleValue += right.DoubleValue;\r\n                    break;\r\n                case VariantType.Vector2:\r\n                    left.Vector2Value += right.Vector2Value;\r\n                    break;\r\n                case VariantType.Vector3:\r\n                    left.Vector3Value += right.Vector3Value;\r\n                    break;\r\n                case VariantType.Vector4:\r\n                    left.Vector4Value += right.Vector4Value;\r\n                    break;\r\n                case VariantType.Quaternion:\r\n                    left.Vector4Value += right.Vector4Value;\r\n                    break;\r\n                case VariantType.Color:\r\n                    left.ColorValue += right.ColorValue;\r\n                    break;\r\n                case VariantType.LayerMask:\r\n                    left.LayerMaskValue += right.LayerMaskValue;\r\n                    break;\r\n                case VariantType.Numeric:\r\n                    left.DoubleValue += right.DoubleValue;\r\n                    break;\r\n                default:\r\n                    left.DoubleValue = double.NaN;\r\n                    break;\r\n            }\r\n        }\r\n\r\n        private static void DoMinus(VariantReference left, VariantReference right)\r\n        {\r\n            switch (left.ValueType)\r\n            {\r\n                case VariantType.Integer:\r\n                    if (right.ValueType == VariantType.Integer)\r\n                        left.IntValue -= right.IntValue;\r\n                    else\r\n                        left.DoubleValue -= right.DoubleValue;\r\n                    break;\r\n                case VariantType.Float:\r\n                    left.FloatValue -= right.FloatValue;\r\n                    break;\r\n                case VariantType.Double:\r\n                    left.DoubleValue -= right.DoubleValue;\r\n                    break;\r\n                case VariantType.Vector2:\r\n                    left.Vector2Value -= right.Vector2Value;\r\n                    break;\r\n                case VariantType.Vector3:\r\n                    left.Vector3Value -= right.Vector3Value;\r\n                    break;\r\n                case VariantType.Vector4:\r\n                    left.Vector4Value -= right.Vector4Value;\r\n                    break;\r\n                case VariantType.Quaternion:\r\n                    left.Vector4Value -= right.Vector4Value;\r\n                    break;\r\n                case VariantType.Color:\r\n                    left.ColorValue -= right.ColorValue;\r\n                    break;\r\n                case VariantType.LayerMask:\r\n                    left.LayerMaskValue -= right.LayerMaskValue;\r\n                    break;\r\n                case VariantType.Numeric:\r\n                    left.DoubleValue -= right.DoubleValue;\r\n                    break;\r\n                default:\r\n                    left.DoubleValue = double.NaN;\r\n                    break;\r\n            }\r\n        }\r\n\r\n        private static void DoProductInterlerp(VariantReference left, double right)\r\n        {\r\n            Vector4 vl;\r\n            switch (left.ValueType)\r\n            {\r\n                case VariantType.Integer:\r\n                case VariantType.Float:\r\n                case VariantType.Double:\r\n                    left.DoubleValue *= right;\r\n                    break;\r\n                case VariantType.Vector2:\r\n                    vl = left.Vector2Value;\r\n                    vl.x = vl.x * (float)right;\r\n                    vl.y = vl.y * (float)right;\r\n                    left.Vector4Value = vl;\r\n                    break;\r\n                case VariantType.Vector3:\r\n                    vl = left.Vector3Value;\r\n                    vl.x = vl.x * (float)right;\r\n                    vl.y = vl.y * (float)right;\r\n                    vl.z = vl.z * (float)right;\r\n                    left.Vector4Value = vl;\r\n                    break;\r\n                case VariantType.Vector4:\r\n                    vl = left.Vector4Value;\r\n                    vl.x = vl.x * (float)right;\r\n                    vl.y = vl.y * (float)right;\r\n                    vl.z = vl.z * (float)right;\r\n                    vl.w = vl.w * (float)right;\r\n                    left.Vector4Value = vl;\r\n                    break;\r\n                case VariantType.Quaternion:\r\n                    left.Vector4Value = left.Vector4Value * (float)right;\r\n                    break;\r\n                case VariantType.Color:\r\n                    left.ColorValue = ColorUtil.Lerp(UnityEngine.Color.black, left.ColorValue, (float)right);\r\n                    break;\r\n                case VariantType.LayerMask:\r\n                case VariantType.Numeric:\r\n                    left.DoubleValue *= right;\r\n                    break;\r\n                default:\r\n                    left.DoubleValue = left.DoubleValue * right;\r\n                    break;\r\n            }\r\n        }\r\n\r\n        private static void DoProduct(VariantReference left, VariantReference right)\r\n        {\r\n            Vector4 vl;\r\n            Vector4 vr;\r\n            switch(left.ValueType)\r\n            {\r\n                case VariantType.Integer:\r\n                case VariantType.Float:\r\n                case VariantType.Double:\r\n                    left.DoubleValue *= right.DoubleValue;\r\n                    break;\r\n                case VariantType.Vector2:\r\n                    vl = left.Vector2Value;\r\n                    switch(right.ValueType)\r\n                    {\r\n                        case VariantType.Integer:\r\n                        case VariantType.Float:\r\n                        case VariantType.Double:\r\n                            vl.x *= right.FloatValue;\r\n                            vl.y *= right.FloatValue;\r\n                            break;\r\n                        default:\r\n                            vr = right.Vector2Value;\r\n                            vl.x = vl.x * vr.x;\r\n                            vl.y = vl.y * vr.y;\r\n                            break;\r\n                    }\r\n                    left.Vector2Value = vl;\r\n                    break;\r\n                case VariantType.Vector3:\r\n                    vl = left.Vector3Value;\r\n                    vr = right.Vector3Value;\r\n                    switch (right.ValueType)\r\n                    {\r\n                        case VariantType.Integer:\r\n                        case VariantType.Float:\r\n                        case VariantType.Double:\r\n                            vl.x *= right.FloatValue;\r\n                            vl.y *= right.FloatValue;\r\n                            vl.z *= right.FloatValue;\r\n                            break;\r\n                        default:\r\n                            vr = right.Vector3Value;\r\n                            vl.x = vl.x * vr.x;\r\n                            vl.y = vl.y * vr.y;\r\n                            vl.z = vl.z * vr.z;\r\n                            break;\r\n                    }\r\n                    left.Vector3Value = vl;\r\n                    break;\r\n                case VariantType.Vector4:\r\n                    vl = left.Vector4Value;\r\n                    vr = right.Vector4Value;\r\n                    switch (right.ValueType)\r\n                    {\r\n                        case VariantType.Integer:\r\n                        case VariantType.Float:\r\n                        case VariantType.Double:\r\n                            vl.x *= right.FloatValue;\r\n                            vl.y *= right.FloatValue;\r\n                            vl.z *= right.FloatValue;\r\n                            vl.w *= right.FloatValue;\r\n                            break;\r\n                        default:\r\n                            vr = right.Vector4Value;\r\n                            vl.x = vl.x * vr.x;\r\n                            vl.y = vl.y * vr.y;\r\n                            vl.z = vl.z * vr.z;\r\n                            vl.w = vl.w * vr.w;\r\n                            break;\r\n                    }\r\n                    left.Vector4Value = vl;\r\n                    break;\r\n                case VariantType.Quaternion:\r\n                    switch (right.ValueType)\r\n                    {\r\n                        case VariantType.Vector2:\r\n                        case VariantType.Vector3:\r\n                            left.Vector3Value = left.QuaternionValue * right.Vector3Value;\r\n                            break;\r\n                        default:\r\n                            left.QuaternionValue = left.QuaternionValue * right.QuaternionValue;\r\n                            break;\r\n                    }\r\n                    break;\r\n                case VariantType.LayerMask:\r\n                    left.LayerMaskValue *= right.LayerMaskValue;\r\n                    break;\r\n                case VariantType.Numeric:\r\n                    left.DoubleValue *= right.DoubleValue;\r\n                    break;\r\n                default:\r\n                    left.DoubleValue = double.NaN;\r\n                    break;\r\n            }\r\n        }\r\n\r\n        private static void DoDivide(VariantReference left, VariantReference right)\r\n        {\r\n            Vector4 vl;\r\n            Vector4 vr;\r\n\r\n            switch (left.ValueType)\r\n            {\r\n                case VariantType.Integer:\r\n                case VariantType.Float:\r\n                case VariantType.Double:\r\n                    left.DoubleValue /= right.DoubleValue;\r\n                    break;\r\n                case VariantType.Vector2:\r\n                    vl = left.Vector2Value;\r\n                    switch (right.ValueType)\r\n                    {\r\n                        case VariantType.Integer:\r\n                        case VariantType.Float:\r\n                        case VariantType.Double:\r\n                            vl.x /= right.FloatValue;\r\n                            vl.y /= right.FloatValue;\r\n                            break;\r\n                        default:\r\n                            vr = right.Vector2Value;\r\n                            vl.x = vl.x / vr.x;\r\n                            vl.y = vl.y / vr.y;\r\n                            break;\r\n                    }\r\n                    left.Vector2Value = vl;\r\n                    break;\r\n                case VariantType.Vector3:\r\n                    vl = left.Vector3Value;\r\n                    switch (right.ValueType)\r\n                    {\r\n                        case VariantType.Integer:\r\n                        case VariantType.Float:\r\n                        case VariantType.Double:\r\n                            vl.x /= right.FloatValue;\r\n                            vl.y /= right.FloatValue;\r\n                            vl.z /= right.FloatValue;\r\n                            break;\r\n                        default:\r\n                            vr = right.Vector3Value;\r\n                            vl.x = vl.x / vr.x;\r\n                            vl.y = vl.y / vr.y;\r\n                            vl.z = vl.z / vr.z;\r\n                            break;\r\n                    }\r\n                    left.Vector3Value = vl;\r\n                    break;\r\n                case VariantType.Vector4:\r\n                    vl = left.Vector4Value;\r\n                    switch (right.ValueType)\r\n                    {\r\n                        case VariantType.Integer:\r\n                        case VariantType.Float:\r\n                        case VariantType.Double:\r\n                            vl.x /= right.FloatValue;\r\n                            vl.y /= right.FloatValue;\r\n                            vl.z /= right.FloatValue;\r\n                            vl.w /= right.FloatValue;\r\n                            break;\r\n                        default:\r\n                            vr = right.Vector4Value;\r\n                            vl.x = vl.x / vr.x;\r\n                            vl.y = vl.y / vr.y;\r\n                            vl.z = vl.z / vr.z;\r\n                            vl.w = vl.w / vr.w;\r\n                            break;\r\n                    }\r\n                    left.Vector4Value = vl;\r\n                    break;\r\n                case VariantType.Quaternion:\r\n                    left.QuaternionValue *= Quaternion.Inverse(right.QuaternionValue);\r\n                    break;\r\n                case VariantType.LayerMask:\r\n                    left.LayerMaskValue /= right.LayerMaskValue;\r\n                    break;\r\n                case VariantType.Numeric:\r\n                    left.DoubleValue /= right.DoubleValue;\r\n                    break;\r\n                default:\r\n                    left.DoubleValue = double.NaN;\r\n                    break;\r\n            }\r\n        }\r\n\r\n\r\n\r\n        private static bool TryEquals(VariantReference left, VariantReference right)\r\n        {\r\n            switch(left.ValueType)\r\n            {\r\n                case VariantType.Object:\r\n                    return left.ObjectValue == right.ObjectValue;\r\n                case VariantType.Null:\r\n                    return right.ValueType == VariantType.Null;\r\n                case VariantType.String:\r\n                    return left.StringValue == right.StringValue;\r\n                case VariantType.Boolean:\r\n                    return left.BoolValue == right.BoolValue;\r\n                case VariantType.Integer:\r\n                    if (right.ValueType == VariantType.Integer)\r\n                        return left.IntValue == right.IntValue;\r\n                    else\r\n                        return left.DoubleValue == right.DoubleValue;\r\n                case VariantType.Float:\r\n                    return left.FloatValue == right.FloatValue;\r\n                case VariantType.Double:\r\n                    return left.DoubleValue == right.DoubleValue;\r\n                case VariantType.Vector2:\r\n                    return left.Vector2Value == right.Vector2Value;\r\n                case VariantType.Vector3:\r\n                    return left.Vector3Value == right.Vector3Value;\r\n                case VariantType.Vector4:\r\n                    return left.Vector4Value == right.Vector4Value;\r\n                case VariantType.Quaternion:\r\n                    return left.QuaternionValue == right.QuaternionValue;\r\n                case VariantType.Color:\r\n                    return left.ColorValue == right.ColorValue;\r\n                case VariantType.DateTime:\r\n                    return left.DateValue == right.DateValue;\r\n                case VariantType.GameObject:\r\n                    return left.GameObjectValue == right.GameObjectValue;\r\n                case VariantType.Component:\r\n                    return left.ComponentValue == right.ComponentValue;\r\n                case VariantType.LayerMask:\r\n                    return left.LayerMaskValue == right.LayerMaskValue;\r\n                case VariantType.Rect:\r\n                    return left.RectValue == right.RectValue;\r\n                case VariantType.Numeric:\r\n                    return left.DoubleValue == right.DoubleValue;\r\n                default:\r\n                    return false;\r\n            }\r\n        }\r\n\r\n\r\n\r\n        public static object TrySum(object a, object b)\r\n        {\r\n            if (a == null) return b;\r\n            if (b == null) return a;\r\n\r\n            var atp = a.GetType();\r\n            if (ConvertUtil.IsNumericType(atp))\r\n            {\r\n                return ConvertUtil.ToPrim(ConvertUtil.ToDouble(a) + ConvertUtil.ToDouble(b), atp);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Vector2))\r\n            {\r\n                return ConvertUtil.ToVector2(a) + ConvertUtil.ToVector2(b);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Vector3))\r\n            {\r\n                return ConvertUtil.ToVector3(a) + ConvertUtil.ToVector3(b);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Vector4))\r\n            {\r\n                return ConvertUtil.ToVector4(a) + ConvertUtil.ToVector4(b);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Quaternion))\r\n            {\r\n                return ConvertUtil.ToQuaternion(a) * ConvertUtil.ToQuaternion(b);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Color))\r\n            {\r\n                return ConvertUtil.ToColor(a) + ConvertUtil.ToColor(b);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Color32))\r\n            {\r\n                return ConvertUtil.ToColor32(ConvertUtil.ToColor(a) + ConvertUtil.ToColor(b));\r\n            }\r\n            else\r\n            {\r\n                return b;\r\n            }\r\n        }\r\n\r\n        public static object TryDifference(object a, object b)\r\n        {\r\n            if (a == null) return b;\r\n            if (b == null) return a;\r\n\r\n            var atp = a.GetType();\r\n            if (ConvertUtil.IsNumericType(atp))\r\n            {\r\n                return ConvertUtil.ToPrim(ConvertUtil.ToDouble(a) - ConvertUtil.ToDouble(b), atp);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Vector2))\r\n            {\r\n                return ConvertUtil.ToVector2(a) - ConvertUtil.ToVector2(b);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Vector3))\r\n            {\r\n                return ConvertUtil.ToVector3(a) - ConvertUtil.ToVector3(b);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Vector4))\r\n            {\r\n                return ConvertUtil.ToVector4(a) - ConvertUtil.ToVector4(b);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Quaternion))\r\n            {\r\n                return ConvertUtil.ToQuaternion(a) * UnityEngine.Quaternion.Inverse(ConvertUtil.ToQuaternion(b));\r\n            }\r\n            else if (atp == typeof(UnityEngine.Color))\r\n            {\r\n                return ConvertUtil.ToColor(a) - ConvertUtil.ToColor(b);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Color32))\r\n            {\r\n                return ConvertUtil.ToColor32(ConvertUtil.ToColor(a) - ConvertUtil.ToColor(b));\r\n            }\r\n            else\r\n            {\r\n                return b;\r\n            }\r\n        }\r\n\r\n        public static object TryToggle(object value)\r\n        {\r\n            if (value == null) return null;\r\n\r\n            var tp = value.GetType();\r\n            if (ConvertUtil.IsNumericType(tp))\r\n            {\r\n                return ConvertUtil.ToPrim(ConvertUtil.ToDouble(value) * -1.0, tp);\r\n            }\r\n            else if (tp == typeof(UnityEngine.Vector2))\r\n            {\r\n                return ConvertUtil.ToVector2(value) * -1f;\r\n            }\r\n            else if (tp == typeof(UnityEngine.Vector3))\r\n            {\r\n                return ConvertUtil.ToVector3(value) * -1f;\r\n            }\r\n            else if (tp == typeof(UnityEngine.Vector4))\r\n            {\r\n                return ConvertUtil.ToVector4(value) * -1f;\r\n            }\r\n            else if (tp == typeof(UnityEngine.Quaternion))\r\n            {\r\n                return UnityEngine.Quaternion.Inverse(ConvertUtil.ToQuaternion(value));\r\n            }\r\n            else\r\n            {\r\n                return value;\r\n            }\r\n        }\r\n\r\n        public static object TryLerp(object a, object b, float t)\r\n        {\r\n            if (a == null) return b;\r\n            if (b == null) return a;\r\n\r\n            var atp = a.GetType();\r\n            if (ConvertUtil.IsNumericType(atp))\r\n            {\r\n                var x = ConvertUtil.ToDouble(a);\r\n                var y = ConvertUtil.ToDouble(b);\r\n                return ConvertUtil.ToPrim(t * (y - x) + x, atp);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Vector2))\r\n            {\r\n                return UnityEngine.Vector2.LerpUnclamped(ConvertUtil.ToVector2(a), ConvertUtil.ToVector2(b), t);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Vector3))\r\n            {\r\n                return UnityEngine.Vector3.LerpUnclamped(ConvertUtil.ToVector3(a), ConvertUtil.ToVector3(b), t);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Vector4))\r\n            {\r\n                return UnityEngine.Vector4.LerpUnclamped(ConvertUtil.ToVector4(a), ConvertUtil.ToVector4(b), t);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Quaternion))\r\n            {\r\n                return UnityEngine.Quaternion.LerpUnclamped(ConvertUtil.ToQuaternion(a), ConvertUtil.ToQuaternion(b), t);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Color))\r\n            {\r\n                return UnityEngine.Color.LerpUnclamped(ConvertUtil.ToColor(a), ConvertUtil.ToColor(b), t);\r\n            }\r\n            else if (atp == typeof(UnityEngine.Color32))\r\n            {\r\n                return UnityEngine.Color32.LerpUnclamped(ConvertUtil.ToColor32(a), ConvertUtil.ToColor32(b), t);\r\n            }\r\n            else\r\n            {\r\n                return (t < 0.5f) ? a : b;\r\n            }\r\n        }\r\n\r\n        public static bool WillArithmeticallyCompute(System.Type tp)\r\n        {\r\n            if (ConvertUtil.IsNumericType(tp)) return true;\r\n            if (tp == typeof(UnityEngine.Vector2)) return true;\r\n            if (tp == typeof(UnityEngine.Vector3)) return true;\r\n            if (tp == typeof(UnityEngine.Vector4)) return true;\r\n            if (tp == typeof(UnityEngine.Quaternion)) return true;\r\n            if (tp == typeof(Variant)) return true;\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/IDynamic.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Reflection;\r\nusing System.Globalization;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Dynamic\r\n{\r\n\r\n    public interface IDynamic\r\n    {\r\n        object this[string sMemberName] { get; set; }\r\n\r\n        bool SetValue(string sMemberName, object value, params object[] index);\r\n        object GetValue(string sMemberName, params object[] args);\r\n        bool TryGetValue(string sMemberName, out object result, params object[] args);\r\n        object InvokeMethod(string sMemberName, params object[] args);\r\n\r\n        bool HasMember(string sMemberName, bool includeNonPublic);\r\n        IEnumerable<string> GetMemberNames(bool includeNonPublic);\r\n        IEnumerable<MemberInfo> GetMembers(bool includeNonPublic);\r\n        MemberInfo GetMember(string sMemberName, bool includeNonPublic);\r\n        \r\n    }\r\n    \r\n    [System.Flags()]\r\n    public enum DynamicMemberAccess\r\n    {\r\n        Inaccessible = 0,\r\n        Read = 1,\r\n        Write = 2,\r\n        ReadWrite = 3\r\n    }\r\n\r\n    public static class DynamicUtil\r\n    {\r\n        \r\n        #region IDynamic Methods\r\n\r\n        public static bool SetValue(this object obj, string sprop, object value)\r\n        {\r\n            if (obj == null) return false;\r\n\r\n            if (obj is IDynamic)\r\n            {\r\n                try\r\n                {\r\n                    return (obj as IDynamic).SetValue(sprop, value, (object[])null);\r\n                }\r\n                catch\r\n                {\r\n\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return SetValueDirect(obj, sprop, value, (object[])null);\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool SetValue(this object obj, string sprop, object value, params object[] index)\r\n        {\r\n            if (obj == null) return false;\r\n\r\n            if (obj is IDynamic)\r\n            {\r\n                try\r\n                {\r\n                    return (obj as IDynamic).SetValue(sprop, value, index);\r\n                }\r\n                catch\r\n                {\r\n\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return SetValueDirect(obj, sprop, value, index);\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool SetValue(this object obj, MemberInfo member, object value)\r\n        {\r\n            if (obj == null) return false;\r\n\r\n            return SetValueDirect(obj, member, value, (object[])null);\r\n        }\r\n\r\n        public static bool SetValue(this object obj, MemberInfo member, object value, params object[] index)\r\n        {\r\n            if (obj == null) return false;\r\n\r\n            return SetValueDirect(obj, member, value, index);\r\n        }\r\n\r\n        public static object GetValue(this object obj, string sprop, params object[] args)\r\n        {\r\n            if (obj == null) return null;\r\n\r\n            if (obj is IDynamic)\r\n            {\r\n                try\r\n                {\r\n                    return (obj as IDynamic).GetValue(sprop, args);\r\n                }\r\n                catch\r\n                {\r\n\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return GetValueDirect(obj, sprop, args);\r\n            }\r\n            return null;\r\n        }\r\n\r\n        public static object GetValue(this object obj, MemberInfo member, params object[] args)\r\n        {\r\n            if (obj == null) return null;\r\n\r\n            if (obj is IDynamic)\r\n            {\r\n                try\r\n                {\r\n                    return (obj as IDynamic).GetValue(member.Name, args);\r\n                }\r\n                catch\r\n                {\r\n\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return GetValueDirect(obj, member, args);\r\n            }\r\n            return null;\r\n        }\r\n\r\n        public static bool TryGetValue(this object obj, string sMemberName, out object result, params object[] args)\r\n        {\r\n            if(obj == null)\r\n            {\r\n                result = null;\r\n                return false;\r\n            }\r\n\r\n            if(obj is IDynamic)\r\n            {\r\n                try\r\n                {\r\n                    return (obj as IDynamic).TryGetValue(sMemberName, out result, args);\r\n                }\r\n                catch\r\n                {\r\n                    result = null;\r\n                    return false;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return TryGetValueDirect(obj, sMemberName, out result, args);\r\n            }\r\n        }\r\n\r\n        public static object InvokeMethod(this object obj, string name, params object[] args)\r\n        {\r\n            if (obj == null) return false;\r\n\r\n            if(obj is IDynamic)\r\n            {\r\n                try\r\n                {\r\n                    return (obj as IDynamic).InvokeMethod(name, args);\r\n                }\r\n                catch\r\n                {\r\n\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return InvokeMethodDirect(obj, name, args);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static bool HasMember(object obj, string name, bool includeNonPublic)\r\n        {\r\n            if (obj == null) return false;\r\n\r\n            if (obj is IDynamic)\r\n            {\r\n                return (obj as IDynamic).HasMember(name, includeNonPublic);\r\n            }\r\n            else\r\n            {\r\n                return TypeHasMember(obj.GetType(), name, includeNonPublic);\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<MemberInfo> GetMembers(object obj, bool includeNonPublic)\r\n        {\r\n            if (obj == null) return Enumerable.Empty<MemberInfo>();\r\n\r\n            if (obj is IDynamic)\r\n            {\r\n                return (obj as IDynamic).GetMembers(includeNonPublic);\r\n            }\r\n            else\r\n            {\r\n                return GetMembersFromType(obj.GetType(), includeNonPublic);\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<MemberInfo> GetMembers(object obj, bool includeNonPublic, MemberTypes mask)\r\n        {\r\n            if (obj == null) return Enumerable.Empty<MemberInfo>();\r\n\r\n            if (obj is IDynamic)\r\n            {\r\n                return FilterMembers((obj as IDynamic).GetMembers(includeNonPublic), mask);\r\n            }\r\n            else\r\n            {\r\n                return GetMembersFromType(obj.GetType(), includeNonPublic, mask);\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<string> GetMemberNames(object obj, bool includeNonPublic)\r\n        {\r\n            if (obj == null) return Enumerable.Empty<string>();\r\n\r\n            if (obj is IDynamic)\r\n            {\r\n                return (obj as IDynamic).GetMemberNames(includeNonPublic);\r\n            }\r\n            else\r\n            {\r\n                return GetMemberNamesFromType(obj.GetType(), includeNonPublic);\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<string> GetMemberNames(object obj, bool includeNonPublic, MemberTypes mask)\r\n        {\r\n            if (obj == null) return Enumerable.Empty<string>();\r\n\r\n            if (obj is IDynamic)\r\n            {\r\n                return (from m in (obj as IDynamic).GetMembers(includeNonPublic) where (m.MemberType & mask) != 0 select m.Name);\r\n            }\r\n            else\r\n            {\r\n                return GetMemberNamesFromType(obj.GetType(), includeNonPublic, mask);\r\n            }\r\n        }\r\n\r\n        public static MemberInfo GetMember(object obj, string sMemberName, bool includeNonPublic)\r\n        {\r\n            if(obj == null) return null;\r\n\r\n            if(obj is IDynamic)\r\n            {\r\n                return (obj as IDynamic).GetMember(sMemberName, includeNonPublic);\r\n            }\r\n            else\r\n            {\r\n                return GetMemberFromType(obj.GetType(), sMemberName, includeNonPublic);\r\n            }\r\n        }\r\n        \r\n\r\n        public static object GetValueRecursively(this object obj, string sprop)\r\n        {\r\n            if(obj is IDynamic)\r\n            {\r\n                return GetValue(obj, sprop);\r\n            }\r\n\r\n            if (sprop.Contains('.')) obj = DynamicUtil.ReduceSubObject(obj, sprop, out sprop);\r\n            return GetValue(obj, sprop);\r\n        }\r\n\r\n        public static bool SetValueRecursively(this object obj, string sprop, object value)\r\n        {\r\n            if (obj is IDynamic)\r\n            {\r\n                return SetValue(obj, sprop, value);\r\n            }\r\n\r\n            if (sprop.Contains('.')) obj = DynamicUtil.ReduceSubObject(obj, sprop, out sprop);\r\n            return SetValue(obj, sprop, value);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Direct Reflection\r\n\r\n        public static bool SetValueDirect(object obj, string sprop, object value)\r\n        {\r\n            return SetValueDirect(obj, sprop, value, (object[])null);\r\n        }\r\n\r\n        public static bool SetValueDirect(object obj, string sprop, object value, params object[] index)\r\n        {\r\n            if (string.IsNullOrEmpty(sprop)) return false;\r\n\r\n            //if (sprop != null && sprop.Contains('.')) obj = DynamicUtil.ReduceSubObject(obj, sprop, out sprop);\r\n            if (obj == null) return false;\r\n\r\n            try\r\n            {\r\n                var vtp = (value != null) ? value.GetType() : null;\r\n                var member = GetValueSetterMemberFromType(obj.GetType(), sprop, vtp, true);\r\n                if (member != null)\r\n                {\r\n                    switch (member.MemberType)\r\n                    {\r\n                        case MemberTypes.Field:\r\n                            (member as FieldInfo).SetValue(obj, value);\r\n                            return true;\r\n                        case MemberTypes.Property:\r\n                            (member as PropertyInfo).SetValue(obj, value, index);\r\n                            return true;\r\n                        case MemberTypes.Method:\r\n                            var arr = ArrayUtil.Temp(value);\r\n                            (member as MethodInfo).Invoke(obj, arr);\r\n                            ArrayUtil.ReleaseTemp(arr);\r\n                            return true;\r\n                    }\r\n                }\r\n\r\n                if(vtp != null)\r\n                {\r\n                    member = GetValueSetterMemberFromType(obj.GetType(), sprop, null, true);\r\n                    if (member != null)\r\n                    {\r\n                        var rtp = GetReturnType(member);\r\n                        object cobj = null;\r\n                        if (ConvertUtil.TryToPrim(value, rtp, out cobj))\r\n                            value = cobj;\r\n\r\n                        switch (member.MemberType)\r\n                        {\r\n                            case MemberTypes.Field:\r\n                                (member as FieldInfo).SetValue(obj, value);\r\n                                return true;\r\n                            case MemberTypes.Property:\r\n                                (member as PropertyInfo).SetValue(obj, value, index);\r\n                                return true;\r\n                            case MemberTypes.Method:\r\n                                var arr = ArrayUtil.Temp(value);\r\n                                (member as MethodInfo).Invoke(obj, arr);\r\n                                ArrayUtil.ReleaseTemp(arr);\r\n                                return true;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            catch\r\n            {\r\n\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool SetValueDirect(object obj, MemberInfo member, object value)\r\n        {\r\n            return SetValueDirect(obj, member, value, (object[])null);\r\n        }\r\n\r\n        public static bool SetValueDirect(object obj, MemberInfo member, object value, params object[] index)\r\n        {\r\n            if (obj == null) return false;\r\n\r\n            if (member == null) return false;\r\n\r\n            try\r\n            {\r\n                switch (member.MemberType)\r\n                {\r\n                    case MemberTypes.Field:\r\n                        (member as FieldInfo).SetValue(obj, value);\r\n                        return true;\r\n                    case MemberTypes.Property:\r\n                        if ((member as PropertyInfo).CanWrite)\r\n                        {\r\n                            (member as PropertyInfo).SetValue(obj, value, index);\r\n                            return true;\r\n                        }\r\n                        else\r\n                            return false;\r\n                    case MemberTypes.Method:\r\n                        var arr = ArrayUtil.Temp(value);\r\n                        (member as MethodInfo).Invoke(obj, arr);\r\n                        ArrayUtil.ReleaseTemp(arr);\r\n                        return true;\r\n                }\r\n            }\r\n            catch\r\n            {\r\n\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static object GetValueDirect(object obj, string sprop, params object[] args)\r\n        {\r\n            if (string.IsNullOrEmpty(sprop)) return null;\r\n\r\n            //if (sprop != null && sprop.Contains('.')) obj = DynamicUtil.ReduceSubObject(obj, sprop, out sprop);\r\n            if (obj == null) return null;\r\n\r\n            try\r\n            {\r\n                var tp = obj.GetType();\r\n                foreach(var member in GetMembersFromType(tp, sprop, true))\r\n                {\r\n                    switch (member.MemberType)\r\n                    {\r\n                        case System.Reflection.MemberTypes.Field:\r\n                            var field = member as System.Reflection.FieldInfo;\r\n                            return field.GetValue(obj);\r\n\r\n                        case System.Reflection.MemberTypes.Property:\r\n                            {\r\n                                var prop = member as System.Reflection.PropertyInfo;\r\n                                var paramInfos = prop.GetIndexParameters();\r\n                                if (prop.CanRead && DynamicUtil.ParameterSignatureMatches(args, paramInfos, false))\r\n                                {\r\n                                    return prop.GetValue(obj, args);\r\n                                }\r\n                                break;\r\n                            }\r\n                        case System.Reflection.MemberTypes.Method:\r\n                            {\r\n                                var meth = member as System.Reflection.MethodInfo;\r\n                                var paramInfos = meth.GetParameters();\r\n                                if (DynamicUtil.ParameterSignatureMatches(args, paramInfos, false))\r\n                                {\r\n                                    return meth.Invoke(obj, args);\r\n                                }\r\n                                break;\r\n                            }\r\n                    }\r\n                }\r\n\r\n                //unstrict\r\n                foreach (var member in GetMembersFromType(tp, sprop, true))\r\n                {\r\n                    switch (member.MemberType)\r\n                    {\r\n                        case System.Reflection.MemberTypes.Field:\r\n                            var field = member as System.Reflection.FieldInfo;\r\n                            return field.GetValue(obj);\r\n\r\n                        case System.Reflection.MemberTypes.Property:\r\n                            {\r\n                                var prop = member as System.Reflection.PropertyInfo;\r\n                                var paramInfos = prop.GetIndexParameters();\r\n                                if (prop.CanRead && DynamicUtil.ParameterSignatureMatchesNumericallyUnstrict(args, paramInfos, false, true))\r\n                                {\r\n                                    return prop.GetValue(obj, args);\r\n                                }\r\n                                break;\r\n                            }\r\n                        case System.Reflection.MemberTypes.Method:\r\n                            {\r\n                                var meth = member as System.Reflection.MethodInfo;\r\n                                var paramInfos = meth.GetParameters();\r\n                                if (DynamicUtil.ParameterSignatureMatchesNumericallyUnstrict(args, paramInfos, false, true))\r\n                                {\r\n                                    return meth.Invoke(obj, args);\r\n                                }\r\n                                break;\r\n                            }\r\n                    }\r\n                }\r\n            }\r\n            catch\r\n            {\r\n\r\n            }\r\n\r\n            return null;\r\n\r\n            /*\r\n            const BindingFlags BINDING = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;\r\n            if (string.IsNullOrEmpty(sprop)) return null;\r\n\r\n            //if (sprop != null && sprop.Contains('.')) obj = DynamicUtil.ReduceSubObject(obj, sprop, out sprop);\r\n            if (obj == null) return null;\r\n\r\n            try\r\n            {\r\n                var tp = obj.GetType();\r\n\r\n                while (tp != null)\r\n                {\r\n                    var members = tp.GetMember(sprop, BINDING);\r\n                    if (members == null || members.Length == 0) return null;\r\n\r\n                    foreach (var member in members)\r\n                    {\r\n                        switch (member.MemberType)\r\n                        {\r\n                            case System.Reflection.MemberTypes.Field:\r\n                                var field = member as System.Reflection.FieldInfo;\r\n                                return field.GetValue(obj);\r\n\r\n                            case System.Reflection.MemberTypes.Property:\r\n                                {\r\n                                    var prop = member as System.Reflection.PropertyInfo;\r\n                                    var paramInfos = prop.GetIndexParameters();\r\n                                    if (prop.CanRead && DynamicUtil.ParameterSignatureMatches(args, paramInfos, false))\r\n                                    {\r\n                                        return prop.GetValue(obj, args);\r\n                                    }\r\n                                    break;\r\n                                }\r\n                            case System.Reflection.MemberTypes.Method:\r\n                                {\r\n                                    var meth = member as System.Reflection.MethodInfo;\r\n                                    var paramInfos = meth.GetParameters();\r\n                                    if (DynamicUtil.ParameterSignatureMatches(args, paramInfos, false))\r\n                                    {\r\n                                        return meth.Invoke(obj, args);\r\n                                    }\r\n                                    break;\r\n                                }\r\n                        }\r\n                    }\r\n\r\n                    tp = tp.BaseType;\r\n                }\r\n            }\r\n            catch\r\n            {\r\n\r\n            }\r\n            return null;\r\n            */\r\n        }\r\n\r\n        public static object GetValueDirect(this object obj, MemberInfo member, params object[] args)\r\n        {\r\n            switch (member.MemberType)\r\n            {\r\n                case System.Reflection.MemberTypes.Field:\r\n                    var field = member as System.Reflection.FieldInfo;\r\n                    return field.GetValue(obj);\r\n\r\n                case System.Reflection.MemberTypes.Property:\r\n                    {\r\n                        var prop = member as System.Reflection.PropertyInfo;\r\n                        var paramInfos = prop.GetIndexParameters();\r\n                        if (prop.CanRead && DynamicUtil.ParameterSignatureMatches(args, paramInfos, false))\r\n                        {\r\n                            return prop.GetValue(obj, args);\r\n                        }\r\n                        break;\r\n                    }\r\n                case System.Reflection.MemberTypes.Method:\r\n                    {\r\n                        var meth = member as System.Reflection.MethodInfo;\r\n                        var paramInfos = meth.GetParameters();\r\n                        if (DynamicUtil.ParameterSignatureMatches(args, paramInfos, false))\r\n                        {\r\n                            return meth.Invoke(obj, args);\r\n                        }\r\n                        break;\r\n                    }\r\n            }\r\n\r\n            //unstrict\r\n            switch (member.MemberType)\r\n            {\r\n                case System.Reflection.MemberTypes.Field:\r\n                    var field = member as System.Reflection.FieldInfo;\r\n                    return field.GetValue(obj);\r\n\r\n                case System.Reflection.MemberTypes.Property:\r\n                    {\r\n                        var prop = member as System.Reflection.PropertyInfo;\r\n                        var paramInfos = prop.GetIndexParameters();\r\n                        if (prop.CanRead && DynamicUtil.ParameterSignatureMatchesNumericallyUnstrict(args, paramInfos, false, true))\r\n                        {\r\n                            return prop.GetValue(obj, args);\r\n                        }\r\n                        break;\r\n                    }\r\n                case System.Reflection.MemberTypes.Method:\r\n                    {\r\n                        var meth = member as System.Reflection.MethodInfo;\r\n                        var paramInfos = meth.GetParameters();\r\n                        if (DynamicUtil.ParameterSignatureMatchesNumericallyUnstrict(args, paramInfos, false, true))\r\n                        {\r\n                            return meth.Invoke(obj, args);\r\n                        }\r\n                        break;\r\n                    }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static bool TryGetValueDirect(object obj, string sprop, out object result, params object[] args)\r\n        {\r\n            result = null;\r\n            if (string.IsNullOrEmpty(sprop)) return false;\r\n\r\n            //if (sprop != null && sprop.Contains('.')) obj = DynamicUtil.ReduceSubObject(obj, sprop, out sprop);\r\n            if (obj == null) return false;\r\n\r\n            try\r\n            {\r\n                var tp = obj.GetType();\r\n                foreach (var member in GetMembersFromType(tp, sprop, true))\r\n                {\r\n                    switch (member.MemberType)\r\n                    {\r\n                        case System.Reflection.MemberTypes.Field:\r\n                            var field = member as System.Reflection.FieldInfo;\r\n                            result = field.GetValue(obj);\r\n                            return true;\r\n                        case System.Reflection.MemberTypes.Property:\r\n                            {\r\n                                var prop = member as System.Reflection.PropertyInfo;\r\n                                var paramInfos = prop.GetIndexParameters();\r\n                                if (prop.CanRead && DynamicUtil.ParameterSignatureMatches(args, paramInfos, false))\r\n                                {\r\n                                    result = prop.GetValue(obj, args);\r\n                                    return true;\r\n                                }\r\n                                break;\r\n                            }\r\n                        case System.Reflection.MemberTypes.Method:\r\n                            {\r\n                                var meth = member as System.Reflection.MethodInfo;\r\n                                var paramInfos = meth.GetParameters();\r\n                                if (DynamicUtil.ParameterSignatureMatches(args, paramInfos, false))\r\n                                {\r\n                                    result = meth.Invoke(obj, args);\r\n                                    return true;\r\n                                }\r\n                                break;\r\n                            }\r\n                    }\r\n                }\r\n\r\n                //unstrict\r\n                foreach (var member in GetMembersFromType(tp, sprop, true))\r\n                {\r\n                    switch (member.MemberType)\r\n                    {\r\n                        case System.Reflection.MemberTypes.Field:\r\n                            var field = member as System.Reflection.FieldInfo;\r\n                            result = field.GetValue(obj);\r\n                            return true;\r\n                        case System.Reflection.MemberTypes.Property:\r\n                            {\r\n                                var prop = member as System.Reflection.PropertyInfo;\r\n                                var paramInfos = prop.GetIndexParameters();\r\n                                if (prop.CanRead && DynamicUtil.ParameterSignatureMatchesNumericallyUnstrict(args, paramInfos, false, true))\r\n                                {\r\n                                    result = prop.GetValue(obj, args);\r\n                                    return true;\r\n                                }\r\n                                break;\r\n                            }\r\n                        case System.Reflection.MemberTypes.Method:\r\n                            {\r\n                                var meth = member as System.Reflection.MethodInfo;\r\n                                var paramInfos = meth.GetParameters();\r\n                                if (DynamicUtil.ParameterSignatureMatchesNumericallyUnstrict(args, paramInfos, false, true))\r\n                                {\r\n                                    result = meth.Invoke(obj, args);\r\n                                    return true;\r\n                                }\r\n                                break;\r\n                            }\r\n                    }\r\n                }\r\n            }\r\n            catch\r\n            {\r\n\r\n            }\r\n\r\n            return false;\r\n\r\n            /*\r\n            const BindingFlags BINDING = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;\r\n            result = null;\r\n            if (string.IsNullOrEmpty(sprop)) return false;\r\n\r\n            //if (sprop.Contains('.'))\r\n            //    obj = DynamicUtil.ReduceSubObject(obj, sprop, out sprop);\r\n            if (obj == null) return false;\r\n\r\n            try\r\n            {\r\n                var tp = obj.GetType();\r\n\r\n                while (tp != null)\r\n                {\r\n                    var members = tp.GetMember(sprop, BINDING);\r\n                    if (members == null || members.Length == 0) return false;\r\n\r\n                    foreach (var member in members)\r\n                    {\r\n                        switch (member.MemberType)\r\n                        {\r\n                            case System.Reflection.MemberTypes.Field:\r\n                                var field = member as System.Reflection.FieldInfo;\r\n                                result = field.GetValue(obj);\r\n                                return true;\r\n\r\n                            case System.Reflection.MemberTypes.Property:\r\n                                {\r\n                                    var prop = member as System.Reflection.PropertyInfo;\r\n                                    var paramInfos = prop.GetIndexParameters();\r\n                                    if (prop.CanRead && DynamicUtil.ParameterSignatureMatches(args, paramInfos, false))\r\n                                    {\r\n                                        result = prop.GetValue(obj, args);\r\n                                        return true;\r\n                                    }\r\n                                    break;\r\n                                }\r\n                            case System.Reflection.MemberTypes.Method:\r\n                                {\r\n                                    var meth = member as System.Reflection.MethodInfo;\r\n                                    var paramInfos = meth.GetParameters();\r\n                                    if (DynamicUtil.ParameterSignatureMatches(args, paramInfos, false))\r\n                                    {\r\n                                        result = meth.Invoke(obj, args);\r\n                                        return true;\r\n                                    }\r\n                                    break;\r\n                                }\r\n                        }\r\n                    }\r\n\r\n                    tp = tp.BaseType;\r\n                }\r\n            }\r\n            catch\r\n            {\r\n\r\n            }\r\n            return false;\r\n            */\r\n        }\r\n        \r\n        public static object InvokeMethodDirect(object obj, string name, params object[] args)\r\n        {\r\n            const BindingFlags BINDING = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance |\r\n                                         BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding;\r\n            if (string.IsNullOrEmpty(name)) return null;\r\n            //if (name.Contains('.'))\r\n            //    obj = DynamicUtil.ReduceSubObject(obj, name, out name);\r\n            if (obj == null) return false;\r\n\r\n            var tp = obj.GetType();\r\n            try\r\n            {\r\n                //return tp.InvokeMember(name, BINDING, System.Type.DefaultBinder, obj, args);\r\n\r\n                var methods = DynamicUtil.GetMembersFromType(obj.GetType(), true, MemberTypes.Method).OfType<MethodBase>().Where(m => m.Name == name).ToArray();\r\n                object state;\r\n                var method = DynamicBinder.Default.BindToMethod(BINDING, methods, ref args, null, CultureInfo.CurrentCulture, null, out state);\r\n                if (method != null)\r\n                {\r\n                    return method.Invoke(obj, args);\r\n                }\r\n            }\r\n            catch\r\n            {\r\n            }\r\n\r\n            return null;\r\n        }\r\n        \r\n        public static bool HasMemberDirect(object obj, string name, bool includeNonPublic)\r\n        {\r\n            if (obj == null) return false;\r\n            if (string.IsNullOrEmpty(name)) return false;\r\n            \r\n            return TypeHasMember(obj.GetType(), name, includeNonPublic);\r\n        }\r\n        \r\n        public static IEnumerable<MemberInfo> GetMembersDirect(object obj, bool includeNonPublic, MemberTypes mask = MemberTypes.Field | MemberTypes.Property | MemberTypes.Method)\r\n        {\r\n            if (obj == null) return Enumerable.Empty<MemberInfo>();\r\n\r\n            return GetMembersFromType(obj.GetType(), includeNonPublic, mask);\r\n        }\r\n\r\n        public static IEnumerable<MemberInfo> GetMembersDirect(object obj, string name, bool includeNonPublic, MemberTypes mask = MemberTypes.Field | MemberTypes.Property | MemberTypes.Method)\r\n        {\r\n            if (obj == null) return Enumerable.Empty<MemberInfo>();\r\n\r\n            return GetMembersFromType(obj.GetType(), name, includeNonPublic, mask);\r\n        }\r\n\r\n        public static IEnumerable<MemberInfo> GetMemberNamesDirect(object obj, bool includeNonPublic, MemberTypes mask = MemberTypes.Field | MemberTypes.Property | MemberTypes.Method)\r\n        {\r\n            if (obj == null) return Enumerable.Empty<MemberInfo>();\r\n\r\n            return GetMembersFromType(obj.GetType(), includeNonPublic, mask);\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n        public static bool TypeHasMember(System.Type tp, string name, bool includeNonPublic)\r\n        {\r\n            const BindingFlags BINDING = BindingFlags.Public | BindingFlags.Instance;\r\n            const BindingFlags PRIV_BINDING = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly;\r\n\r\n            //if (name.Contains('.'))\r\n            //    tp = DynamicUtil.ReduceSubType(tp, name, includeNonPublic, out name);\r\n            if (tp == null) return false;\r\n\r\n            var member = tp.GetMember(name, BINDING);\r\n            if (member != null && member.Length > 0) return true;\r\n\r\n            if(includeNonPublic)\r\n            {\r\n                while (tp != null)\r\n                {\r\n                    member = tp.GetMember(name, PRIV_BINDING);\r\n                    if (member != null && member.Length > 0) return true;\r\n                    tp = tp.BaseType;\r\n                }\r\n            }\r\n            return false;\r\n        }\r\n        \r\n        public static IEnumerable<MemberInfo> GetMembersFromType(System.Type tp, bool includeNonPublic, MemberTypes mask = MemberTypes.Field | MemberTypes.Property | MemberTypes.Method)\r\n        {\r\n            const BindingFlags BINDING = BindingFlags.Public | BindingFlags.Instance;\r\n            const BindingFlags PRIV_BINDING = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly;\r\n            if (tp == null) yield break;\r\n\r\n            foreach (var m in tp.GetMembers(BINDING))\r\n            {\r\n                if ((m.MemberType & mask) != 0)\r\n                {\r\n                    yield return m;\r\n                }\r\n            }\r\n\r\n            if (includeNonPublic)\r\n            {\r\n                while (tp != null)\r\n                {\r\n                    foreach (var m in tp.GetMembers(PRIV_BINDING))\r\n                    {\r\n                        if ((m.MemberType & mask) != 0)\r\n                        {\r\n                            yield return m;\r\n                        }\r\n                    }\r\n                    tp = tp.BaseType;\r\n                }\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<MemberInfo> GetMembersFromType(System.Type tp, string name, bool includeNonPublic, MemberTypes mask = MemberTypes.Field | MemberTypes.Property | MemberTypes.Method)\r\n        {\r\n            const BindingFlags BINDING = BindingFlags.Public | BindingFlags.Instance;\r\n            const BindingFlags PRIV_BINDING = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly;\r\n            if (tp == null) yield break;\r\n\r\n            foreach (var m in tp.GetMember(name, BINDING))\r\n            {\r\n                if ((m.MemberType & mask) != 0)\r\n                {\r\n                    yield return m;\r\n                }\r\n            }\r\n\r\n            if (includeNonPublic)\r\n            {\r\n                while (tp != null)\r\n                {\r\n                    foreach (var m in tp.GetMember(name, PRIV_BINDING))\r\n                    {\r\n                        if ((m.MemberType & mask) != 0)\r\n                        {\r\n                            yield return m;\r\n                        }\r\n                    }\r\n                    tp = tp.BaseType;\r\n                }\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<string> GetMemberNamesFromType(System.Type tp, bool includeNonPublic, MemberTypes mask = MemberTypes.Field | MemberTypes.Property | MemberTypes.Method)\r\n        {\r\n            const BindingFlags BINDING = BindingFlags.Public | BindingFlags.Instance;\r\n            const BindingFlags PRIV_BINDING = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly;\r\n            if (tp == null) yield break;\r\n\r\n            foreach (var m in tp.GetMembers(BINDING))\r\n            {\r\n                if ((m.MemberType & mask) != 0)\r\n                {\r\n                    yield return m.Name;\r\n                }\r\n            }\r\n\r\n            if (includeNonPublic)\r\n            {\r\n                while (tp != null)\r\n                {\r\n                    foreach (var m in tp.GetMembers(PRIV_BINDING))\r\n                    {\r\n                        if ((m.MemberType & mask) != 0)\r\n                        {\r\n                            yield return m.Name;\r\n                        }\r\n                    }\r\n                    tp = tp.BaseType;\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n\r\n        public static MemberInfo GetMemberFromType(Type tp, string sMemberName, bool includeNonPublic, MemberTypes mask = MemberTypes.Field | MemberTypes.Property | MemberTypes.Method)\r\n        {\r\n            const BindingFlags BINDING_PUBLIC = BindingFlags.Public | BindingFlags.Instance;\r\n            const BindingFlags PRIV_BINDING = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly;\r\n            if (tp == null) throw new ArgumentNullException(\"tp\");\r\n\r\n            //if (sMemberName.Contains('.'))\r\n            //{\r\n            //    tp = DynamicUtil.ReduceSubType(tp, sMemberName, includeNonPublic, out sMemberName);\r\n            //    if (tp == null) return null;\r\n            //}\r\n\r\n            try\r\n            {\r\n                MemberInfo[] members;\r\n\r\n                members = tp.GetMember(sMemberName, BINDING_PUBLIC);\r\n                foreach(var member in members)\r\n                {\r\n                    if ((member.MemberType & mask) != 0) return member;\r\n                }\r\n\r\n                while (includeNonPublic && tp != null)\r\n                {\r\n                    members = tp.GetMember(sMemberName, PRIV_BINDING);\r\n                    tp = tp.BaseType;\r\n                    if (members == null || members.Length == 0) continue;\r\n\r\n                    foreach (var member in members)\r\n                    {\r\n                        if ((member.MemberType & mask) != 0) return member;\r\n                    }\r\n                }\r\n            }\r\n            catch\r\n            {\r\n\r\n            }\r\n            return null;\r\n        }\r\n        \r\n        public static MemberInfo GetValueMemberFromType(Type tp, string sprop, bool includeNonPublic)\r\n        {\r\n            const BindingFlags BINDING_PUBLIC = BindingFlags.Public | BindingFlags.Instance;\r\n            const BindingFlags PRIV_BINDING = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly;\r\n            if (tp == null) throw new ArgumentNullException(\"tp\");\r\n\r\n            //if (sprop.Contains('.'))\r\n            //{\r\n            //    tp = DynamicUtil.ReduceSubType(tp, sprop, includeNonPublic, out sprop);\r\n            //    if (tp == null) return null;\r\n            //}\r\n\r\n            try\r\n            {\r\n                MemberInfo[] members;\r\n\r\n                members = tp.GetMember(sprop, BINDING_PUBLIC);\r\n                foreach (var member in members)\r\n                {\r\n                    if (IsValidValueMember(member)) return member;\r\n                }\r\n\r\n                while (includeNonPublic && tp != null)\r\n                {\r\n                    members = tp.GetMember(sprop, PRIV_BINDING);\r\n                    tp = tp.BaseType;\r\n                    if (members == null || members.Length == 0) continue;\r\n\r\n                    foreach (var member in members)\r\n                    {\r\n                        if (IsValidValueMember(member)) return member;\r\n                    }\r\n                }\r\n            }\r\n            catch\r\n            {\r\n\r\n            }\r\n            return null;\r\n        }\r\n\r\n        public static MemberInfo GetValueSetterMemberFromType(Type tp, string sprop, Type valueType, bool includeNonPublic)\r\n        {\r\n            const BindingFlags BINDING_PUBLIC = BindingFlags.Public | BindingFlags.Instance;\r\n            const BindingFlags PRIV_BINDING = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly;\r\n            if (tp == null) throw new ArgumentNullException(\"tp\");\r\n\r\n            //if (sprop.Contains('.'))\r\n            //{\r\n            //    tp = DynamicUtil.ReduceSubType(tp, sprop, includeNonPublic, out sprop);\r\n            //    if (tp == null) return null;\r\n            //}\r\n\r\n            try\r\n            {\r\n                System.Type ltp;\r\n                MemberInfo[] members;\r\n\r\n                //first strict test\r\n                members = tp.GetMember(sprop, BINDING_PUBLIC);\r\n                foreach (var member in members)\r\n                {\r\n                    if (IsValidValueSetterMember(member, valueType)) return member;\r\n                }\r\n\r\n                ltp = tp;\r\n                while (includeNonPublic && ltp != null)\r\n                {\r\n                    members = ltp.GetMember(sprop, PRIV_BINDING);\r\n                    ltp = ltp.BaseType;\r\n                    if (members == null || members.Length == 0) continue;\r\n\r\n                    foreach (var member in members)\r\n                    {\r\n                        if (IsValidValueSetterMember(member, valueType)) return member;\r\n                    }\r\n                }\r\n            }\r\n            catch\r\n            {\r\n\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n\r\n\r\n        [System.Obsolete(\"Poorly named method and return type. Use GetDynamicParameterInfo instead.\")]\r\n        public static System.Type[] GetParameters(MemberInfo info)\r\n        {\r\n            switch(info.MemberType)\r\n            {\r\n                case MemberTypes.Field:\r\n                    return new System.Type[] { (info as FieldInfo).FieldType };\r\n                case MemberTypes.Property:\r\n                    return new System.Type[] { (info as PropertyInfo).PropertyType };\r\n                case MemberTypes.Method:\r\n                    {\r\n                        var paramInfos = (info as MethodBase).GetParameters();\r\n                        Type[] arr = new Type[paramInfos.Length];\r\n                        for(int i = 0; i < arr.Length; i++)\r\n                        {\r\n                            arr[i] = paramInfos[i].ParameterType;\r\n                        }\r\n                        return arr;\r\n                    }\r\n                default:\r\n                    return ArrayUtil.Empty<System.Type>();\r\n            }\r\n        }\r\n\r\n        public static DynamicParameterInfo[] GetDynamicParameterInfo(MemberInfo info)\r\n        {\r\n            switch (info.MemberType)\r\n            {\r\n                case MemberTypes.Field:\r\n                    return new DynamicParameterInfo[] { new DynamicParameterInfo(info, info.Name, (info as FieldInfo).FieldType) };\r\n                case MemberTypes.Property:\r\n                    return new DynamicParameterInfo[] { new DynamicParameterInfo(info, info.Name, (info as PropertyInfo).PropertyType) };\r\n                case MemberTypes.Method:\r\n                    {\r\n                        var paramInfos = (info as MethodBase).GetParameters();\r\n                        DynamicParameterInfo[] arr = new DynamicParameterInfo[paramInfos.Length];\r\n                        for (int i = 0; i < arr.Length; i++)\r\n                        {\r\n                            arr[i] = new DynamicParameterInfo( paramInfos[i]);\r\n                        }\r\n                        return arr;\r\n                    }\r\n                default:\r\n                    return ArrayUtil.Empty<DynamicParameterInfo>();\r\n            }\r\n        }\r\n\r\n        public static Type GetReturnType(MemberInfo info)\r\n        {\r\n            if (info == null) return null;\r\n\r\n            switch (info.MemberType)\r\n            {\r\n                case MemberTypes.Field:\r\n                    return (info as FieldInfo).FieldType;\r\n                case MemberTypes.Property:\r\n                    return (info as PropertyInfo).PropertyType;\r\n                case MemberTypes.Method:\r\n                    return (info as MethodInfo).ReturnType;\r\n            }\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// If the member is writeable, returns the the type it expects.\r\n        /// Field - type of the field\r\n        /// Property - type of the property\r\n        /// Method - type of the first parameter, if any, otherwise null.\r\n        /// </summary>\r\n        /// <param name=\"info\"></param>\r\n        /// <returns></returns>\r\n        public static Type GetInputType(MemberInfo info)\r\n        {\r\n            if (info == null) return null;\r\n\r\n            switch (info.MemberType)\r\n            {\r\n                case MemberTypes.Field:\r\n                    return (info as FieldInfo).FieldType;\r\n                case MemberTypes.Property:\r\n                    return (info as PropertyInfo).PropertyType;\r\n                case MemberTypes.Method:\r\n                    {\r\n                        var meth = info as MethodInfo;\r\n                        if (meth == null) return null;\r\n                        var arr = meth.GetParameters();\r\n                        if (arr.Length == 0) return null;\r\n                        return arr[0].ParameterType;\r\n                    }\r\n            }\r\n            return null;\r\n        }\r\n\r\n        public static DynamicMemberAccess GetMemberAccessLevel(MemberInfo info)\r\n        {\r\n            if (info == null) return DynamicMemberAccess.Inaccessible;\r\n\r\n            switch (info.MemberType)\r\n            {\r\n                case MemberTypes.Field:\r\n                    return DynamicMemberAccess.ReadWrite;\r\n                case MemberTypes.Property:\r\n                    var pinfo = info as PropertyInfo;\r\n                    if (pinfo.CanRead)\r\n                        return (pinfo.CanWrite) ? DynamicMemberAccess.ReadWrite : DynamicMemberAccess.Read;\r\n                    else\r\n                        return (pinfo.CanWrite) ? DynamicMemberAccess.Write : DynamicMemberAccess.Inaccessible;\r\n                case MemberTypes.Method:\r\n                    var minfo = info as MethodInfo;\r\n                    if (minfo.ReturnType != typeof(void))\r\n                        return DynamicMemberAccess.ReadWrite;\r\n                    else\r\n                        return DynamicMemberAccess.Write;\r\n                default:\r\n                    return DynamicMemberAccess.Inaccessible;\r\n            }\r\n        }\r\n\r\n        public static object GetValueWithMember(MemberInfo info, object targObj)\r\n        {\r\n            if (info == null) return null;\r\n\r\n            try\r\n            {\r\n                switch (info.MemberType)\r\n                {\r\n                    case MemberTypes.Field:\r\n                        return (info as FieldInfo).GetValue(targObj);\r\n                    case MemberTypes.Property:\r\n                        return (info as PropertyInfo).GetValue(targObj, null);\r\n                    case MemberTypes.Method:\r\n                        return (info as MethodInfo).Invoke(targObj, null);\r\n                }\r\n            }\r\n            catch\r\n            {\r\n\r\n            }\r\n            \r\n            return null;\r\n        }\r\n\r\n        public static object GetValueWithMember(MemberInfo info, object targObj, bool ignoreMethod)\r\n        {\r\n            if (info == null || targObj == null) return null;\r\n            if (!TypeUtil.IsType(targObj.GetType(), info.DeclaringType)) return null;\r\n\r\n            try\r\n            {\r\n                switch (info.MemberType)\r\n                {\r\n                    case MemberTypes.Field:\r\n                        return (info as FieldInfo).GetValue(targObj);\r\n                    case MemberTypes.Property:\r\n                        return (info as PropertyInfo).GetValue(targObj, null);\r\n                    case MemberTypes.Method:\r\n                        if (ignoreMethod)\r\n                            return null;\r\n                        else\r\n                            return (info as MethodInfo).Invoke(targObj, null);\r\n                }\r\n            }\r\n            catch\r\n            {\r\n\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n\r\n        /// <summary>\r\n        /// Returns members that return/accept types that are considered easily serializable. \r\n        /// Easily serialized types are those that can be referenced by a VariantReference.\r\n        /// </summary>\r\n        /// <param name=\"obj\">Object to find member of</param>\r\n        /// <param name=\"mask\">MemberType mask</param>\r\n        /// <param name=\"access\">Access mask</param>\r\n        /// <returns></returns>\r\n        public static IEnumerable<System.Reflection.MemberInfo> GetEasilySerializedMembers(object obj, MemberTypes mask = MemberTypes.All, DynamicMemberAccess access = DynamicMemberAccess.ReadWrite, bool ignoreObsoleteMembers = true)\r\n        {\r\n            if (obj == null) yield break;\r\n\r\n            bool bRead = (access & DynamicMemberAccess.Read) != 0;\r\n            bool bWrite = (access & DynamicMemberAccess.Write) != 0;\r\n            var members = com.spacepuppy.Dynamic.DynamicUtil.GetMembers(obj, false);\r\n            foreach (var mi in members)\r\n            {\r\n                if ((mi.MemberType & mask) == 0) continue;\r\n                if (ignoreObsoleteMembers && mi.IsObsolete()) continue;\r\n\r\n                if ((mi.DeclaringType.IsAssignableFrom(typeof(UnityEngine.MonoBehaviour)) ||\r\n                     mi.DeclaringType.IsAssignableFrom(typeof(SPComponent)) ||\r\n                     mi.DeclaringType.IsAssignableFrom(typeof(SPNotifyingComponent))) && mi.Name != \"enabled\") continue;\r\n\r\n                switch (mi.MemberType)\r\n                {\r\n                    case System.Reflection.MemberTypes.Method:\r\n                        {\r\n                            var m = mi as System.Reflection.MethodInfo;\r\n                            if (m.IsSpecialName) continue;\r\n                            if (m.IsGenericMethod) continue;\r\n\r\n                            var parr = m.GetParameters();\r\n                            if (parr.Length == 0)\r\n                            {\r\n                                yield return m;\r\n                            }\r\n                            else\r\n                            {\r\n                                bool pass = true;\r\n                                foreach (var p in parr)\r\n                                {\r\n                                    if (!(VariantReference.AcceptableType(p.ParameterType) || p.ParameterType == typeof(object)))\r\n                                    {\r\n                                        pass = false;\r\n                                        break;\r\n                                    }\r\n                                }\r\n                                if (pass) yield return m;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case System.Reflection.MemberTypes.Field:\r\n                        {\r\n                            var f = mi as System.Reflection.FieldInfo;\r\n                            if (f.IsSpecialName) continue;\r\n\r\n                            if (VariantReference.AcceptableType(f.FieldType)) yield return f;\r\n                        }\r\n                        break;\r\n                    case System.Reflection.MemberTypes.Property:\r\n                        {\r\n                            var p = mi as System.Reflection.PropertyInfo;\r\n                            if (p.IsSpecialName) continue;\r\n                            if (!p.CanRead && bRead) continue;\r\n                            if (!p.CanWrite && bWrite) continue;\r\n                            if (p.GetIndexParameters().Length > 0) continue; //indexed properties are not allowed\r\n\r\n                            if (VariantReference.AcceptableType(p.PropertyType)) yield return p;\r\n                        }\r\n                        break;\r\n                }\r\n\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<System.Reflection.MemberInfo> GetEasilySerializedMembersFromType(System.Type tp, MemberTypes mask = MemberTypes.All, DynamicMemberAccess access = DynamicMemberAccess.ReadWrite, bool ignoreObsoleteMembers = true)\r\n        {\r\n            if (tp == null) yield break;\r\n\r\n            bool bRead = (access & DynamicMemberAccess.Read) != 0;\r\n            bool bWrite = (access & DynamicMemberAccess.Write) != 0;\r\n            var members = com.spacepuppy.Dynamic.DynamicUtil.GetMembersFromType(tp, false);\r\n            foreach (var mi in members)\r\n            {\r\n                if ((mi.MemberType & mask) == 0) continue;\r\n                if (ignoreObsoleteMembers && mi.IsObsolete()) continue;\r\n\r\n                if ((mi.DeclaringType.IsAssignableFrom(typeof(UnityEngine.MonoBehaviour)) ||\r\n                     mi.DeclaringType.IsAssignableFrom(typeof(SPComponent)) ||\r\n                     mi.DeclaringType.IsAssignableFrom(typeof(SPNotifyingComponent))) && mi.Name != \"enabled\") continue;\r\n\r\n                switch (mi.MemberType)\r\n                {\r\n                    case System.Reflection.MemberTypes.Method:\r\n                        {\r\n                            var m = mi as System.Reflection.MethodInfo;\r\n                            if (m.IsSpecialName) continue;\r\n                            if (m.IsGenericMethod) continue;\r\n\r\n                            var parr = m.GetParameters();\r\n                            if (parr.Length == 0)\r\n                            {\r\n                                yield return m;\r\n                            }\r\n                            else\r\n                            {\r\n                                bool pass = true;\r\n                                foreach (var p in parr)\r\n                                {\r\n                                    if (!(VariantReference.AcceptableType(p.ParameterType) || p.ParameterType == typeof(object)))\r\n                                    {\r\n                                        pass = false;\r\n                                        break;\r\n                                    }\r\n                                }\r\n                                if (pass) yield return m;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case System.Reflection.MemberTypes.Field:\r\n                        {\r\n                            var f = mi as System.Reflection.FieldInfo;\r\n                            if (f.IsSpecialName) continue;\r\n\r\n                            if (VariantReference.AcceptableType(f.FieldType)) yield return f;\r\n                        }\r\n                        break;\r\n                    case System.Reflection.MemberTypes.Property:\r\n                        {\r\n                            var p = mi as System.Reflection.PropertyInfo;\r\n                            if (p.IsSpecialName) continue;\r\n                            if (!p.CanRead && bRead) continue;\r\n                            if (!p.CanWrite && bWrite) continue;\r\n                            if (p.GetIndexParameters().Length > 0) continue; //indexed properties are not allowed\r\n\r\n                            if (VariantReference.AcceptableType(p.PropertyType)) yield return p;\r\n                        }\r\n                        break;\r\n                }\r\n\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<System.Reflection.MemberInfo> GetEditorCompatibleMembersFromType(System.Type tp, MemberTypes mask = MemberTypes.All, DynamicMemberAccess access = DynamicMemberAccess.ReadWrite, bool ignoreObsoleteMembers = true)\r\n        {\r\n            if (tp == null) yield break;\r\n\r\n            bool bRead = (access & DynamicMemberAccess.Read) != 0;\r\n            bool bWrite = (access & DynamicMemberAccess.Write) != 0;\r\n            var members = com.spacepuppy.Dynamic.DynamicUtil.GetMembersFromType(tp, false);\r\n            foreach (var mi in members)\r\n            {\r\n                if ((mi.MemberType & mask) == 0) continue;\r\n                if (ignoreObsoleteMembers && mi.IsObsolete()) continue;\r\n\r\n                if ((mi.DeclaringType.IsAssignableFrom(typeof(UnityEngine.MonoBehaviour)) ||\r\n                     mi.DeclaringType.IsAssignableFrom(typeof(SPComponent)) ||\r\n                     mi.DeclaringType.IsAssignableFrom(typeof(SPNotifyingComponent))) && mi.Name != \"enabled\") continue;\r\n\r\n                switch (mi.MemberType)\r\n                {\r\n                    case System.Reflection.MemberTypes.Method:\r\n                        {\r\n                            var m = mi as System.Reflection.MethodInfo;\r\n                            if (m.IsSpecialName) continue;\r\n                            if (m.IsGenericMethod) continue;\r\n\r\n                            var parr = m.GetParameters();\r\n                            if (parr.Length == 0)\r\n                            {\r\n                                yield return m;\r\n                            }\r\n                            else\r\n                            {\r\n                                bool pass = true;\r\n                                foreach (var p in parr)\r\n                                {\r\n                                    if (!(VariantReference.AcceptableType(p.ParameterType) || p.ParameterType == typeof(object)))\r\n                                    {\r\n                                        pass = false;\r\n                                        break;\r\n                                    }\r\n                                }\r\n                                if (pass) yield return m;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case System.Reflection.MemberTypes.Field:\r\n                        {\r\n                            var f = mi as System.Reflection.FieldInfo;\r\n                            if (f.IsSpecialName) continue;\r\n\r\n                            yield return f;\r\n                        }\r\n                        break;\r\n                    case System.Reflection.MemberTypes.Property:\r\n                        {\r\n                            var p = mi as System.Reflection.PropertyInfo;\r\n                            if (p.IsSpecialName) continue;\r\n                            if (!p.CanRead && bRead) continue;\r\n                            if (!p.CanWrite && bWrite) continue;\r\n                            if (p.GetIndexParameters().Length > 0) continue; //indexed properties are not allowed\r\n\r\n                            yield return p;\r\n                        }\r\n                        break;\r\n                }\r\n\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns true if the type is either System.Object or Variant.\r\n        /// </summary>\r\n        /// <param name=\"tp\"></param>\r\n        /// <returns></returns>\r\n        public static bool TypeIsVariantSupported(System.Type tp)\r\n        {\r\n            return tp == typeof(object) || tp == typeof(Variant);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Tokens\r\n\r\n        /// <summary>\r\n        /// Returns a state token with a shallow copy of all public properties/fields of 'obj'.\r\n        /// The state token is possibly serializable but not guaranteed. \r\n        /// If 'obj' implements ITokenizable, then the object itself controls if the token is serializable.\r\n        /// Otherwise a StateToken is returned which is serializable, but not all of the values of the copied members are serializable. That's up to them\r\n        /// \r\n        /// Note - by serializable, this refers to .net serialization or any engine that supports the ISerialable interface. Not the unity serialization engine.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public static object CreateStateToken(object obj)\r\n        {\r\n            if (obj == null)\r\n                return null;\r\n            else if (obj is ITokenizable)\r\n            {\r\n                try\r\n                {\r\n                    return (obj as ITokenizable).CreateStateToken();\r\n                }\r\n                catch\r\n                {\r\n                    return null;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var token = StateToken.GetToken();\r\n                token.CopyFrom(obj);\r\n                return token;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Restores the state of 'obj' based on 'token'. Token should be a state object that was returned by 'CreateStateToken'. \r\n        /// Respects ITokenizable interface on 'obj'.\r\n        /// If the type of 'token' is mismatched, then this may likely fail.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"token\"></param>\r\n        public static void RestoreFromStateToken(object obj, object token)\r\n        {\r\n            if (obj is ITokenizable)\r\n            {\r\n                try\r\n                {\r\n                    (obj as ITokenizable).RestoreFromStateToken(token);\r\n                }\r\n                catch\r\n                {\r\n                }\r\n            }\r\n            else\r\n                CopyState(obj, token);\r\n        }\r\n        \r\n        /// <summary>\r\n        /// Copies the members of source onto the corresponding members of obj.\r\n        /// If obj is an IDynamic table like StateToken, it'll take on the full state of source.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"token\"></param>\r\n        public static void CopyState(object obj, object source)\r\n        {\r\n            if (source is IToken)\r\n                (source as IToken).CopyTo(obj);\r\n            else if (source != null)\r\n            {\r\n                foreach (var m in GetMembers(source, false, MemberTypes.Property | MemberTypes.Field))\r\n                {\r\n                    SetValue(obj, m.Name, GetValue(source, m));\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Sync's obj and source's state for members that overlap.\r\n        /// If obj is an IToken it respect's IToken.SyncFrom.\r\n        /// If source is an IToken it respect's IToken.CopyTo.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"token\"></param>\r\n        public static void SyncState(object obj, object source)\r\n        {\r\n            if (obj is IToken)\r\n                (obj as IToken).SyncFrom(source);\r\n            else if (source is IToken)\r\n                (source as IToken).CopyTo(obj);\r\n            else if (source != null)\r\n            {\r\n                foreach (var m in GetMembers(source, false, MemberTypes.Property | MemberTypes.Field))\r\n                {\r\n                    SetValue(obj, m.Name, GetValue(source, m));\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n\r\n        #region Some Minor Helpers\r\n\r\n        private static object ReduceSubObject(object obj, string sprop, out string lastProp)\r\n        {\r\n            if (obj == null)\r\n            {\r\n                lastProp = null;\r\n                return null;\r\n            }\r\n\r\n            var arr = sprop.Split('.');\r\n            lastProp = arr[arr.Length - 1];\r\n            for (int i = 0; i < arr.Length - 1; i++)\r\n            {\r\n                obj = DynamicUtil.GetValue(obj, arr[i]);\r\n                if (obj == null) return null;\r\n            }\r\n            \r\n            return obj;\r\n        }\r\n\r\n        private static System.Type ReduceSubType(System.Type tp, string sprop, bool includeNonPublic, out string lastProp)\r\n        {\r\n            if (tp == null)\r\n            {\r\n                lastProp = null;\r\n                return null;\r\n            }\r\n\r\n            var arr = sprop.Split('.');\r\n            lastProp = arr[arr.Length - 1];\r\n            for (int i = 0; i < arr.Length - 1; i++)\r\n            {\r\n                var member = DynamicUtil.GetValueMemberFromType(tp, arr[i], includeNonPublic);\r\n                if (member == null) return null;\r\n\r\n                tp = GetReturnType(member);\r\n                if (tp == null) return null;\r\n            }\r\n\r\n            return tp;\r\n        }\r\n\r\n        private static bool ParameterSignatureMatches(object[] args, ParameterInfo[] paramInfos, bool allowOptional)\r\n        {\r\n            if (args == null) args = ArrayUtil.Empty<object>();\r\n            if (paramInfos == null) ArrayUtil.Empty<ParameterInfo>();\r\n\r\n            if (args.Length == 0 && paramInfos.Length == 0) return true;\r\n            if (args.Length > paramInfos.Length) return false;\r\n\r\n            for (int i = 0; i < args.Length; i++)\r\n            {\r\n                if (args[i] == null)\r\n                {\r\n                    continue;\r\n                }\r\n                if (args[i].GetType().IsAssignableFrom(paramInfos[i].ParameterType))\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                return false;\r\n            }\r\n\r\n            return paramInfos.Length == args.Length || (allowOptional && paramInfos[args.Length].IsOptional);\r\n        }\r\n\r\n        private static bool ParameterSignatureMatchesNumericallyUnstrict(object[] args, ParameterInfo[] paramInfos, bool allowOptional, bool convertArgsOnSuccess)\r\n        {\r\n            if (args == null) args = ArrayUtil.Empty<object>();\r\n            if (paramInfos == null) ArrayUtil.Empty<ParameterInfo>();\r\n\r\n            if (args.Length == 0 && paramInfos.Length == 0) return true;\r\n            if (args.Length > paramInfos.Length) return false;\r\n\r\n            for (int i = 0; i < args.Length; i++)\r\n            {\r\n                if (args[i] == null)\r\n                {\r\n                    continue;\r\n                }\r\n                var atp = args[i].GetType();\r\n                if (atp.IsAssignableFrom(paramInfos[i].ParameterType))\r\n                {\r\n                    continue;\r\n                }\r\n                if(ConvertUtil.IsNumericType(atp) && ConvertUtil.IsNumericType(paramInfos[i].ParameterType))\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                return false;\r\n            }\r\n\r\n            if( paramInfos.Length == args.Length || (allowOptional && paramInfos[args.Length].IsOptional))\r\n            {\r\n                if(convertArgsOnSuccess)\r\n                {\r\n                    for (int i = 0; i < args.Length; i++)\r\n                    {\r\n                        if (args[i] == null)\r\n                        {\r\n                            continue;\r\n                        }\r\n                        var atp = args[i].GetType();\r\n                        if (atp.IsAssignableFrom(paramInfos[i].ParameterType))\r\n                        {\r\n                            continue;\r\n                        }\r\n                        if (ConvertUtil.IsNumericType(atp) && ConvertUtil.IsNumericType(paramInfos[i].ParameterType))\r\n                        {\r\n                            args[i] = ConvertUtil.ToPrim(args[i], paramInfos[i].ParameterType);\r\n                        }\r\n                    }\r\n                }\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        private static IEnumerable<MemberInfo> FilterMembers(IEnumerable<MemberInfo> members, MemberTypes mask)\r\n        {\r\n            foreach (var m in members)\r\n            {\r\n                if ((m.MemberType & mask) != 0) yield return m;\r\n            }\r\n        }\r\n\r\n        private static bool IsValidValueMember(MemberInfo member)\r\n        {\r\n            switch (member.MemberType)\r\n            {\r\n                case System.Reflection.MemberTypes.Field:\r\n                    return true;\r\n\r\n                case System.Reflection.MemberTypes.Property:\r\n                    {\r\n                        var prop = member as System.Reflection.PropertyInfo;\r\n                        if (prop.CanRead && prop.GetIndexParameters().Length == 0) return true;\r\n                        break;\r\n                    }\r\n                case System.Reflection.MemberTypes.Method:\r\n                    {\r\n                        var meth = member as System.Reflection.MethodInfo;\r\n                        if (meth.GetParameters().Length == 0) return true;\r\n                        break;\r\n                    }\r\n            }\r\n            return false;\r\n        }\r\n\r\n        private static bool IsValidValueSetterMember(MemberInfo member, System.Type valueType)\r\n        {\r\n            switch (member.MemberType)\r\n            {\r\n                case System.Reflection.MemberTypes.Field:\r\n                    var field = member as System.Reflection.FieldInfo;\r\n                    if ((valueType == null && !field.FieldType.IsValueType) || \r\n                        field.FieldType.IsAssignableFrom(valueType) || \r\n                        (ConvertUtil.IsNumericType(field.FieldType) && ConvertUtil.IsNumericType(valueType)))\r\n                    {\r\n                        return true;\r\n                    }\r\n\r\n                    break;\r\n                case System.Reflection.MemberTypes.Property:\r\n                    var prop = member as System.Reflection.PropertyInfo;\r\n                    if (prop.CanWrite && ((valueType == null && !prop.PropertyType.IsValueType) || \r\n                                          prop.PropertyType.IsAssignableFrom(valueType) ||\r\n                                          (ConvertUtil.IsNumericType(prop.PropertyType) && ConvertUtil.IsNumericType(valueType))) && \r\n                        prop.GetIndexParameters().Length == 0)\r\n                    {\r\n                        return true;\r\n                    }\r\n                    break;\r\n                case System.Reflection.MemberTypes.Method:\r\n                    {\r\n                        var meth = member as System.Reflection.MethodInfo;\r\n                        var paramInfos = meth.GetParameters();\r\n                        if (paramInfos.Length != 1) return false;\r\n                        if ((valueType == null && !paramInfos[0].ParameterType.IsValueType) || \r\n                            paramInfos[0].ParameterType.IsAssignableFrom(valueType) ||\r\n                            (ConvertUtil.IsNumericType(paramInfos[0].ParameterType) && ConvertUtil.IsNumericType(valueType)))\r\n                        {\r\n                            return true;\r\n                        }\r\n                    }\r\n                    break;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private class DynamicBinder : Binder\r\n        {\r\n\r\n            public static readonly DynamicBinder Default = new DynamicBinder();\r\n\r\n\r\n            public override FieldInfo BindToField(BindingFlags bindingAttr, FieldInfo[] match, object value, CultureInfo culture)\r\n            {\r\n                return Type.DefaultBinder.BindToField(bindingAttr, match, value, culture);\r\n            }\r\n\r\n            public override PropertyInfo SelectProperty(BindingFlags bindingAttr, PropertyInfo[] match, Type returnType, Type[] indexes, ParameterModifier[] modifiers)\r\n            {\r\n                return Type.DefaultBinder.SelectProperty(bindingAttr, match, returnType, indexes, modifiers);\r\n            }\r\n\r\n            public override MethodBase BindToMethod(BindingFlags bindingAttr, MethodBase[] match, ref object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] names, out object state)\r\n            {\r\n                if (args == null) args = ArrayUtil.Empty<object>();\r\n\r\n                state = null;\r\n                foreach (var m in match)\r\n                {\r\n                    var pinfos = m.GetParameters();\r\n                    if (ParameterSignatureMatches(args, pinfos, true))\r\n                    {\r\n                        if (args.Length != pinfos.Length)\r\n                        {\r\n                            Array.Resize(ref args, pinfos.Length);\r\n                        }\r\n                        return m;\r\n                    }\r\n                }\r\n\r\n                return Type.DefaultBinder.BindToMethod(bindingAttr, match, ref args, modifiers, culture, names, out state);\r\n            }\r\n\r\n            public override MethodBase SelectMethod(BindingFlags bindingAttr, MethodBase[] match, Type[] types, ParameterModifier[] modifiers)\r\n            {\r\n                return Type.DefaultBinder.SelectMethod(bindingAttr, match, types, modifiers);\r\n            }\r\n\r\n            public override object ChangeType(object value, Type type, CultureInfo culture)\r\n            {\r\n                return Type.DefaultBinder.ChangeType(value, type, culture);\r\n            }\r\n\r\n            public override void ReorderArgumentArray(ref object[] args, object state)\r\n            {\r\n                Type.DefaultBinder.ReorderArgumentArray(ref args, state);\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/IDynamicMemberInfo.cs",
    "content": "﻿using System;\r\nusing System.Reflection;\r\n\r\nnamespace com.spacepuppy.Dynamic\r\n{\r\n    public interface IDynamicMemberInfo\r\n    {\r\n\r\n        string Name { get; }\r\n        Type DeclaringType { get; }\r\n        Type ReturnType { get; }\r\n        MemberTypes MemberType { get; }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/IStateModifier.cs",
    "content": "﻿\r\n\r\nnamespace com.spacepuppy.Dynamic\r\n{\r\n\r\n    /// <summary>\r\n    /// Define a component that can be used as a state modifier with its own ruleset. \r\n    /// \r\n    /// For example it may store some state information for a Camera, but the target may be a GameObject. \r\n    /// The IStateModifier can get the Camera from the GameObject and update it accordingly.\r\n    /// </summary>\r\n    public interface IStateModifier\r\n    {\r\n\r\n        /// <summary>\r\n        /// Copy the current state of the IModifier to the StateToken. \r\n        /// Used to allow callers to gather the state and modify it further.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        void CopyTo(object targ);\r\n        /// <summary>\r\n        /// Lerp a StateToken to the current state of the IModifier, just pass along what is need to 'StateToken.LerpTo'. \r\n        /// Used to allow callers to gather the state and modify it further.\r\n        /// </summary>\r\n        /// <param name=\"token\"></param>\r\n        /// <param name=\"t\"></param>\r\n        void LerpTo(object targ, float t);\r\n        /// <summary>\r\n        /// Set the state of some target to that of the IModifier using the IModifier rules.\r\n        /// </summary>\r\n        /// <param name=\"targ\"></param>\r\n        void Modify(object targ);\r\n        /// <summary>\r\n        /// Set the state of some target to that of the StateToken using the IModifier rules.\r\n        /// </summary>\r\n        /// <param name=\"targ\"></param>\r\n        /// <param name=\"token\"></param>\r\n        void ModifyWith(object targ, object source);\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/ITokenizable.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.Dynamic\n{\n\n    /// <summary>\n    /// Represents an object that handles its own creation of a token of its state. \n    /// \n    /// A token should be serializable.\n    /// \n    /// This contract will be respected by com.spacepuppy.Dynamics when trying to receive a StateToken of an object. \n    /// If the object implements this, the interface will be used, otherwise a <see cref=\"com.spacepuppy.Dynamic.StateToken\"/> will be used.\n    /// </summary>\n    public interface ITokenizable\n    {\n\n        object CreateStateToken();\n        void RestoreFromStateToken(object token);\n\n    }\n\n    public interface IToken\n    {\n\n        /// <summary>\n        /// Copy the tokens state onto some target 'obj'.\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        void CopyTo(object obj);\n\n        /// <summary>\n        /// Copies the the member's of obj with the same members as the IToken.\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        void SyncFrom(object obj);\n\n    }\n\n    /// <summary>\n    /// Implies that the object is a dynamic token for storing states. \n    /// The members of the token should only be fields/properties, and not methods.\n    /// </summary>\n    public interface IStateToken : IDynamic, IToken, ITokenizable\n    {\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/StateToken.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Dynamic\r\n{\r\n\r\n    /// <summary>\r\n    /// A dynamic class for storing the state of another object in. This can be used for serializing arbitrary state information, \r\n    /// or used with the tween engine for dynamically configured state animation. As well as any number of other applications you may deem fit.\r\n    /// </summary>\r\n    [System.Serializable]\r\n    public class StateToken : IStateToken, IEnumerable<KeyValuePair<string, object>>, System.IDisposable, System.Runtime.Serialization.ISerializable\r\n    {\r\n\r\n        private const int TEMP_STACKSIZE = 3;\r\n\r\n        #region Fields\r\n\r\n        private Dictionary<string, object> _table = new Dictionary<string, object>();\r\n\r\n        #endregion\r\n\r\n        #region Constructor\r\n\r\n        public StateToken()\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public object this[string sMemberName]\r\n        {\r\n            get\r\n            {\r\n                return this.GetValue(sMemberName);\r\n            }\r\n            set\r\n            {\r\n                this.SetValue(sMemberName, value);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void SetValue(string skey, object value)\r\n        {\r\n            _table[skey] = value;\r\n        }\r\n\r\n        public bool LerpValue(string skey, object value, float t)\r\n        {\r\n            object a;\r\n            if (_table.TryGetValue(skey, out a))\r\n            {\r\n                a = Evaluator.TryLerp(a, value, t);\r\n                _table[skey] = a;\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public object GetValue(string skey)\r\n        {\r\n            if (_table.ContainsKey(skey))\r\n                return _table[skey];\r\n            else\r\n                return null;\r\n        }\r\n\r\n        public bool TryGetValue(string skey, out object result)\r\n        {\r\n            return _table.TryGetValue(skey, out result);\r\n        }\r\n\r\n        public T GetValue<T>(string skey)\r\n        {\r\n            object obj;\r\n            if (_table.TryGetValue(skey, out obj))\r\n            {\r\n                if (obj is T) return (T)obj;\r\n                if (ConvertUtil.IsSupportedType(typeof(T))) return ConvertUtil.ToPrim<T>(obj);\r\n                return default(T);\r\n            }\r\n            else\r\n            {\r\n                return default(T);\r\n            }\r\n        }\r\n\r\n        public bool TryGetValue<T>(string skey, out T result)\r\n        {\r\n            object obj;\r\n            if (_table.TryGetValue(skey, out obj))\r\n            {\r\n                if (obj is T)\r\n                {\r\n                    result = (T)obj;\r\n                    return true;\r\n                }\r\n                else if (ConvertUtil.IsSupportedType(typeof(T)))\r\n                {\r\n                    result = ConvertUtil.ToPrim<T>(obj);\r\n                    return true;\r\n                }\r\n            }\r\n\r\n            result = default(T);\r\n            return false;\r\n        }\r\n\r\n        public bool HasKey(string skey)\r\n        {\r\n            return _table.ContainsKey(skey);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Iterates over members of the collection and attempts to set them to an object as if they \r\n        /// were property names on that object.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        public void CopyTo(object obj)\r\n        {\r\n            var e = _table.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                DynamicUtil.SetValue(obj, e.Current.Key, e.Current.Value);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IToken Interface\r\n\r\n        /// <summary>\r\n        /// Iterates over keys in this collection and attempts to update the values associated with that \r\n        /// key to the value pulled from a property on object.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        public void SyncFrom(object obj)\r\n        {\r\n            using (var lst = TempCollection.GetList<string>())\r\n            {\r\n                var e = _table.Keys.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    lst.Add(e.Current);\r\n                }\r\n\r\n                var e2 = lst.GetEnumerator();\r\n                while (e2.MoveNext())\r\n                {\r\n                    _table[e2.Current] = DynamicUtil.GetValue(obj, e2.Current);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Dumps the keys in this collection, and then copies keys to match the entire state of the passed in object.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        public void CopyFrom(object obj)\r\n        {\r\n            _table.Clear();\r\n            foreach (var m in DynamicUtil.GetMembers(obj, false, System.Reflection.MemberTypes.Property | System.Reflection.MemberTypes.Field))\r\n            {\r\n                _table[m.Name] = DynamicUtil.GetValue(obj, m);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Lerp the target objects values to the state of the StateToken. If the member doesn't have a current state/undefined, \r\n        /// then the member is set to the current state in this StateToken.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"t\"></param>\r\n        public void LerpTo(object obj, float t)\r\n        {\r\n            var e = _table.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                object value;\r\n                if (DynamicUtil.TryGetValue(obj, e.Current.Key, out value))\r\n                {\r\n                    value = Evaluator.TryLerp(value, e.Current.Value, t);\r\n                    DynamicUtil.SetValue(obj, e.Current.Key, value);\r\n                }\r\n                else\r\n                {\r\n                    DynamicUtil.SetValue(obj, e.Current.Key, e.Current.Value);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void TweenTo(com.spacepuppy.Tween.TweenHash hash, com.spacepuppy.Tween.Ease ease, float dur)\r\n        {\r\n            var e = _table.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                var value = e.Current.Value;\r\n                if (value == null) continue;\r\n\r\n                switch (VariantReference.GetVariantType(value.GetType()))\r\n                {\r\n                    case VariantType.Integer:\r\n                    case VariantType.Float:\r\n                    case VariantType.Double:\r\n                    case VariantType.Vector2:\r\n                    case VariantType.Vector3:\r\n                    case VariantType.Vector4:\r\n                    case VariantType.Quaternion:\r\n                    case VariantType.Color:\r\n                    case VariantType.Rect:\r\n                        hash.To(e.Current.Key, ease, dur, value);\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITokenizable Interface\r\n\r\n        public object CreateStateToken()\r\n        {\r\n            var token = GetToken();\r\n            var e = _table.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                token._table[e.Current.Key] = e.Current.Value;\r\n            }\r\n            return token;\r\n        }\r\n\r\n        public void RestoreFromStateToken(object token)\r\n        {\r\n            if(token is StateToken)\r\n            {\r\n                _table.Clear();\r\n                var e = (token as StateToken)._table.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    _table[e.Current.Key] = e.Current.Value;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                DynamicUtil.CopyState(this, token);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDynamic Interface\r\n\r\n        object IDynamic.this[string sMemberName]\r\n        {\r\n            get\r\n            {\r\n                return this.GetValue(sMemberName);\r\n            }\r\n            set\r\n            {\r\n                this.SetValue(sMemberName, value);\r\n            }\r\n        }\r\n\r\n        bool IDynamic.SetValue(string sMemberName, object value, params object[] index)\r\n        {\r\n            this.SetValue(sMemberName, value);\r\n            return true;\r\n        }\r\n\r\n        object IDynamic.GetValue(string sMemberName, params object[] args)\r\n        {\r\n            return this.GetValue(sMemberName);\r\n        }\r\n\r\n        bool IDynamic.TryGetValue(string sMemberName, out object result, params object[] args)\r\n        {\r\n            return this.TryGetValue(sMemberName, out result);\r\n        }\r\n\r\n        object IDynamic.InvokeMethod(string sMemberName, params object[] args)\r\n        {\r\n            return this.GetValue(sMemberName);\r\n        }\r\n\r\n        bool IDynamic.HasMember(string sMemberName, bool includeNonPublic)\r\n        {\r\n            return this.HasKey(sMemberName);\r\n        }\r\n\r\n        IEnumerable<System.Reflection.MemberInfo> IDynamic.GetMembers(bool includeNonPublic)\r\n        {\r\n            var tp = this.GetType();\r\n            foreach (var k in _table.Keys)\r\n            {\r\n                yield return new DynamicPropertyInfo(k, tp);\r\n            }\r\n        }\r\n\r\n        IEnumerable<string> IDynamic.GetMemberNames(bool includeNonPublic)\r\n        {\r\n            return _table.Keys;\r\n        }\r\n\r\n        System.Reflection.MemberInfo IDynamic.GetMember(string sMemberName, bool includeNonPublic)\r\n        {\r\n            if (_table.ContainsKey(sMemberName))\r\n                return new DynamicPropertyInfo(sMemberName, this.GetType());\r\n            else\r\n                return null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public Dictionary<string, object>.Enumerator GetEnumerator()\r\n        {\r\n            return _table.GetEnumerator();\r\n        }\r\n\r\n        IEnumerator<KeyValuePair<string, object>> IEnumerable<KeyValuePair<string, object>>.GetEnumerator()\r\n        {\r\n            return _table.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _table.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        void IDisposable.Dispose()\r\n        {\r\n            _table.Clear();\r\n            if (_tempTokens == null) _tempTokens = new ObjectCachePool<StateToken>(TEMP_STACKSIZE);\r\n            _tempTokens.Release(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISerializable Interface\r\n\r\n        protected StateToken(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)\r\n        {\r\n            var e = info.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                _table[e.Current.Name] = e.Current.Value;\r\n            }\r\n        }\r\n\r\n        void System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)\r\n        {\r\n            var e = _table.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                try\r\n                {\r\n                    info.AddValue(e.Current.Key, e.Current.Value);\r\n                }\r\n                catch (System.Exception)\r\n                {\r\n                    //tried to add a non-serializable value\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Utils\r\n\r\n        private static ObjectCachePool<StateToken> _tempTokens;\r\n\r\n        public static StateToken GetToken()\r\n        {\r\n            StateToken t;\r\n            if (_tempTokens != null && _tempTokens.TryGetInstance(out t))\r\n            {\r\n                return t;\r\n            }\r\n            else\r\n            {\r\n                return new StateToken();\r\n            }\r\n        }\r\n\r\n        public static void ReleaseTempToken(StateToken token)\r\n        {\r\n            if (token != null) (token as System.IDisposable).Dispose();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/TypeAccessWrapper.cs",
    "content": "﻿using System;\r\nusing System.Linq;\r\nusing System.Reflection;\r\n\r\nnamespace com.spacepuppy.Dynamic\r\n{\r\n\r\n    /// <summary>\r\n    /// Facilitates creating a wrapper to access an object of an otherwise unknown type. This is useful for reflecting out an internal \r\n    /// class in an assembly you don't have direct access to.\r\n    /// </summary>\r\n    public class TypeAccessWrapper\r\n    {\r\n\r\n        private const BindingFlags PUBLIC_MEMBERS = BindingFlags.Instance | BindingFlags.Public;\r\n        private const BindingFlags PUBLIC_STATIC_MEMBERS = BindingFlags.Static | BindingFlags.Public;\r\n\r\n        #region Fields\r\n\r\n        private object _wrappedObject;\r\n        private Type _wrappedType;\r\n\r\n        private bool _includeNonPublic = false;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TypeAccessWrapper(Type type, bool includeNonPublic = false)\r\n        {\r\n            if (type == null) throw new ArgumentNullException(\"type\");\r\n\r\n            _wrappedType = type;\r\n            _includeNonPublic = includeNonPublic;\r\n            this.WrappedObject = null;\r\n        }\r\n\r\n        public TypeAccessWrapper(Type type, object obj, bool includeNonPublic = false)\r\n        {\r\n            if (type == null) throw new ArgumentNullException(\"type\");\r\n            if (obj != null && !type.IsAssignableFrom(obj.GetType())) throw new ArgumentException(\"Wrapped Object must be of type assignable to target type.\");\r\n\r\n            _wrappedType = type;\r\n            _includeNonPublic = includeNonPublic;\r\n            this.WrappedObject = obj;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Type WrappedType { get { return _wrappedType; } }\r\n\r\n        public object WrappedObject\r\n        {\r\n            get { return _wrappedObject; }\r\n            set\r\n            {\r\n                if (value != null && !_wrappedType.IsAssignableFrom(value.GetType())) throw new ArgumentException(\"Wrapped Object must be of type assignable to target type.\");\r\n                _wrappedObject = value;\r\n            }\r\n        }\r\n\r\n        public bool IncludeNonPublic { get { return _includeNonPublic; } set { _includeNonPublic = value; } }\r\n\r\n        #endregion\r\n\r\n        #region Instance Acccess\r\n\r\n        public MemberInfo[] GetMembers()\r\n        {\r\n            if (_wrappedObject == null) throw new InvalidOperationException(\"Can only access static members.\");\r\n\r\n            var binding = PUBLIC_MEMBERS;\r\n            if (_includeNonPublic) binding |= BindingFlags.NonPublic;\r\n            return _wrappedType.GetMembers(binding);\r\n        }\r\n\r\n        public MethodInfo[] GetMethods()\r\n        {\r\n            if (_wrappedObject == null) throw new InvalidOperationException(\"Can only access static members.\");\r\n\r\n            var binding = PUBLIC_MEMBERS;\r\n            if (_includeNonPublic) binding |= BindingFlags.NonPublic;\r\n            return _wrappedType.GetMethods(binding);\r\n        }\r\n\r\n        public string[] GetPropertyNames()\r\n        {\r\n            if (_wrappedObject == null) throw new InvalidOperationException(\"Can only access static members.\");\r\n\r\n            var binding = PUBLIC_MEMBERS;\r\n            if (_includeNonPublic) binding |= BindingFlags.NonPublic;\r\n            return (from p in _wrappedType.GetProperties(binding) select p.Name).Union(from f in _wrappedType.GetFields(binding) select f.Name).ToArray();\r\n        }\r\n\r\n        public Delegate GetMethod(string name, System.Type delegShape)\r\n        {\r\n            if (_wrappedObject == null) throw new InvalidOperationException(\"Can only access static members.\");\r\n            if (!delegShape.IsSubclassOf(typeof(Delegate))) throw new ArgumentException(\"Type must inherit from Delegate.\", \"delegShape\");\r\n\r\n            var binding = PUBLIC_MEMBERS;\r\n            if (_includeNonPublic) binding |= BindingFlags.NonPublic;\r\n\r\n            var invokeMeth = delegShape.GetMethod(\"Invoke\");\r\n            var paramTypes = (from p in invokeMeth.GetParameters() select p.ParameterType).ToArray();\r\n            MethodInfo meth = null;\r\n            try\r\n            {\r\n                meth = _wrappedType.GetMethod(name, binding, null, paramTypes, null);\r\n            }\r\n            catch\r\n            {\r\n                try\r\n                {\r\n                    meth = _wrappedType.GetMethod(name, binding);\r\n                }\r\n                catch\r\n                {\r\n\r\n                }\r\n            }\r\n            \r\n\r\n            if (meth != null)\r\n            {\r\n                try\r\n                {\r\n                    return Delegate.CreateDelegate(delegShape, _wrappedObject, meth);\r\n                }\r\n                catch (Exception ex)\r\n                {\r\n                    throw new InvalidOperationException(\"A method matching the name and shape requested could not be found.\", ex);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new InvalidOperationException(\"A method matching the name and shape requested could not be found.\");\r\n            }\r\n            \r\n        }\r\n\r\n        public object CallMethod(string name, System.Type delegShape, params object[] args)\r\n        {\r\n            var d = GetMethod(name, delegShape);\r\n            return d.DynamicInvoke(args);\r\n        }\r\n\r\n        public object GetProperty(string name)\r\n        {\r\n            if (_wrappedObject == null) throw new InvalidOperationException(\"Can only access static members.\");\r\n\r\n            var binding = PUBLIC_MEMBERS;\r\n            if (_includeNonPublic) binding |= BindingFlags.NonPublic;\r\n\r\n            var prop = _wrappedType.GetProperty(name, binding, null, null, Type.EmptyTypes, null);\r\n            if (prop != null)\r\n            {\r\n                return prop.GetValue(_wrappedObject, null);\r\n            }\r\n\r\n            var field = _wrappedType.GetField(name, binding);\r\n            if (field != null)\r\n            {\r\n                return field.GetValue(_wrappedObject);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public void SetProperty(string name, object value)\r\n        {\r\n            if (_wrappedObject == null) throw new InvalidOperationException(\"Can only access static members.\");\r\n\r\n            var binding = PUBLIC_MEMBERS;\r\n            if (_includeNonPublic) binding |= BindingFlags.NonPublic;\r\n\r\n            var prop = _wrappedType.GetProperty(name, binding, null, null, Type.EmptyTypes, null);\r\n            if (prop != null)\r\n            {\r\n                try\r\n                {\r\n                    prop.SetValue(_wrappedObject, value, null);\r\n                    return;\r\n                }\r\n                catch (Exception ex)\r\n                {\r\n                    throw new InvalidOperationException(\"Mismatch when attempting to set property.\", ex);\r\n                }\r\n            }\r\n\r\n            var field = _wrappedType.GetField(name, binding);\r\n            if (field != null)\r\n            {\r\n                try\r\n                {\r\n                    field.SetValue(_wrappedObject, value);\r\n                    return;\r\n                }\r\n                catch (Exception ex)\r\n                {\r\n                    throw new InvalidOperationException(\"Mismatch when attempting to set property.\", ex);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Access\r\n\r\n        public MemberInfo[] GetStaticMembers()\r\n        {\r\n            var binding = PUBLIC_STATIC_MEMBERS;\r\n            if (_includeNonPublic) binding |= BindingFlags.NonPublic;\r\n\r\n            return _wrappedType.GetMembers(binding);\r\n        }\r\n\r\n        public MethodInfo[] GetStaticMethods()\r\n        {\r\n            var binding = PUBLIC_STATIC_MEMBERS;\r\n            if (_includeNonPublic) binding |= BindingFlags.NonPublic;\r\n\r\n            return _wrappedType.GetMethods(binding);\r\n        }\r\n\r\n        public string[] GetStaticPropertyNames()\r\n        {\r\n            var binding = PUBLIC_STATIC_MEMBERS;\r\n            if (_includeNonPublic) binding |= BindingFlags.NonPublic;\r\n\r\n            return (from p in _wrappedType.GetProperties(binding) select p.Name).Union(from f in _wrappedType.GetFields(binding) select f.Name).ToArray();\r\n        }\r\n\r\n        public Delegate GetStaticMethod(string name, System.Type delegShape)\r\n        {\r\n            if (!delegShape.IsSubclassOf(typeof(Delegate))) throw new ArgumentException(\"Type must inherit from Delegate.\", \"delegShape\");\r\n\r\n            var binding = PUBLIC_STATIC_MEMBERS;\r\n            if (_includeNonPublic) binding |= BindingFlags.NonPublic;\r\n\r\n            var invokeMeth = delegShape.GetMethod(\"Invoke\");\r\n            var paramTypes = (from p in invokeMeth.GetParameters() select p.ParameterType).ToArray();\r\n            var meth = _wrappedType.GetMethod(name, binding, null, paramTypes, null);\r\n\r\n            if (meth != null)\r\n            {\r\n                try\r\n                {\r\n                    return Delegate.CreateDelegate(delegShape, meth);\r\n                }\r\n                catch (Exception ex)\r\n                {\r\n                    throw new InvalidOperationException(\"A method matching the name and shape requested could not be found.\", ex);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new InvalidOperationException(\"A method matching the name and shape requested could not be found.\");\r\n            }\r\n\r\n        }\r\n\r\n        public object CallStaticMethod(string name, System.Type delegShape, params object[] args)\r\n        {\r\n            var d = GetMethod(name, delegShape);\r\n            return d.DynamicInvoke(args);\r\n        }\r\n\r\n        public object GetStaticProperty(string name)\r\n        {\r\n            var binding = PUBLIC_STATIC_MEMBERS;\r\n            if (_includeNonPublic) binding |= BindingFlags.NonPublic;\r\n\r\n            var prop = _wrappedType.GetProperty(name, binding, null, null, Type.EmptyTypes, null);\r\n            if (prop != null)\r\n            {\r\n                return prop.GetValue(null, null);\r\n            }\r\n\r\n            var field = _wrappedType.GetField(name, binding);\r\n            if (field != null)\r\n            {\r\n                return field.GetValue(null);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public void SetStaticProperty(string name, object value)\r\n        {\r\n            var binding = PUBLIC_STATIC_MEMBERS;\r\n            if (_includeNonPublic) binding |= BindingFlags.NonPublic;\r\n\r\n            var prop = _wrappedType.GetProperty(name, binding, null, null, Type.EmptyTypes, null);\r\n            if (prop != null)\r\n            {\r\n                try\r\n                {\r\n                    prop.SetValue(null, value, null);\r\n                    return;\r\n                }\r\n                catch (Exception ex)\r\n                {\r\n                    throw new InvalidOperationException(\"Mismatch when attempting to set property.\", ex);\r\n                }\r\n            }\r\n\r\n            var field = _wrappedType.GetField(name, binding);\r\n            if (field != null)\r\n            {\r\n                try\r\n                {\r\n                    field.SetValue(null, value);\r\n                    return;\r\n                }\r\n                catch (Exception ex)\r\n                {\r\n                    throw new InvalidOperationException(\"Mismatch when attempting to set property.\", ex);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/Variant.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Reflection;\r\nusing System.Globalization;\r\n\r\nnamespace com.spacepuppy.Dynamic\r\n{\r\n\r\n    /// <summary>\r\n    /// A type that represents the potential of any type supported by VariantType. \r\n    /// This is usually only used as a typeof(Variant), similar to typeof(System.Void), to describe a situation \r\n    /// where the value returned is variant in nature.\r\n    /// </summary>\r\n    public struct Variant\r\n    {\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Dynamic/VectorEvaluator.cs",
    "content": "﻿using System;\nusing System.Text;\n\nusing Vector4 = UnityEngine.Vector4;\nusing Quaternion = UnityEngine.Quaternion;\n\nusing com.spacepuppy.Collections;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Dynamic\n{\n\n    /// <summary>\n    /// ##Statements\n    /// (...)\n    /// ##Operators\n    /// +\n    /// *\n    /// -\n    /// /\n    /// %\n    /// ^\n    /// >\n    /// <\n    /// >=\n    /// <=\n    /// ==\n    /// !=\n    /// ||\n    /// &&\n    /// \n    /// Does not respect order of operations, use parens to define order.\n    /// \n    /// ##Functions\n    /// Abs(x)\n    /// Sqrt(x)\n    /// Cos(x)\n    /// Sin(x)\n    /// Tan(x)\n    /// Acos(x)\n    /// Asin(x)\n    /// Atan(x)\n    /// Atan2(y, x)\n    /// Rand(max)\n    /// Rand(min, max)\n    /// RandInt(max)\n    /// RandInt(min, max)\n    /// vec(x)\n    /// vec(x,y)\n    /// vec(x,y,z)\n    /// vec(x,y,z,w)\n    /// rot(x,y,z)\n    /// \n    /// These function names are not case sensitive\n    /// \n    /// #Constants\n    /// $true\n    /// $false\n    /// $pi\n    /// $2pi\n    /// $pi_2\n    /// $rad2deg\n    /// $deg2rad\n    /// $secsInMin\n    /// $secsInHour\n    /// $secsInDay\n    /// $secsInWeek\n    /// $secsInYear\n    /// $infinity\n    /// $inf\n    /// $-infinity\n    /// $-inf\n    /// $time\n    /// $unscaledtime\n    /// $fixedtime\n    /// $deltatime\n    /// \n    /// These are global values, they are not case sensitive\n    /// \n    /// #Special Case - local variable\n    /// $.nameOfProperty\n    /// \n    /// In the case of the object referenced on a VariantReference, you can access its properties by typing $ followed by a dot (.) \n    /// and the name of the property. The property is case sensitive and must be spelled as it appears in code.\n    /// \n    /// $.CurrentTime / $secsInHour % 24\n    /// \n    /// #Special Case - cast local variable\n    /// $(Type).nameOfProperty\n    /// \n    /// You can grab a component from the local variable before evaluating a property with the parens following $.\n    /// \n    /// rotation summation requires using the * operator instead of +\n    /// </summary>\n    public class VectorEvaluator\n    {\n\n        #region Static Interface\n\n        private static com.spacepuppy.Collections.ObjectCachePool<VectorEvaluator> _pool = new ObjectCachePool<VectorEvaluator>(64);\n        private static com.spacepuppy.Collections.ObjectCachePool<ReusableStringReader> _readerPool = new ObjectCachePool<ReusableStringReader>(64);\n\n        public static object EvalValue(string command, object x)\n        {\n            var obj = _pool.GetInstance();\n            try\n            {\n                var r = _readerPool.GetInstance();\n                r.Reset(command);\n\n                obj._reader = r;\n                obj._x = x;\n                obj._strBuilder.Length = 0;\n                obj._parenCount = 0;\n                obj._current = (char)0;\n\n                State t1;\n                bool t2;\n                Vector4 result = obj.EvalStatement(out t1, out t2);\n\n                obj._reader.Dispose();\n                _readerPool.Release(obj._reader as ReusableStringReader);\n                obj._x = null;\n                obj._strBuilder.Length = 0;\n                obj._parenCount = 0;\n                obj._current = (char)0;\n\n                switch (t1)\n                {\n                    case State.None:\n                        return result;\n                    case State.Scalar:\n                        return result.x;\n                    case State.Vector:\n                        return result;\n                    case State.Quaternion:\n                        return ConvertUtil.ToQuaternion(result);\n                    default:\n                        return result;\n                }\n            }\n            finally\n            {\n                _pool.Release(obj);\n            }\n        }\n\n        public static float EvalNumber(string command, object x)\n        {\n            var obj = _pool.GetInstance();\n            try\n            {\n                return obj.EvalStatement(command, x).x;\n            }\n            finally\n            {\n                _pool.Release(obj);\n            }\n        }\n\n        public static UnityEngine.Vector2 EvalVector2(string command, object x)\n        {\n            var obj = _pool.GetInstance();\n            try\n            {\n                return ConvertUtil.ToVector2(obj.EvalStatement(command, x));\n            }\n            finally\n            {\n                _pool.Release(obj);\n            }\n        }\n\n        public static UnityEngine.Vector3 EvalVector3(string command, object x)\n        {\n            var obj = _pool.GetInstance();\n            try\n            {\n                return ConvertUtil.ToVector3(obj.EvalStatement(command, x));\n            }\n            finally\n            {\n                _pool.Release(obj);\n            }\n        }\n\n        public static Vector4 EvalVector4(string command, object x)\n        {\n            var obj = _pool.GetInstance();\n            try\n            {\n                return obj.EvalStatement(command, x);\n            }\n            finally\n            {\n                _pool.Release(obj);\n            }\n        }\n\n        public static Quaternion EvalQuaternion(string command, object x)\n        {\n            var obj = _pool.GetInstance();\n            try\n            {\n                return ConvertUtil.ToQuaternion(obj.EvalStatement(command, x));\n            }\n            finally\n            {\n                _pool.Release(obj);\n            }\n        }\n\n        public static UnityEngine.Color EvalColor(string command, object x)\n        {\n            var obj = _pool.GetInstance();\n            try\n            {\n                return ConvertUtil.ToColor(obj.EvalStatement(command, x));\n            }\n            finally\n            {\n                _pool.Release(obj);\n            }\n        }\n\n        public static bool EvalBool(string command, object x)\n        {\n            var obj = _pool.GetInstance();\n            try\n            {\n                return !MathUtil.FuzzyEqual(obj.EvalStatement(command, x).x, 0f);\n            }\n            finally\n            {\n                _pool.Release(obj);\n            }\n        }\n\n        public static UnityEngine.Rect EvalRect(string command, object x)\n        {\n            var obj = _pool.GetInstance();\n            try\n            {\n                var v = obj.EvalStatement(command, x);\n                return new UnityEngine.Rect(v.x, v.y, v.z, v.w);\n            }\n            finally\n            {\n                _pool.Release(obj);\n            }\n        }\n\n        public static string EvalString(string command, object x)\n        {\n            var obj = _pool.GetInstance();\n            try\n            {\n                var r = _readerPool.GetInstance();\n                r.Reset(command);\n\n                obj._reader = r;\n                obj._x = x;\n                obj._strBuilder.Length = 0;\n                obj._parenCount = 0;\n                obj._current = (char)0;\n\n                State t1;\n                bool t2;\n                Vector4 result = obj.EvalStatement(out t1, out t2);\n\n                obj._reader.Dispose();\n                _readerPool.Release(obj._reader as ReusableStringReader);\n                obj._x = null;\n                obj._strBuilder.Length = 0;\n                obj._parenCount = 0;\n                obj._current = (char)0;\n\n                switch (t1)\n                {\n                    case State.None:\n                        return result.ToString();\n                    case State.Scalar:\n                        return result.x.ToString();\n                    case State.Vector:\n                        return result.ToDetailedString();\n                    case State.Quaternion:\n                        return ConvertUtil.ToQuaternion(result).eulerAngles.ToDetailedString();\n                    default:\n                        return result.ToString();\n                }\n            }\n            finally\n            {\n                _pool.Release(obj);\n            }\n        }\n\n        #endregion\n\n\n        #region Fields\n\n        private System.IO.TextReader _reader;\n        private object _x;\n        private StringBuilder _strBuilder = new StringBuilder();\n        private int _parenCount;\n        private char _current;\n\n\n        private enum State\n        {\n            None,\n            Scalar,\n            Vector,\n            Quaternion\n        }\n\n        #endregion\n\n        #region Methods\n\n        public Vector4 EvalStatement(string command, object x)\n        {\n            var r = _readerPool.GetInstance();\n            r.Reset(command);\n\n            _reader = r;\n            _x = x;\n            _strBuilder.Length = 0;\n            _parenCount = 0;\n            _current = (char)0;\n\n            State t1;\n            bool t2;\n            Vector4 result = this.EvalStatement(out t1, out t2);\n\n            _reader.Dispose();\n            _readerPool.Release(_reader as ReusableStringReader);\n            _x = null;\n            _strBuilder.Length = 0;\n            _parenCount = 0;\n            _current = (char)0;\n\n            return result;\n        }\n\n        public Vector4 EvalStatement(System.IO.TextReader command, object x)\n        {\n            if (command == null) throw new System.ArgumentNullException(\"command\");\n\n            _reader = command;\n            _x = x;\n            _strBuilder.Length = 0;\n            _parenCount = 0;\n            _current = (char)0;\n\n            State t1;\n            bool t2;\n            Vector4 result = this.EvalStatement(out t1, out t2);\n\n            _reader.Dispose();\n            _x = null;\n            _strBuilder.Length = 0;\n            _parenCount = 0;\n            _current = (char)0;\n\n            return result;\n        }\n\n\n        private Vector4 EvalStatement(out State state, out bool reachedEndOfParams, bool requireClosingParen = false)\n        {\n            Vector4 result = this.EvalNextValue(out state);\n\n            if (_current == ')')\n            {\n                int c = _reader.Read();\n                if (c >= 0) _current = (char)c;\n                _parenCount--;\n                reachedEndOfParams = true;\n                return result;\n            }\n\n            State temp;\n            Vector4 v;\n            for (int i = _current; i >= 0; i = _reader.Read())\n            {\n                _current = (char)i;\n\n                if (char.IsWhiteSpace(_current)) continue;\n\n                switch (_current)\n                {\n                    case '+':\n                        v = this.EvalNextValue(out temp);\n                        result = DoSum(result, v, state, temp, out state);\n                        break;\n                    case '-':\n                        v = this.EvalNextValue(out temp);\n                        result = DoMinus(result, v, state, temp, out state);\n                        break;\n                    case '*':\n                        v = this.EvalNextValue(out temp);\n                        result = DoProduct(result, v, state, temp, out state);\n                        break;\n                    case '/':\n                        v = this.EvalNextValue(out temp);\n                        result = DoDivide(result, v, state, temp, out state);\n                        break;\n                    case '^':\n                        state = State.Scalar;\n                        v = this.EvalNextValue(out temp);\n                        result = new Vector4((float)Math.Pow(result.x, v.x), 0f);\n                        break;\n                    case '%':\n                        state = State.Scalar;\n                        v = this.EvalNextValue(out temp);\n                        result = new Vector4(result.x % v.x, 0f);\n                        break;\n                    case '=':\n                        {\n                            if (_reader.Peek() == '=')\n                            {\n                                _reader.Read();\n                                v = this.EvalNextValue(out temp);\n                                result = DoEquals(result, v, state, temp, out state);\n                            }\n                            else\n                            {\n                                v = this.EvalNextValue(out temp);\n                                result = DoEquals(result, v, state, temp, out state);\n                            }\n                        }\n                        break;\n                    case '!':\n                        {\n                            if (_reader.Peek() == '=')\n                            {\n                                _reader.Read();\n                                v = this.EvalNextValue(out temp);\n                                result = DoNotEquals(result, v, state, temp, out state);\n                            }\n                            else\n                            {\n                                throw new System.InvalidOperationException(\"Failed to parse the command.\");\n                            }\n                        }\n                        break;\n                    case '<':\n                        {\n                            state = State.None;\n                            if (_reader.Peek() == '=')\n                            {\n                                _reader.Read();\n                                v = this.EvalNextValue(out temp);\n                                result = (result.x <= v.x) ? Vector4.one : Vector4.zero;\n                            }\n                            else\n                            {\n                                v = this.EvalNextValue(out temp);\n                                result = (result.x < v.x) ? Vector4.one : Vector4.zero;\n                            }\n                        }\n                        break;\n                    case '>':\n                        {\n                            state = State.None;\n                            if (_reader.Peek() == '=')\n                            {\n                                _reader.Read();\n                                v = this.EvalNextValue(out temp);\n                                result = (result.x >= v.x) ? Vector4.one : Vector4.zero;\n                            }\n                            else\n                            {\n                                v = this.EvalNextValue(out temp);\n                                result = (result.x > v.x) ? Vector4.one : Vector4.zero;\n                            }\n                        }\n                        break;\n                    case '|':\n                        {\n                            if (_reader.Peek() == '|')\n                            {\n                                _reader.Read();\n                                v = this.EvalNextValue(out temp);\n                                state = State.None;\n                                result = (ConvertUtil.ToBool(result.x) || ConvertUtil.ToBool(v.x)) ? Vector4.one : Vector4.zero;\n                            }\n                            else\n                            {\n                                v = this.EvalNextValue(out temp);\n                                state = State.Scalar;\n                                result = new Vector4((float)((int)result.x | (int)v.x), 0f);\n                            }\n                        }\n                        break;\n                    case '&':\n                        {\n                            if (_reader.Peek() == '&')\n                            {\n                                _reader.Read();\n                                v = this.EvalNextValue(out temp);\n                                state = State.None;\n                                result = (ConvertUtil.ToBool(result.x) && ConvertUtil.ToBool(v.x)) ? Vector4.one : Vector4.zero;\n                            }\n                            else\n                            {\n                                v = this.EvalNextValue(out temp);\n                                state = State.Scalar;\n                                result = new Vector4((float)((int)result.x & (int)v.x), 0f);\n                            }\n                        }\n                        break;\n                    case ',':\n                        //reached the end of the first parameter\n                        reachedEndOfParams = false;\n                        return result;\n                    case ')':\n                        //reached the end of the statement\n                        int c = _reader.Read();\n                        if (c >= 0) _current = (char)c;\n                        _parenCount--;\n                        reachedEndOfParams = true;\n                        return result;\n                }\n\n                if (_current == ',')\n                {\n                    reachedEndOfParams = false;\n                    return result;\n                }\n                if (_current == ')')\n                {\n                    int c = _reader.Read();\n                    if (c >= 0) _current = (char)c;\n                    _parenCount--;\n                    reachedEndOfParams = true;\n                    return result;\n                }\n            }\n\n            //ran out of statement with no errors, must be the end\n            if (requireClosingParen)\n                throw new System.InvalidOperationException(\"Failed to parse the command.\");\n\n            reachedEndOfParams = true;\n            return result;\n        }\n\n        private Vector4 EvalNextValue(out State state)\n        {\n            int i = _reader.Read();\n            for (; i >= 0 && char.IsWhiteSpace((char)i); i = _reader.Read())\n            {\n            }\n            if (i < 0)\n            {\n                state = State.None;\n                return Vector4.zero;\n            }\n\n            _current = (char)i;\n            if (!IsValidWordPrefix(_current)) throw new System.InvalidOperationException(\"Failed to parse the command.\");\n\n            if (char.IsDigit(_current))\n            {\n                state = State.Scalar;\n                return new Vector4(EvalNumber(), 0f);\n            }\n            if (char.IsLetter(_current))\n            {\n                return EvalFunc(out state);\n            }\n\n            switch (_current)\n            {\n                case '$':\n                    return this.EvalVariable(out state);\n                case '(':\n                    _parenCount++;\n                    bool temp;\n                    return this.EvalStatement(out state, out temp);\n                case '+':\n                    return this.EvalNextValue(out state);\n                case '-':\n                    var result = this.EvalNextValue(out state);\n                    if (state == State.Quaternion)\n                        result = ConvertUtil.ToVector4(Quaternion.Inverse(ConvertUtil.ToQuaternion(result)));\n                    else\n                        result = -result;\n                    return result;\n                case ')':\n                    state = State.None;\n                    return Vector4.zero;\n                default:\n                    throw new System.InvalidOperationException(\"Failed to parse the command.\");\n            }\n        }\n\n        private float EvalNumber()\n        {\n            const int CHAR_0 = (int)'0';\n            long high = ((int)_current - CHAR_0);\n            long low = 0;\n            int lowLen = -1;\n\n            for (int i = _reader.Read(); i >= 0; i = _reader.Read())\n            {\n                _current = (char)i;\n\n                if (char.IsDigit(_current))\n                {\n                    if (lowLen < 0)\n                        high = (high * 10) + ((int)_current - CHAR_0);\n                    else\n                    {\n                        low = (low * 10) + ((int)_current - CHAR_0);\n                        lowLen++;\n                    }\n                }\n                else if (_current == '.')\n                {\n                    if (lowLen < 0)\n                        lowLen = 0;\n                    else\n                        throw new System.InvalidOperationException(\"Failed to parse the command.\");\n                }\n                else if (char.IsWhiteSpace(_current))\n                {\n                    break;\n                }\n                else if (_current == ')' || _current == ',')\n                {\n                    break;\n                }\n                else if (IsArithmeticSymbol(_current))\n                {\n                    break;\n                }\n                else\n                    throw new System.InvalidOperationException(\"Failed to parse the command.\");\n\n            }\n\n            if (low != 0)\n                return (float)((double)high + ((double)low / Math.Pow(10, lowLen)));\n            else\n                return (float)high;\n        }\n\n        private Vector4 EvalVariable(out State state)\n        {\n            _strBuilder.Length = 0;\n            int i = _reader.Read();\n            if (i < 0)\n            {\n                return SmartConvertToVector(_x, out state);\n            }\n\n            _current = (char)i;\n            if (_current == '.')\n            {\n                var target = _x;\n                string sprop;\n\n                //access x\n                for (i = _reader.Read(); i >= 0; i = _reader.Read())\n                {\n                    _current = (char)i;\n\n                    if (char.IsLetterOrDigit(_current) || _current == '_')\n                    {\n                        _strBuilder.Append(_current);\n                    }\n                    else if (_current == '.')\n                    {\n                        sprop = _strBuilder.ToString();\n                        _strBuilder.Length = 0;\n                        target = DynamicUtil.GetValue(target, sprop);\n                    }\n                    else if (char.IsWhiteSpace(_current) || IsArithmeticSymbol(_current) || _current == ')' || _current == ',' || _current == ']')\n                        break;\n                    else\n                        throw new System.InvalidOperationException(\"Failed to parse the command.\");\n                }\n\n                sprop = _strBuilder.ToString();\n                _strBuilder.Length = 0;\n                return SmartConvertToVector(DynamicUtil.GetValue(target, sprop), out state);\n            }\n            else if (_current == '(')\n            {\n                for (i = _reader.Read(); i >= 0; i = _reader.Read())\n                {\n                    _current = (char)i;\n\n                    if (char.IsLetterOrDigit(_current) || _current == '_')\n                    {\n                        _strBuilder.Append(_current);\n                    }\n                    else if (_current == ')')\n                    {\n                        break;\n                    }\n                    else\n                        throw new System.InvalidOperationException(\"Failed to parse the command.\");\n                }\n\n                i = _reader.Read();\n                if (i < 0 || (char)i != '.')\n                    throw new System.InvalidOperationException(\"Failed to parse the command.\");\n\n                string stp = _strBuilder.ToString();\n                _strBuilder.Length = 0;\n\n                var go = GameObjectUtil.GetGameObjectFromSource(_x);\n                object target = go != null ? go.GetComponent(stp) : null;\n                string sprop;\n\n                //access target\n                for (i = _reader.Read(); i >= 0; i = _reader.Read())\n                {\n                    _current = (char)i;\n\n                    if (char.IsLetterOrDigit(_current) || _current == '_')\n                    {\n                        _strBuilder.Append(_current);\n                    }\n                    else if (_current == '.')\n                    {\n                        sprop = _strBuilder.ToString();\n                        _strBuilder.Length = 0;\n                        target = DynamicUtil.GetValue(target, sprop);\n                    }\n                    else if (char.IsWhiteSpace(_current) || IsArithmeticSymbol(_current) || _current == ')' || _current == ',' || _current == ']')\n                        break;\n                    else\n                        throw new System.InvalidOperationException(\"Failed to parse the command.\");\n                }\n\n                sprop = _strBuilder.ToString();\n                _strBuilder.Length = 0;\n                return SmartConvertToVector(DynamicUtil.GetValue(target, sprop), out state);\n            }\n            else if (char.IsLetterOrDigit(_current) || _current == '_' || _current == '-')\n            {\n                //global\n                _strBuilder.Append(char.ToLower(_current));\n\n                for (i = _reader.Read(); i >= 0; i = _reader.Read())\n                {\n                    _current = (char)i;\n\n                    if (char.IsLetterOrDigit(_current) || _current == '_')\n                    {\n                        _strBuilder.Append(char.ToLower(_current));\n                    }\n                    else if (char.IsWhiteSpace(_current) || IsArithmeticSymbol(_current) || _current == ')' || _current == ',' || _current == ']')\n                        break;\n                    else\n                        throw new System.InvalidOperationException(\"Failed to parse the command.\");\n                }\n\n\n                var str = _strBuilder.ToString();\n                _strBuilder.Length = 0;\n\n                switch (str)\n                {\n                    case \"true\":\n                        state = State.None;\n                        return Vector4.one;\n                    case \"false\":\n                        state = State.None;\n                        return Vector4.zero;\n                    case \"pi\":\n                        state = State.Scalar;\n                        return new Vector4((float)System.Math.PI, 0f);\n                    case \"2pi\":\n                        const float TWO_PI = (float)(System.Math.PI * 2d);\n                        state = State.Scalar;\n                        return new Vector4(TWO_PI, 0f);\n                    case \"pi_2\":\n                        const float PI_TWO = (float)(System.Math.PI / 2d);\n                        state = State.Scalar;\n                        return new Vector4(PI_TWO, 0f);\n                    case \"rad2deg\":\n                        const float RAD2DEG = (float)(180d / System.Math.PI);\n                        state = State.Scalar;\n                        return new Vector4(RAD2DEG, 0f);\n                    case \"deg2rad\":\n                        const float DEG2RAD = (float)(System.Math.PI / 180d);\n                        state = State.Scalar;\n                        return new Vector4(DEG2RAD, 0f);\n                    case \"secsinmin\":\n                        state = State.Scalar;\n                        return new Vector4(60f, 0f);\n                    case \"secsinhour\":\n                        state = State.Scalar;\n                        return new Vector4(3600f, 0f);\n                    case \"secsinday\":\n                        state = State.Scalar;\n                        return new Vector4(86400f, 0f);\n                    case \"secsinweek\":\n                        state = State.Scalar;\n                        return new Vector4(604800f, 0f);\n                    case \"secsinyear\":\n                        state = State.Scalar;\n                        return new Vector4(31536000f, 0f);\n                    case \"infinity\":\n                    case \"inf\":\n                        state = State.Scalar;\n                        return Vector4.one * float.PositiveInfinity;\n                    case \"-infinity\":\n                    case \"-inf\":\n                        state = State.Scalar;\n                        return Vector4.one * float.NegativeInfinity;\n                    case \"time\":\n                        state = State.Scalar;\n                        return new Vector4(UnityEngine.Time.time, 0f);\n                    case \"unscaledtime\":\n                        state = State.Scalar;\n                        return new Vector4(UnityEngine.Time.unscaledTime, 0f);\n                    case \"fixedtime\":\n                        state = State.Scalar;\n                        return new Vector4(UnityEngine.Time.fixedTime, 0f);\n                    case \"deltatime\":\n                        state = State.Scalar;\n                        return new Vector4(UnityEngine.Time.deltaTime, 0f);\n                    case \"fixeddeltatime\":\n                        state = State.Scalar;\n                        return new Vector4(UnityEngine.Time.fixedDeltaTime, 0f);\n                    default:\n                        state = State.None;\n                        return Vector4.zero;\n                }\n            }\n            else if (char.IsWhiteSpace(_current) || IsArithmeticSymbol(_current) || _current == ')' || _current == ',' || _current == ']')\n            {\n                return SmartConvertToVector(_x, out state);\n            }\n            else\n            {\n                throw new System.InvalidOperationException(\"Failed to parse the command.\");\n            }\n\n        }\n\n        private Vector4 EvalFunc(out State state)\n        {\n            _strBuilder.Length = 0;\n            _strBuilder.Append(char.ToLower(_current));\n\n            for (int i = _reader.Read(); i >= 0; i = _reader.Read())\n            {\n                _current = (char)i;\n\n                if (char.IsLetterOrDigit(_current))\n                {\n                    _strBuilder.Append(char.ToLower(_current));\n                }\n                else if (_current == '(')\n                    break;\n                else\n                    throw new System.InvalidOperationException(\"Failed to parse the command.\");\n            }\n\n            var name = _strBuilder.ToString();\n            _strBuilder.Length = 0;\n\n            _parenCount++;\n\n            State temp;\n            bool reachedEnd;\n            switch (name)\n            {\n                case \"abs\":\n                    {\n                        var result = Math.Abs(EvalStatement(out temp, out reachedEnd, true).x);\n                        if (!reachedEnd)\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\n                        state = State.Scalar;\n                        return new Vector4((float)result, 0f);\n                    }\n                case \"sqrt\":\n                    {\n                        var result = Math.Sqrt(EvalStatement(out temp, out reachedEnd, true).x);\n                        if (!reachedEnd)\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\n                        state = State.Scalar;\n                        return new Vector4((float)result, 0f);\n                    }\n                case \"cos\":\n                    {\n                        var result = Math.Cos(EvalStatement(out temp, out reachedEnd, true).x);\n                        if (!reachedEnd)\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\n                        state = State.Scalar;\n                        return new Vector4((float)result, 0f);\n                    }\n                case \"sin\":\n                    {\n                        var result = Math.Sin(EvalStatement(out temp, out reachedEnd, true).x);\n                        if (!reachedEnd)\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\n                        state = State.Scalar;\n                        return new Vector4((float)result, 0f);\n                    }\n                case \"tan\":\n                    {\n                        var result = Math.Tan(EvalStatement(out temp, out reachedEnd, true).x);\n                        if (!reachedEnd)\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\n                        state = State.Scalar;\n                        return new Vector4((float)result, 0f);\n                    }\n                case \"acos\":\n                    {\n                        var result = Math.Acos(EvalStatement(out temp, out reachedEnd, true).x);\n                        if (!reachedEnd)\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\n                        state = State.Scalar;\n                        return new Vector4((float)result, 0f);\n                    }\n                case \"asin\":\n                    {\n                        var result = Math.Asin(EvalStatement(out temp, out reachedEnd, true).x);\n                        if (!reachedEnd)\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\n                        state = State.Scalar;\n                        return new Vector4((float)result, 0f);\n                    }\n                case \"atan\":\n                    {\n                        var result = Math.Atan(EvalStatement(out temp, out reachedEnd, true).x);\n                        if (!reachedEnd)\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\n                        state = State.Scalar;\n                        return new Vector4((float)result, 0f);\n                    }\n                case \"atan2\":\n                    {\n                        float y = this.EvalStatement(out temp, out reachedEnd, true).x;\n                        if (reachedEnd)\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\n                        float x = this.EvalStatement(out temp, out reachedEnd, true).x;\n                        if (!reachedEnd)\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\n                        state = State.Scalar;\n                        return new Vector4((float)Math.Atan2(y, x), 0f);\n                    }\n                case \"rand\":\n                    {\n                        var x = this.EvalStatement(out state, out reachedEnd, true);\n                        if (state == State.Quaternion)\n                        {\n                            state = State.Quaternion;\n                            if (reachedEnd)\n                                return ConvertUtil.ToVector4(Quaternion.Slerp(Quaternion.identity, ConvertUtil.ToQuaternion(x), RandomUtil.Standard.Next()));\n                            var y = this.EvalStatement(out temp, out reachedEnd, true);\n                            if (reachedEnd)\n                                return ConvertUtil.ToVector4(Quaternion.Slerp(ConvertUtil.ToQuaternion(x), ConvertUtil.ToQuaternion(y), RandomUtil.Standard.Next()));\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\n                        }\n                        else\n                        {\n                            if (reachedEnd)\n                                return x * RandomUtil.Standard.Next();\n                            var y = this.EvalStatement(out temp, out reachedEnd, true);\n                            if (reachedEnd)\n                                return RandomUtil.Standard.Next() * (y - x) + x;\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\n                        }\n                    }\n                case \"randint\":\n                    {\n                        state = State.Scalar;\n                        int x = (int)this.EvalStatement(out temp, out reachedEnd, true).x;\n                        if (reachedEnd)\n                            return new Vector4(RandomUtil.Standard.Next(x), 0f);\n                        int y = (int)this.EvalStatement(out temp, out reachedEnd, true).x;\n                        if (!reachedEnd)\n                            throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\n                        return new Vector4(RandomUtil.Standard.Next(x, y), 0f);\n                    }\n                case \"vec\":\n                    {\n                        state = State.Vector;\n                        float x = this.EvalStatement(out temp, out reachedEnd, true).x;\n                        if (reachedEnd)\n                            return new Vector4(x, 0f);\n                        float y = this.EvalStatement(out temp, out reachedEnd, true).x;\n                        if (reachedEnd)\n                            return new Vector4(x, y);\n                        float z = this.EvalStatement(out temp, out reachedEnd, true).x;\n                        if (reachedEnd)\n                            return new Vector4(x, y, z);\n                        float w = this.EvalStatement(out temp, out reachedEnd, true).x;\n                        if (reachedEnd)\n                            return new Vector4(x, y, z, w);\n                        throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\n                    }\n                case \"rot\":\n                    {\n                        state = State.Quaternion;\n                        float x = this.EvalStatement(out temp, out reachedEnd, true).x;\n                        if (reachedEnd)\n                            return ConvertUtil.ToVector4(Quaternion.Euler(x, 0f, 0f));\n                        float y = this.EvalStatement(out temp, out reachedEnd, true).x;\n                        if (reachedEnd)\n                            return ConvertUtil.ToVector4(Quaternion.Euler(x, y, 0f));\n                        float z = this.EvalStatement(out temp, out reachedEnd, true).x;\n                        if (reachedEnd)\n                            return ConvertUtil.ToVector4(Quaternion.Euler(x, y, z));\n                        throw new System.InvalidOperationException(\"Failed to parse the command: Parameter count mismatch.\");\n                    }\n                default:\n                    throw new System.InvalidOperationException(\"Failed to parse the command: Unknown Function\");\n            }\n        }\n\n        #endregion\n\n        #region Utils\n\n        private static State GetStateTypeOfObject(object obj)\n        {\n            if (obj == null) return State.None;\n\n            switch (VariantReference.GetVariantType(obj.GetType()))\n            {\n                case VariantType.Object:\n                case VariantType.Null:\n                case VariantType.String:\n                case VariantType.Boolean:\n                    return State.None;\n                case VariantType.Integer:\n                case VariantType.Float:\n                case VariantType.Double:\n                    return State.Scalar;\n                case VariantType.Vector2:\n                case VariantType.Vector3:\n                case VariantType.Vector4:\n                    return State.Vector;\n                case VariantType.Quaternion:\n                    return State.Quaternion;\n                case VariantType.Color:\n                    return State.Vector;\n                case VariantType.DateTime:\n                case VariantType.GameObject:\n                case VariantType.Component:\n                    return State.None;\n                case VariantType.LayerMask:\n                    return State.Scalar;\n                case VariantType.Rect:\n                    return State.Vector;\n                default:\n                    return State.None;\n            }\n        }\n\n        private static Vector4 SmartConvertToVector(object obj, out State state)\n        {\n            state = GetStateTypeOfObject(obj);\n            switch (state)\n            {\n                case State.None:\n                    return ConvertUtil.ToVector4(obj);\n                case State.Scalar:\n                    return new Vector4(ConvertUtil.ToSingle(obj), 0f);\n                case State.Vector:\n                case State.Quaternion:\n                    return ConvertUtil.ToVector4(obj);\n                default:\n                    return Vector4.zero;\n            }\n        }\n\n\n\n        private static bool IsArithmeticSymbol(char c)\n        {\n            switch (c)\n            {\n                case '+':\n                case '*':\n                case '-':\n                case '/':\n                case '%':\n                case '^':\n                    return true;\n                default:\n                    return false;\n            }\n        }\n\n        private static bool IsValidWordPrefix(char c)\n        {\n            return char.IsLetterOrDigit(c) || c == '$' || c == '_' || c == '+' || c == '-' || c == '(';\n        }\n\n\n\n        private static Vector4 DoSum(Vector4 left, Vector4 right, State sleft, State sright, out State state)\n        {\n            state = State.None;\n            Vector4 result = Vector4.zero;\n\n            switch (sleft)\n            {\n                case State.None:\n                    switch (sright)\n                    {\n                        case State.None:\n                        case State.Vector:\n                        case State.Scalar:\n                            state = sright;\n                            result = left + right;\n                            break;\n                        case State.Quaternion:\n                            state = State.None;\n                            result = left + right;\n                            break;\n                    }\n                    break;\n                case State.Scalar:\n                    switch (sright)\n                    {\n                        case State.None:\n                        case State.Scalar:\n                        case State.Vector:\n                        case State.Quaternion:\n                            state = State.Scalar;\n                            result.x = left.x + right.x;\n                            break;\n                    }\n                    break;\n                case State.Vector:\n                    switch (sright)\n                    {\n                        case State.None:\n                            state = State.None;\n                            result = left + right;\n                            break;\n                        case State.Scalar:\n                            state = State.Vector;\n                            result.x = left.x + right.x;\n                            break;\n                        case State.Vector:\n                            state = State.Vector;\n                            result = left + right;\n                            break;\n                        case State.Quaternion:\n                            state = State.None;\n                            result = left + right;\n                            break;\n                    }\n                    break;\n                case State.Quaternion:\n                    switch (sright)\n                    {\n                        case State.None:\n                        case State.Scalar:\n                        case State.Vector:\n                        case State.Quaternion:\n                            state = State.None;\n                            result = left + right;\n                            break;\n                    }\n                    break;\n            }\n\n            return result;\n        }\n\n        private static Vector4 DoMinus(Vector4 left, Vector4 right, State sleft, State sright, out State state)\n        {\n            state = State.None;\n            Vector4 result = Vector4.zero;\n\n            switch (sleft)\n            {\n                case State.None:\n                    switch (sright)\n                    {\n                        case State.None:\n                        case State.Vector:\n                        case State.Scalar:\n                            state = sright;\n                            result = left - right;\n                            break;\n                        case State.Quaternion:\n                            state = State.None;\n                            result = left - right;\n                            break;\n                    }\n                    break;\n                case State.Scalar:\n                    switch (sright)\n                    {\n                        case State.None:\n                        case State.Scalar:\n                        case State.Vector:\n                        case State.Quaternion:\n                            state = State.Scalar;\n                            result.x = left.x - right.x;\n                            break;\n                    }\n                    break;\n                case State.Vector:\n                    switch (sright)\n                    {\n                        case State.None:\n                            state = State.None;\n                            result = left - right;\n                            break;\n                        case State.Scalar:\n                            state = State.Vector;\n                            result.x = left.x - right.x;\n                            break;\n                        case State.Vector:\n                            state = State.Vector;\n                            result = left - right;\n                            break;\n                        case State.Quaternion:\n                            state = State.None;\n                            result = left - right;\n                            break;\n                    }\n                    break;\n                case State.Quaternion:\n                    switch (sright)\n                    {\n                        case State.None:\n                        case State.Scalar:\n                        case State.Vector:\n                        case State.Quaternion:\n                            state = State.None;\n                            result = left - right;\n                            break;\n                    }\n                    break;\n            }\n\n            return result;\n        }\n\n        private static Vector4 DoProduct(Vector4 left, Vector4 right, State sleft, State sright, out State state)\n        {\n            state = State.None;\n            Vector4 result = Vector4.zero;\n\n            switch (sleft)\n            {\n                case State.None:\n                    switch (sright)\n                    {\n                        case State.None:\n                        case State.Vector:\n                            state = State.None;\n                            result.x = left.x * right.x;\n                            result.y = left.y * right.y;\n                            result.z = left.z * right.z;\n                            result.w = left.w * right.w;\n                            break;\n                        case State.Scalar:\n                            state = State.Scalar;\n                            result.x = left.x * right.x;\n                            break;\n                        case State.Quaternion:\n                            state = State.Quaternion;\n                            result = ConvertUtil.ToVector4(ConvertUtil.ToQuaternion(left) * ConvertUtil.ToQuaternion(right));\n                            break;\n                    }\n                    break;\n                case State.Scalar:\n                    switch (sright)\n                    {\n                        case State.None:\n                        case State.Scalar:\n                            state = State.Scalar;\n                            result.x = left.x * right.x;\n                            break;\n                        case State.Vector:\n                            state = State.Vector;\n                            result = right * left.x;\n                            break;\n                        case State.Quaternion:\n                            state = State.None;\n                            result = right * left.x;\n                            break;\n                    }\n                    break;\n                case State.Vector:\n                    switch (sright)\n                    {\n                        case State.None:\n                        case State.Scalar:\n                            state = State.Vector;\n                            result = left * right.x;\n                            break;\n                        case State.Vector:\n                            state = State.None;\n                            result.x = left.x * right.x;\n                            result.y = left.y * right.y;\n                            result.z = left.z * right.z;\n                            result.w = left.w * right.w;\n                            break;\n                        case State.Quaternion:\n                            state = State.Quaternion;\n                            result = ConvertUtil.ToVector4(ConvertUtil.ToQuaternion(right) * left);\n                            break;\n                    }\n                    break;\n                case State.Quaternion:\n                    switch (sright)\n                    {\n                        case State.None:\n                            state = State.None;\n                            result.x = left.x * right.x;\n                            result.y = left.y * right.y;\n                            result.z = left.z * right.z;\n                            result.w = left.w * right.w;\n                            break;\n                        case State.Scalar:\n                            state = State.None;\n                            result = left * right.x;\n                            break;\n                        case State.Vector:\n                            state = State.Vector;\n                            result = ConvertUtil.ToVector4(ConvertUtil.ToQuaternion(left) * right);\n                            break;\n                        case State.Quaternion:\n                            state = State.Quaternion;\n                            result = ConvertUtil.ToVector4(ConvertUtil.ToQuaternion(left) * ConvertUtil.ToQuaternion(right));\n                            break;\n                    }\n                    break;\n            }\n\n            return result;\n        }\n\n        private static Vector4 DoDivide(Vector4 left, Vector4 right, State sleft, State sright, out State state)\n        {\n            state = State.None;\n            Vector4 result = Vector4.zero;\n\n            switch (sleft)\n            {\n                case State.None:\n                    switch (sright)\n                    {\n                        case State.None:\n                        case State.Vector:\n                            state = State.None;\n                            result.x = left.x / right.x;\n                            result.y = left.y / right.y;\n                            result.z = left.z / right.z;\n                            result.w = left.w / right.w;\n                            break;\n                        case State.Scalar:\n                            state = State.Scalar;\n                            result.x = left.x / right.x;\n                            break;\n                        case State.Quaternion:\n                            state = State.Quaternion;\n                            result = ConvertUtil.ToVector4(ConvertUtil.ToQuaternion(left) * Quaternion.Inverse(ConvertUtil.ToQuaternion(right)));\n                            break;\n                    }\n                    break;\n                case State.Scalar:\n                    switch (sright)\n                    {\n                        case State.None:\n                        case State.Scalar:\n                            state = State.Scalar;\n                            result.x = left.x / right.x;\n                            break;\n                        case State.Vector:\n                            state = State.Vector;\n                            result = right / left.x;\n                            break;\n                        case State.Quaternion:\n                            state = State.None;\n                            result = ConvertUtil.ToVector4(Quaternion.Inverse(ConvertUtil.ToQuaternion(right))) * left.x;\n                            break;\n                    }\n                    break;\n                case State.Vector:\n                    switch (sright)\n                    {\n                        case State.None:\n                        case State.Scalar:\n                            state = State.Vector;\n                            result = left / right.x;\n                            break;\n                        case State.Vector:\n                            state = State.None;\n                            result.x = left.x / right.x;\n                            result.y = left.y / right.y;\n                            result.z = left.z / right.z;\n                            result.w = left.w / right.w;\n                            break;\n                        case State.Quaternion:\n                            state = State.Quaternion;\n                            result = ConvertUtil.ToVector4(Quaternion.Inverse(ConvertUtil.ToQuaternion(right)) * left);\n                            break;\n                    }\n                    break;\n                case State.Quaternion:\n                    switch (sright)\n                    {\n                        case State.None:\n                        case State.Vector:\n                            state = State.None;\n                            result.x = left.x / right.x;\n                            result.y = left.y / right.y;\n                            result.z = left.z / right.z;\n                            result.w = left.w / right.w;\n                            break;\n                        case State.Scalar:\n                            state = State.None;\n                            result = left / right.x;\n                            break;\n                        case State.Quaternion:\n                            state = State.Quaternion;\n                            result = ConvertUtil.ToVector4(ConvertUtil.ToQuaternion(left) * Quaternion.Inverse(ConvertUtil.ToQuaternion(right)));\n                            break;\n                    }\n                    break;\n            }\n\n            return result;\n        }\n\n        private static Vector4 DoEquals(Vector4 left, Vector4 right, State sleft, State sright, out State state)\n        {\n            state = State.None;\n            Vector4 result = Vector4.zero;\n\n            switch (sleft)\n            {\n                case State.Scalar:\n                    state = State.None;\n                    result = MathUtil.FuzzyEqual(left.x, right.x) ? Vector4.one : Vector4.zero;\n                    break;\n                default:\n                    state = State.None;\n                    result = VectorUtil.FuzzyEquals(left, right) ? Vector4.one : Vector4.zero;\n                    break;\n            }\n            return result;\n        }\n\n        private static Vector4 DoNotEquals(Vector4 left, Vector4 right, State sleft, State sright, out State state)\n        {\n            state = State.None;\n            Vector4 result = Vector4.zero;\n\n            switch (sleft)\n            {\n                case State.Scalar:\n                    state = State.None;\n                    result = MathUtil.FuzzyEqual(left.x, right.x) ? Vector4.zero : Vector4.one;\n                    break;\n                default:\n                    state = State.None;\n                    result = VectorUtil.FuzzyEquals(left, right) ? Vector4.zero : Vector4.one;\n                    break;\n            }\n            return result;\n        }\n\n\n\n\n\n        public static object TrySum(object a, object b)\n        {\n            if (a == null) return b;\n            if (b == null) return a;\n\n            var atp = a.GetType();\n            if (ConvertUtil.IsNumericType(atp))\n            {\n                return ConvertUtil.ToPrim(ConvertUtil.ToDouble(a) + ConvertUtil.ToDouble(b), atp);\n            }\n            else if (atp == typeof(UnityEngine.Vector2))\n            {\n                return ConvertUtil.ToVector2(a) + ConvertUtil.ToVector2(b);\n            }\n            else if (atp == typeof(UnityEngine.Vector3))\n            {\n                return ConvertUtil.ToVector3(a) + ConvertUtil.ToVector3(b);\n            }\n            else if (atp == typeof(UnityEngine.Vector4))\n            {\n                return ConvertUtil.ToVector4(a) + ConvertUtil.ToVector4(b);\n            }\n            else if (atp == typeof(UnityEngine.Quaternion))\n            {\n                return ConvertUtil.ToQuaternion(a) * ConvertUtil.ToQuaternion(b);\n            }\n            else if (atp == typeof(UnityEngine.Color))\n            {\n                return ConvertUtil.ToColor(a) + ConvertUtil.ToColor(b);\n            }\n            else if (atp == typeof(UnityEngine.Color32))\n            {\n                return ConvertUtil.ToColor32(ConvertUtil.ToColor(a) + ConvertUtil.ToColor(b));\n            }\n            else\n            {\n                return b;\n            }\n        }\n\n        public static object TryDifference(object a, object b)\n        {\n            if (a == null) return b;\n            if (b == null) return a;\n\n            var atp = a.GetType();\n            if (ConvertUtil.IsNumericType(atp))\n            {\n                return ConvertUtil.ToPrim(ConvertUtil.ToDouble(a) - ConvertUtil.ToDouble(b), atp);\n            }\n            else if (atp == typeof(UnityEngine.Vector2))\n            {\n                return ConvertUtil.ToVector2(a) - ConvertUtil.ToVector2(b);\n            }\n            else if (atp == typeof(UnityEngine.Vector3))\n            {\n                return ConvertUtil.ToVector3(a) - ConvertUtil.ToVector3(b);\n            }\n            else if (atp == typeof(UnityEngine.Vector4))\n            {\n                return ConvertUtil.ToVector4(a) - ConvertUtil.ToVector4(b);\n            }\n            else if (atp == typeof(UnityEngine.Quaternion))\n            {\n                return ConvertUtil.ToQuaternion(a) * UnityEngine.Quaternion.Inverse(ConvertUtil.ToQuaternion(b));\n            }\n            else if (atp == typeof(UnityEngine.Color))\n            {\n                return ConvertUtil.ToColor(a) - ConvertUtil.ToColor(b);\n            }\n            else if (atp == typeof(UnityEngine.Color32))\n            {\n                return ConvertUtil.ToColor32(ConvertUtil.ToColor(a) - ConvertUtil.ToColor(b));\n            }\n            else\n            {\n                return b;\n            }\n        }\n\n        public static object TryToggle(object value)\n        {\n            if (value == null) return null;\n\n            var tp = value.GetType();\n            if (ConvertUtil.IsNumericType(tp))\n            {\n                return ConvertUtil.ToPrim(ConvertUtil.ToDouble(value) * -1.0, tp);\n            }\n            else if (tp == typeof(UnityEngine.Vector2))\n            {\n                return ConvertUtil.ToVector2(value) * -1f;\n            }\n            else if (tp == typeof(UnityEngine.Vector3))\n            {\n                return ConvertUtil.ToVector3(value) * -1f;\n            }\n            else if (tp == typeof(UnityEngine.Vector4))\n            {\n                return ConvertUtil.ToVector4(value) * -1f;\n            }\n            else if (tp == typeof(UnityEngine.Quaternion))\n            {\n                return UnityEngine.Quaternion.Inverse(ConvertUtil.ToQuaternion(value));\n            }\n            else\n            {\n                return value;\n            }\n        }\n\n        public static object TryLerp(object a, object b, float t)\n        {\n            if (a == null) return b;\n            if (b == null) return a;\n\n            var atp = a.GetType();\n            if (ConvertUtil.IsNumericType(atp))\n            {\n                return ConvertUtil.ToPrim(MathUtil.Interpolate(ConvertUtil.ToSingle(a), ConvertUtil.ToSingle(b), t), atp);\n            }\n            else if (atp == typeof(UnityEngine.Vector2))\n            {\n                return UnityEngine.Vector2.LerpUnclamped(ConvertUtil.ToVector2(a), ConvertUtil.ToVector2(b), t);\n            }\n            else if (atp == typeof(UnityEngine.Vector3))\n            {\n                return UnityEngine.Vector3.LerpUnclamped(ConvertUtil.ToVector3(a), ConvertUtil.ToVector3(b), t);\n            }\n            else if (atp == typeof(UnityEngine.Vector4))\n            {\n                return UnityEngine.Vector4.LerpUnclamped(ConvertUtil.ToVector4(a), ConvertUtil.ToVector4(b), t);\n            }\n            else if (atp == typeof(UnityEngine.Quaternion))\n            {\n                return UnityEngine.Quaternion.LerpUnclamped(ConvertUtil.ToQuaternion(a), ConvertUtil.ToQuaternion(b), t);\n            }\n            else if (atp == typeof(UnityEngine.Color))\n            {\n                return UnityEngine.Color.LerpUnclamped(ConvertUtil.ToColor(a), ConvertUtil.ToColor(b), t);\n            }\n            else if (atp == typeof(UnityEngine.Color32))\n            {\n                return UnityEngine.Color32.LerpUnclamped(ConvertUtil.ToColor32(a), ConvertUtil.ToColor32(b), t);\n            }\n            else\n            {\n                return (t < 0.5f) ? a : b;\n            }\n        }\n\n        public static bool WillArithmeticallyCompute(System.Type tp)\n        {\n            if (ConvertUtil.IsNumericType(tp)) return true;\n            if (tp == typeof(UnityEngine.Vector2)) return true;\n            if (tp == typeof(UnityEngine.Vector3)) return true;\n            if (tp == typeof(UnityEngine.Vector4)) return true;\n            if (tp == typeof(UnityEngine.Quaternion)) return true;\n            if (tp == typeof(Variant)) return true;\n\n            return false;\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyBase/EditorOnly/IValidateReceiver.cs",
    "content": "﻿using System;\n\nnamespace com.spacepuppy.EditorOnly\n{\n    /// <summary>\n    /// Receives a signal that the inspector validated for a component/scriptableobject that this object is a member of.\n    /// Only sent to objects that aren't serialized by reference (custom classes/structs marked serializable). \n    /// Make sure your SPSettings has UseSPEditorAsDefault and SignalValidateReceiver enabled.\n    /// </summary>\n    public interface IValidateReceiver\n    {\n\n        void OnValidate();\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyBase/Enums.cs",
    "content": "﻿namespace com.spacepuppy\r\n{\r\n\r\n    public enum VariantType : sbyte\r\n    {\r\n        Object = -1,\r\n        Null = 0,\r\n        String = 1,\r\n        Boolean = 2,\r\n        Integer = 3,\r\n        Float = 4,\r\n        Double = 5,\r\n        Vector2 = 6,\r\n        Vector3 = 7,\r\n        Vector4 = 8,\r\n        Quaternion = 9,\r\n        Color = 10,\r\n        DateTime = 11,\r\n        GameObject = 12,\r\n        Component = 13,\r\n        LayerMask = 14,\r\n        Rect = 15,\r\n        Numeric = 16\r\n    }\r\n\r\n    /// <summary>\r\n    /// Used with the TypeReference class to define how the inspector should show the types in the drop down.\r\n    /// </summary>\r\n    public enum TypeDropDownListingStyle\r\n    {\r\n        Namespace = 0,\r\n        Flat = 1,\r\n        ComponentMenu = 2\r\n    }\r\n\r\n    /// <summary>\r\n    /// Describe an axis in cartesian coordinates, Useful for components that need to serialize which axis to use in some fashion.\r\n    /// </summary>\r\n    public enum CartesianAxis\r\n    {\r\n        Zneg = -3,\r\n        Yneg = -2,\r\n        Xneg = -1,\r\n        X = 0,\r\n        Y = 1,\r\n        Z = 2\r\n    }\r\n\r\n    [System.Flags()]\r\n    public enum Constraint\r\n    {\r\n        None = UnityEngine.RigidbodyConstraints.None,\r\n        XPosition = UnityEngine.RigidbodyConstraints.FreezePositionX,\r\n        YPosition = UnityEngine.RigidbodyConstraints.FreezePositionY,\r\n        ZPosition = UnityEngine.RigidbodyConstraints.FreezePositionZ,\r\n        Position = UnityEngine.RigidbodyConstraints.FreezePosition,\r\n        XRotation = UnityEngine.RigidbodyConstraints.FreezeRotationX,\r\n        YRotation = UnityEngine.RigidbodyConstraints.FreezeRotationY,\r\n        ZRotation = UnityEngine.RigidbodyConstraints.FreezeRotationZ,\r\n        Rotation = UnityEngine.RigidbodyConstraints.FreezeRotation,\r\n        All = UnityEngine.RigidbodyConstraints.FreezeAll\r\n    }\r\n\r\n    /// <summary>\r\n    /// Enum used by InfoboxAttribute to define which message box type to display as.\r\n    /// </summary>\r\n    public enum InfoBoxMessageType\r\n    {\r\n        None = 0,\r\n        Info = 1,\r\n        Warning = 2,\r\n        Error = 3\r\n    }\r\n\r\n    [System.Flags()]\r\n    public enum ComparisonOperator\r\n    {\r\n        NotEqual = 0,\r\n        LessThan = 1,\r\n        GreaterThan = 2,\r\n        NotEqualAlt = 3,\r\n        Equal = 4,\r\n        LessThanEqual = 5,\r\n        GreatThanEqual = 6,\r\n        Always = 7\r\n    }\r\n\r\n    public enum EntityRelativity\r\n    {\r\n        Entity = 0,\r\n        Self = 1,\r\n        SelfAndChildren = 2\r\n    }\r\n\r\n    /// <summary>\r\n    /// Search parameter type\r\n    /// </summary>\r\n    public enum SearchBy\r\n    {\r\n        Nothing = 0,\r\n        Tag = 1,\r\n        Name = 2,\r\n        Type = 3\r\n    }\r\n\r\n    public enum QuitState\r\n    {\r\n        None,\r\n        BeforeQuit,\r\n        Quit\r\n    }\r\n    \r\n    public enum EnableMode\r\n    {\r\n        Enable = 0,\r\n        Disable = 1,\r\n        Toggle = 2\r\n    }\r\n\r\n    public enum AudioInterruptMode\r\n    {\r\n        StopIfPlaying = 0,\r\n        DoNotPlayIfPlaying = 1,\r\n        PlayOverExisting = 2\r\n    }\r\n\r\n    public enum DisableMode\r\n    {\r\n        None,\r\n        DisableComponent,\r\n        DisableGameObject\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Exceptions.cs",
    "content": "﻿using System;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    public class AbsentNotificationReceiverException : System.Exception\r\n    {\r\n\r\n        private Notification _n;\r\n\r\n        public AbsentNotificationReceiverException(Notification n, string msg)\r\n            : base()\r\n        {\r\n            _n = n;\r\n        }\r\n\r\n        public Notification Notification { get { return _n; } }\r\n\r\n    }\r\n\r\n    public class MissingReferenceOfTypeException : UnityEngine.MissingReferenceException\r\n    {\r\n\r\n        private Type _requiredType;\r\n\r\n        public MissingReferenceOfTypeException()\r\n            : base(\"Missing reference to object pertinenant to operation.\")\r\n        {\r\n            _requiredType = null;\r\n        }\r\n\r\n        public MissingReferenceOfTypeException(Type tp)\r\n            : base(\"Missing reference to object of type '\" + tp.Name + \"' which is pertinenant to operatoin.\")\r\n        {\r\n            _requiredType = tp;\r\n        }\r\n\r\n        public MissingReferenceOfTypeException(string msg, Type tp)\r\n            : base(msg)\r\n        {\r\n            _requiredType = tp;\r\n        }\r\n\r\n        public Type RequiredType { get { return _requiredType; } }\r\n\r\n    }\r\n\r\n    public class EntityMissingReferenceException : MissingReferenceOfTypeException\r\n    {\r\n\r\n        private UnityEngine.GameObject _root;\r\n\r\n        public EntityMissingReferenceException(UnityEngine.GameObject root)\r\n            : base(\"GameObject entity '\" + root.name + \"' is missing a reference to an object pertinenant to operation.\", null)\r\n        {\r\n            _root = root;\r\n        }\r\n\r\n        public EntityMissingReferenceException(UnityEngine.GameObject root, Type tp)\r\n            : base(\"GameObject entity '\" + root.name + \"' is missing a reference to an object of type '\" + tp.Name + \"' which is pertinenant to operation.\", tp)\r\n        {\r\n            _root = root;\r\n        }\r\n\r\n        public EntityMissingReferenceException(UnityEngine.GameObject root, string msg, Type tp)\r\n            : base(msg, tp)\r\n        {\r\n            _root = root;\r\n        }\r\n\r\n        public UnityEngine.GameObject EntityRoot { get { return _root; } }\r\n\r\n    }\r\n\r\n    public class DuplicateKeyException : Exception\r\n    {\r\n\r\n        public DuplicateKeyException() :\r\n            base(\"An item was added that generated a duplicate key for an existing item.\")\r\n        {\r\n\r\n        }\r\n\r\n        public DuplicateKeyException(Exception innerException) :\r\n            base(\"An item was added that generated a duplicate key for an existing item.\", innerException)\r\n        {\r\n\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/ExceptionsLite.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    public class TypeArgumentMismatchException : System.ArgumentException\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private System.Type _type;\r\n        private System.Type _mismatchType;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TypeArgumentMismatchException(System.Type tp, System.Type mismatchType)\r\n            : this(tp, mismatchType, \"Type argument did not match the desired type.\", null)\r\n        {\r\n\r\n        }\r\n\r\n        public TypeArgumentMismatchException(System.Type tp, System.Type mismatchType, string paramName)\r\n            : this(tp, mismatchType, \"Type argument did not match the desired type.\", paramName)\r\n        {\r\n\r\n        }\r\n\r\n        public TypeArgumentMismatchException(System.Type tp, System.Type mismatchType, string msg, string paramName)\r\n            : this(tp, mismatchType, msg, paramName, null)\r\n        {\r\n        }\r\n\r\n        public TypeArgumentMismatchException(System.Type tp, System.Type mismatchType, string msg, string paramName, System.Exception innerException)\r\n            : base(msg, paramName, innerException)\r\n        {\r\n            _type = tp;\r\n            _mismatchType = mismatchType;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        /// <summary>\r\n        /// The type supplied as an argument.\r\n        /// </summary>\r\n        public System.Type Type { get { return _type; } }\r\n\r\n        /// <summary>\r\n        /// The type Type aught to be.\r\n        /// </summary>\r\n        public System.Type MismatchType { get { return _mismatchType; } }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/FixedPercentDecimal.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing UnityEngine;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    [System.Serializable()]\r\n    public struct FixedPercentDecimal : IConvertible, IEquatable<FixedPercentDecimal>, IFormattable, UnityEngine.ISerializationCallbackReceiver\r\n    {\r\n\r\n        public const decimal MAX_VALUE = decimal.MaxValue;\r\n        public const decimal MIN_VALUE = decimal.MinValue;\r\n\r\n        #region Fields\r\n\r\n        private decimal _value;\r\n        [SerializeField()]\r\n        private int[] _bits;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public FixedPercentDecimal(float value)\r\n        {\r\n            _value = System.Convert.ToDecimal(value);\r\n            _bits = null;\r\n        }\r\n\r\n        public FixedPercentDecimal(double value)\r\n        {\r\n            _value = System.Convert.ToDecimal(value);\r\n            _bits = null;\r\n        }\r\n\r\n        public FixedPercentDecimal(decimal value)\r\n        {\r\n            _value = value;\r\n            _bits = null;\r\n        }\r\n\r\n        public FixedPercentDecimal(int value)\r\n        {\r\n            _value = (decimal)value;\r\n            _bits = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public decimal Value\r\n        {\r\n            get { return _value; }\r\n            set { _value = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override bool Equals(object obj)\r\n        {\r\n            if (obj is FixedPercent)\r\n                return _value == ((FixedPercentDecimal)obj)._value;\r\n\r\n            var d = com.spacepuppy.Utils.ConvertUtil.ToDecimal(obj);\r\n            return d == this.Value;\r\n        }\r\n\r\n        public override int GetHashCode()\r\n        {\r\n            return _value.GetHashCode();\r\n        }\r\n\r\n        public bool Equals(FixedPercentDecimal other)\r\n        {\r\n            return _value == other._value;\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return _value.ToString();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Conversion\r\n\r\n        public static implicit operator FixedPercentDecimal(float f)\r\n        {\r\n            return new FixedPercentDecimal(f);\r\n        }\r\n\r\n        public static implicit operator FixedPercentDecimal(double f)\r\n        {\r\n            return new FixedPercentDecimal(f);\r\n        }\r\n\r\n        public static implicit operator FixedPercentDecimal(decimal d)\r\n        {\r\n            return new FixedPercentDecimal(d);\r\n        }\r\n\r\n        public static implicit operator FixedPercentDecimal(int i)\r\n        {\r\n            return new FixedPercentDecimal(i);\r\n        }\r\n\r\n        public static explicit operator float (FixedPercentDecimal p)\r\n        {\r\n            return Convert.ToSingle(p.Value);\r\n        }\r\n\r\n        public static explicit operator double (FixedPercentDecimal p)\r\n        {\r\n            return Convert.ToDouble(p.Value);\r\n        }\r\n\r\n        public static implicit operator decimal (FixedPercentDecimal p)\r\n        {\r\n            return p.Value;\r\n        }\r\n\r\n        public static explicit operator int (FixedPercentDecimal p)\r\n        {\r\n            return (int)p.Value;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Operators\r\n\r\n        public static FixedPercentDecimal operator +(FixedPercentDecimal a)\r\n        {\r\n            return a;\r\n        }\r\n\r\n        public static FixedPercentDecimal operator ++(FixedPercentDecimal a)\r\n        {\r\n            return new FixedPercentDecimal(a._value + 1M);\r\n        }\r\n\r\n        public static FixedPercentDecimal operator +(FixedPercentDecimal a, FixedPercentDecimal b)\r\n        {\r\n            return new FixedPercentDecimal(a._value + b._value);\r\n        }\r\n\r\n        public static FixedPercentDecimal operator -(FixedPercentDecimal a)\r\n        {\r\n            a._value = -a._value;\r\n            return a;\r\n        }\r\n\r\n        public static FixedPercentDecimal operator --(FixedPercentDecimal a)\r\n        {\r\n            return new FixedPercentDecimal(a._value - 1M);\r\n        }\r\n\r\n        public static FixedPercentDecimal operator -(FixedPercentDecimal a, FixedPercentDecimal b)\r\n        {\r\n            return new FixedPercentDecimal(a._value - b._value);\r\n        }\r\n\r\n        public static FixedPercentDecimal operator *(FixedPercentDecimal a, FixedPercentDecimal b)\r\n        {\r\n            return new FixedPercentDecimal(a._value * b._value);\r\n        }\r\n\r\n        public static FixedPercentDecimal operator /(FixedPercentDecimal a, FixedPercentDecimal b)\r\n        {\r\n            return new FixedPercentDecimal(a._value / b._value);\r\n        }\r\n\r\n        public static bool operator >(FixedPercentDecimal a, FixedPercentDecimal b)\r\n        {\r\n            return a._value > b._value;\r\n        }\r\n\r\n        public static bool operator <(FixedPercentDecimal a, FixedPercentDecimal b)\r\n        {\r\n            return a._value < b._value;\r\n        }\r\n\r\n        public static bool operator >=(FixedPercentDecimal a, FixedPercentDecimal b)\r\n        {\r\n            return a._value >= b._value;\r\n        }\r\n\r\n        public static bool operator <=(FixedPercentDecimal a, FixedPercentDecimal b)\r\n        {\r\n            return a._value <= b._value;\r\n        }\r\n\r\n        public static bool operator ==(FixedPercentDecimal a, FixedPercentDecimal b)\r\n        {\r\n            return a._value == b._value;\r\n        }\r\n\r\n        public static bool operator !=(FixedPercentDecimal a, FixedPercentDecimal b)\r\n        {\r\n            return a._value != b._value;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IConvertible Interface\r\n\r\n        public TypeCode GetTypeCode()\r\n        {\r\n            return TypeCode.Decimal;\r\n        }\r\n\r\n        bool IConvertible.ToBoolean(IFormatProvider provider)\r\n        {\r\n            return _value != 0;\r\n        }\r\n\r\n        byte IConvertible.ToByte(IFormatProvider provider)\r\n        {\r\n            return Convert.ToByte(this._value);\r\n        }\r\n\r\n        char IConvertible.ToChar(IFormatProvider provider)\r\n        {\r\n            return Convert.ToChar(this._value);\r\n        }\r\n\r\n        DateTime IConvertible.ToDateTime(IFormatProvider provider)\r\n        {\r\n            return Convert.ToDateTime(this._value);\r\n        }\r\n\r\n        decimal IConvertible.ToDecimal(IFormatProvider provider)\r\n        {\r\n            return this._value;\r\n        }\r\n\r\n        double IConvertible.ToDouble(IFormatProvider provider)\r\n        {\r\n            return Convert.ToDouble(this._value);\r\n        }\r\n\r\n        short IConvertible.ToInt16(IFormatProvider provider)\r\n        {\r\n            return Convert.ToInt16(this._value);\r\n        }\r\n\r\n        int IConvertible.ToInt32(IFormatProvider provider)\r\n        {\r\n            return Convert.ToInt32(this._value);\r\n        }\r\n\r\n        long IConvertible.ToInt64(IFormatProvider provider)\r\n        {\r\n            return Convert.ToInt64(this._value);\r\n        }\r\n\r\n        sbyte IConvertible.ToSByte(IFormatProvider provider)\r\n        {\r\n            return Convert.ToSByte(this._value);\r\n        }\r\n\r\n        float IConvertible.ToSingle(IFormatProvider provider)\r\n        {\r\n            return Convert.ToSingle(this._value);\r\n        }\r\n\r\n        string IConvertible.ToString(IFormatProvider provider)\r\n        {\r\n            return this.ToString(\"\", provider);\r\n        }\r\n\r\n        object IConvertible.ToType(Type conversionType, IFormatProvider provider)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        ushort IConvertible.ToUInt16(IFormatProvider provider)\r\n        {\r\n            return Convert.ToUInt16(this._value);\r\n        }\r\n\r\n        uint IConvertible.ToUInt32(IFormatProvider provider)\r\n        {\r\n            return Convert.ToUInt32(this._value);\r\n        }\r\n\r\n        ulong IConvertible.ToUInt64(IFormatProvider provider)\r\n        {\r\n            return Convert.ToUInt64(this._value);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IFormattable Interface\r\n\r\n        public string ToString(string format)\r\n        {\r\n            return this._value.ToString(format);\r\n        }\r\n\r\n        public string ToString(string format, IFormatProvider provider)\r\n        {\r\n            return this._value.ToString(format, provider);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISerializationCallbackReceiver\r\n\r\n        void ISerializationCallbackReceiver.OnBeforeSerialize()\r\n        {\r\n            _bits = decimal.GetBits(_value);\r\n        }\r\n\r\n        void ISerializationCallbackReceiver.OnAfterDeserialize()\r\n        {\r\n            if (_bits != null && _bits.Length == 4)\r\n            {\r\n                bool sign = (_bits[3] & 0x80000000) != 0;\r\n                byte scale = (byte)((_bits[3] >> 16) & 0x7F);\r\n                _value = new System.Decimal(_bits[0], _bits[1], _bits[2], sign, scale);\r\n            }\r\n            _bits = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/FixedPercentLong.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    [System.Serializable()]\r\n    public struct FixedPercentLong : IConvertible, IEquatable<FixedPercentLong>, IFormattable\r\n    {\r\n\r\n        public const decimal MAX_VALUE = (decimal)long.MaxValue + 0.999999999M;\r\n        public const decimal MIN_VALUE = decimal.MinValue;\r\n        public const decimal MINUS_ONE = decimal.MinusOne;\r\n        public const decimal ONE = decimal.One;\r\n        public const decimal RNG_FRACT = 1000000000M;\r\n\r\n        #region Fields\r\n\r\n        [UnityEngine.SerializeField()]\r\n        private long _value;\r\n        [UnityEngine.SerializeField()]\r\n        private int _fract;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public FixedPercentLong(float value)\r\n        {\r\n            _value = (long)Math.Floor(value);\r\n            _fract = (int)((decimal)(value % 1f) * RNG_FRACT);\r\n        }\r\n\r\n        public FixedPercentLong(double value)\r\n        {\r\n            _value = (long)Math.Floor(value);\r\n            _fract = (int)((decimal)(value % 1d) * RNG_FRACT);\r\n        }\r\n\r\n        public FixedPercentLong(decimal value)\r\n        {\r\n            _value = (long)Math.Floor(value);\r\n            _fract = (int)((decimal)(value % 1M) * RNG_FRACT);\r\n        }\r\n\r\n        public FixedPercentLong(int value)\r\n        {\r\n            _value = value;\r\n            _fract = 0;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public decimal Value\r\n        {\r\n            get\r\n            {\r\n                return (decimal)_value + (decimal)_fract / RNG_FRACT;\r\n            }\r\n            set\r\n            {\r\n                _value = (long)Math.Floor(value);\r\n                _fract = (int)((decimal)(value % 1M) * RNG_FRACT);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override bool Equals(object obj)\r\n        {\r\n            if (obj is FixedPercent)\r\n                return _value == ((FixedPercentLong)obj)._value;\r\n\r\n            var d = com.spacepuppy.Utils.ConvertUtil.ToDecimal(obj);\r\n            return d == this.Value;\r\n        }\r\n\r\n        public override int GetHashCode()\r\n        {\r\n            return _value.GetHashCode();\r\n        }\r\n\r\n        public bool Equals(FixedPercentLong other)\r\n        {\r\n            return _value == other._value;\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return _value.ToString();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Conversion\r\n\r\n        public static implicit operator FixedPercentLong(float f)\r\n        {\r\n            return new FixedPercentLong(f);\r\n        }\r\n\r\n        public static implicit operator FixedPercentLong(double f)\r\n        {\r\n            return new FixedPercentLong(f);\r\n        }\r\n\r\n        public static implicit operator FixedPercentLong(decimal d)\r\n        {\r\n            return new FixedPercentLong(d);\r\n        }\r\n\r\n        public static implicit operator FixedPercentLong(int i)\r\n        {\r\n            return new FixedPercentLong(i);\r\n        }\r\n\r\n        public static explicit operator float (FixedPercentLong p)\r\n        {\r\n            return Convert.ToSingle(p.Value);\r\n        }\r\n\r\n        public static explicit operator double (FixedPercentLong p)\r\n        {\r\n            return Convert.ToDouble(p.Value);\r\n        }\r\n\r\n        public static implicit operator decimal (FixedPercentLong p)\r\n        {\r\n            return p.Value;\r\n        }\r\n\r\n        public static explicit operator int (FixedPercentLong p)\r\n        {\r\n            return (int)p.Value;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Operators\r\n\r\n        public static FixedPercentLong operator +(FixedPercentLong a)\r\n        {\r\n            return a;\r\n        }\r\n\r\n        public static FixedPercentLong operator ++(FixedPercentLong a)\r\n        {\r\n            return new FixedPercentLong(a.Value + 1M);\r\n        }\r\n\r\n        public static FixedPercentLong operator +(FixedPercentLong a, FixedPercentLong b)\r\n        {\r\n            return new FixedPercentLong(a.Value + b.Value);\r\n        }\r\n\r\n        public static FixedPercentLong operator -(FixedPercentLong a)\r\n        {\r\n            a.Value = -a.Value;\r\n            return a;\r\n        }\r\n\r\n        public static FixedPercentLong operator --(FixedPercentLong a)\r\n        {\r\n            return new FixedPercentLong(a.Value - 1M);\r\n        }\r\n\r\n        public static FixedPercentLong operator -(FixedPercentLong a, FixedPercentLong b)\r\n        {\r\n            return new FixedPercentLong(a.Value - b.Value);\r\n        }\r\n\r\n        public static FixedPercentLong operator *(FixedPercentLong a, FixedPercentLong b)\r\n        {\r\n            return new FixedPercentLong(a.Value * b.Value);\r\n        }\r\n\r\n        public static FixedPercentLong operator /(FixedPercentLong a, FixedPercentLong b)\r\n        {\r\n            return new FixedPercentLong(a.Value / b.Value);\r\n        }\r\n\r\n        public static FixedPercentLong operator %(FixedPercentLong a, FixedPercentLong b)\r\n        {\r\n            return new FixedPercentLong(a.Value % b.Value);\r\n        }\r\n\r\n        public static bool operator >(FixedPercentLong a, FixedPercentLong b)\r\n        {\r\n            return a.Value > b.Value;\r\n        }\r\n\r\n        public static bool operator <(FixedPercentLong a, FixedPercentLong b)\r\n        {\r\n            return a.Value < b.Value;\r\n        }\r\n\r\n        public static bool operator >=(FixedPercentLong a, FixedPercentLong b)\r\n        {\r\n            return a.Value >= b.Value;\r\n        }\r\n\r\n        public static bool operator <=(FixedPercentLong a, FixedPercentLong b)\r\n        {\r\n            return a.Value <= b.Value;\r\n        }\r\n\r\n        public static bool operator ==(FixedPercentLong a, FixedPercentLong b)\r\n        {\r\n            return a.Value == b.Value;\r\n        }\r\n\r\n        public static bool operator !=(FixedPercentLong a, FixedPercentLong b)\r\n        {\r\n            return a.Value != b.Value;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IConvertible Interface\r\n\r\n        public TypeCode GetTypeCode()\r\n        {\r\n            return TypeCode.Decimal;\r\n        }\r\n\r\n        bool IConvertible.ToBoolean(IFormatProvider provider)\r\n        {\r\n            return _value != 0 && _fract != 0;\r\n        }\r\n\r\n        byte IConvertible.ToByte(IFormatProvider provider)\r\n        {\r\n            return Convert.ToByte(this.Value);\r\n        }\r\n\r\n        char IConvertible.ToChar(IFormatProvider provider)\r\n        {\r\n            return Convert.ToChar(this.Value);\r\n        }\r\n\r\n        DateTime IConvertible.ToDateTime(IFormatProvider provider)\r\n        {\r\n            return Convert.ToDateTime(this.Value);\r\n        }\r\n\r\n        decimal IConvertible.ToDecimal(IFormatProvider provider)\r\n        {\r\n            return this.Value;\r\n        }\r\n\r\n        double IConvertible.ToDouble(IFormatProvider provider)\r\n        {\r\n            return Convert.ToDouble(this.Value);\r\n        }\r\n\r\n        short IConvertible.ToInt16(IFormatProvider provider)\r\n        {\r\n            return Convert.ToInt16(this.Value);\r\n        }\r\n\r\n        int IConvertible.ToInt32(IFormatProvider provider)\r\n        {\r\n            return Convert.ToInt32(this.Value);\r\n        }\r\n\r\n        long IConvertible.ToInt64(IFormatProvider provider)\r\n        {\r\n            return Convert.ToInt64(this.Value);\r\n        }\r\n\r\n        sbyte IConvertible.ToSByte(IFormatProvider provider)\r\n        {\r\n            return Convert.ToSByte(this.Value);\r\n        }\r\n\r\n        float IConvertible.ToSingle(IFormatProvider provider)\r\n        {\r\n            return Convert.ToSingle(this.Value);\r\n        }\r\n\r\n        string IConvertible.ToString(IFormatProvider provider)\r\n        {\r\n            return this.ToString(\"\", provider);\r\n        }\r\n\r\n        object IConvertible.ToType(Type conversionType, IFormatProvider provider)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        ushort IConvertible.ToUInt16(IFormatProvider provider)\r\n        {\r\n            return Convert.ToUInt16(this.Value);\r\n        }\r\n\r\n        uint IConvertible.ToUInt32(IFormatProvider provider)\r\n        {\r\n            return Convert.ToUInt32(this.Value);\r\n        }\r\n\r\n        ulong IConvertible.ToUInt64(IFormatProvider provider)\r\n        {\r\n            return Convert.ToUInt64(this.Value);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IFormattable Interface\r\n\r\n        public string ToString(string format)\r\n        {\r\n            return this.Value.ToString(format);\r\n        }\r\n\r\n        public string ToString(string format, IFormatProvider provider)\r\n        {\r\n            return this.Value.ToString(format, provider);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/FixedPoint.cs",
    "content": "﻿using System;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Represents a base 10 value with range -2147 to 2147 with 10 digits of precision (4 whole, 6 fractional). \r\n    /// </summary>\r\n    /// <remarks>\r\n    /// Unity lacks support for serializing decimal, so this is a base 10 precise number type for use in unity. \r\n    /// Int64 is also not serializable, so we were restricted to the Int32. I find that when I need precise base 10 \r\n    /// it's in the fractional ranges, so I dedicated most of the value to the fraction rather than the whole. \r\n    /// 6 digits of fractional precision was the value chosen because conversion to a float of a 0->1 'percent' \r\n    /// value has enough precision to house the FixedPercent value in the same range.\r\n    /// </remarks>\r\n    [System.Serializable()]\r\n    public struct FixedPercent : IConvertible, IEquatable<FixedPercent>, IFormattable\r\n    {\r\n\r\n        public const decimal MAX_VALUE = 2147M;\r\n        public const decimal MIN_VALUE = -2147M;\r\n        private const decimal MAX_VALUE_R = 2147.483647M;\r\n        private const decimal MIN_VALUE_R = -2147.483648M;\r\n        public const int PRECISION = 1000000;\r\n        private const decimal PRECISION_M = 1000000M;\r\n\r\n        [UnityEngine.SerializeField()]\r\n        private int _value;\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public FixedPercent(float value)\r\n        {\r\n            if (value < (float)MIN_VALUE) _value = Int32.MinValue;\r\n            else if (value > (float)MAX_VALUE) _value = Int32.MaxValue;\r\n            else _value = (int)(value * (float)PRECISION);\r\n        }\r\n\r\n        public FixedPercent(double value)\r\n        {\r\n            if (value < (double)MIN_VALUE) _value = Int32.MinValue;\r\n            else if (value > (double)MAX_VALUE) _value = Int32.MaxValue;\r\n            else _value = (int)(value * (double)PRECISION);\r\n        }\r\n\r\n        public FixedPercent(decimal value)\r\n        {\r\n            if (value < MIN_VALUE) _value = Int32.MinValue;\r\n            else if (value > MAX_VALUE) _value = Int32.MaxValue;\r\n            else _value = (int)(value * PRECISION_M);\r\n        }\r\n\r\n        public FixedPercent(int value)\r\n        {\r\n            if (value < MIN_VALUE) _value = Int32.MinValue;\r\n            else if (value > MAX_VALUE) _value = Int32.MaxValue;\r\n            else _value = (int)(value * PRECISION_M);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Property\r\n\r\n        public int RawValue\r\n        {\r\n            get { return _value; }\r\n            set { _value = value; }\r\n        }\r\n\r\n        public decimal Value\r\n        {\r\n            get { return (decimal)_value / PRECISION_M; }\r\n            set\r\n            {\r\n                if (value < MIN_VALUE) _value = Int32.MinValue;\r\n                else if (value > MAX_VALUE) _value = Int32.MaxValue;\r\n                else _value = (int)(value * PRECISION_M);\r\n            }\r\n        }\r\n\r\n        //public double ValueDouble\r\n        //{\r\n        //    get { return (double)this.Value; }\r\n        //    set\r\n        //    {\r\n        //        if (value < (double)MIN_VALUE) _value = Int32.MinValue;\r\n        //        else if (value > (double)MAX_VALUE) _value = Int32.MaxValue;\r\n        //        else _value = (int)(value * (double)PRECISION);\r\n        //    }\r\n        //}\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override bool Equals(object obj)\r\n        {\r\n            if (obj is FixedPercent)\r\n                return _value == ((FixedPercent)obj)._value;\r\n\r\n            var d = com.spacepuppy.Utils.ConvertUtil.ToDecimal(obj);\r\n            return d == this.Value;\r\n        }\r\n\r\n        public override int GetHashCode()\r\n        {\r\n            return _value;\r\n        }\r\n\r\n        public bool Equals(FixedPercent other)\r\n        {\r\n            return _value == other._value;\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return this.Value.ToString();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Utils\r\n\r\n        public static FixedPercent Clamp01(FixedPercent p)\r\n        {\r\n            if (p._value < 0) p._value = 0;\r\n            else if (p._value > PRECISION) p._value = PRECISION;\r\n            return p;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Conversion\r\n\r\n        public static implicit operator FixedPercent(float f)\r\n        {\r\n            return new FixedPercent(f);\r\n        }\r\n\r\n        public static implicit operator FixedPercent(double f)\r\n        {\r\n            return new FixedPercent(f);\r\n        }\r\n\r\n        public static implicit operator FixedPercent(decimal d)\r\n        {\r\n            return new FixedPercent(d);\r\n        }\r\n\r\n        public static implicit operator FixedPercent(int i)\r\n        {\r\n            return new FixedPercent(i);\r\n        }\r\n\r\n        public static explicit operator float (FixedPercent p)\r\n        {\r\n            return Convert.ToSingle(p.Value);\r\n        }\r\n\r\n        public static explicit operator double (FixedPercent p)\r\n        {\r\n            return Convert.ToDouble(p.Value);\r\n        }\r\n\r\n        public static explicit operator decimal (FixedPercent p)\r\n        {\r\n            return p.Value;\r\n        }\r\n\r\n        public static explicit operator int (FixedPercent p)\r\n        {\r\n            return (int)p.Value;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Operators\r\n\r\n        public static FixedPercent operator +(FixedPercent a)\r\n        {\r\n            return a;\r\n        }\r\n\r\n        public static FixedPercent operator ++(FixedPercent a)\r\n        {\r\n            return new FixedPercent(a.Value + 1M);\r\n        }\r\n\r\n        public static FixedPercent operator +(FixedPercent a, FixedPercent b)\r\n        {\r\n            return new FixedPercent(a.Value + b.Value);\r\n        }\r\n\r\n        public static FixedPercent operator -(FixedPercent a)\r\n        {\r\n            a._value = -a._value;\r\n            return a;\r\n        }\r\n\r\n        public static FixedPercent operator --(FixedPercent a)\r\n        {\r\n            return new FixedPercent(a.Value - 1M);\r\n        }\r\n\r\n        public static FixedPercent operator -(FixedPercent a, FixedPercent b)\r\n        {\r\n            return new FixedPercent(a.Value - b.Value);\r\n        }\r\n\r\n        public static FixedPercent operator *(FixedPercent a, FixedPercent b)\r\n        {\r\n            return new FixedPercent(a.Value * b.Value);\r\n        }\r\n        \r\n        public static FixedPercent operator /(FixedPercent a, FixedPercent b)\r\n        {\r\n            return new FixedPercent(a.Value / b.Value);\r\n        }\r\n        \r\n        public static bool operator >(FixedPercent a, FixedPercent b)\r\n        {\r\n            return a._value > b._value;\r\n        }\r\n        \r\n        public static bool operator <(FixedPercent a, FixedPercent b)\r\n        {\r\n            return a._value < b._value;\r\n        }\r\n        \r\n        public static bool operator >=(FixedPercent a, FixedPercent b)\r\n        {\r\n            return a._value >= b._value;\r\n        }\r\n        \r\n        public static bool operator <=(FixedPercent a, FixedPercent b)\r\n        {\r\n            return a._value <= b._value;\r\n        }\r\n        \r\n        public static bool operator ==(FixedPercent a, FixedPercent b)\r\n        {\r\n            return a._value == b._value;\r\n        }\r\n        \r\n        public static bool operator !=(FixedPercent a, FixedPercent b)\r\n        {\r\n            return a._value != b._value;\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region IConvertible Interface\r\n\r\n        public TypeCode GetTypeCode()\r\n        {\r\n            return TypeCode.Decimal;\r\n        }\r\n\r\n        bool IConvertible.ToBoolean(IFormatProvider provider)\r\n        {\r\n            return _value != 0;\r\n        }\r\n\r\n        byte IConvertible.ToByte(IFormatProvider provider)\r\n        {\r\n            return Convert.ToByte(this.Value);\r\n        }\r\n\r\n        char IConvertible.ToChar(IFormatProvider provider)\r\n        {\r\n            return Convert.ToChar(this.Value);\r\n        }\r\n\r\n        DateTime IConvertible.ToDateTime(IFormatProvider provider)\r\n        {\r\n            return Convert.ToDateTime(this.Value);\r\n        }\r\n\r\n        decimal IConvertible.ToDecimal(IFormatProvider provider)\r\n        {\r\n            return this.Value;\r\n        }\r\n\r\n        double IConvertible.ToDouble(IFormatProvider provider)\r\n        {\r\n            return Convert.ToDouble(this.Value);\r\n        }\r\n\r\n        short IConvertible.ToInt16(IFormatProvider provider)\r\n        {\r\n            return Convert.ToInt16(this.Value);\r\n        }\r\n\r\n        int IConvertible.ToInt32(IFormatProvider provider)\r\n        {\r\n            return Convert.ToInt32(this.Value);\r\n        }\r\n\r\n        long IConvertible.ToInt64(IFormatProvider provider)\r\n        {\r\n            return Convert.ToInt64(this.Value);\r\n        }\r\n\r\n        sbyte IConvertible.ToSByte(IFormatProvider provider)\r\n        {\r\n            return Convert.ToSByte(this.Value);\r\n        }\r\n\r\n        float IConvertible.ToSingle(IFormatProvider provider)\r\n        {\r\n            return Convert.ToSingle(this.Value);\r\n        }\r\n\r\n        string IConvertible.ToString(IFormatProvider provider)\r\n        {\r\n            return Convert.ToString(this.Value);\r\n        }\r\n\r\n        object IConvertible.ToType(Type conversionType, IFormatProvider provider)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        ushort IConvertible.ToUInt16(IFormatProvider provider)\r\n        {\r\n            return Convert.ToUInt16(this.Value);\r\n        }\r\n\r\n        uint IConvertible.ToUInt32(IFormatProvider provider)\r\n        {\r\n            return Convert.ToUInt32(this.Value);\r\n        }\r\n\r\n        ulong IConvertible.ToUInt64(IFormatProvider provider)\r\n        {\r\n            return Convert.ToUInt64(this.Value);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IFormattable Interface\r\n\r\n        public string ToString(string format)\r\n        {\r\n            return this.Value.ToString(format);\r\n        }\r\n\r\n        public string ToString(string format, IFormatProvider provider)\r\n        {\r\n            return this.Value.ToString(format, provider);\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        [AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]\r\n        public class ConfigAttribute : Attribute\r\n        {\r\n\r\n            public bool displayAsPercent;\r\n            public bool displayAsRange;\r\n            public float min = (float)FixedPercent.MIN_VALUE;\r\n            public float max = (float)FixedPercent.MAX_VALUE;\r\n\r\n            public ConfigAttribute(bool displayAsPercent)\r\n            {\r\n                this.displayAsPercent = displayAsPercent;\r\n            }\r\n\r\n            public ConfigAttribute(float min, float max)\r\n            {\r\n                this.displayAsPercent = false;\r\n                this.displayAsRange = true;\r\n                this.min = min;\r\n                this.max = max;\r\n            }\r\n\r\n            public ConfigAttribute(float min, float max, bool displayAsPercent)\r\n            {\r\n                this.displayAsRange = true;\r\n                this.min = min;\r\n                this.max = max;\r\n                this.displayAsPercent = displayAsPercent;\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/GameLoopEntry.cs",
    "content": "﻿using com.spacepuppy.Hooks;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// This class is really only for internal use by com.spacepuppy, avoid using it outside of it.\r\n    /// </summary>\r\n    [Singleton.Config(SingletonLifeCycleRule.LivesForever, ExcludeFromSingletonManager = true, LifeCycleReadOnly = true)]\r\n    public sealed class GameLoopEntry : Singleton\r\n    {\r\n\r\n        #region Events\r\n\r\n        public static event System.EventHandler BeforeApplicationQuit;\r\n        public static event System.EventHandler ApplicatinQuit;\r\n\r\n        public static event System.EventHandler EarlyUpdate;\r\n        public static event System.EventHandler OnUpdate;\r\n        public static event System.EventHandler TardyUpdate;\r\n        public static event System.EventHandler EarlyFixedUpdate;\r\n        public static event System.EventHandler OnFixedUpdate;\r\n        public static event System.EventHandler TardyFixedUpdate;\r\n        public static event System.EventHandler EarlyLateUpdate;\r\n        public static event System.EventHandler OnLateUpdate;\r\n        public static event System.EventHandler TardyLateUpdate;\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        private static GameLoopEntry _instance;\r\n        private static UpdateSequence _currentSequence;\r\n        private static QuitState _quitState;\r\n        private static System.Action<bool> _internalEarlyUpdate;\r\n\r\n        private UpdateEventHooks _updateHook;\r\n        private TardyExecutionUpdateEventHooks _tardyUpdateHook;\r\n\r\n        [System.NonSerialized]\r\n        private static UpdatePump _updatePump = new UpdatePump();\r\n        [System.NonSerialized]\r\n        private static UpdatePump _fixedUpdatePump = new UpdatePump();\r\n        [System.NonSerialized]\r\n        private static UpdatePump _lateUpdatePump = new UpdatePump();\r\n\r\n        [System.NonSerialized]\r\n        private static com.spacepuppy.Async.InvokePump _updateInvokeHandle = new com.spacepuppy.Async.InvokePump();\r\n        [System.NonSerialized]\r\n        private static com.spacepuppy.Async.InvokePump _lateUpdateInvokeHandle = new com.spacepuppy.Async.InvokePump();\r\n        [System.NonSerialized]\r\n        private static com.spacepuppy.Async.InvokePump _fixedUpdateInvokeHandle = new com.spacepuppy.Async.InvokePump();\r\n\r\n        private static int _currentFrame;\r\n        private static int _currentLateFrame;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public static void Init()\r\n        {\r\n            if (_instance != null) return;\r\n\r\n            _instance = Singleton.CreateSpecialInstance<GameLoopEntry>(\"SpacePuppy.GameLoopEntry\", SingletonLifeCycleRule.LivesForever);\r\n            //_instance = Singleton.GetInstance<GameLoopEntry>();\r\n        }\r\n\r\n        protected override void OnValidAwake()\r\n        {\r\n            _updateHook = this.gameObject.AddComponent<UpdateEventHooks>();\r\n            _tardyUpdateHook = this.gameObject.AddComponent<TardyExecutionUpdateEventHooks>();\r\n\r\n            _updateHook.UpdateHook += _updateHook_Update;\r\n            _tardyUpdateHook.UpdateHook += _tardyUpdateHook_Update;\r\n\r\n            _updateHook.FixedUpdateHook += _updateHook_FixedUpdate;\r\n            _tardyUpdateHook.FixedUpdateHook += _tardyUpdateHook_FixedUpdate;\r\n\r\n            _updateHook.LateUpdateHook += _updateHook_LateUpdate;\r\n            _tardyUpdateHook.LateUpdateHook += _tardyUpdateHook_LateUpdate;\r\n        }\r\n\r\n        /// <summary>\r\n        /// A special static, register once, earlyupdate event hook that preceeds ALL other events. \r\n        /// This is used internally by some special static classes (namely SPTime) that needs extra \r\n        /// high precedence early access.\r\n        /// </summary>\r\n        /// <param name=\"d\"></param>\r\n        internal static void RegisterInternalEarlyUpdate(System.Action<bool> d)\r\n        {\r\n            _internalEarlyUpdate -= d;\r\n            _internalEarlyUpdate += d;\r\n        }\r\n\r\n        internal static void UnregisterInternalEarlyUpdate(System.Action<bool> d)\r\n        {\r\n            _internalEarlyUpdate -= d;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public override SingletonLifeCycleRule LifeCycle\r\n        {\r\n            get { return SingletonLifeCycleRule.LivesForever; }\r\n            set { }\r\n        }\r\n\r\n        public static bool Initialized { get { return _instance != null; } }\r\n\r\n        public static GameLoopEntry Hook\r\n        {\r\n            get\r\n            {\r\n                if (_instance == null) GameLoopEntry.Init();\r\n                return _instance;\r\n            }\r\n        }\r\n\r\n        public static UpdateEventHooks TardyHook\r\n        {\r\n            get\r\n            {\r\n                if (_instance == null) GameLoopEntry.Init();\r\n                return _instance._tardyUpdateHook;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns which event sequence that code is currently operating as. \r\n        /// WARNING - during 'OnMouseXXX' messages this will report that we're in the FixedUpdate sequence. \r\n        /// This is because there's no end of FixedUpdate available to hook into, so it reports FixedUpdate \r\n        /// until Update starts, and 'OnMouseXXX' occurs in between those 2.\r\n        /// </summary>\r\n        public static UpdateSequence CurrentSequence { get { return _currentSequence; } }\r\n\r\n        public static QuitState QuitState { get { return _quitState; } }\r\n\r\n        /// <summary>\r\n        /// Returns true if the OnApplicationQuit message has been received.\r\n        /// </summary>\r\n        public static bool ApplicationClosing { get { return _quitState == QuitState.Quit; } }\r\n\r\n        public static UpdatePump UpdatePump { get { return _updatePump; } }\r\n\r\n        public static UpdatePump FixedUpdatePump { get { return _fixedUpdatePump; } }\r\n\r\n        public static UpdatePump LateUpdatePump { get { return _lateUpdatePump; } }\r\n\r\n        public static com.spacepuppy.Async.InvokePump UpdateHandle { get { return _updateInvokeHandle; } }\r\n\r\n        public static com.spacepuppy.Async.InvokePump LateUpdateHandle { get {return _lateUpdateInvokeHandle; } }\r\n\r\n        public static com.spacepuppy.Async.InvokePump FixedUpdateHandle { get { return _fixedUpdateInvokeHandle; } }\r\n\r\n        /// <summary>\r\n        /// Returns true if the UpdatePump and Update event were ran.\r\n        /// </summary>\r\n        public static bool UpdateWasCalled\r\n        {\r\n            get { return _currentFrame == UnityEngine.Time.frameCount; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns true if the LateUpdatePump and LateUpdate event were ran.\r\n        /// </summary>\r\n        public static bool LateUpdateWasCalled\r\n        {\r\n            get { return _currentFrame == UnityEngine.Time.frameCount; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Preferred method of closing application.\r\n        /// </summary>\r\n        public static void QuitApplication()\r\n        {\r\n            if(_quitState == QuitState.None)\r\n            {\r\n                _quitState = QuitState.BeforeQuit;\r\n                if (BeforeApplicationQuit != null) BeforeApplicationQuit(_instance, System.EventArgs.Empty);\r\n\r\n                if(_quitState == QuitState.BeforeQuit)\r\n                {\r\n                    //wasn't cancelled, or force quit\r\n                    if (UnityEngine.Application.isEditor)\r\n                    {\r\n                        try\r\n                        {\r\n                            var tp = com.spacepuppy.Utils.TypeUtil.FindType(\"UnityEditor.EditorApplication\");\r\n                            tp.GetProperty(\"isPlaying\").SetValue(null, false, null);\r\n                        }\r\n                        catch\r\n                        {\r\n                            UnityEngine.Debug.Log(\"Failed to stop play in editor.\");\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        UnityEngine.Application.Quit();\r\n                    }\r\n                    \r\n                }\r\n            }\r\n        }\r\n\r\n        public static void CancelQuit()\r\n        {\r\n            if(_quitState == QuitState.BeforeQuit)\r\n            {\r\n                _quitState = QuitState.None;\r\n            }\r\n        }\r\n\r\n        public static void RegisterNextUpdate(IUpdateable obj)\r\n        {\r\n            if (UpdateWasCalled) _updatePump.Add(obj);\r\n            else _updatePump.DelayedAdd(obj);\r\n        }\r\n\r\n        public static void RegisterNextLateUpdate(IUpdateable obj)\r\n        {\r\n            if (LateUpdateWasCalled) _lateUpdatePump.Add(obj);\r\n            else _lateUpdatePump.DelayedAdd(obj);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Event Handlers\r\n\r\n        private void OnApplicationQuit()\r\n        {\r\n            _quitState = QuitState.Quit;\r\n            if (ApplicatinQuit != null) ApplicatinQuit(this, System.EventArgs.Empty);\r\n        }\r\n        \r\n        //Update\r\n\r\n        private void Update()\r\n        {\r\n            //Track entry into update loop\r\n            _currentSequence = UpdateSequence.Update;\r\n\r\n            if (_internalEarlyUpdate != null) _internalEarlyUpdate(false);\r\n\r\n            _updateInvokeHandle.Update();\r\n\r\n            if (EarlyUpdate != null) EarlyUpdate(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        private void _updateHook_Update(object sender, System.EventArgs e)\r\n        {\r\n            if (OnUpdate != null) OnUpdate(this, e);\r\n            _updatePump.Update();\r\n            _currentFrame = UnityEngine.Time.frameCount;\r\n        }\r\n\r\n        private void _tardyUpdateHook_Update(object sender, System.EventArgs e)\r\n        {\r\n            if (TardyUpdate != null) TardyUpdate(this, e);\r\n        }\r\n\r\n        //Fixed Update\r\n\r\n        private void FixedUpdate()\r\n        {\r\n            //Track entry into fixedupdate loop\r\n            _currentSequence = UpdateSequence.FixedUpdate;\r\n\r\n            if (_internalEarlyUpdate != null) _internalEarlyUpdate(true);\r\n\r\n            _fixedUpdateInvokeHandle.Update();\r\n\r\n            if (EarlyFixedUpdate != null) EarlyFixedUpdate(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        private void _updateHook_FixedUpdate(object sender, System.EventArgs e)\r\n        {\r\n            if (OnFixedUpdate != null) OnFixedUpdate(this, e);\r\n            _fixedUpdatePump.Update();\r\n        }\r\n\r\n        private void _tardyUpdateHook_FixedUpdate(object sender, System.EventArgs e)\r\n        {\r\n            if (TardyFixedUpdate != null) TardyFixedUpdate(this, e);\r\n\r\n            ////Track exit of fixedupdate loop\r\n            //_currentSequence = UpdateSequence.None;\r\n        }\r\n\r\n        //LateUpdate\r\n\r\n        private void LateUpdate()\r\n        {\r\n            _currentSequence = UpdateSequence.LateUpdate;\r\n            if (EarlyLateUpdate != null) EarlyLateUpdate(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        private void _updateHook_LateUpdate(object sender, System.EventArgs e)\r\n        {\r\n            if (OnLateUpdate != null) OnLateUpdate(this, e);\r\n            _lateUpdatePump.Update();\r\n            _currentLateFrame = UnityEngine.Time.frameCount;\r\n        }\r\n\r\n        private void _tardyUpdateHook_LateUpdate(object sender, System.EventArgs e)\r\n        {\r\n            _lateUpdateInvokeHandle.Update();\r\n            if (TardyLateUpdate != null) TardyLateUpdate(this, e);\r\n\r\n            //Track exit of update loop\r\n            _currentSequence = UpdateSequence.None;\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/GameLoopEntry.cs.meta",
    "content": "fileFormatVersion: 2\nguid: bd1d72fbb96d1b74a9b642b06f089969\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: -32000\n  icon: {instanceID: 0}\n  userData: \n"
  },
  {
    "path": "SpacepuppyBase/GameTime.cs",
    "content": "﻿namespace com.spacepuppy\r\n{\r\n\r\n    public struct GameTime\r\n    {\r\n\r\n        public float Total;\r\n        public float Delta;\r\n\r\n        public GameTime(float t, float dt)\r\n        {\r\n            this.Total = t;\r\n            this.Delta = dt;\r\n        }\r\n\r\n\r\n\r\n\r\n        //public static float ActualTimeSinceStartup { get { return UnityEngine.Time.realtimeSinceStartup; } }\r\n\r\n        //public static float Time { get { return UnityEngine.Time.time; } }\r\n\r\n        //public static float RealTime { get { return UnityEngine.Time.unscaledTime; } }\r\n\r\n        //public static float FixedTime { get { return UnityEngine.Time.fixedTime; } }\r\n\r\n        //public static float DeltaTime { get { return UnityEngine.Time.deltaTime; } }\r\n\r\n        //public static float RealDeltaTime { get { return UnityEngine.Time.unscaledDeltaTime; } }\r\n\r\n        //public static float SmoothDeltaTime { get { return UnityEngine.Time.smoothDeltaTime; } }\r\n\r\n\r\n        public static GameTime Current\r\n        {\r\n            get\r\n            {\r\n                return new GameTime(UnityEngine.Time.time, UnityEngine.Time.deltaTime);\r\n            }\r\n        }\r\n\r\n        public static GameTime CurrentReal\r\n        {\r\n            get\r\n            {\r\n                return new GameTime(UnityEngine.Time.unscaledTime, UnityEngine.Time.unscaledDeltaTime);\r\n            }\r\n        }\r\n\r\n        public static GameTime CurrentFixed\r\n        {\r\n            get\r\n            {\r\n                return new GameTime(UnityEngine.Time.fixedTime, UnityEngine.Time.fixedDeltaTime);\r\n            }\r\n        }\r\n\r\n        public static GameTime CurrentSmooth\r\n        {\r\n            get\r\n            {\r\n                return new GameTime(UnityEngine.Time.time, UnityEngine.Time.smoothDeltaTime);\r\n            }\r\n        }\r\n\r\n        public static float TimeScale\r\n        {\r\n            get\r\n            {\r\n                return UnityEngine.Time.timeScale;\r\n            }\r\n            set\r\n            {\r\n                UnityEngine.Time.timeScale = value;\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/Geom/AABBox.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n    [System.Serializable]\r\n    public struct AABBox : IGeom, System.Runtime.Serialization.ISerializable, IPhysicsGeom\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private Vector3 _center;\r\n        [SerializeField()]\r\n        private Vector3 _size;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public AABBox(Vector3 cent, Vector3 sz)\r\n        {\r\n            _center = cent;\r\n            _size = sz;\r\n        }\r\n\r\n        public AABBox(Bounds bounds)\r\n        {\r\n            _center = bounds.center;\r\n            _size = bounds.size;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Vector3 Center { get { return _center; } set { _center = value; } }\r\n        public Vector3 Size { get { return _size; } set { _size = value; } }\r\n\r\n        public Vector3 Extents\r\n        {\r\n            get { return _size / 2.0f; }\r\n        }\r\n\r\n        public Vector3 Min\r\n        {\r\n            get { return this.Center - (this.Size / 2.0f); }\r\n        }\r\n\r\n        public Vector3 Max\r\n        {\r\n            get { return this.Center + (this.Size / 2.0f); }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IGeom Interface\r\n\r\n        public void Move(Vector3 mv)\r\n        {\r\n            _center += mv;\r\n        }\r\n\r\n        public void RotateAroundPoint(Vector3 point, Quaternion rot)\r\n        {\r\n            _center = point + rot * (_center - point);\r\n        }\r\n\r\n        public AxisInterval Project(Vector3 axis)\r\n        {\r\n            axis.Normalize();\r\n            var a = Vector3.Dot(this.Min, axis);\r\n            var b = Vector3.Dot(this.Max, axis);\r\n            return new AxisInterval(axis, a, b);\r\n        }\r\n\r\n        public Bounds GetBounds()\r\n        {\r\n            return new Bounds(Center, Size);\r\n        }\r\n\r\n        public Sphere GetBoundingSphere()\r\n        {\r\n            //return new Sphere(Center, com.spacepuppy.Utils.VectorUtil.GetMaxScalar(Size) / 2.0f);\r\n            return new Sphere(Center, this.Extents.magnitude);\r\n        }\r\n\r\n        public bool Contains(Vector3 pos)\r\n        {\r\n            return this.GetBounds().Contains(pos);\r\n        }\r\n\r\n        public IEnumerable<Vector3> GetAxes()\r\n        {\r\n            yield return Vector3.up;\r\n            yield return Vector3.right;\r\n            yield return Vector3.forward;\r\n        }\r\n\r\n        /*\r\n        public System.Collections.Generic.IEnumerable<RaycastInfo> GetRays(float detail)\r\n        {\r\n            //infinitely thin objects don't cast anywhere\r\n            if (Size.y == 0.0f) yield break;\r\n\r\n            var min = Center - (Size / 2.0f);\r\n            var dir = new Vector3(0, MathUtil.Sign(Size.y), 0);\r\n            var dist = Mathf.Abs(Size.y);\r\n            var dx = new Vector3(MathUtil.Sign(Size.x), 0);\r\n            var dz = new Vector3(MathUtil.Sign(Size.y), 0);\r\n\r\n            int xp = Mathf.CeilToInt(this.Size.x / detail); //number of moves in the x-dir\r\n            int zp = Mathf.CeilToInt(this.Size.z / detail); //number of moves in the z-dir\r\n\r\n            float xdt = this.Size.x / (float)xp; //adjusted detail in the x-dir\r\n            float zdt = this.Size.z / (float)zp; //adjusted detail in the z-dir\r\n\r\n            int cnt = xp * zp;\r\n            for (int i = 0; i < cnt; i++)\r\n            {\r\n                var ix = i % xp;\r\n                var iz = i / xp;\r\n                yield return new RaycastInfo(min + ix * xdt * dx + iz * zdt * dz, dir, dist);\r\n            }\r\n        }\r\n\r\n        public System.Collections.Generic.IEnumerable<RaycastInfo> GetRays(Vector3 dir, float detail)\r\n        {\r\n            //infinitely thin objects don't cast anywhere\r\n            if (Vector3.Dot(Size, dir) == 0) yield break;\r\n\r\n\r\n        }\r\n\r\n        public System.Collections.Generic.IEnumerable<RaycastInfo> GetRays(Vector3 dir, float dist, float detail)\r\n        {\r\n            //TODO\r\n            yield break;\r\n        }\r\n         */\r\n\r\n        #endregion\r\n\r\n        #region IPhysicsGeom Interface\r\n\r\n        public bool TestOverlap(int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            return Physics.CheckBox(_center, this.Extents, Quaternion.identity, layerMask, query);\r\n        }\r\n\r\n        public int Overlap(ICollection<Collider> results, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            return PhysicsUtil.OverlapBox(_center, this.Extents, results, Quaternion.identity, layerMask, query);\r\n        }\r\n\r\n        public bool Cast(Vector3 direction, out RaycastHit hitinfo, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            return Physics.BoxCast(_center, this.Extents, direction, out hitinfo, Quaternion.identity, distance, layerMask, query);\r\n        }\r\n\r\n        public int CastAll(Vector3 direction, ICollection<RaycastHit> results, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            return PhysicsUtil.BoxCastAll(_center, this.Extents, direction, results, Quaternion.identity, distance, layerMask, query);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region ISerializable Interface\r\n\r\n        private AABBox(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)\r\n        {\r\n            _center = new Vector3(info.GetSingle(\"center.x\"), info.GetSingle(\"center.y\"), info.GetSingle(\"center.z\"));\r\n            _size = new Vector3(info.GetSingle(\"size.x\"), info.GetSingle(\"size.y\"), info.GetSingle(\"size.z\"));\r\n        }\r\n\r\n        void System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)\r\n        {\r\n            info.AddValue(\"center.x\", this.Center.x);\r\n            info.AddValue(\"center.y\", this.Center.y);\r\n            info.AddValue(\"center.z\", this.Center.z);\r\n            info.AddValue(\"size.x\", this.Size.x);\r\n            info.AddValue(\"size.y\", this.Size.y);\r\n            info.AddValue(\"size.z\", this.Size.z);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Static Interface\r\n\r\n        public static AABBox FromCollider(BoxCollider c, bool local = false)\r\n        {\r\n            if(local)\r\n            {\r\n                return new AABBox(c.center, c.size);\r\n            }\r\n            else\r\n            {\r\n                return new AABBox(c.bounds);\r\n            }\r\n        }\r\n\r\n        public static AABBox FromCollider(Collider c, bool local = false)\r\n        {\r\n            if(c == null) return new AABBox();\r\n\r\n            if(local)\r\n            {\r\n                if (c is CharacterController)\r\n                {\r\n                    var cap = c as CharacterController;\r\n                    float r = cap.radius;\r\n                    float d = r * 2f;\r\n                    float h = Mathf.Max(r, cap.height);\r\n                    return new AABBox(cap.center, new Vector3(d, h, d));\r\n                }\r\n                if (c is CapsuleCollider)\r\n                {\r\n                    var cap = c as CapsuleCollider;\r\n                    float r = cap.radius;\r\n                    float d = r * 2f;\r\n                    float h = Mathf.Max(r, cap.height);\r\n                    Vector3 sz;\r\n                    switch (cap.direction)\r\n                    {\r\n                        case 0:\r\n                            sz = new Vector3(h, d, d);\r\n                            break;\r\n                        case 1:\r\n                            sz = new Vector3(d, h, d);\r\n                            break;\r\n                        case 2:\r\n                            sz = new Vector3(d, d, h);\r\n                            break;\r\n                        default:\r\n                            sz = Vector3.zero;\r\n                            break;\r\n                    }\r\n                    return new AABBox(cap.center, sz);\r\n                }\r\n                else if (c is BoxCollider)\r\n                {\r\n                    var box = c as BoxCollider;\r\n                    return new AABBox(box.center, box.size);\r\n                }\r\n                else if (c is SphereCollider)\r\n                {\r\n                    var s = c as SphereCollider;\r\n                    return new AABBox(s.center, Vector3.one * s.radius * 2f);\r\n                }\r\n                else if (c is MeshCollider)\r\n                {\r\n                    return new AABBox((c as MeshCollider).sharedMesh.bounds);\r\n                }\r\n                else\r\n                {\r\n                    //otherwise just return bounds as AABBox\r\n                    var bounds = c.bounds;\r\n                    var cent = c.transform.InverseTransformPoint(bounds.center);\r\n                    var size = c.transform.InverseTransformDirection(bounds.size);\r\n                    return new AABBox(cent, size);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return new AABBox(c.bounds);\r\n            }\r\n        }\r\n\r\n        public static AABBox FromPoints(Vector3[] points)\r\n        {\r\n            float minx, miny, minz;\r\n            minx = miny = minz = float.PositiveInfinity;\r\n            float maxx, maxy, maxz;\r\n            maxx = maxy = maxz = float.NegativeInfinity;\r\n\r\n            foreach(var v in points)\r\n            {\r\n                if (v.x < minx) minx = v.x;\r\n                if (v.y < miny) miny = v.y;\r\n                if (v.z < minz) minz = v.z;\r\n\r\n                if (v.x > maxx) maxx = v.x;\r\n                if (v.y > maxy) maxy = v.y;\r\n                if (v.z > maxz) maxz = v.z;\r\n            }\r\n\r\n            var size = new Vector3((maxx - minx),\r\n                                   (maxy - miny),\r\n                                   (maxz - minz));\r\n            var cent = new Vector3(size.x / 2f + minx,\r\n                                   size.y / 2f + miny,\r\n                                   size.z / 2f + minz);\r\n            return new AABBox(cent, size);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/AxisInterval.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n    /// <summary>\r\n    /// Represents an interval on some axis. This is useful for projection of geometry on an axis. The axis is stored for token \r\n    /// purposes only and is not used for any actions with other intervals.\r\n    /// </summary>\r\n    [System.Serializable()]\r\n    public struct AxisInterval\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private Vector3 _axis;\r\n        [SerializeField()]\r\n        private float _min;\r\n        [SerializeField()]\r\n        private float _max;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public AxisInterval(Vector3 axis, float a, float b)\r\n        {\r\n            _axis = axis;\r\n            _min = a;\r\n            _max = b;\r\n\r\n            if (_min > _max)\r\n            {\r\n                var c = _min;\r\n                _min = _max;\r\n                _max = c;\r\n            }\r\n\r\n            var l = _axis.sqrMagnitude;\r\n            if (l != 0.0f && l != 1.0f) _axis.Normalize();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Vector3 Axis\r\n        {\r\n            get { return _axis; }\r\n            set\r\n            {\r\n                _axis = value.normalized;\r\n            }\r\n        }\r\n\r\n        public float Min\r\n        {\r\n            get { return _min; }\r\n        }\r\n\r\n        public float Max\r\n        {\r\n            get { return _max; }\r\n        }\r\n\r\n        public float Length\r\n        {\r\n            get { return Mathf.Abs(Max - Min); }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void SetExtents(float a, float b)\r\n        {\r\n            _min = a;\r\n            _max = b;\r\n\r\n            if (_min > _max)\r\n            {\r\n                var c = _min;\r\n                _min = _max;\r\n                _max = c;\r\n            }\r\n        }\r\n\r\n        public bool IsEmpty()\r\n        {\r\n            return _axis == Vector3.zero;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tests if Min and Max intersects, ignores axis\r\n        /// </summary>\r\n        /// <param name=\"inter\"></param>\r\n        /// <returns></returns>\r\n        public bool Intersects(AxisInterval inter)\r\n        {\r\n            if (_max < inter.Min) return false;\r\n            if (_min > inter.Max) return false;\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Appends the interval passed in, conserves this axis.\r\n        /// </summary>\r\n        /// <param name=\"inter\"></param>\r\n        public void Concat(AxisInterval inter)\r\n        {\r\n            var a = Mathf.Min(this.Min, inter.Min);\r\n            var b = Mathf.Max(this.Max, inter.Max);\r\n            this.SetExtents(a, b);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get the interval intersection of this and another interval, conserves this axis.\r\n        /// </summary>\r\n        /// <param name=\"inter\"></param>\r\n        /// <returns></returns>\r\n        public AxisInterval Intersection(AxisInterval inter)\r\n        {\r\n            if (_max < inter.Min) return new AxisInterval(_axis, 0, 0);\r\n            if (_min > inter.Max) return new AxisInterval(_axis, 0, 0);\r\n\r\n            return new AxisInterval(_axis, Mathf.Max(_min, inter.Min), Mathf.Min(_max, inter.Max));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Finds the mid value of the Min and Max of both intervals, ignores axis\r\n        /// </summary>\r\n        /// <param name=\"inter\"></param>\r\n        /// <returns></returns>\r\n        public float MidValue(AxisInterval inter)\r\n        {\r\n            float[] arr = new float[] { _min, _max, inter.Min, inter.Max };\r\n            System.Array.Sort(arr);\r\n            return (arr[2] + arr[1]) / 2.0f;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Total distance the two intervals pass, ignores axis\r\n        /// </summary>\r\n        /// <param name=\"inter\"></param>\r\n        /// <returns></returns>\r\n        public float Distance(AxisInterval inter)\r\n        {\r\n            if (_max > inter.Min) return 0;\r\n            if (_min < inter.Max) return 0;\r\n\r\n            return Mathf.Abs(_max - inter.Min);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Members\r\n\r\n        public static AxisInterval Empty\r\n        {\r\n            get { return new AxisInterval(Vector3.zero, float.NaN, float.NaN); }\r\n        }\r\n\r\n        public static AxisInterval NoHit(Vector3 axis)\r\n        {\r\n            return new AxisInterval(axis, float.NaN, float.NaN);\r\n        }\r\n\r\n        #endregion\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/BezierSpline.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n\r\n    /// <summary>\r\n    /// Represents a N-Degree Bezier Spline.\r\n    /// </summary>\r\n    public class BezierSpline : I3dSpline\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private List<Vector3> _points = new List<Vector3>();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public BezierSpline()\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Vector3 this[int index]\r\n        {\r\n            get { return this.ControlPoint(index); }\r\n            set { this.MoveControlPoint(index, value); }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private Vector3 ComputeNaive(float t)\r\n        {\r\n            if (_points.Count == 0) return Vector3.zero;\r\n            if (_points.Count == 1) return _points[0];\r\n\r\n            t = Mathf.Clamp01(t);\r\n            var arr = _points.ToArray();\r\n            var c = arr.Length;\r\n            while (c > 1)\r\n            {\r\n                for (int i = 1; i < c; i++)\r\n                {\r\n                    arr[i - 1] = Vector3.Lerp(arr[i - 1], arr[i], t);\r\n                }\r\n\r\n                c--;\r\n            }\r\n\r\n            return arr[0];\r\n        }\r\n\r\n        private Vector3 ComputeNaive(int index, float t)\r\n        {\r\n            if (index < 0 || index >= _points.Count) throw new System.IndexOutOfRangeException();\r\n\r\n            t = Mathf.Clamp01(t);\r\n            float pt = 1.0f / (float)(_points.Count - 1);\r\n            return ComputeNaive(pt * ((float)index + t));\r\n        }\r\n\r\n        private float ComputeNaiveArcLength()\r\n        {\r\n            //todo\r\n            return float.NaN;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region I3dSpline Interface\r\n\r\n        public int Count { get { return _points.Count; } }\r\n\r\n        public Vector3 ControlPoint(int index)\r\n        {\r\n            if (index < 0 || index >= _points.Count) throw new System.IndexOutOfRangeException();\r\n            return _points[index];\r\n        }\r\n\r\n        public void AddControlPoint(Vector3 w)\r\n        {\r\n            _points.Add(w);\r\n        }\r\n\r\n        public void MoveControlPoint(int index, Vector3 w)\r\n        {\r\n            if (index < 0 || index >= _points.Count) throw new System.IndexOutOfRangeException();\r\n            _points[index] = w;\r\n        }\r\n\r\n        public void RemoveControlPoint(int index)\r\n        {\r\n            _points.RemoveAt(index);\r\n        }\r\n\r\n        public float GetArcLength()\r\n        {\r\n            return ComputeNaiveArcLength();\r\n        }\r\n\r\n        public Vector3 GetPosition(float t)\r\n        {\r\n            return ComputeNaive(t);\r\n        }\r\n\r\n        public Vector3 GetPositionAfter(int index, float t)\r\n        {\r\n            return ComputeNaive(index, t);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public IEnumerator<Vector3> GetEnumerator()\r\n        {\r\n            return _points.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _points.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/BoundingSphereAlgorithm.cs",
    "content": "﻿namespace com.spacepuppy.Geom\r\n{\r\n\r\n    public enum BoundingSphereAlgorithm\r\n    {\r\n        FromBounds = 0,\r\n        Average = 1,\r\n        Ritter = 2\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/Box.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n    public struct Box : IGeom, System.Runtime.Serialization.ISerializable, IPhysicsGeom\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private Vector3 _center;\r\n        [SerializeField()]\r\n        private Vector3 _size;\r\n        [SerializeField()]\r\n        private Quaternion _orientation;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public Box(Vector3 cent, Vector3 sz, Quaternion orientation)\r\n        {\r\n            _center = cent;\r\n            _size = sz;\r\n            _orientation = orientation;\r\n        }\r\n\r\n        public Box(Bounds bounds)\r\n        {\r\n            _center = bounds.center;\r\n            _size = bounds.size;\r\n            _orientation = Quaternion.identity;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Vector3 Center { get { return _center; } set { _center = value; } }\r\n        public Vector3 Size { get { return _size; } set { _size = value; } }\r\n\r\n        public Quaternion Orientation { get { return _orientation; } set { _orientation = value; } }\r\n\r\n        public Vector3 Extents\r\n        {\r\n            get { return _size / 2.0f; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IGeom Interface\r\n\r\n        public void Move(Vector3 mv)\r\n        {\r\n            _center += mv;\r\n        }\r\n\r\n        public void RotateAroundPoint(Vector3 point, Quaternion rot)\r\n        {\r\n            _center = point + rot * (_center - point);\r\n            _orientation = _orientation * rot;\r\n        }\r\n\r\n        public AxisInterval Project(Vector3 axis)\r\n        {\r\n            axis.Normalize();\r\n            Vector3 extents = _size / 2.0f;\r\n            float min = float.PositiveInfinity;\r\n            float max = float.NegativeInfinity;\r\n            for (int i = 0; i < 8; i++)\r\n            {\r\n                //gets one of the 8 corners\r\n                var v = extents;\r\n                if ((i / 2) % 2 == 0) v.x = -v.x;\r\n                if ((i / 4) % 2 == 0) v.y = -v.y;\r\n                if (((i + 1) / 2) % 2 == 0) v.z = -v.z;\r\n\r\n                v = _center + _orientation * v;\r\n                var d = Vector3.Dot(v, axis);\r\n                if (d < min) min = d;\r\n                if (d > max) max = d;\r\n            }\r\n\r\n            return new AxisInterval(axis, min, max);\r\n        }\r\n\r\n        public Bounds GetBounds()\r\n        {\r\n            var ix = this.Project(Vector3.right);\r\n            var iy = this.Project(Vector3.up);\r\n            var iz = this.Project(Vector3.forward);\r\n\r\n            return new Bounds(new Vector3(ix.Min + (ix.Max - ix.Min) * 0.5f,\r\n                                iy.Min + (iy.Max - ix.Min) * 0.5f,\r\n                                iz.Min + (iz.Max - iz.Min) * 0.5f),\r\n                              new Vector3(ix.Length, iy.Length, iz.Length));\r\n        }\r\n\r\n        public Sphere GetBoundingSphere()\r\n        {\r\n            return new Sphere(Center, this.Extents.magnitude);\r\n        }\r\n\r\n        public bool Contains(Vector3 pos)\r\n        {\r\n            pos -= _center;\r\n            pos = Quaternion.Inverse(_orientation) * pos;\r\n\r\n            var extents = this.Extents;\r\n            return pos.x >= -extents.x && pos.x <= extents.x &&\r\n                   pos.y >= -extents.y && pos.y <= extents.y &&\r\n                   pos.z >= -extents.z && pos.z <= extents.z;\r\n        }\r\n\r\n        public IEnumerable<Vector3> GetAxes()\r\n        {\r\n            yield return _orientation * Vector3.up;\r\n            yield return _orientation * Vector3.right;\r\n            yield return _orientation * Vector3.forward;\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region IPhysicsGeom Interface\r\n\r\n        public bool TestOverlap(int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            return Physics.CheckBox(_center, this.Extents, _orientation, layerMask, query);\r\n        }\r\n\r\n        public int Overlap(ICollection<Collider> results, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            return PhysicsUtil.OverlapBox(_center, this.Extents, results, _orientation, layerMask, query);\r\n        }\r\n\r\n        public bool Cast(Vector3 direction, out RaycastHit hitinfo, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            return Physics.BoxCast(_center, this.Extents, direction, out hitinfo, _orientation, distance, layerMask, query);\r\n        }\r\n\r\n        public int CastAll(Vector3 direction, ICollection<RaycastHit> results, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            return PhysicsUtil.BoxCastAll(_center, this.Extents, direction, results, _orientation, distance, layerMask, query);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n\r\n        #region ISerializable Interface\r\n\r\n        private Box(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)\r\n        {\r\n            _center = new Vector3(info.GetSingle(\"center.x\"), info.GetSingle(\"center.y\"), info.GetSingle(\"center.z\"));\r\n            _size = new Vector3(info.GetSingle(\"size.x\"), info.GetSingle(\"size.y\"), info.GetSingle(\"size.z\"));\r\n            var euler = new Vector3(info.GetSingle(\"rot.x\"), info.GetSingle(\"rot.y\"), info.GetSingle(\"rot.z\"));\r\n            _orientation = Quaternion.Euler(euler);\r\n        }\r\n\r\n        void System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)\r\n        {\r\n            info.AddValue(\"center.x\", this.Center.x);\r\n            info.AddValue(\"center.y\", this.Center.y);\r\n            info.AddValue(\"center.z\", this.Center.z);\r\n            info.AddValue(\"size.x\", this.Size.x);\r\n            info.AddValue(\"size.y\", this.Size.y);\r\n            info.AddValue(\"size.z\", this.Size.z);\r\n            var euler = this.Orientation.eulerAngles;\r\n            info.AddValue(\"rot.x\", euler.x);\r\n            info.AddValue(\"rot.y\", euler.y);\r\n            info.AddValue(\"rot.z\", euler.z);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Static Interface\r\n\r\n        public static Box FromCollider(BoxCollider c, bool local = false)\r\n        {\r\n            if (c == null) return new Box();\r\n\r\n            if (local)\r\n            {\r\n                //var pos = c.transform.localPosition;\r\n                //var scale = c.transform.localScale;\r\n                //var rot = c.transform.localRotation;\r\n                //var cent = c.center;\r\n                //var sz = c.size;\r\n\r\n                //cent.x *= scale.x;\r\n                //cent.y *= scale.y;\r\n                //cent.z *= scale.z;\r\n                //cent = rot * cent;\r\n                //sz.x *= scale.x;\r\n                //sz.y *= scale.y;\r\n                //sz.z *= scale.z;\r\n                //return new Box(pos + cent, sz, rot);\r\n\r\n                return new Box(c.center, c.size, Quaternion.identity);\r\n            }\r\n            else\r\n            {\r\n                var pos = c.transform.position;\r\n                var scale = c.transform.lossyScale;\r\n                var rot = c.transform.rotation;\r\n                var cent = c.center;\r\n                var sz = c.size;\r\n\r\n                cent.x *= scale.x;\r\n                cent.y *= scale.y;\r\n                cent.z *= scale.z;\r\n                cent = rot * cent;\r\n                sz.x *= scale.x;\r\n                sz.y *= scale.y;\r\n                sz.z *= scale.z;\r\n                return new Box(pos + cent, sz, rot);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/Capsule.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n    [System.Serializable]\r\n    public struct Capsule : IGeom, IPhysicsGeom, System.Runtime.Serialization.ISerializable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private Vector3 _start;\r\n        [SerializeField()]\r\n        private Vector3 _end;\r\n        [SerializeField()]\r\n        private float _rad;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public Capsule(Vector3 start, Vector3 end, float radius)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _rad = radius;\r\n        }\r\n\r\n        public Capsule(Vector3 center, Vector3 up, float height, float radius)\r\n        {\r\n            var h = Mathf.Max(0f,(height - (radius * 2.0f)) / 2.0f);\r\n            var change = up.normalized * h;\r\n\r\n            _start = center - change;\r\n            _end = center + change;\r\n            _rad = radius;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Vector3 Start\r\n        {\r\n            get { return _start; }\r\n            set { _start = value; }\r\n        }\r\n\r\n        public Vector3 End\r\n        {\r\n            get { return _end; }\r\n            set { _end = value; }\r\n        }\r\n\r\n        public float Radius\r\n        {\r\n            get { return _rad; }\r\n            set { _rad = value; }\r\n        }\r\n\r\n        public float Height\r\n        {\r\n            get\r\n            {\r\n                if (_end == _start)\r\n                    return _rad * 2.0f;\r\n                else\r\n                    return (_end - _start).magnitude + _rad * 2.0f;\r\n            }\r\n            set\r\n            {\r\n                var c = this.Center;\r\n                var up = (_end - _start).normalized;\r\n                if (up == Vector3.zero) up = Vector3.up;\r\n                var change = up * Mathf.Max(0f, (value / 2f) - _rad);\r\n                _start = c - change;\r\n                _end = c + change;\r\n            }\r\n        }\r\n\r\n        public Vector3 Center\r\n        {\r\n            get\r\n            {\r\n                if (_end == _start)\r\n                    return _start;\r\n                else\r\n                    return _start + (_end - _start) * 0.5f;\r\n            }\r\n            set\r\n            {\r\n                var change = (value - this.Center);\r\n                _start += change;\r\n                _end += change;\r\n            }\r\n        }\r\n\r\n        public Vector3 Up\r\n        {\r\n            get\r\n            {\r\n                if (_end == _start)\r\n                    return Vector3.up;\r\n                else\r\n                    return (_end - _start).normalized;\r\n            }\r\n        }\r\n\r\n        public bool IsSpherical\r\n        {\r\n            get { return _end == _start; }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region IGeom Interface\r\n\r\n        public void Move(Vector3 mv)\r\n        {\r\n            _start += mv;\r\n            _end += mv;\r\n        }\r\n\r\n        public void RotateAroundPoint(Vector3 point, Quaternion rot)\r\n        {\r\n            _start = point + rot * (_start - point);\r\n            _end = point + rot * (_end - point);\r\n        }\r\n\r\n        public AxisInterval Project(Vector3 axis)\r\n        {\r\n            axis.Normalize();\r\n            var c1 = Vector3.Dot(_start, axis);\r\n            var c2 = Vector3.Dot(_end, axis);\r\n            var p1 = c1 - _rad;\r\n            var p2 = c1 + _rad;\r\n            var p3 = c2 - _rad;\r\n            var p4 = c2 + _rad;\r\n\r\n            return new AxisInterval(axis, Mathf.Min(p1, p2, p3, p4), Mathf.Max(p1, p2, p3, p4));\r\n        }\r\n\r\n        public Bounds GetBounds()\r\n        {\r\n            Vector3 c = this.Center;\r\n            Vector3 sz = new Vector3();\r\n            sz.x = Mathf.Abs(_start.x - c.x) + _rad;\r\n            sz.y = Mathf.Abs(_start.y - c.y) + _rad;\r\n            sz.z = Mathf.Abs(_start.z - c.y) + _rad;\r\n            return new Bounds(c, sz);\r\n        }\r\n\r\n        public Sphere GetBoundingSphere()\r\n        {\r\n            return new Sphere(this.Center, (_end - _start).magnitude + _rad);\r\n        }\r\n\r\n        public IEnumerable<Vector3> GetAxes()\r\n        {\r\n            //TODO\r\n            return System.Linq.Enumerable.Empty<Vector3>();\r\n        }\r\n\r\n        public bool Contains(Vector3 pos)\r\n        {\r\n            var sqrRad = _rad * _rad;\r\n\r\n            if (this.IsSpherical)\r\n            {\r\n                return Vector3.SqrMagnitude(pos - _start) <= sqrRad;\r\n            }\r\n            else\r\n            {\r\n                if (Vector3.SqrMagnitude(pos - _start) <= sqrRad) return true;\r\n                if (Vector3.SqrMagnitude(pos - _end) <= sqrRad) return true;\r\n            }\r\n\r\n            var rail = _end - _start;\r\n            var rod = pos - _start;\r\n            var sqrLen = rod.sqrMagnitude;\r\n            var dot = Vector3.Dot(rod, rail);\r\n\r\n            if (dot < 0f || dot > sqrLen)\r\n            {\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                var disSqr = rod.sqrMagnitude - dot * dot / sqrLen;\r\n                if (disSqr > sqrRad)\r\n                    return false;\r\n                else\r\n                    return true;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IPhysicsGeom Interface\r\n\r\n        public bool TestOverlap(int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (_start == _end)\r\n            {\r\n                return Physics.CheckSphere(_start, _rad, layerMask, query);\r\n            }\r\n            else\r\n            {\r\n                return Physics.CheckCapsule(_start, _end, _rad, layerMask, query);\r\n            }\r\n        }\r\n\r\n        public int Overlap(ICollection<Collider> results, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            return PhysicsUtil.OverlapCapsule(_start, _end, _rad, results, layerMask, query);\r\n        }\r\n\r\n        public bool Cast(Vector3 direction, out RaycastHit hitinfo, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (_start == _end)\r\n            {\r\n                return Physics.SphereCast(_start, _rad, direction, out hitinfo, distance, layerMask, query);\r\n            }\r\n            else\r\n            {\r\n                return Physics.CapsuleCast(_start, _end, _rad, direction, out hitinfo, distance, layerMask, query);\r\n            }\r\n        }\r\n\r\n        public int CastAll(Vector3 direction, ICollection<RaycastHit> results, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if(_start == _end)\r\n            {\r\n                return PhysicsUtil.SphereCastAll(_start, _rad, direction, results, distance, layerMask, query);\r\n            }\r\n            else\r\n            {\r\n                return PhysicsUtil.CapsuleCastAll(_start, _end, _rad, direction, results, distance, layerMask, query);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region ISerializable Interface\r\n\r\n        private Capsule(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)\r\n        {\r\n            _start = new Vector3(info.GetSingle(\"start.x\"), info.GetSingle(\"start.y\"), info.GetSingle(\"start.z\"));\r\n            _end = new Vector3(info.GetSingle(\"end.x\"), info.GetSingle(\"end.y\"), info.GetSingle(\"end.z\"));\r\n            _rad = info.GetSingle(\"radius\");\r\n        }\r\n\r\n        void System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)\r\n        {\r\n            info.AddValue(\"start.x\", _start.x);\r\n            info.AddValue(\"start.y\", _start.y);\r\n            info.AddValue(\"start.z\", _start.z);\r\n            info.AddValue(\"end.x\", _end.x);\r\n            info.AddValue(\"end.y\", _end.y);\r\n            info.AddValue(\"end.z\", _end.z);\r\n            info.AddValue(\"radius\", _rad);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Static Interface\r\n\r\n        public static Capsule FromCollider(CharacterController cap, bool local = false)\r\n        {\r\n            if(local)\r\n            {\r\n                float r = cap.radius;\r\n                float h = Mathf.Max(r, cap.height);\r\n                return new Capsule(cap.center, Vector3.up, h, r);\r\n            }\r\n            else\r\n            {\r\n                var cent = cap.transform.position + cap.center;\r\n                var hsc = Mathf.Max(cap.transform.lossyScale.x, cap.transform.lossyScale.y);\r\n                var vsc = cap.transform.lossyScale.y;\r\n\r\n                return new Capsule(cent, Vector3.up, cap.height * vsc, cap.radius * hsc);\r\n            }\r\n        }\r\n\r\n        public static Capsule FromCollider(CapsuleCollider cap, bool local = false)\r\n        {\r\n            if(local)\r\n            {\r\n                float r = cap.radius;\r\n                float h = Mathf.Max(r, cap.height);\r\n                Vector3 ax;\r\n                switch (cap.direction)\r\n                {\r\n                    case 0:\r\n                        ax = Vector3.right;\r\n                        break;\r\n                    case 1:\r\n                        ax = Vector3.up;\r\n                        break;\r\n                    case 2:\r\n                        ax = Vector3.right;\r\n                        break;\r\n                    default:\r\n                        ax = Vector3.up;\r\n                        break;\r\n                }\r\n                return new Capsule(cap.center, ax, h, r);\r\n            }\r\n            else\r\n            {\r\n                Vector3 axis;\r\n                float hsc;\r\n                float vsc;\r\n                switch (cap.direction)\r\n                {\r\n                    case 0:\r\n                        axis = cap.transform.right;\r\n                        hsc = Mathf.Max(cap.transform.lossyScale.x, cap.transform.lossyScale.y);\r\n                        vsc = cap.transform.lossyScale.x;\r\n                        break;\r\n                    case 1:\r\n                        axis = cap.transform.up;\r\n                        hsc = Mathf.Max(cap.transform.lossyScale.x, cap.transform.lossyScale.y);\r\n                        vsc = cap.transform.lossyScale.y;\r\n                        break;\r\n                    case 2:\r\n                        axis = cap.transform.forward;\r\n                        hsc = Mathf.Max(cap.transform.lossyScale.z, cap.transform.lossyScale.y);\r\n                        vsc = cap.transform.lossyScale.z;\r\n                        break;\r\n                    default:\r\n                        return new Capsule();\r\n                }\r\n\r\n                var cent = cap.center;\r\n\r\n                cent = cap.transform.TransformPoint(cent);\r\n                return new Capsule(cent, axis, cap.height * vsc, cap.radius * hsc);\r\n            }\r\n        }\r\n\r\n        public static Capsule FromCollider(SphereCollider sph, bool local = false)\r\n        {\r\n            var cent = sph.transform.TransformPoint(sph.center);\r\n            return new Capsule(cent, cent, sph.radius);\r\n        }\r\n\r\n        public static Capsule FromCollider(Collider c, bool local = false)\r\n        {\r\n            if (c is SphereCollider)\r\n            {\r\n                return FromCollider(c as SphereCollider, local);\r\n            }\r\n            else if (c is CapsuleCollider)\r\n            {\r\n                return FromCollider(c as CapsuleCollider, local);\r\n            }\r\n            else\r\n            {\r\n                var s = Sphere.FromCollider(c, local);\r\n                return new Capsule(s.Center, s.Center, s.Radius);\r\n            }\r\n        }\r\n\r\n        public static Capsule FromCollider(Collider c, BoundingSphereAlgorithm algorithm, bool local = false)\r\n        {\r\n            if (c is SphereCollider)\r\n            {\r\n                return FromCollider(c as SphereCollider, local);\r\n            }\r\n            else if (c is CapsuleCollider)\r\n            {\r\n                return FromCollider(c as CapsuleCollider, local);\r\n            }\r\n            else\r\n            {\r\n                var s = Sphere.FromCollider(c, algorithm, local);\r\n                return new Capsule(s.Center, s.Center, s.Radius);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/CatmullRomSpline.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n    public class CatmullRomSpline : I3dSpline\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private const int SUBDIVISIONS_MULTIPLIER = 16;\r\n\r\n        private List<Vector3> _points = new List<Vector3>();\r\n        private bool _useConstantSpeed = true;\r\n\r\n        private bool _dirty;\r\n        private float _totalArcLength = float.NaN;\r\n        private float[] _timesTable;\r\n        private float[] _lengthsTable;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool IsValid { get { return _points.Count >= 4; } }\r\n\r\n        public bool UseConstantSpeed\r\n        {\r\n            get { return _useConstantSpeed; }\r\n            set { _useConstantSpeed = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void ForceClean()\r\n        {\r\n            if (!this.IsValid)\r\n            {\r\n                _totalArcLength = float.NaN;\r\n                _timesTable = null;\r\n                _lengthsTable = null;\r\n                return;\r\n            }\r\n\r\n            _totalArcLength = 0f;\r\n            int subdivisions = SUBDIVISIONS_MULTIPLIER * _points.Count;\r\n            float incr = 1f / subdivisions;\r\n            _timesTable = new float[subdivisions];\r\n            _lengthsTable = new float[subdivisions];\r\n\r\n            var prevP = this.GetRealPosition(0);\r\n            float perc;\r\n            Vector3 currP;\r\n            for (int i = 1; i <= subdivisions; ++i)\r\n            {\r\n                perc = incr * i;\r\n                currP = this.GetRealPosition(perc);\r\n                _totalArcLength += Vector3.Distance(currP, prevP);\r\n                prevP = currP;\r\n                _timesTable[i - 1] = perc;\r\n                _lengthsTable[i - 1] = _totalArcLength;\r\n            }\r\n        }\r\n\r\n        private Vector3 GetRealPosition(float t)\r\n        {\r\n            int numSections = _points.Count - 3;\r\n            int tSec = Mathf.FloorToInt(t * numSections);\r\n            int currPt = numSections - 1;\r\n            if (currPt > tSec) currPt = tSec;\r\n            float u = t * numSections - currPt;\r\n\r\n            Vector3 a = _points[currPt];\r\n            Vector3 b = _points[currPt + 1];\r\n            Vector3 c = _points[currPt + 2];\r\n            Vector3 d = _points[currPt + 3];\r\n            return 0.5f * (\r\n                    (-a + 3f * b - 3f * c + d) * (u * u * u)\r\n                    + (2f * a - 5f * b + 4f * c - d) * (u * u)\r\n                    + (-a + c) * u\r\n                    + 2f * b\r\n                    );\r\n        }\r\n\r\n        private float GetConstPathPercFromTimePerc(float t)\r\n        {\r\n            //Apply constant speed\r\n            if (t > 0f && t < 1f)\r\n            {\r\n                float tLen = _totalArcLength * t;\r\n                float t0 = 0f, l0 = 0f, t1 = 0f, l1 = 0f;\r\n                int alen = _lengthsTable.Length;\r\n                for (int i = 0; i < alen; ++i)\r\n                {\r\n                    if (_lengthsTable[i] > tLen)\r\n                    {\r\n                        t1 = _timesTable[i];\r\n                        l1 = _lengthsTable[i];\r\n                        if (i > 0) l0 = _lengthsTable[i - 1];\r\n                        break;\r\n                    }\r\n                    t0 = _timesTable[i];\r\n                }\r\n                t = t0 + ((tLen - l0) / (l1 - l0)) * (t1 - t0);\r\n            }\r\n\r\n            if (t > 1f) t = 1f;\r\n            else if (t < 0f) t = 0f;\r\n            return t;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region I3DSpline Interface\r\n\r\n        public int Count\r\n        {\r\n            get { return _points.Count; }\r\n        }\r\n\r\n        public Vector3 ControlPoint(int index)\r\n        {\r\n            return _points[index];\r\n        }\r\n\r\n        public void AddControlPoint(Vector3 w)\r\n        {\r\n            _points.Add(w);\r\n            _dirty = true;\r\n        }\r\n\r\n        public void MoveControlPoint(int index, Vector3 w)\r\n        {\r\n            _points[index] = w;\r\n            _dirty = true;\r\n        }\r\n\r\n        public void RemoveControlPoint(int index)\r\n        {\r\n            _points.RemoveAt(index);\r\n        }\r\n\r\n        public float GetArcLength()\r\n        {\r\n            if (_dirty) this.ForceClean();\r\n            return _totalArcLength;\r\n        }\r\n\r\n        public Vector3 GetPosition(float t)\r\n        {\r\n            if (_points.Count < 4) throw new System.InvalidOperationException(\"Cardinal Spline must contain at least 4 waypoints.\");\r\n            if (_dirty) this.ForceClean();\r\n\r\n            if (_useConstantSpeed) t = this.GetConstPathPercFromTimePerc(t);\r\n\r\n            return GetRealPosition(t);\r\n        }\r\n\r\n        public Vector3 GetPositionAfter(int index, float t)\r\n        {\r\n            if (_points.Count < 4) throw new System.InvalidOperationException(\"Cardinal Spline must contain at least 4 waypoints.\");\r\n            if (index < 0 || index >= _points.Count) throw new System.IndexOutOfRangeException();\r\n            if (index == _points.Count - 1) return _points[index];\r\n\r\n            int i = index * SUBDIVISIONS_MULTIPLIER;\r\n            int j = (index + 1) * SUBDIVISIONS_MULTIPLIER;\r\n            float nt = _timesTable[i] + (_timesTable[j] - _timesTable[i]) * t;\r\n            return this.GetRealPosition(nt);\r\n        }\r\n\r\n        public IEnumerator<Vector3> GetEnumerator()\r\n        {\r\n            return _points.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _points.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/Cone.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy.Geom\n{\n\n    public struct Cone : IGeom\n    {\n\n        #region Fields\n\n        private Vector3 _start;\n        private Vector3 _end;\n        private float _startRad;\n        private float _endRad;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public Cone(Vector3 start, Vector3 end, float startRadius, float endRadius)\n        {\n            _start = start;\n            _end = end;\n            _startRad = startRadius;\n            _endRad = endRadius;\n        }\n\n        #endregion\n        \n        #region Properties\n\n        public Vector3 Start\n        {\n            get { return _start; }\n            set { _start = value; }\n        }\n\n        public Vector3 End\n        {\n            get { return _end; }\n            set { _end = value; }\n        }\n\n        public float StartRadius\n        {\n            get { return _startRad; }\n            set { _startRad = value; }\n        }\n\n        public float EndRadius\n        {\n            get { return _endRad; }\n            set { _endRad = value; }\n        }\n\n        public float Height\n        {\n            get\n            {\n                return (_end - _start).magnitude;\n            }\n            set\n            {\n                var c = this.Center;\n                var up = (_end - _start).normalized;\n                var change = up * value / 2.0f;\n                _start = c - change;\n                _end = c + change;\n            }\n        }\n\n        public Vector3 Center\n        {\n            get\n            {\n                if (_end == _start)\n                    return _start;\n                else\n                    return _start + (_end - _start) * 0.5f;\n            }\n            set\n            {\n                var change = (value - this.Center);\n                _start += change;\n                _end += change;\n            }\n        }\n\n        public Vector3 Up\n        {\n            get\n            {\n                if (_end == _start)\n                    return Vector3.up;\n                else\n                    return (_end - _start).normalized;\n            }\n        }\n\n        #endregion\n\n        #region IGeom Interface\n\n        public void Move(Vector3 mv)\n        {\n            _start += mv;\n            _end += mv;\n        }\n\n        public void RotateAroundPoint(Vector3 point, Quaternion rot)\n        {\n            _start = point + rot * (_start - point);\n            _end = point + rot * (_end - point);\n        }\n\n        public AxisInterval Project(Vector3 axis)\n        {\n            //TODO\n            throw new System.NotImplementedException();\n        }\n\n        public Bounds GetBounds()\n        {\n            //TODO\n            throw new System.NotImplementedException();\n        }\n\n        public Sphere GetBoundingSphere()\n        {\n            var rod = _end - _start;\n            double r1 = rod.magnitude;\n            rod /= (float)r1;\n            r1 /= 2d;\n            double r2 = System.Math.Max(_startRad, _endRad);\n\n            return new Sphere(_start + rod * (float)r1, (float)System.Math.Sqrt(r1 * r1 + r2 * r2));\n        }\n\n        public IEnumerable<Vector3> GetAxes()\n        {\n            //TODO\n            return System.Linq.Enumerable.Empty<Vector3>();\n        }\n\n        public bool Contains(Vector3 pos)\n        {\n            return ContainsPoint(_start, _end, _startRad, _endRad, pos);\n        }\n\n        #endregion\n\n\n\n        #region Static Utils\n\n        public static bool ContainsPoint(Vector3 start, Vector3 end, float startRadius, float endRadius, Vector3 pnt)\n        {\n            var rail = end - start;\n            var rod = pnt - start;\n            var dot = Vector3.Dot(rod, rail);\n            var sqrRailLength = rail.sqrMagnitude;\n\n            if (dot < 0f || dot > sqrRailLength)\n            {\n                return false;\n            }\n            else\n            {\n                float radius;\n                if (sqrRailLength < 0.0001f)\n                    radius = Mathf.Max(startRadius, endRadius);\n                else\n                    radius = startRadius + (endRadius - startRadius) * dot / sqrRailLength;\n\n                if (rod.sqrMagnitude - dot * dot / sqrRailLength > radius * radius)\n                    return false;\n                else\n                    return true;\n            }\n        }\n\n        public static bool ContainsSphere(Vector3 start, Vector3 end, float startRadius, float endRadius, Vector3 pnt, float sphereRadius)\n        {\n            var rail = end - start;\n            var rod = pnt - start;\n            var dot = Vector3.Dot(rod, rail);\n            var sqrRailLength = rail.sqrMagnitude;\n            float sqrSphereRad = sphereRadius * sphereRadius;\n\n            if (dot < -sqrSphereRad || dot > sqrRailLength + sqrSphereRad)\n            {\n                return false;\n            }\n            else\n            {\n                float radius;\n                if (sqrRailLength < 0.0001f)\n                    radius = Mathf.Max(startRadius, endRadius);\n                else\n                    radius = startRadius + (endRadius - startRadius) * dot / sqrRailLength;\n\n                if (rod.sqrMagnitude - dot * dot / sqrRailLength > radius * radius + sqrSphereRad)\n                    return false;\n                else\n                    return true;\n            }\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Geom/Cylinder.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n\r\n    public struct Cylinder : IGeom\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Vector3 _start;\r\n        private Vector3 _end;\r\n        private float _rad;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public Cylinder(Vector3 start, Vector3 end, float radius)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _rad = radius;\r\n        }\r\n\r\n        public Cylinder(Vector3 center, Vector3 up, float height, float radius)\r\n        {\r\n            var h = (height - (radius * 2.0f)) / 2.0f;\r\n            var change = up.normalized * h;\r\n\r\n            _start = center - change;\r\n            _end = center + change;\r\n            _rad = radius;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Vector3 Start\r\n        {\r\n            get { return _start; }\r\n            set { _start = value; }\r\n        }\r\n\r\n        public Vector3 End\r\n        {\r\n            get { return _end; }\r\n            set { _end = value; }\r\n        }\r\n\r\n        public float Radius\r\n        {\r\n            get { return _rad; }\r\n            set { _rad = value; }\r\n        }\r\n\r\n        public float Height\r\n        {\r\n            get\r\n            {\r\n                return (_end - _start).magnitude;\r\n            }\r\n            set\r\n            {\r\n                var c = this.Center;\r\n                var up = (_end - _start).normalized;\r\n                var change = up * value / 2.0f;\r\n                _start = c - change;\r\n                _end = c + change;\r\n            }\r\n        }\r\n\r\n        public Vector3 Center\r\n        {\r\n            get\r\n            {\r\n                if (_end == _start)\r\n                    return _start;\r\n                else\r\n                    return _start + (_end - _start) * 0.5f;\r\n            }\r\n            set\r\n            {\r\n                var change = (value - this.Center);\r\n                _start += change;\r\n                _end += change;\r\n            }\r\n        }\r\n\r\n        public Vector3 Up\r\n        {\r\n            get\r\n            {\r\n                if (_end == _start)\r\n                    return Vector3.up;\r\n                else\r\n                    return (_end - _start).normalized;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region IGeom Interface\r\n\r\n        public void Move(Vector3 mv)\r\n        {\r\n            _start += mv;\r\n            _end += mv;\r\n        }\r\n\r\n        public void RotateAroundPoint(Vector3 point, Quaternion rot)\r\n        {\r\n            _start = point + rot * (_start - point);\r\n            _end = point + rot * (_end - point);\r\n        }\r\n\r\n        public AxisInterval Project(Vector3 axis)\r\n        {\r\n            //TODO\r\n            throw new System.NotImplementedException();\r\n        }\r\n\r\n        public Bounds GetBounds()\r\n        {\r\n            //TODO\r\n            throw new System.NotImplementedException();\r\n        }\r\n\r\n        public Sphere GetBoundingSphere()\r\n        {\r\n            //TODO\r\n            throw new System.NotImplementedException();\r\n        }\r\n\r\n        public IEnumerable<Vector3> GetAxes()\r\n        {\r\n            //TODO\r\n            return System.Linq.Enumerable.Empty<Vector3>();\r\n        }\r\n\r\n        public bool Contains(Vector3 pos)\r\n        {\r\n            var rail = _end - _start;\r\n            var rod = pos - _start;\r\n            var dot = Vector3.Dot(rod, rail);\r\n            var sqrRailLength = rail.sqrMagnitude;\r\n\r\n            if (dot < 0f || dot > sqrRailLength)\r\n            {\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                if (rod.sqrMagnitude - dot * dot / sqrRailLength > _rad * _rad)\r\n                    return false;\r\n                else\r\n                    return true;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Utils\r\n\r\n        public static bool ContainsPoint(Vector3 start, Vector3 end, float radius, Vector3 pnt)\r\n        {\r\n            var rail = end - start;\r\n            var rod = pnt - start;\r\n            var dot = Vector3.Dot(rod, rail);\r\n            var sqrRailLength = rail.sqrMagnitude;\r\n\r\n            if (dot < 0f || dot > sqrRailLength)\r\n            {\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                if (rod.sqrMagnitude - dot * dot / sqrRailLength > radius * radius)\r\n                    return false;\r\n                else\r\n                    return true;\r\n            }\r\n        }\r\n\r\n        public static bool ContainsPoint(Vector3 start, Vector3 end, float radius, float innerRadius, Vector3 pnt)\r\n        {\r\n            var rail = end - start;\r\n            var rod = pnt - start;\r\n            var dot = Vector3.Dot(rod, rail);\r\n            var sqrRailLength = rail.sqrMagnitude;\r\n\r\n            if (dot < 0f || dot > sqrRailLength)\r\n            {\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                float radialDistSqr = rod.sqrMagnitude - dot * dot / sqrRailLength;\r\n                if (radialDistSqr > radius * radius || (innerRadius > 0f && radialDistSqr < innerRadius * innerRadius))\r\n                    return false;\r\n                else\r\n                    return true;\r\n            }\r\n        }\r\n\r\n        public static bool ContainsSphere(Vector3 start, Vector3 end, float radius, Vector3 pnt, float sphereRadius)\r\n        {\r\n            var rail = end - start;\r\n            var rod = pnt - start;\r\n            var dot = Vector3.Dot(rod, rail);\r\n            float sqrRailLength = rail.sqrMagnitude;\r\n            float sqrSphereRad = sphereRadius * sphereRadius;\r\n\r\n            if (dot < -sqrSphereRad || dot > sqrRailLength + sqrSphereRad)\r\n            {\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                if (rod.sqrMagnitude - dot * dot / sqrRailLength > radius * radius + sqrSphereRad)\r\n                    return false;\r\n                else\r\n                    return true;\r\n            }\r\n        }\r\n\r\n        public static bool ContainsSphere(Vector3 start, Vector3 end, float radius, float innerRadius, Vector3 pnt, float sphereRadius)\r\n        {\r\n            var rail = end - start;\r\n            var rod = pnt - start;\r\n            var dot = Vector3.Dot(rod, rail);\r\n            var sqrRailLength = rail.sqrMagnitude;\r\n            float sqrSphereRad = sphereRadius * sphereRadius;\r\n\r\n            if (dot < -sqrSphereRad || dot > sqrRailLength + sqrSphereRad)\r\n            {\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                float radialDistSqr = rod.sqrMagnitude - dot * dot / sqrRailLength;\r\n                if (radialDistSqr > radius * radius + sqrSphereRad || radialDistSqr < innerRadius * innerRadius - sqrSphereRad)\r\n                    return false;\r\n                else\r\n                    return true;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/GeomUtil.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n    public static class GeomUtil\r\n    {\r\n\t\t\r\n\t\tpublic const float DOT_EPSILON = 0.0001f;\r\n        public static BoundingSphereAlgorithm DefaultBoundingSphereAlgorithm = BoundingSphereAlgorithm.FromBounds;\r\n\t\t\r\n\t\t\r\n        #region Intersections\r\n\r\n        public static bool Intersects(this IGeom geom1, IGeom geom2)\r\n        {\r\n            if (geom1 == null || geom2 == null) return false;\r\n\r\n            var s1 = geom1.GetBoundingSphere();\r\n            var s2 = geom2.GetBoundingSphere();\r\n            if ((s1.Center - s2.Center).magnitude > (s1.Radius + s2.Radius)) return false;\r\n\r\n            foreach(var a in geom1.GetAxes().Union(geom2.GetAxes()))\r\n            {\r\n                if (geom1.Project(a).Intersects(geom2.Project(a))) return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool Intersects(this IGeom geom, Bounds bounds)\r\n        {\r\n            //TODO - re-implement independent of geom, may speed this up\r\n            var geom2 = new AABBox(bounds);\r\n            return Intersects(geom, geom2);\r\n        }\r\n        \r\n\r\n\r\n\r\n\r\n        /// <summary>\r\n        /// Find intersecting line of two planes\r\n        /// </summary>\r\n        /// <param name=\"p1\"></param>\r\n        /// <param name=\"p2\"></param>\r\n        /// <returns></returns>\r\n        public static Line IntersectionOfPlanes(Plane p1, Plane p2)\r\n        {\r\n            var line = new Line();\r\n            line.Direction = Vector3.Cross(p1.normal, p2.normal);\r\n            Vector3 ldir = Vector3.Cross(p2.normal, line.Direction);\r\n\r\n            float d = Vector3.Dot(p1.normal, ldir);\r\n\r\n            //if d is to close to 0, planes are parallel\r\n            if (Mathf.Abs(d) > 0.005f)\r\n            {\r\n                Vector3 p1Top2 = (p1.normal * p1.distance) - (p2.normal * p2.distance);\r\n                float t = Vector3.Dot(p1.normal, p1Top2) / d;\r\n                line.Point = (p2.normal * p2.distance) + t * ldir;\r\n                return line;\r\n            }\r\n            else\r\n            {\r\n                throw new System.Exception(\"both planes are parallel\");\r\n            }\r\n        }\r\n        public static bool IntersectionOfPlanes(Plane p1, Plane p2, out Line line)\r\n        {\r\n            line = new Line();\r\n            line.Direction = Vector3.Cross(p1.normal, p2.normal);\r\n            Vector3 ldir = Vector3.Cross(p2.normal, line.Direction);\r\n\r\n            float d = Vector3.Dot(p1.normal, ldir);\r\n\r\n            //if d is to close to 0, planes are parallel\r\n            if (Mathf.Abs(d) > 0.005f)\r\n            {\r\n                Vector3 p1Top2 = (p1.normal * p1.distance) - (p2.normal * p2.distance);\r\n                float t = Vector3.Dot(p1.normal, p1Top2) / d;\r\n                line.Point = (p2.normal * p2.distance) + t * ldir;\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                line = new Line();\r\n                return false;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Find point at which 3 planes intersect\r\n        /// </summary>\r\n        /// <param name=\"p1\"></param>\r\n        /// <param name=\"p2\"></param>\r\n        /// <param name=\"p3\"></param>\r\n        /// <returns></returns>\r\n        public static Vector3 IntersectionOfPlanes(Plane p1, Plane p2, Plane p3)\r\n        {\r\n            try\r\n            {\r\n                var line = IntersectionOfPlanes(p1, p2);\r\n                var intersection = IntersectionOfLineAndPlane(line, p3);\r\n                return intersection;\r\n            }\r\n            catch (System.Exception)\r\n            {\r\n                throw new System.Exception(\"two or more planes are parallel, no intersection found\");\r\n            }\r\n        }\r\n        public static bool IntersectionOfPlanes(Plane p1, Plane p2, Plane p3, out Vector3 point)\r\n        {\r\n            try\r\n            {\r\n                var line = IntersectionOfPlanes(p1, p2);\r\n                point = IntersectionOfLineAndPlane(line, p3);\r\n                return true;\r\n            }\r\n            catch (System.Exception)\r\n            {\r\n                point = Vector3.zero;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Find interesection location of a line and a plane\r\n        /// </summary>\r\n        /// <param name=\"line\"></param>\r\n        /// <param name=\"plane\"></param>\r\n        /// <returns></returns>\r\n        public static Vector3 IntersectionOfLineAndPlane(Line line, Plane plane)\r\n        {\r\n            //calc dist...\r\n            float dotnum = Vector3.Dot((plane.normal * plane.distance) - line.Point, plane.normal);\r\n            float dotdenom = Vector3.Dot(line.Direction, plane.normal);\r\n\r\n            if (dotdenom != 0.0f)\r\n            {\r\n                float len = dotnum / dotdenom;\r\n                var v = line.Direction * len;\r\n                return line.Point + v;\r\n            }\r\n            else\r\n            {\r\n                throw new System.Exception(\"line and plane are parallel\");\r\n            }\r\n        }\r\n        public static bool IntersectionOfLineAndPlane(Line line, Plane plane, out Vector3 point)\r\n        {\r\n            //calc dist...\r\n            float dotnum = Vector3.Dot((plane.normal * plane.distance) - line.Point, plane.normal);\r\n            float dotdenom = Vector3.Dot(line.Direction, plane.normal);\r\n\r\n            if (dotdenom != 0.0f)\r\n            {\r\n                float len = dotnum / dotdenom;\r\n                var v = line.Direction * len;\r\n                point = line.Point + v;\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                point = Vector3.zero;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Plane Extension Methods\r\n        \r\n        public static Vector3 ProjectVectorOnPlane(this Plane pl, Vector3 v)\r\n        {\r\n            return v - (Vector3.Dot(v, pl.normal) * pl.normal);\r\n        }\r\n\r\n        public static Vector3 ProjectPointOnPlane(this Plane pl, Vector3 p)\r\n        {\r\n            //var d = Vector3.Dot(pl.normal, p) - pl.distance;\r\n            var d = Vector3.Dot(pl.normal, p) + pl.distance; //due to a bug in Plane, we have to do it this way\r\n            return p - pl.normal * d;\r\n        }\r\n\r\n        public static float AngleBetweenVectorAndPlane(this Plane pl, Vector3 v)\r\n        {\r\n            float dot = Vector3.Dot(v.normalized, pl.normal);\r\n            float a = Mathf.Acos(dot);\r\n            return 1.5707963f - a;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Create a reflection of a point, as if the plane was a mirror you were looking into.\r\n        /// </summary>\r\n        /// <param name=\"pl\"></param>\r\n        /// <param name=\"point\"></param>\r\n        /// <returns></returns>\r\n        public static Vector3 ReflectPointThroughPlane(this Plane pl, Vector3 point)\r\n        {\r\n            //var d = Vector3.Dot(pl.normal, point) - pl.distance;\r\n            var d = Vector3.Dot(pl.normal, point) + pl.distance; //due to a bug in Plane, we have to do it this way\r\n            return point - pl.normal * d * 2f;\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region GetBounds\r\n\r\n        public static Sphere GetGlobalBoundingSphere(this Renderer rend)\r\n        {\r\n            return GetGlobalBoundingSphere(rend, GeomUtil.DefaultBoundingSphereAlgorithm);\r\n        }\r\n\r\n        public static Sphere GetGlobalBoundingSphere(this Renderer rend, BoundingSphereAlgorithm algorithm)\r\n        {\r\n            if (algorithm != BoundingSphereAlgorithm.FromBounds && rend is SkinnedMeshRenderer)\r\n            {\r\n                return Sphere.FromMesh((rend as SkinnedMeshRenderer).sharedMesh, algorithm, Trans.GetGlobal(rend.transform));\r\n            }\r\n            else if (algorithm != BoundingSphereAlgorithm.FromBounds && rend is MeshRenderer && rend.HasComponent<MeshFilter>())\r\n            {\r\n                return Sphere.FromMesh((rend as MeshRenderer).GetComponent<MeshFilter>().sharedMesh, algorithm, Trans.GetGlobal(rend.transform));\r\n            }\r\n            else\r\n            {\r\n                var bounds = rend.bounds;\r\n                return new Sphere(bounds.center, bounds.extents.magnitude);\r\n            }\r\n        }\r\n\r\n        public static Sphere GetGlobalBoundingSphere(this Collider c)\r\n        {\r\n            return Sphere.FromCollider(c, GeomUtil.DefaultBoundingSphereAlgorithm, false);\r\n        }\r\n\r\n        public static Sphere GetGlobalBoundingSphere(this Collider c, BoundingSphereAlgorithm algorithm)\r\n        {\r\n            return Sphere.FromCollider(c, algorithm, false);\r\n        }\r\n\r\n        public static Sphere GetLocalBoundingSphere(this Renderer rend)\r\n        {\r\n            return GetLocalBoundingSphere(rend, GeomUtil.DefaultBoundingSphereAlgorithm);\r\n        }\r\n\r\n        public static Sphere GetLocalBoundingSphere(this Renderer rend, BoundingSphereAlgorithm algorithm)\r\n        {\r\n            if (algorithm != BoundingSphereAlgorithm.FromBounds && rend is SkinnedMeshRenderer)\r\n            {\r\n                return Sphere.FromMesh((rend as SkinnedMeshRenderer).sharedMesh, algorithm);\r\n            }\r\n            else if (algorithm != BoundingSphereAlgorithm.FromBounds && rend is MeshRenderer && rend.HasComponent<MeshFilter>())\r\n            {\r\n                return Sphere.FromMesh((rend as MeshRenderer).GetComponent<MeshFilter>().sharedMesh, algorithm);\r\n            }\r\n            else\r\n            {\r\n                var bounds = rend.bounds;\r\n                var c = rend.transform.InverseTransformPoint(bounds.center);\r\n                var v = rend.transform.InverseTransformDirection(bounds.extents);\r\n                return new Sphere(c, v.magnitude);\r\n            }\r\n        }\r\n\r\n        public static Sphere GetLocalBoundingSphere(this Collider c)\r\n        {\r\n            return Sphere.FromCollider(c, GeomUtil.DefaultBoundingSphereAlgorithm, true);\r\n        }\r\n\r\n        public static Sphere GetLocalBoundingSphere(this Collider c, BoundingSphereAlgorithm algorithm)\r\n        {\r\n            return Sphere.FromCollider(c, algorithm, true);\r\n        }\r\n\r\n        public static Sphere GetGlobalBoundingSphere(this GameObject go, bool bRecurseChildren = true)\r\n        {\r\n            return GetGlobalBoundingSphere(go, GeomUtil.DefaultBoundingSphereAlgorithm);\r\n        }\r\n\r\n        public static Sphere GetGlobalBoundingSphere(this GameObject go, BoundingSphereAlgorithm algorithm, bool bRecurseChildren = true)\r\n        {\r\n            var s = new Sphere(go.transform.position, 0.0f);\r\n\r\n            var rend = go.GetComponent<Renderer>();\r\n            if (rend != null) s.Encapsulate(rend.GetGlobalBoundingSphere(algorithm));\r\n            var coll = go.GetComponent<Collider>();\r\n            if (coll != null) s.Encapsulate(coll.GetGlobalBoundingSphere(algorithm));\r\n\r\n            if (bRecurseChildren)\r\n            {\r\n                foreach (Transform child in go.transform)\r\n                {\r\n                    s.Encapsulate(GetGlobalBoundingSphere(child.gameObject, algorithm, bRecurseChildren));\r\n                }\r\n            }\r\n\r\n            return s;\r\n        }\r\n\r\n\r\n        public static Bounds GetGlobalBounds(this GameObject go, bool bRecurseChildren = true)\r\n        {\r\n            var b = new Bounds(go.transform.position, Vector3.zero);\r\n\r\n            var rend = go.GetComponent<Renderer>();\r\n            if (rend != null) b.Encapsulate(rend.bounds);\r\n            var coll = go.GetComponent<Collider>();\r\n            if (coll != null) b.Encapsulate(coll.bounds);\r\n\r\n            if (bRecurseChildren)\r\n            {\r\n                foreach (Transform child in go.transform)\r\n                {\r\n                    b.Encapsulate(GetGlobalBounds(child.gameObject, bRecurseChildren));\r\n                }\r\n            }\r\n\r\n            return b;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region GetColliderGeom\r\n\r\n        public static Vector3 GetCenter(this Collider c, bool local = false)\r\n        {\r\n            if (c is CharacterController)\r\n                return (local) ? (c as CharacterController).center : c.transform.TransformPoint((c as CharacterController).center);\r\n            else if (c is CapsuleCollider)\r\n                return (local) ? (c as CapsuleCollider).center : c.transform.TransformPoint((c as CapsuleCollider).center);\r\n            else if (c is SphereCollider)\r\n                return (local) ? (c as SphereCollider).center : c.transform.TransformPoint((c as SphereCollider).center);\r\n            else if (c is BoxCollider)\r\n                return (local) ? (c as BoxCollider).center : c.transform.TransformPoint((c as BoxCollider).center);\r\n            else\r\n                return (local) ? c.transform.InverseTransformPoint(c.bounds.center) : c.bounds.center;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Attempts to calculate geometry for a collider. Not tested yet.\r\n        /// </summary>\r\n        /// <param name=\"c\"></param>\r\n        /// <returns></returns>\r\n        public static IPhysicsGeom GetGeom(this Collider c, bool local = false)\r\n        {\r\n            return GetGeom(c, GeomUtil.DefaultBoundingSphereAlgorithm, local);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Attempts to calculate geometry for a collider. Not tested yet.\r\n        /// </summary>\r\n        /// <param name=\"c\"></param>\r\n        /// <returns></returns>\r\n        public static IPhysicsGeom GetGeom(this Collider c, BoundingSphereAlgorithm algorithm, bool local = false)\r\n        {\r\n            if(c == null) return null;\r\n\r\n            if (c is CharacterController)\r\n            {\r\n                return Capsule.FromCollider(c as CharacterController, local);\r\n            }\r\n            if (c is CapsuleCollider)\r\n            {\r\n                return Capsule.FromCollider(c as CapsuleCollider, local);\r\n            }\r\n            else if (c is BoxCollider)\r\n            {\r\n                return Box.FromCollider(c as BoxCollider, local);\r\n            }\r\n            else if (c is SphereCollider)\r\n            {\r\n                return Sphere.FromCollider(c as SphereCollider, local);\r\n            }\r\n            else if (algorithm != BoundingSphereAlgorithm.FromBounds && c is MeshCollider)\r\n            {\r\n                if(local)\r\n                {\r\n                    return Sphere.FromMesh((c as MeshCollider).sharedMesh, algorithm);\r\n                }\r\n                else\r\n                {\r\n                    return Sphere.FromMesh((c as MeshCollider).sharedMesh, algorithm, Trans.GetGlobal(c.transform));\r\n                }\r\n            }\r\n            else\r\n            {\r\n                //otherwise just return bounds as AABBox\r\n                return AABBox.FromCollider(c, local);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        public static Vector3 CircumCenter(Vector3 a, Vector3 b, Vector3 c)\r\n\t\t{\r\n\t\t\tvar a2b = Mathf.Pow(a.magnitude, 2.0f) * b;\r\n\t\t\tvar b2a = Mathf.Pow(b.magnitude, 2.0f) * a;\r\n\t\t\tvar aCrossb = Vector3.Cross(a, b);\r\n\t\t\tvar numer = Vector3.Cross(a2b - b2a, aCrossb);\r\n\t\t\tvar denom = 2.0f * Mathf.Pow(aCrossb.magnitude, 2.0f);\r\n\t\t\treturn numer / denom + c;\r\n\t\t}\r\n\t\t\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/I3dSpline.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n    public interface I3dSpline : IEnumerable<Vector3>\r\n    {\r\n\r\n        int Count { get; }\r\n        Vector3 ControlPoint(int index);\r\n\r\n        void AddControlPoint(Vector3 w);\r\n        void MoveControlPoint(int index, Vector3 w);\r\n        void RemoveControlPoint(int index);\r\n\r\n        float GetArcLength();\r\n        Vector3 GetPosition(float t);\r\n        Vector3 GetPositionAfter(int index, float t);\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/ICurve.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n    public interface ICurve\r\n    {\r\n\r\n        float GetPosition(float t);\r\n        float Ease(float current, float initialValue, float totalChange, float duration);\r\n\r\n    }\r\n\r\n    [System.Serializable()]\r\n    public class CubicBezierCurve : ICurve\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private float _p0;\r\n        [SerializeField()]\r\n        private float _p1;\r\n        [SerializeField()]\r\n        private float _p2;\r\n        [SerializeField()]\r\n        private float _p3;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public CubicBezierCurve()\r\n        {\r\n            _p0 = 0f;\r\n            _p1 = 0.5f;\r\n            _p2 = 0.5f;\r\n            _p3 = 1f;\r\n        }\r\n\r\n        public CubicBezierCurve(float p0, float p1, float p2, float p3)\r\n        {\r\n            _p0 = p0;\r\n            _p1 = p1;\r\n            _p2 = p2;\r\n            _p3 = p3;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float P0\r\n        {\r\n            get { return _p0; }\r\n            set { _p0 = value; }\r\n        }\r\n\r\n        public float P1\r\n        {\r\n            get { return _p1; }\r\n            set { _p1 = value; }\r\n        }\r\n\r\n        public float P2\r\n        {\r\n            get { return _p2; }\r\n            set { _p2 = value; }\r\n        }\r\n\r\n        public float P3\r\n        {\r\n            get { return _p3; }\r\n            set { _p3 = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Set(float p0, float p1, float p2, float p3)\r\n        {\r\n            _p0 = p0;\r\n            _p1 = p1;\r\n            _p2 = p2;\r\n            _p3 = p3;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICurve Interface\r\n\r\n        public float GetPosition(float t)\r\n        {\r\n            var it = 1f - t;\r\n            return (it * it * it * _p0)\r\n                 + (3f * it * it * t * _p1)\r\n                 + (3f * it * t * t * _p2)\r\n                 + (t * t * t * _p3);\r\n        }\r\n\r\n        public float Ease(float c, float s, float e, float d)\r\n        {\r\n            var t = c / d;\r\n            var r = this.GetPosition(t);\r\n            return s + e * r;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/IGeom.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n    public interface IGeom\r\n    {\r\n\r\n        void Move(Vector3 mv);\r\n        void RotateAroundPoint(Vector3 point, Quaternion rot);\r\n\r\n        AxisInterval Project(Vector3 axis);\r\n        Bounds GetBounds();\r\n        Sphere GetBoundingSphere();\r\n        IEnumerable<Vector3> GetAxes();\r\n\r\n        bool Contains(Vector3 pos);\r\n\r\n    }\r\n\r\n    public interface IPhysicsGeom : IGeom\r\n    {\r\n\r\n        bool TestOverlap(int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal);\r\n        int Overlap(ICollection<Collider> results, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal);\r\n        bool Cast(Vector3 direction, out RaycastHit hitinfo, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal);\r\n        int CastAll(Vector3 direction, ICollection<RaycastHit> results, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal);\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/IPlanarSurface.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n    public interface IPlanarSurface\r\n    {\r\n\r\n        Vector3 GetSurfaceNormal(Vector2 location);\r\n\r\n        Vector3 GetSurfaceNormal(Vector3 location);\r\n\r\n        /// <summary>\r\n        /// Converts a 3d vector to closest 2d vector on 2D gameplay surface\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <returns></returns>\r\n        Vector2 ProjectVectorTo2D(Vector3 location, Vector3 v);\r\n\r\n        /// <summary>\r\n        /// Converts a 2d vector from the gameplay surface to the 3d world\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <returns></returns>\r\n        Vector3 ProjectVectorTo3D(Vector3 location, Vector2 v);\r\n\r\n        /// <summary>\r\n        /// Converts a 3d position to closest 2d position on the 2d gameplay surface\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <returns></returns>\r\n        Vector2 ProjectPosition2D(Vector3 v);\r\n\r\n        /// <summary>\r\n        /// Converts a 2d position from the gameplay surface to the 3d world\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <returns></returns>\r\n        Vector3 ProjectPosition3D(Vector2 v);\r\n\r\n        /// <summary>\r\n        /// Returns a position on the closest point on the planar surface.\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <returns></returns>\r\n        Vector3 ClampToSurface(Vector3 v);\r\n\r\n\r\n        //Vector3 Mirror(Vector3 pos);\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/Interval.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n\r\n    [System.Serializable()]\r\n    public struct Interval\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private float _min;\r\n        [SerializeField()]\r\n        private float _max;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public Interval(float a)\r\n        {\r\n            _min = a;\r\n            _max = a;\r\n        }\r\n\r\n        public Interval(float a, float b)\r\n        {\r\n            _min = a;\r\n            _max = b;\r\n\r\n            if (_min > _max)\r\n            {\r\n                var c = _min;\r\n                _min = _max;\r\n                _max = c;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float Min\r\n        {\r\n            get { return _min; }\r\n        }\r\n\r\n        public float Max\r\n        {\r\n            get { return _max; }\r\n        }\r\n\r\n        public float Length\r\n        {\r\n            get { return Mathf.Abs(Max - Min); }\r\n        }\r\n\r\n        public float Mid\r\n        {\r\n            get { return _min + (_max - _min) * 0.5f; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void SetExtents(float a, float b)\r\n        {\r\n            _min = a;\r\n            _max = b;\r\n\r\n            if (_min > _max)\r\n            {\r\n                var c = _min;\r\n                _min = _max;\r\n                _max = c;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets a value a percentage of length from min towards max.\r\n        /// </summary>\r\n        /// <param name=\"p\"></param>\r\n        /// <returns></returns>\r\n        public float GetPercentage(float p)\r\n        {\r\n            return (_max - _min) * p + _min;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tests if Min and Max intersects.\r\n        /// </summary>\r\n        /// <param name=\"inter\"></param>\r\n        /// <returns></returns>\r\n        public bool Intersects(Interval inter)\r\n        {\r\n            if (_max < inter.Min) return false;\r\n            if (_min > inter.Max) return false;\r\n            return true;\r\n        }\r\n\r\n        public bool Intersects(float value)\r\n        {\r\n            return value >= _min && value <= _max;\r\n        }\r\n\r\n        public bool IntersectsSqr(float value)\r\n        {\r\n            return value > _min * _min && value <= _max * _max;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Appends the interval passed in.\r\n        /// </summary>\r\n        /// <param name=\"inter\"></param>\r\n        public void Concat(Interval inter)\r\n        {\r\n            var a = Mathf.Min(this.Min, inter.Min);\r\n            var b = Mathf.Max(this.Max, inter.Max);\r\n            this.SetExtents(a, b);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get the interval intersection of this and another interval.\r\n        /// </summary>\r\n        /// <param name=\"inter\"></param>\r\n        /// <returns></returns>\r\n        public Interval Intersection(Interval inter)\r\n        {\r\n            if (_max < inter.Min) return new Interval(0f, 0f);\r\n            if (_min > inter.Max) return new Interval(0f, 0f);\r\n\r\n            return new Interval(Mathf.Max(_min, inter.Min), Mathf.Min(_max, inter.Max));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Finds the mid value of the Min and Max of both intervals.\r\n        /// </summary>\r\n        /// <param name=\"inter\"></param>\r\n        /// <returns></returns>\r\n        public float MidValue(Interval inter)\r\n        {\r\n            float[] arr = new float[] { _min, _max, inter.Min, inter.Max };\r\n            System.Array.Sort(arr);\r\n            return (arr[2] + arr[1]) / 2.0f;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Total distance the two intervals pass.\r\n        /// </summary>\r\n        /// <param name=\"inter\"></param>\r\n        /// <returns></returns>\r\n        public float Distance(Interval inter)\r\n        {\r\n            if (_max > inter.Min) return 0;\r\n            if (_min < inter.Max) return 0;\r\n\r\n            return Mathf.Abs(_max - inter.Min);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Members\r\n\r\n        public static Interval Empty\r\n        {\r\n            get { return new Interval(float.NaN, float.NaN); }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns an interval centered over some mid value that extends in either direction distance stutter.\r\n        /// </summary>\r\n        /// <param name=\"mid\"></param>\r\n        /// <param name=\"stutter\"></param>\r\n        /// <returns></returns>\r\n        public static Interval Stutter(float mid, float stutter)\r\n        {\r\n            return new Interval(mid - stutter, mid + stutter);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns an interval starting at some value and extending for some length.\r\n        /// </summary>\r\n        /// <param name=\"start\"></param>\r\n        /// <param name=\"length\"></param>\r\n        /// <returns></returns>\r\n        public static Interval OfLength(float start, float length)\r\n        {\r\n            return new Interval(start, start + length);\r\n        }\r\n\r\n        public static Interval MinMax(float min, float max)\r\n        {\r\n            return new Interval(min, max);\r\n        }\r\n\r\n        public static Interval Concat(Interval a, Interval b)\r\n        {\r\n            var min = Mathf.Min(a.Min, b.Min);\r\n            var max = Mathf.Max(a.Max, b.Max);\r\n            return new Interval(min, max);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Operators\r\n\r\n        public static implicit operator Interval(float value)\r\n        {\r\n            return new Interval(value);\r\n        }\r\n\r\n        public static implicit operator Interval(double value)\r\n        {\r\n            return new Interval((float)value);\r\n        }\r\n\r\n        public static implicit operator Interval(int value)\r\n        {\r\n            return new Interval((float)value);\r\n        }\r\n\r\n        public static Interval operator +(Interval a, Interval b)\r\n        {\r\n            return Concat(a, b);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Config Attribute\r\n\r\n        public class ConfigAttribute : System.Attribute\r\n        {\r\n            public bool Reverse;\r\n            public string MinLabel = \"Min\";\r\n            public string MaxLabel = \"Max\";\r\n            public float LabelWidth = 30f;\r\n            public float MinValue = float.NegativeInfinity;\r\n            public float MaxValue = float.PositiveInfinity;\r\n            public bool DiscreteValuesOnly = false;\r\n            \r\n            public ConfigAttribute()\r\n            {\r\n\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/Geom/Line.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n\r\n    [System.Serializable()]\r\n    public struct Line\r\n    {\r\n\r\n        [SerializeField()]\r\n        private Vector3 _pnt;\r\n        [SerializeField()]\r\n        private Vector3 _dir;\r\n\r\n        public Line(Vector3 p, Vector3 d)\r\n        {\r\n            _pnt = p;\r\n            _dir = d.normalized;\r\n        }\r\n\r\n        public Vector3 Point\r\n        {\r\n            get { return _pnt; }\r\n            set { _pnt = value; }\r\n        }\r\n\r\n        public Vector3 Direction\r\n        {\r\n            get { return _dir; }\r\n            set { _dir = value.normalized; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Update line so that Point is the nearest point to the origin as possible\r\n        /// </summary>\r\n        public void Normalize()\r\n        {\r\n            _pnt = Line.ClosestPoint(this, Vector3.zero);\r\n        }\r\n\r\n        #region Static Methods\r\n\r\n        public static bool Intersection(Line line1, Line line2, out Vector3 point)\r\n        {\r\n            const float EPSILON = 0.0001f;\r\n\r\n\r\n            var dir3 = line2.Point - line1.Point;\r\n            var pnorm1 = Vector3.Cross(line1.Direction, line2.Direction);\r\n            var pnorm2 = Vector3.Cross(dir3, line2.Direction);\r\n\r\n            if (Mathf.Abs(Vector3.Dot(dir3, pnorm1)) < EPSILON && pnorm1.sqrMagnitude > EPSILON)\r\n            {\r\n                float s = Vector3.Dot(pnorm2, pnorm1) / pnorm1.sqrMagnitude;\r\n                point = line1.Point + (line1.Direction * s);\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                point = Vector3.zero;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static bool ClosestPoints(Line line1, Line line2, out Vector3 line1ClosestPoint, out Vector3 line2ClosestPoint)\r\n        {\r\n            //a and e are going to be 1, drop them out...\r\n            float b = Vector3.Dot(line1.Direction, line2.Direction);\r\n\r\n            float d = 1 - b * b;\r\n            if (d != 0.0f)\r\n            {\r\n                var r = line1.Point - line2.Point;\r\n                float c = Vector3.Dot(line1.Direction, r);\r\n                float f = Vector3.Dot(line2.Direction, r);\r\n\r\n                float s = (b * f - c) / d;\r\n                float t = (f - c * b) / d;\r\n\r\n                line1ClosestPoint = line1.Point + line1.Direction * s;\r\n                line2ClosestPoint = line2.Point + line2.Direction * t;\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                line1ClosestPoint = Vector3.zero;\r\n                line2ClosestPoint = Vector3.zero;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static Vector3 ClosestPoint(Line line, Vector3 point)\r\n        {\r\n            //if (line.Point == point) return point;\r\n\r\n            //var v = (line.Point - point).normalized;\r\n            //v = Vector3.Cross(line.Direction, v);\r\n\r\n            //float b = Vector3.Dot(line.Direction, v);\r\n\r\n            //float d = 1 - b * b;\r\n            //var r = line.Point - point;\r\n            //float c = Vector3.Dot(line.Direction, r);\r\n            //float f = Vector3.Dot(v, r);\r\n\r\n            //float s = (b * f - c) / d;\r\n            //return line.Point + line.Direction * s;\r\n\r\n\r\n            var v = point - line.Point;\r\n            var t = Vector3.Dot(v, line.Direction);\r\n            return line.Point + line.Direction * t;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/Matrix2D.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n\r\n    [System.Serializable()]\r\n    public struct Matrix2D\r\n    {\r\n\r\n        /*\r\n         | a  c  x |\r\n         | b  d  y |\r\n         | 0  0  1 |\r\n          \r\n         right - <a, b>\r\n         up - <c, d>\r\n         */\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        public float a;\r\n        [SerializeField()]\r\n        public float b;\r\n        [SerializeField()]\r\n        public float c;\r\n        [SerializeField()]\r\n        public float d;\r\n        [SerializeField()]\r\n        public float tx;\r\n        [SerializeField()]\r\n        public float ty; \r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public Matrix2D(float a, float b, float c, float d, float tx, float ty)\r\n        {\r\n            this.a = a;\r\n            this.b = b;\r\n            this.c = c;\r\n            this.d = d;\r\n            this.tx = tx;\r\n            this.ty = ty;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Vector2 right\r\n        {\r\n            get { return new Vector2(a, b); }\r\n            set\r\n            {\r\n                a = value.x;\r\n                b = value.y;\r\n            }\r\n        }\r\n\r\n        public Vector2 up\r\n        {\r\n            get { return new Vector2(c, d); }\r\n            set\r\n            {\r\n                c = value.x;\r\n                d = value.y;\r\n            }\r\n        }\r\n\r\n        public float angle\r\n        {\r\n            get { return Mathf.Atan2(b, a); }\r\n        }\r\n\r\n        public Matrix2D inverse\r\n        {\r\n            get { return Matrix2D.Inverse(this); }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Rotate matrix by an angle clockwise.\r\n        /// </summary>\r\n        /// <param name=\"angle\">Angle to rotate by in radians.</param>\r\n        public void Rotate(float angle)\r\n        {\r\n            var cos = Mathf.Cos(angle);\r\n            var sin = Mathf.Sin(angle);\r\n            float a = this.a;\r\n            float b = this.b;\r\n            float c = this.c;\r\n            float d = this.d;\r\n            float x = this.tx;\r\n            float y = this.ty;\r\n            this.a = a * cos - b * sin;\r\n            this.b = a * sin + b * cos;\r\n            this.c = c * cos - d * sin;\r\n            this.d = c * sin + d * cos;\r\n            this.tx = x * cos - y * sin;\r\n            this.ty = x * sin + y * cos;\r\n        }\r\n\r\n        public void Scale(float sx, float sy)\r\n        {\r\n            if(sx != 1.0f)\r\n            {\r\n                a *= sx;\r\n                c *= sx;\r\n                tx *= sx;\r\n            }\r\n            if(sy != 1.0f)\r\n            {\r\n                b *= sy;\r\n                d *= sy;\r\n                ty *= sy;\r\n            }\r\n        }\r\n\r\n        public void Translate(float dx, float dy)\r\n        {\r\n            tx += dx;\r\n            ty += dy;\r\n        }\r\n\r\n        public Vector2 TransformPoint(Vector2 p)\r\n        {\r\n            return new Vector2(a * p.x + c * p.y + tx, b * p.x + d * p.y + ty);\r\n        }\r\n\r\n        public Vector2 TransformVector(Vector2 v)\r\n        {\r\n            return new Vector2(a * v.x + c * v.y, b * v.x + d * v.y);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ToString\r\n\r\n        public override string ToString()\r\n        {\r\n            return \"(\"+ string.Join(\", \", new string[]{\"a=\"+a,\"b=\"+b,\"c=\"+c,\"d=\"+d,\"tx=\"+tx,\"ty=\"+ty}) +\")\";\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Members\r\n\r\n        public static Matrix2D Identity\r\n        {\r\n            get\r\n            {\r\n                return new Matrix2D(1f, 0f, 0f, 1f, 0f, 0f);\r\n            }\r\n        }\r\n\r\n        public static Matrix2D Translation(float tx, float ty)\r\n        {\r\n            return new Matrix2D(1f, 0f, 0f, 1f, tx, ty);\r\n        }\r\n        \r\n        public static Matrix2D Translation(Vector2 pos)\r\n        {\r\n            return new Matrix2D(1f, 0f, 0f, 1f, pos.x, pos.y);\r\n        }\r\n\r\n        public static Matrix2D Rotation(float angle)\r\n        {\r\n            var cos = Mathf.Cos(angle);\r\n            var sin = Mathf.Sin(angle);\r\n            return new Matrix2D(cos, sin, -sin, cos, 0f, 0f);\r\n        }\r\n\r\n        public static Matrix2D Scale(float scale)\r\n        {\r\n            return new Matrix2D(scale, 0f, 0f, scale, 0f, 0f);\r\n        }\r\n\r\n        public static Matrix2D Scale(Vector2 scale)\r\n        {\r\n            return new Matrix2D(scale.x, 0f, 0f, scale.y, 0f, 0f);\r\n        }\r\n\r\n        public static Matrix2D TR(Vector2 pos, float angle)\r\n        {\r\n            var cos = Mathf.Cos(angle);\r\n            var sin = Mathf.Sin(angle);\r\n            return new Matrix2D(cos, sin, -sin, cos, pos.x, pos.y);\r\n        }\r\n\r\n        public static Matrix2D TRS(Vector2 pos, float angle, Vector2 scale)\r\n        {\r\n            var cos = Mathf.Cos(angle);\r\n            var sin = Mathf.Sin(angle);\r\n            return new Matrix2D(cos * scale.x, sin * scale.y, -sin * scale.x, cos * scale.y, pos.x, pos.y);\r\n        }\r\n\r\n        public static Matrix2D Look(Vector2 dir)\r\n        {\r\n            return Rotation(Mathf.Atan2(dir.y, dir.x));\r\n        }\r\n\r\n        public static Matrix2D Look(Vector2 dir, Vector2 up)\r\n        {\r\n            up = com.spacepuppy.Utils.VectorUtil.RotateToward(dir, up, Mathf.PI / 2.0f, true).normalized;\r\n            dir.Normalize();\r\n            return new Matrix2D(dir.x, dir.y, up.x, up.y, 0f, 0f);\r\n        }\r\n\r\n        public static Matrix2D Inverse(Matrix2D m)\r\n        {\r\n            float det = m.a * m.d - m.c * m.b;\r\n            return new Matrix2D()\r\n            {\r\n                a = m.d / det,\r\n                b = -m.b / det,\r\n                c = -m.c / det,\r\n                d = m.a / det,\r\n                tx = (m.a * m.tx + m.c * m.ty),\r\n                ty = (m.b * m.tx + m.d * m.ty)\r\n            };\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Operators\r\n\r\n        public static Matrix2D operator *(Matrix2D m1, Matrix2D m2)\r\n        {\r\n            return new Matrix2D()\r\n            {\r\n                a = m1.a * m2.a + m1.b * m2.c,\r\n                b = m1.a * m2.b + m1.b * m2.d,\r\n                c = m1.c * m2.a + m1.d * m2.c,\r\n                d = m1.c * m2.b + m1.d * m2.d,\r\n                tx = m1.tx * m2.a + m1.ty * m2.c + m2.tx,\r\n                ty = m1.tx * m2.b + m1.ty * m2.d + m2.ty\r\n            };\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/PhysicsUtil.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n    public static class PhysicsUtil\r\n    {\r\n\r\n        #region Fields/Properties\r\n\r\n        public static float Detail = 0.1f;\r\n\r\n        private const int MAX_BUFFER = 1024;\r\n        private static Collider[] _nonallocColliderBuffer;\r\n        private static Collider[] NonAllocColliderBuffer\r\n        {\r\n            get\r\n            {\r\n                if(_nonallocColliderBuffer == null)\r\n                    _nonallocColliderBuffer = new Collider[MAX_BUFFER];\r\n                return _nonallocColliderBuffer;\r\n            }\r\n        }\r\n        private static RaycastHit[] _nonallocRaycastBuffer;\r\n        private static RaycastHit[] NonAllocRaycastBuffer\r\n        {\r\n            get\r\n            {\r\n                if (_nonallocRaycastBuffer == null)\r\n                    _nonallocRaycastBuffer = new RaycastHit[MAX_BUFFER];\r\n                return _nonallocRaycastBuffer;\r\n            }\r\n        }\r\n\r\n        public class RaycastHitDistanceComparer : IComparer<RaycastHit>\r\n        {\r\n            private static RaycastHitDistanceComparer _default;\r\n            public static RaycastHitDistanceComparer Default\r\n            {\r\n                get\r\n                {\r\n                    if (_default == null)\r\n                        _default = new RaycastHitDistanceComparer();\r\n                    return _default;\r\n                }\r\n            }\r\n\r\n            public int Compare(RaycastHit x, RaycastHit y)\r\n            {\r\n                return x.distance.CompareTo(y.distance);\r\n            }\r\n        }\r\n\r\n\r\n        private static Dictionary<int, int> _calculatedMasks;\r\n        public static int CalculateLayerMaskAgainst(int layer)\r\n        {\r\n            if (layer < 0 || layer > 31) return Physics.AllLayers;\r\n\r\n            int mask = 0;\r\n            if (_calculatedMasks == null) _calculatedMasks = new Dictionary<int, int>();\r\n            else if (_calculatedMasks.TryGetValue(layer, out mask)) return mask;\r\n            \r\n            for (int i = 0; i < 32; i++)\r\n            {\r\n                if (!Physics.GetIgnoreLayerCollision(layer, i)) mask = mask | (1 << i);\r\n            }\r\n            _calculatedMasks[layer] = mask;\r\n            return mask;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Physics Forwards\r\n\r\n        public static int RaycastAll(Vector3 origin, Vector3 dir, ICollection<RaycastHit> results, float maxDistance = float.PositiveInfinity, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            return RaycastAll(new Ray(origin, dir), results, maxDistance, layerMask, query);\r\n        }\r\n\r\n        public static int RaycastAll(Ray ray, ICollection<RaycastHit> results, float maxDistance = float.PositiveInfinity, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (results == null) throw new System.ArgumentNullException(\"results\");\r\n\r\n            if (results is RaycastHit[])\r\n            {\r\n                return Physics.RaycastNonAlloc(ray, results as RaycastHit[], maxDistance, layerMask, query);\r\n            }\r\n            else\r\n            {\r\n                var nonAllocArr = NonAllocRaycastBuffer;\r\n                int cnt = Physics.RaycastNonAlloc(ray, nonAllocArr, maxDistance, layerMask, query);\r\n                if (results is List<RaycastHit>)\r\n                {\r\n                    var lst = results as List<RaycastHit>;\r\n                    var num = cnt + lst.Count;\r\n                    if (lst.Capacity < num) lst.Capacity = num;\r\n                }\r\n\r\n                for (int i = 0; i < cnt; i++)\r\n                {\r\n                    results.Add(nonAllocArr[i]);\r\n                    nonAllocArr[i] = default(RaycastHit);\r\n                }\r\n                return cnt;\r\n            }\r\n        }\r\n\r\n        public static int OverlapLine(Vector3 start, Vector3 end, ICollection<Collider> results, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (results == null) throw new System.ArgumentNullException(\"results\");\r\n\r\n            var nonAllocArr = NonAllocRaycastBuffer;\r\n\r\n            var dir = end - start;\r\n            var dist = dir.magnitude;\r\n            int cnt = Physics.RaycastNonAlloc(new Ray(start, dir), nonAllocArr, dist, layerMask, query);\r\n\r\n            if (results is Collider[])\r\n            {\r\n                var arr = results as Collider[];\r\n                if (arr.Length < cnt) cnt = arr.Length;\r\n\r\n                for (int i = 0; i < cnt; i++)\r\n                {\r\n                    arr[i] = nonAllocArr[i].collider;\r\n                    nonAllocArr[i] = default(RaycastHit);\r\n                }\r\n                return cnt;\r\n            }\r\n            else\r\n            {\r\n                if (results is List<Collider>)\r\n                {\r\n                    var lst = results as List<Collider>;\r\n                    var num = cnt + lst.Count;\r\n                    if (lst.Capacity < num) lst.Capacity = num;\r\n                }\r\n\r\n                for (int i = 0; i < cnt; i++)\r\n                {\r\n                    results.Add(nonAllocArr[i].collider);\r\n                    nonAllocArr[i] = default(RaycastHit);\r\n                }\r\n                return cnt;\r\n            }\r\n        }\r\n\r\n\r\n        /// <summary>\r\n        /// Find all colliders touching or inside the given box, and store them into the buffer.\r\n        /// \r\n        /// If the buffer is an array, the array is filled from index 0, up to either capacity or the number of colliders found, whichever is smaller.\r\n        /// If the buffer is a List or or collection, all found colliders are appended to the collection.\r\n        /// </summary>\r\n        /// <param name=\"center\"></param>\r\n        /// <param name=\"halfExtents\"></param>\r\n        /// <param name=\"results\"></param>\r\n        /// <param name=\"orientation\"></param>\r\n        /// <param name=\"layerMask\"></param>\r\n        /// <param name=\"query\"></param>\r\n        /// <returns>The amount of colliders stored in results</returns>\r\n        public static int OverlapBox(Vector3 center, Vector3 halfExtents, ICollection<Collider> results, \r\n                                     Quaternion orientation, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (results == null) throw new System.ArgumentNullException(\"results\");\r\n\r\n            if (results is Collider[])\r\n            {\r\n                return Physics.OverlapBoxNonAlloc(center, halfExtents, results as Collider[], orientation, layerMask, query);\r\n            }\r\n            else\r\n            {\r\n                var nonAllocArr = NonAllocColliderBuffer;\r\n\r\n                int cnt = Physics.OverlapBoxNonAlloc(center, halfExtents, nonAllocArr, orientation, layerMask, query);\r\n                if (results is List<Collider>)\r\n                {\r\n                    var lst = results as List<Collider>;\r\n                    var num = cnt + lst.Count;\r\n                    if (lst.Capacity < num) lst.Capacity = num;\r\n                }\r\n\r\n                for (int i = 0; i < cnt; i++)\r\n                {\r\n                    results.Add(nonAllocArr[i]);\r\n                    nonAllocArr[i] = null;\r\n                }\r\n                return cnt;\r\n            }\r\n        }\r\n\r\n        public static int BoxCastAll(Vector3 center, Vector3 halfExtents, Vector3 direction, ICollection<RaycastHit> results, \r\n                                  Quaternion orientation, float maxDistance = float.PositiveInfinity, \r\n                                  int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (results == null) throw new System.ArgumentNullException(\"results\");\r\n\r\n            if (results is RaycastHit[])\r\n            {\r\n                return Physics.BoxCastNonAlloc(center, halfExtents, direction, results as RaycastHit[], orientation, maxDistance, layerMask, query);\r\n            }\r\n            else\r\n            {\r\n                var nonAllocArr = NonAllocRaycastBuffer;\r\n\r\n                int cnt = Physics.BoxCastNonAlloc(center, halfExtents, direction, nonAllocArr, orientation, maxDistance, layerMask);\r\n                if (results is List<RaycastHit>)\r\n                {\r\n                    var lst = results as List<RaycastHit>;\r\n                    var num = cnt + lst.Count;\r\n                    if (lst.Capacity < num) lst.Capacity = num;\r\n                }\r\n\r\n                for (int i = 0; i < cnt; i++)\r\n                {\r\n                    results.Add(nonAllocArr[i]);\r\n                    nonAllocArr[i] = default(RaycastHit);\r\n                }\r\n                return cnt;\r\n            }\r\n        }\r\n\r\n        public static int OverlapSphere(Vector3 center, float radius, ICollection<Collider> results,\r\n                                        int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (results == null) throw new System.ArgumentNullException(\"results\");\r\n\r\n            if (results is Collider[])\r\n            {\r\n                return Physics.OverlapSphereNonAlloc(center, radius, results as Collider[], layerMask, query);\r\n            }\r\n            else\r\n            {\r\n                var nonAllocArr = NonAllocColliderBuffer;\r\n\r\n                int cnt = Physics.OverlapSphereNonAlloc(center, radius, nonAllocArr, layerMask, query);\r\n                if (results is List<Collider>)\r\n                {\r\n                    var lst = results as List<Collider>;\r\n                    var num = cnt + lst.Count;\r\n                    if (lst.Capacity < num) lst.Capacity = num;\r\n                }\r\n\r\n                for (int i = 0; i < cnt; i++)\r\n                {\r\n                    results.Add(nonAllocArr[i]);\r\n                    nonAllocArr[i] = null;\r\n                }\r\n                return cnt;\r\n            }\r\n        }\r\n\r\n        public static int SphereCastAll(Vector3 center, float radius, Vector3 direction, ICollection<RaycastHit> results,\r\n                                     float maxDistance = float.PositiveInfinity,\r\n                                     int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (results == null) throw new System.ArgumentNullException(\"results\");\r\n\r\n            if (results is RaycastHit[])\r\n            {\r\n                return Physics.SphereCastNonAlloc(center, radius, direction, results as RaycastHit[], maxDistance, layerMask, query);\r\n            }\r\n            else\r\n            {\r\n                var nonAllocArr = NonAllocRaycastBuffer;\r\n\r\n                int cnt = Physics.SphereCastNonAlloc(center, radius, direction, nonAllocArr, maxDistance, layerMask, query);\r\n                if (results is List<RaycastHit>)\r\n                {\r\n                    var lst = results as List<RaycastHit>;\r\n                    var num = cnt + lst.Count;\r\n                    if (lst.Capacity < num) lst.Capacity = num;\r\n                }\r\n\r\n                for (int i = 0; i < cnt; i++)\r\n                {\r\n                    results.Add(nonAllocArr[i]);\r\n                    nonAllocArr[i] = default(RaycastHit);\r\n                }\r\n                return cnt;\r\n            }\r\n        }\r\n\r\n        public static int OverlapCapsule(Vector3 point1, Vector3 point2, float radius, ICollection<Collider> results,\r\n                                         int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (results == null) throw new System.ArgumentNullException(\"results\");\r\n\r\n            //note, HashSets are inherently unique collections... so no need to check if contains during second and third overlaps\r\n            using (var tmpSet = TempCollection.GetSet<Collider>())\r\n            {\r\n                if (VectorUtil.FuzzyEquals(point1, point2))\r\n                {\r\n                    var nonAllocArr = NonAllocColliderBuffer;\r\n                    int cnt = Physics.OverlapSphereNonAlloc(point1, radius, nonAllocArr, layerMask, query);\r\n                    for (int i = 0; i < cnt; i++)\r\n                    {\r\n                        tmpSet.Add(nonAllocArr[i]);\r\n                        nonAllocArr[i] = null;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    var nonAllocCollArr = NonAllocColliderBuffer;\r\n                    var nonAllocRayArr = NonAllocRaycastBuffer;\r\n\r\n                    int cnt;\r\n                    cnt = Physics.OverlapSphereNonAlloc(point1, radius, nonAllocCollArr, layerMask, query);\r\n                    for (int i = 0; i < cnt; i++)\r\n                    {\r\n                        tmpSet.Add(nonAllocCollArr[i]);\r\n                        nonAllocCollArr[i] = null;\r\n                    }\r\n\r\n                    cnt = Physics.OverlapSphereNonAlloc(point2, radius, nonAllocCollArr, layerMask, query);\r\n                    for (int i = 0; i < cnt; i++)\r\n                    {\r\n                        tmpSet.Add(nonAllocCollArr[i]);\r\n                        nonAllocCollArr[i] = null;\r\n                    }\r\n\r\n                    var dir = point2 - point1;\r\n                    var dist = dir.magnitude;\r\n                    cnt = Physics.SphereCastNonAlloc(point1, radius, dir.normalized, nonAllocRayArr, dist, layerMask, query);\r\n                    for (int i = 0; i < cnt; i++)\r\n                    {\r\n                        tmpSet.Add(nonAllocRayArr[i].collider);\r\n                        nonAllocRayArr[i] = default(RaycastHit);\r\n                    }\r\n                }\r\n\r\n                //done, now fill collection\r\n                if (results is Collider[])\r\n                {\r\n                    var arr = results as Collider[];\r\n                    int cnt = Mathf.Min(arr.Length, tmpSet.Count);\r\n                    int i = -1;\r\n                    var e = tmpSet.GetEnumerator();\r\n                    while (e.MoveNext() && ++i < cnt)\r\n                    {\r\n                        arr[i] = e.Current;\r\n                    }\r\n                    return cnt;\r\n                }\r\n                else\r\n                {\r\n                    if (results is List<Collider>)\r\n                    {\r\n                        var lst = results as List<Collider>;\r\n                        var num = tmpSet.Count + lst.Count;\r\n                        if (lst.Capacity < num) lst.Capacity = num;\r\n                    }\r\n\r\n                    var e = tmpSet.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        results.Add(e.Current);\r\n                    }\r\n                    return tmpSet.Count;\r\n                }\r\n            }\r\n        }\r\n\r\n        public static int CapsuleCastAll(Vector3 point1, Vector3 point2, float radius, Vector3 direction, ICollection<RaycastHit> results,\r\n                                     float maxDistance = float.PositiveInfinity,\r\n                                     int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (results == null) throw new System.ArgumentNullException(\"results\");\r\n\r\n            if (results is RaycastHit[])\r\n            {\r\n                return Physics.CapsuleCastNonAlloc(point1, point2, radius, direction, results as RaycastHit[], maxDistance, layerMask, query);\r\n            }\r\n            else\r\n            {\r\n                var nonAllocArr = NonAllocRaycastBuffer;\r\n\r\n                int cnt = Physics.CapsuleCastNonAlloc(point1, point2, radius, direction, nonAllocArr, maxDistance, layerMask, query);\r\n                if (results is List<RaycastHit>)\r\n                {\r\n                    var lst = results as List<RaycastHit>;\r\n                    var num = cnt + lst.Count;\r\n                    if (lst.Capacity < num) lst.Capacity = num;\r\n                }\r\n\r\n                for (int i = 0; i < cnt; i++)\r\n                {\r\n                    results.Add(nonAllocArr[i]);\r\n                    nonAllocArr[i] = default(RaycastHit);\r\n                }\r\n                return cnt;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region CheckGeom\r\n\r\n        public static bool CheckGeom(IPhysicsGeom geom, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (geom == null) throw new System.ArgumentNullException(\"geom\");\r\n\r\n            if (geom is Sphere)\r\n            {\r\n                var s = (Sphere)geom;\r\n                return Physics.CheckSphere(s.Center, s.Radius, Physics.AllLayers,  query);\r\n            }\r\n            else if (geom is Capsule)\r\n            {\r\n                var c = (Capsule)geom;\r\n                return Physics.CheckCapsule(c.Start, c.End, c.Radius, Physics.AllLayers, query);\r\n            }\r\n            else\r\n            {\r\n                return geom.TestOverlap(Physics.AllLayers, query);\r\n            }\r\n        }\r\n\r\n        public static bool CheckGeom(IPhysicsGeom geom, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (geom == null) throw new System.ArgumentNullException(\"geom\");\r\n\r\n            if (geom is Sphere)\r\n            {\r\n                var s = (Sphere)geom;\r\n                return Physics.CheckSphere(s.Center, s.Radius, layerMask, query);\r\n            }\r\n            else if (geom is Capsule)\r\n            {\r\n                var c = (Capsule)geom;\r\n                return Physics.CheckCapsule(c.Start, c.End, c.Radius, layerMask, query);\r\n            }\r\n            else\r\n            {\r\n                return geom.TestOverlap(layerMask, query);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region OverlapGeom\r\n        \r\n        public static Collider[] OverlapGeom(IPhysicsGeom geom, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (geom == null) throw new System.ArgumentNullException(\"geom\");\r\n            \r\n            using (var lst = TempCollection.GetList<Collider>())\r\n            {\r\n                geom.Overlap(lst, layerMask, query);\r\n                return lst.ToArray();\r\n            }\r\n        }\r\n        \r\n        public static int OverlapGeom(IPhysicsGeom geom, IList<Collider> results, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (geom == null) throw new System.ArgumentNullException(\"geom\");\r\n            \r\n            return geom.Overlap(results, layerMask, query);\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region Cast\r\n\r\n        public static bool Cast(IPhysicsGeom geom, Vector3 dir, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (geom == null) throw new System.ArgumentNullException(\"geom\");\r\n\r\n            RaycastHit hit;\r\n            return geom.Cast(dir, out hit, float.PositiveInfinity, Physics.AllLayers, query);\r\n        }\r\n\r\n        public static bool Cast(IPhysicsGeom geom, Vector3 dir, float dist, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (geom == null) throw new System.ArgumentNullException(\"geom\");\r\n\r\n            RaycastHit hit;\r\n            return geom.Cast(dir, out hit, dist, Physics.AllLayers, query);\r\n        }\r\n\r\n        public static bool Cast(IPhysicsGeom geom, Vector3 dir, out RaycastHit hitInfo, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (geom == null) throw new System.ArgumentNullException(\"geom\");\r\n\r\n            return geom.Cast(dir, out hitInfo, float.PositiveInfinity, Physics.AllLayers, query);\r\n        }\r\n\r\n        public static bool Cast(IPhysicsGeom geom, Vector3 dir, float dist, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (geom == null) throw new System.ArgumentNullException(\"geom\");\r\n\r\n            RaycastHit hit;\r\n            return geom.Cast(dir, out hit, dist, layerMask, query);\r\n        }\r\n\r\n        public static bool Cast(IPhysicsGeom geom, Vector3 dir, out RaycastHit hitInfo, float dist, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (geom == null) throw new System.ArgumentNullException(\"geom\");\r\n\r\n            return geom.Cast(dir, out hitInfo, dist, Physics.AllLayers, query);\r\n        }\r\n\r\n        public static bool Cast(IPhysicsGeom geom, Vector3 dir, out RaycastHit hitInfo, float dist, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (geom == null) throw new System.ArgumentNullException(\"geom\");\r\n\r\n            return geom.Cast(dir, out hitInfo, dist, layerMask, query);\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region CastAll\r\n\r\n        public static RaycastHit[] CastAll(IPhysicsGeom geom, Vector3 dir, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (geom == null) throw new System.ArgumentNullException(\"geom\");\r\n\r\n            //return geom.CastAll(dir, float.PositiveInfinity, Physics.AllLayers, query).ToArray();\r\n\r\n            using (var lst = TempCollection.GetList<RaycastHit>())\r\n            {\r\n                geom.CastAll(dir, lst, float.PositiveInfinity, Physics.AllLayers, query);\r\n                return lst.ToArray();\r\n            }\r\n        }\r\n\r\n        public static RaycastHit[] CastAll(IPhysicsGeom geom, Vector3 dir, float dist, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (geom == null) throw new System.ArgumentNullException(\"geom\");\r\n\r\n            //return geom.CastAll(dir, dist, Physics.AllLayers, query).ToArray();\r\n\r\n            using (var lst = TempCollection.GetList<RaycastHit>())\r\n            {\r\n                geom.CastAll(dir, lst, dist, Physics.AllLayers, query);\r\n                return lst.ToArray();\r\n            }\r\n        }\r\n\r\n        public static RaycastHit[] CastAll(IPhysicsGeom geom, Vector3 dir, float dist, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (geom == null) throw new System.ArgumentNullException(\"geom\");\r\n\r\n            //return geom.CastAll(dir, dist, layerMask, query).ToArray();\r\n\r\n            using (var lst = TempCollection.GetList<RaycastHit>())\r\n            {\r\n                geom.CastAll(dir, lst, dist, layerMask, query);\r\n                return lst.ToArray();\r\n            }\r\n        }\r\n\r\n        public static int CastAll(IPhysicsGeom geom, Vector3 dir, ICollection<RaycastHit> results, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (geom == null) throw new System.ArgumentNullException(\"geom\");\r\n            \r\n            return geom.CastAll(dir, results, float.PositiveInfinity, Physics.AllLayers, query);\r\n        }\r\n\r\n        public static int CastAll(IPhysicsGeom geom, Vector3 dir, ICollection<RaycastHit> results, float dist, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (geom == null) throw new System.ArgumentNullException(\"geom\");\r\n\r\n            return geom.CastAll(dir, results, dist, Physics.AllLayers, query);\r\n        }\r\n\r\n        public static int CastAll(IPhysicsGeom geom, Vector3 dir, ICollection<RaycastHit> results, float dist, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (geom == null) throw new System.ArgumentNullException(\"geom\");\r\n\r\n            return geom.CastAll(dir, results, dist, layerMask, query);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Collider Cast/All\r\n\r\n        public static bool Cast(Collider coll, Vector3 dir, float dist, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            RaycastHit hit;\r\n            return Cast(coll, dir, out hit, dist, query);\r\n        }\r\n\r\n        public static bool Cast(Collider coll, Vector3 dir, out RaycastHit hitInfo, float dist, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            var rb = coll.attachedRigidbody;\r\n            if (!object.ReferenceEquals(rb, null))\r\n            {\r\n                return rb.SweepTest(dir, out hitInfo, dist, query);\r\n            }\r\n\r\n            var geom = GeomUtil.GetGeom(coll);\r\n            return geom.Cast(dir, out hitInfo, dist, CalculateLayerMaskAgainst(coll.gameObject.layer), query);\r\n        }\r\n        \r\n        public static RaycastHit[] CastAll(Collider coll, Vector3 dir, float dist, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            var rb = coll.attachedRigidbody;\r\n            if (!object.ReferenceEquals(rb, null))\r\n            {\r\n                return rb.SweepTestAll(dir, dist, query);\r\n            }\r\n\r\n            using (var lst = TempCollection.GetList<RaycastHit>())\r\n            {\r\n                var geom = GeomUtil.GetGeom(coll);\r\n                geom.CastAll(dir, lst, dist, CalculateLayerMaskAgainst(coll.gameObject.layer), query);\r\n                return lst.ToArray();\r\n            }\r\n        }\r\n\r\n        public static int CastAll(Collider coll, ICollection<RaycastHit> results, Vector3 dir, float dist, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            var rb = coll.attachedRigidbody;\r\n            if (!object.ReferenceEquals(rb, null))\r\n            {\r\n                if (results == null) throw new System.ArgumentNullException(\"results\");\r\n                var arr = rb.SweepTestAll(dir, dist, query);\r\n                if (arr == null || arr.Length == 0) return 0;\r\n                results.AddRange(arr);\r\n                return arr.Length;\r\n            }\r\n\r\n            var geom = GeomUtil.GetGeom(coll);\r\n            return geom.CastAll(dir, results, dist, CalculateLayerMaskAgainst(coll.gameObject.layer), query);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region RadialCast\r\n\r\n        public static RaycastHit[] RadialCast(IPhysicsGeom geom, float dist, int detail, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            return RadialCast(geom, dist, detail, layerMask, Vector2.right, query);\r\n        }\r\n\r\n        public static RaycastHit[] RadialCast(IPhysicsGeom geom, float dist, int detail, int layerMask, Vector2 initialAxis, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            using (var lst = TempCollection.GetList<RaycastHit>())\r\n            {\r\n                RadialCast(geom, lst, dist, detail, layerMask, initialAxis, query);\r\n                return lst.ToArray();\r\n            }\r\n        }\r\n\r\n        public static RaycastHit[] RadialCast(IPhysicsGeom geom, float dist, int detail, int layerMask, Vector3 initialAxis, Vector3 rotationalAxis, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            using (var lst = TempCollection.GetList<RaycastHit>())\r\n            {\r\n                RadialCast(geom, lst, dist, detail, layerMask, initialAxis, rotationalAxis, query);\r\n                return lst.ToArray();\r\n            }\r\n        }\r\n\r\n        public static bool RadialCast(IPhysicsGeom geom, ICollection<RaycastHit> results, float dist, int detail, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            return RadialCast(geom, results, dist, detail, layerMask, Vector2.right, query);\r\n        }\r\n\r\n        public static bool RadialCast(IPhysicsGeom geom, ICollection<RaycastHit> results, float dist, int detail, int layerMask, Vector2 initialAxis, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (VectorUtil.NearZeroVector(initialAxis))\r\n                initialAxis = Vector2.right;\r\n            else\r\n                initialAxis.Normalize();\r\n            var a = 360f / (float)detail;\r\n\r\n            int cnt = results.Count;\r\n            for (int i = 0; i < detail; i++)\r\n            {\r\n                var v = VectorUtil.RotateBy(initialAxis, a * i);\r\n                geom.CastAll(v, results, dist, layerMask, query);\r\n            }\r\n            return results.Count - cnt > 0;\r\n        }\r\n\r\n        public static bool RadialCast(IPhysicsGeom geom, ICollection<RaycastHit> results, float dist, int detail, int layerMask, Vector3 initialAxis, Vector3 rotationalAxis, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (VectorUtil.NearZeroVector(initialAxis))\r\n                initialAxis = Vector2.right;\r\n            else\r\n                initialAxis.Normalize();\r\n            var a = 360f / (float)detail;\r\n\r\n            int cnt = results.Count;\r\n            for (int i = 0; i < detail; i++)\r\n            {\r\n                var v = VectorUtil.RotateAroundAxis(initialAxis, a * i, rotationalAxis);\r\n                geom.CastAll(v, results, dist, layerMask, query);\r\n            }\r\n            return results.Count - cnt > 0;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Selective Overlap\r\n\r\n        public static bool CheckGeomAgainst(IPhysicsGeom geom, IEnumerable<Collider> colliders, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (geom == null) return false;\r\n            if (colliders == null) return false;\r\n\r\n            using (var set = TempCollection.GetSet<Collider>())\r\n            {\r\n                if(geom.Overlap(set, layerMask, query) > 0)\r\n                {\r\n                    var e = LightEnumerator.Create<Collider>(colliders);\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (set.Contains(e.Current)) return true;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool CheckGeomIgnoring(IPhysicsGeom geom, IEnumerable<Collider> ignoredColliders, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (geom == null) return false;\r\n\r\n            using (var set = TempCollection.GetSet<Collider>())\r\n            {\r\n                if(geom.Overlap(set, layerMask, query) > 0)\r\n                {\r\n                    var e = set.GetEnumerator();\r\n                    while(e.MoveNext())\r\n                    {\r\n                        if (!ignoredColliders.Contains(e.Current)) return true;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static int OverlapGeomAgainst(IPhysicsGeom geom, ICollection<Collider> results, IEnumerable<Collider> colliders, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (results == null) throw new System.ArgumentNullException(\"results\");\r\n            if (geom == null) return 0;\r\n            if (colliders == null) return 0;\r\n\r\n            int cnt = 0;\r\n            using (var set = TempCollection.GetSet<Collider>())\r\n            {\r\n                if (geom.Overlap(set, layerMask, query) > 0)\r\n                {\r\n                    var e = LightEnumerator.Create<Collider>(colliders);\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (set.Contains(e.Current))\r\n                        {\r\n                            cnt++;\r\n                            results.Add(e.Current);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            return cnt;\r\n        }\r\n\r\n        public static int OverlapGeomIgnoring(IPhysicsGeom geom, ICollection<Collider> results, IEnumerable<Collider> ignoredColliders, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            if (results == null) throw new System.ArgumentNullException(\"results\");\r\n            if (geom == null) return 0;\r\n\r\n            int cnt = 0;\r\n            using (var set = TempCollection.GetSet<Collider>())\r\n            {\r\n                if (geom.Overlap(set, layerMask, query) > 0)\r\n                {\r\n                    var e = set.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (!ignoredColliders.Contains(e.Current))\r\n                        {\r\n                            cnt++;\r\n                            results.Add(e.Current);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            return cnt;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region Selective Cast\r\n\r\n        public static bool RaycastAgainst(Ray ray, Collider coll, float maxDistance = float.PositiveInfinity)\r\n        {\r\n            RaycastHit hit;\r\n            return RaycastAgainst(ray, out hit, coll, maxDistance);\r\n        }\r\n\r\n        public static bool RaycastAgainst(Ray ray, out RaycastHit hit, Collider coll, float maxDistance = float.PositiveInfinity)\r\n        {\r\n            var nonAllocArr = NonAllocRaycastBuffer;\r\n            LayerMask mask = 1 << coll.gameObject.layer;\r\n\r\n            int cnt = Physics.RaycastNonAlloc(ray, nonAllocArr, maxDistance, mask, QueryTriggerInteraction.Collide);\r\n            if (cnt > 0)\r\n            {\r\n                System.Array.Sort(nonAllocArr, 0, cnt, RaycastHitDistanceComparer.Default);\r\n\r\n                for (int i = 0; i < cnt; i++)\r\n                {\r\n                    if (coll == nonAllocArr[i].collider)\r\n                    {\r\n                        hit = nonAllocArr[i];\r\n                        System.Array.Clear(nonAllocArr, 0, cnt);\r\n                        return true;\r\n                    }\r\n                }\r\n\r\n                System.Array.Clear(nonAllocArr, 0, cnt);\r\n            }\r\n\r\n            hit = default(RaycastHit);\r\n            return false;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Raycast against a collection of colliders.\r\n        /// </summary>\r\n        /// <param name=\"pos\"></param>\r\n        /// <param name=\"dir\"></param>\r\n        /// <param name=\"colliders\"></param>\r\n        /// <returns></returns>\r\n        public static bool RaycastAgainst(Vector3 pos, Vector3 dir, IEnumerable<Collider> colliders, float maxDistance = float.PositiveInfinity)\r\n        {\r\n            return RaycastAgainst(new Ray(pos, dir), colliders, maxDistance);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Raycast against a collection of colliders.\r\n        /// </summary>\r\n        /// <param name=\"pos\"></param>\r\n        /// <param name=\"dir\"></param>\r\n        /// <param name=\"colliders\"></param>\r\n        /// <returns></returns>\r\n        public static bool RaycastAgainst(Ray ray, IEnumerable<Collider> colliders, float maxDistance = float.PositiveInfinity)\r\n        {\r\n            RaycastHit hit;\r\n            var e = LightEnumerator.Create<Collider>(colliders);\r\n            while (e.MoveNext())\r\n            {\r\n                if (e.Current.Raycast(ray, out hit, maxDistance)) return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Raycast against a collection of colliders.\r\n        /// </summary>\r\n        /// <param name=\"pos\"></param>\r\n        /// <param name=\"dir\"></param>\r\n        /// <param name=\"colliders\"></param>\r\n        /// <returns></returns>\r\n        public static bool RaycastAgainst(Vector3 pos, Vector3 dir, out RaycastHit hit, IEnumerable<Collider> colliders, float maxDistance = float.PositiveInfinity)\r\n        {\r\n            return RaycastAgainst(new Ray(pos, dir), out hit, colliders, maxDistance);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Raycast against a collection of colliders.\r\n        /// </summary>\r\n        /// <param name=\"pos\"></param>\r\n        /// <param name=\"dir\"></param>\r\n        /// <param name=\"colliders\"></param>\r\n        /// <returns></returns>\r\n        public static bool RaycastAgainst(Ray ray, out RaycastHit hit, IEnumerable<Collider> colliders, float maxDistance = float.PositiveInfinity)\r\n        {\r\n            if (colliders == null)\r\n            {\r\n                hit = default(RaycastHit);\r\n                return false;\r\n            }\r\n\r\n            var nonAllocArr = NonAllocRaycastBuffer;\r\n\r\n            int cnt = Physics.RaycastNonAlloc(ray, nonAllocArr, maxDistance, Physics.AllLayers, QueryTriggerInteraction.Collide);\r\n            if(cnt > 0)\r\n            {\r\n                System.Array.Sort(nonAllocArr, 0, cnt, RaycastHitDistanceComparer.Default);\r\n                \r\n                for(int i = 0; i < cnt; i++)\r\n                {\r\n                    if(colliders.Contains(nonAllocArr[i].collider))\r\n                    {\r\n                        hit = nonAllocArr[i];\r\n                        System.Array.Clear(nonAllocArr, 0, cnt);\r\n                        return true;\r\n                    }\r\n                }\r\n\r\n                System.Array.Clear(nonAllocArr, 0, cnt);\r\n            }\r\n\r\n            hit = default(RaycastHit);\r\n            return false;\r\n        }\r\n\r\n        public static bool RaycastIgnoring(Vector3 pos, Vector3 dir, IEnumerable<Collider> ignoredColliders, float maxDistance = float.PositiveInfinity, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            RaycastHit hit;\r\n            return RaycastIgnoring(new Ray(pos, dir), out hit, ignoredColliders, maxDistance, layerMask, query);\r\n        }\r\n        \r\n        public static bool RaycastIgnoring(Ray ray, IEnumerable<Collider> ignoredColliders, float maxDistance = float.PositiveInfinity, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            RaycastHit hit;\r\n            return RaycastIgnoring(ray, out hit, ignoredColliders, maxDistance, layerMask, query);\r\n        }\r\n        \r\n        public static bool RaycastIgnoring(Vector3 pos, Vector3 dir, out RaycastHit hit, IEnumerable<Collider> ignoredColliders, float maxDistance = float.PositiveInfinity, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            return RaycastIgnoring(new Ray(pos, dir), out hit, ignoredColliders, maxDistance, layerMask, query);\r\n        }\r\n        \r\n        public static bool RaycastIgnoring(Ray ray, out RaycastHit hit, IEnumerable<Collider> ignoredColliders, float maxDistance = float.PositiveInfinity, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            var nonAllocArr = NonAllocRaycastBuffer;\r\n\r\n            int cnt = Physics.RaycastNonAlloc(ray, nonAllocArr, maxDistance, layerMask, query);\r\n\r\n            if (cnt > 0)\r\n            {\r\n                System.Array.Sort<RaycastHit>(nonAllocArr, 0, cnt, RaycastHitDistanceComparer.Default);\r\n\r\n                for (int i = 0; i < cnt; i++)\r\n                {\r\n                    if (!ignoredColliders.Contains(nonAllocArr[i].collider))\r\n                    {\r\n                        hit = nonAllocArr[i];\r\n                        System.Array.Clear(nonAllocArr, 0, cnt);\r\n                        return true;\r\n                    }\r\n                }\r\n\r\n                System.Array.Clear(nonAllocArr, 0, cnt);\r\n            }\r\n\r\n            hit = default(RaycastHit);\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Selective CastAll\r\n\r\n        public static RaycastHit[] RaycastAllAgainst(Vector3 origin, Vector3 dir, IEnumerable<Collider> colliders, float maxDistance = float.PositiveInfinity)\r\n        {\r\n            using (var lst = TempCollection.GetList<RaycastHit>())\r\n            {\r\n                RaycastAllAgainst(new Ray(origin, dir), lst, colliders, maxDistance);\r\n                return lst.ToArray();\r\n            }\r\n        }\r\n\r\n        public static RaycastHit[] RaycastAllAgainst(Ray ray, IEnumerable<Collider> colliders, float maxDistance = float.PositiveInfinity)\r\n        {\r\n            using (var lst = TempCollection.GetList<RaycastHit>())\r\n            {\r\n                RaycastAllAgainst(ray, lst, colliders, maxDistance);\r\n                return lst.ToArray();\r\n            }\r\n        }\r\n\r\n        public static int RaycastAllAgainst(Vector3 origin, Vector3 dir, ICollection<RaycastHit> results, IEnumerable<Collider> colliders, float maxDistance = float.PositiveInfinity)\r\n        {\r\n            return RaycastAllAgainst(new Ray(origin, dir), results, colliders, maxDistance);\r\n        }\r\n\r\n        public static int RaycastAllAgainst(Ray ray, ICollection<RaycastHit> results, IEnumerable<Collider> colliders, float maxDistance = float.PositiveInfinity)\r\n        {\r\n            var nonAllocArr = NonAllocRaycastBuffer;\r\n\r\n            int cnt = Physics.RaycastNonAlloc(ray, nonAllocArr, maxDistance, Physics.AllLayers, QueryTriggerInteraction.Collide);\r\n            \r\n            if(results is RaycastHit[])\r\n            {\r\n                var arr = results as RaycastHit[];\r\n                int j = 0;\r\n                for (int i = 0; i < cnt; i++)\r\n                {\r\n                    if(j < arr.Length && colliders.Contains(nonAllocArr[i].collider))\r\n                    {\r\n                        arr[j] = nonAllocArr[i];\r\n                        j++;\r\n                    }\r\n                    nonAllocArr[i] = default(RaycastHit);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                for (int i = 0; i < cnt; i++)\r\n                {\r\n                    if (colliders.Contains(nonAllocArr[i].collider))\r\n                    {\r\n                        results.Add(nonAllocArr[i]);\r\n                    }\r\n                    nonAllocArr[i] = default(RaycastHit);\r\n                }\r\n            }\r\n\r\n            return cnt;\r\n        }\r\n\r\n        public static RaycastHit[] RaycastAllIgnoring(Vector3 origin, Vector3 dir, IEnumerable<Collider> ignoredColliders, float maxDistance = float.PositiveInfinity)\r\n        {\r\n            using (var lst = TempCollection.GetList<RaycastHit>())\r\n            {\r\n                RaycastAllIgnoring(new Ray(origin, dir), lst, ignoredColliders, maxDistance);\r\n                return lst.ToArray();\r\n            }\r\n        }\r\n\r\n        public static RaycastHit[] RaycastAllIgnoring(Ray ray, IEnumerable<Collider> ignoredColliders, float maxDistance = float.PositiveInfinity)\r\n        {\r\n            using (var lst = TempCollection.GetList<RaycastHit>())\r\n            {\r\n                RaycastAllIgnoring(ray, lst, ignoredColliders, maxDistance);\r\n                return lst.ToArray();\r\n            }\r\n        }\r\n\r\n        public static int RaycastAllIgnoring(Vector3 origin, Vector3 dir, ICollection<RaycastHit> results, IEnumerable<Collider> ignoredColliders, float maxDistance = float.PositiveInfinity)\r\n        {\r\n            return RaycastAllIgnoring(new Ray(origin, dir), results, ignoredColliders, maxDistance);\r\n        }\r\n\r\n        public static int RaycastAllIgnoring(Ray ray, ICollection<RaycastHit> results, IEnumerable<Collider> ignoredColliders, float maxDistance = float.PositiveInfinity)\r\n        {\r\n            var nonAllocArr = NonAllocRaycastBuffer;\r\n\r\n            int cnt = Physics.RaycastNonAlloc(ray, nonAllocArr, maxDistance, Physics.AllLayers, QueryTriggerInteraction.Collide);\r\n\r\n            if (results is RaycastHit[])\r\n            {\r\n                var arr = results as RaycastHit[];\r\n                int j = 0;\r\n                for (int i = 0; i < cnt; i++)\r\n                {\r\n                    if (j < arr.Length && !ignoredColliders.Contains(nonAllocArr[i].collider))\r\n                    {\r\n                        arr[j] = nonAllocArr[i];\r\n                        j++;\r\n                    }\r\n                    nonAllocArr[i] = default(RaycastHit);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                for (int i = 0; i < cnt; i++)\r\n                {\r\n                    if (!ignoredColliders.Contains(nonAllocArr[i].collider))\r\n                    {\r\n                        results.Add(nonAllocArr[i]);\r\n                    }\r\n                    nonAllocArr[i] = default(RaycastHit);\r\n                }\r\n            }\r\n\r\n            return cnt;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region RepairHitSurfaceNormal\r\n\r\n        public static Vector3 RepairHitSurfaceNormal(RaycastHit hit, int layerMask)\r\n        {\r\n            /*\r\n             * Naive attempt to save a Raycast calculation... but ends up with a GC overhead \r\n             * retrieving the tris and verts. Stick with just a Raycast, no garbage.\r\n             *\r\n            if(hit.collider is MeshCollider && !(hit.collider as MeshCollider).convex)\r\n            {\r\n                var collider = hit.collider as MeshCollider;\r\n                var mesh = collider.sharedMesh;\r\n                var tris = mesh.triangles;\r\n                var verts = mesh.vertices;\r\n\r\n                var v0 = verts[tris[hit.triangleIndex * 3]];\r\n                var v1 = verts[tris[hit.triangleIndex * 3 + 1]];\r\n                var v2 = verts[tris[hit.triangleIndex * 3 + 2]];\r\n\r\n                var n = Vector3.Cross(v1 - v0, v2 - v1).normalized;\r\n                //var n =  Vector3.Cross(v2 - v1, v1 - v0).normalized;\r\n\r\n                return hit.transform.TransformDirection(n);\r\n            }\r\n             */\r\n\r\n            var p = hit.point + hit.normal * 0.01f;\r\n            Physics.Raycast(p, -hit.normal, out hit, 0.011f, layerMask);\r\n            return hit.normal;\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/PlanarSurfaceComponent.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Geom\n{\n\n    public class PlanarSurfaceComponent : MonoBehaviour, IPlanarSurface\n    {\n\n        #region Fields\n\n        #endregion\n\n        #region Properties\n\n        public Vector3 SurfaceNormal\n        {\n            get\n            {\n                return -this.transform.forward;\n            }\n        }\n\n        public Vector3 SurfaceRight\n        {\n            get\n            {\n                return this.transform.right;\n            }\n        }\n\n        public Vector3 SurfaceUp\n        {\n            get\n            {\n                return this.transform.up;\n            }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public Vector3 MirrorPosition(Vector3 pos)\n        {\n            var pn = this.SurfaceNormal;\n            var pd = Vector3.Dot(this.transform.position, pn);\n            //var d = Vector3.Dot(pn, (pos - pn * pd));\n            var d = Vector3.Dot(pn, pos) - pd; //this way is just fewer calculations, both work\n            return pos - pn * d * 2f;\n        }\n\n        public Vector3 MirrorDirection(Vector3 v)\n        {\n            var pn = this.SurfaceNormal;\n            var pd = Vector3.Dot(v, pn);\n            return v - pn * pd * 2f;\n        }\n\n        public Quaternion GetMirrorLookRotation(Vector3 forw, Vector3 up)\n        {\n            forw = this.MirrorDirection(forw);\n            up = this.MirrorDirection(up);\n            return Quaternion.LookRotation(forw, up);\n        }\n\n        #endregion\n\n        #region IPlanarSurface Interface\n\n        public Vector3 GetSurfaceNormal(Vector2 location)\n        {\n            return this.SurfaceNormal;\n        }\n\n        public Vector3 GetSurfaceNormal(Vector3 location)\n        {\n            return this.SurfaceNormal;\n        }\n\n        /// <summary>\n        /// Converts a 3d vector to closest 2d vector on 2D gameplay surface\n        /// </summary>\n        /// <param name=\"v\"></param>\n        /// <returns></returns>\n        public Vector2 ProjectVectorTo2D(Vector3 location, Vector3 v)\n        {\n            return new Vector2(Vector3.Dot(v, this.SurfaceRight), Vector3.Dot(v, this.SurfaceUp));\n        }\n\n        /// <summary>\n        /// Converts a 2d vector from the gameplay surface to the 3d world\n        /// </summary>\n        /// <param name=\"v\"></param>\n        /// <returns></returns>\n        public Vector3 ProjectVectorTo3D(Vector3 location, Vector2 v)\n        {\n            return this.SurfaceRight * v.x + this.SurfaceUp * v.y;\n        }\n\n        /// <summary>\n        /// Converts a 3d position to closest 2d position on the 2d gameplay surface\n        /// </summary>\n        /// <param name=\"v\"></param>\n        /// <returns></returns>\n        public Vector2 ProjectPosition2D(Vector3 v)\n        {\n            //currently, that is just a plane in the x/y of the world and z = 0\n            v -= this.transform.position;\n            return new Vector2(Vector3.Dot(v, this.SurfaceRight), Vector3.Dot(v, this.SurfaceUp));\n        }\n\n        /// <summary>\n        /// Converts a 2d position from the gameplay surface to the 3d world\n        /// </summary>\n        /// <param name=\"v\"></param>\n        /// <returns></returns>\n        public Vector3 ProjectPosition3D(Vector2 v)\n        {\n            //currently, that is just a plane in the x/y of the world and z = 0\n            return this.transform.position + this.SurfaceRight * v.x + this.SurfaceUp * v.y;\n        }\n\n        public Vector3 ClampToSurface(Vector3 v)\n        {\n            var p = this.transform.position;\n            var r = this.SurfaceRight;\n            var u = this.SurfaceUp;\n            v -= p;\n            return p + (r * Vector3.Dot(v, r)) + (u * Vector3.Dot(v, u));\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Geom/RaycastInfo.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n\r\n    [System.Serializable()]\r\n    public struct RaycastInfo\r\n    {\r\n\r\n        [SerializeField()]\r\n        private Vector3 _origin;\r\n        [SerializeField()]\r\n        private Vector3 _dir;\r\n        [SerializeField()]\r\n        private float _dist;\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public RaycastInfo(Ray r, float dist)\r\n        {\r\n            _origin = r.origin;\r\n            _dir = r.direction;\r\n            _dist = dist;\r\n        }\r\n\r\n        public RaycastInfo(Vector3 origin, Vector3 dir, float dist)\r\n        {\r\n            _origin = origin;\r\n            _dir = dir.normalized;\r\n            _dist = dist;\r\n        }\r\n\r\n        #endregion\r\n\r\n        public Ray Ray\r\n        {\r\n            get { return new Ray(_origin, _dir); }\r\n            set\r\n            {\r\n                _origin = value.origin;\r\n                _dir = value.direction.normalized;\r\n            }\r\n        }\r\n\r\n        public Vector3 Origin\r\n        {\r\n            get { return _origin; }\r\n            set { _origin = value; }\r\n        }\r\n\r\n        public Vector3 Direction\r\n        {\r\n            get { return _dir; }\r\n            set { _dir = value.normalized; }\r\n        }\r\n\r\n        public float Distance\r\n        {\r\n            get { return _dist; }\r\n            set { _dist = value; }\r\n        }\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/RigidbodyBounds.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n    public class RigidbodyBounds : IEnumerable<Collider>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Rigidbody _rb;\r\n        private bool _includeTriggers;\r\n        private BoundingSphereAlgorithm _algorithm;\r\n\r\n        private Collider[] _colliders;\r\n        private Sphere _sphereBounds;\r\n        private Bounds _rectBounds;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public RigidbodyBounds(Rigidbody body)\r\n        {\r\n            _rb = body;\r\n            _includeTriggers = false;\r\n            _algorithm = GeomUtil.DefaultBoundingSphereAlgorithm;\r\n        }\r\n\r\n        public RigidbodyBounds(Rigidbody body, bool includeTriggers)\r\n        {\r\n            _rb = body;\r\n            _includeTriggers = includeTriggers;\r\n            _algorithm = GeomUtil.DefaultBoundingSphereAlgorithm;\r\n        }\r\n\r\n        public RigidbodyBounds(Rigidbody body, BoundingSphereAlgorithm algorithm)\r\n        {\r\n            _rb = body;\r\n            _includeTriggers = false;\r\n            _algorithm = algorithm;\r\n        }\r\n\r\n        public RigidbodyBounds(Rigidbody body, bool includeTriggers, BoundingSphereAlgorithm algorithm)\r\n        {\r\n            _rb = body;\r\n            _includeTriggers = includeTriggers;\r\n            _algorithm = algorithm;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Rigidbody Rigidbody\r\n        {\r\n            get { return _rb; }\r\n            set\r\n            {\r\n                if (_rb == value) return;\r\n                _rb = value;\r\n                _colliders = null;\r\n            }\r\n        }\r\n\r\n        public bool IncludeTriggers\r\n        {\r\n            get { return _includeTriggers; }\r\n            set\r\n            {\r\n                if (_includeTriggers == value) return;\r\n                _includeTriggers = value;\r\n                _colliders = null;\r\n            }\r\n        }\r\n\r\n        public BoundingSphereAlgorithm BoundingSphereAlgorithm\r\n        {\r\n            get { return _algorithm; }\r\n            set\r\n            {\r\n                if (_algorithm == value) return;\r\n                _algorithm = value;\r\n                _colliders = null;\r\n            }\r\n        }\r\n\r\n        public Sphere BoundingSphere\r\n        {\r\n            get\r\n            {\r\n                if (_colliders == null) this.Recalculate();\r\n                return _sphereBounds;\r\n            }\r\n        }\r\n\r\n        public Bounds Bounds\r\n        {\r\n            get\r\n            {\r\n                if (_colliders == null) this.Recalculate();\r\n                return _rectBounds;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Recalculate()\r\n        {\r\n            if(_rb == null)\r\n            {\r\n                _colliders = new Collider[] { };\r\n                _sphereBounds = new Sphere();\r\n                _rectBounds = new Bounds();\r\n                return;\r\n            }\r\n\r\n            _colliders = (from c in _rb.GetComponentsInChildren<Collider>(false)\r\n                          where (_includeTriggers || !c.isTrigger) //TODO allow excluding colliders based on a list\r\n                          select c).ToArray();\r\n\r\n            if (_colliders.Length > 0)\r\n            {\r\n                _sphereBounds = Sphere.FromCollider(_colliders[0], _algorithm, false);\r\n                _rectBounds = _colliders[0].bounds;\r\n                for (int i = 1; i < _colliders.Length; i++)\r\n                {\r\n                    _sphereBounds.Encapsulate(Sphere.FromCollider(_colliders[i], _algorithm, false));\r\n                    _rectBounds.Encapsulate(_colliders[i].bounds);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                _sphereBounds = new Sphere();\r\n                _rectBounds = new Bounds();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public IEnumerator<Collider> GetEnumerator()\r\n        {\r\n            if (_colliders == null) this.Recalculate();\r\n            return (_colliders as IEnumerable<Collider>).GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/Sphere.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n    [System.Serializable]\r\n    public struct Sphere : IGeom, IPhysicsGeom, System.Runtime.Serialization.ISerializable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private Vector3 _cent;\r\n        [SerializeField()]\r\n        private float _rad;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public Sphere(Vector3 cent, float r)\r\n        {\r\n            _cent = cent;\r\n            _rad = r;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Vector3 Center\r\n        {\r\n            get { return _cent; }\r\n            set { _cent = value; }\r\n        }\r\n\r\n        public float Radius\r\n        {\r\n            get { return _rad; }\r\n            set { _rad = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Encapsulate(IGeom geom)\r\n        {\r\n            /*\r\n            var s = geom.GetBoundingSphere();\r\n            var v = (s.Center - _cent).normalized;\r\n            var p1 = this.Project(v);\r\n\t\t\tvar p2 = s.Project(v);\r\n\t\t\tvar p = p1;\r\n            p.Concat(p2);\r\n\t\t\t\r\n\t\t\t_rad = p.Length / 2.0f;\r\n            float dot = Vector3.Dot(_cent, p.Axis);\r\n\t\t\tfloat offset = Mathf.Abs(p.Min - dot);\r\n\t\t\t_cent = (_cent - v * offset) + v * _rad;\r\n             */\r\n\r\n            var s = geom.GetBoundingSphere();\r\n            var v = s.Center - _cent;\r\n            var l = v.magnitude;\r\n\r\n            if (l + s.Radius > _rad)\r\n            {\r\n                v.Normalize();\r\n                _rad = (l + s.Radius + _rad) / 2.0f;\r\n                _cent += v * (l + s.Radius - _rad);\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region IGeom Interface\r\n\r\n        public void Move(Vector3 mv)\r\n        {\r\n            _cent += mv;\r\n        }\r\n\r\n        public void RotateAroundPoint(Vector3 point, Quaternion rot)\r\n        {\r\n            _cent = point + rot * (_cent - point);\r\n        }\r\n\r\n        public AxisInterval Project(Vector3 axis)\r\n        {\r\n            axis.Normalize();\r\n            var c = Vector3.Dot(_cent, axis);\r\n            return new AxisInterval(axis, c - _rad, c + _rad);\r\n        }\r\n\r\n        public Bounds GetBounds()\r\n        {\r\n            return new Bounds(_cent, Vector3.one * _rad);\r\n        }\r\n\r\n        public Sphere GetBoundingSphere()\r\n        {\r\n            return this;\r\n        }\r\n\r\n        public bool Contains(Vector3 pos)\r\n        {\r\n            return (pos - _cent).sqrMagnitude < (_rad * _rad);\r\n        }\r\n\r\n        public IEnumerable<Vector3> GetAxes()\r\n        {\r\n            return System.Linq.Enumerable.Empty<Vector3>();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IPhysicsGeom Interface\r\n\r\n        public bool TestOverlap(int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            return Physics.CheckSphere(_cent, _rad, layerMask, query);\r\n        }\r\n\r\n        public int Overlap(ICollection<Collider> results, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            return PhysicsUtil.OverlapSphere(this.Center, this.Radius, results, layerMask, query);\r\n        }\r\n\r\n        public bool Cast(Vector3 direction, out RaycastHit hitinfo, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            return Physics.SphereCast(_cent, _rad, direction, out hitinfo, distance, layerMask, query);\r\n        }\r\n\r\n        public int CastAll(Vector3 direction, ICollection<RaycastHit> results, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\r\n        {\r\n            return PhysicsUtil.SphereCastAll(_cent, _rad, direction, results, distance, layerMask, query);\r\n        }\r\n\r\n        #endregion\r\n\r\n        \r\n        #region ISerializable Interface\r\n\r\n        private Sphere(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)\r\n        {\r\n            _cent = new Vector3(info.GetSingle(\"center.x\"), info.GetSingle(\"center.y\"), info.GetSingle(\"center.z\"));\r\n            _rad = info.GetSingle(\"radius\");\r\n        }\r\n\r\n        void System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)\r\n        {\r\n            info.AddValue(\"center.x\", _cent.x);\r\n            info.AddValue(\"center.y\", _cent.y);\r\n            info.AddValue(\"center.z\", _cent.z);\r\n            info.AddValue(\"radius\", _rad);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Static Interface\r\n\r\n        public static Sphere FromCollider(SphereCollider s, bool local = false)\r\n        {\r\n            if (s == null) return new Sphere();\r\n\r\n            if(local)\r\n            {\r\n                return new Sphere(s.center, s.radius);\r\n            }\r\n            else\r\n            {\r\n                var sc = s.transform.lossyScale;\r\n                var cent = s.transform.TransformPoint(s.center);\r\n                var msc = Mathf.Max(sc.x, sc.y, sc.z);\r\n                return new Sphere(cent, s.radius * msc);\r\n            }\r\n        }\r\n\r\n        public static Sphere FromCollider(CapsuleCollider c, bool local = false)\r\n        {\r\n            if(local)\r\n            {\r\n                var r = Mathf.Max(c.radius, c.height / 2.0f);\r\n                return new Sphere(c.center, r);\r\n            }\r\n            else\r\n            {\r\n                var sc = c.transform.lossyScale;\r\n                var cent = c.transform.TransformPoint(c.center);\r\n                var msc = Mathf.Max(sc.x, sc.y, sc.z);\r\n                var r = Mathf.Max(c.radius, c.height / 2.0f);\r\n                return new Sphere(cent, r * msc);\r\n            }\r\n        }\r\n\r\n        public static Sphere FromCollider(Collider c, bool local = false)\r\n        {\r\n            if (c is SphereCollider)\r\n            {\r\n                return FromCollider(c as SphereCollider, local);\r\n            }\r\n            else if (c is CapsuleCollider)\r\n            {\r\n                return FromCollider(c as CapsuleCollider, local);\r\n            }\r\n            else if (GeomUtil.DefaultBoundingSphereAlgorithm != BoundingSphereAlgorithm.FromBounds && c is MeshCollider)\r\n            {\r\n                return FromMesh((c as MeshCollider).sharedMesh, GeomUtil.DefaultBoundingSphereAlgorithm, Trans.GetGlobal(c.transform));\r\n            }\r\n            else\r\n            {\r\n                var bounds = AABBox.FromCollider(c, local);\r\n                return new Sphere(bounds.Center, bounds.Extents.magnitude);\r\n            }\r\n        }\r\n\r\n        public static Sphere FromCollider(Collider c, BoundingSphereAlgorithm algorithm, bool local = false)\r\n        {\r\n            if (c is SphereCollider)\r\n            {\r\n                return FromCollider(c as SphereCollider, local);\r\n            }\r\n            else if (c is CapsuleCollider)\r\n            {\r\n                return FromCollider(c as CapsuleCollider, local);\r\n            }\r\n            else if (algorithm != BoundingSphereAlgorithm.FromBounds && c is MeshCollider)\r\n            {\r\n                return FromMesh((c as MeshCollider).sharedMesh, algorithm, Trans.GetGlobal(c.transform));\r\n            }\r\n            else\r\n            {\r\n                var bounds = AABBox.FromCollider(c, local);\r\n                return new Sphere(bounds.Center, bounds.Extents.magnitude);\r\n            }\r\n        }\r\n\r\n        public static Sphere FromMesh(Mesh mesh, BoundingSphereAlgorithm algorithm)\r\n        {\r\n            if (mesh == null) return new Sphere();\r\n\r\n            if (algorithm != BoundingSphereAlgorithm.FromBounds)\r\n            {\r\n                var arr = mesh.vertices;\r\n                if (arr.Length > 0)\r\n                {\r\n                    return FromPoints(arr, algorithm);\r\n                }\r\n                else\r\n                {\r\n                    return new Sphere();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var bounds = mesh.bounds;\r\n                return new Sphere(bounds.center, bounds.extents.magnitude);\r\n            }\r\n        }\r\n\r\n        public static Sphere FromMesh(Mesh mesh, BoundingSphereAlgorithm algorithm, Trans transform)\r\n        {\r\n            if (mesh == null) return new Sphere();\r\n\r\n            var arr = mesh.vertices;\r\n            if (arr.Length > 0)\r\n            {\r\n                for (int i = 0; i < arr.Length; i++)\r\n                {\r\n                    arr[i] = transform.TransformPoint(arr[i]);\r\n                }\r\n                return FromPoints(arr, algorithm);\r\n            }\r\n            else\r\n            {\r\n                return new Sphere();\r\n            }\r\n        }\r\n\r\n        public static Sphere FromBounds(Bounds bounds)\r\n        {\r\n            return new Sphere(bounds.center, Mathf.Max(bounds.extents.x, bounds.extents.y, bounds.extents.z));\r\n        }\r\n\r\n        public static Sphere FromPoints(IEnumerable<Vector3> points, BoundingSphereAlgorithm algorithm)\r\n        {\r\n            return FromPoints(points.ToArray(), algorithm);\r\n        }\r\n\r\n        public static Sphere FromPoints(Vector3[] points, BoundingSphereAlgorithm algorithm)\r\n        {\r\n\r\n            switch (algorithm)\r\n            {\r\n                case BoundingSphereAlgorithm.FromBounds:\r\n                    {\r\n                        var bounds = AABBox.FromPoints(points);\r\n                        return new Sphere(bounds.Center, bounds.Extents.magnitude);\r\n                    }\r\n                case BoundingSphereAlgorithm.Average:\r\n                    {\r\n                        Vector3 sum = Vector3.zero;\r\n                        foreach(var v in points)\r\n                        {\r\n                            sum += v;\r\n                        }\r\n                        sum /= points.Length;\r\n                        float dist = 0f;\r\n                        float d;\r\n                        foreach(var v in points)\r\n                        {\r\n                            d = (v - sum).sqrMagnitude;\r\n                            if (d > dist) dist = d;\r\n                        }\r\n                        dist = Mathf.Sqrt(dist);\r\n                        return new Sphere(sum, dist);\r\n                    }\r\n                case BoundingSphereAlgorithm.Ritter:\r\n                    {\r\n                        Vector3 xmin, xmax, ymin, ymax, zmin, zmax;\r\n                        xmin = ymin = zmin = Vector3.one * float.PositiveInfinity;\r\n                        xmax = ymax = zmax = Vector3.one * float.NegativeInfinity;\r\n                        foreach (var p in points)\r\n                        {\r\n                            if (p.x < xmin.x) xmin = p;\r\n                            if (p.x > xmax.x) xmax = p;\r\n                            if (p.y < ymin.y) ymin = p;\r\n                            if (p.y > ymax.y) ymax = p;\r\n                            if (p.z < zmin.z) zmin = p;\r\n                            if (p.z > zmax.z) zmax = p;\r\n                        }\r\n                        var xSpan = (xmax - xmin).sqrMagnitude;\r\n                        var ySpan = (ymax - ymin).sqrMagnitude;\r\n                        var zSpan = (zmax - zmin).sqrMagnitude;\r\n                        var dia1 = xmin;\r\n                        var dia2 = xmax;\r\n                        var maxSpan = xSpan;\r\n                        if (ySpan > maxSpan)\r\n                        {\r\n                            maxSpan = ySpan;\r\n                            dia1 = ymin; dia2 = ymax;\r\n                        }\r\n                        if (zSpan > maxSpan)\r\n                        {\r\n                            dia1 = zmin; dia2 = zmax;\r\n                        }\r\n                        var center = (dia1 + dia2) * 0.5f;\r\n                        var sqRad = (dia2 - center).sqrMagnitude;\r\n                        var radius = Mathf.Sqrt(sqRad);\r\n                        foreach (var p in points)\r\n                        {\r\n                            float d = (p - center).sqrMagnitude;\r\n                            if (d > sqRad)\r\n                            {\r\n                                var r = Mathf.Sqrt(d);\r\n                                radius = (radius + r) * 0.5f;\r\n                                sqRad = radius * radius;\r\n                                var offset = r - radius;\r\n                                center = (radius * center + offset * p) / r;\r\n                            }\r\n                        }\r\n                        return new Sphere(center, radius);\r\n                    }\r\n            }\r\n\r\n            return new Sphere();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Measures the distance between 2 spheres. If the value is negative, the spheres are overlapping.\r\n        /// </summary>\r\n        /// <param name=\"s1\"></param>\r\n        /// <param name=\"s2\"></param>\r\n        /// <returns></returns>\r\n        public static float DistanceBetween(Sphere s1, Sphere s2)\r\n        {\r\n            return (s1.Center - s2.Center).magnitude - (s1.Radius + s2.Radius);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/TrajectoryUtil.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n\r\n    /// <summary>\r\n    /// In this class 'ideal conditions' is defined as a frictionless system with no air resistance and constant gravitational acceleration.\r\n    /// </summary>\r\n    /// <notes>\r\n    /// v2 − u2 = 2as\r\n    /// \r\n    /// v = final velocity\r\n    /// u = initial velocity\r\n    /// a = acceleration force\r\n    /// s = distance covered\r\n    /// </notes>\r\n    public static class TrajectoryUtil\r\n    {\r\n\r\n        /// <summary>\r\n        /// Returns the farthest range of a projectile thrown in ideal conditions over flat ground.\r\n        /// </summary>\r\n        /// <param name=\"initialSpeed\"></param>\r\n        /// <returns></returns>\r\n        public static float GetIdealRangeOfProjectile(float initialSpeed, float gravity)\r\n        {\r\n            //R = speed^2 * sin(2*theta) / gravity\r\n            //max range in an ideal conditions will be 45 degrees, sin(2 *45) = 1\r\n            //reduces to: R = s^2 / gravity\r\n            return initialSpeed * initialSpeed / gravity;\r\n        }\r\n\r\n        public static float GetIdealMaxHeightOfProjectile(Vector2 initialVelocity, float gravity)\r\n        {\r\n            return GetIdealMaxHeightOfProjectile(initialVelocity.y, gravity);\r\n        }\r\n\r\n        public static float GetIdealMaxHeightOfProjectile(float initialSpeed, float angle, float gravity, bool useRadians = false)\r\n        {\r\n            if (!useRadians) angle *= Mathf.Deg2Rad;\r\n            var s = Mathf.Cos(angle) * initialSpeed;\r\n            return GetIdealMaxHeightOfProjectile(s, gravity);\r\n        }\r\n\r\n        public static float GetIdealMaxHeightOfProjectile(float initialSpeed, float gravity)\r\n        {\r\n            return Mathf.Max(initialSpeed * initialSpeed / (2 * gravity), 0f);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Finds the best launch velocity to travel from 'from' to 'to' with some initialSpeed and constant gravity. \r\n        /// Two probably paths can potentially be calculated, the shorter of which is chosen.\r\n        /// If the target position 'to' is out of range than velocity is set to a velocity straight at the target and false is returned.\r\n        /// </summary>\r\n        /// <param name=\"from\"></param>\r\n        /// <param name=\"to\"></param>\r\n        /// <param name=\"initialSpeed\"></param>\r\n        /// <param name=\"gravity\"></param>\r\n        /// <param name=\"velocity\"></param>\r\n        /// <returns></returns>\r\n        public static bool CalculateLaunchVelocity(Vector2 from, Vector2 to, float initialSpeed, float gravity, out Vector2 velocity)\r\n        {\r\n            var dv = to - from;\r\n            velocity = new Vector2(0f, initialSpeed * MathUtil.Sign(dv.y, 1f));\r\n\r\n            if (Mathf.Abs(dv.x) < 0.001f) return false;\r\n\r\n            var dx = Mathf.Abs(dv.x);\r\n            var dy = dv.y;\r\n\r\n            //theta = atan( (v^2 +/- Sqrt(v^4 - g(gx^2 + 2yv^2))) / (gx) )\r\n            var v2 = initialSpeed * initialSpeed;\r\n            var v4 = v2 * v2;\r\n            var gx = gravity * dx;\r\n            var root = Mathf.Sqrt(v4 - gravity * (gx * dx + 2f * dy * v2));\r\n            var theta1 = Mathf.Atan((v2 + root) / gx);\r\n            var theta2 = Mathf.Atan((v2 - root) / gx);\r\n\r\n            float a;\r\n            if (float.IsNaN(theta1))\r\n            {\r\n                if (float.IsNaN(theta2)) return false;\r\n                else a = theta2;\r\n            }\r\n            else\r\n            {\r\n                if (!float.IsNaN(theta2)) a = Mathf.Min(theta1, theta2);\r\n                else a = theta1;\r\n            }\r\n\r\n            velocity = new Vector2(Mathf.Sin(a) * Mathf.Sign(dv.x), Mathf.Cos(a));\r\n            velocity *= initialSpeed;\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Finds the best launch velocity to travel from 'from' to 'to' with some initialSpeed and constant gravity. \r\n        /// Two probably paths can potentially be calculated, the shorter of which is chosen.\r\n        /// If the target position 'to' is out of range than velocity is set to a velocity straight at the target and false is returned.\r\n        /// </summary>\r\n        /// <param name=\"from\"></param>\r\n        /// <param name=\"to\"></param>\r\n        /// <param name=\"initialSpeed\"></param>\r\n        /// <param name=\"gravity\"></param>\r\n        /// <param name=\"velocity\"></param>\r\n        /// <returns></returns>\r\n        public static bool CalculateLaunchVelocity(Vector3 from, Vector3 to, float initialSpeed, float gravity, out Vector3 velocity)\r\n        {\r\n            var dv = to - from;\r\n            velocity = dv.normalized * initialSpeed;\r\n\r\n            var a = Vector3.Angle(dv, Vector3.up);\r\n            if (a < 0.001f || (180f - a) < 0.001f) return false;\r\n\r\n            var dir = new Vector3(dv.x, 0f, dv.z);\r\n            var dx = dir.magnitude;\r\n            var dy = dv.y;\r\n\r\n            //theta = atan( (v^2 +/- Sqrt(v^4 - g(gx^2 + 2yv^2))) / (gx) )\r\n            var v2 = initialSpeed * initialSpeed;\r\n            var v4 = v2 * v2;\r\n            var gx = gravity * dx;\r\n            var root = Mathf.Sqrt(v4 - gravity * (gx * dx + 2f * dy * v2));\r\n            var theta1 = Mathf.Atan((v2 + root) / gx);\r\n            var theta2 = Mathf.Atan((v2 - root) / gx);\r\n\r\n            if (float.IsNaN(theta1))\r\n            {\r\n                if (float.IsNaN(theta2)) return false;\r\n                else a = theta2;\r\n            }\r\n            else\r\n            {\r\n                if (!float.IsNaN(theta2)) a = Mathf.Min(theta1, theta2);\r\n                else a = theta1;\r\n            }\r\n\r\n            dir.Normalize();\r\n            var right = Vector3.Cross(dir, Vector3.up);\r\n            velocity = Quaternion.AngleAxis(a * Mathf.Rad2Deg, right) * dir * initialSpeed;\r\n            return true;\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Geom/Trans.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n\r\n    [System.Serializable()]\r\n    public struct Trans\r\n    {\r\n\r\n        [SerializeField()]\r\n        public Vector3 Position;\r\n        [SerializeField()]\r\n        public Quaternion Rotation;\r\n        [SerializeField()]\r\n        public Vector3 Scale;\r\n\r\n        public Matrix4x4 Matrix\r\n        {\r\n            get\r\n            {\r\n                return Matrix4x4.TRS(Position, Rotation, Scale);\r\n            }\r\n            set\r\n            {\r\n                Position = TransformUtil.GetTranslation(value);\r\n                Rotation = TransformUtil.GetRotation(value);\r\n                Scale = TransformUtil.GetScale(value);\r\n            }\r\n        }\r\n\r\n        #region CONSTRUCTORS\r\n\r\n        public Trans(Vector3 pos, Quaternion rot)\r\n        {\r\n            this.Position = pos;\r\n            this.Rotation = rot;\r\n            this.Scale = Vector3.one;\r\n        }\r\n\r\n        public Trans(Vector3 pos, Quaternion rot, Vector3 sc)\r\n        {\r\n            this.Position = pos;\r\n            this.Rotation = rot;\r\n            this.Scale = sc;\r\n        }\r\n\r\n        public static Trans Identity\r\n        {\r\n            get\r\n            {\r\n                return new Trans(Vector3.zero, Quaternion.identity, Vector3.one);\r\n            }\r\n        }\r\n\r\n        public static Trans NaN\r\n        {\r\n            get\r\n            {\r\n                return new Trans(new Vector3(float.NaN, float.NaN, float.NaN),\r\n                                 new Quaternion(float.NaN, float.NaN, float.NaN, float.NaN),\r\n                                 new Vector3(float.NaN, float.NaN, float.NaN));\r\n            }\r\n        }\r\n\r\n        public static Trans Translation(Vector3 pos)\r\n        {\r\n            return new Trans(pos, Quaternion.identity, Vector3.one);\r\n        }\r\n\r\n        public static Trans Translation(float x, float y, float z)\r\n        {\r\n            return new Trans(new Vector3(x, y, z), Quaternion.identity, Vector3.one);\r\n        }\r\n\r\n        public static Trans Rotated(Quaternion q)\r\n        {\r\n            return new Trans(Vector3.zero, q, Vector3.one);\r\n        }\r\n\r\n        public static Trans Rotated(Vector3 eulerAngles)\r\n        {\r\n            return new Trans(Vector3.zero, Quaternion.Euler(eulerAngles), Vector3.one);\r\n        }\r\n\r\n        public static Trans Rotated(float x, float y, float z)\r\n        {\r\n            return new Trans(Vector3.zero, Quaternion.Euler(x, y, z), Vector3.one);\r\n        }\r\n\r\n        public static Trans Scaled(Vector3 sc)\r\n        {\r\n            return new Trans(Vector3.zero, Quaternion.identity, sc);\r\n        }\r\n\r\n        public static Trans Scaled(float x, float y, float z)\r\n        {\r\n            return new Trans(Vector3.zero, Quaternion.identity, new Vector3(x, y, z));\r\n        }\r\n\r\n        public static Trans Transform(Matrix4x4 mat)\r\n        {\r\n            var t = new Trans();\r\n            t.Matrix = mat;\r\n            return t;\r\n        }\r\n\r\n        public static Trans Transform(Vector3 pos, Quaternion rot)\r\n        {\r\n            return new Trans(pos, rot);\r\n        }\r\n\r\n        public static Trans Transform(Vector3 pos, Quaternion rot, Vector3 sc)\r\n        {\r\n            return new Trans(pos, rot, sc);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Vector3 Forward\r\n        {\r\n            get { return this.Rotation * Vector3.forward; }\r\n        }\r\n\r\n        public Vector3 Up\r\n        {\r\n            get { return this.Rotation * Vector3.up; }\r\n        }\r\n\r\n        public Vector3 Right\r\n        {\r\n            get { return this.Rotation * Vector3.right; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Translate(Vector3 v)\r\n        {\r\n            Position += v;\r\n        }\r\n\r\n        public void Rotate(Quaternion q)\r\n        {\r\n            Rotation *= q;\r\n        }\r\n\r\n        public void Rotate(float x, float y, float z)\r\n        {\r\n            Rotation *= Quaternion.Euler(x, y, z);\r\n        }\r\n\r\n        public void Rotate(Vector3 eulerRot)\r\n        {\r\n            Rotation *= Quaternion.Euler(eulerRot);\r\n        }\r\n\r\n        public void RotateAround(Vector3 point, float angle, Vector3 axis)\r\n        {\r\n            var v = this.Position - point;\r\n            var q = Quaternion.AngleAxis(angle, axis);\r\n            v = q * v;\r\n            this.Position = point + v;\r\n            this.Rotation *= q;\r\n        }\r\n\r\n        public void LookAt(Vector3 point, Vector3 up)\r\n        {\r\n            this.Rotation = Quaternion.LookRotation(point - this.Position, up);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Transforms point from local space to global space.\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <returns></returns>\r\n        public Vector3 TransformPoint(Vector3 v)\r\n        {\r\n            return this.Matrix.MultiplyPoint(v);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Trasnforms direction vector from local space to global space.\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <returns></returns>\r\n        public Vector3 TransformDirection(Vector3 v)\r\n        {\r\n            return this.Matrix.MultiplyVector(v);\r\n        }\r\n\r\n        public Vector3 InverseTransformPoint(Vector3 v)\r\n        {\r\n            return this.Matrix.inverse.MultiplyPoint(v);\r\n        }\r\n\r\n        public Vector3 InverseTransformDirection(Vector3 v)\r\n        {\r\n            return this.Matrix.inverse.MultiplyVector(v);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Transforms current state from global space to the local space of the passed in 'parent'. \r\n        /// </summary>\r\n        /// <param name=\"parent\">The parent to set local to. If null, stays global.</param>\r\n        public void TransformTo(Transform parent)\r\n        {\r\n            if (parent == null) return;\r\n\r\n            this.Position = parent.InverseTransformPoint(this.Position);\r\n            this.Rotation = parent.InverseTransformRotation(this.Rotation);\r\n            this.Scale = parent.InverseTransformVector(this.Scale);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Transforms current state from local space of passed in 'parent' to the global space.\r\n        /// </summary>\r\n        /// <param name=\"parent\">The parent to set global from. If null, stays same.</param>\r\n        public void TransformFrom(Transform parent)\r\n        {\r\n            if (parent == null) return;\r\n\r\n            this.Position = parent.TransformPoint(this.Position);\r\n            this.Rotation = parent.TransformRotation(this.Rotation);\r\n            this.Scale = parent.TransformVector(this.Scale);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Operators\r\n\r\n        public static Trans operator *(Trans t1, Trans t2)\r\n        {\r\n            t1.Position += t2.Position;\r\n            t1.Rotation *= t2.Rotation;\r\n            var v1 = t1.Scale;\r\n            var v2 = t2.Scale;\r\n            v1.x *= v2.x;\r\n            v1.y *= v2.y;\r\n            v1.z *= v2.z;\r\n            t1.Scale = v1;\r\n            return t1;\r\n        }\r\n\r\n        public static Trans operator +(Trans t, Vector3 v)\r\n        {\r\n            t.Position += v;\r\n            return t;\r\n        }\r\n\r\n        public static Trans operator *(Trans t, Quaternion q)\r\n        {\r\n            t.Rotation *= q;\r\n            return t;\r\n        }\r\n\r\n        public static Vector3 operator *(Trans t, Vector3 v)\r\n        {\r\n            return t.Matrix.MultiplyPoint(v);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Get/Set to Transform\r\n\r\n        public void SetToLocal(Transform trans)\r\n        {\r\n            trans.localPosition = Position;\r\n            trans.localRotation = Rotation;\r\n            trans.localScale = Scale;\r\n        }\r\n\r\n        public void SetToLocal(Transform trans, bool bSetScale)\r\n        {\r\n            trans.localPosition = Position;\r\n            trans.localRotation = Rotation;\r\n            if (bSetScale) trans.localScale = Scale;\r\n        }\r\n\r\n        public void SetToGlobal(Transform trans, bool bSetScale)\r\n        {\r\n            if (bSetScale)\r\n            {\r\n                trans.position = Position;\r\n                trans.rotation = Rotation;\r\n                trans.localScale = Vector3.one;\r\n                var m = trans.worldToLocalMatrix;\r\n                m.SetColumn(3, new Vector4(0f, 0f, 0f, 1f));\r\n                trans.localScale = m.MultiplyPoint(Scale);\r\n            }\r\n            else\r\n            {\r\n                trans.position = Position;\r\n                trans.rotation = Rotation;\r\n            }\r\n        }\r\n\r\n        public void SetToGlobal(Transform trans, bool bSetScale, bool bSetScaleOnGlobalAxes)\r\n        {\r\n            if (bSetScale)\r\n            {\r\n                trans.position = Position;\r\n                trans.rotation = Rotation;\r\n                trans.localScale = Vector3.one;\r\n                var m = trans.worldToLocalMatrix;\r\n                if(bSetScaleOnGlobalAxes)\r\n                {\r\n                    m.SetColumn(0, new Vector4(m.GetColumn(0).magnitude, 0f));\r\n                    m.SetColumn(1, new Vector4(0f, m.GetColumn(1).magnitude));\r\n                    m.SetColumn(2, new Vector4(0f, 0f, m.GetColumn(2).magnitude));\r\n                }\r\n                m.SetColumn(3, new Vector4(0f, 0f, 0f, 1f));\r\n                trans.localScale = m.MultiplyPoint(Scale);\r\n            }\r\n            else\r\n            {\r\n                trans.position = Position;\r\n                trans.rotation = Rotation;\r\n            }\r\n        }\r\n\r\n        public static Trans GetLocal(Transform trans)\r\n        {\r\n            var t = new Trans();\r\n            t.Position = trans.localPosition;\r\n            t.Rotation = trans.localRotation;\r\n            t.Scale = trans.localScale;\r\n            return t;\r\n        }\r\n\r\n        public static Trans GetGlobal(Transform trans)\r\n        {\r\n            var t = new Trans();\r\n            t.Position = trans.position;\r\n            t.Rotation = trans.rotation;\r\n            t.Scale = trans.lossyScale;\r\n            return t;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Methods\r\n\r\n        public static bool IsNaN(Trans t)\r\n        {\r\n            return VectorUtil.IsNaN(t.Position) || VectorUtil.IsNaN(t.Scale) || QuaternionUtil.IsNaN(t.Rotation);\r\n        }\r\n\r\n        public static Trans Lerp(Trans start, Trans end, float t)\r\n        {\r\n            start.Position = Vector3.LerpUnclamped(start.Position, end.Position, t);\r\n            start.Rotation = Quaternion.SlerpUnclamped(start.Rotation, end.Rotation, t);\r\n            start.Scale = Vector3.Lerp(start.Scale, end.Scale, t);\r\n            return start;\r\n        }\r\n\r\n        public static Trans Slerp(Trans start, Trans end, float t)\r\n        {\r\n            start.Position = Vector3.SlerpUnclamped(start.Position, end.Position, t);\r\n            start.Rotation = Quaternion.SlerpUnclamped(start.Rotation, end.Rotation, t);\r\n            start.Scale = Vector3.LerpUnclamped(start.Scale, end.Scale, t);\r\n            return start;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}"
  },
  {
    "path": "SpacepuppyBase/Geom/XYPlanarSurface.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Geom\r\n{\r\n\r\n    [System.Serializable()]\r\n    public class XYPlanarSurface : IPlanarSurface\r\n    {\r\n\r\n        #region Default Entry\r\n\r\n        private static XYPlanarSurface _surface = new XYPlanarSurface();\r\n\r\n        public static XYPlanarSurface Default { get { return _surface; } }\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private float _zdepth;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public XYPlanarSurface()\r\n        {\r\n            _zdepth = 0f;\r\n        }\r\n\r\n        public XYPlanarSurface(float zdepth)\r\n        {\r\n            _zdepth = zdepth;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float ZDepth\r\n        {\r\n            get { return _zdepth; }\r\n            set { _zdepth = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IPlanarSurface Interface\r\n\r\n        public Vector3 GetSurfaceNormal(Vector2 location)\r\n        {\r\n            return -Vector3.forward;\r\n        }\r\n\r\n        public Vector3 GetSurfaceNormal(Vector3 location)\r\n        {\r\n            return -Vector3.forward;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts a 3d vector to closest 2d vector on 2D gameplay surface\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <returns></returns>\r\n        public Vector2 ProjectVectorTo2D(Vector3 location, Vector3 v)\r\n        {\r\n            //currently, that is just a plane in the x/y of the world and z = 0\r\n            return new Vector2(v.x, v.y);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts a 2d vector from the gameplay surface to the 3d world\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <returns></returns>\r\n        public Vector3 ProjectVectorTo3D(Vector3 location, Vector2 v)\r\n        {\r\n            //currently, that is just a plane in the x/y of the world and z = 0\r\n            return new Vector3(v.x, v.y, 0f);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts a 3d position to closest 2d position on the 2d gameplay surface\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <returns></returns>\r\n        public Vector2 ProjectPosition2D(Vector3 v)\r\n        {\r\n            //currently, that is just a plane in the x/y of the world and z = 0\r\n            return new Vector2(v.x, v.y);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts a 2d position from the gameplay surface to the 3d world\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <returns></returns>\r\n        public Vector3 ProjectPosition3D(Vector2 v)\r\n        {\r\n            //currently, that is just a plane in the x/y of the world and z = 0\r\n            return new Vector3(v.x, v.y, _zdepth);\r\n        }\r\n\r\n        public Vector3 ClampToSurface(Vector3 v)\r\n        {\r\n            return new Vector3(v.x, v.y, _zdepth);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Graphs/AStarPathResolver.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\n\r\nnamespace com.spacepuppy.Graphs\r\n{\r\n\r\n    public class AStarPathResolver<T> : ISteppingPathResolver<T> where T : class\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private IGraph<T> _graph;\r\n        private IHeuristic<T> _heuristic;\r\n\r\n        private BinaryHeap<VertexInfo> _open;\r\n        private HashSet<T> _closed = new HashSet<T>();\r\n        private HashSet<VertexInfo> _tracked = new HashSet<VertexInfo>();\r\n        private List<T> _neighbours = new List<T>();\r\n\r\n        private T _start;\r\n        private T _goal;\r\n\r\n        private bool _calculating;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public AStarPathResolver(IGraph<T> graph, IHeuristic<T> heuristic)\r\n        {\r\n            _graph = graph;\r\n            _heuristic = heuristic;\r\n            _open = new BinaryHeap<VertexInfo>(graph.Count, VertexComparer.Default);\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool IsWorking\r\n        {\r\n            get { return _calculating; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IPathResolver Interface\r\n\r\n        public T Start\r\n        {\r\n            get { return _goal; }\r\n            set\r\n            {\r\n                if (_calculating) throw new InvalidOperationException(\"Cannot update start node when calculating.\");\r\n                _goal = value;\r\n            }\r\n        }\r\n\r\n        public T Goal\r\n        {\r\n            get { return _start; }\r\n            set\r\n            {\r\n                if (_calculating) throw new InvalidOperationException(\"Cannot update goal node when calculating.\");\r\n                _start = value;\r\n            }\r\n        }\r\n\r\n        public IList<T> Reduce()\r\n        {\r\n            if (_calculating) throw new InvalidOperationException(\"PathResolver is already running.\");\r\n            if (_graph == null || _heuristic == null || _start == null || _goal == null) throw new InvalidOperationException(\"PathResolver is not initialized.\");\r\n\r\n            var lst = new List<T>();\r\n            this.Reduce(lst);\r\n            return lst;\r\n        }\r\n\r\n        public int Reduce(IList<T> path)\r\n        {\r\n            if (_calculating) throw new InvalidOperationException(\"PathResolver is already running.\");\r\n            if (_graph == null || _heuristic == null || _start == null || _goal == null) throw new InvalidOperationException(\"PathResolver is not initialized.\");\r\n\r\n            this.Reset();\r\n            _calculating = true;\r\n            \r\n            try\r\n            {\r\n                _open.Add(this.CreateInfo(_start, _heuristic.Weight(_start), _goal));\r\n\r\n                while (_open.Count > 0)\r\n                {\r\n                    var u = _open.Pop();\r\n\r\n                    if (u.Node == _goal)\r\n                    {\r\n                        int cnt = 0;\r\n                        while (u.Next != null)\r\n                        {\r\n                            path.Add(u.Node);\r\n                            u = u.Next;\r\n                            cnt++;\r\n                        }\r\n                        path.Add(u.Node);\r\n                        return cnt + 1;\r\n                    }\r\n\r\n                    _closed.Add(u.Node);\r\n\r\n                    _graph.GetNeighbours(u.Node, _neighbours);\r\n                    var e = _neighbours.GetEnumerator();\r\n                    while(e.MoveNext())\r\n                    {\r\n                        var n = e.Current;\r\n                        if (_closed.Contains(n)) continue;\r\n\r\n                        float g = u.g + _heuristic.Distance(u.Node, n) + _heuristic.Weight(n);\r\n\r\n                        int i = GetInfo(_open, n);\r\n                        if (i < 0)\r\n                        {\r\n                            var v = this.CreateInfo(n, g, _goal);\r\n                            v.Next = u;\r\n                            _open.Add(v);\r\n                        }\r\n                        else if (g < _open[i].g)\r\n                        {\r\n                            var v = _open[i];\r\n                            v.Next = u;\r\n                            v.g = g;\r\n                            v.f = g + v.h;\r\n                            _open.Update(i);\r\n                        }\r\n                    }\r\n                    _neighbours.Clear();\r\n                }\r\n\r\n            }\r\n            finally\r\n            {\r\n                this.Reset();\r\n            }\r\n\r\n            return 0;\r\n        }\r\n        \r\n        private VertexInfo CreateInfo(T node, float g, T goal)\r\n        {\r\n            var v = _pool.GetInstance();\r\n            v.Node = node;\r\n            v.Next = null;\r\n            v.g = g;\r\n            v.h = _heuristic.Distance(node, goal);\r\n            v.f = g + v.h;\r\n            _tracked.Add(v);\r\n            return v;\r\n        }\r\n\r\n        private static int GetInfo(BinaryHeap<VertexInfo> heap, T node)\r\n        {\r\n            for (int i = 0; i < heap.Count; i++)\r\n            {\r\n                if (heap[i].Node == node) return i;\r\n            }\r\n            return -1;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISteppingPathResolver Interface\r\n\r\n        private VertexInfo _steppedCompletedParentNode;\r\n\r\n        /// <summary>\r\n        /// Start the stepping path resolver for reducing.\r\n        /// </summary>\r\n        public void BeginSteppedReduce()\r\n        {\r\n            if (_calculating) throw new InvalidOperationException(\"PathResolver is already running.\");\r\n            if (_graph == null || _heuristic == null || _start == null || _goal == null) throw new InvalidOperationException(\"PathResolver is not initialized.\");\r\n\r\n            _calculating = true;\r\n\r\n            _open.Clear();\r\n            _closed.Clear();\r\n            _tracked.Clear();\r\n            _neighbours.Clear();\r\n\r\n            _open.Add(this.CreateInfo(_start, _heuristic.Weight(_start), _goal));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Take a step at reducing the path resolver.\r\n        /// </summary>\r\n        /// <returns>Returns true if reached goal.</returns>\r\n        public bool Step()\r\n        {\r\n            if (!_calculating) throw new InvalidOperationException(\"You must begin a SteppingResolver before stepping through it.\");\r\n            if (_steppedCompletedParentNode != null) return true;\r\n\r\n            if (_open.Count > 0)\r\n            {\r\n                var u = _open.Pop();\r\n\r\n                if (u.Node == _goal)\r\n                {\r\n                    _steppedCompletedParentNode = u;\r\n                    return true;\r\n                }\r\n\r\n                _closed.Add(u.Node);\r\n\r\n                _graph.GetNeighbours(u.Node, _neighbours);\r\n                var e = _neighbours.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    var n = e.Current;\r\n                    if (_closed.Contains(n)) continue;\r\n\r\n                    float g = u.g + _heuristic.Distance(u.Node, n) + _heuristic.Weight(n);\r\n\r\n                    int i = GetInfo(_open, n);\r\n                    if (i < 0)\r\n                    {\r\n                        var v = this.CreateInfo(n, g, _goal);\r\n                        v.Next = u;\r\n                        _open.Add(v);\r\n                    }\r\n                    else if (g < _open[i].g)\r\n                    {\r\n                        var v = _open[i];\r\n                        v.Next = u;\r\n                        v.g = g;\r\n                        v.f = g + v.h;\r\n                        _open.Update(i);\r\n                    }\r\n                }\r\n                _neighbours.Clear();\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get the result of reducing the path.\r\n        /// </summary>\r\n        /// <param name=\"path\"></param>\r\n        public int EndSteppedReduce(IList<T> path)\r\n        {\r\n            if (!_calculating) throw new InvalidOperationException(\"You must begin a SteppingResolver before ending it.\");\r\n            if (_steppedCompletedParentNode == null) throw new InvalidOperationException(\"Path has not completed resolving.\");\r\n\r\n            int cnt = 0;\r\n            var u = _steppedCompletedParentNode;\r\n            while (u.Next != null)\r\n            {\r\n                path.Add(u.Node);\r\n                u = u.Next;\r\n                cnt++;\r\n            }\r\n            path.Add(u.Node);\r\n            cnt++;\r\n\r\n            //reset\r\n            this.Reset();\r\n\r\n            return cnt;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Reset the resolver so a new Step sequence could be started.\r\n        /// </summary>\r\n        public void Reset()\r\n        {\r\n            _steppedCompletedParentNode = null;\r\n\r\n            if(_tracked.Count > 0)\r\n            {\r\n                var e = _tracked.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    _pool.Release(e.Current);\r\n                }\r\n            }\r\n            _open.Clear();\r\n            _closed.Clear();\r\n            _tracked.Clear();\r\n            _calculating = false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private static ObjectCachePool<VertexInfo> _pool = new ObjectCachePool<VertexInfo>(-1, () => new VertexInfo(), (v) =>\r\n        {\r\n            v.Node = null;\r\n            v.Next = null;\r\n            v.g = 0f;\r\n            v.h = 0f;\r\n            v.f = 0f;\r\n        });\r\n\r\n        private class VertexInfo\r\n        {\r\n            public T Node;\r\n            public VertexInfo Next;\r\n            public float g;\r\n            public float h;\r\n            public float f;\r\n        }\r\n\r\n        private class VertexComparer : IComparer<VertexInfo>\r\n        {\r\n            public readonly static VertexComparer Default = new VertexComparer();\r\n\r\n            public int Compare(VertexInfo x, VertexInfo y)\r\n            {\r\n                return y.f.CompareTo(x.f);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Graphs/CovariantGraph.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Graphs\n{\n    public class CovariantGraph<TInner, TOuter> : IGraph<TOuter> where TInner : class, TOuter\n    {\n\n        #region Fields\n\n        private IGraph<TInner> _graph;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public CovariantGraph(IGraph<TInner> graph)\n        {\n            if (graph == null) throw new System.ArgumentNullException(\"graph\");\n            _graph = graph;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public IGraph<TInner> InnerGraph { get { return _graph; } }\n\n        #endregion\n\n        #region IGraph Interface\n\n        public int Count { get { return _graph.Count; } }\n\n        public IEnumerable<TOuter> GetNeighbours(TOuter node)\n        {\n            if (node != null && !(node is TInner)) return Enumerable.Empty<TOuter>();\n            return _graph.GetNeighbours(node as TInner).Cast<TOuter>();\n        }\n\n        public int GetNeighbours(TOuter node, ICollection<TOuter> buffer)\n        {\n            if (node != null && !(node is TInner)) return 0;\n\n            using (var coll = com.spacepuppy.Collections.TempCollection.GetList<TInner>())\n            {\n                int cnt = _graph.GetNeighbours(node as TInner, coll);\n                for(int i = 0; i < cnt; i++)\n                {\n                    buffer.Add(coll[i]);\n                }\n                return cnt;\n            }\n        }\n\n        public bool Contains(TOuter node)\n        {\n            if (node != null && !(node is TInner)) return false;\n\n            return _graph.Contains(node as TInner);\n        }\n\n        public IEnumerator<TOuter> GetEnumerator()\n        {\n            return _graph.Cast<TOuter>().GetEnumerator();\n        }\n\n        IEnumerator IEnumerable.GetEnumerator()\n        {\n            return _graph.GetEnumerator();\n        }\n\n        #endregion\n\n        public static CovariantGraph<TInner, TOuter> Sync(ref CovariantGraph<TInner, TOuter> covariant, IGraph<TInner> inner)\n        {\n            if (covariant == null || covariant.InnerGraph != inner)\n            {\n                covariant = new CovariantGraph<TInner, TOuter>(inner);\n            }\n\n            return covariant;\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyBase/Graphs/DijkstraPathResolver.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\n\r\nnamespace com.spacepuppy.Graphs\r\n{\r\n\r\n    public class DijkstraPathResolver<T> : IPathResolver<T> where T : class\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private IGraph<T> _graph;\r\n        private IHeuristic<T> _heuristic;\r\n        private BinaryHeap<VertexInfo> _open;\r\n        private List<T> _neighbours = new List<T>();\r\n\r\n        private T _start;\r\n        private T _goal;\r\n\r\n        private bool _calculating;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public DijkstraPathResolver(IGraph<T> graph, IHeuristic<T> heuristic)\r\n        {\r\n            _graph = graph;\r\n            _heuristic = heuristic;\r\n            _open = new BinaryHeap<VertexInfo>(graph.Count, VertexComparer.Default);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool IsWorking\r\n        {\r\n            get { return _calculating; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public T Start\r\n        {\r\n            get { return _start; }\r\n            set\r\n            {\r\n                if (_calculating) throw new InvalidOperationException(\"Cannot update start node when calculating.\");\r\n                _start = value;\r\n            }\r\n        }\r\n\r\n        public T Goal\r\n        {\r\n            get { return _goal; }\r\n            set\r\n            {\r\n                if (_calculating) throw new InvalidOperationException(\"Cannot update start node when calculating.\");\r\n                _goal = value;\r\n            }\r\n        }\r\n\r\n        public IList<T> Reduce()\r\n        {\r\n            if (_calculating) throw new InvalidOperationException(\"PathResolver is already running.\");\r\n            if (_graph == null || _heuristic == null || _start == null || _goal == null) throw new InvalidOperationException(\"PathResolver is not initialized.\");\r\n\r\n            var lst = new List<T>();\r\n            this.Reduce(lst);\r\n            return lst;\r\n        }\r\n\r\n        public int Reduce(IList<T> path)\r\n        {\r\n            if (_calculating) throw new InvalidOperationException(\"PathResolver is already running.\");\r\n            if (_graph == null || _heuristic == null || _start == null || _goal == null) throw new InvalidOperationException(\"PathResolver is not initialized.\");\r\n\r\n            _calculating = true;\r\n\r\n            try\r\n            {\r\n                _open.Clear();\r\n                _neighbours.Clear();\r\n\r\n                foreach (var n in _graph)\r\n                {\r\n                    float d = n == _goal ? 0f : float.PositiveInfinity;\r\n                    _open.Add(new VertexInfo()\r\n                    {\r\n                        Node = n,\r\n                        Next = null,\r\n                        Distance = d\r\n                    });\r\n                }\r\n\r\n                while (_open.Count > 0)\r\n                {\r\n                    var u = _open.Pop();\r\n                    if (u.Node == _start)\r\n                    {\r\n                        int cnt = 0;\r\n                        while (u.Next != null)\r\n                        {\r\n                            path.Add(u.Node);\r\n                            u = u.Next;\r\n                            cnt++;\r\n                        }\r\n                        path.Add(u.Node);\r\n                        return cnt + 1;\r\n                    }\r\n\r\n                    _graph.GetNeighbours(u.Node, _neighbours);\r\n                    var e = _neighbours.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        var n = e.Current;\r\n                        var index = GetInfo(_open, n);\r\n                        if (index < 0) continue;\r\n\r\n                        var d = u.Distance + _heuristic.Distance(u.Node, n) + _heuristic.Weight(n);\r\n                        if (d < _open[index].Distance)\r\n                        {\r\n                            _open[index].Distance = d;\r\n                            _open[index].Next = u;\r\n                            _open.Update(index);\r\n                        }\r\n                    }\r\n                    _neighbours.Clear();\r\n                }\r\n\r\n                return 0;\r\n            }\r\n            finally\r\n            {\r\n                _open.Clear();\r\n                _calculating = false;\r\n            }\r\n        }\r\n\r\n        private static int GetInfo(BinaryHeap<VertexInfo> heap, T node)\r\n        {\r\n            for (int i = 0; i < heap.Count; i++)\r\n            {\r\n                if (heap[i].Node == node) return i;\r\n            }\r\n            return -1;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private class VertexInfo\r\n        {\r\n            public T Node;\r\n            public VertexInfo Next;\r\n            public float Distance;\r\n        }\r\n\r\n        private class VertexComparer : IComparer<VertexInfo>\r\n        {\r\n            public readonly static VertexComparer Default = new VertexComparer();\r\n\r\n            public int Compare(VertexInfo x, VertexInfo y)\r\n            {\r\n                return y.Distance.CompareTo(x.Distance);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Graphs/Exceptions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Graphs\r\n{\r\n    public class NonMemberNodeException : ArgumentException\r\n    {\r\n\r\n        public NonMemberNodeException()\r\n            : this(\"Node must be a member of the graph.\")\r\n        {\r\n\r\n        }\r\n\r\n        public NonMemberNodeException(string message)\r\n            : base(message)\r\n        {\r\n\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Graphs/GridGraph.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Graphs\r\n{\r\n\r\n    /// <summary>\r\n    /// Represents a 2d-grid that can be accessed as an IGraph.\r\n    /// \r\n    /// Its nodes can be accessed by index from 0->Area, traversing over width by height.\r\n    /// \r\n    /// Or its nodes can be accessed in an x,y grid where x correlates to a column along the width, \r\n    /// and y correlates to a row along the length. If x or y are out of range default(T) is returned. \r\n    /// This is as opposed to index access which throws exceptions.\r\n    /// </summary>\r\n    /// <typeparam name=\"T\"></typeparam>\r\n    public class GridGraph<T> : IGraph<T>, IList<T>\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        private int _rowCount;\r\n        private int _colCount;\r\n        private T[] _data;\r\n        private IEqualityComparer<T> _comparer;\r\n        private bool _includeDiagonals;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n        \r\n        public GridGraph(int width, int length, bool includeDiagonals)\r\n        {\r\n            _rowCount = length;\r\n            _colCount = width;\r\n            _data = new T[Math.Max(_rowCount * _colCount, 0)];\r\n            _includeDiagonals = includeDiagonals;\r\n            _comparer = EqualityComparer<T>.Default;\r\n        }\r\n\r\n        public GridGraph(int width, int length, bool includeDiagonals, IEqualityComparer<T> comparer)\r\n        {\r\n            _rowCount = length;\r\n            _colCount = width;\r\n            _data = new T[Math.Max(_rowCount * _colCount, 0)];\r\n            _includeDiagonals = includeDiagonals;\r\n            _comparer = comparer ?? EqualityComparer<T>.Default;\r\n        }\r\n\r\n        public GridGraph(int width, int length, bool includeDiagonals, IEqualityComparer<T> comparer, IEnumerable<T> sequence)\r\n        {\r\n            _comparer = comparer ?? EqualityComparer<T>.Default;\r\n\r\n            this.Copy(width, length, includeDiagonals, sequence);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        /// <summary>\r\n        /// The width of the grid\r\n        /// </summary>\r\n        public int Width\r\n        {\r\n            get { return _colCount; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The height of the grid\r\n        /// </summary>\r\n        public int Length\r\n        {\r\n            get { return _rowCount; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// If diagonals are considered neighbours when calling 'GetNeighbours'. \r\n        /// Calling GetNeighbour/s with a GridNeighbour enum ignores this property.\r\n        /// </summary>\r\n        public bool IncludeDiagonals\r\n        {\r\n            get { return _includeDiagonals; }\r\n            set { _includeDiagonals = value; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Access a node by its x,y position in the grid.\r\n        /// Returns null if out of range.\r\n        /// </summary>\r\n        /// <param name=\"x\">The position along the width</param>\r\n        /// <param name=\"y\">The position along the length</param>\r\n        /// <returns></returns>\r\n        public T this[int x, int y]\r\n        {\r\n            get\r\n            {\r\n                if (x < 0 || x >= _colCount) return default(T);\r\n                if (y < 0 || y >= _rowCount) return default(T);\r\n\r\n                return _data[y * _colCount + x];\r\n            }\r\n            set\r\n            {\r\n                if (x < 0 || x >= _colCount) return;\r\n                if (y < 0 || y >= _rowCount) return;\r\n\r\n                _data[y * _colCount + x] = value;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Comparer used when comparing nodes.\r\n        /// </summary>\r\n        public IEqualityComparer<T> Comparer\r\n        {\r\n            get { return _comparer; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n        \r\n        public bool GetXYOfIndex(int index, out int x, out int y)\r\n        {\r\n            if(index < 0)\r\n            {\r\n                x = -1;\r\n                y = -1;\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                x = index % _colCount;\r\n                y = index / _colCount;\r\n                return true;\r\n            }\r\n        }\r\n\r\n        public bool GetXY(T node, out int x, out int y)\r\n        {\r\n            int index = this.IndexOf(node);\r\n            if(index < 0)\r\n            {\r\n                x = -1;\r\n                y = -1;\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                x = index % _colCount;\r\n                y = index / _colCount;\r\n                return true;\r\n            }\r\n        }\r\n\r\n        public T GetNeighbour(int x, int y, GridNeighbour side)\r\n        {\r\n            switch (side)\r\n            {\r\n                case GridNeighbour.North:\r\n                    return this[x, y + 1];\r\n                case GridNeighbour.NE:\r\n                    return this[x + 1, y + 1];\r\n                case GridNeighbour.East:\r\n                    return this[x + 1, y];\r\n                case GridNeighbour.SE:\r\n                    return this[x + 1, y - 1];\r\n                case GridNeighbour.South:\r\n                    return this[x, y - 1];\r\n                case GridNeighbour.SW:\r\n                    return this[x - 1, y - 1];\r\n                case GridNeighbour.West:\r\n                    return this[x - 1, y];\r\n                case GridNeighbour.NW:\r\n                    return this[x - 1, y + 1];\r\n                default:\r\n                    return default(T);\r\n            }\r\n        }\r\n\r\n        public T GetNeighbourOfIndex(int index, GridNeighbour side)\r\n        {\r\n            return GetNeighbour(index % _colCount, index / _colCount, side);\r\n        }\r\n\r\n        public T GetNeighbour(T node, GridNeighbour side)\r\n        {\r\n            if (node == null) throw new ArgumentNullException(\"node\");\r\n\r\n            int index = this.IndexOf(node);\r\n            if (index < 0) return default(T);\r\n\r\n            return GetNeighbour(index % _colCount, index / _colCount, side);\r\n        }\r\n        \r\n\r\n\r\n        public IEnumerable<T> GetNeighboursOfIndex(int index)\r\n        {\r\n            if (index < 0 || index >= _data.Length) throw new IndexOutOfRangeException();\r\n            return this.GetNeighbours(index % _colCount, index / _colCount);\r\n        }\r\n\r\n        public IEnumerable<T> GetNeighbours(int x, int y)\r\n        {\r\n            if (x >= 0 && x < _colCount && y > -1 && y < _rowCount - 1)\r\n                yield return this[x, y + 1]; //n\r\n            if (_includeDiagonals && x >= -1 && x < _colCount - 1 && y > -1 && y < _rowCount - 1)\r\n                yield return this[x + 1, y + 1]; //ne\r\n            if (x >= -1 && x < _colCount - 1 && y >= 0 && y < _rowCount)\r\n                yield return this[x + 1, y]; //e\r\n            if (_includeDiagonals && x >= -1 && x < _colCount - 1 && y > 0 && y < _rowCount)\r\n                yield return this[x + 1, y - 1]; //se\r\n            if (x >= 0 && x < _colCount && y > 0 && y <= _rowCount)\r\n                yield return this[x, y - 1]; //s\r\n            if (_includeDiagonals && x > 0 && x <= _colCount && y > 0 && y <= _rowCount)\r\n                yield return this[x - 1, y - 1]; //sw\r\n            if (x > 0 && x <= _colCount && y >= 0 && y < _rowCount)\r\n                yield return this[x - 1, y]; //w\r\n            if (_includeDiagonals && x > 0 && x <= _colCount && y > -1 && y < _rowCount - 1)\r\n                yield return this[x - 1, y + 1]; //nw\r\n        }\r\n\r\n        public int GetNeighboursOfIndex(int index, ICollection<T> buffer)\r\n        {\r\n            if (index < 0 || index >= _data.Length) throw new IndexOutOfRangeException();\r\n            return this.GetNeighbours(index % _colCount, index / _colCount, buffer);\r\n        }\r\n\r\n        public int GetNeighbours(int x, int y, ICollection<T> buffer)\r\n        {\r\n            if (buffer == null) throw new ArgumentNullException(\"buffer\");\r\n\r\n            int cnt = buffer.Count;\r\n            if (x >= 0 && x < _colCount && y > -1 && y < _rowCount - 1)\r\n                buffer.Add(this[x, y + 1]); //n\r\n            if (_includeDiagonals && x >= -1 && x < _colCount - 1 && y > -1 && y < _rowCount - 1)\r\n                buffer.Add(this[x + 1, y + 1]); //ne\r\n            if (x >= -1 && x < _colCount - 1 && y >= 0 && y < _rowCount)\r\n                buffer.Add(this[x + 1, y]); //e\r\n            if (_includeDiagonals && x >= -1 && x < _colCount - 1 && y > 0 && y < _rowCount)\r\n                buffer.Add(this[x + 1, y - 1]); //se\r\n            if (x >= 0 && x < _colCount && y > 0 && y <= _rowCount)\r\n                buffer.Add(this[x, y - 1]); //s\r\n            if (_includeDiagonals && x > 0 && x <= _colCount && y > 0 && y <= _rowCount)\r\n                buffer.Add(this[x - 1, y - 1]); //sw\r\n            if (x > 0 && x <= _colCount && y >= 0 && y < _rowCount)\r\n                buffer.Add(this[x - 1, y]); //w\r\n            if (_includeDiagonals && x > 0 && x <= _colCount && y > -1 && y < _rowCount - 1)\r\n                buffer.Add(this[x - 1, y + 1]); //nw\r\n\r\n            return buffer.Count - cnt;\r\n        }\r\n\r\n\r\n\r\n        public IEnumerable<T> GetNeighbours(int x, int y, GridNeighbour sides)\r\n        {\r\n            int e = (int)sides;\r\n            for (int i = 0; i < 8; i++)\r\n            {\r\n                int f = 1 << i;\r\n                if ((e & (1 << i)) != 0) yield return this.GetNeighbour(x, y, (GridNeighbour)f);\r\n            }\r\n        }\r\n\r\n        public int GetNeighbours(int x, int y, GridNeighbour sides, ICollection<T> buffer)\r\n        {\r\n            if (buffer == null) throw new ArgumentNullException(\"buffer\");\r\n\r\n            int cnt = 0;\r\n            int e = (int)sides;\r\n            for (int i = 0; i < 8; i++)\r\n            {\r\n                int f = 1 << i;\r\n                if ((e & (1 << i)) != 0)\r\n                {\r\n                    buffer.Add(this.GetNeighbour(x, y, (GridNeighbour)f));\r\n                    cnt++;\r\n                }\r\n            }\r\n            return cnt;\r\n        }\r\n\r\n        public IEnumerable<T> GetNeighboursOfIndex(int index, GridNeighbour sides)\r\n        {\r\n            return GetNeighbours(index % _colCount, index / _colCount, sides);\r\n        }\r\n\r\n        public int GetNeighboursOfIndex(int index, GridNeighbour sides, ICollection<T> buffer)\r\n        {\r\n            return GetNeighbours(index % _colCount, index / _colCount, sides, buffer);\r\n        }\r\n\r\n        public IEnumerable<T> GetNeighbours(T node, GridNeighbour sides) \r\n        {\r\n            if (node == null) return Enumerable.Empty<T>();\r\n\r\n            int index = this.IndexOf(node);\r\n            if (index < 0) return Enumerable.Empty<T>();\r\n\r\n            return GetNeighbours(index % _colCount, index / _colCount, sides);\r\n        }\r\n\r\n        public int GetNeighbours(T node, GridNeighbour sides, ICollection<T> buffer)\r\n        {\r\n            if (node == null) return 0;\r\n\r\n            int index = this.IndexOf(node);\r\n            if (index < 0) return 0;\r\n\r\n            return GetNeighbours(index % _colCount, index / _colCount, sides, buffer);\r\n        }\r\n\r\n\r\n\r\n        public IEnumerable<int> GetNeighbourIndicesOfIndex(int index)\r\n        {\r\n            int tx, ty;\r\n            this.GetXYOfIndex(index, out tx, out ty);\r\n\r\n            return this.GetNeighbourIndices(tx, ty);\r\n        }\r\n\r\n        public IEnumerable<int> GetNeighbourIndices(int x, int y)\r\n        {\r\n            if (x >= 0 && x < _colCount && y > -1 && y < _rowCount - 1)\r\n                yield return (y + 1) * _colCount + x; // this[x, y + 1]; //n\r\n            if (_includeDiagonals && x >= -1 && x < _colCount - 1 && y > -1 && y < _rowCount - 1)\r\n                yield return (y + 1) * _colCount + (x + 1); // this[x + 1, y + 1]; //ne\r\n            if (x >= -1 && x < _colCount - 1 && y >= 0 && y < _rowCount)\r\n                yield return y * _colCount + (x + 1); //this[x + 1, y]; //e\r\n            if (_includeDiagonals && x >= -1 && x < _colCount - 1 && y > 0 && y < _rowCount)\r\n                yield return (y - 1) * _colCount + (x + 1); // this[x + 1, y - 1]; //se\r\n            if (x >= 0 && x < _colCount && y > 0 && y <= _rowCount)\r\n                yield return (y - 1) * _colCount + x; // this[x, y - 1]; //s\r\n            if (_includeDiagonals && x > 0 && x <= _colCount && y > 0 && y <= _rowCount)\r\n                yield return (y - 1) * _colCount + (x - 1); // this[x - 1, y - 1]; //sw\r\n            if (x > 0 && x <= _colCount && y >= 0 && y < _rowCount)\r\n                yield return y * _colCount + (x - 1); // this[x - 1, y]; //w\r\n            if (_includeDiagonals && x > 0 && x <= _colCount && y > -1 && y < _rowCount - 1)\r\n                yield return (y + 1) * _colCount + (x - 1); // this[x - 1, y + 1]; //nw\r\n        }\r\n\r\n\r\n        /// <summary>\r\n        /// Calculates which side of 'from' that 'to' is on.\r\n        /// </summary>\r\n        /// <param name=\"from\"></param>\r\n        /// <param name=\"to\"></param>\r\n        /// <returns></returns>\r\n        public GridNeighbour GetSide(T from, T to)\r\n        {\r\n            int index = this.IndexOf(from);\r\n            if (index < 0) return GridNeighbour.None;\r\n            if (!this.Contains(to)) return GridNeighbour.None;\r\n\r\n            int x = index % _colCount;\r\n            int y = index / _colCount;\r\n\r\n            for(int i = 0; i < 8; i++)\r\n            {\r\n                GridNeighbour f = (GridNeighbour)(1 << i);\r\n                if (_comparer.Equals(this.GetNeighbour(x, y, f), to)) return f;\r\n            }\r\n\r\n            return GridNeighbour.None;\r\n        }\r\n\r\n        public GridNeighbour GetSideOfIndex(int from, int to)\r\n        {\r\n            if (from < 0 || from >= this.Count) return GridNeighbour.None;\r\n            if (to < 0 || to >= this.Count) return GridNeighbour.None;\r\n\r\n            int fx = from % _colCount;\r\n            int fy = from / _colCount;\r\n\r\n            int tx = to % _colCount;\r\n            int ty = to / _colCount;\r\n\r\n            \r\n            if(tx == fx)\r\n            {\r\n                if (ty == fy - 1)\r\n                    return GridNeighbour.South;\r\n                else if (ty == fy + 1)\r\n                    return GridNeighbour.North;\r\n            }\r\n            else if (tx == fx - 1)\r\n            {\r\n                if (ty == fy)\r\n                    return GridNeighbour.West;\r\n                else if (ty == fy - 1)\r\n                    return GridNeighbour.SW;\r\n                else if (ty == fy + 1)\r\n                    return GridNeighbour.NW;\r\n            }\r\n            else if (tx == fx + 1)\r\n            {\r\n                if (ty == fy)\r\n                    return GridNeighbour.East;\r\n                else if (ty == fy - 1)\r\n                    return GridNeighbour.SE;\r\n                else if (ty == fy + 1)\r\n                    return GridNeighbour.NE;\r\n            }\r\n\r\n            return GridNeighbour.None;\r\n        }\r\n\r\n\r\n        public void Resize(int width, int length)\r\n        {\r\n            this.Resize(this.Width, this.Length, this.IncludeDiagonals);\r\n        }\r\n\r\n        public void Resize(int width, int length, bool includeDiagonals)\r\n        {\r\n            var oarr = _data;\r\n            var owid = Math.Min(this.Width, width);\r\n            var olen = Math.Min(this.Length, length);\r\n\r\n            _rowCount = length;\r\n            _colCount = width;\r\n            _data = new T[Math.Max(_rowCount * _colCount, 0)];\r\n            _includeDiagonals = includeDiagonals;\r\n\r\n            if(oarr != null)\r\n            {\r\n                for(int i = 0; i < owid; i++)\r\n                {\r\n                    for(int j = 0; j < olen; j++)\r\n                    {\r\n                        _data[j * _colCount + i] = oarr[j * _colCount + i];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Copies the tiles from another enumerable. The indexing of the enumerable should match this graph.\r\n        /// </summary>\r\n        /// <param name=\"sequence\"></param>\r\n        public void Copy(IEnumerable<T> sequence)\r\n        {\r\n            if (_data.Length == 0) return;\r\n\r\n            int cnt = 0;\r\n            foreach (var t in sequence)\r\n            {\r\n                _data[cnt] = t;\r\n\r\n                cnt++;\r\n                if (cnt >= _data.Length) break;\r\n            }\r\n        }\r\n\r\n        public void Copy(int width, int length, IEnumerable<T> sequence)\r\n        {\r\n            this.Copy(width, length, this.IncludeDiagonals, sequence);\r\n        }\r\n\r\n        public void Copy(int width, int length, bool includeDiagonals, IEnumerable<T> sequence)\r\n        {\r\n            _rowCount = length;\r\n            _colCount = width;\r\n            _data = new T[Math.Max(_rowCount * _colCount, 0)];\r\n            _includeDiagonals = includeDiagonals;\r\n\r\n            if (_data.Length > 0)\r\n            {\r\n                int cnt = 0;\r\n                foreach (var t in sequence)\r\n                {\r\n                    _data[cnt] = t;\r\n\r\n                    cnt++;\r\n                    if (cnt >= _data.Length) break;\r\n                }\r\n            }\r\n        }\r\n\r\n        public T[] ToArray()\r\n        {\r\n            var arr = new T[Math.Max(_colCount * _rowCount, 0)];\r\n            Array.Copy(_data, 0, arr, 0, arr.Length);\r\n            return arr;\r\n        }\r\n\r\n        public T[] ToArray(int width, int length)\r\n        {\r\n            var arr = new T[Math.Max(width * length, 0)];\r\n            width = Math.Min(width, this.Width);\r\n            length = Math.Min(length, this.Length);\r\n            for(int i = 0; i < width; i++)\r\n            {\r\n                for(int j = 0; j < length; j++)\r\n                {\r\n                    arr[j * _colCount + i] = _data[j * _colCount + i];\r\n                }\r\n            }\r\n            return arr;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IList Interface\r\n\r\n        public T this[int index]\r\n        {\r\n            get\r\n            {\r\n                return _data[index];\r\n            }\r\n\r\n            set\r\n            {\r\n                _data[index] = value;\r\n            }\r\n        }\r\n\r\n        public int Count\r\n        {\r\n            get\r\n            {\r\n                return _data.Length;\r\n            }\r\n        }\r\n\r\n        bool ICollection<T>.IsReadOnly\r\n        {\r\n            get\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n\r\n        public int IndexOf(T item)\r\n        {\r\n            for(int i = 0; i < _data.Length; i++)\r\n            {\r\n                if (_comparer.Equals(_data[i], item)) return i;\r\n            }\r\n            return -1;\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            Array.Clear(_data, 0, _data.Length);\r\n        }\r\n\r\n        public bool Contains(T item)\r\n        {\r\n            for(int i = 0; i < _data.Length; i++)\r\n            {\r\n                if (_comparer.Equals(_data[i], item)) return true;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        public void CopyTo(T[] array, int arrayIndex)\r\n        {\r\n            System.Array.Copy(_data, 0, array, arrayIndex, _data.Length);\r\n        }\r\n\r\n        public bool Remove(T item)\r\n        {\r\n            if (item == null) return false;\r\n\r\n            bool result = false;\r\n            for (int i = 0; i < _data.Length; i++)\r\n            {\r\n                if (_comparer.Equals(_data[i], item))\r\n                {\r\n                    result = true;\r\n                    _data[i] = default(T);\r\n                }\r\n            }\r\n            return result;\r\n        }\r\n\r\n        public void RemoveAt(int index)\r\n        {\r\n            _data[index] = default(T);\r\n        }\r\n\r\n        void IList<T>.Insert(int index, T item)\r\n        {\r\n            throw new System.NotSupportedException();\r\n        }\r\n\r\n        void ICollection<T>.Add(T item)\r\n        {\r\n            throw new System.NotSupportedException();\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region IGraph Interface\r\n\r\n        int IGraph<T>.Count\r\n        {\r\n            get { return _data.Length; }\r\n        }\r\n\r\n        public IEnumerable<T> GetNeighbours(T node)\r\n        {\r\n            if (node == null) throw new ArgumentNullException(\"node\");\r\n\r\n            int index = this.IndexOf(node);\r\n            if (index < 0) return Enumerable.Empty<T>();\r\n\r\n            return this.GetNeighbours(index % _colCount, index / _colCount);\r\n        }\r\n        \r\n        public int GetNeighbours(T node, ICollection<T> buffer)\r\n        {\r\n            if (buffer == null) throw new ArgumentNullException(\"buffer\");\r\n\r\n            int index = this.IndexOf(node);\r\n            if (index < 0) return 0;\r\n\r\n            return this.GetNeighbours(index % _colCount, index / _colCount, buffer);\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public Enumerator GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator IEnumerable.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator<T> IEnumerable<T>.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        public struct Enumerator : IEnumerator<T>\r\n        {\r\n\r\n            private T[] _graph;\r\n            private int _index;\r\n            private T _current;\r\n\r\n            public Enumerator(GridGraph<T> graph)\r\n            {\r\n                if (graph == null) throw new ArgumentNullException(\"graph\");\r\n                _graph = graph._data;\r\n                _index = 0;\r\n                _current = default(T);\r\n            }\r\n\r\n            public T Current\r\n            {\r\n                get\r\n                {\r\n                    return _current;\r\n                }\r\n            }\r\n\r\n            object IEnumerator.Current\r\n            {\r\n                get\r\n                {\r\n                    return _current;\r\n                }\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                _graph = null;\r\n                _index = 0;\r\n                _current = default(T);\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                if (_graph == null) return false;\r\n                if (_index >= _graph.Length) return false;\r\n\r\n                _current = _graph[_index];\r\n                _index++;\r\n                return true;\r\n            }\r\n\r\n            public void Reset()\r\n            {\r\n                _index = 0;\r\n                _current = default(T);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Graphs/GridNeighbour.cs",
    "content": "﻿using System;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Graphs\r\n{\r\n    [System.Flags]\r\n    public enum GridNeighbour : byte\r\n    {\r\n        None = 0,\r\n        North = 1,\r\n        N = 1,\r\n        NE = 2,\r\n        East = 4,\r\n        E = 4,\r\n        SE = 8,\r\n        South = 16,\r\n        S = 16,\r\n        SW = 32,\r\n        West = 64,\r\n        W = 64,\r\n        NW = 128,\r\n\r\n        NESW = 85,\r\n        Diagonals = 170,\r\n        All = 255\r\n    }\r\n\r\n    public static class GridNeighbourUtil\r\n    {\r\n\r\n        /// <summary>\r\n        /// Returns the side opposite of input.\r\n        /// </summary>\r\n        /// <param name=\"side\"></param>\r\n        /// <returns></returns>\r\n        public static GridNeighbour Opposite(this GridNeighbour side)\r\n        {\r\n            int e = (int)side;\r\n            int result = 0;\r\n            for(int i = 0; i < 8; i++)\r\n            {\r\n                int f = 1 << i;\r\n                if ((e & (1 << i)) != 0) result |= (i < 4) ? f << 4 : f >> 4;\r\n            }\r\n            return (GridNeighbour)result;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Rotates side x number of 45 degree turns around the cardinal directions clockwise.\r\n        /// North turned twice is East, South turned -1 is SouthEast.\r\n        /// </summary>\r\n        /// <param name=\"side\"></param>\r\n        /// <param name=\"turns\"></param>\r\n        /// <returns></returns>\r\n        public static GridNeighbour Rotate(this GridNeighbour side, int turns)\r\n        {\r\n            turns = turns % 8;\r\n            if (turns == 0) return side;\r\n\r\n            if (turns < 0)\r\n            {\r\n                turns = System.Math.Abs(turns);\r\n                int i = (int)side << (8 - turns);\r\n                i = (i & 255) | (i >> 8);\r\n                return (GridNeighbour)i;\r\n            }\r\n            else\r\n            {\r\n                return (GridNeighbour)(((int)side << turns) % 255);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        /// Gets the first side reached rotating clockwise. \r\n        /// If All, North is returned.\r\n        /// If None, None is returned.\r\n        /// </summary>\r\n        /// <param name=\"side\"></param>\r\n        /// <returns></returns>\r\n        public static GridNeighbour FirstSide(this GridNeighbour side)\r\n        {\r\n            if (side == GridNeighbour.All) return GridNeighbour.North;\r\n            if (side == GridNeighbour.None) return GridNeighbour.None;\r\n\r\n            GridNeighbour start = GridNeighbour.North;\r\n            if ((side & start) != 0) //if start\r\n            {\r\n                //if (!side.HasFlag(GridNeighbour.North.Rotate(-1))) return GridNeighbour.North;\r\n                if ((side & GridNeighbour.North.Rotate(-1)) == 0) return GridNeighbour.North;\r\n\r\n                for (int i = 1; i < 8; i++)\r\n                {\r\n                    //if(!side.HasFlag(1 << i))\r\n                    if(((int)side & (1 << i)) == 0)\r\n                    {\r\n                        start = (GridNeighbour)(1 << (i + 1));\r\n                    }\r\n                }\r\n            }\r\n\r\n            while ((side & start) == 0) //while not start\r\n            {\r\n                start = (GridNeighbour)((int)start << 1);\r\n            }\r\n            return start;\r\n        }\r\n        \r\n    }\r\n    \r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Graphs/HexGraph.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Graphs\r\n{\r\n    public class HexGraph<T> : IGraph<T>, IList<T>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private int _rowCount;\r\n        private int _nominalWidth;\r\n        private int _doubleWidth;\r\n        private T[] _data;\r\n        private IEqualityComparer<T> _comparer;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public HexGraph(int rowCount, int nominalWidth)\r\n        {\r\n            _rowCount = rowCount;\r\n            _nominalWidth = nominalWidth;\r\n            _doubleWidth = _nominalWidth + _nominalWidth - 1;\r\n            int cnt = (int)Math.Ceiling((double)_doubleWidth * (double)rowCount / 2d);\r\n            _data = new T[Math.Max(cnt, 0)];\r\n            _comparer = EqualityComparer<T>.Default;\r\n        }\r\n\r\n        public HexGraph(int rowCount, int nominalWidth, IEqualityComparer<T> comparer)\r\n        {\r\n            _rowCount = rowCount;\r\n            _nominalWidth = nominalWidth;\r\n            _doubleWidth = _nominalWidth + _nominalWidth - 1;\r\n            int cnt = (int)Math.Ceiling((double)_doubleWidth * (double)rowCount / 2d);\r\n            _data = new T[Math.Max(cnt, 0)];\r\n            _comparer = comparer ?? EqualityComparer<T>.Default;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int RowCount\r\n        {\r\n            get { return _rowCount; }\r\n        }\r\n\r\n        public int NominalWidth\r\n        {\r\n            get { return _nominalWidth; }\r\n        }\r\n\r\n        public T this[int row, int index]\r\n        {\r\n            get\r\n            {\r\n                if (row % 2 == 0)\r\n                {\r\n                    //if even row\r\n                    return _data[(_doubleWidth * row / 2) + index];\r\n                }\r\n                else\r\n                {\r\n                    //if odd row\r\n                    return _data[(_doubleWidth * (row - 1) / 2) + _nominalWidth + index];\r\n                }\r\n            }\r\n            set\r\n            {\r\n                if (row % 2 == 0)\r\n                {\r\n                    //if even row\r\n                    _data[(_doubleWidth * row / 2) + index] = value;\r\n                }\r\n                else\r\n                {\r\n                    //if odd row\r\n                    _data[(_doubleWidth * (row - 1) / 2) + _nominalWidth + index] = value;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public IEnumerable<T> GetNeighbours(int row, int index)\r\n        {\r\n            if (row % 2 == 0)\r\n            {\r\n                //if even row\r\n                return this.GetNeighbours((_doubleWidth * row / 2) + index);\r\n            }\r\n            else\r\n            {\r\n                //if odd row\r\n                return this.GetNeighbours((_doubleWidth * (row - 1) / 2) + _nominalWidth + index);\r\n            }\r\n        }\r\n\r\n        public int GetNeighbours(int row, int index, ICollection<T> buffer)\r\n        {\r\n            if (row % 2 == 0)\r\n            {\r\n                //if even row\r\n                return this.GetNeighbours((_doubleWidth * row / 2) + index, buffer);\r\n            }\r\n            else\r\n            {\r\n                //if odd row\r\n                return this.GetNeighbours((_doubleWidth * (row - 1) / 2) + _nominalWidth + index, buffer);\r\n            }\r\n        }\r\n\r\n        public IEnumerable<T> GetNeighbours(int index)\r\n        {\r\n            if (index < 0 || index >= _data.Length) yield break;\r\n\r\n            int row = index / _doubleWidth;\r\n            int rowIndex = index % _doubleWidth;\r\n            if (rowIndex >= _nominalWidth)\r\n            {\r\n                row++;\r\n                rowIndex -= _nominalWidth;\r\n            }\r\n            int rowWidth = (row % 2 == 0) ? _nominalWidth : _nominalWidth - 1;\r\n\r\n            int low = _nominalWidth - 1;\r\n            int high = _nominalWidth;\r\n            int i;\r\n\r\n            i = index - high;\r\n            if (i >= 0) yield return _data[i];\r\n            i = index - low;\r\n            if (i >= 0) yield return _data[i];\r\n            if (rowIndex > 0) yield return _data[index - 1];\r\n            if (rowIndex < rowWidth - 1) yield return _data[index + 1];\r\n            i = index + low;\r\n            if (i < _data.Length) yield return _data[i];\r\n            i = index + high;\r\n            if (i < _data.Length) yield return _data[i];\r\n        }\r\n\r\n        public int GetNeighbours(int index, ICollection<T> buffer)\r\n        {\r\n            if (buffer == null) throw new ArgumentNullException(\"buffer\");\r\n            if (index < 0 || index >= _data.Length) return 0;\r\n\r\n            int row = index / _doubleWidth;\r\n            int rowIndex = index % _doubleWidth;\r\n            if (rowIndex >= _nominalWidth)\r\n            {\r\n                row++;\r\n                rowIndex -= _nominalWidth;\r\n            }\r\n            int rowWidth = (row % 2 == 0) ? _nominalWidth : _nominalWidth - 1;\r\n\r\n            int low = _nominalWidth - 1;\r\n            int high = _nominalWidth;\r\n            int i;\r\n            int cnt = 0;\r\n\r\n            i = index - high;\r\n            if (i >= 0)\r\n            {\r\n                cnt++;\r\n                buffer.Add(_data[i]);\r\n            }\r\n            i = index - low;\r\n            if (i >= 0)\r\n            {\r\n                cnt++;\r\n                buffer.Add(_data[i]);\r\n            }\r\n            if (rowIndex > 0)\r\n            {\r\n                cnt++;\r\n                buffer.Add(_data[index - 1]);\r\n            }\r\n            if (rowIndex < rowWidth - 1)\r\n            {\r\n                cnt++;\r\n                buffer.Add(_data[index + 1]);\r\n            }\r\n            i = index + low;\r\n            if (i < _data.Length)\r\n            {\r\n                cnt++;\r\n                buffer.Add(_data[i]);\r\n            }\r\n            i = index + high;\r\n            if (i < _data.Length)\r\n            {\r\n                cnt++;\r\n                buffer.Add(_data[i]);\r\n            }\r\n\r\n            return cnt;\r\n        }\r\n\r\n        private void GetCoords(int index, out int row, out int rowIndex)\r\n        {\r\n            row = index / _doubleWidth;\r\n            rowIndex = index % _doubleWidth;\r\n            if (rowIndex >= _nominalWidth)\r\n            {\r\n                row++;\r\n                rowIndex -= _nominalWidth;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IList Interface\r\n\r\n        public T this[int index]\r\n        {\r\n            get\r\n            {\r\n                return _data[index];\r\n            }\r\n\r\n            set\r\n            {\r\n                _data[index] = value;\r\n            }\r\n        }\r\n\r\n        public int Count\r\n        {\r\n            get\r\n            {\r\n                return _data.Length;\r\n            }\r\n        }\r\n\r\n        bool ICollection<T>.IsReadOnly\r\n        {\r\n            get\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n\r\n        public int IndexOf(T item)\r\n        {\r\n            for (int i = 0; i < _data.Length; i++)\r\n            {\r\n                if (_comparer.Equals(_data[i], item)) return i;\r\n            }\r\n            return -1;\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            Array.Clear(_data, 0, _data.Length);\r\n        }\r\n\r\n        public bool Contains(T item)\r\n        {\r\n            for (int i = 0; i < _data.Length; i++)\r\n            {\r\n                if (_comparer.Equals(_data[i], item)) return true;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        public void CopyTo(T[] array, int arrayIndex)\r\n        {\r\n            System.Array.Copy(_data, 0, array, arrayIndex, _data.Length);\r\n        }\r\n\r\n        public bool Remove(T item)\r\n        {\r\n            if (item == null) return false;\r\n\r\n            bool result = false;\r\n            for (int i = 0; i < _data.Length; i++)\r\n            {\r\n                if (_comparer.Equals(_data[i], item))\r\n                {\r\n                    result = true;\r\n                    _data[i] = default(T);\r\n                }\r\n            }\r\n            return result;\r\n        }\r\n\r\n        public void RemoveAt(int index)\r\n        {\r\n            _data[index] = default(T);\r\n        }\r\n\r\n        void IList<T>.Insert(int index, T item)\r\n        {\r\n            throw new System.NotSupportedException();\r\n        }\r\n\r\n        void ICollection<T>.Add(T item)\r\n        {\r\n            throw new System.NotSupportedException();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IGraph Interface\r\n\r\n        int IGraph<T>.Count\r\n        {\r\n            get { return _data.Length; }\r\n        }\r\n\r\n        public IEnumerable<T> GetNeighbours(T node)\r\n        {\r\n            if (node == null) throw new ArgumentNullException(\"node\");\r\n\r\n            int index = this.IndexOf(node);\r\n            if (index < 0) return Enumerable.Empty<T>();\r\n            \r\n            return this.GetNeighbours(index);\r\n        }\r\n\r\n        public int GetNeighbours(T node, ICollection<T> buffer)\r\n        {\r\n            if (buffer == null) throw new ArgumentNullException(\"buffer\");\r\n\r\n            int index = this.IndexOf(node);\r\n            if (index < 0) return 0;\r\n            \r\n            return this.GetNeighbours(index, buffer);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public Enumerator GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator IEnumerable.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator<T> IEnumerable<T>.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        public struct Enumerator : IEnumerator<T>\r\n        {\r\n\r\n            private T[] _graph;\r\n            private int _index;\r\n            private T _current;\r\n\r\n            public Enumerator(HexGraph<T> graph)\r\n            {\r\n                if (graph == null) throw new ArgumentNullException(\"graph\");\r\n                _graph = graph._data;\r\n                _index = 0;\r\n                _current = default(T);\r\n            }\r\n\r\n            public T Current\r\n            {\r\n                get\r\n                {\r\n                    return _current;\r\n                }\r\n            }\r\n\r\n            object IEnumerator.Current\r\n            {\r\n                get\r\n                {\r\n                    return _current;\r\n                }\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                _graph = null;\r\n                _index = 0;\r\n                _current = default(T);\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                if (_graph == null) return false;\r\n                if (_index >= _graph.Length) return false;\r\n\r\n                _current = _graph[_index];\r\n                _index++;\r\n                return true;\r\n            }\r\n\r\n            public void Reset()\r\n            {\r\n                _index = 0;\r\n                _current = default(T);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Graphs/IGraph.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Graphs\r\n{\r\n\r\n    public interface IGraph<T> : IEnumerable<T>\r\n    {\r\n\r\n        int Count { get; }\r\n\r\n        IEnumerable<T> GetNeighbours(T node);\r\n        int GetNeighbours(T node, ICollection<T> buffer);\r\n        bool Contains(T node);\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Graphs/IHeuristic.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Graphs\r\n{\r\n    public interface IHeuristic<T>\r\n    {\r\n        float Weight(T n);\r\n        float Distance(T x, T y);\r\n    }\r\n\r\n    public class ComponentHeuristic<T> : IHeuristic<T> where T : IComponent\r\n    {\r\n\r\n        private static ComponentHeuristic<T> _default;\r\n        public static ComponentHeuristic<T> Default\r\n        {\r\n            get\r\n            {\r\n                if (_default == null) _default = new ComponentHeuristic<T>();\r\n                return _default;\r\n            }\r\n        }\r\n\r\n\r\n        public virtual float Weight(T n)\r\n        {\r\n            return 0f;\r\n        }\r\n\r\n        public virtual float Distance(T x, T y)\r\n        {\r\n            return (x.transform.position - y.transform.position).sqrMagnitude;\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Graphs/INode.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Graphs\r\n{\r\n\r\n    /// <summary>\r\n    /// Contract for a graph node that can determine its own neighbours.\r\n    /// \r\n    /// When implementing this contract T should be typed as itself.\r\n    /// </summary>\r\n    /// <typeparam name=\"T\"></typeparam>\r\n    public interface INode<T> where T : INode<T>\r\n    {\r\n\r\n        IEnumerable<T> GetNeighbours();\r\n        int GetNeighbours(ICollection<T> buffer);\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Graphs/IPathResolver.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Graphs\r\n{\r\n    public interface IPathResolver<T>\r\n    {\r\n\r\n        T Start { get; set; }\r\n        T Goal { get; set; }\r\n\r\n        IList<T> Reduce();\r\n        int Reduce(IList<T> path);\r\n\r\n    }\r\n\r\n    public interface ISteppingPathResolver<T> : IPathResolver<T>\r\n    {\r\n        /// <summary>\r\n        /// Start the stepping path resolver for reducing.\r\n        /// </summary>\r\n        void BeginSteppedReduce();\r\n        /// <summary>\r\n        /// Take a step at reducing the path resolver.\r\n        /// </summary>\r\n        /// <returns>Returns true if reached goal.</returns>\r\n        bool Step();\r\n        /// <summary>\r\n        /// Get the result of reducing the path.\r\n        /// </summary>\r\n        /// <param name=\"path\"></param>\r\n        int EndSteppedReduce(IList<T> path);\r\n        /// <summary>\r\n        /// Reset the resolver so a new Step sequence could be started.\r\n        /// </summary>\r\n        void Reset();\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Graphs/LinkedNodeGraph.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Graphs\r\n{\r\n    public class LinkedNodeGraph<T> : IGraph<T>, ICollection<T>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Dictionary<T, NeighbourInfo> _entries;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public LinkedNodeGraph()\r\n        {\r\n            _entries = new Dictionary<T, NeighbourInfo>(EqualityComparer<T>.Default);\r\n        }\r\n\r\n        public LinkedNodeGraph(IEqualityComparer<T> comparer)\r\n        {\r\n            _entries = new Dictionary<T, NeighbourInfo>(comparer ?? EqualityComparer<T>.Default);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IEqualityComparer<T> Comparer\r\n        {\r\n            get { return _entries.Comparer; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Add(T node, T neighbour, bool oneway = false)\r\n        {\r\n            if (node == null) throw new ArgumentNullException(\"node\");\r\n            if (neighbour == null) throw new ArgumentNullException(\"neighbour\");\r\n\r\n            NeighbourInfo info = null;\r\n            if(_entries.TryGetValue(node, out info) && info != null)\r\n            {\r\n                while(info != null)\r\n                {\r\n                    if (_entries.Comparer.Equals(info.Value, neighbour))\r\n                    {\r\n                        break;\r\n                    }\r\n                    else if (info.Next == null)\r\n                    {\r\n                        info.Next = new NeighbourInfo()\r\n                        {\r\n                            Value = neighbour\r\n                        };\r\n                        break;\r\n                    }\r\n                    else\r\n                    {\r\n                        info = info.Next;\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                _entries[node] = new NeighbourInfo()\r\n                {\r\n                    Value = neighbour\r\n                };\r\n            }\r\n\r\n            if(!oneway)\r\n            {\r\n                this.Add(neighbour, node, true);\r\n            }\r\n            else if(!_entries.ContainsKey(neighbour))\r\n            {\r\n                _entries.Add(neighbour, null);\r\n            }\r\n        }\r\n        \r\n        public bool Remove(T node)\r\n        {\r\n            if (node == null) throw new ArgumentNullException(\"node\");\r\n\r\n            NeighbourInfo info;\r\n            if (_entries.TryGetValue(node, out info) && _entries.Remove(node))\r\n            {\r\n                while(info != null)\r\n                {\r\n                    this.Disconnect(info.Value, node, true);\r\n                }\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public bool Disconnect(T from, T to, bool oneway = false)\r\n        {\r\n            if (from == null) throw new ArgumentNullException(\"from\");\r\n            if (to == null) throw new ArgumentNullException(\"to\");\r\n\r\n            if (!oneway) this.Disconnect(to, from, true);\r\n\r\n            NeighbourInfo info;\r\n            if (_entries.TryGetValue(from, out info) && info != null)\r\n            {\r\n                //if it was first, just replace first with next\r\n                if(_entries.Comparer.Equals(info.Value, to))\r\n                {\r\n                    _entries[from] = info.Next;\r\n                    return true;\r\n                }\r\n                var prev = info;\r\n                info = info.Next;\r\n\r\n                while (info != null)\r\n                {\r\n                    if(_entries.Comparer.Equals(info.Value, to))\r\n                    {\r\n                        prev.Next = info.Next;\r\n                        return true;\r\n                    }\r\n\r\n                    prev = info;\r\n                    info = info.Next;\r\n                }\r\n            }\r\n            \r\n            return false;\r\n        }\r\n        \r\n        public int CountNeighbours(T node)\r\n        {\r\n            if (node == null) throw new ArgumentNullException(\"node\");\r\n\r\n            int cnt = 0;\r\n            NeighbourInfo info;\r\n            if (_entries.TryGetValue(node, out info))\r\n            {\r\n                while (info != null)\r\n                {\r\n                    cnt++;\r\n                    info = info.Next;\r\n                }\r\n            }\r\n            return cnt;\r\n        }\r\n\r\n        public bool HasNeighbour(T from, T to)\r\n        {\r\n            if (from == null) throw new ArgumentNullException(\"from\");\r\n            if (to == null) throw new ArgumentNullException(\"to\");\r\n\r\n            NeighbourInfo info;\r\n            if (_entries.TryGetValue(from, out info) && info != null)\r\n            {\r\n                while(info != null)\r\n                {\r\n                    if (_entries.Comparer.Equals(info.Value, to)) return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        public int Count\r\n        {\r\n            get\r\n            {\r\n                return _entries.Count;\r\n            }\r\n        }\r\n\r\n        bool ICollection<T>.IsReadOnly\r\n        {\r\n            get\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public void Add(T node)\r\n        {\r\n            if (node == null) throw new ArgumentNullException(\"node\");\r\n            if (_entries.ContainsKey(node)) return;\r\n\r\n            _entries.Add(node, null);\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _entries.Clear();\r\n        }\r\n\r\n        public bool Contains(T node)\r\n        {\r\n            return _entries.ContainsKey(node);\r\n        }\r\n        \r\n        //bool Remove - implemented in methods\r\n\r\n        void ICollection<T>.CopyTo(T[] array, int arrayIndex)\r\n        {\r\n            _entries.Keys.CopyTo(array, arrayIndex);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IGraph Interface\r\n        \r\n        public IEnumerable<T> GetNeighbours(T node)\r\n        {\r\n            if (node == null) throw new ArgumentNullException(\"node\");\r\n\r\n            NeighbourInfo info;\r\n            if(_entries.TryGetValue(node, out info))\r\n            {\r\n                while(info != null)\r\n                {\r\n                    yield return info.Value;\r\n                    info = info.Next;\r\n                }\r\n            }\r\n        }\r\n        \r\n        public int GetNeighbours(T node, ICollection<T> buffer)\r\n        {\r\n            if (node == null) throw new ArgumentNullException(\"node\");\r\n            if (buffer == null) throw new ArgumentNullException(\"buffer\");\r\n\r\n            int cnt = buffer.Count;\r\n            NeighbourInfo info;\r\n            if (_entries.TryGetValue(node, out info))\r\n            {\r\n                while (info != null)\r\n                {\r\n                    buffer.Add(info.Value);\r\n                    info = info.Next;\r\n                }\r\n            }\r\n            return buffer.Count - cnt;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public Enumerator GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator<T> IEnumerable<T>.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator IEnumerable.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        public struct Enumerator : IEnumerator<T>\r\n        {\r\n\r\n            private Dictionary<T, NeighbourInfo>.KeyCollection.Enumerator _e;\r\n\r\n            public Enumerator(LinkedNodeGraph<T> graph)\r\n            {\r\n                if (graph == null) throw new ArgumentNullException(\"graph\");\r\n                _e = graph._entries.Keys.GetEnumerator();\r\n            }\r\n\r\n            public T Current\r\n            {\r\n                get\r\n                {\r\n                    return _e.Current;\r\n                }\r\n            }\r\n\r\n            object IEnumerator.Current\r\n            {\r\n                get\r\n                {\r\n                    return _e.Current;\r\n                }\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                _e.Dispose();\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                return _e.MoveNext();\r\n            }\r\n\r\n            void IEnumerator.Reset()\r\n            {\r\n                //do nothing\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Special Types\r\n\r\n        private class NeighbourInfo\r\n        {\r\n            public T Value;\r\n            public NeighbourInfo Next;\r\n        }\r\n        \r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Graphs/NodeGraph.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Graphs\r\n{\r\n\r\n    public class NodeGraph<T> : IGraph<T> where T : class, INode<T>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private HashSet<T> _graph = new HashSet<T>();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Add(T node)\r\n        {\r\n            if (node == null) throw new System.ArgumentNullException(\"node\");\r\n            _graph.Add(node);\r\n        }\r\n\r\n        public bool Remove(T node)\r\n        {\r\n            if (node == null) throw new System.ArgumentNullException(\"node\");\r\n            return _graph.Remove(node);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IGraph Interface\r\n\r\n        public int Count\r\n        {\r\n            get\r\n            {\r\n                return _graph.Count;\r\n            }\r\n        }\r\n\r\n        public IEnumerable<T> GetNeighbours(T node)\r\n        {\r\n            if (!_graph.Contains(node)) throw new System.ArgumentException(\"Graph does not contain node.\");\r\n            return node.GetNeighbours();\r\n        }\r\n\r\n        public int GetNeighbours(T node, ICollection<T> buffer)\r\n        {\r\n            if (!_graph.Contains(node)) throw new System.ArgumentException(\"Graph does not contain node.\");\r\n            return node.GetNeighbours(buffer);\r\n        }\r\n\r\n        public bool Contains(T node)\r\n        {\r\n            return _graph.Contains(node);\r\n        }\r\n\r\n        public IEnumerator<T> GetEnumerator()\r\n        {\r\n            return _graph.GetEnumerator();\r\n        }\r\n\r\n        IEnumerator IEnumerable.GetEnumerator()\r\n        {\r\n            return _graph.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Hooks/Callbacks.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Hooks\r\n{\r\n\r\n    public delegate void OnCollisionCallback(GameObject sender, Collision collision);\r\n\r\n    public delegate void OnTriggerCallback(GameObject sender, Collider otherCollider);\r\n\r\n    public delegate void OnStrikeCallback(GameObject sender, Collider otherCollider);\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Hooks/CollisionHooks.cs",
    "content": "﻿using UnityEngine;\r\n\r\n\r\nnamespace com.spacepuppy.Hooks\r\n{\r\n\r\n    public sealed class CollisionEnterExitHook : MonoBehaviour\r\n    {\r\n\r\n        private OnCollisionCallback _onEnter;\r\n        private OnCollisionCallback _onExit;\r\n\r\n        public event OnCollisionCallback OnEnter\r\n        {\r\n            add\r\n            {\r\n                _onEnter += value;\r\n                if (!this.enabled) this.enabled = true;\r\n            }\r\n            remove\r\n            {\r\n                _onEnter -= value;\r\n                if (_onEnter == null && _onExit == null) this.enabled = false;\r\n            }\r\n        }\r\n        public event OnCollisionCallback OnExit\r\n        {\r\n            add\r\n            {\r\n                _onExit += value;\r\n                if (!this.enabled) this.enabled = true;\r\n            }\r\n            remove\r\n            {\r\n                _onExit -= value;\r\n                if (_onEnter == null && _onExit == null) this.enabled = false;\r\n            }\r\n        }\r\n\r\n        private void OnCollisionEnter(Collision collision)\r\n        {\r\n            if (!this.isActiveAndEnabled) return;\r\n\r\n            if (_onEnter != null) _onEnter(this.gameObject, collision);\r\n        }\r\n\r\n        private void OnCollisionExit(Collision collision)\r\n        {\r\n            if (!this.isActiveAndEnabled) return;\r\n\r\n            if (_onExit != null) _onExit(this.gameObject, collision);\r\n        }\r\n\r\n        private void OnDestroy()\r\n        {\r\n            _onEnter = null;\r\n            _onExit = null;\r\n        }\r\n\r\n    }\r\n\r\n    public sealed class CollisionStayHook : MonoBehaviour\r\n    {\r\n\r\n        private OnCollisionCallback _onStay;\r\n\r\n        public event OnCollisionCallback OnStay\r\n        {\r\n            add\r\n            {\r\n                _onStay += value;\r\n                if (!this.enabled) this.enabled = true;\r\n            }\r\n            remove\r\n            {\r\n                _onStay -= value;\r\n                if (_onStay == null) this.enabled = false;\r\n            }\r\n        }\r\n\r\n        private void OnCollisionStay(Collision collision)\r\n        {\r\n            if (!this.isActiveAndEnabled) return;\r\n\r\n            if (_onStay != null) _onStay(this.gameObject, collision);\r\n        }\r\n\r\n        private void OnDestroy()\r\n        {\r\n            _onStay = null;\r\n        }\r\n\r\n    }\r\n    \r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Hooks/CollisionSignalSource.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Hooks\r\n{\r\n\r\n    [System.Serializable()]\r\n    public class CollisionSignalSource : IGameObjectSource\r\n    {\r\n\r\n        #region Events\r\n\r\n        public event OnTriggerCallback OnTriggerEnter\r\n        {\r\n            add\r\n            {\r\n                if (_signalSource == null) return;\r\n                if (_triggerEnterExitHook == null) _triggerEnterExitHook = _signalSource.AddOrGetComponent<TriggerEnterExitHook>();\r\n                _triggerEnterExitHook.OnEnter += value;\r\n            }\r\n            remove\r\n            {\r\n                if (_triggerEnterExitHook != null) _triggerEnterExitHook.OnEnter -= value;\r\n            }\r\n        }\r\n        public event OnTriggerCallback OnTriggerStay\r\n        {\r\n            add\r\n            {\r\n                if (_signalSource == null) return;\r\n                if (_triggerStayHook == null) _triggerStayHook = _signalSource.AddOrGetComponent<TriggerStayHook>();\r\n                _triggerStayHook.OnStay += value;\r\n            }\r\n            remove\r\n            {\r\n                if (_triggerEnterExitHook != null) _triggerEnterExitHook.OnEnter -= value;\r\n            }\r\n        }\r\n        public event OnTriggerCallback OnTriggerExit\r\n        {\r\n            add\r\n            {\r\n                if (_signalSource == null) return;\r\n                if (_triggerEnterExitHook == null) _triggerEnterExitHook = _signalSource.AddOrGetComponent<TriggerEnterExitHook>();\r\n                _triggerEnterExitHook.OnExit += value;\r\n            }\r\n            remove\r\n            {\r\n                if (_triggerEnterExitHook != null) _triggerEnterExitHook.OnExit -= value;\r\n            }\r\n        }\r\n        public event OnCollisionCallback OnCollisionEnter\r\n        {\r\n            add\r\n            {\r\n                if (_signalSource == null) return;\r\n                if (_collisionEnterExitHook == null) _collisionEnterExitHook = _signalSource.AddOrGetComponent<CollisionEnterExitHook>();\r\n                _collisionEnterExitHook.OnEnter += value;\r\n            }\r\n            remove\r\n            {\r\n                if (_collisionEnterExitHook != null) _collisionEnterExitHook.OnEnter -= value;\r\n            }\r\n        }\r\n        public event OnCollisionCallback OnCollisionStay\r\n        {\r\n            add\r\n            {\r\n                if (_signalSource == null) return;\r\n                if (_collisionStayHook == null) _collisionStayHook = _signalSource.AddOrGetComponent<CollisionStayHook>();\r\n                _collisionStayHook.OnStay += value;\r\n            }\r\n            remove\r\n            {\r\n                if (_collisionStayHook != null) _collisionStayHook.OnStay -= value;\r\n            }\r\n        }\r\n        public event OnCollisionCallback OnCollisionExit\r\n        {\r\n            add\r\n            {\r\n                if (_signalSource == null) return;\r\n                if (_collisionEnterExitHook == null) _collisionEnterExitHook = _signalSource.AddOrGetComponent<CollisionEnterExitHook>();\r\n                _collisionEnterExitHook.OnExit += value;\r\n            }\r\n            remove\r\n            {\r\n                if (_collisionEnterExitHook != null) _collisionEnterExitHook.OnExit -= value;\r\n            }\r\n        }\r\n\r\n        private OnStrikeCallback _onStrike;\r\n        public event OnStrikeCallback OnStrike\r\n        {\r\n            add\r\n            {\r\n                if(_onStrike != null)\r\n                {\r\n                    if (_triggerEnterExitHook == null) _triggerEnterExitHook = _signalSource.AddOrGetComponent<TriggerEnterExitHook>();\r\n                    if (_collisionEnterExitHook == null) _collisionEnterExitHook = _signalSource.AddOrGetComponent<CollisionEnterExitHook>();\r\n                    _triggerEnterExitHook.OnEnter -= this.OnTriggerStrike;\r\n                    _collisionEnterExitHook.OnEnter -= this.OnCollisionStrike;\r\n                    _triggerEnterExitHook.OnEnter += this.OnTriggerStrike;\r\n                    _collisionEnterExitHook.OnEnter += this.OnCollisionStrike;\r\n                }\r\n                _onStrike += value;\r\n            }\r\n            remove\r\n            {\r\n                if (_onStrike == null) return;\r\n                _onStrike -= value;\r\n                if(_onStrike == null)\r\n                {\r\n                    if (_triggerEnterExitHook != null) _triggerEnterExitHook.OnEnter -= this.OnTriggerStrike;\r\n                    if (_collisionEnterExitHook != null) _collisionEnterExitHook.OnEnter -= this.OnCollisionStrike;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [DisableOnPlay()]\r\n        private GameObject _signalSource;\r\n\r\n        [System.NonSerialized()]\r\n        private TriggerEnterExitHook _triggerEnterExitHook;\r\n        [System.NonSerialized()]\r\n        private TriggerStayHook _triggerStayHook;\r\n        [System.NonSerialized()]\r\n        private CollisionEnterExitHook _collisionEnterExitHook;\r\n        [System.NonSerialized()]\r\n        private CollisionStayHook _collisionStayHook;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected CollisionSignalSource()\r\n        {\r\n            //simple constructor for unity serializer\r\n        }\r\n\r\n        public CollisionSignalSource(GameObject signalSource)\r\n        {\r\n            _signalSource = signalSource;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public GameObject SignalSource\r\n        {\r\n            get { return _signalSource; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Event Handlers\r\n\r\n        private void OnCollisionStrike(GameObject sender, Collision c)\r\n        {\r\n            if (_onStrike != null) _onStrike(sender, c.collider);\r\n        }\r\n\r\n        private void OnTriggerStrike(GameObject sender, Collider c)\r\n        {\r\n            if (_onStrike != null) _onStrike(sender, c);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IGameObjectSource Interface\r\n\r\n        GameObject IGameObjectSource.gameObject\r\n        {\r\n            get { return _signalSource; }\r\n        }\r\n\r\n        Transform IGameObjectSource.transform\r\n        {\r\n            get { return (_signalSource != null) ? _signalSource.transform : null; }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Hooks/ControllerColliderHitEventHooks.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Hooks\r\n{\r\n\r\n    public delegate void OnControllerColliderHitCallback(object sender, ControllerColliderHit hit);\r\n\r\n    public sealed class ControllerColliderHitEventHooks : MonoBehaviour\r\n    {\r\n\r\n        public event OnControllerColliderHitCallback ControllerColliderHit;\r\n\r\n        void OnControllerColliderHit(ControllerColliderHit hit)\r\n        {\r\n            if (this.ControllerColliderHit != null) this.ControllerColliderHit(this, hit);\r\n        }\r\n\r\n        private void OnDestroy()\r\n        {\r\n            ControllerColliderHit = null;\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Hooks/EarlyExecutionUpdateEventHooks.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Hooks\r\n{\r\n\r\n    /// <summary>\r\n    /// This class exists to be added to the Execution Order Manager at an extra early time. Some managers use this to get early update timing.\r\n    /// </summary>\r\n    /// <remarks>\r\n    /// The project must flag this as early execution in Edit->Project Settings->Execution Order\r\n    /// </remarks>\r\n    [AddComponentMenu(\"SpacePuppy/Hooks/EarlyExecutionUpdateEventHooks\")]\r\n    public sealed class EarlyExecutionUpdateEventHooks : UpdateEventHooks\r\n    {\r\n\r\n\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/Hooks/EarlyStartHook.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy.Hooks\n{\n\n    public sealed class EarlyStartHook : MonoBehaviour\n    {\n\n        private System.Action _callback;\n\n        private void Start()\n        {\n            if (_callback != null) _callback();\n            Destroy(this);\n        }\n        \n        public static void Invoke(GameObject obj, System.Action callback)\n        {\n            if (callback == null) return;\n\n            var hook = obj.GetComponent<EarlyStartHook>();\n            if (hook == null) hook = obj.AddComponent<EarlyStartHook>();\n            hook._callback += callback;\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Hooks/TardyExecutionUpdateEventHooks.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Hooks\r\n{\r\n\r\n    /// <summary>\r\n    /// This class exists to be added to the Execution Order Manager at an extra early time. Some managers use this to get early update timing.\r\n    /// </summary>\r\n    /// <remarks>\r\n    /// The project must flag this as later execution in Edit->Project Settings->Execution Order\r\n    /// </remarks>\r\n    [AddComponentMenu(\"SpacePuppy/Hooks/TardyExecutionUpdateEventHooks\")]\r\n    public sealed class TardyExecutionUpdateEventHooks : UpdateEventHooks\r\n    {\r\n\r\n\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Hooks/TriggerHooks.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Hooks\r\n{\r\n\r\n    public sealed class TriggerEnterExitHook : MonoBehaviour\r\n    {\r\n\r\n        private OnTriggerCallback _onEnter;\r\n        private OnTriggerCallback _onExit;\r\n\r\n        public event OnTriggerCallback OnEnter\r\n        {\r\n            add\r\n            {\r\n                _onEnter += value;\r\n                if (!this.enabled) this.enabled = true;\r\n            }\r\n            remove\r\n            {\r\n                _onEnter -= value;\r\n                if (_onEnter == null && _onExit == null) this.enabled = false;\r\n            }\r\n        }\r\n        public event OnTriggerCallback OnExit\r\n        {\r\n            add\r\n            {\r\n                _onExit += value;\r\n                if (!this.enabled) this.enabled = true;\r\n            }\r\n            remove\r\n            {\r\n                _onExit -= value;\r\n                if (_onEnter == null && _onExit == null) this.enabled = false;\r\n            }\r\n        }\r\n\r\n        private void OnTriggerEnter(Collider otherCollider)\r\n        {\r\n            if (!this.isActiveAndEnabled) return;\r\n\r\n            if (_onEnter != null) _onEnter(this.gameObject, otherCollider);\r\n        }\r\n\r\n        private void OnTriggerExit(Collider otherCollider)\r\n        {\r\n            if (!this.isActiveAndEnabled) return;\r\n\r\n            if (_onExit != null) _onExit(this.gameObject, otherCollider);\r\n        }\r\n\r\n        private void OnDestroy()\r\n        {\r\n            _onEnter = null;\r\n            _onExit = null;\r\n        }\r\n\r\n    }\r\n\r\n    public sealed class TriggerStayHook : MonoBehaviour\r\n    {\r\n\r\n        private OnTriggerCallback _onStay;\r\n\r\n        public event OnTriggerCallback OnStay\r\n        {\r\n            add\r\n            {\r\n                _onStay += value;\r\n                if (!this.enabled) this.enabled = true;\r\n            }\r\n            remove\r\n            {\r\n                _onStay -= value;\r\n                if (_onStay == null) this.enabled = false;\r\n            }\r\n        }\r\n\r\n        private void OnTriggerStay(Collider otherCollider)\r\n        {\r\n            if (!this.isActiveAndEnabled) return;\r\n\r\n            if (_onStay != null) _onStay(this.gameObject, otherCollider);\r\n        }\r\n\r\n        private void OnDestroy()\r\n        {\r\n            _onStay = null;\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Hooks/UpdateEventHooks.cs",
    "content": "using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Hooks\r\n{\r\n\r\n    [AddComponentMenu(\"SpacePuppy/Hooks/UpdateEventHooks\")]\r\n    public class UpdateEventHooks : com.spacepuppy.SPComponent\r\n    {\r\n\r\n        public event System.EventHandler UpdateHook;\r\n        public event System.EventHandler FixedUpdateHook;\r\n        public event System.EventHandler LateUpdateHook;\r\n\r\n        // Update is called once per frame\r\n        void Update()\r\n        {\r\n            if (this.UpdateHook != null) this.UpdateHook(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        void FixedUpdate()\r\n        {\r\n            if (this.FixedUpdateHook != null) this.FixedUpdateHook(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        void LateUpdate()\r\n        {\r\n            if (this.LateUpdateHook != null) this.LateUpdateHook(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        protected override void OnDestroy()\r\n        {\r\n            base.OnDestroy();\r\n\r\n            UpdateHook = null;\r\n            FixedUpdateHook = null;\r\n            LateUpdateHook = null;\r\n        }\r\n\r\n\r\n        public void ScheduleNextUpdate(System.Action callback)\r\n        {\r\n\r\n        }\r\n\r\n        public void ScheduleNextFixedUpdate(System.Action callback)\r\n        {\r\n\r\n        }\r\n\r\n        public void ScheduleNextLateUpdate(System.Action callback)\r\n        {\r\n\r\n        }\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/IComponent.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Base contract for any interface contract that should be considered a Component\r\n    /// </summary>\r\n    public interface IComponent : IGameObjectSource\r\n    {\r\n\r\n        bool enabled { get; set; }\r\n        bool isActiveAndEnabled { get; }\r\n        Component component { get; }\r\n\r\n    }\r\n\r\n    public interface IEventfulComponent : IComponent\r\n    {\r\n        event System.EventHandler OnEnabled;\r\n        event System.EventHandler OnStarted;\r\n        event System.EventHandler OnDisabled;\r\n        event System.EventHandler ComponentDestroyed;\r\n\r\n        bool started { get; }\r\n    }\r\n    \r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/IEntityAwakeHandler.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Implement on a component that should receive the 'EntityAwake' message. \r\n    /// This is called after the entire entity hierarchy has had Awake called on it, but before Start is called.\r\n    /// \r\n    /// This is useful if you want to initialize a script inside an entity after the entire entity has had \r\n    /// Awake called on it. This is called on all scripts, including those that are inactive. If a script is \r\n    /// added after the Entity was originaly created (and Awake called on the Entity script), this message will \r\n    /// not be called.\r\n    /// </summary>\r\n    public interface IEntityAwakeHandler\r\n    {\r\n\r\n        void OnEntityAwake(SPEntity entity);\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/IEventActivatorMask.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\nusing UnityEngine;\nusing System.Collections.Generic;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy\n{\n\n    public interface IEventActivatorMask\n    {\n        \n        bool Intersects(UnityEngine.Object obj);\n\n    }\n\n    [System.Serializable]\n    public sealed class EventActivatorMaskRef : Project.SerializableInterfaceRef<IEventActivatorMask>\n    {\n\n    }\n\n\n    [CreateAssetMenu(fileName = \"EventActivatorMask\", menuName = \"Spacepuppy/EventActivatorMask\")]\n    public class EventActivatorMask : ScriptableObject, IEventActivatorMask\n    {\n\n        #region Fields\n\n        [SerializeField]\n        private bool _testRoot;\n        [SerializeField]\n        private LayerMask _layerMask = -1;\n\n        [SerializeField()]\n        [ReorderableArray]\n        [TagSelector()]\n        private string[] _tags;\n\n        [SerializeField]\n        [Tooltip(\"An optional eval string that will be operated as part of the mask, the GameObject of the activator will be passed along as $.\")]\n        private string _evalStatement;\n        \n        #endregion\n\n        #region Properties\n\n        public LayerMask LayerMask\n        {\n            get { return _layerMask; }\n            set { _layerMask = value; }\n        }\n\n        public string[] Tags\n        {\n            get { return _tags; }\n            set { _tags = value; }\n        }\n\n        public string EvalStatement\n        {\n            get { return _evalStatement; }\n            set { _evalStatement = value; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public bool Intersects(GameObject go)\n        {\n            if (go == null) return false;\n\n            if (_testRoot) go = go.FindRoot();\n            \n            bool result = _layerMask.Intersects(go) && (_tags == null || _tags.Length == 0 || go.HasTag(_tags));\n            if (result && !string.IsNullOrEmpty(_evalStatement)) result = com.spacepuppy.Dynamic.Evaluator.EvalBool(_evalStatement, go);\n            return result;\n        }\n\n        public bool Intersects(Component comp)\n        {\n            if (comp == null) return false;\n            return Intersects(comp.gameObject);\n        }\n\n        #endregion\n\n        #region IEventActivatorMask Interface\n\n        public bool Intersects(Object obj)\n        {\n            return this.Intersects(GameObjectUtil.GetGameObjectFromSource(obj));\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/IForceReceiver.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    public interface IForceReceiver : IGameObjectSource\r\n    {\r\n\r\n        void Move(Vector3 mv);\r\n        void AddForce(Vector3 force, ForceMode mode);\r\n        void AddForceAtPosition(Vector3 force, Vector3 position, ForceMode mode);\r\n        void AddExplosionForce(float explosionForce, Vector3 explosionPosition, float explosionRadius, float upwardsModifier, ForceMode mode);\r\n\r\n    }\r\n\r\n    public class RigidbodyForceReceiverWrapper : IForceReceiver\r\n    {\r\n\r\n        private Rigidbody _body;\r\n\r\n        public GameObject gameObject\r\n        {\r\n            get { return _body.gameObject; }\r\n        }\r\n\r\n        public Transform transform\r\n        {\r\n            get { return _body.transform; }\r\n        }\r\n\r\n        public RigidbodyForceReceiverWrapper(Rigidbody body)\r\n        {\r\n            if (body == null) throw new System.ArgumentNullException(\"body\");\r\n            _body = body;\r\n        }\r\n\r\n        public void Move(Vector3 mv)\r\n        {\r\n            _body.MovePosition(_body.position + mv);\r\n        }\r\n\r\n        public void AddForce(Vector3 force, ForceMode mode)\r\n        {\r\n            _body.AddForce(force, mode);\r\n        }\r\n\r\n        public void AddForceAtPosition(Vector3 force, Vector3 position, ForceMode mode)\r\n        {\r\n            _body.AddForceAtPosition(force, position, mode);\r\n        }\r\n\r\n        public void AddExplosionForce(float explosionForce, Vector3 explosionPosition, float explosionRadius, float upwardsModifier, ForceMode mode)\r\n        {\r\n            _body.AddExplosionForce(explosionForce, explosionPosition, explosionRadius, upwardsModifier, mode);\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/IGameObjectSource.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    public interface IGameObjectSource\r\n    {\r\n\r\n        GameObject gameObject { get; }\r\n        Transform transform { get; }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/IIgnorableCollision.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    public interface IIgnorableCollision\r\n    {\r\n\r\n        void IgnoreCollision(Collider coll, bool ignore);\r\n        void IgnoreCollision(IIgnorableCollision coll, bool ignore);\r\n\r\n    }\r\n\r\n    [RequireComponent(typeof(Rigidbody))]\r\n    public class IgnorableRigidbody : SPComponent, IIgnorableCollision\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [System.NonSerialized()]\r\n        private Collider[] _colliders; //consider making this configurable\r\n\r\n        [System.NonSerialized()]\r\n        private Rigidbody _rigidbody;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            _rigidbody = this.GetComponent<Rigidbody>();\r\n            _colliders = this.GetComponentsInChildren<Collider>();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IIgnorableCollision Interface\r\n\r\n        public void IgnoreCollision(IIgnorableCollision coll, bool ignore)\r\n        {\r\n            if (coll == null) return;\r\n            if (_colliders == null) return;\r\n\r\n            for(int i = 0; i < _colliders.Length; i++)\r\n            {\r\n                if (_colliders[i] != null) coll.IgnoreCollision(_colliders[i], ignore);\r\n            }\r\n        }\r\n\r\n        public void IgnoreCollision(Collider coll, bool ignore)\r\n        {\r\n            if (coll == null) return;\r\n            if (_colliders == null) return;\r\n\r\n            for (int i = 0; i < _colliders.Length; i++)\r\n            {\r\n                if (_colliders[i] != null) Physics.IgnoreCollision(_colliders[i], coll, ignore);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Utils\r\n\r\n        public static IgnorableRigidbody GetIgnorableCollision(Rigidbody rb)\r\n        {\r\n            if (rb == null) return null;\r\n\r\n            return rb.AddOrGetComponent<IgnorableRigidbody>();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    public class IgnorableCollider : SPComponent, IIgnorableCollision\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Collider _collider;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            _collider = this.GetComponent<Collider>();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Collider Collider { get { return _collider; } }\r\n\r\n        #endregion\r\n        \r\n        #region IIgnorableCollision Interface\r\n\r\n        public void IgnoreCollision(Collider coll, bool ignore)\r\n        {\r\n            if (_collider == null || coll == null || _collider == coll) return;\r\n\r\n            Physics.IgnoreCollision(_collider, coll, ignore);\r\n        }\r\n\r\n        public void IgnoreCollision(IIgnorableCollision coll, bool ignore)\r\n        {\r\n            if (_collider == null || coll == null || object.ReferenceEquals(this, coll)) return;\r\n\r\n            coll.IgnoreCollision(_collider, ignore);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n        \r\n        public static IgnorableCollider GetIgnorableCollision(Collider coll)\r\n        {\r\n            if (coll == null) return null;\r\n\r\n            return coll.AddOrGetComponent<IgnorableCollider>();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/IImmediatelyResumingYieldInstruction.cs",
    "content": "﻿\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Implement this if the coroutine should immediately resume on complete instead of waiting to the next frame. This is used \r\n    /// in situations that are similar to WaitForFixedUpdate, where we want to wait for some section of the update pipeline and \r\n    /// need to operate immediately.\r\n    /// </summary>\r\n    public interface IImmediatelyResumingYieldInstruction : IRadicalYieldInstruction\r\n    {\r\n        event System.EventHandler Signal;\r\n    }\r\n\r\n    /// <summary>\r\n    /// Base abstract class that implement IImmediatelyResumingYieldInstruction. Inherit from this instead of directly implementing \r\n    /// IImmediatelyResumingYieldInstruction, unless you can't otherwise.\r\n    /// </summary>\r\n    public abstract class ImmediatelyResumingYieldInstruction : RadicalYieldInstruction, IImmediatelyResumingYieldInstruction\r\n    {\r\n\r\n        private System.EventHandler _signal;\r\n\r\n        protected override void SetSignal()\r\n        {\r\n            base.SetSignal();\r\n            if (_signal != null) _signal(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        event System.EventHandler IImmediatelyResumingYieldInstruction.Signal\r\n        {\r\n            add\r\n            {\r\n                if (_signal == null)\r\n                    _signal = value;\r\n                else if (_signal == value)\r\n                    return;\r\n                else\r\n                    _signal += value;\r\n            }\r\n            remove\r\n            {\r\n                if (_signal == null)\r\n                    return;\r\n                else if (_signal == value)\r\n                    _signal = null;\r\n                else\r\n                    _signal -= value;\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/IMixin.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy\n{\n\n    /// <summary>\n    /// An implementation of mixin's for C# similar to python's mixins.\n    /// \n    /// Since C# doesn't support multiple inheritance, we instead implement a mixin as an interface. \n    /// All mixin's should inherit from IMixin for initialization purpose. The interface is then attributed \n    /// with a MixinConstructorAttribute which acts as the signal for when a object with a mixin is \n    /// initialized/constructed. \n    /// \n    /// This constructor attribute can then do what it needs to to implement the the mixin. \n    /// \n    /// For mixin that just performs an action, it can register that action right then and there (such \n    /// as registering for events). \n    /// \n    /// For a mixin that needs state, you can create a state object there and store it somewhere (usually \n    /// as a component on the GameObject of the mixin). \n    /// \n    /// If you want the mixin to have methods, you should create a static class with extension methods \n    /// that accept the mixin interface as the first parameter.\n    /// \n    /// IMixin initializing is handled during SPComponent.Awake. If you want a non-SPComponent to handle IMixin \n    /// you must call MixinUtil.Initialize during the constructor/awake of the class.\n    /// </summary>\n    public interface IMixin\n    {\n    }\n    \n    /// <summary>\n    /// Base type for mixin constructor attributes.\n    /// </summary>\n    [System.AttributeUsage(System.AttributeTargets.Interface, AllowMultiple = false, Inherited = true)]\n    public abstract class MixinConstructorAttribute : System.Attribute\n    {\n        public abstract void OnConstructed(IMixin obj);\n    }\n    \n    /// <summary>\n    /// Static class for initializing mixins.\n    /// </summary>\n    public static class MixinUtil\n    {\n\n        private static System.Type _mixinBaseType = typeof(IMixin);\n\n        public static void Initialize(IMixin obj)\n        {\n            if (obj == null) return;\n            \n            var mixinTypes = obj.GetType().FindInterfaces((tp, c) =>\n            {\n                return tp != _mixinBaseType && tp.IsInterface && _mixinBaseType.IsAssignableFrom(tp);\n            }, null);\n\n            foreach (var mixinType in mixinTypes)\n            {\n                var constructedAttribs = mixinType.GetCustomAttributes(typeof(MixinConstructorAttribute), false);\n                if(constructedAttribs != null && constructedAttribs.Length > 0)\n                {\n                    for(int i = 0; i < constructedAttribs.Length; i++)\n                    {\n                        (constructedAttribs[i] as MixinConstructorAttribute).OnConstructed(obj);\n                    }\n                }\n            }\n            \n        }\n\n    }\n\n    /// <summary>\n    /// Sometimes you want to run Start late, to allow Start to be called on all other scripts. Basically adding a final ordering for Start similar to LateUpdate.\n    /// </summary>\n    [MLateStartReceiverConstructor]\n    public interface IMLateStartReceiver : IMixin, IEventfulComponent\n    {\n        void OnLateStart();\n    }\n\n    [System.AttributeUsage(System.AttributeTargets.Interface)]\n    public class MLateStartReceiverConstructorAttribute : MixinConstructorAttribute\n    {\n\n        public override void OnConstructed(IMixin obj)\n        {\n            var c = obj as IMLateStartReceiver;\n            if (c != null)\n            {\n                c.OnStarted += (s, e) =>\n                {\n                    GameLoopEntry.LateUpdateHandle.BeginInvoke(() =>\n                    {\n                        c.OnLateStart();\n                    });\n                };\n            }\n        }\n\n    }\n\n    /// <summary>\n    /// Sometimes you want to run StartOrEnable late, to allow Start to be called on all other scripts. Basically adding a final ordering point for Start similar to LateUpdate.\n    /// </summary>\n    [MLateStartOrEnableReceiverConstructor]\n    public interface IMLateStartOrEnableReceiver : IMixin, IEventfulComponent\n    {\n\n        void OnLateStartOrEnable();\n\n    }\n\n    [System.AttributeUsage(System.AttributeTargets.Interface)]\n    public class MLateStartOrEnableReceiverConstructorAttribute : MixinConstructorAttribute\n    {\n\n        public override void OnConstructed(IMixin obj)\n        {\n            var c = obj as IMLateStartOrEnableReceiver;\n            if (c != null)\n            {\n                c.OnEnabled += (s, e) =>\n                {\n                    GameLoopEntry.LateUpdateHandle.BeginInvoke(() =>\n                    {\n                        c.OnLateStartOrEnable();\n                    });\n                };\n            }\n        }\n\n    }\n    \n}\n"
  },
  {
    "path": "SpacepuppyBase/INameable.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy\n{\n\n    /// <summary>\n    /// Defines a contract for something that is nameable.\n    /// \n    /// This is usually used in conjunction with NameCache.UnityObjectNameCache to streamline caching of the name field for fast CompareName.\n    /// </summary>\n    public interface INameable\n    {\n\n        string Name { get; set; }\n\n        bool CompareName(string nm);\n\n        void SetDirty();\n\n    }\n    \n}\n"
  },
  {
    "path": "SpacepuppyBase/INotificationDispatcher.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    public interface INotificationDispatcher\r\n    {\r\n\r\n        NotificationDispatcher Observers { get; }\r\n\r\n    }\r\n\r\n    public class NotificationDispatcher : INotificationDispatcher\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private INotificationDispatcher _owner;\r\n        private Dictionary<System.Type, System.Delegate> _handlers = new Dictionary<System.Type, System.Delegate>();\r\n        private Dictionary<System.Type, NotificationHandler> _unsafeHandlers = new Dictionary<System.Type, NotificationHandler>();\r\n\r\n        private GameObjectNotificationDispatcher _ownerGameObject;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public NotificationDispatcher()\r\n        {\r\n            _owner = null;\r\n            _ownerGameObject = null;\r\n        }\r\n\r\n        public NotificationDispatcher(INotificationDispatcher owner)\r\n        {\r\n            this.SetOwner(owner);\r\n        }\r\n\r\n        internal void SetOwner(INotificationDispatcher owner)\r\n        {\r\n            _owner = owner;\r\n            if (GameObjectUtil.IsGameObjectSource(_owner))\r\n            {\r\n                _ownerGameObject = GameObjectUtil.GetGameObjectFromSource(_owner).AddOrGetComponent<GameObjectNotificationDispatcher>();\r\n            }\r\n            else\r\n            {\r\n                _ownerGameObject = null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        public System.Type[] ListObservedNotifications()\r\n        {\r\n            return _handlers.Keys.Union(_unsafeHandlers.Keys).ToArray();\r\n        }\r\n\r\n        #region Methods\r\n\r\n        public void RegisterObserver<T>(NotificationHandler<T> handler) where T : Notification\r\n        {\r\n            if (handler == null) throw new System.ArgumentNullException(\"handler\");\r\n            var tp = typeof(T);\r\n            System.Delegate d;\r\n            if (_handlers.TryGetValue(tp, out d))\r\n            {\r\n                _handlers[tp] = System.Delegate.Combine(d, handler);\r\n            }\r\n            else\r\n            {\r\n                _handlers[tp] = handler;\r\n            }\r\n        }\r\n\r\n        public void RemoveObserver<T>(NotificationHandler<T> handler) where T : Notification\r\n        {\r\n            if (handler == null) throw new System.ArgumentNullException(\"handler\");\r\n            var tp = typeof(T);\r\n            System.Delegate d;\r\n            if (_handlers.TryGetValue(tp, out d))\r\n            {\r\n                d = System.Delegate.Remove(d, handler);\r\n                if (d != null)\r\n                {\r\n                    _handlers[tp] = d;\r\n                }\r\n                else\r\n                {\r\n                    _handlers.Remove(tp);\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool HasObserver<T>(bool bNotifyEntity) where T : Notification\r\n        {\r\n            return this.HasObserver_Imp(typeof(T), bNotifyEntity);\r\n        }\r\n\r\n        public bool PostNotification<T>(T n, bool bNotifyEntity) where T : Notification\r\n        {\r\n            if (n == null) throw new System.ArgumentNullException(\"n\");\r\n\r\n            return PostNotification_Imp(typeof(T), n, bNotifyEntity);\r\n        }\r\n\r\n        public void UnsafeRegisterObserver(System.Type notificationType, NotificationHandler handler)\r\n        {\r\n            if (notificationType == null || !TypeUtil.IsType(notificationType, typeof(Notification))) throw new TypeArgumentMismatchException(notificationType, typeof(Notification), \"notificationType\");\r\n            if (handler == null) throw new System.ArgumentNullException(\"handler\");\r\n\r\n            NotificationHandler d;\r\n            if (_unsafeHandlers.TryGetValue(notificationType, out d))\r\n            {\r\n                _unsafeHandlers[notificationType] = d + handler;\r\n            }\r\n            else\r\n            {\r\n                _unsafeHandlers[notificationType] = handler;\r\n            }\r\n        }\r\n\r\n        public void UnsafeRemoveObserver(System.Type notificationType, NotificationHandler handler)\r\n        {\r\n            if (notificationType == null || !TypeUtil.IsType(notificationType, typeof(Notification))) throw new TypeArgumentMismatchException(notificationType, typeof(Notification), \"notificationType\");\r\n            if (handler == null) throw new System.ArgumentNullException(\"handler\");\r\n\r\n            NotificationHandler d;\r\n            if (_unsafeHandlers.TryGetValue(notificationType, out d))\r\n            {\r\n                d -= handler;\r\n                if (d != null)\r\n                {\r\n                    _unsafeHandlers[notificationType] = d;\r\n                }\r\n                else\r\n                {\r\n                    _unsafeHandlers.Remove(notificationType);\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool HasObserver(System.Type notificationType, bool bNotifyEntity)\r\n        {\r\n            if (notificationType == null || !TypeUtil.IsType(notificationType, typeof(Notification))) throw new TypeArgumentMismatchException(notificationType, typeof(Notification), \"notificationType\");\r\n\r\n            return this.HasObserver_Imp(notificationType, bNotifyEntity);\r\n        }\r\n\r\n        public bool UnsafePostNotification(Notification n, bool bNotifyEntity)\r\n        {\r\n            if (n == null) throw new System.ArgumentNullException(\"n\");\r\n\r\n            return PostNotification_Imp(n.GetType(), n, bNotifyEntity);\r\n        }\r\n\r\n        public void PurgeHandlers()\r\n        {\r\n            _handlers.Clear();\r\n            _unsafeHandlers.Clear();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Imp\r\n\r\n        private bool HasObserver_Imp(System.Type tp, bool bNotifyEntity)\r\n        {\r\n            var tpForLoop = tp;\r\n            var baseType = typeof(Notification);\r\n            while (baseType.IsAssignableFrom(tpForLoop))\r\n            {\r\n                if (_handlers.ContainsKey(tpForLoop) || _unsafeHandlers.ContainsKey(tpForLoop)) return true;\r\n                tpForLoop = tpForLoop.BaseType;\r\n            }\r\n            if (_ownerGameObject == null) return false;\r\n\r\n            if (!object.ReferenceEquals(_ownerGameObject, _owner))\r\n            {\r\n                if (_ownerGameObject.Observers.HasObserver(tp, false)) return true;\r\n            }\r\n\r\n            if (bNotifyEntity)\r\n            {\r\n                //TODO - a bottleneck here, consider possibilities of speeding this up by removing the need to constantly call 'FindRoot'\r\n                var root = _ownerGameObject.FindRoot();\r\n                GameObjectNotificationDispatcher dispatcher;\r\n                if (root != _ownerGameObject.gameObject && root.GetComponent<GameObjectNotificationDispatcher>(out dispatcher))\r\n                {\r\n                    if (dispatcher.Observers.HasObserver_Imp(tp, false)) return true;\r\n                }\r\n            }\r\n\r\n            //return false;\r\n            return Notification.HasGlobalObserver(tp);\r\n        }\r\n\r\n        private bool PostNotification_Imp(System.Type tp, Notification n, bool bNotifyEntity)\r\n        {\r\n            bool handled = false;\r\n\r\n            handled = this.PostNotificationToJustSelf(tp, _owner, n);\r\n\r\n            if (_ownerGameObject != null)\r\n            {\r\n                if (!Object.ReferenceEquals(_owner, _ownerGameObject))\r\n                {\r\n                    if (_ownerGameObject.Observers.PostNotificationToJustSelf(tp, _owner, n)) handled = true;\r\n                }\r\n\r\n                if (bNotifyEntity)\r\n                {\r\n                    //TODO - a bottleneck here, consider possibilities of speeding this up by removing the need to constantly call 'FindRoot'\r\n                    var root = _ownerGameObject.FindRoot();\r\n                    GameObjectNotificationDispatcher dispatcher;\r\n                    if (root != _ownerGameObject.gameObject && root.GetComponent<GameObjectNotificationDispatcher>(out dispatcher))\r\n                    {\r\n                        if (dispatcher.Observers.PostNotificationToJustSelf(tp, _owner, n)) handled = true;\r\n                    }\r\n                }\r\n            }\r\n\r\n            //let anyone registered with the global hear about it\r\n            var globallyHandled = Notification.PostGlobalNotification(tp, _owner, n);\r\n\r\n            //if not handled, check if we should throw an exception\r\n            if (!(handled || globallyHandled) && System.Attribute.IsDefined(tp, typeof(RequireNotificationReceiverAttribute), false))\r\n            {\r\n                var requiredAttrib = tp.GetCustomAttributes(typeof(RequireNotificationReceiverAttribute), false).FirstOrDefault() as RequireNotificationReceiverAttribute;\r\n                if (requiredAttrib != null)\r\n                {\r\n                    if (!handled)\r\n                    {\r\n                        if (!requiredAttrib.GlobalObserverConsidered || !globallyHandled)\r\n                        {\r\n                            if (_ownerGameObject != null)\r\n                            {\r\n                                var root = _ownerGameObject.FindRoot();\r\n                                if (_owner is GameObjectNotificationDispatcher)\r\n                                {\r\n                                    throw new AbsentNotificationReceiverException(n, \"A GameObject named '\" + root.name + \"' requires a receiver to notification of type '\" + tp.Name + \"'.\");\r\n                                }\r\n                                else\r\n                                {\r\n                                    var senderTypeName = (_owner != null) ? _owner.GetType().Name : this.GetType().Name;\r\n                                    throw new AbsentNotificationReceiverException(n, \"An object of type '\" + senderTypeName + \"' on GameObject named '\" + root.name + \"' requires a receiver to notification of type '\" + tp.Name + \"'.\");\r\n                                }\r\n                            }\r\n                            else\r\n                            {\r\n                                var senderTypeName = (_owner != null) ? _owner.GetType().Name : this.GetType().Name;\r\n                                throw new AbsentNotificationReceiverException(n, \"An object of type '\" + senderTypeName + \"' requires a receiver to notification of type '\" + tp.Name + \"'.\");\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                return false;\r\n            }\r\n            {\r\n                return true;\r\n            }\r\n        }\r\n\r\n        \r\n        private bool PostNotificationToJustSelf(System.Type tp, object sender, Notification n)\r\n        {\r\n            bool bHandled = false;\r\n\r\n            var baseType = typeof(Notification);\r\n            System.Delegate d;\r\n            NotificationHandler ud;\r\n            while (baseType.IsAssignableFrom(tp))\r\n            {\r\n                if (_handlers.TryGetValue(tp, out d))\r\n                {\r\n                    if (d != null)\r\n                    {\r\n                        d.DynamicInvoke(sender, n);\r\n                        bHandled = true;\r\n                    }\r\n                }\r\n                if (_unsafeHandlers.TryGetValue(tp, out ud))\r\n                {\r\n                    if (ud != null)\r\n                    {\r\n                        //ud.DynamicInvoke(sender, n);\r\n                        ud(sender, n);\r\n                        bHandled = true;\r\n                    }\r\n                }\r\n\r\n                tp = tp.BaseType;\r\n            }\r\n\r\n            return bHandled;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Limited posting of a notification. Only handlers registered directly with this NotificationDispatcher will be notified. \r\n        /// Not even the global notification dispatcher will be signaled. This is for use if you want some special object to forward \r\n        /// a notification along as if it were in its hierarchy chain.\r\n        /// </summary>\r\n        /// <param name=\"tp\"></param>\r\n        /// <param name=\"n\"></param>\r\n        /// <returns></returns>\r\n        public bool ForwardNotificationToJustSelf(object sender, Notification n)\r\n        {\r\n            if (object.ReferenceEquals(sender, null)) throw new System.ArgumentNullException(\"sender\");\r\n            if (n == null) throw new System.ArgumentNullException(\"n\");\r\n\r\n            return PostNotificationToJustSelf(n.GetType(), sender, n);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region INotificationDispatcher Interface\r\n\r\n        NotificationDispatcher INotificationDispatcher.Observers\r\n        {\r\n            get { return this; }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    [DisallowMultipleComponent()]\r\n    public sealed class GameObjectNotificationDispatcher : MonoBehaviour, INotificationDispatcher\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private NotificationDispatcher _observers = new NotificationDispatcher();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private void Awake()\r\n        {\r\n            _observers.SetOwner(this);\r\n        }\r\n\r\n        private void OnDestroy()\r\n        {\r\n            _observers.PurgeHandlers();\r\n        }\r\n\r\n        private void OnDespawn()\r\n        {\r\n            _observers.PurgeHandlers();\r\n        }\r\n\r\n        #endregion\r\n\r\n        public System.Type[] ListObserveredNotifications()\r\n        {\r\n            return _observers.ListObservedNotifications();\r\n        }\r\n\r\n        public NotificationDispatcher Observers\r\n        {\r\n            get { return _observers; }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/IPausibleYieldInstruction.cs",
    "content": "﻿\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Receive a signal that the yielding RadicalCoroutine was paused, so that the instruction can deal with that state accordingly \r\n    /// if it must do something special. For example WaitForDuration wants to store the time so that when the coroutine resumes \r\n    /// it starts counting from the appropriate time instead of appearing finished.\r\n    /// </summary>\r\n    public interface IPausibleYieldInstruction : IRadicalYieldInstruction\r\n    {\r\n\r\n        void OnPause();\r\n        void OnResume();\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/IPooledYieldInstruction.cs",
    "content": "﻿\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// By implementing this interface, the RadicalCoroutine knows to call Dispose on the instruction when it is \r\n    /// done yielding for its duration. The instruction can than return itself to a object cache pool during Dispose \r\n    /// for reuse later.\r\n    /// </summary>\r\n    public interface IPooledYieldInstruction : IRadicalYieldInstruction, System.IDisposable\r\n    {\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/IProgressingYieldInstruction.cs",
    "content": "﻿\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Implement this if your RadicalYieldInstruction should have a progress property.\r\n    /// </summary>\r\n    public interface IProgressingYieldInstruction : IRadicalYieldInstruction\r\n    {\r\n        float Progress { get; }\r\n    }\r\n\r\n\r\n    /// <summary>\r\n    /// Base abstract class that implements IProgressingYieldInstruction. Inherit from this instead of directly implementing \r\n    /// IProgressingYieldInstruction, unless you can't otherwise.\r\n    /// </summary>\r\n    public class ProgressingYieldInstructionQueue : IProgressingYieldInstruction\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private IProgressingYieldInstruction[] _operations;\r\n        private bool _complete;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public ProgressingYieldInstructionQueue(params IProgressingYieldInstruction[] operations)\r\n        {\r\n            if (operations == null) throw new System.ArgumentNullException(\"operations\");\r\n            _operations = operations;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IProgressingAsyncOperation Interface\r\n\r\n        public float Progress\r\n        {\r\n            get\r\n            {\r\n                if (_operations.Length == 0) return 1f;\r\n                else if (_operations.Length == 1) return _operations[0].Progress;\r\n                else\r\n                {\r\n                    float p = 0f;\r\n                    for (int i = 0; i < _operations.Length; i++)\r\n                    {\r\n                        p += _operations[i].Progress;\r\n                    }\r\n                    return p / _operations.Length;\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool IsComplete\r\n        {\r\n            get\r\n            {\r\n                if (_complete) return true;\r\n                else\r\n                {\r\n                    for (int i = 0; i < _operations.Length; i++)\r\n                    {\r\n                        if (!_operations[i].IsComplete) return false;\r\n                    }\r\n                    _complete = true;\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            for (int i = 0; i < _operations.Length; i++)\r\n            {\r\n                if (!_operations[i].IsComplete)\r\n                {\r\n                    return _operations[i].Tick(out yieldObject);\r\n                }\r\n            }\r\n            yieldObject = null;\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/IRadicalEnumerator.cs",
    "content": "﻿\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// A contract joint of IEnumerator and IRadicalYieldInstruction. This can be implemented by an object that can be used in a dual way as either a IEnuemrator or a yield statement. \r\n    /// This is useful for objects that can be jsut directly tossed into 'MonoBehaviour.StartCoroutine' and do their job, or used as a yield instruction.\r\n    /// </summary>\r\n    public interface IRadicalEnumerator : System.Collections.IEnumerator, IRadicalYieldInstruction\r\n    {\r\n        //just a contract\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/IRadicalWaitHandle.cs",
    "content": "﻿\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    public interface IRadicalWaitHandle : IRadicalYieldInstruction\r\n    {\r\n\r\n        /// <summary>\r\n        /// The completion of the wait handle was the result of it being cancelled.\r\n        /// </summary>\r\n        bool Cancelled { get; }\r\n\r\n        /// <summary>\r\n        /// Called when the wait handle completed. This includes being cancelled. Check 'Cancelled' to know why it completed.\r\n        /// </summary>\r\n        /// <param name=\"callback\"></param>\r\n        void OnComplete(System.Action<IRadicalWaitHandle> callback);\r\n\r\n    }\r\n\r\n    public class RadicalWaitHandle : IRadicalWaitHandle, IPooledYieldInstruction\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private bool _complete;\r\n        private System.Action<IRadicalWaitHandle> _callback;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected RadicalWaitHandle()\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void SignalCancelled()\r\n        {\r\n            if (_complete) return;\r\n\r\n            _complete = true;\r\n            this.Cancelled = true;\r\n            if (_callback != null) _callback(this);\r\n        }\r\n\r\n        public void SignalComplete()\r\n        {\r\n            if (_complete) return;\r\n\r\n            _complete = true;\r\n            if (_callback != null) _callback(this);\r\n        }\r\n\r\n        public void Reset()\r\n        {\r\n            _complete = false;\r\n            _callback = null;\r\n            this.Cancelled = false;\r\n        }\r\n\r\n        protected virtual bool Tick(out object yieldObject)\r\n        {\r\n            yieldObject = null;\r\n            return !_complete;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalWaitHandle Interface\r\n\r\n        public bool Cancelled\r\n        {\r\n            get;\r\n            private set;\r\n        }\r\n\r\n        public bool IsComplete\r\n        {\r\n            get { return _complete; }\r\n        }\r\n\r\n        public void OnComplete(System.Action<IRadicalWaitHandle> callback)\r\n        {\r\n            if (callback == null) throw new System.ArgumentNullException(\"callback\");\r\n            if (_complete) throw new System.InvalidOperationException(\"Can not wait for complete on an already completed IRadicalWaitHandle.\");\r\n            _callback += callback;\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            if (_complete)\r\n            {\r\n                yieldObject = null;\r\n                return false;\r\n            }\r\n\r\n            return this.Tick(out yieldObject);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IPooledYieldInstruction Interface\r\n\r\n        void System.IDisposable.Dispose()\r\n        {\r\n            this.Reset();\r\n            if (this.GetType() == typeof(RadicalWaitHandle))\r\n            {\r\n                _pool.Release(this);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n\r\n        private static com.spacepuppy.Collections.ObjectCachePool<RadicalWaitHandle> _pool = new com.spacepuppy.Collections.ObjectCachePool<RadicalWaitHandle>(-1, () => new RadicalWaitHandle());\r\n\r\n        public static IRadicalWaitHandle Null\r\n        {\r\n            get\r\n            {\r\n                return NullYieldInstruction.Null;\r\n            }\r\n        }\r\n\r\n        public static RadicalWaitHandle Create()\r\n        {\r\n            return _pool.GetInstance();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/IRadicalYieldInstruction.cs",
    "content": "﻿\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Just a name for contract purposes. You should probably inherit from RadicalYieldInstruciton, or composite it, unless \r\n    /// you know what you're doing.\r\n    /// </summary>\r\n    public interface IRadicalYieldInstruction\r\n    {\r\n\r\n        /// <summary>\r\n        /// The instruction completed, but not necessarily successfully.\r\n        /// </summary>\r\n        bool IsComplete { get; }\r\n\r\n        ///// <summary>\r\n        ///// This method is called every tick of the RadicalCoroutine that is handling it.\r\n        ///// </summary>\r\n        ///// <returns>Return if the RadicalCoroutine should continue blocking (IsComplete should be false if this returns true)</returns>\r\n        //bool ContinueBlocking();\r\n        //object CurrentYieldObject { get; }\r\n\r\n        bool Tick(out object yieldObject);\r\n\r\n    }\r\n\r\n    /// <summary>\r\n    /// Base abstract class that implements IRadicalYieldInstruction. It implements IRadicalYieldInstruction in the most \r\n    /// commonly used setup. You should only ever implement IRadicalYieldInstruction directly if you can't inherit from this \r\n    /// in your inheritance chain, or you want none standard behaviour.\r\n    /// </summary>\r\n    public abstract class RadicalYieldInstruction : IRadicalYieldInstruction\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private bool _complete;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool IsComplete { get { return _complete; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected virtual void SetSignal()\r\n        {\r\n            _complete = true;\r\n        }\r\n\r\n        protected void ResetSignal()\r\n        {\r\n            _complete = false;\r\n        }\r\n\r\n        protected virtual bool Tick(out object yieldObject)\r\n        {\r\n            yieldObject = null;\r\n            return !_complete;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalYieldInstruction Interface\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            if (_complete)\r\n            {\r\n                yieldObject = null;\r\n                return false;\r\n            }\r\n\r\n            return this.Tick(out yieldObject);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region Static Interface\r\n\r\n        public static IProgressingYieldInstruction Null\r\n        {\r\n            get\r\n            {\r\n                return NullYieldInstruction.Null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/IRandom.cs",
    "content": "﻿namespace com.spacepuppy\r\n{\r\n\r\n    public interface IRandom\r\n    {\r\n\r\n        float Next();\r\n        double NextDouble();\r\n        int Next(int size);\r\n        int Next(int low, int high);\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/IResettingYieldInstruction.cs",
    "content": "﻿\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// By implementing this interface, the RadicalCoroutine knows to call Reset any time it receives the instruction \r\n    /// 'before' operating the instruction. This way an instruction can clean itself up for reuse if yielded more than once.\r\n    /// </summary>\r\n    public interface IResettingYieldInstruction : IRadicalYieldInstruction\r\n    {\r\n\r\n        void Reset();\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/ISPDisposable.cs",
    "content": "﻿namespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Intended for use with classes that wrap around UnityObjects and need to signal if that \r\n    /// object has been destroyed (would return true if compared to 'null'). \r\n    /// \r\n    /// This is complimented with an 'IsDisposed' extension method so that you can test diposed as \r\n    /// well as null reference all in one command. See com.spacepuppy.Utils.ObjUtil for more.\r\n    /// \r\n    /// This is primarily used outside of the spacepuppy base library, and instead the Anim/AI/Movement \r\n    /// libraries. For an example of its use in the base library see SPComponent or VariantReference.\r\n    /// </summary>\r\n    public interface ISPDisposable : System.IDisposable\r\n    {\r\n\r\n        bool IsDisposed { get; }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/ITimeSupplier.cs",
    "content": "﻿using System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Represents an object that supplies the current game time. See com.spacepuppy.SPTime.\r\n    /// </summary>\r\n    public interface ITimeSupplier\r\n    {\r\n\r\n        string Id { get; }\r\n\r\n        float Total { get; }\r\n        float Delta { get; }\r\n        float Scale { get; }\r\n\r\n        double TotalPrecise { get; }\r\n\r\n    }\r\n\r\n    /// <summary>\r\n    /// A ITimeSupplier that has a scale property (this gives things like Time.timeScale an object identity).  See com.spacepuppy.SPTime.\r\n    /// </summary>\r\n    public interface IScalableTimeSupplier : ITimeSupplier\r\n    {\r\n\r\n        event System.EventHandler TimeScaleChanged;\r\n\r\n        bool Paused { get; set; }\r\n\r\n\r\n        IEnumerable<string> ScaleIds { get; }\r\n\r\n        void SetScale(string id, float scale);\r\n        float GetScale(string id);\r\n        bool RemoveScale(string id);\r\n        bool HasScale(string id);\r\n\r\n    }\r\n\r\n    /// <summary>\r\n    /// Implement this interface if you want your custom time supplier type to receive update from SPTime when registered.\r\n    /// </summary>\r\n    public interface ICustomTimeSupplier : ITimeSupplier\r\n    {\r\n        void Update(bool isFixed);\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/IUpdateable.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n    public interface IUpdateable\r\n    {\r\n\r\n        void Update();\r\n\r\n    }\r\n\r\n    public class UpdatePump\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private HashSet<IUpdateable> _set = new HashSet<IUpdateable>();\r\n        private HashSet<IUpdateable> _toAdd = new HashSet<IUpdateable>();\r\n        private HashSet<IUpdateable> _toRemove = new HashSet<IUpdateable>();\r\n        private bool _inUpdate;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int Count\r\n        {\r\n            get { return _set.Count; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public bool Contains(IUpdateable obj)\r\n        {\r\n            return _set.Contains(obj);\r\n        }\r\n\r\n        public void Add(IUpdateable obj)\r\n        {\r\n            if (_inUpdate)\r\n            {\r\n                _toAdd.Add(obj);\r\n            }\r\n            else\r\n            {\r\n                _set.Add(obj);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Adds the IUpdateable after the next update cycle.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        public void DelayedAdd(IUpdateable obj)\r\n        {\r\n            _toAdd.Add(obj);\r\n        }\r\n\r\n        public void Remove(IUpdateable obj)\r\n        {\r\n            if (_inUpdate)\r\n            {\r\n                if (_set.Contains(obj))\r\n                    _toRemove.Add(obj);\r\n            }\r\n            else\r\n            {\r\n                _set.Remove(obj);\r\n            }\r\n        }\r\n\r\n        public void Update()\r\n        {\r\n            _inUpdate = true;\r\n            var e = _set.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                e.Current.Update();\r\n            }\r\n            _inUpdate = false;\r\n\r\n            if (_toAdd.Count > 0)\r\n            {\r\n                e = _toAdd.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    _set.Add(e.Current);\r\n                }\r\n            }\r\n\r\n            if (_toRemove.Count > 0)\r\n            {\r\n                e = _toRemove.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    _set.Remove(e.Current);\r\n                }\r\n                _toRemove.Clear();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/KillableEntity.cs",
    "content": "﻿namespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Implement this interface if you want to write a script that handles how the entity is dealt with when 'Kill' is called on it. \r\n    /// This overrides the default behaviour of destroying the GameObject and child GameObjects. You will have to destroy the objects \r\n    /// as you see fit. This is useful for things like returning a GameObject to an object pool to be used later instead of destroying it. \r\n    /// Multiple IKillableEntity scripts on an entity will cause the kill calls to stack, so any script that contradicts another can result \r\n    /// in bugs.\r\n    /// </summary>\r\n    public interface IKillableEntity : IComponent\r\n    {\r\n\r\n        bool IsDead { get; }\r\n        void Kill();\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/MultiTag.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Project;\r\nusing com.spacepuppy.Utils;\r\nusing System.Collections;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    [AddComponentMenu(\"SpacePuppy/Multi Tag\")]\r\n    [DisallowMultipleComponent()]\r\n    public class MultiTag : SPComponent, IEnumerable<string>\r\n    {\r\n\r\n        #region Multiton Interface\r\n        \r\n        public static readonly MultiTagPool Pool = new MultiTagPool();\r\n\r\n\r\n        internal static bool TryGetMultiTag(GameObject go, out MultiTag c)\r\n        {\r\n            return Pool.TryGet(go, out c);\r\n        }\r\n\r\n        internal static MultiTag[] FindAll(string tag)\r\n        {\r\n            return (from c in MultiTag.Pool where c.HasTag(tag) select c).ToArray();\r\n        }\r\n\r\n        internal static void FindAll(string tag, ICollection<GameObject> coll)\r\n        {\r\n            var e = Pool.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                if (e.Current.HasTag(tag)) coll.Add(e.Current.gameObject);\r\n            }\r\n        }\r\n\r\n        internal static MultiTag Find(string tag)\r\n        {\r\n            var e = Pool.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if (e.Current.HasTag(tag)) return e.Current;\r\n            }\r\n            return null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private bool _searchableIfInactive;\r\n\r\n        [SerializeField]\r\n        private string[] _tags;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        // Use this for initialization\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            if(!this.gameObject.CompareTag(SPConstants.TAG_MULTITAG))\r\n                this.gameObject.tag = SPConstants.TAG_MULTITAG;\r\n        }\r\n\r\n        //protected override void OnStartOrEnable()\r\n        //{\r\n        //    Pool.AddReference(this);\r\n\r\n        //    base.OnStartOrEnable();\r\n        //}\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            Pool.AddReference(this);\r\n\r\n            base.OnEnable();\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            if(!_searchableIfInactive)\r\n                Pool.RemoveReference(this);\r\n        }\r\n\r\n        protected override void OnDestroy()\r\n        {\r\n            base.OnDestroy();\r\n\r\n            Pool.RemoveReference(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int Count { get { return (_tags != null) ? _tags.Length : 0; } }\r\n\r\n        public string this[int index]\r\n        {\r\n            get { return (_tags != null && index >= 0 && index < _tags.Length) ? _tags[index] : null; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void UpdateTags(IEnumerable<string> tags)\r\n        {\r\n            if (tags == null)\r\n            {\r\n                _tags = null;\r\n            }\r\n            else\r\n            {\r\n                _tags = (from s in tags where IsValidMultiTag(s) select s).ToArray();\r\n            }\r\n        }\r\n\r\n        public IEnumerable<string> GetTags()\r\n        {\r\n            if (_tags == null) yield break;\r\n\r\n            foreach (var tag in _tags) yield return tag;\r\n        }\r\n\r\n        public bool ContainsTag(string tag)\r\n        {\r\n            if (_tags == null || _tags.Length == 0) return MultiTag.IsEmptyTag(tag);\r\n            return System.Array.IndexOf(_tags, tag) >= 0;\r\n        }\r\n\r\n        public bool ContainsTag(params string[] tags)\r\n        {\r\n            if (_tags == null || _tags.Length == 0) return tags.Contains(SPConstants.TAG_UNTAGGED);\r\n            return _tags.ContainsAny(tags);\r\n        }\r\n\r\n        public bool ContainsTag(IEnumerable<string> tags)\r\n        {\r\n            if (_tags == null || _tags.Length == 0) return tags.Contains(SPConstants.TAG_UNTAGGED);\r\n            return _tags.ContainsAny(tags);\r\n        }\r\n\r\n        public void AddTag(string tag)\r\n        {\r\n            if (!IsValidMultiTag(tag)) return;\r\n\r\n            if (_tags == null)\r\n            {\r\n                _tags = new string[] { tag };\r\n            }\r\n            else\r\n            {\r\n                if (!_tags.Contains(tag))\r\n                {\r\n                    System.Array.Resize(ref _tags, _tags.Length + 1);\r\n                    _tags[_tags.Length - 1] = tag;\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool RemoveTag(string tag)\r\n        {\r\n            if (_tags == null) return false;\r\n\r\n            using (var lst = com.spacepuppy.Collections.TempCollection.GetList<string>(_tags))\r\n            {\r\n                if (lst.Remove(tag))\r\n                {\r\n                    _tags = lst.ToArray();\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public void ClearTags()\r\n        {\r\n            _tags = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public Enumerator GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator<string> IEnumerable<string>.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Methods\r\n\r\n        public static bool IsValidTag(string stag)\r\n        {\r\n            //TODO - need a way to find list of known tags\r\n            //return !string.IsNullOrEmpty(stag);\r\n            return TagData.Tags.Contains(stag);\r\n        }\r\n\r\n        public static bool IsValidActiveTag(string stag)\r\n        {\r\n            //return !string.IsNullOrEmpty(stag) && stag != SPConstants.TAG_UNTAGGED;\r\n            return TagData.Tags.Contains(stag) && stag != SPConstants.TAG_UNTAGGED;\r\n        }\r\n\r\n        public static bool IsValidMultiTag(string stag)\r\n        {\r\n            //return !string.IsNullOrEmpty(stag) && stag != SPConstants.TAG_UNTAGGED && stag != SPConstants.TAG_MULTITAG;\r\n            return TagData.Tags.Contains(stag) && stag != SPConstants.TAG_UNTAGGED && stag != SPConstants.TAG_MULTITAG;\r\n        }\r\n\r\n        public static bool IsEmptyTag(string stag)\r\n        {\r\n            return string.IsNullOrEmpty(stag) || stag == SPConstants.TAG_UNTAGGED;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public struct Enumerator : IEnumerator<string>\r\n        {\r\n\r\n            private MultiTag _multi;\r\n            private int _index;\r\n            private string _current;\r\n\r\n            public Enumerator(MultiTag multi)\r\n            {\r\n                _multi = multi;\r\n                _index = 0;\r\n                _current = null;\r\n            }\r\n\r\n            public string Current\r\n            {\r\n                get\r\n                {\r\n                    return _current;\r\n                }\r\n            }\r\n\r\n            object IEnumerator.Current\r\n            {\r\n                get\r\n                {\r\n                    return _current;\r\n                }\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                if (_multi == null || _multi._tags == null) return false;\r\n                if (_index >= _multi._tags.Length) return false;\r\n\r\n                _current = _multi._tags[_index];\r\n                _index++;\r\n                return true;\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                _multi = null;\r\n                _index = 0;\r\n                _current = null;\r\n            }\r\n\r\n            void System.Collections.IEnumerator.Reset()\r\n            {\r\n                _index = 0;\r\n            }\r\n\r\n        }\r\n        \r\n        public class MultiTagPool : MultitonPool<MultiTag>\r\n        {\r\n            private Dictionary<GameObject, MultiTag> _table = new Dictionary<GameObject, MultiTag>(ObjectReferenceEqualityComparer<GameObject>.Default);\r\n\r\n            public override void AddReference(MultiTag obj)\r\n            {\r\n                if (object.ReferenceEquals(obj, null)) throw new System.ArgumentNullException();\r\n\r\n                if (this.IsQuerying)\r\n                {\r\n                    if (!_table.Contains(obj)) this.QueryCompleteAction += () => _table[obj.gameObject] = obj;\r\n                }\r\n                else\r\n                {\r\n                    _table[obj.gameObject] = obj;\r\n                }\r\n\r\n                base.AddReference(obj);\r\n            }\r\n\r\n            public override bool RemoveReference(MultiTag obj)\r\n            {\r\n                if (object.ReferenceEquals(obj, null)) throw new System.ArgumentNullException();\r\n\r\n                if (this.IsQuerying)\r\n                {\r\n                    if (_table.Contains(obj))\r\n                    {\r\n                        this.QueryCompleteAction += () => _table.Remove(obj.gameObject);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    _table.Remove(obj.gameObject);\r\n                }\r\n\r\n                return base.RemoveReference(obj);\r\n            }\r\n\r\n            public bool TryGet(GameObject go, out MultiTag c)\r\n            {\r\n                if (_table.TryGetValue(go, out c))\r\n                {\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    c = go.GetComponent<MultiTag>();\r\n                    return c != null;\r\n                }\r\n            }\r\n\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    public static class MultiTagHelper\r\n    {\r\n\r\n        /// <summary>\r\n        /// Determines if GameObject has a tag.\r\n        /// </summary>\r\n        /// <param name=\"go\"></param>\r\n        /// <returns></returns>\r\n        public static bool HasTag(this GameObject go)\r\n        {\r\n            if (go == null) return false;\r\n\r\n            if (go.CompareTag(SPConstants.TAG_UNTAGGED)) return false;\r\n            \r\n            MultiTag c;\r\n            if (MultiTag.TryGetMultiTag(go, out c))\r\n                return c.Count > 0;\r\n            else\r\n                return true;\r\n        }\r\n\r\n        public static bool HasTag(this Component c)\r\n        {\r\n            if (c == null) throw new System.ArgumentNullException(\"c\");\r\n\r\n            return HasTag(c.gameObject);\r\n        }\r\n\r\n        /**\r\n         * HasTag\r\n         */\r\n\r\n        public static bool HasTag(this GameObject go, string stag)\r\n        {\r\n            if (go == null) return false;\r\n            if (go.CompareTag(stag)) return true;\r\n            \r\n            MultiTag c;\r\n            if (MultiTag.TryGetMultiTag(go, out c))\r\n                return c.ContainsTag(stag);\r\n            else\r\n                return false;\r\n        }\r\n\r\n        public static bool HasTag(this Component c, string stag)\r\n        {\r\n            if (c == null) return false;\r\n            return HasTag(c.gameObject, stag);\r\n        }\r\n\r\n        public static bool HasTag(this GameObject go, params string[] stags)\r\n        {\r\n            if (stags == null) return false;\r\n            if (go == null) return false;\r\n\r\n            MultiTag c;\r\n            if (MultiTag.TryGetMultiTag(go, out c))\r\n            {\r\n                return c.ContainsTag(stags);\r\n            }\r\n            else\r\n            {\r\n                foreach (var stag in stags)\r\n                {\r\n                    if (go.CompareTag(stag)) return true;\r\n                }\r\n            }\r\n            return false;\r\n        }\r\n\r\n        public static bool HasTag(this Component c, params string[] stags)\r\n        {\r\n            if (c == null) return false;\r\n            return HasTag(c.gameObject, stags);\r\n        }\r\n\r\n        public static bool HasTag(this GameObject go, IEnumerable<string> stags)\r\n        {\r\n            if (stags == null) return false;\r\n            if (go == null) return false;\r\n\r\n            MultiTag c;\r\n            if (MultiTag.TryGetMultiTag(go, out c))\r\n            {\r\n                return c.ContainsTag(stags);\r\n            }\r\n            else\r\n            {\r\n                return stags.Contains(go.tag);\r\n            }\r\n        }\r\n\r\n        public static bool HasTag(this Component c, IEnumerable<string> stags)\r\n        {\r\n            if (c == null) return false;\r\n            return HasTag(c.gameObject, stags);\r\n        }\r\n\r\n\r\n        /**\r\n         * AddTag\r\n         */\r\n\r\n        public static void AddTag(this GameObject go, string stag)\r\n        {\r\n            if (go == null) throw new System.ArgumentNullException(\"go\");\r\n\r\n            MultiTag multitag;\r\n            if (MultiTag.TryGetMultiTag(go, out multitag))\r\n            {\r\n                multitag.AddTag(stag);\r\n            }\r\n            else\r\n            {\r\n                //if (MultiTag.IsEmptyTag(go.tag))\r\n                if(go.CompareTag(SPConstants.TAG_UNTAGGED))\r\n                {\r\n                    go.tag = stag;\r\n                }\r\n                else if(!go.CompareTag(stag))\r\n                {\r\n                    var oldtag = go.tag;\r\n                    multitag = go.AddComponent<MultiTag>();\r\n                    multitag.AddTag(oldtag);\r\n                    multitag.AddTag(stag);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void AddTag(this Component c, string stag)\r\n        {\r\n            if (c == null) throw new System.ArgumentNullException(\"c\");\r\n\r\n            AddTag(c.gameObject, stag);\r\n        }\r\n\r\n        /**\r\n         * RemoveTag\r\n         */\r\n\r\n        public static void RemoveTag(this GameObject go, string stag, bool bDestroyMultiTagComponentOnEmpty = false)\r\n        {\r\n            if (go == null) throw new System.ArgumentNullException(\"go\");\r\n\r\n            MultiTag multitag;\r\n            if (MultiTag.TryGetMultiTag(go, out multitag))\r\n            {\r\n                multitag.RemoveTag(stag);\r\n                if (bDestroyMultiTagComponentOnEmpty && multitag.Count == 0)\r\n                {\r\n                    ObjUtil.SmartDestroy(multitag);\r\n                    go.tag = SPConstants.TAG_UNTAGGED;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (go.CompareTag(stag)) go.tag = SPConstants.TAG_UNTAGGED;\r\n            }\r\n        }\r\n\r\n        public static void RemoveTag(this Component c, string stag, bool bDestroyMultiTagComponentOnEmpty = false)\r\n        {\r\n            if (c == null) throw new System.ArgumentNullException(\"c\");\r\n\r\n            RemoveTag(c.gameObject, stag, bDestroyMultiTagComponentOnEmpty);\r\n        }\r\n\r\n        /**\r\n         * SetTag\r\n         */\r\n\r\n        public static void SetTag(this GameObject go, string stag, bool bDestroyMultiTagComponent = false)\r\n        {\r\n            if (go == null) throw new System.ArgumentNullException(\"go\");\r\n\r\n            if (bDestroyMultiTagComponent)\r\n            {\r\n                go.RemoveComponents<MultiTag>();\r\n                if (MultiTag.IsValidMultiTag(stag))\r\n                {\r\n                    go.tag = stag;\r\n                }\r\n                else\r\n                {\r\n                    go.tag = SPConstants.TAG_UNTAGGED;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                MultiTag multitag;\r\n                if (MultiTag.TryGetMultiTag(go, out multitag))\r\n                {\r\n                    multitag.ClearTags();\r\n                    if (MultiTag.IsValidMultiTag(stag)) multitag.AddTag(stag);\r\n                }\r\n                else if (MultiTag.IsValidMultiTag(stag))\r\n                {\r\n                    go.tag = stag;\r\n                }\r\n                else\r\n                {\r\n                    go.tag = SPConstants.TAG_UNTAGGED;\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void SetTag(this Component c, string stag, bool bDestroyMultiTagComponent = false)\r\n        {\r\n            if (c == null) throw new System.ArgumentNullException(\"c\");\r\n\r\n            SetTag(c.gameObject, stag, bDestroyMultiTagComponent);\r\n        }\r\n\r\n        /**\r\n         * ClearTag\r\n         */\r\n\r\n        public static void ClearTags(this GameObject go, bool bDestroyMultiTagComponent = false)\r\n        {\r\n            if (go == null) throw new System.ArgumentNullException(\"go\");\r\n            \r\n            MultiTag multitag;\r\n            if (MultiTag.TryGetMultiTag(go, out multitag))\r\n            {\r\n                if (bDestroyMultiTagComponent)\r\n                {\r\n                    ObjUtil.SmartDestroy(multitag);\r\n                    go.tag = SPConstants.TAG_UNTAGGED;\r\n                }\r\n                else\r\n                {\r\n                    multitag.ClearTags();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                go.tag = SPConstants.TAG_UNTAGGED;\r\n            }\r\n        }\r\n\r\n        public static void ClearTags(this Component c, bool bDestroyMultiTagComponent = false)\r\n        {\r\n            if (c == null) throw new System.ArgumentNullException(\"c\");\r\n\r\n            ClearTags(c.gameObject, bDestroyMultiTagComponent);\r\n        }\r\n\r\n        /**\r\n         * GetTags\r\n         */\r\n        \r\n        public static IEnumerable<string> GetTags(this GameObject go)\r\n        {\r\n            if (go == null) throw new System.ArgumentNullException(\"go\");\r\n\r\n            MultiTag multitag;\r\n            if (MultiTag.TryGetMultiTag(go, out multitag))\r\n            {\r\n                return multitag.GetTags();\r\n            }\r\n            else\r\n            {\r\n                return new string[] { go.tag };\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<string> GetTags(this Component c)\r\n        {\r\n            if (c == null) throw new System.ArgumentNullException(\"c\");\r\n\r\n            return GetTags(c.gameObject);\r\n        }\r\n\r\n        /**\r\n         * AddTags\r\n         */\r\n\r\n        public static void AddTags(this GameObject go, IEnumerable<string> tags)\r\n        {\r\n            if (go == null) throw new System.ArgumentNullException(\"go\");\r\n            if (tags == null) throw new System.ArgumentNullException(\"tags\");\r\n            \r\n            MultiTag multitag;\r\n            if (MultiTag.TryGetMultiTag(go, out multitag))\r\n            {\r\n                foreach (var t in tags)\r\n                {\r\n                    multitag.AddTag(t);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var oldtag = go.tag;\r\n                multitag = go.AddComponent<MultiTag>();\r\n                multitag.AddTag(oldtag);\r\n                foreach (var t in tags)\r\n                {\r\n                    multitag.AddTag(t);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void AddTags(this GameObject go, params string[] tags)\r\n        {\r\n            if (go == null) throw new System.ArgumentNullException(\"go\");\r\n            if (tags == null || tags.Length == 0) return;\r\n\r\n            MultiTag multitag;\r\n            if (MultiTag.TryGetMultiTag(go, out multitag))\r\n            {\r\n                foreach(var t in tags)\r\n                {\r\n                    multitag.AddTag(t);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (tags.Length > 1 || !go.CompareTag(SPConstants.TAG_UNTAGGED))\r\n                {\r\n                    var oldtag = go.tag;\r\n                    multitag = go.AddComponent<MultiTag>();\r\n                    multitag.AddTag(oldtag);\r\n                    foreach (var t in tags)\r\n                    {\r\n                        multitag.AddTag(t);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    go.tag = tags[0];\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void AddTags(this GameObject go, GameObject source)\r\n        {\r\n            if (go == null) throw new System.ArgumentNullException(\"go\");\r\n            if (source == null) throw new System.ArgumentNullException(\"source\");\r\n\r\n            MultiTag multitag;\r\n            if (MultiTag.TryGetMultiTag(go, out multitag))\r\n            {\r\n                MultiTag otherMultiTag;\r\n                if (MultiTag.TryGetMultiTag(source, out otherMultiTag))\r\n                {\r\n                    var e = otherMultiTag.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        multitag.AddTag(e.Current);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    multitag.AddTag(source.tag);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                MultiTag otherMultiTag;\r\n                if (MultiTag.TryGetMultiTag(source, out otherMultiTag))\r\n                {\r\n                    if(otherMultiTag.Count > 1 || !go.CompareTag(SPConstants.TAG_UNTAGGED))\r\n                    {\r\n                        var oldtag = go.tag;\r\n                        multitag = go.AddComponent<MultiTag>();\r\n                        multitag.AddTag(oldtag);\r\n                        var e = otherMultiTag.GetEnumerator();\r\n                        while (e.MoveNext())\r\n                        {\r\n                            multitag.AddTag(e.Current);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        go.tag = otherMultiTag[0];\r\n                    }\r\n                }\r\n                else if(!source.CompareTag(SPConstants.TAG_UNTAGGED))\r\n                {\r\n                    if (go.CompareTag(SPConstants.TAG_UNTAGGED))\r\n                    {\r\n                        go.tag = source.tag;\r\n                    }\r\n                    else\r\n                    {\r\n                        go.AddTag(source.tag);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void AddTags(this Component c, GameObject source)\r\n        {\r\n            if (c == null) throw new System.ArgumentNullException(\"c\");\r\n\r\n            AddTags(c.gameObject, source);\r\n        }\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/Notification.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Reflection;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n    /// <summary>\r\n    /// Allows registering for specific 'Types' of notification denoted by a class inherited from this class. \r\n    /// You can register for a notification from a specific object, or register for a type of notification globally. \r\n    /// You can register to listen to notifications directly from the object, a gameObject if that object is a gameObject supplier, \r\n    /// or from a root gameObject if that gameObject has a root other than itself.\r\n    /// \r\n    /// When using Unsafe access for adding and removing handlers. You must use the same for both. If you add a handler with Unsafe \r\n    /// you must remove it with Unsafe. If you add with the standard generic method, you must remove with the standard generic method.\r\n    /// </summary>\r\n    public abstract class Notification : System.EventArgs, ICloneable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public Notification()\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Post(INotificationDispatcher dispatcher, bool bNotifyEntity = false)\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICloneable Interface\r\n\r\n        public virtual object Clone()\r\n        {\r\n            return this.MemberwiseClone();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n\r\n        private static Dictionary<System.Type, System.Delegate> _globalHandlers = new Dictionary<System.Type, System.Delegate>();\r\n        private static Dictionary<System.Type, NotificationHandler> _unsafeGlobalHandlers = new Dictionary<Type, NotificationHandler>();\r\n\r\n        #region Global Notification Interface\r\n\r\n        public static void RegisterGlobalObserver<T>(NotificationHandler<T> handler) where T : Notification\r\n        {\r\n            if (handler == null) throw new System.ArgumentNullException(\"handler\");\r\n\r\n            var tp = typeof(T);\r\n            System.Delegate d;\r\n            if (_globalHandlers.TryGetValue(tp, out d))\r\n            {\r\n                _globalHandlers[tp] = System.Delegate.Combine(d, handler);\r\n            }\r\n            else\r\n            {\r\n                _globalHandlers[tp] = handler;\r\n            }\r\n        }\r\n\r\n        public static void RemoveGlobalObserver<T>(NotificationHandler<T> handler) where T : Notification\r\n        {\r\n            if (handler == null) throw new System.ArgumentNullException(\"handler\");\r\n\r\n            var tp = typeof(T);\r\n            System.Delegate d;\r\n            if(_globalHandlers.TryGetValue(tp, out d))\r\n            {\r\n                d = System.Delegate.Remove(d, handler);\r\n                if (d == null)\r\n                {\r\n                    _globalHandlers.Remove(tp);\r\n                }\r\n                else\r\n                {\r\n                    _globalHandlers[tp] = d;\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void UnsafeRegisterGlobalObserver(System.Type notificationType, NotificationHandler handler)\r\n        {\r\n            if (notificationType == null) throw new System.ArgumentNullException(\"notificationType\");\r\n            if (!TypeUtil.IsType(notificationType, typeof(Notification))) throw new TypeArgumentMismatchException(notificationType, typeof(Notification), \"notificationType\");\r\n            if (handler == null) throw new System.ArgumentNullException(\"handler\");\r\n\r\n            NotificationHandler d;\r\n            if (_unsafeGlobalHandlers.TryGetValue(notificationType, out d))\r\n            {\r\n                _unsafeGlobalHandlers[notificationType] = d + handler;\r\n            }\r\n            else\r\n            {\r\n                _unsafeGlobalHandlers[notificationType] = handler;\r\n            }\r\n        }\r\n\r\n        public static void UnsafeRemoveGlobalObserver(System.Type notificationType, NotificationHandler handler)\r\n        {\r\n            if (notificationType == null) throw new System.ArgumentNullException(\"notificationType\");\r\n            if (!TypeUtil.IsType(notificationType, typeof(Notification))) throw new TypeArgumentMismatchException(notificationType, typeof(Notification), \"notificationType\");\r\n            if (handler == null) throw new System.ArgumentNullException(\"handler\");\r\n\r\n            NotificationHandler d;\r\n            if (_unsafeGlobalHandlers.TryGetValue(notificationType, out d))\r\n            {\r\n                d -= handler;\r\n                if (d != null)\r\n                {\r\n                    _unsafeGlobalHandlers[notificationType] = d;\r\n                }\r\n                else\r\n                {\r\n                    _unsafeGlobalHandlers.Remove(notificationType);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static bool HasGlobalObserver<T>() where T : Notification\r\n        {\r\n            return HasGlobalObserver(typeof(T));\r\n        }\r\n\r\n        public static bool HasGlobalObserver(System.Type notificationType)\r\n        {\r\n            if (notificationType == null) throw new System.ArgumentNullException(\"notificationType\");\r\n            if (!TypeUtil.IsType(notificationType, typeof(Notification))) throw new TypeArgumentMismatchException(notificationType, typeof(Notification), \"notificationType\");\r\n\r\n            var baseType = typeof(Notification);\r\n\r\n            while (baseType.IsAssignableFrom(notificationType))\r\n            {\r\n                if (_globalHandlers.ContainsKey(notificationType) || _unsafeGlobalHandlers.ContainsKey(notificationType)) return true;\r\n                notificationType = notificationType.BaseType;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        internal static bool PostGlobalNotification(System.Type tp, object sender, Notification n)\r\n        {\r\n            bool bHandled = false;\r\n\r\n            var baseType = typeof(Notification);\r\n            while (baseType.IsAssignableFrom(tp))\r\n            {\r\n                if (_globalHandlers.ContainsKey(tp))\r\n                {\r\n                    var d = _globalHandlers[tp];\r\n                    if (d != null)\r\n                    {\r\n                        d.DynamicInvoke(sender, n);\r\n                        bHandled = true;\r\n                    }\r\n                }\r\n                if (_unsafeGlobalHandlers.ContainsKey(tp))\r\n                {\r\n                    var d = _unsafeGlobalHandlers[tp];\r\n                    if(d != null)\r\n                    {\r\n                        d(sender, n);\r\n                        bHandled = true;\r\n                    }\r\n                }\r\n\r\n                tp = tp.BaseType;\r\n            }\r\n\r\n            return bHandled;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Instance Notification Interface\r\n\r\n        public static void RegisterObserver<T>(INotificationDispatcher sender, NotificationHandler<T> handler) where T : Notification\r\n        {\r\n            if (sender == null) throw new System.ArgumentNullException(\"sender\");\r\n            if (handler == null) throw new System.ArgumentNullException(\"handler\");\r\n\r\n            sender.Observers.RegisterObserver<T>(handler);\r\n        }\r\n\r\n        public static void RegisterObserver<T>(object sender, NotificationHandler<T> handler) where T : Notification\r\n        {\r\n            if (sender == null) throw new System.ArgumentNullException(\"sender\");\r\n            if (handler == null) throw new System.ArgumentNullException(\"handler\");\r\n\r\n            if (sender is INotificationDispatcher)\r\n            {\r\n                (sender as INotificationDispatcher).Observers.RegisterObserver<T>(handler);\r\n            }\r\n            else if (GameObjectUtil.IsGameObjectSource(sender))\r\n            {\r\n                var dispatcher = GameObjectUtil.GetGameObjectFromSource(sender).AddOrGetComponent<GameObjectNotificationDispatcher>();\r\n                dispatcher.Observers.RegisterObserver<T>(handler);\r\n            }\r\n            else\r\n            {\r\n                throw new System.ArgumentException(\"Sender is not a NotificationDispatcher.\", \"sender\");\r\n            }\r\n        }\r\n\r\n        public static void RemoveObserver<T>(INotificationDispatcher sender, NotificationHandler<T> handler) where T : Notification\r\n        {\r\n            if (object.ReferenceEquals(sender, null)) throw new System.ArgumentNullException(\"sender\");\r\n            if (handler == null) throw new System.ArgumentNullException(\"handler\");\r\n\r\n            sender.Observers.RemoveObserver<T>(handler);\r\n        }\r\n\r\n        public static void RemoveObserver<T>(object sender, NotificationHandler<T> handler) where T : Notification\r\n        {\r\n            if (object.ReferenceEquals(sender, null)) throw new System.ArgumentNullException(\"sender\");\r\n            if (handler == null) throw new System.ArgumentNullException(\"handler\");\r\n\r\n            if (sender is INotificationDispatcher)\r\n            {\r\n                (sender as INotificationDispatcher).Observers.RemoveObserver<T>(handler);\r\n            }\r\n            else if (GameObjectUtil.IsGameObjectSource(sender))\r\n            {\r\n                var dispatcher = GameObjectUtil.GetGameObjectFromSource(sender).GetComponent<GameObjectNotificationDispatcher>();\r\n                if (dispatcher != null) dispatcher.Observers.RemoveObserver<T>(handler);\r\n            }\r\n            else\r\n            {\r\n                throw new System.ArgumentException(\"Sender is not a NotificationDispatcher.\", \"sender\");\r\n            }\r\n        }\r\n\r\n        public static void UnsafeRegisterObserver(System.Type notificationType, INotificationDispatcher sender, NotificationHandler handler)\r\n        {\r\n            if (notificationType == null) throw new System.ArgumentNullException(\"notificationType\");\r\n            if (!TypeUtil.IsType(notificationType, typeof(Notification))) throw new TypeArgumentMismatchException(notificationType, typeof(Notification), \"notificationType\");\r\n            if (sender == null) throw new System.ArgumentNullException(\"sender\");\r\n            if (handler == null) throw new System.ArgumentNullException(\"handler\");\r\n\r\n            sender.Observers.UnsafeRegisterObserver(notificationType, handler);\r\n        }\r\n\r\n        public static void UnsafeRegisterObserver(System.Type notificationType, object sender, NotificationHandler handler)\r\n        {\r\n            if (notificationType == null) throw new System.ArgumentNullException(\"notificationType\");\r\n            if (!TypeUtil.IsType(notificationType, typeof(Notification))) throw new TypeArgumentMismatchException(notificationType, typeof(Notification), \"notificationType\");\r\n            if (sender == null) throw new System.ArgumentNullException(\"sender\");\r\n            if (handler == null) throw new System.ArgumentNullException(\"handler\");\r\n\r\n            if (sender is INotificationDispatcher)\r\n            {\r\n                (sender as INotificationDispatcher).Observers.UnsafeRegisterObserver(notificationType, handler);\r\n            }\r\n            else if (GameObjectUtil.IsGameObjectSource(sender))\r\n            {\r\n                var dispatcher = GameObjectUtil.GetGameObjectFromSource(sender).AddOrGetComponent<GameObjectNotificationDispatcher>();\r\n                dispatcher.Observers.UnsafeRegisterObserver(notificationType, handler);\r\n            }\r\n            else\r\n            {\r\n                throw new System.ArgumentException(\"Sender is not a NotificationDispatcher.\", \"sender\");\r\n            }\r\n        }\r\n\r\n        public static void UnsafeRemoveObserver(System.Type notificationType, INotificationDispatcher sender, NotificationHandler handler)\r\n        {\r\n            if (notificationType == null) throw new System.ArgumentNullException(\"notificationType\");\r\n            if (!TypeUtil.IsType(notificationType, typeof(Notification))) throw new TypeArgumentMismatchException(notificationType, typeof(Notification), \"notificationType\");\r\n            if (object.ReferenceEquals(sender, null)) throw new System.ArgumentNullException(\"sender\");\r\n            if (handler == null) throw new System.ArgumentNullException(\"handler\");\r\n\r\n            sender.Observers.UnsafeRemoveObserver(notificationType, handler);\r\n        }\r\n\r\n        public static void UnsafeRemoveObserver(System.Type notificationType, object sender, NotificationHandler handler)\r\n        {\r\n            if (notificationType == null) throw new System.ArgumentNullException(\"notificationType\");\r\n            if (!TypeUtil.IsType(notificationType, typeof(Notification))) throw new TypeArgumentMismatchException(notificationType, typeof(Notification), \"notificationType\");\r\n            if (object.ReferenceEquals(sender, null)) throw new System.ArgumentNullException(\"sender\");\r\n            if (handler == null) throw new System.ArgumentNullException(\"handler\");\r\n\r\n            if (sender is INotificationDispatcher)\r\n            {\r\n                (sender as INotificationDispatcher).Observers.UnsafeRemoveObserver(notificationType, handler);\r\n            }\r\n            else if (GameObjectUtil.IsGameObjectSource(sender))\r\n            {\r\n                var dispatcher = GameObjectUtil.GetGameObjectFromSource(sender).GetComponent<GameObjectNotificationDispatcher>();\r\n                if (dispatcher != null) dispatcher.Observers.UnsafeRemoveObserver(notificationType, handler);\r\n            }\r\n            else\r\n            {\r\n                throw new System.ArgumentException(\"Sender is not a NotificationDispatcher.\", \"sender\");\r\n            }\r\n        }\r\n\r\n        public static bool HasObserver<T>(INotificationDispatcher sender, bool bNotifyEntity = false) where T : Notification\r\n        {\r\n            if (object.ReferenceEquals(sender, null)) throw new ArgumentNullException(\"sender\");\r\n\r\n            return sender.Observers.HasObserver<T>(bNotifyEntity);\r\n        }\r\n\r\n        public static bool HasObserver<T>(object sender, bool bNotifyEntity = false) where T : Notification\r\n        {\r\n            if (object.ReferenceEquals(sender, null)) throw new ArgumentNullException(\"sender\");\r\n\r\n            if (sender is INotificationDispatcher)\r\n            {\r\n                return (sender as INotificationDispatcher).Observers.HasObserver<T>(bNotifyEntity);\r\n            }\r\n            else if (GameObjectUtil.IsGameObjectSource(sender))\r\n            {\r\n                if (bNotifyEntity)\r\n                {\r\n                    var dispatcher = GameObjectUtil.GetGameObjectFromSource(sender).AddOrGetComponent<GameObjectNotificationDispatcher>();\r\n                    return dispatcher.Observers.HasObserver<T>(bNotifyEntity);\r\n                }\r\n                else\r\n                {\r\n                    var dispatcher = GameObjectUtil.GetGameObjectFromSource(sender).GetComponent<GameObjectNotificationDispatcher>();\r\n                    return dispatcher != null && dispatcher.Observers.HasObserver<T>(bNotifyEntity);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new System.ArgumentException(\"Sender is not a NotificationDispatcher.\", \"sender\");\r\n            }\r\n        }\r\n\r\n        public static bool HasObserver(System.Type notificationType, INotificationDispatcher sender, bool bNotifyEntity = false)\r\n        {\r\n            if (notificationType == null || !TypeUtil.IsType(notificationType, typeof(Notification))) throw new TypeArgumentMismatchException(notificationType, typeof(Notification), \"notificationType\");\r\n            if (object.ReferenceEquals(sender, null)) throw new ArgumentNullException(\"sender\");\r\n\r\n            return sender.Observers.HasObserver(notificationType, bNotifyEntity);\r\n        }\r\n\r\n        public static bool HasObserver(System.Type notificationType, object sender, bool bNotifyEntity = false)\r\n        {\r\n            if (notificationType == null) throw new System.ArgumentNullException(\"notificationType\");\r\n            if (!TypeUtil.IsType(notificationType, typeof(Notification))) throw new TypeArgumentMismatchException(notificationType, typeof(Notification), \"notificationType\");\r\n            if (object.ReferenceEquals(sender, null)) throw new ArgumentNullException(\"sender\");\r\n\r\n            if (sender is INotificationDispatcher)\r\n            {\r\n                return (sender as INotificationDispatcher).Observers.HasObserver(notificationType, bNotifyEntity);\r\n            }\r\n            else if (GameObjectUtil.IsGameObjectSource(sender))\r\n            {\r\n                if (bNotifyEntity)\r\n                {\r\n                    var dispatcher = GameObjectUtil.GetGameObjectFromSource(sender).AddOrGetComponent<GameObjectNotificationDispatcher>();\r\n                    return dispatcher.Observers.HasObserver(notificationType, bNotifyEntity);\r\n                }\r\n                else\r\n                {\r\n                    var dispatcher = GameObjectUtil.GetGameObjectFromSource(sender).GetComponent<GameObjectNotificationDispatcher>();\r\n                    return dispatcher != null && dispatcher.Observers.HasObserver(notificationType, bNotifyEntity);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new System.ArgumentException(\"Sender is not a NotificationDispatcher.\", \"sender\");\r\n            }\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n        /// <summary>\r\n        /// Posts a notification of type T. Returns true if an observer was found and received the notification.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"sender\"></param>\r\n        /// <param name=\"notification\"></param>\r\n        /// <param name=\"bNotifyEntity\"></param>\r\n        /// <returns></returns>\r\n        public static bool PostNotification<T>(INotificationDispatcher sender, T notification, bool bNotifyEntity = false) where T : Notification\r\n        {\r\n            if (sender == null) throw new ArgumentNullException(\"sender\");\r\n            if (notification == null) throw new ArgumentNullException(\"notification\");\r\n\r\n            return sender.Observers.PostNotification<T>(notification, bNotifyEntity);\r\n        }\r\n\r\n        public static bool PostNotification<T>(UnityEngine.GameObject sender, T notification, bool bNotifyEntity = false) where T : Notification\r\n        {\r\n            if (sender == null) throw new ArgumentNullException(\"sender\");\r\n            if (notification == null) throw new ArgumentNullException(\"notification\");\r\n\r\n            if (bNotifyEntity)\r\n            {\r\n                var dispatcher = sender.AddOrGetComponent<GameObjectNotificationDispatcher>();\r\n                return dispatcher.Observers.PostNotification<T>(notification, bNotifyEntity);\r\n            }\r\n            else\r\n            {\r\n                var dispatcher = sender.GetComponent<GameObjectNotificationDispatcher>();\r\n                return dispatcher != null && dispatcher.Observers.PostNotification<T>(notification, bNotifyEntity);\r\n            }\r\n        }\r\n\r\n        public static bool UnsafePostNotification(INotificationDispatcher sender, Notification notification, bool bNotifyEntity = false)\r\n        {\r\n            if (sender == null) throw new ArgumentNullException(\"sender\");\r\n            if (notification == null) throw new ArgumentNullException(\"notification\");\r\n\r\n            return sender.Observers.UnsafePostNotification(notification, bNotifyEntity);\r\n        }\r\n\r\n        public static bool UnsafePostNotification(object sender, Notification notification, bool bNotifyEntity = false)\r\n        {\r\n            if (sender == null) throw new ArgumentNullException(\"sender\");\r\n            if (notification == null) throw new ArgumentNullException(\"notification\");\r\n\r\n            if (sender is INotificationDispatcher)\r\n            {\r\n                return (sender as INotificationDispatcher).Observers.UnsafePostNotification(notification, bNotifyEntity);\r\n            }\r\n            else if (GameObjectUtil.IsGameObjectSource(sender))\r\n            {\r\n                if (bNotifyEntity)\r\n                {\r\n                    var dispatcher = GameObjectUtil.GetGameObjectFromSource(sender).AddOrGetComponent<GameObjectNotificationDispatcher>();\r\n                    return dispatcher.Observers.UnsafePostNotification(notification, bNotifyEntity);\r\n                }\r\n                else\r\n                {\r\n                    var dispatcher = GameObjectUtil.GetGameObjectFromSource(sender).GetComponent<GameObjectNotificationDispatcher>();\r\n                    return dispatcher != null && dispatcher.Observers.UnsafePostNotification(notification, bNotifyEntity);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new System.ArgumentException(\"Sender is not a NotificationDispatcher.\", \"sender\");\r\n            }\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n        /*\r\n        public static bool PostNotification<T>(object sender, T notification, bool bNotifyEntity = false) where T : Notification\r\n        {\r\n            if (sender == null) throw new ArgumentNullException(\"sender\");\r\n            if (notification == null) throw new ArgumentNullException(\"notification\");\r\n\r\n            if (sender is INotificationDispatcher)\r\n            {\r\n                return (sender as INotificationDispatcher).PostNotification<T>(notification, bNotifyEntity);\r\n            }\r\n            else if (GameObjectUtil.IsGameObjectSource(sender))\r\n            {\r\n                if (bNotifyEntity)\r\n                {\r\n                    var dispatcher = GameObjectUtil.GetGameObjectFromSource(sender).AddOrGetComponent<GameObjectNotificationDispatcher>();\r\n                    return dispatcher.PostNotification<T>(notification, bNotifyEntity);\r\n                }\r\n                else\r\n                {\r\n                    var dispatcher = GameObjectUtil.GetGameObjectFromSource(sender).GetComponent<GameObjectNotificationDispatcher>();\r\n                    return dispatcher != null && dispatcher.PostNotification<T>(notification, bNotifyEntity);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new System.ArgumentException(\"Sender is not a NotificationDispatcher.\", \"sender\");\r\n            }\r\n        }\r\n         */\r\n\r\n        #endregion\r\n\r\n        #region Purge/Clean Utilities\r\n\r\n        public static void PurgeHandlers(UnityEngine.GameObject go)\r\n        {\r\n            using (var lst = com.spacepuppy.Collections.TempCollection.GetList<INotificationDispatcher>())\r\n            {\r\n                go.GetComponents<INotificationDispatcher>(lst);\r\n                var e = lst.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    e.Current.Observers.PurgeHandlers();\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #endregion\r\n\r\n\r\n        #region Temp Interface\r\n\r\n        private static Dictionary<System.Type, TempState> _tempNotifTable;\r\n\r\n        /// <summary>\r\n        /// Attempts to get a cached version of the notification, or creates a new one. \r\n        /// Use this in tandem with Release to create temp notifications with low GC footprint.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <returns></returns>\r\n        protected static bool TryGetCache<T>(out T obj) where T : Notification\r\n        {\r\n            if (_tempNotifTable == null)\r\n                _tempNotifTable = new Dictionary<Type, TempState>();\r\n\r\n            var tp = typeof(T);\r\n            TempState state;\r\n            if (_tempNotifTable.TryGetValue(tp, out state))\r\n            {\r\n                if(state != null && state.Notif != null)\r\n                {\r\n                    obj = state.Notif as T;\r\n                    state.Notif = null;\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    obj = null;\r\n                    return false;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                _tempNotifTable[tp] = null; //add the key with no state, to represent this is the first potential of caching\r\n                obj = null;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Release a temporary notification so it can be recycled for later use. The notification should have been created using \r\n        /// a static Create method on the notification type itself.\r\n        /// </summary>\r\n        /// <param name=\"notif\"></param>\r\n        public static void Release(Notification notif)\r\n        {\r\n            if (notif == null) throw new System.ArgumentNullException(\"notif\");\r\n            if (_tempNotifTable == null) return;\r\n\r\n            var tp = notif.GetType();\r\n            TempState state;\r\n            if (!_tempNotifTable.TryGetValue(tp, out state))\r\n                return; //if the key wasn't in there, then this notif type shouldn't be cached\r\n\r\n            if(state != null)\r\n            {\r\n                if (state.Notif != null) return;\r\n\r\n                state.Notif = notif;\r\n            }\r\n            else\r\n            {\r\n                state = new TempState();\r\n                state.Notif = notif;\r\n                state.Fields = tp.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);\r\n                _tempNotifTable[tp] = state;\r\n            }\r\n\r\n            foreach(var f in state.Fields)\r\n            {\r\n                try\r\n                {\r\n                    f.SetValue(notif, null);\r\n                }\r\n                catch { }\r\n            }\r\n        }\r\n        \r\n        private class TempState\r\n        {\r\n            public Notification Notif;\r\n            public FieldInfo[] Fields;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n    \r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/NullYieldInstruction.cs",
    "content": "﻿\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    public class NullYieldInstruction : IProgressingYieldInstruction, IRadicalWaitHandle\r\n    {\r\n\r\n        #region COSNTRUCTOR\r\n\r\n        private NullYieldInstruction()\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalYieldInstruction Interface\r\n\r\n        bool IRadicalYieldInstruction.IsComplete\r\n        {\r\n            get { return true; }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            yieldObject = null;\r\n            return false;\r\n        }\r\n\r\n        float IProgressingYieldInstruction.Progress\r\n        {\r\n            get { return 1f; }\r\n        }\r\n\r\n        void IRadicalWaitHandle.OnComplete(System.Action<IRadicalWaitHandle> callback)\r\n        {\r\n            //do nothing\r\n        }\r\n\r\n        bool IRadicalWaitHandle.Cancelled\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n\r\n        private static NullYieldInstruction _null = new NullYieldInstruction();\r\n        public static NullYieldInstruction Null\r\n        {\r\n            get\r\n            {\r\n                return _null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Numeric.cs",
    "content": "﻿using System;\nusing UnityEngine;\n\nnamespace com.spacepuppy\n{\n\n    /// <summary>\n    /// General interface for custom numeric types like fixedpoint, discrete float, etc. \n    /// Numerics should usually be a struct type, but is not required.\n    /// </summary>\n    public interface INumeric : IConvertible\n    {\n\n        /// <summary>\n        /// Returns the byte reprsentation of the numeric value.\n        /// When implementing this methods, if you need to convert C# built-in numeric types make sure they're in big-endian. \n        /// Use the 'Numerics' static class as a helper tool to do this.\n        /// </summary>\n        /// <returns></returns>\n        byte[] ToByteArray();\n        /// <summary>\n        /// Sets the numeric value based on some byte array.\n        /// When implementing this methods, if you need to convert C# built-in numeric types make sure they're in big-endian. \n        /// Use the 'Numerics' static class as a helper tool to do this.\n        /// </summary>\n        /// <param name=\"arr\"></param>\n        void FromByteArray(byte[] arr);\n\n        /// <summary>\n        /// Get the type code the underlying data can losslessly be converted to for easy storing.\n        /// </summary>\n        /// <returns></returns>\n        TypeCode GetUnderlyingTypeCode();\n\n        /// <summary>\n        /// Set value based on a long.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        void FromLong(long value);\n\n        /// <summary>\n        /// Set value based on a double.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        void FromDouble(double value);\n\n    }\n\n    public static class Numerics\n    {\n        \n        public static INumeric CreateNumeric<T>(byte[] data) where T : INumeric\n        {\n            var value = System.Activator.CreateInstance<T>();\n            if (value != null) value.FromByteArray(data);\n            return value;\n        }\n\n        public static INumeric CreateNumeric<T>(long data) where T : INumeric\n        {\n            var value = System.Activator.CreateInstance<T>();\n            if (value != null) value.FromLong(data);\n            return value;\n        }\n\n        public static INumeric CreateNumeric<T>(double data) where T : INumeric\n        {\n            var value = System.Activator.CreateInstance<T>();\n            if (value != null) value.FromDouble(data);\n            return value;\n        }\n        \n        public static INumeric CreateNumeric(System.Type tp, byte[] data)\n        {\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\n            if (!typeof(INumeric).IsAssignableFrom(tp) && !tp.IsAbstract) throw new System.ArgumentException(\"Type must implement INumeric.\");\n\n            var value = System.Activator.CreateInstance(tp) as INumeric;\n            if (value != null) value.FromByteArray(data);\n            return value;\n        }\n\n        public static INumeric CreateNumeric(System.Type tp, long data)\n        {\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\n            if (!typeof(INumeric).IsAssignableFrom(tp) && !tp.IsAbstract) throw new System.ArgumentException(\"Type must implement INumeric.\");\n\n            var value = System.Activator.CreateInstance(tp) as INumeric;\n            if (value != null) value.FromLong(data);\n            return value;\n        }\n\n        public static INumeric CreateNumeric(System.Type tp, double data)\n        {\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\n            if (!typeof(INumeric).IsAssignableFrom(tp) && !tp.IsAbstract) throw new System.ArgumentException(\"Type must implement INumeric.\");\n\n            var value = System.Activator.CreateInstance(tp) as INumeric;\n            if (value != null) value.FromDouble(data);\n            return value;\n        }\n\n\n        #region Bit Helpers\n\n        /// <summary>\n        /// Returns a byte representation in big-endian order.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static byte[] GetBytes(float value)\n        {\n            var result = BitConverter.GetBytes(value);\n            if (BitConverter.IsLittleEndian) System.Array.Reverse(result);\n            return result;\n        }\n\n        /// <summary>\n        /// Returns a byte representation in big-endian order.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static byte[] GetBytes(double value)\n        {\n            var result = BitConverter.GetBytes(value);\n            if (BitConverter.IsLittleEndian) System.Array.Reverse(result);\n            return result;\n        }\n\n        /// <summary>\n        /// Returns a byte representation in big-endian order.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static byte[] GetBytes(Int16 value)\n        {\n            var result = BitConverter.GetBytes(value);\n            if (BitConverter.IsLittleEndian) System.Array.Reverse(result);\n            return result;\n        }\n\n        /// <summary>\n        /// Returns a byte representation in big-endian order.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static byte[] GetBytes(Int32 value)\n        {\n            var result = BitConverter.GetBytes(value);\n            if (BitConverter.IsLittleEndian) System.Array.Reverse(result);\n            return result;\n        }\n\n        /// <summary>\n        /// Returns a byte representation in big-endian order.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static byte[] GetBytes(Int64 value)\n        {\n            var result = BitConverter.GetBytes(value);\n            if (BitConverter.IsLittleEndian) System.Array.Reverse(result);\n            return result;\n        }\n\n        /// <summary>\n        /// Returns a byte representation in big-endian order.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static byte[] GetBytes(UInt16 value)\n        {\n            var result = BitConverter.GetBytes(value);\n            if (BitConverter.IsLittleEndian) System.Array.Reverse(result);\n            return result;\n        }\n\n        /// <summary>\n        /// Returns a byte representation in big-endian order.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static byte[] GetBytes(UInt32 value)\n        {\n            var result = BitConverter.GetBytes(value);\n            if (BitConverter.IsLittleEndian) System.Array.Reverse(result);\n            return result;\n        }\n\n        /// <summary>\n        /// Returns a byte representation in big-endian order.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static byte[] GetBytes(UInt64 value)\n        {\n            var result = BitConverter.GetBytes(value);\n            if (BitConverter.IsLittleEndian) System.Array.Reverse(result);\n            return result;\n        }\n\n        /// <summary>\n        /// Converts a byte array in big-endian form to a numeric value.\n        /// </summary>\n        /// <param name=\"arr\"></param>\n        /// <returns></returns>\n        public static float ToSingle(byte[] arr)\n        {\n            if (BitConverter.IsLittleEndian)\n                System.Array.Reverse(arr);\n            return BitConverter.ToSingle(arr, 0);\n        }\n\n        /// <summary>\n        /// Converts a byte array in big-endian form to a numeric value.\n        /// </summary>\n        /// <param name=\"arr\"></param>\n        /// <returns></returns>\n        public static double ToDouble(byte[] arr)\n        {\n            if (BitConverter.IsLittleEndian)\n                System.Array.Reverse(arr);\n            return BitConverter.ToDouble(arr, 0);\n        }\n\n        /// <summary>\n        /// Converts a byte array in big-endian form to a numeric value.\n        /// </summary>\n        /// <param name=\"arr\"></param>\n        /// <returns></returns>\n        public static Int16 ToInt16(byte[] arr)\n        {\n            if (BitConverter.IsLittleEndian)\n                System.Array.Reverse(arr);\n            return BitConverter.ToInt16(arr, 0);\n        }\n\n        /// <summary>\n        /// Converts a byte array in big-endian form to a numeric value.\n        /// </summary>\n        /// <param name=\"arr\"></param>\n        /// <returns></returns>\n        public static Int32 ToInt32(byte[] arr)\n        {\n            if (BitConverter.IsLittleEndian)\n                System.Array.Reverse(arr);\n            return BitConverter.ToInt32(arr, 0);\n        }\n\n        /// <summary>\n        /// Converts a byte array in big-endian form to a numeric value.\n        /// </summary>\n        /// <param name=\"arr\"></param>\n        /// <returns></returns>\n        public static Int64 ToInt64(byte[] arr)\n        {\n            if (BitConverter.IsLittleEndian)\n                System.Array.Reverse(arr);\n            return BitConverter.ToInt64(arr, 0);\n        }\n\n        /// <summary>\n        /// Converts a byte array in big-endian form to a numeric value.\n        /// </summary>\n        /// <param name=\"arr\"></param>\n        /// <returns></returns>\n        public static UInt16 ToUInt16(byte[] arr)\n        {\n            if (BitConverter.IsLittleEndian)\n                System.Array.Reverse(arr);\n            return BitConverter.ToUInt16(arr, 0);\n        }\n\n        /// <summary>\n        /// Converts a byte array in big-endian form to a numeric value.\n        /// </summary>\n        /// <param name=\"arr\"></param>\n        /// <returns></returns>\n        public static UInt32 ToUInt32(byte[] arr)\n        {\n            if (BitConverter.IsLittleEndian)\n                System.Array.Reverse(arr);\n            return BitConverter.ToUInt32(arr, 0);\n        }\n\n        /// <summary>\n        /// Converts a byte array in big-endian form to a numeric value.\n        /// </summary>\n        /// <param name=\"arr\"></param>\n        /// <returns></returns>\n        public static UInt64 ToUInt64(byte[] arr)\n        {\n            if (BitConverter.IsLittleEndian)\n                System.Array.Reverse(arr);\n            return BitConverter.ToUInt64(arr, 0);\n        }\n\n        #endregion\n\n    }\n\n    /// <summary>\n    /// Stores a whole number as a floating point value. You get the range of a float, as well as infinity representations. \n    /// Implicit conversion between float and int is defined.\n    /// </summary>\n    [System.Serializable()]\n    public struct DiscreteFloat : INumeric, IConvertible, IComparable, IComparable<float>, IComparable<DiscreteFloat>, IEquatable<float>, IEquatable<DiscreteFloat>, IFormattable\n    {\n\n        [SerializeField()]\n        private float _value;\n\n        #region CONSTRUCTOR\n\n        public DiscreteFloat(float f)\n        {\n            _value = Mathf.Round(f);\n        }\n\n        #endregion\n\n        #region Properties\n\n        #endregion\n\n        #region Methods\n\n        /// <summary>\n        /// Returns the value as a positive value int where infinite is represented as -1.\n        /// </summary>\n        /// <returns></returns>\n        public int ToStandardMetricInt()\n        {\n            if (float.IsInfinity(_value)) return -1;\n            else return (int)Mathf.Abs(_value);\n        }\n\n        public override bool Equals(object obj)\n        {\n            if (obj is DiscreteFloat)\n            {\n                return _value == ((DiscreteFloat)obj)._value;\n            }\n            else if (obj is System.IConvertible)\n            {\n                try\n                {\n                    var f = System.Convert.ToSingle(obj);\n                    return _value == f;\n                }\n                catch\n                {\n                    return false;\n                }\n            }\n            else\n            {\n                return false;\n            }\n        }\n\n        public override int GetHashCode()\n        {\n            return _value.GetHashCode();\n        }\n\n        public override string ToString()\n        {\n            return _value.ToString();\n        }\n\n        #endregion\n\n        #region Static/Constants\n\n        public static DiscreteFloat Zero\n        {\n            get\n            {\n                return new DiscreteFloat()\n                            {\n                                _value = 0f\n                            };\n            }\n        }\n\n        public static DiscreteFloat PositiveInfinity { get { return new DiscreteFloat() { _value = float.PositiveInfinity }; } }\n        public static DiscreteFloat NegativeInfinity { get { return new DiscreteFloat() { _value = float.NegativeInfinity }; } }\n\n        public static bool IsNaN(DiscreteFloat value)\n        {\n            return float.IsNaN(value._value);\n        }\n\n        public static bool IsInfinity(DiscreteFloat value)\n        {\n            return float.IsInfinity(value._value);\n        }\n\n        public static bool IsPositiveInfinity(DiscreteFloat value)\n        {\n            return float.IsPositiveInfinity(value._value);\n        }\n\n        public static bool IsNegativeInfinity(DiscreteFloat value)\n        {\n            return float.IsNegativeInfinity(value._value);\n        }\n\n        public static bool IsReal(DiscreteFloat value)\n        {\n            return !(float.IsNaN(value._value) || float.IsInfinity(value._value));\n        }\n\n        \n\n        #endregion\n\n        #region Operators\n\n        public static DiscreteFloat operator ++(DiscreteFloat df)\n        {\n            df._value++;\n            return df;\n        }\n\n        public static DiscreteFloat operator +(DiscreteFloat df)\n        {\n            return df;\n        }\n\n        public static DiscreteFloat operator +(DiscreteFloat a, DiscreteFloat b)\n        {\n            a._value = Mathf.Floor(a._value + b._value);\n            return a;\n        }\n\n        public static DiscreteFloat operator --(DiscreteFloat df)\n        {\n            df._value--;\n            return df;\n        }\n\n        public static DiscreteFloat operator -(DiscreteFloat df)\n        {\n            df._value = -df._value;\n            return df;\n        }\n\n        public static DiscreteFloat operator -(DiscreteFloat a, DiscreteFloat b)\n        {\n            a._value = Mathf.Floor(a._value - b._value);\n            return a;\n        }\n        \n        public static DiscreteFloat operator *(DiscreteFloat a, DiscreteFloat b)\n        {\n            a._value = Mathf.Floor(a._value * b._value);\n            return a;\n        }\n        \n        public static DiscreteFloat operator /(DiscreteFloat a, DiscreteFloat b)\n        {\n            a._value = Mathf.Floor(a._value / b._value);\n            return a;\n        }\n        \n        public static bool operator >(DiscreteFloat a, DiscreteFloat b)\n        {\n            return a._value > b._value;\n        }\n\n        public static bool operator >=(DiscreteFloat a, DiscreteFloat b)\n        {\n            return a._value >= b._value;\n        }\n\n        public static bool operator <(DiscreteFloat a, DiscreteFloat b)\n        {\n            return a._value < b._value;\n        }\n\n        public static bool operator <=(DiscreteFloat a, DiscreteFloat b)\n        {\n            return a._value <= b._value;\n        }\n\n        public static bool operator ==(DiscreteFloat a, DiscreteFloat b)\n        {\n            return a._value == b._value;\n        }\n\n        public static bool operator !=(DiscreteFloat a, DiscreteFloat b)\n        {\n            return a._value != b._value;\n        }\n        \n        #endregion\n\n        #region Conversions\n\n        public static implicit operator DiscreteFloat(int f)\n        {\n            return new DiscreteFloat((float)f);\n        }\n\n        public static implicit operator int(DiscreteFloat df)\n        {\n            return (int)df._value;\n        }\n\n        public static implicit operator DiscreteFloat(float f)\n        {\n            return new DiscreteFloat(f);\n        }\n\n        public static implicit operator float(DiscreteFloat df)\n        {\n            return df._value;\n        }\n\n        public static implicit operator DiscreteFloat(double d)\n        {\n            return new DiscreteFloat((float)d);\n        }\n\n        public static implicit operator double(DiscreteFloat df)\n        {\n            return (double)df._value;\n        }\n\n        public static implicit operator DiscreteFloat(decimal d)\n        {\n            return new DiscreteFloat((float)d);\n        }\n\n        public static implicit operator decimal(DiscreteFloat df)\n        {\n            return (decimal)df._value;\n        }\n\n        #endregion\n\n        #region INumeric Interface\n\n        TypeCode INumeric.GetUnderlyingTypeCode()\n        {\n            return TypeCode.Single;\n        }\n\n        public byte[] ToByteArray()\n        {\n            return Numerics.GetBytes(_value);\n        }\n\n        void INumeric.FromByteArray(byte[] data)\n        {\n            _value = Mathf.Round(Numerics.ToSingle(data));\n        }\n\n        void INumeric.FromLong(long value)\n        {\n            _value = Convert.ToSingle(value);\n        }\n\n        void INumeric.FromDouble(double value)\n        {\n            _value = (float)Math.Round(value);\n        }\n\n        public static DiscreteFloat FromByteArray(byte[] data)\n        {\n            var result = new DiscreteFloat();\n            result._value = Mathf.Round(Numerics.ToSingle(data));\n            return result;\n        }\n\n        #endregion\n\n        #region IConvertible\n\n        public TypeCode GetTypeCode()\n        {\n            return TypeCode.Single;\n        }\n\n        bool IConvertible.ToBoolean(IFormatProvider provider)\n        {\n            return _value != 0f;\n        }\n\n        char IConvertible.ToChar(IFormatProvider provider)\n        {\n            return Convert.ToChar(_value);\n        }\n\n        sbyte IConvertible.ToSByte(IFormatProvider provider)\n        {\n            return Convert.ToSByte(_value);\n        }\n\n        byte IConvertible.ToByte(IFormatProvider provider)\n        {\n            return Convert.ToByte(_value);\n        }\n\n        short IConvertible.ToInt16(IFormatProvider provider)\n        {\n            return Convert.ToInt16(_value);\n        }\n\n        ushort IConvertible.ToUInt16(IFormatProvider provider)\n        {\n            return Convert.ToUInt16(_value);\n        }\n\n        int IConvertible.ToInt32(IFormatProvider provider)\n        {\n            return Convert.ToInt32(_value);\n        }\n\n        uint IConvertible.ToUInt32(IFormatProvider provider)\n        {\n            return Convert.ToUInt32(_value);\n        }\n\n        long IConvertible.ToInt64(IFormatProvider provider)\n        {\n            return Convert.ToInt64(_value);\n        }\n\n        ulong IConvertible.ToUInt64(IFormatProvider provider)\n        {\n            return Convert.ToUInt64(_value);\n        }\n\n        float IConvertible.ToSingle(IFormatProvider provider)\n        {\n            return _value;\n        }\n\n        double IConvertible.ToDouble(IFormatProvider provider)\n        {\n            return Convert.ToDouble(_value);\n        }\n\n        decimal IConvertible.ToDecimal(IFormatProvider provider)\n        {\n            return Convert.ToDecimal(_value);\n        }\n\n        DateTime IConvertible.ToDateTime(IFormatProvider provider)\n        {\n            return Convert.ToDateTime(_value);\n        }\n\n        string IConvertible.ToString(IFormatProvider provider)\n        {\n            return _value.ToString(provider);\n        }\n\n        object IConvertible.ToType(Type conversionType, IFormatProvider provider)\n        {\n            return (_value as IConvertible).ToType(conversionType, provider);\n        }\n\n        #endregion\n\n        #region IComparable Interface\n\n        public int CompareTo(object obj)\n        {\n            return _value.CompareTo(obj);\n        }\n\n        public int CompareTo(float other)\n        {\n            return _value.CompareTo(other);\n        }\n\n        public int CompareTo(DiscreteFloat other)\n        {\n            return _value.CompareTo(other._value);\n        }\n\n        #endregion\n\n        #region IEquatable Interface\n\n        public bool Equals(float other)\n        {\n            return _value.Equals(other);\n        }\n\n        public bool Equals(DiscreteFloat other)\n        {\n            return _value.Equals(other._value);\n        }\n\n        #endregion\n\n        #region IFormattable Interface\n\n        public string ToString(string format, IFormatProvider formatProvider)\n        {\n            return _value.ToString(format, formatProvider);\n        }\n\n        #endregion\n\n        #region Special Types\n\n        public abstract class ConfigAttribute : System.Attribute\n        {\n\n            public abstract float Normalize(float value);\n\n        }\n\n        public class NonNegative : ConfigAttribute\n        {\n\n            public override float Normalize(float value)\n            {\n                if (value < 0f) return 0f;\n                else return value;\n            }\n\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Pathfinding/IPath.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Pathfinding\r\n{\r\n\r\n    public interface IPath\r\n    {\r\n\r\n        IList<Vector3> Waypoints { get; }\r\n        \r\n        PathCalculateStatus Status { get; }\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Pathfinding/IPathFactory.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Pathfinding\r\n{\r\n\r\n    public interface IPathFactory\r\n    {\r\n\r\n        IPath Create(IPathSeeker seeker, Vector3 target);\r\n        IPath Create(Vector3 start, Vector3 end);\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Pathfinding/IPathSeeker.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Pathfinding\r\n{\r\n    public interface IPathSeeker\r\n    {\r\n        \r\n        IPathFactory PathFactory { get; }\r\n        \r\n        /// <summary>\r\n        /// Returns true if the path can be used when calculating a path with this IPathSeeker.\r\n        /// </summary>\r\n        /// <param name=\"path\"></param>\r\n        /// <returns></returns>\r\n        bool ValidPath(IPath path);\r\n\r\n        void CalculatePath(IPath path);\r\n        \r\n    }\r\n\r\n    public interface IPathFollower\r\n    {\r\n\r\n        bool IsTraversing { get; }\r\n\r\n        void SetPath(IPath path);\r\n\r\n        /// <summary>\r\n        /// Resets the automatic path, clearing it, and stopping all motion.\r\n        /// </summary>\r\n        void ResetPath();\r\n\r\n        /// <summary>\r\n        /// Stop pathing to target.\r\n        /// </summary>\r\n        void StopPath();\r\n\r\n        /// <summary>\r\n        /// Resume pathing to target\r\n        /// </summary>\r\n        void ResumePath();\r\n\r\n    }\r\n\r\n    /// <summary>\r\n    /// Contract that combines both seeker and follower\r\n    /// </summary>\r\n    public interface IPathAgent : IPathSeeker, IPathFollower\r\n    {\r\n\r\n        /// <summary>\r\n        /// Start automatically pathing to target.\r\n        /// </summary>\r\n        /// <param name=\"target\"></param>\r\n        void PathTo(Vector3 target);\r\n\r\n        void PathTo(IPath path);\r\n        \r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Pathfinding/PathArgumentException.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Pathfinding\r\n{\r\n    public class PathArgumentException : ArgumentException\r\n    {\r\n\r\n        public PathArgumentException()\r\n            : base(\"IPath is not supported by this PathSeeker.\")\r\n        {\r\n\r\n        }\r\n\r\n        public PathArgumentException(string message)\r\n            : base(message)\r\n        {\r\n\r\n        }\r\n\r\n        public PathArgumentException(string message, string paramName)\r\n            : base(message, paramName)\r\n        {\r\n\r\n        }\r\n\r\n        public PathArgumentException(string message, string paramName, System.Exception innerException)\r\n            : base(message, paramName, innerException)\r\n        {\r\n\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Pathfinding/PathCalculateStatus.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Pathfinding\r\n{\r\n    public enum PathCalculateStatus\r\n    {\r\n        Invalid = -1,\r\n        Uncalculated = 0,\r\n        Partial = 1,\r\n        Success = 2,\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Pathfinding/PathUtil.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Pathfinding\r\n{\r\n    public static class PathUtil\r\n    {\r\n\r\n        public static IPath CreatePath(this IPathSeeker seeker, Vector3 target)\r\n        {\r\n            if (seeker == null) throw new System.ArgumentNullException(\"seeker\");\r\n\r\n            return seeker.PathFactory.Create(seeker, target);\r\n        }\r\n        \r\n        public static bool IsDone(this IPath path)\r\n        {\r\n            return path.Status != PathCalculateStatus.Uncalculated;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets the next target waypoint after currentIndex. Updating currentIndex if you've passed it.\r\n        /// </summary>\r\n        /// <param name=\"path\">The path to find the next target on.</param>\r\n        /// <param name=\"currentPosition\">The current position of the agent</param>\r\n        /// <param name=\"currentIndex\">The index of the waypoint that was last targeted, 0 if this is first call</param>\r\n        /// <returns>Returns the target position or a NaN vector if no target found.</returns>\r\n        public static Vector3 GetNextTarget(this IPath path, Vector3 currentPosition, ref int currentIndex)\r\n        {\r\n            if (path == null) throw new System.ArgumentNullException(\"path\");\r\n\r\n            var waypoints = path.Waypoints;\r\n            if (waypoints == null || waypoints.Count == 0) return VectorUtil.NaNVector3;\r\n            if (currentIndex >= waypoints.Count - 1) return path.Waypoints[path.Waypoints.Count - 1];\r\n\r\n            if (currentIndex < 0)\r\n                currentIndex = 0;\r\n\r\n            var targ = path.Waypoints[currentIndex];\r\n            if (currentIndex == path.Waypoints.Count - 1)\r\n            {\r\n                return targ;\r\n            }\r\n\r\n            var dir1 = targ - currentPosition;\r\n            var dir2 = waypoints[currentIndex + 1] - targ;\r\n\r\n            if (Vector3.Dot(dir1, dir2) <= 0f)\r\n            {\r\n                currentIndex++;\r\n                targ = path.Waypoints[currentIndex];\r\n            }\r\n\r\n            return targ;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Finds the best next target by finding the nearest waypoint to the \r\n        /// currentPosition after currentIndex, then calculates the next target \r\n        /// from there.\r\n        /// \r\n        /// This is beneficial if you're starting from an arbitrary point along the path.\r\n        /// \r\n        /// This is slower than GetNextTarget, use that if you know your starting position.\r\n        /// </summary>\r\n        /// <param name=\"path\">The path to find the next target on.</param>\r\n        /// <param name=\"currentPosition\">The current position of the agent</param>\r\n        /// <returns>Returns the target position or a NaN vector if no target found.</returns>\r\n        public static Vector3 GetBestTarget(this IPath path, Vector3 currentPosition)\r\n        {\r\n            int index = 0;\r\n            return GetBestTarget(path, currentPosition, ref index);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Finds the best next target by finding the nearest waypoint to the \r\n        /// currentPosition after currentIndex, then calculates the next target \r\n        /// from there.\r\n        /// \r\n        /// This is beneficial if you're starting from an arbitrary point along the path.\r\n        /// \r\n        /// This is slower than GetNextTarget, use that if you know your starting position.\r\n        /// </summary>\r\n        /// <param name=\"path\">The path to find the next target on.</param>\r\n        /// <param name=\"currentPosition\">The current position of the agent</param>\r\n        /// <param name=\"currentIndex\">The index to start searching from, pass in 0 to search entire path, \r\n        /// method will return this value with the selected best target</param>\r\n        /// <returns>Returns the target position or a NaN vector if no target found.</returns>\r\n        public static Vector3 GetBestTarget(this IPath path, Vector3 currentPosition, ref int currentIndex)\r\n        {\r\n            if (path == null) throw new System.ArgumentNullException(\"path\");\r\n\r\n            var waypoints = path.Waypoints;\r\n            if (waypoints == null || waypoints.Count == 0) return VectorUtil.NaNVector3;\r\n            if (currentIndex >= waypoints.Count - 1) return path.Waypoints[path.Waypoints.Count - 1];\r\n\r\n            if (currentIndex < 0)\r\n                currentIndex = 0;\r\n\r\n            float dist = float.PositiveInfinity;\r\n            for (int i = currentIndex; i < waypoints.Count; i++)\r\n            {\r\n                var d = (waypoints[i] - currentPosition).SetY(0f).sqrMagnitude;\r\n                if (d < dist)\r\n                {\r\n                    currentIndex = i;\r\n                    dist = d;\r\n                }\r\n            }\r\n\r\n            var targ = path.Waypoints[currentIndex];\r\n            if (currentIndex == path.Waypoints.Count - 1)\r\n            {\r\n                return targ;\r\n            }\r\n\r\n            var dir1 = targ - currentPosition;\r\n            var dir2 = waypoints[currentIndex + 1] - targ;\r\n\r\n            if (Vector3.Dot(dir1, dir2) <= 0f)\r\n            {\r\n                currentIndex++;\r\n                targ = path.Waypoints[currentIndex];\r\n            }\r\n\r\n            return targ;\r\n        }\r\n\r\n        public static float GetPathLength(this IPath path)\r\n        {\r\n            if (path == null) return float.PositiveInfinity;\r\n\r\n            var lst = path.Waypoints;\r\n            if (lst == null) return float.PositiveInfinity;\r\n\r\n            float tot = 0;\r\n            for (int i = 0; i < lst.Count - 1; i++) tot += Vector3.Distance(lst[i], lst[i + 1]);\r\n            return tot;\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Pathfinding/Unity/UnityPath.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.AI;\r\nusing System.Collections.Generic;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.Pathfinding.Unity\r\n{\r\n\r\n    public abstract class UnityPath : IPath\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private NavMeshPath _path = new NavMeshPath();\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public NavMeshPath NavMeshPath\r\n        {\r\n            get { return _path; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IPath Interface\r\n\r\n        public IList<Vector3> Waypoints\r\n        {\r\n            get\r\n            {\r\n                return _path.corners;\r\n            }\r\n        }\r\n\r\n        public PathCalculateStatus Status\r\n        {\r\n            get\r\n            {\r\n                switch (_path.status)\r\n                {\r\n                    case NavMeshPathStatus.PathInvalid:\r\n                        return PathCalculateStatus.Invalid;\r\n                    case NavMeshPathStatus.PathPartial:\r\n                        return PathCalculateStatus.Partial;\r\n                    case NavMeshPathStatus.PathComplete:\r\n                        return PathCalculateStatus.Success;\r\n                    default:\r\n                        return PathCalculateStatus.Invalid;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public abstract bool CalculatePath(int areaMask);\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    public class UnityFromToPath : UnityPath\r\n    {\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public UnityFromToPath(Vector3 start, Vector3 target)\r\n        {\r\n            this.Start = start;\r\n            this.Target = target;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Vector3 Start\r\n        {\r\n            get;\r\n            set;\r\n        }\r\n\r\n        public Vector3 Target\r\n        {\r\n            get;\r\n            set;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override bool CalculatePath(int areaMask)\r\n        {\r\n            return NavMesh.CalculatePath(this.Start, this.Target, areaMask, this.NavMeshPath);\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Pathfinding/Unity/UnityPathFactory.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Pathfinding.Unity\r\n{\r\n\r\n    public class UnityPathFactory : IPathFactory\r\n    {\r\n\r\n        #region Static Interface\r\n\r\n        private static UnityPathFactory _default;\r\n\r\n        public static UnityPathFactory Default\r\n        {\r\n            get\r\n            {\r\n                if (_default == null) _default = new UnityPathFactory();\r\n                return _default;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IPathFactory Interface\r\n\r\n        public IPath Create(IPathSeeker seeker, Vector3 target)\r\n        {\r\n            Transform t;\r\n            var root = SPEntity.Pool.GetFromSource(seeker);\r\n            if (root != null)\r\n            {\r\n                t = root.transform;\r\n            }\r\n            else\r\n            {\r\n                t = GameObjectUtil.GetTransformFromSource(seeker);\r\n                if (t == null) throw new PathArgumentException(\"IPathSeeker has no known Transform to get a position from.\");\r\n            }\r\n\r\n            return seeker.PathFactory.Create(t.position, target);\r\n        }\r\n\r\n        public IPath Create(Vector3 start, Vector3 end)\r\n        {\r\n            return new UnityFromToPath(start, end);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Pathfinding/Unity/UnityPathSeeker.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.AI;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Pathfinding.Unity\r\n{\r\n    public class UnityPathSeeker : SPComponent, IPathSeeker\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private int _areaMask = -1;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n        \r\n        #endregion\r\n\r\n        #region IPathSeeker Interface\r\n        \r\n        public IPathFactory PathFactory\r\n        {\r\n            get { return UnityPathFactory.Default; }\r\n        }\r\n\r\n        public bool ValidPath(IPath path)\r\n        {\r\n            return (path is UnityPath);\r\n        }\r\n\r\n        public void CalculatePath(IPath path)\r\n        {\r\n            if (!(path is UnityPath)) throw new PathArgumentException();\r\n\r\n            (path as UnityPath).CalculatePath(_areaMask);\r\n        }\r\n        \r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Pathfinding/Unity/UnityStandardPathAgent.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.AI;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Pathfinding.Unity\r\n{\r\n\r\n    [RequireComponentInEntity(typeof(NavMeshAgent))]\r\n    public class UnityStandardPathAgent : SPComponent, IPathAgent\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        [DefaultFromSelf(Relativity = EntityRelativity.Entity)]\r\n        private NavMeshAgent _agent;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            if (_agent == null)\r\n            {\r\n                if(!this.GetComponent<NavMeshAgent>(out _agent))\r\n                {\r\n                    Debug.LogWarning(\"No NavMeshAgent attached to this UnityPathAgent.\");\r\n                    this.enabled = false;\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IPathAgent Interface\r\n\r\n        public bool IsTraversing\r\n        {\r\n            get\r\n            {\r\n                return _agent.hasPath && !VectorUtil.NearZeroVector(_agent.velocity);\r\n            }\r\n        }\r\n\r\n        public IPathFactory PathFactory\r\n        {\r\n            get { return UnityPathFactory.Default; }\r\n        }\r\n\r\n        public bool ValidPath(IPath path)\r\n        {\r\n            return (path is UnityPath);\r\n        }\r\n\r\n        public void CalculatePath(IPath path)\r\n        {\r\n            if (object.ReferenceEquals(_agent, null)) throw new System.InvalidOperationException(\"UnityPathAgent was not configured correctly.\");\r\n            if (!(path is UnityPath)) throw new PathArgumentException();\r\n\r\n            //var p = (path as UnityPath);\r\n            //_agent.CalculatePath(p.Target, p._path);\r\n            (path as UnityPath).CalculatePath(_agent.areaMask);\r\n        }\r\n        \r\n        public void SetPath(IPath path)\r\n        {\r\n            if (object.ReferenceEquals(_agent, null)) throw new System.InvalidOperationException(\"UnityPathAgent was not configured correctly.\");\r\n            if (!(path is UnityPath)) throw new PathArgumentException();\r\n\r\n            _agent.SetPath((path as UnityPath).NavMeshPath);\r\n        }\r\n\r\n        public void PathTo(Vector3 target)\r\n        {\r\n            if (object.ReferenceEquals(_agent, null)) throw new System.InvalidOperationException(\"UnityPathAgent was not configured correctly.\");\r\n            _agent.SetDestination(target);\r\n        }\r\n\r\n        public void PathTo(IPath path)\r\n        {\r\n            if (object.ReferenceEquals(_agent, null)) throw new System.InvalidOperationException(\"UnityPathAgent was not configured correctly.\");\r\n            if (!(path is UnityPath)) throw new PathArgumentException();\r\n\r\n            var p = (path as UnityPath);\r\n            //_agent.CalculatePath(p.Target, p.NavMeshPath);\r\n            //_agent.SetPath(p.NavMeshPath);\r\n            p.CalculatePath(_agent.areaMask);\r\n            _agent.SetPath(p.NavMeshPath);\r\n        }\r\n\r\n        public void ResetPath()\r\n        {\r\n            if (object.ReferenceEquals(_agent, null)) throw new System.InvalidOperationException(\"UnityPathAgent was not configured correctly.\");\r\n            _agent.ResetPath();\r\n        }\r\n\r\n        public void StopPath()\r\n        {\r\n            if (object.ReferenceEquals(_agent, null)) throw new System.InvalidOperationException(\"UnityPathAgent was not configured correctly.\");\r\n            _agent.isStopped = true;\r\n        }\r\n\r\n        public void ResumePath()\r\n        {\r\n            if (object.ReferenceEquals(_agent, null)) throw new System.InvalidOperationException(\"UnityPathAgent was not configured correctly.\");\r\n            _agent.isStopped = false;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Project/AssetBundlePackage.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Project\r\n{\r\n\r\n    /// <summary>\r\n    /// Include as the mainAsset of an AssetBundle to facilitate indexing the contents of that bundle for use as an IAssetBundle.\r\n    /// \r\n    /// In Unity 4.x and earlier, AssetBundle is rather gimped, and needs a little extra oomph to help index its contents. Unity 5 \r\n    /// comes with extra tools to make that easier. This class can still benefit you in Unity5 though, since it implements IAssetBundle \r\n    /// for use in factory patterns that use IAssetBundles.\r\n    /// </summary>\r\n    public class AssetBundlePackage : ScriptableObject, IAssetBundle, System.IDisposable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private string[] _names;\r\n\r\n        [System.NonSerialized()]\r\n        private AssetBundle _bundle;\r\n        [System.NonSerialized()]\r\n        private HashSet<UnityEngine.Object> _loadedAssets = new HashSet<UnityEngine.Object>(com.spacepuppy.Collections.ObjectInstanceIDEqualityComparer<UnityEngine.Object>.Default);\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        internal void Init(AssetBundle bundle)\r\n        {\r\n            //should only ever be called by SPAssetBundle factory methods\r\n            _bundle = bundle;\r\n        }\r\n\r\n        void OnDisable()\r\n        {\r\n            this.Dispose(true);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int UniqueId\r\n        {\r\n            get\r\n            {\r\n                if (_bundle == null) return this.GetInstanceID();\r\n\r\n                return _bundle.GetInstanceID();\r\n            }\r\n        }\r\n\r\n        public AssetBundle AssetBundle { get { return _bundle; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public IEnumerable<string> GetAllAssetNames()\r\n        {\r\n            return _names ?? Enumerable.Empty<string>();\r\n        }\r\n\r\n        public bool Contains(string name)\r\n        {\r\n            if (_bundle == null) return false;\r\n            return _bundle.Contains(name);\r\n        }\r\n\r\n        public bool Contains(UnityEngine.Object asset)\r\n        {\r\n            return _loadedAssets.Contains(asset);\r\n        }\r\n\r\n        public UnityEngine.Object LoadAsset(string name)\r\n        {\r\n            if (_bundle == null) return null;\r\n            var asset = _bundle.LoadAsset(name);\r\n            if (asset == null) return null;\r\n            _loadedAssets.Add(asset);\r\n            return asset;\r\n        }\r\n\r\n        public UnityEngine.Object LoadAsset(string name, System.Type tp)\r\n        {\r\n            if (_bundle == null) return null;\r\n            var asset = _bundle.LoadAsset(name, tp);\r\n            if (asset == null) return null;\r\n            _loadedAssets.Add(asset);\r\n            return asset;\r\n        }\r\n\r\n        public T LoadAsset<T>(string name) where T : UnityEngine.Object\r\n        {\r\n            return this.LoadAsset(name, typeof(T)) as T;\r\n        }\r\n\r\n        public void UnloadAsset(UnityEngine.Object asset)\r\n        {\r\n            if (_bundle == null) return;\r\n\r\n            _loadedAssets.Remove(asset);\r\n            UnityEngine.Object.Destroy(asset);\r\n        }\r\n\r\n        public void UnloadAllAssets()\r\n        {\r\n            if (_loadedAssets.Count == 0) return;\r\n\r\n            var e = _loadedAssets.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                UnityEngine.Object.Destroy(e.Current);\r\n            }\r\n            _loadedAssets.Clear();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Equality Overrides\r\n\r\n        public override int GetHashCode()\r\n        {\r\n            return this.UniqueId;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public void Dispose(bool unloadAllLoadedObjects)\r\n        {\r\n            if (_bundle != null)\r\n            {\r\n                _bundle.Unload(unloadAllLoadedObjects);\r\n                _bundle = null;\r\n            }\r\n        }\r\n\r\n        void System.IDisposable.Dispose()\r\n        {\r\n            this.Dispose(true);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Project/AssetBundles.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Collections;\r\n\r\nnamespace com.spacepuppy.Project\r\n{\r\n    public static class AssetBundles\r\n    {\r\n\r\n        #region Fields\r\n        \r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        /// <summary>\r\n        /// A reference to an SPAssetBundle that wraps around the 'Resources' class so it can treated similar to an AssetBundle.\r\n        /// </summary>\r\n        public static ResourcesAssetBundle Resources { get { return ResourcesAssetBundle.Instance; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public static IAssetBundle LoadFromFile(string path)\r\n        {\r\n            return ExtractBundleMonitor(AssetBundle.LoadFromFile(path));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates an SPAssetBundle from a AssetBundle loaded in a manner other than the SPAssetBundle factory methods. \r\n        /// Note, now that it's managed, allow SPAssetBundle to handle the AssetBundle directly, and only load/unload via the SPAssetBundle interface.\r\n        /// </summary>\r\n        /// <param name=\"id\"></param>\r\n        /// <param name=\"bundle\"></param>\r\n        /// <returns></returns>\r\n        public static IAssetBundle Create(AssetBundle bundle)\r\n        {\r\n            return ExtractBundleMonitor(bundle);\r\n        }\r\n        \r\n        private static AssetBundlePackage ExtractBundleMonitor(AssetBundle bundle)\r\n        {\r\n            if (bundle.mainAsset is AssetBundlePackage)\r\n            {\r\n                var spbundle = bundle.mainAsset as AssetBundlePackage;\r\n                spbundle.Init(bundle);\r\n                return spbundle;\r\n            }\r\n            else\r\n            {\r\n                var spbundle = ScriptableObject.CreateInstance<AssetBundlePackage>();\r\n                spbundle.Init(bundle);\r\n                return spbundle;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private class AssetBundlePackageEqualityComparer : IEqualityComparer<AssetBundlePackage>\r\n        {\r\n            public bool Equals(AssetBundlePackage x, AssetBundlePackage y)\r\n            {\r\n                return x.UniqueId == y.UniqueId;\r\n            }\r\n\r\n            public int GetHashCode(AssetBundlePackage obj)\r\n            {\r\n                return obj.UniqueId;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Project/AssetPool.cs",
    "content": "﻿using System.Collections.Generic;\r\nusing System.Collections;\r\n\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Project\r\n{\r\n\r\n    /// <summary>\r\n    /// Represents an ID table for an IAssetBundle. This way you can associate specific ids/names with the long form path name in the IAssetBundle. \r\n    /// As you load Assets they'll be recorded inside the Pool for easy unloading when needed. This works great in factory patterns that \r\n    /// follow strict naming mechanics, but need to work with different unique AssetBundles that might have conflicting path names to the id \r\n    /// required by the factory.\r\n    /// </summary>\r\n    public class AssetPool : IEnumerable<AssetPool.ResourceEntry>, System.IDisposable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private IAssetBundle _bundle;\r\n        private Dictionary<string, ResourceEntry> _table = new Dictionary<string, ResourceEntry>();\r\n        private AssetCollection _assetColl;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public AssetPool()\r\n        {\r\n            _bundle = AssetBundles.Resources;\r\n        }\r\n\r\n        public AssetPool(IAssetBundle bundle)\r\n        {\r\n            _bundle = bundle ?? AssetBundles.Resources;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int Count\r\n        {\r\n            get\r\n            {\r\n                return _table.Count;\r\n            }\r\n        }\r\n        \r\n        public ResourceEntry this[string id]\r\n        {\r\n            get\r\n            {\r\n                ResourceEntry entry;\r\n                if (_table.TryGetValue(id, out entry))\r\n                {\r\n                    return entry;\r\n                }\r\n                return null;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Direct access to the assets, accessing any asset through this collection will automatically load it if not already loaded.\r\n        /// </summary>\r\n        public AssetCollection Assets\r\n        {\r\n            get\r\n            {\r\n                if (_assetColl == null)\r\n                    _assetColl = new AssetCollection(this);\r\n                return _assetColl;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Add(string id, string path)\r\n        {\r\n            if (id == null) throw new System.ArgumentNullException(\"id\");\r\n            _table.Add(id, new ResourceEntry(_bundle, id, path));\r\n        }\r\n\r\n        public bool Contains(string id)\r\n        {\r\n            return _table.ContainsKey(id);\r\n        }\r\n\r\n        public bool Remove(string id)\r\n        {\r\n            ResourceEntry entry;\r\n            if(_table.TryGetValue(id, out entry))\r\n            {\r\n                entry.Unload();\r\n                _table.Remove(id);\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            this.UnloadAll();\r\n            _table.Clear();\r\n        }\r\n\r\n\r\n        public bool TryGetEntry(string key, out ResourceEntry value)\r\n        {\r\n            return _table.TryGetValue(key, out value);\r\n        }\r\n\r\n        public void LoadAll()\r\n        {\r\n            var e = _table.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                e.Current.Value.Load();\r\n            }\r\n        }\r\n\r\n        public void UnloadAll()\r\n        {\r\n            var e = _table.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                e.Current.Value.Unload();\r\n            }\r\n        }\r\n\r\n        public bool AnyLoaded()\r\n        {\r\n            var e = _table.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if (e.Current.Value.Loaded) return true;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public Enumerator GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator<ResourceEntry> IEnumerable<ResourceEntry>.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator IEnumerable.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public void Dispose()\r\n        {\r\n            this.Clear();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public class ResourceEntry\r\n        {\r\n\r\n            private IAssetBundle _bundle;\r\n            private string _id;\r\n            private string _path;\r\n            private UnityEngine.Object _asset;\r\n            private bool _loaded;\r\n\r\n            internal ResourceEntry(IAssetBundle bundle, string id, string path)\r\n            {\r\n                _bundle = bundle;\r\n                _id = id;\r\n                _path = path;\r\n            }\r\n\r\n            public string Id { get { return _id; } }\r\n\r\n            public string Path { get { return _path; } }\r\n\r\n            public UnityEngine.Object Asset { get { return _asset; } }\r\n\r\n            public bool Loaded { get { return _loaded; } }\r\n\r\n\r\n\r\n            public void Load()\r\n            {\r\n                _loaded = true;\r\n                if (_asset == null)\r\n                {\r\n                    _asset = _bundle.LoadAsset(_path);\r\n                }\r\n            }\r\n\r\n            public void Unload()\r\n            {\r\n                _loaded = false;\r\n                if (_asset != null)\r\n                {\r\n                    _bundle.UnloadAsset(_asset);\r\n                    _asset = null;\r\n                }\r\n            }\r\n\r\n        }\r\n        \r\n        public struct Enumerator : IEnumerator<ResourceEntry>\r\n        {\r\n\r\n            private AssetPool _coll;\r\n            private Dictionary<string, ResourceEntry>.Enumerator _e;\r\n\r\n            internal Enumerator(AssetPool coll)\r\n            {\r\n                if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n                _coll = coll;\r\n                _e = _coll._table.GetEnumerator();\r\n            }\r\n\r\n            public ResourceEntry Current\r\n            {\r\n                get\r\n                {\r\n                    return _e.Current.Value;\r\n                }\r\n            }\r\n\r\n            object IEnumerator.Current\r\n            {\r\n                get\r\n                {\r\n                    return _e.Current.Value;\r\n                }\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                _e.Dispose();\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                return _e.MoveNext();\r\n            }\r\n\r\n            void IEnumerator.Reset()\r\n            {\r\n                (_e as IEnumerator).Reset();\r\n            }\r\n        }\r\n\r\n        public class AssetCollection : IEnumerable<UnityEngine.Object>\r\n        {\r\n\r\n            #region Fields\r\n\r\n            private AssetPool _source;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            internal AssetCollection(AssetPool source)\r\n            {\r\n                if (source == null) throw new System.ArgumentNullException(\"source\");\r\n                _source = source;\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Properties\r\n\r\n            public UnityEngine.Object this[string id]\r\n            {\r\n                get\r\n                {\r\n                    ResourceEntry entry;\r\n                    if (_source._table.TryGetValue(id, out entry))\r\n                    {\r\n                        if (!entry.Loaded) entry.Load();\r\n                        return entry.Asset;\r\n                    }\r\n\r\n                    return null;\r\n                }\r\n            }\r\n\r\n            public AssetPool Source\r\n            {\r\n                get { return _source; }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Methods\r\n\r\n            public bool TryGetAsset(string id, out UnityEngine.Object asset)\r\n            {\r\n                ResourceEntry entry;\r\n                if (_source._table.TryGetValue(id, out entry))\r\n                {\r\n                    if (!entry.Loaded) entry.Load();\r\n                    asset = entry.Asset;\r\n                    return asset != null;\r\n                }\r\n\r\n                asset = null;\r\n                return false;\r\n            }\r\n\r\n            public bool TryGetAsset<T>(string id, out T asset) where T : class\r\n            {\r\n                ResourceEntry entry;\r\n                if (_source._table.TryGetValue(id, out entry))\r\n                {\r\n                    if(entry.Loaded)\r\n                    {\r\n                        asset = ObjUtil.GetAsFromSource<T>(entry.Asset);\r\n                        return asset != null;\r\n                    }\r\n                    else\r\n                    {\r\n                        entry.Load();\r\n                        asset = ObjUtil.GetAsFromSource<T>(entry.Asset);\r\n                        if(asset == null)\r\n                        {\r\n                            entry.Unload();\r\n                            return false;\r\n                        }\r\n                        else\r\n                        {\r\n                            return true;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                asset = null;\r\n                return false;\r\n            }\r\n            \r\n            #endregion\r\n\r\n\r\n            #region IEnumerable Interface\r\n\r\n            public Enumerator GetEnumerator()\r\n            {\r\n                return new Enumerator(_source);\r\n            }\r\n\r\n            IEnumerator IEnumerable.GetEnumerator()\r\n            {\r\n                return new Enumerator(_source);\r\n            }\r\n\r\n            IEnumerator<UnityEngine.Object> IEnumerable<UnityEngine.Object>.GetEnumerator()\r\n            {\r\n                return new Enumerator(_source);\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Special AssetCollection Types\r\n\r\n            public struct Enumerator : IEnumerator<UnityEngine.Object>\r\n            {\r\n                \r\n                private AssetPool _source;\r\n                private Dictionary<string, ResourceEntry>.Enumerator _e;\r\n                \r\n                internal Enumerator(AssetPool coll)\r\n                {\r\n                    if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n                    _source = coll;\r\n                    _e = coll._table.GetEnumerator();\r\n                }\r\n\r\n\r\n                public UnityEngine.Object Current\r\n                {\r\n                    get\r\n                    {\r\n                        var entry = _e.Current.Value;\r\n                        if(entry != null)\r\n                        {\r\n                            if (!entry.Loaded) entry.Load();\r\n                            return entry.Asset;\r\n                        }\r\n                        return null;\r\n                    }\r\n                }\r\n\r\n                object IEnumerator.Current\r\n                {\r\n                    get\r\n                    {\r\n                        return this.Current;\r\n                    }\r\n                }\r\n\r\n                public bool MoveNext()\r\n                {\r\n                    return _e.MoveNext();\r\n                }\r\n\r\n                public void Dispose()\r\n                {\r\n                    _e.Dispose();\r\n                }\r\n\r\n                void IEnumerator.Reset()\r\n                {\r\n                    (_e as IEnumerator).Reset();\r\n                }\r\n\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Project/CustomTimeLayersData.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Project\r\n{\r\n    public class CustomTimeLayersData : ScriptableObject, ISerializationCallbackReceiver, IEnumerable<string>\r\n    {\r\n\r\n        public const string PATH_DEFAULTSETTINGS = @\"CustomTimeLayersData\";\r\n        public const string PATH_DEFAULTSETTINGS_FULL = @\"Assets/Resources/CustomTimeLayersData.asset\";\r\n\r\n        #region Static Interface\r\n\r\n        private static CustomTimeLayersData _instance;\r\n        private static bool _loaded;\r\n\r\n        public static IList<string> Layers\r\n        {\r\n            get\r\n            {\r\n                if (!_loaded)\r\n                {\r\n                    _instance = Resources.Load(PATH_DEFAULTSETTINGS) as CustomTimeLayersData;\r\n                    if (_instance == null) _instance = ScriptableObject.CreateInstance<CustomTimeLayersData>();\r\n                    _loaded = true;\r\n                }\r\n                return (_instance != null && _instance._readonlyLayers != null) ? _instance._readonlyLayers : ArrayUtil.Empty<string>();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private List<string> _customTimeLayers;\r\n\r\n        [System.NonSerialized()]\r\n        private IList<string> _readonlyLayers;\r\n\r\n        #endregion\r\n\r\n        #region ISerializationCallbackReceiver Interface\r\n        void ISerializationCallbackReceiver.OnAfterDeserialize()\r\n        {\r\n            _readonlyLayers = new System.Collections.ObjectModel.ReadOnlyCollection<string>(_customTimeLayers);\r\n        }\r\n\r\n        void ISerializationCallbackReceiver.OnBeforeSerialize()\r\n        {\r\n        }\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n        public IEnumerator<string> GetEnumerator()\r\n        {\r\n            return (_customTimeLayers != null) ? (_customTimeLayers as IEnumerable<string>).GetEnumerator() : Enumerable.Empty<string>().GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return (_customTimeLayers != null) ? _customTimeLayers.GetEnumerator() : Enumerable.Empty<string>().GetEnumerator();\r\n        }\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public class EditorHelper\r\n        {\r\n            private CustomTimeLayersData _data;\r\n\r\n            public EditorHelper(CustomTimeLayersData data)\r\n            {\r\n                _data = data;\r\n                if (_data._customTimeLayers == null) _data._customTimeLayers = new List<string>();\r\n            }\r\n\r\n            public CustomTimeLayersData Data { get { return _data; } }\r\n\r\n            public List<string> Layers { get { return _data._customTimeLayers; } }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Project/GameSettingsBase.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Project\r\n{\r\n\r\n    /// <summary>\r\n    /// A singleton Game entry point\r\n    /// </summary>\r\n    public abstract class GameSettings : ScriptableObject\r\n    {\r\n        \r\n        public const string PATH_DEFAULTSETTINGS = \"GameSettings\";\r\n        public const string PATH_DEFAULTSETTINGS_FULL = @\"Assets/Resources/GameSettings.asset\";\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected void Awake()\r\n        {\r\n            if (_instance != null && _instance != this)\r\n                throw new System.InvalidOperationException(\"Attempted to create multiple GameSettings. Please get instances of the game settings via the static interface GameSettingsBase.GetGameSettings.\");\r\n        }\r\n\r\n        protected abstract void OnInitialized();\r\n\r\n        protected virtual void OnDestroy()\r\n        {\r\n            if (_instance == this)\r\n                _instance = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Factory\r\n\r\n        private static GameSettings _instance;\r\n\r\n        public static GameSettings GetGameSettings(string path = null)\r\n        {\r\n            if(_instance == null)\r\n            {\r\n                if (path == null) path = PATH_DEFAULTSETTINGS;\r\n                //_instance = Object.Instantiate(Resources.Load(path)) as GameSettings;\r\n                _instance = Resources.Load(path) as GameSettings;\r\n                if (_instance != null) _instance.OnInitialized();\r\n                return _instance;\r\n            }\r\n            else\r\n            {\r\n                return _instance;\r\n            }\r\n        }\r\n\r\n        public static T GetGameSettings<T>(string path = null) where T : GameSettings\r\n        {\r\n            if (_instance == null)\r\n            {\r\n                if (path == null) path = PATH_DEFAULTSETTINGS;\r\n                //_instance = Object.Instantiate(Resources.Load(path)) as T;\r\n                _instance = Resources.Load(path) as T;\r\n                if (_instance != null) _instance.OnInitialized();\r\n                return _instance as T;\r\n            }\r\n            else\r\n            {\r\n                return _instance as T;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Project/IAssetBundle.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Project\r\n{\r\n\r\n    /// <summary>\r\n    /// An interface that represents a bundle of resources that can be loaded on demand. This facilitates wrappers \r\n    /// around the global 'Resources' (see: ResourceAssetBundle), portions of 'Resources' (see: ResourcePackage), \r\n    /// 'AssetBundle' (see: AssetBundlePackage), as well as groups of bundles (see: AssetBundleGroup).\r\n    /// </summary>\r\n    public interface IAssetBundle : System.IDisposable\r\n    {\r\n\r\n        IEnumerable<string> GetAllAssetNames();\r\n\r\n        bool Contains(string name);\r\n\r\n        bool Contains(UnityEngine.Object asset);\r\n\r\n        UnityEngine.Object LoadAsset(string name);\r\n        UnityEngine.Object LoadAsset(string name, System.Type tp);\r\n\r\n        T LoadAsset<T>(string name) where T : UnityEngine.Object;\r\n\r\n        void UnloadAsset(UnityEngine.Object asset);\r\n        void UnloadAllAssets();\r\n\r\n    }\r\n\r\n    /// <summary>\r\n    /// A wrapper around the global 'Resources' class so it can be used as an IAssetBundle.\r\n    /// </summary>\r\n    public sealed class ResourcesAssetBundle : IAssetBundle\r\n    {\r\n\r\n        #region Singleton Interface\r\n\r\n        private static ResourcesAssetBundle _instance;\r\n        public static ResourcesAssetBundle Instance\r\n        {\r\n            get\r\n            {\r\n                if (_instance == null) _instance = new ResourcesAssetBundle();\r\n                return _instance;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private ResourcesAssetBundle()\r\n        {\r\n            //enforce as singleton\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        IEnumerable<string> IAssetBundle.GetAllAssetNames()\r\n        {\r\n            return Enumerable.Empty<string>();\r\n        }\r\n        \r\n        public bool Contains(string path)\r\n        {\r\n            //there's no way to test it, so we assume true\r\n            return true;\r\n        }\r\n\r\n        public bool Contains(UnityEngine.Object asset)\r\n        {\r\n            //there's no way to test it, so we assume true\r\n            return true;\r\n        }\r\n\r\n        public UnityEngine.Object LoadAsset(string path)\r\n        {\r\n            return Resources.Load(path);\r\n        }\r\n\r\n        public UnityEngine.Object LoadAsset(string path, System.Type tp)\r\n        {\r\n            return Resources.Load(path, tp);\r\n        }\r\n\r\n        public T LoadAsset<T>(string path) where T : UnityEngine.Object\r\n        {\r\n            return Resources.Load(path, typeof(T)) as T;\r\n        }\r\n\r\n        public void UnloadAsset(UnityEngine.Object asset)\r\n        {\r\n            if(asset is GameObject || asset is Component)\r\n            {\r\n                //UnityEngine.Object.Destroy(asset);\r\n                return;\r\n            }\r\n            Resources.UnloadAsset(asset);\r\n        }\r\n\r\n        public void UnloadAllAssets()\r\n        {\r\n            //technically this doesn't act the same as LoadedAssetBundle, it only unloads ununsed assets\r\n            Resources.UnloadUnusedAssets();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public void Dispose()\r\n        {\r\n            this.UnloadAllAssets();\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Equality Overrides\r\n\r\n        public override int GetHashCode()\r\n        {\r\n            return 1;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    /// <summary>\r\n    /// A collection of IAssetBundles that can be treated as one. Good for merging bundles together for factory patterns. \r\n    /// A good example is a game with downloadable content that expands the available items in the game. The factory \r\n    /// receives a group of IAssetBundles as this object.\r\n    /// </summary>\r\n    public sealed class AssetBundleGroup : IAssetBundle, ICollection<IAssetBundle>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private ResourcesAssetBundle _resources;\r\n        private HashSet<IAssetBundle> _bundles = new HashSet<IAssetBundle>();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public AssetBundleGroup()\r\n        {\r\n\r\n        }\r\n\r\n        public AssetBundleGroup(IEnumerable<IAssetBundle> e)\r\n        {\r\n            foreach(var b in e)\r\n            {\r\n                this.Add(b);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public bool ContainsDeep(IAssetBundle item)\r\n        {\r\n            if (item == null) return false;\r\n            if (item == _resources) return true;\r\n            \r\n            if(_bundles.Count > 0)\r\n            {\r\n                var e = _bundles.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    if (e.Current is AssetBundleGroup && (e.Current as AssetBundleGroup).ContainsDeep(item)) return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        public int Count\r\n        {\r\n            get\r\n            {\r\n                if (_resources != null)\r\n                    return _bundles.Count + 1;\r\n                else\r\n                    return _bundles.Count;\r\n            }\r\n        }\r\n\r\n        bool ICollection<IAssetBundle>.IsReadOnly\r\n        {\r\n            get\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public void Add(IAssetBundle bundle)\r\n        {\r\n            if (bundle == null) throw new System.ArgumentNullException(\"bundle\");\r\n            if (bundle is AssetBundleGroup)\r\n            {\r\n                if (bundle == this || (bundle as AssetBundleGroup).ContainsDeep(this)) throw new System.ArgumentException(\"Bundle being added to group would result in a circular relationship.\");\r\n            }\r\n            else if (bundle is ResourcesAssetBundle)\r\n            {\r\n                _resources = bundle as ResourcesAssetBundle;\r\n            }\r\n            else\r\n            {\r\n                _bundles.Add(bundle);\r\n            }\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _resources = null;\r\n            _bundles.Clear();\r\n        }\r\n\r\n        public bool Contains(IAssetBundle item)\r\n        {\r\n            if (item == null) return false;\r\n            if (item == _resources) return true;\r\n            return _bundles.Contains(item);\r\n        }\r\n\r\n        public void CopyTo(IAssetBundle[] array, int arrayIndex)\r\n        {\r\n            if (array == null) throw new System.ArgumentNullException(\"array\");\r\n            if (arrayIndex < 0) throw new System.ArgumentOutOfRangeException(\"arrayIndex\");\r\n            if (array.Length - arrayIndex < this.Count) throw new System.ArgumentException(\"The number of elements in the source collection is greater than the available space from arrayIndex to the end of the destination array.\", \"array\");\r\n\r\n            if (_resources != null)\r\n            {\r\n                array[arrayIndex] = _resources;\r\n                arrayIndex++;\r\n            }\r\n            \r\n            if(_bundles.Count > 0)\r\n            {\r\n                var e = _bundles.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    array[arrayIndex] = e.Current;\r\n                    arrayIndex++;\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool Remove(IAssetBundle item)\r\n        {\r\n            if (item == null) return false;\r\n            if (item == _resources)\r\n            {\r\n                _resources = null;\r\n                return true;\r\n            }\r\n\r\n            return _bundles.Remove(item);\r\n        }\r\n\r\n        public Enumerator GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n        \r\n        IEnumerator<IAssetBundle> IEnumerable<IAssetBundle>.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region SPAssetBundle Interface\r\n\r\n        public IEnumerable<string> GetAllAssetNames()\r\n        {\r\n            //NOTE - we don't include resources, because its list is empty anyways. If this changes, add it here.\r\n            var e = _bundles.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                foreach(var p in e.Current.GetAllAssetNames())\r\n                {\r\n                    yield return p;\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool Contains(string name)\r\n        {\r\n            //NOTE - this is only because Resources can't be tested, if we find a way to test contains, this should be changed\r\n            if (_resources != null) return true;\r\n            if (_bundles.Count == 0) return false;\r\n\r\n            var e = _bundles.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if (e.Current.Contains(name)) return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public bool Contains(UnityEngine.Object asset)\r\n        {\r\n            //NOTE - this is only because Resources can't be tested, if we find a way to test contains, this should be changed\r\n            if (_resources != null) return true;\r\n            if (_bundles.Count == 0) return false;\r\n\r\n            var e = _bundles.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                if (e.Current.Contains(asset)) return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public UnityEngine.Object LoadAsset(string name)\r\n        {\r\n            if(_bundles.Count > 0)\r\n            {\r\n                var e = _bundles.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (e.Current.Contains(name)) return e.Current.LoadAsset(name);\r\n                }\r\n            }\r\n\r\n            if(_resources != null)\r\n            {\r\n                return _resources.LoadAsset(name);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public UnityEngine.Object LoadAsset(string name, System.Type tp)\r\n        {\r\n            if (_bundles.Count > 0)\r\n            {\r\n                var e = _bundles.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (e.Current.Contains(name)) return e.Current.LoadAsset(name, tp);\r\n                }\r\n            }\r\n\r\n            if (_resources != null)\r\n            {\r\n                return _resources.LoadAsset(name, tp);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public T LoadAsset<T>(string name) where T : UnityEngine.Object\r\n        {\r\n            return this.LoadAsset(name, typeof(T)) as T;\r\n        }\r\n\r\n        public void UnloadAllAssets()\r\n        {\r\n            if (_resources != null) _resources.UnloadAllAssets();\r\n\r\n            if (_bundles.Count > 0)\r\n            {\r\n                var e = _bundles.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    e.Current.UnloadAllAssets();\r\n                }\r\n            }\r\n        }\r\n\r\n        public void UnloadAsset(UnityEngine.Object asset)\r\n        {\r\n            if (asset == null) return;\r\n\r\n            if (_bundles.Count > 0)\r\n            {\r\n                var e = _bundles.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if(e.Current.Contains(asset))\r\n                    {\r\n                        e.Current.UnloadAsset(asset);\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(_resources != null)\r\n            {\r\n                _resources.UnloadAsset(asset);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public void Dispose()\r\n        {\r\n            this.UnloadAllAssets();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public struct Enumerator : IEnumerator<IAssetBundle>\r\n        {\r\n\r\n            private AssetBundleGroup _bundle;\r\n            private HashSet<IAssetBundle>.Enumerator _e;\r\n            private int _state;\r\n\r\n            internal Enumerator(AssetBundleGroup coll)\r\n            {\r\n                if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n                _bundle = coll;\r\n                _e = default(HashSet<IAssetBundle>.Enumerator);\r\n                _state = 0;\r\n            }\r\n\r\n\r\n            public IAssetBundle Current\r\n            {\r\n                get\r\n                {\r\n                    if (_bundle == null) return null;\r\n\r\n                    switch(_state)\r\n                    {\r\n                        case 0:\r\n                            return null;\r\n                        case 1:\r\n                            return _bundle._resources;\r\n                        case 2:\r\n                            return _e.Current;\r\n                        default:\r\n                            return null;\r\n                    }\r\n                }\r\n            }\r\n\r\n            object System.Collections.IEnumerator.Current\r\n            {\r\n                get\r\n                {\r\n                    return this.Current;\r\n                }\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                _bundle = null;\r\n                _e.Dispose();\r\n                _state = 3;\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                if (_bundle == null) return false;\r\n\r\n                switch (_state)\r\n                {\r\n                    case 0:\r\n                        if(_bundle._resources == null)\r\n                        {\r\n                            _state = 2;\r\n                            _e = _bundle._bundles.GetEnumerator();\r\n                            return _e.MoveNext();\r\n                        }\r\n                        else\r\n                        {\r\n                            _state = 1;\r\n                            return true;\r\n                        }\r\n                    case 1:\r\n                        _state = 2;\r\n                        _e = _bundle._bundles.GetEnumerator();\r\n                        return _e.MoveNext();\r\n                    case 2:\r\n                        if (_e.MoveNext())\r\n                        {\r\n                            return true;\r\n                        }\r\n                        else\r\n                        {\r\n                            _state = 3;\r\n                            return false;\r\n                        }\r\n                    default:\r\n                        return false;\r\n                }\r\n            }\r\n\r\n            void System.Collections.IEnumerator.Reset()\r\n            {\r\n                throw new System.NotSupportedException();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Project/ITextSource.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Project\r\n{\r\n    public interface ITextSource : IEnumerable<string>\r\n    {\r\n\r\n        string text { get; }\r\n        string this[int index] { get; }\r\n        int Count { get; }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Project/PrefabToken.cs",
    "content": "﻿using UnityEngine;\n\nnamespace com.spacepuppy.Project\n{\n\n    /// <summary>\n    /// Acts as a token to be attached to any prefab. It can then be used to recognize prefabs.\n    /// \n    /// When instantiated, the token deletes itself from the instance.\n    /// </summary>\n    public class PrefabToken : MonoBehaviour\n    {\n\n        protected virtual void Awake()\n        {\n            Object.Destroy(this);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Project/QueryableAssetSet.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\nusing UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Project\n{\n\n    [CreateAssetMenu(fileName = \"AssetSet\", menuName = \"Spacepuppy/Asset Set\")]\n    public class QueryableAssetSet : ScriptableObject, IAssetBundle\n    {\n\n        #region Fields\n\n        [SerializeField]\n        [ReorderableArray()]\n        private UnityEngine.Object[] _assets;\n\n        [System.NonSerialized]\n        private Dictionary<string, UnityEngine.Object> _table;\n        [System.NonSerialized]\n        private bool _clean;\n\n        #endregion\n        \n        #region Methods\n\n        private void SetupTable()\n        {\n            if (_table == null)\n                _table = new Dictionary<string, Object>();\n            else\n                _table.Clear();\n\n            for (int i = 0; i < _assets.Length; i++)\n            {\n                _table[_assets[i].name] = _assets[i];\n            }\n            _clean = true;\n        }\n\n        public UnityEngine.Object GetAsset(string name)\n        {\n            if (!_clean) this.SetupTable();\n\n            UnityEngine.Object obj;\n            if (_table.TryGetValue(name, out obj))\n                return obj;\n            else\n                return null;\n        }\n\n        public IEnumerable<UnityEngine.Object> GetAllAssets()\n        {\n            if (!_clean) this.SetupTable();\n\n            return _table.Values;\n        }\n\n        public IEnumerable<T> GetAllAssets<T>() where T : class\n        {\n            if (!_clean) this.SetupTable();\n\n            var e = _table.Values.GetEnumerator();\n            while(e.MoveNext())\n            {\n                var obj = ObjUtil.GetAsFromSource<T>(e.Current);\n                if(!object.ReferenceEquals(obj, null))\n                {\n                    yield return obj;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Replaces the internal collection with a new set of assets.\n        /// </summary>\n        /// <param name=\"assets\"></param>\n        public void ResetAssets(IEnumerable<UnityEngine.Object> assets)\n        {\n            _assets = assets.ToArray();\n            if(_table != null)\n            {\n                _table.Clear();\n                this.SetupTable();\n            }\n        }\n\n        #endregion\n\n        #region IAssetBundle Interface\n\n        public bool Contains(string name)\n        {\n            if (!_clean) this.SetupTable();\n\n            return _table.ContainsKey(name);\n        }\n\n        public bool Contains(UnityEngine.Object asset)\n        {\n            return System.Array.IndexOf(_assets, asset) >= 0;\n        }\n\n        public IEnumerable<string> GetAllAssetNames()\n        {\n            if (!_clean) this.SetupTable();\n\n            return _table.Keys;\n        }\n\n        UnityEngine.Object IAssetBundle.LoadAsset(string name)\n        {\n            return this.GetAsset(name);\n        }\n\n        UnityEngine.Object IAssetBundle.LoadAsset(string name, System.Type tp)\n        {\n            var obj = this.GetAsset(name);\n            if (object.ReferenceEquals(obj, null)) return null;\n\n            if (TypeUtil.IsType(obj.GetType(), tp)) return obj;\n            else return null;\n        }\n\n        T IAssetBundle.LoadAsset<T>(string name)\n        {\n            return this.GetAsset(name) as T;\n        }\n\n        public void UnloadAllAssets()\n        {\n            if (_table != null) _table.Clear();\n            for(int i = 0; i < _assets.Length; i++)\n            {\n                if(!(_assets[i] is GameObject))\n                {\n                    Resources.UnloadAsset(_assets[i]);\n                }\n            }\n            _clean = false;\n        }\n\n        public void UnloadAsset(UnityEngine.Object asset)\n        {\n            if(this.Contains(asset))\n            {\n                Resources.UnloadAsset(asset);\n            }\n        }\n\n\n\n        public void Dispose()\n        {\n            Resources.UnloadAsset(this);\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyBase/Project/ResourceLink.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Project\r\n{\r\n\r\n    [System.Serializable()]\r\n    public struct ResourceLink\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private string _path;\r\n        [System.NonSerialized]\r\n        private UnityEngine.Object _obj;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public ResourceLink(string path)\r\n        {\r\n            _path = path;\r\n            _obj = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public string Path\r\n        {\r\n            get { return _path; }\r\n            set { _path = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public UnityEngine.Object GetResource()\r\n        {\r\n            if(_obj == null)\r\n                _obj = Resources.Load(_path);\r\n            return _obj;\r\n        }\r\n\r\n        public T GetResource<T>() where T : UnityEngine.Object\r\n        {\r\n            if(_obj == null)\r\n                _obj = Resources.Load<T>(_path);\r\n            return _obj as T;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public class ConfigAttribute : System.Attribute\r\n        {\r\n\r\n            public System.Type resourceType;\r\n\r\n            public ConfigAttribute(System.Type resourceType)\r\n            {\r\n                this.resourceType = resourceType;\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Project/ResourceLinkTable.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Collections;\r\n\r\nnamespace com.spacepuppy.Project\r\n{\r\n\r\n    [System.Serializable]\r\n    public class ResourceLinkTable : SerializableDictionaryBase<string, ResourceLink>\r\n    {\r\n\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Project/ResourcePackage.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Project\r\n{\r\n\r\n    /// <summary>\r\n    /// A ScriptableObject that can be placed inside a 'Resources' folder and records the various assets in that folder. \r\n    /// When loaded it can be used to index the contents of that folder as a bundle of asssets. Facilitating the IAssetBundle \r\n    /// interface, and any factories that may use it.\r\n    /// </summary>\r\n    public class ResourcePackage : ScriptableObject, IAssetBundle\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private string _relativePath;\r\n\r\n        [SerializeField()]\r\n        private string[] _paths;\r\n\r\n        [System.NonSerialized()]\r\n        private string[] _relativePaths;\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        public string RelativePath\r\n        {\r\n            get { return _relativePath; }\r\n        }\r\n        \r\n        public string[] UnsafePaths { get { return _paths; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public IEnumerable<string> GetRelativePaths()\r\n        {\r\n            if (_paths == null) return ArrayUtil.Empty<string>();\r\n            if (string.IsNullOrEmpty(_relativePath))\r\n                return _paths;\r\n\r\n            if(_relativePaths == null)\r\n            {\r\n                _relativePaths = new string[_paths.Length];\r\n                for (int i = 0; i < _paths.Length; i++)\r\n                {\r\n                    _relativePaths[i] = _paths[i].EnsureNotStartWith(_relativePath).EnsureNotStartWith(\"/\");\r\n                }\r\n            }\r\n            return _relativePaths;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region IAssetBundle Interface\r\n\r\n        public IEnumerable<string> GetAllAssetNames()\r\n        {\r\n            return _paths;\r\n        }\r\n\r\n        public bool Contains(string path)\r\n        {\r\n            return System.Array.IndexOf(_paths, path) >= 0;\r\n        }\r\n\r\n        bool IAssetBundle.Contains(UnityEngine.Object asset)\r\n        {\r\n            //there's really no way to test this...\r\n            return true;\r\n        }\r\n\r\n        public UnityEngine.Object LoadAsset(string path)\r\n        {\r\n            //if (!this.Contains(path)) return null;\r\n            return AssetBundles.Resources.LoadAsset(path);\r\n        }\r\n\r\n        public UnityEngine.Object LoadAsset(string path, System.Type tp)\r\n        {\r\n            //if (!this.Contains(path)) return null;\r\n            return AssetBundles.Resources.LoadAsset(path, tp);\r\n        }\r\n\r\n        public T LoadAsset<T>(string path) where T : UnityEngine.Object\r\n        {\r\n            //if (!this.Contains(path)) return null;\r\n            return AssetBundles.Resources.LoadAsset<T>(path);\r\n        }\r\n\r\n        void IAssetBundle.UnloadAsset(UnityEngine.Object asset)\r\n        {\r\n            AssetBundles.Resources.UnloadAsset(asset);\r\n        }\r\n\r\n        void IAssetBundle.UnloadAllAssets()\r\n        {\r\n            AssetBundles.Resources.UnloadAllAssets();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public void Dispose()\r\n        {\r\n            (this as IAssetBundle).UnloadAllAssets();\r\n            //UnityEngine.Object.Destroy(this);\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Project/SerializableInterfaceRef.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Project\n{\n\n    /// <summary>\n    /// Exists to make SerializableInterfaceRef drawable. Do not inherit from this, instead inherit from SerializableInterfaceRef.\n    /// </summary>\n    public abstract class BaseSerializableInterfaceRef\n    {\n        \n    }\n    \n    /// <summary>\n    /// Supports easily serializing a UnityEngine.Object as some interface type, while also allowing the assignment of non-UnityEngine.Object's as said interface type as well (but not serialized).\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    [System.Serializable]\n    public class SerializableInterfaceRef<T> : BaseSerializableInterfaceRef where T : class\n    {\n\n        #region Fields\n\n        [SerializeField]\n        private UnityEngine.Object _obj;\n        [System.NonSerialized]\n        private T _value;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public SerializableInterfaceRef()\n        {\n\n        }\n\n        public SerializableInterfaceRef(T value)\n        {\n            this.Value = value;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public T Value\n        {\n            get\n            {\n                if (_value != null) return _value;\n                return _obj as T;\n            }\n            set\n            {\n                _obj = value as UnityEngine.Object;\n                _value = value;\n            }\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Project/TagData.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Project\r\n{\r\n    public sealed class TagData : ScriptableObject, ISerializationCallbackReceiver, IEnumerable<string>\r\n    {\r\n\r\n        #region Static Interface\r\n\r\n        private static TagData _instance;\r\n        private static bool _loaded;\r\n\r\n        public static IList<string> Tags\r\n        {\r\n            get\r\n            {\r\n                if (!_loaded) Reload();\r\n                return (_instance != null) ? _instance._readonlyTags : null;\r\n            }\r\n        }\r\n\r\n        public static bool IsValidTag(string stag)\r\n        {\r\n            return TagData.Tags.Contains(stag);\r\n        }\r\n\r\n        public static TagData Asset\r\n        {\r\n            get\r\n            {\r\n                if (!_loaded) Reload();\r\n                return _instance;\r\n            }\r\n        }\r\n\r\n        private static void Reload()\r\n        {\r\n            _instance = Resources.Load(@\"TagData\") as TagData;\r\n            if (_instance == null) _instance = ScriptableObject.CreateInstance<TagData>();\r\n            _loaded = true;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private string[] _tags;\r\n\r\n        [System.NonSerialized()]\r\n        private IList<string> _readonlyTags;\r\n\r\n        #endregion\r\n\r\n        #region ISerializationCallbackReceiver Interface\r\n        void ISerializationCallbackReceiver.OnAfterDeserialize()\r\n        {\r\n            _readonlyTags = new System.Collections.ObjectModel.ReadOnlyCollection<string>(_tags);\r\n        }\r\n\r\n        void ISerializationCallbackReceiver.OnBeforeSerialize()\r\n        {\r\n        }\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n        public IEnumerator<string> GetEnumerator()\r\n        {\r\n            return (_tags != null) ? (_tags as IEnumerable<string>).GetEnumerator() : Enumerable.Empty<string>().GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return (_tags != null) ? _tags.GetEnumerator() : Enumerable.Empty<string>().GetEnumerator();\r\n        }\r\n        #endregion\r\n\r\n\r\n\r\n        #region Static Utils\r\n\r\n        public static bool IsDefaultUnityTag(string tag)\r\n        {\r\n            switch(tag)\r\n            {\r\n                case SPConstants.TAG_UNTAGGED:\r\n                case SPConstants.TAG_RESPAWN:\r\n                case SPConstants.TAG_FINISH:\r\n                case SPConstants.TAG_EDITORONLY:\r\n                case SPConstants.TAG_MAINCAMERA:\r\n                case SPConstants.TAG_GAMECONTROLLER:\r\n                case SPConstants.TAG_PLAYER:\r\n                    return true;\r\n                default:\r\n                    return false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public class EditorHelper\r\n        {\r\n            private TagData _data;\r\n\r\n            public EditorHelper(TagData data)\r\n            {\r\n                _data = data;\r\n            }\r\n\r\n            public TagData Target { get { return _data; } }\r\n\r\n            public IList<string> Tags { get { return _data._readonlyTags; } }\r\n\r\n            public void UpdateTags(IEnumerable<string> tags)\r\n            {\r\n                if (tags == null) throw new System.ArgumentNullException(\"tags\");\r\n                _data._tags = tags.ToArray();\r\n                _data._readonlyTags = new System.Collections.ObjectModel.ReadOnlyCollection<string>(_data._tags);\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Project/TextDocument.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Collections;\r\n\r\nnamespace com.spacepuppy.Project\r\n{\r\n\r\n    [CreateAssetMenu(fileName = \"TextDocument\", menuName = \"Spacepuppy/TextDocument\")]\r\n    public class TextDocument : ScriptableObject, ITextSource\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [ReorderableArray()]\r\n        [TextArea(3, 10)]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"_message\")]\r\n        private string[] _text;\r\n\r\n        #endregion\r\n\r\n        #region ITextSource Interface\r\n\r\n        public string this[int index]\r\n        {\r\n            get\r\n            {\r\n                return _text[index];\r\n            }\r\n        }\r\n\r\n        public int Count\r\n        {\r\n            get\r\n            {\r\n                return _text.Length;\r\n            }\r\n        }\r\n\r\n        public string text\r\n        {\r\n            get\r\n            {\r\n                return (_text.Length > 0) ? _text[0] : null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public IEnumerator<string> GetEnumerator()\r\n        {\r\n            return (_text as IEnumerable<string>).GetEnumerator();\r\n        }\r\n\r\n        IEnumerator IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    [CreateAssetMenu(fileName = \"WeightedTextDocument\", menuName = \"Spacepuppy/WeightedTextDocument\")]\r\n    public class WeightedTextDocument : ScriptableObject, ITextSource\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [ReorderableArray()]\r\n        [TextArea(3, 10)]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"_message\")]\r\n        private string[] _text;\r\n        [SerializeField]\r\n        private float[] _weights;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n        \r\n        public float[] Weights\r\n        {\r\n            get { return _weights; }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region ITextSource Interface\r\n\r\n        public string this[int index]\r\n        {\r\n            get\r\n            {\r\n                return _text[index];\r\n            }\r\n        }\r\n\r\n        public int Count\r\n        {\r\n            get\r\n            {\r\n                return _text.Length;\r\n            }\r\n        }\r\n\r\n        public string text\r\n        {\r\n            get\r\n            {\r\n                return (_text.Length > 0) ? _text[0] : null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public IEnumerator<string> GetEnumerator()\r\n        {\r\n            return (_text as IEnumerable<string>).GetEnumerator();\r\n        }\r\n\r\n        IEnumerator IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Project/TextRef.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Project\r\n{\r\n\r\n    [System.Serializable]\r\n    public class TextRef : ITextSource\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private string[] _text;\r\n        [SerializeField]\r\n        private UnityEngine.Object _obj;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public UnityEngine.Object Source\r\n        {\r\n            get { return _obj; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITextSource Interface\r\n\r\n        public int Count\r\n        {\r\n            get\r\n            {\r\n                if (_obj != null && _obj is ITextSource)\r\n                    return (_obj as ITextSource).Count;\r\n                else if (_obj is TextAsset)\r\n                    return 1;\r\n                else\r\n                    return _text != null ? _text.Length : 0;\r\n            }\r\n        }\r\n\r\n        public string text\r\n        {\r\n            get\r\n            {\r\n                if (_obj != null && _obj is ITextSource)\r\n                    return (_obj as ITextSource).text;\r\n                else if (_obj is TextAsset)\r\n                    return (_obj as TextAsset).text;\r\n                else\r\n                    return _text != null && _text.Length > 0 ? _text[0] : null;\r\n            }\r\n        }\r\n\r\n        public string this[int index]\r\n        {\r\n            get\r\n            {\r\n                if (_obj != null && _obj is ITextSource)\r\n                    return (_obj as ITextSource)[index];\r\n                else if (_obj is TextAsset)\r\n                {\r\n                    if(index != 0)\r\n                        throw new System.IndexOutOfRangeException(\"index\");\r\n                    return (_obj as TextAsset).text;\r\n                }\r\n                else\r\n                {\r\n                    if(_text == null || _text.Length == 0 || index < 0 || index >= _text.Length)\r\n                        throw new System.IndexOutOfRangeException(\"index\");\r\n                    return _text[index];\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public IEnumerator<string> GetEnumerator()\r\n        {\r\n            if (_obj != null && _obj is ITextSource)\r\n                return (_obj as ITextSource).GetEnumerator();\r\n            else if (_obj is TextAsset)\r\n                return FromTextAsset(_obj as TextAsset);\r\n            else if (_text != null && _text.Length > 0)\r\n                return (_text as IEnumerable<string>).GetEnumerator();\r\n            else\r\n                return Enumerable.Empty<string>().GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n\r\n        private static IEnumerator<string> FromTextAsset(TextAsset text)\r\n        {\r\n            yield return text.text;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public class ConfigAttribute : System.Attribute\r\n        {\r\n\r\n            public bool DisallowFoldout;\r\n\r\n            public ConfigAttribute(bool disallowFoldout)\r\n            {\r\n                this.DisallowFoldout = disallowFoldout;\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"SpacepuppyBase\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"SpacepuppyBase\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"ce2ab535-48a8-4baf-b082-073def0454ea\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"2.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "SpacepuppyBase/PropertyAttributes.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    public abstract class SPPropertyAttribute : PropertyAttribute\r\n    {\r\n\r\n        public SPPropertyAttribute()\r\n        {\r\n\r\n        }\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class DisplayNameAttribute : TooltipAttribute\r\n    {\r\n\r\n        public string DisplayName;\r\n\r\n        public DisplayNameAttribute(string displayName) : base(null)\r\n        {\r\n            this.DisplayName = displayName;\r\n        }\r\n\r\n        public DisplayNameAttribute(string displayName, string tooltip) : base(tooltip)\r\n        {\r\n            this.DisplayName = displayName;\r\n        }\r\n\r\n    }\r\n\r\n    #region Component Attributes\r\n\r\n    /*\r\n     * TODO\r\n     * \r\n    [System.AttributeUsage(System.AttributeTargets.Class, Inherited = false, AllowMultiple = false)]\r\n    public sealed class ExecutionOrderAttribute : System.Attribute\r\n    {\r\n\r\n        public int Order;\r\n        public bool Inherited;\r\n\r\n        public ExecutionOrderAttribute(int order)\r\n        {\r\n            this.Order = order;\r\n        }\r\n\r\n    }\r\n    */\r\n\r\n    public abstract class ComponentHeaderAttribute : PropertyAttribute\r\n    {\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple = true, Inherited = true)]\r\n    public class RequireLikeComponentAttribute : ComponentHeaderAttribute\r\n    {\r\n\r\n        private System.Type[] _types;\r\n\r\n        public RequireLikeComponentAttribute(params System.Type[] tps)\r\n        {\r\n            _types = tps;\r\n        }\r\n\r\n        public System.Type[] Types\r\n        {\r\n            get { return _types; }\r\n        }\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple = true, Inherited = true)]\r\n    public class RequireComponentInEntityAttribute : ComponentHeaderAttribute\r\n    {\r\n\r\n        private System.Type[] _types;\r\n\r\n        public RequireComponentInEntityAttribute(params System.Type[] tps)\r\n        {\r\n            _types = tps;\r\n        }\r\n\r\n        public System.Type[] Types\r\n        {\r\n            get { return _types; }\r\n        }\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple = false, Inherited = false)]\r\n    public class UniqueToEntityAttribute : ComponentHeaderAttribute\r\n    {\r\n\r\n        public bool MustBeAttachedToRoot;\r\n        public bool IgnoreInactive;\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple = false, Inherited = false)]\r\n    public class RequireLayerAttribute : ComponentHeaderAttribute\r\n    {\r\n        public int Layer;\r\n\r\n        public RequireLayerAttribute(int layer)\r\n        {\r\n            this.Layer = layer;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Defines a script as requiring either a Collider or Rigidbody attached to it.\r\n    /// </summary>\r\n    [System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple = false, Inherited = false)]\r\n    public class RequireColliderAttribute : ComponentHeaderAttribute\r\n    {\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple = false, Inherited = true)]\r\n    public class ForceRootTagAttribute : ComponentHeaderAttribute\r\n    {\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple = false, Inherited = false)]\r\n    public class ConstantlyRepaintEditorAttribute : System.Attribute\r\n    {\r\n        public bool RuntimeOnly;\r\n    }\r\n\r\n    #endregion\r\n\r\n    #region Property Drawer Attributes\r\n\r\n    /// <summary>\r\n    /// ScriptableObject doesn't draw vectors correctly for some reason... this allows you to coerce it to.\r\n    /// </summary>\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class VectorInspectorAttribute : SPPropertyAttribute\r\n    {\r\n\r\n        public VectorInspectorAttribute()\r\n        {\r\n\r\n        }\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class UnitVectorAttribute : SPPropertyAttribute\r\n    {\r\n\r\n        public UnitVectorAttribute() : base()\r\n        {\r\n\r\n        }\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class EulerRotationInspectorAttribute : SPPropertyAttribute\r\n    {\r\n\r\n        public bool UseRadians = false;\r\n\r\n        public EulerRotationInspectorAttribute()\r\n        {\r\n\r\n        }\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class EnumFlagsAttribute : SPPropertyAttribute\r\n    {\r\n\r\n        public System.Type EnumType;\r\n\r\n        public EnumFlagsAttribute()\r\n        {\r\n\r\n        }\r\n\r\n        public EnumFlagsAttribute(System.Type enumType)\r\n        {\r\n            this.EnumType = enumType;\r\n        }\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class EnumPopupExcludingAttribute : SPPropertyAttribute\r\n    {\r\n\r\n        public readonly int[] excludedValues;\r\n\r\n        public EnumPopupExcludingAttribute(params int[] excluded)\r\n        {\r\n            excludedValues = excluded;\r\n        }\r\n\r\n    }\r\n    \r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class EnumInCustomOrderAttribute : SPPropertyAttribute\r\n    {\r\n\r\n        public readonly int[] customOrder;\r\n\r\n        public EnumInCustomOrderAttribute(params int[] enumOrder)\r\n        {\r\n            this.customOrder = enumOrder;\r\n        }\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class TagSelectorAttribute : SPPropertyAttribute\r\n    {\r\n        public bool AllowUntagged;\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class TimeUnitsSelectorAttribute : SPPropertyAttribute\r\n    {\r\n        public string DefaultUnits;\r\n\r\n        public TimeUnitsSelectorAttribute()\r\n        {\r\n        }\r\n\r\n        public TimeUnitsSelectorAttribute(string defaultUnits)\r\n        {\r\n            DefaultUnits = defaultUnits;\r\n        }\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class GenericMaskAttribute : SPPropertyAttribute\r\n    {\r\n\r\n        private string[] _maskNames;\r\n\r\n        public GenericMaskAttribute(params string[] names)\r\n        {\r\n            _maskNames = names;\r\n        }\r\n\r\n        public string[] MaskNames { get { return _maskNames; } }\r\n\r\n    }\r\n\r\n    /// <summary>\r\n    /// TODO - consider deprecating since 'SelectableComponentAttribute' mostly does the same thing as this... \r\n    /// only that this allows 'hiding the dropdown' and selecting the first component of the restriction type found on the source.\r\n    /// This had a purpose at one point when there was different 'drop down' modes, but we devised a much better way of choosing the component.\r\n    /// </summary>\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class TypeRestrictionAttribute : SPPropertyAttribute\r\n    {\r\n        public System.Type InheritsFromType;\r\n        public bool HideTypeDropDown;\r\n        public bool AllowProxy;\r\n\r\n        public TypeRestrictionAttribute(System.Type inheritsFromType)\r\n        {\r\n            this.InheritsFromType = inheritsFromType;\r\n        }\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    [System.Obsolete(\"Use TypeRestrictionAttribute Instead\")]\r\n    public class ComponentTypeRestrictionAttribute : TypeRestrictionAttribute\r\n    {\r\n        public ComponentTypeRestrictionAttribute(System.Type inheritsFromType)\r\n            : base(inheritsFromType)\r\n        {\r\n\r\n        }\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class SelectableComponentAttribute : SPPropertyAttribute\r\n    {\r\n        public System.Type InheritsFromType;\r\n        public bool AllowSceneObjects = true;\r\n        public bool ForceOnlySelf = false;\r\n        public bool SearchChildren = false;\r\n        public bool AllowProxy;\r\n\r\n        public SelectableComponentAttribute()\r\n        {\r\n\r\n        }\r\n\r\n        public SelectableComponentAttribute(System.Type inheritsFromType)\r\n        {\r\n            this.InheritsFromType = inheritsFromType;\r\n        }\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class SelectableObjectAttribute : SPPropertyAttribute\r\n    {\r\n        public System.Type InheritsFromType;\r\n        public bool AllowSceneObjects = true;\r\n        public bool AllowProxy;\r\n\r\n        public SelectableObjectAttribute()\r\n        {\r\n\r\n        }\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class ReorderableArrayAttribute : SPPropertyAttribute\r\n    {\r\n\r\n        public string ElementLabelFormatString = null;\r\n        public bool DisallowFoldout;\r\n        public bool RemoveBackgroundWhenCollapsed;\r\n        public bool Draggable = true;\r\n        public float ElementPadding = 0f;\r\n        public bool DrawElementAtBottom = false;\r\n        public bool HideElementLabel = false;\r\n        public bool ShowTooltipInHeader = false;\r\n\r\n        /// <summary>\r\n        /// If DrawElementAtBottom is true, this child element can be displayed as the label in the reorderable list.\r\n        /// </summary>\r\n        public string ChildPropertyToDrawAsElementLabel;\r\n\r\n        /// <summary>\r\n        /// If DrawElementAtBottom is true, this child element can be displayed as the modifiable entry in the reorderable list.\r\n        /// </summary>\r\n        public string ChildPropertyToDrawAsElementEntry;\r\n\r\n        /// <summary>\r\n        /// A method on the serialized object that is called when a new entry is added to the list/array. Should accept the list member type \r\n        /// as a parameter, and then also return it (used for updating).\r\n        /// \r\n        /// Like:\r\n        /// object OnObjectAddedToList(object obj)\r\n        /// </summary>\r\n        public string OnAddCallback;\r\n\r\n        /// <summary>\r\n        /// If the array/list accepts UnityEngine.Objects, this will allow the dragging of objects onto the inspector to auto add without needing to click the + button.\r\n        /// </summary>\r\n        public bool AllowDragAndDrop = true;\r\n\r\n        public ReorderableArrayAttribute()\r\n        {\r\n\r\n        }\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple=false)]\r\n    public class OneOrManyAttribute : SPPropertyAttribute\r\n    {\r\n        public OneOrManyAttribute()\r\n        {\r\n\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Restrict a value to be no lesser than min.\r\n    /// </summary>\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class MinRangeAttribute : SPPropertyAttribute\r\n    {\r\n        public float Min;\r\n\r\n        public MinRangeAttribute(float min)\r\n        {\r\n            this.Min = min;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Restrict a value to be no greater than max.\r\n    /// </summary>\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class MaxRangeAttribute : SPPropertyAttribute\r\n    {\r\n        public float Max;\r\n\r\n        public MaxRangeAttribute(float max)\r\n        {\r\n            this.Max = max;\r\n        }\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class DisplayNestedPropertyAttribute : SPPropertyAttribute\r\n    {\r\n\r\n        public readonly string InnerPropName;\r\n        public readonly string Label;\r\n        public readonly string Tooltip;\r\n\r\n        public DisplayNestedPropertyAttribute(string innerPropName)\r\n        {\r\n            InnerPropName = innerPropName;\r\n        }\r\n\r\n        public DisplayNestedPropertyAttribute(string innerPropName, string label)\r\n        {\r\n            InnerPropName = innerPropName;\r\n            Label = label;\r\n        }\r\n\r\n        public DisplayNestedPropertyAttribute(string innerPropName, string label, string tooltip)\r\n        {\r\n            InnerPropName = innerPropName;\r\n            Label = label;\r\n            Tooltip = tooltip;\r\n        }\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class DisplayFlatAttribute : SPPropertyAttribute\r\n    {\r\n\r\n        public bool CanShrinkAndExpand;\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class InputIDAttribute : SPPropertyAttribute\r\n    {\r\n\r\n        public string[] RestrictedTo;\r\n        public string[] Exclude;\r\n\r\n        public InputIDAttribute()\r\n        {\r\n\r\n        }\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class AnimationCurveConstraintAttribute : PropertyAttribute\r\n    {\r\n        public float x;\r\n        public float y;\r\n        public float width = float.PositiveInfinity;\r\n        public float height = float.PositiveInfinity;\r\n        public Color color = Color.green;\r\n    }\r\n\r\n    public class AnimationCurveEaseScaleAttribute : PropertyAttribute\r\n    {\r\n        public float overscan = 1f;\r\n        public Color color = Color.green;\r\n    }\r\n\r\n    /// <summary>\r\n    /// A specialized PropertyDrawer that draws a struct/class in the shape:\r\n    /// struct Pair\r\n    /// {\r\n    ///     float Weight;\r\n    ///     UnityEngine.Object Value;\r\n    /// }\r\n    /// \r\n    /// It is drawn in the inspector as a single row as weight : value. \r\n    /// It is intended for use with arrays/lists of values that can be randomly selected by some weight.\r\n    /// </summary>\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class WeightedValueCollectionAttribute : ReorderableArrayAttribute\r\n    {\r\n        public string WeightPropertyName = \"Weight\";\r\n\r\n        public WeightedValueCollectionAttribute(string weightPropName, string valuePropName)\r\n        {\r\n            this.WeightPropertyName = weightPropName;\r\n            this.ChildPropertyToDrawAsElementEntry = valuePropName;\r\n        }\r\n    }\r\n\r\n    #endregion\r\n\r\n    #region Default Or Configured Property Drawer Attribute\r\n\r\n    public abstract class DefaultOrConfiguredAttribute : PropertyAttribute\r\n    {\r\n\r\n        private System.Type _fieldType;\r\n        private object _defaultValue;\r\n\r\n        public DefaultOrConfiguredAttribute(System.Type tp)\r\n        {\r\n            _fieldType = tp;\r\n            _defaultValue = tp.GetDefaultValue();\r\n        }\r\n\r\n        public DefaultOrConfiguredAttribute(System.Type tp, object defaultValue)\r\n        {\r\n            _fieldType = tp;\r\n            _defaultValue = defaultValue;\r\n        }\r\n\r\n        public System.Type FieldType { get { return _fieldType; } }\r\n\r\n        public virtual bool DrawAsDefault(object value)\r\n        {\r\n            return object.Equals(value, _defaultValue);\r\n        }\r\n        public virtual object GetDefaultValue()\r\n        {\r\n            return _defaultValue;\r\n        }\r\n\r\n        public virtual object GetValueToDisplayAsDefault()\r\n        {\r\n            return this.GetDefaultValue();\r\n        }\r\n    }\r\n    \r\n    #endregion\r\n\r\n    #region ModifierDrawer Attributes\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = true)]\r\n    public abstract class PropertyModifierAttribute : SPPropertyAttribute\r\n    {\r\n        public bool IncludeChidrenOnDraw;\r\n    }\r\n\r\n    /// <summary>\r\n    /// While in the editor, if the value is ever null, an attempt is made to get the value from self. You will still \r\n    /// have to initialize the value on Awake if null. The cost of doing it automatically is too high for all components \r\n    /// to test themselves for this attribute.\r\n    /// </summary>\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class DefaultFromSelfAttribute : PropertyModifierAttribute\r\n    {\r\n        public EntityRelativity Relativity = EntityRelativity.Self;\r\n        public bool HandleOnce = true;\r\n\r\n        public DefaultFromSelfAttribute(EntityRelativity relativity = EntityRelativity.Self)\r\n        {\r\n            this.Relativity = relativity;\r\n        }\r\n\r\n    }\r\n\r\n    /// <summary>\r\n    /// While in the editor, if the value is ever null, an attempt is made to find the value on a GameObject in itself \r\n    /// that matches the name given.\r\n    /// \r\n    /// You whil still have to initialize the value on Awake if null. The cost of doing it automatically is too high for all \r\n    /// components to test themselves for this attribute.\r\n    /// </summary>\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class FindInSelfAttribute : PropertyModifierAttribute\r\n    {\r\n        public string Name;\r\n        public bool UseEntity = false;\r\n\r\n        public FindInSelfAttribute(string name)\r\n        {\r\n            this.Name = name;\r\n        }\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class ForceFromSelfAttribute : PropertyModifierAttribute\r\n    {\r\n\r\n        public EntityRelativity Relativity = EntityRelativity.Self;\r\n        \r\n        public ForceFromSelfAttribute(EntityRelativity relativity = EntityRelativity.Self)\r\n        {\r\n            this.Relativity = relativity;\r\n        }\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class DisableOnPlayAttribute : PropertyModifierAttribute\r\n    {\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class DisableIfAttribute : PropertyModifierAttribute\r\n    {\r\n        public readonly string MemberName;\r\n        public bool DisableIfNot;\r\n        \r\n        public DisableIfAttribute(string memberName)\r\n        {\r\n            this.MemberName = memberName;\r\n        }\r\n\r\n    }\r\n\r\n    /// <summary>\r\n    /// Display a field in the inspector only if the property/method returns true (supports private).\r\n    /// </summary>\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class DisplayIfAttribute : SPPropertyAttribute\r\n    {\r\n        public readonly string MemberName;\r\n        public bool DisplayIfNot;\r\n\r\n        public DisplayIfAttribute(string memberName)\r\n        {\r\n            this.MemberName = memberName;\r\n        }\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class ReadOnlyAttribute : PropertyModifierAttribute\r\n    {\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n    public class OnChangedInEditorAttribute : PropertyModifierAttribute\r\n    {\r\n\r\n        public readonly string MethodName;\r\n        public bool OnlyAtRuntime;\r\n\r\n        public OnChangedInEditorAttribute(string methodName)\r\n        {\r\n            this.MethodName = methodName;\r\n        }\r\n\r\n    }\r\n\r\n    #endregion\r\n\r\n    #region Decorator Attributes\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = true)]\r\n    public class InsertButtonAttribute : PropertyAttribute\r\n    {\r\n\r\n        public string Label;\r\n        public string OnClick;\r\n        public bool PrecedeProperty;\r\n        public bool RuntimeOnly;\r\n\r\n        public InsertButtonAttribute(string label, string onClick)\r\n        {\r\n            this.Label = label;\r\n            this.OnClick = onClick;\r\n        }\r\n\r\n    }\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Class, AllowMultiple = false)]\r\n    public class InfoboxAttribute : ComponentHeaderAttribute\r\n    {\r\n        public string Message;\r\n        public InfoBoxMessageType MessageType = InfoBoxMessageType.Info;\r\n\r\n        public InfoboxAttribute(string msg)\r\n        {\r\n            this.Message = msg;\r\n        }\r\n\r\n    }\r\n\r\n    #endregion\r\n\r\n    #region NonSerialized Property Drawer Attributes\r\n\r\n    public class ShowNonSerializedPropertyAttribute : System.Attribute\r\n    {\r\n        public string Label;\r\n        public string Tooltip;\r\n        public bool Readonly;\r\n\r\n        public ShowNonSerializedPropertyAttribute(string label)\r\n        {\r\n            this.Label = label;\r\n        }\r\n    }\r\n\r\n    #endregion\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/Proxy.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    public interface IProxy\r\n    {\r\n\r\n        /// <summary>\r\n        /// Returns true if the underlying proxy performs a search/query of the scene.\r\n        /// </summary>\r\n        bool QueriesTarget { get; }\r\n\r\n        System.Type GetTargetType();\r\n\r\n        object GetTarget();\r\n        object GetTarget(object arg);\r\n    }\r\n\r\n    /// <summary>\r\n    /// A serializable IProxy struct that will search the scene for an object by name/tag/type.\r\n    /// </summary>\r\n    [System.Serializable]\r\n    public struct QueryProxy : IProxy\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private UnityEngine.Object _target;\r\n        [SerializeField()]\r\n        private SearchBy _searchBy;\r\n        [SerializeField()]\r\n        private string _queryString;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public QueryProxy(UnityEngine.Object target)\r\n        {\r\n            _target = target;\r\n            _searchBy = SearchBy.Nothing;\r\n            _queryString = null;\r\n        }\r\n\r\n        public QueryProxy(SearchBy searchBy)\r\n        {\r\n            _target = null;\r\n            _searchBy = searchBy;\r\n            _queryString = null;\r\n        }\r\n\r\n        public QueryProxy(SearchBy searchBy, string query)\r\n        {\r\n            _target = null;\r\n            _searchBy = searchBy;\r\n            _queryString = query;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public UnityEngine.Object Target\r\n        {\r\n            get { return _target; }\r\n            set { _target = value; }\r\n        }\r\n        \r\n        public SearchBy SearchBy\r\n        {\r\n            get { return _searchBy; }\r\n            set { _searchBy = value; }\r\n        }\r\n\r\n        public string SearchByQuery\r\n        {\r\n            get { return _queryString; }\r\n            set { _queryString = value; }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public object GetTarget()\r\n        {\r\n            if (_searchBy == SearchBy.Nothing)\r\n            {\r\n                return (_target is IProxy) ? (_target as IProxy).GetTarget() : _target;\r\n            }\r\n            else\r\n            {\r\n                return ObjUtil.Find(_searchBy, _queryString);\r\n            }\r\n        }\r\n\r\n        public object[] GetTargets()\r\n        {\r\n            if (_searchBy == SearchBy.Nothing)\r\n            {\r\n                return new object[] { (_target is IProxy) ? (_target as IProxy).GetTarget() : _target };\r\n            }\r\n            else\r\n            {\r\n                return ObjUtil.FindAll(_searchBy, _queryString);\r\n            }\r\n        }\r\n\r\n        public T GetTarget<T>() where T : class\r\n        {\r\n            if (_searchBy == SearchBy.Nothing)\r\n            {\r\n                return ObjUtil.GetAsFromSource<T>(_target, true);\r\n            }\r\n            else\r\n            {\r\n                return ObjUtil.Find<T>(_searchBy, _queryString);\r\n            }\r\n        }\r\n\r\n        public T[] GetTargets<T>() where T : class\r\n        {\r\n            if (_searchBy == SearchBy.Nothing)\r\n            {\r\n                var targ = ObjUtil.GetAsFromSource<T>(_target, true);\r\n                return targ != null ? new T[] { targ } : ArrayUtil.Empty<T>();\r\n            }\r\n            else\r\n            {\r\n                return ObjUtil.FindAll<T>(_searchBy, _queryString);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IProxy Interface\r\n\r\n        bool IProxy.QueriesTarget\r\n        {\r\n            get { return _searchBy > SearchBy.Nothing; }\r\n        }\r\n\r\n        object IProxy.GetTarget()\r\n        {\r\n            return this.GetTarget();\r\n        }\r\n\r\n        object IProxy.GetTarget(object arg)\r\n        {\r\n            return this.GetTarget();\r\n        }\r\n\r\n        public System.Type GetTargetType()\r\n        {\r\n            if (_target == null) return typeof(object);\r\n            return (_target is IProxy) ? (_target as IProxy).GetTargetType() : _target.GetType();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public class ConfigAttribute : System.Attribute\r\n        {\r\n\r\n            public System.Type TargetType;\r\n            public bool AllowProxy = true;\r\n\r\n            public ConfigAttribute()\r\n            {\r\n                this.TargetType = typeof(GameObject);\r\n            }\r\n\r\n            public ConfigAttribute(System.Type targetType)\r\n            {\r\n                //if (targetType == null || \r\n                //    (!TypeUtil.IsType(targetType, typeof(UnityEngine.Object)) && !TypeUtil.IsType(targetType, typeof(IComponent)))) throw new TypeArgumentMismatchException(targetType, typeof(UnityEngine.Object), \"targetType\");\r\n                if (targetType == null ||\r\n                    (!TypeUtil.IsType(targetType, typeof(UnityEngine.Object)) && !targetType.IsInterface))\r\n                    throw new TypeArgumentMismatchException(targetType, typeof(UnityEngine.Object), \"targetType\");\r\n\r\n                this.TargetType = targetType;\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    /// <summary>\r\n    /// A serializable IProxy struct that will access a target's member/property for an object.\r\n    /// </summary>\r\n    [System.Serializable]\r\n    public struct MemberProxy : IProxy\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [SelectableObject]\r\n        private UnityEngine.Object _target;\r\n        [SerializeField()]\r\n        private string _memberName;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public UnityEngine.Object Target\r\n        {\r\n            get { return _target; }\r\n            set { _target = value; }\r\n        }\r\n\r\n        public string MemberName\r\n        {\r\n            get { return _memberName; }\r\n            set { _memberName = value; }\r\n        }\r\n\r\n        public object Value\r\n        {\r\n            get { return this.GetValue(); }\r\n            set { this.SetValue(value); }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public object GetValue()\r\n        {\r\n            if (_target == null) return null;\r\n\r\n            var obj = ObjUtil.ReduceIfProxy(_target);\r\n            if (obj == null)\r\n                return null;\r\n            else\r\n                return DynamicUtil.GetValue(obj, _memberName);\r\n        }\r\n        \r\n        public T GetValue<T>()\r\n        {\r\n            if (_target == null) return default(T);\r\n\r\n            var obj = ObjUtil.ReduceIfProxy(_target);\r\n            if (obj == null)\r\n                return default(T);\r\n            else\r\n            {\r\n                var result = DynamicUtil.GetValue(_target, _memberName);\r\n                if (result is T)\r\n                    return (T)result;\r\n                else if (ConvertUtil.IsSupportedType(typeof(T)))\r\n                    return ConvertUtil.ToPrim<T>(result);\r\n                else\r\n                    return default(T);\r\n            }\r\n        }\r\n\r\n        public bool SetValue(object value)\r\n        {\r\n            if (_target == null) return false;\r\n\r\n            var obj = ObjUtil.ReduceIfProxy(_target);\r\n            if (obj == null)\r\n                return false;\r\n            else\r\n                return DynamicUtil.SetValue(_target, _memberName, value);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IProxy Interface\r\n\r\n        bool IProxy.QueriesTarget\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        object IProxy.GetTarget()\r\n        {\r\n            return this.GetValue();\r\n        }\r\n\r\n        object IProxy.GetTarget(object arg)\r\n        {\r\n            return this.GetValue();\r\n        }\r\n\r\n        public System.Type GetTargetType()\r\n        {\r\n            if (_memberName == null) return typeof(object);\r\n\r\n            if(_target is IProxy)\r\n            {\r\n                var tp = (_target as IProxy).GetTargetType();\r\n                return DynamicUtil.GetReturnType(DynamicUtil.GetMemberFromType(tp, _memberName, false)) ?? typeof(object);\r\n            }\r\n            else\r\n            {\r\n                return DynamicUtil.GetReturnType(DynamicUtil.GetMember(ObjUtil.ReduceIfProxy(_target), _memberName, false)) ?? typeof(object);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Config Attrib\r\n\r\n        public class ConfigAttribute : System.Attribute\r\n        {\r\n            public DynamicMemberAccess MemberAccessLevel;\r\n\r\n            public ConfigAttribute(DynamicMemberAccess memberAccessLevel)\r\n            {\r\n                this.MemberAccessLevel = memberAccessLevel;\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    [CreateAssetMenu(fileName = \"QueryProxy\", menuName = \"Spacepuppy/QueryProxy\")]\r\n    public class QueryProxyToken : ScriptableObject, IProxy\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private TriggerableTargetObject _target = new TriggerableTargetObject(TriggerableTargetObject.FindCommand.FindInScene, TriggerableTargetObject.ResolveByCommand.Nothing, string.Empty);\r\n        [SerializeField]\r\n        [TypeReference.Config(typeof(Component), allowAbstractClasses = true, allowInterfaces = true)]\r\n        private TypeReference _componentTypeOnTarget = new TypeReference();\r\n\r\n        [Space()]\r\n        [SerializeField]\r\n        [Tooltip(\"Cache the target when it's first retrieved. This is useful for speeding up any 'Find' commands if called repeatedly, but is hindered if the target is changing.\")]\r\n        private bool _cache;\r\n        [System.NonSerialized]\r\n        private UnityEngine.Object _object;\r\n\r\n        #endregion\r\n\r\n        #region IProxy Interface\r\n\r\n        bool IProxy.QueriesTarget\r\n        {\r\n            get { return _target.ImplicityReducesEntireEntity; }\r\n        }\r\n\r\n        public object GetTarget()\r\n        {\r\n            if (_cache)\r\n            {\r\n                if (_object != null) return _object;\r\n\r\n                _object = _target.GetTarget(_componentTypeOnTarget.Type ?? typeof(UnityEngine.Object), null) as UnityEngine.Object;\r\n                return _object;\r\n            }\r\n            else\r\n            {\r\n                return _target.GetTarget(_componentTypeOnTarget.Type ?? typeof(UnityEngine.Object), null) as UnityEngine.Object;\r\n            }\r\n        }\r\n\r\n        public object GetTarget(object arg)\r\n        {\r\n            if (_cache)\r\n            {\r\n                if (_object != null) return _object;\r\n\r\n                if (_componentTypeOnTarget == null) return null;\r\n                _object = _target.GetTarget(_componentTypeOnTarget.Type ?? typeof(UnityEngine.Object), arg) as UnityEngine.Object;\r\n                return _object;\r\n            }\r\n            else\r\n            {\r\n                if (_componentTypeOnTarget == null) return null;\r\n                return _target.GetTarget(_componentTypeOnTarget.Type ?? typeof(UnityEngine.Object), arg) as UnityEngine.Object;\r\n            }\r\n        }\r\n\r\n        public System.Type GetTargetType()\r\n        {\r\n            if (_componentTypeOnTarget.Type != null) return _componentTypeOnTarget.Type;\r\n            return (_cache && _object != null) ? _object.GetType() : typeof(UnityEngine.Object);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    [CreateAssetMenu(fileName = \"MemberProxy\", menuName = \"Spacepuppy/MemberProxy\")]\r\n    public class MemberProxyToken : ScriptableObject, IProxy\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private MemberProxy _target;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public UnityEngine.Object Target\r\n        {\r\n            get { return _target.Target; }\r\n            set { _target.Target = value; }\r\n        }\r\n\r\n        public string MemberName\r\n        {\r\n            get { return _target.MemberName; }\r\n            set { _target.MemberName = value; }\r\n        }\r\n\r\n        public object Value\r\n        {\r\n            get { return _target.GetValue(); }\r\n            set { _target.SetValue(value); }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public object GetValue()\r\n        {\r\n            return _target.GetValue();\r\n        }\r\n\r\n        public T GetValue<T>()\r\n        {\r\n            return _target.GetValue<T>();\r\n        }\r\n\r\n        public bool SetValue(object value)\r\n        {\r\n            return _target.SetValue(value);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IProxy Interface\r\n\r\n        bool IProxy.QueriesTarget\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        object IProxy.GetTarget()\r\n        {\r\n            return _target.GetValue();\r\n        }\r\n\r\n        object IProxy.GetTarget(object arg)\r\n        {\r\n            return _target.GetValue();\r\n        }\r\n\r\n        System.Type IProxy.GetTargetType()\r\n        {\r\n            return _target.GetTargetType();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n\r\n\r\n\r\n    [CreateAssetMenu(fileName = \"ProxyMediator\", menuName = \"Spacepuppy/ProxyMediator\")]\r\n    public class ProxyMediator : ScriptableObject, ITriggerableMechanism\r\n    {\r\n\r\n        public System.EventHandler OnTriggered;\r\n\r\n        public void Trigger()\r\n        {\r\n            if (this.OnTriggered != null) this.OnTriggered(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        #region ITriggerableMechanism Interface\r\n\r\n        bool ITriggerableMechanism.CanTrigger\r\n        {\r\n            get\r\n            {\r\n                return true;\r\n            }\r\n        }\r\n\r\n        int ITriggerableMechanism.Order\r\n        {\r\n            get\r\n            {\r\n                return 0;\r\n            }\r\n        }\r\n\r\n        bool ITriggerableMechanism.Trigger(object sender, object arg)\r\n        {\r\n            this.Trigger();\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    public class t_OnProxyMediatorTriggered : TriggerComponent\r\n    {\r\n\r\n        [SerializeField]\r\n        private ProxyMediator _mediator;\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            if(_mediator != null)\r\n            {\r\n                _mediator.OnTriggered += this.OnMediatorTriggered;\r\n            }\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            if(_mediator != null)\r\n            {\r\n                _mediator.OnTriggered -= this.OnMediatorTriggered;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ProxyMediator Mediator\r\n        {\r\n            get { return _mediator; }\r\n            set\r\n            {\r\n                if (_mediator == value) return;\r\n\r\n                if(Application.isPlaying && this.enabled)\r\n                {\r\n                    if(_mediator != null) _mediator.OnTriggered -= this.OnMediatorTriggered;\r\n                    _mediator = value;\r\n                    if (_mediator != null) _mediator.OnTriggered += this.OnMediatorTriggered;\r\n                }\r\n                else\r\n                {\r\n                    _mediator = value;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void OnMediatorTriggered(object sender, System.EventArgs e)\r\n        {\r\n            this.ActivateTrigger(null);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n\r\n\r\n\r\n\r\n\r\n    [System.Obsolete(\"Outdated - don't use. Use a proxy asset instead like 'TargetProxyToken'.\")]\r\n    public class TargetProxy : TriggerableMechanism, IDynamic, IProxy\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private TriggerableTargetObject _target;\r\n        [SerializeField]\r\n        [TypeReference.Config(typeof(Component), allowAbstractClasses = true, allowInterfaces = true)]\r\n        private TypeReference _componentTypeOnTarget = new TypeReference();\r\n\r\n        [Space()]\r\n        [SerializeField]\r\n        [Tooltip(\"Cache the target when it's first retrieved. This is useful for speeding up any 'Find' commands if called repeatedly, but is hindered if the target is changing.\")]\r\n        private bool _cache;\r\n        [System.NonSerialized]\r\n        private UnityEngine.Object _object;\r\n\r\n        [Space()]\r\n        [SerializeField]\r\n        private bool _treatAsTriggerable = true;\r\n        [SerializeField]\r\n        [EnumPopupExcluding((int)TriggerActivationType.SendMessage, (int)TriggerActivationType.CallMethodOnSelectedTarget, (int)TriggerActivationType.EnableTarget)]\r\n        private TriggerActivationType _triggerAction;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public TriggerActivationType TriggerAction\r\n        {\r\n            get { return _triggerAction; }\r\n            set\r\n            {\r\n                switch (value)\r\n                {\r\n                    case TriggerActivationType.SendMessage:\r\n                    case TriggerActivationType.CallMethodOnSelectedTarget:\r\n                    case TriggerActivationType.EnableTarget:\r\n                        throw new System.ArgumentOutOfRangeException(\"TriggerActivationType not supported.\");\r\n                    default:\r\n                        _triggerAction = value;\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IProxy Interface\r\n\r\n        bool IProxy.QueriesTarget\r\n        {\r\n            get { return _target.ImplicityReducesEntireEntity; }\r\n        }\r\n\r\n        public object GetTarget()\r\n        {\r\n            if (_cache)\r\n            {\r\n                if (_object != null) return _object;\r\n\r\n                _object = _target.GetTarget(_componentTypeOnTarget.Type ?? typeof(UnityEngine.Object), null) as UnityEngine.Object;\r\n                return _object;\r\n            }\r\n            else\r\n            {\r\n                return _target.GetTarget(_componentTypeOnTarget.Type ?? typeof(UnityEngine.Object), null) as UnityEngine.Object;\r\n            }\r\n        }\r\n\r\n        public object GetTarget(object arg)\r\n        {\r\n            if (_cache)\r\n            {\r\n                if (_object != null) return _object;\r\n\r\n                if (_componentTypeOnTarget == null) return null;\r\n                _object = _target.GetTarget(_componentTypeOnTarget.Type ?? typeof(UnityEngine.Object), arg) as UnityEngine.Object;\r\n                return _object;\r\n            }\r\n            else\r\n            {\r\n                if (_componentTypeOnTarget == null) return null;\r\n                return _target.GetTarget(_componentTypeOnTarget.Type ?? typeof(UnityEngine.Object), arg) as UnityEngine.Object;\r\n            }\r\n        }\r\n\r\n        public System.Type GetTargetType()\r\n        {\r\n            if (_componentTypeOnTarget.Type != null) return _componentTypeOnTarget.Type;\r\n            return (_cache && _object != null) ? _object.GetType() : typeof(UnityEngine.Object);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region TriggerableMechanism Interface\r\n\r\n        public override bool CanTrigger\r\n        {\r\n            get { return _treatAsTriggerable && base.CanTrigger; }\r\n        }\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var targ = this.GetTarget(arg);\r\n            if (targ == null) return false;\r\n\r\n            switch (_triggerAction)\r\n            {\r\n                case TriggerActivationType.TriggerAllOnTarget:\r\n                    EventTriggerEvaluator.Current.TriggerAllOnTarget(targ, sender, arg);\r\n                    return true;\r\n                case TriggerActivationType.TriggerSelectedTarget:\r\n                    EventTriggerEvaluator.Current.TriggerSelectedTarget(targ, sender, arg);\r\n                    return true;\r\n                case TriggerActivationType.DestroyTarget:\r\n                    EventTriggerEvaluator.Current.DestroyTarget(targ);\r\n                    return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDynamic Interface\r\n\r\n        object IDynamic.this[string sMemberName]\r\n        {\r\n            get\r\n            {\r\n                return (this as IDynamic).GetValue(sMemberName);\r\n            }\r\n            set\r\n            {\r\n                (this as IDynamic).SetValue(sMemberName, value);\r\n            }\r\n        }\r\n\r\n        bool IDynamic.SetValue(string sMemberName, object value, params object[] index)\r\n        {\r\n            var targ = this.GetTarget();\r\n            if (targ == null) return false;\r\n            return targ.SetValue(sMemberName, value, index);\r\n        }\r\n\r\n        object IDynamic.GetValue(string sMemberName, params object[] args)\r\n        {\r\n            var targ = this.GetTarget();\r\n            if (targ == null) return false;\r\n            return targ.GetValue(sMemberName, args);\r\n        }\r\n\r\n        bool IDynamic.TryGetValue(string sMemberName, out object result, params object[] args)\r\n        {\r\n            var targ = this.GetTarget();\r\n            if (targ == null)\r\n            {\r\n                result = null;\r\n                return false;\r\n            }\r\n            return targ.TryGetValue(sMemberName, out result, args);\r\n        }\r\n\r\n        object IDynamic.InvokeMethod(string sMemberName, params object[] args)\r\n        {\r\n            var targ = this.GetTarget();\r\n            if (targ == null) return false;\r\n            return targ.InvokeMethod(sMemberName, args);\r\n        }\r\n\r\n        bool IDynamic.HasMember(string sMemberName, bool includeNonPublic)\r\n        {\r\n            var targ = this.GetTarget();\r\n            if (targ == null) return false;\r\n            return DynamicUtil.HasMember(targ, sMemberName, includeNonPublic);\r\n        }\r\n\r\n        IEnumerable<System.Reflection.MemberInfo> IDynamic.GetMembers(bool includeNonPublic)\r\n        {\r\n            return DynamicUtil.GetMembers(this.GetTarget(), includeNonPublic);\r\n        }\r\n\r\n        IEnumerable<string> IDynamic.GetMemberNames(bool includeNonPublic)\r\n        {\r\n            return DynamicUtil.GetMemberNames(this.GetTarget(), includeNonPublic);\r\n        }\r\n\r\n        System.Reflection.MemberInfo IDynamic.GetMember(string sMemberName, bool includeNonPublic)\r\n        {\r\n            return DynamicUtil.GetMember(this.GetTarget(), sMemberName, includeNonPublic);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/PsuedoSingleton.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Reflection;\r\n\r\nusing com.spacepuppy.Dynamic;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Allows creating a singleton access point of any class that isn't inherently a Singleton\r\n    /// </summary>\r\n    /// <typeparam name=\"T\"></typeparam>\r\n    public abstract class PsuedoSingleton<T> : Singleton, IDynamic where T : Component\r\n    {\r\n\r\n        #region Static Interface\r\n\r\n        private static PsuedoSingleton<T> _instance;\r\n\r\n        public static T Instance\r\n        {\r\n            get\r\n            {\r\n                if (_instance == null) return null;\r\n                else return _instance.ConcreteInstance;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnValidAwake()\r\n        {\r\n            _instance = this;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public abstract T ConcreteInstance { get; }\r\n\r\n        #endregion\r\n\r\n\r\n        #region IDynamic Interface\r\n\r\n        public object this[string key]\r\n        {\r\n            get\r\n            {\r\n                return DynamicUtil.GetValue(PsuedoSingleton<T>.Instance, key);\r\n            }\r\n            set\r\n            {\r\n                DynamicUtil.SetValue(PsuedoSingleton<T>.Instance, key, value);\r\n            }\r\n        }\r\n\r\n        MemberInfo IDynamic.GetMember(string sMemberName, bool includeNonPublic)\r\n        {\r\n            return DynamicUtil.GetMember(PsuedoSingleton<T>.Instance, sMemberName, includeNonPublic);\r\n        }\r\n\r\n        IEnumerable<MemberInfo> IDynamic.GetMembers(bool includeNonPublic)\r\n        {\r\n            return DynamicUtil.GetMembers(PsuedoSingleton<T>.Instance, includeNonPublic);\r\n        }\r\n\r\n        IEnumerable<string> IDynamic.GetMemberNames(bool includeNonPublic)\r\n        {\r\n            return DynamicUtil.GetMemberNames(PsuedoSingleton<T>.Instance, includeNonPublic);\r\n        }\r\n\r\n        object IDynamic.GetValue(string sMemberName, params object[] args)\r\n        {\r\n            return DynamicUtil.GetValue(PsuedoSingleton<T>.Instance, sMemberName, args);\r\n        }\r\n\r\n        bool IDynamic.TryGetValue(string sMemberName, out object result, params object[] args)\r\n        {\r\n            return DynamicUtil.TryGetValue(PsuedoSingleton<T>.Instance, sMemberName, out result, args);\r\n        }\r\n\r\n        bool IDynamic.HasMember(string sMemberName, bool includeNonPublic)\r\n        {\r\n            return DynamicUtil.HasMember(PsuedoSingleton<T>.Instance, sMemberName, includeNonPublic);\r\n        }\r\n\r\n        object IDynamic.InvokeMethod(string sMemberName, params object[] args)\r\n        {\r\n            return DynamicUtil.InvokeMethod(PsuedoSingleton<T>.Instance, sMemberName, args);\r\n        }\r\n\r\n        bool IDynamic.SetValue(string sMemberName, object value, params object[] index)\r\n        {\r\n            return DynamicUtil.SetValue(PsuedoSingleton<T>.Instance, sMemberName, value, index);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/RNGAsset.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy\n{\n\n    [CreateAssetMenu(fileName = \"RNGAsset\", menuName = \"Spacepuppy/RNGAsset\")]\n    public class RNGAsset : ScriptableObject, IRandom\n    {\n\n        public enum RNGAlgorithms\n        {\n            Standard = 0,\n            Microsoft = 1,\n            LCG = 2,\n            PCG = 3\n        }\n\n        #region Fields\n\n        [SerializeField]\n        private RNGAlgorithms _algorithm;\n\n        [SerializeField]\n        [DisableIf(\"AlgorithmIsSeedable\", DisableIfNot = true)]\n        private int _seed = -1;\n\n        [System.NonSerialized]\n        private IRandom _rnd;\n        [System.NonSerialized]\n        private RNGAlgorithms _configuredAlgorithm;\n\n        #endregion\n\n        #region Properties\n\n        public RNGAlgorithms Algorithm\n        {\n            get { return _algorithm; }\n            set { _algorithm = value; }\n        }\n\n        public int Seed\n        {\n            get { return _seed; }\n            set { _seed = value; }\n        }\n\n        public bool AlgorithmIsSeedable\n        {\n            get { return _algorithm != RNGAlgorithms.Standard; }\n        }\n\n        public float Value\n        {\n            get\n            {\n                this.ValidateRNG();\n                return _rnd.Next();\n            }\n        }\n\n        #endregion\n\n        #region IRandom Interface\n\n        public float Next()\n        {\n            this.ValidateRNG();\n            return _rnd.Next();\n        }\n\n        public double NextDouble()\n        {\n            this.ValidateRNG();\n            return _rnd.NextDouble();\n        }\n\n        public int Next(int size)\n        {\n            this.ValidateRNG();\n            return _rnd.Next(size);\n        }\n\n        public int Next(int low, int high)\n        {\n            this.ValidateRNG();\n            return _rnd.Next(low, high);\n        }\n\n        #endregion\n\n        #region RNG Methods\n\n        public void Reset()\n        {\n            _rnd = null;\n            _configuredAlgorithm = RNGAlgorithms.Standard;\n        }\n\n        public void Reset(int seed)\n        {\n            _rnd = null;\n            _configuredAlgorithm = RNGAlgorithms.Standard;\n            _seed = seed;\n        }\n\n        public int RangeInt(int min, int max)\n        {\n            this.ValidateRNG();\n            return _rnd.Range(max, min);\n        }\n\n        public float Range(float min, float max)\n        {\n            this.ValidateRNG();\n            return _rnd.Range(max, min);\n        }\n\n        public float Angle()\n        {\n            this.ValidateRNG();\n            return _rnd.Angle();\n        }\n\n        public float Radian()\n        {\n            this.ValidateRNG();\n            return _rnd.Radian();\n        }\n\n        public int Pop()\n        {\n            this.ValidateRNG();\n            return _rnd.Pop();\n        }\n\n        public int Sign()\n        {\n            this.ValidateRNG();\n            return _rnd.Sign();\n        }\n\n        public bool Bool()\n        {\n            this.ValidateRNG();\n            return _rnd.Bool();\n        }\n\n        public int Shift()\n        {\n            this.ValidateRNG();\n            return _rnd.Shift();\n        }\n\n        public Vector3 OnUnitSphere()\n        {\n            this.ValidateRNG();\n            return _rnd.OnUnitSphere();\n        }\n\n        public Vector2 OnUnitCircle()\n        {\n            this.ValidateRNG();\n            return _rnd.OnUnitCircle();\n        }\n\n        public Vector3 InsideUnitSphere()\n        {\n            this.ValidateRNG();\n            return _rnd.InsideUnitSphere();\n        }\n\n        public Vector2 InsideUnitCircle()\n        {\n            this.ValidateRNG();\n            return _rnd.InsideUnitCircle();\n        }\n\n        public Vector3 AroundAxis(Vector3 axis)\n        {\n            this.ValidateRNG();\n            return _rnd.AroundAxis(axis);\n        }\n\n        public Quaternion Rotation()\n        {\n            this.ValidateRNG();\n            return _rnd.Rotation();\n        }\n\n        private void ValidateRNG()\n        {\n            if (_rnd == null || _configuredAlgorithm != _algorithm)\n            {\n                _configuredAlgorithm = _algorithm;\n                switch (_algorithm)\n                {\n                    case RNGAlgorithms.Standard:\n                        _rnd = RandomUtil.Standard;\n                        break;\n                    case RNGAlgorithms.Microsoft:\n                        _rnd = new RandomUtil.MicrosoftRNG(_seed);\n                        break;\n                    case RNGAlgorithms.LCG:\n                        _rnd = RandomUtil.LinearCongruentialRNG.CreateMMIXKnuth(_seed);\n                        break;\n                    case RNGAlgorithms.PCG:\n                        _rnd = new RandomUtil.SimplePCG(_seed);\n                        break;\n                    default:\n                        _rnd = RandomUtil.CreateDeterministicRNG(_seed);\n                        break;\n                }\n            }\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/RadicalCoroutine.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Acts just like Coroutine, but with an expanded feature set.\r\n    /// \r\n    /// *Custom Yield Instructions\r\n    /// IYieldInstruction - ability to define reusable yield instructions as objects.\r\n    /// IProgessingYieldInstruction - a customizable yield instruction that has a progress property\r\n    /// IImmediatelyResumingYieldInstruction - a customizable yield instruction that will return to operation of the coroutine \r\n    ///     immediately on complete (i.e. return during FixedUpdate)\r\n    /// IPausibleYieldInstruction - a yield instruction should implement this if it needs to deal with a coroutine pausing in \r\n    ///     any special way\r\n    /// IPooledYieldInstruction - a yield instruction should implement this if when complete it needs to be returned to a pool\r\n    /// IResettingYieldInstruction - a yield instruction should implement this if when complete it should be signaled so its \r\n    ///     state can be reset\r\n    /// \r\n    /// *Events\r\n    /// Register for events when the state of a coroutine changes.\r\n    /// OnComplete\r\n    /// OnCancelled\r\n    /// OnFinished\r\n    /// \r\n    /// *State\r\n    /// Poll the state of the coroutine, if it's finished/active/cancelled, what MonoBehaviour is operating the coroutine, etc.\r\n    /// \r\n    /// *Start/Pause/Cancel\r\n    /// RadicalCoroutines can be paused and restarted later (they can not be reset). When starting a RadicalCoroutine you can \r\n    /// include an enum value that determines what should be done with the coroutine when the operating MonoBehaviour is disabled, \r\n    /// automatically pausing or cancelling the coroutine as desired, and automatically resuming it when re-enabled.\r\n    /// \r\n    /// * Wait & Resume\r\n    /// RadicalCoroutines can return a special 'RadicalCoroutine.PauseSelfInstruction' yield instruction. With this the coroutine will block until 'Resume' \r\n    /// is called on the RadicalCoroutine.\r\n    /// \r\n    /// *Scheduling\r\n    /// Schedule a coroutine to run when a current coroutine is complete.\r\n    /// \r\n    /// *RadicalTask\r\n    /// You can quickly and easily jump from a pooled thread to a main unity thread with RadicalTask.\r\n    /// yield 'RadicalTask.JumpToAsync' to enter a pooled thread, and yield 'RadicalTask.JumpToUnityThread' to return.\r\n    /// \r\n    /// *Manual Override\r\n    /// Tick the operation of a coroutine manually. Won't be needed really ever, but that one time you want it, it's a life saver.\r\n    /// \r\n    /// *Coroutine Manager\r\n    /// A GameObject that is operating coroutines has a RadicalCoroutineManager attached. This is what tracks and maintains \r\n    /// automatic pausing/cancelling/resuming of coroutines. As well as gives an inspector view of what coroutines are operating \r\n    /// on what components and the name of the function being operated. Great for debugging.\r\n    /// \r\n    /// *WARNING\r\n    /// When using RadicalCoroutine, NEVER call StopCoroutine, and instead use the 'Cancel' method on the routine. \r\n    /// StopAllCoroutines works correctly on the SPComponent though, but not on MonoBehaviour.\r\n    /// </summary>\r\n    /// <notes>\r\n    /// \r\n    /// TODO - #100 - We should set up a RadicalCoroutine pool to reduce garbage collection\r\n    /// \r\n    /// </notes>\r\n    public sealed class RadicalCoroutine : IRadicalEnumerator, IImmediatelyResumingYieldInstruction, IRadicalWaitHandle, IEnumerator, System.IDisposable\r\n    {\r\n        \r\n        #region Events\r\n\r\n        /// <summary>\r\n        /// The coroutine completed successfully.\r\n        /// </summary>\r\n        public event System.EventHandler OnComplete;\r\n        /// <summary>\r\n        /// Called when the coroutine is flagged to be cancelled.\r\n        /// OnCancelled may take a frame or more to actually occur \r\n        /// depending the state of the coroutine, where as this is \r\n        /// immediate.\r\n        /// </summary>\r\n        public event System.EventHandler OnCancelling;\r\n        /// <summary>\r\n        /// The coroutine was cancelled.\r\n        /// </summary>\r\n        public event System.EventHandler OnCancelled;\r\n        /// <summary>\r\n        /// The coroutine completed or was cancelled.\r\n        /// </summary>\r\n        public event System.EventHandler OnFinished;\r\n        private System.EventHandler _immediatelyResumingSignal;\r\n\r\n        private void OnFinish(bool cancelled)\r\n        {\r\n            if (_manager != null)\r\n            {\r\n                _manager.UnregisterCoroutine(this);\r\n            }\r\n\r\n            _stack.Clear();\r\n            _currentIEnumeratorYieldValue = null;\r\n            _forcedTick = false;\r\n            try\r\n            {\r\n                if (this.Operator != null) this.Operator.StopCoroutine(this); //NOTE - due to a bug in unity, a runtime warning appears if you pass in the Coroutine token while this routine is 'WaitForSeconds'\r\n            }\r\n            catch (System.Exception ex) { Debug.LogException(ex); }\r\n\r\n            var ev = System.EventArgs.Empty;\r\n            try\r\n            {\r\n                if (cancelled)\r\n                {\r\n                    _state = RadicalCoroutineOperatingState.Cancelled;\r\n                    if (this.OnCancelled != null) this.OnCancelled(this, ev);\r\n                }\r\n                else\r\n                {\r\n                    _state = RadicalCoroutineOperatingState.Complete;\r\n                    if (this.OnComplete != null) this.OnComplete(this, ev);\r\n                }\r\n            }\r\n            catch (System.Exception ex) { Debug.LogException(ex); }\r\n\r\n            if (_immediatelyResumingSignal != null)\r\n            {\r\n                try { _immediatelyResumingSignal(this, ev); }\r\n                catch (System.Exception ex) { Debug.LogException(ex); }\r\n            }\r\n            if (this.OnFinished != null)\r\n            {\r\n                try { this.OnFinished(this, System.EventArgs.Empty); }\r\n                catch (System.Exception ex) { Debug.LogException(ex); }\r\n            }\r\n\r\n            _owner = null;\r\n            _token = null;\r\n            _manager = null;\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        private MonoBehaviour _owner;\r\n        private Coroutine _token;\r\n        private RadicalCoroutineManager _manager;\r\n        private RadicalCoroutineDisableMode _disableMode = RadicalCoroutineDisableMode.Default;\r\n\r\n        private RadicalOperationStack _stack;\r\n        private object _currentIEnumeratorYieldValue;\r\n\r\n        private RadicalCoroutineOperatingState _state;\r\n        private bool _forcedTick = false;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public RadicalCoroutine(System.Collections.IEnumerable routine)\r\n        {\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n            _stack = new RadicalOperationStack(this);\r\n\r\n            var e = routine.GetEnumerator();\r\n            if (e is IRadicalYieldInstruction)\r\n                _stack.Push(e as IRadicalYieldInstruction);\r\n            else\r\n                _stack.Push(EnumWrapper.Create(e));\r\n        }\r\n\r\n        public RadicalCoroutine(System.Collections.IEnumerator routine)\r\n        {\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n            _stack = new RadicalOperationStack(this);\r\n\r\n            if (routine is IRadicalYieldInstruction)\r\n                _stack.Push(routine as IRadicalYieldInstruction);\r\n            else\r\n                _stack.Push(EnumWrapper.Create(routine));\r\n        }\r\n\r\n        private RadicalCoroutine()\r\n        {\r\n            _stack = new RadicalOperationStack(this);\r\n            //was created for recycling\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public object AutoKillToken\r\n        {\r\n            get;\r\n            private set;\r\n        }\r\n        \r\n        public RadicalCoroutineDisableMode DisableMode { get { return _disableMode; } }\r\n\r\n        /// <summary>\r\n        /// Coroutine is currently active/running.\r\n        /// </summary>\r\n        public bool Active { get { return _state == RadicalCoroutineOperatingState.Active; } }\r\n\r\n        /// <summary>\r\n        /// Coroutine completed successfully.\r\n        /// </summary>\r\n        public bool CompletedSuccessfully { get { return _state >= RadicalCoroutineOperatingState.Completing; } }\r\n\r\n        /// <summary>\r\n        /// Coroutine was cancelled.\r\n        /// </summary>\r\n        public bool Cancelled { get { return _state <= RadicalCoroutineOperatingState.Cancelling; } }\r\n\r\n        /// <summary>\r\n        /// Coroutine is completed, but not necessarily successfully (Complete/Cancelled agnostic).\r\n        /// </summary>\r\n        public bool Finished { get { return _state <= RadicalCoroutineOperatingState.Cancelling || _state >= RadicalCoroutineOperatingState.Completing; } }\r\n\r\n        /// <summary>\r\n        /// The current operating state of the coroutine. A manually ticked coroutine will not return as active.\r\n        /// </summary>\r\n        public RadicalCoroutineOperatingState OperatingState { get { return _state; } }\r\n\r\n        /// <summary>\r\n        /// The MonoBehaviour that dictates the behaviour of this routine, this is usually the MonoBehaviour operating the routine. This may may be null if it hasn't been start, or it's manually ticked.\r\n        /// </summary>\r\n        public MonoBehaviour Owner { get { return _owner; } }\r\n\r\n        /// <summary>\r\n        /// The MonoBehaviour operating this routine, this is usually the owner, but may be the GameLoop if PlayUntilDestroy mode is used. This may be null if it hasn't been started, or it's being manually ticked.\r\n        /// </summary>\r\n        public MonoBehaviour Operator\r\n        {\r\n            get\r\n            {\r\n                //if ((_disableMode & RadicalCoroutineDisableMode.CancelOnDeactivate) == 0)\r\n                if (_disableMode == RadicalCoroutineDisableMode.PlayUntilDestroyed)\r\n                    return GameLoopEntry.Hook;\r\n                else\r\n                    return _owner;\r\n            }\r\n        }\r\n\r\n        internal RadicalOperationStack OperationStack\r\n        {\r\n            get { return _stack; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Starts the coroutine, one should always call this method or the StartRadicalCoroutine extension method. Never pass \r\n        /// the RadicalCoroutine into the 'StartCoroutine' method.\r\n        /// </summary>\r\n        /// <param name=\"behaviour\">A reference to the MonoBehaviour that should be handling the coroutine.</param>\r\n        /// <param name=\"disableMode\">A disableMode other than Default is only supported if the behaviour is an SPComponent.</param>\r\n        /// <remarks>\r\n        /// Disable modes allow you to decide how the coroutine is dealt with when the component/gameobject are disabled. Note that \r\n        /// 'CancelOnDeactivate' is a specical case flag, it only takes effect if NO OTHER flag is set (it's a 0 flag actually). \r\n        /// What this results in is that Deactivate and Disable are pausible... but a routine can only play through Disable, not \r\n        /// Deactivate. This is due to the default behaviour of coroutine in unity. In default mode, coroutines continue playing \r\n        /// when a component gets disabled, but when deactivated the coroutine gets cancelled. This means we can not play through \r\n        /// a deactivation.\r\n        /// </remarks>\r\n        public void Start(MonoBehaviour behaviour, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (_state != RadicalCoroutineOperatingState.Inactive) throw new System.InvalidOperationException(\"Failed to start RadicalCoroutine. The Coroutine is already being processed.\");\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n\r\n            _state = RadicalCoroutineOperatingState.Active;\r\n            _owner = behaviour;\r\n            _disableMode = disableMode;\r\n\r\n            if (_stack.CurrentOperation is IPausibleYieldInstruction) (_stack.CurrentOperation as IPausibleYieldInstruction).OnResume();\r\n\r\n#if SP_LIB\r\n            var manager = behaviour.AddOrGetComponent<RadicalCoroutineManager>();\r\n#else\r\n            var manager = behaviour.GetComponent<RadicalCoroutineManager>();\r\n            if (manager == null) manager = behaviour.gameObject.AddComponent<RadicalCoroutineManager>();\r\n#endif\r\n            _manager = manager;\r\n            _manager.RegisterCoroutine(this);\r\n\r\n            //if ((_disableMode & RadicalCoroutineDisableMode.CancelOnDeactivate) == 0)\r\n            if (_disableMode == RadicalCoroutineDisableMode.PlayUntilDestroyed)\r\n                _token = GameLoopEntry.Hook.StartCoroutine(PlayUntilDestroyedIterator(this));\r\n            else\r\n                _token = behaviour.StartCoroutine(this);\r\n        }\r\n\r\n        public void StartAsync(MonoBehaviour behaviour, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (_state != RadicalCoroutineOperatingState.Inactive) throw new System.InvalidOperationException(\"Failed to start RadicalCoroutine. The Coroutine is already being processed.\");\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n\r\n            _state = RadicalCoroutineOperatingState.Active;\r\n            _owner = behaviour;\r\n            _disableMode = disableMode;\r\n\r\n            if (_stack.CurrentOperation is IPausibleYieldInstruction) (_stack.CurrentOperation as IPausibleYieldInstruction).OnResume();\r\n            _stack.Push(com.spacepuppy.Async.RadicalTask.Create(this)); //we start the task as an async operation\r\n\r\n#if SP_LIB\r\n            var manager = behaviour.AddOrGetComponent<RadicalCoroutineManager>();\r\n#else\r\n            var manager = behaviour.GetComponent<RadicalCoroutineManager>();\r\n            if (manager == null) manager = behaviour.gameObject.AddComponent<RadicalCoroutineManager>();\r\n#endif\r\n            _manager = manager;\r\n            _manager.RegisterCoroutine(this);\r\n\r\n            //if ((_disableMode & RadicalCoroutineDisableMode.CancelOnDeactivate) == 0)\r\n            if (_disableMode == RadicalCoroutineDisableMode.PlayUntilDestroyed)\r\n                _token = GameLoopEntry.Hook.StartCoroutine(PlayUntilDestroyedIterator(this));\r\n            else\r\n                _token = behaviour.StartCoroutine(this);\r\n        }\r\n\r\n        public void StartAutoKill(MonoBehaviour behaviour, object autoKillToken, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (_state != RadicalCoroutineOperatingState.Inactive) throw new System.InvalidOperationException(\"Failed to start RadicalCoroutine. The Coroutine is already being processed.\");\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (autoKillToken == null) throw new System.ArgumentNullException(\"autoKillToken\");\r\n\r\n#if SP_LIB\r\n            var manager = behaviour.AddOrGetComponent<RadicalCoroutineManager>();\r\n#else\r\n            var manager = behaviour.GetComponent<RadicalCoroutineManager>();\r\n            if (manager == null) manager = behaviour.gameObject.AddComponent<RadicalCoroutineManager>();\r\n#endif\r\n            \r\n            _state = RadicalCoroutineOperatingState.Active;\r\n            _owner = behaviour;\r\n            _disableMode = disableMode;\r\n\r\n            if (_stack.CurrentOperation is IPausibleYieldInstruction) (_stack.CurrentOperation as IPausibleYieldInstruction).OnResume();\r\n\r\n            this.AutoKillToken = autoKillToken;\r\n            _manager = manager;\r\n            _manager.RegisterCoroutine(this, autoKillToken);\r\n\r\n            //if ((_disableMode & RadicalCoroutineDisableMode.CancelOnDeactivate) == 0)\r\n            if (_disableMode == RadicalCoroutineDisableMode.PlayUntilDestroyed)\r\n                _token = GameLoopEntry.Hook.StartCoroutine(PlayUntilDestroyedIterator(this));\r\n            else\r\n                _token = behaviour.StartCoroutine(this);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Stops the coroutine, but preserves the state of it, so that it could be resumed again later by calling Start.\r\n        /// \r\n        /// This differs from Pause in that it tosses out any information related to the MonoBehaviour that operates it. You must use 'Start' to resume it.\r\n        /// </summary>\r\n        public void Stop()\r\n        {\r\n            switch (_state)\r\n            {\r\n                case RadicalCoroutineOperatingState.Cancelling:\r\n                    this.OnFinish(true);\r\n                    return;\r\n                case RadicalCoroutineOperatingState.Active:\r\n                    {\r\n                        try\r\n                        {\r\n                            if (this.Operator != null) this.Operator.StopCoroutine(this);//NOTE - due to a bug in unity, a runtime warning appears if you pass in the Coroutine token while this routine is 'WaitForSeconds'\r\n                        }\r\n                        catch (System.Exception ex) { Debug.LogException(ex, _owner); }\r\n\r\n                        _state = RadicalCoroutineOperatingState.Inactive;\r\n                        _owner = null;\r\n                        _token = null;\r\n\r\n                        if (_stack.CurrentOperation is IPausibleYieldInstruction) (_stack.CurrentOperation as IPausibleYieldInstruction).OnPause();\r\n                    }\r\n                    return;\r\n                case RadicalCoroutineOperatingState.Completing:\r\n                    this.OnFinish(false);\r\n                    return;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Pause the operation of the coroutine. The state is preserved and it can be resumed again in the future by calling 'Resume'.\r\n        /// \r\n        /// This differs from Stop in that it preserves the information of the coroutine that processes it. You can use 'Resume' to resume operation.\r\n        /// </summary>\r\n        public void Pause()\r\n        {\r\n            switch (_state)\r\n            {\r\n                case RadicalCoroutineOperatingState.Cancelling:\r\n                    this.OnFinish(true);\r\n                    return;\r\n                case RadicalCoroutineOperatingState.Active:\r\n                    {\r\n                        try\r\n                        {\r\n                            if (this.Operator != null) this.Operator.StopCoroutine(this);//NOTE - due to a bug in unity, a runtime warning appears if you pass in the Coroutine token while this routine is 'WaitForSeconds'\r\n                        }\r\n                        catch (System.Exception ex) { Debug.LogException(ex, _owner); }\r\n\r\n                        _state = RadicalCoroutineOperatingState.Paused;\r\n                        _token = null;\r\n\r\n                        if (_stack.CurrentOperation is IPausibleYieldInstruction) (_stack.CurrentOperation as IPausibleYieldInstruction).OnPause();\r\n                    }\r\n                    return;\r\n                case RadicalCoroutineOperatingState.Completing:\r\n                    this.OnFinish(false);\r\n                    return;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Stops the coroutine flagging it as finished.\r\n        /// </summary>\r\n        public void Cancel()\r\n        {\r\n            switch (_state)\r\n            {\r\n                case RadicalCoroutineOperatingState.Cancelling:\r\n                    this.OnFinish(true);\r\n                    return;\r\n                case RadicalCoroutineOperatingState.Active:\r\n                    {\r\n                        _state = RadicalCoroutineOperatingState.Cancelling;\r\n                        if (this.OnCancelling != null) this.OnCancelling(this, System.EventArgs.Empty);\r\n                    }\r\n                    return;\r\n                case RadicalCoroutineOperatingState.Paused:\r\n                    {\r\n                        _state = RadicalCoroutineOperatingState.Cancelling;\r\n                        if (this.OnCancelling != null) this.OnCancelling(this, System.EventArgs.Empty);\r\n                        _state = RadicalCoroutineOperatingState.Cancelled;\r\n                        this.OnFinish(true);\r\n                    }\r\n                    return;\r\n                case RadicalCoroutineOperatingState.Completing:\r\n                    this.OnFinish(false);\r\n                    return;\r\n            }\r\n\r\n\r\n            _state = RadicalCoroutineOperatingState.Cancelling;\r\n            if (this.OnCancelling != null) this.OnCancelling(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Should only be ever called from RadicalCoroutineManager.\r\n        /// </summary>\r\n        internal void ManagerCancel()\r\n        {\r\n            _manager = null;\r\n            this.Cancel();\r\n        }\r\n        \r\n        public void Resume()\r\n        {\r\n            if (_state != RadicalCoroutineOperatingState.Paused) throw new System.InvalidOperationException(\"Failed to resume RadicalCoroutine. The Coroutine is not in a paused state.\");\r\n            if (_owner == null) throw new System.InvalidOperationException(\"The controlling MonoBehaviour has either been lost or destroyed since last Pausing the coroutine.\");\r\n\r\n            _state = RadicalCoroutineOperatingState.Active;\r\n\r\n            if (_stack.CurrentOperation is IPausibleYieldInstruction) (_stack.CurrentOperation as IPausibleYieldInstruction).OnResume();\r\n\r\n#if SP_LIB\r\n            var manager = _owner.AddOrGetComponent<RadicalCoroutineManager>();\r\n#else\r\n            var manager = _owner.GetComponent<RadicalCoroutineManager>();\r\n            if (manager == null) manager = _owner.gameObject.AddComponent<RadicalCoroutineManager>();\r\n#endif\r\n            _manager = manager;\r\n            _manager.RegisterCoroutine(this);\r\n\r\n            //if ((_disableMode & RadicalCoroutineDisableMode.CancelOnDeactivate) == 0)\r\n            if (_disableMode == RadicalCoroutineDisableMode.PlayUntilDestroyed)\r\n                _token = GameLoopEntry.Hook.StartCoroutine(PlayUntilDestroyedIterator(this));\r\n            else\r\n                _token = _owner.StartCoroutine(this);\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Scheduling\r\n\r\n        public RadicalCoroutine Schedule(MonoBehaviour behaviour, System.Collections.IEnumerator routine, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            var co = new RadicalCoroutine(routine);\r\n            this.OnComplete += (s, e) =>\r\n            {\r\n                if (co._state == RadicalCoroutineOperatingState.Inactive) co.Start(behaviour, disableMode);\r\n            };\r\n            return co;\r\n        }\r\n\r\n        public RadicalCoroutine Schedule(MonoBehaviour behaviour, System.Collections.IEnumerable routine, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            var co = new RadicalCoroutine(routine);\r\n            this.OnComplete += (s, e) =>\r\n            {\r\n                if (co._state == RadicalCoroutineOperatingState.Inactive) co.Start(behaviour, disableMode);\r\n            };\r\n            return co;\r\n        }\r\n\r\n        public RadicalCoroutine Schedule(MonoBehaviour behaviour, System.Func<IEnumerator> routine, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            var co = new RadicalCoroutine(routine());\r\n            this.OnComplete += (s, e) =>\r\n            {\r\n                if (co._state == RadicalCoroutineOperatingState.Inactive) co.Start(behaviour, disableMode);\r\n            };\r\n            return co;\r\n        }\r\n\r\n        public void Schedule(MonoBehaviour behaviour, RadicalCoroutine routine, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            this.OnComplete += (s, e) =>\r\n            {\r\n                if (routine._state == RadicalCoroutineOperatingState.Inactive) routine.Start(behaviour, disableMode);\r\n            };\r\n        }\r\n\r\n        public void Schedule(System.Action callback)\r\n        {\r\n            this.OnComplete += (s, e) =>\r\n            {\r\n                callback();\r\n            };\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Manual Coroutine Methods\r\n\r\n        /// <summary>\r\n        /// Manually step the coroutine. This is usually done from within a Update event.\r\n        /// </summary>\r\n        /// <param name=\"handle\">A MonoBehaviour to use as a handle if a YieldInstruction is to be operated on.</param>\r\n        /// <returns>Returns true if the coroutine is still active.</returns>\r\n        public bool ManualTick(MonoBehaviour handle)\r\n        {\r\n            if (_owner != null || _state != RadicalCoroutineOperatingState.Inactive) throw new System.InvalidOperationException(\"Can not manually operate a RadicalCoroutine that is already being operated.\");\r\n            if (handle == null) throw new System.ArgumentNullException(\"handle\");\r\n\r\n            _state = RadicalCoroutineOperatingState.Active;\r\n            bool result = false;\r\n            try\r\n            {\r\n                result = (this as IEnumerator).MoveNext();\r\n            }\r\n            catch(System.Exception ex)\r\n            {\r\n                Debug.LogException(ex, handle);\r\n            }\r\n            if (_state == RadicalCoroutineOperatingState.Active) _state = RadicalCoroutineOperatingState.Inactive;\r\n\r\n            if (result)\r\n            {\r\n                var current = _currentIEnumeratorYieldValue;\r\n                _currentIEnumeratorYieldValue = null;\r\n\r\n                if (current is YieldInstruction || current is WWW)\r\n                {\r\n                    var wait = ManualWaitForGeneric.Create(this, handle, current);\r\n                    _stack.Push(wait);\r\n                    wait.Start();\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Like ManualTick(MonoBehaviour), but instead the yield object is returned as an out parameter and the caller decides what to do with it.\r\n        /// </summary>\r\n        /// <param name=\"yieldObj\"></param>\r\n        /// <returns></returns>\r\n        public bool ManualTick(out object yieldObj)\r\n        {\r\n            if (_owner != null || _state != RadicalCoroutineOperatingState.Inactive) throw new System.InvalidOperationException(\"Can not manually operate a RadicalCoroutine that is already being operated.\");\r\n\r\n            _state = RadicalCoroutineOperatingState.Active;\r\n            bool result = false;\r\n            try\r\n            {\r\n                result = (this as IEnumerator).MoveNext();\r\n            }\r\n            catch (System.Exception ex)\r\n            {\r\n                Debug.LogException(ex);\r\n            }\r\n            if (_state == RadicalCoroutineOperatingState.Active) _state = RadicalCoroutineOperatingState.Inactive;\r\n\r\n            if (result)\r\n            {\r\n                yieldObj = _currentIEnumeratorYieldValue;\r\n                _currentIEnumeratorYieldValue = null;\r\n            }\r\n            else\r\n            {\r\n                yieldObj = null;\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        private void ForceTick()\r\n        {\r\n            _forcedTick = false;\r\n            if ((this as IEnumerator).MoveNext())\r\n            {\r\n                _forcedTick = true;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IYieldInstruction/IEnumerator Interface\r\n\r\n        bool IRadicalYieldInstruction.IsComplete { get { return this.Finished; } }\r\n\r\n        object IEnumerator.Current\r\n        {\r\n            get { return _currentIEnumeratorYieldValue; }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            if (this.Finished)\r\n            {\r\n                yieldObject = null;\r\n                return false;\r\n            }\r\n            else if ((this as IEnumerator).MoveNext())\r\n            {\r\n                yieldObject = _currentIEnumeratorYieldValue;\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                yieldObject = null;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        bool IEnumerator.MoveNext()\r\n        {\r\n            if (_state == RadicalCoroutineOperatingState.Inactive || _state == RadicalCoroutineOperatingState.Paused) return false;\r\n\r\n            if (this.Cancelled)\r\n            {\r\n                if (_state == RadicalCoroutineOperatingState.Cancelling)\r\n                {\r\n                    this.OnFinish(true);\r\n                }\r\n                return false;\r\n            }\r\n            else if (this.CompletedSuccessfully)\r\n            {\r\n                if (_state == RadicalCoroutineOperatingState.Completing)\r\n                {\r\n                    this.OnFinish(false);\r\n                }\r\n                return false;\r\n            }\r\n\r\n            if (_forcedTick)\r\n            {\r\n                _forcedTick = false;\r\n                return true;\r\n            }\r\n\r\n            _currentIEnumeratorYieldValue = null;\r\n\r\n            //clear completed entries\r\n            while (_stack.CurrentOperation != null)\r\n            {\r\n                try\r\n                {\r\n                    if (_stack.CurrentOperation.IsComplete)\r\n                    {\r\n                        _stack.Pop();\r\n                    }\r\n                    else\r\n                    {\r\n                        break;\r\n                    }\r\n                }\r\n                catch (System.Exception ex)\r\n                {\r\n                    Debug.LogException(ex);\r\n                    _stack.Pop();\r\n                }\r\n            }\r\n\r\n            if (_stack.CurrentOperation != null)\r\n            {\r\n                //operate\r\n                object current;\r\n                var r = _stack.CurrentOperation;\r\n                if (!r.Tick(out current))\r\n                {\r\n                    //the tick may have forced a tick, which could have popped this yieldinstruction already, this usually means it was an IImmediatelyResumingYieldInstruction\r\n                    //so only pop if that operation isn't 'r'\r\n                    if (_stack.CurrentOperation == r) _stack.Pop();\r\n\r\n                    if (this.Cancelled)\r\n                    {\r\n                        if (_state == RadicalCoroutineOperatingState.Cancelling)\r\n                            this.OnFinish(true);\r\n\r\n                        _forcedTick = false; //make sure this is reset\r\n                        return false;\r\n                    }\r\n                    else if (this.CompletedSuccessfully)\r\n                    {\r\n                        if (_state == RadicalCoroutineOperatingState.Completing)\r\n                            this.OnFinish(false);\r\n\r\n                        _forcedTick = false; //make sure this is reset\r\n                        return false;\r\n                    }\r\n                    else if (_stack.Count == 0)\r\n                    {\r\n                        this.OnFinish(false);\r\n                        return false;\r\n                    }\r\n                    else if (_forcedTick)\r\n                    {\r\n                        _forcedTick = false;\r\n                        return true;\r\n                    }\r\n                    else\r\n                    {\r\n                        current = null;\r\n                    }\r\n                }\r\n                else if (this.Cancelled)\r\n                {\r\n                    //routine cancelled itself\r\n                    if (_state == RadicalCoroutineOperatingState.Cancelling)\r\n                    {\r\n                        this.OnFinish(true);\r\n                    }\r\n                    return false;\r\n                }\r\n\r\n\r\n                ResolveCurrentInstruction:\r\n                //deal with the current yieldObject\r\n                if (current == null)\r\n                {\r\n                    //do nothing\r\n                }\r\n                else if (current is YieldInstruction)\r\n                {\r\n                    if (current is WaitForSeconds && (_disableMode & RadicalCoroutineDisableMode.Resumes) != 0)\r\n                    {\r\n                        _currentIEnumeratorYieldValue = null;\r\n                        _stack.Push(WaitForDuration.FromWaitForSeconds(current as WaitForSeconds));\r\n                    }\r\n                    else\r\n                    {\r\n                        _currentIEnumeratorYieldValue = current;\r\n                    }\r\n                }\r\n                else if (current is WWW)\r\n                {\r\n                    _currentIEnumeratorYieldValue = current;\r\n                }\r\n                else if (current is RadicalCoroutine)\r\n                {\r\n                    // //v3\r\n                    var rad = current as RadicalCoroutine;\r\n                    if (!rad.Finished)\r\n                    {\r\n                        if (rad._token != null)\r\n                        {\r\n                            _currentIEnumeratorYieldValue = rad._token;\r\n                        }\r\n                        else\r\n                        {\r\n                            _stack.Push(EnumWrapper.Create(WaitUntilDone_Routine(rad)));\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        _currentIEnumeratorYieldValue = null;\r\n                    }\r\n                }\r\n                else if (current is IRadicalYieldInstruction)\r\n                {\r\n                    var instruction = current as IRadicalYieldInstruction;\r\n                    if (instruction is IResettingYieldInstruction) (instruction as IResettingYieldInstruction).Reset();\r\n                    if (instruction is IImmediatelyResumingYieldInstruction) (instruction as IImmediatelyResumingYieldInstruction).Signal += this.OnImmediatelyResumingYieldInstructionSignaled;\r\n\r\n                    //we push first, incase the instruction checks if the 'currentoperation' is itself on first tick\r\n                    _stack.Push(instruction);\r\n                    object yieldObject;\r\n                    if (instruction.Tick(out yieldObject))\r\n                    {\r\n                        _currentIEnumeratorYieldValue = yieldObject;\r\n                    }\r\n                    else\r\n                    {\r\n                        if (_stack.CurrentOperation == instruction) _stack.Pop();\r\n                    }\r\n                }\r\n                else if (current is IEnumerable)\r\n                {\r\n                    //yes we have to test for IEnumerable before IEnumerator. When a yield method is returned as an IEnumerator, it still needs 'GetEnumerator' called on it.\r\n                    var e = (current as IEnumerable).GetEnumerator();\r\n                    if (e.MoveNext())\r\n                    {\r\n                        //_currentIEnumeratorYieldValue = e.Current;\r\n                        current = e.Current;\r\n                        _stack.Push(EnumWrapper.Create(e));\r\n                        goto ResolveCurrentInstruction;\r\n                    }\r\n                }\r\n                else if (current is IEnumerator)\r\n                {\r\n                    var e = current as IEnumerator;\r\n                    if (e.MoveNext())\r\n                    {\r\n                        //_currentIEnumeratorYieldValue = e.Current;\r\n                        current = e.Current;\r\n                        _stack.Push(EnumWrapper.Create(e));\r\n                        goto ResolveCurrentInstruction;\r\n                    }\r\n                }\r\n                else if (current == com.spacepuppy.Async.RadicalTask.JumpToAsync)\r\n                {\r\n                    //auto async flag\r\n                    var instruction = com.spacepuppy.Async.RadicalTask.Create(this) as IRadicalYieldInstruction;\r\n\r\n                    //we push first, incase the instruction checks if the 'currentoperation' is itself on first tick\r\n                    _stack.Push(instruction);\r\n                    object yieldObject;\r\n                    if (instruction.Tick(out yieldObject))\r\n                    {\r\n                        _currentIEnumeratorYieldValue = yieldObject;\r\n                    }\r\n                    else\r\n                    {\r\n                        if (_stack.CurrentOperation == instruction) _stack.Pop();\r\n                    }\r\n                }\r\n                else if(current == RadicalCoroutine.PauseSelfInstruction)\r\n                {\r\n                    this.Pause();\r\n                    _currentIEnumeratorYieldValue = null;\r\n                }\r\n                else\r\n                {\r\n                    _currentIEnumeratorYieldValue = current;\r\n                }\r\n\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                this.OnFinish(false);\r\n                return false;\r\n            }\r\n        }\r\n\r\n        void IEnumerator.Reset()\r\n        {\r\n            throw new System.NotSupportedException();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IImmediatelyResumingYieldInstruction Interface\r\n\r\n        event System.EventHandler IImmediatelyResumingYieldInstruction.Signal\r\n        {\r\n            add\r\n            {\r\n                if (_immediatelyResumingSignal == null)\r\n                    _immediatelyResumingSignal = value;\r\n                else if (_immediatelyResumingSignal == value)\r\n                    return;\r\n                else\r\n                    _immediatelyResumingSignal += value;\r\n            }\r\n            remove\r\n            {\r\n                if (_immediatelyResumingSignal == null)\r\n                    return;\r\n                else if (_immediatelyResumingSignal == value)\r\n                    _immediatelyResumingSignal = null;\r\n                else\r\n                    _immediatelyResumingSignal -= value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IImmediatelyResumingYieldInstruction Handler\r\n        \r\n        private System.EventHandler _onImmediatelyResumingYieldInstructionSignaled;\r\n        private System.EventHandler OnImmediatelyResumingYieldInstructionSignaled\r\n        {\r\n            get\r\n            {\r\n                if (_onImmediatelyResumingYieldInstructionSignaled == null)\r\n                    _onImmediatelyResumingYieldInstructionSignaled = (sender, e) =>\r\n                    {\r\n                        var instruction = sender as IImmediatelyResumingYieldInstruction;\r\n                        if (instruction == null) return;\r\n                        if (_stack.CurrentOperation == instruction)\r\n                        {\r\n                            _stack.Pop();\r\n                            this.ForceTick();\r\n                        }\r\n                        else\r\n                        {\r\n                            instruction.Signal -= this.OnImmediatelyResumingYieldInstructionSignaled;\r\n                        }\r\n                    };\r\n                return _onImmediatelyResumingYieldInstructionSignaled;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalWaitHandle Interface\r\n\r\n        void IRadicalWaitHandle.OnComplete(System.Action<IRadicalWaitHandle> callback)\r\n        {\r\n            this.OnFinished += (s, e) => { callback(this); };\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public void Dispose()\r\n        {\r\n            if (this.Active) this.Cancel();\r\n\r\n            switch(_state)\r\n            {\r\n                case RadicalCoroutineOperatingState.Cancelling:\r\n                case RadicalCoroutineOperatingState.Paused:\r\n                case RadicalCoroutineOperatingState.Active:\r\n                case RadicalCoroutineOperatingState.Completing:\r\n                    try\r\n                    {\r\n                        if (_owner != null) _owner.StopCoroutine(this); //NOTE - due to a bug in unity, a runtime warning appears if you pass in the Coroutine token while this routine is 'WaitForSeconds'\r\n                    }\r\n                    catch (System.Exception ex) { Debug.LogException(ex); }\r\n\r\n                    if (_manager != null)\r\n                    {\r\n                        _manager.UnregisterCoroutine(this);\r\n                    }\r\n                    break;\r\n            }\r\n            \r\n            _owner = null;\r\n            _token = null;\r\n            _manager = null;\r\n            _disableMode = RadicalCoroutineDisableMode.Default;\r\n            _stack.Clear();\r\n            _currentIEnumeratorYieldValue = null;\r\n            _state = RadicalCoroutineOperatingState.Inactive;\r\n            _forcedTick = false;\r\n            this.OnComplete = null;\r\n            this.OnCancelling = null;\r\n            this.OnCancelled = null;\r\n            this.OnFinished = null;\r\n            _immediatelyResumingSignal = null;\r\n\r\n            //TODO - #100 - allow releasing when we've fully implemented coroutine object caching \r\n            //_pool.Release(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Static Utils\r\n\r\n        private static System.Collections.IEnumerator PlayUntilDestroyedIterator(RadicalCoroutine routine)\r\n        {\r\n            if (routine == null) yield break;\r\n\r\n            var e = routine as System.Collections.IEnumerator;\r\n            while(!object.ReferenceEquals(routine.Owner, null) && ObjUtil.IsObjectAlive(routine.Owner) \r\n                  && e.MoveNext())\r\n            {\r\n                yield return e.Current;\r\n            }\r\n        }\r\n\r\n        public static void AutoKill(GameObject go, object autoKillToken)\r\n        {\r\n            if (go == null || autoKillToken == null) return;\r\n\r\n            var manager = go.GetComponent<RadicalCoroutineManager>();\r\n            if (manager == null) return;\r\n\r\n            manager.AutoKill(autoKillToken);\r\n        }\r\n\r\n        /// <summary>\r\n        /// A radical coroutine that when running will repeadtly call an action and yield null. Simulating the Update function.\r\n        /// </summary>\r\n        /// <param name=\"a\"></param>\r\n        /// <returns></returns>\r\n        public static RadicalCoroutine UpdateTicker(System.Action a)\r\n        {\r\n            var e = UpdateTickerIterator(a);\r\n            e.MoveNext(); //we want to get the ticker up to the first yield statement, this way the action doesn't get called until RadicalCoroutine.Start is called.\r\n            return new RadicalCoroutine(e);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Calls the action and yields null over and over. Simulates an 'Update'.\r\n        /// </summary>\r\n        /// <param name=\"a\"></param>\r\n        /// <returns></returns>\r\n        public static System.Collections.IEnumerator UpdateTickerIterator(System.Action a)\r\n        {\r\n            if (a == null) throw new System.ArgumentNullException(\"a\");\r\n\r\n            yield return null;\r\n            while (true)\r\n            {\r\n                a();\r\n                yield return null;\r\n            }\r\n        }\r\n\r\n        public static RadicalCoroutine FixedUpdateTicker(System.Action a)\r\n        {\r\n            return new RadicalCoroutine(FixedUpdateTickerIterator(a));\r\n        }\r\n\r\n        public static System.Collections.IEnumerator FixedUpdateTickerIterator(System.Action a)\r\n        {\r\n            if (a == null) throw new System.ArgumentNullException(\"a\");\r\n\r\n            var wait = new WaitForFixedUpdate();\r\n            yield return wait;\r\n            while (true)\r\n            {\r\n                a();\r\n                yield return wait;\r\n            }\r\n        }\r\n\r\n        public static RadicalCoroutine LateUpdateTicker(System.Action a)\r\n        {\r\n            return new RadicalCoroutine(LateUpdateTickerIterator(a));\r\n        }\r\n\r\n        public static System.Collections.IEnumerator LateUpdateTickerIterator(System.Action a)\r\n        {\r\n            if (a == null) throw new System.ArgumentNullException(\"a\");\r\n\r\n            var wait = new WaitForEndOfFrame();\r\n            yield return wait;\r\n            while (true)\r\n            {\r\n                a();\r\n                yield return wait;\r\n            }\r\n        }\r\n\r\n\r\n        /// <summary>\r\n        /// A radical coroutine that when running will repeatedly call a function and yield the object returned by it. \r\n        /// Return a RadicalCoroutineEndCommand to stop the RadicalCoroutine from within the function.\r\n        /// </summary>\r\n        /// <param name=\"f\"></param>\r\n        /// <returns></returns>\r\n        public static RadicalCoroutine Ticker(System.Func<object> f)\r\n        {\r\n            return new RadicalCoroutine(TickerIterator(f));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Calls the function, and yields the object returned. Return a RadicalCoroutineEndCommand to have \r\n        /// the running RadicalCoroutine cancel the action.\r\n        /// </summary>\r\n        /// <param name=\"f\"></param>\r\n        /// <returns></returns>\r\n        public static System.Collections.IEnumerator TickerIterator(System.Func<object> f)\r\n        {\r\n            if (f == null) throw new System.ArgumentNullException(\"f\");\r\n\r\n            while (true)\r\n            {\r\n                yield return f();\r\n            }\r\n        }\r\n\r\n\r\n        /// <summary>\r\n        /// Returns a YieldInstruction that can be used to have a standard Unity Coroutine wait for a RadicalCoroutine to complete.\r\n        /// </summary>\r\n        /// <param name=\"behaviour\"></param>\r\n        /// <param name=\"routine\"></param>\r\n        /// <returns></returns>\r\n        public static YieldInstruction WaitUntilDone(MonoBehaviour behaviour, RadicalCoroutine routine)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            if (routine._token != null) return routine._token;\r\n\r\n            if (routine.Finished) return null;\r\n            return behaviour.StartCoroutine(WaitUntilDone_Routine(routine));\r\n        }\r\n\r\n        private static IEnumerator WaitUntilDone_Routine(RadicalCoroutine routine)\r\n        {\r\n            //if (routine._owner != null && routine._owner is SPComponent)\r\n            //{\r\n            //    routine._owner.AddOrGetComponent<RadicalCoroutineManager>().RegisterCoroutine(routine._owner as SPComponent, routine);\r\n            //}\r\n\r\n            while (!routine.Finished)\r\n            {\r\n                yield return null;\r\n            }\r\n        }\r\n\r\n        public static readonly object PauseSelfInstruction = new object();\r\n\r\n        #endregion\r\n\r\n        #region Static Operators/Conversion\r\n\r\n        public static implicit operator bool(RadicalCoroutine routine)\r\n        {\r\n            if (routine == null) return false;\r\n\r\n            return routine._state == RadicalCoroutineOperatingState.Active || routine._state == RadicalCoroutineOperatingState.Paused;\r\n        }\r\n\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region Static Pool\r\n\r\n        private static UnityEngine.WaitForFixedUpdate _waitForFixedUpdate;\r\n        private static UnityEngine.WaitForEndOfFrame _waitForEndOfFrame;\r\n        public static UnityEngine.WaitForFixedUpdate WaitForFixedUpdate\r\n        {\r\n            get\r\n            {\r\n                if (_waitForFixedUpdate == null) _waitForFixedUpdate = new WaitForFixedUpdate();\r\n                return _waitForFixedUpdate;\r\n            }\r\n        }\r\n        public static UnityEngine.WaitForEndOfFrame WaitForEndOfFrame\r\n        {\r\n            get\r\n            {\r\n                if (_waitForEndOfFrame == null) _waitForEndOfFrame = new WaitForEndOfFrame();\r\n                return _waitForEndOfFrame;\r\n            }\r\n        }\r\n\r\n        /*\r\n        private static com.spacepuppy.Collections.ObjectCachePool<RadicalCoroutine> _pool = new com.spacepuppy.Collections.ObjectCachePool<RadicalCoroutine>(1000,\r\n                                                                                                                                                            () =>\r\n                                                                                                                                                            {\r\n                                                                                                                                                                return new RadicalCoroutine();\r\n                                                                                                                                                            },\r\n                                                                                                                                                            (r) =>\r\n                                                                                                                                                            {\r\n                                                                                                                                                                r._owner = null;\r\n                                                                                                                                                                r._token = null;\r\n                                                                                                                                                                r._manager = null;\r\n                                                                                                                                                                r._disableMode = RadicalCoroutineDisableMode.Default;\r\n                                                                                                                                                                r._stack.Clear();\r\n                                                                                                                                                                r._currentIEnumeratorYieldValue = null;\r\n                                                                                                                                                                r._state = RadicalCoroutineOperatingState.Inactive;\r\n                                                                                                                                                                r._forcedTick = false;\r\n                                                                                                                                                                r.OnComplete = null;\r\n                                                                                                                                                                r.OnCancelling = null;\r\n                                                                                                                                                                r.OnCancelled = null;\r\n                                                                                                                                                                r.OnFinished = null;\r\n                                                                                                                                                                r._immediatelyResumingSignal = null;\r\n                                                                                                                                                            },\r\n                                                                                                                                                            true);\r\n\r\n        internal RadicalCoroutine CreatePooledRoutine(IEnumerator e)\r\n        {\r\n            if (e == null) throw new System.ArgumentNullException(\"routine\");\r\n            var routine = _pool.GetInstance();\r\n            if (e is IRadicalYieldInstruction)\r\n                routine._stack.Push(e as IRadicalYieldInstruction);\r\n            else\r\n                routine._stack.Push(EnumWrapper.Create(e));\r\n            return routine;\r\n        }\r\n        */\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private class ManualWaitForGeneric : IPooledYieldInstruction, System.Collections.IEnumerator\r\n        {\r\n\r\n#region Fields\r\n\r\n            private RadicalCoroutine _owner;\r\n            private MonoBehaviour _handle;\r\n            private object _yieldObject;\r\n            private object _enumCurrentValue;\r\n\r\n#endregion\r\n\r\n#region CONSTRUCTOR\r\n\r\n            public ManualWaitForGeneric()\r\n            {\r\n\r\n            }\r\n\r\n#endregion\r\n\r\n#region Methods\r\n\r\n            public void Start()\r\n            {\r\n                _handle.StartCoroutine(this);\r\n            }\r\n\r\n#endregion\r\n\r\n#region IResettingYieldInstruction Interface\r\n\r\n            public bool IsComplete\r\n            {\r\n                get { return _yieldObject != null; }\r\n            }\r\n\r\n            public bool Tick(out object yieldObject)\r\n            {\r\n                if (_enumCurrentValue == null)\r\n                {\r\n                    yieldObject = _yieldObject;\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    yieldObject = null;\r\n                    if (_owner.OperationStack.CurrentOperation == this)\r\n                    {\r\n                        if (_yieldObject is WaitForEndOfFrame || _yieldObject is WaitForFixedUpdate)\r\n                        {\r\n                            _owner.ManualTick(_handle);\r\n                        }\r\n                    }\r\n                    return false;\r\n                }\r\n            }\r\n\r\n#endregion\r\n\r\n#region IEnumerator Interface\r\n\r\n            public object Current\r\n            {\r\n                get { return _enumCurrentValue; }\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                return this.Tick(out _enumCurrentValue);\r\n            }\r\n\r\n            void System.Collections.IEnumerator.Reset()\r\n            {\r\n                _enumCurrentValue = null;\r\n            }\r\n\r\n#endregion\r\n\r\n#region IDisposable Interface\r\n\r\n            private static com.spacepuppy.Collections.ObjectCachePool<ManualWaitForGeneric> _pool = new com.spacepuppy.Collections.ObjectCachePool<ManualWaitForGeneric>(-1, () => new ManualWaitForGeneric());\r\n            public static ManualWaitForGeneric Create(RadicalCoroutine owner, MonoBehaviour handle, object yieldObj)\r\n            {\r\n                var w = _pool.GetInstance();\r\n                w._owner = owner;\r\n                w._handle = handle;\r\n                w._yieldObject = yieldObj;\r\n                return w;\r\n            }\r\n\r\n            void System.IDisposable.Dispose()\r\n            {\r\n                _owner = null;\r\n                _handle = null;\r\n                _yieldObject = null;\r\n                _enumCurrentValue = null;\r\n            }\r\n\r\n#endregion\r\n\r\n        }\r\n\r\n        private class EnumWrapper : IRadicalYieldInstruction, IRadicalEnumerator, IPooledYieldInstruction\r\n        {\r\n\r\n            private static com.spacepuppy.Collections.ObjectCachePool<EnumWrapper> _pool = new com.spacepuppy.Collections.ObjectCachePool<EnumWrapper>(-1, () => new EnumWrapper());\r\n            public static EnumWrapper Create(IEnumerator e)\r\n            {\r\n                var w = _pool.GetInstance();\r\n                w._e = e;\r\n                return w;\r\n            }\r\n\r\n\r\n            internal IEnumerator _e;\r\n\r\n            private EnumWrapper()\r\n            {\r\n\r\n            }\r\n\r\n            public bool Tick(out object yieldObject)\r\n            {\r\n                if (_e == null)\r\n                {\r\n                    yieldObject = null;\r\n                    return false;\r\n                }\r\n\r\n                if (_e.MoveNext())\r\n                {\r\n                    if(_e == null)\r\n                    {\r\n                        yieldObject = null;\r\n                        return false;\r\n                    }\r\n                    else\r\n                    {\r\n                        yieldObject = _e.Current;\r\n                        return true;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    yieldObject = null;\r\n                    if (_e is System.IDisposable) (_e as System.IDisposable).Dispose();\r\n                    _e = null;\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            public bool IsComplete\r\n            {\r\n                get\r\n                {\r\n                    return _e == null;\r\n                }\r\n            }\r\n\r\n            public object Current\r\n            {\r\n                get\r\n                {\r\n                    return _e != null ? _e.Current : null;\r\n                }\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                return _e != null ? _e.MoveNext() : false;\r\n            }\r\n\r\n            public void Reset()\r\n            {\r\n                if (_e != null) _e.Reset();\r\n            }\r\n\r\n            void System.IDisposable.Dispose()\r\n            {\r\n                if (_e is System.IDisposable) (_e as System.IDisposable).Dispose();\r\n                _e = null;\r\n                _pool.Release(this);\r\n            }\r\n\r\n        }\r\n\r\n\r\n        internal class RadicalOperationStack\r\n        {\r\n\r\n#region Fields\r\n\r\n            private RadicalCoroutine _owner;\r\n            private IRadicalYieldInstruction _currentOperation;\r\n            private System.Collections.Generic.Stack<IRadicalYieldInstruction> _stack;\r\n\r\n#endregion\r\n\r\n#region CONSTRUCTOR\r\n\r\n            internal RadicalOperationStack(RadicalCoroutine owner)\r\n            {\r\n                _owner = owner;\r\n            }\r\n\r\n#endregion\r\n\r\n#region Properties\r\n\r\n            public IRadicalYieldInstruction CurrentOperation\r\n            {\r\n                get { return _currentOperation; }\r\n            }\r\n\r\n            public int Count\r\n            {\r\n                get\r\n                {\r\n                    if (_currentOperation == null) return 0;\r\n                    return (_stack != null) ? _stack.Count + 1 : 1;\r\n                }\r\n            }\r\n\r\n#endregion\r\n\r\n#region Methods\r\n\r\n            public void Push(IRadicalYieldInstruction op)\r\n            {\r\n                if (_currentOperation != null)\r\n                {\r\n                    if (_stack == null) _stack = new System.Collections.Generic.Stack<IRadicalYieldInstruction>();\r\n                    _stack.Push(_currentOperation);\r\n                }\r\n\r\n                _currentOperation = op;\r\n            }\r\n\r\n            public IRadicalYieldInstruction Pop()\r\n            {\r\n                var old = _currentOperation;\r\n                if (_stack != null && _stack.Count > 0)\r\n                {\r\n                    _currentOperation = _stack.Pop();\r\n                }\r\n                else\r\n                {\r\n                    _currentOperation = null;\r\n                }\r\n\r\n                if (old != null)\r\n                {\r\n                    if (old is IImmediatelyResumingYieldInstruction) (old as IImmediatelyResumingYieldInstruction).Signal -= _owner.OnImmediatelyResumingYieldInstructionSignaled;\r\n                    if (old is IPooledYieldInstruction) (old as IPooledYieldInstruction).Dispose();\r\n                }\r\n\r\n                return _currentOperation;\r\n            }\r\n\r\n            public void Clear()\r\n            {\r\n                if (_currentOperation != null)\r\n                {\r\n                    if (_currentOperation is IImmediatelyResumingYieldInstruction) (_currentOperation as IImmediatelyResumingYieldInstruction).Signal -= _owner.OnImmediatelyResumingYieldInstructionSignaled;\r\n                    if (_currentOperation is IPooledYieldInstruction) (_currentOperation as IPooledYieldInstruction).Dispose();\r\n                }\r\n\r\n                if(_stack != null && _stack.Count > 0)\r\n                {\r\n                    var e = _stack.GetEnumerator();\r\n                    while(e.MoveNext())\r\n                    {\r\n                        if (e.Current is IImmediatelyResumingYieldInstruction) (e.Current as IImmediatelyResumingYieldInstruction).Signal -= _owner.OnImmediatelyResumingYieldInstructionSignaled;\r\n                        if (e.Current is IPooledYieldInstruction) (e.Current as IPooledYieldInstruction).Dispose();\r\n                    }\r\n                    _stack.Clear();\r\n                }\r\n                _currentOperation = null;\r\n            }\r\n\r\n\r\n            public IRadicalYieldInstruction PeekSubOperation()\r\n            {\r\n                if (_stack != null && _stack.Count > 0)\r\n                    return _stack.Peek();\r\n                else\r\n                    return null;\r\n            }\r\n\r\n            public void PushSubOperation(IRadicalYieldInstruction op)\r\n            {\r\n                if (op == null) throw new System.ArgumentNullException(\"op\");\r\n\r\n                if (_stack == null) _stack = new System.Collections.Generic.Stack<IRadicalYieldInstruction>();\r\n                _stack.Push(op);\r\n            }\r\n\r\n            public IRadicalYieldInstruction PopSubOperation()\r\n            {\r\n                if (_stack == null || _stack.Count == 0) return null;\r\n\r\n                var old = _stack.Pop();\r\n                if (old != null)\r\n                {\r\n                    if (old is IImmediatelyResumingYieldInstruction) (old as IImmediatelyResumingYieldInstruction).Signal -= _owner.OnImmediatelyResumingYieldInstructionSignaled;\r\n                    if (old is IPooledYieldInstruction) (old as IPooledYieldInstruction).Dispose();\r\n                }\r\n                return old;\r\n            }\r\n\r\n            public void ClearSubOperations()\r\n            {\r\n                if (_stack != null && _stack.Count > 0)\r\n                {\r\n                    var e = _stack.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (e.Current is IImmediatelyResumingYieldInstruction) (e.Current as IImmediatelyResumingYieldInstruction).Signal -= _owner.OnImmediatelyResumingYieldInstructionSignaled;\r\n                        if (e.Current is IPooledYieldInstruction) (e.Current as IPooledYieldInstruction).Dispose();\r\n                    }\r\n                    _stack.Clear();\r\n                }\r\n            }\r\n\r\n            public IRadicalYieldInstruction Last()\r\n            {\r\n                if (_stack == null || _stack.Count == 0)\r\n                    return _currentOperation;\r\n                else\r\n                    return _stack.Last();\r\n            }\r\n\r\n            public IRadicalYieldInstruction First()\r\n            {\r\n                if (_stack == null || _stack.Count == 0)\r\n                    return _currentOperation;\r\n                else\r\n                    return _stack.First();\r\n            }\r\n\r\n#endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n#region Editor Special Types\r\n\r\n        public static class EditorHelper\r\n        {\r\n\r\n            public static string GetInternalRoutineID(RadicalCoroutine routine)\r\n            {\r\n                if (routine.OperationStack.Count == 0) return \"\";\r\n                var r = routine.OperationStack.Last(); //the bottom of the stack is the actual routine\r\n                if (r is IRadicalYieldInstruction)\r\n                {\r\n                    return GetIterableID(r as IRadicalYieldInstruction);\r\n                }\r\n                else\r\n                {\r\n                    return r.GetType().FullName.Split('.').Last();\r\n                }\r\n            }\r\n\r\n            public static string GetYieldID(RadicalCoroutine routine)\r\n            {\r\n                if (routine._currentIEnumeratorYieldValue is WaitForSeconds)\r\n                {\r\n                    //float dur = ConvertUtil.ToSingle(DynamicUtil.GetValue(routine._currentIEnumeratorYieldValue, \"m_Seconds\"));\r\n                    var field = typeof(WaitForSeconds).GetField(\"m_Seconds\", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);\r\n                    float dur = (float)field.GetValue(routine._currentIEnumeratorYieldValue);\r\n                    return string.Format(\"WaitForSeconds[{0:0.00}]\", dur);\r\n                }\r\n                else if (routine._currentIEnumeratorYieldValue is YieldInstruction)\r\n                {\r\n                    return routine._currentIEnumeratorYieldValue.GetType().Name;\r\n                }\r\n                else if (routine._currentIEnumeratorYieldValue is WWW)\r\n                {\r\n                    return string.Format(\"WWW[{0}%]\", (routine._currentIEnumeratorYieldValue as WWW).progress * 100);\r\n                }\r\n                else\r\n                {\r\n                    return \"WaitOneFrame\";\r\n                }\r\n            }\r\n\r\n            public static string GetDerivativeID(RadicalCoroutine routine)\r\n            {\r\n                if (routine.OperationStack.Count <= 1) return \"\";\r\n\r\n                return GetIterableID(routine.OperationStack.CurrentOperation);\r\n            }\r\n\r\n\r\n            private static string GetIterableID(IRadicalYieldInstruction e)\r\n            {\r\n                if (e == null) return string.Empty;\r\n\r\n                if (e is WaitForDuration)\r\n                {\r\n                    var wait = e as WaitForDuration;\r\n                    return string.Format(\"WaitForDuration[{0:0.00}, {1:0.00}]\", wait.CurrentTime, wait.Duration);\r\n                }\r\n                else if (e is EnumWrapper)\r\n                {\r\n                    var w = e as EnumWrapper;\r\n                    if (w._e == null) return string.Empty;\r\n\r\n                    return w._e.GetType().FullName.Split('.').Last();\r\n                }\r\n                else\r\n                {\r\n                    return e.GetType().Name;\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n#endregion\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/RadicalCoroutineManager.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    [DisallowMultipleComponent()]\r\n    public sealed class RadicalCoroutineManager : MonoBehaviour\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private HashSet<RadicalCoroutine> _routines = new HashSet<RadicalCoroutine>();\r\n        private Dictionary<MonoBehaviour, bool> _naiveTrackerTable;\r\n        private Dictionary<object, RadicalCoroutine> _autoKillTable;\r\n\r\n        private System.EventHandler _onDisableHandler;\r\n        private System.EventHandler _onEnabledHandler;\r\n        private System.EventHandler _onDestroyHandler;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n        \r\n        private void Awake()\r\n        {\r\n            _onDisableHandler = this.OnComponentDisabled;\r\n            _onEnabledHandler = this.OnComponentEnabled;\r\n            _onDestroyHandler = this.OnComponentDestroyed;\r\n\r\n            this.enabled = false;\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Update Messages\r\n\r\n        private void OnDisable()\r\n        {\r\n            if (_naiveTrackerTable == null || _naiveTrackerTable.Count == 0) return;\r\n\r\n            this.TestNaive();\r\n        }\r\n\r\n        private void Update()\r\n        {\r\n            if(_naiveTrackerTable == null || _naiveTrackerTable.Count == 0)\r\n            {\r\n                this.enabled = false;\r\n                return;\r\n            }\r\n\r\n            this.TestNaive();\r\n        }\r\n\r\n        private void TestNaive()\r\n        {\r\n            //yes, this method of tracking may seem convoluted with the weird temp lists\r\n            //this is to keep GC to a minimum, if not zero\r\n            TempList<MonoBehaviour> stateChanged = null;\r\n            var e = _naiveTrackerTable.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                if (e.Current.Key == null)\r\n                {\r\n                    if (stateChanged == null) stateChanged = TempCollection.GetList<MonoBehaviour>();\r\n                    stateChanged.Add(e.Current.Key);\r\n                }\r\n                else if (e.Current.Value != e.Current.Key.isActiveAndEnabled)\r\n                {\r\n                    if (stateChanged == null) stateChanged = TempCollection.GetList<MonoBehaviour>();\r\n                    stateChanged.Add(e.Current.Key);\r\n                }\r\n            }\r\n\r\n            if (stateChanged != null)\r\n            {\r\n                for (int i = 0; i < stateChanged.Count; i++)\r\n                {\r\n                    var c = stateChanged[i];\r\n                    if (c == null)\r\n                    {\r\n                        this.PurgeCoroutines(c);\r\n                    }\r\n                    else if (c.isActiveAndEnabled)\r\n                    {\r\n                        _naiveTrackerTable[c] = true;\r\n                        this.DealWithEnable(c);\r\n                    }\r\n                    else\r\n                    {\r\n                        _naiveTrackerTable[c] = false;\r\n                        this.DealWithDisable(c);\r\n                    }\r\n                }\r\n                stateChanged.Dispose();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public IEnumerable<RadicalCoroutine> GetAllCoroutines()\r\n        {\r\n            var e = _routines.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                yield return e.Current;\r\n            }\r\n        }\r\n\r\n        public IEnumerable<RadicalCoroutine> GetCoroutines(MonoBehaviour behaviour)\r\n        {\r\n            if (behaviour == null) yield break;\r\n\r\n            var e = _routines.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                if(e.Current.Owner == behaviour) yield return e.Current;\r\n            }\r\n        }\r\n\r\n        internal void PurgeCoroutines(MonoBehaviour component)\r\n        {\r\n            using (var lst = TempCollection.GetList<RadicalCoroutine>())\r\n            {\r\n                var e = _routines.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (e.Current.Owner == component) lst.Add(e.Current);\r\n                }\r\n\r\n                if(lst.Count > 0)\r\n                {\r\n                    for(int i = 0; i < lst.Count; i++)\r\n                    {\r\n                        lst[i].ManagerCancel();\r\n                        _routines.Remove(lst[i]);\r\n                    }\r\n                }\r\n                if(component is SPComponent)\r\n                {\r\n                    var spc = component as SPComponent;\r\n                    spc.OnDisabled -= _onDisableHandler;\r\n                    spc.OnEnabled -= _onEnabledHandler;\r\n                    spc.ComponentDestroyed -= _onDestroyHandler;\r\n                }\r\n                else if(_naiveTrackerTable != null)\r\n                {\r\n                    _naiveTrackerTable.Remove(component);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Must be only called by RadicalCoroutine itself.\r\n        /// </summary>\r\n        /// <param name=\"component\"></param>\r\n        /// <param name=\"routine\"></param>\r\n        internal void RegisterCoroutine(RadicalCoroutine routine)\r\n        {\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            //if (_routines.Contains(routine)) throw new System.InvalidOperationException(\"Attempted to register a routine that is already operating.\");\r\n            if (_routines.Contains(routine)) return;\r\n\r\n            var component = routine.Owner;\r\n            if (component == null) throw new System.InvalidOperationException(\"Attempted to register a routine with a null component.\");\r\n\r\n            if (component is SPComponent)\r\n            {\r\n                var spc = component as SPComponent;\r\n                spc.OnDisabled -= _onDisableHandler;\r\n                spc.OnEnabled -= _onEnabledHandler;\r\n                spc.ComponentDestroyed -= _onDestroyHandler;\r\n                spc.OnDisabled += _onDisableHandler;\r\n                spc.OnEnabled += _onEnabledHandler;\r\n                spc.ComponentDestroyed += _onDestroyHandler;\r\n\r\n                _routines.Add(routine);\r\n            }\r\n            else\r\n            {\r\n                if (_naiveTrackerTable == null) _naiveTrackerTable = new Dictionary<MonoBehaviour, bool>();\r\n                _naiveTrackerTable[component] = component.isActiveAndEnabled;\r\n                _routines.Add(routine);\r\n                if (!this.enabled) this.enabled = true;\r\n            }\r\n\r\n        }\r\n\r\n        internal void RegisterCoroutine(RadicalCoroutine routine, object autoKillToken)\r\n        {\r\n            if (autoKillToken == null) throw new System.ArgumentNullException(\"autoKillToken\");\r\n\r\n            if (_autoKillTable == null)\r\n            {\r\n                _autoKillTable = new Dictionary<object, RadicalCoroutine>();\r\n            }\r\n            else\r\n            {\r\n                RadicalCoroutine old;\r\n                if (_autoKillTable.TryGetValue(autoKillToken, out old))\r\n                {\r\n                    old.ManagerCancel();\r\n                }\r\n            }\r\n            _autoKillTable[autoKillToken] = routine;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Must be only called by RadicalCoroutine itself.\r\n        /// </summary>\r\n        /// <param name=\"routine\"></param>\r\n        internal void UnregisterCoroutine(RadicalCoroutine routine)\r\n        {\r\n            try\r\n            {\r\n                _routines.Remove(routine);\r\n\r\n                if (_naiveTrackerTable != null)\r\n                {\r\n                    var comp = routine.Owner;\r\n                    if (_naiveTrackerTable.ContainsKey(comp) && !this.GetComponentIsCurrentlyManaged(comp))\r\n                    {\r\n                        _naiveTrackerTable.Remove(comp);\r\n                    }\r\n                }\r\n\r\n                if (_autoKillTable != null && routine.AutoKillToken != null)\r\n                {\r\n                    RadicalCoroutine other;\r\n                    if (_autoKillTable.TryGetValue(routine.AutoKillToken, out other))\r\n                    {\r\n                        if (object.ReferenceEquals(other, routine)) _autoKillTable.Remove(routine.AutoKillToken);\r\n                    }\r\n                }\r\n            }\r\n            catch(System.Exception ex)\r\n            {\r\n                Debug.LogException(ex);\r\n            }\r\n        }\r\n        \r\n        private void OnComponentEnabled(object sender, System.EventArgs e)\r\n        {\r\n            var component = sender as MonoBehaviour;\r\n            if (object.ReferenceEquals(component, null)) return;\r\n            this.DealWithEnable(component);\r\n        }\r\n\r\n        private void OnComponentDisabled(object sender, System.EventArgs e)\r\n        {\r\n            var component = sender as MonoBehaviour;\r\n            if (object.ReferenceEquals(component, null)) return;\r\n            this.DealWithDisable(component);\r\n        }\r\n\r\n        private void OnComponentDestroyed(object sender, System.EventArgs e)\r\n        {\r\n            var component = sender as MonoBehaviour;\r\n            if (object.ReferenceEquals(component, null)) return;\r\n            this.PurgeCoroutines(component);\r\n        }\r\n\r\n\r\n        private void DealWithEnable(MonoBehaviour component)\r\n        {\r\n            using (var todestroy = TempCollection.GetList<RadicalCoroutine>())\r\n            using(var toresume = TempCollection.GetList<RadicalCoroutine>())\r\n            {\r\n                var e = _routines.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (e.Current.Owner == component)\r\n                    {\r\n                        switch (e.Current.OperatingState)\r\n                        {\r\n                            case RadicalCoroutineOperatingState.Active:\r\n                                //if the routine is currently active, that means the routine was already running. This could be because it \r\n                                //was started in Awake, in an override of OnEnable, or the routine is in a mode that does not pause it OnDisable.\r\n                                continue;\r\n                            case RadicalCoroutineOperatingState.Inactive:\r\n                            case RadicalCoroutineOperatingState.Paused:\r\n                                if ((e.Current.DisableMode & RadicalCoroutineDisableMode.Resumes) != 0)\r\n                                {\r\n                                    toresume.Add(e.Current);\r\n                                }\r\n                                else\r\n                                {\r\n                                    todestroy.Add(e.Current);\r\n                                    Debug.LogWarning(\"A leaked RadicalCoroutine was found and cleaned up.\", component);\r\n                                }\r\n                                break;\r\n                            default:\r\n                                //somehow a finished routine made its way into the collection... remove it\r\n                                todestroy.Add(e.Current);\r\n                                Debug.LogWarning(\"A leaked RadicalCoroutine was found and cleaned up.\", component);\r\n                                break;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (todestroy.Count > 0)\r\n                {\r\n                    for (int i = 0; i < todestroy.Count; i++)\r\n                    {\r\n                        _routines.Remove(todestroy[i]);\r\n                    }\r\n                }\r\n\r\n                if (toresume.Count > 0)\r\n                {\r\n                    for(int i = 0; i < toresume.Count; i++)\r\n                    {\r\n                        toresume[i].Resume();\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        private void DealWithDisable(MonoBehaviour component)\r\n        {\r\n            using (var lst = TempCollection.GetList<RadicalCoroutine>())\r\n            {\r\n                var e = _routines.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (e.Current.Owner == component) lst.Add(e.Current);\r\n                }\r\n\r\n                if (lst.Count > 0)\r\n                {\r\n                    RadicalCoroutine routine;\r\n                    if (ObjUtil.IsObjectAlive(this) && this.gameObject.activeInHierarchy)\r\n                    {\r\n                        for (int i = 0; i < lst.Count; i++)\r\n                        {\r\n                            routine = lst[i];\r\n                            if ((routine.DisableMode & RadicalCoroutineDisableMode.CancelOnDisable) != 0)\r\n                            {\r\n                                routine.ManagerCancel();\r\n                                _routines.Remove(routine);\r\n                            }\r\n                            else if ((routine.DisableMode & RadicalCoroutineDisableMode.StopOnDisable) != 0)\r\n                            {\r\n                                if (!routine.Finished && (routine.DisableMode & RadicalCoroutineDisableMode.Resumes) != 0)\r\n                                {\r\n                                    routine.Pause();\r\n                                }\r\n                                else\r\n                                {\r\n                                    routine.Stop();\r\n                                    _routines.Remove(routine);\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        for (int i = 0; i < lst.Count; i++)\r\n                        {\r\n                            routine = lst[i];\r\n                            if ((routine.DisableMode & RadicalCoroutineDisableMode.StopOnDeactivate) != 0)\r\n                            {\r\n                                if (!routine.Finished && (routine.DisableMode & RadicalCoroutineDisableMode.Resumes) != 0)\r\n                                {\r\n                                    routine.Pause();\r\n                                }\r\n                                else\r\n                                {\r\n                                    routine.Stop();\r\n                                    _routines.Remove(routine);\r\n                                }\r\n                            }\r\n                            else\r\n                            {\r\n                                routine.ManagerCancel();\r\n                                _routines.Remove(routine);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        \r\n        private bool GetComponentIsCurrentlyManaged(MonoBehaviour component)\r\n        {\r\n            var e = _routines.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if (e.Current.Owner == component) return true;\r\n            }\r\n            return false;\r\n        }\r\n\r\n\r\n\r\n        public void AutoKill(object autoKillToken)\r\n        {\r\n            if (autoKillToken == null) throw new System.ArgumentNullException(\"autoKillToken\");\r\n\r\n            if(_autoKillTable != null)\r\n            {\r\n                RadicalCoroutine old;\r\n                if (_autoKillTable.TryGetValue(autoKillToken, out old))\r\n                {\r\n                    old.ManagerCancel();\r\n                    _autoKillTable.Remove(autoKillToken);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        //private class NaiveComponentTracker\r\n        //{\r\n\r\n        //    public MonoBehaviour Component;\r\n        //    public bool Active;\r\n\r\n        //}\r\n\r\n        #endregion\r\n\r\n    }\r\n    \r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/RadicalEnums.cs",
    "content": "﻿using System;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Flagging enum to define how a Coroutine should deal with its operating MonoBehaviour is disabled or deactivated.\r\n    /// </summary>\r\n    [System.Flags()]\r\n    public enum RadicalCoroutineDisableMode\r\n    {\r\n        PlayUntilDestroyed = 0,\r\n        /// <summary>\r\n        /// The default action from Unity. The routine cancels on deactivate, and plays through disable.\r\n        /// </summary>\r\n        Default = 1,\r\n        /// <summary>\r\n        /// The default action from Unity. The routine cancels on deactivate, and plays through disable.\r\n        /// </summary>\r\n        CancelOnDeactivate = 1,\r\n        /// <summary>\r\n        /// Cancels on disable, still cancels on Deactivate as well.\r\n        /// </summary>\r\n        CancelOnDisable = 2,\r\n        StopOnDeactivate = 4,\r\n        StopOnDisable = 8,\r\n        Stops = 12,\r\n        Resumes = 16,\r\n\r\n        PausesOnDeactivate = 20,\r\n        PausesOnDisable = 24,\r\n        Pauses = 28\r\n    }\r\n    \r\n    /// <summary>\r\n    /// Represents the operating state of a RadicalCoroutine.\r\n    /// </summary>\r\n    public enum RadicalCoroutineOperatingState\r\n    {\r\n        Cancelled = -2,\r\n        Cancelling = -1,\r\n        Inactive = 0,\r\n        Paused = 1,\r\n        Active = 2,\r\n        Completing = 3,\r\n        Complete = 4\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/RadicalState.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections;\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n    public class RadicalState : System.IDisposable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private MonoBehaviour _handle;\r\n        private RadicalCoroutineDisableMode _disableMode;\r\n\r\n        private RadicalCoroutine _routine;\r\n        private System.Action _onCancel;\r\n        private System.Action _onComplete;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public RadicalState(MonoBehaviour handle, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (object.ReferenceEquals(handle, null)) throw new System.ArgumentNullException(\"handle\");\r\n            _handle = handle;\r\n            _disableMode = disableMode;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public RadicalCoroutine CurrentState\r\n        {\r\n            get { return _routine; }\r\n        }\r\n\r\n        public RadicalCoroutineDisableMode DisableMode\r\n        {\r\n            get { return _disableMode; }\r\n            set { _disableMode = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Change to a new state, cancelling any existing running state, cancel callback for previous state will be called.\r\n        /// </summary>\r\n        /// <param name=\"routine\">Routine to run.</param>\r\n        /// <param name=\"onCancel\">Cancel callback when state changes.</param>\r\n        /// <param name=\"onComplete\">Complete callback when state completes.</param>\r\n        /// <returns></returns>\r\n        public RadicalCoroutine ChangeState(IEnumerator routine, System.Action onCancel = null, System.Action onComplete = null)\r\n        {\r\n            if (_disposed) throw new System.InvalidOperationException(\"Object is disposed.\");\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            if (_routine != null && _routine.Active) _routine.Cancel();\r\n\r\n            _onCancel = onCancel;\r\n            _onComplete = onComplete;\r\n            _routine = _handle.StartRadicalCoroutine(routine, _disableMode);\r\n            _routine.OnCancelling += this.OnCancelling;\r\n            _routine.OnFinished += this.OnFinished;\r\n            return _routine;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Exit the current state, cancelling it, and firing the cancel callback.\r\n        /// </summary>\r\n        public void ExitState()\r\n        {\r\n            if (_disposed) throw new System.InvalidOperationException(\"Object is disposed.\");\r\n            if (_routine != null && _routine.Active)\r\n            {\r\n                _routine.Cancel();\r\n                _routine = null;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Removes event listeners before cancelling the current state so that no callback signals occur.\r\n        /// </summary>\r\n        public void SilentlyExitState()\r\n        {\r\n            if (_disposed) throw new System.InvalidOperationException(\"Object is disposed.\");\r\n            if (_routine != null && _routine.Active)\r\n            {\r\n                var rot = _routine;\r\n                _routine = null;\r\n                rot.OnCancelling -= this.OnCancelling;\r\n                rot.OnFinished -= this.OnFinished;\r\n                rot.Cancel();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Removes event listeners before cancelling the routine so that no callback signals occur.\r\n        /// </summary>\r\n        /// <param name=\"routine\">Supposed state to cancel, this may be a routine that was previously started on this but exited.</param>\r\n        /// <returns>Returns true if was the running routine.</returns>\r\n        public bool SilentlyExitState(RadicalCoroutine routine)\r\n        {\r\n            if (_disposed) throw new System.InvalidOperationException(\"Object is disposed.\");\r\n            if (routine == null) return false;\r\n            \r\n            if (_routine == routine)\r\n            {\r\n                _routine = null;\r\n                routine.OnCancelling -= this.OnCancelling;\r\n                routine.OnFinished -= this.OnFinished;\r\n                routine.Cancel();\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                routine.Cancel();\r\n                return false;\r\n            }\r\n        }\r\n\r\n        private void OnCancelling(object sender, System.EventArgs e)\r\n        {\r\n            if (_disposed || _routine == null) return;\r\n            if (sender != _routine) return;\r\n            if (_onCancel != null && GameLoopEntry.QuitState != QuitState.Quit && _routine.Cancelled) _onCancel();\r\n            _routine = null;\r\n        }\r\n\r\n        private void OnFinished(object sender, System.EventArgs e)\r\n        {\r\n            if (_disposed || _routine == null) return;\r\n            if (sender != _routine) return;\r\n            if (_onComplete != null && _routine.CompletedSuccessfully) _onComplete();\r\n            _routine = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        private bool _disposed;\r\n        public void Dispose()\r\n        {\r\n            if (_disposed) return;\r\n\r\n            _disposed = true;\r\n            if(_routine != null)\r\n            {\r\n                _routine.Cancel();\r\n                _routine = null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/RateOfChange.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Represents a rate of change in units per period with some timesupplier.\r\n    /// </summary>\r\n    [System.Serializable()]\r\n    public struct RateOfChange\r\n    {\r\n\r\n        public float Units;\r\n        public SPTimePeriod TimePeriod;\r\n\r\n\r\n        public RateOfChange(float units, SPTimePeriod period)\r\n        {\r\n            this.Units = units;\r\n            this.TimePeriod = period;\r\n        }\r\n        \r\n\r\n        public double GetDelta()\r\n        {\r\n            var dt = this.TimePeriod.TimeSupplier.Delta / this.TimePeriod.Seconds;\r\n            return (dt * this.Units);\r\n        }\r\n\r\n        public double GetDelta(float deltaSeconds)\r\n        {\r\n            var dt = deltaSeconds / this.TimePeriod.Seconds;\r\n            return (dt * this.Units);\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Render/MaterialPropertyReference.cs",
    "content": "﻿using UnityEngine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Render\r\n{\r\n\r\n    [System.Serializable()]\r\n    public class MaterialPropertyReference\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [DisableOnPlay()]\r\n        private UnityEngine.Object _material;\r\n        [SerializeField()]\r\n        private MaterialPropertyValueType _valueType;\r\n        [SerializeField()]\r\n        private string _propertyName;\r\n        [SerializeField]\r\n        private MaterialPropertyValueTypeMember _member;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public MaterialPropertyReference()\r\n        {\r\n\r\n        }\r\n\r\n        public MaterialPropertyReference(Material mat, string propName, MaterialPropertyValueType valueType, MaterialPropertyValueTypeMember member = MaterialPropertyValueTypeMember.None)\r\n        {\r\n            _material = mat;\r\n            _propertyName = propName;\r\n            _valueType = valueType;\r\n            _member = member;\r\n        }\r\n\r\n        public MaterialPropertyReference(Renderer renderer, string propName, MaterialPropertyValueType valueType, MaterialPropertyValueTypeMember member = MaterialPropertyValueTypeMember.None)\r\n        {\r\n            _material = renderer;\r\n            _propertyName = propName;\r\n            _valueType = valueType;\r\n            _member = member;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Material Material\r\n        {\r\n            get { return MaterialUtil.GetMaterialFromSource(_material); }\r\n            set { _material = value; }\r\n        }\r\n        \r\n        public MaterialPropertyValueType PropertyValueType\r\n        {\r\n            get { return _valueType; }\r\n            set { _valueType = value; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// If the PropertyValueType is Color/Vector, this allows referencing one of the specific members of the Color/Vector.\r\n        /// </summary>\r\n        public MaterialPropertyValueTypeMember PropertyValueTypeMember\r\n        {\r\n            get { return _member; }\r\n            set { _member = value; }\r\n        }\r\n\r\n        public string PropertyName\r\n        {\r\n            get { return _propertyName; }\r\n            set { _propertyName = value; }\r\n        }\r\n\r\n        public object Value\r\n        {\r\n            get\r\n            {\r\n                return this.GetValue();\r\n            }\r\n            set\r\n            {\r\n                this.SetValue(value);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void SetValue(object value)\r\n        {\r\n            var mat = this.Material;\r\n\r\n            if (mat == null) return;\r\n\r\n            switch (_valueType)\r\n            {\r\n                case MaterialPropertyValueType.Float:\r\n                    mat.SetFloat(_propertyName, ConvertUtil.ToSingle(value));\r\n                    break;\r\n                case MaterialPropertyValueType.Color:\r\n                    {\r\n                        switch(_member)\r\n                        {\r\n                            case MaterialPropertyValueTypeMember.None:\r\n                                mat.SetColor(_propertyName, ConvertUtil.ToColor(value));\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.X:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.r = ConvertUtil.ToSingle(value);\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Y:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.g = ConvertUtil.ToSingle(value);\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Z:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.b = ConvertUtil.ToSingle(value);\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.W:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.a = ConvertUtil.ToSingle(value);\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n                case MaterialPropertyValueType.Vector:\r\n                    {\r\n                        switch(_member)\r\n                        {\r\n                            case MaterialPropertyValueTypeMember.None:\r\n                                mat.SetVector(_propertyName, ConvertUtil.ToVector4(value));\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.X:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.x = ConvertUtil.ToSingle(value);\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Y:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.y = ConvertUtil.ToSingle(value);\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Z:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.z = ConvertUtil.ToSingle(value);\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.W:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.w = ConvertUtil.ToSingle(value);\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n                case MaterialPropertyValueType.Texture:\r\n                    mat.SetTexture(_propertyName, value as Texture);\r\n                    break;\r\n            }\r\n        }\r\n\r\n        public void SetValue(float value)\r\n        {\r\n            if (_valueType != MaterialPropertyValueType.Float) return;\r\n\r\n            var mat = this.Material;\r\n            if (mat == null) return;\r\n\r\n            switch (_valueType)\r\n            {\r\n                case MaterialPropertyValueType.Float:\r\n                    mat.SetFloat(_propertyName, value);\r\n                    break;\r\n                case MaterialPropertyValueType.Color:\r\n                    {\r\n                        switch (_member)\r\n                        {\r\n                            case MaterialPropertyValueTypeMember.None:\r\n                                //do nothing\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.X:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.r = value;\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Y:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.g = value;\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Z:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.b = value;\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.W:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.a = value;\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n                case MaterialPropertyValueType.Vector:\r\n                    {\r\n                        switch (_member)\r\n                        {\r\n                            case MaterialPropertyValueTypeMember.None:\r\n                                mat.SetVector(_propertyName, ConvertUtil.ToVector4(value));\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.X:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.x = value;\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Y:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.y = value;\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Z:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.z = value;\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.W:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.w = value;\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n                case MaterialPropertyValueType.Texture:\r\n                    //do nothing\r\n                    break;\r\n            }\r\n        }\r\n\r\n        public void SetValue(Color value)\r\n        {\r\n            if (_valueType != MaterialPropertyValueType.Color) return;\r\n\r\n            var mat = this.Material;\r\n\r\n            if (mat == null) return;\r\n\r\n            switch (_valueType)\r\n            {\r\n                case MaterialPropertyValueType.Float:\r\n                    //do nothing\r\n                    break;\r\n                case MaterialPropertyValueType.Color:\r\n                    {\r\n                        switch (_member)\r\n                        {\r\n                            case MaterialPropertyValueTypeMember.None:\r\n                                mat.SetColor(_propertyName, value);\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.X:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.r = value.r;\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Y:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.g = value.g;\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Z:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.b = value.b;\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.W:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.a = value.a;\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n                case MaterialPropertyValueType.Vector:\r\n                    {\r\n                        switch (_member)\r\n                        {\r\n                            case MaterialPropertyValueTypeMember.None:\r\n                                mat.SetVector(_propertyName, ConvertUtil.ToVector4(value));\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.X:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.x = value.r;\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Y:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.y = value.g;\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Z:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.z = value.b;\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.W:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.w = value.a;\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n                case MaterialPropertyValueType.Texture:\r\n                    //do nothing\r\n                    break;\r\n            }\r\n        }\r\n\r\n        public void SetValue(Vector4 value)\r\n        {\r\n            if (_valueType != MaterialPropertyValueType.Vector) return;\r\n\r\n            var mat = this.Material;\r\n\r\n            if (mat == null) return;\r\n\r\n            switch (_valueType)\r\n            {\r\n                case MaterialPropertyValueType.Float:\r\n                    //do nothing\r\n                    break;\r\n                case MaterialPropertyValueType.Color:\r\n                    {\r\n                        switch (_member)\r\n                        {\r\n                            case MaterialPropertyValueTypeMember.None:\r\n                                mat.SetColor(_propertyName, ConvertUtil.ToColor(value));\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.X:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.r = value.x;\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Y:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.g = value.y;\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Z:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.b = value.z;\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.W:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.a = value.w;\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n                case MaterialPropertyValueType.Vector:\r\n                    {\r\n                        switch (_member)\r\n                        {\r\n                            case MaterialPropertyValueTypeMember.None:\r\n                                mat.SetVector(_propertyName, value);\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.X:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.x = value.x;\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Y:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.y = value.y;\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Z:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.z = value.z;\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.W:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.w = value.w;\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n                case MaterialPropertyValueType.Texture:\r\n                    //do nothing\r\n                    break;\r\n            }\r\n        }\r\n\r\n        public object GetValue()\r\n        {\r\n            var mat = this.Material;\r\n\r\n            if (mat == null) return null;\r\n\r\n            try\r\n            {\r\n                switch (_valueType)\r\n                {\r\n                    case MaterialPropertyValueType.Float:\r\n                        return mat.GetFloat(_propertyName);\r\n                    case MaterialPropertyValueType.Color:\r\n                        switch(_member)\r\n                        {\r\n                            case MaterialPropertyValueTypeMember.None:\r\n                                return mat.GetColor(_propertyName);\r\n                            case MaterialPropertyValueTypeMember.X:\r\n                                return mat.GetColor(_propertyName).r;\r\n                            case MaterialPropertyValueTypeMember.Y:\r\n                                return mat.GetColor(_propertyName).g;\r\n                            case MaterialPropertyValueTypeMember.Z:\r\n                                return mat.GetColor(_propertyName).b;\r\n                            case MaterialPropertyValueTypeMember.W:\r\n                                return mat.GetColor(_propertyName).a;\r\n                            default:\r\n                                return 0f;\r\n                        }\r\n                    case MaterialPropertyValueType.Vector:\r\n                        switch (_member)\r\n                        {\r\n                            case MaterialPropertyValueTypeMember.None:\r\n                                return mat.GetVector(_propertyName);\r\n                            case MaterialPropertyValueTypeMember.X:\r\n                                return mat.GetVector(_propertyName).x;\r\n                            case MaterialPropertyValueTypeMember.Y:\r\n                                return mat.GetVector(_propertyName).y;\r\n                            case MaterialPropertyValueTypeMember.Z:\r\n                                return mat.GetVector(_propertyName).z;\r\n                            case MaterialPropertyValueTypeMember.W:\r\n                                return mat.GetVector(_propertyName).w;\r\n                            default:\r\n                                return 0f;\r\n                        }\r\n                    case MaterialPropertyValueType.Texture:\r\n                        return mat.GetTexture(_propertyName);\r\n                }\r\n            }\r\n            catch\r\n            {\r\n\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Render/MaterialSource.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Collections;\r\n\r\nnamespace com.spacepuppy.Render\r\n{\r\n\r\n    public interface IMaterialSource\r\n    {\r\n\r\n        Material Material { get; set; }\r\n        \r\n        bool IsUnique { get; set; }\r\n\r\n        Material GetUniqueMaterial();\r\n\r\n    }\r\n\r\n    public abstract class MaterialSource : SPComponent, IMaterialSource\r\n    {\r\n        public abstract bool IsUnique { get; set; }\r\n        public abstract Material Material { get; set; }\r\n\r\n        public abstract Material GetUniqueMaterial();\r\n\r\n\r\n        #region Static Interface\r\n\r\n        public static MaterialSource GetMaterialSource(object src)\r\n        {\r\n            if(src is Renderer)\r\n            {\r\n                return RendererMaterialSource.GetMaterialSource(src as Renderer);\r\n            }\r\n            else if(src is UnityEngine.UI.Graphic)\r\n            {\r\n                return GraphicMaterialSource.GetMaterialSource(src as UnityEngine.UI.Graphic);\r\n            }\r\n\r\n            var go = com.spacepuppy.Utils.GameObjectUtil.GetGameObjectFromSource(src);\r\n            var rend = go.GetComponent<Renderer>();\r\n            if (rend != null)\r\n                return RendererMaterialSource.GetMaterialSource(rend);\r\n\r\n            var graph = go.GetComponent<UnityEngine.UI.Graphic>();\r\n            if(graph != null)\r\n                return GraphicMaterialSource.GetMaterialSource(graph);\r\n\r\n            return null;\r\n        }\r\n        \r\n        #endregion\r\n    }\r\n\r\n    /// <summary>\r\n    /// A self-tracking Material source accessor. This allows you to track if a Material is using a shared material, or you had made it unique. \r\n    /// The default interface for accessing materials on a Renderer in Unity is rather confusing and it's hard to tell if it's shared or not. \r\n    /// This also leads to accidental memory consumption due to repeated access of the 'Renderer.material' method duplicates the material over \r\n    /// and over.\r\n    /// \r\n    /// Instead with this, accessing the field 'Material' gives you the material assigned to the Renderer source. If you want to make that material \r\n    /// unique, you can call GetUniqueMaterial(). This will flag the MaterialSource as 'Unique'. If you happen to assign this material to another \r\n    /// Renderer, you can manually flag it back false implying it's shared (though not globally shared).\r\n    /// </summary>\r\n    [RequireComponent(typeof(Renderer))]\r\n    public class RendererMaterialSource : MaterialSource\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [DefaultFromSelf]\r\n        [ForceFromSelf(EntityRelativity.Self)]\r\n        private Renderer _renderer;\r\n        [SerializeField()]\r\n        private bool _makeUniqueOnStart;\r\n\r\n        [System.NonSerialized()]\r\n        private bool _unique;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n        \r\n        protected override void Start()\r\n        {\r\n            if(object.ReferenceEquals(_renderer, null))\r\n            {\r\n                Debug.LogWarning(\"MaterialSource attached incorrectly to GameObject. Either attach MaterialSource at design time through editor, or call MaterialSource.GetMaterialSource.\");\r\n                UnityEngine.Object.Destroy(this);\r\n            }\r\n            else if(_renderer.gameObject != this.gameObject)\r\n            {\r\n                Debug.LogWarning(\"MaterialSource must be attached to the same GameObject as its Source Renderer.\");\r\n                UnityEngine.Object.Destroy(this);\r\n            }\r\n\r\n            if(_makeUniqueOnStart && !_unique)\r\n            {\r\n                this.GetUniqueMaterial();\r\n            }\r\n\r\n            base.Start();\r\n        }\r\n\r\n        protected override void OnDestroy()\r\n        {\r\n            base.OnDestroy();\r\n\r\n            if(_unique)\r\n            {\r\n                UnityEngine.Object.Destroy(this.Material);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Renderer Renderer\r\n        {\r\n            get { return _renderer; }\r\n        }\r\n\r\n        public override Material Material\r\n        {\r\n            get\r\n            {\r\n                return _renderer.sharedMaterial;\r\n            }\r\n            set\r\n            {\r\n                _renderer.material = value;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Does not reflect if the material is truly unique. But suggests the possibly of uniqueness if \r\n        /// 'GetUniqueMaterial' were called.\r\n        /// </summary>\r\n        public override bool IsUnique\r\n        {\r\n            get { return _unique; }\r\n            set { _unique = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Replaces the material on the Renderer with a copy of itself so it's unique.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public override Material GetUniqueMaterial()\r\n        {\r\n            _unique = true;\r\n            return _renderer.material;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n\r\n        public static RendererMaterialSource GetMaterialSource(Renderer renderer)\r\n        {\r\n            using (var lst = TempCollection.GetList<RendererMaterialSource>())\r\n            {\r\n                renderer.GetComponents<RendererMaterialSource>(lst);\r\n                for (int i = 0; i < lst.Count; i++)\r\n                {\r\n                    if (lst[i]._renderer == renderer) return lst[i];\r\n                }\r\n            }\r\n\r\n            var source = renderer.gameObject.AddComponent<RendererMaterialSource>();\r\n            source._renderer = renderer;\r\n            return source;\r\n        }\r\n        \r\n        #endregion\r\n\r\n    }\r\n\r\n    [RequireComponent(typeof(UnityEngine.UI.Graphic))]\r\n    public class GraphicMaterialSource : MaterialSource\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [DefaultFromSelf]\r\n        [ForceFromSelf(EntityRelativity.Self)]\r\n        private UnityEngine.UI.Graphic _graphics;\r\n        [SerializeField()]\r\n        private bool _makeUniqueOnStart;\r\n\r\n        [System.NonSerialized()]\r\n        private bool _unique;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Start()\r\n        {\r\n            if (object.ReferenceEquals(_graphics, null))\r\n            {\r\n                Debug.LogWarning(\"MaterialSource attached incorrectly to GameObject. Either attach MaterialSource at design time through editor, or call MaterialSource.GetMaterialSource.\");\r\n                UnityEngine.Object.Destroy(this);\r\n            }\r\n            else if (_graphics.gameObject != this.gameObject)\r\n            {\r\n                Debug.LogWarning(\"MaterialSource must be attached to the same GameObject as its Source Renderer.\");\r\n                UnityEngine.Object.Destroy(this);\r\n            }\r\n\r\n            if (_makeUniqueOnStart && !_unique)\r\n            {\r\n                this.GetUniqueMaterial();\r\n            }\r\n\r\n            base.Start();\r\n        }\r\n\r\n        protected override void OnDestroy()\r\n        {\r\n            base.OnDestroy();\r\n\r\n            if (_unique)\r\n            {\r\n                UnityEngine.Object.Destroy(this.Material);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public UnityEngine.UI.Graphic Graphics\r\n        {\r\n            get { return _graphics; }\r\n        }\r\n\r\n        public override Material Material\r\n        {\r\n            get\r\n            {\r\n                return _graphics.material ?? _graphics.defaultMaterial;\r\n            }\r\n            set\r\n            {\r\n                _graphics.material = value;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Does not reflect if the material is truly unique. But suggests the possibly of uniqueness if \r\n        /// 'GetUniqueMaterial' were called.\r\n        /// </summary>\r\n        public override bool IsUnique\r\n        {\r\n            get { return _unique; }\r\n            set { _unique = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Replaces the material on the Renderer with a copy of itself so it's unique.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public override Material GetUniqueMaterial()\r\n        {\r\n            var mat = _graphics.material ?? _graphics.defaultMaterial;\r\n            if (_unique) return mat;\r\n\r\n            _unique = true;\r\n            mat = new Material(mat);\r\n            _graphics.material = mat;\r\n            return mat;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n\r\n        public static GraphicMaterialSource GetMaterialSource(UnityEngine.UI.Graphic graphic)\r\n        {\r\n            using (var lst = TempCollection.GetList<GraphicMaterialSource>())\r\n            {\r\n                graphic.GetComponents<GraphicMaterialSource>(lst);\r\n                for (int i = 0; i < lst.Count; i++)\r\n                {\r\n                    if (lst[i]._graphics == graphic) return lst[i];\r\n                }\r\n            }\r\n\r\n            var source = graphic.gameObject.AddComponent<GraphicMaterialSource>();\r\n            source._graphics = graphic;\r\n            return source;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Render/MaterialTransition.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Render\r\n{\r\n\r\n    /// <summary>\r\n    /// TODO - add an index for multiple-material renderers.\r\n    /// </summary>\r\n    [System.Serializable()]\r\n    public class MaterialTransition\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [DisableOnPlay()]\r\n        private UnityEngine.Object _material;\r\n        [SerializeField()]\r\n        private MaterialPropertyValueType _valueType;\r\n        [SerializeField]\r\n        private MaterialPropertyValueTypeMember _member;\r\n        [SerializeField()]\r\n        private string _propertyName;\r\n        [SerializeField()]\r\n        private List<VariantReference> _values = new List<VariantReference>();\r\n\r\n        [SerializeField()]\r\n        [Range(0f, 1f)]\r\n        private float _position;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Material Material\r\n        {\r\n            get { return MaterialUtil.GetMaterialFromSource(_material); }\r\n            set { _material = value; }\r\n        }\r\n        \r\n        public MaterialPropertyValueType PropertyValueType\r\n        {\r\n            get { return _valueType; }\r\n            set { _valueType = value; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// If the PropertyValueType is Color/Vector, this allows referencing one of the specific members of the Color/Vector.\r\n        /// </summary>\r\n        public MaterialPropertyValueTypeMember PropertyValueTypeMember\r\n        {\r\n            get { return _member; }\r\n            set { _member = value; }\r\n        }\r\n\r\n        public string PropertyName\r\n        {\r\n            get { return _propertyName; }\r\n            set { _propertyName = value; }\r\n        }\r\n\r\n        public List<VariantReference> Values\r\n        {\r\n            get { return _values; }\r\n        }\r\n\r\n        public float Position\r\n        {\r\n            get { return _position; }\r\n            set\r\n            {\r\n                _position = Mathf.Clamp01(value);\r\n                this.Sync();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Sync()\r\n        {\r\n            var mat = this.Material;\r\n\r\n            if (mat == null) return;\r\n            if (_values.Count == 0) return;\r\n\r\n            int iLow = Mathf.Clamp(Mathf.FloorToInt(_position * (_values.Count - 1)), 0, _values.Count - 1);\r\n            int iHigh = iLow + 1;\r\n            if (iHigh >= _values.Count) iHigh = iLow;\r\n\r\n            var dt = (_values.Count > 1) ? 1f / (float)(_values.Count - 1) : 1f;\r\n            var t = _position % dt;\r\n\r\n            switch(_valueType)\r\n            {\r\n                case MaterialPropertyValueType.Float:\r\n                    mat.SetFloat(_propertyName, Mathf.Lerp(_values[iLow].FloatValue, _values[iHigh].FloatValue, t));\r\n                    break;\r\n                case MaterialPropertyValueType.Color:\r\n                    {\r\n                        switch(_member)\r\n                        {\r\n                            case MaterialPropertyValueTypeMember.None:\r\n                                mat.SetColor(_propertyName, Color.Lerp(_values[iLow].ColorValue, _values[iHigh].ColorValue, t));\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.X:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.r = Mathf.Lerp(_values[iLow].FloatValue, _values[iHigh].FloatValue, t);\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Y:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.g = Mathf.Lerp(_values[iLow].FloatValue, _values[iHigh].FloatValue, t);\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Z:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.b = Mathf.Lerp(_values[iLow].FloatValue, _values[iHigh].FloatValue, t);\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.W:\r\n                                {\r\n                                    var c = mat.GetColor(_propertyName);\r\n                                    c.a = Mathf.Lerp(_values[iLow].FloatValue, _values[iHigh].FloatValue, t);\r\n                                    mat.SetColor(_propertyName, c);\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n                case MaterialPropertyValueType.Vector:\r\n                    {\r\n                        switch (_member)\r\n                        {\r\n                            case MaterialPropertyValueTypeMember.None:\r\n                                mat.SetVector(_propertyName, Vector4.Lerp(_values[iLow].Vector4Value, _values[iHigh].Vector4Value, t));\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.X:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.x = Mathf.Lerp(_values[iLow].FloatValue, _values[iHigh].FloatValue, t);\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Y:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.y = Mathf.Lerp(_values[iLow].FloatValue, _values[iHigh].FloatValue, t);\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.Z:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.z = Mathf.Lerp(_values[iLow].FloatValue, _values[iHigh].FloatValue, t);\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                            case MaterialPropertyValueTypeMember.W:\r\n                                {\r\n                                    var v = mat.GetVector(_propertyName);\r\n                                    v.w = Mathf.Lerp(_values[iLow].FloatValue, _values[iHigh].FloatValue, t);\r\n                                    mat.SetVector(_propertyName, v);\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n            }\r\n        }\r\n        \r\n        public object GetValue()\r\n        {\r\n            var mat = this.Material;\r\n\r\n            if (mat == null) return null;\r\n\r\n            try\r\n            {\r\n                switch (_valueType)\r\n                {\r\n                    case MaterialPropertyValueType.Float:\r\n                        return mat.GetFloat(_propertyName);\r\n                    case MaterialPropertyValueType.Color:\r\n                        switch (_member)\r\n                        {\r\n                            case MaterialPropertyValueTypeMember.None:\r\n                                return mat.GetColor(_propertyName);\r\n                            case MaterialPropertyValueTypeMember.X:\r\n                                return mat.GetColor(_propertyName).r;\r\n                            case MaterialPropertyValueTypeMember.Y:\r\n                                return mat.GetColor(_propertyName).g;\r\n                            case MaterialPropertyValueTypeMember.Z:\r\n                                return mat.GetColor(_propertyName).b;\r\n                            case MaterialPropertyValueTypeMember.W:\r\n                                return mat.GetColor(_propertyName).a;\r\n                            default:\r\n                                return 0f;\r\n                        }\r\n                    case MaterialPropertyValueType.Vector:\r\n                        switch (_member)\r\n                        {\r\n                            case MaterialPropertyValueTypeMember.None:\r\n                                return mat.GetVector(_propertyName);\r\n                            case MaterialPropertyValueTypeMember.X:\r\n                                return mat.GetVector(_propertyName).x;\r\n                            case MaterialPropertyValueTypeMember.Y:\r\n                                return mat.GetVector(_propertyName).y;\r\n                            case MaterialPropertyValueTypeMember.Z:\r\n                                return mat.GetVector(_propertyName).z;\r\n                            case MaterialPropertyValueTypeMember.W:\r\n                                return mat.GetVector(_propertyName).w;\r\n                            default:\r\n                                return 0f;\r\n                        }\r\n                    case MaterialPropertyValueType.Texture:\r\n                        return mat.GetTexture(_propertyName);\r\n                }\r\n            }\r\n            catch\r\n            {\r\n\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Render/MaterialUtil.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Render\r\n{\r\n    public static class MaterialUtil\r\n    {\r\n\r\n        public static bool IsMaterialSource(object obj)\r\n        {\r\n            if (obj is Material) return true;\r\n            if (obj is Renderer) return true;\r\n            if (obj is UnityEngine.UI.Graphic) return true;\r\n\r\n            return false;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Reduces obj to a Material source type (Material, Renderer, UI.Graphics), and returns the material used by it. \r\n        /// Uses the sharedMaterial by default.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"reduceFromGameObjectSource\">If the object is a GameObjectSource, when true attempts to retrieve a Renderer or UI.Graphics from said source.</param>\r\n        /// <returns></returns>\r\n        public static Material GetMaterialFromSource(object obj, bool reduceFromGameObjectSource = false)\r\n        {\r\n            if (obj is Material)\r\n                return obj as Material;\r\n            else if (obj is Renderer)\r\n                return (obj as Renderer).sharedMaterial;\r\n            else if (obj is UnityEngine.UI.Graphic)\r\n                return (obj as UnityEngine.UI.Graphic).material ?? (obj as UnityEngine.UI.Graphic).defaultMaterial;\r\n\r\n            if(reduceFromGameObjectSource)\r\n            {\r\n                var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n                if (go == null) return null;\r\n\r\n                var rend = go.GetComponent<Renderer>();\r\n                if (rend != null)\r\n                    return rend.sharedMaterial;\r\n\r\n                var graph = go.GetComponent<UnityEngine.UI.Graphic>();\r\n                if (graph != null)\r\n                    return graph.material ?? graph.defaultMaterial;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Reduces obj to a Material source type (Material, Renderer, UI.Graphics), and returns the material used by it. \r\n        /// Uses the sharedMaterial by default.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"index\">Index of the material if multiple.</param>\r\n        /// <param name=\"reduceFromGameObjectSource\">If the object is a GameObjectSource, when true attempts to retrieve a Renderer or UI.Graphics from said source.</param>\r\n        /// <returns></returns>\r\n        public static Material GetMaterialFromSource(object obj, int index, bool reduceFromGameObjectSource = false)\r\n        {\r\n            if (obj is Material)\r\n                return obj as Material;\r\n            else if (obj is Renderer)\r\n            {\r\n                if(index < 0) return null;\r\n                var arr = (obj as Renderer).sharedMaterials;\r\n                if (index >= arr.Length) return null;\r\n                return arr[index];\r\n            }\r\n            else if (obj is UnityEngine.UI.Graphic)\r\n                return (obj as UnityEngine.UI.Graphic).material ?? (obj as UnityEngine.UI.Graphic).defaultMaterial;\r\n\r\n            if (reduceFromGameObjectSource)\r\n            {\r\n                var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n                if (go == null) return null;\r\n\r\n                var rend = go.GetComponent<Renderer>();\r\n                if (rend != null)\r\n                {\r\n                    if (index < 0) return null;\r\n                    var arr = rend.sharedMaterials;\r\n                    if (index >= arr.Length) return null;\r\n                    return arr[index];\r\n                }\r\n\r\n                var graph = go.GetComponent<UnityEngine.UI.Graphic>();\r\n                if (graph != null)\r\n                    return graph.material ?? graph.defaultMaterial;\r\n            }\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Reduces obj to source type, and returns a copy of the material on it. \r\n        /// Works like Renderer.material, but also for UI.Graphics.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"reduceFromGameObjectSource\"></param>\r\n        /// <returns></returns>\r\n        public static Material CopyMaterialFromSource(object obj, bool reduceFromGameObjectSource = false)\r\n        {\r\n            if (obj is Renderer)\r\n                return (obj as Renderer).material;\r\n            else if (obj is UnityEngine.UI.Graphic)\r\n            {\r\n                var graph = obj as UnityEngine.UI.Graphic;\r\n                var source = RendererMaterialSource.GetMaterialSource(graph);\r\n                return source.GetUniqueMaterial();\r\n            }\r\n\r\n            if (reduceFromGameObjectSource)\r\n            {\r\n                var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n                if (go == null) return null;\r\n\r\n                var rend = go.GetComponent<Renderer>();\r\n                if (rend != null)\r\n                    return rend.material;\r\n\r\n                var graph = go.GetComponent<UnityEngine.UI.Graphic>();\r\n                if (graph != null)\r\n                {\r\n                    var source = RendererMaterialSource.GetMaterialSource(graph);\r\n                    return source.GetUniqueMaterial();\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static Material GetUniqueMaterial(this Renderer renderer, bool forceUnique = false)\r\n        {\r\n            if (renderer == null) throw new System.ArgumentNullException(\"renderer\");\r\n\r\n            var source = RendererMaterialSource.GetMaterialSource(renderer);\r\n            if (!source.IsUnique || forceUnique)\r\n                return source.GetUniqueMaterial();\r\n            else\r\n                return source.Material;\r\n        }\r\n\r\n        public static Material GetUniqueMaterial(this UnityEngine.UI.Graphic graphic, bool forceUnique = false)\r\n        {\r\n            if (graphic == null) throw new System.ArgumentNullException(\"graphic\");\r\n\r\n            var source = GraphicMaterialSource.GetMaterialSource(graphic);\r\n            if (!source.IsUnique || forceUnique)\r\n                return source.GetUniqueMaterial();\r\n            else\r\n                return source.Material;\r\n        }\r\n\r\n        public static Material GetUniqueMaterial(object src, bool forceUnique = false)\r\n        {\r\n            if (src == null) throw new System.ArgumentNullException(\"src\");\r\n\r\n            var source = MaterialSource.GetMaterialSource(src);\r\n            if (source == null) return null;\r\n\r\n            if (!source.IsUnique || forceUnique)\r\n                return source.GetUniqueMaterial();\r\n            else\r\n                return source.Material;\r\n        }\r\n\r\n\r\n\r\n\r\n        public static IEnumerable<object> GetAllMaterialSources()\r\n        {\r\n            foreach(var o in UnityEngine.Object.FindObjectsOfType<UnityEngine.Renderer>())\r\n            {\r\n                yield return o;\r\n            }\r\n\r\n            foreach(var o in UnityEngine.Object.FindObjectsOfType<UnityEngine.UI.Graphic>())\r\n            {\r\n                yield return o;\r\n            }\r\n        }\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Render/RenderEnums.cs",
    "content": "﻿namespace com.spacepuppy.Render\r\n{\r\n\r\n    public enum MaterialPropertyValueType\r\n    {\r\n        Float = 0,\r\n        Color = 1,\r\n        Vector = 2,\r\n        Texture = 3\r\n    }\r\n\r\n    public enum MaterialPropertyValueTypeMember\r\n    {\r\n        None = 0,\r\n        X,\r\n        Y,\r\n        Z,\r\n        W\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Render/RenderSettingsProxy.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.Rendering;\nusing System.Collections.Generic;\n\nusing com.spacepuppy.Dynamic;\n\nnamespace com.spacepuppy.Render\n{\n\n    [CreateAssetMenu(fileName = \"RenderSettingsProxy\", menuName = \"Services/RenderSettingsProxy\")]\n    public class RenderSettingsProxy : ScriptableObject, ITokenizable\n    {\n\n        #region Static Interface\n\n        private static RenderSettingsProxy _default;\n        public static RenderSettingsProxy Default\n        {\n            get\n            {\n                if (_default == null)\n                {\n                    _default = ScriptableObject.CreateInstance<RenderSettingsProxy>();\n                }\n                return _default;\n            }\n        }\n        \n        #endregion\n        \n        #region Properties\n\n        public int DefaultReflectionResolution\n        {\n            get { return RenderSettings.defaultReflectionResolution; }\n            set { RenderSettings.defaultReflectionResolution = value; }\n        }\n        public DefaultReflectionMode DefaultReflectionMode\n        {\n            get { return RenderSettings.defaultReflectionMode; }\n            set { RenderSettings.defaultReflectionMode = value; }\n        }\n        public Light Sun\n        {\n            get { return RenderSettings.sun; }\n            set { RenderSettings.sun = value; }\n        }\n        public Material Skybox\n        {\n            get { return RenderSettings.skybox; }\n            set { RenderSettings.skybox = value; }\n        }\n        public float FlareFadeSpeed\n        {\n            get { return RenderSettings.flareFadeSpeed; }\n            set { RenderSettings.flareFadeSpeed = value; }\n        }\n        public float FlareStrength\n        {\n            get { return RenderSettings.flareStrength; }\n            set { RenderSettings.flareStrength = value; }\n        }\n        public float HaloStrength\n        {\n            get { return RenderSettings.haloStrength; }\n            set { RenderSettings.haloStrength = value; }\n        }\n        public int ReflectionBounces\n        {\n            get { return RenderSettings.reflectionBounces; }\n            set { RenderSettings.reflectionBounces = value; }\n        }\n        public float ReflectionIntensity\n        {\n            get { return RenderSettings.reflectionIntensity; }\n            set { RenderSettings.reflectionIntensity = value; }\n        }\n        public Color SubtractiveShadowColor\n        {\n            get { return RenderSettings.subtractiveShadowColor; }\n            set { RenderSettings.subtractiveShadowColor = value; }\n        }\n        public SphericalHarmonicsL2 AmbientProbe\n        {\n            get { return RenderSettings.ambientProbe; }\n            set { RenderSettings.ambientProbe = value; }\n        }\n        public float AmbientIntensity\n        {\n            get { return RenderSettings.ambientIntensity; }\n            set { RenderSettings.ambientIntensity = value; }\n        }\n        public Color AmbientLight\n        {\n            get { return RenderSettings.ambientLight; }\n            set { RenderSettings.ambientLight = value; }\n        }\n        public Color AmbientGroundColor\n        {\n            get { return RenderSettings.ambientGroundColor; }\n            set { RenderSettings.ambientGroundColor = value; }\n        }\n        public Color AmbientEquatorColor\n        {\n            get { return RenderSettings.ambientEquatorColor; }\n            set { RenderSettings.ambientEquatorColor = value; }\n        }\n        public Color AmbientSkyColor\n        {\n            get { return RenderSettings.ambientSkyColor; }\n            set { RenderSettings.ambientSkyColor = value; }\n        }\n        public AmbientMode AmbientMode\n        {\n            get { return RenderSettings.ambientMode; }\n            set { RenderSettings.ambientMode = value; }\n        }\n        public float FogEndDistance\n        {\n            get { return RenderSettings.fogEndDistance; }\n            set { RenderSettings.fogEndDistance = value; }\n        }\n        public float FogStartDistance\n        {\n            get { return RenderSettings.fogStartDistance; }\n            set { RenderSettings.fogStartDistance = value; }\n        }\n        public float FogDensity\n        {\n            get { return RenderSettings.fogDensity; }\n            set { RenderSettings.fogDensity = value; }\n        }\n        public Color FogColor\n        {\n            get { return RenderSettings.fogColor; }\n            set { RenderSettings.fogColor = value; }\n        }\n        public FogMode FogMode\n        {\n            get { return RenderSettings.fogMode; }\n            set { RenderSettings.fogMode = value; }\n        }\n        public bool Fog\n        {\n            get { return RenderSettings.fog; }\n            set { RenderSettings.fog = value; }\n        }\n        public Cubemap CustomReflection\n        {\n            get { return RenderSettings.customReflection; }\n            set { RenderSettings.customReflection = value; }\n        }\n\n        #endregion\n\n\n        #region ITokenizable Interface\n\n        object ITokenizable.CreateStateToken()\n        {\n            return this.CreateStateToken();\n        }\n\n        public Token CreateStateToken()\n        {\n            var obj = new Token();\n            obj.DefaultReflectionResolution = this.DefaultReflectionResolution;\n            obj.DefaultReflectionMode = this.DefaultReflectionMode;\n            obj.Sun = this.Sun;\n            obj.Skybox = this.Skybox;\n            obj.FlareFadeSpeed = this.FlareFadeSpeed;\n            obj.FlareStrength = this.FlareStrength;\n            obj.HaloStrength = this.HaloStrength;\n            obj.ReflectionBounces = this.ReflectionBounces;\n            obj.ReflectionIntensity = this.ReflectionIntensity;\n            obj.SubtractiveShadowColor = this.SubtractiveShadowColor;\n            obj.AmbientProbe = this.AmbientProbe;\n            obj.AmbientIntensity = this.AmbientIntensity;\n            obj.AmbientLight = this.AmbientLight;\n            obj.AmbientGroundColor = this.AmbientGroundColor;\n            obj.AmbientEquatorColor = this.AmbientEquatorColor;\n            obj.AmbientSkyColor = this.AmbientSkyColor;\n            obj.AmbientMode = this.AmbientMode;\n            obj.FogEndDistance = this.FogEndDistance;\n            obj.FogStartDistance = this.FogStartDistance;\n            obj.FogDensity = this.FogDensity;\n            obj.FogColor = this.FogColor;\n            obj.FogMode = this.FogMode;\n            obj.Fog = this.Fog;\n            obj.CustomReflection = this.CustomReflection;\n\n            return obj;\n        }\n\n        public void RestoreFromStateToken(object token)\n        {\n            if(token is Token)\n            {\n                var obj = token as Token;\n                this.DefaultReflectionResolution = obj.DefaultReflectionResolution;\n                this.DefaultReflectionMode = obj.DefaultReflectionMode;\n                this.Sun = obj.Sun;\n                this.Skybox = obj.Skybox;\n                this.FlareFadeSpeed = obj.FlareFadeSpeed;\n                this.FlareStrength = obj.FlareStrength;\n                this.HaloStrength = obj.HaloStrength;\n                this.ReflectionBounces = obj.ReflectionBounces;\n                this.ReflectionIntensity = obj.ReflectionIntensity;\n                this.SubtractiveShadowColor = obj.SubtractiveShadowColor;\n                this.AmbientProbe = obj.AmbientProbe;\n                this.AmbientIntensity = obj.AmbientIntensity;\n                this.AmbientLight = obj.AmbientLight;\n                this.AmbientGroundColor = obj.AmbientGroundColor;\n                this.AmbientEquatorColor = obj.AmbientEquatorColor;\n                this.AmbientSkyColor = obj.AmbientSkyColor;\n                this.AmbientMode = obj.AmbientMode;\n                this.FogEndDistance = obj.FogEndDistance;\n                this.FogStartDistance = obj.FogStartDistance;\n                this.FogDensity = obj.FogDensity;\n                this.FogColor = obj.FogColor;\n                this.FogMode = obj.FogMode;\n                this.Fog = obj.Fog;\n                this.CustomReflection = obj.CustomReflection;\n            }\n            else\n            {\n                Dynamic.DynamicUtil.CopyState(this, token);\n            }\n        }\n\n        #endregion\n\n        #region Special Types\n\n        [System.Serializable]\n        public class Token\n        {\n\n            public int DefaultReflectionResolution;\n            public DefaultReflectionMode DefaultReflectionMode;\n            [System.NonSerialized]\n            public Light Sun;\n            [System.NonSerialized]\n            public Material Skybox;\n            public float FlareFadeSpeed;\n            public float FlareStrength;\n            public float HaloStrength;\n            public int ReflectionBounces;\n            public float ReflectionIntensity;\n            public Color SubtractiveShadowColor;\n            public SphericalHarmonicsL2 AmbientProbe;\n            public float AmbientIntensity;\n            public Color AmbientLight;\n            public Color AmbientGroundColor;\n            public Color AmbientEquatorColor;\n            public Color AmbientSkyColor;\n            public AmbientMode AmbientMode;\n            public float FogEndDistance;\n            public float FogStartDistance;\n            public float FogDensity;\n            public Color FogColor;\n            public FogMode FogMode;\n            public bool Fog;\n            [System.NonSerialized]\n            public Cubemap CustomReflection;\n\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Render/RendererMaterialSwap.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Render\r\n{\r\n    public class RendererMaterialSwap : MonoBehaviour\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        [System.NonSerialized()]\r\n        private Renderer _renderer;\r\n\r\n        [System.NonSerialized()]\r\n        private Material _matCache;\r\n        [System.NonSerialized()]\r\n        private bool _flashing;\r\n\r\n        [System.NonSerialized()]\r\n        private RadicalCoroutine _flashRoutine;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private void Awake()\r\n        {\r\n            _renderer = this.GetComponent<Renderer>();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool Flashing { get { return _flashing; } }\r\n        \r\n        public Material ActiveMaterial { get { return _renderer.sharedMaterial; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void StartSwap(Material mat, float duration)\r\n        {\r\n            if (duration <= 0f)\r\n            {\r\n                this.StopSwap();\r\n                return;\r\n            }\r\n            if (!this.enabled) this.enabled = true;\r\n\r\n            if(_flashRoutine != null)\r\n            {\r\n                _flashRoutine.Cancel();\r\n                _flashRoutine = null;\r\n            }\r\n\r\n            if (_flashing)\r\n            {\r\n                //already started, just replace\r\n                _renderer.sharedMaterial = mat;\r\n                \r\n                if (duration < float.PositiveInfinity)\r\n                {\r\n                    _flashRoutine = this.Invoke(this.StopSwap, duration);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                //start a new\r\n                _matCache = _renderer.sharedMaterial;\r\n                _renderer.sharedMaterial = mat;\r\n                _flashing = true;\r\n\r\n                if (duration < float.PositiveInfinity)\r\n                {\r\n                    _flashRoutine = this.Invoke(this.StopSwap, duration);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void StopSwap()\r\n        {\r\n            if (_flashing)\r\n            {\r\n                _renderer.sharedMaterial = _matCache;\r\n                _matCache = null;\r\n                _flashing = false;\r\n                this.enabled = false;\r\n            }\r\n\r\n            if (_flashRoutine != null)\r\n            {\r\n                _flashRoutine.Cancel();\r\n                _flashRoutine = null;\r\n            }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Static Factory\r\n\r\n        public static RendererMaterialSwap Swap(Renderer renderer, Material material, float dur)\r\n        {\r\n            if (renderer == null) throw new System.ArgumentNullException(\"renderer\");\r\n            if (material == null) throw new System.ArgumentNullException(\"material\");\r\n            var swap = renderer.AddOrGetComponent<RendererMaterialSwap>();\r\n            swap._renderer = renderer;\r\n            swap.StartSwap(material, dur);\r\n            return swap;\r\n        }\r\n\r\n        public static RendererMaterialSwap[] SwapAll(GameObject root, Material material, float dur, bool bIncludeInactiveRenderers = false)\r\n        {\r\n            if (root == null) throw new System.ArgumentNullException(\"root\");\r\n            if (material == null) throw new System.ArgumentNullException(\"material\");\r\n\r\n            using (var results = com.spacepuppy.Collections.TempCollection.GetList<RendererMaterialSwap>())\r\n            {\r\n                using (var rendererList = com.spacepuppy.Collections.TempCollection.GetList<Renderer>())\r\n                {\r\n                    root.GetComponentsInChildren<Renderer>(bIncludeInactiveRenderers, rendererList);\r\n                    var e = rendererList.GetEnumerator();\r\n                    while(e.MoveNext())\r\n                    {\r\n                        var swap = e.Current.AddOrGetComponent<RendererMaterialSwap>();\r\n                        swap._renderer = e.Current;\r\n                        swap.StartSwap(material, dur);\r\n                        results.Add(swap);\r\n                    }\r\n                }\r\n                return results.ToArray();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Render/i_SetMaterialProperty.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\n\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Scenario;\r\n\r\n\r\nnamespace com.spacepuppy.Render\r\n{\r\n    public class i_SetMaterialProperty : TriggerableMechanism\r\n    {\r\n\r\n        public enum SetMode\r\n        {\r\n            Set = 0,\r\n            Increment = 1,\r\n            Decrement = 2\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private MaterialPropertyReference _target;\r\n        [SerializeField()]\r\n        private VariantReference _value;\r\n        [SerializeField()]\r\n        private SetMode _mode;\r\n\r\n        #endregion\r\n\r\n        #region TriggerableMechanism Interface\r\n\r\n        public override bool CanTrigger\r\n        {\r\n            get\r\n            {\r\n                return base.CanTrigger && _target != null && _value != null;\r\n            }\r\n        }\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            switch (_mode)\r\n            {\r\n                case SetMode.Set:\r\n                    _target.SetValue(_value.Value);\r\n                    return true;\r\n                case SetMode.Increment:\r\n                    {\r\n                        var v = _target.GetValue();\r\n                        v = Evaluator.TrySum(v, _value.Value);\r\n                        _target.SetValue(v);\r\n                        return true;\r\n                    }\r\n                case SetMode.Decrement:\r\n                    {\r\n                        var v = _target.GetValue();\r\n                        v = Evaluator.TryDifference(v, _value.Value);\r\n                        _target.SetValue(v);\r\n                        return true;\r\n                    }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Render/i_TweenMaterial.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\n\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Tween;\r\n\r\nnamespace com.spacepuppy.Render\r\n{\r\n    public class i_TweenMaterial : AutoTriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n        \r\n        [SerializeField()]\r\n        private VariantReference _autoKillId;\r\n\r\n        [SerializeField()]\r\n        private bool _killOnDisable;\r\n\r\n        [SerializeField()]\r\n        private SPTime _timeSupplier;\r\n\r\n        [SerializeField()]\r\n        [TimeUnitsSelector()]\r\n        private float _duration;\r\n\r\n        [SerializeField()]\r\n        private EaseStyle _ease;\r\n\r\n        [SerializeField()]\r\n        [DisableOnPlay()]\r\n        [EnumPopupExcluding((int)TweenHash.AnimMode.AnimCurve, (int)TweenHash.AnimMode.Curve, (int)TweenHash.AnimMode.By, (int)TweenHash.AnimMode.RedirectTo)]\r\n        private TweenHash.AnimMode _mode;\r\n\r\n        [SerializeField()]\r\n        private MaterialTransition _transition;\r\n\r\n        [SerializeField()]\r\n        private Trigger _onComplete;\r\n\r\n        [SerializeField()]\r\n        private Trigger _onTick;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n\r\n            switch (_mode)\r\n            {\r\n                case TweenHash.AnimMode.To:\r\n                    _transition.Values.Insert(0, new VariantReference());\r\n                    break;\r\n                case TweenHash.AnimMode.From:\r\n                    _transition.Values.Add(new VariantReference());\r\n                    break;\r\n            }\r\n\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            if (_killOnDisable)\r\n            {\r\n                SPTween.Find((t) =>\r\n                {\r\n                    if (t is ObjectTweener && (t as ObjectTweener).Target == _transition)\r\n                    {\r\n                        t.Kill();\r\n                        return true;\r\n                    }\r\n                    return false;\r\n                });\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public object AutoKillId\r\n        {\r\n            get\r\n            {\r\n                var id = _autoKillId.Value;\r\n                if (id == null) id = this;\r\n                return id;\r\n            }\r\n            set\r\n            {\r\n                if (Object.Equals(value, this))\r\n                    _autoKillId.Value = null;\r\n                else\r\n                    _autoKillId.Value = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITriggerable Interface\r\n\r\n        public override bool CanTrigger\r\n        {\r\n            get\r\n            {\r\n                return base.CanTrigger && _transition.Material != null && _transition.Values.Count != 0;\r\n            }\r\n        }\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n            \r\n            switch (_mode)\r\n            {\r\n                case TweenHash.AnimMode.To:\r\n                    _transition.Values[0].Value = _transition.GetValue();\r\n                    break;\r\n                case TweenHash.AnimMode.From:\r\n                    _transition.Values[_transition.Values.Count - 1].Value = _transition.GetValue();\r\n                    break;\r\n            }\r\n\r\n            var twn = SPTween.Tween(_transition)\r\n                             .FromTo(\"Position\", EaseMethods.GetEase(_ease), _duration, 0f, 1f)\r\n                             .SetId(this.AutoKillId)\r\n                             .Use(_timeSupplier.TimeSupplier);\r\n            \r\n            if (_onComplete.Count > 0)\r\n                twn.OnFinish((t) => _onComplete.ActivateTrigger(this, null));\r\n\r\n            if (_onTick.Count > 0)\r\n                twn.OnStep((t) => _onTick.ActivateTrigger(this, null));\r\n\r\n            twn.Play(true);\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/SPAssets.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    public static class SPAssets\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private static Texture2D _whiteTexture;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public static Texture2D WhiteTexture\r\n        {\r\n            get\r\n            {\r\n                if(_whiteTexture == null)\r\n                {\r\n                    _whiteTexture = new Texture2D(1, 1);\r\n                    _whiteTexture.SetPixel(0, 0, Color.white);\r\n                    _whiteTexture.Apply();\r\n                }\r\n                return _whiteTexture;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/SPComponent.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    public abstract class SPComponent : MonoBehaviour, IEventfulComponent, ISPDisposable\r\n    {\r\n\r\n        #region Events\r\n\r\n        public event System.EventHandler OnEnabled;\r\n        public event System.EventHandler OnStarted;\r\n        public event System.EventHandler OnDisabled;\r\n        public event System.EventHandler ComponentDestroyed;\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        [System.NonSerialized()]\r\n        private bool _started = false;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected virtual void Awake()\r\n        {\r\n            if (this is IMixin) MixinUtil.Initialize(this as IMixin);\r\n            //this.SyncEntityRoot();\r\n        }\r\n\r\n        protected virtual void Start()\r\n        {\r\n            _started = true;\r\n            //this.SyncEntityRoot();\r\n            this.OnStartOrEnable();\r\n            if (this.OnStarted != null) this.OnStarted(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        /// <summary>\r\n        /// On start or on enable if and only if start already occurred. This adjusts the order of 'OnEnable' so that it can be used in conjunction with 'OnDisable' to wire up handlers cleanly. \r\n        /// OnEnable occurs BEFORE Start sometimes, and other components aren't ready yet. This remedies that.\r\n        /// </summary>\r\n        protected virtual void OnStartOrEnable()\r\n        {\r\n\r\n        }\r\n\r\n        protected virtual void OnEnable()\r\n        {\r\n            if (this.OnEnabled != null) this.OnEnabled(this, System.EventArgs.Empty);\r\n\r\n            if (_started)\r\n            {\r\n                this.OnStartOrEnable();\r\n            }\r\n        }\r\n\r\n        protected virtual void OnDisable()\r\n        {\r\n            if (this.OnDisabled != null) this.OnDisabled(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        protected virtual void OnDestroy()\r\n        {\r\n            //InvokeUtil.CancelInvoke(this);\r\n            if (this.ComponentDestroyed != null)\r\n            {\r\n                this.ComponentDestroyed(this, System.EventArgs.Empty);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        /// <summary>\r\n        /// Start has been called on this component.\r\n        /// </summary>\r\n        public bool started { get { return _started; } }\r\n\r\n        //OBSOLETE - unity added this in latest version of unity\r\n        //public bool isActiveAndEnabled { get { return this.gameObject.activeInHierarchy && this.enabled; } }\r\n\r\n        #endregion\r\n            \r\n        #region Radical Coroutine Methods\r\n        \r\n        public new void StopAllCoroutines()\r\n        {\r\n            RadicalCoroutineManager manager = this.GetComponent<RadicalCoroutineManager>();\r\n            if (manager != null)\r\n            {\r\n                manager.PurgeCoroutines(this);\r\n            }\r\n            base.StopAllCoroutines();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IComponent Interface\r\n\r\n        bool IComponent.enabled\r\n        {\r\n            get { return this.enabled; }\r\n            set { this.enabled = value; }\r\n        }\r\n\r\n        Component IComponent.component\r\n        {\r\n            get { return this; }\r\n        }\r\n\r\n        //implemented implicitly\r\n        /*\r\n        GameObject IComponent.gameObject { get { return this.gameObject; } }\r\n        Transform IComponent.transform { get { return this.transform; } }\r\n        */\r\n\r\n        #endregion\r\n        \r\n        #region ISPDisposable Interface\r\n\r\n        bool ISPDisposable.IsDisposed\r\n        {\r\n            get\r\n            {\r\n#if SP_LIB\r\n                return !ObjUtil.IsObjectAlive(this);\r\n#else\r\n                return this == null;\r\n#endif\r\n            }\r\n        }\r\n\r\n        void System.IDisposable.Dispose()\r\n        {\r\n#if SP_LIB\r\n            ObjUtil.SmartDestroy(this);\r\n#else\r\n            Object.Destroy(this);\r\n#endif\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents a component that should always exist as a member of an entity.\r\n    /// \r\n    /// Such a component should not change parents frequently as it would be expensive.\r\n    /// </summary>\r\n    public class SPEntityComponent : SPComponent\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [System.NonSerialized]\r\n        private SPEntity _entity;\r\n        [System.NonSerialized]\r\n        private GameObject _entityRoot;\r\n        [System.NonSerialized]\r\n        private bool _synced;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public SPEntity Entity\r\n        {\r\n            get\r\n            {\r\n                if (!_synced) this.SyncRoot();\r\n                return _entity;\r\n            }\r\n        }\r\n\r\n        public GameObject entityRoot\r\n        {\r\n            get\r\n            {\r\n                if (!_synced) this.SyncRoot();\r\n                return _entityRoot;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected virtual void OnTransformParentChanged()\r\n        {\r\n            _synced = false;\r\n            _entity = null;\r\n            _entityRoot = null;\r\n        }\r\n\r\n        protected void SyncRoot()\r\n        {\r\n            _synced = true;\r\n            _entity = SPEntity.Pool.GetFromSource(this);\r\n#if SP_LIB\r\n            _entityRoot = (_entity != null) ? _entity.gameObject : this.FindRoot();\r\n#else\r\n            _entityRoot = (_entity != null) ? _entity.transform : this.gameObject;\r\n#endif\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/SPConstants.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n    public class SPConstants\r\n    {\r\n        /// <summary>\r\n        /// A hard minimum delta time to consider waiting one frame. Used in places like Invoke to determine if a WaitForSeconds/WaitForDuration should be used.\r\n        /// </summary>\r\n        public const float MIN_FRAME_DELTA = 0.01f;\r\n        \r\n        public const int LAYER_DEFAULT = 0;\r\n        public const int LAYER_WATER = 4;\r\n\r\n\r\n        public const string TAG_UNTAGGED = \"Untagged\";\r\n        public const string TAG_RESPAWN = \"Respawn\";\r\n        public const string TAG_FINISH = \"Finish\";\r\n        public const string TAG_EDITORONLY = \"EditorOnly\";\r\n        public const string TAG_MAINCAMERA = \"MainCamera\";\r\n        public const string TAG_GAMECONTROLLER = \"GameController\";\r\n        public const string TAG_PLAYER = \"Player\";\r\n\r\n        public const string TAG_MULTITAG = \"MultiTag\";\r\n        public const string TAG_ROOT = \"Root\";\r\n        \r\n        public static readonly Quaternion ROT_3DSMAX_TO_UNITY = Quaternion.LookRotation(Vector3.down, Vector3.forward);\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/SPEntity.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Place on the root of a GameObject hierarchy, or a prefab, to signify that it is a complete entity.\r\n    /// </summary>\r\n    [DisallowMultipleComponent()]\r\n    public class SPEntity : SPNotifyingComponent, IIgnorableCollision, INameable\r\n    {\r\n        \r\n        #region Fields\r\n        \r\n        [System.NonSerialized()]\r\n        private bool _isAwake;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public SPEntity()\r\n        {\r\n            _nameCache = new NameCache.UnityObjectNameCache(this);\r\n        }\r\n        \r\n        protected override void Awake()\r\n        {\r\n            this.AddTag(SPConstants.TAG_ROOT);\r\n            Pool.AddReference(this);\r\n\r\n            base.Awake();\r\n\r\n            _isAwake = true;\r\n\r\n            //Messaging.Broadcast<IEntityAwakeHandler>(this.gameObject, (h) => h.OnEntityAwake(this), true, true);\r\n            var token = Messaging.CreateBroadcastToken<IEntityAwakeHandler>(this.gameObject, true, true);\r\n            if(token != null && token.Count > 0)\r\n            {\r\n                com.spacepuppy.Hooks.EarlyStartHook.Invoke(this.gameObject, () =>\r\n                {\r\n                    token.Invoke((h) => h.OnEntityAwake(this));\r\n                });\r\n            }\r\n        }\r\n        \r\n        protected override void OnDestroy()\r\n        {\r\n            base.OnDestroy();\r\n\r\n            Pool.RemoveReference(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool IsAwake { get { return _isAwake; } }\r\n\r\n        #endregion\r\n\r\n        #region INameable Interface\r\n\r\n        private NameCache.UnityObjectNameCache _nameCache;\r\n        public new string name\r\n        {\r\n            get { return _nameCache.Name; }\r\n            set { _nameCache.Name = value; }\r\n        }\r\n        string INameable.Name\r\n        {\r\n            get { return _nameCache.Name; }\r\n            set { _nameCache.Name = value; }\r\n        }\r\n        public bool CompareName(string nm)\r\n        {\r\n            return _nameCache.CompareName(nm);\r\n        }\r\n        void INameable.SetDirty()\r\n        {\r\n            _nameCache.SetDirty();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IIgnorableCollision Interface\r\n\r\n        public virtual void IgnoreCollision(Collider coll, bool ignore)\r\n        {\r\n            if (coll == null) return;\r\n            \r\n            using (var lst = TempCollection.GetList<Collider>())\r\n            {\r\n                this.GetComponentsInChildren<Collider>(false, lst);\r\n                for (int i = 0; i < lst.Count; i++)\r\n                {\r\n                    Physics.IgnoreCollision(lst[i], coll, ignore);\r\n                }\r\n            }\r\n        }\r\n\r\n        public virtual void IgnoreCollision(IIgnorableCollision coll, bool ignore)\r\n        {\r\n            if (coll == null) return;\r\n            \r\n            using (var lst = TempCollection.GetList<Collider>())\r\n            {\r\n                this.GetComponentsInChildren<Collider>(false, lst);\r\n                for (int i = 0; i < lst.Count; i++)\r\n                {\r\n                    coll.IgnoreCollision(lst[i], ignore);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Multiton Interface\r\n\r\n        private static EntityPool _pool = new EntityPool();\r\n        public static EntityPool Pool\r\n        {\r\n            get\r\n            {\r\n                return _pool;\r\n            }\r\n        }\r\n        \r\n        [System.Obsolete(\"Access SPEntity.Pool instead.\")]\r\n        public static SPEntity[] FindAll(System.Func<SPEntity, bool> predicate)\r\n        {\r\n            return SPEntity.Pool.FindAll(predicate);\r\n        }\r\n\r\n        [System.Obsolete(\"Access SPEntity.Pool instead.\")]\r\n        public static void FindAll(ICollection<SPEntity> coll, System.Func<SPEntity, bool> predicate)\r\n        {\r\n            SPEntity.Pool.FindAll(coll, predicate);\r\n        }\r\n        \r\n        [System.Obsolete(\"Access SPEntity.Pool instead.\")]\r\n        public static void FindAll<T>(ICollection<T> coll, System.Func<T, bool> predicate) where T : SPEntity\r\n        {\r\n            SPEntity.Pool.FindAll<T>(coll, predicate);\r\n        }\r\n\r\n        [System.Obsolete(\"Access SPEntity.Pool instead.\")]\r\n        public static bool IsEntitySource(object obj)\r\n        {\r\n            return SPEntity.Pool.IsSource(obj);\r\n        }\r\n\r\n        [System.Obsolete(\"Access SPEntity.Pool instead.\")]\r\n        public static bool IsEntitySource<T>(object obj) where T : SPEntity\r\n        {\r\n            return SPEntity.Pool.IsSource<T>(obj);\r\n        }\r\n\r\n        [System.Obsolete(\"Access SPEntity.Pool instead.\")]\r\n        public static SPEntity GetEntityFromSource(object obj)\r\n        {\r\n            return SPEntity.Pool.GetFromSource(obj);\r\n        }\r\n\r\n        [System.Obsolete(\"Access SPEntity.Pool instead.\")]\r\n        public static SPEntity GetEntityFromSource(System.Type tp, object obj)\r\n        {\r\n            return SPEntity.Pool.GetFromSource(tp, obj);\r\n        }\r\n\r\n        [System.Obsolete(\"Access SPEntity.Pool instead.\")]\r\n        public static T GetEntityFromSource<T>(object obj) where T : SPEntity\r\n        {\r\n            return SPEntity.Pool.GetFromSource<T>(obj);\r\n        }\r\n\r\n        [System.Obsolete(\"Access SPEntity.Pool instead.\")]\r\n        public static bool GetEntityFromSource(object obj, out SPEntity entity)\r\n        {\r\n            return SPEntity.Pool.GetFromSource(obj, out entity);\r\n        }\r\n\r\n        [System.Obsolete(\"Access SPEntity.Pool instead.\")]\r\n        public static bool GetEntityFromSource(System.Type tp, object obj, out SPEntity entity)\r\n        {\r\n            return SPEntity.Pool.GetFromSource(tp, obj, out entity);\r\n        }\r\n\r\n        [System.Obsolete(\"Access SPEntity.Pool instead.\")]\r\n        public static bool GetEntityFromSource<T>(object obj, out T entity) where T : SPEntity\r\n        {\r\n            return SPEntity.Pool.GetFromSource<T>(obj, out entity);\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region Special Types\r\n        \r\n        public class EntityPool : MultitonPool<SPEntity>\r\n        {\r\n            \r\n            public EntityPool() : base(ObjectReferenceEqualityComparer<SPEntity>.Default)\r\n            {\r\n\r\n            }\r\n\r\n            #region EntityMultiton Methods\r\n\r\n            public bool IsSource(object obj)\r\n            {\r\n                if (obj is SPEntity) return true;\r\n\r\n                return GetFromSource(obj) != null;\r\n            }\r\n\r\n            public virtual SPEntity GetFromSource(object obj)\r\n            {\r\n                if (obj == null) return null;\r\n\r\n                SPEntity result = obj as SPEntity;\r\n                if (!object.ReferenceEquals(result, null)) return result;\r\n\r\n                var go = GameObjectUtil.GetGameObjectFromSource(obj, true);\r\n                if (go == null) return null;\r\n\r\n                result = go.GetComponent<SPEntity>();\r\n                if (!object.ReferenceEquals(result, null)) return result;\r\n\r\n                result = go.AddOrGetComponent<SPEntityHook>().GetEntity();\r\n                return result;\r\n            }\r\n\r\n            public bool GetFromSource(object obj, out SPEntity comp)\r\n            {\r\n                comp = GetFromSource(obj);\r\n                return comp != null;\r\n            }\r\n\r\n\r\n\r\n\r\n            \r\n            public bool IsSource<TSub>(object obj) where TSub : SPEntity\r\n            {\r\n                if (obj is TSub) return true;\r\n\r\n                return GetFromSource<TSub>(obj) != null;\r\n            }\r\n\r\n            public virtual TSub GetFromSource<TSub>(object obj) where TSub : SPEntity\r\n            {\r\n                if (obj == null) return null;\r\n                if (obj is TSub) return obj as TSub;\r\n\r\n                var go = GameObjectUtil.GetGameObjectFromSource(obj, true);\r\n                if (go == null) return null;\r\n\r\n                var e = go.GetComponent<SPEntity>();\r\n                if (!object.ReferenceEquals(e, null)) return e as TSub;\r\n\r\n                return go.AddOrGetComponent<SPEntityHook>().GetEntity() as TSub;\r\n            }\r\n\r\n            public virtual SPEntity GetFromSource(System.Type tp, object obj)\r\n            {\r\n                if (tp == null || obj == null) return null;\r\n                if (obj is SPEntity) return TypeUtil.IsType(obj.GetType(), tp) ? obj as SPEntity : null;\r\n\r\n                var go = GameObjectUtil.GetGameObjectFromSource(obj, true);\r\n                if (go == null) return null;\r\n\r\n                var e = go.GetComponent<SPEntity>();\r\n                if (!object.ReferenceEquals(e, null)) return TypeUtil.IsType(e.GetType(), tp) ? e : null;\r\n\r\n                e = go.AddOrGetComponent<SPEntityHook>().GetEntity();\r\n                if (!object.ReferenceEquals(e, null)) return TypeUtil.IsType(e.GetType(), tp) ? e : null;\r\n\r\n                return null;\r\n            }\r\n\r\n            public bool GetFromSource<TSub>(object obj, out TSub comp) where TSub : SPEntity\r\n            {\r\n                comp = GetFromSource<TSub>(obj);\r\n                return comp != null;\r\n            }\r\n\r\n            public bool GetFromSource(System.Type tp, object obj, out SPEntity comp)\r\n            {\r\n                comp = GetFromSource(tp, obj);\r\n                return comp != null;\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        public class SPEntityHook : MonoBehaviour\r\n        {\r\n            #region Fields\r\n\r\n            private SPEntity _entity;\r\n            private bool _synced;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            private void OnDisable()\r\n            {\r\n                if(_synced)\r\n                {\r\n                    _synced = false;\r\n                    if (_entity != null && !this.transform.IsChildOf(_entity.transform))\r\n                    {\r\n                        _entity = null;\r\n                    }\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Methods\r\n\r\n            public SPEntity GetEntity()\r\n            {\r\n                if(!_synced)\r\n                {\r\n                    _synced = true;\r\n                    _entity = this.GetComponentInParent<SPEntity>();\r\n                }\r\n                return _entity;\r\n            }\r\n            \r\n            private void OnTransformParentChanged()\r\n            {\r\n                _synced = false;\r\n                _entity = null;\r\n            }\r\n            \r\n            #endregion\r\n\r\n        }\r\n        \r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/SPNotifyingComponent.cs",
    "content": "﻿namespace com.spacepuppy\r\n{\r\n\r\n    public abstract class SPNotifyingComponent : SPComponent, INotificationDispatcher\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [System.NonSerialized]\r\n        private NotificationDispatcher _observers;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected virtual void OnDespawn()\r\n        {\r\n            if (_observers != null) _observers.PurgeHandlers();\r\n        }\r\n\r\n        #endregion\r\n\r\n        public NotificationDispatcher Observers\r\n        {\r\n            get\r\n            {\r\n                if (_observers == null) _observers = new NotificationDispatcher(this);\r\n                return _observers;\r\n            }\r\n        }\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/SPTime.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// A static entry point to the various ITimeSuppliers in existance. An ITimeSupplier gives object identity \r\n    /// to the varous kinds of time out there: normal (UnityEngine.Time.time), real (UnityEngine.Time.unscaledTime), \r\n    /// smooth (Time.smoothDeltaTime), custom (no unity parrallel). \r\n    /// \r\n    /// With the objects in hand you can than swap out what time is used when updating objects.\r\n    /// \r\n    /// For example the com.spacepuppy.Tween namespace containers tweeners that can update on any of the existing \r\n    /// times in unity. These objects can be passed in to allow updating at any one of those times. Lets say for \r\n    /// instance you've set the time scale of Normal time to 0 (to pause the game), but you still need the menu to \r\n    /// tween and update appropriately. Well, you'd use the 'RealTime' or a 'Custom' time object to update the \r\n    /// tween with instead of 'Normal'.\r\n    /// \r\n    /// An added feature includes stacking TimeScales. The Normal and Custom TimeSuppliers allow naming your time \r\n    /// scales so that you can compound them together. This way time scales don't overlap. Lets say you have an \r\n    /// effect where when swinging the sword that halves the time speed to look cool, but you also have a slomo effect \r\n    /// when an item is picked up for a duration of time. You expect the swords half speed to be half of the slomo \r\n    /// effect, not half of normal time, so that the sword looks right either way. This allows you to combine those \r\n    /// 2 with out having to test if one or the other is currently playing (or the scale of it playing). Which is \r\n    /// SUPER extra handy when tweening the time scale.\r\n    /// \r\n    /// \r\n    /// Instances of the class can be used as an inspector configurable reference to a ITimeSupplier. These configurable \r\n    /// instances are intended to be immutable once deserialized at runtime. Else the ITimeSupplier interface pass through \r\n    /// could add event callbacks to one time supplier, but later remove it from another.\r\n    /// </summary>\r\n    [System.Serializable()]\r\n    public struct SPTime : ITimeSupplier\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private DeltaTimeType _timeSupplierType;\r\n        [SerializeField()]\r\n        private string _timeSupplierName;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public SPTime(DeltaTimeType etp)\r\n        {\r\n            if (etp == DeltaTimeType.Custom) throw new System.ArgumentException(\"For custom time suppliers, you must specify it directly.\");\r\n            _timeSupplierType = etp;\r\n            _timeSupplierName = SPTime.GetTime(etp).Id;\r\n        }\r\n\r\n        public SPTime(ITimeSupplier ts)\r\n        {\r\n            if (ts == null) throw new System.ArgumentNullException(\"ts\");\r\n            _timeSupplierType = SPTime.GetDeltaType(ts);\r\n            _timeSupplierName = SPTime.GetValidatedId(ts);\r\n        }\r\n\r\n        public SPTime(DeltaTimeType etp, string timeSupplierName)\r\n        {\r\n            if(etp == DeltaTimeType.Custom)\r\n            {\r\n                if(SPTime.IsStandardTimeSupplier(timeSupplierName))\r\n                {\r\n                    var ts = SPTime.GetTime(timeSupplierName);\r\n                    _timeSupplierType = GetDeltaType(ts);\r\n                    _timeSupplierName = ts.Id;\r\n                }\r\n                else\r\n                {\r\n                    _timeSupplierType = DeltaTimeType.Custom;\r\n                    _timeSupplierName = timeSupplierName;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                _timeSupplierType = etp;\r\n                _timeSupplierName = SPTime.GetTime(etp).Id;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public DeltaTimeType TimeSupplierType\r\n        {\r\n            get { return _timeSupplierType; }\r\n        }\r\n\r\n        public string TimeSupplierName\r\n        {\r\n            get\r\n            {\r\n                if (_timeSupplierName != null) return _timeSupplierName;\r\n                else if (_timeSupplierType < DeltaTimeType.Custom) return SPTime.GetTime(_timeSupplierType).Id;\r\n                else return null;\r\n            }\r\n        }\r\n\r\n        public ITimeSupplier TimeSupplier\r\n        {\r\n            get\r\n            {\r\n                return SPTime.GetTime(_timeSupplierType, _timeSupplierName);\r\n            }\r\n            set\r\n            {\r\n                if (value == null) value = SPTime.Normal;\r\n                _timeSupplierType = SPTime.GetDeltaType(value);\r\n                _timeSupplierName = SPTime.GetValidatedId(value);\r\n            }\r\n        }\r\n        \r\n        public bool IsCustom\r\n        {\r\n            get { return _timeSupplierType == DeltaTimeType.Custom; }\r\n        }\r\n\r\n        public float Total\r\n        {\r\n            get\r\n            {\r\n                var ts = this.TimeSupplier;\r\n                if (ts != null)\r\n                    return ts.Total;\r\n                else\r\n                    return 0f;\r\n            }\r\n        }\r\n\r\n        public float Delta\r\n        {\r\n            get\r\n            {\r\n                var ts = this.TimeSupplier;\r\n                if (ts != null)\r\n                    return ts.Delta;\r\n                else\r\n                    return 0f;\r\n            }\r\n        }\r\n\r\n        public float Scale\r\n        {\r\n            get\r\n            {\r\n                var ts = this.TimeSupplier;\r\n                if (ts != null)\r\n                    return ts.Scale;\r\n                else\r\n                    return 0f;\r\n            }\r\n        }\r\n\r\n        public double TotalPrecise\r\n        {\r\n            get\r\n            {\r\n                var ts = this.TimeSupplier;\r\n                if (ts != null)\r\n                    return ts.TotalPrecise;\r\n                else\r\n                    return 0d;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITimSupplier Interface\r\n\r\n        string ITimeSupplier.Id { get { return _timeSupplierName; } }\r\n\r\n        //the rest are implicitly implemented\r\n\r\n        #endregion\r\n\r\n\r\n\r\n\r\n        #region Static Interface\r\n\r\n        #region Fields\r\n\r\n        private static Dictionary<string, ITimeSupplier> _registeredTimeSuppliers = new Dictionary<string, ITimeSupplier>();\r\n        private static HashSet<ICustomTimeSupplier> _customTimeSuppliers = new HashSet<ICustomTimeSupplier>();\r\n        private static NormalTimeSupplier _normalTime = new NormalTimeSupplier();\r\n        private static RealTimeSupplier _realTime = new RealTimeSupplier();\r\n        private static SmoothTimeSupplier _smoothTime = new SmoothTimeSupplier();\r\n\r\n        #endregion\r\n\r\n        #region Events\r\n\r\n        public static event System.Action<ITimeSupplier> TimeSupplierRemoved;\r\n\r\n        #endregion\r\n\r\n        #region Static Constructor\r\n\r\n        static SPTime()\r\n        {\r\n            _registeredTimeSuppliers[_normalTime.Id] = _normalTime;\r\n            _registeredTimeSuppliers[_realTime.Id] = _realTime;\r\n            _registeredTimeSuppliers[_smoothTime.Id] = _smoothTime;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        /// <summary>\r\n        /// Represents the normal update time, ala Time.time & Time.deltaTime.\r\n        /// </summary>\r\n        public static IScalableTimeSupplier Normal { get { return _normalTime; } }\r\n\r\n        /// <summary>\r\n        /// Represents the real update time, ala Time.unscaledTime.\r\n        /// </summary>\r\n        public static ITimeSupplier Real { get { return _realTime; } }\r\n\r\n        /// <summary>\r\n        /// Represents smooth delta time, ala Time.smoothDeltaTime.\r\n        /// </summary>\r\n        public static ITimeSupplier Smooth { get { return _smoothTime; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Returns true if the id is for any of the standard time suppliers.\r\n        /// </summary>\r\n        /// <param name=\"id\"></param>\r\n        /// <returns></returns>\r\n        public static bool IsStandardTimeSupplier(string id)\r\n        {\r\n            return _normalTime.Id == id || _realTime.Id == id || _smoothTime.Id == id;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Retrieve the ITimeSupplier for a specific DeltaTimeType, see com.spacepuppy.DeltaTimeType.\r\n        /// </summary>\r\n        /// <param name=\"etp\"></param>\r\n        /// <returns></returns>\r\n        public static ITimeSupplier GetTime(DeltaTimeType etp)\r\n        {\r\n            switch(etp)\r\n            {\r\n                case DeltaTimeType.Normal:\r\n                    return _normalTime;\r\n                case DeltaTimeType.Real:\r\n                    return _realTime;\r\n                case DeltaTimeType.Smooth:\r\n                    return _smoothTime;\r\n                default:\r\n                    return _registeredTimeSuppliers.Values.FirstOrDefault();\r\n            }\r\n        }\r\n\r\n        public static ITimeSupplier GetTime(DeltaTimeType etp, string id)\r\n        {\r\n            switch (etp)\r\n            {\r\n                case DeltaTimeType.Normal:\r\n                    return _normalTime;\r\n                case DeltaTimeType.Real:\r\n                    return _realTime;\r\n                case DeltaTimeType.Smooth:\r\n                    return _smoothTime;\r\n                default:\r\n                    {\r\n                        if (id == null) return null;\r\n                        ITimeSupplier ct;\r\n                        if (_registeredTimeSuppliers.TryGetValue(id, out ct))\r\n                        {\r\n                            return ct;\r\n                        }\r\n                        return null;\r\n                    }\r\n            }\r\n        }\r\n\r\n        public static ITimeSupplier GetTime(string id)\r\n        {\r\n            if (id == null) return null;\r\n\r\n            ITimeSupplier ts;\r\n            if (_registeredTimeSuppliers.TryGetValue(id, out ts))\r\n                return ts;\r\n            else\r\n                return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Reverse lookup for DeltaTimeType from an object.\r\n        /// </summary>\r\n        /// <param name=\"time\"></param>\r\n        /// <returns></returns>\r\n        public static DeltaTimeType GetDeltaType(ITimeSupplier time)\r\n        {\r\n            if (time == _normalTime)\r\n                return DeltaTimeType.Normal;\r\n            else if (time == _realTime)\r\n                return DeltaTimeType.Real;\r\n            else if (time == _smoothTime)\r\n                return DeltaTimeType.Smooth;\r\n            else\r\n                return DeltaTimeType.Custom;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Retrieve a TimeSupplier by id or create a CustomTimeSupplier if it doesn't exist.\r\n        /// </summary>\r\n        /// <param name=\"id\"></param>\r\n        /// <returns></returns>\r\n        public static T GetOrCreate<T>(string id) where T : class, ITimeSupplier\r\n        {\r\n            if (id == null) return null;\r\n\r\n            ITimeSupplier ts;\r\n            if(_registeredTimeSuppliers.TryGetValue(id, out ts))\r\n            {\r\n                return ts as T;\r\n            }\r\n            else\r\n            {\r\n                if(typeof(T).IsAssignableFrom(typeof(CustomTimeSupplier)))\r\n                {\r\n                    var ct = new CustomTimeSupplier(id);\r\n                    _registeredTimeSuppliers[id] = ct;\r\n                    if (_customTimeSuppliers.Count == 0) GameLoopEntry.RegisterInternalEarlyUpdate(SPTime.Update);\r\n                    _customTimeSuppliers.Add(ct);\r\n                    return ct as T;\r\n                }\r\n                else\r\n                {\r\n                    throw new System.ArgumentException(string.Format(\"Supplied type '{0}' can not have a CustomTimeSupplier auto created for it.\", typeof(T).FullName));\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void RegisterCustom(ITimeSupplier supplier)\r\n        {\r\n            if (supplier == null) throw new System.ArgumentNullException(\"supplier\");\r\n\r\n            string id = supplier.Id;\r\n            if (_registeredTimeSuppliers.ContainsKey(id)) throw new System.ArgumentException(string.Format(\"A timesupplier with id '{0}' already exists.\", id));\r\n\r\n            _registeredTimeSuppliers[id] = supplier;\r\n            if(supplier is ICustomTimeSupplier)\r\n            {\r\n                if (_customTimeSuppliers.Count == 0) GameLoopEntry.RegisterInternalEarlyUpdate(SPTime.Update);\r\n                _customTimeSuppliers.Add(supplier as ICustomTimeSupplier);\r\n            }\r\n        }\r\n\r\n        public static ITimeSupplier[] GetAll()\r\n        {\r\n            return _registeredTimeSuppliers.Values.ToArray();\r\n        }\r\n\r\n        public static ITimeSupplier[] GetAllCustom()\r\n        {\r\n            return _registeredTimeSuppliers.Values.Except(ArrayUtil.Temp<ITimeSupplier>(_normalTime, _realTime, _smoothTime)).ToArray();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns the Id of a time supplier as it is stored in the look up table. If the supplier is not managed, null is returned.\r\n        /// </summary>\r\n        /// <param name=\"supplier\"></param>\r\n        /// <returns></returns>\r\n        public static string GetValidatedId(ITimeSupplier supplier)\r\n        {\r\n            if (supplier == null) return null;\r\n\r\n            string id = supplier.Id;\r\n            ITimeSupplier ts;\r\n\r\n            if(supplier is SPTime)\r\n            {\r\n                var dtp = ((SPTime)supplier).TimeSupplierType;\r\n                supplier = SPTime.GetTime(dtp, id);\r\n                if (supplier == null) return null;\r\n                else if (dtp != DeltaTimeType.Custom) return supplier.Id;\r\n                else return id;\r\n            }\r\n            else if (_registeredTimeSuppliers.TryGetValue(id, out ts) && ts == supplier)\r\n            {\r\n                return id;\r\n            }\r\n\r\n            var e = _registeredTimeSuppliers.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                if (e.Current.Value == supplier || e.Current.Value.Id == id)\r\n                {\r\n                    return e.Current.Key;\r\n                }\r\n            }\r\n            return null;\r\n        }\r\n\r\n        public static bool HasTimeSupplier(string id)\r\n        {\r\n            if (id == null) return false;\r\n\r\n            return _registeredTimeSuppliers.ContainsKey(id);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Removes a CustomTimeSupplier from the update pool by name.\r\n        /// </summary>\r\n        /// <param name=\"id\"></param>\r\n        /// <returns></returns>\r\n        public static bool RemoveCustomTime(string id)\r\n        {\r\n            if (id == null) return false;\r\n\r\n            ITimeSupplier ts;\r\n            if(_registeredTimeSuppliers.TryGetValue(id, out ts) && GetDeltaType(ts) == DeltaTimeType.Custom)\r\n            {\r\n                _registeredTimeSuppliers.Remove(id);\r\n                var ct = ts as ICustomTimeSupplier;\r\n                if (ct != null) _customTimeSuppliers.Remove(ct);\r\n\r\n                SPTime.TimeSupplierRemoved?.Invoke(ts);\r\n\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Removes a CustomTimeSupplier from the update pool by reference.\r\n        /// </summary>\r\n        /// <param name=\"time\"></param>\r\n        /// <returns></returns>\r\n        public static bool RemoveCustomTime(ITimeSupplier supplier)\r\n        {\r\n            return RemoveCustomTime(GetValidatedId(supplier));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns the scale relative to NormalTime that would cause something updating by normal time appear at the scale of 'supplier'.\r\n        /// Basically if you have an Animation/Animator, which animates relative to Time.timeScale, and you want to set the 'speed' property of it \r\n        /// to a value so that it appeared at the speed that is defined in 'supplier', you'd set it to this value.\r\n        /// </summary>\r\n        /// <param name=\"supplier\"></param>\r\n        /// <returns></returns>\r\n        public static float GetInverseScale(ITimeSupplier supplier)\r\n        {\r\n            if (supplier == null) return 1f;\r\n            if (supplier is NormalTimeSupplier) return 1f;\r\n\r\n            return supplier.Scale / Time.timeScale;\r\n        }\r\n\r\n        private static void Update(bool isFixed)\r\n        {\r\n            if(_customTimeSuppliers.Count > 0)\r\n            {\r\n                var e = _customTimeSuppliers.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    e.Current.Update(isFixed);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                GameLoopEntry.UnregisterInternalEarlyUpdate(SPTime.Update);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private class NormalTimeSupplier : IScalableTimeSupplier\r\n        {\r\n\r\n            private bool _paused;\r\n            private Dictionary<string, float> _scales = new Dictionary<string, float>();\r\n\r\n            public event System.EventHandler TimeScaleChanged;\r\n\r\n            public string Id { get { return \"time.default.normal\"; } }\r\n\r\n            public float Total\r\n            {\r\n                get { return UnityEngine.Time.time; }\r\n            }\r\n\r\n            public double TotalPrecise\r\n            {\r\n                get { return (double)UnityEngine.Time.time; }\r\n            }\r\n\r\n            public float Delta\r\n            {\r\n                get { return UnityEngine.Time.deltaTime; }\r\n            }\r\n\r\n            public bool Paused\r\n            {\r\n                get { return _paused; }\r\n                set\r\n                {\r\n                    if (_paused == value) return;\r\n                    _paused = value;\r\n                    if (_paused)\r\n                    {\r\n                        UnityEngine.Time.timeScale = 0f;\r\n                    }\r\n                    else\r\n                    {\r\n                        this.SyncTimeScale();\r\n                    }\r\n                }\r\n            }\r\n\r\n            public float Scale\r\n            {\r\n                get\r\n                {\r\n                    return (_paused) ? this.GetTimeScale() : UnityEngine.Time.timeScale;\r\n                }\r\n            }\r\n\r\n            public IEnumerable<string> ScaleIds\r\n            {\r\n                get { return _scales.Keys; }\r\n            }\r\n\r\n            public void SetScale(string id, float scale)\r\n            {\r\n                _scales[id] = scale;\r\n                if(!_paused)\r\n                {\r\n                    this.SyncTimeScale();\r\n                }\r\n            }\r\n\r\n            public float GetScale(string id)\r\n            {\r\n                float result;\r\n                if(_scales.TryGetValue(id, out result))\r\n                {\r\n                    return result;\r\n                }\r\n                else\r\n                {\r\n                    return float.NaN;\r\n                }\r\n            }\r\n\r\n            public bool RemoveScale(string id)\r\n            {\r\n                if (_scales.Remove(id))\r\n                {\r\n                    if (!_paused)\r\n                    {\r\n                        this.SyncTimeScale();\r\n                    }\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            public bool HasScale(string id)\r\n            {\r\n                return _scales.ContainsKey(id);\r\n            }\r\n\r\n            private void SyncTimeScale()\r\n            {\r\n                float result = this.GetTimeScale();\r\n                \r\n                if (MathUtil.FuzzyEqual(result, UnityEngine.Time.timeScale))\r\n                {\r\n                    UnityEngine.Time.timeScale = result;\r\n                }\r\n                else\r\n                {\r\n                    UnityEngine.Time.timeScale = result;\r\n                    if (this.TimeScaleChanged != null) this.TimeScaleChanged(this, System.EventArgs.Empty);\r\n                }\r\n\r\n                if(Mathf.Approximately(result, UnityEngine.Time.timeScale))\r\n                {\r\n                    UnityEngine.Time.timeScale = result;\r\n                }\r\n                else\r\n                {\r\n                    UnityEngine.Time.timeScale = result;\r\n                    if (this.TimeScaleChanged != null) this.TimeScaleChanged(this, System.EventArgs.Empty);\r\n                }\r\n            }\r\n\r\n            private float GetTimeScale()\r\n            {\r\n                float result = 1f;\r\n                if (_scales.Count > 0)\r\n                {\r\n                    var e = _scales.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        result *= e.Current.Value;\r\n                    }\r\n                }\r\n                return result;\r\n            }\r\n\r\n        }\r\n\r\n        private class RealTimeSupplier : ITimeSupplier\r\n        {\r\n\r\n            public string Id { get { return \"time.default.real\"; } }\r\n\r\n            public float Total\r\n            {\r\n                get { return UnityEngine.Time.unscaledTime; }\r\n            }\r\n\r\n            public double TotalPrecise\r\n            {\r\n                get { return (double)UnityEngine.Time.unscaledTime; }\r\n            }\r\n\r\n            public float Delta\r\n            {\r\n                get { return UnityEngine.Time.unscaledDeltaTime; }\r\n            }\r\n\r\n            public float Scale\r\n            {\r\n                get\r\n                {\r\n                    return 1f;\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n        private class SmoothTimeSupplier : IScalableTimeSupplier\r\n        {\r\n\r\n            public string Id { get { return \"time.default.smooth\"; } }\r\n\r\n            public float Total\r\n            {\r\n                get { return UnityEngine.Time.time; }\r\n            }\r\n\r\n            public double TotalPrecise\r\n            {\r\n                get { return (double)UnityEngine.Time.time; }\r\n            }\r\n\r\n            public float Delta\r\n            {\r\n                get { return UnityEngine.Time.smoothDeltaTime; }\r\n            }\r\n\r\n            public float Scale\r\n            {\r\n                get\r\n                {\r\n                    return SPTime.Normal.Scale;\r\n                }\r\n            }\r\n\r\n            bool IScalableTimeSupplier.Paused\r\n            {\r\n                get\r\n                {\r\n                    return SPTime.Normal.Paused;\r\n                }\r\n                set\r\n                {\r\n                    throw new System.NotSupportedException();\r\n                }\r\n            }\r\n\r\n            IEnumerable<string> IScalableTimeSupplier.ScaleIds\r\n            {\r\n                get\r\n                {\r\n                    return SPTime.Normal.ScaleIds;\r\n                }\r\n            }\r\n\r\n            event System.EventHandler IScalableTimeSupplier.TimeScaleChanged\r\n            {\r\n                add\r\n                {\r\n                    SPTime.Normal.TimeScaleChanged += value;\r\n                }\r\n\r\n                remove\r\n                {\r\n                    SPTime.Normal.TimeScaleChanged -= value;\r\n                }\r\n            }\r\n\r\n            void IScalableTimeSupplier.SetScale(string id, float scale)\r\n            {\r\n                throw new System.NotSupportedException();\r\n            }\r\n\r\n            float IScalableTimeSupplier.GetScale(string id)\r\n            {\r\n                return SPTime.Normal.GetScale(id);\r\n            }\r\n\r\n            bool IScalableTimeSupplier.RemoveScale(string id)\r\n            {\r\n                throw new System.NotSupportedException();\r\n            }\r\n\r\n            bool IScalableTimeSupplier.HasScale(string id)\r\n            {\r\n                return SPTime.Normal.HasScale(id);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Config Types\r\n\r\n        [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n        public class Config : System.Attribute\r\n        {\r\n\r\n#region Fields\r\n\r\n            public string[] AvailableCustomTimeNames;\r\n\r\n#endregion\r\n\r\n            public Config(params string[] availableCustomTimeNames)\r\n            {\r\n                this.AvailableCustomTimeNames = availableCustomTimeNames;\r\n            }\r\n\r\n        }\r\n\r\n#endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/SPTimeEnums.cs",
    "content": "﻿using System;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// An enum for describing the different parts of the update pipeline.\r\n    /// </summary>\r\n    public enum UpdateSequence\r\n    {\r\n        None = -1,\r\n        Update = 0,\r\n        FixedUpdate = 1,\r\n        LateUpdate = 2\r\n    }\r\n\r\n    /// <summary>\r\n    /// An enum for representing the different TimeSuppliers out there. Useful for \r\n    /// components that need to serialize which TimeSupplier to use.\r\n    /// </summary>\r\n    public enum DeltaTimeType\r\n    {\r\n        Normal = 0,\r\n        Real = 1,\r\n        Smooth = 2,\r\n        Custom = 3\r\n    }\r\n\r\n    public enum TimeUnits\r\n    {\r\n        Seconds = 0,\r\n        Minutes = 1,\r\n        Hours = 2,\r\n        Days = 3,\r\n        Years = 4\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/SPTimePeriod.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    [System.Serializable()]\r\n    public struct SPTimePeriod\r\n    {\r\n\r\n        public static SPTimePeriod Zero { get { return new SPTimePeriod(0f); } }\r\n\r\n        public const float SECONDS_IN_MINUTE = 60f;\r\n        public const float SECONDS_IN_HOUR = 3600f;\r\n        public const float SECONDS_IN_DAY = 86400f;\r\n        public const float SECONDS_IN_WEEK = 604800;\r\n\r\n\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private float _seconds;\r\n\r\n        [SerializeField()]\r\n        private DeltaTimeType _timeSupplierType;\r\n        [SerializeField()]\r\n        private string _timeSupplierName;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public SPTimePeriod(float seconds)\r\n        {\r\n            _seconds = seconds;\r\n            _timeSupplierType = DeltaTimeType.Normal;\r\n            _timeSupplierName = SPTime.Normal.Id;\r\n        }\r\n\r\n        public SPTimePeriod(float seconds, SPTime time)\r\n        {\r\n            _seconds = seconds;\r\n            _timeSupplierType = time.TimeSupplierType;\r\n            _timeSupplierName = time.TimeSupplierName;\r\n        }\r\n\r\n        public SPTimePeriod(float seconds, ITimeSupplier supplier)\r\n        {\r\n            _seconds = seconds;\r\n            _timeSupplierType = SPTime.GetDeltaType(supplier);\r\n            _timeSupplierName = SPTime.GetValidatedId(supplier);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float Seconds\r\n        {\r\n            get { return _seconds; }\r\n            set { _seconds = value; }\r\n        }\r\n\r\n        public DeltaTimeType TimeSupplierType\r\n        {\r\n            get { return _timeSupplierType; }\r\n        }\r\n\r\n        public string TimeSupplierName\r\n        {\r\n            get { return _timeSupplierName; }\r\n        }\r\n\r\n        public ITimeSupplier TimeSupplier\r\n        {\r\n            get\r\n            {\r\n                return SPTime.GetTime(_timeSupplierType, _timeSupplierName);\r\n            }\r\n            set\r\n            {\r\n                if (value == null) value = SPTime.Normal;\r\n                _timeSupplierType = SPTime.GetDeltaType(value);\r\n                _timeSupplierName = SPTime.GetValidatedId(value);\r\n            }\r\n        }\r\n\r\n        public bool IsCustom\r\n        {\r\n            get { return _timeSupplierType == DeltaTimeType.Custom; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public bool Elapsed(double startTime)\r\n        {\r\n            var time = this.TimeSupplier;\r\n            if (time == null) return false;\r\n            return (time.TotalPrecise - startTime) >= _seconds;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple=false)]\r\n        public class Config : SPTime.Config\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Conversion\r\n\r\n        public static implicit operator SPTime(SPTimePeriod period)\r\n        {\r\n            return new SPTime(period._timeSupplierType, period._timeSupplierName);\r\n        }\r\n\r\n        public static implicit operator SPTimePeriod(float seconds)\r\n        {\r\n            return new SPTimePeriod(seconds);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/ActivateEvent.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    [System.Flags()]\r\n    public enum ActivateEvent\r\n    {\r\n        None = 0,\r\n        OnStart = 1,\r\n        OnEnable = 2,\r\n        OnStartOrEnable = 3,\r\n        Awake = 4,\r\n        OnDisable = 8\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/AutoTriggerComponent.cs",
    "content": "﻿using UnityEngine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public abstract class AutoTriggerComponent : TriggerComponent\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private ActivateEvent _activateOn = ActivateEvent.OnStartOrEnable;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            if ((_activateOn & ActivateEvent.Awake) != 0)\r\n            {\r\n                this.OnTriggerActivate();\r\n            }\r\n        }\r\n\r\n        protected override void Start()\r\n        {\r\n            base.Start();\r\n\r\n            if ((_activateOn & ActivateEvent.OnStart) != 0 || (_activateOn & ActivateEvent.OnEnable) != 0)\r\n            {\r\n                this.OnTriggerActivate();\r\n            }\r\n        }\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            if (!this.started) return;\r\n\r\n            if ((_activateOn & ActivateEvent.OnEnable) != 0)\r\n            {\r\n                this.OnTriggerActivate();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ActivateEvent ActivateOn\r\n        {\r\n            get { return _activateOn; }\r\n            set { _activateOn = value; }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Override this to start the trigger sequence on start/enable, depending configuration.\r\n        /// </summary>\r\n        protected abstract void OnTriggerActivate();\r\n        \r\n        #endregion\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/AutoTriggerableMechanism.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public abstract class AutoTriggerableMechanism : TriggerableMechanism\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private ActivateEvent _activateOn = ActivateEvent.None;\r\n\r\n        [System.NonSerialized]\r\n        private bool _inDisable;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            if((_activateOn & ActivateEvent.Awake) != 0)\r\n            {\r\n                this.Trigger(this, null);\r\n            }\r\n        }\r\n\r\n        protected override void Start()\r\n        {\r\n            base.Start();\r\n\r\n            if ((_activateOn & ActivateEvent.OnStart) != 0 || (_activateOn & ActivateEvent.OnEnable) != 0)\r\n            {\r\n                this.Trigger(this, null);\r\n            }\r\n        }\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            if (!this.started) return;\r\n\r\n            if ((_activateOn & ActivateEvent.OnEnable) != 0)\r\n            {\r\n                this.Trigger(this, null);\r\n            }\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n            \r\n            if((_activateOn & ActivateEvent.OnDisable) != 0)\r\n            {\r\n                _inDisable = true;\r\n                this.Trigger(this, null);\r\n                _inDisable = false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ActivateEvent ActivateOn\r\n        {\r\n            get { return _activateOn; }\r\n            set { _activateOn = value; }\r\n        }\r\n\r\n        public override bool CanTrigger\r\n        {\r\n            get\r\n            {\r\n                return _inDisable || base.CanTrigger;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/Comparers.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class TriggerableMechanismOrderComparer : System.Collections.IComparer, System.Collections.Generic.IComparer<ITriggerableMechanism>\r\n    {\r\n\r\n        private static TriggerableMechanismOrderComparer _default;\r\n        public static TriggerableMechanismOrderComparer Default\r\n        {\r\n            get\r\n            {\r\n                if (_default == null) _default = new TriggerableMechanismOrderComparer();\r\n                return _default;\r\n            }\r\n        }\r\n\r\n        int System.Collections.IComparer.Compare(object x, object y)\r\n        {\r\n            ITriggerableMechanism a = x as ITriggerableMechanism;\r\n            ITriggerableMechanism b = y as ITriggerableMechanism;\r\n            if (a == null) return b == null ? 0 : -1;\r\n            if (b == null) return -1;\r\n            return a.Order.CompareTo(b.Order);\r\n        }\r\n\r\n        public int Compare(ITriggerableMechanism x, ITriggerableMechanism y)\r\n        {\r\n            if (x == null) return y == null ? 0 : -1;\r\n            if (y == null) return -1;\r\n            return x.Order.CompareTo(y.Order);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/EventTriggerEvaluator.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing com.spacepuppy.Dynamic;\nusing com.spacepuppy.Project;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Scenario\n{\n\n    public sealed class EventTriggerEvaluator : EventTriggerEvaluator.IEvaluator\n    {\n\n        #region Singleton Interface\n\n        private static EventTriggerEvaluator _default = new EventTriggerEvaluator();\n        private static IEvaluator _evaluator;\n\n        public static EventTriggerEvaluator Default\n        {\n            get { return _default; }\n        }\n\n        public static IEvaluator Current\n        {\n            get { return _evaluator; }\n        }\n\n        public static void SetCurrentEvaluator(IEvaluator ev)\n        {\n            _evaluator = ev ?? _default;\n        }\n\n        static EventTriggerEvaluator()\n        {\n            _evaluator = _default;\n        }\n        \n        #endregion\n        \n        #region Methods\n\n        private ITriggerableMechanism[] GetCache(GameObject go)\n        {\n            //we don't trigger inactive GameObjects unless they are prefabs\n\n            EventTriggerCache cache;\n            if (go.activeInHierarchy)\n            {\n                cache = go.AddOrGetComponent<EventTriggerCache>();\n                return cache.Targets ?? cache.RefreshCache();\n            }\n            else if (go.HasComponent<PrefabToken>())\n            {\n                cache = go.GetComponent<EventTriggerCache>();\n                if (cache != null) return cache.Targets ?? cache.RefreshCache();\n\n                return go.GetComponents<ITriggerableMechanism>();\n            }\n            else\n            {\n                return ArrayUtil.Empty<ITriggerableMechanism>();\n            }\n        }\n\n\n        public void GetAllTriggersOnTarget(object target, List<ITriggerableMechanism> outputColl)\n        {\n            if (target is IProxy) target = (target as IProxy).GetTarget();\n            var go = GameObjectUtil.GetGameObjectFromSource(target);\n            if (go != null)\n            {\n                outputColl.AddRange(this.GetCache(go));\n            }\n            else if (target is ITriggerableMechanism)\n                outputColl.Add(target as ITriggerableMechanism);\n        }\n\n        public void TriggerAllOnTarget(object target, object sender, object arg, BlockingTriggerYieldInstruction instruction = null)\n        {\n            if (target is IProxy) target = (target as IProxy).GetTarget();\n            var go = GameObjectUtil.GetGameObjectFromSource(target);\n            if (go != null)\n            {\n                var arr = this.GetCache(go);\n\n                if (instruction != null)\n                {\n                    foreach (var t in arr)\n                    {\n                        if (t.CanTrigger)\n                        {\n                            if (t is IBlockingTriggerableMechanism)\n                                (t as IBlockingTriggerableMechanism).Trigger(sender, arg, instruction);\n                            else\n                                t.Trigger(sender, arg);\n                        }\n                    }\n                }\n                else\n                {\n                    foreach (var t in arr)\n                    {\n                        if (t.CanTrigger)\n                        {\n                            t.Trigger(sender, arg);\n                        }\n                    }\n                }\n            }\n            else\n            {\n                var targ = target as ITriggerableMechanism;\n                if (targ != null)\n                {\n                    if (instruction != null)\n                    {\n                        if (targ.CanTrigger)\n                        {\n                            if (targ is IBlockingTriggerableMechanism)\n                                (targ as IBlockingTriggerableMechanism).Trigger(sender, arg, instruction);\n                            else\n                                targ.Trigger(sender, arg);\n                        }\n                    }\n                    else\n                    {\n                        if (targ.CanTrigger)\n                        {\n                            targ.Trigger(sender, arg);\n                        }\n                    }\n                }\n            }\n        }\n\n        public void TriggerSelectedTarget(object target, object sender, object arg, BlockingTriggerYieldInstruction instruction = null)\n        {\n            if (target is IProxy) target = (target as IProxy).GetTarget();\n            if (target != null && target is ITriggerableMechanism)\n            {\n                if (instruction != null && target is IBlockingTriggerableMechanism)\n                {\n                    var t = target as IBlockingTriggerableMechanism;\n                    if (t.CanTrigger) t.Trigger(sender, arg);\n                }\n                else\n                {\n                    var t = target as ITriggerableMechanism;\n                    if (t.CanTrigger) t.Trigger(sender, arg);\n                }\n            }\n        }\n\n        public void SendMessageToTarget(object target, string message, object arg)\n        {\n            var go = GameObjectUtil.GetGameObjectFromSource(target, true);\n            if (go != null && message != null)\n            {\n                go.SendMessage(message, arg, SendMessageOptions.DontRequireReceiver);\n            }\n        }\n\n        public void CallMethodOnSelectedTarget(object target, string methodName, VariantReference[] methodArgs)\n        {\n            if (target is IProxy) target = (target as IProxy).GetTarget();\n            if (methodName != null)\n            {\n                //CallMethod does not support using the passed in arg\n                //var args = (from a in this._triggerableArgs select (a != null) ? a.Value : null).ToArray();\n\n                object[] args = null;\n                if (methodArgs != null && methodArgs.Length > 0)\n                {\n                    args = new object[methodArgs.Length];\n                    for (int i = 0; i < args.Length; i++)\n                    {\n                        if (methodArgs[i] != null) args[i] = methodArgs[i].Value;\n                    }\n                }\n\n                if (args != null && args.Length == 1)\n                {\n                    DynamicUtil.SetValue(target, methodName, args[0]);\n                }\n                else\n                {\n                    DynamicUtil.InvokeMethod(target, methodName, args);\n                }\n            }\n        }\n\n        public void EnableTarget(object target, EnableMode mode)\n        {\n            var go = GameObjectUtil.GetGameObjectFromSource(target, true);\n            if (go != null)\n            {\n                switch (mode)\n                {\n                    case EnableMode.Disable:\n                        go.SetActive(false);\n                        break;\n                    case EnableMode.Enable:\n                        go.SetActive(true);\n                        break;\n                    case EnableMode.Toggle:\n                        go.SetActive(!go.activeSelf);\n                        break;\n                }\n            }\n        }\n\n        public void DestroyTarget(object target)\n        {\n            if (target is IProxy) target = (target as IProxy).GetTarget();\n            var go = GameObjectUtil.GetGameObjectFromSource(target);\n            if (go != null)\n            {\n                ObjUtil.SmartDestroy(go);\n            }\n            else if (target is UnityEngine.Object)\n            {\n                ObjUtil.SmartDestroy(target as UnityEngine.Object);\n            }\n        }\n\n        #endregion\n\n        #region Special Types\n\n        private class EventTriggerCache : MonoBehaviour\n        {\n\n            #region Fields\n\n            private ITriggerableMechanism[] _targets;\n\n            #endregion\n\n            #region Properties\n\n            public ITriggerableMechanism[] Targets\n            {\n                get { return _targets; }\n            }\n\n            #endregion\n\n            #region Methods\n\n            private void Awake()\n            {\n                this.RefreshCache();\n            }\n\n            public ITriggerableMechanism[] RefreshCache()\n            {\n                _targets = this.gameObject.GetComponents<ITriggerableMechanism>();\n                if (_targets.Length > 1)\n                    System.Array.Sort(_targets, TriggerableMechanismOrderComparer.Default);\n                return _targets;\n            }\n\n            #endregion\n\n        }\n\n        public interface IEvaluator\n        {\n            \n            void GetAllTriggersOnTarget(object target, List<ITriggerableMechanism> outputColl);\n\n            void TriggerAllOnTarget(object target, object sender, object arg, BlockingTriggerYieldInstruction instruction = null);\n            void TriggerSelectedTarget(object target, object sender, object arg, BlockingTriggerYieldInstruction instruction = null);\n            void SendMessageToTarget(object target, string message, object arg);\n            void CallMethodOnSelectedTarget(object target, string methodName, VariantReference[] methodArgs);\n            void EnableTarget(object target, EnableMode mode);\n            void DestroyTarget(object target);\n\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/HijackTriggerEvents.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\nusing UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Scenario\n{\n\n    public class HijackTriggerEvents : SPComponent, IObservableTrigger\n    {\n\n        #region Fields\n\n        [SerializeField]\n        [ReorderableArray]\n        private ObservableTargetData[] _targets;\n\n        [SerializeField]\n        private Trigger _onHijacked;\n\n        [SerializeField]\n        [Tooltip(\"If true the target won't be purged of its listeners when hijacked.\")]\n        private bool _dontOverrideTargets;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        protected override void OnStartOrEnable()\n        {\n            base.OnStartOrEnable();\n\n            foreach (var t in _targets)\n            {\n                t.Init();\n                t.TriggerActivated += this.OnHijackedEventActivated;\n                if(!_dontOverrideTargets) t.BeginHijack();\n            }\n        }\n\n        protected override void OnDisable()\n        {\n            base.OnDisable();\n\n            foreach (var t in _targets)\n            {\n                t.TriggerActivated -= this.OnHijackedEventActivated;\n                t.EndHijack();\n                t.DeInit();\n            }\n        }\n\n        #endregion\n\n        #region Properties\n\n        public Trigger OnHijacked\n        {\n            get { return _onHijacked; }\n        }\n\n        public bool DontOverrideTargets\n        {\n            get { return _dontOverrideTargets; }\n            set { _dontOverrideTargets = value; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        private void OnHijackedEventActivated(object sender, TempEventArgs e)\n        {\n            _onHijacked.ActivateTrigger(this, e.Value);\n        }\n\n        #endregion\n\n        #region IObservableTrigger Interface\n\n        Trigger[] IObservableTrigger.GetTriggers()\n        {\n            return new Trigger[] { _onHijacked };\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/IAutoSequenceSignal.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public interface IAutoSequenceSignal\r\n    {\r\n\r\n        IRadicalWaitHandle Wait();\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/IObservableTrigger.cs",
    "content": "﻿namespace com.spacepuppy.Scenario\r\n{\r\n\r\n    /// <summary>\r\n    /// A trigger that can be observed by other triggers for activation. \r\n    /// </summary>\r\n    public interface IObservableTrigger\r\n    {\r\n\r\n        /// <summary>\r\n        /// Returns an array of all events that may trigger.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        Trigger[] GetTriggers();\r\n\r\n    }\r\n\r\n    /// <summary>\r\n    /// A trigger that can be observed by other triggers. Of which 2 of the events that may trigger are an Enter and Exit state. \r\n    /// Think like a collider enter/exit, or a mouse enter/exit, or other event where there is a start and end.\r\n    /// </summary>\r\n    public interface IOccupiedTrigger : IObservableTrigger\r\n    {\r\n\r\n        Trigger EnterTrigger { get; }\r\n        Trigger ExitTrigger { get; }\r\n        bool IsOccupied { get; }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/ITriggerable.cs",
    "content": "﻿namespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public interface ITriggerableMechanism\r\n    {\r\n\r\n        int Order { get; }\r\n        /// <summary>\r\n        /// For consistent behaviour this should return false if 'isActiveAndEnabled' is false.\r\n        /// </summary>\r\n        bool CanTrigger { get; }\r\n        bool Trigger(object sender, object arg);\r\n\r\n    }\r\n\r\n    public interface IBlockingTriggerableMechanism : ITriggerableMechanism\r\n    {\r\n        \r\n        bool Trigger(object sender, object arg, BlockingTriggerYieldInstruction instruction);\r\n\r\n    }\r\n    \r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/ObservableTargetData.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    [System.Serializable()]\r\n    public class ObservableTargetData\r\n    {\r\n\r\n        public System.EventHandler<TempEventArgs> TriggerActivated;\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        [TypeRestriction(typeof(IObservableTrigger))]\r\n        private UnityEngine.Object _target;\r\n\r\n        [SerializeField]\r\n        private int _triggerIndex;\r\n\r\n\r\n        [System.NonSerialized]\r\n        private bool _initialized;\r\n        [System.NonSerialized()]\r\n        private BaseSPEvent _targetEvent;\r\n        \r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        /// <summary>\r\n        /// The object being observed.\r\n        /// \r\n        /// If you set this after hijacking/adding a handler. You may need to call Init and recall 'BeginHijack'.\r\n        /// </summary>\r\n        public IObservableTrigger Target\r\n        {\r\n            get { return _target as IObservableTrigger; }\r\n            set\r\n            {\r\n                var targ = value as UnityEngine.Object;\r\n                if (targ == _target) return;\r\n\r\n                this.DeInit();\r\n                _target = targ;\r\n                _initialized = false;\r\n                _targetEvent = null;\r\n            }\r\n        }\r\n\r\n        public int TriggerIndex\r\n        {\r\n            get { return _triggerIndex; }\r\n            set { _triggerIndex = value; }\r\n        }\r\n\r\n        public BaseSPEvent TargetEvent\r\n        {\r\n            get\r\n            {\r\n                if (!_initialized) this.Init();\r\n                return _targetEvent;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Init()\r\n        {\r\n            if (_initialized) return;\r\n\r\n            _initialized = true;\r\n            if(_triggerIndex >= 0 && _target is IObservableTrigger)\r\n            {\r\n                var arr = (_target as IObservableTrigger).GetTriggers();\r\n                if (arr != null && _triggerIndex < arr.Length)\r\n                {\r\n                    _targetEvent = arr[_triggerIndex];\r\n                    if (_targetEvent != null) _targetEvent.TriggerActivated += this.OnTriggerActivated;\r\n                }\r\n            }\r\n        }\r\n\r\n        public void DeInit()\r\n        {\r\n            if(_targetEvent != null)\r\n            {\r\n                _targetEvent.EndHijack(this);\r\n                _targetEvent.TriggerActivated -= this.OnTriggerActivated;\r\n                _targetEvent = null;\r\n            }\r\n            _initialized = false;\r\n        }\r\n        \r\n        public bool BeginHijack()\r\n        {\r\n            if (!_initialized) this.Init();\r\n\r\n            if (_targetEvent == null) return false;\r\n\r\n            _targetEvent.BeginHijack(this);\r\n            return true;\r\n        }\r\n\r\n        public void EndHijack()\r\n        {\r\n            if(_targetEvent != null)\r\n            {\r\n                _targetEvent.EndHijack(this);\r\n            }\r\n        }\r\n\r\n        private void OnTriggerActivated(object sender, TempEventArgs e)\r\n        {\r\n            this.TriggerActivated?.Invoke(this, e);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n    \r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/ScenarioActivatorMask.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    [System.Serializable()]\r\n    public class ScenarioActivatorMask\r\n    {\r\n\r\n        #region Fields\r\n\r\n        public bool TestRoot = false;\r\n\r\n        [SerializeField()]\r\n        private LayerMask _layerMask = -1;\r\n\r\n        [SerializeField()]\r\n        [ReorderableArray]\r\n        [TagSelector()]\r\n        private string[] _tags;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public ScenarioActivatorMask(LayerMask mask)\r\n        {\r\n            _layerMask = mask;\r\n        }\r\n\r\n        public ScenarioActivatorMask(string[] tags)\r\n        {\r\n            _tags = tags;\r\n        }\r\n\r\n        public ScenarioActivatorMask(LayerMask mask, string[] tags)\r\n        {\r\n            _layerMask = mask;\r\n            _tags = tags;\r\n        }\r\n\r\n        public ScenarioActivatorMask(LayerMask mask, bool bTestRoot)\r\n        {\r\n            _layerMask = mask;\r\n            this.TestRoot = bTestRoot;\r\n        }\r\n\r\n        public ScenarioActivatorMask(string[] tags, bool bTestRoot)\r\n        {\r\n            _tags = tags;\r\n            this.TestRoot = bTestRoot;\r\n        }\r\n\r\n        public ScenarioActivatorMask(LayerMask mask, string[] tags, bool bTestRoot)\r\n        {\r\n            _layerMask = mask;\r\n            _tags = tags;\r\n            this.TestRoot = bTestRoot;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public LayerMask LayerMask\r\n        {\r\n            get { return _layerMask; }\r\n            set { _layerMask = value; }\r\n        }\r\n\r\n        public string[] Tags\r\n        {\r\n            get { return _tags; }\r\n            set { _tags = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public bool Intersects(GameObject go)\r\n        {\r\n            if (go == null) return false;\r\n\r\n            if(this.TestRoot) go = go.FindRoot();\r\n\r\n            return go.IntersectsLayerMask(_layerMask) && (_tags == null || _tags.Length == 0 || go.HasTag(_tags));\r\n        }\r\n\r\n        public bool Intersects(Component comp)\r\n        {\r\n            if (comp == null) return false;\r\n            return Intersects(comp.gameObject);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/Trigger.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing System;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    [System.Serializable()]\r\n    public abstract class BaseSPEvent : ICollection<TriggerTarget>\r\n    {\r\n\r\n        public const string ID_DEFAULT = \"Trigger\";\r\n\r\n        #region Events\r\n\r\n        protected System.EventHandler<TempEventArgs> _triggerActivated;\r\n        public event System.EventHandler<TempEventArgs> TriggerActivated\r\n        {\r\n            add\r\n            {\r\n                _triggerActivated += value;\r\n            }\r\n            remove\r\n            {\r\n                _triggerActivated -= value;\r\n            }\r\n        }\r\n        protected virtual void OnTriggerActivated(object sender, object arg)\r\n        {\r\n            if (_triggerActivated != null)\r\n            {\r\n                var e = TempEventArgs.Create(arg);\r\n                var d = _triggerActivated;\r\n                d(sender, e);\r\n                TempEventArgs.Release(e);\r\n            }\r\n\r\n            //if(_owner != null)\r\n            //{\r\n            //    _owner.PostNotification<TriggerActivatedNotification>(new TriggerActivatedNotification(_owner, _id), false);\r\n            //}\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private bool _yield;\r\n\r\n        [SerializeField()]\r\n        private List<TriggerTarget> _targets = new List<TriggerTarget>();\r\n        \r\n        [System.NonSerialized()]\r\n        private string _id;\r\n\r\n\r\n        [System.NonSerialized]\r\n        private HashSet<object> _hijackTokens;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public BaseSPEvent()\r\n        {\r\n            _id = ID_DEFAULT;\r\n        }\r\n\r\n        public BaseSPEvent(string id)\r\n        {\r\n            _id = id;\r\n        }\r\n        \r\n        public BaseSPEvent(bool yielding)\r\n        {\r\n            _id = ID_DEFAULT;\r\n            _yield = yielding;\r\n        }\r\n\r\n        public BaseSPEvent(string id, bool yielding)\r\n        {\r\n            _id = id;\r\n            _yield = yielding;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool Yielding\r\n        {\r\n            get { return _yield; }\r\n            set { _yield = value; }\r\n        }\r\n        \r\n        public string ObservableTriggerId\r\n        {\r\n            get { return _id; }\r\n            set { _id = value; }\r\n        }\r\n\r\n        public List<TriggerTarget> Targets\r\n        {\r\n            get { return _targets; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Count is total count of targets including the TriggerActivated event. \r\n        /// Check the count of 'Targets' for the direct targets only.\r\n        /// </summary>\r\n        public virtual int Count\r\n        {\r\n            get\r\n            {\r\n                if (_triggerActivated != null)\r\n                    return _targets.Count + 1;\r\n                else\r\n                    return _targets.Count;\r\n            }\r\n        }\r\n\r\n        public bool CurrentlyHijacked\r\n        {\r\n            get { return _hijackTokens != null && _hijackTokens.Count > 0; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n        \r\n        public TriggerTarget AddNew()\r\n        {\r\n            var targ = new TriggerTarget();\r\n            _targets.Add(targ);\r\n            return targ;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Begins a hijack, when a trigger is hijacked none of its targets are triggered, but its TriggerActivated event still fires. \r\n        /// If tokens are passed in it allows compounded hijacking so that just because one caller ends the hijack, another can still continue hijacking.\r\n        /// </summary>\r\n        /// <param name=\"token\"></param>\r\n        public void BeginHijack(object token = null)\r\n        {\r\n            if (token == null) token = \"*DEFAULT*\";\r\n\r\n            if (_hijackTokens == null) _hijackTokens = new HashSet<object>();\r\n            _hijackTokens.Add(token);\r\n        }\r\n        \r\n        /// <summary>\r\n        /// Attempts to stop a hijack, but if more than one token has been used to hijack the event it may continue hijacking.\r\n        /// </summary>\r\n        /// <param name=\"token\"></param>\r\n        /// <returns>Returns true if the trigger is no longer hijacked after calling this</returns>\r\n        public bool EndHijack(object token = null)\r\n        {\r\n            if (_hijackTokens == null) return true;\r\n            \r\n            _hijackTokens.Remove(token ?? \"*DEFAULT*\");\r\n            return _hijackTokens.Count == 0;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Forces the end of a hijack.\r\n        /// </summary>\r\n        public void ForceEndHijack()\r\n        {\r\n            if (_hijackTokens != null) _hijackTokens.Clear();\r\n        }\r\n\r\n\r\n\r\n        protected void ActivateTrigger(object sender, object arg)\r\n        {\r\n            if (_targets.Count > 0 && !this.CurrentlyHijacked)\r\n            {\r\n                var e = _targets.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (e.Current != null) e.Current.Trigger(sender, arg);\r\n                }\r\n            }\r\n\r\n            this.OnTriggerActivated(sender, arg);\r\n        }\r\n\r\n        protected void ActivateTriggerAt(int index, object sender, object arg)\r\n        {\r\n            if (index >= 0 && index < _targets.Count && !this.CurrentlyHijacked)\r\n            {\r\n                TriggerTarget trig = _targets[index];\r\n                if(trig != null) trig.Trigger(sender, arg);\r\n            }\r\n\r\n            this.OnTriggerActivated(sender, arg);\r\n        }\r\n\r\n        protected void ActivateRandomTrigger(object sender, object arg, bool considerWeights, bool selectOnlyIfActive)\r\n        {\r\n            if (_targets.Count > 0 && !this.CurrentlyHijacked)\r\n            {\r\n                TriggerTarget trig;\r\n                if (selectOnlyIfActive)\r\n                {\r\n                    using (var lst = TempCollection.GetList<TriggerTarget>())\r\n                    {\r\n                        for(int i = 0; i < _targets.Count; i++)\r\n                        {\r\n                            var go = GameObjectUtil.GetGameObjectFromSource(_targets[i].CalculateTarget(arg));\r\n                            if (object.ReferenceEquals(go, null) || go.IsAliveAndActive()) lst.Add(_targets[i]);\r\n                        }\r\n                        trig = (considerWeights) ? lst.PickRandom((t) => { return t.Weight; }) : lst.PickRandom();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    trig = (considerWeights) ? _targets.PickRandom((t) => { return t.Weight; }) : _targets.PickRandom();\r\n                }\r\n                if (trig != null) trig.Trigger(sender, arg);\r\n            }\r\n\r\n            this.OnTriggerActivated(sender, arg);\r\n        }\r\n\r\n        protected IRadicalYieldInstruction ActivateTriggerYielding(object sender, object arg)\r\n        {\r\n            if (_yield && _targets.Count > 0 && !this.CurrentlyHijacked)\r\n            {\r\n                var instruction = BlockingTriggerYieldInstruction.Create();\r\n\r\n                var e = _targets.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (e.Current != null) e.Current.Trigger(sender, arg);\r\n                }\r\n\r\n                this.OnTriggerActivated(sender, arg);\r\n\r\n                return (instruction.Count > 0) ? instruction : null;\r\n            }\r\n            else\r\n            {\r\n                if (_targets.Count > 0 && !this.CurrentlyHijacked)\r\n                {\r\n                    var e = _targets.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (e.Current != null) e.Current.Trigger(sender, arg);\r\n                    }\r\n                }\r\n\r\n                this.OnTriggerActivated(sender, arg);\r\n\r\n                return null;\r\n            }\r\n        }\r\n\r\n\r\n        protected void DaisyChainTriggerYielding(object sender, object arg, BlockingTriggerYieldInstruction instruction)\r\n        {\r\n            if (_targets.Count > 0 && !this.CurrentlyHijacked)\r\n            {\r\n                var e = _targets.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (e.Current != null) e.Current.Trigger(sender, arg);\r\n                }\r\n\r\n                this.OnTriggerActivated(sender, arg);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        public void Add(TriggerTarget item)\r\n        {\r\n            _targets.Add(item);\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _targets.Clear();\r\n        }\r\n\r\n        public bool Contains(TriggerTarget item)\r\n        {\r\n            return _targets.Contains(item);\r\n        }\r\n\r\n        public void CopyTo(TriggerTarget[] array, int arrayIndex)\r\n        {\r\n            _targets.CopyTo(array, arrayIndex);\r\n        }\r\n\r\n        int ICollection<TriggerTarget>.Count\r\n        {\r\n            get\r\n            {\r\n                return _targets.Count;\r\n            }\r\n        }\r\n\r\n        bool ICollection<TriggerTarget>.IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        public bool Remove(TriggerTarget item)\r\n        {\r\n            return _targets.Remove(item);\r\n        }\r\n\r\n        public Enumerator GetEnumerator()\r\n        {\r\n            //return _targets.GetEnumerator();\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator<TriggerTarget> IEnumerable<TriggerTarget>.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region Special Types\r\n\r\n        public struct Enumerator : IEnumerator<TriggerTarget>\r\n        {\r\n\r\n            private List<TriggerTarget>.Enumerator _e;\r\n\r\n            public Enumerator(BaseSPEvent t)\r\n            {\r\n                _e = t._targets.GetEnumerator();\r\n            }\r\n\r\n            public TriggerTarget Current\r\n            {\r\n                get { return _e.Current; }\r\n            }\r\n\r\n            object System.Collections.IEnumerator.Current\r\n            {\r\n                get { return _e.Current; }\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                return _e.MoveNext();\r\n            }\r\n\r\n            void System.Collections.IEnumerator.Reset()\r\n            {\r\n                (_e as IEnumerator<TriggerTarget>).Reset();\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                _e.Dispose();\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n\r\n    [System.Serializable()]\r\n    public class SPEvent : BaseSPEvent\r\n    {\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public SPEvent()\r\n        {\r\n        }\r\n\r\n        public SPEvent(string id) : base(id)\r\n        {\r\n        }\r\n\r\n        public SPEvent(bool yielding) : base(yielding)\r\n        {\r\n        }\r\n\r\n        public SPEvent(string id, bool yielding) : base(id, yielding)\r\n        {\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public new void ActivateTrigger(object sender, object arg)\r\n        {\r\n            base.ActivateTrigger(sender, arg);\r\n        }\r\n\r\n        public new void ActivateTriggerAt(int index, object sender, object arg)\r\n        {\r\n            base.ActivateTriggerAt(index, sender, arg);\r\n        }\r\n\r\n        public new void ActivateRandomTrigger(object sender, object arg, bool considerWeights, bool selectOnlyIfActive)\r\n        {\r\n            base.ActivateRandomTrigger(sender, arg, considerWeights, selectOnlyIfActive);\r\n        }\r\n\r\n        public new IRadicalYieldInstruction ActivateTriggerYielding(object sender, object arg)\r\n        {\r\n            return base.ActivateTriggerYielding(sender, arg);\r\n        }\r\n\r\n        public new void DaisyChainTriggerYielding(object sender, object arg, BlockingTriggerYieldInstruction instruction)\r\n        {\r\n            base.DaisyChainTriggerYielding(sender, arg, instruction);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        /*\r\n         * This may be defined here, it is still usable on all types inheriting from BaseSPEvent. It's only here for namespace purposes to be consistent across the framework.\r\n         */\r\n        public class ConfigAttribute : System.Attribute\r\n        {\r\n            public bool Weighted;\r\n            public bool AlwaysExpanded;\r\n\r\n            public ConfigAttribute()\r\n            {\r\n\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n\r\n    [System.Serializable()]\r\n    public class SPEvent<T> : BaseSPEvent where T : System.EventArgs\r\n    {\r\n\r\n        #region Events\r\n\r\n        public new event System.EventHandler<T> TriggerActivated;\r\n        protected virtual void OnTriggerActivated(object sender, T e)\r\n        {\r\n            this.TriggerActivated?.Invoke(sender, e);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public SPEvent()\r\n        {\r\n        }\r\n\r\n        public SPEvent(string id) : base(id)\r\n        {\r\n        }\r\n\r\n        public SPEvent(bool yielding) : base(yielding)\r\n        {\r\n        }\r\n\r\n        public SPEvent(string id, bool yielding) : base(id, yielding)\r\n        {\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override int Count\r\n        {\r\n            get\r\n            {\r\n                if (this.TriggerActivated != null || _triggerActivated != null)\r\n                    return this.Targets.Count + 1;\r\n                else\r\n                    return this.Targets.Count;\r\n            }\r\n        }\r\n\r\n        public void ActivateTrigger(object sender, T arg)\r\n        {\r\n            base.ActivateTrigger(sender, arg);\r\n            this.OnTriggerActivated(sender, arg);\r\n        }\r\n\r\n        public void ActivateTriggerAt(int index, object sender, T arg)\r\n        {\r\n            base.ActivateTriggerAt(index, sender, arg);\r\n            this.OnTriggerActivated(sender, arg);\r\n        }\r\n\r\n        public void ActivateRandomTrigger(object sender, T arg, bool considerWeights, bool selectOnlyIfActive)\r\n        {\r\n            base.ActivateRandomTrigger(sender, arg, considerWeights, selectOnlyIfActive);\r\n            this.OnTriggerActivated(sender, arg);\r\n        }\r\n\r\n        public IRadicalYieldInstruction ActivateTriggerYielding(object sender, T arg)\r\n        {\r\n            return base.ActivateTriggerYielding(sender, arg);\r\n            //this.OnTriggerActivated(sender, arg);\r\n        }\r\n\r\n        public void DaisyChainTriggerYielding(object sender, T arg, BlockingTriggerYieldInstruction instruction)\r\n        {\r\n            base.DaisyChainTriggerYielding(sender, arg, instruction);\r\n            this.OnTriggerActivated(sender, arg);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    [System.Serializable()]\r\n    public class SPActionEvent<T> : BaseSPEvent\r\n    {\r\n\r\n        #region Events\r\n\r\n        private System.Action<T> _callback;\r\n        private System.Action<object, T> _evCallback;\r\n        protected virtual void OnTriggerActivated(object sender, T arg)\r\n        {\r\n            if (_callback != null)\r\n            {\r\n                var c = _callback;\r\n                c(arg);\r\n            }\r\n\r\n            if (_evCallback != null)\r\n            {\r\n                var c = _evCallback;\r\n                c(sender, arg);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public SPActionEvent()\r\n        {\r\n        }\r\n\r\n        public SPActionEvent(string id) : base(id)\r\n        {\r\n        }\r\n\r\n        public SPActionEvent(bool yielding) : base(yielding)\r\n        {\r\n        }\r\n\r\n        public SPActionEvent(string id, bool yielding) : base(id, yielding)\r\n        {\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override int Count\r\n        {\r\n            get\r\n            {\r\n                if (_callback != null || _evCallback != null || _triggerActivated != null)\r\n                    return this.Targets.Count + 1;\r\n                else\r\n                    return this.Targets.Count;\r\n            }\r\n        }\r\n\r\n        public void AddListener(System.Action<T> callback)\r\n        {\r\n            _callback += callback;\r\n        }\r\n\r\n        public void AddListener(System.Action<object, T> callback)\r\n        {\r\n            _evCallback += callback;\r\n        }\r\n\r\n        public void RemoveListener(System.Action<T> callback)\r\n        {\r\n            _callback -= callback;\r\n        }\r\n\r\n        public void RemoveListener(System.Action<object, T> callback)\r\n        {\r\n            _evCallback -= callback;\r\n        }\r\n\r\n        public void ActivateTrigger(object sender, T arg)\r\n        {\r\n            base.ActivateTrigger(sender, arg);\r\n            this.OnTriggerActivated(sender, arg);\r\n        }\r\n\r\n        public void ActivateTriggerAt(int index, object sender, T arg)\r\n        {\r\n            base.ActivateTriggerAt(index, sender, arg);\r\n            this.OnTriggerActivated(sender, arg);\r\n        }\r\n\r\n        public void ActivateRandomTrigger(object sender, T arg, bool considerWeights, bool selectOnlyIfActive)\r\n        {\r\n            base.ActivateRandomTrigger(sender, arg, considerWeights, selectOnlyIfActive);\r\n            this.OnTriggerActivated(sender, arg);\r\n        }\r\n\r\n        public IRadicalYieldInstruction ActivateTriggerYielding(object sender, T arg)\r\n        {\r\n            return base.ActivateTriggerYielding(sender, arg);\r\n            //this.OnTriggerActivated(sender, arg);\r\n        }\r\n\r\n        public void DaisyChainTriggerYielding(object sender, T arg, BlockingTriggerYieldInstruction instruction)\r\n        {\r\n            base.DaisyChainTriggerYielding(sender, arg, instruction);\r\n            this.OnTriggerActivated(sender, arg);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n\r\n    /// <summary>\r\n    /// Exists to maintain compatibility with the 'Trigger' name. New events should use SPEvent directly.\r\n    /// </summary>\r\n    [System.Serializable()]\r\n    public class Trigger : SPEvent\r\n    {\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public Trigger()\r\n        {\r\n        }\r\n\r\n        public Trigger(string id) : base(id)\r\n        {\r\n        }\r\n\r\n        public Trigger(bool yielding) : base(yielding)\r\n        {\r\n        }\r\n\r\n        public Trigger(string id, bool yielding) : base(id, yielding)\r\n        {\r\n        }\r\n\r\n        #endregion\r\n\r\n        //#region Methods\r\n\r\n        //public new void ActivateTrigger(object sender, object arg)\r\n        //{\r\n        //    base.ActivateTrigger(sender, arg);\r\n        //}\r\n\r\n        //public new void ActivateTriggerAt(int index, object sender, object arg)\r\n        //{\r\n        //    base.ActivateTriggerAt(index, sender, arg);\r\n        //}\r\n\r\n        //public new void ActivateRandomTrigger(object sender, object arg, bool considerWeights)\r\n        //{\r\n        //    base.ActivateRandomTrigger(sender, arg, considerWeights);\r\n        //}\r\n\r\n        //public new IRadicalYieldInstruction ActivateTriggerYielding(object sender, object arg)\r\n        //{\r\n        //    return base.ActivateTriggerYielding(sender, arg);\r\n        //}\r\n\r\n        //public new void DaisyChainTriggerYielding(object sender, object arg, BlockingTriggerYieldInstruction instruction)\r\n        //{\r\n        //    base.DaisyChainTriggerYielding(sender, arg, instruction);\r\n        //}\r\n\r\n        //#endregion\r\n\r\n        #region Special Types\r\n\r\n        /*\r\n         * Moved to SPEvent\r\n         */\r\n        //public class ConfigAttribute : System.Attribute\r\n        //{\r\n        //    public bool Weighted;\r\n        //    public bool AlwaysExpanded;\r\n\r\n        //    public ConfigAttribute()\r\n        //    {\r\n\r\n        //    }\r\n\r\n        //}\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n\r\n    \r\n\r\n    public class BlockingTriggerYieldInstruction : RadicalYieldInstruction, IPooledYieldInstruction\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private int _count;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private BlockingTriggerYieldInstruction()\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int Count\r\n        {\r\n            get { return _count; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void BeginBlock()\r\n        {\r\n            _count++;\r\n        }\r\n\r\n        public void EndBlock()\r\n        {\r\n            if (this.IsComplete) return;\r\n\r\n            _count--;\r\n            if(_count <= 0)\r\n            {\r\n                this.SetSignal();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        void IDisposable.Dispose()\r\n        {\r\n            _count = 0;\r\n            _pool.Release(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Factory\r\n\r\n        private static ObjectCachePool<BlockingTriggerYieldInstruction> _pool = new ObjectCachePool<BlockingTriggerYieldInstruction>(-1, () => new BlockingTriggerYieldInstruction());\r\n\r\n        public static BlockingTriggerYieldInstruction Create()\r\n        {\r\n            var obj = _pool.GetInstance();\r\n            obj._count = 0;\r\n            return obj;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/TriggerActivatedNotification.cs",
    "content": "﻿namespace com.spacepuppy.Scenario\r\n{\r\n\r\n    [System.Obsolete(\"This should not be used.\")]\r\n    public class TriggerActivatedNotification : Notification\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private IObservableTrigger _trigger;\r\n        private string _triggeredId;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TriggerActivatedNotification(IObservableTrigger trigger, string triggeredId)\r\n        {\r\n            _trigger = trigger;\r\n            _triggeredId = triggeredId;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IObservableTrigger Trigger { get { return _trigger; } }\r\n\r\n        public string TriggerId { get { return _triggeredId; } }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/TriggerActivationType.cs",
    "content": "﻿namespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public enum TriggerActivationType\r\n    {\r\n        TriggerAllOnTarget = 0,\r\n        TriggerSelectedTarget = 1,\r\n        SendMessage = 2,\r\n        CallMethodOnSelectedTarget = 3,\r\n        EnableTarget = 4,\r\n        DestroyTarget = 5\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/TriggerComponent.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public abstract class TriggerComponent : SPNotifyingComponent, IObservableTrigger\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private Trigger _trigger = new Trigger();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n            \r\n            _trigger.ObservableTriggerId = this.GetType().Name;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Trigger Trigger\r\n        {\r\n            get\r\n            {\r\n                return _trigger;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public virtual void ActivateTrigger()\r\n        {\r\n            _trigger.ActivateTrigger(this, null);\r\n        }\r\n\r\n        public virtual void ActivateTrigger(object arg)\r\n        {\r\n            _trigger.ActivateTrigger(this, arg);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IObservableTrigger Interface\r\n\r\n        Trigger[] IObservableTrigger.GetTriggers()\r\n        {\r\n            return new Trigger[] { _trigger };\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/TriggerTarget.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    [System.Serializable()]\r\n    public class TriggerTarget\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private float _weight = 1f;\r\n\r\n        /**\r\n         * These values are named like public properties because this was originally an internal class and they were public. \r\n         * But now it's a public class, and they need to be protected. BUT they are live and serialized out there by the original \r\n         * name. So to ensure backwards compatability we must keep these names.\r\n         */\r\n\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Triggerable\")]\r\n        [SerializeField()]\r\n        private UnityEngine.Object _triggerable;\r\n\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"TriggerableArgs\")]\r\n        [SerializeField()]\r\n        private VariantReference[] _triggerableArgs;\r\n\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"ActivationType\")]\r\n        [SerializeField()]\r\n        private TriggerActivationType _activationType;\r\n\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"MethodName\")]\r\n        [SerializeField()]\r\n        private string _methodName;\r\n        \r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        /// <summary>\r\n        /// A value that can represent the probability weight of the TriggerTarget. This is used by Trigger when configured for probability.\r\n        /// </summary>\r\n        public float Weight\r\n        {\r\n            get { return _weight; }\r\n            set { _weight = value; }\r\n        }\r\n\r\n        //public GameObject Target { get { return (this._triggerable != null) ? _triggerable.gameObject : null; } }\r\n        public UnityEngine.Object Target { get { return _triggerable; } }\r\n\r\n        public TriggerActivationType ActivationType { get { return this._activationType; } }\r\n\r\n        //public bool CanBlock\r\n        //{\r\n        //    get\r\n        //    {\r\n        //        switch(_activationType)\r\n        //        {\r\n        //            case TriggerActivationType.TriggerAllOnTarget:\r\n        //                {\r\n        //                    return _triggerable.HasComponent<IBlockingTriggerableMechanism>();\r\n        //                }\r\n        //            case TriggerActivationType.TriggerSelectedTarget:\r\n        //                {\r\n        //                    return _triggerable is IBlockingTriggerableMechanism;\r\n        //                }\r\n        //            case TriggerActivationType.SendMessage:\r\n        //                {\r\n        //                    return false;\r\n        //                }\r\n        //            case TriggerActivationType.CallMethodOnSelectedTarget:\r\n        //                {\r\n        //                    return false;\r\n        //                }\r\n        //            default:\r\n        //                return false;\r\n        //        }\r\n        //    }\r\n        //}\r\n\r\n        #endregion\r\n\r\n        #region Configure Methods\r\n\r\n        public void Clear()\r\n        {\r\n            this._triggerable = null;\r\n            this._triggerableArgs = null;\r\n            this._activationType = TriggerActivationType.TriggerAllOnTarget;\r\n            this._methodName = null;\r\n        }\r\n\r\n        public void ConfigureTriggerAll(GameObject targ, object arg = null)\r\n        {\r\n            if (targ == null) throw new System.ArgumentNullException(\"targ\");\r\n            this._triggerable = targ.transform;\r\n            if (arg == null)\r\n            {\r\n                this._triggerableArgs = null;\r\n            }\r\n            else\r\n            {\r\n                this._triggerableArgs = new VariantReference[] { new VariantReference(arg) };\r\n            }\r\n            this._activationType = TriggerActivationType.TriggerAllOnTarget;\r\n            this._methodName = null;\r\n        }\r\n\r\n        public void ConfigureTriggerAll(ITriggerableMechanism mechanism, object arg = null)\r\n        {\r\n            if (mechanism == null) throw new System.ArgumentNullException(\"mechanism\");\r\n            if (GameObjectUtil.IsGameObjectSource(mechanism))\r\n                _triggerable = GameObjectUtil.GetGameObjectFromSource(mechanism).transform;\r\n            else\r\n                _triggerable = mechanism as UnityEngine.Object;\r\n            if (arg == null || _triggerable == null)\r\n            {\r\n                this._triggerableArgs = null;\r\n            }\r\n            else\r\n            {\r\n                this._triggerableArgs = new VariantReference[] { new VariantReference(arg) };\r\n            }\r\n            this._activationType = TriggerActivationType.TriggerAllOnTarget;\r\n            this._methodName = null;\r\n        }\r\n\r\n        public void ConfigureTriggerAll(UnityEngine.Object targ, object arg = null)\r\n        {\r\n            if (targ == null) throw new System.ArgumentNullException(\"targ\");\r\n            if(GameObjectUtil.IsGameObjectSource(targ))\r\n            {\r\n                this.ConfigureTriggerAll(GameObjectUtil.GetGameObjectFromSource(targ));\r\n                return;\r\n            }\r\n            else if (!TriggerTarget.IsValidTriggerTarget(targ, TriggerActivationType.TriggerAllOnTarget))\r\n            {\r\n                throw new System.ArgumentException(\"Must be a game object source of some sort.\", \"targ\");\r\n            }\r\n\r\n            this._triggerable = targ;\r\n            if (arg == null)\r\n            {\r\n                this._triggerableArgs = null;\r\n            }\r\n            else\r\n            {\r\n                this._triggerableArgs = new VariantReference[] { new VariantReference(arg) };\r\n            }\r\n            this._activationType = TriggerActivationType.TriggerAllOnTarget;\r\n            this._methodName = null;\r\n        }\r\n\r\n        public void ConfigureTriggerTarget(ITriggerableMechanism mechanism, object arg = null)\r\n        {\r\n            if (mechanism == null) throw new System.ArgumentNullException(\"mechanism\");\r\n            \r\n            this._triggerable = mechanism as UnityEngine.Object;\r\n            if (arg == null || _triggerable == null)\r\n            {\r\n                this._triggerableArgs = null;\r\n            }\r\n            else\r\n            {\r\n                this._triggerableArgs = new VariantReference[] { new VariantReference(arg) };\r\n            }\r\n            this._activationType = TriggerActivationType.TriggerSelectedTarget;\r\n            this._methodName = null;\r\n        }\r\n\r\n        public void ConfigureSendMessage(GameObject targ, string message, object arg = null)\r\n        {\r\n            if (targ == null) throw new System.ArgumentNullException(\"targ\");\r\n            this._triggerable = targ.transform;\r\n            if (arg == null)\r\n            {\r\n                this._triggerableArgs = null;\r\n            }\r\n            else\r\n            {\r\n                this._triggerableArgs = new VariantReference[] { new VariantReference(arg) };\r\n            }\r\n            this._methodName = message;\r\n            this._activationType = TriggerActivationType.SendMessage;\r\n        }\r\n\r\n        public void ConfigureCallMethod(UnityEngine.Object targ, string methodName, params object[] args)\r\n        {\r\n            if (targ == null) throw new System.ArgumentNullException(\"targ\");\r\n            this._triggerable = targ;\r\n            if (args == null || args.Length == 0)\r\n            {\r\n                this._triggerableArgs = null;\r\n            }\r\n            else\r\n            {\r\n                this._triggerableArgs = (from a in args select new VariantReference(a)).ToArray();\r\n            }\r\n            this._methodName = methodName;\r\n            this._activationType = TriggerActivationType.CallMethodOnSelectedTarget;\r\n        }\r\n\r\n        public object CalculateTarget(object arg)\r\n        {\r\n            return (_triggerable is IProxy) ? (_triggerable as IProxy).GetTarget(arg) : _triggerable;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Trigger Methods\r\n\r\n        [System.Obsolete()]\r\n        public void Trigger(object sender)\r\n        {\r\n            if (this._triggerable == null) return;\r\n\r\n            var arg = (this._triggerableArgs != null && this._triggerableArgs.Length > 0) ? this._triggerableArgs[0].Value : null;\r\n            this.Trigger_Imp(sender, null, arg, null);\r\n        }\r\n\r\n        [System.Obsolete()]\r\n        public void TriggerYielding(object sender, BlockingTriggerYieldInstruction instruction)\r\n        {\r\n            if (this._triggerable == null) return;\r\n\r\n            var arg = (this._triggerableArgs != null && this._triggerableArgs.Length > 0) ? this._triggerableArgs[0].Value : null;\r\n            this.Trigger_Imp(sender, null, arg, instruction);\r\n        }\r\n\r\n\r\n\r\n\r\n        public void Trigger(object sender, object arg)\r\n        {\r\n            if (this._triggerable == null) return;\r\n\r\n            var arg0 = (this._triggerableArgs != null && this._triggerableArgs.Length > 0) ? this._triggerableArgs[0].Value : arg;\r\n            this.Trigger_Imp(sender, arg, arg0, null);\r\n        }\r\n\r\n        public void TriggerYielding(object sender, object arg, BlockingTriggerYieldInstruction instruction)\r\n        {\r\n            if (this._triggerable == null) return;\r\n\r\n            var arg0 = (this._triggerableArgs != null && this._triggerableArgs.Length > 0) ? this._triggerableArgs[0].Value : arg;\r\n            this.Trigger_Imp(sender, arg, arg0, instruction);\r\n        }\r\n        \r\n        private void Trigger_Imp(object sender, object incomingArg, object outgoingArg, BlockingTriggerYieldInstruction instruction)\r\n        {\r\n            try\r\n            {\r\n                switch (this._activationType)\r\n                {\r\n                    case TriggerActivationType.TriggerAllOnTarget:\r\n                        {\r\n                            EventTriggerEvaluator.Current.TriggerAllOnTarget((_triggerable is IProxy) ? (_triggerable as IProxy).GetTarget(incomingArg) : _triggerable, \r\n                                                                             sender, outgoingArg, instruction);\r\n                        }\r\n                        break;\r\n                    case TriggerActivationType.TriggerSelectedTarget:\r\n                        {\r\n                            EventTriggerEvaluator.Current.TriggerSelectedTarget((_triggerable is IProxy) ? (_triggerable as IProxy).GetTarget(incomingArg) : _triggerable,\r\n                                                                                sender, outgoingArg, instruction);\r\n                        }\r\n                        break;\r\n                    case TriggerActivationType.SendMessage:\r\n                        {\r\n                            EventTriggerEvaluator.Current.SendMessageToTarget((_triggerable is IProxy) ? (_triggerable as IProxy).GetTarget(incomingArg) : _triggerable,\r\n                                                                              _methodName, outgoingArg);\r\n                        }\r\n                        break;\r\n                    case TriggerActivationType.CallMethodOnSelectedTarget:\r\n                        {\r\n                            EventTriggerEvaluator.Current.CallMethodOnSelectedTarget((_triggerable is IProxy) ? (_triggerable as IProxy).GetTarget(incomingArg) : _triggerable,\r\n                                                                                     _methodName, _triggerableArgs);\r\n                        }\r\n                        break;\r\n                    case TriggerActivationType.EnableTarget:\r\n                        {\r\n                            EventTriggerEvaluator.Current.EnableTarget((_triggerable is IProxy) ? (_triggerable as IProxy).GetTarget(incomingArg) : _triggerable,\r\n                                                                       ConvertUtil.ToEnum<EnableMode>(_methodName));\r\n                        }\r\n                        break;\r\n                    case TriggerActivationType.DestroyTarget:\r\n                        {\r\n                            EventTriggerEvaluator.Current.DestroyTarget((_triggerable is IProxy) ? (_triggerable as IProxy).GetTarget(incomingArg) : _triggerable);\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n            catch(System.Exception ex)\r\n            {\r\n                Debug.LogException(ex, sender as UnityEngine.Object);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Static Utils\r\n\r\n        public static bool IsValidTriggerTarget(UnityEngine.Object obj, TriggerActivationType act)\r\n        {\r\n            if (obj == null) return true;\r\n\r\n            switch (act)\r\n            {\r\n                case TriggerActivationType.TriggerAllOnTarget:\r\n                case TriggerActivationType.TriggerSelectedTarget:\r\n                    return (GameObjectUtil.IsGameObjectSource(obj) || obj is ITriggerableMechanism || obj is IProxy);\r\n                case TriggerActivationType.SendMessage:\r\n                    return GameObjectUtil.IsGameObjectSource(obj) || obj is IProxy;\r\n                case TriggerActivationType.CallMethodOnSelectedTarget:\r\n                    return true;\r\n                case TriggerActivationType.EnableTarget:\r\n                case TriggerActivationType.DestroyTarget:\r\n                    return GameObjectUtil.IsGameObjectSource(obj) || obj is IProxy;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/TriggerableMechanism.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public abstract class TriggerableMechanism : SPComponent, ITriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private int _order;\r\n\r\n        #endregion\r\n\r\n        #region ITriggerableMechanism Interface\r\n\r\n        public int Order\r\n        {\r\n            get { return _order; }\r\n            set { _order = value; }\r\n        }\r\n\r\n        public virtual bool CanTrigger\r\n        {\r\n            get { return this.isActiveAndEnabled; }\r\n        }\r\n\r\n        public void Trigger()\r\n        {\r\n            this.Trigger(null, null);\r\n        }\r\n\r\n        public abstract bool Trigger(object sender, object arg);\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/TriggerableTargetObject.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    [System.Serializable()]\r\n    public class TriggerableTargetObject\r\n    {\r\n\r\n        public enum FindCommand\r\n        {\r\n            Direct = 0,\r\n            FindParent = 1,\r\n            FindInChildren = 2,\r\n            FindInEntity = 3,\r\n            FindInScene = 4,\r\n            FindEntityInScene = 5\r\n        }\r\n\r\n        public enum ResolveByCommand\r\n        {\r\n            Nothing = SearchBy.Nothing,\r\n            WithTag = SearchBy.Tag,\r\n            WithName = SearchBy.Name,\r\n            WithType = SearchBy.Type\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"_source\")]\r\n        private bool _configured = true;\r\n        [SerializeField()]\r\n        private UnityEngine.Object _target;\r\n        [SerializeField()]\r\n        private FindCommand _find;\r\n        [SerializeField()]\r\n        private ResolveByCommand _resolveBy;\r\n        [SerializeField()]\r\n        private string _queryString;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TriggerableTargetObject()\r\n        {\r\n        }\r\n\r\n        public TriggerableTargetObject(bool defaultTriggerArg)\r\n        {\r\n            _configured = !defaultTriggerArg;\r\n        }\r\n        \r\n        public TriggerableTargetObject(UnityEngine.Object target)\r\n        {\r\n            this.Configure(target);\r\n        }\r\n\r\n        public TriggerableTargetObject(UnityEngine.Object target, FindCommand find, ResolveByCommand resolveBy = ResolveByCommand.Nothing, string resolveQuery = null)\r\n        {\r\n            this.Configure(target, find, resolveBy, resolveQuery);\r\n        }\r\n\r\n        public TriggerableTargetObject(FindCommand find, ResolveByCommand resolveBy, string resolveQuery)\r\n        {\r\n            this.Configure(find, resolveBy, resolveQuery);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        /// <summary>\r\n        /// Returns true if the target is explicitly null. Meaning that it was setup or configured to return null as its target, rather than null resulting from a failed find.\r\n        /// </summary>\r\n        public bool IsConfiguredNull\r\n        {\r\n            get { return _configured && !ObjUtil.IsValidObject(_target); }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns true if the target is calculated based off the passed in arg.\r\n        /// </summary>\r\n        public bool TargetsTriggerArg\r\n        {\r\n            get { return !_configured; }\r\n            set\r\n            {\r\n                _configured = !value;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns true if when you call GetTarget it will attempt to query the entire entity of the resolved object to find the target object. \r\n        /// This occurs if Configured to reduce from the passed in 'arg' OR if we search the scene.\r\n        /// </summary>\r\n        public bool ImplicityReducesEntireEntity\r\n        {\r\n            get { return !_configured || _find >= FindCommand.FindInScene || (_target is IProxy && (_target as IProxy).QueriesTarget); }\r\n        }\r\n\r\n        public UnityEngine.Object Target\r\n        {\r\n            get { return _target; }\r\n            set\r\n            {\r\n                _target = value;\r\n            }\r\n        }\r\n\r\n        public FindCommand Find\r\n        {\r\n            get { return _find; }\r\n            set { _find = value; }\r\n        }\r\n\r\n        public ResolveByCommand ResolveBy\r\n        {\r\n            get { return _resolveBy; }\r\n            set { _resolveBy = value; }\r\n        }\r\n\r\n        public string ResolveByQuery\r\n        {\r\n            get { return _queryString; }\r\n            set { _queryString = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Configure(UnityEngine.Object target)\r\n        {\r\n            _configured = true;\r\n            _target = target;\r\n            _find = FindCommand.Direct;\r\n            _resolveBy = ResolveByCommand.Nothing;\r\n            _queryString = null;\r\n        }\r\n\r\n        public void Configure(UnityEngine.Object target, FindCommand find, ResolveByCommand resolveBy = ResolveByCommand.Nothing, string resolveQuery = null)\r\n        {\r\n            _configured = true;\r\n            _target = target;\r\n            _find = find;\r\n            _resolveBy = resolveBy;\r\n            _queryString = resolveQuery;\r\n        }\r\n\r\n        public void Configure(FindCommand find, ResolveByCommand resolveBy, string resolveQuery)\r\n        {\r\n            _configured = false;\r\n            _target = null;\r\n            _find = find;\r\n            _resolveBy = resolveBy;\r\n            _queryString = resolveQuery;\r\n        }\r\n        \r\n\r\n        public T GetTarget<T>(object triggerArg) where T : class\r\n        {\r\n            var obj = this.ReduceTarget(triggerArg);\r\n            if (obj == null) return null;\r\n\r\n            var result = ObjUtil.GetAsFromSource<T>(obj);\r\n            if(ObjUtil.IsNullOrDestroyed(result) && this.ImplicityReducesEntireEntity && ComponentUtil.IsAcceptableComponentType(typeof(T)))\r\n            {\r\n                //if not configured, and the triggerArg didn't reduce properly, lets search the entity of the 'triggerArg'\r\n                var go = GameObjectUtil.FindRoot(GameObjectUtil.GetGameObjectFromSource(obj));\r\n                if (go == null) return null;\r\n                result = go.FindComponent<T>();\r\n            }\r\n            return result;\r\n        }\r\n\r\n        public object GetTarget(System.Type tp, object triggerArg)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n            \r\n            var obj = this.ReduceTarget(triggerArg);\r\n            if (obj == null) return null;\r\n\r\n            var result = ObjUtil.GetAsFromSource(tp, obj);\r\n            if(ObjUtil.IsNullOrDestroyed(result) && this.ImplicityReducesEntireEntity && ComponentUtil.IsAcceptableComponentType(tp))\r\n            {\r\n                //if not configured, and the triggerArg didn't reduce properly, lets search the entity of the 'triggerArg'\r\n                var go = GameObjectUtil.FindRoot(GameObjectUtil.GetGameObjectFromSource(obj));\r\n                if (go == null) return null;\r\n                result = go.FindComponent(tp);\r\n            }\r\n            return result;\r\n        }\r\n        \r\n        public IEnumerable<T> GetTargets<T>(object triggerArg) where T : class\r\n        {\r\n            foreach(var obj in this.ReduceTargets(triggerArg))\r\n            {\r\n                if (obj == null) continue;\r\n\r\n                var result = ObjUtil.GetAsFromSource<T>(obj);\r\n                if (ObjUtil.IsNullOrDestroyed(result) && !_configured && obj == triggerArg && ComponentUtil.IsAcceptableComponentType(typeof(T)))\r\n                {\r\n                    //if not configured, and the triggerArg didn't reduce properly, lets search the entity of the 'triggerArg'\r\n                    var go = GameObjectUtil.FindRoot(GameObjectUtil.GetGameObjectFromSource(obj));\r\n                    if (go == null) continue;\r\n                    result = go.FindComponent<T>();\r\n                }\r\n                if (result != null) yield return result;\r\n            }\r\n        }\r\n\r\n        public System.Collections.IEnumerable GetTargets(System.Type tp, object triggerArg)\r\n        {\r\n            foreach (var obj in this.ReduceTargets(triggerArg))\r\n            {\r\n                if (obj == null) continue;\r\n\r\n                var result = ObjUtil.GetAsFromSource(tp, obj);\r\n                if (ObjUtil.IsNullOrDestroyed(result) && !_configured && obj == triggerArg && ComponentUtil.IsAcceptableComponentType(tp))\r\n                {\r\n                    //if not configured, and the triggerArg didn't reduce properly, lets search the entity of the 'triggerArg'\r\n                    var go = GameObjectUtil.FindRoot(GameObjectUtil.GetGameObjectFromSource(obj));\r\n                    if (go == null) continue;\r\n                    result = go.FindComponent(tp);\r\n                }\r\n                if (result != null) yield return result;\r\n            }\r\n        }\r\n\r\n        private object ReduceTarget(object triggerArg)\r\n        {\r\n            var targ = _target;\r\n            if (targ is IProxy) targ = (targ as IProxy).GetTarget(triggerArg) as UnityEngine.Object;\r\n\r\n            switch (_find)\r\n            {\r\n                case FindCommand.Direct:\r\n                    {\r\n                        object obj = (_configured) ? targ : triggerArg;\r\n                        if (ObjUtil.IsNullOrDestroyed(obj)) return null;\r\n                        switch (_resolveBy)\r\n                        {\r\n                            case ResolveByCommand.Nothing:\r\n                                return obj;\r\n                            case ResolveByCommand.WithTag:\r\n                                return GameObjectUtil.GetGameObjectFromSource(obj).HasTag(_queryString) ? obj : null;\r\n                            case ResolveByCommand.WithName:\r\n                                return GameObjectUtil.GetGameObjectFromSource(obj).CompareName(_queryString) ? obj : null;\r\n                            case ResolveByCommand.WithType:\r\n                                return ObjUtil.GetAsFromSource(TypeUtil.FindType(_queryString), GameObjectUtil.GetGameObjectFromSource(obj)) != null ? obj : null;\r\n                        }\r\n                    }\r\n                    break;\r\n                case FindCommand.FindParent:\r\n                    {\r\n                        Transform trans = GameObjectUtil.GetTransformFromSource((_configured) ? targ : triggerArg);\r\n                        if (trans == null) return null;\r\n                        switch (_resolveBy)\r\n                        {\r\n                            case ResolveByCommand.Nothing:\r\n                                return trans.parent;\r\n                            case ResolveByCommand.WithTag:\r\n                                return trans.FindParentWithTag(_queryString);\r\n                            case ResolveByCommand.WithName:\r\n                                return trans.FindParentWithName(_queryString);\r\n                            case ResolveByCommand.WithType:\r\n                                {\r\n                                    var tp = TypeUtil.FindType(_queryString);\r\n                                    foreach (var p in GameObjectUtil.GetParents(trans))\r\n                                    {\r\n                                        var o = ObjUtil.GetAsFromSource(tp, p);\r\n                                        if (o != null) return o;\r\n                                    }\r\n                                    return null;\r\n                                }\r\n                        }\r\n                    }\r\n                    break;\r\n                case FindCommand.FindInChildren:\r\n                    {\r\n                        Transform trans = GameObjectUtil.GetTransformFromSource((_configured) ? targ : triggerArg);\r\n                        if (trans == null) return null;\r\n                        switch (_resolveBy)\r\n                        {\r\n                            case ResolveByCommand.Nothing:\r\n                                return (trans.childCount > 0) ? trans.GetChild(0) : null;\r\n                            case ResolveByCommand.WithTag:\r\n                                if (trans.childCount > 0)\r\n                                {\r\n                                    using (var lst = TempCollection.GetList<Transform>())\r\n                                    {\r\n                                        GameObjectUtil.GetAllChildren(trans, lst);\r\n                                        for(int i = 0; i < lst.Count; i++)\r\n                                        {\r\n                                            if (lst[i].HasTag(_queryString)) return lst[i];\r\n                                        }\r\n                                    }\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithName:\r\n                                if (trans.childCount > 0)\r\n                                {\r\n                                    return trans.FindByName(_queryString);\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithType:\r\n                                if(trans.childCount > 0)\r\n                                {\r\n                                    var tp = TypeUtil.FindType(_queryString);\r\n                                    using (var lst = TempCollection.GetList<Transform>())\r\n                                    {\r\n                                        GameObjectUtil.GetAllChildren(trans, lst);\r\n                                        for(int i = 0; i < lst.Count; i++)\r\n                                        {\r\n                                            var o = ObjUtil.GetAsFromSource(tp, lst[i]);\r\n                                            if (o != null) return o;\r\n                                        }\r\n                                    }\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n                case FindCommand.FindInEntity:\r\n                    {\r\n                        GameObject entity = GameObjectUtil.GetRootFromSource((_configured) ? targ : triggerArg);\r\n                        if (entity == null) return null;\r\n\r\n                        switch (_resolveBy)\r\n                        {\r\n                            case ResolveByCommand.Nothing:\r\n                                return entity;\r\n                            case ResolveByCommand.WithTag:\r\n                                return entity.FindWithMultiTag(_queryString);\r\n                            case ResolveByCommand.WithName:\r\n                                return entity.FindByName(_queryString);\r\n                            case ResolveByCommand.WithType:\r\n                                {\r\n                                    var tp = TypeUtil.FindType(_queryString);\r\n                                    foreach (var t in GameObjectUtil.GetAllChildrenAndSelf(entity))\r\n                                    {\r\n                                        var o = ObjUtil.GetAsFromSource(tp, t);\r\n                                        if (o != null) return o;\r\n                                    }\r\n                                    return null;\r\n                                }\r\n                        }\r\n                    }\r\n                    break;\r\n                case FindCommand.FindInScene:\r\n                    {\r\n                        switch (_resolveBy)\r\n                        {\r\n                            case ResolveByCommand.Nothing:\r\n                                return GameObjectUtil.GetGameObjectFromSource((_configured) ? targ : triggerArg);\r\n                            case ResolveByCommand.WithTag:\r\n                                return GameObjectUtil.FindWithMultiTag(_queryString);\r\n                            case ResolveByCommand.WithName:\r\n                                return GameObject.Find(_queryString);\r\n                            case ResolveByCommand.WithType:\r\n                                return ObjUtil.Find(SearchBy.Type, _queryString);\r\n                        }\r\n                    }\r\n                    break;\r\n                case FindCommand.FindEntityInScene:\r\n                    {\r\n                        switch(_resolveBy)\r\n                        {\r\n                            case ResolveByCommand.Nothing:\r\n                                return GameObjectUtil.GetGameObjectFromSource((_configured) ? targ : triggerArg);\r\n                            case ResolveByCommand.WithTag:\r\n                                {\r\n                                    var e = SPEntity.Pool.GetEnumerator();\r\n                                    while(e.MoveNext())\r\n                                    {\r\n                                        if (e.Current.HasTag(_queryString)) return e.Current;\r\n                                    }\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithName:\r\n                                {\r\n                                    var e = SPEntity.Pool.GetEnumerator();\r\n                                    while (e.MoveNext())\r\n                                    {\r\n                                        if (e.Current.CompareName(_queryString)) return e.Current;\r\n                                    }\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithType:\r\n                                {\r\n                                    var e = SPEntity.Pool.GetEnumerator();\r\n                                    var tp = TypeUtil.FindType(_queryString);\r\n                                    while (e.MoveNext())\r\n                                    {\r\n                                        var o = e.Current.GetComponentInChildren(tp);\r\n                                        if (o != null) return o;\r\n                                    }\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        private System.Collections.IEnumerable ReduceTargets(object triggerArg)\r\n        {\r\n            switch (_find)\r\n            {\r\n                case FindCommand.Direct:\r\n                    {\r\n                        object obj = (_configured) ? _target : triggerArg;\r\n                        if (ObjUtil.IsNullOrDestroyed(obj)) yield break;\r\n                        switch (_resolveBy)\r\n                        {\r\n                            case ResolveByCommand.Nothing:\r\n                                yield return obj;\r\n                                break;\r\n                            case ResolveByCommand.WithTag:\r\n                                {\r\n                                    var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n                                    if (go.HasTag(_queryString)) yield return obj;\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithName:\r\n                                {\r\n                                    var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n                                    if (go.CompareName(_queryString)) yield return obj;\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithType:\r\n                                {\r\n                                    var o = ObjUtil.GetAsFromSource(TypeUtil.FindType(_queryString), GameObjectUtil.GetGameObjectFromSource(obj));\r\n                                    if (o != null) yield return o;\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n                case FindCommand.FindParent:\r\n                    {\r\n                        Transform trans = GameObjectUtil.GetTransformFromSource((_configured) ? _target : triggerArg);\r\n                        if (trans == null) yield break;\r\n                        switch (_resolveBy)\r\n                        {\r\n                            case ResolveByCommand.Nothing:\r\n                                {\r\n                                    var t = trans.parent;\r\n                                    if (t != null) yield return t;\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithTag:\r\n                                {\r\n                                    foreach(var p in GameObjectUtil.GetParents(trans))\r\n                                    {\r\n                                        if (p.HasTag(_queryString)) yield return p;\r\n                                    }\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithName:\r\n                                {\r\n                                    foreach (var p in GameObjectUtil.GetParents(trans))\r\n                                    {\r\n                                        if (p.CompareName(_queryString)) yield return p;\r\n                                    }\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithType:\r\n                                {\r\n                                    var tp = TypeUtil.FindType(_queryString);\r\n                                    foreach (var p in GameObjectUtil.GetParents(trans))\r\n                                    {\r\n                                        var o = ObjUtil.GetAsFromSource(tp, p);\r\n                                        if (o != null) yield return o;\r\n                                    }\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n                case FindCommand.FindInChildren:\r\n                    {\r\n                        Transform trans = GameObjectUtil.GetTransformFromSource((_configured) ? _target : triggerArg);\r\n                        if (trans == null) yield break;\r\n                        switch (_resolveBy)\r\n                        {\r\n                            case ResolveByCommand.Nothing:\r\n                                if (trans.childCount > 0) yield return trans.GetChild(0);\r\n                                break;\r\n                            case ResolveByCommand.WithTag:\r\n                                if (trans.childCount > 0)\r\n                                {\r\n                                    using (var lst = TempCollection.GetList<Transform>())\r\n                                    {\r\n                                        GameObjectUtil.GetAllChildren(trans, lst);\r\n                                        for(int i = 0; i < lst.Count; i++)\r\n                                        {\r\n                                            if (lst[i].HasTag(_queryString)) yield return lst[i];\r\n                                        }\r\n                                    }\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithName:\r\n                                if (trans.childCount > 0)\r\n                                {\r\n                                    using (var lst = TempCollection.GetList<Transform>())\r\n                                    {\r\n                                        GameObjectUtil.GetAllChildren(trans, lst);\r\n                                        for(int i = 0; i < lst.Count; i++)\r\n                                        {\r\n                                            if (lst[i].CompareName(_queryString)) yield return lst[i];\r\n                                        }\r\n                                    }\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithType:\r\n                                if (trans.childCount > 0)\r\n                                {\r\n                                    var tp = TypeUtil.FindType(_queryString);\r\n                                    using (var lst = TempCollection.GetList<Transform>())\r\n                                    {\r\n                                        GameObjectUtil.GetAllChildren(trans, lst);\r\n                                        for (int i = 0; i < lst.Count; i++)\r\n                                        {\r\n                                            var o = ObjUtil.GetAsFromSource(tp, lst[i]);\r\n                                            if (o != null) yield return o;\r\n                                        }\r\n                                    }\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n                case FindCommand.FindInEntity:\r\n                    {\r\n                        GameObject entity = GameObjectUtil.GetRootFromSource((_configured) ? _target : triggerArg);\r\n                        if (entity == null) yield break; ;\r\n\r\n                        switch (_resolveBy)\r\n                        {\r\n                            case ResolveByCommand.Nothing:\r\n                                yield return entity;\r\n                                break;\r\n                            case ResolveByCommand.WithTag:\r\n                                {\r\n                                    foreach(var o in entity.FindAllWithMultiTag(_queryString))\r\n                                    {\r\n                                        yield return o;\r\n                                    }\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithName:\r\n                                {\r\n                                    foreach(var o in GameObjectUtil.FindAllByName(entity.transform, _queryString))\r\n                                    {\r\n                                        yield return o;\r\n                                    }\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithType:\r\n                                {\r\n                                    var tp = TypeUtil.FindType(_queryString);\r\n                                    using (var lst = TempCollection.GetList<Transform>())\r\n                                    {\r\n                                        GameObjectUtil.GetAllChildrenAndSelf(entity.transform, lst);\r\n                                        for(int i = 0; i < lst.Count; i++)\r\n                                        {\r\n                                            var o = ObjUtil.GetAsFromSource(tp, lst[i]);\r\n                                            if (o != null) yield return o;\r\n                                        }\r\n                                    }\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n                case FindCommand.FindInScene:\r\n                    {\r\n                        switch (_resolveBy)\r\n                        {\r\n                            case ResolveByCommand.Nothing:\r\n                                {\r\n                                    var go = GameObjectUtil.GetGameObjectFromSource((_configured) ? _target : triggerArg);\r\n                                    if (go != null) yield return go;\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithTag:\r\n                                {\r\n                                    foreach(var o in GameObjectUtil.FindGameObjectsWithMultiTag(_queryString))\r\n                                    {\r\n                                        yield return o;\r\n                                    }\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithName:\r\n                                {\r\n                                    foreach (var o in GameObjectUtil.FindAllByName(_queryString))\r\n                                    {\r\n                                        yield return o;\r\n                                    }\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithType:\r\n                                {\r\n                                    foreach (var o in ObjUtil.FindAll(SearchBy.Type, _queryString))\r\n                                    {\r\n                                        yield return o;\r\n                                    }\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n                case FindCommand.FindEntityInScene:\r\n                    {\r\n                        switch (_resolveBy)\r\n                        {\r\n                            case ResolveByCommand.Nothing:\r\n                                {\r\n                                    var go = GameObjectUtil.GetGameObjectFromSource((_configured) ? _target : triggerArg);\r\n                                    if (go != null) yield return go;\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithTag:\r\n                                {\r\n                                    var e = SPEntity.Pool.GetEnumerator();\r\n                                    while (e.MoveNext())\r\n                                    {\r\n                                        if (e.Current.HasTag(_queryString)) yield return e.Current;\r\n                                    }\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithName:\r\n                                {\r\n                                    var e = SPEntity.Pool.GetEnumerator();\r\n                                    while (e.MoveNext())\r\n                                    {\r\n                                        if (e.Current.CompareName(_queryString)) yield return e.Current;\r\n                                    }\r\n                                }\r\n                                break;\r\n                            case ResolveByCommand.WithType:\r\n                                {\r\n                                    var e = SPEntity.Pool.GetEnumerator();\r\n                                    var tp = TypeUtil.FindType(_queryString);\r\n                                    while (e.MoveNext())\r\n                                    {\r\n                                        var o = e.Current.GetComponent(tp);\r\n                                        if (o != null) yield return o;\r\n                                    }\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n            }\r\n        }\r\n\r\n\r\n        /// <summary>\r\n        /// Attempts to figure out the target type, only works for direct configurations, or WithType configurations.\r\n        /// This is used primarily by the inspector.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public System.Type GetTargetType()\r\n        {\r\n            if(_configured && _target != null && _find == FindCommand.Direct && _resolveBy != ResolveByCommand.WithType)\r\n                return _target.GetType();\r\n\r\n            if (_resolveBy == ResolveByCommand.WithType)\r\n                return TypeUtil.FindType(_queryString) ?? typeof(UnityEngine.Object);\r\n\r\n            return typeof(UnityEngine.Object);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public class ConfigAttribute : System.Attribute\r\n        {\r\n\r\n            public System.Type TargetType;\r\n            public bool SearchChildren;\r\n            public bool DefaultFromSelf;\r\n            public bool AlwaysExpanded;\r\n            \r\n            public ConfigAttribute(System.Type targetType)\r\n            {\r\n                //if (targetType == null || \r\n                //    (!TypeUtil.IsType(targetType, typeof(UnityEngine.Object)) && !TypeUtil.IsType(targetType, typeof(IComponent)))) throw new TypeArgumentMismatchException(targetType, typeof(UnityEngine.Object), \"targetType\");\r\n                if (targetType == null ||\r\n                    (!TypeUtil.IsType(targetType, typeof(UnityEngine.Object)) && !targetType.IsInterface))\r\n                    throw new TypeArgumentMismatchException(targetType, typeof(UnityEngine.Object), \"targetType\");\r\n\r\n                this.TargetType = targetType;\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_AddComponent.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class i_AddComponent : TriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [TypeReference.Config(typeof(Component), dropDownStyle=TypeDropDownListingStyle.ComponentMenu)]\r\n        private TypeReference _componentType;\r\n\r\n        [SerializeField()]\r\n        [TriggerableTargetObject.Config(typeof(GameObject))]\r\n        private TriggerableTargetObject _target;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"AddMultipleIfExists\")]\r\n        [Tooltip(\"Add a new component even if one already exists.\")]\r\n        private bool _addMultipleIfExists;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool AddMultipleIfExists\r\n        {\r\n            get { return _addMultipleIfExists; }\r\n            set { _addMultipleIfExists = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region TriggerableMechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var targ = _target.GetTarget<GameObject>(arg);\r\n            if (targ == null) return false;\r\n\r\n            try\r\n            {\r\n                if (!this._addMultipleIfExists && targ.HasComponent(_componentType.Type)) return false;\r\n\r\n                var comp = targ.AddComponent(_componentType.Type);\r\n                return true;\r\n            }\r\n            catch\r\n            {\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_AutoSequenceSignal.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class i_AutoSequenceSignal : TriggerableMechanism, IAutoSequenceSignal\r\n    {\r\n\r\n        private RadicalWaitHandle _handle;\r\n\r\n\r\n        public IRadicalWaitHandle Wait()\r\n        {\r\n            if (_handle == null) _handle = RadicalWaitHandle.Create();\r\n            return _handle;\r\n        }\r\n\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            if(_handle != null)\r\n            {\r\n                _handle.SignalComplete();\r\n                _handle = null;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_ChangeCursorProperties.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Scenario\n{\n\n    public class i_ChangeCursorProperties : AutoTriggerableMechanism\n    {\n\n        public enum CursorVisibilityOption\n        {\n            None,\n            SetVisible = 1,\n            SetInvisible = 2\n        }\n\n        public enum CursorLockOptions\n        {\n            None = 0,\n            SetCursorUnlocked = 1,\n            SetCursorLocked = 2,\n            SetCursorConfined = 3\n        }\n\n        [SerializeField]\n        public CursorVisibilityOption VisibilityOption;\n        [SerializeField]\n        public CursorLockOptions LockOption;\n\n\n        public override bool Trigger(object sender, object arg)\n        {\n            if (!this.CanTrigger) return false;\n\n\n            switch(this.VisibilityOption)\n            {\n                case CursorVisibilityOption.SetVisible:\n                    Cursor.visible = true;\n                    break;\n                case CursorVisibilityOption.SetInvisible:\n                    Cursor.visible = false;\n                    break;\n            }\n            Cursor.lockState = CursorLockMode.Confined;\n            \n            switch(this.LockOption)\n            {\n                case CursorLockOptions.SetCursorUnlocked:\n                    Cursor.lockState = CursorLockMode.None;\n                    break;\n                case CursorLockOptions.SetCursorLocked:\n                    Cursor.lockState = CursorLockMode.Locked;\n                    break;\n                case CursorLockOptions.SetCursorConfined:\n                    Cursor.lockState = CursorLockMode.Confined;\n                    break;\n            }\n\n            return true;\n        }\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_ChangeStateOfSimpleStateMachine.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\n\r\nusing com.spacepuppy.StateMachine;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class i_ChangeStateOfSimpleStateMachine : TriggerableMechanism\r\n    {\r\n\r\n        [SerializeField]\r\n        private string _state;\r\n        [SerializeField]\r\n        [TriggerableTargetObject.Config(typeof(IStateMachine<string>))]\r\n        private TriggerableTargetObject _stateMachine;\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n            if (_stateMachine == null) return false;\r\n\r\n            //var machine = _stateMachine as IStateMachine<string>;\r\n            var machine = _stateMachine.GetTarget<IStateMachine<string>>(arg);\r\n            if (machine == null) return false;\r\n\r\n            return machine.ChangeState(_state) != null;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_CopyState.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\n\nusing UnityEngine;\n\nusing com.spacepuppy.Dynamic;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Scenario\n{\n    \n    public class i_CopyState : AutoTriggerableMechanism\n    {\n\n        #region Fields\n\n        [SerializeField]\n        [TriggerableTargetObject.Config(typeof(UnityEngine.Object))]\n        private TriggerableTargetObject _target;\n\n        [SerializeField]\n        [TriggerableTargetObject.Config(typeof(UnityEngine.Object))]\n        private TriggerableTargetObject _source;\n\n        [SerializeField]\n        [Tooltip(\"If 'Target' is a VariableStore or other dynamic object, it'll force add the member's of 'Source' that don't already exist on 'Target'.\")]\n        private bool _forceCopy;\n\n        #endregion\n\n        #region Properties\n\n        public TriggerableTargetObject Target\n        {\n            get { return _target; }\n        }\n\n        public TriggerableTargetObject Source\n        {\n            get { return _source; }\n        }\n\n        /// <summary>\n        /// If 'Target' is a VariableStore or other dynamic object, it'll force \n        /// add the member's of 'Source' that don't already exist on 'Target'.\n        /// </summary>\n        public bool ForceCopy\n        {\n            get { return _forceCopy; }\n            set { _forceCopy = value; }\n        }\n\n        #endregion\n\n        #region Triggerable Interface\n\n        public override bool Trigger(object sender, object arg)\n        {\n            if (!this.CanTrigger) return false;\n\n            var targ = _target.GetTarget<object>(arg);\n            var source = _source.GetTarget<object>(arg);\n\n            if (_forceCopy)\n                DynamicUtil.CopyState(targ, source);\n            else\n                DynamicUtil.SyncState(targ, source);\n\n            return true;\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_DebugLog.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class i_DebugLog : TriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private VariantReference _message = new VariantReference(string.Empty);\r\n\r\n        [SerializeField]\r\n        private bool _logStackTrace;\r\n        [SerializeField]\r\n        private bool _logEvenInBuild;\r\n\r\n        #endregion\r\n\r\n\r\n        #region TriggerableMechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n            if (!_logEvenInBuild && !Application.isEditor) return false;\r\n\r\n            if(_logStackTrace)\r\n            {\r\n                var str = _message.StringValue;\r\n                if(string.IsNullOrEmpty(str))\r\n                    Debug.Log(UnityEngine.StackTraceUtility.ExtractStackTrace(), this);\r\n                else\r\n                    Debug.Log(str + \"\\n\" + UnityEngine.StackTraceUtility.ExtractStackTrace(), this);\r\n            }\r\n            else\r\n            {\r\n                Debug.Log(_message.StringValue, this);\r\n            }\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_Destroy.cs",
    "content": "﻿using UnityEngine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class i_Destroy : TriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Target\")]\r\n        [TriggerableTargetObject.Config(typeof(UnityEngine.GameObject))]\r\n        private TriggerableTargetObject _target = new TriggerableTargetObject();\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Delay\")]\r\n        [TimeUnitsSelector()]\r\n        private float _delay = 0f;\r\n        [SerializeField]\r\n        private SPTime _delayTimeSupplier;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public TriggerableTargetObject Target\r\n        {\r\n            get { return _target; }\r\n        }\r\n\r\n        //public float Delay\r\n        //{\r\n        //    get { return _delay; }\r\n        //    set { _delay = value; }\r\n        //}\r\n\r\n        public SPTimePeriod Delay\r\n        {\r\n            get\r\n            {\r\n                return new SPTimePeriod(_delay, _delayTimeSupplier);\r\n            }\r\n            set\r\n            {\r\n                _delay = value.Seconds;\r\n                _delayTimeSupplier = (SPTime)value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITriggerableMechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var targ = this._target.GetTarget<UnityEngine.Object>(arg);\r\n            if (targ == null) return false;\r\n\r\n            if (_delay > 0f)\r\n            {\r\n                this.InvokeGuaranteed(() =>\r\n                {\r\n                    ObjUtil.SmartDestroy(targ);\r\n                }, _delay, _delayTimeSupplier.TimeSupplier);\r\n            }\r\n            else\r\n            {\r\n                ObjUtil.SmartDestroy(targ);\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_Enable.cs",
    "content": "﻿using UnityEngine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class i_Enable : TriggerableMechanism\r\n    {\r\n\r\n        public enum EnableMode\r\n        {\r\n            TriggerArg = -1,\r\n            Enable = 0,\r\n            Disable = 1,\r\n            Toggle = 2\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [TriggerableTargetObject.Config(typeof(GameObject))]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"TargetObject\")]\r\n        private TriggerableTargetObject _targetObject = new TriggerableTargetObject();\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Mode\")]\r\n        private EnableMode _mode;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Delay\")]\r\n        [TimeUnitsSelector()]\r\n        private float _delay = 0f;\r\n        [SerializeField]\r\n        private SPTime _delayTimeSupplier;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public TriggerableTargetObject TargetObject\r\n        {\r\n            get { return _targetObject; }\r\n        }\r\n        \r\n        public EnableMode Mode\r\n        {\r\n            get { return _mode; }\r\n            set { _mode = value; }\r\n        }\r\n\r\n        //public float Delay\r\n        //{\r\n        //    get { return _delay; }\r\n        //    set { _delay = value; }\r\n        //}\r\n\r\n        public SPTimePeriod Delay\r\n        {\r\n            get\r\n            {\r\n                return new SPTimePeriod(_delay, _delayTimeSupplier);\r\n            }\r\n            set\r\n            {\r\n                _delay = value.Seconds;\r\n                _delayTimeSupplier = (SPTime)value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void SetEnabledByMode(object arg)\r\n        {\r\n            var targ = _targetObject.GetTarget<GameObject>(arg);\r\n            if (targ == null) return;\r\n\r\n            var mode = _mode;\r\n            if (mode == EnableMode.TriggerArg) mode = ConvertUtil.ToEnum<EnableMode>(arg, EnableMode.Toggle);\r\n\r\n            switch (mode)\r\n            {\r\n                case EnableMode.Enable:\r\n                    targ.SetActive(true);\r\n                    break;\r\n                case EnableMode.Disable:\r\n                    targ.SetActive(false);\r\n                    break;\r\n                case EnableMode.Toggle:\r\n                    targ.SetActive(!targ.activeSelf);\r\n                    break;\r\n            }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region ITriggerableMechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            if (_delay > 0f)\r\n            {\r\n                this.InvokeGuaranteed(() =>\r\n                {\r\n                    this.SetEnabledByMode(arg);\r\n                }, _delay, _delayTimeSupplier.TimeSupplier);\r\n            }\r\n            else\r\n            {\r\n                this.SetEnabledByMode(arg);\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_EnableComponent.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class i_EnableComponent : TriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [TriggerableTargetObject.Config(typeof(Component))]\r\n        private TriggerableTargetObject _target = new TriggerableTargetObject();\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Mode\")]\r\n        private EnableMode _mode;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Delay\")]\r\n        [TimeUnitsSelector()]\r\n        private float _delay = 0f;\r\n        [SerializeField]\r\n        private SPTime _delayTimeSupplier;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        //public float Delay\r\n        //{\r\n        //    get { return _delay; }\r\n        //    set { _delay = value; }\r\n        //}\r\n\r\n        public SPTimePeriod Delay\r\n        {\r\n            get\r\n            {\r\n                return new SPTimePeriod(_delay, _delayTimeSupplier);\r\n            }\r\n            set\r\n            {\r\n                _delay = value.Seconds;\r\n                _delayTimeSupplier = (SPTime)value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void SetEnabledByMode(object arg)\r\n        {\r\n            var targ = _target.GetTarget<Component>(arg);\r\n\r\n            switch (_mode)\r\n            {\r\n                case EnableMode.Enable:\r\n                    targ.SetEnabled(true);\r\n                    break;\r\n                case EnableMode.Disable:\r\n                    targ.SetEnabled(false);\r\n                    break;\r\n                case EnableMode.Toggle:\r\n                    targ.SetEnabled(!targ.IsEnabled());\r\n                    break;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region TriggerableMechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            if (_delay > 0f)\r\n            {\r\n                this.InvokeGuaranteed(() =>\r\n                {\r\n                    this.SetEnabledByMode(arg);\r\n                }, _delay, _delayTimeSupplier.TimeSupplier);\r\n            }\r\n            else\r\n            {\r\n                this.SetEnabledByMode(arg);\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_KillTween.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\n\nusing UnityEngine;\n\nusing com.spacepuppy.Tween;\n\nnamespace com.spacepuppy.Scenario\n{\n\n    public class i_KillTween : AutoTriggerableMechanism\n    {\n\n        #region Properties\n\n        [SerializeField()]\n        [SelectableObject()]\n        private UnityEngine.Object _target;\n\n        [SerializeField()]\n        [Tooltip(\"Leave blank to kill all associated with target.\")]\n        private string _tweenToken;\n\n        #endregion\n\n        #region ITriggerable Interface\n\n        public override bool Trigger(object sender, object arg)\n        {\n            if (!this.CanTrigger) return false;\n\n            if (string.IsNullOrEmpty(_tweenToken))\n                SPTween.KillAll(_target);\n            else\n                SPTween.KillAll(_target, _tweenToken);\n\n            return true;\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_LoadScene.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing UnityEngine.SceneManagement;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Scenes;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class i_LoadScene : AutoTriggerableMechanism, ISerializationCallbackReceiver\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        [Tooltip(\"Prefix with # to load by index.\")]\r\n        private SceneRef _scene;\r\n\r\n        [SerializeField]\r\n        private LoadSceneMode _mode;\r\n        [SerializeField]\r\n        private LoadSceneBehaviour _behaviour;\r\n\r\n        [SerializeField]\r\n        [Tooltip(\"A token used to persist data across scenes.\")]\r\n        VariantReference _persistentToken = new VariantReference();\r\n\r\n        [HideInInspector]\r\n        [SerializeField]\r\n        private string _sceneName;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public SceneRef Scene\r\n        {\r\n            get { return _scene; }\r\n            set { _scene = value; }\r\n        }\r\n\r\n        public LoadSceneMode Mode\r\n        {\r\n            get { return _mode; }\r\n            set { _mode = value; }\r\n        }\r\n\r\n        public LoadSceneBehaviour Behaviour\r\n        {\r\n            get { return _behaviour; }\r\n            set { _behaviour = value; }\r\n        }\r\n\r\n        public object PersistentToken\r\n        {\r\n            get { return _persistentToken; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n            if (string.IsNullOrEmpty(_scene.SceneName)) return false;\r\n            \r\n            var nm = _scene.SceneName;\r\n            LoadSceneWaitHandle handle;\r\n            if (nm.StartsWith(\"#\"))\r\n            {\r\n                nm = nm.Substring(1);\r\n                int index;\r\n                if(!int.TryParse(nm, out index))\r\n                    return false;\r\n                if (index < 0 || index >= SceneManager.sceneCountInBuildSettings)\r\n                    return false;\r\n\r\n                handle = SceneManagerUtils.LoadScene(index, _mode, _behaviour);\r\n            }\r\n            else\r\n            {\r\n                handle = SceneManagerUtils.LoadScene(nm, _mode, _behaviour);\r\n            }\r\n\r\n            if (handle != null)\r\n            {\r\n                handle.PersistentToken = com.spacepuppy.Utils.ObjUtil.ReduceIfProxy(_persistentToken.Value);\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISerializationCallback Receiver\r\n\r\n        void ISerializationCallbackReceiver.OnAfterDeserialize()\r\n        {\r\n            //exists for backwards compatability\r\n            if(!string.IsNullOrEmpty(_sceneName))\r\n            {\r\n                _scene = new SceneRef(_sceneName);\r\n                _sceneName = null;\r\n            }\r\n        }\r\n\r\n        void ISerializationCallbackReceiver.OnBeforeSerialize()\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_LookAt.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class i_LookAt : TriggerableMechanism\r\n    {\r\n\r\n        public enum SlerpStyle\r\n        {\r\n            None = 0,\r\n            Speed = 1,\r\n            Time = 2\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [TriggerableTargetObject.Config(typeof(UnityEngine.Transform))]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Observer\")]\r\n        private TriggerableTargetObject _observer = new TriggerableTargetObject();\r\n        [SerializeField()]\r\n        [TriggerableTargetObject.Config(typeof(UnityEngine.Transform))]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Target\")]\r\n        private TriggerableTargetObject _target = new TriggerableTargetObject();\r\n\r\n        [SerializeField()]\r\n        [Tooltip(\"The axis to rotate around.\")]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Axis\")]\r\n        private CartesianAxis _axis = CartesianAxis.Y;\r\n        [SerializeField()]\r\n        [Tooltip(\"Rotate around the axis as defined on the transform this is attache to. Otherwise rotate around the axis in global terms.\")]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"AxisIsRelative\")]\r\n        private bool _axisIsRelative;\r\n        [SerializeField()]\r\n        [Tooltip(\"Flatten the look direction on the defined axis.\")]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"FlattenOnAxis\")]\r\n        private bool _flattenOnAxis = true;\r\n\r\n        [SerializeField]\r\n        private SlerpStyle _slerp;\r\n        [SerializeField()]\r\n        [Tooltip(\"If greater than 0, then it will slerp.\")]\r\n        private float _slerpValue;\r\n\r\n        [SerializeField]\r\n        [Tooltip(\"Only fires if slerp'd\")]\r\n        private Trigger _onSlerpComplete;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public TriggerableTargetObject Observer\r\n        {\r\n            get\r\n            {\r\n                return _observer;\r\n            }\r\n        }\r\n\r\n        public TriggerableTargetObject Target\r\n        {\r\n            get\r\n            {\r\n                return _observer;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Axis of the transform to use for rotating around.\r\n        /// </summary>\r\n        public CartesianAxis Axis\r\n        {\r\n            get { return _axis; }\r\n            set { _axis = value; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Rotate around the axis as defined on teh transform that is attached to. Otherwise rotate around the axis in global terms.\r\n        /// </summary>\r\n        public bool AxisIsRelative\r\n        {\r\n            get { return _axisIsRelative; }\r\n            set { _axisIsRelative = value; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Flatten the look direction on the defined axis.\r\n        /// </summary>\r\n        public bool FlattenOnAxis\r\n        {\r\n            get { return _flattenOnAxis; }\r\n            set { _flattenOnAxis = value; }\r\n        }\r\n        \r\n        public SlerpStyle Slerp\r\n        {\r\n            get { return _slerp; }\r\n            set { _slerp = value; }\r\n        }\r\n\r\n        public float SlerpValue\r\n        {\r\n            get { return _slerpValue; }\r\n            set { _slerpValue = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITriggerableMechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var observer = this._observer.GetTarget<Transform>(arg);\r\n            if (observer == null) return false;\r\n            var targ = this._target.GetTarget<Transform>(arg);\r\n            if (targ == null) return false;\r\n\r\n            var dir = targ.position - observer.position;\r\n            var ax = (this._axisIsRelative) ? this.transform.GetAxis(this._axis) : TransformUtil.GetAxis(this._axis);\r\n            if (this._flattenOnAxis) dir = dir.SetLengthOnAxis(ax, 0f);\r\n            var q = Quaternion.LookRotation(dir, ax);\r\n\r\n            var a = Quaternion.Angle(observer.rotation, q);\r\n            if (a <= MathUtil.EPSILON) return true; //don't bother tweening if we are already looking at it\r\n\r\n            if (_slerp > SlerpStyle.None && _slerpValue > 0)\r\n            {\r\n                switch(_slerp)\r\n                {\r\n                    case SlerpStyle.Speed:\r\n                        {\r\n                            var dur = a / _slerpValue;\r\n                            var twn = com.spacepuppy.Tween.SPTween.Tween(observer).To(\"rotation\", dur, q);\r\n                            if (_onSlerpComplete.Count > 0) twn.OnFinish((s, e) => _onSlerpComplete.ActivateTrigger(this, null));\r\n                            twn.Play(true);\r\n                        }\r\n                        break;\r\n                    case SlerpStyle.Time:\r\n                        {\r\n                            var twn = com.spacepuppy.Tween.SPTween.Tween(observer).To(\"rotation\", _slerpValue, q);\r\n                            if (_onSlerpComplete.Count > 0) twn.OnFinish((s, e) => _onSlerpComplete.ActivateTrigger(this, null));\r\n                            twn.Play(true);\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                observer.rotation = q;\r\n                if (_onSlerpComplete.Count > 0) _onSlerpComplete.ActivateTrigger(this, null);\r\n            }\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_ModifyCollisionBetweenEntities.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class i_ModifyCollisionBetweenEntities : TriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [TriggerableTargetObject.Config(typeof(SPEntity))]\r\n        private TriggerableTargetObject _targetA;\r\n\r\n        [SerializeField()]\r\n        [TriggerableTargetObject.Config(typeof(SPEntity))]\r\n        private TriggerableTargetObject _targetB;\r\n\r\n        [SerializeField()]\r\n        private bool _ignoreCollision;\r\n\r\n        #endregion\r\n        \r\n        #region ITriggerableMechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var a = _targetA.GetTarget<SPEntity>(arg);\r\n            var b = _targetB.GetTarget<SPEntity>(arg);\r\n\r\n            if (a == null || b == null || a == b) return false;\r\n\r\n            a.IgnoreCollision(b, _ignoreCollision);\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_ModifyTag.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\nusing UnityEngine;\n\nnamespace com.spacepuppy.Scenario\n{\n\n    public class i_ModifyTag : AutoTriggerableMechanism\n    {\n\n        public enum Modes\n        {\n            Set = 0,\n            Add = 1,\n            Remove = 2\n        }\n\n        #region Fields\n\n        [SerializeField]\n        private TriggerableTargetObject _target;\n\n        [SerializeField]\n        [TagSelector(AllowUntagged = true)]\n        private string _tag;\n\n        [SerializeField]\n        private Modes _mode;\n\n        #endregion\n\n        #region Properties\n\n        public TriggerableTargetObject Target\n        {\n            get { return _target; }\n        }\n\n        public string Tag\n        {\n            get { return _tag; }\n            set { _tag = value; }\n        }\n\n        public Modes Mode\n        {\n            get { return _mode; }\n            set { _mode = value; }\n        }\n\n        #endregion\n\n        #region Triggerable Interface\n\n        public override bool Trigger(object sender, object arg)\n        {\n            if (!this.CanTrigger) return false;\n\n            var go = _target.GetTarget<GameObject>(arg);\n            if (go == null) return false;\n\n            switch(_mode)\n            {\n                case Modes.Set:\n                    go.SetTag(_tag);\n                    break;\n                case Modes.Add:\n                    go.AddTag(_tag);\n                    break;\n                case Modes.Remove:\n                    go.RemoveTag(_tag);\n                    break;\n            }\n            return true;\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_PlayAudio.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\n\nusing UnityEngine;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Scenario\n{\n\n    [Infobox(\"Plays the audio clip that is configured in an AudioSource. Only one sound can be played at a time, this is primarily used for music.\")]\n    public class i_PlayAudio : AutoTriggerableMechanism\n    {\n\n        #region Fields\n\n        [SerializeField()]\n        [TriggerableTargetObject.Config(typeof(AudioSource))]\n        private TriggerableTargetObject _targetAudioSource = new TriggerableTargetObject();\n\n        [SerializeField]\n        [EnumFlags]\n        private AudioSettingsMask _settingsMask;\n        [SerializeField]\n        private AudioSettings _settings;\n\n        [SerializeField()]\n        [EnumPopupExcluding((int)AudioInterruptMode.PlayOverExisting)]\n        private AudioInterruptMode _interrupt = AudioInterruptMode.StopIfPlaying;\n\n        [SerializeField()]\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Delay\")]\n        [TimeUnitsSelector()]\n        private float _delay;\n        \n        #endregion\n\n        #region Properties\n\n        public float Delay\n        {\n            get { return _delay; }\n        }\n\n        public AudioInterruptMode Interrupt\n        {\n            get { return _interrupt; }\n            set { _interrupt = value; }\n        }\n\n        #endregion\n\n        #region ITriggerableMechanism Interface\n        \n        public override bool Trigger(object sender, object arg)\n        {\n            if (!this.CanTrigger) return false;\n\n            var src = _targetAudioSource.GetTarget<AudioSource>(arg);\n            if (src == null)\n            {\n                Debug.LogWarning(\"Failed to play audio due to a lack of AudioSource on the target.\", this);\n                return false;\n            }\n\n            if (_interrupt == AudioInterruptMode.DoNotPlayIfPlaying && src.isPlaying) return false;\n\n            if (_settingsMask != 0) _settings.Apply(src, _settingsMask);\n\n            if (_delay > 0f)\n                src.PlayDelayed(_delay);\n            else\n                src.Play();\n\n            return true;\n        }\n\n        #endregion\n        \n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_PlaySoundEffect.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    /// <summary>\r\n    /// Plays a sound on an AudioSource as a one shot.\r\n    /// </summary>\r\n    [Infobox(\"Plays a sound on an AudioSource as a one shot.\")]\r\n    public class i_PlaySoundEffect : AutoTriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [TriggerableTargetObject.Config(typeof(AudioSource))]\r\n        private TriggerableTargetObject _targetAudioSource = new TriggerableTargetObject();\r\n\r\n        [SerializeField()]\r\n        [ReorderableArray()]\r\n        private AudioClip[] _clips;\r\n        \r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Interrupt\")]\r\n        private AudioInterruptMode _interrupt = AudioInterruptMode.StopIfPlaying;\r\n        \r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Delay\")]\r\n        [TimeUnitsSelector()]\r\n        private float _delay;\r\n\r\n        [Tooltip(\"Trigger something at the end of the sound effect. This is NOT perfectly accurate and really just starts a timer for the duration of the sound being played.\")]\r\n        [SerializeField()]\r\n        private Trigger _onAudioComplete;\r\n\r\n        [System.NonSerialized()]\r\n        private System.IDisposable _completeRoutine;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float Delay\r\n        {\r\n            get { return _delay; }\r\n        }\r\n\r\n        public AudioInterruptMode Interrupt\r\n        {\r\n            get { return _interrupt; }\r\n            set { _interrupt = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void OnAudioComplete()\r\n        {\r\n            _completeRoutine = null;\r\n            _onAudioComplete.ActivateTrigger(this, null);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITriggerableMechanism Interface\r\n\r\n        public override bool CanTrigger\r\n        {\r\n            get\r\n            {\r\n                return base.CanTrigger && _clips != null && _clips.Length > 0;\r\n            }\r\n        }\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var src = _targetAudioSource.GetTarget<AudioSource>(arg);\r\n            if (src == null)\r\n            {\r\n                Debug.LogWarning(\"Failed to play audio due to a lack of AudioSource on the target.\", this);\r\n                return false;\r\n            }\r\n            if (src.isPlaying)\r\n            {\r\n                switch (this.Interrupt)\r\n                {\r\n                    case AudioInterruptMode.StopIfPlaying:\r\n                        if (_completeRoutine != null) _completeRoutine.Dispose();\r\n                        _completeRoutine = null;\r\n                        src.Stop();\r\n                        break;\r\n                    case AudioInterruptMode.DoNotPlayIfPlaying:\r\n                        return false;\r\n                    case AudioInterruptMode.PlayOverExisting:\r\n                        //play one shot over existing audio\r\n                        break;\r\n                }\r\n            }\r\n\r\n            var clip = _clips[Random.Range(0, _clips.Length)];\r\n            //src.clip = clip;\r\n\r\n            if (clip != null)\r\n            {\r\n                if (_delay > 0)\r\n                {\r\n                    this.InvokeGuaranteed(() =>\r\n                    {\r\n                        if (src != null)\r\n                        {\r\n                            if(src != null && src.isActiveAndEnabled)\r\n                            {\r\n                                _completeRoutine = this.InvokeGuaranteed(this.OnAudioComplete, clip.length, SPTime.Real);\r\n                                src.PlayOneShot(clip);\r\n                            }\r\n                            else\r\n                            {\r\n                                this.OnAudioComplete();\r\n                            }\r\n                        }\r\n                    }, _delay);\r\n                }\r\n                else\r\n                {\r\n                    if (src != null && src.isActiveAndEnabled)\r\n                    {\r\n                        _completeRoutine = this.InvokeGuaranteed(this.OnAudioComplete, clip.length, SPTime.Real);\r\n                        src.PlayOneShot(clip);\r\n                    }\r\n                    else\r\n                    {\r\n                        this.OnAudioComplete();\r\n                    }\r\n                }\r\n\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_PostNotification.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class i_PostNotification : TriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [TypeReference.Config(typeof(Notification))]\r\n        private TypeReference _notification;\r\n\r\n        [System.NonSerialized()]\r\n        private Notification _n;\r\n\r\n        #endregion\r\n\r\n        #region ITriggerableMechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            if(_n == null || _n.GetType() != _notification.Type)\r\n            {\r\n                try\r\n                {\r\n                    _n = System.Activator.CreateInstance(_notification.Type) as Notification;\r\n                    if (_n == null) return false;\r\n                }\r\n                catch\r\n                {\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            Notification.UnsafePostNotification(this, _n);\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_QuitApplication.cs",
    "content": "﻿using System;\r\nusing UnityEngine;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class i_QuitApplication : TriggerableMechanism\r\n    {\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            GameLoopEntry.QuitApplication();\r\n            return GameLoopEntry.QuitState > QuitState.None;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_SetActiveUIElement.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing UnityEngine.EventSystems;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class i_SetActiveUIElement : AutoTriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private GameObject _element;\r\n\r\n        #endregion\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n\r\n            if(_element != null && EventSystem.current != null)\r\n            {\r\n                EventSystem.current.SetSelectedGameObject(_element);\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_SetParent.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class i_SetParent : AutoTriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private TriggerableTargetObject _child;\r\n        [SerializeField]\r\n        [TriggerableTargetObject.Config(typeof(Transform))]\r\n        private TriggerableTargetObject _parent;\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var child = _child.GetTarget<Transform>(arg);\r\n            var parent = _parent.GetTarget<Transform>(arg);\r\n\r\n            if (child == null) return false;\r\n            child.parent = parent;\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_SetValue.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\n\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class i_SetValue : AutoTriggerableMechanism\r\n    {\r\n\r\n        public enum SetMode\r\n        {\r\n            Set = 0,\r\n            Increment = 1,\r\n            Decrement = 2,\r\n            Toggle = 3\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [SelectableObject]\r\n        [DefaultFromSelf(HandleOnce =true)]\r\n        private UnityEngine.Object _target;\r\n        [SerializeField()]\r\n        private string _memberName;\r\n        [SerializeField()]\r\n        private VariantReference _value;\r\n        [SerializeField()]\r\n        private SetMode _mode;\r\n\r\n        #endregion\r\n        \r\n        #region TriggerableMechanism Interface\r\n\r\n        public override bool CanTrigger\r\n        {\r\n            get\r\n            {\r\n                return base.CanTrigger && _target != null && !string.IsNullOrEmpty(_memberName);\r\n            }\r\n        }\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var targ = ObjUtil.ReduceIfProxy(_target);\r\n            switch(_mode)\r\n            {\r\n                case SetMode.Set:\r\n                    return DynamicUtil.SetValueRecursively(targ, _memberName, _value.Value);\r\n                case SetMode.Increment:\r\n                    {\r\n                        var v = DynamicUtil.GetValueRecursively(targ, _memberName);\r\n                        v = Evaluator.TrySum(v, _value.Value);\r\n                        return DynamicUtil.SetValueRecursively(targ, _memberName, v);\r\n                    }\r\n                case SetMode.Decrement:\r\n                    {\r\n                        var v = DynamicUtil.GetValueRecursively(targ, _memberName);\r\n                        v = Evaluator.TryDifference(v, _value.Value);\r\n                        return DynamicUtil.SetValueRecursively(targ, _memberName, v);\r\n                    }\r\n                case SetMode.Toggle:\r\n                    {\r\n                        var v = DynamicUtil.GetValueRecursively(targ, _memberName);\r\n                        v = Evaluator.TryToggle(v);\r\n                        return DynamicUtil.SetValueRecursively(targ, _memberName, v);\r\n                    }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_SetValueOnEntity.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    [System.Obsolete(\"Use i_SetValueOnTarget Instead.\")]\r\n    public class i_SetValueOnEntity : AutoTriggerableMechanism\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private TriggerableTargetObject _target = new TriggerableTargetObject(true);\r\n\r\n        [SerializeField()]\r\n        private bool _searchEntity = true;\r\n\r\n        [SerializeField()]\r\n        [TypeReference.Config(typeof(Component), dropDownStyle = TypeDropDownListingStyle.ComponentMenu)]\r\n        private TypeReference _componentType;\r\n\r\n        [SerializeField()]\r\n        private string _memberName;\r\n        [SerializeField()]\r\n        private VariantReference _value;\r\n        [SerializeField()]\r\n        private i_SetValue.SetMode _mode;\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var go = _target.GetTarget<GameObject>(arg);\r\n            if (go == null) return false;\r\n\r\n            var targ = (_searchEntity) ? go.FindComponent(_componentType.Type) : go.GetComponent(_componentType.Type);\r\n            if (targ == null) return false;\r\n\r\n            switch (_mode)\r\n            {\r\n                case i_SetValue.SetMode.Set:\r\n                    return DynamicUtil.SetValue(targ, _memberName, _value.Value);\r\n                case i_SetValue.SetMode.Increment:\r\n                    {\r\n                        var v = DynamicUtil.GetValue(targ, _memberName);\r\n                        v = Evaluator.TrySum(v, _value.Value);\r\n                        return DynamicUtil.SetValue(targ, _memberName, v);\r\n                    }\r\n                case i_SetValue.SetMode.Decrement:\r\n                    {\r\n                        var v = DynamicUtil.GetValue(targ, _memberName);\r\n                        v = Evaluator.TryDifference(v, _value.Value);\r\n                        return DynamicUtil.SetValue(targ, _memberName, v);\r\n                    }\r\n                case i_SetValue.SetMode.Toggle:\r\n                    {\r\n                        var v = DynamicUtil.GetValue(targ, _memberName);\r\n                        v = Evaluator.TryToggle(v);\r\n                        return DynamicUtil.SetValue(targ, _memberName, v);\r\n                    }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_SetValueOnTarget.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class i_SetValueOnTarget : AutoTriggerableMechanism\r\n    {\r\n\r\n        public enum SetMode\r\n        {\r\n            Set = 0,\r\n            Increment = 1,\r\n            Decrement = 2,\r\n            Toggle = 3\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private TriggerableTargetObject _target = new TriggerableTargetObject(true);\r\n        [SerializeField()]\r\n        [TypeReference.Config(typeof(UnityEngine.Object), dropDownStyle = TypeDropDownListingStyle.ComponentMenu)]\r\n        private TypeReference _restrictedType;\r\n\r\n        [SerializeField()]\r\n        private string _memberName;\r\n        [SerializeField()]\r\n        private VariantReference[] _values;\r\n        [SerializeField()]\r\n        private SetMode _mode;\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            //var targ = _target.GetTarget<object>(arg);\r\n            //if (targ == null) return false;\r\n\r\n            //if (_restrictedType != null && _restrictedType.Type != null) targ = ObjUtil.GetAsFromSource(_restrictedType.Type, targ);\r\n            //if (targ == null) return false;\r\n\r\n            object targ;\r\n            if(_restrictedType != null && _restrictedType.Type != null)\r\n                targ = _target.GetTarget(_restrictedType.Type, arg);\r\n            else\r\n                targ = _target.GetTarget<object>(arg);\r\n            if (targ == null) return false;\r\n\r\n            switch (_mode)\r\n            {\r\n                case SetMode.Set:\r\n                    {\r\n                        if (_values == null || _values.Length == 0) return false;\r\n                        if (_values.Length == 1)\r\n                        {\r\n                            return DynamicUtil.SetValue(targ, _memberName, _values[0].Value);\r\n                        }\r\n                        else\r\n                        {\r\n                            var args = (from v in _values select v.Value).ToArray();\r\n                            DynamicUtil.InvokeMethod(targ, _memberName, args);\r\n                            return true;\r\n                        }\r\n                    }\r\n                case SetMode.Increment:\r\n                    {\r\n                        if (_values == null || _values.Length == 0) return false;\r\n                        var v = DynamicUtil.GetValue(targ, _memberName);\r\n                        v = Evaluator.TrySum(v, _values[0].Value);\r\n                        return DynamicUtil.SetValue(targ, _memberName, v);\r\n                    }\r\n                case SetMode.Decrement:\r\n                    {\r\n                        if (_values == null || _values.Length == 0) return false;\r\n                        var v = DynamicUtil.GetValue(targ, _memberName);\r\n                        v = Evaluator.TryDifference(v, _values[0].Value);\r\n                        return DynamicUtil.SetValue(targ, _memberName, v);\r\n                    }\r\n                case SetMode.Toggle:\r\n                    {\r\n                        var v = DynamicUtil.GetValue(targ, _memberName);\r\n                        v = Evaluator.TryToggle(v);\r\n                        return DynamicUtil.SetValue(targ, _memberName, v);\r\n                    }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_SetValueOnTriggerArg.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\n\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    [System.Obsolete(\"Use i_SetValueOnTarget Instead.\")]\r\n    public class i_SetValueOnTriggerArg : AutoTriggerableMechanism\r\n    {\r\n\r\n        public enum SetMode\r\n        {\r\n            Set = 0,\r\n            Increment = 1,\r\n            Decrement = 2,\r\n            Toggle = 3\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private bool _searchEntity;\r\n\r\n        [SerializeField()]\r\n        [TypeReference.Config(typeof(Component), dropDownStyle = TypeDropDownListingStyle.ComponentMenu)]\r\n        private TypeReference _componentType;\r\n\r\n        [SerializeField()]\r\n        private string _memberName;\r\n        [SerializeField()]\r\n        private VariantReference _value;\r\n        [SerializeField()]\r\n        private SetMode _mode;\r\n\r\n        #endregion\r\n\r\n        #region TriggerableMechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var go = GameObjectUtil.GetGameObjectFromSource(arg);\r\n            if(go == null) return false;\r\n\r\n            var targ = (_searchEntity) ? go.FindComponent(_componentType.Type) : go.GetComponent(_componentType.Type);\r\n            if (targ == null) return false;\r\n\r\n            switch (_mode)\r\n            {\r\n                case SetMode.Set:\r\n                    return DynamicUtil.SetValue(targ, _memberName, _value.Value);\r\n                case SetMode.Increment:\r\n                    {\r\n                        var v = DynamicUtil.GetValue(targ, _memberName);\r\n                        v = Evaluator.TrySum(v, _value.Value);\r\n                        return DynamicUtil.SetValue(targ, _memberName, v);\r\n                    }\r\n                case SetMode.Decrement:\r\n                    {\r\n                        var v = DynamicUtil.GetValue(targ, _memberName);\r\n                        v = Evaluator.TryDifference(v, _value.Value);\r\n                        return DynamicUtil.SetValue(targ, _memberName, v);\r\n                    }\r\n                case SetMode.Toggle:\r\n                    {\r\n                        var v = DynamicUtil.GetValue(targ, _memberName);\r\n                        v = Evaluator.TryToggle(v);\r\n                        return DynamicUtil.SetValue(targ, _memberName, v);\r\n                    }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_SignalEvent.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class i_SignalEvent : AutoTriggerableMechanism\r\n    {\r\n\r\n        private System.Action<string> _signal;\r\n\r\n        public void WaitOne(System.Action<string> callback)\r\n        {\r\n            _signal += callback;\r\n        }\r\n\r\n        public void Signal(string token)\r\n        {\r\n            var d = _signal;\r\n            _signal = null;\r\n            if (d != null) d(token);\r\n        }\r\n        \r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            this.Signal(null);\r\n            return true;\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_StartTetherJoint.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Tween;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class i_StartTetherJoint : AutoTriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        [TriggerableTargetObject.Config(typeof(Transform))]\r\n        [Tooltip(\"Target that gets tethered to 'Link Target'.\")]\r\n        private TriggerableTargetObject _target;\r\n\r\n        [SerializeField]\r\n        [TriggerableTargetObject.Config(typeof(Transform))]\r\n        [Tooltip(\"Target to be tethered to.\")]\r\n        private TriggerableTargetObject _linkTarget;\r\n\r\n        [SerializeField]\r\n        [EnumPopupExcluding(new int[] { (int)UpdateSequence.None })]\r\n        private UpdateSequence _updateMode = UpdateSequence.Update;\r\n\r\n        [SerializeField]\r\n        private Constraint _constraint = Constraint.All;\r\n\r\n        [SerializeField]\r\n        private bool _doPositionDamping;\r\n        [SerializeField]\r\n        private TetherJoint.JointDampingStyle _positionDampingStyle;\r\n        [SerializeField]\r\n        private float _positionDampingStrength;\r\n        [SerializeField]\r\n        private bool _doRotationDamping;\r\n        [SerializeField]\r\n        private TetherJoint.JointDampingStyle _rotationDampingStyle;\r\n        [SerializeField]\r\n        private float _rotationDampingStrength;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public TriggerableTargetObject Target\r\n        {\r\n            get { return _target; }\r\n        }\r\n\r\n        public TriggerableTargetObject LinkTarget\r\n        {\r\n            get { return _linkTarget; }\r\n        }\r\n\r\n        public UpdateSequence UpdateMode\r\n        {\r\n            get { return _updateMode; }\r\n            set { _updateMode = value; }\r\n        }\r\n\r\n        public Constraint Constraint\r\n        {\r\n            get { return _constraint; }\r\n            set { _constraint = value; }\r\n        }\r\n\r\n        public bool DoPositionDamping\r\n        {\r\n            get { return _doPositionDamping; }\r\n            set { _doPositionDamping = value; }\r\n        }\r\n\r\n        public TetherJoint.JointDampingStyle PositionDampingStyle\r\n        {\r\n            get { return _positionDampingStyle; }\r\n            set { _positionDampingStyle = value; }\r\n        }\r\n\r\n        public float PositionDampingStrength\r\n        {\r\n            get { return _positionDampingStrength; }\r\n            set { _positionDampingStrength = value; }\r\n        }\r\n\r\n        public bool DoRotationDamping\r\n        {\r\n            get { return _doRotationDamping; }\r\n            set { _doRotationDamping = value; }\r\n        }\r\n\r\n        public TetherJoint.JointDampingStyle RotationDampingStyle\r\n        {\r\n            get { return _rotationDampingStyle; }\r\n            set { _rotationDampingStyle = value; }\r\n        }\r\n\r\n        public float RotationDampingStrength\r\n        {\r\n            get { return _rotationDampingStrength; }\r\n            set { _rotationDampingStrength = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Triggerable Mechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var targ = _target.GetTarget<Transform>(arg);\r\n            if (targ == null) return false;\r\n\r\n            var link = _linkTarget.GetTarget<Transform>(arg);\r\n            if (link == null) return false;\r\n\r\n            var tether = targ.AddOrGetComponent<TetherJoint>();\r\n            tether.LinkTarget = link;\r\n            tether.UpdateMode = _updateMode;\r\n            tether.Constraint = _constraint;\r\n            tether.DoPositionDamping = _doPositionDamping;\r\n            tether.PositionDampingStyle = _positionDampingStyle;\r\n            tether.PositionDampingStrength = _positionDampingStrength;\r\n            tether.DoRotationDamping = _doRotationDamping;\r\n            tether.RotationDampingStyle = _rotationDampingStyle;\r\n            tether.RotationDampingStrength = _rotationDampingStrength;\r\n            tether.enabled = true;\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_StopAudioSource.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\n\r\nusing com.spacepuppy.Tween;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class i_StopAudioSource : AutoTriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        [TriggerableTargetObject.Config(typeof(AudioSource))]\r\n        private TriggerableTargetObject _target;\r\n\r\n        [SerializeField]\r\n        [TimeUnitsSelector()]\r\n        private float _fadeOutDur;\r\n\r\n        [SerializeField]\r\n        private DisableMode _disableAudioSource;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public TriggerableTargetObject Target\r\n        {\r\n            get { return _target; }\r\n        }\r\n\r\n        public float FadeOutDur\r\n        {\r\n            get { return _fadeOutDur; }\r\n            set { _fadeOutDur = value; }\r\n        }\r\n\r\n        public DisableMode DisableAudioSource\r\n        {\r\n            get { return _disableAudioSource; }\r\n            set { _disableAudioSource = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var targ = _target.GetTarget<AudioSource>(arg);\r\n            if (targ == null) return false;\r\n            if (!targ.isPlaying) return false;\r\n\r\n            if(_fadeOutDur > 0f)\r\n            {\r\n                float cache = targ.volume;\r\n                SPTween.Tween(targ)\r\n                       .To(\"volume\", _fadeOutDur, 0f)\r\n                       .OnFinish((s,e) =>\r\n                       {\r\n                           targ.Stop();\r\n                           targ.volume = cache;\r\n                           switch(_disableAudioSource)\r\n                           {\r\n                               case DisableMode.DisableComponent:\r\n                                   targ.enabled = false;\r\n                                   break;\r\n                               case DisableMode.DisableGameObject:\r\n                                   targ.gameObject.SetActive(false);\r\n                                   break;\r\n                           }\r\n                       })\r\n                       .Play(true);\r\n            }\r\n            else\r\n            {\r\n                targ.Stop();\r\n                switch (_disableAudioSource)\r\n                {\r\n                    case DisableMode.DisableComponent:\r\n                        targ.enabled = false;\r\n                        break;\r\n                    case DisableMode.DisableGameObject:\r\n                        targ.gameObject.SetActive(false);\r\n                        break;\r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_StopTetherJoint.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class i_StopTetherJoint : AutoTriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        [TriggerableTargetObject.Config(typeof(Transform))]\r\n        [Tooltip(\"Target that gets tethered to 'Link Target'.\")]\r\n        private TriggerableTargetObject _target;\r\n\r\n        [SerializeField]\r\n        [Tooltip(\"Destroy the tether instead of just disabling it.\")]\r\n        private bool _destroyTether;\r\n\r\n        #endregion\r\n\r\n        #region Triggerable Mechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n            \r\n            var targ = _target.GetTarget<Transform>(arg);\r\n            if (targ == null) return false;\r\n\r\n            var tether = targ.GetComponent<TetherJoint>();\r\n            if (tether == null) return false;\r\n\r\n            if (_destroyTether)\r\n                ObjUtil.SmartDestroy(tether);\r\n            else\r\n                tether.enabled = false;\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_SwapMaterialFlash.cs",
    "content": "﻿using UnityEngine;\r\nusing com.spacepuppy.Render;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class i_SwapMaterialFlash : TriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        //[ModifierChain()]\r\n        //[DefaultFromSelf()]\r\n        [InsertButton(\"Search for Renderers\", \"FindRenderersInTarget\")]\r\n        [SerializeField()]\r\n        [TriggerableTargetObject.Config(typeof(GameObject))]\r\n        private TriggerableTargetObject _target = new TriggerableTargetObject();\r\n\r\n        [SerializeField()]\r\n        private bool _searchEntireEntity = true;\r\n\r\n        [SerializeField()]\r\n        [Tooltip(\"Leave empty to have it auto-sync on load.\")]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"TargetRenderers\")]\r\n        private Renderer[] _targetRenderers;\r\n\r\n        [SerializeField()]\r\n        [Tooltip(\"The material to swap out with.\")]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Material\")]\r\n        private Material _material;\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Duration\")]\r\n        private float _duration = 0.1f;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnStartOrEnable()\r\n        {\r\n            base.OnStartOrEnable();\r\n\r\n            if(!_target.TargetsTriggerArg &&\r\n               (_targetRenderers == null || _targetRenderers.Length == 0))\r\n            {\r\n                this.FindRenderersInTarget();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public TriggerableTargetObject Target\r\n        {\r\n            get { return _target; }\r\n        }\r\n\r\n        public bool SearchEntireEntity\r\n        {\r\n            get { return _searchEntireEntity; }\r\n            set { _searchEntireEntity = value; }\r\n        }\r\n\r\n        public Material Material\r\n        {\r\n            get { return _material; }\r\n            set { _material = value; }\r\n        }\r\n\r\n        public float Duration\r\n        {\r\n            get { return _duration; }\r\n            set { _duration = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// If 'Target' is modified, this must be called to resync the cached renderers.\r\n        /// </summary>\r\n        public void FindRenderersInTarget()\r\n        {\r\n            if (_target == null || !_target.TargetsTriggerArg)\r\n            {\r\n                _targetRenderers = ArrayUtil.Empty<Renderer>();\r\n                return;\r\n            }\r\n\r\n            var src = _target.GetTarget<GameObject>(null);\r\n            if (src == null) return;\r\n            if (_searchEntireEntity) src = GameObjectUtil.FindRoot(src);\r\n\r\n            _targetRenderers = src.GetComponentsInChildren<Renderer>();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITriggerableMechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            Renderer[] arr;\r\n            if(_target.TargetsTriggerArg)\r\n            {\r\n                var targ = _target.GetTarget<GameObject>(arg);\r\n                if (targ == null) return false;\r\n                if (_searchEntireEntity) targ = GameObjectUtil.FindRoot(targ);\r\n                arr = targ.GetComponentsInChildren<Renderer>();\r\n            }\r\n            else\r\n            {\r\n                arr = _targetRenderers;\r\n            }\r\n\r\n            if (arr == null || arr.Length == 0) return false;\r\n\r\n            for (int i = 0; i < arr.Length; i++)\r\n            {\r\n                if(arr[i] != null) RendererMaterialSwap.Swap(arr[i], _material, _duration);\r\n            }\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_Teleport.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class i_Teleport : TriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Target\")]\r\n        [TriggerableTargetObject.Config(typeof(Transform))]\r\n        private TriggerableTargetObject _target = new TriggerableTargetObject();\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Location\")]\r\n        [TriggerableTargetObject.Config(typeof(Transform))]\r\n        private TriggerableTargetObject _location = new TriggerableTargetObject();\r\n\r\n        [SerializeField]\r\n        private bool _orientWithLocationRotation;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"TeleportEntireEntity\")]\r\n        private bool _teleportEntireEntity = true;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public TriggerableTargetObject Target\r\n        {\r\n            get { return _target; }\r\n        }\r\n\r\n        public TriggerableTargetObject Location\r\n        {\r\n            get { return _location; }\r\n        }\r\n\r\n        public bool OrientWithLocationRotation\r\n        {\r\n            get { return _orientWithLocationRotation; }\r\n            set { _orientWithLocationRotation = value; }\r\n        }\r\n\r\n        public bool TeleportEntireEntity\r\n        {\r\n            get { return _teleportEntireEntity; }\r\n            set { _teleportEntireEntity = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region TriggerableMechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var targ = this._target.GetTarget<Transform>(arg);\r\n            if (targ == null) return false;\r\n            if (_teleportEntireEntity) targ = GameObjectUtil.FindRoot(targ).transform;\r\n\r\n            var loc = _location.GetTarget<Transform>(arg);\r\n            if (targ == null || loc == null) return false;\r\n\r\n            targ.position = loc.position;\r\n            if (_orientWithLocationRotation)\r\n                targ.rotation = loc.rotation;\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_Trigger.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class i_Trigger : AutoTriggerableMechanism, IObservableTrigger\r\n    {\r\n\r\n        #region Fields\r\n        \r\n        [SerializeField()]\r\n        private Trigger _trigger;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"PassAlongTriggerArg\")]\r\n        private bool _passAlongTriggerArg;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Delay\")]\r\n        [TimeUnitsSelector()]\r\n        private float _delay = 0f;\r\n        [SerializeField]\r\n        private SPTime _delayTimeSupplier;\r\n        \r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n        \r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Trigger TriggerEvent\r\n        {\r\n            get\r\n            {\r\n                return _trigger;\r\n            }\r\n        }\r\n\r\n        public bool PassAlongTriggerArg\r\n        {\r\n            get { return _passAlongTriggerArg; }\r\n            set { _passAlongTriggerArg = value; }\r\n        }\r\n\r\n        //public float Delay\r\n        //{\r\n        //    get { return _delay; }\r\n        //    set { _delay = value; }\r\n        //}\r\n\r\n        public SPTimePeriod Delay\r\n        {\r\n            get\r\n            {\r\n                return new SPTimePeriod(_delay, _delayTimeSupplier);\r\n            }\r\n            set\r\n            {\r\n                _delay = value.Seconds;\r\n                _delayTimeSupplier = (SPTime)value;\r\n            }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void DoTriggerNext(object arg)\r\n        {\r\n            if (this._passAlongTriggerArg)\r\n                _trigger.ActivateTrigger(this, arg);\r\n            else\r\n                _trigger.ActivateTrigger(this, null);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITriggerableMechanism Interface\r\n        \r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            if (_delay > 0f)\r\n            {\r\n                this.InvokeGuaranteed(() =>\r\n                {\r\n                    this.DoTriggerNext(arg);\r\n                }, _delay, _delayTimeSupplier.TimeSupplier);\r\n            }\r\n            else\r\n            {\r\n                this.DoTriggerNext(arg);\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IObservableTrigger Interface\r\n\r\n        Trigger[] IObservableTrigger.GetTriggers()\r\n        {\r\n            return new Trigger[] { _trigger };\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_TriggerChildren.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    [System.Obsolete(\"This thing is bonkers weird, and is a relic of early versions of the t&i system. Ignore this thing at all costs.\")]\r\n    public class i_TriggerChildren : AutoTriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [TriggerableTargetObject.Config(typeof(Transform))]\r\n        private TriggerableTargetObject _target = new TriggerableTargetObject();\r\n\r\n        [SerializeField()]\r\n        private bool _passAlongTriggerArg = true;\r\n\r\n        [SerializeField()]\r\n        [TimeUnitsSelector()]\r\n        private float _delay;\r\n        [SerializeField]\r\n        private SPTime _delayTimeSupplier;\r\n\r\n        [SerializeField()]\r\n        [Tooltip(\"If you want to target only a specific child by its name, put that here. Otherwise leave blank to trigger all children.\")]\r\n        private string _specificTargetName;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public TriggerableTargetObject Target\r\n        {\r\n            get { return _target; }\r\n        }\r\n\r\n        public bool PassAlongTriggerArg\r\n        {\r\n            get { return _passAlongTriggerArg; }\r\n            set { _passAlongTriggerArg = value; }\r\n        }\r\n\r\n        //public float Delay\r\n        //{\r\n        //    get { return _delay; }\r\n        //    set { _delay = value; }\r\n        //}\r\n\r\n        public SPTimePeriod Delay\r\n        {\r\n            get\r\n            {\r\n                return new SPTimePeriod(_delay, _delayTimeSupplier);\r\n            }\r\n            set\r\n            {\r\n                _delay = value.Seconds;\r\n                _delayTimeSupplier = (SPTime)value;\r\n            }\r\n        }\r\n\r\n        public string SpecificTargetName\r\n        {\r\n            get { return _specificTargetName; }\r\n            set { _specificTargetName = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void DoTriggerAllChildren(Transform trans, object arg)\r\n        {\r\n            if (trans == null) return;\r\n\r\n            if (!string.IsNullOrEmpty(_specificTargetName))\r\n            {\r\n                var child = trans.Find(_specificTargetName);\r\n                if (child != null && child.gameObject.activeInHierarchy)\r\n                {\r\n                    //foreach (var t in (from t in child.GetComponents<ITriggerableMechanism>() where t.CanTrigger orderby t.Order ascending select t))\r\n                    //{\r\n                    //    if (_passAlongTriggerArg)\r\n                    //        t.Trigger(this, arg);\r\n                    //    else\r\n                    //        t.Trigger(this, null);\r\n                    //}\r\n                    using (var lst = com.spacepuppy.Collections.TempCollection.GetList<ITriggerableMechanism>())\r\n                    {\r\n                        child.GetChildComponents<ITriggerableMechanism>(lst);\r\n                        lst.Sort(TriggerableMechanismOrderComparer.Default);\r\n                        var e = lst.GetEnumerator();\r\n                        if(e.MoveNext())\r\n                        {\r\n                            if(e.Current.CanTrigger)\r\n                            {\r\n                                if (_passAlongTriggerArg)\r\n                                    e.Current.Trigger(this, arg);\r\n                                else\r\n                                    e.Current.Trigger(this, null);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                foreach (Transform child in trans)\r\n                {\r\n                    if (child != null && child.gameObject.activeInHierarchy)\r\n                    {\r\n                        //foreach (var t in (from t in child.GetComponents<ITriggerableMechanism>() where t.CanTrigger orderby t.Order ascending select t))\r\n                        //{\r\n                        //    if (_passAlongTriggerArg)\r\n                        //        t.Trigger(this, arg);\r\n                        //    else\r\n                        //        t.Trigger(this, null);\r\n                        //}\r\n                        using (var lst = com.spacepuppy.Collections.TempCollection.GetList<ITriggerableMechanism>())\r\n                        {\r\n                            child.GetChildComponents<ITriggerableMechanism>(lst);\r\n                            lst.Sort(TriggerableMechanismOrderComparer.Default);\r\n                            var e = lst.GetEnumerator();\r\n                            if (e.MoveNext())\r\n                            {\r\n                                if (e.Current.CanTrigger)\r\n                                {\r\n                                    if (_passAlongTriggerArg)\r\n                                        e.Current.Trigger(this, arg);\r\n                                    else\r\n                                        e.Current.Trigger(this, null);\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Triggerable Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var trans = _target.GetTarget<Transform>(arg);\r\n            if (trans == null) return false;\r\n\r\n            if (_delay > 0f)\r\n            {\r\n                this.Invoke(() =>\r\n                {\r\n                    this.DoTriggerAllChildren(trans, arg);\r\n                }, _delay, _delayTimeSupplier.TimeSupplier);\r\n            }\r\n            else\r\n            {\r\n                this.DoTriggerAllChildren(trans, arg);\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_TriggerFirstEnabledTarget.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\nusing UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Scenario\n{\n\n    /// <summary>\n    /// \n    /// </summary>\n    [Infobox(\"Cascades through the target list until it finds the first target that is active/enabled and triggers that.\")]\n    public class i_TriggerFirstEnabledTarget : AutoTriggerableMechanism\n    {\n        \n        [SerializeField]\n        private Trigger _cascade;\n        [SerializeField]\n        private bool _passAlongArg;\n\n\n        public override bool Trigger(object sender, object arg)\n        {\n            if (!this.CanTrigger) return false;\n\n            int cnt = _cascade.Targets.Count;\n            for(int i = 0; i < cnt; i++)\n            {\n                var targ = _cascade.Targets[i];\n                if (targ == null) continue;\n\n                var obj = targ.CalculateTarget(arg);\n                if (obj == null) continue;\n\n                var go = GameObjectUtil.GetGameObjectFromSource(obj);\n                if (go != null && !go.activeInHierarchy) continue;\n\n                _cascade.ActivateTriggerAt(i, this, _passAlongArg ? arg : null);\n                return true;\n            }\n\n            return false;\n        }\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_TriggerForEachArg.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    /// <summary>\r\n    /// Loops over collection of args and calls 'Action' for each one.\r\n    /// </summary>\r\n    [Infobox(\"Loops over collection of args and calls 'Action' for each one.\")]\r\n    public class i_TriggerForEachArg : AutoTriggerableMechanism\r\n    {\r\n\r\n        public enum TargetMode\r\n        {\r\n            All = 0,\r\n            First = 1,\r\n            FirstUnique = 2\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        [Tooltip(\"When running each query which entries should be used. Note that 'FirstUnique' is the slowest.\")]\r\n        private TargetMode _targetSearchMode = TargetMode.All;\r\n\r\n        [SerializeField]\r\n        [ReorderableArray]\r\n        [TriggerableTargetObject.Config(typeof(UnityEngine.Object), AlwaysExpanded = true)]\r\n        private TriggerableTargetObject[] _targets;\r\n\r\n        [SerializeField]\r\n        private Trigger _action;\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n            \r\n            switch(_targetSearchMode)\r\n            {\r\n                case TargetMode.All:\r\n                    foreach (var t1 in _targets)\r\n                    {\r\n                        foreach (var t2 in t1.GetTargets<UnityEngine.Object>(arg))\r\n                        {\r\n                            if (t2 != null) _action.ActivateTrigger(this, t2);\r\n                        }\r\n                    }\r\n                    break;\r\n                case TargetMode.First:\r\n                    foreach (var t1 in _targets)\r\n                    {\r\n                        var t2 = t1.GetTarget<UnityEngine.Object>(arg);\r\n                        if (t2 != null) _action.ActivateTrigger(this, t2);\r\n                    }\r\n                    break;\r\n                case TargetMode.FirstUnique:\r\n                    using(var set = TempCollection.GetSet<UnityEngine.Object>())\r\n                    {\r\n                        foreach (var t1 in _targets)\r\n                        {\r\n                            foreach (var t2 in t1.GetTargets<UnityEngine.Object>(arg))\r\n                            {\r\n                                if(t2 != null && !set.Contains(t2))\r\n                                {\r\n                                    set.Add(t2);\r\n                                    _action.ActivateTrigger(this, t2);\r\n                                    break;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    break;\r\n            }\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_TriggerOnEnumState.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\n\nusing UnityEngine;\nusing System.Linq;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Scenario\n{\n\n    [Infobox(\"This acts like a switch/case for enums. Default is what is called if none of the cases match.\\nNote that 'MatchFlagExactly' does not like 'Everything' options.\")]\n    public class i_TriggerOnEnumState : AutoTriggerableMechanism, IObservableTrigger\n    {\n\n        public enum EnumFlagTestModes\n        {\n            NoFlag,\n            MatchAnyFlag,\n            MatchFlagExactly\n        }\n\n        #region Fields\n\n        [SerializeField]\n        private VariantReference _target = new VariantReference(VariantReference.RefMode.Property);\n\n        [SerializeField()]\n        private ConditionBlock[] _conditions;\n        [SerializeField]\n        private Trigger _defaultCondition;\n\n        [SerializeField]\n        private bool _passAlongTriggerArg;\n\n        #endregion\n\n        #region Properties\n\n        public VariantReference Target\n        {\n            get { return _target; }\n        }\n\n        #endregion\n\n        #region ITriggerableMechanism Interface\n\n        public override bool Trigger(object sender, object arg)\n        {\n            if (_conditions == null || _conditions.Length == 0) return false;\n\n            int st = _target.IntValue;\n\n            foreach(var c in _conditions)\n            {\n                if (c == null) continue;\n                \n                if (c.TestState(st))\n                {\n                    c.Trigger.ActivateTrigger(this, _passAlongTriggerArg ? arg : null);\n                    return true;\n                }\n            }\n\n            _defaultCondition.ActivateTrigger(this, _passAlongTriggerArg ? arg : null);\n            return true;\n        }\n\n        #endregion\n\n        #region Special Types\n\n        [System.Serializable()]\n        public class ConditionBlock\n        {\n\n            [SerializeField]\n            private int _value;\n            [SerializeField]\n            private EnumFlagTestModes _enumFlags;\n            [SerializeField()]\n            private Trigger _trigger = new Trigger();\n\n\n            public int Value\n            {\n                get { return _value; }\n                set { _value = value; }\n            }\n\n            public EnumFlagTestModes EnumFlags\n            {\n                get { return _enumFlags; }\n                set { _enumFlags = value; }\n            }\n\n            public Trigger Trigger\n            {\n                get { return _trigger; }\n            }\n\n            public bool TestState(int st)\n            {\n                switch (_enumFlags)\n                {\n                    case EnumFlagTestModes.NoFlag:\n                         return st == _value;\n                    case EnumFlagTestModes.MatchAnyFlag:\n                        return (st & _value) != 0;\n                    case EnumFlagTestModes.MatchFlagExactly:\n                        return st == _value;\n                }\n\n                return false;\n            }\n\n        }\n\n        #endregion\n\n        #region IObservableTrigger Interface\n\n        Trigger[] IObservableTrigger.GetTriggers()\n        {\n            return (from c in _conditions select c.Trigger).Append(_defaultCondition).ToArray();\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_TriggerOnEval.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class i_TriggerOnEval : AutoTriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private ConditionBlock[] _conditions;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"PassAlongTriggerArg\")]\r\n        private bool _passAlongTriggerArg;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Delay\")]\r\n        [TimeUnitsSelector()]\r\n        private float _delay = 0f;\r\n        [SerializeField]\r\n        private SPTime _delayTimeSupplier;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool PassAlongTriggerArg\r\n        {\r\n            get { return _passAlongTriggerArg; }\r\n            set { _passAlongTriggerArg = value; }\r\n        }\r\n\r\n        //public float Delay\r\n        //{\r\n        //    get { return _delay; }\r\n        //    set { _delay = value; }\r\n        //}\r\n\r\n        public SPTimePeriod Delay\r\n        {\r\n            get\r\n            {\r\n                return new SPTimePeriod(_delay, _delayTimeSupplier);\r\n            }\r\n            set\r\n            {\r\n                _delay = value.Seconds;\r\n                _delayTimeSupplier = (SPTime)value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITriggerableMechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (_conditions == null || _conditions.Length == 0) return false;\r\n\r\n            bool result = false;\r\n            if (!this._passAlongTriggerArg) arg = null;\r\n            foreach (var c in _conditions)\r\n            {\r\n                if (c.Condition.BoolValue)\r\n                {\r\n                    if (_delay > 0f)\r\n                    {\r\n                        this.InvokeGuaranteed(() =>\r\n                        {\r\n                            c.Trigger.ActivateTrigger(this, arg);\r\n                        }, _delay, _delayTimeSupplier.TimeSupplier);\r\n                    }\r\n                    else\r\n                    {\r\n                        c.Trigger.ActivateTrigger(this, arg);\r\n                    }\r\n\r\n                    result = true;\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        [System.Serializable()]\r\n        public class ConditionBlock\r\n        {\r\n\r\n            [SerializeField()]\r\n            private VariantReference _condition = new VariantReference();\r\n            [SerializeField()]\r\n            private Trigger _trigger = new Trigger();\r\n\r\n\r\n            public VariantReference Condition\r\n            {\r\n                get { return _condition; }\r\n            }\r\n\r\n            public Trigger Trigger\r\n            {\r\n                get { return _trigger; }\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_TriggerOnIfThen.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class i_TriggerOnIfThen : AutoTriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private ConditionBlock[] _conditions;\r\n        [SerializeField]\r\n        private Trigger _elseCondition;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"PassAlongTriggerArg\")]\r\n        private bool _passAlongTriggerArg;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Delay\")]\r\n        [TimeUnitsSelector()]\r\n        private float _delay = 0f;\r\n        [SerializeField]\r\n        private SPTime _delayTimeSupplier;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool PassAlongTriggerArg\r\n        {\r\n            get { return _passAlongTriggerArg; }\r\n            set { _passAlongTriggerArg = value; }\r\n        }\r\n\r\n        //public float Delay\r\n        //{\r\n        //    get { return _delay; }\r\n        //    set { _delay = value; }\r\n        //}\r\n\r\n        public SPTimePeriod Delay\r\n        {\r\n            get\r\n            {\r\n                return new SPTimePeriod(_delay, _delayTimeSupplier);\r\n            }\r\n            set\r\n            {\r\n                _delay = value.Seconds;\r\n                _delayTimeSupplier = (SPTime)value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITriggerableMechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (_conditions == null || _conditions.Length == 0) return false;\r\n\r\n            if (!this._passAlongTriggerArg) arg = null;\r\n            foreach(var c in _conditions)\r\n            {\r\n                if (c.Condition.BoolValue)\r\n                {\r\n                    if (_delay > 0f)\r\n                    {\r\n                        this.InvokeGuaranteed(() =>\r\n                        {\r\n                            c.Trigger.ActivateTrigger(this,arg);\r\n                        }, _delay);\r\n                    }\r\n                    else\r\n                    {\r\n                        c.Trigger.ActivateTrigger(this,arg);\r\n                    }\r\n                    return true;\r\n                }\r\n            }\r\n\r\n            //if we reached here, it's else\r\n            if (_delay > 0f)\r\n            {\r\n                this.InvokeGuaranteed(() =>\r\n                {\r\n                    _elseCondition.ActivateTrigger(this, arg);\r\n                }, _delay, _delayTimeSupplier.TimeSupplier);\r\n            }\r\n            else\r\n            {\r\n                _elseCondition.ActivateTrigger(this, arg);\r\n            }\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        [System.Serializable()]\r\n        public class ConditionBlock\r\n        {\r\n\r\n            [SerializeField()]\r\n            private VariantReference _condition = new VariantReference();\r\n            [SerializeField()]\r\n            private Trigger _trigger = new Trigger();\r\n\r\n\r\n            public VariantReference Condition\r\n            {\r\n                get { return _condition; }\r\n            }\r\n\r\n            public Trigger Trigger\r\n            {\r\n                get { return _trigger; }\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_TriggerRandom.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class i_TriggerRandom : AutoTriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [Trigger.Config(Weighted=true)]\r\n        private Trigger _targets;\r\n\r\n        [SerializeField]\r\n        private bool _selectOnlyActiveTargets;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"PassAlongTriggerArg\")]\r\n        private bool _passAlongTriggerArg;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Delay\")]\r\n        [TimeUnitsSelector()]\r\n        private float _delay = 0f;\r\n        [SerializeField]\r\n        private SPTime _delayTimeSupplier;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool SelectOnlyActiveTargets\r\n        {\r\n            get { return _selectOnlyActiveTargets; }\r\n            set { _selectOnlyActiveTargets = value; }\r\n        }\r\n\r\n        public bool PassAlongTriggerArg\r\n        {\r\n            get { return _passAlongTriggerArg; }\r\n            set { _passAlongTriggerArg = value; }\r\n        }\r\n\r\n        //public float Delay\r\n        //{\r\n        //    get { return _delay; }\r\n        //    set { _delay = value; }\r\n        //}\r\n\r\n        public SPTimePeriod Delay\r\n        {\r\n            get\r\n            {\r\n                return new SPTimePeriod(_delay, _delayTimeSupplier);\r\n            }\r\n            set\r\n            {\r\n                _delay = value.Seconds;\r\n                _delayTimeSupplier = (SPTime)value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITriggerableMechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            if (_delay > 0f)\r\n            {\r\n                this.InvokeGuaranteed(() =>\r\n                {\r\n                    if (this._passAlongTriggerArg)\r\n                        _targets.ActivateRandomTrigger(this, arg, true, _selectOnlyActiveTargets);\r\n                    else\r\n                        _targets.ActivateRandomTrigger(this, null, true, _selectOnlyActiveTargets);\r\n                }, _delay, _delayTimeSupplier.TimeSupplier);\r\n            }\r\n            else\r\n            {\r\n                if (this._passAlongTriggerArg)\r\n                    _targets.ActivateRandomTrigger(this, arg, true, _selectOnlyActiveTargets);\r\n                else\r\n                    _targets.ActivateRandomTrigger(this, null, true, _selectOnlyActiveTargets);\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_TriggerRandomElimination.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class i_TriggerRandomElimination : AutoTriggerableMechanism\r\n    {\r\n\r\n        public enum TriggerMode\r\n        {\r\n            Manual = 0,\r\n            AllAtOnce = 1\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [Trigger.Config(Weighted = true)]\r\n        private Trigger _targets;\r\n\r\n        [SerializeField]\r\n        [Tooltip(\"Leave 0 or negative to mean trigger all.\")]\r\n        private int _selectionCount;\r\n\r\n        [SerializeField]\r\n        private TriggerMode _mode;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"PassAlongTriggerArg\")]\r\n        private bool _passAlongTriggerArg;\r\n\r\n        [SerializeField]\r\n        private Trigger _onComplete;\r\n\r\n        [System.NonSerialized]\r\n        private HashSet<TriggerTarget> _used = new HashSet<TriggerTarget>();\r\n        [System.NonSerialized]\r\n        private bool _blockTrigger;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Trigger Targets\r\n        {\r\n            get { return _targets; }\r\n        }\r\n\r\n        public int SelectionCount\r\n        {\r\n            get { return _selectionCount; }\r\n            set { _selectionCount = value; }\r\n        }\r\n\r\n        public TriggerMode Mode\r\n        {\r\n            get { return _mode; }\r\n            set { _mode = value; }\r\n        }\r\n\r\n        public bool PassAlongTriggerArg\r\n        {\r\n            get { return _passAlongTriggerArg; }\r\n            set { _passAlongTriggerArg = value; }\r\n        }\r\n\r\n        public Trigger OnComplete\r\n        {\r\n            get { return _onComplete; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void ResetSelection()\r\n        {\r\n            _used.Clear();\r\n        }\r\n\r\n        public bool TargetHasBeenUsed(int index)\r\n        {\r\n            if (index < 0) return false;\r\n            if (index >= _targets.Targets.Count) return false;\r\n\r\n            return _used.Contains(_targets.Targets[index]);\r\n        }\r\n        \r\n        private int GetNormalizedSelectionCount()\r\n        {\r\n            return (_selectionCount <= 0 || _selectionCount > _targets.Targets.Count) ? _targets.Targets.Count : _selectionCount;\r\n        }\r\n\r\n        private bool SelectAndActivate(object arg)\r\n        {\r\n            if (_used.Count >= _targets.Targets.Count)\r\n            {\r\n                //we should not have gotten here, but just incase\r\n                _used.Clear();\r\n            }\r\n\r\n            var targ = _targets.Where((t) => !_used.Contains(t)).PickRandom((t) => t.Weight);\r\n            if (targ != null)\r\n            {\r\n                _used.Add(targ);\r\n                targ.Trigger(this, _passAlongTriggerArg ? arg : null);\r\n\r\n                int cnt = this.GetNormalizedSelectionCount();\r\n                if (_used.Count >= cnt)\r\n                {\r\n                    _used.Clear();\r\n                    if (_onComplete.Count > 0) _onComplete.ActivateTrigger(this, null);\r\n                }\r\n\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region TriggerableMechanism Interface\r\n\r\n        public override bool CanTrigger\r\n        {\r\n            get\r\n            {\r\n                return base.CanTrigger && !_blockTrigger;\r\n            }\r\n        }\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            switch (_mode)\r\n            {\r\n                case TriggerMode.Manual:\r\n                    {\r\n                        this.SelectAndActivate(arg);\r\n                    }\r\n                    break;\r\n                case TriggerMode.AllAtOnce:\r\n                    {\r\n                        _blockTrigger = true;\r\n                        _used.Clear();\r\n                        int cnt = this.GetNormalizedSelectionCount();\r\n                        for (int i = 0; i < cnt; i++)\r\n                        {\r\n                            this.SelectAndActivate(arg);\r\n                        }\r\n                        _blockTrigger = false;\r\n                    }\r\n                    break;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_TriggerSequence.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class i_TriggerSequence : AutoTriggerableMechanism\r\n    {\r\n\r\n        public enum WrapMode\r\n        {\r\n            Oblivion,\r\n            Clamp,\r\n            Loop,\r\n            PingPong\r\n        }\r\n\r\n        public enum SignalMode\r\n        {\r\n            Manual,\r\n            Auto\r\n        }\r\n\r\n\r\n        #region Fields\r\n        \r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"_mode\")]\r\n        private WrapMode _wrapMode;\r\n\r\n        [SerializeField]\r\n        private SignalMode _signal;\r\n\r\n        [SerializeField()]\r\n        private Trigger _trigger;\r\n\r\n        [SerializeField()]\r\n        private bool _passAlongTriggerArg;\r\n\r\n        [SerializeField]\r\n        [MinRange(0)]\r\n        private int _currentIndex = 0;\r\n\r\n\r\n        [System.NonSerialized()]\r\n        private RadicalCoroutine _routine;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnStartOrEnable()\r\n        {\r\n            base.OnStartOrEnable();\r\n\r\n            if(this.ActivateOn == ActivateEvent.None)\r\n                this.AttemptAutoStart();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public WrapMode Wrap\r\n        {\r\n            get { return _wrapMode; }\r\n            set { _wrapMode = value; }\r\n        }\r\n\r\n        public SignalMode Signal\r\n        {\r\n            get { return _signal; }\r\n            set { _signal = value; }\r\n        }\r\n\r\n        public Trigger TriggerSequence\r\n        {\r\n            get\r\n            {\r\n                return _trigger;\r\n            }\r\n        }\r\n\r\n        public bool PassAlongTriggerArg\r\n        {\r\n            get { return _passAlongTriggerArg; }\r\n            set { _passAlongTriggerArg = value; }\r\n        }\r\n\r\n        public int CurrentIndex\r\n        {\r\n            get { return _currentIndex; }\r\n            set { _currentIndex = value; }\r\n        }\r\n\r\n        public int CurrentIndexNormalized\r\n        {\r\n            get\r\n            {\r\n                switch (_wrapMode)\r\n                {\r\n                    case WrapMode.Oblivion:\r\n                        return _currentIndex;\r\n                    case WrapMode.Clamp:\r\n                        return Mathf.Clamp(_currentIndex, 0, _trigger.Targets.Count - 1);\r\n                    case WrapMode.Loop:\r\n                        return MathUtil.Wrap(_currentIndex, _trigger.Targets.Count);\r\n                    case WrapMode.PingPong:\r\n                        return (int)Mathf.PingPong(_currentIndex, _trigger.Targets.Count - 1);\r\n                    default:\r\n                        return _currentIndex;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Reset()\r\n        {\r\n            if (_routine != null)\r\n            {\r\n                _routine.Cancel();\r\n                _routine = null;\r\n            }\r\n\r\n            _currentIndex = 0;\r\n\r\n            if (Application.isPlaying && this.enabled)\r\n            {\r\n                this.AttemptAutoStart();\r\n            }\r\n        }\r\n\r\n        public void AttemptAutoStart()\r\n        {\r\n            int i = this.CurrentIndexNormalized;\r\n            if (i < 0 || i >= _trigger.Targets.Count) return;\r\n            \r\n            if (_signal == SignalMode.Auto)\r\n            {\r\n                IAutoSequenceSignal signal;\r\n                var targ = GameObjectUtil.GetGameObjectFromSource(_trigger.Targets[i].Target, true);\r\n                if(targ != null && targ.GetComponentInChildren<IAutoSequenceSignal>(out signal))\r\n                if (signal != null)\r\n                {\r\n                    _routine = this.StartRadicalCoroutine(this.DoAutoSequence(signal), RadicalCoroutineDisableMode.Pauses);\r\n                }\r\n            }\r\n        }\r\n        \r\n        private System.Collections.IEnumerator DoAutoSequence(IAutoSequenceSignal signal)\r\n        {\r\n            if (signal != null)\r\n            {\r\n                yield return signal.Wait();\r\n                _currentIndex++;\r\n            }\r\n\r\n            while (true)\r\n            {\r\n                int i = this.CurrentIndexNormalized;\r\n                if (i < 0 || i >= _trigger.Targets.Count) yield break;\r\n                \r\n                var go = GameObjectUtil.GetGameObjectFromSource(_trigger.Targets[i].Target, true);\r\n                if (go != null && go.GetComponentInChildren<IAutoSequenceSignal>(out signal))\r\n                {\r\n                    var handle = signal.Wait();\r\n                    _trigger.ActivateTriggerAt(i, this, null);\r\n                    yield return handle;\r\n                }\r\n                else\r\n                {\r\n                    _trigger.ActivateTriggerAt(i, this, null);\r\n                    yield return null;\r\n                }\r\n\r\n                _currentIndex++;\r\n            }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region ITriggerableMechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n\r\n            switch (_signal)\r\n            {\r\n                case SignalMode.Manual:\r\n                    {\r\n                        _trigger.ActivateTriggerAt(this.CurrentIndexNormalized, this, _passAlongTriggerArg ? arg : null);\r\n                        _currentIndex++;\r\n                    }\r\n                    break;\r\n                case SignalMode.Auto:\r\n                    {\r\n                        if (_routine != null) _routine.Cancel();\r\n                        _routine = this.StartRadicalCoroutine(this.DoAutoSequence(null), RadicalCoroutineDisableMode.Pauses);\r\n                    }\r\n                    break;\r\n            }\r\n\r\n            return true;\r\n        }\r\n        \r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_TweenState.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\n\nusing UnityEngine;\n\nusing com.spacepuppy.Dynamic;\nusing com.spacepuppy.Tween;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Scenario\n{\n\n    public class i_TweenState : AutoTriggerableMechanism\n    {\n\n        #region Fields\n\n        [SerializeField]\n        [TriggerableTargetObject.Config(typeof(UnityEngine.Object))]\n        private TriggerableTargetObject _target;\n\n        [SerializeField]\n        [TriggerableTargetObject.Config(typeof(UnityEngine.Object))]\n        private TriggerableTargetObject _source;\n\n        [SerializeField]\n        [TriggerableTargetObject.Config(typeof(UnityEngine.Object))]\n        private TriggerableTargetObject _sourceAlt;\n\n        [SerializeField]\n        [EnumPopupExcluding((int)TweenHash.AnimMode.AnimCurve, (int)TweenHash.AnimMode.Curve)]\n        private TweenHash.AnimMode _mode;\n        [SerializeField()]\n        private EaseStyle _ease;\n        [SerializeField()]\n        public SPTimePeriod _duration;\n\n        [SerializeField()]\n        [Tooltip(\"Leave blank for tweens to be unique to this component.\")]\n        private string _tweenToken;\n\n        [SerializeField()]\n        private Trigger _onComplete;\n\n        [SerializeField()]\n        private Trigger _onTick;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        protected override void Awake()\n        {\n            base.Awake();\n\n            if(string.IsNullOrEmpty(_tweenToken)) _tweenToken = \"i_Tween*\" + this.GetInstanceID().ToString();\n        }\n\n        /*\n         * TODO - if want to kill these tweens, need to store each tween that was started. Can't kill all on '_target' since we changed over to TriggerableTargetObject.\n         * \n        protected override void OnDisable()\n        {\n            base.OnDisable();\n\n            SPTween.KillAll(_target, _tweenToken);\n        }\n        */\n\n        #endregion\n\n        #region Properties\n\n        public TriggerableTargetObject Target\n        {\n            get { return _target; }\n        }\n\n        public TriggerableTargetObject Source\n        {\n            get { return _source; }\n        }\n\n        public TriggerableTargetObject SourceAlt\n        {\n            get { return _sourceAlt; }\n        }\n\n        public TweenHash.AnimMode Mode\n        {\n            get { return _mode; }\n            set { _mode = value; }\n        }\n\n        public EaseStyle Ease\n        {\n            get { return _ease; }\n            set { _ease = value; }\n        }\n\n        public SPTimePeriod Duration\n        {\n            get { return _duration; }\n            set { _duration = value; }\n        }\n\n        public string TweenToken\n        {\n            get { return _tweenToken; }\n            set { _tweenToken = value; }\n        }\n\n        public Trigger OnComplete\n        {\n            get { return _onComplete; }\n        }\n\n        public Trigger OnTick\n        {\n            get { return _onTick; }\n        }\n\n        #endregion\n\n        #region Triggerable Interface\n\n        public override bool Trigger(object sender, object arg)\n        {\n            if (!this.CanTrigger) return false;\n\n            var targ = _target.GetTarget<object>(arg);\n            var source = _source.GetTarget<object>(arg);\n\n            var twn = SPTween.Tween(targ)\n                             .TweenWithToken(_mode, EaseMethods.GetEase(_ease), _duration.Seconds, source, _sourceAlt)\n                             .Use(_duration.TimeSupplier)\n                             .SetId(targ);\n            if (_onComplete.Count > 0)\n                twn.OnFinish((t) => _onComplete.ActivateTrigger(this, null));\n\n            if (_onTick.Count > 0)\n                twn.OnStep((t) => _onTick.ActivateTrigger(this, null));\n            \n            twn.Play(true, _tweenToken);\n            return true;\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_TweenTo.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\nusing UnityEngine;\n\nusing com.spacepuppy.Tween;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Scenario\n{\n\n    public class i_TweenTo : TriggerableMechanism\n    {\n\n        #region Fields\n\n        [SerializeField()]\n        [TriggerableTargetObject.Config(typeof(Transform))]\n        private TriggerableTargetObject _target = new TriggerableTargetObject();\n\n        [SerializeField()]\n        [TriggerableTargetObject.Config(typeof(Transform))]\n        private TriggerableTargetObject _location = new TriggerableTargetObject();\n\n\n        [SerializeField()]\n        private EaseStyle _ease;\n        [SerializeField()]\n        private SPTimePeriod _duration;\n\n        [SerializeField]\n        private bool _orientWithLocationRotation;\n\n        [SerializeField()]\n        private bool _tweenEntireEntity;\n\n        [SerializeField()]\n        private Trigger _onComplete;\n\n        [SerializeField()]\n        private Trigger _onTick;\n\n        [SerializeField()]\n        [Tooltip(\"Leave blank for tweens to be unique to this component.\")]\n        private string _tweenToken;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        protected override void Awake()\n        {\n            base.Awake();\n\n            if (string.IsNullOrEmpty(_tweenToken)) _tweenToken = \"i_Tween*\" + this.GetInstanceID().ToString();\n        }\n\n        protected override void OnDisable()\n        {\n            base.OnDisable();\n\n            SPTween.KillAll(_target, _tweenToken);\n        }\n\n        #endregion\n\n        #region Properties\n\n        public TriggerableTargetObject Target\n        {\n            get { return _target; }\n        }\n\n        public TriggerableTargetObject Location\n        {\n            get { return _location; }\n        }\n\n        public EaseStyle Ease\n        {\n            get { return _ease; }\n            set { _ease = value; }\n        }\n\n        public SPTimePeriod Duration\n        {\n            get { return _duration; }\n            set { _duration = value; }\n        }\n\n        public bool OrientWithLocationRotation\n        {\n            get { return _orientWithLocationRotation; }\n            set { _orientWithLocationRotation = value; }\n        }\n\n        public bool TweenEntireEntity\n        {\n            get { return _tweenEntireEntity; }\n            set { _tweenEntireEntity = value; }\n        }\n\n        public Trigger OnComplete\n        {\n            get { return _onComplete; }\n        }\n\n        public Trigger OnTick\n        {\n            get { return _onTick; }\n        }\n\n        public string TweenToken\n        {\n            get { return _tweenToken; }\n            set { _tweenToken = value; }\n        }\n\n        #endregion\n\n        #region TriggerableMechanism Interface\n\n        public override bool Trigger(object sender, object arg)\n        {\n            if (!this.CanTrigger) return false;\n\n            var targ = this._target.GetTarget<Transform>(arg);\n            if (targ == null) return false;\n            if (_tweenEntireEntity) targ = GameObjectUtil.FindRoot(targ).transform;\n\n            var loc = _location.GetTarget<Transform>(arg);\n            if (targ == null || loc == null) return false;\n\n            var twn = SPTween.Tween(targ);\n            \n            twn.To(\"position\", _duration.Seconds, loc.position);\n            if (_orientWithLocationRotation) twn.To(\"rotation\", _duration.Seconds, loc.rotation);\n\n            twn.Use(_duration.TimeSupplier);\n            twn.SetId(_target);\n\n            if (_onComplete.Count > 0)\n                twn.OnFinish((t) => _onComplete.ActivateTrigger(this, null));\n\n            if (_onTick.Count > 0)\n                twn.OnStep((t) => _onTick.ActivateTrigger(this, null));\n\n            twn.Play(true, _tweenToken);\n\n            return true;\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/i_TweenValue.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\n\r\nusing com.spacepuppy.Tween;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class i_TweenValue : AutoTriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private SPTime _timeSupplier;\r\n\r\n        [SerializeField()]\r\n        [SelectableObject()]\r\n        private UnityEngine.Object _target;\r\n\r\n        [SerializeField()]\r\n        private TweenData[] _data;\r\n\r\n        [SerializeField()]\r\n        private Trigger _onComplete;\r\n\r\n        [SerializeField()]\r\n        private Trigger _onTick;\r\n\r\n        [SerializeField()]\r\n        [Tooltip(\"Leave blank for tweens to be unique to this component.\")]\r\n        private string _tweenToken;\r\n\r\n        [SerializeField]\r\n        private bool _killOnDisable;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            if(string.IsNullOrEmpty(_tweenToken)) _tweenToken = \"i_Tween*\" + this.GetInstanceID().ToString();\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n            \r\n            if (_killOnDisable)\r\n                SPTween.KillAll(_target, _tweenToken);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Trigger OnComplete\r\n        {\r\n            get { return _onComplete; }\r\n        }\r\n\r\n        public Trigger OnTick\r\n        {\r\n            get { return _onTick; }\r\n        }\r\n\r\n        public string TweenToken\r\n        {\r\n            get { return _tweenToken; }\r\n            set { _tweenToken = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        #endregion\r\n\r\n        #region ITriggerable Interface\r\n\r\n        public override bool CanTrigger\r\n        {\r\n            get\r\n            {\r\n                return base.CanTrigger && _target != null && _data.Length > 0;\r\n            }\r\n        }\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var twn = SPTween.Tween(_target);\r\n            for (int i = 0; i < _data.Length; i++)\r\n            {\r\n                twn.ByAnimMode(_data[i].Mode, _data[i].MemberName, EaseMethods.GetEase(_data[i].Ease), _data[i].Duration, _data[i].ValueS.Value, _data[i].ValueE.Value, _data[i].Option);\r\n            }\r\n            twn.Use(_timeSupplier.TimeSupplier);\r\n            twn.SetId(_target);\r\n\r\n            if (_onComplete.Count > 0)\r\n                twn.OnFinish((t) => _onComplete.ActivateTrigger(this, null));\r\n\r\n            if (_onTick.Count > 0)\r\n                twn.OnStep((t) => _onTick.ActivateTrigger(this, null));\r\n\r\n            twn.Play(true, _tweenToken);\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        [System.Serializable()]\r\n        public class TweenData\r\n        {\r\n            [SerializeField()]\r\n            [EnumPopupExcluding((int)TweenHash.AnimMode.AnimCurve, (int)TweenHash.AnimMode.Curve)]\r\n            public TweenHash.AnimMode Mode;\r\n            [SerializeField()]\r\n            public string MemberName;\r\n            [SerializeField()]\r\n            public EaseStyle Ease;\r\n            [SerializeField()]\r\n            public VariantReference ValueS;\r\n            [SerializeField()]\r\n            public VariantReference ValueE;\r\n            [SerializeField()]\r\n            [TimeUnitsSelector()]\r\n            public float Duration;\r\n            [SerializeField]\r\n            public int Option;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/t_AllTriggered.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class t_AllTriggered : SPComponent, IObservableTrigger\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [ReorderableArray()]\r\n        [DisableOnPlay()]\r\n        private List<ObservableTargetData> _observedTargets;\r\n        \r\n        [SerializeField()]\r\n        [OnChangedInEditor(\"ResetOnTriggeredChanged\", OnlyAtRuntime = true)]\r\n        [Tooltip(\"After the obvserved targets all signal and this signals in turn, should it reset and start listening again.\")]\r\n        private bool _resetOnTriggered;\r\n        \r\n        [SerializeField()]\r\n        private Trigger _trigger = new Trigger();\r\n        \r\n        [System.NonSerialized]\r\n        private HashSet<ObservableTargetData> _activatedTriggers = new HashSet<ObservableTargetData>();\r\n        [System.NonSerialized()]\r\n        private bool _triggered;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnStartOrEnable()\r\n        {\r\n            base.OnStartOrEnable();\r\n\r\n            _activatedTriggers.Clear();\r\n            this.RegisterListeners();\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            this.UnRegisterListeners();\r\n            _activatedTriggers.Clear();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool ResetOnTriggered\r\n        {\r\n            get { return _resetOnTriggered; }\r\n            set\r\n            {\r\n                if (_resetOnTriggered == value) return;\r\n\r\n                _resetOnTriggered = value;\r\n                this.ResetOnTriggeredChanged();\r\n            }\r\n        }\r\n\r\n        public Trigger Trigger\r\n        {\r\n            get\r\n            {\r\n                return _trigger;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void ResetOnTriggeredChanged()\r\n        {\r\n            if (_resetOnTriggered && _triggered && this.isActiveAndEnabled)\r\n            {\r\n                _triggered = false;\r\n                this.RegisterListeners();\r\n            }\r\n        }\r\n\r\n        private void RegisterListeners()\r\n        {\r\n            if (_triggered) return;\r\n\r\n            ObservableTargetData targ;\r\n            var d = new System.EventHandler<TempEventArgs>(this.OnTriggerActivated);\r\n            for (int i = 0; i < _observedTargets.Count; i++)\r\n            {\r\n                targ = _observedTargets[i];\r\n                if (targ != null)\r\n                {\r\n                    targ.Init();\r\n                    targ.TriggerActivated += d;\r\n                }\r\n            }\r\n        }\r\n\r\n        private void UnRegisterListeners()\r\n        {\r\n            ObservableTargetData targ;\r\n            var d = new System.EventHandler<TempEventArgs>(this.OnTriggerActivated);\r\n            for (int i = 0; i < _observedTargets.Count; i++)\r\n            {\r\n                targ = _observedTargets[i];\r\n                if (targ != null)\r\n                {\r\n                    targ.TriggerActivated -= d;\r\n                    targ.DeInit();\r\n                }\r\n            }\r\n        }\r\n\r\n        private void OnTriggerActivated(object sender, TempEventArgs arg)\r\n        {\r\n            if (_triggered) return;\r\n\r\n            var targ = sender as ObservableTargetData;\r\n            if (targ != null) _activatedTriggers.Add(targ);\r\n\r\n            if (_activatedTriggers.SetEquals(_observedTargets))\r\n            {\r\n                _activatedTriggers.Clear();\r\n                if (this._resetOnTriggered)\r\n                {\r\n                    _triggered = false;\r\n                }\r\n                else\r\n                {\r\n                    _triggered = true;\r\n                    this.UnRegisterListeners();\r\n                }\r\n                _trigger.ActivateTrigger(this, null);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IObservableTrigger Interface\r\n\r\n        Trigger[] IObservableTrigger.GetTriggers()\r\n        {\r\n            return new Trigger[] { _trigger };\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/t_AllTriggersOccupied.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\n\nusing UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Scenario\n{\n    \n    [Infobox(\"Watches a set of IOccupiedTriggers (example: t_OnTriggerOccupied) for when all of them are occupied and signals.\")]\n    public class t_AllTriggersOccupied : SPComponent, IOccupiedTrigger\n    {\n\n        #region Fields\n\n        [SerializeField]\n        [ReorderableArray]\n        [DisableOnPlay()]\n        [TypeRestriction(typeof(IOccupiedTrigger))]\n        private UnityEngine.Object[] _observedTargets;\n\n        [SerializeField]\n        private Trigger _onEnter;\n\n        [SerializeField]\n        private Trigger _onExit;\n\n        [System.NonSerialized]\n        private IOccupiedTrigger[] _targets;\n        [System.NonSerialized]\n        private HashSet<IOccupiedTrigger> _activatedTriggers = new HashSet<IOccupiedTrigger>();\n        [System.NonSerialized()]\n        private bool _triggered;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        protected override void Awake()\n        {\n            base.Awake();\n\n            _targets = (from o in _observedTargets where o is IOccupiedTrigger select o as IOccupiedTrigger).ToArray();\n        }\n\n        protected override void OnStartOrEnable()\n        {\n            base.OnStartOrEnable();\n\n            _triggered = false;\n            _activatedTriggers.Clear();\n            foreach (var t in _targets)\n            {\n                t.EnterTrigger.TriggerActivated += this.OnTriggerEntered;\n                t.ExitTrigger.TriggerActivated += this.OnTriggerExited;\n                if (t.IsOccupied) _activatedTriggers.Add(t);\n            }\n            this.TestSignalOccupied();\n        }\n\n        protected override void OnDisable()\n        {\n            base.OnDisable();\n\n            _triggered = false;\n            _activatedTriggers.Clear();\n            foreach (var t in _targets)\n            {\n                t.EnterTrigger.TriggerActivated -= this.OnTriggerEntered;\n                t.ExitTrigger.TriggerActivated -= this.OnTriggerExited;\n            }\n        }\n\n        #endregion\n\n        #region Properties\n\n        public Trigger OnEnter\n        {\n            get { return _onEnter; }\n        }\n\n        public Trigger OnExit\n        {\n            get { return _onExit; }\n        }\n\n        public bool IsOccupied\n        {\n            get { return _triggered; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        private void OnTriggerEntered(object sender, System.EventArgs ev)\n        {\n            var targ = sender as IOccupiedTrigger;\n            if(targ != null && _activatedTriggers.Add(targ))\n            {\n                this.TestSignalOccupied();\n            }\n        }\n\n        private void OnTriggerExited(object sender, System.EventArgs ev)\n        {\n            var targ = sender as IOccupiedTrigger;\n            if(targ != null && _activatedTriggers.Remove(targ))\n            {\n                if(_triggered)\n                {\n                    _triggered = false;\n                    _onExit.ActivateTrigger(this, null);\n                }\n            }\n        }\n\n        private void TestSignalOccupied()\n        {\n            if (_triggered) return;\n\n            if (_activatedTriggers.SetEquals(_targets))\n            {\n                _triggered = true;\n                _onEnter.ActivateTrigger(this, null);\n            }\n        }\n\n        #endregion\n\n        #region IOccupiedObservableTrigger Interface\n\n        Trigger[] IObservableTrigger.GetTriggers()\n        {\n            return new Trigger[] { _onEnter, _onExit };\n        }\n\n        Trigger IOccupiedTrigger.EnterTrigger\n        {\n            get { return _onEnter; }\n        }\n\n        Trigger IOccupiedTrigger.ExitTrigger\n        {\n            get { return _onExit; }\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/t_EnterTrigger.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class t_EnterTrigger : TriggerComponent, ICompoundTriggerEnterResponder\r\n    {\r\n\r\n        #region Fields\r\n\r\n        public ScenarioActivatorMask Mask = new ScenarioActivatorMask(-1);\r\n        public float CooldownInterval = 0f;\r\n        public bool IncludeColliderAsTriggerArg = true;\r\n\r\n        [System.NonSerialized()]\r\n        private bool _coolingDown;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            _coolingDown = false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void DoTestTriggerEnter(Collider other)\r\n        {\r\n            if (_coolingDown) return;\r\n\r\n            if (Mask == null || Mask.Intersects(other))\r\n            {\r\n                if (this.IncludeColliderAsTriggerArg)\r\n                {\r\n                    this.ActivateTrigger(other);\r\n                }\r\n                else\r\n                {\r\n                    this.ActivateTrigger();\r\n                }\r\n\r\n                if (this.CooldownInterval > 0f)\r\n                {\r\n                    _coolingDown = true;\r\n                    this.InvokeGuaranteed(() =>\r\n                    {\r\n                        _coolingDown = false;\r\n                    }, this.CooldownInterval);\r\n                }\r\n            }\r\n        }\r\n\r\n        void OnTriggerEnter(Collider other)\r\n        {\r\n            if (_coolingDown || this.HasComponent<CompoundTrigger>()) return;\r\n\r\n            this.DoTestTriggerEnter(other);\r\n        }\r\n\r\n        void ICompoundTriggerEnterResponder.OnCompoundTriggerEnter(Collider other)\r\n        {\r\n            this.DoTestTriggerEnter(other);\r\n        }\r\n        \r\n        #endregion\r\n        \r\n    }\r\n\r\n    [Infobox(\"If you're looking for the old 'mask in the inspector' approach, use t_EnterTrigger.\")]\r\n    public class t_OnEnterTrigger : TriggerComponent, ICompoundTriggerEnterResponder\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private EventActivatorMaskRef _mask = new EventActivatorMaskRef();\r\n        [SerializeField]\r\n        private float _cooldownInterval = 0f;\r\n        [SerializeField]\r\n        private bool _includeColliderAsTriggerArg = true;\r\n\r\n        [System.NonSerialized()]\r\n        private bool _coolingDown;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            _coolingDown = false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IEventActivatorMask Mask\r\n        {\r\n            get { return _mask.Value; }\r\n            set { _mask.Value = value; }\r\n        }\r\n\r\n        public float CooldownInterval\r\n        {\r\n            get { return _cooldownInterval; }\r\n            set { _cooldownInterval = value; }\r\n        }\r\n\r\n        public bool IncludeCollidersAsTriggerArg\r\n        {\r\n            get { return _includeColliderAsTriggerArg; }\r\n            set { _includeColliderAsTriggerArg = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void DoTestTriggerEnter(Collider other)\r\n        {\r\n            if (_coolingDown) return;\r\n\r\n            if (_mask.Value == null || _mask.Value.Intersects(other))\r\n            {\r\n                if (_includeColliderAsTriggerArg)\r\n                {\r\n                    this.ActivateTrigger(other);\r\n                }\r\n                else\r\n                {\r\n                    this.ActivateTrigger();\r\n                }\r\n\r\n                if (_cooldownInterval > 0f)\r\n                {\r\n                    _coolingDown = true;\r\n                    this.InvokeGuaranteed(() =>\r\n                    {\r\n                        _coolingDown = false;\r\n                    }, _cooldownInterval);\r\n                }\r\n            }\r\n        }\r\n\r\n        void OnTriggerEnter(Collider other)\r\n        {\r\n            if (_coolingDown || this.HasComponent<CompoundTrigger>()) return;\r\n\r\n            this.DoTestTriggerEnter(other);\r\n        }\r\n\r\n        void ICompoundTriggerEnterResponder.OnCompoundTriggerEnter(Collider other)\r\n        {\r\n            this.DoTestTriggerEnter(other);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/t_ExitTrigger.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class t_ExitTrigger : TriggerComponent, ICompoundTriggerExitResponder\r\n    {\r\n\r\n        #region Fields\r\n\r\n        public ScenarioActivatorMask Mask;\r\n        public float CooldownInterval = 0f;\r\n        public bool IncludeColliderAsTriggerArg = true;\r\n\r\n        [System.NonSerialized()]\r\n        private bool _coolingDown;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            _coolingDown = false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void DoTestTriggerExit(Collider other)\r\n        {\r\n            if (_coolingDown) return;\r\n\r\n            if (Mask == null || Mask.Intersects(other))\r\n            {\r\n                if (this.IncludeColliderAsTriggerArg)\r\n                {\r\n                    this.ActivateTrigger(other);\r\n                }\r\n                else\r\n                {\r\n                    this.ActivateTrigger();\r\n                }\r\n\r\n                if(this.CooldownInterval > 0f)\r\n                {\r\n                    _coolingDown = true;\r\n                    this.InvokeGuaranteed(() =>\r\n                    {\r\n                        _coolingDown = false;\r\n                    }, this.CooldownInterval);\r\n                }\r\n            }\r\n        }\r\n\r\n        void OnTriggerExit(Collider other)\r\n        {\r\n            if (_coolingDown || this.HasComponent<CompoundTrigger>()) return;\r\n\r\n            this.DoTestTriggerExit(other);\r\n        }\r\n\r\n        \r\n        void ICompoundTriggerExitResponder.OnCompoundTriggerExit(Collider other)\r\n        {\r\n            this.DoTestTriggerExit(other);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    [Infobox(\"If you're looking for the old 'mask in the inspector' approach, use t_ExitTrigger.\")]\r\n    public class t_OnExitTrigger : TriggerComponent, ICompoundTriggerExitResponder\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private EventActivatorMaskRef _mask = new EventActivatorMaskRef();\r\n        [SerializeField]\r\n        private float _cooldownInterval = 0f;\r\n        [SerializeField]\r\n        private bool _includeColliderAsTriggerArg = true;\r\n\r\n        [System.NonSerialized()]\r\n        private bool _coolingDown;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            _coolingDown = false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IEventActivatorMask Mask\r\n        {\r\n            get { return _mask.Value; }\r\n            set { _mask.Value = value; }\r\n        }\r\n\r\n        public float CooldownInterval\r\n        {\r\n            get { return _cooldownInterval; }\r\n            set { _cooldownInterval = value; }\r\n        }\r\n\r\n        public bool IncludeCollidersAsTriggerArg\r\n        {\r\n            get { return _includeColliderAsTriggerArg; }\r\n            set { _includeColliderAsTriggerArg = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void DoTestTriggerExit(Collider other)\r\n        {\r\n            if (_coolingDown) return;\r\n\r\n            if (_mask.Value == null || _mask.Value.Intersects(other))\r\n            {\r\n                if (_includeColliderAsTriggerArg)\r\n                {\r\n                    this.ActivateTrigger(other);\r\n                }\r\n                else\r\n                {\r\n                    this.ActivateTrigger();\r\n                }\r\n\r\n                if (_cooldownInterval > 0f)\r\n                {\r\n                    _coolingDown = true;\r\n                    this.InvokeGuaranteed(() =>\r\n                    {\r\n                        _coolingDown = false;\r\n                    }, _cooldownInterval);\r\n                }\r\n            }\r\n        }\r\n\r\n        void OnTriggerExit(Collider other)\r\n        {\r\n            if (_coolingDown || this.HasComponent<CompoundTrigger>()) return;\r\n\r\n            this.DoTestTriggerExit(other);\r\n        }\r\n\r\n        void ICompoundTriggerExitResponder.OnCompoundTriggerExit(Collider other)\r\n        {\r\n            this.DoTestTriggerExit(other);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/t_Flicker.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\nusing UnityEngine;\nusing System.Collections.Generic;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Geom;\nusing com.spacepuppy.Scenario;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Scenario\n{\n\n    public class t_Flicker : SPComponent, IObservableTrigger\n    {\n\n        #region Fields\n\n        [SerializeField]\n        private Interval _initialDelay = new Interval(0f);\n        [SerializeField]\n        private Interval _delayAfterA = new Interval(1f);\n        [SerializeField]\n        private Interval _delayAfterB = new Interval(1f);\n\n        [SerializeField]\n        private Trigger _triggerA;\n\n        [SerializeField]\n        private Trigger _triggerB;\n\n\n        [System.NonSerialized]\n        private bool _state;\n        [System.NonSerialized]\n        private float _t;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        protected override void OnEnable()\n        {\n            base.OnEnable();\n\n            _state = false;\n            _t = RandomUtil.Standard.Range(_initialDelay.Max, _initialDelay.Min);\n        }\n\n        #endregion\n\n        #region Methods\n\n        private void Update()\n        {\n            if (_t <= 0f)\n            {\n                if (_state)\n                {\n                    _triggerB.ActivateTrigger(this, null);\n                    _t = RandomUtil.Standard.Range(_delayAfterB.Max, _delayAfterB.Min);\n                }\n                else\n                {\n                    _triggerA.ActivateTrigger(this, null);\n                    _t = RandomUtil.Standard.Range(_delayAfterA.Max, _delayAfterA.Min);\n                }\n\n                _state = !_state;\n            }\n\n            _t -= Time.deltaTime;\n        }\n\n        #endregion\n\n        #region IObserverableTrigger Interface\n\n        Trigger[] IObservableTrigger.GetTriggers()\n        {\n            return new Trigger[] { _triggerA, _triggerB };\n        }\n\n        #endregion\n\n    }\n\n}"
  },
  {
    "path": "SpacepuppyBase/Scenario/t_Interval.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    /// <summary>\r\n    /// Perform an action on some interval.\r\n    /// \r\n    /// TODO - Need to remove the old float for interval that is now replaced with TimePeriod. It's kept for now \r\n    /// until all the scripts are updated. Remove ISerializationCallbackReceiver when that is done.\r\n    /// </summary>\r\n    public class t_Interval : AutoTriggerComponent\r\n    {\r\n\r\n        #region Fields\r\n        \r\n        [SerializeField()]\r\n        private SPTimePeriod _interval = new SPTimePeriod(1f);\r\n\r\n        [SerializeField()]\r\n        [Tooltip(\"Negative values will repeat forever like infinity.\")]\r\n        [DiscreteFloat.NonNegative()]\r\n        private DiscreteFloat _repeatCount = DiscreteFloat.PositiveInfinity;\r\n\r\n        [SerializeField()]\r\n        [TimeUnitsSelector()]\r\n        [Tooltip(\"Wait a duration before starting interval, waits using the same timesupplier as interval.\")]\r\n        private float _delay;\r\n\r\n\r\n        [System.NonSerialized()]\r\n        private RadicalCoroutine _routine;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            if (_routine != null)\r\n            {\r\n                _routine.Cancel();\r\n                _routine = null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public SPTimePeriod Interval\r\n        {\r\n            get { return _interval; }\r\n            set { _interval = value; }\r\n        }\r\n\r\n        public float Duration\r\n        {\r\n            get { return _interval.Seconds; }\r\n            set { _interval.Seconds = value; }\r\n        }\r\n\r\n        public float Delay\r\n        {\r\n            get { return _delay; }\r\n        }\r\n\r\n        public DiscreteFloat RepeatCount\r\n        {\r\n            get { return _repeatCount; }\r\n            set { _repeatCount = (value < 0f) ? DiscreteFloat.Zero : value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected override void OnTriggerActivate()\r\n        {\r\n            if (_routine != null)\r\n            {\r\n                _routine.Cancel();\r\n                _routine = null;\r\n            }\r\n\r\n            _routine = this.StartRadicalCoroutine(this.TickerCallback(), RadicalCoroutineDisableMode.CancelOnDisable);\r\n        }\r\n\r\n\r\n        private System.Collections.IEnumerator TickerCallback()\r\n        {\r\n            if (_delay > 0f) yield return WaitForDuration.Seconds(_delay, _interval.TimeSupplier);\r\n\r\n            int cnt = 0;\r\n\r\n            while(true)\r\n            {\r\n                yield return WaitForDuration.Period(_interval);\r\n\r\n                this.ActivateTrigger();\r\n\r\n                cnt++;\r\n                if(cnt > _repeatCount)\r\n                {\r\n                    yield break;\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n    [System.Obsolete(\"Use t_Interval instead.\")]\r\n    public class IntervalTrigger : t_Interval\r\n    {\r\n\r\n        //public float Interval = 1.0f;\r\n\r\n        //private float _currentCoolDown;\r\n\r\n\r\n        //// Update is called once per frame\r\n        //void Update()\r\n        //{\r\n        //    if (_currentCoolDown > Interval)\r\n        //    {\r\n        //        _currentCoolDown = 0;\r\n        //        this.ActivateTrigger();\r\n        //    }\r\n\r\n        //    _currentCoolDown += GameTime.DeltaTime;\r\n        //}\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/t_OnClick.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Geom;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class t_OnClick : TriggerComponent\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [Tooltip(\"A duration of time that the click must be held down to register as a click.\")]\r\n        private Interval _buttonLapse = Interval.MinMax(float.NegativeInfinity, float.PositiveInfinity);\r\n\r\n        [System.NonSerialized()]\r\n        private float _downT;\r\n\r\n        #endregion\r\n\r\n        #region Messages\r\n\r\n        void OnMouseDown()\r\n        {\r\n            _downT = Time.unscaledTime;\r\n        }\r\n\r\n        void OnMouseUpAsButton()\r\n        {\r\n            if (_buttonLapse.Intersects(Time.unscaledTime - _downT))\r\n            {\r\n                this.ActivateTrigger();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/t_OnCollisionEnter.cs",
    "content": "﻿#pragma warning disable 0168, 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class t_OnCollisionEnter : TriggerComponent\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private ScenarioActivatorMask _mask;\r\n        public float CooldownInterval = 1.0f;\r\n        public bool IncludeColliderAsTriggerArg = true;\r\n\r\n        [System.NonSerialized()]\r\n        private bool _coolingDown;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ScenarioActivatorMask Mask { get { return _mask; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void OnCollisionEnter(Collision c)\r\n        {\r\n            if (_coolingDown) return;\r\n\r\n            if (Mask == null || Mask.Intersects(c.collider))\r\n            {\r\n                if (this.IncludeColliderAsTriggerArg)\r\n                {\r\n                    this.ActivateTrigger(c.collider);\r\n                }\r\n                else\r\n                {\r\n                    this.ActivateTrigger();\r\n                }\r\n\r\n                _coolingDown = true;\r\n                //use global incase this gets disabled\r\n                this.InvokeGuaranteed(() =>\r\n                {\r\n                    _coolingDown = false;\r\n                }, this.CooldownInterval);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/t_OnDisable.cs",
    "content": "﻿using UnityEngine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class t_OnDisable : TriggerComponent\r\n    {\r\n\r\n        #region Fields\r\n        \r\n        #endregion\r\n\r\n        #region Properties\r\n        \r\n        #endregion\r\n\r\n        #region Messages\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            this.ActivateTrigger(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/t_OnEnable.cs",
    "content": "﻿using UnityEngine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class t_OnEnable : TriggerComponent\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Delay\")]\r\n        [TimeUnitsSelector()]\r\n        private float _delay;\r\n        [SerializeField]\r\n        private SPTime _delayTimeSupplier;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        //public float Delay\r\n        //{\r\n        //    get { return _delay; }\r\n        //    set { _delay = value; }\r\n        //}\r\n\r\n        public SPTimePeriod Delay\r\n        {\r\n            get\r\n            {\r\n                return new SPTimePeriod(_delay, _delayTimeSupplier);\r\n            }\r\n            set\r\n            {\r\n                _delay = value.Seconds;\r\n                _delayTimeSupplier = (SPTime)value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Messages\r\n\r\n        protected override void OnStartOrEnable()\r\n        {\r\n            base.OnStartOrEnable();\r\n\r\n            if (_delay > 0f)\r\n            {\r\n                this.InvokeGuaranteed(() =>\r\n                {\r\n                    this.ActivateTrigger(this);\r\n                }, _delay, _delayTimeSupplier.TimeSupplier);\r\n            }\r\n            else\r\n            {\r\n                this.ActivateTrigger(this);\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/t_OnEventTrigger.cs",
    "content": "﻿#pragma warning disable 0168, 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing UnityEngine.EventSystems;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class t_OnEventTrigger : SPComponent, IEventSystemHandler, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IPointerUpHandler, IPointerClickHandler, IBeginDragHandler, IInitializePotentialDragHandler, IDragHandler, IEndDragHandler, IDropHandler, IScrollHandler, IUpdateSelectedHandler, ISelectHandler, IDeselectHandler, IMoveHandler, ISubmitHandler, ICancelHandler\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private List<Entry> _triggers;\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void Execute(EventTriggerType id, BaseEventData eventData)\r\n        {\r\n            if (_triggers == null || _triggers.Count == 0)\r\n                return;\r\n\r\n            int index = 0;\r\n            for (int count = _triggers.Count; index < count; ++index)\r\n            {\r\n                t_OnEventTrigger.Entry entry = _triggers[index];\r\n                if (entry.EventID == id)\r\n                    entry.ActivateTrigger(this, eventData);\r\n            }\r\n        }\r\n\r\n        public virtual void OnPointerEnter(PointerEventData eventData)\r\n        {\r\n            this.Execute(EventTriggerType.PointerEnter, (BaseEventData)eventData);\r\n        }\r\n\r\n        public virtual void OnPointerExit(PointerEventData eventData)\r\n        {\r\n            this.Execute(EventTriggerType.PointerExit, (BaseEventData)eventData);\r\n        }\r\n\r\n        public virtual void OnDrag(PointerEventData eventData)\r\n        {\r\n            this.Execute(EventTriggerType.Drag, (BaseEventData)eventData);\r\n        }\r\n\r\n        public virtual void OnDrop(PointerEventData eventData)\r\n        {\r\n            this.Execute(EventTriggerType.Drop, (BaseEventData)eventData);\r\n        }\r\n\r\n        public virtual void OnPointerDown(PointerEventData eventData)\r\n        {\r\n            this.Execute(EventTriggerType.PointerDown, (BaseEventData)eventData);\r\n        }\r\n\r\n        public virtual void OnPointerUp(PointerEventData eventData)\r\n        {\r\n            this.Execute(EventTriggerType.PointerUp, (BaseEventData)eventData);\r\n        }\r\n\r\n        public virtual void OnPointerClick(PointerEventData eventData)\r\n        {\r\n            this.Execute(EventTriggerType.PointerClick, (BaseEventData)eventData);\r\n        }\r\n\r\n        public virtual void OnSelect(BaseEventData eventData)\r\n        {\r\n            this.Execute(EventTriggerType.Select, eventData);\r\n        }\r\n\r\n        public virtual void OnDeselect(BaseEventData eventData)\r\n        {\r\n            this.Execute(EventTriggerType.Deselect, eventData);\r\n        }\r\n\r\n        public virtual void OnScroll(PointerEventData eventData)\r\n        {\r\n            this.Execute(EventTriggerType.Scroll, (BaseEventData)eventData);\r\n        }\r\n\r\n        public virtual void OnMove(AxisEventData eventData)\r\n        {\r\n            this.Execute(EventTriggerType.Move, (BaseEventData)eventData);\r\n        }\r\n\r\n        public virtual void OnUpdateSelected(BaseEventData eventData)\r\n        {\r\n            this.Execute(EventTriggerType.UpdateSelected, eventData);\r\n        }\r\n\r\n        public virtual void OnInitializePotentialDrag(PointerEventData eventData)\r\n        {\r\n            this.Execute(EventTriggerType.InitializePotentialDrag, (BaseEventData)eventData);\r\n        }\r\n\r\n        public virtual void OnBeginDrag(PointerEventData eventData)\r\n        {\r\n            this.Execute(EventTriggerType.BeginDrag, (BaseEventData)eventData);\r\n        }\r\n\r\n        public virtual void OnEndDrag(PointerEventData eventData)\r\n        {\r\n            this.Execute(EventTriggerType.EndDrag, (BaseEventData)eventData);\r\n        }\r\n\r\n        public virtual void OnSubmit(BaseEventData eventData)\r\n        {\r\n            this.Execute(EventTriggerType.Submit, eventData);\r\n        }\r\n\r\n        public virtual void OnCancel(BaseEventData eventData)\r\n        {\r\n            this.Execute(EventTriggerType.Cancel, eventData);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        [System.Serializable()]\r\n        public class Entry : Trigger\r\n        {\r\n            public EventTriggerType EventID = EventTriggerType.PointerClick;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/t_OnNotificationTrigger.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class t_OnNotificationTrigger : TriggerComponent\r\n    {\r\n\r\n        #region Fields\r\n        \r\n        [SerializeField()]\r\n        [TypeReference.Config(typeof(com.spacepuppy.Notification))]\r\n        private TypeReference _notificationType = new TypeReference();\r\n\r\n        [SerializeField()]\r\n        private bool _useGlobal = true;\r\n        \r\n        [SerializeField()]\r\n        [DefaultFromSelf()]\r\n        [Tooltip(\"The target to whom to listen to for the notification.\")]\r\n        private GameObject _targetGameObject;\r\n\r\n        [System.NonSerialized()]\r\n        private GameObject _targCache; //cache who we registered the listerner with on enable, so we can remove it on exit\r\n        [System.NonSerialized()]\r\n        private System.Type _typeCache;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n        \r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            this.AddHandler();\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            this.RemoveHandler();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public TypeReference NotificationType { get { return _notificationType; } }\r\n\r\n        public bool UseGlobal\r\n        {\r\n            get { return _useGlobal; }\r\n            set\r\n            {\r\n                _useGlobal = value;\r\n                if (_useGlobal) _targetGameObject = null;\r\n            }\r\n        }\r\n\r\n        public GameObject TargetGameObject\r\n        {\r\n            get { return _targetGameObject; }\r\n            set\r\n            {\r\n                _targetGameObject = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void ResetHandler()\r\n        {\r\n            this.RemoveHandler();\r\n\r\n            if (!this.enabled) return;\r\n            \r\n            this.AddHandler();\r\n        }\r\n\r\n        private void RemoveHandler()\r\n        {\r\n            if (_typeCache != null)\r\n            {\r\n                if (!object.ReferenceEquals(_targCache, null))\r\n                {\r\n                    Notification.UnsafeRemoveObserver(_typeCache, _targCache, this.OnNotification);\r\n                }\r\n                else\r\n                {\r\n                    Notification.UnsafeRemoveGlobalObserver(_typeCache, this.OnNotification);\r\n                }\r\n                _typeCache = null;\r\n                _targCache = null;\r\n            }\r\n        }\r\n\r\n        private void AddHandler()\r\n        {\r\n            _typeCache = null;\r\n            _targCache = null;\r\n            if(_notificationType.Type != null)\r\n            {\r\n                if (_useGlobal)\r\n                {\r\n                    _typeCache = _notificationType.Type;\r\n                    _targCache = null;\r\n                    Notification.UnsafeRegisterGlobalObserver(_typeCache, this.OnNotification);\r\n                }\r\n                else if (_targetGameObject != null)\r\n                {\r\n                    _typeCache = _notificationType.Type;\r\n                    _targCache = _targetGameObject;\r\n                    Notification.UnsafeRegisterObserver(_typeCache, _targCache, this.OnNotification);\r\n                }\r\n            }\r\n            \r\n        }\r\n\r\n\r\n        private void OnNotification(object sender, Notification n)\r\n        {\r\n            this.ActivateTrigger(n);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/t_OnStart.cs",
    "content": "﻿using UnityEngine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class t_OnStart : TriggerComponent\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Delay\")]\r\n        [TimeUnitsSelector()]\r\n        private float _delay;\r\n        [SerializeField]\r\n        private SPTime _delayTimeSupplier;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        //public float Delay\r\n        //{\r\n        //    get { return _delay; }\r\n        //    set { _delay = value; }\r\n        //}\r\n\r\n        public SPTimePeriod Delay\r\n        {\r\n            get\r\n            {\r\n                return new SPTimePeriod(_delay, _delayTimeSupplier);\r\n            }\r\n            set\r\n            {\r\n                _delay = value.Seconds;\r\n                _delayTimeSupplier = (SPTime)value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Messages\r\n\r\n        protected override void Start()\r\n        {\r\n            base.Start();\r\n\r\n            if (_delay > 0f)\r\n            {\r\n                this.InvokeGuaranteed(() =>\r\n                {\r\n                    this.ActivateTrigger(this);\r\n                }, _delay, _delayTimeSupplier.TimeSupplier);\r\n            }\r\n            else\r\n            {\r\n                this.ActivateTrigger(this);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/t_OnTriggerOccupied.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\nusing UnityEngine;\nusing System.Collections.Generic;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Scenario\n{\n\n    public class t_OnTriggerOccupied : SPComponent, ICompoundTriggerEnterResponder, ICompoundTriggerExitResponder, IOccupiedTrigger\n    {\n\n        #region Fields\n\n        [SerializeField]\n        private EventActivatorMaskRef _mask = new EventActivatorMaskRef();\n        \n        [SerializeField]\n        private Trigger _onTriggerOccupied;\n\n        [SerializeField]\n        private Trigger _onTriggerLastExited;\n        \n        [System.NonSerialized]\n        private HashSet<GameObject> _activeObjects = new HashSet<GameObject>();\n\n        #endregion\n        \n        #region Properties\n\n        public Trigger OnTriggerOccupied\n        {\n            get { return _onTriggerOccupied; }\n        }\n\n        public Trigger OnTriggerLastExited\n        {\n            get { return _onTriggerLastExited; }\n        }\n        \n        public IEventActivatorMask Mask\n        {\n            get { return _mask.Value; }\n            set { _mask.Value = value; }\n        }\n\n        public bool IsOccupied\n        {\n            get { return _activeObjects.Count > 0; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        private void AddObject(GameObject obj)\n        {\n            if (_mask.Value != null && !_mask.Value.Intersects(obj)) return;\n\n            if(_activeObjects.Count == 0)\n            {\n                _activeObjects.Add(obj);\n                _onTriggerOccupied.ActivateTrigger(this, obj);\n            }\n            else\n            {\n                _activeObjects.Add(obj);\n            }\n        }\n\n        private void RemoveObject(GameObject obj)\n        {\n            if (_activeObjects.Count == 0) return;\n            \n            _activeObjects.Remove(obj);\n            if(_activeObjects.Count == 0)\n            {\n                _onTriggerLastExited.ActivateTrigger(this, obj);\n            }\n        }\n\n        #endregion\n\n        #region Messages\n\n        void OnTriggerEnter(Collider other)\n        {\n            if (this.HasComponent<CompoundTrigger>() || other == null) return;\n\n            this.AddObject(other.gameObject);\n        }\n\n        void OnTriggerExit(Collider other)\n        {\n            if (this.HasComponent<CompoundTrigger>() || other == null) return;\n\n            this.RemoveObject(other.gameObject);\n        }\n\n        void ICompoundTriggerEnterResponder.OnCompoundTriggerEnter(Collider other)\n        {\n            if (other == null) return;\n            this.AddObject(other.gameObject);\n        }\n\n        void ICompoundTriggerExitResponder.OnCompoundTriggerExit(Collider other)\n        {\n            if (other == null) return;\n            this.RemoveObject(other.gameObject);\n        }\n\n        #endregion\n        \n        #region IOccupiedObservableTrigger Interface\n\n        Trigger[] IObservableTrigger.GetTriggers()\n        {\n            return new Trigger[] { _onTriggerOccupied, _onTriggerLastExited };\n        }\n\n        Trigger IOccupiedTrigger.EnterTrigger\n        {\n            get { return _onTriggerOccupied; }\n        }\n\n        Trigger IOccupiedTrigger.ExitTrigger\n        {\n            get { return _onTriggerLastExited; }\n        }\n        \n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/t_OnTriggerOccupiedActive.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\nusing UnityEngine;\nusing System.Collections.Generic;\n\nusing com.spacepuppy.Collections;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Scenario\n{\n\n    [Infobox(\"Similar to t_OnTriggerOccupied, only that it can perform active scanning of the region.\\n\" +\n             \"Note that when active it doesn't necessarily make sense to have 'no mask'. It would behave effectively like t_OnOccupiedTrigger but with added overhead. So either disable the scanning, or use t_OnOccupiedTrigger instead.\")]\n    public class t_OnTriggerOccupiedActive : SPComponent, ICompoundTriggerEnterResponder, ICompoundTriggerExitResponder, IOccupiedTrigger, IUpdateable\n    {\n\n        #region Fields\n\n        [SerializeField]\n        private EventActivatorMaskRef _mask = new EventActivatorMaskRef();\n\n        [SerializeField]\n        [Tooltip(\"If true, when an object is intersected we'll habitually retest the object in case its state changes for any reason.\")]\n        private bool _activelyScanning = true;\n        [SerializeField]\n        [Tooltip(\"Interval at which the scan occurs, leave at 0 to scan every frame. This is in 'real time' unaffected by timeScale.\")]\n        private float _activeScanInterval;\n\n        [SerializeField]\n        private Trigger _onTriggerOccupied;\n\n        [SerializeField]\n        private Trigger _onTriggerLastExited;\n\n        [System.NonSerialized]\n        private HashSet<GameObject> _intersectingObjects = new HashSet<GameObject>();\n        [System.NonSerialized]\n        private HashSet<GameObject> _activeObjects = new HashSet<GameObject>();\n\n        [System.NonSerialized]\n        private bool _activeScannerIsRunning;\n        [System.NonSerialized]\n        private float _timer;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        protected override void OnEnable()\n        {\n            base.OnEnable();\n\n            if (_activelyScanning && _activeObjects.Count > 0) this.StartUpdate();\n        }\n\n        protected override void OnDisable()\n        {\n            base.OnDisable();\n\n            this.StopUpdate();\n        }\n\n        #endregion\n\n        #region Properties\n\n        public IEventActivatorMask Mask\n        {\n            get { return _mask.Value; }\n            set { _mask.Value = value; }\n        }\n\n        public bool ActivelyScanning\n        {\n            get { return _activelyScanning; }\n            set\n            {\n                if (_activelyScanning == value) return;\n                _activelyScanning = value;\n                if (_activelyScanning)\n                {\n                    if (this.isActiveAndEnabled && _activeObjects.Count > 0) this.StartUpdate();\n                }\n                else\n                {\n                    this.StopUpdate();\n                }\n            }\n        }\n\n        public Trigger OnTriggerOccupied\n        {\n            get { return _onTriggerOccupied; }\n        }\n\n        public Trigger OnTriggerLastExited\n        {\n            get { return _onTriggerLastExited; }\n        }\n\n        public bool IsOccupied\n        {\n            get { return _activeObjects.Count > 0; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        private void AddObject(GameObject obj)\n        {\n            //tracking of all objects\n            if (_intersectingObjects.Add(obj) && _activelyScanning && !_activeScannerIsRunning && this.isActiveAndEnabled)\n            {\n                this.StartUpdate();\n            }\n\n            //tracking of active objects that signal event\n            if (_mask.Value != null && !_mask.Value.Intersects(obj)) return;\n\n            if (_activeObjects.Count == 0)\n            {\n                _activeObjects.Add(obj);\n                _onTriggerOccupied.ActivateTrigger(this, obj);\n            }\n            else\n            {\n                _activeObjects.Add(obj);\n            }\n        }\n\n        private void RemoveObject(GameObject obj)\n        {\n            //tracking of all objects\n            if (_intersectingObjects.Remove(obj) && _intersectingObjects.Count == 0)\n            {\n                this.StopUpdate();\n            }\n\n            //remove active objects\n            if (_activeObjects.Remove(obj) && _activeObjects.Count == 0)\n            {\n                _onTriggerLastExited.ActivateTrigger(this, obj);\n            }\n        }\n\n        private void StartUpdate()\n        {\n            _activeScannerIsRunning = true;\n            if (GameLoopEntry.UpdatePump.Contains(this)) return;\n\n            _timer = 0f;\n            GameLoopEntry.UpdatePump.Add(this);\n        }\n\n        private void StopUpdate()\n        {\n            _activeScannerIsRunning = false;\n            GameLoopEntry.UpdatePump.Remove(this);\n        }\n\n        #endregion\n\n        #region Messages\n\n        void OnTriggerEnter(Collider other)\n        {\n            if (this.HasComponent<CompoundTrigger>() || other == null) return;\n\n            this.AddObject(other.gameObject);\n        }\n\n        void OnTriggerExit(Collider other)\n        {\n            if (this.HasComponent<CompoundTrigger>() || other == null) return;\n\n            this.RemoveObject(other.gameObject);\n        }\n\n        void ICompoundTriggerEnterResponder.OnCompoundTriggerEnter(Collider other)\n        {\n            if (other == null) return;\n            this.AddObject(other.gameObject);\n        }\n\n        void ICompoundTriggerExitResponder.OnCompoundTriggerExit(Collider other)\n        {\n            if (other == null) return;\n            this.RemoveObject(other.gameObject);\n        }\n\n        #endregion\n\n        #region IUpdateable Interface\n\n        void IUpdateable.Update()\n        {\n            //stop if we shouldn't be running\n            if (!_activelyScanning || !this.isActiveAndEnabled || _intersectingObjects.Count == 0)\n            {\n                this.StopUpdate();\n                return;\n            }\n\n            //check timer\n            if (_activeScanInterval > 0f)\n            {\n                _timer += Time.unscaledDeltaTime;\n                if (_timer < _activeScanInterval) return;\n            }\n            _timer = 0f;\n\n            //perform scan of current objects\n            bool containsActiveObjects = _activeObjects.Count > 0;\n            using (var toRemove = TempCollection.GetSet<GameObject>())\n            {\n                var e = _intersectingObjects.GetEnumerator();\n                while (e.MoveNext())\n                {\n                    if (!ObjUtil.IsObjectAlive(e.Current) || !e.Current.activeInHierarchy)\n                    {\n                        _activeObjects.Remove(e.Current);\n                        toRemove.Add(e.Current);\n                        continue;\n                    }\n\n                    if (_mask.Value != null)\n                    {\n                        if (_mask.Value.Intersects(e.Current))\n                        {\n                            _activeObjects.Add(e.Current);\n                        }\n                        else\n                        {\n                            _activeObjects.Remove(e.Current);\n                        }\n                    }\n                }\n\n                if (toRemove.Count > 0)\n                {\n                    e = toRemove.GetEnumerator();\n                    while (e.MoveNext())\n                    {\n                        _intersectingObjects.Remove(e.Current);\n                    }\n                }\n            }\n\n            //wrap up by firing of appropriate events\n            if (_activeObjects.Count == 0 && _intersectingObjects.Count == 0)\n            {\n                this.StopUpdate();\n            }\n\n            if (containsActiveObjects)\n            {\n                if (_activeObjects.Count == 0) _onTriggerLastExited.ActivateTrigger(this, null);\n            }\n            else\n            {\n                if (_activeObjects.Count > 0) _onTriggerOccupied.ActivateTrigger(this, null);\n            }\n        }\n\n        #endregion\n\n        #region IOccupiedObservableTrigger Interface\n\n        Trigger[] IObservableTrigger.GetTriggers()\n        {\n            return new Trigger[] { _onTriggerOccupied, _onTriggerLastExited };\n        }\n\n        Trigger IOccupiedTrigger.EnterTrigger\n        {\n            get { return _onTriggerOccupied; }\n        }\n\n        Trigger IOccupiedTrigger.ExitTrigger\n        {\n            get { return _onTriggerLastExited; }\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/t_RandomInterval.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\n\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class t_RandomInterval : AutoTriggerComponent\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private SPTime _timeSupplier;\r\n        [SerializeField()]\r\n        private Interval _interval = com.spacepuppy.Geom.Interval.MinMax(0f, 1f);\r\n\r\n        [SerializeField()]\r\n        [Tooltip(\"Negative values will repeat forever like infinity.\")]\r\n        [DiscreteFloat.NonNegative()]\r\n        private DiscreteFloat _repeatCount = DiscreteFloat.PositiveInfinity;\r\n\r\n        [SerializeField()]\r\n        [TimeUnitsSelector()]\r\n        [Tooltip(\"Wait a duration before starting interval, waits using the same timesupplier as interval.\")]\r\n        private float _delay;\r\n\r\n\r\n        [System.NonSerialized()]\r\n        private RadicalCoroutine _routine;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            if (_routine != null)\r\n            {\r\n                _routine.Cancel();\r\n                _routine = null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public SPTime TimeSupplier\r\n        {\r\n            get { return _timeSupplier; }\r\n            set { _timeSupplier = value; }\r\n        }\r\n\r\n        public Interval Interval\r\n        {\r\n            get { return _interval; }\r\n            set { _interval = value; }\r\n        }\r\n        \r\n        public float Delay\r\n        {\r\n            get { return _delay; }\r\n        }\r\n\r\n        public DiscreteFloat RepeatCount\r\n        {\r\n            get { return _repeatCount; }\r\n            set { _repeatCount = (value < 0f) ? DiscreteFloat.Zero : value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected override void OnTriggerActivate()\r\n        {\r\n            if (_routine != null)\r\n            {\r\n                _routine.Cancel();\r\n                _routine = null;\r\n            }\r\n\r\n            _routine = this.StartRadicalCoroutine(this.TickerCallback(), RadicalCoroutineDisableMode.CancelOnDisable);\r\n        }\r\n\r\n\r\n        private System.Collections.IEnumerator TickerCallback()\r\n        {\r\n            if (_delay > 0f) yield return WaitForDuration.Seconds(_delay, _timeSupplier);\r\n\r\n            int cnt = 0;\r\n\r\n            while (true)\r\n            {\r\n                yield return WaitForDuration.Seconds(RandomUtil.Standard.Range(_interval.Max, _interval.Min), _timeSupplier.TimeSupplier);\r\n\r\n                this.ActivateTrigger();\r\n\r\n                cnt++;\r\n                if (cnt > _repeatCount)\r\n                {\r\n                    yield break;\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/t_StateMachine.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.StateMachine;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class t_StateMachine : SPComponent, IStateMachine<string>, IEnumerable<t_StateMachine.State>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        [ReorderableArray(DrawElementAtBottom = true, ChildPropertyToDrawAsElementLabel = \"_name\")]\r\n        private State[] _states;\r\n\r\n        [SerializeField]\r\n        private int _initialState;\r\n\r\n        [SerializeField]\r\n        [Tooltip(\"When starting should the initial states 'OnEnterState' event be fired?\")]\r\n        private bool _notifyFirstStateOnStart;\r\n\r\n        [Space(10)]\r\n        [SerializeField]\r\n        private Trigger _onStateChanged;\r\n\r\n        [System.NonSerialized]\r\n        private State _currentState;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Start()\r\n        {\r\n            base.Start();\r\n\r\n            _currentState = (_initialState >= 0 && _initialState < _states.Length) ? _states[_initialState] : null;\r\n            if(_notifyFirstStateOnStart && _currentState != null)\r\n            {\r\n                _currentState.OnEnterState.ActivateTrigger(this, null);\r\n                this.OnStateChanged(null, _currentState.Name);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int NumOfStates\r\n        {\r\n            get { return _states.Length; }\r\n        }\r\n\r\n        public State Current\r\n        {\r\n            get { return _currentState; }\r\n        }\r\n\r\n        public string CurrentStateName\r\n        {\r\n            get { return _currentState != null ? _currentState.Name : null; }\r\n        }\r\n\r\n        public int CurrentStateIndex\r\n        {\r\n            get { return System.Array.IndexOf(_states, _currentState); }\r\n        }\r\n\r\n        public State this[int index]\r\n        {\r\n            get\r\n            {\r\n                if (index < 0 || index >= _states.Length) throw new System.IndexOutOfRangeException();\r\n                return _states[index];\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public int IndexOf(State state)\r\n        {\r\n            return System.Array.IndexOf(_states, state);\r\n        }\r\n\r\n        public bool Contains(State state)\r\n        {\r\n            return System.Array.IndexOf(_states, state) >= 0;\r\n        }\r\n        \r\n        public State ChangeState(int index)\r\n        {\r\n            if (index < 0 || index >= _states.Length) throw new System.IndexOutOfRangeException();\r\n\r\n            var s = _states[index];\r\n            if (_currentState == s) return s;\r\n\r\n            var lastState = _currentState;\r\n            _currentState = s;\r\n            if (lastState != null) lastState.OnExitState.ActivateTrigger(this, null);\r\n            if (_currentState != null) _currentState.OnEnterState.ActivateTrigger(this, null);\r\n\r\n            this.OnStateChanged(lastState != null ? lastState.Name : null, _currentState != null ? _currentState.Name : null);\r\n            return _currentState;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region StateMachine Interface\r\n\r\n        public event StateChangedEventHandler<string> StateChanged;\r\n        protected virtual void OnStateChanged(string from, string to)\r\n        {\r\n            _onStateChanged.ActivateTrigger(this, null);\r\n\r\n            var d = this.StateChanged;\r\n            if (d != null) d(this, new StateChangedEventArgs<string>(from, to));\r\n        }\r\n\r\n        string IStateMachine<string>.Current\r\n        {\r\n            get\r\n            {\r\n                return _currentState != null ? _currentState.Name : null;\r\n            }\r\n        }\r\n\r\n\r\n        public bool Contains(string state)\r\n        {\r\n            foreach(var s in _states)\r\n            {\r\n                if (string.Equals(s.Name, state)) return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public string ChangeState(string state)\r\n        {\r\n            if (_currentState != null && _currentState.Name == state) return state;\r\n\r\n            foreach (var s in _states)\r\n            {\r\n                if (string.Equals(s.Name, state))\r\n                {\r\n                    var lastState = _currentState;\r\n                    _currentState = s;\r\n                    if (lastState != null) lastState.OnExitState.ActivateTrigger(this, null);\r\n                    _currentState.OnEnterState.ActivateTrigger(this, null);\r\n                    \r\n                    this.OnStateChanged(lastState != null ? lastState.Name : null, state);\r\n\r\n                    return state;\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n        \r\n        void IStateMachine<string>.GetStates(ICollection<string> coll)\r\n        {\r\n            for (int i = 0; i < _states.Length; i++)\r\n            {\r\n                coll.Add(_states[i].Name);\r\n            }\r\n        }\r\n\r\n        void com.spacepuppy.Collections.IForeachEnumerator<string>.Foreach(System.Action<string> callback)\r\n        {\r\n            for (int i = 0; i < _states.Length; i++)\r\n            {\r\n                callback(_states[i].Name);\r\n            }\r\n        }\r\n\r\n        IEnumerator<string> IEnumerable<string>.GetEnumerator()\r\n        {\r\n            foreach(var s in _states)\r\n            {\r\n                yield return s.Name;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n        \r\n        public IEnumerator<State> GetEnumerator()\r\n        {\r\n            return (_states as IList<State>).GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        [System.Serializable]\r\n        public class State\r\n        {\r\n            [SerializeField]\r\n            private string _name;\r\n            [SerializeField]\r\n            private Trigger _onEnterState;\r\n            [SerializeField]\r\n            private Trigger _onExitState;\r\n\r\n            public string Name\r\n            {\r\n                get { return _name; }\r\n            }\r\n\r\n            public Trigger OnEnterState\r\n            {\r\n                get { return _onEnterState; }\r\n            }\r\n\r\n            public Trigger OnExitState\r\n            {\r\n                get { return _onExitState; }\r\n            }\r\n            \r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenario/t_Timer.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\nusing UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Scenario\n{\n\n    public sealed class t_Timer : TriggerableMechanism, IUpdateable, IObservableTrigger\n    {\n\n        public enum Action\n        {\n            Restart = 0,\n            EndImmediately = 1,\n            Pause = 2,\n            Resume = 3,\n            TogglePause = 4\n        }\n\n        #region Fields\n\n        [SerializeField]\n        private SPTimePeriod _duration;\n\n        [SerializeField]\n        [Tooltip(\"If this thing is triggered by another t_, it will do this action.\")]\n        private Action _onTriggeredAction = Action.Restart;\n\n        [SerializeField]\n        private Trigger _onComplete;\n\n        [System.NonSerialized]\n        private float _tally;\n\n        #endregion\n\n        #region Properties\n\n        public SPTimePeriod Duration\n        {\n            get { return _duration; }\n            set { _duration = value; }\n        }\n\n        public Action OnTriggeredAction\n        {\n            get { return _onTriggeredAction; }\n            set { _onTriggeredAction = value; }\n        }\n\n        public Trigger OnComplete\n        {\n            get { return _onComplete; }\n        }\n\n        public bool IsRunning\n        {\n            get\n            {\n                return this.isActiveAndEnabled && !float.IsNaN(_tally);\n            }\n        }\n\n        public bool IsPaused\n        {\n            get\n            {\n                return this.isActiveAndEnabled && !float.IsNaN(_tally) && !GameLoopEntry.UpdatePump.Contains(this);\n            }\n        }\n\n\n        [ShowNonSerializedProperty(\"Current Time\")]\n        public float Tally\n        {\n            get { return _tally; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        protected override void OnEnable()\n        {\n            base.OnEnable();\n\n            this.Restart();\n        }\n\n        protected override void OnDisable()\n        {\n            base.OnDisable();\n\n            this.Stop(false);\n        }\n\n        void IUpdateable.Update()\n        {\n            if(double.IsNaN(_tally))\n            {\n                this.Stop(false);\n                return;\n            }\n\n            _tally += _duration.TimeSupplier.Delta;\n            if (_tally >= _duration.Seconds)\n            {\n                this.Stop(true);\n            }\n        }\n\n\n        public void Restart()\n        {\n            _tally = 0f;\n            GameLoopEntry.UpdatePump.Add(this);\n        }\n\n        public void Resume()\n        {\n            if (!double.IsNaN(_tally)) GameLoopEntry.UpdatePump.Add(this);\n        }\n\n        public void Pause()\n        {\n            GameLoopEntry.UpdatePump.Remove(this);\n        }\n\n        public void TogglePause()\n        {\n            if (this.IsPaused)\n                this.Resume();\n            else\n                this.Pause();\n        }\n\n        public void Stop(bool fireEvent)\n        {\n            _tally = float.NaN;\n            GameLoopEntry.UpdatePump.Remove(this);\n            if(fireEvent)\n            {\n                _onComplete.ActivateTrigger(this, null);\n            }\n        }\n\n        #endregion\n\n        #region ITriggerable Interface\n\n        public override bool Trigger(object sender, object arg)\n        {\n            if (!this.CanTrigger) return false;\n\n            switch(_onTriggeredAction)\n            {\n                case Action.Restart:\n                    this.Restart();\n                    return true;\n                case Action.EndImmediately:\n                    this.Stop(this.IsRunning);\n                    return true;\n                case Action.Pause:\n                    this.Pause();\n                    return true;\n                case Action.Resume:\n                    this.Resume();\n                    return true;\n                case Action.TogglePause:\n                    this.TogglePause();\n                    return true;\n                default:\n                    return false;\n            }\n        }\n\n        #endregion\n\n        #region IObservableTrigger Interface\n\n        Trigger[] IObservableTrigger.GetTriggers()\n        {\n            return new Trigger[] { _onComplete };\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Scenes/Enums.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Scenes\r\n{\r\n    public enum LoadSceneBehaviour\r\n    {\r\n        /// <summary>\r\n        /// like unity's SceneManager.LoadScene. Due to the way Unity implements this, it is considered glitchy by the SP team. Thusly it is set to -1.\r\n        /// </summary>\r\n        Standard = -1,\r\n        /// <summary>\r\n        /// The preferred default method.\r\n        /// </summary>\r\n        Async = 0,\r\n        /// <summary>\r\n        /// Loads async, but does not activate scene.\r\n        /// </summary>\r\n        AsyncAndWait = 1\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenes/ISceneLoadedGlobalHandler.cs",
    "content": "﻿using System;\n\nnamespace com.spacepuppy.Scenes\n{\n\n    /// <summary>\n    /// A global message receiver to handle OnSceneLoaded event.\n    /// </summary>\n    public interface ISceneLoadedGlobalHandler\n    {\n\n        void OnSceneLoaded(LoadSceneWaitHandle handle);\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Scenes/LoadSceneAsyncWaitHandle.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.SceneManagement;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Scenes\r\n{\r\n\r\n    public class LoadSceneWaitHandle : System.EventArgs, IProgressingYieldInstruction, IRadicalWaitHandle, ISPDisposable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private string _sceneName;\r\n        private LoadSceneMode _mode;\r\n        private LoadSceneBehaviour _behaviour;\r\n        private Scene _scene;\r\n        private AsyncOperation _op;\r\n        private System.Action<LoadSceneWaitHandle> _onComplete;\r\n\r\n        private bool _initialized;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public LoadSceneWaitHandle(string sceneName, LoadSceneMode mode, LoadSceneBehaviour behaviour)\r\n        {\r\n            _sceneName = sceneName;\r\n            _mode = mode;\r\n            _behaviour = behaviour;\r\n            _op = null;\r\n            _scene = default(Scene);\r\n            _initialized = false;\r\n        }\r\n\r\n        public void Init(Scene sc, AsyncOperation op)\r\n        {\r\n            if (_disposed) throw new System.InvalidOperationException(\"LoadSceneAsyncWaitHandle was disposed.\");\r\n            if (_initialized) throw new System.InvalidOperationException(\"LoadSceneAsyncWaitHandle has already been initialized.\");\r\n            _initialized = true;\r\n            _scene = sc;\r\n            _op = op;\r\n            if(_behaviour == LoadSceneBehaviour.AsyncAndWait && _op != null && !_op.isDone)\r\n            {\r\n                _op.allowSceneActivation = false;\r\n            }\r\n            SceneManager.sceneLoaded += this.OnSceneLoaded;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Initialize the handle after load for use as an EventArgs.\r\n        /// </summary>\r\n        /// <param name=\"sc\"></param>\r\n        public void FalseInit(Scene sc)\r\n        {\r\n            if (_disposed) throw new System.InvalidOperationException(\"LoadSceneAsyncWaitHandle was disposed.\");\r\n            if (_initialized) throw new System.InvalidOperationException(\"LoadSceneAsyncWaitHandle has already been initialized.\");\r\n            _initialized = true;\r\n            _scene = sc;\r\n            _op = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public string SceneName\r\n        {\r\n            get { return _sceneName; }\r\n        }\r\n\r\n        public LoadSceneMode Mode\r\n        {\r\n            get { return _mode; }\r\n        }\r\n\r\n        public LoadSceneBehaviour Behaviour\r\n        {\r\n            get { return _behaviour; }\r\n        }\r\n\r\n        public Scene Scene\r\n        {\r\n            get { return _scene; }\r\n        }\r\n\r\n        public bool ReadyAndWaitingToActivate\r\n        {\r\n            get { return !object.ReferenceEquals(_op, null) && _op.progress >= 0.9f && !_op.isDone; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Use this to pass some token between scenes. \r\n        /// Anything that handles the ISceneLoadedMessageReceiver will receiver a reference to this handle, and therefore this token.\r\n        /// The token should not be something that is destroyed by the load process.\r\n        /// </summary>\r\n        public object PersistentToken\r\n        {\r\n            get;\r\n            set;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n        \r\n        public void WaitToActivate()\r\n        {\r\n            if(_behaviour >= LoadSceneBehaviour.Async)\r\n            {\r\n                _behaviour = LoadSceneBehaviour.AsyncAndWait;\r\n                if(_op != null && !_op.isDone)\r\n                {\r\n                    _op.allowSceneActivation = false;\r\n                }\r\n            }\r\n        }\r\n\r\n        public void ActivateScene()\r\n        {\r\n            if (_op != null) _op.allowSceneActivation = true;\r\n        }\r\n\r\n        private void OnSceneLoaded(Scene scene, LoadSceneMode mode)\r\n        {\r\n            //note Scene == Scene compares the handle and works just fine\r\n            if (_scene == scene)\r\n            {\r\n                SceneManager.sceneLoaded -= this.OnSceneLoaded;\r\n\r\n                var d = _onComplete;\r\n                _onComplete = null;\r\n                if (d != null) d(this);\r\n                \r\n                com.spacepuppy.Utils.Messaging.Broadcast<ISceneLoadedGlobalHandler>((o) => o.OnSceneLoaded(this));\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IProgressingAsyncOperation Interface\r\n\r\n        public float Progress\r\n        {\r\n            get\r\n            {\r\n                switch(_behaviour)\r\n                {\r\n                    case LoadSceneBehaviour.Standard:\r\n                        return _initialized ? 0f : 1f;\r\n                    case LoadSceneBehaviour.Async:\r\n                    case LoadSceneBehaviour.AsyncAndWait:\r\n                        if (object.ReferenceEquals(_op, null))\r\n                            return 0f;\r\n                        else\r\n                            return _op.progress;\r\n                    default:\r\n                        return 1f;\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool IsComplete\r\n        {\r\n            get\r\n            {\r\n                switch (_behaviour)\r\n                {\r\n                    case LoadSceneBehaviour.Standard:\r\n                        return _initialized;\r\n                    case LoadSceneBehaviour.Async:\r\n                    case LoadSceneBehaviour.AsyncAndWait:\r\n                        if (object.ReferenceEquals(_op, null))\r\n                            return false;\r\n                        else\r\n                            return _op.isDone;\r\n                    default:\r\n                        return true;\r\n                }\r\n            }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            if(!_initialized)\r\n            {\r\n                yieldObject = null;\r\n                return false;\r\n            }\r\n\r\n            switch(_behaviour)\r\n            {\r\n                case LoadSceneBehaviour.Standard:\r\n                    if(_initialized)\r\n                    {\r\n                        yieldObject = null;\r\n                        return false;\r\n                    }\r\n                    else\r\n                    {\r\n                        yieldObject = null;\r\n                        return true;\r\n                    }\r\n                case LoadSceneBehaviour.Async:\r\n                    if (!object.ReferenceEquals(_op, null) && _op.isDone)\r\n                    {\r\n                        yieldObject = null;\r\n                        return false;\r\n                    }\r\n                    else\r\n                    {\r\n                        yieldObject = _op;\r\n                        return true;\r\n                    }\r\n                case LoadSceneBehaviour.AsyncAndWait:\r\n                    if(object.ReferenceEquals(_op, null))\r\n                    {\r\n                        yieldObject = null;\r\n                        return false;\r\n                    }\r\n                    else if(_op.isDone || this.ReadyAndWaitingToActivate)\r\n                    {\r\n                        yieldObject = null;\r\n                        return false;\r\n                    }\r\n                    else\r\n                    {\r\n                        yieldObject = _op;\r\n                        return true;\r\n                    }\r\n                default:\r\n                    yieldObject = null;\r\n                    return false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalWaitHandle Interface\r\n\r\n        public void OnComplete(System.Action<LoadSceneWaitHandle> callback)\r\n        {\r\n            _onComplete += callback;\r\n        }\r\n\r\n        bool IRadicalWaitHandle.Cancelled\r\n        {\r\n            get { return !_disposed; }\r\n        }\r\n\r\n        void IRadicalWaitHandle.OnComplete(System.Action<IRadicalWaitHandle> callback)\r\n        {\r\n            if (callback == null) return;\r\n            _onComplete += (h) => callback(h);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        private bool _disposed;\r\n        public bool IsDisposed\r\n        {\r\n            get { return _disposed; }\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            if (!_disposed)\r\n            {\r\n                _sceneName = null;\r\n                _op = null;\r\n                SceneManager.sceneLoaded -= this.OnSceneLoaded;\r\n            }\r\n\r\n            _disposed = true;\r\n        }\r\n\r\n        ~LoadSceneWaitHandle()\r\n        {\r\n            //make sure we clean ourselves up\r\n            this.Dispose();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenes/SceneManager.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.SceneManagement;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Scenes\r\n{\r\n\r\n    /*\r\n     * NOTES - some information to keep me reminded about scenes.\r\n     * \r\n     * The Scene struct is really just a wrapper around an int/handle. All calls and comparisons reach through. \r\n     * So even though it's a struct, it acts more like a reference type.\r\n     * \r\n     */\r\n\r\n\r\n    public interface ISceneManager : IService\r\n    {\r\n\r\n        event System.EventHandler<LoadSceneWaitHandle> BeforeSceneLoaded;\r\n        event System.EventHandler<SceneUnloadedEventArgs> BeforeSceneUnloaded;\r\n        event System.EventHandler<SceneUnloadedEventArgs> SceneUnloaded;\r\n        event System.EventHandler<LoadSceneWaitHandle> SceneLoaded;\r\n        event System.EventHandler<ActiveSceneChangedEventArgs> ActiveSceneChanged;\r\n        \r\n        LoadSceneWaitHandle LoadScene(string sceneName, LoadSceneMode mode = LoadSceneMode.Single, LoadSceneBehaviour behaviour = LoadSceneBehaviour.Async);\r\n        LoadSceneWaitHandle LoadScene(int sceneBuildIndex, LoadSceneMode mode = LoadSceneMode.Single, LoadSceneBehaviour behaviour = LoadSceneBehaviour.Async);\r\n\r\n        AsyncOperation UnloadScene(Scene scene);\r\n        Scene GetActiveScene();\r\n\r\n        /// <summary>\r\n        /// Test if a scene by the name exists.\r\n        /// </summary>\r\n        /// <param name=\"excludeInactive\">False to test if the scene exists as a loadable scene, True if to test if the scene exists and is actively loaded.</param>\r\n        /// <returns></returns>\r\n        bool SceneExists(string sceneName, bool excludeInactive = false);\r\n\r\n    }\r\n    \r\n    public class SPSceneManager : ServiceScriptableObject<ISceneManager>, ISceneManager\r\n    {\r\n\r\n        #region Fields\r\n        \r\n        private SceneUnloadedEventArgs _unloadArgs;\r\n        private ActiveSceneChangedEventArgs _activeChangeArgs;\r\n\r\n        private Dictionary<Scene, LoadSceneWaitHandle> _table = new Dictionary<Scene, LoadSceneWaitHandle>();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnValidAwake()\r\n        {\r\n            SceneManager.sceneUnloaded += this.OnSceneUnloaded;\r\n            SceneManager.sceneLoaded += this.OnSceneLoaded;\r\n            SceneManager.activeSceneChanged += this.OnActiveSceneChanged;\r\n        }\r\n\r\n        protected override void OnDestroy()\r\n        {\r\n            base.OnDestroy();\r\n\r\n            SceneManager.sceneUnloaded -= this.OnSceneUnloaded;\r\n            SceneManager.sceneLoaded -= this.OnSceneLoaded;\r\n            SceneManager.activeSceneChanged -= this.OnActiveSceneChanged;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISceneManager Interface\r\n\r\n        public event System.EventHandler<LoadSceneWaitHandle> BeforeSceneLoaded;\r\n        public event System.EventHandler<SceneUnloadedEventArgs> BeforeSceneUnloaded;\r\n        public event System.EventHandler<SceneUnloadedEventArgs> SceneUnloaded;\r\n        public event System.EventHandler<LoadSceneWaitHandle> SceneLoaded;\r\n        public event System.EventHandler<ActiveSceneChangedEventArgs> ActiveSceneChanged;\r\n        \r\n        public LoadSceneWaitHandle LoadScene(string sceneName, LoadSceneMode mode = LoadSceneMode.Single, LoadSceneBehaviour behaviour = LoadSceneBehaviour.Async)\r\n        {\r\n            switch (behaviour)\r\n            {\r\n                case LoadSceneBehaviour.Standard:\r\n                    {\r\n                        var handle = new LoadSceneWaitHandle(sceneName, mode, behaviour);\r\n                        this.OnBeforeSceneLoaded(handle);\r\n                        SceneManager.LoadScene(sceneName, mode);\r\n                        var scene = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);\r\n                        _table[scene] = handle;\r\n                        handle.Init(scene, null);\r\n                        return handle;\r\n                    }\r\n                case LoadSceneBehaviour.Async:\r\n                    {\r\n                        var handle = new LoadSceneWaitHandle(sceneName, mode, behaviour);\r\n                        this.OnBeforeSceneLoaded(handle);\r\n                        var op = SceneManager.LoadSceneAsync(sceneName, mode);\r\n                        var scene = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);\r\n                        _table[scene] = handle;\r\n                        handle.Init(scene, op);\r\n                        return handle;\r\n                    }\r\n                case LoadSceneBehaviour.AsyncAndWait:\r\n                    {\r\n                        var handle = new LoadSceneWaitHandle(sceneName, mode, behaviour);\r\n                        this.OnBeforeSceneLoaded(handle);\r\n                        var op = SceneManager.LoadSceneAsync(sceneName, mode);\r\n                        op.allowSceneActivation = false;\r\n                        var scene = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);\r\n                        _table[scene] = handle;\r\n                        handle.Init(scene, op);\r\n                        return handle;\r\n                    }\r\n            }\r\n\r\n            throw new System.InvalidOperationException(\"Unsupported LoadSceneBehaviour.\");\r\n        }\r\n\r\n        public LoadSceneWaitHandle LoadScene(int sceneBuildIndex, LoadSceneMode mode = LoadSceneMode.Single, LoadSceneBehaviour behaviour = LoadSceneBehaviour.Async)\r\n        {\r\n            if (sceneBuildIndex < 0 || sceneBuildIndex >= SceneManager.sceneCountInBuildSettings) throw new System.IndexOutOfRangeException(\"sceneBuildIndex\");\r\n\r\n            //string sceneName = \"#\" + sceneBuildIndex.ToString();\r\n            string sceneName = SceneUtility.GetScenePathByBuildIndex(sceneBuildIndex);\r\n\r\n            switch (behaviour)\r\n            {\r\n                case LoadSceneBehaviour.Standard:\r\n                    {\r\n                        var handle = new LoadSceneWaitHandle(sceneName, mode, behaviour);\r\n                        this.OnBeforeSceneLoaded(handle);\r\n                        SceneManager.LoadScene(sceneBuildIndex, mode);\r\n                        var scene = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);\r\n                        _table[scene] = handle;\r\n                        handle.Init(scene, null);\r\n                        return handle;\r\n                    }\r\n                case LoadSceneBehaviour.Async:\r\n                    {\r\n                        var handle = new LoadSceneWaitHandle(sceneName, mode, behaviour);\r\n                        this.OnBeforeSceneLoaded(handle);\r\n                        var op = SceneManager.LoadSceneAsync(sceneBuildIndex, mode);\r\n                        var scene = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);\r\n                        _table[scene] = handle;\r\n                        handle.Init(scene, op);\r\n                        return handle;\r\n                    }\r\n                case LoadSceneBehaviour.AsyncAndWait:\r\n                    {\r\n                        var handle = new LoadSceneWaitHandle(sceneName, mode, behaviour);\r\n                        this.OnBeforeSceneLoaded(handle);\r\n                        var op = SceneManager.LoadSceneAsync(sceneBuildIndex, mode);\r\n                        op.allowSceneActivation = false;\r\n                        var scene = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);\r\n                        _table[scene] = handle;\r\n                        handle.Init(scene, op);\r\n                        return handle;\r\n                    }\r\n            }\r\n\r\n            throw new System.InvalidOperationException(\"Unsupported LoadSceneBehaviour.\");\r\n        }\r\n\r\n        public AsyncOperation UnloadScene(Scene scene)\r\n        {\r\n            this.OnBeforeSceneUnloaded(scene);\r\n            return SceneManager.UnloadSceneAsync(scene);\r\n        }\r\n\r\n        public Scene GetActiveScene()\r\n        {\r\n            return SceneManager.GetActiveScene();\r\n        }\r\n\r\n        public bool SceneExists(string sceneName, bool excludeInactive = false)\r\n        {\r\n            if(excludeInactive)\r\n            {\r\n                var sc = SceneManager.GetSceneByName(sceneName);\r\n                return sc.IsValid();\r\n            }\r\n            else\r\n            {\r\n                return SceneUtility.GetBuildIndexByScenePath(sceneName) >= 0;\r\n            }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region EventHandlers\r\n\r\n        protected virtual void OnBeforeSceneLoaded(LoadSceneWaitHandle handle)\r\n        {\r\n            var d = this.BeforeSceneLoaded;\r\n            if (d == null) return;\r\n\r\n            d(this, handle);\r\n        }\r\n\r\n        protected virtual void OnBeforeSceneUnloaded(Scene scene)\r\n        {\r\n            var d = this.BeforeSceneUnloaded;\r\n            if (d == null) return;\r\n\r\n            var e = _unloadArgs;\r\n            _unloadArgs = null;\r\n            if (e == null)\r\n                e = new SceneUnloadedEventArgs(scene);\r\n            else\r\n                e.Scene = scene;\r\n\r\n            d(this, e);\r\n\r\n            _unloadArgs = e;\r\n            _unloadArgs.Scene = default(Scene);\r\n        }\r\n\r\n        protected virtual void OnSceneUnloaded(Scene scene)\r\n        {\r\n            var d = this.SceneUnloaded;\r\n            if (d == null) return;\r\n\r\n            var e = _unloadArgs;\r\n            _unloadArgs = null;\r\n            if (e == null)\r\n                e = new SceneUnloadedEventArgs(scene);\r\n            else\r\n                e.Scene = scene;\r\n\r\n            d(this, e);\r\n\r\n            _unloadArgs = e;\r\n            _unloadArgs.Scene = default(Scene);\r\n        }\r\n\r\n        protected virtual void OnSceneLoaded(Scene scene, LoadSceneMode mode)\r\n        {\r\n            LoadSceneWaitHandle handle;\r\n            if (_table.TryGetValue(scene, out handle))\r\n            {\r\n                _table.Remove(scene);\r\n            }\r\n            var d = this.SceneLoaded;\r\n            if (d == null) return;\r\n\r\n            if(handle == null)\r\n            {\r\n                handle = new LoadSceneWaitHandle(scene.name, mode, LoadSceneBehaviour.Standard);\r\n                handle.Init(scene, null);\r\n            }\r\n            \r\n            d(this, handle);\r\n        }\r\n\r\n        protected virtual void OnActiveSceneChanged(Scene lastScene, Scene nextScene)\r\n        {\r\n            var d = this.ActiveSceneChanged;\r\n            if (d == null) return;\r\n\r\n            var e = _activeChangeArgs;\r\n            _activeChangeArgs = null;\r\n            if (e == null)\r\n                e = new ActiveSceneChangedEventArgs(lastScene, nextScene);\r\n            else\r\n            {\r\n                e.LastScene = lastScene;\r\n                e.NextScene = nextScene;\r\n            }\r\n\r\n            d(this, e);\r\n\r\n            _activeChangeArgs = e;\r\n            _activeChangeArgs.LastScene = default(Scene);\r\n            _activeChangeArgs.NextScene = default(Scene);\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenes/SceneManagerEventArgs.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.SceneManagement;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Scenes\r\n{\r\n    \r\n    public class SceneUnloadedEventArgs : System.EventArgs\r\n    {\r\n\r\n        public SceneUnloadedEventArgs(Scene scene)\r\n        {\r\n            this.Scene = scene;\r\n        }\r\n\r\n        public Scene Scene\r\n        {\r\n            get;\r\n            set;\r\n        }\r\n\r\n    }\r\n    \r\n    public class ActiveSceneChangedEventArgs : System.EventArgs\r\n    {\r\n\r\n        public ActiveSceneChangedEventArgs(Scene lastScene, Scene nextScene)\r\n        {\r\n            this.LastScene = lastScene;\r\n            this.NextScene = nextScene;\r\n        }\r\n\r\n        public Scene LastScene\r\n        {\r\n            get;\r\n            set;\r\n        }\r\n\r\n        public Scene NextScene\r\n        {\r\n            get;\r\n            set;\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenes/SceneManagerUtils.cs",
    "content": "﻿using UnityEngine.SceneManagement;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Scenes\r\n{\r\n    \r\n    public static class SceneManagerUtils\r\n    {\r\n\r\n        #region Static Utils\r\n\r\n        public static LoadSceneWaitHandle LoadScene(string sceneName, LoadSceneMode mode, LoadSceneBehaviour behaviour)\r\n        {\r\n            var manager = Services.Get<ISceneManager>();\r\n            if (manager != null) return manager.LoadScene(sceneName, mode, behaviour);\r\n\r\n            switch (behaviour)\r\n            {\r\n                case LoadSceneBehaviour.Standard:\r\n                    {\r\n                        var handle = new LoadSceneWaitHandle(sceneName, mode, behaviour);\r\n                        SceneManager.LoadScene(sceneName, mode);\r\n                        handle.Init(SceneManager.GetSceneAt(SceneManager.sceneCount - 1), null);\r\n                        return handle;\r\n                    }\r\n                case LoadSceneBehaviour.Async:\r\n                    {\r\n                        var handle = new LoadSceneWaitHandle(sceneName, mode, behaviour);\r\n                        var op = SceneManager.LoadSceneAsync(sceneName, mode);\r\n                        handle.Init(SceneManager.GetSceneAt(SceneManager.sceneCount - 1), op);\r\n                        return handle;\r\n                    }\r\n                case LoadSceneBehaviour.AsyncAndWait:\r\n                    {\r\n                        var handle = new LoadSceneWaitHandle(sceneName, mode, behaviour);\r\n                        var op = SceneManager.LoadSceneAsync(sceneName, mode);\r\n                        op.allowSceneActivation = false;\r\n                        handle.Init(SceneManager.GetSceneAt(SceneManager.sceneCount - 1), op);\r\n                        return handle;\r\n                    }\r\n            }\r\n\r\n            throw new System.InvalidOperationException(\"Unsupported LoadSceneBehaviour.\");\r\n        }\r\n\r\n        public static LoadSceneWaitHandle LoadScene(int sceneBuildIndex, LoadSceneMode mode, LoadSceneBehaviour behaviour)\r\n        {\r\n            if (sceneBuildIndex < 0 || sceneBuildIndex >= SceneManager.sceneCountInBuildSettings) throw new System.IndexOutOfRangeException(\"sceneBuildIndex\");\r\n\r\n            var manager = Services.Get<ISceneManager>();\r\n            if (manager != null) return manager.LoadScene(sceneBuildIndex, mode, behaviour);\r\n\r\n            //string sceneName = \"#\" + sceneBuildIndex.ToString();\r\n            string sceneName = SceneUtility.GetScenePathByBuildIndex(sceneBuildIndex);\r\n\r\n            switch (behaviour)\r\n            {\r\n                case LoadSceneBehaviour.Standard:\r\n                    {\r\n                        var handle = new LoadSceneWaitHandle(sceneName, mode, behaviour);\r\n                        SceneManager.LoadScene(sceneBuildIndex, mode);\r\n                        handle.Init(SceneManager.GetSceneAt(SceneManager.sceneCount - 1), null);\r\n                        return handle;\r\n                    }\r\n                case LoadSceneBehaviour.Async:\r\n                    {\r\n                        var handle = new LoadSceneWaitHandle(sceneName, mode, behaviour);\r\n                        var op = SceneManager.LoadSceneAsync(sceneBuildIndex, mode);\r\n                        handle.Init(SceneManager.GetSceneAt(SceneManager.sceneCount - 1), op);\r\n                        return handle;\r\n                    }\r\n                case LoadSceneBehaviour.AsyncAndWait:\r\n                    {\r\n                        var handle = new LoadSceneWaitHandle(sceneName, mode, behaviour);\r\n                        var op = SceneManager.LoadSceneAsync(sceneBuildIndex, mode);\r\n                        op.allowSceneActivation = false;\r\n                        handle.Init(SceneManager.GetSceneAt(SceneManager.sceneCount - 1), op);\r\n                        return handle;\r\n                    }\r\n            }\r\n\r\n            throw new System.InvalidOperationException(\"Unsupported LoadSceneBehaviour.\");\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Scenes/SceneRef.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\nusing UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Scenes\n{\n\n    [System.Serializable]\n    public struct SceneRef\n    {\n\n        #region Fields\n\n        [SerializeField]\n        private UnityEngine.Object _sceneAsset;\n\n        [SerializeField]\n        private string _sceneName;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public SceneRef(string sceneName)\n        {\n            _sceneAsset = null;\n            _sceneName = sceneName;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public UnityEngine.Object SceneAsset\n        {\n            get { return _sceneAsset; }\n        }\n\n        public string SceneName\n        {\n            get { return _sceneName; }\n            set\n            {\n                if(!string.Equals(_sceneName, value))\n                {\n                    _sceneAsset = null;\n                    _sceneName = value;\n                }\n            }\n        }\n\n        #endregion\n\n        #region Implicit Conversion\n\n        public static implicit operator string(SceneRef sceneRef)\n        {\n            if (sceneRef == null) return null;\n            return sceneRef._sceneName;\n        }\n\n        public static implicit operator SceneRef(string sceneName)\n        {\n            return new SceneRef(sceneName);\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyBase/Service.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\nusing Type = System.Type;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// A special type of Singleton accessible by the Services static interface.\r\n    /// \r\n    /// A service should implement some interface and is registered with Services as that interface. \r\n    /// This allows for a service to be accessed like a singleton, but implemented as an interface. \r\n    /// \r\n    /// See IGameInputManager, ICameraManager, and ISceneManager for examples.\r\n    /// </summary>\r\n    public interface IService : ISingleton\r\n    {\r\n        /// <summary>\r\n        /// Signals if a service has been disposed of in a manner that may not have allowed the proper Services channels to be called. \r\n        /// Such as if a Component is destroyed.\r\n        /// </summary>\r\n        event System.EventHandler Disposed;\r\n        event System.EventHandler ServiceUnregistered;\r\n        void SignalServiceUnregistered();\r\n    }\r\n\r\n    public interface IServiceDecorator<T> : IService where T : IService\r\n    {\r\n        void Consume(T service);\r\n    }\r\n\r\n    /// <summary>\r\n    /// Access point for all registered Services.\r\n    /// \r\n    /// Note - the reflected System.Type versions of these methods will not work on AOT systems.\r\n    /// </summary>\r\n    public static class Services\r\n    {\r\n\r\n        private static HashSet<IService> _services = new HashSet<IService>();\r\n        private static Dictionary<System.Type, IService> _serviceTable = new Dictionary<Type, IService>();\r\n        private static Dictionary<System.Type, System.Reflection.FieldInfo> _staticFieldTable = new Dictionary<Type, System.Reflection.FieldInfo>();\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Returns true if the service is registered directly with any look-up type. \r\n        /// Note this may return false if the service is decorated. \r\n        /// Use the 'Exists' method if you want to know if a service is available.\r\n        /// </summary>\r\n        /// <param name=\"service\"></param>\r\n        /// <returns></returns>\r\n        public static bool IsManaging(IService service)\r\n        {\r\n            return service != null && _services.Contains(service);\r\n        }\r\n\r\n        public static IService[] GetAll()\r\n        {\r\n            return _services.ToArray();\r\n        }\r\n\r\n        public static int GetAll(ICollection<IService> results)\r\n        {\r\n            foreach (var service in _services)\r\n            {\r\n                results.Add(service);\r\n            }\r\n            return _services.Count;\r\n        }\r\n\r\n        public static void ClearAll(bool destroyIfCan = false, bool donotSignalUnregister = false)\r\n        {\r\n            using (var types = TempCollection.GetSet<System.Type>(_serviceTable.Keys))\r\n            using(var services = TempCollection.GetSet<IService>(_serviceTable.Values))\r\n            {\r\n                //Replace references\r\n                var e2 = types.GetEnumerator();\r\n                while (e2.MoveNext())\r\n                {\r\n                    var field = GetStaticEntryFieldInfo(e2.Current, false);\r\n                    if (field != null) field.SetValue(null, null);\r\n                }\r\n\r\n                //Signal\r\n                if (!donotSignalUnregister)\r\n                {\r\n                    foreach (var service in services)\r\n                    {\r\n                        if (service is UnityEngine.Object)\r\n                            service.SignalServiceUnregistered();\r\n                    }\r\n                }\r\n\r\n                if (destroyIfCan)\r\n                {\r\n                    foreach(var service in services)\r\n                    {\r\n                        if(service is UnityEngine.Object)\r\n                            ObjUtil.SmartDestroy(service as UnityEngine.Object);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static bool Exists<T>() where T : class, IService\r\n        {\r\n            return !Entry<T>.Instance.IsNullOrDestroyed();\r\n        }\r\n\r\n        public static bool Exists(System.Type tp)\r\n        {\r\n            IService serv;\r\n            if (_serviceTable.TryGetValue(tp, out serv))\r\n                return !serv.IsNullOrDestroyed();\r\n\r\n            return false;\r\n        }\r\n\r\n        public static T Get<T>() where T : class, IService\r\n        {\r\n            //var result = Entry<T>.Instance;\r\n            //if (!object.ReferenceEquals(result, null) && result.IsNullOrDestroyed())\r\n            //{\r\n            //    result = null;\r\n            //    Entry<T>.Instance = null;\r\n            //}\r\n            //return result;\r\n            return Entry<T>.Instance;\r\n        }\r\n\r\n        public static IService Get(Type tp)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n            if (!typeof(IService).IsAssignableFrom(tp)) throw new System.ArgumentException(\"Type is not a IService\");\r\n            \r\n            IService result;\r\n            if (_serviceTable.TryGetValue(tp, out result))\r\n            {\r\n                return result;\r\n            }\r\n            return null;\r\n        }\r\n\r\n        public static void Register<T>(T service) where T : class, IService\r\n        {\r\n            if (service.IsNullOrDestroyed()) throw new System.ArgumentNullException(\"service\");\r\n            var other = Entry<T>.Instance;\r\n            if (!other.IsNullOrDestroyed() && !object.ReferenceEquals(other, service)) throw new System.InvalidOperationException(\"You must first unregister a service before registering a new one.\");\r\n\r\n            _services.Add(service);\r\n            Entry<T>.Instance = service;\r\n            _serviceTable[typeof(T)] = service;\r\n\r\n            //make sure we don't add it multiple times\r\n            service.Disposed -= OnServiceInadvertentlyDisposed;\r\n            service.Disposed += OnServiceInadvertentlyDisposed;\r\n\r\n            //register fieldinfo\r\n            if(!_staticFieldTable.ContainsKey(typeof(T)))\r\n                _staticFieldTable[typeof(T)] = typeof(Entry<T>).GetField(\"Instance\", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);\r\n        }\r\n\r\n        public static void Register(System.Type tp, IService service)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n            if (service.IsNullOrDestroyed()) throw new System.ArgumentNullException(\"service\");\r\n            if (!typeof(IService).IsAssignableFrom(tp)) throw new System.ArgumentException(\"Type must implement IService.\", \"tp\");\r\n            if (!tp.IsAssignableFrom(service.GetType())) throw new System.ArgumentException(string.Format(\"Service must implement the service type '{0}' it's being registered for.\", tp.Name), \"tp\");\r\n\r\n            System.Reflection.FieldInfo field = GetStaticEntryFieldInfo(tp, true);\r\n            if (field == null) throw new System.InvalidOperationException(\"Failed to resolve type '\" + tp.Name + \"'.\");\r\n\r\n            var other = field.GetValue(null);\r\n            if (!other.IsNullOrDestroyed() && !object.ReferenceEquals(other, service)) throw new System.InvalidOperationException(\"You must first unregister a service before registering a new one.\");\r\n\r\n            _services.Add(service);\r\n            field.SetValue(null, service);\r\n            _serviceTable[tp] = service;\r\n\r\n            //make sure we don't add it multiple times\r\n            service.Disposed -= OnServiceInadvertentlyDisposed;\r\n            service.Disposed += OnServiceInadvertentlyDisposed;\r\n        }\r\n\r\n\r\n        /// <summary>\r\n        /// Unregister the service associated with type 'T'\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"destroyIfCan\">Forcefully destroy the service if possible.</param>\r\n        /// <param name=\"donotSignalUnregister\">Suppress the signaling to the service that it is being unregistered. This is useful if a service is unregistering itself.</param>\r\n        public static void Unregister<T>(bool destroyIfCan = false, bool donotSignalUnregister = false) where T : class, IService\r\n        {\r\n            Unregister(Get<T>(), destroyIfCan, donotSignalUnregister);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Unregister a service associated with type 'tp'\r\n        /// </summary>\r\n        /// <param name=\"tp\"></param>\r\n        /// <param name=\"destroyIfCan\">Forcefully destroy the service if possible.</param>\r\n        /// <param name=\"donotSignalUnregister\">Suppress the signaling to the service that it is being unregistered. This is useful if a service is unregistering itself.</param>\r\n        public static void Unregister(System.Type tp, bool destroyIfCan = false, bool donotSignalUnregister = false)\r\n        {\r\n            Unregister(Get(tp), destroyIfCan, donotSignalUnregister);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Unregister a service from all the types it's associated.\r\n        /// </summary>\r\n        /// <param name=\"service\"></param>\r\n        /// <param name=\"destroyIfCan\">Forcefully destroy the service if possible.</param>\r\n        /// <param name=\"donotSignalUnregister\">Suppress the signaling to the service that it is being unregistered. This is useful if a service is unregistering itself.</param>\r\n        public static void Unregister(IService service, bool destroyIfCan = false, bool donotSignalUnregister = false)\r\n        {\r\n            if (service == null || !_services.Contains(service)) return;\r\n\r\n            //Remove reflected references\r\n            ReplaceReferences(service, null);\r\n\r\n            //Signal\r\n            if (!donotSignalUnregister)\r\n                service.SignalServiceUnregistered();\r\n\r\n            if (destroyIfCan && service is UnityEngine.Object)\r\n                ObjUtil.SmartDestroy(service as UnityEngine.Object);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Replace all references to 'old' with 'replacement' as a service. \r\n        /// This is usually used when decorating an existing service.\r\n        /// </summary>\r\n        /// <param name=\"old\">The service to replace</param>\r\n        /// <param name=\"replacement\">The service to replace with</param>\r\n        /// <param name=\"keepOldIfCannotReplace\">If the service look-up type does not match the replacement type, should 'old' be left in place or removed for that look-up type</param>\r\n        private static void ReplaceReferences(IService old, IService replacement)\r\n        {\r\n            if (old != null)\r\n            {\r\n                _services.Remove(old);\r\n                old.Disposed -= OnServiceInadvertentlyDisposed;\r\n            }\r\n            if (replacement != null)\r\n            {\r\n                _services.Add(replacement);\r\n\r\n                //make sure we don't add it multiple times\r\n                replacement.Disposed -= OnServiceInadvertentlyDisposed;\r\n                replacement.Disposed += OnServiceInadvertentlyDisposed;\r\n            }\r\n\r\n            //Find all references\r\n            using (var cache = TempCollection.GetSet<System.Type>())\r\n            {\r\n                var e1 = _serviceTable.GetEnumerator();\r\n                while (e1.MoveNext())\r\n                {\r\n                    if (object.ReferenceEquals(e1.Current.Value, old))\r\n                    {\r\n                        cache.Add(e1.Current.Key);\r\n                    }\r\n                }\r\n\r\n                //Replace references\r\n                var rtp = replacement != null ? replacement.GetType() : null;\r\n                var e2 = cache.GetEnumerator();\r\n                while (e2.MoveNext())\r\n                {\r\n                    bool cannotReplace = (rtp != null && !e2.Current.IsAssignableFrom(rtp));\r\n\r\n                    if (cannotReplace || replacement == null)\r\n                        _serviceTable.Remove(e2.Current);\r\n                    else\r\n                        _serviceTable[e2.Current] = replacement;\r\n\r\n\r\n                    var field = GetStaticEntryFieldInfo(e2.Current, false);\r\n                    if (field != null) field.SetValue(null, cannotReplace ? null : replacement);\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n\r\n\r\n        public static T CreateUnregisteredService<T>(bool persistent = false, string name = null) where T : class, IService\r\n        {\r\n            var tp = typeof(T);\r\n            if (typeof(Component).IsAssignableFrom(tp))\r\n            {\r\n                return ServiceComponent<T>.Create(tp, persistent, name);\r\n            }\r\n            else if (typeof(ScriptableObject).IsAssignableFrom(tp))\r\n            {\r\n                return ServiceScriptableObject<T>.Create(tp, persistent, name);\r\n            }\r\n            else\r\n            {\r\n                try\r\n                {\r\n                    return System.Activator.CreateInstance<T>();\r\n                }\r\n                catch (System.Exception ex)\r\n                {\r\n                    throw new System.InvalidOperationException(\"Supplied concrete service type failed to construct.\", ex);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static TServiceType CreateUnregisteredService<TServiceType>(System.Type concreteType, bool persistent = false, string name = null) where TServiceType : class, IService\r\n        {\r\n            if (concreteType == null) throw new System.ArgumentNullException(\"concreteType\");\r\n            if (!typeof(TServiceType).IsAssignableFrom(concreteType)) throw new System.ArgumentException(\"Type must implement \" + typeof(TServiceType).Name);\r\n\r\n            if (typeof(Component).IsAssignableFrom(concreteType))\r\n            {\r\n                var obj = ServiceComponent<TServiceType>.Create(concreteType, persistent, name);\r\n                Services.Register<TServiceType>(obj);\r\n                return obj;\r\n            }\r\n            else if (typeof(ScriptableObject).IsAssignableFrom(concreteType))\r\n            {\r\n                var obj = ServiceScriptableObject<TServiceType>.Create(concreteType, persistent, name);\r\n                Services.Register<TServiceType>(obj);\r\n                return obj;\r\n            }\r\n            else\r\n            {\r\n                try\r\n                {\r\n                    var obj = System.Activator.CreateInstance(concreteType) as TServiceType;\r\n                    Services.Register<TServiceType>(obj);\r\n                    return obj;\r\n                }\r\n                catch (System.Exception ex)\r\n                {\r\n                    throw new System.InvalidOperationException(\"Supplied concrete service type failed to construct.\", ex);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static TConcrete Create<TServiceType, TConcrete>(bool persistent = false, string name = null) where TServiceType : class, IService\r\n                                                                                                                where TConcrete : class, TServiceType\r\n        {\r\n            var inst = Services.Get<TServiceType>();\r\n            if (inst != null) throw new System.InvalidOperationException(string.Format(\"A service of type '{0}' already exists.\", typeof(TServiceType).Name));\r\n\r\n            var serv = CreateUnregisteredService<TConcrete>(persistent, name);\r\n            if (serv == null) return null;\r\n\r\n            Register<TServiceType>(serv);\r\n            return serv;\r\n        }\r\n\r\n        public static T Create<T>(bool persistent = false, string name = null) where T : class, IService\r\n        {\r\n            var inst = Services.Get<T>();\r\n            if (inst != null) throw new System.InvalidOperationException(string.Format(\"A service of type '{0}' already exists.\", typeof(T).Name));\r\n\r\n            var serv = CreateUnregisteredService<T>(persistent, name);\r\n            if (serv == null) return null;\r\n\r\n            Register<T>(serv);\r\n            return serv;\r\n        }\r\n\r\n        public static TServiceType Create<TServiceType>(System.Type concreteType, bool persistent = false, string name = null) where TServiceType : class, IService\r\n        {\r\n            var inst = Services.Get<TServiceType>();\r\n            if (inst != null) throw new System.InvalidOperationException(string.Format(\"A service of type '{0}' already exists.\", typeof(TServiceType).Name));\r\n\r\n            var serv = CreateUnregisteredService<TServiceType>(concreteType, persistent, name);\r\n            if (serv == null) return null;\r\n\r\n            Register<TServiceType>(serv);\r\n            return serv;\r\n        }\r\n\r\n        public static TServiceType GetOrCreate<TServiceType, TConcrete>(bool persistent = false, string name = null) where TServiceType : class, IService\r\n                                                                                                                     where TConcrete : class, TServiceType\r\n        {\r\n            var inst = Services.Get<TServiceType>();\r\n            if (inst != null) return inst;\r\n\r\n            var serv = CreateUnregisteredService<TConcrete>(persistent, name);\r\n            if (serv == null) return null;\r\n\r\n            Register<TServiceType>(serv);\r\n            return serv;\r\n        }\r\n\r\n        public static T GetOrCreate<T>(bool persistent = false, string name = null) where T : class, IService\r\n        {\r\n            var inst = Services.Get<T>();\r\n            if (inst != null) return inst;\r\n\r\n            var serv = CreateUnregisteredService<T>(persistent, name);\r\n            if (serv == null) return null;\r\n\r\n            Register<T>(serv);\r\n            return serv;\r\n        }\r\n\r\n        public static TServiceType GetOrCreate<TServiceType>(System.Type concreteType, bool persistent = false, string name = null) where TServiceType : class, IService\r\n        {\r\n            var inst = Services.Get<TServiceType>();\r\n            if (inst != null) return inst;\r\n\r\n            var serv = CreateUnregisteredService<TServiceType>(concreteType, persistent, name);\r\n            if (serv == null) return null;\r\n\r\n            Register<TServiceType>(serv);\r\n            return serv;\r\n        }\r\n\r\n\r\n\r\n\r\n        public static TServiceType CreateDecorator<TServiceType, TDecoratorType>(bool persistent = false, string name = null) where TServiceType : class, IService\r\n                                                                                                                              where TDecoratorType : class, TServiceType, IServiceDecorator<TServiceType>\r\n        {\r\n            var inst = Services.Get<TServiceType>();\r\n            if (inst == null) throw new System.InvalidOperationException(string.Format(\"Must create a concreate service of type {0} before decorating it.\", typeof(TServiceType).Name));\r\n            \r\n            var decorator = CreateUnregisteredService<TDecoratorType>(persistent, name);\r\n            if (decorator == null) return null;\r\n            \r\n            ReplaceReferences(inst, decorator);\r\n            Entry<TServiceType>.Instance = decorator;\r\n\r\n            decorator.Consume(inst);\r\n            return decorator;\r\n        }\r\n\r\n        public static TServiceType CreateDecorator<TServiceType>(System.Type decoratorType, bool persistent = false, string name = null) where TServiceType : class, IService\r\n        {\r\n            var inst = Services.Get<TServiceType>();\r\n            if (inst == null) throw new System.InvalidOperationException(string.Format(\"Must create a concreate service of type {0} before decorating it.\", typeof(TServiceType).Name));\r\n\r\n            if (decoratorType == null) throw new System.ArgumentNullException(\"decoratorType\");\r\n            if (!typeof(TServiceType).IsAssignableFrom(decoratorType)) throw new System.ArgumentException(\"Decorator Type must implement \" + typeof(TServiceType).Name);\r\n            if (!typeof(IServiceDecorator<TServiceType>).IsAssignableFrom(decoratorType)) throw new System.ArgumentException(\"Decorator Type must implement IServiceDecorator\");\r\n\r\n            var replacement = CreateUnregisteredService<TServiceType>(decoratorType, persistent, name);\r\n            var decorator = replacement as IServiceDecorator<TServiceType>;\r\n            if (decorator == null) return null;\r\n\r\n            Entry<TServiceType>.Instance = replacement;\r\n            ReplaceReferences(inst, replacement);\r\n\r\n            decorator.Consume(inst);\r\n            return replacement;\r\n        }\r\n\r\n        public static void RegisterDecorator<TServiceType>(IServiceDecorator<TServiceType> decorator) where TServiceType : class, IService\r\n        {\r\n            if (decorator == null) throw new System.ArgumentNullException(\"decorator\");\r\n            if (!(decorator is TServiceType)) throw new System.ArgumentException(string.Format(\"Decorator must implement the service type it is decorating: {0}.\", typeof(TServiceType).Name));\r\n\r\n            var inst = Services.Get<TServiceType>();\r\n            if (inst == null) throw new System.InvalidOperationException(string.Format(\"Must create a concreate service of type {0} before decorating it.\", typeof(TServiceType).Name));\r\n\r\n            Entry<TServiceType>.Instance = decorator as TServiceType;\r\n            ReplaceReferences(inst, decorator);\r\n\r\n            decorator.Consume(inst);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Dispose Handler\r\n\r\n        private static System.EventHandler _onServiceInadvertentlyDisposed;\r\n        private static System.EventHandler OnServiceInadvertentlyDisposed\r\n        {\r\n            get\r\n            {\r\n                if(_onServiceInadvertentlyDisposed == null)\r\n                {\r\n                    _onServiceInadvertentlyDisposed = (s, e) =>\r\n                    {\r\n                        if(s is IService)\r\n                        {\r\n                            Unregister(s as IService, false, true);\r\n                        }\r\n                    };\r\n                }\r\n                return _onServiceInadvertentlyDisposed;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private static System.Reflection.FieldInfo GetStaticEntryFieldInfo(System.Type tp, bool createIfNotFound)\r\n        {\r\n            System.Reflection.FieldInfo result = null;\r\n            if (_staticFieldTable.TryGetValue(tp, out result))\r\n                return result;\r\n\r\n            if(createIfNotFound)\r\n            {\r\n                try\r\n                {\r\n                    var klass = typeof(Entry<>);\r\n                    klass = klass.MakeGenericType(tp);\r\n                    result = klass.GetField(\"Instance\", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);\r\n                    _staticFieldTable[tp] = result;\r\n                }\r\n                catch (System.Exception ex)\r\n                {\r\n                    throw new System.InvalidOperationException(\"Failed to resolve type '\" + tp.Name + \"'.\", ex);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        private static class Entry<T> where T : class, IService\r\n        {\r\n\r\n            public static T Instance;\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    /// <summary>\r\n    /// Abstract component for implementing a Service Component. \r\n    /// \r\n    /// When implementing pass in the interface as the generic T parameter to denote as what type this service \r\n    /// should be accessed when calling Service.Get&ltT&gt.\r\n    /// </summary>\r\n    /// <typeparam name=\"T\"></typeparam>\r\n    public abstract class ServiceComponent<T> : SPComponent, IService where T : class, IService\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private bool _autoRegisterService;\r\n        [SerializeField]\r\n        private bool _destroyIfMultiple;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public ServiceComponent()\r\n        {\r\n\r\n        }\r\n\r\n        public ServiceComponent(bool autoRegister, bool destroyIfMultiple)\r\n        {\r\n            _autoRegisterService = autoRegister;\r\n            _destroyIfMultiple = destroyIfMultiple;\r\n        }\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            if(!(this is T))\r\n            {\r\n                this.AutoDestruct();\r\n                return;\r\n            }\r\n\r\n            var inst = Services.Get<T>();\r\n            if(inst == null)\r\n            {\r\n                if (_autoRegisterService)\r\n                    Services.Register<T>(this as T);\r\n            }\r\n            else if(object.ReferenceEquals(this, inst))\r\n            {\r\n                //do nothing\r\n            }\r\n            else\r\n            {\r\n                this.AutoDestruct();\r\n                return;\r\n            }\r\n\r\n            this.OnValidAwake();\r\n        }\r\n\r\n        private void AutoDestruct()\r\n        {\r\n            if (_destroyIfMultiple)\r\n            {\r\n                ObjUtil.SmartDestroy(this);\r\n            }\r\n        }\r\n        \r\n        protected virtual void OnValidAwake()\r\n        {\r\n\r\n        }\r\n\r\n        protected override void OnDestroy()\r\n        {\r\n            //we unregister before signaling destroyed\r\n            Services.Unregister(this, false, true);\r\n\r\n            base.OnDestroy();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IService Interface\r\n\r\n        event System.EventHandler IService.Disposed\r\n        {\r\n            add { this.ComponentDestroyed += value; }\r\n            remove { this.ComponentDestroyed -= value; }\r\n        }\r\n\r\n        public event System.EventHandler ServiceUnregistered;\r\n\r\n        void IService.SignalServiceUnregistered()\r\n        {\r\n            this.OnServiceUnregistered();\r\n            if (this.ServiceUnregistered != null) this.ServiceUnregistered(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        protected virtual void OnServiceUnregistered()\r\n        {\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Factory\r\n\r\n        public static T Get()\r\n        {\r\n            return Services.Get<T>();\r\n        }\r\n\r\n        public static TConcrete Create<TConcrete>(bool persistent = false, string name = null) where TConcrete : Component, T\r\n        {\r\n            var inst = Services.Get<T>();\r\n            if (inst != null) throw new System.InvalidOperationException(string.Format(\"A service of type '{0}' already exists.\", typeof(T).Name));\r\n\r\n            if (name == null)\r\n                name = \"Service.\" + typeof(T).Name;\r\n            var go = new GameObject(name);\r\n            if (persistent)\r\n            {\r\n                GameObject.DontDestroyOnLoad(go);\r\n            }\r\n            return go.AddComponent<TConcrete>();\r\n        }\r\n\r\n        public static T Create(System.Type tp, bool persistent = false, string name = null)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n            if (!typeof(Component).IsAssignableFrom(tp) || !typeof(T).IsAssignableFrom(tp)) throw new System.ArgumentException(\"Type must be a Component that implements \" + typeof(T).Name);\r\n\r\n            var inst = Services.Get<T>();\r\n            if (inst != null) throw new System.InvalidOperationException(string.Format(\"A service of type '{0}' already exists.\", typeof(T).Name));\r\n\r\n            if (name == null)\r\n                name = \"Service.\" + typeof(T).Name;\r\n            var go = new GameObject(name);\r\n            if (persistent)\r\n            {\r\n                GameObject.DontDestroyOnLoad(go);\r\n            }\r\n            return go.AddComponent(tp) as T;\r\n        }\r\n\r\n        public static T GetOrCreate<TConcrete>(bool persistent = false, string name = null) where TConcrete : Component, T\r\n        {\r\n            var inst = Services.Get<T>();\r\n            if (inst != null) return inst;\r\n\r\n            if (name == null)\r\n                name = \"Service.\" + typeof(T).Name;\r\n            var go = new GameObject(name);\r\n            if (persistent)\r\n            {\r\n                GameObject.DontDestroyOnLoad(go);\r\n            }\r\n            return go.AddComponent<TConcrete>();\r\n        }\r\n\r\n        public static T GetOrCreate(System.Type tp, bool persistent = false, string name = null)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n            if (!typeof(Component).IsAssignableFrom(tp) || !typeof(T).IsAssignableFrom(tp)) throw new System.ArgumentException(\"Type must be a Component that implements \" + typeof(T).Name);\r\n\r\n            var inst = Services.Get<T>();\r\n            if (inst != null) return inst;\r\n\r\n            if (name == null)\r\n                name = \"Service.\" + typeof(T).Name;\r\n            var go = new GameObject(name);\r\n            if (persistent)\r\n            {\r\n                GameObject.DontDestroyOnLoad(go);\r\n            }\r\n            return go.AddComponent(tp) as T;\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n    \r\n    /// <summary>\r\n    /// Abstract component for implementing a Service Component. \r\n    /// \r\n    /// When implementing pass in the interface as the generic T parameter to denote as what type this service \r\n    /// should be accessed when calling Service.Get&ltT&gt.\r\n    /// </summary>\r\n    /// <typeparam name=\"T\"></typeparam>\r\n    public abstract class ServiceScriptableObject<T> : ScriptableObject, IService where T : class, IService\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private bool _autoRegisterService;\r\n        [SerializeField]\r\n        private bool _destroyIfMultiple;\r\n        [System.NonSerialized]\r\n        private System.EventHandler _onDisposed;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public ServiceScriptableObject()\r\n        {\r\n\r\n        }\r\n\r\n        public ServiceScriptableObject(bool autoRegister, bool destroyIfMultiple)\r\n        {\r\n            _autoRegisterService = autoRegister;\r\n            _destroyIfMultiple = destroyIfMultiple;\r\n        }\r\n\r\n        protected virtual void OnEnable() //NOTE - using OnEnable now since it appears Awake doesn't occur on SOs that are created as an asset and loaded that way.\r\n        {\r\n            if (!(this is T))\r\n            {\r\n                this.AutoDestruct();\r\n                return;\r\n            }\r\n\r\n            var inst = Services.Get<T>();\r\n            if (inst == null)\r\n            {\r\n                if(_autoRegisterService)\r\n                    Services.Register<T>(this as T);\r\n            }\r\n            else if (object.ReferenceEquals(this, inst))\r\n            {\r\n                //do nothing\r\n            }\r\n            else\r\n            {\r\n                this.AutoDestruct();\r\n                return;\r\n            }\r\n\r\n            this.OnValidAwake();\r\n        }\r\n        \r\n        private void AutoDestruct()\r\n        {\r\n            if (_destroyIfMultiple)\r\n            {\r\n                ObjUtil.SmartDestroy(this);\r\n            }\r\n        }\r\n\r\n        protected virtual void OnValidAwake()\r\n        {\r\n\r\n        }\r\n        \r\n        protected virtual void OnDestroy()\r\n        {\r\n            Services.Unregister(this, false, true);\r\n\r\n            var d = _onDisposed;\r\n            if (d != null) d(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IService Interface\r\n\r\n        event System.EventHandler IService.Disposed\r\n        {\r\n            add { _onDisposed += value; }\r\n            remove { _onDisposed -= value; }\r\n        }\r\n\r\n        public event System.EventHandler ServiceUnregistered;\r\n\r\n        void IService.SignalServiceUnregistered()\r\n        {\r\n            this.OnServiceUnregistered();\r\n            if (this.ServiceUnregistered != null) this.ServiceUnregistered(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        protected virtual void OnServiceUnregistered()\r\n        {\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Factory\r\n\r\n        public static T Get()\r\n        {\r\n            return Services.Get<T>();\r\n        }\r\n\r\n        public static TConcrete Create<TConcrete>(bool persistent = false, string name = null) where TConcrete : ScriptableObject, T\r\n        {\r\n            var inst = Services.Get<T>();\r\n            if (inst != null) throw new System.InvalidOperationException(string.Format(\"A service of type '{0}' already exists.\", typeof(T).Name));\r\n\r\n            if (name == null)\r\n                name = \"Service.\" + typeof(T).Name;\r\n            var obj =  ScriptableObject.CreateInstance<TConcrete>();\r\n            obj.name = name;\r\n            return obj;\r\n        }\r\n\r\n        public static T Create(System.Type tp, bool persistent = false, string name = null)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n            if (!typeof(ScriptableObject).IsAssignableFrom(tp) || !typeof(T).IsAssignableFrom(tp)) throw new System.ArgumentException(\"Type must be a Component that implements \" + typeof(T).Name);\r\n\r\n            var inst = Services.Get<T>();\r\n            if (inst != null) throw new System.InvalidOperationException(string.Format(\"A service of type '{0}' already exists.\", typeof(T).Name));\r\n\r\n            if (name == null)\r\n                name = \"Service.\" + typeof(T).Name;\r\n            var obj = ScriptableObject.CreateInstance(tp) as ScriptableObject;\r\n            obj.name = name;\r\n            return obj as T;\r\n        }\r\n\r\n        public static T GetOrCreate<TConcrete>(bool persistent = false, string name = null) where TConcrete : ScriptableObject, T\r\n        {\r\n            var inst = Services.Get<T>();\r\n            if (inst != null) return inst;\r\n\r\n            if (name == null)\r\n                name = \"Service.\" + typeof(T).Name;\r\n            var obj = ScriptableObject.CreateInstance<TConcrete>();\r\n            obj.name = name;\r\n            return obj;\r\n        }\r\n\r\n        public static T GetOrCreate(System.Type tp, bool persistent = false, string name = null)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n            if (!typeof(ScriptableObject).IsAssignableFrom(tp) || !typeof(T).IsAssignableFrom(tp)) throw new System.ArgumentException(\"Type must be a Component that implements \" + typeof(T).Name);\r\n\r\n            var inst = Services.Get<T>();\r\n            if (inst != null) return inst;\r\n\r\n            if (name == null)\r\n                name = \"Service.\" + typeof(T).Name;\r\n            var obj = ScriptableObject.CreateInstance(tp) as ScriptableObject;\r\n            obj.name = name;\r\n            return obj as T;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n\r\n\r\n    /// <summary>\r\n    /// Inherit from this class, and add a 'CreateAssetMenuAttribute' to create a asset that can be used as a proxy to a Service.\r\n    /// </summary>\r\n    /// <typeparam name=\"T\"></typeparam>\r\n    public class ServiceProxy<T> : ScriptableObject, IProxy where T : class, IService\r\n    {\r\n\r\n        bool IProxy.QueriesTarget\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        public object GetTarget()\r\n        {\r\n            return Services.Get<T>();\r\n        }\r\n\r\n        public object GetTarget(object arg)\r\n        {\r\n            return Services.Get<T>();\r\n        }\r\n\r\n        public System.Type GetTargetType()\r\n        {\r\n            return typeof(T);\r\n        }\r\n\r\n    }\r\n    \r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/ShortUid.cs",
    "content": "﻿using System;\n\nnamespace com.spacepuppy\n{\n\n    /// <summary>\n    /// A serializable semi-unique id. It is not universely unique, but will be system unique at the least, and should be team unique confidently.\n    /// The id is based on the exact moment in time it was generated, and the idea that 2 team members both generate them simultaneously is absurd.\n    /// </summary>\n    [System.Serializable]\n    public struct ShortUid\n    {\n\n        public static readonly ShortUid Zero = new ShortUid();\n\n        #region Fields\n\n        //has to be stored with uint's\n        //unity has a bug at the time of writing this where long doesn't serialize in prefabs correctly\n        //there is a fix in unity beta 2017.1, but we are unsure as to when the full release will be out\n        //so stuck with this hack fix\n        [UnityEngine.SerializeField]\n        private uint _low;\n        [UnityEngine.SerializeField]\n        private uint _high;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public ShortUid(long value)\n        {\n            _low = (uint)(value & uint.MaxValue);\n            _high = (uint)(value >> 32);\n        }\n\n        public static ShortUid NewId()\n        {\n            return new ShortUid(System.DateTime.UtcNow.Ticks);\n        }\n\n        #endregion\n\n        #region Properties\n\n        public bool IsZero\n        {\n            get { return _low == 0 && _high == 0; }\n        }\n\n        public long Value\n        {\n            get\n            {\n                return ((long)_high << 32) | (long)_low;\n            }\n        }\n\n        #endregion\n\n        #region Methods\n\n        /// <summary>\n        /// Returns the base64 encoded guid as a string\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return this.Value.ToString(\"X16\");\n        }\n\n        /// <summary>\n        /// Returns a value indicating whether this instance and a\n        /// specified Object represent the same type and value.\n        /// </summary>\n        /// <param name=\"obj\">The object to compare</param>\n        /// <returns></returns>\n        public override bool Equals(object obj)\n        {\n            if (obj is ShortUid)\n            {\n                var uid = (ShortUid)obj;\n                return uid._high == _high && uid._low == _low;\n            }\n            return false;\n        }\n\n        public bool Equals(ShortUid uid)\n        {\n            return this._high == uid._high && this._low == uid._low;\n        }\n\n        /// <summary>\n        /// Returns the HashCode for underlying Guid.\n        /// </summary>\n        /// <returns></returns>\n        public override int GetHashCode()\n        {\n            return (int)(_high ^ _low);\n        }\n\n        #endregion\n\n        #region Operators\n\n        /// <summary>\n        /// Determines if both ShortGuids have the same underlying\n        /// Guid value.\n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        /// <returns></returns>\n        public static bool operator ==(ShortUid x, ShortUid y)\n        {\n            return x._high == y._high && x._low == y._low;\n        }\n\n        /// <summary>\n        /// Determines if both ShortGuids do not have the\n        /// same underlying Guid value.\n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        /// <returns></returns>\n        public static bool operator !=(ShortUid x, ShortUid y)\n        {\n            return x._high != y._high || x._low != y._low;\n        }\n\n        /// <summary>\n        /// Implicitly converts the ShortGuid to it's string equivilent\n        /// </summary>\n        /// <param name=\"uid\"></param>\n        /// <returns></returns>\n        public static implicit operator string(ShortUid uid)\n        {\n            return uid.ToString();\n        }\n\n        public static implicit operator long(ShortUid uid)\n        {\n            return uid.Value;\n        }\n\n        #endregion\n\n        #region Special Types\n\n        public class ConfigAttribute : Attribute\n        {\n            public bool ReadOnly;\n            public bool AllowZero;\n        }\n\n        #endregion\n\n    }\n\n    /// <summary>\n    /// Similar to ShortUid in that it can store the same numeric value, but can also be customized to be a unique string instead. \n    /// ShortUid can be implicitly converted to TokenId.\n    /// </summary>\n    [System.Serializable]\n    public struct TokenId\n    {\n\n        public static readonly TokenId Empty = new TokenId();\n\n        #region Fields\n\n        [UnityEngine.SerializeField]\n        private uint _low;\n        [UnityEngine.SerializeField]\n        private uint _high;\n        [UnityEngine.SerializeField]\n        private string _id;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public TokenId(long value)\n        {\n            _low = (uint)(value & uint.MaxValue);\n            _high = (uint)(value >> 32);\n            _id = null;\n        }\n\n        public TokenId(string value)\n        {\n            _low = 0;\n            _high = 0;\n            _id = value;\n        }\n\n        public static TokenId NewId()\n        {\n            return new TokenId(System.DateTime.UtcNow.Ticks);\n        }\n\n        #endregion\n\n        #region Properties\n\n        public bool HasValue\n        {\n            get { return !string.IsNullOrEmpty(_id) || _low != 0 || _high != 0; }\n        }\n\n        public long LongValue\n        {\n            get\n            {\n                return ((long)_high << 32) | (long)_low;\n            }\n        }\n\n        public bool IsLong\n        {\n            get\n            {\n                return string.IsNullOrEmpty(_id);\n            }\n        }\n\n        #endregion\n\n        #region Methods\n\n        /// <summary>\n        /// Returns the id as a string\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            if (this.IsLong)\n                return this.LongValue.ToString(\"X16\");\n            else\n                return _id ?? string.Empty;\n        }\n\n        /// <summary>\n        /// Returns a value indicating whether this instance and a\n        /// specified Object represent the same type and value.\n        /// </summary>\n        /// <param name=\"obj\">The object to compare</param>\n        /// <returns></returns>\n        public override bool Equals(object obj)\n        {\n            if (obj is TokenId)\n            {\n                return this.Equals((TokenId)obj);\n            }\n            else if (obj is ShortUid)\n            {\n                return this.IsLong && ((ShortUid)obj).Value == this.LongValue;\n            }\n            return false;\n        }\n\n        public bool Equals(TokenId id)\n        {\n            if (this.IsLong)\n            {\n                return id.IsLong && this._high == id._high && this._low == id._low;\n            }\n            else\n            {\n                return !id.IsLong && this._id == id._id;\n            }\n        }\n\n        public bool Equals(ShortUid uid)\n        {\n            return this.IsLong && this.LongValue == uid.Value;\n        }\n\n        /// <summary>\n        /// Returns the HashCode for underlying id.\n        /// </summary>\n        /// <returns></returns>\n        public override int GetHashCode()\n        {\n            if (this.IsLong)\n                return (int)(_high ^ _low);\n            else\n                return _id.GetHashCode();\n        }\n\n        #endregion\n\n        #region Operators\n\n        /// <summary>\n        /// Determines if both TokenId have the same underlying\n        /// id value.\n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        /// <returns></returns>\n        public static bool operator ==(TokenId x, TokenId y)\n        {\n            return x.Equals(y);\n        }\n\n        /// <summary>\n        /// Determines if both TokenId do not have the\n        /// same underlying id value.\n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        /// <returns></returns>\n        public static bool operator !=(TokenId x, TokenId y)\n        {\n            return !x.Equals(y);\n        }\n\n        /// <summary>\n        /// Implicitly converts the TokenId to it's string equivilent\n        /// </summary>\n        /// <param name=\"uid\"></param>\n        /// <returns></returns>\n        public static implicit operator string(TokenId uid)\n        {\n            return uid.ToString();\n        }\n\n        /// <summary>\n        /// Implicitly converts from a ShortUid to a TokenId\n        /// </summary>\n        /// <param name=\"uid\"></param>\n        public static implicit operator TokenId(ShortUid uid)\n        {\n            return new TokenId(uid.Value);\n        }\n\n        #endregion\n\n        #region Special Types\n\n        public class ConfigAttribute : System.Attribute\n        {\n            public bool ReadOnly;\n            public bool AllowZero;\n        }\n\n        #endregion\n\n    }\n\n    /*\n    /// <summary>\n    /// A small id that is unique to this Application Domain for the duration of the application. \n    /// It has a limit of 2^32 unique values.\n    /// </summary>\n    public struct TinyUid\n    {\n\n        #region Fields\n\n        [UnityEngine.SerializeField]\n        private int _id;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        internal TinyUid(int id)\n        {\n            _id = id;\n        }\n        \n        #endregion\n\n        #region ToString\n\n        /// <summary>\n        /// Returns the base64 encoded guid as a string\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return _id.ToString(\"X8\");\n        }\n\n        #endregion\n\n        #region Equals\n\n        /// <summary>\n        /// Returns a value indicating whether this instance and a\n        /// specified Object represent the same type and value.\n        /// </summary>\n        /// <param name=\"obj\">The object to compare</param>\n        /// <returns></returns>\n        public override bool Equals(object obj)\n        {\n            if (obj is TinyUid)\n                return _id == ((TinyUid)obj)._id;\n            return false;\n        }\n\n        #endregion\n\n        #region GetHashCode\n\n        /// <summary>\n        /// Returns the HashCode for underlying Guid.\n        /// </summary>\n        /// <returns></returns>\n        public override int GetHashCode()\n        {\n            return _id;\n        }\n\n        #endregion\n\n        #region NewGuid\n\n        private static int _nextValue;\n\n        /// <summary>\n        /// Initialises a new instance of the ShortGuid class\n        /// </summary>\n        /// <returns></returns>\n        public static TinyUid Next()\n        {\n            return new TinyUid(_nextValue++);\n        }\n\n        #endregion\n\n        #region Operators\n\n        /// <summary>\n        /// Determines if both ShortGuids have the same underlying\n        /// Guid value.\n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        /// <returns></returns>\n        public static bool operator ==(TinyUid x, TinyUid y)\n        {\n            return x._id == y._id;\n        }\n\n        /// <summary>\n        /// Determines if both ShortGuids do not have the\n        /// same underlying Guid value.\n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        /// <returns></returns>\n        public static bool operator !=(TinyUid x, TinyUid y)\n        {\n            return x._id != y._id;\n        }\n\n        /// <summary>\n        /// Implicitly converts the ShortGuid to it's string equivilent\n        /// </summary>\n        /// <param name=\"uid\"></param>\n        /// <returns></returns>\n        public static implicit operator string(TinyUid uid)\n        {\n            return uid.ToString();\n        }\n\n        #endregion\n        \n    }\n\n    /// <summary>\n    /// Allows you to generate TinyUids that are unique to a specific context. The ids created will not be unique to values returned by TinyUid.Next(). \n    /// This is useful if small ids are needed within a scoped grouping.\n    /// </summary>\n    public class TinyUidGenerator\n    {\n\n        private int _nextValue;\n\n        public TinyUid Next()\n        {\n            return new TinyUid(_nextValue++);\n        }\n\n        public void Reset()\n        {\n            _nextValue = 0;\n        }\n\n    }\n    */\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Signal.cs",
    "content": "﻿namespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Represents a notification that should act as a signal for some other code to perform an action. For instance if a weapon strikes an enemy, it may want to signal \r\n    /// that a knockback should occur. The enemy then has a component that listens for this signal, and performs the knockback if it so desires. The Signal has a 'Handled' \r\n    /// property so that the receiver can denote if the action has been taken care of. This way if more than one component serves to handle the signal, they can test this \r\n    /// and make sure they don't compound the action.\r\n    /// </summary>\r\n    public abstract class Signal : Notification\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private bool _handled;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public Signal()\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool Handled\r\n        {\r\n            get { return _handled; }\r\n            set { _handled = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Singleton.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.SceneManagement;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// A contract that binds IManagedSingleton and IService together so that they are easily accessible from the Singletons.Get method.\r\n    /// \r\n    /// If implementing this directly, ensure that there is a static property getter named 'Instance'.\r\n    /// </summary>\r\n    public interface ISingleton\r\n    {\r\n\r\n    }\r\n\r\n    public static class Singletons\r\n    {\r\n\r\n        public static T Get<T>(bool createIfNone = false) where T : class, ISingleton\r\n        {\r\n            var tp = typeof(T);\r\n\r\n            if (typeof(IManagedSingleton).IsAssignableFrom(tp))\r\n                return Singleton.GetInstance(tp, !createIfNone) as T;\r\n            else if (typeof(IService).IsAssignableFrom(tp))\r\n                return Services.Get(tp) as T;\r\n            else\r\n            {\r\n                var prop = tp.GetProperty(\"Instance\", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);\r\n                if (prop != null)\r\n                    return prop.GetValue(null, null) as T;\r\n                var field = tp.GetField(\"Instance\", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);\r\n                if (field != null)\r\n                    return field.GetValue(null) as T;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static ISingleton Get(System.Type tp, bool createIfNone = false)\r\n        {\r\n            if (typeof(IManagedSingleton).IsAssignableFrom(tp))\r\n                return Singleton.GetInstance(tp, !createIfNone);\r\n            else if (typeof(IService).IsAssignableFrom(tp))\r\n                return Services.Get(tp) as ISingleton;\r\n            else if(typeof(ISingleton).IsAssignableFrom(tp))\r\n            {\r\n                var prop = tp.GetProperty(\"Instance\", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);\r\n                if (prop != null)\r\n                    return prop.GetValue(null, null) as ISingleton;\r\n                var field = tp.GetField(\"Instance\", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);\r\n                if (field != null)\r\n                    return field.GetValue(null) as ISingleton;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n    }\r\n\r\n\r\n\r\n    [System.Flags()]\r\n    public enum SingletonLifeCycleRule\r\n    {\r\n\r\n        LivesForDurationOfScene = 0, //when load is called, this singleton should die\r\n        LivesForever = 1, //when load is called, this singleton will remain to the next scene\r\n        AlwaysReplace = 2, //this singleton should replace any singleton that already exists\r\n        LiveForeverAndAlwaysReplace = 3\r\n\r\n    }\r\n    \r\n    public interface IManagedSingleton : ISingleton, IComponent, ISPDisposable\r\n    {\r\n\r\n        event System.EventHandler ComponentDestroyed;\r\n\r\n        SingletonLifeCycleRule LifeCycle { get; set; }\r\n\r\n    }\r\n    \r\n    /// <summary>\r\n    /// A base class that any script that should act like a Singleton can inherit from.\r\n    /// \r\n    /// Singletons are granted a 'LifeCycle' which controls if the Singleton gets destroyed \r\n    /// when a new level is loaded, as well what to do if a second Singleton is loaded \r\n    /// when a previous one already existed.\r\n    /// \r\n    /// LivesForDurationOfScene - the singleton will be destroyed when the next level is loaded\r\n    /// LivesForever - the singleton will exist indefinitely, even on load\r\n    /// AlwaysReplace - if a singleton of this type already exists when this singleton starts, it will replace the older one\r\n    /// LiveForeverAndAlwaysReplace - acts like LivesForever and AlwaysReplace\r\n    /// </summary>\r\n    public abstract class Singleton : SPNotifyingComponent, IManagedSingleton\r\n    {\r\n\r\n        #region Static Interface\r\n\r\n        public const string GAMEOBJECT_NAME = \"Spacepuppy.SingletonSource\";\r\n\r\n        private static GameObject _gameObject;\r\n        private static Dictionary<System.Type, IManagedSingleton> _singletonRefs = new Dictionary<System.Type, IManagedSingleton>();\r\n\r\n        public static GameObject GetGameObjectSource(bool createIfNotExist)\r\n        {\r\n            if (Application.isPlaying)\r\n            {\r\n                if (_gameObject == null && !GameLoopEntry.ApplicationClosing)\r\n                {\r\n                    _gameObject = GameObject.Find(GAMEOBJECT_NAME);\r\n                    if (_gameObject == null && createIfNotExist)\r\n                    {\r\n                        _gameObject = new GameObject(GAMEOBJECT_NAME);\r\n                        _gameObject.AddComponent<SingletonManager>();\r\n                    }\r\n                }\r\n                return _gameObject;\r\n            }\r\n            else\r\n            {\r\n                _gameObject = null;\r\n                return GameObject.Find(GAMEOBJECT_NAME);\r\n            }\r\n        }\r\n\r\n        public static T GetInstance<T>(bool bDoNotCreateIfNotExist = false) where T : Component, IManagedSingleton\r\n        {\r\n            IManagedSingleton single;\r\n            if (_singletonRefs.TryGetValue(typeof(T), out single)) return single as T;\r\n            if (GameLoopEntry.ApplicationClosing) return null;\r\n\r\n            if (bDoNotCreateIfNotExist)\r\n            {\r\n                var src = Singleton.GetGameObjectSource(false);\r\n                return !object.ReferenceEquals(src, null) ? src.GetComponent<T>() : null;\r\n            }\r\n            else\r\n            {\r\n                var tp = typeof(T);\r\n                var attrib = tp.GetCustomAttributes(typeof(ConfigAttribute), false).FirstOrDefault() as ConfigAttribute;\r\n                if (attrib != null && attrib.ExcludeFromSingletonManager)\r\n                    return CreateSpecialInstance<T>(tp.Name, attrib.DefaultLifeCycle);\r\n                else\r\n                    return Singleton.GetGameObjectSource(true).AddOrGetComponent<T>();\r\n            }\r\n        }\r\n\r\n        public static IManagedSingleton GetInstance(System.Type tp, bool bDoNotCreateIfNotExist = false)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n            if (!typeof(IManagedSingleton).IsAssignableFrom(tp)) throw new TypeArgumentMismatchException(tp, typeof(IManagedSingleton), \"tp\");\r\n\r\n            IManagedSingleton single;\r\n            if (_singletonRefs.TryGetValue(tp, out single)) return single;\r\n            if (GameLoopEntry.ApplicationClosing) return null;\r\n\r\n            if (bDoNotCreateIfNotExist)\r\n            {\r\n                var src = Singleton.GetGameObjectSource(false);\r\n                return !object.ReferenceEquals(src, null) ? src.GetComponent(tp) as IManagedSingleton : null;\r\n            }\r\n            else\r\n            {\r\n                var attrib = tp.GetCustomAttributes(typeof(ConfigAttribute), false).FirstOrDefault() as ConfigAttribute;\r\n                if (attrib != null && attrib.ExcludeFromSingletonManager)\r\n                    return CreateSpecialInstance(tp, tp.Name, attrib.DefaultLifeCycle);\r\n                else\r\n                    return Singleton.GetGameObjectSource(true).AddOrGetComponent(tp) as IManagedSingleton;\r\n            }\r\n        }\r\n\r\n\r\n\r\n        public static T CreateSpecialInstance<T>(string gameObjectName, SingletonLifeCycleRule lifeCycle) where T : Component, IManagedSingleton\r\n        {\r\n            IManagedSingleton single;\r\n            if (_singletonRefs.TryGetValue(typeof(T), out single)) return single as T;\r\n            if (GameLoopEntry.ApplicationClosing) return null;\r\n\r\n            var go = new GameObject(gameObjectName);\r\n            single = go.AddComponent<T>();\r\n            single.LifeCycle = lifeCycle;\r\n            return single as T;\r\n        }\r\n\r\n        public static IManagedSingleton CreateSpecialInstance(System.Type tp, string gameObjectName, SingletonLifeCycleRule lifeCycle)\r\n        {\r\n            if (!typeof(IManagedSingleton).IsAssignableFrom(tp)) throw new TypeArgumentMismatchException(tp, typeof(IManagedSingleton), \"tp\");\r\n\r\n            IManagedSingleton single;\r\n            if (_singletonRefs.TryGetValue(tp, out single)) return single;\r\n            if (GameLoopEntry.ApplicationClosing) return null;\r\n\r\n            var go = new GameObject(gameObjectName);\r\n            single = go.AddComponent(tp) as IManagedSingleton;\r\n            single.LifeCycle = lifeCycle;\r\n            return single;\r\n        }\r\n\r\n        public static bool HasInstance<T>() where T : Singleton\r\n        {\r\n            return _singletonRefs.ContainsKey(typeof(T));\r\n        }\r\n\r\n        public static bool HasInstance(System.Type tp)\r\n        {\r\n            return _singletonRefs.ContainsKey(tp);\r\n        }\r\n\r\n        public static bool HasInstance(System.Type tp, out IManagedSingleton instance)\r\n        {\r\n            return _singletonRefs.TryGetValue(tp, out instance);\r\n        }\r\n\r\n        public static IEnumerable<IManagedSingleton> AllSingletons\r\n        {\r\n            get\r\n            {\r\n                return _singletonRefs.Values;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Instance Level\r\n\r\n        [SerializeField()]\r\n        private Maintainer _maintainer = new Maintainer();\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public Singleton()\r\n        {\r\n            var tp = this.GetType();\r\n            //if (Application.isEditor && !Application.isPlaying)\r\n            //{\r\n            var attrib = tp.GetCustomAttributes(typeof(Singleton.ConfigAttribute), false).FirstOrDefault() as Singleton.ConfigAttribute;\r\n            if (attrib != null) _maintainer.LifeCycle = attrib.DefaultLifeCycle;\r\n            //}\r\n\r\n            //if (!_singletonRefs.ContainsKey(tp)) _singletonRefs[tp] = this;\r\n        }\r\n\r\n        protected override sealed void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            if (_maintainer.OnAwake(this)) this.OnValidAwake();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called if the singleton object properly validated during 'Awake'. \r\n        /// Override this to perform 'Awake' operations.\r\n        /// </summary>\r\n        protected virtual void OnValidAwake()\r\n        {\r\n\r\n        }\r\n\r\n        protected override void Start()\r\n        {\r\n            base.Start();\r\n\r\n            _maintainer.OnStart();\r\n        }\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _maintainer.OnEnabled();\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            _maintainer.OnDisable();\r\n        }\r\n\r\n        #endregion\r\n\r\n        public virtual SingletonLifeCycleRule LifeCycle\r\n        {\r\n            get { return _maintainer.LifeCycle; }\r\n            set\r\n            {\r\n                _maintainer.LifeCycle = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        [System.Serializable()]\r\n        public class Maintainer\r\n        {\r\n\r\n            #region Fields\r\n\r\n            [SerializeField()]\r\n            [Tooltip(\"Should this Singleton be maintained when a new scene is loaded.\")]\r\n            private SingletonLifeCycleRule _lifeCycle;\r\n\r\n\r\n            [System.NonSerialized()]\r\n            private IManagedSingleton _target;\r\n            [System.NonSerialized()]\r\n            private bool _flaggedSelfMaintaining;\r\n            [System.NonSerialized()]\r\n            private bool _started;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            public Maintainer()\r\n            {\r\n\r\n            }\r\n\r\n            public Maintainer(SingletonLifeCycleRule lifeCycle)\r\n            {\r\n                _lifeCycle = lifeCycle;\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Properties\r\n\r\n            public IManagedSingleton Target { get { return _target; } }\r\n\r\n            public SingletonLifeCycleRule LifeCycle\r\n            {\r\n                get { return _lifeCycle; }\r\n                set\r\n                {\r\n                    if (_lifeCycle == value) return;\r\n                    _lifeCycle = value;\r\n\r\n                    if (_target != null && !_flaggedSelfMaintaining && (_lifeCycle & SingletonLifeCycleRule.LivesForever) != 0) this.UpdateMaintainOnLoadStatus();\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Methods\r\n\r\n            /// <summary>\r\n            /// \r\n            /// </summary>\r\n            /// <param name=\"target\"></param>\r\n            /// <returns>Returns true if the validation was a success.</returns>\r\n            public bool OnAwake(IManagedSingleton target)\r\n            {\r\n                if (object.ReferenceEquals(target, null)) throw new System.ArgumentNullException(\"target\");\r\n                _target = target;\r\n\r\n                //first test if we have the appropriate configuration\r\n                if (_target.component.GetComponents<IManagedSingleton>().Count() > 1 && !_target.component.HasComponent<SingletonManager>())\r\n                {\r\n                    Debug.LogWarning(\"Gameobject with multiple Singletons exists without a SingletonManager attached, adding a SingletonManager with default destroy settings.\", target.component);\r\n                    _target.component.AddComponent<SingletonManager>();\r\n                }\r\n\r\n                //now set up singleton reference\r\n                if (_target.component.IsActiveAndEnabled())\r\n                {\r\n                    this.EnforceThisAsSingleton();\r\n                    _target.ComponentDestroyed += this.OnComponentDestroyed;\r\n                    SceneManager.sceneLoaded += this.OnLevelWasLoaded;\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    //remove self if it were added\r\n                    this.RemoveThisAsSingleton();\r\n                    return false;\r\n                }\r\n\r\n            }\r\n\r\n            public void OnStart()\r\n            {\r\n                _started = true;\r\n                this.EnforceThisAsSingleton();\r\n            }\r\n\r\n            public void OnEnabled()\r\n            {\r\n                if (!_started) return;\r\n                this.EnforceThisAsSingleton();\r\n            }\r\n\r\n            public void OnDisable()\r\n            {\r\n                this.RemoveThisAsSingleton();\r\n            }\r\n\r\n            private void OnComponentDestroyed(object sender, System.EventArgs e)\r\n            {\r\n                SceneManager.sceneLoaded -= OnLevelWasLoaded;\r\n                this.RemoveThisAsSingleton();\r\n\r\n                //if this isn't on the GameObjectSource, we should check if we need to delete our GameObject.\r\n                if (!GameLoopEntry.ApplicationClosing)\r\n                {\r\n                    if (_target.gameObject != null && _target.gameObject != Singleton.GetGameObjectSource(false))\r\n                    {\r\n                        var others = _target.gameObject.GetComponents<Singleton>();\r\n                        if (!(others.Length > 1 && !(from s in others select (s.LifeCycle & SingletonLifeCycleRule.LivesForever) != 0).Any()))\r\n                        {\r\n                            ObjUtil.SmartDestroy(_target.gameObject);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            \r\n            private void OnLevelWasLoaded(Scene sc, LoadSceneMode mode)\r\n            {\r\n                if ((_lifeCycle & SingletonLifeCycleRule.LivesForever) != 0) return;\r\n                if (_target.component == null) return;\r\n                if (_target.component.HasComponent<SingletonManager>()) return; //let the manager take care of this\r\n\r\n                //OnLevelWasLoaded gets called in between Awake and Start, we haven't started at that point, so ignore this\r\n                if (_target.isActiveAndEnabled && !_started) return;\r\n\r\n                Object.Destroy(_target.gameObject);\r\n            }\r\n\r\n            private void EnforceThisAsSingleton()\r\n            {\r\n                var targTp = _target.GetType();\r\n                IManagedSingleton c;\r\n                if (!_singletonRefs.TryGetValue(targTp, out c)) c = null;\r\n\r\n                if (object.ReferenceEquals(c, null) || c.component == null || c.component == _target.component || !c.isActiveAndEnabled)\r\n                {\r\n                    _singletonRefs[targTp] = _target;\r\n                }\r\n                else if(_target.component != null)\r\n                {\r\n                    if((_lifeCycle & SingletonLifeCycleRule.AlwaysReplace) != 0)\r\n                    {\r\n                        _singletonRefs[targTp] = _target;\r\n                        if (_target.component.HasComponent<SingletonManager>())\r\n                        {\r\n                            Object.Destroy(c.component);\r\n                        }\r\n                        else\r\n                        {\r\n                            Object.Destroy(c.gameObject);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (_target.component.HasComponent<SingletonManager>())\r\n                        {\r\n                            Object.Destroy(_target.component);\r\n                        }\r\n                        else\r\n                        {\r\n                            Object.Destroy(_target.gameObject);\r\n                        }\r\n                        //throw new System.InvalidOperationException(\"Attempted to create an instance of a Singleton out of its appropriate operating bounds.\");\r\n                        throw new System.InvalidOperationException(string.Format(\"Attempted to create an instance of a '{0}' Singleton out of its appropriate operating bounds.\", targTp.Name));\r\n                    }\r\n                }\r\n\r\n                this.UpdateMaintainOnLoadStatus();\r\n            }\r\n\r\n            private void RemoveThisAsSingleton()\r\n            {\r\n                if (_target == null) return;\r\n\r\n                var tp = _target.GetType();\r\n                IManagedSingleton sing;\r\n                if(_singletonRefs.TryGetValue(tp, out sing))\r\n                {\r\n                    if(sing.component == _target.component)\r\n                    {\r\n                        _singletonRefs.Remove(tp);\r\n                    }\r\n                }\r\n            }\r\n\r\n            private void UpdateMaintainOnLoadStatus()\r\n            {\r\n                if (_target.component == null) return;\r\n                if (_target.component.HasComponent<SingletonManager>()) return;\r\n\r\n                //for singletons not on the primary singleton source\r\n                if (!_flaggedSelfMaintaining && (_lifeCycle & SingletonLifeCycleRule.LivesForever) != 0)\r\n                {\r\n                    GameObject.DontDestroyOnLoad(_target.gameObject);\r\n                    _flaggedSelfMaintaining = true;\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        public class ConfigAttribute : System.Attribute\r\n        {\r\n\r\n            public SingletonLifeCycleRule DefaultLifeCycle;\r\n            public bool LifeCycleReadOnly;\r\n            public bool ExcludeFromSingletonManager;\r\n\r\n            public ConfigAttribute(SingletonLifeCycleRule defaultLifeCycle)\r\n            {\r\n                this.DefaultLifeCycle = defaultLifeCycle;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    /// <summary>\r\n    /// Attach to a component that has more than one Singleton on it, it handles group management of Singletons on the same GameObject.\r\n    /// </summary>\r\n    public sealed class SingletonManager : SPComponent\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private bool _maintainOnLoad = false;\r\n        [System.NonSerialized()]\r\n        private bool _flaggedSelfMaintaining;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n            \r\n            this.UpdateMaintainOnLoadStatus();\r\n            SceneManager.sceneLoaded += this.OnSceneWasLoaded;\r\n        }\r\n\r\n        protected override void OnDestroy()\r\n        {\r\n            base.OnDestroy();\r\n\r\n            SceneManager.sceneLoaded -= this.OnSceneWasLoaded;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool MaintainOnLoad\r\n        {\r\n            get { return _maintainOnLoad; }\r\n            set\r\n            {\r\n                if (_maintainOnLoad == value) return;\r\n                _maintainOnLoad = value;\r\n\r\n                if (!_flaggedSelfMaintaining && _maintainOnLoad) this.UpdateMaintainOnLoadStatus();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public IEnumerable<IManagedSingleton> GetSingletons()\r\n        {\r\n            return this.GetComponents<IManagedSingleton>();\r\n        }\r\n\r\n        private void UpdateMaintainOnLoadStatus()\r\n        {\r\n            //for singletons not on the primary singleton source\r\n            if (Application.isPlaying && !_flaggedSelfMaintaining && _maintainOnLoad)\r\n            {\r\n                GameObject.DontDestroyOnLoad(this.gameObject);\r\n                _flaggedSelfMaintaining = true;\r\n            }\r\n        }\r\n        \r\n        private void OnSceneWasLoaded(Scene sc, LoadSceneMode mode)\r\n        {\r\n            if (this.MaintainOnLoad) return;\r\n\r\n            //OnLevelWasLoaded gets called on the objects in the scene being loaded, we haven't started at that point, so ignore this\r\n            if (this.isActiveAndEnabled && !this.started) return;\r\n\r\n            Object.Destroy(this.gameObject);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/SingletonProxy.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Dynamic;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    [CreateAssetMenu(fileName = \"SingletonProxy\", menuName = \"Spacepuppy/SingletonProxy\")]\r\n    public class SingletonProxy : ScriptableObject, IDynamic, IProxy\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [TypeReference.Config(typeof(IManagedSingleton), allowAbstractClasses = false, allowInterfaces = false, dropDownStyle = TypeDropDownListingStyle.Flat)]\r\n        [SerializeField()]\r\n        private TypeReference _singletonType;\r\n        [SerializeField()]\r\n        private bool _createIfNone;\r\n\r\n        #endregion\r\n\r\n        #region IProxy Interface\r\n\r\n        public ISingleton GetTarget()\r\n        {\r\n            if (_singletonType == null || _singletonType.Type == null) return null;\r\n\r\n            //return Singleton.GetInstance(_singletonType.Type, !_createIfNone);\r\n            return Singletons.Get(_singletonType.Type, _createIfNone && Application.isPlaying);\r\n        }\r\n\r\n        bool IProxy.QueriesTarget\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        object IProxy.GetTarget()\r\n        {\r\n            return this.GetTarget();\r\n        }\r\n\r\n        object IProxy.GetTarget(object arg)\r\n        {\r\n            return this.GetTarget();\r\n        }\r\n\r\n        System.Type IProxy.GetTargetType()\r\n        {\r\n            return _singletonType.Type ?? typeof(ISingleton);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDynamic Interface\r\n\r\n        object IDynamic.this[string sMemberName]\r\n        {\r\n            get\r\n            {\r\n                return (this as IDynamic).GetValue(sMemberName);\r\n            }\r\n            set\r\n            {\r\n                (this as IDynamic).SetValue(sMemberName, value);\r\n            }\r\n        }\r\n\r\n        bool IDynamic.SetValue(string sMemberName, object value, params object[] index)\r\n        {\r\n            return this.GetTarget().SetValue(sMemberName, value, index);\r\n        }\r\n\r\n        object IDynamic.GetValue(string sMemberName, params object[] args)\r\n        {\r\n            return this.GetTarget().GetValue(sMemberName, args);\r\n        }\r\n\r\n        bool IDynamic.TryGetValue(string sMemberName, out object result, params object[] args)\r\n        {\r\n            return this.GetTarget().TryGetValue(sMemberName, out result, args);\r\n        }\r\n\r\n        object IDynamic.InvokeMethod(string sMemberName, params object[] args)\r\n        {\r\n            return this.GetTarget().InvokeMethod(sMemberName, args);\r\n        }\r\n\r\n        bool IDynamic.HasMember(string sMemberName, bool includeNonPublic)\r\n        {\r\n            if (_singletonType == null || _singletonType.Type == null) return false;\r\n\r\n            return DynamicUtil.TypeHasMember(_singletonType.Type, sMemberName, includeNonPublic);\r\n        }\r\n\r\n        IEnumerable<System.Reflection.MemberInfo> IDynamic.GetMembers(bool includeNonPublic)\r\n        {\r\n            if (_singletonType == null || _singletonType.Type == null) return Enumerable.Empty<System.Reflection.MemberInfo>();\r\n            return DynamicUtil.GetMembersFromType(_singletonType.Type, includeNonPublic);\r\n        }\r\n\r\n        IEnumerable<string> IDynamic.GetMemberNames(bool includeNonPublic)\r\n        {\r\n            if (_singletonType == null || _singletonType.Type == null) return Enumerable.Empty<string>();\r\n            return DynamicUtil.GetMemberNamesFromType(_singletonType.Type, includeNonPublic);\r\n        }\r\n\r\n        System.Reflection.MemberInfo IDynamic.GetMember(string sMemberName, bool includeNonPublic)\r\n        {\r\n            if (_singletonType == null || _singletonType.Type == null) return null;\r\n            return DynamicUtil.GetMemberFromType(_singletonType.Type, sMemberName, includeNonPublic);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    /*\r\n\r\n    public class SingletonProxy : MonoBehaviour, IDynamic, IProxy\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [TypeReference.Config(typeof(IManagedSingleton), allowAbstractClasses = false, allowInterfaces = false, dropDownStyle = TypeDropDownListingStyle.Flat)]\r\n        [SerializeField()]\r\n        private TypeReference _singletonType;\r\n        [SerializeField()]\r\n        private bool _createIfNone;\r\n\r\n        #endregion\r\n        \r\n        #region IProxy Interface\r\n\r\n        public ISingleton GetTarget()\r\n        {\r\n            if (_singletonType == null || _singletonType.Type == null) return null;\r\n\r\n            //return Singleton.GetInstance(_singletonType.Type, !_createIfNone);\r\n            return Singletons.Get(_singletonType.Type, _createIfNone);\r\n        }\r\n\r\n        object IProxy.GetTarget()\r\n        {\r\n            return this.GetTarget();\r\n        }\r\n\r\n        object IProxy.GetTarget(object arg)\r\n        {\r\n            return this.GetTarget();\r\n        }\r\n\r\n        System.Type IProxy.GetTargetType()\r\n        {\r\n            return _singletonType.Type ?? typeof(ISingleton);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDynamic Interface\r\n\r\n        object IDynamic.this[string sMemberName]\r\n        {\r\n            get\r\n            {\r\n                return (this as IDynamic).GetValue(sMemberName);\r\n            }\r\n            set\r\n            {\r\n                (this as IDynamic).SetValue(sMemberName, value);\r\n            }\r\n        }\r\n\r\n        bool IDynamic.SetValue(string sMemberName, object value, params object[] index)\r\n        {\r\n            return this.GetTarget().SetValue(sMemberName, value, index);\r\n        }\r\n\r\n        object IDynamic.GetValue(string sMemberName, params object[] args)\r\n        {\r\n            return this.GetTarget().GetValue(sMemberName, args);\r\n        }\r\n\r\n        bool IDynamic.TryGetValue(string sMemberName, out object result, params object[] args)\r\n        {\r\n            return this.GetTarget().TryGetValue(sMemberName, out result, args);\r\n        }\r\n\r\n        object IDynamic.InvokeMethod(string sMemberName, params object[] args)\r\n        {\r\n            return this.GetTarget().InvokeMethod(sMemberName, args);\r\n        }\r\n\r\n        bool IDynamic.HasMember(string sMemberName, bool includeNonPublic)\r\n        {\r\n            if (_singletonType == null || _singletonType.Type == null) return false;\r\n\r\n            return DynamicUtil.TypeHasMember(_singletonType.Type, sMemberName, includeNonPublic);\r\n        }\r\n\r\n        IEnumerable<System.Reflection.MemberInfo> IDynamic.GetMembers(bool includeNonPublic)\r\n        {\r\n            if (_singletonType == null || _singletonType.Type == null) return Enumerable.Empty<System.Reflection.MemberInfo>();\r\n            return DynamicUtil.GetMembersFromType(_singletonType.Type, includeNonPublic);\r\n        }\r\n\r\n        IEnumerable<string> IDynamic.GetMemberNames(bool includeNonPublic)\r\n        {\r\n            if (_singletonType == null || _singletonType.Type == null) return Enumerable.Empty<string>();\r\n            return DynamicUtil.GetMemberNamesFromType(_singletonType.Type, includeNonPublic);\r\n        }\r\n\r\n        System.Reflection.MemberInfo IDynamic.GetMember(string sMemberName, bool includeNonPublic)\r\n        {\r\n            if (_singletonType == null || _singletonType.Type == null) return null;\r\n            return DynamicUtil.GetMemberFromType(_singletonType.Type, sMemberName, includeNonPublic);\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n    [System.Obsolete(\"No idea why this even exists.\")]\r\n    public abstract class PsuedoSingletonProxy<T> : MonoBehaviour, IDynamic\r\n    {\r\n\r\n\r\n        #region Properties\r\n\r\n        public abstract T ConcreteInstance { get; }\r\n\r\n        #endregion\r\n\r\n        #region IDynamic Interface\r\n\r\n        object IDynamic.this[string sMemberName]\r\n        {\r\n            get\r\n            {\r\n                return (this as IDynamic).GetValue(sMemberName);\r\n            }\r\n            set\r\n            {\r\n                (this as IDynamic).SetValue(sMemberName, value);\r\n            }\r\n        }\r\n\r\n        bool IDynamic.SetValue(string sMemberName, object value, params object[] index)\r\n        {\r\n            return this.ConcreteInstance.SetValue(sMemberName, value, index);\r\n        }\r\n\r\n        object IDynamic.GetValue(string sMemberName, params object[] args)\r\n        {\r\n            return this.ConcreteInstance.GetValue(sMemberName, args);\r\n        }\r\n\r\n        bool IDynamic.TryGetValue(string sMemberName, out object result, params object[] args)\r\n        {\r\n            return this.ConcreteInstance.TryGetValue(sMemberName, out result, args);\r\n        }\r\n\r\n        object IDynamic.InvokeMethod(string sMemberName, params object[] args)\r\n        {\r\n            return this.ConcreteInstance.InvokeMethod(sMemberName, args);\r\n        }\r\n\r\n        bool IDynamic.HasMember(string sMemberName, bool includeNonPublic)\r\n        {\r\n            var obj = this.ConcreteInstance;\r\n            if (obj != null)\r\n                return DynamicUtil.HasMember(obj, sMemberName, includeNonPublic);\r\n            else\r\n                return DynamicUtil.TypeHasMember(typeof(T), sMemberName, includeNonPublic);\r\n        }\r\n\r\n        IEnumerable<System.Reflection.MemberInfo> IDynamic.GetMembers(bool includeNonPublic)\r\n        {\r\n            var obj = this.ConcreteInstance;\r\n            if (obj != null)\r\n                return DynamicUtil.GetMembers(obj, includeNonPublic);\r\n            else\r\n                return DynamicUtil.GetMembersFromType(typeof(T), includeNonPublic);\r\n        }\r\n\r\n        IEnumerable<string> IDynamic.GetMemberNames(bool includeNonPublic)\r\n        {\r\n            var obj = this.ConcreteInstance;\r\n            if (obj != null)\r\n                return DynamicUtil.GetMemberNames(obj, includeNonPublic);\r\n            else\r\n                return DynamicUtil.GetMemberNamesFromType(typeof(T), includeNonPublic);\r\n        }\r\n\r\n        System.Reflection.MemberInfo IDynamic.GetMember(string sMemberName, bool includeNonPublic)\r\n        {\r\n            var obj = this.ConcreteInstance;\r\n            if (obj != null)\r\n                return DynamicUtil.GetMember(obj, sMemberName, includeNonPublic);\r\n            else\r\n                return DynamicUtil.GetMemberFromType(typeof(T), sMemberName, includeNonPublic);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    */\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/SpacepuppyBase.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{4B8E57AC-F3B2-4DFD-BA0B-20F6BE3B17C9}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>com.spacepuppy</RootNamespace>\r\n    <AssemblyName>SpacepuppyUnityFramework</AssemblyName>\r\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile>\r\n    </TargetFrameworkProfile>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>TRACE;DEBUG;SP_LIB</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet>\r\n    </CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE;SP_LIB</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet>\r\n    </CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Runtime.Serialization\" />\r\n    <Reference Include=\"System.Runtime.Serialization.Formatters.Soap\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"UnityEngine, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"UnityEngine.UI, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEngine.UI.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Async\\AsyncOperationWrapper.cs\" />\r\n    <Compile Include=\"Async\\InvokePump.cs\" />\r\n    <Compile Include=\"Async\\RadicalAsyncOperation.cs\" />\r\n    <Compile Include=\"Async\\RadicalTask.cs\" />\r\n    <Compile Include=\"Async\\SPThreadPool.cs\" />\r\n    <Compile Include=\"Attributes.cs\" />\r\n    <Compile Include=\"AudioSettings.cs\" />\r\n    <Compile Include=\"Audio\\AudioGroup.cs\" />\r\n    <Compile Include=\"Audio\\AudioManager.cs\" />\r\n    <Compile Include=\"Audio\\IAudioGroup.cs\" />\r\n    <Compile Include=\"AutoNotificationManager.cs\" />\r\n    <Compile Include=\"Cameras\\Events.cs\" />\r\n    <Compile Include=\"Cameras\\LegacyRender\\GlobalPostProcessorHook.cs\" />\r\n    <Compile Include=\"Cameras\\LegacyRender\\IPostProcessingEffect.cs\" />\r\n    <Compile Include=\"Cameras\\LegacyRender\\PostProcessingManager.cs\" />\r\n    <Compile Include=\"Cameras\\Transition\\CameraFade.cs\" />\r\n    <Compile Include=\"Cameras\\CameraManager.cs\" />\r\n    <Compile Include=\"Cameras\\Movement\\CameraMovementController.cs\" />\r\n    <Compile Include=\"Cameras\\CameraNode.cs\" />\r\n    <Compile Include=\"Cameras\\CameraToken.cs\" />\r\n    <Compile Include=\"Cameras\\CameraCategory.cs\" />\r\n    <Compile Include=\"Cameras\\Transition\\ColorAlphaCameraFade.cs\" />\r\n    <Compile Include=\"Cameras\\ICamera.cs\" />\r\n    <Compile Include=\"Cameras\\Movement\\ICameraMovementControllerState.cs\" />\r\n    <Compile Include=\"Cameras\\MultiCameraController.cs\" />\r\n    <Compile Include=\"Cameras\\UnityCamera.cs\" />\r\n    <Compile Include=\"CancellableNotification.cs\" />\r\n    <Compile Include=\"Collections\\BinaryHeap.cs\" />\r\n    <Compile Include=\"Collections\\IForeachEnumerator.cs\" />\r\n    <Compile Include=\"Collections\\IIndexedEnumerable.cs\" />\r\n    <Compile Include=\"Collections\\LightEnumerator.cs\" />\r\n    <Compile Include=\"Collections\\MultitonPool.cs\" />\r\n    <Compile Include=\"Collections\\PointOctree.cs\" />\r\n    <Compile Include=\"Collections\\SamplingCharEnumerator.cs\" />\r\n    <Compile Include=\"Collections\\BiDictionary.cs\" />\r\n    <Compile Include=\"Collections\\CircularQueue.cs\" />\r\n    <Compile Include=\"Collections\\ComponentCollection.cs\" />\r\n    <Compile Include=\"Collections\\CooldownPool.cs\" />\r\n    <Compile Include=\"Collections\\Deque.cs\" />\r\n    <Compile Include=\"Collections\\EventForwardingPool.cs\" />\r\n    <Compile Include=\"Collections\\GameObjectCollection.cs\" />\r\n    <Compile Include=\"Collections\\ICachePool.cs\" />\r\n    <Compile Include=\"Collections\\ListDictionary.cs\" />\r\n    <Compile Include=\"Collections\\NotificationPool.cs\" />\r\n    <Compile Include=\"Collections\\ObjectCachePool.cs\" />\r\n    <Compile Include=\"Collections\\ObjectInstanceIDEqualityComparer.cs\" />\r\n    <Compile Include=\"Collections\\ObjectReferenceEqualityComparer.cs\" />\r\n    <Compile Include=\"Collections\\OrderedDelegate.cs\" />\r\n    <Compile Include=\"Collections\\PrimeHelper.cs\" />\r\n    <Compile Include=\"Collections\\SamplingStack.cs\" />\r\n    <Compile Include=\"Collections\\SerializableDictionaryBase.cs\" />\r\n    <Compile Include=\"Collections\\ReusableStringReader.cs\" />\r\n    <Compile Include=\"Collections\\StateFlagStack.cs\" />\r\n    <Compile Include=\"Collections\\TempCollection.cs\" />\r\n    <Compile Include=\"Collections\\TempDictionary.cs\" />\r\n    <Compile Include=\"Collections\\TempHashSet.cs\" />\r\n    <Compile Include=\"Collections\\TempList.cs\" />\r\n    <Compile Include=\"Collections\\TrackablObjectCachePool.cs\" />\r\n    <Compile Include=\"Collections\\UniqueHashSet.cs\" />\r\n    <Compile Include=\"Collections\\UniqueList.cs\" />\r\n    <Compile Include=\"Collections\\WeakInternalTypes.cs\" />\r\n    <Compile Include=\"Collections\\WeakKeyDictionary.cs\" />\r\n    <Compile Include=\"Collections\\WeakList.cs\" />\r\n    <Compile Include=\"Collections\\WeakValueDictionary.cs\" />\r\n    <Compile Include=\"CollisionExclusion.cs\" />\r\n    <Compile Include=\"CompoundTrigger.cs\" />\r\n    <Compile Include=\"Dynamic\\Accessors\\DynamicMemberAccessor.cs\" />\r\n    <Compile Include=\"Dynamic\\DoubleEvaluator.cs\" />\r\n    <Compile Include=\"Dynamic\\DynamicTweenExtension.cs\" />\r\n    <Compile Include=\"Dynamic\\DynamicObjectAccessor.cs\" />\r\n    <Compile Include=\"Dynamic\\DynamicParameterInfo.cs\" />\r\n    <Compile Include=\"Dynamic\\IDynamicMemberInfo.cs\" />\r\n    <Compile Include=\"Dynamic\\IStateModifier.cs\" />\r\n    <Compile Include=\"Dynamic\\Variant.cs\" />\r\n    <Compile Include=\"Dynamic\\VectorEvaluator.cs\" />\r\n    <Compile Include=\"EditorOnly\\IValidateReceiver.cs\" />\r\n    <Compile Include=\"ExceptionsLite.cs\" />\r\n    <Compile Include=\"FixedPercentDecimal.cs\" />\r\n    <Compile Include=\"FixedPercentLong.cs\" />\r\n    <Compile Include=\"FixedPoint.cs\" />\r\n    <Compile Include=\"ColorHSV.cs\" />\r\n    <Compile Include=\"Geom\\BezierSpline.cs\" />\r\n    <Compile Include=\"Geom\\Box.cs\" />\r\n    <Compile Include=\"Geom\\CatmullRomSpline.cs\" />\r\n    <Compile Include=\"Geom\\Cone.cs\" />\r\n    <Compile Include=\"Geom\\Cylinder.cs\" />\r\n    <Compile Include=\"Geom\\I3dSpline.cs\" />\r\n    <Compile Include=\"Geom\\PlanarSurfaceComponent.cs\" />\r\n    <Compile Include=\"Graphs\\AStarPathResolver.cs\" />\r\n    <Compile Include=\"Collections\\CovariantCollections.cs\" />\r\n    <Compile Include=\"Graphs\\CovariantGraph.cs\" />\r\n    <Compile Include=\"Graphs\\DijkstraPathResolver.cs\" />\r\n    <Compile Include=\"Graphs\\Exceptions.cs\" />\r\n    <Compile Include=\"Graphs\\GridGraph.cs\" />\r\n    <Compile Include=\"Graphs\\GridNeighbour.cs\" />\r\n    <Compile Include=\"Graphs\\HexGraph.cs\" />\r\n    <Compile Include=\"Graphs\\IGraph.cs\" />\r\n    <Compile Include=\"Graphs\\IHeuristic.cs\" />\r\n    <Compile Include=\"Graphs\\INode.cs\" />\r\n    <Compile Include=\"Graphs\\IPathResolver.cs\" />\r\n    <Compile Include=\"Graphs\\LinkedNodeGraph.cs\" />\r\n    <Compile Include=\"Graphs\\NodeGraph.cs\" />\r\n    <Compile Include=\"Hooks\\EarlyStartHook.cs\" />\r\n    <Compile Include=\"IEventActivatorMask.cs\" />\r\n    <Compile Include=\"IMixin.cs\" />\r\n    <Compile Include=\"IEntityAwakeHandler.cs\" />\r\n    <Compile Include=\"IImmediatelyResumingYieldInstruction.cs\" />\r\n    <Compile Include=\"IPausibleYieldInstruction.cs\" />\r\n    <Compile Include=\"IPooledYieldInstruction.cs\" />\r\n    <Compile Include=\"IProgressingYieldInstruction.cs\" />\r\n    <Compile Include=\"IRadicalEnumerator.cs\" />\r\n    <Compile Include=\"IRadicalWaitHandle.cs\" />\r\n    <Compile Include=\"ISPDisposable.cs\" />\r\n    <Compile Include=\"Dynamic\\ITokenizable.cs\" />\r\n    <Compile Include=\"IUpdateable.cs\" />\r\n    <Compile Include=\"Pathfinding\\IPath.cs\" />\r\n    <Compile Include=\"Pathfinding\\IPathFactory.cs\" />\r\n    <Compile Include=\"Pathfinding\\IPathSeeker.cs\" />\r\n    <Compile Include=\"Pathfinding\\PathArgumentException.cs\" />\r\n    <Compile Include=\"Pathfinding\\PathCalculateStatus.cs\" />\r\n    <Compile Include=\"Pathfinding\\PathUtil.cs\" />\r\n    <Compile Include=\"Pathfinding\\Unity\\UnityPath.cs\" />\r\n    <Compile Include=\"Pathfinding\\Unity\\UnityPathFactory.cs\" />\r\n    <Compile Include=\"Pathfinding\\Unity\\UnityPathSeeker.cs\" />\r\n    <Compile Include=\"Pathfinding\\Unity\\UnityStandardPathAgent.cs\" />\r\n    <Compile Include=\"Project\\AssetBundlePackage.cs\" />\r\n    <Compile Include=\"Project\\AssetBundles.cs\" />\r\n    <Compile Include=\"Project\\CustomTimeLayersData.cs\" />\r\n    <Compile Include=\"Dynamic\\DynamicMethodInfo.cs\" />\r\n    <Compile Include=\"Dynamic\\Evaluator.cs\" />\r\n    <Compile Include=\"Hooks\\Callbacks.cs\" />\r\n    <Compile Include=\"Hooks\\CollisionHooks.cs\" />\r\n    <Compile Include=\"Hooks\\ControllerColliderHitEventHooks.cs\" />\r\n    <Compile Include=\"Hooks\\TriggerHooks.cs\" />\r\n    <Compile Include=\"ConfigurableForce.cs\" />\r\n    <Compile Include=\"CustomTimeSupplier.cs\" />\r\n    <Compile Include=\"Delegates.cs\" />\r\n    <Compile Include=\"Dynamic\\DynamicPropertyInfo.cs\" />\r\n    <Compile Include=\"Enums.cs\" />\r\n    <Compile Include=\"Exceptions.cs\" />\r\n    <Compile Include=\"GameLoopEntry.cs\" />\r\n    <Compile Include=\"GameTime.cs\" />\r\n    <Compile Include=\"Geom\\AABBox.cs\" />\r\n    <Compile Include=\"Geom\\AxisInterval.cs\" />\r\n    <Compile Include=\"Geom\\BoundingSphereAlgorithm.cs\" />\r\n    <Compile Include=\"Geom\\Capsule.cs\" />\r\n    <Compile Include=\"Hooks\\CollisionSignalSource.cs\" />\r\n    <Compile Include=\"Geom\\GeomUtil.cs\" />\r\n    <Compile Include=\"Geom\\ICurve.cs\" />\r\n    <Compile Include=\"Geom\\IGeom.cs\" />\r\n    <Compile Include=\"Geom\\Interval.cs\" />\r\n    <Compile Include=\"Geom\\IPlanarSurface.cs\" />\r\n    <Compile Include=\"Geom\\Line.cs\" />\r\n    <Compile Include=\"Geom\\Matrix2D.cs\" />\r\n    <Compile Include=\"Geom\\PhysicsUtil.cs\" />\r\n    <Compile Include=\"Geom\\RaycastInfo.cs\" />\r\n    <Compile Include=\"Geom\\RigidbodyBounds.cs\" />\r\n    <Compile Include=\"Geom\\Sphere.cs\" />\r\n    <Compile Include=\"Geom\\TrajectoryUtil.cs\" />\r\n    <Compile Include=\"Geom\\Trans.cs\" />\r\n    <Compile Include=\"Geom\\XYPlanarSurface.cs\" />\r\n    <Compile Include=\"Hooks\\EarlyExecutionUpdateEventHooks.cs\" />\r\n    <Compile Include=\"Hooks\\TardyExecutionUpdateEventHooks.cs\" />\r\n    <Compile Include=\"Hooks\\UpdateEventHooks.cs\" />\r\n    <Compile Include=\"IComponent.cs\" />\r\n    <Compile Include=\"IForceReceiver.cs\" />\r\n    <Compile Include=\"IGameObjectSource.cs\" />\r\n    <Compile Include=\"IIgnorableCollision.cs\" />\r\n    <Compile Include=\"IRandom.cs\" />\r\n    <Compile Include=\"Project\\GameSettingsBase.cs\" />\r\n    <Compile Include=\"Project\\AssetPool.cs\" />\r\n    <Compile Include=\"Project\\PrefabToken.cs\" />\r\n    <Compile Include=\"Project\\QueryableAssetSet.cs\" />\r\n    <Compile Include=\"Project\\ResourceLink.cs\" />\r\n    <Compile Include=\"Project\\ResourceLinkTable.cs\" />\r\n    <Compile Include=\"Project\\ResourcePackage.cs\" />\r\n    <Compile Include=\"Project\\IAssetBundle.cs\" />\r\n    <Compile Include=\"Project\\SerializableInterfaceRef.cs\" />\r\n    <Compile Include=\"Scenario\\EventTriggerEvaluator.cs\" />\r\n    <Compile Include=\"Scenario\\HijackTriggerEvents.cs\" />\r\n    <Compile Include=\"Scenario\\i_KillTween.cs\" />\r\n    <Compile Include=\"Scenario\\i_ModifyTag.cs\" />\r\n    <Compile Include=\"Scenario\\i_PlayAudio.cs\" />\r\n    <Compile Include=\"Scenario\\i_TriggerFirstEnabledTarget.cs\" />\r\n    <Compile Include=\"Scenario\\i_TriggerOnEnumState.cs\" />\r\n    <Compile Include=\"RNGAsset.cs\" />\r\n    <Compile Include=\"Scenario\\t_AllTriggersOccupied.cs\" />\r\n    <Compile Include=\"Scenario\\t_OnTriggerOccupiedActive.cs\" />\r\n    <Compile Include=\"Scenario\\t_Timer.cs\" />\r\n    <Compile Include=\"Scenes\\SceneRef.cs\" />\r\n    <Compile Include=\"Proxy.cs\" />\r\n    <Compile Include=\"PsuedoSingleton.cs\" />\r\n    <Compile Include=\"RadicalEnums.cs\" />\r\n    <Compile Include=\"RadicalState.cs\" />\r\n    <Compile Include=\"RateOfChange.cs\" />\r\n    <Compile Include=\"Render\\i_SetMaterialProperty.cs\" />\r\n    <Compile Include=\"Render\\i_TweenMaterial.cs\" />\r\n    <Compile Include=\"Render\\MaterialPropertyReference.cs\" />\r\n    <Compile Include=\"Render\\MaterialSource.cs\" />\r\n    <Compile Include=\"Render\\MaterialTransition.cs\" />\r\n    <Compile Include=\"Render\\MaterialUtil.cs\" />\r\n    <Compile Include=\"Render\\RenderEnums.cs\" />\r\n    <Compile Include=\"Render\\RendererMaterialSwap.cs\" />\r\n    <Compile Include=\"Render\\RenderSettingsProxy.cs\" />\r\n    <Compile Include=\"Scenario\\ActivateEvent.cs\" />\r\n    <Compile Include=\"Scenario\\AutoTriggerableMechanism.cs\" />\r\n    <Compile Include=\"Scenario\\AutoTriggerComponent.cs\" />\r\n    <Compile Include=\"Scenario\\Comparers.cs\" />\r\n    <Compile Include=\"Scenario\\IAutoSequenceSignal.cs\" />\r\n    <Compile Include=\"Scenario\\i_AutoSequenceSignal.cs\" />\r\n    <Compile Include=\"Scenario\\i_ChangeCursorProperties.cs\" />\r\n    <Compile Include=\"Scenario\\i_ChangeStateOfSimpleStateMachine.cs\" />\r\n    <Compile Include=\"Scenario\\i_CopyState.cs\" />\r\n    <Compile Include=\"Scenario\\i_DebugLog.cs\" />\r\n    <Compile Include=\"Scenario\\i_Destroy.cs\" />\r\n    <Compile Include=\"Scenario\\i_Enable.cs\" />\r\n    <Compile Include=\"Scenario\\i_EnableComponent.cs\" />\r\n    <Compile Include=\"Scenario\\i_LoadScene.cs\" />\r\n    <Compile Include=\"Scenario\\i_ModifyCollisionBetweenEntities.cs\" />\r\n    <Compile Include=\"Scenario\\i_LookAt.cs\" />\r\n    <Compile Include=\"Audio\\i_PlayAmbientAudio.cs\" />\r\n    <Compile Include=\"Scenario\\i_PlaySoundEffect.cs\" />\r\n    <Compile Include=\"Scenario\\i_PostNotification.cs\" />\r\n    <Compile Include=\"Scenario\\i_QuitApplication.cs\" />\r\n    <Compile Include=\"Scenario\\i_SetActiveUIElement.cs\" />\r\n    <Compile Include=\"Scenario\\i_SetParent.cs\" />\r\n    <Compile Include=\"Scenario\\i_SetValueOnEntity.cs\" />\r\n    <Compile Include=\"Scenario\\i_SetValueOnTarget.cs\" />\r\n    <Compile Include=\"Scenario\\i_SetValueOnTriggerArg.cs\" />\r\n    <Compile Include=\"Scenario\\i_SignalEvent.cs\" />\r\n    <Compile Include=\"Scenario\\i_StartTetherJoint.cs\" />\r\n    <Compile Include=\"Scenario\\i_StopAudioSource.cs\" />\r\n    <Compile Include=\"Scenario\\i_StopTetherJoint.cs\" />\r\n    <Compile Include=\"Scenario\\i_SwapMaterialFlash.cs\" />\r\n    <Compile Include=\"Scenario\\i_Teleport.cs\" />\r\n    <Compile Include=\"Scenario\\i_TriggerForEachArg.cs\" />\r\n    <Compile Include=\"Scenario\\i_TriggerOnEval.cs\" />\r\n    <Compile Include=\"Scenario\\i_TriggerOnIfThen.cs\" />\r\n    <Compile Include=\"Scenario\\i_TriggerRandomElimination.cs\" />\r\n    <Compile Include=\"Scenario\\i_TriggerSequence.cs\" />\r\n    <Compile Include=\"Scenario\\i_TweenState.cs\" />\r\n    <Compile Include=\"Scenario\\i_TweenTo.cs\" />\r\n    <Compile Include=\"Scenario\\i_TweenValue.cs\" />\r\n    <Compile Include=\"Scenario\\t_Flicker.cs\" />\r\n    <Compile Include=\"Scenario\\t_OnClick.cs\" />\r\n    <Compile Include=\"Scenario\\t_OnDisable.cs\" />\r\n    <Compile Include=\"Scenario\\t_OnEnable.cs\" />\r\n    <Compile Include=\"Scenario\\t_OnEventTrigger.cs\" />\r\n    <Compile Include=\"Scenario\\t_OnStart.cs\" />\r\n    <Compile Include=\"Scenario\\t_RandomInterval.cs\" />\r\n    <Compile Include=\"Scenario\\t_OnTriggerOccupied.cs\" />\r\n    <Compile Include=\"Scenes\\Enums.cs\" />\r\n    <Compile Include=\"Scenes\\ISceneLoadedGlobalHandler.cs\" />\r\n    <Compile Include=\"Scenes\\SceneManagerEventArgs.cs\" />\r\n    <Compile Include=\"Scenes\\LoadSceneAsyncWaitHandle.cs\" />\r\n    <Compile Include=\"Scenes\\SceneManager.cs\" />\r\n    <Compile Include=\"Scenes\\SceneManagerUtils.cs\" />\r\n    <Compile Include=\"Service.cs\" />\r\n    <Compile Include=\"SPAssets.cs\" />\r\n    <Compile Include=\"SPEntity.cs\" />\r\n    <Compile Include=\"ITimeSupplier.cs\" />\r\n    <Compile Include=\"KillableEntity.cs\" />\r\n    <Compile Include=\"INotificationDispatcher.cs\" />\r\n    <Compile Include=\"IRadicalYieldInstruction.cs\" />\r\n    <Compile Include=\"MultiTag.cs\" />\r\n    <Compile Include=\"Notification.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"PropertyAttributes.cs\" />\r\n    <Compile Include=\"RadicalCoroutine.cs\" />\r\n    <Compile Include=\"RadicalCoroutineManager.cs\" />\r\n    <Compile Include=\"Scenario\\IObservableTrigger.cs\" />\r\n    <Compile Include=\"Scenario\\ITriggerable.cs\" />\r\n    <Compile Include=\"Scenario\\i_AddComponent.cs\" />\r\n    <Compile Include=\"Scenario\\i_SetValue.cs\" />\r\n    <Compile Include=\"Scenario\\i_Trigger.cs\" />\r\n    <Compile Include=\"Scenario\\i_TriggerChildren.cs\" />\r\n    <Compile Include=\"Scenario\\i_TriggerRandom.cs\" />\r\n    <Compile Include=\"Scenario\\ObservableTargetData.cs\" />\r\n    <Compile Include=\"Scenario\\ScenarioActivatorMask.cs\" />\r\n    <Compile Include=\"Scenario\\Trigger.cs\" />\r\n    <Compile Include=\"Scenario\\TriggerableMechanism.cs\" />\r\n    <Compile Include=\"Scenario\\TriggerableTargetObject.cs\" />\r\n    <Compile Include=\"Scenario\\TriggerActivatedNotification.cs\" />\r\n    <Compile Include=\"Scenario\\TriggerActivationType.cs\" />\r\n    <Compile Include=\"Scenario\\TriggerComponent.cs\" />\r\n    <Compile Include=\"Scenario\\TriggerTarget.cs\" />\r\n    <Compile Include=\"Scenario\\t_AllTriggered.cs\" />\r\n    <Compile Include=\"Scenario\\t_EnterTrigger.cs\" />\r\n    <Compile Include=\"Scenario\\t_ExitTrigger.cs\" />\r\n    <Compile Include=\"Scenario\\t_Interval.cs\" />\r\n    <Compile Include=\"Scenario\\t_OnCollisionEnter.cs\" />\r\n    <Compile Include=\"Scenario\\t_OnNotificationTrigger.cs\" />\r\n    <Compile Include=\"Signal.cs\" />\r\n    <Compile Include=\"Singleton.cs\" />\r\n    <Compile Include=\"SingletonProxy.cs\" />\r\n    <Compile Include=\"SPComponent.cs\" />\r\n    <Compile Include=\"SPConstants.cs\" />\r\n    <Compile Include=\"SPNotifyingComponent.cs\" />\r\n    <Compile Include=\"Numeric.cs\" />\r\n    <Compile Include=\"SPTime.cs\" />\r\n    <Compile Include=\"SPTimeEnums.cs\" />\r\n    <Compile Include=\"StateMachine\\ComponentStateSupplier.cs\" />\r\n    <Compile Include=\"StateMachine\\GenericStateStack.cs\" />\r\n    <Compile Include=\"StateMachine\\IStackedStateMachine.cs\" />\r\n    <Compile Include=\"StateMachine\\IStateMachine.cs\" />\r\n    <Compile Include=\"StateMachine\\IStateStack.cs\" />\r\n    <Compile Include=\"StateMachine\\IStateSupplier.cs\" />\r\n    <Compile Include=\"StateMachine\\ParentComponentStateSupplier.cs\" />\r\n    <Compile Include=\"Scenario\\t_StateMachine.cs\" />\r\n    <Compile Include=\"StateMachine\\StateChangedEventArgs.cs\" />\r\n    <Compile Include=\"StateMachine\\StateMachine.cs\" />\r\n    <Compile Include=\"StateMachine\\TypedStateMachine.cs\" />\r\n    <Compile Include=\"Project\\TagData.cs\" />\r\n    <Compile Include=\"CompoundStateLedger.cs\" />\r\n    <Compile Include=\"TagMask.cs\" />\r\n    <Compile Include=\"SPTimePeriod.cs\" />\r\n    <Compile Include=\"TempEventArgs.cs\" />\r\n    <Compile Include=\"TetherJoint.cs\" />\r\n    <Compile Include=\"Timers\\BulkTimer.cs\" />\r\n    <Compile Include=\"Timers\\DelayTimer.cs\" />\r\n    <Compile Include=\"Timers\\GameTimers.cs\" />\r\n    <Compile Include=\"Timers\\Scheduler.cs\" />\r\n    <Compile Include=\"Timers\\ITimer.cs\" />\r\n    <Compile Include=\"Timers\\StopWatch.cs\" />\r\n    <Compile Include=\"Timers\\SystemTimers.cs\" />\r\n    <Compile Include=\"Timers\\Timer.cs\" />\r\n    <Compile Include=\"Timers\\TimerCollection.cs\" />\r\n    <Compile Include=\"ShortUid.cs\" />\r\n    <Compile Include=\"Tuple.cs\" />\r\n    <Compile Include=\"Tween\\Accessors\\CustomTweenMemberAccessorFactory.cs\" />\r\n    <Compile Include=\"Tween\\Accessors\\FollowTargetPositionAccessor.cs\" />\r\n    <Compile Include=\"Tween\\Accessors\\GeneralMoveAccessor.cs\" />\r\n    <Compile Include=\"Tween\\Accessors\\GeneralRotateAccessor.cs\" />\r\n    <Compile Include=\"Tween\\Accessors\\RigidbodyMovePositionAccessor.cs\" />\r\n    <Compile Include=\"Tween\\Accessors\\TimeScaleMemberAccessor.cs\" />\r\n    <Compile Include=\"Tween\\Accessors\\TransformGlobalTransAccessor.cs\" />\r\n    <Compile Include=\"Tween\\Accessors\\TransformLocalTransAccessor.cs\" />\r\n    <Compile Include=\"Tween\\Accessors\\TransformRelativePositionAccessor.cs\" />\r\n    <Compile Include=\"Tween\\CallbackTweener.cs\" />\r\n    <Compile Include=\"Tween\\Curves\\BoolMemberCurve.cs\" />\r\n    <Compile Include=\"Tween\\Curves\\Color32MemberCurve.cs\" />\r\n    <Compile Include=\"Tween\\Curves\\ColorMemberCurve.cs\" />\r\n    <Compile Include=\"Tween\\Curves\\FollowTargetPositionCurve.cs\" />\r\n    <Compile Include=\"Tween\\Curves\\RectMemberCurve.cs\" />\r\n    <Compile Include=\"Tween\\Curves\\StringCurve.cs\" />\r\n    <Compile Include=\"Tween\\Curves\\TransMemberCurve.cs\" />\r\n    <Compile Include=\"Tween\\CustomMemberCurveAttribute.cs\" />\r\n    <Compile Include=\"Tween\\Curves\\FloatMemberCurve.cs\" />\r\n    <Compile Include=\"Tween\\CustomTweenMemberAccessorAttribute.cs\" />\r\n    <Compile Include=\"Tween\\Delegates.cs\" />\r\n    <Compile Include=\"Tween\\ITweenHash.cs\" />\r\n    <Compile Include=\"Tween\\ITweenMemberAccessor.cs\" />\r\n    <Compile Include=\"Tween\\MemberCurve.cs\" />\r\n    <Compile Include=\"Tween\\Curves\\NumericMemberCurve.cs\" />\r\n    <Compile Include=\"Tween\\Curves\\QuaternionMemberCurve.cs\" />\r\n    <Compile Include=\"Tween\\Curves\\Vector2MemberCurve.cs\" />\r\n    <Compile Include=\"Tween\\Curves\\Vector3MemberCurve.cs\" />\r\n    <Compile Include=\"Tween\\Curves\\Vector4MemberCurve.cs\" />\r\n    <Compile Include=\"Tween\\Easing.cs\" />\r\n    <Compile Include=\"Tween\\Enums.cs\" />\r\n    <Compile Include=\"Tween\\TweenCurve.cs\" />\r\n    <Compile Include=\"Tween\\Curves\\MeshCurve.cs\" />\r\n    <Compile Include=\"Tween\\TweenCurveGroup.cs\" />\r\n    <Compile Include=\"Tween\\ObjectTweener.cs\" />\r\n    <Compile Include=\"Tween\\TweenHash.cs\" />\r\n    <Compile Include=\"Tween\\SPTween.cs\" />\r\n    <Compile Include=\"Tween\\Tweener.cs\" />\r\n    <Compile Include=\"Tween\\TweenSequence.cs\" />\r\n    <Compile Include=\"TypeReference.cs\" />\r\n    <Compile Include=\"Project\\ITextSource.cs\" />\r\n    <Compile Include=\"Project\\TextDocument.cs\" />\r\n    <Compile Include=\"Project\\TextRef.cs\" />\r\n    <Compile Include=\"UI\\TextSettings.cs\" />\r\n    <Compile Include=\"Utils\\Assertions.cs\" />\r\n    <Compile Include=\"Utils\\AudioUtils.cs\" />\r\n    <Compile Include=\"Utils\\ColliderUtil.cs\" />\r\n    <Compile Include=\"Utils\\ColorUtil.cs\" />\r\n    <Compile Include=\"Utils\\CompareUtil.cs\" />\r\n    <Compile Include=\"Utils\\ComponentUtil.cs\" />\r\n    <Compile Include=\"Utils\\ConvertUtil.cs\" />\r\n    <Compile Include=\"Utils\\CoroutineUtil.cs\" />\r\n    <Compile Include=\"Dynamic\\IDynamic.cs\" />\r\n    <Compile Include=\"Dynamic\\StateToken.cs\" />\r\n    <Compile Include=\"Dynamic\\TypeAccessWrapper.cs\" />\r\n    <Compile Include=\"Utils\\Diminish\\DiminishingWeightOverDuration.cs\" />\r\n    <Compile Include=\"Utils\\EnumUtil.cs\" />\r\n    <Compile Include=\"Dynamic\\Accessors\\BasicMemberAccessor.cs\" />\r\n    <Compile Include=\"Dynamic\\Accessors\\FastTransformMemberAccessor.cs\" />\r\n    <Compile Include=\"Dynamic\\Accessors\\FieldAccessor.cs\" />\r\n    <Compile Include=\"Dynamic\\Accessors\\IMemberAccessor.cs\" />\r\n    <Compile Include=\"Dynamic\\Accessors\\MemberAccessor.cs\" />\r\n    <Compile Include=\"Dynamic\\Accessors\\MemberAccessorException.cs\" />\r\n    <Compile Include=\"Dynamic\\Accessors\\MemberAccessorPool.cs\" />\r\n    <Compile Include=\"Dynamic\\Accessors\\PropertyAccessor.cs\" />\r\n    <Compile Include=\"Utils\\InvokeHandle.cs\" />\r\n    <Compile Include=\"Utils\\Messaging.cs\" />\r\n    <Compile Include=\"Utils\\GameObjUtil.cs\" />\r\n    <Compile Include=\"Utils\\Gizmo\\GizmoGhost.cs\" />\r\n    <Compile Include=\"Utils\\ArrayUtil.cs\" />\r\n    <Compile Include=\"Utils\\LayerUtil.cs\" />\r\n    <Compile Include=\"Utils\\MathUtil.cs\" />\r\n    <Compile Include=\"Utils\\MouseUtil.cs\" />\r\n    <Compile Include=\"INameable.cs\" />\r\n    <Compile Include=\"Utils\\NameCache.cs\" />\r\n    <Compile Include=\"Utils\\ObjUtil.cs\" />\r\n    <Compile Include=\"Utils\\PrefabUtil.cs\" />\r\n    <Compile Include=\"Utils\\PrimitiveUtil.cs\" />\r\n    <Compile Include=\"Utils\\QuaternionUtil.cs\" />\r\n    <Compile Include=\"Utils\\RandomEnumUtil.cs\" />\r\n    <Compile Include=\"Utils\\RandomUtil.cs\" />\r\n    <Compile Include=\"Utils\\Rand\\RandomRange.cs\" />\r\n    <Compile Include=\"Utils\\StreamUtil.cs\" />\r\n    <Compile Include=\"Utils\\StringUtil.cs\" />\r\n    <Compile Include=\"Utils\\TextureUtil.cs\" />\r\n    <Compile Include=\"Utils\\TransformUtil.cs\" />\r\n    <Compile Include=\"Utils\\TypeUtil.cs\" />\r\n    <Compile Include=\"Utils\\UIEventUtil.cs\" />\r\n    <Compile Include=\"Utils\\VectorUtil.cs\" />\r\n    <Compile Include=\"VariableStore.cs\" />\r\n    <Compile Include=\"VariantCollection.cs\" />\r\n    <Compile Include=\"VariantMember.cs\" />\r\n    <Compile Include=\"VariantReference.cs\" />\r\n    <Compile Include=\"VersionInfo.cs\" />\r\n    <Compile Include=\"WaitForComplete.cs\" />\r\n    <Compile Include=\"WaitForDuration.cs\" />\r\n    <Compile Include=\"WaitForLateUpdate.cs\" />\r\n    <Compile Include=\"WaitForNotification.cs\" />\r\n    <Compile Include=\"WaitUntilTime.cs\" />\r\n    <Compile Include=\"IResettingYieldInstruction.cs\" />\r\n    <Compile Include=\"NullYieldInstruction.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup />\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>mkdir $(ProjectDir)..\\Builds\\FullLibrary\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.dll\" \"$(ProjectDir)..\\Builds\\FullLibrary\\SpacepuppyUnityFramework.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.pdb\" \"$(ProjectDir)..\\Builds\\FullLibrary\\SpacepuppyUnityFramework.pdb\"\r\nmkdir $(ProjectDir)..\\Builds\\BaseLibrary\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.dll\" \"$(ProjectDir)..\\Builds\\BaseLibrary\\SpacepuppyUnityFramework.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.pdb\" \"$(ProjectDir)..\\Builds\\BaseLibrary\\SpacepuppyUnityFramework.pdb\"</PostBuildEvent>\r\n  </PropertyGroup>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "SpacepuppyBase/StateMachine/ComponentStateSupplier.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.StateMachine\r\n{\r\n\r\n    public class ComponentStateSupplier<T> : ITypedStateSupplier<T> where T : class\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private GameObject _container;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public ComponentStateSupplier(GameObject container)\r\n        {\r\n            if (container == null) throw new System.ArgumentNullException(\"container\");\r\n            _container = container;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public GameObject Container\r\n        {\r\n            get { return _container; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITypedStateSupplier Interface\r\n\r\n        public int Count\r\n        {\r\n            get\r\n            {\r\n                using (var lst = com.spacepuppy.Collections.TempCollection.GetList<T>())\r\n                {\r\n                    _container.GetComponents<T>(lst);\r\n                    return lst.Count;\r\n                }\r\n            }\r\n        }\r\n\r\n        public T GetStateAt(int index)\r\n        {\r\n            if (_container == null) return null;\r\n            if (index < 0) throw new System.IndexOutOfRangeException();\r\n\r\n            using (var lst = com.spacepuppy.Collections.TempCollection.GetList<T>())\r\n            {\r\n                _container.GetComponents<T>(lst);\r\n                if (index < lst.Count) return lst[index];\r\n                else throw new System.IndexOutOfRangeException();\r\n            }\r\n        }\r\n\r\n        public bool Contains<TSub>() where TSub : class, T\r\n        {\r\n            if (_container == null) return false;\r\n            return _container.HasComponent<TSub>();\r\n        }\r\n\r\n        public bool Contains(System.Type tp)\r\n        {\r\n            if (_container == null) return false;\r\n            if (tp == null || !TypeUtil.IsType(tp, typeof(T))) return false;\r\n            return _container.HasComponent(tp);\r\n        }\r\n\r\n        public bool Contains(T state)\r\n        {\r\n            if (_container == null) return false;\r\n            return _container == GameObjectUtil.GetGameObjectFromSource(state);\r\n        }\r\n\r\n        public TSub GetState<TSub>() where TSub : class, T\r\n        {\r\n            if (_container == null) return null;\r\n            return _container.GetComponent<TSub>();\r\n        }\r\n\r\n        public T GetState(System.Type tp)\r\n        {\r\n            if (tp == null || !TypeUtil.IsType(tp, typeof(T))) return default(T);\r\n            if (_container == null) return default(T);\r\n            return _container.GetComponent(tp) as T;\r\n        }\r\n\r\n        public T GetNext(T current)\r\n        {\r\n            if (_container == null) return null;\r\n            //return this.GetValueAfterOrDefault(current, true);\r\n            using (var lst = com.spacepuppy.Collections.TempCollection.GetList<T>())\r\n            {\r\n                _container.GetComponents<T>(lst);\r\n                return lst.GetValueAfterOrDefault(current, true);\r\n            }\r\n        }\r\n\r\n        public void GetStates(ICollection<T> coll)\r\n        {\r\n            if (_container == null) return;\r\n            _container.GetComponents<T>(coll, null);\r\n        }\r\n        \r\n        public void Foreach(System.Action<T> callback)\r\n        {\r\n            if (callback == null) return;\r\n            if (_container == null) return;\r\n            using (var lst = com.spacepuppy.Collections.TempCollection.GetList<T>())\r\n            {\r\n                _container.GetComponents<T>(lst);\r\n                var e = lst.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    callback(e.Current);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public IEnumerator<T> GetEnumerator()\r\n        {\r\n            if (_container == null) return Enumerable.Empty<T>().GetEnumerator();\r\n            return (_container.GetComponents<T>() as IEnumerable<T>).GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            if (_container == null) return Enumerable.Empty<T>().GetEnumerator();\r\n            return _container.GetComponents<T>().GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n\r\n        public static IEnumerable<T> GetComponentsOnTarg(GameObject container)\r\n        {\r\n            return container.GetComponents<T>();\r\n        }\r\n\r\n        public static IEnumerable<TSub> GetComponentsOnTarg<TSub>(GameObject container) where TSub : class, T\r\n        {\r\n            return container.GetComponents<TSub>();\r\n        }\r\n\r\n        public static IEnumerable<T> GetComponentsOnTarg(System.Type tp, GameObject container)\r\n        {\r\n            if (!TypeUtil.IsType(tp, typeof(T))) throw new TypeArgumentMismatchException(tp, typeof(T), \"tp\");\r\n\r\n            return container.GetComponents(tp).Cast<T>();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/StateMachine/GenericStateStack.cs",
    "content": "﻿using System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.StateMachine\r\n{\r\n    public class GenericStateStack<T> : IStateStack<T> where T : class\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private IStateMachine<T> _machine;\r\n        private Stack<T> _stateStack = new Stack<T>();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public GenericStateStack(IStateMachine<T> machine)\r\n        {\r\n            if (machine == null) throw new System.ArgumentNullException(\"machine\");\r\n            _machine = machine;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IStateMachine<T> Machine { get { return _machine; }}\r\n\r\n        #endregion\r\n\r\n        #region IStateStack Interface\r\n\r\n        public IEnumerable<T> CurrentStack { get { return _stateStack; } }\r\n\r\n        public T StackState(T state)\r\n        {\r\n            if (!object.ReferenceEquals(state, null) && !_machine.Contains(state)) throw new System.ArgumentException(\"MovementStyle is not a member of the state machine.\", \"style\");\r\n\r\n            _stateStack.Push(_machine.Current);\r\n            return _machine.ChangeState(state);\r\n        }\r\n\r\n        public T PopState()\r\n        {\r\n            if (_stateStack.Count > 0)\r\n            {\r\n                return _machine.ChangeState(_stateStack.Pop());\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public T PopAllStates()\r\n        {\r\n            if (_stateStack.Count > 0)\r\n            {\r\n                var style = _stateStack.Last();\r\n                _stateStack.Clear();\r\n                return _machine.ChangeState(style);\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    public class GenericTypedStateStack<T> : GenericStateStack<T>, ITypedStateStack<T> where T : class\r\n    {\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public GenericTypedStateStack(ITypedStateMachine<T> machine) : base(machine)\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public new ITypedStateMachine<T> Machine { get { return base.Machine as ITypedStateMachine<T>; } }\r\n\r\n        #endregion\r\n\r\n        #region ITypedStateStack Interface\r\n\r\n        public TSub StackState<TSub>() where TSub : class, T\r\n        {\r\n            var state = this.Machine.GetState<TSub>();\r\n            if (state == null) throw new System.ArgumentException(\"Machine does not contain a state of type '\" + typeof(TSub).Name + \"'.\", \"TSub\");\r\n\r\n            return this.StackState(state) as TSub;\r\n        }\r\n\r\n        public T StackState(System.Type tp)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n            var state = this.Machine.GetState(tp);\r\n            if (state == null) throw new System.ArgumentException(\"Machine does not contain a state of type '\" + tp.Name + \"'.\", \"tp\");\r\n\r\n            return this.StackState(state);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/StateMachine/IStackedStateMachine.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.StateMachine\r\n{\r\n\r\n    public interface IStackedStateMachine<T> : IStateMachine<T>, IStateStack<T>\r\n    {\r\n    }\r\n\r\n    public interface ITypedStackedStateMachine<T> : IStackedStateMachine<T>, ITypedStateMachine<T>, ITypedStateStack<T> where T : class\r\n    {\r\n\r\n    }\r\n\r\n\r\n    public class StackedStateMachine<T> : StateMachine<T>, IStackedStateMachine<T> where T : class\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private GenericStateStack<T> _stack;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public StackedStateMachine(IStateSupplier<T> supplier)\r\n            : base(supplier)\r\n        {\r\n            _stack = new GenericStateStack<T>(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IStackedStateMachine Interface\r\n\r\n        public IEnumerable<T> CurrentStack\r\n        {\r\n            get\r\n            {\r\n                return _stack.CurrentStack;\r\n            }\r\n        }\r\n\r\n        public T PopAllStates()\r\n        {\r\n            return _stack.PopAllStates();\r\n        }\r\n\r\n        public T PopState()\r\n        {\r\n            return _stack.PopState();\r\n        }\r\n\r\n        public T StackState(T state)\r\n        {\r\n            return _stack.StackState(state);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    public class TypedStackedStateMachine<T> : TypedStateMachine<T>, ITypedStackedStateMachine<T> where T : class\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private GenericTypedStateStack<T> _stack;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TypedStackedStateMachine(ITypedStateSupplier<T> supplier)\r\n            : base(supplier)\r\n        {\r\n            _stack = new GenericTypedStateStack<T>(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITypedStackedStateMachine Interface\r\n\r\n        public IEnumerable<T> CurrentStack\r\n        {\r\n            get\r\n            {\r\n                return _stack.CurrentStack;\r\n            }\r\n        }\r\n\r\n        public T PopAllStates()\r\n        {\r\n            return _stack.PopAllStates();\r\n        }\r\n\r\n        public T PopState()\r\n        {\r\n            return _stack.PopState();\r\n        }\r\n\r\n        public T StackState(T state)\r\n        {\r\n            return _stack.StackState(state);\r\n        }\r\n\r\n        public T StackState(Type tp)\r\n        {\r\n            return _stack.StackState(tp);\r\n        }\r\n\r\n        public TSub StackState<TSub>() where TSub : class, T\r\n        {\r\n            return _stack.StackState<TSub>();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Factory\r\n\r\n        public new static TypedStackedStateMachine<T> CreateFromComponentSource(UnityEngine.GameObject source)\r\n        {\r\n            return new TypedStackedStateMachine<T>(new ComponentStateSupplier<T>(source));\r\n        }\r\n\r\n        public new static TypedStackedStateMachine<T> CreateFromParentComponentSource(UnityEngine.GameObject source, bool includeStatesOnContainer, bool isStatic)\r\n        {\r\n            return new TypedStackedStateMachine<T>(new ParentComponentStateSupplier<T>(source, includeStatesOnContainer, isStatic));\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/StateMachine/IStateMachine.cs",
    "content": "﻿using System.Collections.Generic;\r\nusing com.spacepuppy.Collections;\r\n\r\nnamespace com.spacepuppy.StateMachine\r\n{\r\n\r\n    public interface IStateMachine<T> : IEnumerable<T>, IForeachEnumerator<T>\r\n    {\r\n\r\n        event StateChangedEventHandler<T> StateChanged;\r\n\r\n        T Current { get; }\r\n        //int Count { get; }\r\n\r\n        bool Contains(T state);\r\n        T ChangeState(T state);\r\n\r\n        void GetStates(ICollection<T> coll);\r\n\r\n    }\r\n\r\n    public interface ITypedStateMachine<T> : IStateMachine<T>\r\n    {\r\n\r\n        bool Contains<TSub>() where TSub : class, T;\r\n        bool Contains(System.Type tp);\r\n\r\n        TSub GetState<TSub>() where TSub : class, T;\r\n        T GetState(System.Type tp);\r\n\r\n        TSub ChangeState<TSub>() where TSub : class, T;\r\n        T ChangeState(System.Type tp);\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/StateMachine/IStateStack.cs",
    "content": "﻿using System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.StateMachine\r\n{\r\n    public interface IStateStack<T>\r\n    {\r\n\r\n        IEnumerable<T> CurrentStack { get; }\r\n\r\n        T StackState(T state);\r\n\r\n        T PopState();\r\n        T PopAllStates();\r\n\r\n    }\r\n\r\n    public interface ITypedStateStack<T> : IStateStack<T> where T : class\r\n    {\r\n\r\n        TSub StackState<TSub>() where TSub : class, T;\r\n        T StackState(System.Type tp);\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/StateMachine/IStateSupplier.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.StateMachine\r\n{\r\n\r\n    public interface IStateSupplier<T> : IEnumerable<T>, IForeachEnumerator<T> where T : class\r\n    {\r\n\r\n        int Count { get; }\r\n\r\n        bool Contains(T state);\r\n        T GetNext(T current);\r\n\r\n        void GetStates(ICollection<T> coll);\r\n        \r\n    }\r\n\r\n    public interface ITypedStateSupplier<T> : IStateSupplier<T> where T : class\r\n    {\r\n\r\n        bool Contains<TSub>() where TSub : class, T;\r\n        bool Contains(System.Type tp);\r\n\r\n        TSub GetState<TSub>() where TSub : class, T;\r\n        T GetState(System.Type tp);\r\n\r\n    }\r\n\r\n    public class StateSupplierCollection<T> : System.Collections.Generic.HashSet<T>, ITypedStateSupplier<T> where T : class\r\n    {\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public StateSupplierCollection()\r\n            : base(null as IEqualityComparer<T>)\r\n        {\r\n        }\r\n\r\n        public StateSupplierCollection(IEnumerable<T> collection)\r\n            : base(collection, null as IEqualityComparer<T>)\r\n        {\r\n        }\r\n\r\n        public StateSupplierCollection(IEqualityComparer<T> comparer)\r\n            : base(comparer)\r\n        {\r\n        }\r\n\r\n        public StateSupplierCollection(IEnumerable<T> collection, IEqualityComparer<T> comparer)\r\n            : base(collection, comparer)\r\n        {\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITypedStateSupplier Interface\r\n        \r\n        public bool Contains<TSub>() where TSub : class, T\r\n        {\r\n            if (this.Count == 0) return false;\r\n\r\n            var e = this.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if (e.Current is TSub) return true;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        public bool Contains(System.Type tp)\r\n        {\r\n            if (this.Count == 0) return false;\r\n\r\n            var e = this.GetEnumerator();\r\n            T obj;\r\n            while (e.MoveNext())\r\n            {\r\n                obj = e.Current;\r\n                if (obj != null && TypeUtil.IsType(obj.GetType(), tp)) return true;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        public TSub GetState<TSub>() where TSub : class, T\r\n        {\r\n            if (this.Count == 0) return null;\r\n\r\n            var e = this.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                if (e.Current is TSub) return e.Current as TSub;\r\n            }\r\n            return null;\r\n        }\r\n\r\n        public T GetState(System.Type tp)\r\n        {\r\n            if (this.Count == 0) return null;\r\n\r\n            var e = this.GetEnumerator();\r\n            T obj;\r\n            while (e.MoveNext())\r\n            {\r\n                obj = e.Current;\r\n                if (obj != null && TypeUtil.IsType(obj.GetType(), tp)) return obj;\r\n            }\r\n            return null;\r\n        }\r\n\r\n        public T GetNext(T current)\r\n        {\r\n            if (this.Count == 0) return null;\r\n\r\n            //NOTE - if current doesn't exist in collection, we return the first entry\r\n\r\n            HashSet<T>.Enumerator e;\r\n            if (this.Contains(current))\r\n            {\r\n                e = this.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (this.Comparer.Equals(current, e.Current))\r\n                    {\r\n                        if (e.MoveNext())\r\n                            return e.Current;\r\n                        else\r\n                            break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            e = this.GetEnumerator();\r\n            e.MoveNext();\r\n            return e.Current;\r\n        }\r\n        \r\n        public void GetStates(ICollection<T> coll)\r\n        {\r\n            var e = this.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                coll.Add(e.Current);\r\n            }\r\n        }\r\n\r\n        public void Foreach(System.Action<T> callback)\r\n        {\r\n            var e = this.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                callback(e.Current);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    public class TypedStateSupplierCollection<T> : com.spacepuppy.Collections.ComponentCollection<T>, ITypedStateSupplier<T> where T : class\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private bool _allowIndirectHit;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TypedStateSupplierCollection()\r\n        {\r\n\r\n        }\r\n\r\n        public TypedStateSupplierCollection(bool allowIndirectHit)\r\n        {\r\n            _allowIndirectHit = allowIndirectHit;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool AllowIndirectHit { get { return _allowIndirectHit; } }\r\n\r\n        #endregion\r\n\r\n        #region ITypedStateSupplier Interface\r\n\r\n        public bool Contains<TSub>() where TSub : class, T\r\n        {\r\n            return this.Has<TSub>(_allowIndirectHit);\r\n        }\r\n\r\n        public bool Contains(System.Type tp)\r\n        {\r\n            return this.Has(tp, _allowIndirectHit);\r\n        }\r\n\r\n        public TSub GetState<TSub>() where TSub : class, T\r\n        {\r\n            return this.Get<TSub>(_allowIndirectHit);\r\n        }\r\n\r\n        public T GetState(System.Type tp)\r\n        {\r\n            return this.Get(tp, _allowIndirectHit);\r\n        }\r\n\r\n        public T GetNext(T current)\r\n        {\r\n            if (this.Count == 0) return null;\r\n\r\n            return this.GetValueAfterOrDefault(current, true);\r\n        }\r\n\r\n        public void GetStates(ICollection<T> coll)\r\n        {\r\n            var e = this.GetEnumeratorDirect();\r\n            while (e.MoveNext())\r\n            {\r\n                coll.Add(e.Current);\r\n            }\r\n        }\r\n\r\n        public void Foreach(System.Action<T> callback)\r\n        {\r\n            var e = this.GetEnumeratorDirect();\r\n            while (e.MoveNext())\r\n            {\r\n                callback(e.Current);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/StateMachine/ParentComponentStateSupplier.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.StateMachine\r\n{\r\n\r\n    public class ParentComponentStateSupplier<T> : ITypedStateSupplier<T> where T : class\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private GameObject _container;\r\n        private bool _includeStatesOnContainer;\r\n        private bool _isStatic;\r\n\r\n        private List<T> _states = new List<T>();\r\n        private bool _clean;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        /// <summary>\r\n        /// Create a ParentComponentStateSupplier\r\n        /// </summary>\r\n        /// <param name=\"container\"></param>\r\n        /// <param name=\"includeStatesOnContainer\"></param>\r\n        /// <param name=\"isStatic\">Set true if the hierarchy doesn't change.</param>\r\n        public ParentComponentStateSupplier(GameObject container, bool includeStatesOnContainer, bool isStatic)\r\n        {\r\n            if (container == null) throw new System.ArgumentNullException(\"container\");\r\n            _container = container;\r\n            _includeStatesOnContainer = includeStatesOnContainer;\r\n            _isStatic = isStatic;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public GameObject Container\r\n        {\r\n            get { return _container; }\r\n        }\r\n\r\n        public bool IncludeStatesOnContainer\r\n        {\r\n            get { return _includeStatesOnContainer; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Set true if the hierarchy doesn't change.\r\n        /// </summary>\r\n        public bool IsStatic\r\n        {\r\n            get { return _isStatic; }\r\n            set\r\n            {\r\n                if (_isStatic == value) return;\r\n                _isStatic = value;\r\n                if (!_isStatic) this.SetDirty();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void SetDirty()\r\n        {\r\n            _clean = false;\r\n        }\r\n\r\n        private void SyncStates()\r\n        {\r\n            if (_isStatic)\r\n            {\r\n                if(!_clean)\r\n                {\r\n                    _states.Clear();\r\n                    if(_container != null) ParentComponentStateSupplier<T>.GetComponentsOnTarg(_container, _states, _includeStatesOnContainer);\r\n                    _clean = true;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                _states.Clear();\r\n                if (_container != null) ParentComponentStateSupplier<T>.GetComponentsOnTarg(_container, _states, _includeStatesOnContainer);\r\n            }\r\n        }\r\n\r\n        private IEnumerable<TSub> GetStates<TSub>() where TSub : class, T\r\n        {\r\n            if (_isStatic)\r\n            {\r\n                this.SyncStates();\r\n                return (from s in _states where s is TSub select s as TSub);\r\n            }\r\n            else\r\n            {\r\n                return ParentComponentStateSupplier<T>.GetComponentsOnTarg<TSub>(_container, _includeStatesOnContainer);\r\n            }\r\n        }\r\n\r\n        private IEnumerable<T> GetStates(System.Type tp)\r\n        {\r\n            if (_isStatic)\r\n            {\r\n                this.SyncStates();\r\n                return (from s in _states where tp.IsAssignableFrom(s.GetType()) select s);\r\n            }\r\n            else\r\n            {\r\n                return ParentComponentStateSupplier<T>.GetComponentsOnTarg(tp, _container, _includeStatesOnContainer);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITypedStateSupplier Interface\r\n\r\n        public int Count\r\n        {\r\n            get\r\n            {\r\n                this.SyncStates();\r\n                return _states.Count;\r\n            }\r\n        }\r\n\r\n        public T GetStateAt(int index)\r\n        {\r\n            if (index < 0) throw new System.IndexOutOfRangeException();\r\n\r\n            this.SyncStates();\r\n            if (index < _states.Count) return _states[index];\r\n            else throw new System.IndexOutOfRangeException();\r\n        }\r\n\r\n        public bool Contains<TSub>() where TSub : class, T\r\n        {\r\n            //if (_container == null) return false;\r\n            //T comp = this.GetStates<TSub>().FirstOrDefault();\r\n            //return !comp.IsNullOrDestroyed();\r\n\r\n            this.SyncStates();\r\n            var e = _states.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if (e.Current is TSub && !e.Current.IsNullOrDestroyed()) return true;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        public bool Contains(System.Type tp)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n            //if (_container == null) return false;\r\n            //var comp = this.GetStates(tp).FirstOrDefault();\r\n            //return !comp.IsNullOrDestroyed();\r\n\r\n            this.SyncStates();\r\n            var e = _states.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if (TypeUtil.IsType(e.Current.GetType(), tp) && !e.Current.IsNullOrDestroyed()) return true;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        public bool Contains(T state)\r\n        {\r\n            if (_container == null) return false;\r\n            var go = GameObjectUtil.GetGameObjectFromSource(state);\r\n            if (go != null)\r\n            {\r\n                if (_includeStatesOnContainer && _container == go) return true;\r\n                if (_container.transform == go.transform.parent) return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public TSub GetState<TSub>() where TSub : class, T\r\n        {\r\n            //if (_container == null) return null;\r\n            //TSub comp = this.GetStates<TSub>().FirstOrDefault();\r\n            //if (!comp.IsNullOrDestroyed())\r\n            //    return comp;\r\n            //else\r\n            //    return null;\r\n\r\n            this.SyncStates();\r\n            var e = _states.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if (e.Current is TSub && !e.Current.IsNullOrDestroyed()) return e.Current as TSub;\r\n            }\r\n            return null;\r\n        }\r\n\r\n        public T GetState(System.Type tp)\r\n        {\r\n            if (tp == null) return null;\r\n\r\n            //if (_container == null) return null;\r\n            //T comp = this.GetStates(tp).FirstOrDefault();\r\n            //if (!comp.IsNullOrDestroyed())\r\n            //    return comp;\r\n            //else\r\n            //    return null;\r\n\r\n            this.SyncStates();\r\n            var e = _states.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                if (TypeUtil.IsType(e.Current.GetType(), tp) && !e.Current.IsNullOrDestroyed()) return e.Current;\r\n            }\r\n            return null;\r\n        }\r\n\r\n        public T GetNext(T current)\r\n        {\r\n            //if (_container == null) return null;\r\n            //return this.GetValueAfterOrDefault(current, true);\r\n\r\n            this.SyncStates();\r\n            return _states.GetValueAfterOrDefault(current, true);\r\n        }\r\n\r\n        public void GetStates(ICollection<T> coll)\r\n        {\r\n            GetComponentsOnTarg(_container, coll, _includeStatesOnContainer);\r\n        }\r\n\r\n        public void Foreach(System.Action<T> callback)\r\n        {\r\n            if (callback == null) return;\r\n            if (_container == null) return;\r\n            using (var lst = com.spacepuppy.Collections.TempCollection.GetList<T>())\r\n            {\r\n                _container.GetComponents<T>(lst);\r\n                var e = lst.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    callback(e.Current);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public IEnumerator<T> GetEnumerator()\r\n        {\r\n            if (_container == null) return System.Linq.Enumerable.Empty<T>().GetEnumerator();\r\n            return (GetComponentsOnTarg(_container, _includeStatesOnContainer) as IEnumerable<T>).GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            if (_container == null) return System.Linq.Enumerable.Empty<T>().GetEnumerator();\r\n            return GetComponentsOnTarg(_container, _includeStatesOnContainer).GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n\r\n        public static T[] GetComponentsOnTarg(GameObject container, bool includeComponentsOnContainer)\r\n        {\r\n            using (var set = com.spacepuppy.Collections.TempCollection.GetSet<T>())\r\n            {\r\n                GetComponentsOnTarg(container, set, includeComponentsOnContainer);\r\n                return set.ToArray();\r\n            }\r\n        }\r\n\r\n        public static void GetComponentsOnTarg(GameObject container, ICollection<T> coll, bool includeComponentsOnContainer)\r\n        {\r\n            if (includeComponentsOnContainer)\r\n            {\r\n                ComponentUtil.GetComponentsAlt<T>(container, coll);\r\n            }\r\n\r\n            for (int i = 0; i < container.transform.childCount; i++)\r\n            {\r\n                ComponentUtil.GetComponentsAlt<T>(container.transform.GetChild(i), coll);\r\n            }\r\n        }\r\n\r\n        public static TSub[] GetComponentsOnTarg<TSub>(GameObject container, bool includeComponentsOnContainer) where TSub : class, T\r\n        {\r\n            using (var set = com.spacepuppy.Collections.TempCollection.GetSet<TSub>())\r\n            {\r\n                if (includeComponentsOnContainer)\r\n                {\r\n                    ComponentUtil.GetComponentsAlt<TSub>(container, set);\r\n                }\r\n\r\n                for (int i = 0; i < container.transform.childCount; i++)\r\n                {\r\n                    ComponentUtil.GetComponentsAlt<TSub>(container.transform.GetChild(i), set);\r\n                }\r\n\r\n                return set.ToArray();\r\n            }\r\n        }\r\n\r\n        public static T[] GetComponentsOnTarg(System.Type tp, GameObject container, bool includeComponentsOnContainer)\r\n        {\r\n            if (!TypeUtil.IsType(tp, typeof(T))) throw new TypeArgumentMismatchException(tp, typeof(T), \"tp\");\r\n\r\n            using (var set = com.spacepuppy.Collections.TempCollection.GetSet<T>())\r\n            {\r\n                System.Func<Component, T> filter = (c) =>\r\n                {\r\n                    if (object.ReferenceEquals(c, null)) return null;\r\n\r\n                    if (tp.IsAssignableFrom(c.GetType())) return c as T;\r\n                    else return null;\r\n                };\r\n\r\n                if (includeComponentsOnContainer)\r\n                {\r\n                    ComponentUtil.GetComponents<T>(container, set, filter);\r\n                }\r\n\r\n                for (int i = 0; i < container.transform.childCount; i++)\r\n                {\r\n                    ComponentUtil.GetComponents<T>(container.transform.GetChild(i), set, filter);\r\n                }\r\n\r\n                return set.ToArray();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/StateMachine/StateChangedEventArgs.cs",
    "content": "﻿using System;\r\n\r\nnamespace com.spacepuppy.StateMachine\r\n{\r\n    public delegate void StateChangedEventHandler<T>(object sender, StateChangedEventArgs<T> e);\r\n    \r\n    public class StateChangedEventArgs<T> : EventArgs\r\n    {\r\n\r\n        private T _fromState;\r\n        private T _toState;\r\n\r\n        public StateChangedEventArgs(T fromState, T toState)\r\n        {\r\n            _fromState = fromState;\r\n            _toState = toState;\r\n        }\r\n\r\n        public T FromState { get { return _fromState; } }\r\n\r\n        public T ToState { get { return _toState; } }\r\n\r\n        public void Reset(T fromState, T toState)\r\n        {\r\n            _fromState = fromState;\r\n            _toState = toState;\r\n        }\r\n\r\n        public void Reset()\r\n        {\r\n            _fromState = default(T);\r\n            _toState = default(T);\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/StateMachine/StateMachine.cs",
    "content": "﻿using System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.StateMachine\r\n{\r\n\r\n    /// <summary>\r\n    /// Acts as a basic base state machine that manages a single state at a time. All one must do is wire up the triggers.\r\n    /// </summary>\r\n    public class StateMachine<T> : IStateMachine<T> where T : class\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private IStateSupplier<T> _states;\r\n        private T _current;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public StateMachine(IStateSupplier<T> supplier)\r\n        {\r\n            if (supplier == null) throw new System.ArgumentNullException(\"supplier\");\r\n            _states = supplier;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IStateSupplier<T> StateSupplier { get { return _states; } }\r\n\r\n        #endregion\r\n\r\n        #region IStateMachine Interface\r\n\r\n        public event StateChangedEventHandler<T> StateChanged;\r\n        protected void OnStateChanged(StateChangedEventArgs<T> e)\r\n        {\r\n            if (this.StateChanged != null) this.StateChanged(this, e);\r\n        }\r\n\r\n        public T Current { get { return _current; } }\r\n\r\n        public bool Contains(T state)\r\n        {\r\n            return _states.Contains(state);\r\n        }\r\n\r\n        public T ChangeState(T newState)\r\n        {\r\n            if (object.Equals(newState, _current)) return _current;\r\n\r\n            var oldState = _current;\r\n            _current = newState;\r\n\r\n            this.OnStateChanged(new StateChangedEventArgs<T>(oldState, newState));\r\n\r\n            return _current;\r\n        }\r\n\r\n        public void GetStates(ICollection<T> coll)\r\n        {\r\n            _states.GetStates(coll);\r\n        }\r\n        \r\n        public void Foreach(System.Action<T> callback)\r\n        {\r\n            _states.Foreach(callback);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public IEnumerator<T> GetEnumerator()\r\n        {\r\n            return _states.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _states.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Factory\r\n\r\n        public static StateMachine<T> CreateFromComponentSource(UnityEngine.GameObject source)\r\n        {\r\n            return new StateMachine<T>(new ComponentStateSupplier<T>(source));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Create a ParentComponentStateSupplier\r\n        /// </summary>\r\n        /// <param name=\"source\"></param>\r\n        /// <param name=\"includeStatesOnContainer\"></param>\r\n        /// <param name=\"isStatic\">Set true if the hierarchy doesn't change (a changing hierarchy requires extra processing and is slower)</param>\r\n        /// <returns></returns>\r\n        public static StateMachine<T> CreateFromParentComponentSource(UnityEngine.GameObject source, bool includeStatesOnContainer, bool isStatic)\r\n        {\r\n            return new StateMachine<T>(new ParentComponentStateSupplier<T>(source, includeStatesOnContainer, isStatic));\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/StateMachine/TypedStateMachine.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.StateMachine\r\n{\r\n\r\n    /// <summary>\r\n    /// Acts as a base state machine that only needs triggers wired up. The states are type driven and only one state of a given type can exist for that type.\r\n    /// </summary>\r\n    /// <typeparam name=\"TBase\"></typeparam>\r\n    public class TypedStateMachine<T> : ITypedStateMachine<T> where T : class\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        private ITypedStateSupplier<T> _states;\r\n        private T _current;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TypedStateMachine(ITypedStateSupplier<T> supplier)\r\n        {\r\n            if (supplier == null) throw new System.ArgumentNullException(\"supplier\");\r\n            _states = supplier;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ITypedStateSupplier<T> StateSupplier { get { return _states; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void GotoNullState()\r\n        {\r\n            if (_current == null) return;\r\n\r\n            this.ChangeState((T)null);\r\n        }\r\n\r\n        private T ChangeState_Imp(T newState)\r\n        {\r\n            if (object.Equals(newState, _current)) return _current;\r\n\r\n            var oldState = _current;\r\n            _current = newState;\r\n\r\n            this.OnStateChanged(new StateChangedEventArgs<T>(oldState, newState));\r\n\r\n            return _current;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITypedStateMachine Interface\r\n\r\n        public bool Contains<TSub>() where TSub : class, T\r\n        {\r\n            return _states.Contains<TSub>();\r\n        }\r\n\r\n        public bool Contains(System.Type tp)\r\n        {\r\n            return _states.Contains(tp);\r\n        }\r\n\r\n        public TSub GetState<TSub>() where TSub : class, T\r\n        {\r\n            return _states.GetState<TSub>();\r\n        }\r\n\r\n        public T GetState(System.Type tp)\r\n        {\r\n            return _states.GetState(tp);\r\n        }\r\n\r\n        public TSub ChangeState<TSub>() where TSub : class, T\r\n        {\r\n            var newState = this.GetState<TSub>();\r\n            return this.ChangeState_Imp(newState) as TSub;\r\n        }\r\n\r\n        public T ChangeState(System.Type tp)\r\n        {\r\n            var newState = this.GetState(tp);\r\n            return this.ChangeState_Imp(newState);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IStateMachine Interface\r\n\r\n        public event StateChangedEventHandler<T> StateChanged;\r\n        protected void OnStateChanged(StateChangedEventArgs<T> e)\r\n        {\r\n            if (this.StateChanged != null) this.StateChanged(this, e);\r\n        }\r\n\r\n        public T Current\r\n        {\r\n            get { return _current; }\r\n        }\r\n\r\n        public bool Contains(T state)\r\n        {\r\n            return _states.Contains(state);\r\n        }\r\n\r\n        public T ChangeState(T newState)\r\n        {\r\n            if (newState != null && !_states.Contains(newState)) throw new ArgumentException(\"State is not a member of this StateMachine.\");\r\n            return this.ChangeState_Imp(newState);\r\n        }\r\n\r\n        public void GetStates(ICollection<T> coll)\r\n        {\r\n            _states.GetStates(coll);\r\n        }\r\n        \r\n        public void Foreach(System.Action<T> callback)\r\n        {\r\n            _states.Foreach(callback);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public IEnumerator<T> GetEnumerator()\r\n        {\r\n            return _states.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _states.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Static Factory\r\n\r\n        public static TypedStateMachine<T> CreateFromComponentSource(UnityEngine.GameObject source)\r\n        {\r\n            return new TypedStateMachine<T>(new ComponentStateSupplier<T>(source));\r\n        }\r\n\r\n        public static TypedStateMachine<T> CreateFromParentComponentSource(UnityEngine.GameObject source, bool includeStatesOnContainer, bool isStatic)\r\n        {\r\n            return new TypedStateMachine<T>(new ParentComponentStateSupplier<T>(source, includeStatesOnContainer, isStatic));\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        #endregion\r\n\r\n    }\r\n    \r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/TagMask.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Project;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    [System.Serializable()]\r\n    public class TagMask : ICollection<string>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private bool _intersectAll = true;\r\n        [SerializeField()]\r\n        private List<string> _tags = new List<string>();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TagMask()\r\n        {\r\n\r\n        }\r\n\r\n        public TagMask(bool intersectsAll)\r\n        {\r\n            _intersectAll = intersectsAll;\r\n        }\r\n\r\n        public TagMask(params string[] tags)\r\n        {\r\n            foreach (var t in tags)\r\n            {\r\n                this.Add(t);\r\n            }\r\n        }\r\n\r\n        public TagMask(IEnumerable<string> tags)\r\n        {\r\n            if (tags == null) throw new System.ArgumentNullException(\"tags\");\r\n            foreach (var t in tags)\r\n            {\r\n                this.Add(t);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool IntersectAll\r\n        {\r\n            get { return _intersectAll; }\r\n            set\r\n            {\r\n                _intersectAll = value;\r\n                if (_intersectAll) _tags.Clear();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public bool Intersects(GameObject go)\r\n        {\r\n            if (_intersectAll) return true;\r\n            return go.HasTag(_tags);\r\n        }\r\n\r\n        public bool Intersects(Component c)\r\n        {\r\n            if (_intersectAll) return true;\r\n            return c.HasTag(_tags);\r\n        }\r\n\r\n        public bool Intersects(string tag)\r\n        {\r\n            if (_intersectAll) return true;\r\n            return _tags.Contains(tag);\r\n        }\r\n\r\n        public bool Intersects(params string[] tags)\r\n        {\r\n            if (_intersectAll) return true;\r\n            return _tags.ContainsAny(tags);\r\n        }\r\n\r\n        public bool Intersects(IEnumerable<string> tags)\r\n        {\r\n            if (_intersectAll) return true;\r\n            return _tags.ContainsAny(tags);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        public int Count\r\n        {\r\n            get { return _tags.Count; }\r\n        }\r\n\r\n        public void Add(string tag)\r\n        {\r\n            if (_intersectAll) return;\r\n            if (!MultiTag.IsValidTag(tag)) return;\r\n\r\n            if (!_tags.Contains(tag))\r\n            {\r\n                _tags.Add(tag);\r\n                if (_tags.SimilarTo(TagData.Tags))\r\n                {\r\n                    _tags.Clear();\r\n                    _intersectAll = true;\r\n                }\r\n            }\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _tags.Clear();\r\n            _intersectAll = false;\r\n        }\r\n\r\n        public bool Remove(string tag)\r\n        {\r\n            if (_intersectAll)\r\n            {\r\n                if (!MultiTag.IsValidTag(tag)) return false;\r\n                _tags.AddRange(TagData.Tags);\r\n                _tags.Remove(tag);\r\n                _intersectAll = false;\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return _tags.Remove(tag);\r\n            }\r\n        }\r\n        bool ICollection<string>.Contains(string item)\r\n        {\r\n            return this.Intersects(item);\r\n        }\r\n\r\n        void ICollection<string>.CopyTo(string[] array, int arrayIndex)\r\n        {\r\n            if (_tags != null) _tags.CopyTo(array, arrayIndex);\r\n        }\r\n\r\n        bool ICollection<string>.IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        IEnumerator<string> IEnumerable<string>.GetEnumerator()\r\n        {\r\n            if (_intersectAll) return TagData.Tags.GetEnumerator();\r\n            return (_tags != null) ? (_tags as IEnumerable<string>).GetEnumerator() : Enumerable.Empty<string>().GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            if (_intersectAll) return TagData.Tags.GetEnumerator();\r\n            return (_tags != null) ? _tags.GetEnumerator() : Enumerable.Empty<string>().GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/TempEventArgs.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// These are temporary event args that avoid gc when calling an event that needs to include a single value with it, \r\n    /// while still conforming to the traditional Microsoft (sender,eventArgs) format.\r\n    /// </summary>\r\n    public sealed class TempEventArgs : EventArgs\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private object _value;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private TempEventArgs(object value)\r\n        {\r\n            _value = value;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public object Value\r\n        {\r\n            get { return _value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Multiton Reference\r\n\r\n        private static int _cacheLimit = 100;\r\n        public static int CacheLimit\r\n        {\r\n            get { return _cacheLimit; }\r\n            set { _cacheLimit = value; }\r\n        }\r\n\r\n        private static Stack<TempEventArgs> _args = new Stack<TempEventArgs>();\r\n\r\n        public static TempEventArgs Create(object value)\r\n        {\r\n            lock(_args)\r\n            {\r\n                if(_args.Count > 0)\r\n                {\r\n                    var e = _args.Pop();\r\n                    e._value = value;\r\n                    return e;\r\n                }\r\n            }\r\n\r\n            return new TempEventArgs(value);\r\n        }\r\n\r\n        public static void Release(TempEventArgs e)\r\n        {\r\n            lock(_args)\r\n            {\r\n                if(_args.Count < _cacheLimit)\r\n                {\r\n                    e._value = null;\r\n                    _args.Push(e);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/TetherJoint.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Tween;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    public class TetherJoint : SPComponent\r\n    {\r\n\r\n        public enum JointDampingStyle\r\n        {\r\n            Ease,\r\n            Linear,\r\n            Elastic\r\n        }\r\n        \r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"_target\")]\r\n        private Transform _linkTarget;\r\n\r\n        [SerializeField]\r\n        [EnumPopupExcluding(new int[] { (int)UpdateSequence.None })]\r\n        private UpdateSequence _updateMode = UpdateSequence.Update;\r\n\r\n        [SerializeField]\r\n        private Constraint _constraint = Constraint.All;\r\n\r\n        [SerializeField]\r\n        private bool _doPositionDamping;\r\n        [SerializeField]\r\n        private JointDampingStyle _positionDampingStyle;\r\n        [SerializeField]\r\n        private float _positionDampingStrength;\r\n        [SerializeField]\r\n        private bool _doRotationDamping;\r\n        [SerializeField]\r\n        private JointDampingStyle _rotationDampingStyle;\r\n        [SerializeField]\r\n        private float _rotationDampingStrength;\r\n\r\n\r\n        [System.NonSerialized]\r\n        private RadicalCoroutine _updateRoutine;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Start()\r\n        {\r\n            base.Start();\r\n\r\n            _updateRoutine = this.StartRadicalCoroutine(this.DoUpdateRoutine(), RadicalCoroutineDisableMode.Pauses);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Transform LinkTarget\r\n        {\r\n            get { return _linkTarget; }\r\n            set { _linkTarget = value; }\r\n        }\r\n\r\n        public UpdateSequence UpdateMode\r\n        {\r\n            get { return _updateMode; }\r\n            set { _updateMode = value; }\r\n        }\r\n\r\n        public Constraint Constraint\r\n        {\r\n            get { return _constraint; }\r\n            set { _constraint = value; }\r\n        }\r\n\r\n        public bool DoPositionDamping\r\n        {\r\n            get { return _doPositionDamping; }\r\n            set { _doPositionDamping = value; }\r\n        }\r\n\r\n        public TetherJoint.JointDampingStyle PositionDampingStyle\r\n        {\r\n            get { return _positionDampingStyle; }\r\n            set { _positionDampingStyle = value; }\r\n        }\r\n\r\n        public float PositionDampingStrength\r\n        {\r\n            get { return _positionDampingStrength; }\r\n            set { _positionDampingStrength = value; }\r\n        }\r\n\r\n        public bool DoRotationDamping\r\n        {\r\n            get { return _doRotationDamping; }\r\n            set { _doRotationDamping = value; }\r\n        }\r\n\r\n        public TetherJoint.JointDampingStyle RotationDampingStyle\r\n        {\r\n            get { return _rotationDampingStyle; }\r\n            set { _rotationDampingStyle = value; }\r\n        }\r\n\r\n        public float RotationDampingStrength\r\n        {\r\n            get { return _rotationDampingStrength; }\r\n            set { _rotationDampingStrength = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private System.Collections.IEnumerator DoUpdateRoutine()\r\n        {\r\n            while(true)\r\n            {\r\n                if(_linkTarget != null)\r\n                {\r\n                    Constraint c;\r\n                    var trans = this.transform;\r\n\r\n                    //constrain position\r\n                    c = (_constraint & Constraint.Position);\r\n                    if (c == Constraint.Position)\r\n                    {\r\n                        if (_doPositionDamping)\r\n                        {\r\n                            switch (_positionDampingStyle)\r\n                            {\r\n                                case JointDampingStyle.Ease:\r\n                                    trans.position = Vector3.Lerp(trans.position, _linkTarget.position, Time.deltaTime * _positionDampingStrength);\r\n                                    break;\r\n                                case JointDampingStyle.Linear:\r\n                                    trans.position = Vector3.MoveTowards(trans.position, _linkTarget.position, Time.deltaTime * _positionDampingStrength);\r\n                                    break;\r\n                                case JointDampingStyle.Elastic:\r\n                                    {\r\n                                        var tpos = _linkTarget.position;\r\n                                        var pos = trans.position;\r\n                                        if (_positionDampingStrength < 0.0001f)\r\n                                        {\r\n                                            trans.position = tpos;\r\n                                            break;\r\n                                        }\r\n\r\n                                        float t = 1f - Mathf.Clamp01(1f / _positionDampingStrength) * 0.99f;\r\n                                        tpos += (tpos - pos);\r\n                                        trans.position = Vector3.LerpUnclamped(pos, tpos, t);\r\n                                    }\r\n                                    break;\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            trans.position = _linkTarget.position;\r\n                        }\r\n                    }\r\n                    else if(c != 0)\r\n                    {\r\n                        Vector3 pos = trans.position;\r\n                        Vector3 tpos = _linkTarget.position;\r\n\r\n                        if ((_constraint & Constraint.XPosition) != 0)\r\n                        {\r\n                            if (_doPositionDamping)\r\n                                pos.x = DampFloat(pos.x, tpos.x, Time.deltaTime, _positionDampingStrength, _positionDampingStyle);\r\n                            else\r\n                                pos.x = tpos.x;\r\n                        }\r\n                        if ((_constraint & Constraint.YPosition) != 0)\r\n                        {\r\n                            if (_doPositionDamping)\r\n                                pos.y = DampFloat(pos.y, tpos.y, Time.deltaTime, _positionDampingStrength, _positionDampingStyle);\r\n                            else\r\n                                pos.y = tpos.y;\r\n                        }\r\n                        if ((_constraint & Constraint.ZPosition) != 0)\r\n                        {\r\n                            if (_doPositionDamping)\r\n                                pos.z = DampFloat(pos.z, tpos.z, Time.deltaTime, _positionDampingStrength, _positionDampingStyle);\r\n                            else\r\n                                pos.z = tpos.z;\r\n                        }\r\n\r\n                        trans.position = pos;\r\n                    }\r\n\r\n                    //constrain rotation\r\n                    c = (_constraint & Constraint.Rotation);\r\n                    if (c == Constraint.Rotation)\r\n                    {\r\n                        if (_doRotationDamping)\r\n                        {\r\n                            switch (_positionDampingStyle)\r\n                            {\r\n                                case JointDampingStyle.Ease:\r\n                                    trans.rotation = Quaternion.Slerp(trans.rotation, _linkTarget.rotation, Time.deltaTime * _positionDampingStrength);\r\n                                    break;\r\n                                case JointDampingStyle.Linear:\r\n                                    trans.rotation = Quaternion.RotateTowards(trans.rotation, _linkTarget.rotation, Time.deltaTime * _positionDampingStrength);\r\n                                    break;\r\n                                case JointDampingStyle.Elastic:\r\n                                    {\r\n                                        var tpos = _linkTarget.rotation;\r\n                                        var pos = trans.rotation;\r\n                                        if (_positionDampingStrength < 0.0001f)\r\n                                        {\r\n                                            trans.rotation = tpos;\r\n                                            break;\r\n                                        }\r\n\r\n                                        float t = 1f - Mathf.Clamp01(1f / _positionDampingStrength) * 0.99f;\r\n                                        tpos *= QuaternionUtil.FromToRotation(pos, tpos);\r\n                                        trans.rotation = Quaternion.SlerpUnclamped(pos, tpos, t);\r\n                                    }\r\n                                    break;\r\n                            }\r\n                        }\r\n                        else\r\n                            trans.rotation = _linkTarget.rotation;\r\n                    }\r\n                    else if(c != 0)\r\n                    {\r\n                        var rot = trans.eulerAngles;\r\n                        var targRot = _linkTarget.eulerAngles;\r\n                        if ((_constraint & Constraint.XRotation) != 0)\r\n                        {\r\n                            if (_doRotationDamping)\r\n                                rot.x = DampFloat(rot.x, targRot.x, Time.deltaTime, _rotationDampingStrength, _rotationDampingStyle);\r\n                            else\r\n                                rot.x = targRot.x;\r\n                        }\r\n                        if ((_constraint & Constraint.YRotation) != 0)\r\n                        {\r\n                            if (_doRotationDamping)\r\n                                rot.y = DampFloat(rot.y, targRot.y, Time.deltaTime, _rotationDampingStrength, _rotationDampingStyle);\r\n                            else\r\n                                rot.y = targRot.y;\r\n                        }\r\n                        if ((_constraint & Constraint.ZRotation) != 0)\r\n                        {\r\n                            if (_doRotationDamping)\r\n                                rot.z = DampFloat(rot.z, targRot.z, Time.deltaTime, _rotationDampingStrength, _rotationDampingStyle);\r\n                            else\r\n                                rot.z = targRot.z;\r\n                        }\r\n                        trans.eulerAngles = rot;\r\n                    }\r\n                }\r\n                \r\n                switch(_updateMode)\r\n                {\r\n                    case UpdateSequence.None:\r\n                    case UpdateSequence.Update:\r\n                        yield return null;\r\n                        break;\r\n                    case UpdateSequence.FixedUpdate:\r\n                        yield return RadicalCoroutine.WaitForFixedUpdate;\r\n                        break;\r\n                    case UpdateSequence.LateUpdate:\r\n                        yield return WaitForLateUpdate.Create();\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n        private static float DampFloat(float a, float b, float dt, float strength, JointDampingStyle style)\r\n        {\r\n            switch(style)\r\n            {\r\n                case JointDampingStyle.Ease:\r\n                    return Mathf.Lerp(a, b, dt * strength);\r\n                case JointDampingStyle.Linear:\r\n                    return Mathf.MoveTowards(a, b, dt * strength);\r\n                case JointDampingStyle.Elastic:\r\n                    {\r\n                        if (strength < 0.0001f) return b;\r\n\r\n                        float t = 1f - Mathf.Clamp01(1f / strength) * 0.99f;\r\n                        b += (b - a);\r\n                        return Mathf.LerpUnclamped(a, b, t);\r\n                    }\r\n                default:\r\n                    return b;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Timers/BulkTimer.cs",
    "content": "﻿using System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Timers\r\n{\r\n\r\n    public class BulkTimer : ITimer\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private bool _stopWhenEmpty = true;\r\n\r\n        //NOTE - we use a double for better precission over long periods of time\r\n        private double _currentTime = 0d;\r\n        private List<TimerEntry> _lst = new List<TimerEntry>();\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool StopWhenEmpty\r\n        {\r\n            get { return _stopWhenEmpty; }\r\n            set { _stopWhenEmpty = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Add(float dur, System.Action callback)\r\n        {\r\n            if (callback == null) throw new System.ArgumentNullException(\"callback\");\r\n\r\n            double endTime = _currentTime + dur;\r\n            var entry = new TimerEntry(endTime, callback);\r\n\r\n            if(_lst.Count > 0 && endTime < _lst.Last().EndTime)\r\n            {\r\n                for (int i = 0; i < _lst.Count; i++)\r\n                {\r\n                    if (endTime < _lst[i].EndTime)\r\n                    {\r\n                        _lst.Insert(i, entry);\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n\r\n            _lst.Add(entry);\r\n        }\r\n\r\n        public void Reset()\r\n        {\r\n            _lst.Clear();\r\n            _currentTime = 0d;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITimer Interface\r\n\r\n        public bool Update(float dt)\r\n        {\r\n            _currentTime += (double)dt;\r\n\r\n            while(_lst.Count > 0 && _currentTime >= _lst[0].EndTime)\r\n            {\r\n                var entry = _lst[0];\r\n                _lst.RemoveAt(0);\r\n                entry.Callback();\r\n            }\r\n\r\n            if(_stopWhenEmpty)\r\n            {\r\n                return _lst.Count > 0;\r\n            }\r\n            else\r\n            {\r\n                return true;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private struct TimerEntry\r\n        {\r\n            public double EndTime;\r\n            public System.Action Callback;\r\n\r\n            public TimerEntry(double endTime, System.Action callback)\r\n            {\r\n                this.EndTime = endTime;\r\n                this.Callback = callback;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Timers/DelayTimer.cs",
    "content": "﻿namespace com.spacepuppy.Timers\r\n{\r\n\r\n    public class DelayTimer : ITimer\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private float _delay;\r\n        private float _t;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public DelayTimer()\r\n        {\r\n\r\n        }\r\n\r\n        public DelayTimer(float delay)\r\n        {\r\n            _delay = delay;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float Delay { get { return _delay; } set { _delay = value; } }\r\n\r\n        public bool Blocking { get { return _t > 0f; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Set()\r\n        {\r\n            _t = _delay;\r\n        }\r\n\r\n        public void Stop()\r\n        {\r\n            _t = 0f;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region ITimer Interface\r\n\r\n        public bool Update(float dt)\r\n        {\r\n            if(_t > 0f)\r\n            {\r\n                _t -= dt;\r\n                if (_t < 0f) _t = 0f;\r\n                return _t > 0f;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/Timers/GameTimers.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Timers\r\n{\r\n    public static class GameTimers\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private static TimerCollection _activeTimers = new TimerCollection();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        static GameTimers()\r\n        {\r\n            GameLoopEntry.OnUpdate += OnUpdate;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Event Handlers\r\n\r\n        private static void OnUpdate(object sender, System.EventArgs e)\r\n        {\r\n            _activeTimers.Update(Time.deltaTime);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public static void Start(ITimer t)\r\n        {\r\n            _activeTimers.Start(t);\r\n        }\r\n\r\n        public static bool IsActive(ITimer t)\r\n        {\r\n            return _activeTimers.IsActive(t);\r\n        }\r\n\r\n        public static void Stop(ITimer t)\r\n        {\r\n            _activeTimers.Stop(t);\r\n        }\r\n\r\n        public static void CreateGypsyTimer(float delay, System.Action<Timer> complete)\r\n        {\r\n            if (complete == null) throw new System.ArgumentNullException(\"complete\", \"complete event handler must be non-null\");\r\n\r\n            var t = new Timer(delay, 0);\r\n            t.TimerComplete += complete;\r\n            Start(t);\r\n        }\r\n\r\n        public static void CreateGypsyTimer(float delay, int repeatCount, System.Action<Timer> complete, System.Action<Timer> count)\r\n        {\r\n            if (complete == null) throw new System.ArgumentNullException(\"complete\", \"complete event handler must be non-null\");\r\n\r\n            var t = new Timer(delay, repeatCount);\r\n            t.TimerComplete += complete;\r\n            if (count != null) t.TimerCount += count;\r\n            Start(t);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}"
  },
  {
    "path": "SpacepuppyBase/Timers/ITimer.cs",
    "content": "﻿namespace com.spacepuppy.Timers\r\n{\r\n    public interface ITimer\r\n    {\r\n\r\n        /// <summary>\r\n        /// Returns true if still running.\r\n        /// </summary>\r\n        /// <param name=\"dt\"></param>\r\n        /// <returns></returns>\r\n        bool Update(float dt);\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Timers/Scheduler.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Timers\r\n{\r\n\r\n    public enum SchedulingStyle\r\n    {\r\n        FromZero = 0,\r\n        FromNow = 1,\r\n        FromRelative = 2\r\n    }\r\n\r\n    public class Scheduler : ICollection<ScheduledEvent>\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private ITimeSupplier _time;\r\n\r\n        private int _nodeCount;\r\n        private ScheduledEvent _firstNode;\r\n        private int _version;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public Scheduler(ITimeSupplier time)\r\n        {\r\n            if (time == null) throw new System.ArgumentNullException(\"time\");\r\n            _time = time;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ITimeSupplier TimeSupplier\r\n        {\r\n            get { return _time; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Reschedule an event that was previously cancelled based on the time that schedule was initially started. \r\n        /// This is useful for saving and loading scheduled events. You can serialize the start time, and calculate \r\n        /// and restart the event based on that.\r\n        /// </summary>\r\n        /// <param name=\"style\"></param>\r\n        /// <param name=\"originalStartTime\"></param>\r\n        /// <param name=\"time\"></param>\r\n        /// <param name=\"repeatInterval\"></param>\r\n        /// <param name=\"repeatCount\"></param>\r\n        /// <param name=\"callback\"></param>\r\n        /// <returns>Returns the ScheduledEvent toke. Will return null if no event will occur, for example, if the current time is pass the time the event would have occurred.</returns>\r\n        public ScheduledEvent Reschedule(SchedulingStyle style, double originalStartTime, double time, double repeatInterval, int repeatCount, System.Action<ScheduledEvent> callback)\r\n        {\r\n            switch(style)\r\n            {\r\n                case SchedulingStyle.FromZero:\r\n                    {\r\n                        //calculate next time to schedule at\r\n                        var currentTime = _time.TotalPrecise;\r\n                        var next = System.Math.Ceiling((currentTime - time) / repeatInterval) * repeatInterval + time;\r\n\r\n\r\n                        //determine how many repeats are left based on the _startTime, this is necessary incase this was loaded and started again\r\n                        if (repeatCount < 0)\r\n                        {\r\n                            repeatCount = -1; //negative is infinite\r\n                        }\r\n                        else\r\n                        {\r\n                            repeatCount = repeatCount - (int)System.Math.Round((next - time) / repeatInterval);\r\n                            if (repeatCount < 0) return null; //completed, so don't start\r\n                        }\r\n\r\n                        this.Schedule(next, repeatInterval, repeatCount, callback);\r\n                    }\r\n                    break;\r\n                case SchedulingStyle.FromNow:\r\n                    {\r\n                        //calculate next time to schedule at\r\n                        var currentTime = _time.TotalPrecise;\r\n                        var firstTime = originalStartTime + time;\r\n                        var next = System.Math.Ceiling((currentTime - firstTime) / repeatInterval) * repeatInterval + firstTime;\r\n\r\n\r\n                        //determine how many repeats are left based on the _startTime, this is necessary incase this was loaded and started again\r\n                        if (repeatCount < 0)\r\n                        {\r\n                            repeatCount = -1; //negative is infinite\r\n                        }\r\n                        else\r\n                        {\r\n                            repeatCount = repeatCount - (int)System.Math.Round((next - firstTime) / repeatInterval);\r\n                            if (repeatCount < 0) return null; //completed, so don't start\r\n                        }\r\n\r\n                        this.Schedule(next, repeatInterval, repeatCount, callback);\r\n                    }\r\n                    break;\r\n                case SchedulingStyle.FromRelative:\r\n                    {\r\n                        //calculate next time to schedule at\r\n                        var currentTime = _time.TotalPrecise;\r\n                        var next = System.Math.Ceiling((currentTime - time) / repeatInterval) * repeatInterval + time;\r\n\r\n\r\n                        //determine how many repeats are left based on the _startTime, this is necessary incase this was loaded and started again\r\n                        if (repeatCount < 0)\r\n                        {\r\n                            repeatCount = -1; //negative is infinite\r\n                        }\r\n                        else\r\n                        {\r\n                            var first = System.Math.Ceiling((originalStartTime - time) / repeatInterval) * repeatInterval + time;\r\n                            repeatCount = repeatCount - (int)System.Math.Round((next - first) / repeatInterval);\r\n                            if (repeatCount < 0) return null; //completed, so don't start\r\n                        }\r\n\r\n                        this.Schedule(next, repeatInterval, repeatCount, callback);\r\n                    }\r\n                    break;\r\n            }\r\n\r\n            return null;\r\n        }\r\n        \r\n        /// <summary>\r\n        /// Schedule an event to occur at some point in time.\r\n        /// </summary>\r\n        /// <param name=\"time\">The time of the event</param>\r\n        /// <param name=\"callback\">Callback to respond to the event</param>\r\n        /// <returns></returns>\r\n        public ScheduledEvent Schedule(double time, System.Action<ScheduledEvent> callback)\r\n        {\r\n            var ev = new ScheduledEvent(time, 0d, 0, callback);\r\n            this.Add(ev);\r\n            return ev;\r\n        }\r\n        /// <summary>\r\n        /// Create an event that occurs on some interval.\r\n        /// </summary>\r\n        /// <param name=\"time\">The time at which the interval begins counting, good for repeating intervals</param>\r\n        /// <param name=\"interval\">The interval of the event</param>\r\n        /// <param name=\"repeatCount\">Number of times to repeat, negative values are treated as infinite</param>\r\n        /// <param name=\"callback\">Callback to respond to the event</param>\r\n        /// <returns></returns>\r\n        public ScheduledEvent Schedule(double time, double interval, int repeatCount, System.Action<ScheduledEvent> callback)\r\n        {\r\n            var ev = new ScheduledEvent(time, interval, repeatCount, callback);\r\n            this.Add(ev);\r\n            return ev;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Schedule an event that raises at some duration from the current time.\r\n        /// </summary>\r\n        /// <param name=\"duration\">Amount of time from now the event occurs</param>\r\n        /// <param name=\"callback\">Callback to respond to the event</param>\r\n        /// <returns></returns>\r\n        public ScheduledEvent ScheduleFromNow(double duration, System.Action<ScheduledEvent> callback)\r\n        {\r\n            var ev = new ScheduledEvent(_time.TotalPrecise + duration, 0d, 0, callback);\r\n            this.Add(ev);\r\n            return ev;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Schedule an event that raises at some duration from the current time.\r\n        /// </summary>\r\n        /// <param name=\"duration\">Amount of time from now the first event occurs</param>\r\n        /// <param name=\"repeatFrequency\">Frequency of the event</param>\r\n        /// <param name=\"repeatCount\">Number of times the event occurs</param>\r\n        /// <param name=\"callback\">Callback to respond to the event</param>\r\n        /// <returns></returns>\r\n        public ScheduledEvent ScheduleFromNow(double duration, double repeatFrequency, int repeatCount, System.Action<ScheduledEvent> callback)\r\n        {\r\n            var ev = new ScheduledEvent(_time.TotalPrecise + duration, repeatFrequency, repeatCount, callback);\r\n            this.Add(ev);\r\n            return ev;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Schedules an event relative to current time so that it would have been at the repeated time of 'interval' of a scheduled time at 'offset'. \r\n        /// \r\n        /// For example if you wanted to schedule an event for on the half hour past the current hour. You'd pass in 30 minutes for 'firstTime' and 'hour' \r\n        /// for interval. It'll calculate the next half hour on the hour from now, and schedule an event for it.\r\n        /// </summary>\r\n        /// <param name=\"firstTime\"></param>\r\n        /// <param name=\"interval\"></param>\r\n        /// <param name=\"callback\"></param>\r\n        /// <returns></returns>\r\n        public ScheduledEvent ScheduleOnIntervalFromNow(double firstTime, double interval,  System.Action<ScheduledEvent> callback)\r\n        {\r\n            var t = Math.Ceiling((_time.TotalPrecise - firstTime) / interval) * interval + firstTime;\r\n            var ev = new ScheduledEvent(t, 0d, 0, callback);\r\n            this.Add(ev);\r\n            return ev;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Schedules an event relative to current time so that it would have been at the repeated time of 'interval' of a scheduled time at 'offset'. \r\n        /// And then repeat that interval 'repeatCount' times.\r\n        /// \r\n        /// For example if you wanted to schedule an event for on the half hour past the current hour. You'd pass in 30 minutes for 'firstTime' and 'hour' \r\n        /// for interval. It'll calculate the next half hour on the hour from now, and schedule an event for it.\r\n        /// </summary>\r\n        /// <param name=\"firstTime\"></param>\r\n        /// <param name=\"interval\"></param>\r\n        /// <param name=\"repeatCount\"></param>\r\n        /// <param name=\"callback\"></param>\r\n        /// <returns></returns>\r\n        public ScheduledEvent ScheduleOnIntervalFromNow(double firstTime, double interval, int repeatCount, System.Action<ScheduledEvent> callback)\r\n        {\r\n            var t = Math.Ceiling((_time.TotalPrecise - firstTime) / interval) * interval + firstTime;\r\n            var ev = new ScheduledEvent(t, interval, repeatCount, callback);\r\n            this.Add(ev);\r\n            return ev;\r\n        }\r\n\r\n        public void ChangeTimeSupplier(ITimeSupplier time)\r\n        {\r\n            if (time == null) throw new System.ArgumentNullException(\"time\");\r\n            if (time == _time) return;\r\n\r\n            _time = time;\r\n            _version++;\r\n            if (_firstNode == null) return;\r\n\r\n            var total = _time.TotalPrecise;\r\n            using (var lst = com.spacepuppy.Collections.TempCollection.GetList<ScheduledEvent>(_nodeCount))\r\n            {\r\n                var node = _firstNode;\r\n                _firstNode = null;\r\n                while (node != null)\r\n                {\r\n                    node._nextScheduledTime = node.GetNextScheduledTime(total);\r\n                    if (double.IsNaN(node._nextScheduledTime))\r\n                    {\r\n                        var tnode = node;\r\n                        node = node._nextNode;\r\n                        tnode._prevNode = null;\r\n                        tnode._nextNode = null;\r\n                        tnode._owner = null;\r\n                    }\r\n                    else\r\n                    {\r\n                        lst.Add(node);\r\n                    }\r\n                }\r\n\r\n                _nodeCount = lst.Count;\r\n                if (_nodeCount > 0)\r\n                {\r\n                    lst.Sort((a, b) => a._nextScheduledTime.CompareTo(b._nextScheduledTime));\r\n\r\n                    _firstNode = lst[0];\r\n                    _firstNode._prevNode = null;\r\n                    for (int i = 1; i < lst.Count; i++)\r\n                    {\r\n                        lst[i - 1]._nextNode = lst[i];\r\n                        lst[i]._prevNode = lst[i - 1];\r\n                    }\r\n                    lst[lst.Count - 1]._nextNode = null;\r\n                }\r\n            }\r\n        }\r\n\r\n        public void Update()\r\n        {\r\n            if (_firstNode == null) return;\r\n            \r\n            var total = _time.TotalPrecise;\r\n            var node = _firstNode;\r\n            while (node != null && total > node._nextScheduledTime)\r\n            {\r\n                node.Signal();\r\n                if(node.Complete)\r\n                {\r\n                    _firstNode = node._nextNode;\r\n                    if(_firstNode != null) _firstNode._prevNode = null;\r\n\r\n                    node._prevNode = null;\r\n                    node._nextNode = null;\r\n                    node._owner = null;\r\n                    _nodeCount--;\r\n                    _version++;\r\n\r\n                    node = _firstNode;\r\n                    continue;\r\n                }\r\n                else\r\n                {\r\n                    node._nextScheduledTime += node.Interval;\r\n                    if(double.IsNaN(node._nextScheduledTime) || double.IsInfinity(node._nextScheduledTime))\r\n                    {\r\n                        _firstNode = node._nextNode;\r\n                        if (_firstNode != null) _firstNode._prevNode = null;\r\n\r\n                        node._prevNode = null;\r\n                        node._nextNode = null;\r\n                        node._owner = null;\r\n                        _nodeCount--;\r\n                        _version++;\r\n\r\n                        node = _firstNode;\r\n                        continue;\r\n                    }\r\n                    else if(total < node._nextScheduledTime)\r\n                    {\r\n                        //set first node to next\r\n                        _firstNode = node._nextNode;\r\n                        if (_firstNode != null) _firstNode._prevNode = null;\r\n\r\n                        //reinsert\r\n                        node._nextNode = null;\r\n                        this.Insert(node);\r\n\r\n                        //set next test\r\n                        if (_firstNode == node)\r\n                            break;\r\n                        else\r\n                            node = _firstNode;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        private void Insert(ScheduledEvent item)\r\n        {\r\n            _version++;\r\n\r\n            if (_firstNode == null)\r\n            {\r\n                _firstNode = item;\r\n                _firstNode._prevNode = null;\r\n                _firstNode._nextNode = null;\r\n                _nodeCount = 1;\r\n                return;\r\n            }\r\n\r\n            var node = _firstNode;\r\n            if (item._nextScheduledTime < node._nextScheduledTime)\r\n            {\r\n                //placed at front of list\r\n                _firstNode = item;\r\n                _firstNode._nextNode = node;\r\n                node._prevNode = _firstNode;\r\n                return;\r\n            }\r\n\r\n            while (node._nextNode != null)\r\n            {\r\n                if (item._nextScheduledTime < node._nextNode._nextScheduledTime)\r\n                {\r\n                    //inserted in middle of list\r\n                    node._nextNode._prevNode = item;\r\n                    item._nextNode = node._nextNode;\r\n                    item._prevNode = node;\r\n                    node._nextNode = item;\r\n                    return;\r\n                }\r\n\r\n                node = node._nextNode;\r\n            }\r\n\r\n            //added to end of list\r\n            node._nextNode = item;\r\n            item._prevNode = node;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n        \r\n        public void Add(ScheduledEvent item)\r\n        {\r\n            if (item._owner == this) return;\r\n            if (item._owner != null) throw new System.ArgumentException(\"Can not add an event that is a member of another Scheduler.\");\r\n\r\n            item._nextScheduledTime = item.GetNextScheduledTime(_time.TotalPrecise);\r\n            if (double.IsNaN(item._nextScheduledTime)) return;\r\n\r\n            _nodeCount++;\r\n            item._owner = this;\r\n            this.Insert(item);\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            var node = _firstNode;\r\n            ScheduledEvent lnode;\r\n            while(node != null)\r\n            {\r\n                lnode = node;\r\n                node = lnode._nextNode;\r\n                lnode._owner = null;\r\n                lnode._prevNode = null;\r\n                lnode._nextNode = null;\r\n            }\r\n            _nodeCount = 0;\r\n            _version++;\r\n        }\r\n\r\n        public bool Contains(ScheduledEvent item)\r\n        {\r\n            return item._owner == this;\r\n        }\r\n\r\n        public void CopyTo(ScheduledEvent[] array, int arrayIndex)\r\n        {\r\n            var e = this.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                array[arrayIndex] = e.Current;\r\n                arrayIndex++;\r\n            }\r\n        }\r\n\r\n        public int Count\r\n        {\r\n            get { return _nodeCount; }\r\n        }\r\n\r\n        bool ICollection<ScheduledEvent>.IsReadOnly\r\n        {\r\n            get { return false; }\r\n        }\r\n\r\n        public bool Remove(ScheduledEvent item)\r\n        {\r\n            if (item == null) return false;\r\n            if (item._owner != this) return false;\r\n\r\n            var pnode = item._prevNode;\r\n            var nnode = item._nextNode;\r\n            item._owner = null;\r\n            item._prevNode = null;\r\n            item._nextNode = null;\r\n            if (pnode == null)\r\n                _firstNode = nnode;\r\n            else\r\n                pnode._nextNode = nnode;\r\n\r\n            _nodeCount--;\r\n            _version++;\r\n            return true;\r\n        }\r\n\r\n        public Enumerator GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator<ScheduledEvent> IEnumerable<ScheduledEvent>.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public struct Enumerator : IEnumerator<ScheduledEvent>\r\n        {\r\n\r\n            private Scheduler _scheduler;\r\n            private ScheduledEvent _current;\r\n            private int _version;\r\n\r\n            public Enumerator(Scheduler scheduler)\r\n            {\r\n                _scheduler = scheduler;\r\n                _current = null;\r\n                _version = _scheduler._version;\r\n            }\r\n\r\n            public ScheduledEvent Current\r\n            {\r\n                get { return _current; }\r\n            }\r\n\r\n            object System.Collections.IEnumerator.Current\r\n            {\r\n                get { return _current; }\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                if (_scheduler == null) return false;\r\n                if (_scheduler._version != _version) return false;\r\n\r\n                if(_current == null)\r\n                {\r\n                    _current = _scheduler._firstNode;\r\n                }\r\n                else\r\n                {\r\n                    _current = _current._nextNode;\r\n                }\r\n\r\n                if(_current == null)\r\n                {\r\n                    _version = _scheduler._version - 1;\r\n                    return false;\r\n                }\r\n                else\r\n                {\r\n                    return true;\r\n                }\r\n            }\r\n\r\n            public void Reset()\r\n            {\r\n                _current = null;\r\n                if (_scheduler != null) _version = _scheduler._version;\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                _scheduler = null;\r\n                _current = null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    public class ScheduledEvent : IDisposable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private double _time;\r\n        private double _interval;\r\n        private int _repeatCount;\r\n        private int _currentCount;\r\n        private System.Action<ScheduledEvent> _callback;\r\n\r\n        internal Scheduler _owner;\r\n        internal ScheduledEvent _prevNode;\r\n        internal ScheduledEvent _nextNode;\r\n        internal double _nextScheduledTime;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        /// <summary>\r\n        /// Creates a Scheduled Event\r\n        /// </summary>\r\n        /// <param name=\"time\">The time at which the interval begins counting, good for repeating intervals</param>\r\n        /// <param name=\"interval\">The interval of the event</param>\r\n        /// <param name=\"repeatCount\">Number of times to repeat, negative values are treated as infinite</param>\r\n        /// <param name=\"callback\">Callback to respond to the event</param>\r\n        public ScheduledEvent(double time, double interval, int repeatCount, System.Action<ScheduledEvent> callback)\r\n        {\r\n            _time = time;\r\n            _interval = interval;\r\n            _callback = callback;\r\n            _repeatCount = repeatCount;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region #region Properties\r\n\r\n        /// <summary>\r\n        /// The time of the scheduled event.\r\n        /// </summary>\r\n        public double Time { get { return _time; } }\r\n\r\n        /// <summary>\r\n        /// The interval after 'Time' that the event should repeat, if it repeats.\r\n        /// </summary>\r\n        public double Interval { get { return _interval; } }\r\n\r\n        /// <summary>\r\n        /// Number of times the interval should repeat before completing, values &lt 0 repeat forever.\r\n        /// </summary>\r\n        public int RepeatCount { get { return _repeatCount; } }\r\n\r\n        /// <summary>\r\n        /// Number of times the event has occurred.\r\n        /// </summary>\r\n        public int CurrentCount { get { return _currentCount; } }\r\n\r\n        /// <summary>\r\n        /// Has all the events finished.\r\n        /// </summary>\r\n        public bool Complete { get { return _repeatCount >= 0 && _currentCount > _repeatCount; } }\r\n\r\n        /// <summary>\r\n        /// The Scheduler with which this event is registered.\r\n        /// </summary>\r\n        public Scheduler Scheduler { get { return _owner; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n\r\n        public void Cancel()\r\n        {\r\n            if(_owner != null)\r\n            {\r\n                _owner.Remove(this);\r\n            }\r\n        }\r\n\r\n\r\n        public double GetNextScheduledTime()\r\n        {\r\n            double t = (_owner != null && _owner.TimeSupplier != null) ? _owner.TimeSupplier.TotalPrecise : 0d;\r\n            return GetNextScheduledTime(t);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns the next time after 'time' that this event aught to be raised.\r\n        /// </summary>\r\n        /// <param name=\"time\">The time after which to get the next scheduled time.</param>\r\n        /// <returns></returns>\r\n        public double GetNextScheduledTime(double time)\r\n        {\r\n            if (this.Complete) return double.NaN;\r\n\r\n            if (time < _time) return _time;\r\n            if (_repeatCount == 0) return double.NaN;\r\n\r\n            var t = time - _time;\r\n            int cnt = (int)Math.Floor(t / _interval);\r\n            if (_repeatCount >= 0 && cnt > _repeatCount) return double.NaN;\r\n\r\n            return _time + (_interval * (cnt + 1));\r\n        }\r\n        \r\n        protected internal virtual void Signal()\r\n        {\r\n            if (this.Complete) return;\r\n            _currentCount++;\r\n            if (_callback != null) _callback(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public void Dispose()\r\n        {\r\n            if (_owner != null)\r\n                _owner.Remove(this);\r\n\r\n            _interval = 0f;\r\n            _time = 0f;\r\n            _callback = null;\r\n            _repeatCount = 0;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Timers/StopWatch.cs",
    "content": "﻿namespace com.spacepuppy.Timers\r\n{\r\n\r\n    public class StopWatch : ITimer\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private float _currentTime;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public StopWatch()\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float CurrentTime { get { return _currentTime; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Reset()\r\n        {\r\n            _currentTime = 0f;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITimer Interface\r\n\r\n        public bool Update(float dt)\r\n        {\r\n            _currentTime += dt;\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/Timers/SystemTimers.cs",
    "content": "﻿namespace com.spacepuppy.Timers\r\n{\r\n\r\n    /// <summary>\r\n    /// Timers that operate on a system thread independent of the game thread. The update events of these timers are not thread safe with the main thread.\r\n    /// </summary>\r\n    public static class SystemTimers\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private static TimerCollection _activeTimers = new TimerCollection();\r\n        private static System.Timers.Timer _hookTimer;\r\n\r\n        #endregion\r\n        \r\n        #region CONSTRUCTOR\r\n\r\n        static SystemTimers()\r\n        {\r\n            if(!GameLoopEntry.Initialized)\r\n            {\r\n                throw new System.InvalidOperationException(\"Make sure to initialize the GameLoopEntry on the main thread before accessing SystemTimers.\");\r\n            }\r\n\r\n            _hookTimer = new System.Timers.Timer(10); //every 10 milliseconds\r\n            _hookTimer.Elapsed += OnUpdate;\r\n            _hookTimer.Start();\r\n\r\n            //GameLoopEntry.EarlyUpdate += OnUpdate;\r\n\r\n            GameLoopEntry.ApplicatinQuit += (s, e) => { if(_hookTimer != null) _hookTimer.Close(); };\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Event Handlers\r\n\r\n        private static void OnUpdate(object sender, System.EventArgs e)\r\n        {\r\n            _activeTimers.Update((float)_hookTimer.Interval / 1000f);\r\n            //_activeTimers.Update(Time.unscaledDeltaTime);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public static void Start(ITimer t)\r\n        {\r\n            if (_activeTimers.Count == 0) _hookTimer.Start();\r\n            _activeTimers.Start(t);\r\n        }\r\n\r\n        public static bool IsActive(ITimer t)\r\n        {\r\n            return _activeTimers.IsActive(t);\r\n        }\r\n\r\n        public static void Stop(ITimer t)\r\n        {\r\n            _activeTimers.Stop(t);\r\n            if (_activeTimers.Count == 0) _hookTimer.Stop();\r\n        }\r\n\r\n        public static void CreateGypsyTimer(float delay, System.Action<Timer> complete)\r\n        {\r\n            if (complete == null) throw new System.ArgumentNullException(\"complete\", \"complete event handler must be non-null\");\r\n\r\n            var t = new Timer(delay, 0);\r\n            t.TimerComplete += complete;\r\n            Start(t);\r\n        }\r\n\r\n        public static void CreateGypsyTimer(float delay, int repeatCount, System.Action<Timer> complete, System.Action<Timer> count)\r\n        {\r\n            if (complete == null) throw new System.ArgumentNullException(\"complete\", \"complete event handler must be non-null\");\r\n\r\n            var t = new Timer(delay, repeatCount);\r\n            t.TimerComplete += complete;\r\n            if (count != null) t.TimerCount += count;\r\n            Start(t);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/Timers/Timer.cs",
    "content": "﻿namespace com.spacepuppy.Timers\r\n{\r\n\r\n    public class Timer : ITimer\r\n    {\r\n\r\n        private static long _instance = 0;\r\n\r\n        #region Events\r\n\r\n        public event System.Action<Timer> TimerCount;\r\n        public event System.Action<Timer> TimerComplete;\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n        \r\n        private float _interval;\r\n        private int _repeatCount;\r\n\r\n        private float _currentTime;\r\n        private int _elapsedCount;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n        \r\n        public Timer()\r\n        {\r\n            _instance++;\r\n        }\r\n\r\n        public Timer(float interval) : this()\r\n        {\r\n            _interval = interval;\r\n            _repeatCount = 0;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Create a timer with a delay in seconds and a certain repeat count. A repeat count of 0 continues forever.\r\n        /// </summary>\r\n        /// <param name=\"delay\"></param>\r\n        /// <param name=\"repeatCount\"></param>\r\n        public Timer(float interval, int repeatCount) : this()\r\n        {\r\n            _interval = interval;\r\n            _repeatCount = repeatCount;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        /// <summary>\r\n        /// Interval of the timer.\r\n        /// </summary>\r\n        public float Interval\r\n        {\r\n            get { return _interval; }\r\n            set { _interval = value; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Number of times the interval should repeat before completing. Negative values repeat forever.\r\n        /// </summary>\r\n        public int RepeatCount\r\n        {\r\n            get { return _repeatCount; }\r\n            set { _repeatCount = value; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Amount of time into the current interval has passed.\r\n        /// </summary>\r\n        public float CurrentTime\r\n        {\r\n            get { return _currentTime; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Number of times the timer has elapsed.\r\n        /// </summary>\r\n        public int ElapsedCount\r\n        {\r\n            get { return _elapsedCount; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Reset()\r\n        {\r\n            _elapsedCount = 0;\r\n            _currentTime = 0;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITimer Interface\r\n\r\n        public bool Update(float dt)\r\n        {\r\n            _currentTime += dt;\r\n\r\n            while (_currentTime > _interval)\r\n            {\r\n                _currentTime -= _interval;\r\n                _elapsedCount++;\r\n\r\n                if (this.TimerCount != null) this.TimerCount(this);\r\n\r\n                if (_repeatCount >= 0 && _elapsedCount > _repeatCount)\r\n                {\r\n                    if (this.TimerComplete != null)\r\n                    {\r\n                        this.TimerComplete(this);\r\n                    }\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Timers/TimerCollection.cs",
    "content": "﻿using System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Timers\r\n{\r\n\r\n    public class TimerCollection : IEnumerable<ITimer>, ITimer\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private List<ITimer> _timers = new List<ITimer>();\r\n        private List<ITimer> _toRemove = new List<ITimer>();\r\n\r\n        private bool _inUpdate;\r\n        private System.Action _lateAction;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TimerCollection()\r\n        {\r\n            \r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int Count { get { return _timers.Count; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Start(ITimer t)\r\n        {\r\n            if(_inUpdate)\r\n            {\r\n                _lateAction += () =>\r\n                {\r\n                    if (!_timers.Contains(t)) _timers.Add(t);\r\n                };\r\n            }\r\n            else\r\n            {\r\n                if (!_timers.Contains(t)) _timers.Add(t);\r\n            }\r\n        }\r\n\r\n        public bool IsActive(ITimer t)\r\n        {\r\n            return _timers.Contains(t);\r\n        }\r\n\r\n        public void Stop(ITimer t)\r\n        {\r\n            if (_inUpdate)\r\n            {\r\n                if (_timers.Contains(t)) _lateAction += () => _timers.Remove(t);\r\n            }\r\n            else\r\n            {\r\n                _timers.Remove(t);\r\n            }\r\n        }\r\n\r\n        public void StopAll()\r\n        {\r\n            if (_inUpdate)\r\n            {\r\n                _lateAction += () => _timers.Clear();\r\n            }\r\n            else\r\n            {\r\n                _timers.Clear();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICollection Interface\r\n\r\n        public IEnumerator<ITimer> GetEnumerator()\r\n        {\r\n            return _timers.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _timers.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITimer Interface\r\n\r\n        public bool Update(float dt)\r\n        {\r\n            _inUpdate = true;\r\n\r\n            //update timers\r\n            _toRemove.Clear();\r\n            if(_timers.Count > 0)\r\n            {\r\n                //if (_timers is WeakList<ITimer>) (_timers as WeakList<ITimer>).Clean();\r\n                foreach(var t in _timers)\r\n                {\r\n                    if(!t.Update(dt))\r\n                    {\r\n                        _toRemove.Add(t);\r\n                    }\r\n                }\r\n            }\r\n\r\n            foreach(var t in _toRemove)\r\n            {\r\n                _timers.Remove(t);\r\n            }\r\n            _toRemove.Clear();\r\n\r\n            //perform late actions\r\n            var a = _lateAction;\r\n            _lateAction = null;\r\n            if (a != null)\r\n            {\r\n                a();\r\n            }\r\n\r\n            //exit\r\n            _inUpdate = false;\r\n            return _timers.Count > 0f;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/Tuple.cs",
    "content": "﻿namespace com.spacepuppy\r\n{\r\n\r\n    public class Tuple\r\n    {\r\n        public static Tuple<T1> Create<T1>(T1 item1)\r\n        {\r\n            return new Tuple<T1>(item1);\r\n        }\r\n\r\n        public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2)\r\n        {\r\n            return new Tuple<T1, T2>(item1, item2);\r\n        }\r\n\r\n        public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3)\r\n        {\r\n            return new Tuple<T1, T2, T3>(item1, item2, item3);\r\n        }\r\n\r\n        public static Tuple<T1, T2, T3, T4> Create<T1, T2, T3, T4>(T1 item1, T2 item2, T3 item3, T4 item4)\r\n        {\r\n            return new Tuple<T1, T2, T3, T4>(item1, item2, item3, item4);\r\n        }\r\n\r\n    }\r\n\r\n    public class Tuple<T1> : Tuple\r\n    {\r\n\r\n        private T1 _item1;\r\n\r\n        public Tuple(T1 item1)\r\n        {\r\n            _item1 = item1;\r\n        }\r\n\r\n        public T1 Item1\r\n        {\r\n            get { return _item1; }\r\n            set { _item1 = value; }\r\n        }\r\n\r\n    }\r\n\r\n    public class Tuple<T1, T2> : Tuple\r\n    {\r\n\r\n        private T1 _item1;\r\n        private T2 _item2;\r\n\r\n        public Tuple(T1 item1, T2 item2)\r\n        {\r\n            _item1 = item1;\r\n            _item2 = item2;\r\n        }\r\n\r\n        public T1 Item1\r\n        {\r\n            get { return _item1; }\r\n            set { _item1 = value; }\r\n        }\r\n\r\n        public T2 Item2\r\n        {\r\n            get { return _item2; }\r\n            set { _item2 = value; }\r\n        }\r\n\r\n    }\r\n\r\n    public class Tuple<T1, T2, T3> : Tuple\r\n    {\r\n\r\n        private T1 _item1;\r\n        private T2 _item2;\r\n        private T3 _item3;\r\n\r\n        public Tuple(T1 item1, T2 item2, T3 item3)\r\n        {\r\n            _item1 = item1;\r\n            _item2 = item2;\r\n            _item3 = item3;\r\n        }\r\n\r\n        public T1 Item1\r\n        {\r\n            get { return _item1; }\r\n            set { _item1 = value; }\r\n        }\r\n\r\n        public T2 Item2\r\n        {\r\n            get { return _item2; }\r\n            set { _item2 = value; }\r\n        }\r\n\r\n        public T3 Item3\r\n        {\r\n            get { return _item3; }\r\n            set { _item3 = value; }\r\n        }\r\n\r\n    }\r\n\r\n    public class Tuple<T1, T2, T3, T4> : Tuple\r\n    {\r\n\r\n        private T1 _item1;\r\n        private T2 _item2;\r\n        private T3 _item3;\r\n        private T4 _item4;\r\n\r\n        public Tuple(T1 item1, T2 item2, T3 item3, T4 item4)\r\n        {\r\n            _item1 = item1;\r\n            _item2 = item2;\r\n            _item3 = item3;\r\n            _item4 = item4;\r\n        }\r\n\r\n        public T1 Item1\r\n        {\r\n            get { return _item1; }\r\n            set { _item1 = value; }\r\n        }\r\n\r\n        public T2 Item2\r\n        {\r\n            get { return _item2; }\r\n            set { _item2 = value; }\r\n        }\r\n\r\n        public T3 Item3\r\n        {\r\n            get { return _item3; }\r\n            set { _item3 = value; }\r\n        }\r\n\r\n        public T4 Item4\r\n        {\r\n            get { return _item4; }\r\n            set { _item4 = value; }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Accessors/CustomTweenMemberAccessorFactory.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.Tween.Accessors\r\n{\r\n\r\n    public class CustomTweenMemberAccessorFactory\r\n    {\r\n        \r\n        private static ListDictionary<string, CustomAccessorData> _targetToCustomAccessor;\r\n\r\n        private static void BuildAccessorDictionary()\r\n        {\r\n            _targetToCustomAccessor = new ListDictionary<string, CustomAccessorData>();\r\n            foreach (var tp in TypeUtil.GetTypesAssignableFrom(typeof(ITweenMemberAccessor)))\r\n            {\r\n                var attribs = tp.GetCustomAttributes(typeof(CustomTweenMemberAccessorAttribute), false).Cast<CustomTweenMemberAccessorAttribute>().ToArray();\r\n                foreach (var attrib in attribs)\r\n                {\r\n                    var data = new CustomAccessorData()\r\n                    {\r\n                        priority = attrib.priority,\r\n                        TargetType = attrib.HandledTargetType,\r\n                        MemberType = attrib.MemberType,\r\n                        AccessorType = tp\r\n                    };\r\n                    _targetToCustomAccessor.Add(attrib.HandledPropName, data);\r\n                }\r\n            }\r\n\r\n            foreach (var lst in _targetToCustomAccessor.Lists)\r\n            {\r\n                (lst as List<CustomAccessorData>).Sort((a, b) => b.priority.CompareTo(a.priority)); //sort descending\r\n            }\r\n        }\r\n\r\n        public static bool TryGetMemberAccessor(object target, string name, out ITweenMemberAccessor accessor)\r\n        {\r\n            if(target == null)\r\n            {\r\n                accessor = null;\r\n                return false;\r\n            }\r\n            if (_targetToCustomAccessor == null) BuildAccessorDictionary();\r\n\r\n            IList<CustomAccessorData> lst;\r\n            if (_targetToCustomAccessor.Lists.TryGetList(name, out lst))\r\n            {\r\n                var tp = target.GetType();\r\n                CustomAccessorData data;\r\n                int cnt = lst.Count;\r\n                for (int i = 0; i < cnt; i++)\r\n                {\r\n                    data = lst[i];\r\n                    if (data.TargetType.IsAssignableFrom(tp))\r\n                    {\r\n                        try\r\n                        {\r\n                            accessor = System.Activator.CreateInstance(data.AccessorType) as ITweenMemberAccessor;\r\n                            return true;\r\n                        }\r\n                        catch\r\n                        {\r\n                            Debug.LogWarning(\"Failed to create Custom MemberAccessor of type '\" + tp.FullName + \"'.\");\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            accessor = null;\r\n            return false;\r\n        }\r\n\r\n        public static bool TryGetMemberAccessorInfo(object target, string name, out CustomAccessorData data)\r\n        {\r\n            if (target == null)\r\n            {\r\n                data = default(CustomAccessorData);\r\n                return false;\r\n            }\r\n            if (_targetToCustomAccessor == null) BuildAccessorDictionary();\r\n\r\n            IList<CustomAccessorData> lst;\r\n            if (_targetToCustomAccessor.Lists.TryGetList(name, out lst))\r\n            {\r\n                var tp = target.GetType();\r\n                CustomAccessorData d2;\r\n                int cnt = lst.Count;\r\n                for (int i = 0; i < cnt; i++)\r\n                {\r\n                    d2 = lst[i];\r\n                    if (d2.TargetType.IsAssignableFrom(tp))\r\n                    {\r\n                        try\r\n                        {\r\n                            data = d2;\r\n                            return true;\r\n                        }\r\n                        catch\r\n                        {\r\n                            Debug.LogWarning(\"Failed to create Custom MemberAccessor of type '\" + tp.FullName + \"'.\");\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            data = default(CustomAccessorData);\r\n            return false;\r\n        }\r\n\r\n        public static string[] GetCustomAccessorIds()\r\n        {\r\n            if (_targetToCustomAccessor == null) BuildAccessorDictionary();\r\n\r\n            return _targetToCustomAccessor.Keys.ToArray();\r\n        }\r\n\r\n        public static string[] GetCustomAccessorIds(System.Type tp, System.Predicate<CustomAccessorData> predicate = null)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n            if (_targetToCustomAccessor == null) BuildAccessorDictionary();\r\n\r\n            using (var set = TempCollection.GetSet<string>())\r\n            {\r\n                var e = _targetToCustomAccessor.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    var lst = e.Current.Value;\r\n                    for(int i = 0; i < lst.Count; i++)\r\n                    {\r\n                        if(lst[i].TargetType.IsAssignableFrom(tp) && \r\n                            (predicate == null || predicate(lst[i])))\r\n                        {\r\n                            set.Add(e.Current.Key);\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                return set.ToArray();\r\n            }\r\n        }\r\n\r\n\r\n\r\n        #region Special Types\r\n\r\n        public struct CustomAccessorData\r\n        {\r\n            public int priority;\r\n            public System.Type TargetType;\r\n            public System.Type AccessorType;\r\n            public System.Type MemberType;\r\n        }\r\n        \r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Accessors/FollowTargetPositionAccessor.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Accessors\r\n{\r\n\r\n    [CustomTweenMemberAccessor(typeof(GameObject), typeof(Vector3), \"*Follow\")]\r\n    [CustomTweenMemberAccessor(typeof(Component), typeof(Vector3), \"*Follow\")]\r\n    [CustomTweenMemberAccessor(typeof(IGameObjectSource), typeof(Vector3), \"*Follow\")]\r\n    public class FollowTargetPositionAccessor : ITweenMemberAccessor\r\n    {\r\n\r\n\r\n\r\n        public System.Type GetMemberType()\r\n        {\r\n            return typeof(Vector3);\r\n        }\r\n\r\n        public System.Type Init(object target, string propName, string args)\r\n        {\r\n            return typeof(Vector3);\r\n        }\r\n\r\n        public object Get(object target)\r\n        {\r\n            var t = GameObjectUtil.GetTransformFromSource(target);\r\n            if (t != null)\r\n            {\r\n                return t.position;\r\n            }\r\n            return Vector3.zero;\r\n        }\r\n\r\n\r\n        public void Set(object targ, object valueObj)\r\n        {\r\n            var value = ConvertUtil.ToVector3(valueObj);\r\n\r\n            if (targ is Rigidbody)\r\n            {\r\n                var rb = targ as Rigidbody;\r\n                rb.MovePosition(value - rb.position);\r\n            }\r\n            else\r\n            {\r\n                var trans = GameObjectUtil.GetTransformFromSource(targ);\r\n                if (trans == null) return;\r\n\r\n                var rb = trans.GetComponent<Rigidbody>();\r\n                if (rb != null && !rb.isKinematic)\r\n                {\r\n                    var dp = value - rb.position;\r\n                    rb.velocity = dp / Time.fixedDeltaTime;\r\n                    return;\r\n                }\r\n\r\n                //just update the position\r\n                trans.position = value;\r\n            }\r\n        }\r\n\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Accessors/GeneralMoveAccessor.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Accessors\r\n{\r\n\r\n    [CustomTweenMemberAccessor(typeof(GameObject), typeof(Vector3), \"*Move\")]\r\n    [CustomTweenMemberAccessor(typeof(Component), typeof(Vector3), \"*Move\")]\r\n    [CustomTweenMemberAccessor(typeof(IGameObjectSource), typeof(Vector3), \"*Move\")]\r\n    public class GeneralMoveAccessor : ITweenMemberAccessor\r\n    {\r\n\r\n\r\n        #region ImplicitCurve Interface\r\n\r\n        public System.Type GetMemberType()\r\n        {\r\n            return typeof(Vector3);\r\n        }\r\n\r\n        public System.Type Init(object target, string propName, string args)\r\n        {\r\n            return typeof(Vector3);\r\n        }\r\n\r\n        public object Get(object target)\r\n        {\r\n            var t = GameObjectUtil.GetTransformFromSource(target);\r\n            if (t != null)\r\n            {\r\n                return t.position;\r\n            }\r\n            return Vector3.zero;\r\n        }\r\n\r\n        public void Set(object targ, object valueObj)\r\n        {\r\n            var value = ConvertUtil.ToVector3(valueObj);\r\n\r\n            if (targ is Rigidbody)\r\n            {\r\n                var rb = targ as Rigidbody;\r\n                rb.MovePosition(value - rb.position);\r\n            }\r\n            else\r\n            {\r\n                var trans = GameObjectUtil.GetTransformFromSource(targ);\r\n                if (trans == null) return;\r\n\r\n                var rb = trans.GetComponent<Rigidbody>();\r\n                if (rb != null && !rb.isKinematic)\r\n                {\r\n                    var dp = value - rb.position;\r\n                    rb.velocity = dp / Time.fixedDeltaTime;\r\n                    return;\r\n                }\r\n\r\n                //just update the position\r\n                trans.position = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Accessors/GeneralRotateAccessor.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Accessors\r\n{\r\n\r\n    [CustomTweenMemberAccessor(typeof(GameObject), typeof(Quaternion), \"*Rotate\")]\r\n    [CustomTweenMemberAccessor(typeof(Component), typeof(Quaternion), \"*Rotate\")]\r\n    [CustomTweenMemberAccessor(typeof(IGameObjectSource), typeof(Quaternion), \"*Rotate\")]\r\n    public class GeneralRotateAccessor : ITweenMemberAccessor\r\n    {\r\n\r\n        #region ImplicitCurve Interface\r\n\r\n        public System.Type GetMemberType()\r\n        {\r\n            return typeof(Quaternion);\r\n        }\r\n\r\n        public System.Type Init(object target, string propName, string args)\r\n        {\r\n            return typeof(Quaternion);\r\n        }\r\n\r\n        public object Get(object target)\r\n        {\r\n            var t = GameObjectUtil.GetTransformFromSource(target);\r\n            if (t != null)\r\n            {\r\n                return t.rotation;\r\n            }\r\n            return Quaternion.identity;\r\n        }\r\n\r\n        public void Set(object targ, object valueObj)\r\n        {\r\n            var value = ConvertUtil.ToQuaternion(valueObj);\r\n\r\n            if (targ is Rigidbody)\r\n            {\r\n                var rb = targ as Rigidbody;\r\n                rb.MoveRotation(QuaternionUtil.FromToRotation(rb.rotation, value));\r\n            }\r\n            else\r\n            {\r\n                var trans = GameObjectUtil.GetTransformFromSource(targ);\r\n                if (trans == null) return;\r\n\r\n                var rb = trans.GetComponent<Rigidbody>();\r\n                if (rb != null && !rb.isKinematic)\r\n                {\r\n                    rb.MoveRotation(QuaternionUtil.FromToRotation(rb.rotation, value));\r\n                    return;\r\n                }\r\n\r\n                //just update the rotation\r\n                trans.rotation = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Accessors/RigidbodyMovePositionAccessor.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Accessors\r\n{\r\n\r\n    [CustomTweenMemberAccessor(typeof(Rigidbody), typeof(Vector3), \"MovePosition\")]\r\n    public class RigidbodyMovePositionAccessor : ITweenMemberAccessor\r\n    {\r\n\r\n        #region ITweenMemberAccessor Interface\r\n\r\n        public System.Type GetMemberType()\r\n        {\r\n            return typeof(Vector3);\r\n        }\r\n\r\n        public System.Type Init(object target, string propName, string args)\r\n        {\r\n            return typeof(Vector3);\r\n        }\r\n\r\n        public object Get(object target)\r\n        {\r\n            var rb = target as Rigidbody;\r\n            if (rb != null)\r\n            {\r\n                return rb.position;\r\n            }\r\n            return Vector3.zero;\r\n        }\r\n\r\n        public void Set(object target, object value)\r\n        {\r\n            var rb = target as Rigidbody;\r\n            if (rb != null)\r\n            {\r\n                rb.MovePosition(ConvertUtil.ToVector3(value) - rb.position);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Accessors/TimeScaleMemberAccessor.cs",
    "content": "﻿\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Accessors\r\n{\r\n\r\n    [CustomTweenMemberAccessor(typeof(ITimeSupplier), typeof(float), \"Scale\")]\r\n    public class TimeScaleMemberAccessor : ITweenMemberAccessor\r\n    {\r\n\r\n        public const string DEFAULT_TIMESCALE_ID = \"SPTween.TimeScale\";\r\n\r\n        #region Fields\r\n\r\n        private string _id = DEFAULT_TIMESCALE_ID;\r\n\r\n        #endregion\r\n\r\n        #region ITweenMemberAccessor Interface\r\n\r\n        public System.Type GetMemberType()\r\n        {\r\n            return typeof(float);\r\n        }\r\n\r\n        public System.Type Init(object target, string propName, string args)\r\n        {\r\n            _id = (string.IsNullOrEmpty(args)) ? DEFAULT_TIMESCALE_ID : args;\r\n\r\n            return typeof(float);\r\n        }\r\n\r\n        public object Get(object target)\r\n        {\r\n            var supplier = target as IScalableTimeSupplier;\r\n            if (supplier != null && supplier.HasScale(_id))\r\n            {\r\n                return supplier.GetScale(_id);\r\n            }\r\n            return 1f;\r\n        }\r\n\r\n        public void Set(object target, object value)\r\n        {\r\n            var supplier = target as IScalableTimeSupplier;\r\n            if (supplier != null)\r\n            {\r\n                supplier.SetScale(_id, ConvertUtil.ToSingle(value));\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Accessors/TransformGlobalTransAccessor.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Accessors\r\n{\r\n\r\n    [CustomTweenMemberAccessor(typeof(GameObject), typeof(Trans), \"*GlobalTrans\")]\r\n    [CustomTweenMemberAccessor(typeof(Component), typeof(Trans), \"*GlobalTrans\")]\r\n    [CustomTweenMemberAccessor(typeof(IGameObjectSource), typeof(Trans), \"*GlobalTrans\")]\r\n    [CustomTweenMemberAccessor(typeof(GameObject), typeof(Transform), \"*GlobalTransform\")]\r\n    [CustomTweenMemberAccessor(typeof(Component), typeof(Transform), \"*GlobalTransform\")]\r\n    [CustomTweenMemberAccessor(typeof(IGameObjectSource), typeof(Transform), \"*GlobalTransform\")]\r\n    public class TransformGlobalTransAccessor : ITweenMemberAccessor\r\n    {\r\n\r\n        private bool _includeScale;\r\n\r\n        #region ITweenMemberAccessor Interface\r\n\r\n        public System.Type GetMemberType()\r\n        {\r\n            return typeof(Trans);\r\n        }\r\n\r\n        public System.Type Init(object target, string propName, string args)\r\n        {\r\n            _includeScale = ConvertUtil.ToBool(args);\r\n\r\n            return typeof(Trans);\r\n        }\r\n\r\n        public object Get(object target)\r\n        {\r\n            var trans = GameObjectUtil.GetTransformFromSource(target);\r\n            if (trans != null)\r\n            {\r\n                return Trans.GetGlobal(trans);\r\n            }\r\n            return Trans.Identity;\r\n        }\r\n\r\n        public void Set(object target, object value)\r\n        {\r\n            if (!(value is Trans)) return;\r\n            var trans = GameObjectUtil.GetTransformFromSource(target);\r\n            if (trans != null)\r\n            {\r\n                ((Trans)value).SetToGlobal(trans, _includeScale);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n    \r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Accessors/TransformLocalTransAccessor.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Accessors\r\n{\r\n\r\n    [CustomTweenMemberAccessor(typeof(GameObject), typeof(Trans), \"*LocalTrans\")]\r\n    [CustomTweenMemberAccessor(typeof(Component), typeof(Trans), \"*LocalTrans\")]\r\n    [CustomTweenMemberAccessor(typeof(IGameObjectSource), typeof(Trans), \"*LocalTrans\")]\r\n    public class TransformLocalTransAccessor : ITweenMemberAccessor\r\n    {\r\n\r\n        private bool _includeScale;\r\n\r\n        #region ITweenMemberAccessor Interface\r\n\r\n        public System.Type GetMemberType()\r\n        {\r\n            return typeof(Trans);\r\n        }\r\n\r\n        public System.Type Init(object target, string propName, string args)\r\n        {\r\n            _includeScale = ConvertUtil.ToBool(args);\r\n\r\n            return typeof(Trans);\r\n        }\r\n\r\n        public object Get(object target)\r\n        {\r\n            var trans = GameObjectUtil.GetTransformFromSource(target);\r\n            if (trans != null)\r\n            {\r\n                return Trans.GetLocal(trans);\r\n            }\r\n            return Trans.Identity;\r\n        }\r\n\r\n        public void Set(object target, object value)\r\n        {\r\n            if (!(value is Trans)) return;\r\n            var trans = GameObjectUtil.GetTransformFromSource(target);\r\n            if (trans != null)\r\n            {\r\n                ((Trans)value).SetToLocal(trans, _includeScale);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Accessors/TransformRelativePositionAccessor.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Accessors\r\n{\r\n\r\n    [CustomTweenMemberAccessor(typeof(GameObject), typeof(Vector3), \"*relativePosition\")]\r\n    [CustomTweenMemberAccessor(typeof(Transform), typeof(Vector3), \"*relativePosition\")]\r\n    [CustomTweenMemberAccessor(typeof(IGameObjectSource), typeof(Vector3), \"*relativePosition\")]\r\n    public class TransformRelativePositionAccessor : ITweenMemberAccessor\r\n    {\r\n\r\n        private Trans _initialTrans;\r\n\r\n        #region ITweenMemberAccessor Interface\r\n\r\n        public System.Type GetMemberType()\r\n        {\r\n            return typeof(Vector3);\r\n        }\r\n\r\n        public System.Type Init(object target, string propName, string args)\r\n        {\r\n            var trans = GameObjectUtil.GetTransformFromSource(target);\r\n            if (trans != null)\r\n            {\r\n                _initialTrans = Trans.GetGlobal(trans);\r\n            }\r\n            else\r\n            {\r\n                _initialTrans = Trans.Identity;\r\n            }\r\n\r\n            return typeof(Vector3);\r\n        }\r\n\r\n        public object Get(object target)\r\n        {\r\n            var trans = GameObjectUtil.GetTransformFromSource(target);\r\n            if (trans != null)\r\n            {\r\n                return _initialTrans.InverseTransformPoint(trans.position);\r\n            }\r\n\r\n            return Vector3.zero;\r\n        }\r\n\r\n        public void Set(object target, object value)\r\n        {\r\n            if (!(value is Vector3)) return;\r\n\r\n            var trans = GameObjectUtil.GetTransformFromSource(target);\r\n            if (trans != null)\r\n            {\r\n                trans.position = _initialTrans.TransformPoint((Vector3)value);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/CallbackTweener.cs",
    "content": "﻿using System;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween\r\n{\r\n\r\n    public delegate void TweenerUpdateCallback(Tweener tween, float dt, float t);\r\n\r\n    /// <summary>\r\n    /// A tweener that calls an update function tick by tick.\r\n    /// \r\n    /// When AutoKilling Id must be set.\r\n    /// </summary>\r\n    public class CallbackTweener : Tweener, ITweenHash\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private object _id;\r\n        private TweenerUpdateCallback _callback;\r\n        private Ease _ease;\r\n        private float _dur;\r\n        \r\n        #endregion\r\n        \r\n        #region CONSTRUCTOR\r\n\r\n        public CallbackTweener(TweenerUpdateCallback callback, float dur)\r\n        {\r\n            _callback = callback;\r\n            _ease = EaseMethods.LinearEaseNone;\r\n            _dur = dur;\r\n        }\r\n\r\n        public CallbackTweener(TweenerUpdateCallback callback, Ease ease, float dur)\r\n        {\r\n            _callback = callback;\r\n            _ease = ease ?? EaseMethods.LinearEaseNone;\r\n            _dur = dur;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public override object Id\r\n        {\r\n            get\r\n            {\r\n                return _id;\r\n            }\r\n\r\n            set\r\n            {\r\n                _id = value;\r\n            }\r\n        }\r\n\r\n        public Ease Ease\r\n        {\r\n            get { return _ease; }\r\n            set\r\n            {\r\n                _ease = value ?? EaseMethods.LinearEaseNone;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Tweener Interface\r\n\r\n        protected internal override bool GetTargetIsDestroyed()\r\n        {\r\n            return (_callback.Target is UnityEngine.Object) && _callback.Target.IsNullOrDestroyed();\r\n        }\r\n\r\n        protected internal override float GetPlayHeadLength()\r\n        {\r\n \t        return _dur;\r\n        }\r\n\r\n        protected internal override void DoUpdate(float dt, float t)\r\n        {\r\n            if (_callback == null) return;\r\n            _callback(this, dt, _ease(t, 0, _dur, _dur));\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region ITweenHash Interface\r\n\r\n        ITweenHash ITweenHash.SetId(object id)\r\n        {\r\n            this.Id = id;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.Ease(Ease ease)\r\n        {\r\n            _ease = ease;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.Delay(float delay)\r\n        {\r\n            this.Delay = delay;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.UseUpdate()\r\n        {\r\n            this.UpdateType = UpdateSequence.Update;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.UseFixedUpdate()\r\n        {\r\n            this.UpdateType = UpdateSequence.FixedUpdate;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.UseLateUpdate()\r\n        {\r\n            this.UpdateType = UpdateSequence.LateUpdate;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.Use(UpdateSequence type)\r\n        {\r\n            this.UpdateType = type;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.UseNormalTime()\r\n        {\r\n            this.TimeSupplier = SPTime.Normal;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.UseRealTime()\r\n        {\r\n            this.TimeSupplier = SPTime.Real;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.UseSmoothTime()\r\n        {\r\n            this.TimeSupplier = SPTime.Smooth;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.Use(ITimeSupplier time)\r\n        {\r\n            this.TimeSupplier = time;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.PlayOnce()\r\n        {\r\n            this.WrapMode = TweenWrapMode.Once;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.Loop(int count)\r\n        {\r\n            this.WrapMode = TweenWrapMode.Loop;\r\n            this.WrapCount = count;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.PingPong(int count)\r\n        {\r\n            this.WrapMode = TweenWrapMode.PingPong;\r\n            this.WrapCount = count;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.Wrap(TweenWrapMode wrap, int count)\r\n        {\r\n            this.WrapMode = wrap;\r\n            this.WrapCount = count;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.Reverse()\r\n        {\r\n            this.Reverse = true;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.Reverse(bool reverse)\r\n        {\r\n            this.Reverse = reverse;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.SpeedScale(float scale)\r\n        {\r\n            this.SpeedScale = scale;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.OnStep(EventHandler d)\r\n        {\r\n            if (d == null) return this;\r\n            this.OnStep += d;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.OnStep(Action<Tweener> d)\r\n        {\r\n            if (d == null) return this;\r\n            this.OnStep += (s, e) => d(this);\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.OnWrap(EventHandler d)\r\n        {\r\n            if (d == null) return this;\r\n            this.OnWrap += d;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.OnWrap(Action<Tweener> d)\r\n        {\r\n            if (d == null) return this;\r\n            this.OnWrap += (s, e) => d(this);\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.OnFinish(EventHandler d)\r\n        {\r\n            if (d == null) return this;\r\n            this.OnFinish += d;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.OnFinish(Action<Tweener> d)\r\n        {\r\n            if (d == null) return this;\r\n            this.OnFinish += (s, e) => d(this);\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.OnStopped(EventHandler d)\r\n        {\r\n            if (d == null) return this;\r\n            this.OnStopped += d;\r\n            return this;\r\n        }\r\n\r\n        ITweenHash ITweenHash.OnStopped(Action<Tweener> d)\r\n        {\r\n            if (d == null) return this;\r\n            this.OnStopped += (s, e) => d(this);\r\n            return this;\r\n        }\r\n        \r\n        Tweener ITweenHash.Play(bool autoKill, object autoKillToken)\r\n        {\r\n            this.Play();\r\n            if (autoKill)\r\n            {\r\n                this.AutoKillToken = autoKillToken;\r\n                SPTween.AutoKill(this);\r\n            }\r\n            return this;\r\n        }\r\n\r\n        Tweener ITweenHash.Play(float playHeadPosition, bool autoKill, object autoKillToken)\r\n        {\r\n            this.Play(playHeadPosition);\r\n            if (autoKill)\r\n            {\r\n                this.AutoKillToken = autoKillToken;\r\n                SPTween.AutoKill(this);\r\n            }\r\n            return this;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private struct TokenPairing\r\n        {\r\n            public object Target;\r\n            public object TokenUid;\r\n\r\n            public TokenPairing(object targ, object uid)\r\n            {\r\n                this.Target = targ;\r\n                this.TokenUid = uid;\r\n            }\r\n\r\n            //public override bool Equals(object obj)\r\n            //{\r\n            //    if (obj == null) return false;\r\n            //    if (!(obj is TokenPairing)) return false;\r\n\r\n            //    var token = (TokenPairing)obj;\r\n            //    return token.Target == this.Target && token.TokenUid == this.TokenUid;\r\n            //}\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Curves/BoolMemberCurve.cs",
    "content": "﻿\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Tween.Curves\n{\n\n    /// <summary>\n    /// The BoolMemberCurve favors 'true'.\n    /// </summary>\n    [CustomMemberCurve(typeof(bool))]\n    public class BoolMemberCurve : MemberCurve, ISupportRedirectToMemberCurve\n    {\n\n        #region Fields\n\n        private bool _start;\n        private bool _end;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        protected BoolMemberCurve()\n        {\n\n        }\n\n        public BoolMemberCurve(string propName, float dur, bool start, bool end)\n            : base(propName, dur)\n        {\n            _start = start;\n            _end = end;\n        }\n\n        public BoolMemberCurve(string propName, Ease ease, float dur, bool start, bool end)\n            : base(propName, ease, dur)\n        {\n            _start = start;\n            _end = end;\n        }\n\n        protected override void ReflectiveInit(System.Type memberType, object start, object end, object option)\n        {\n            _start = ConvertUtil.ToBool(start);\n            _end = ConvertUtil.ToBool(end);\n        }\n\n        void ISupportRedirectToMemberCurve.ConfigureAsRedirectTo(System.Type memberType, float totalDur, object current, object start, object end, object option)\n        {\n            var c = ConvertUtil.ToBool(current);\n            var e = ConvertUtil.ToBool(end);\n            _start = c;\n            _end = e;\n            this.Duration = (c == e) ? 0f : totalDur;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public bool Start\n        {\n            get { return _start; }\n            set { _start = value; }\n        }\n\n        public bool End\n        {\n            get { return _end; }\n            set { _end = value; }\n        }\n\n        #endregion\n\n        #region MemberCurve Interface\n\n        protected override object GetValueAt(float dt, float t)\n        {\n            if (this.Duration == 0f) return _end;\n            //return this.Ease(t, _start, _end - _start, this.Duration);\n\n            if (_end)\n                return t > 0f;\n            else\n                return t < this.Duration;\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Curves/Color32MemberCurve.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Curves\r\n{\r\n\r\n    [CustomMemberCurve(typeof(Color32))]\r\n    public class Color32MemberCurve : MemberCurve, ISupportRedirectToMemberCurve\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Color32 _start;\r\n        private Color32 _end;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected Color32MemberCurve()\r\n        {\r\n\r\n        }\r\n\r\n        public Color32MemberCurve(string propName, float dur, Color32 start, Color32 end)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n        }\r\n\r\n        public Color32MemberCurve(string propName, Ease ease, float dur, Color32 start, Color32 end)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n        }\r\n\r\n        protected override void ReflectiveInit(System.Type memberType, object start, object end, object option)\r\n        {\r\n            _start = ConvertUtil.ToColor32(start);\r\n            _end = ConvertUtil.ToColor32(end);\r\n        }\r\n\r\n        void ISupportRedirectToMemberCurve.ConfigureAsRedirectTo(System.Type memberType, float totalDur, object current, object start, object end, object option)\r\n        {\r\n            var sc = ConvertUtil.ToColor32(start);\r\n            _start = ConvertUtil.ToColor32(current);\r\n            _end = ConvertUtil.ToColor32(end);\r\n\r\n            var c = ConvertUtil.ToVector4(_start);\r\n            var s = ConvertUtil.ToVector4(sc);\r\n            var e = ConvertUtil.ToVector4(_end);\r\n\r\n            c -= e;\r\n            s -= e;\r\n            if (VectorUtil.NearZeroVector(s))\r\n            {\r\n                this.Duration = 0f;\r\n            }\r\n            else\r\n            {\r\n                this.Duration = totalDur * Vector3.Dot(c, s.normalized) / Vector3.Dot(s, c.normalized);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Color32 Start\r\n        {\r\n            get { return _start; }\r\n            set { _start = value; }\r\n        }\r\n\r\n        public Color32 End\r\n        {\r\n            get { return _end; }\r\n            set { _end = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region MemberCurve Interface\r\n\r\n        protected override object GetValueAt(float dt, float t)\r\n        {\r\n            if (this.Duration == 0f) return _end;\r\n            t = this.Ease(t, 0f, 1f, this.Duration);\r\n            return ColorUtil.Lerp(_start, _end, t);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Curves/ColorMemberCurve.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Curves\r\n{\r\n\r\n    [CustomMemberCurve(typeof(Color))]\r\n    public class ColorMemberCurve : MemberCurve, ISupportRedirectToMemberCurve\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Color _start;\r\n        private Color _end;\r\n        private bool _useSlerp;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected ColorMemberCurve()\r\n        {\r\n\r\n        }\r\n\r\n        public ColorMemberCurve(string propName, float dur, Color start, Color end)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _useSlerp = false;\r\n        }\r\n\r\n        public ColorMemberCurve(string propName, Ease ease, float dur, Color start, Color end)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _useSlerp = false;\r\n        }\r\n\r\n        public ColorMemberCurve(string propName, float dur, Color start, Color end, bool useSlerp)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _useSlerp = useSlerp;\r\n        }\r\n\r\n        public ColorMemberCurve(string propName, Ease ease, float dur, Color start, Color end, bool useSlerp)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _useSlerp = useSlerp;\r\n        }\r\n\r\n        protected override void ReflectiveInit(System.Type memberType, object start, object end, object option)\r\n        {\r\n            _start = ConvertUtil.ToColor(start);\r\n            _end = ConvertUtil.ToColor(end);\r\n            _useSlerp = ConvertUtil.ToBool(option);\r\n        }\r\n\r\n        void ISupportRedirectToMemberCurve.ConfigureAsRedirectTo(System.Type memberType, float totalDur, object current, object start, object end, object option)\r\n        {\r\n            var sc = ConvertUtil.ToColor(start);\r\n            _start = ConvertUtil.ToColor(current);\r\n            _end = ConvertUtil.ToColor(end);\r\n            _useSlerp = ConvertUtil.ToBool(option);\r\n\r\n            if(_useSlerp)\r\n            {\r\n                var c = (ColorHSV)_start;\r\n                var s = (ColorHSV)sc;\r\n                var e = (ColorHSV)_end;\r\n\r\n                var t = ColorHSV.InverseSlerp((ColorHSV)_start, (ColorHSV)sc, (ColorHSV)e);\r\n                if (float.IsNaN(t))\r\n                    this.Duration = totalDur;\r\n                else\r\n                    this.Duration = (1f - t) * totalDur;\r\n            }\r\n            else\r\n            {\r\n                var c = ConvertUtil.ToVector4(_start);\r\n                var s = ConvertUtil.ToVector4(sc);\r\n                var e = ConvertUtil.ToVector4(_end);\r\n\r\n                c -= e;\r\n                s -= e;\r\n                if (VectorUtil.NearZeroVector(s))\r\n                {\r\n                    this.Duration = 0f;\r\n                }\r\n                else\r\n                {\r\n                    this.Duration = totalDur * Vector3.Dot(c, s.normalized) / Vector3.Dot(s, c.normalized);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Color Start\r\n        {\r\n            get { return _start; }\r\n            set { _start = value; }\r\n        }\r\n\r\n        public Color End\r\n        {\r\n            get { return _end; }\r\n            set { _end = value; }\r\n        }\r\n\r\n        public bool UseSlerp\r\n        {\r\n            get { return _useSlerp; }\r\n            set { _useSlerp = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region MemberCurve Interface\r\n\r\n        protected override object GetValueAt(float dt, float t)\r\n        {\r\n            if (this.Duration == 0f) return _end;\r\n            t = this.Ease(t, 0f, 1f, this.Duration);\r\n            return _useSlerp ? ColorUtil.Slerp(_start, _end, t) : ColorUtil.Lerp(_start, _end, t);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Curves/FloatMemberCurve.cs",
    "content": "﻿\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Curves\r\n{\r\n\r\n    [CustomMemberCurve(typeof(float))]\r\n    public class FloatMemberCurve : MemberCurve, ISupportRedirectToMemberCurve\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        private float _start;\r\n        private float _end;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected FloatMemberCurve()\r\n        {\r\n\r\n        }\r\n\r\n        public FloatMemberCurve(string propName, float dur, float start, float end)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n        }\r\n\r\n        public FloatMemberCurve(string propName, Ease ease, float dur, float start, float end)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n        }\r\n\r\n        protected override void ReflectiveInit(System.Type memberType, object start, object end, object option)\r\n        {\r\n            _start = ConvertUtil.ToSingle(start);\r\n            _end = ConvertUtil.ToSingle(end);\r\n        }\r\n\r\n        void ISupportRedirectToMemberCurve.ConfigureAsRedirectTo(System.Type memberType, float totalDur, object current, object start, object end, object option)\r\n        {\r\n            var c = ConvertUtil.ToSingle(current);\r\n            var s = ConvertUtil.ToSingle(_start);\r\n            var e = ConvertUtil.ToSingle(end);\r\n            _start = c;\r\n            _end = e;\r\n\r\n            c -= e;\r\n            s -= e;\r\n            this.Duration = System.Math.Abs(s) < MathUtil.EPSILON ? 0f : totalDur * c / s;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float Start\r\n        {\r\n            get { return _start; }\r\n            set { _start = value; }\r\n        }\r\n\r\n        public float End\r\n        {\r\n            get { return _end; }\r\n            set { _end = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region MemberCurve Interface\r\n\r\n        protected override object GetValueAt(float dt, float t)\r\n        {\r\n            if (this.Duration == 0f) return _end;\r\n            return this.Ease(t, _start, _end - _start, this.Duration);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Curves/FollowTargetPositionCurve.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Tween.Accessors;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Curves\r\n{\r\n\r\n    [CustomMemberCurve(typeof(FollowTargetPositionAccessor))]\r\n    public class FollowTargetPositionCurve : MemberCurve\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Vector3 _start;\r\n        private Transform _target;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected FollowTargetPositionCurve()\r\n        {\r\n\r\n        }\r\n\r\n        public FollowTargetPositionCurve(string propName, float dur, Vector3 start, Transform target)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start;\r\n            _target = target;\r\n        }\r\n\r\n        public FollowTargetPositionCurve(string propName, float dur, Transform start, Transform target)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start.position;\r\n            _target = target;\r\n        }\r\n\r\n        public FollowTargetPositionCurve(string propName, Ease ease, float dur, Vector3 start, Transform target)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _start = start;\r\n            _target = target;\r\n        }\r\n\r\n        public FollowTargetPositionCurve(string propName, Ease ease, float dur, Transform start, Transform target)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _start = start.position;\r\n            _target = target;\r\n        }\r\n\r\n        protected override void ReflectiveInit(System.Type memberType, object start, object end, object option)\r\n        {\r\n            var trans = GameObjectUtil.GetTransformFromSource(start);\r\n            if (trans != null)\r\n                _start = trans.position;\r\n            else\r\n                _start = ConvertUtil.ToVector3(start);\r\n\r\n            _target = GameObjectUtil.GetTransformFromSource(end);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected override object GetValueAt(float dt, float t)\r\n        {\r\n            return VectorUtil.Lerp(_start, _target.position, EaseMethods.LinearEaseNone(t, 0f, 1f, this.Duration));\r\n        }\r\n\r\n        #endregion\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Curves/MeshCurve.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Tween.Curves\r\n{\r\n    public class MeshCurve : TweenCurve\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Mesh[] _meshes;\r\n        private Ease _ease;\r\n        private float _dur;\r\n\r\n        private int m_SrcMesh = -1;\r\n        private int m_DstMesh = -1;\r\n        private float m_Weight = -1;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public MeshCurve(Mesh[] meshes, Ease ease, float dur)\r\n        {\r\n            _meshes = meshes;\r\n            _ease = ease;\r\n            _dur = dur;\r\n\r\n            //  At least two meshes\r\n            if (_meshes.Length < 2)\r\n            {\r\n                throw new System.ArgumentException(\"MeshCurve requires at least 2 source meshes.\", \"meshes\");\r\n            }\r\n\r\n            // Make sure all meshes are assigned and shaped correctly!\r\n            int vertexCount = (_meshes[0] != null) ? _meshes[0].vertexCount : 0;\r\n            for (int i = 0; i < _meshes.Length; i++)\r\n            {\r\n                if (_meshes[i] == null)\r\n                {\r\n                    throw new System.ArgumentNullException(\"Mesh  \" + i + \" is null.\", \"meshes\");\r\n                }\r\n                if (_meshes[i].vertexCount != vertexCount)\r\n                {\r\n                    throw new System.ArgumentException(\"Mesh \" + i + \" doesn't have the same number of vertices as the first mesh\", \"meshes\");\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// Set the current morph in    \r\n        public void SetComplexMorph(MeshFilter targ, int srcIndex, int dstIndex, float t)\r\n        {\r\n            if (m_SrcMesh == srcIndex && m_DstMesh == dstIndex && Mathf.Approximately(m_Weight, t))\r\n                return;\r\n\r\n            Vector3[] v0 = _meshes[srcIndex].vertices;\r\n            Vector3[] v1 = _meshes[dstIndex].vertices;\r\n            Vector3[] vdst = new Vector3[targ.mesh.vertexCount];\r\n            for (int i = 0; i < vdst.Length; i++)\r\n                vdst[i] = Vector3.Lerp(v0[i], v1[i], t);\r\n\r\n            targ.mesh.vertices = vdst;\r\n            targ.mesh.RecalculateBounds();\r\n        }\r\n\r\n        /// t is between 0 and m_Meshes.Length - 1.\r\n        /// 0 means the first mesh, m_Meshes.Length - 1 means the last mesh.\r\n        /// 0.5 means half of the first mesh and half of the second mesh.\r\n        public void SetMorph(MeshFilter targ, float t)\r\n        {\r\n            int floor = (int)t;\r\n            floor = Mathf.Clamp(floor, 0, _meshes.Length - 2);\r\n            float fraction = t - floor;\r\n            fraction = Mathf.Clamp(t - floor, 0.0F, 1.0F);\r\n            SetComplexMorph(targ, floor, floor + 1, fraction);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Curve Interface\r\n\r\n        public override float TotalTime\r\n        {\r\n            get { return _dur; }\r\n        }\r\n\r\n        public override void Update(object targ, float dt, float t)\r\n        {\r\n            t = (_dur == 0f) ? 1f : _ease(t, 0f, 1f, _dur);\r\n            if (targ is MeshFilter) this.SetMorph(targ as MeshFilter, t);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Curves/NumericMemberCurve.cs",
    "content": "﻿using System;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Curves\r\n{\r\n\r\n    [CustomMemberCurve(typeof(float), priority = int.MinValue)]\r\n    [CustomMemberCurve(typeof(double), priority=int.MinValue)]\r\n    [CustomMemberCurve(typeof(decimal), priority = int.MinValue)]\r\n    [CustomMemberCurve(typeof(sbyte), priority = int.MinValue)]\r\n    [CustomMemberCurve(typeof(int), priority = int.MinValue)]\r\n    [CustomMemberCurve(typeof(long), priority = int.MinValue)]\r\n    [CustomMemberCurve(typeof(byte), priority = int.MinValue)]\r\n    [CustomMemberCurve(typeof(uint), priority = int.MinValue)]\r\n    [CustomMemberCurve(typeof(ulong), priority = int.MinValue)]\r\n    public class NumericMemberCurve : MemberCurve, ISupportRedirectToMemberCurve\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private double _start;\r\n        private double _end;\r\n        private TypeCode _numericType = TypeCode.Double;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected NumericMemberCurve()\r\n        {\r\n\r\n        }\r\n\r\n        public NumericMemberCurve(string propName, float dur, double start, double end)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n        }\r\n\r\n        public NumericMemberCurve(string propName, Ease ease, float dur, double start, double end)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n        }\r\n\r\n        protected override void ReflectiveInit(System.Type memberType, object start, object end, object option)\r\n        {\r\n            _start = ConvertUtil.ToDouble(start);\r\n            _end = ConvertUtil.ToDouble(end);\r\n            if (memberType != null && ConvertUtil.IsNumericType(memberType))\r\n                _numericType = System.Type.GetTypeCode(memberType);\r\n            else\r\n                _numericType = TypeCode.Double;\r\n        }\r\n\r\n        void ISupportRedirectToMemberCurve.ConfigureAsRedirectTo(System.Type memberType, float totalDur, object current, object start, object end, object option)\r\n        {\r\n            var c = ConvertUtil.ToDouble(current);\r\n            var s = ConvertUtil.ToDouble(_start);\r\n            var e = ConvertUtil.ToDouble(end);\r\n            _start = c;\r\n            _end = e;\r\n\r\n            c -= e;\r\n            s -= e;\r\n            this.Duration = (float)(System.Math.Abs(s) < MathUtil.DBL_EPSILON ? 0f : totalDur * c / s);\r\n\r\n            if (memberType != null && ConvertUtil.IsNumericType(memberType))\r\n                _numericType = System.Type.GetTypeCode(memberType);\r\n            else\r\n                _numericType = TypeCode.Double;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public double Start\r\n        {\r\n            get { return _start; }\r\n            set { _start = value; }\r\n        }\r\n\r\n        public double End\r\n        {\r\n            get { return _end; }\r\n            set { _end = value; }\r\n        }\r\n\r\n        internal TypeCode NumericType\r\n        {\r\n            get { return _numericType; }\r\n            set\r\n            {\r\n                if (!ConvertUtil.IsNumericType(value)) throw new System.ArgumentException(\"TypeCode must be a numeric type.\", \"value\");\r\n                _numericType = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region MemberCurve Interface\r\n\r\n        protected override object GetValueAt(float dt, float t)\r\n        {\r\n            if (this.Duration == 0) return ConvertUtil.ToPrim(_end, _numericType);\r\n            return ConvertUtil.ToPrim(this.Ease(t, (float)_start, (float)_end - (float)_start, this.Duration), _numericType);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Curves/QuaternionMemberCurve.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Curves\r\n{\r\n\r\n    [CustomMemberCurve(typeof(Quaternion))]\r\n    public class QuaternionMemberCurve : MemberCurve, ISupportRedirectToMemberCurve\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        private Quaternion _start;\r\n        private Quaternion _end;\r\n        private Vector3 _startLong;\r\n        private Vector3 _endLong;\r\n        private QuaternionTweenOption _option;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected QuaternionMemberCurve()\r\n        {\r\n\r\n        }\r\n\r\n        public QuaternionMemberCurve(string propName, float dur, Quaternion start, Quaternion end)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _startLong = start.eulerAngles;\r\n            _endLong = end.eulerAngles;\r\n            _option = QuaternionTweenOption.Spherical;\r\n        }\r\n\r\n        public QuaternionMemberCurve(string propName, float dur, Quaternion start, Quaternion end, QuaternionTweenOption mode)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _startLong = start.eulerAngles;\r\n            _endLong = end.eulerAngles;\r\n            _option = mode == QuaternionTweenOption.Long ? QuaternionTweenOption.Spherical : mode;\r\n        }\r\n\r\n        public QuaternionMemberCurve(string propName, Ease ease, float dur, Quaternion start, Quaternion end)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _startLong = start.eulerAngles;\r\n            _endLong = end.eulerAngles;\r\n            _option = QuaternionTweenOption.Spherical;\r\n        }\r\n\r\n        public QuaternionMemberCurve(string propName, Ease ease, float dur, Quaternion start, Quaternion end, QuaternionTweenOption mode)\r\n            : base( propName, ease, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _startLong = start.eulerAngles;\r\n            _endLong = end.eulerAngles;\r\n            _option = mode == QuaternionTweenOption.Long ? QuaternionTweenOption.Spherical : mode;\r\n        }\r\n\r\n        public QuaternionMemberCurve(string propName, Ease ease, float dur, Vector3 eulerStart, Vector3 eulerEnd, QuaternionTweenOption mode)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _option = mode;\r\n            _start = Quaternion.Euler(eulerStart);\r\n            _end = Quaternion.Euler(eulerEnd);\r\n            _startLong = eulerStart;\r\n            _endLong = eulerEnd;\r\n        }\r\n\r\n        protected override void ReflectiveInit(System.Type memberType, object start, object end, object option)\r\n        {\r\n            _option = ConvertUtil.ToEnum<QuaternionTweenOption>(option);\r\n            if(_option == QuaternionTweenOption.Long)\r\n            {\r\n                _startLong = QuaternionUtil.MassageAsEuler(start);\r\n                _endLong = QuaternionUtil.MassageAsEuler(end);\r\n                _start = Quaternion.Euler(_startLong);\r\n                _end = Quaternion.Euler(_endLong);\r\n            }\r\n            else\r\n            {\r\n                _start = QuaternionUtil.MassageAsQuaternion(start);\r\n                _end = QuaternionUtil.MassageAsQuaternion(end);\r\n                _startLong = _start.eulerAngles;\r\n                _endLong = _end.eulerAngles;\r\n            }\r\n        }\r\n\r\n        void ISupportRedirectToMemberCurve.ConfigureAsRedirectTo(System.Type memberType, float totalDur, object current, object start, object end, object option)\r\n        {\r\n            _option = ConvertUtil.ToEnum<QuaternionTweenOption>(option);\r\n            if (_option == QuaternionTweenOption.Long)\r\n            {\r\n                var c = QuaternionUtil.MassageAsEuler(current);\r\n                var s = QuaternionUtil.MassageAsEuler(start);\r\n                var e = QuaternionUtil.MassageAsEuler(end);\r\n\r\n                c.x = MathUtil.NormalizeAngleToRange(c.x, s.x, e.x, false);\r\n                c.y = MathUtil.NormalizeAngleToRange(c.y, s.y, e.y, false);\r\n                c.z = MathUtil.NormalizeAngleToRange(c.z, s.z, e.z, false);\r\n\r\n                _startLong = c;\r\n                _endLong = e;\r\n                _start = Quaternion.Euler(_startLong);\r\n                _end = Quaternion.Euler(_endLong);\r\n                \r\n                c -= s;\r\n                e -= s;\r\n                this.Duration = totalDur * (VectorUtil.NearZeroVector(e) ? 0f : 1f - c.magnitude / e.magnitude);\r\n            }\r\n            else\r\n            {\r\n                //treat as quat\r\n                var c = QuaternionUtil.MassageAsQuaternion(current);\r\n                var s = QuaternionUtil.MassageAsQuaternion(start);\r\n                var e = QuaternionUtil.MassageAsQuaternion(end);\r\n                _start = c;\r\n                _end = e;\r\n                _startLong = _start.eulerAngles;\r\n                _endLong = _end.eulerAngles;\r\n\r\n                var at = Quaternion.Angle(s, e);\r\n                if ((System.Math.Abs(at) < MathUtil.EPSILON))\r\n                {\r\n                    this.Duration = 0f;\r\n                }\r\n                else\r\n                {\r\n                    var ap = Quaternion.Angle(s, c);\r\n                    this.Duration = (1f - ap / at) * totalDur;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Quaternion Start\r\n        {\r\n            get { return _start; }\r\n            set\r\n            {\r\n                _start = value;\r\n                _startLong = value.eulerAngles;\r\n            }\r\n        }\r\n\r\n        public Quaternion End\r\n        {\r\n            get { return _end; }\r\n            set\r\n            {\r\n                _end = value;\r\n                _endLong = value.eulerAngles;\r\n            }\r\n        }\r\n\r\n        public Vector3 StartEuler\r\n        {\r\n            get { return _startLong; }\r\n            set\r\n            {\r\n                _startLong = value;\r\n                _start = Quaternion.Euler(value);\r\n            }\r\n        }\r\n\r\n        public Vector3 EndEuler\r\n        {\r\n            get { return _endLong; }\r\n            set\r\n            {\r\n                _endLong = value;\r\n                _end = Quaternion.Euler(value);\r\n            }\r\n        }\r\n\r\n        public QuaternionTweenOption Option\r\n        {\r\n            get { return _option; }\r\n            set { _option = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region MemberCurve Interface\r\n\r\n        protected override object GetValueAt(float dt, float t)\r\n        {\r\n            if (this.Duration == 0f) return _end;\r\n            t = this.Ease(t, 0f, 1f, this.Duration);\r\n            switch(_option)\r\n            {\r\n                case QuaternionTweenOption.Spherical:\r\n                    return Quaternion.SlerpUnclamped(_start, _end, t);\r\n                case QuaternionTweenOption.Linear:\r\n                    return Quaternion.LerpUnclamped(_start, _end, t);\r\n                case QuaternionTweenOption.Long:\r\n                    {\r\n                        var v = Vector3.LerpUnclamped(_startLong, _endLong, t);\r\n                        return Quaternion.Euler(v);\r\n                    }\r\n                default:\r\n                    return Quaternion.identity;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Curves/RectMemberCurve.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Curves\r\n{\r\n\r\n    [CustomMemberCurve(typeof(Rect))]\r\n    public class RectMemberCurve : MemberCurve, ISupportRedirectToMemberCurve\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Rect _start;\r\n        private Rect _end;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected RectMemberCurve()\r\n        {\r\n\r\n        }\r\n\r\n        public RectMemberCurve(string propName, float dur, Rect start, Rect end)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n        }\r\n\r\n        public RectMemberCurve(string propName, float dur, Rect start, Rect end, bool slerp)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n        }\r\n\r\n        public RectMemberCurve(string propName, Ease ease, float dur, Rect start, Rect end)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n        }\r\n\r\n        protected override void ReflectiveInit(System.Type memberType, object start, object end, object option)\r\n        {\r\n            _start = (start is Rect) ? (Rect)start : new Rect();\r\n            _end = (end is Rect) ? (Rect)end : new Rect();\r\n        }\r\n\r\n        void ISupportRedirectToMemberCurve.ConfigureAsRedirectTo(System.Type memberType, float totalDur, object current, object start, object end, object option)\r\n        {\r\n            //TODO - determine mid point\r\n            this.ReflectiveInit(memberType, current, end, option);\r\n            this.Duration = totalDur;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Rect Start\r\n        {\r\n            get { return _start; }\r\n            set { _start = value; }\r\n        }\r\n\r\n        public Rect End\r\n        {\r\n            get { return _end; }\r\n            set { _end = value; }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region MemberCurve Interface\r\n\r\n        protected override object GetValueAt(float dt, float t)\r\n        {\r\n            if (this.Duration == 0f) return _end;\r\n            t = this.Ease(t, 0f, 1f, this.Duration);\r\n\r\n            return new Rect(Mathf.LerpUnclamped(_start.xMin, _end.xMin, t),\r\n                             Mathf.LerpUnclamped(_start.yMin, _end.yMin, t),\r\n                             Mathf.LerpUnclamped(_start.width, _end.width, t),\r\n                             Mathf.LerpUnclamped(_start.height, _end.height, t));\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Curves/StringCurve.cs",
    "content": "﻿using System;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Curves\r\n{\r\n\r\n    [CustomMemberCurve(typeof(string))]\r\n    public class StringCurve : MemberCurve, ISupportRedirectToMemberCurve\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private string _start;\r\n        private string _end;\r\n        private StringTweenStyle _style;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected StringCurve()\r\n        {\r\n            _start = string.Empty;\r\n            _end = string.Empty;\r\n        }\r\n\r\n        public StringCurve(string propName, float dur, string start, string end, StringTweenStyle style)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _style = style;\r\n        }\r\n\r\n        public StringCurve(string propName, Ease ease, float dur, string start, string end, StringTweenStyle style)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _style = style;\r\n        }\r\n\r\n        protected override void ReflectiveInit(System.Type memberType, object start, object end, object option)\r\n        {\r\n            _start = Convert.ToString(start) ?? string.Empty;\r\n            _end = Convert.ToString(end) ?? string.Empty;\r\n            _style = ConvertUtil.ToEnum<StringTweenStyle>(option, StringTweenStyle.Default);\r\n        }\r\n\r\n        void ISupportRedirectToMemberCurve.ConfigureAsRedirectTo(System.Type memberType, float totalDur, object current, object start, object end, object option)\r\n        {\r\n            _style = ConvertUtil.ToEnum<StringTweenStyle>(option, StringTweenStyle.Default);\r\n\r\n            var c = Convert.ToString(current) ?? string.Empty;\r\n            var s = Convert.ToString(start) ?? string.Empty;\r\n            var e = Convert.ToString(end) ?? string.Empty;\r\n            _start = c;\r\n            _end = e;\r\n\r\n            int tl = e.Length - s.Length;\r\n            int l = c.Length - s.Length;\r\n            if (tl == 0)\r\n                this.Duration = 0f;\r\n            else\r\n                this.Duration = totalDur * (1f - (float)l / (float)tl);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public string Start\r\n        {\r\n            get { return _start; }\r\n            set\r\n            {\r\n                _start = value ?? string.Empty;\r\n            }\r\n        }\r\n\r\n        public string End\r\n        {\r\n            get { return _end; }\r\n            set\r\n            {\r\n                _end = value ?? string.Empty;\r\n            }\r\n        }\r\n\r\n        public StringTweenStyle Style\r\n        {\r\n            get { return _style; }\r\n            set\r\n            {\r\n                _style = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region MemberCurve Interface\r\n\r\n        protected override object GetValueAt(float delta, float t)\r\n        {\r\n            t = (this.Duration == 0) ? 1f : this.Ease(t, 0f, 1f, this.Duration);\r\n            if (float.IsNaN(t)) throw new System.ArgumentException(\"t must be a real number.\", \"t\");\r\n\r\n            if ((_style & StringTweenStyle.Jumble) == 0)\r\n            {\r\n                if((_style & StringTweenStyle.RightToLeft) == 0)\r\n                {\r\n                    //left to right, none jumble\r\n                    if(_start.Length == 0)\r\n                    {\r\n                        return _end.Substring(0, MathUtil.Interpolate(0, _end.Length, MathUtil.Clamp01(t)));\r\n                    }\r\n                    else if(_end.Length == 0)\r\n                    {\r\n                        int ipos = MathUtil.Interpolate(0, _start.Length, MathUtil.Clamp01(t));\r\n                        if (ipos == 0)\r\n                            return _start;\r\n                        else if (ipos == _start.Length)\r\n                            return string.Empty;\r\n                        else\r\n                            return new string(' ', ipos) + _start.Substring(ipos);\r\n                    }\r\n                    else\r\n                    {\r\n                        int len = Math.Max(_start.Length, _end.Length);\r\n                        int ipos = MathUtil.Interpolate(0, len, MathUtil.Clamp01(t));\r\n                        if (ipos == 0)\r\n                            return _start;\r\n                        else if (ipos == len)\r\n                            return _end;\r\n                        else if (ipos < _start.Length)\r\n                        {\r\n                            var builder = StringUtil.GetTempStringBuilder();\r\n                            if (ipos < _end.Length)\r\n                            {\r\n                                builder.Append(_end.Substring(0, ipos));\r\n                            }\r\n                            else\r\n                            {\r\n                                builder.Append(_end);\r\n                                int diff = ipos - _end.Length;\r\n                                if (diff > 0) builder.Append(new string(' ', diff));\r\n                            }\r\n\r\n                            builder.Append(_start.Substring(ipos));\r\n                            \r\n                            return StringUtil.Release(builder);\r\n                        }\r\n                        else\r\n                        {\r\n                            return _end.Substring(0, ipos);\r\n                        }\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    //right to left, none jumble\r\n                    if(_end.Length == 0)\r\n                    {\r\n                        return _start.Substring(0, MathUtil.Interpolate(_start.Length, 0, MathUtil.Clamp01(t)));\r\n                    }\r\n                    else if(_start.Length == 0)\r\n                    {\r\n                        int ipos = MathUtil.Interpolate(_end.Length, 0, MathUtil.Clamp01(t));\r\n                        if (ipos == 0)\r\n                            return _end;\r\n                        if (ipos == _end.Length)\r\n                            return string.Empty;\r\n                        else\r\n                            return new string(' ', ipos) + _end.Substring(ipos);\r\n                    }\r\n                    else\r\n                    {\r\n                        int len = Math.Max(_start.Length, _end.Length);\r\n                        int ipos = MathUtil.Interpolate(len, 0, MathUtil.Clamp01(t));\r\n                        if (ipos == 0)\r\n                            return _end;\r\n                        else if (ipos == len)\r\n                            return _start;\r\n                        else if (ipos < _end.Length)\r\n                        {\r\n                            var builder = StringUtil.GetTempStringBuilder();\r\n                            if(ipos < _start.Length)\r\n                            {\r\n                                builder.Append(_start.Substring(0, ipos));\r\n                            }\r\n                            else\r\n                            {\r\n                                builder.Append(_start);\r\n                                int diff = ipos - _start.Length;\r\n                                if (diff > 0) builder.Append(new string(' ', diff));\r\n                            }\r\n\r\n                            builder.Append(_end.Substring(ipos));\r\n                            \r\n                            return StringUtil.Release(builder);\r\n                        }\r\n                        else\r\n                        {\r\n                            return _start.Substring(0, ipos);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if ((_style & StringTweenStyle.RightToLeft) == 0)\r\n                {\r\n                    //left to right, jumble\r\n\r\n                    int len = Math.Max(_start.Length, _end.Length);\r\n                    float pos = (float)len * MathUtil.Clamp01(t);\r\n                    float dt = MathUtil.Shear(pos);\r\n                    int posLow = (int)Math.Floor(pos);\r\n                    int posHigh = (int)Math.Ceiling(pos);\r\n                    if(posHigh == 0)\r\n                    {\r\n                        return _start;\r\n                    }\r\n                    else if(posHigh == len)\r\n                    {\r\n                        return _end;\r\n                    }\r\n                    else if(posHigh < _start.Length)\r\n                    {\r\n                        var builder = StringUtil.GetTempStringBuilder();\r\n\r\n                        if(posLow < _end.Length)\r\n                        {\r\n                            builder.Append(_end.Substring(0, posLow));\r\n                        }\r\n                        else\r\n                        {\r\n                            builder.Append(_end);\r\n                            int diff = posLow - _end.Length;\r\n                            if (diff > 0) builder.Append(new string(' ', diff));\r\n                        }\r\n\r\n                        if(posHigh < _end.Length)\r\n                        {\r\n                            builder.Append((char)MathUtil.Clamp(MathUtil.Interpolate((int)_start[posHigh], (int)_end[posHigh], dt), 255, 32));\r\n                        }\r\n                        else\r\n                        {\r\n                            builder.Append((char)MathUtil.Clamp(MathUtil.Interpolate((int)_start[posHigh], 32, dt), 255, 32));\r\n                        }\r\n\r\n                        if(posHigh + 1 < _start.Length) builder.Append(_start.Substring(posHigh + 1));\r\n                        \r\n                        return StringUtil.Release(builder);\r\n\r\n                    }\r\n                    else\r\n                    {\r\n                        if(posHigh < _end.Length)\r\n                        {\r\n                            return _end.Substring(0, posLow) + (char)MathUtil.Clamp(MathUtil.Interpolate(32, (int)_end[posHigh], dt), 255, 32);\r\n                        }\r\n                        else\r\n                        {\r\n                            return _end.Substring(0, posLow);\r\n                        }\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    //right to left, jumble\r\n\r\n                    int len = Math.Max(_start.Length, _end.Length);\r\n                    float pos = (float)len * (1f - MathUtil.Clamp01(t));\r\n                    float dt = MathUtil.Shear(pos);\r\n                    int posLow = (int)Math.Floor(pos);\r\n                    int posHigh = (int)Math.Ceiling(pos);\r\n                    if(posHigh == len)\r\n                    {\r\n                        return _start;\r\n                    }\r\n                    else if(posHigh == 0)\r\n                    {\r\n                        return _end;\r\n                    }\r\n                    else if(posHigh < _end.Length)\r\n                    {\r\n                        var builder = StringUtil.GetTempStringBuilder();\r\n                        if (posLow < _start.Length)\r\n                        {\r\n                            builder.Append(_start.Substring(0, posLow));\r\n                        }\r\n                        else\r\n                        {\r\n                            builder.Append(_start);\r\n                            int diff = posLow - _start.Length;\r\n                            if (diff > 0) builder.Append(new string(' ', diff));\r\n                        }\r\n\r\n                        if (posHigh < _end.Length)\r\n                        {\r\n                            builder.Append((char)MathUtil.Clamp(MathUtil.Interpolate((int)_start[posHigh], (int)_end[posHigh], dt), 255, 32));\r\n                        }\r\n                        else\r\n                        {\r\n                            builder.Append((char)MathUtil.Clamp(MathUtil.Interpolate((int)_start[posHigh], 32, dt), 255, 32));\r\n                        }\r\n\r\n                        if (posHigh + 1 < _end.Length) builder.Append(_end.Substring(posHigh + 1));\r\n                        \r\n                        return StringUtil.Release(builder);\r\n                    }\r\n                    else\r\n                    {\r\n                        if(posHigh < _start.Length)\r\n                        {\r\n                            return _start.Substring(0, posLow) + (char)MathUtil.Clamp(MathUtil.Interpolate((int)_start[posHigh], 32, dt), 255, 32);\r\n                        }\r\n                        else\r\n                        {\r\n                            return _start;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n\r\n        /// <summary>\r\n        /// Return the duration that should pass for the transition between 2 strings to occur at some constant speed in characters per second.\r\n        /// </summary>\r\n        /// <param name=\"start\"></param>\r\n        /// <param name=\"end\"></param>\r\n        /// <param name=\"charsPerSecond\"></param>\r\n        /// <returns></returns>\r\n        public static float CalculateDuration(string start, string end, float charsPerSecond)\r\n        {\r\n            if (charsPerSecond <= 0f) throw new System.ArgumentException(\"speed must be a positive value.\", \"charsPerSecond\");\r\n            return (float)Math.Max((start != null) ? start.Length : 0, (end != null) ? end.Length : 0) / charsPerSecond;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Curves/TransMemberCurve.cs",
    "content": "﻿\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Curves\r\n{\r\n\r\n    [CustomMemberCurve(typeof(Trans))]\r\n    public class TransMemberCurve : MemberCurve, ISupportRedirectToMemberCurve\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Trans _start;\r\n        private Trans _end;\r\n        private bool _useSlerp;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected TransMemberCurve()\r\n        {\r\n\r\n        }\r\n\r\n        public TransMemberCurve(string propName, float dur, Trans start, Trans end)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _useSlerp = false;\r\n        }\r\n\r\n        public TransMemberCurve(string propName, float dur, Trans start, Trans end, bool slerp)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _useSlerp = slerp;\r\n        }\r\n\r\n        public TransMemberCurve(string propName, Ease ease, float dur, Trans start, Trans end)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _useSlerp = false;\r\n        }\r\n\r\n        public TransMemberCurve(string propName, Ease ease, float dur, Trans start, Trans end, bool slerp)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _useSlerp = slerp;\r\n        }\r\n\r\n        protected override void ReflectiveInit(System.Type memberType, object start, object end, object option)\r\n        {\r\n            _start = (start is Trans) ? (Trans)start : Trans.Identity;\r\n            if (end is Trans)\r\n                _end = (Trans)end;\r\n            else if (end is UnityEngine.Transform)\r\n                _end = Trans.GetGlobal((UnityEngine.Transform)end);\r\n            else if (GameObjectUtil.IsGameObjectSource(end))\r\n                _end = Trans.GetGlobal(GameObjectUtil.GetGameObjectFromSource(end).transform);\r\n            else\r\n                _end = Trans.Identity;\r\n            _useSlerp = ConvertUtil.ToBool(option);\r\n        }\r\n\r\n        void ISupportRedirectToMemberCurve.ConfigureAsRedirectTo(System.Type memberType, float totalDur, object current, object start, object end, object option)\r\n        {\r\n            //TODO - determine mid point\r\n            this.ReflectiveInit(memberType, current, end, option);\r\n            this.Duration = totalDur;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Trans Start\r\n        {\r\n            get { return _start; }\r\n            set { _start = value; }\r\n        }\r\n\r\n        public Trans End\r\n        {\r\n            get { return _end; }\r\n            set { _end = value; }\r\n        }\r\n\r\n        public bool UseSlerp\r\n        {\r\n            get { return _useSlerp; }\r\n            set { _useSlerp = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region MemberCurve Interface\r\n\r\n        protected override object GetValueAt(float dt, float t)\r\n        {\r\n            if (this.Duration == 0f) return _end;\r\n            t = this.Ease(t, 0f, 1f, this.Duration);\r\n            return (_useSlerp) ? Trans.Slerp(_start, _end, t) : Trans.Lerp(_start, _end, t);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Curves/Vector2MemberCurve.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Curves\r\n{\r\n\r\n    [CustomMemberCurve(typeof(Vector2))]\r\n    public class Vector2MemberCurve : MemberCurve, ISupportRedirectToMemberCurve\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        private Vector2 _start;\r\n        private Vector2 _end;\r\n        private bool _useSlerp;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected Vector2MemberCurve()\r\n        {\r\n\r\n        }\r\n\r\n        public Vector2MemberCurve(string propName, float dur, Vector2 start, Vector2 end)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _useSlerp = false;\r\n        }\r\n\r\n        public Vector2MemberCurve(string propName, float dur, Vector2 start, Vector2 end, bool slerp)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _useSlerp = slerp;\r\n        }\r\n\r\n        public Vector2MemberCurve(string propName, Ease ease, float dur, Vector2 start, Vector2 end)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _useSlerp = false;\r\n        }\r\n\r\n        public Vector2MemberCurve(string propName, Ease ease, float dur, Vector2 start, Vector2 end, bool slerp)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _useSlerp = slerp;\r\n        }\r\n\r\n        protected override void ReflectiveInit(System.Type memberType, object start, object end, object option)\r\n        {\r\n            _start = ConvertUtil.ToVector2(start);\r\n            _end = ConvertUtil.ToVector2(end);\r\n            _useSlerp = ConvertUtil.ToBool(option);\r\n        }\r\n\r\n        void ISupportRedirectToMemberCurve.ConfigureAsRedirectTo(System.Type memberType, float totalDur, object current, object start, object end, object option)\r\n        {\r\n            _useSlerp = ConvertUtil.ToBool(option);\r\n            \r\n            if (_useSlerp)\r\n            {\r\n                var c = ConvertUtil.ToVector2(current);\r\n                var s = ConvertUtil.ToVector2(start);\r\n                var e = ConvertUtil.ToVector2(end);\r\n                _start = c;\r\n                _end = e;\r\n\r\n                var at = Vector2.Angle(s, e);\r\n                if ((System.Math.Abs(at) < MathUtil.EPSILON))\r\n                {\r\n                    this.Duration = 0f;\r\n                }\r\n                else\r\n                {\r\n                    var ap = Vector2.Angle(c, e);\r\n                    this.Duration = totalDur * ap / at;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var c = ConvertUtil.ToVector2(current);\r\n                var s = ConvertUtil.ToVector2(start);\r\n                var e = ConvertUtil.ToVector2(end);\r\n                _start = c;\r\n                _end = e;\r\n\r\n                c -= e;\r\n                s -= e;\r\n                if (VectorUtil.NearZeroVector(s))\r\n                {\r\n                    this.Duration = 0f;\r\n                }\r\n                else\r\n                {\r\n                    this.Duration = totalDur * Vector3.Dot(c, s.normalized) / Vector3.Dot(s, c.normalized);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Vector2 Start\r\n        {\r\n            get { return _start; }\r\n            set { _start = value; }\r\n        }\r\n\r\n        public Vector2 End\r\n        {\r\n            get { return _end; }\r\n            set { _end = value; }\r\n        }\r\n\r\n        public bool UseSlerp\r\n        {\r\n            get { return _useSlerp; }\r\n            set { _useSlerp = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region MemberCurve Interface\r\n\r\n        protected override object GetValueAt(float dt, float t)\r\n        {\r\n            if (this.Duration == 0f) return _end;\r\n            t = this.Ease(t, 0f, 1f, this.Duration);\r\n            return (_useSlerp) ? VectorUtil.Slerp(_start, _end, t) : Vector2.LerpUnclamped(_start, _end, t);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Curves/Vector3MemberCurve.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Curves\r\n{\r\n\r\n    [CustomMemberCurve(typeof(Vector3))]\r\n    public class Vector3MemberCurve : MemberCurve, ISupportRedirectToMemberCurve\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Vector3 _start;\r\n        private Vector3 _end;\r\n        private bool _useSlerp;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected Vector3MemberCurve()\r\n        {\r\n\r\n        }\r\n\r\n        public Vector3MemberCurve(string propName, float dur, Vector3 start, Vector3 end)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _useSlerp = false;\r\n        }\r\n\r\n        public Vector3MemberCurve(string propName, float dur, Vector3 start, Vector3 end, bool slerp)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _useSlerp = slerp;\r\n        }\r\n\r\n        public Vector3MemberCurve(string propName, Ease ease, float dur, Vector3 start, Vector3 end)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _useSlerp = false;\r\n        }\r\n\r\n        public Vector3MemberCurve(string propName, Ease ease, float dur, Vector3 start, Vector3 end, bool slerp)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n            _useSlerp = slerp;\r\n        }\r\n\r\n        protected override void ReflectiveInit(System.Type memberType, object start, object end, object option)\r\n        {\r\n            _start = ConvertUtil.ToVector3(start);\r\n            _end = ConvertUtil.ToVector3(end);\r\n            _useSlerp = ConvertUtil.ToBool(option);\r\n        }\r\n\r\n        void ISupportRedirectToMemberCurve.ConfigureAsRedirectTo(System.Type memberType, float totalDur, object current, object start, object end, object option)\r\n        {\r\n            _useSlerp = ConvertUtil.ToBool(option);\r\n\r\n            if (_useSlerp)\r\n            {\r\n                var c = ConvertUtil.ToVector3(current);\r\n                var s = ConvertUtil.ToVector3(start);\r\n                var e = ConvertUtil.ToVector3(end);\r\n                _start = c;\r\n                _end = e;\r\n\r\n                var at = Vector3.Angle(s, e);\r\n                if ((System.Math.Abs(at) < MathUtil.EPSILON))\r\n                {\r\n                    this.Duration = 0f;\r\n                }\r\n                else\r\n                {\r\n                    var ap = Vector3.Angle(c, e);\r\n                    this.Duration = totalDur * ap / at;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var c = ConvertUtil.ToVector3(current);\r\n                var s = ConvertUtil.ToVector3(start);\r\n                var e = ConvertUtil.ToVector3(end);\r\n                _start = c;\r\n                _end = e;\r\n\r\n                c -= e;\r\n                s -= e;\r\n                if(VectorUtil.NearZeroVector(s))\r\n                {\r\n                    this.Duration = 0f;\r\n                }\r\n                else\r\n                {\r\n                    this.Duration = totalDur * Vector3.Dot(c, s.normalized) / Vector3.Dot(s, c.normalized);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Vector3 Start\r\n        {\r\n            get { return _start; }\r\n            set { _start = value; }\r\n        }\r\n\r\n        public Vector3 End\r\n        {\r\n            get { return _end; }\r\n            set { _end = value; }\r\n        }\r\n\r\n        public bool UseSlerp\r\n        {\r\n            get { return _useSlerp; }\r\n            set { _useSlerp = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region MemberCurve Interface\r\n\r\n        protected override object GetValueAt(float dt, float t)\r\n        {\r\n            if (this.Duration == 0f) return _end;\r\n            t = this.Ease(t, 0f, 1f, this.Duration);\r\n            return (_useSlerp) ? Vector3.SlerpUnclamped(_start, _end, t) : Vector3.LerpUnclamped(_start, _end, t);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Curves/Vector4MemberCurve.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Curves\r\n{\r\n\r\n    [CustomMemberCurve(typeof(Vector4))]\r\n    public class Vector4MemberCurve : MemberCurve, ISupportRedirectToMemberCurve\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        private Vector4 _start;\r\n        private Vector4 _end;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected Vector4MemberCurve()\r\n        {\r\n\r\n        }\r\n\r\n        public Vector4MemberCurve(string propName, float dur, Vector4 start, Vector4 end)\r\n            : base(propName, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n        }\r\n\r\n        public Vector4MemberCurve(string propName, Ease ease, float dur, Vector4 start, Vector4 end)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _start = start;\r\n            _end = end;\r\n        }\r\n\r\n        protected override void ReflectiveInit(System.Type memberType, object start, object end, object option)\r\n        {\r\n            _start = ConvertUtil.ToVector4(start);\r\n            _end = ConvertUtil.ToVector4(end);\r\n        }\r\n\r\n        void ISupportRedirectToMemberCurve.ConfigureAsRedirectTo(System.Type memberType, float totalDur, object current, object start, object end, object option)\r\n        {\r\n            var c = ConvertUtil.ToVector4(current);\r\n            var s = ConvertUtil.ToVector4(start);\r\n            var e = ConvertUtil.ToVector4(end);\r\n            _start = c;\r\n            _end = e;\r\n\r\n            c -= e;\r\n            s -= e;\r\n            if (VectorUtil.NearZeroVector(s))\r\n            {\r\n                this.Duration = 0f;\r\n            }\r\n            else\r\n            {\r\n                this.Duration = totalDur * Vector3.Dot(c, s.normalized) / Vector3.Dot(s, c.normalized);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Vector4 Start\r\n        {\r\n            get { return _start; }\r\n            set { _start = value; }\r\n        }\r\n\r\n        public Vector4 End\r\n        {\r\n            get { return _end; }\r\n            set { _end = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region MemberCurve Interface\r\n\r\n        protected override object GetValueAt(float dt, float t)\r\n        {\r\n            if (this.Duration == 0f) return _end;\r\n            t = this.Ease(t, 0f, 1f, this.Duration);\r\n            return Vector4.LerpUnclamped(_start, _end, t);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/CustomMemberCurveAttribute.cs",
    "content": "﻿namespace com.spacepuppy.Tween\r\n{\r\n    [System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple = true, Inherited = false)]\r\n    public class CustomMemberCurveAttribute : System.Attribute\r\n    {\r\n\r\n        private System.Type _memberType;\r\n        public int priority;\r\n\r\n        public CustomMemberCurveAttribute(System.Type handledMemberType)\r\n        {\r\n            _memberType = handledMemberType;\r\n        }\r\n\r\n        public System.Type HandledMemberType { get { return _memberType; } }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/CustomTweenMemberAccessorAttribute.cs",
    "content": "﻿namespace com.spacepuppy.Tween\r\n{\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple = true, Inherited = false)]\r\n    public class CustomTweenMemberAccessorAttribute : System.Attribute\r\n    {\r\n        \r\n        private System.Type _targetType;\r\n        private System.Type _memberType;\r\n        private string _propName;\r\n        public int priority;\r\n        \r\n        public CustomTweenMemberAccessorAttribute(System.Type targetType, System.Type memberType, string propName)\r\n        {\r\n            _targetType = targetType;\r\n            _memberType = memberType;\r\n            _propName = propName;\r\n        }\r\n\r\n        public System.Type HandledTargetType { get { return _targetType; } }\r\n\r\n        /// <summary>\r\n        /// The type of the member being handled. Same as what would be returned by ITweenMemberAccessor.GetMemberType.\r\n        /// </summary>\r\n        public System.Type MemberType { get { return _memberType; } }\r\n\r\n        public string HandledPropName { get { return _propName; } }\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Delegates.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Tween\r\n{\r\n\r\n    public delegate void TweenConfigCallback(com.spacepuppy.Tween.TweenHash hash, com.spacepuppy.Tween.Ease ease, float dur);\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Easing.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing System;\r\n\r\nnamespace com.spacepuppy.Tween\r\n{\r\n    /// <summary>\r\n    /// Represents an eased interpolation w/ respect to time.\r\n    /// \r\n    /// float t, float b, float c, float d\r\n    /// </summary>\r\n    /// <param name=\"current\">how long into the ease are we</param>\r\n    /// <param name=\"initialValue\">starting value if current were 0</param>\r\n    /// <param name=\"totalChange\">total change in the value (not the end value, but the end - start)</param>\r\n    /// <param name=\"duration\">the total amount of time (when current == duration, the returned value will == initial + totalChange)</param>\r\n    /// <returns></returns>\r\n    public delegate float Ease(float current, float initialValue, float totalChange, float duration);\r\n\r\n    public enum EaseStyle : int\r\n    {\r\n        Linear = 0,\r\n        LinearEaseIn = 1,\r\n        LinearEaseOut = 2,\r\n        LinearEaseInOut = 3,\r\n        BackEaseIn = 4,\r\n        BackEaseOut = 5,\r\n        BackEaseInOut = 6,\r\n        BounceEaseIn = 7,\r\n        BounceEaseOut = 8,\r\n        BounceEaseInOut = 9,\r\n        CircleEaseIn = 10,\r\n        CircleEaseOut = 11,\r\n        CircleEaseInOut = 12,\r\n        CubicEaseIn = 13,\r\n        CubicEaseOut = 14,\r\n        CubicEaseInOut = 15,\r\n        ElasticEaseIn = 16,\r\n        ElasticEaseOut = 17,\r\n        ElasticEaseInOut = 18,\r\n        ExpoEaseIn = 19,\r\n        ExpoEaseOut = 20,\r\n        ExpoEaseInOut = 21,\r\n        QuadEaseIn = 22,\r\n        QuadEaseOut = 23,\r\n        QuadEaseInOut = 24,\r\n        QuartEaseIn = 25,\r\n        QuartEaseOut = 26,\r\n        QuartEaseInOut = 27,\r\n        QuintEaseIn = 28,\r\n        QuintEaseOut = 29,\r\n        QuintEaseInOut = 30,\r\n        SineEaseIn = 31,\r\n        SineEaseOut = 32,\r\n        SineEaseInOut = 33,\r\n        StrongEaseIn = 34,\r\n        StrongEaseOut = 35,\r\n        StrongEaseInOut = 36,\r\n    }\r\n\r\n    /// <summary>\r\n    /// A set of easing methods, to see a visual representation you can check out:\r\n    /// https://msdn.microsoft.com/en-us/library/vstudio/Ee308751%28v=VS.100%29.aspx\r\n    /// </summary>\r\n    public static class ConcreteEaseMethods\r\n    {\r\n\r\n        private const float _2PI = 6.28318530717959f;\r\n        private const float _HALF_PI = 1.5707963267949f;\r\n\r\n        #region Back Ease\r\n        public static float BackEaseIn(float t, float b, float c, float d)\r\n        {\r\n            return BackEaseInFull(t, b, c, d);\r\n        }\r\n\r\n        public static float BackEaseOut(float t, float b, float c, float d)\r\n        {\r\n            return BackEaseOutFull(t, b, c, d);\r\n        }\r\n        public static float BackEaseInOut(float t, float b, float c, float d)\r\n        {\r\n            return BackEaseInOutFull(t, b, c, d);\r\n        }\r\n\r\n        public static float BackEaseInFull(float t, float b, float c, float d, float s = 1.70158f)\r\n        {\r\n            return c * (t /= d) * t * ((s + 1) * t - s) + b;\r\n        }\r\n\r\n        public static float BackEaseOutFull(float t, float b, float c, float d, float s = 1.70158f)\r\n        {\r\n            return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\r\n        }\r\n        public static float BackEaseInOutFull(float t, float b, float c, float d, float s = 1.70158f)\r\n        {\r\n            if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525f)) + 1) * t - s)) + b;\r\n            return c / 2 * ((t -= 2) * t * (((s *= (1.525f)) + 1) * t + s) + 2) + b;\r\n        }\r\n        #endregion\r\n\r\n        #region Bounce Ease\r\n        public static float BounceEaseOut(float t, float b, float c, float d)\r\n        {\r\n            if ((t /= d) < (1 / 2.75f))\r\n            {\r\n                return c * (7.5625f * t * t) + b;\r\n            }\r\n            else if (t < (2 / 2.75))\r\n            {\r\n                return c * (7.5625f * (t -= (1.5f / 2.75f)) * t + .75f) + b;\r\n            }\r\n            else if (t < (2.5f / 2.75f))\r\n            {\r\n                return c * (7.5625f * (t -= (2.25f / 2.75f)) * t + .9375f) + b;\r\n            }\r\n            else\r\n            {\r\n                return c * (7.5625f * (t -= (2.625f / 2.75f)) * t + .984375f) + b;\r\n            }\r\n        }\r\n        public static float BounceEaseIn(float t, float b, float c, float d)\r\n        {\r\n            return c - BounceEaseOut(d - t, 0, c, d) + b;\r\n        }\r\n        public static float BounceEaseInOut(float t, float b, float c, float d)\r\n        {\r\n            if (t < d / 2) return BounceEaseIn(t * 2, 0, c, d) * .5f + b;\r\n            else return BounceEaseOut(t * 2 - d, 0, c, d) * .5f + c * .5f + b;\r\n        }\r\n        #endregion\r\n\r\n        #region Circle Ease\r\n        public static float CircleEaseIn(float t, float b, float c, float d)\r\n        {\r\n            return -c * ((float)Math.Sqrt(1 - (t /= d) * t) - 1) + b;\r\n        }\r\n        public static float CircleEaseOut(float t, float b, float c, float d)\r\n        {\r\n            return c * (float)Math.Sqrt(1 - (t = t / d - 1) * t) + b;\r\n        }\r\n        public static float CircleEaseInOut(float t, float b, float c, float d)\r\n        {\r\n            if ((t /= d / 2) < 1) return -c / 2 * ((float)Math.Sqrt(1 - t * t) - 1) + b;\r\n            return c / 2 * ((float)Math.Sqrt(1 - (t -= 2) * t) + 1) + b;\r\n        }\r\n        #endregion\r\n\r\n        #region Cubic Ease\r\n\r\n        public static float CubicEaseIn(float t, float b, float c, float d)\r\n        {\r\n            return c * (t /= d) * t * t + b;\r\n        }\r\n        public static float CubicEaseOut(float t, float b, float c, float d)\r\n        {\r\n            return c * ((t = t / d - 1) * t * t + 1) + b;\r\n        }\r\n        public static float CubicEaseInOut(float t, float b, float c, float d)\r\n        {\r\n            if ((t /= d / 2) < 1) return c / 2 * t * t * t + b;\r\n            return c / 2 * ((t -= 2) * t * t + 2) + b;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Elastic Ease\r\n        public static float ElasticEaseIn(float t, float b, float c, float d)\r\n        {\r\n            return ElasticEaseInFull(t, b, c, d, 0, 0);\r\n        }\r\n\r\n        public static float ElasticEaseOut(float t, float b, float c, float d)\r\n        {\r\n            return ElasticEaseOutFull(t, b, c, d, 0, 0);\r\n        }\r\n\r\n        public static float ElasticEaseInOut(float t, float b, float c, float d)\r\n        {\r\n            return ElasticEaseInOutFull(t, b, c, d, 0, 0);\r\n        }\r\n\r\n        public static float ElasticEaseInFull(float t, float b, float c, float d, float a, float p)\r\n        {\r\n            float s;\r\n            if (t == 0f) return b; if ((t /= d) == 1) return b + c;\r\n            if (p == 0f) p = d * 0.3f;\r\n            if (a == 0f || a < Math.Abs(c)) { a = c; s = p / 4; }\r\n            else s = p / _2PI * (float)Math.Asin(c / a);\r\n            return -(a * (float)Math.Pow(2, 10 * (t -= 1)) * (float)Math.Sin((t * d - s) * _2PI / p)) + b;\r\n        }\r\n        public static float ElasticEaseOutFull(float t, float b, float c, float d, float a = 0, float p = 0)\r\n        {\r\n            float s;\r\n            if (t == 0f) return b;\r\n            if ((t /= d) == 1) return b + c;\r\n            if (p == 0f) p = d * 0.3f;\r\n            if (a == 0f || a < Math.Abs(c)) { a = c; s = p / 4; }\r\n            else s = p / _2PI * (float)Math.Asin(c / a);\r\n            return (a * (float)Math.Pow(2, -10 * t) * (float)Math.Sin((t * d - s) * _2PI / p) + c + b);\r\n        }\r\n        public static float ElasticEaseInOutFull(float t, float b, float c, float d, float a = 0, float p = 0)\r\n        {\r\n            float s;\r\n            if (t == 0f) return b; if ((t /= d / 2) == 2) return b + c;\r\n            if (p == 0f) p = d * (0.3f * 1.5f);\r\n            if (a == 0f || a < Math.Abs(c)) { a = c; s = p / 4; }\r\n            else s = p / _2PI * (float)Math.Asin(c / a);\r\n            if (t < 1) return -.5f * (a * (float)Math.Pow(2, 10 * (t -= 1)) * (float)Math.Sin((t * d - s) * _2PI / p)) + b;\r\n            return a * (float)Math.Pow(2, -10 * (t -= 1)) * (float)Math.Sin((t * d - s) * _2PI / p) * .5f + c + b;\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Expo Ease\r\n        public static float ExpoEaseIn(float t, float b, float c, float d)\r\n        {\r\n            return (t == 0) ? b : c * (float)Math.Pow(2, 10 * (t / d - 1)) + b - c * 0.001f;\r\n        }\r\n        public static float ExpoEaseOut(float t, float b, float c, float d)\r\n        {\r\n            return (t == d) ? b + c : c * (-(float)Math.Pow(2, -10 * t / d) + 1) + b;\r\n        }\r\n        public static float ExpoEaseInOut(float t, float b, float c, float d)\r\n        {\r\n            if (t == 0) return b;\r\n            if (t == d) return b + c;\r\n            if ((t /= d / 2) < 1) return c / 2 * (float)Math.Pow(2, 10 * (t - 1)) + b;\r\n            return c / 2 * (-(float)Math.Pow(2, -10 * --t) + 2) + b;\r\n        }\r\n        #endregion\r\n\r\n        #region Linear Ease\r\n        public static float LinearEaseNone(float t, float b, float c, float d)\r\n        {\r\n            return c * t / d + b;\r\n        }\r\n        public static float LinearEaseIn(float t, float b, float c, float d)\r\n        {\r\n            return c * t / d + b;\r\n        }\r\n        public static float LinearEaseOut(float t, float b, float c, float d)\r\n        {\r\n            return c * t / d + b;\r\n        }\r\n        public static float LinearEaseInOut(float t, float b, float c, float d)\r\n        {\r\n            return c * t / d + b;\r\n        }\r\n        #endregion\r\n\r\n        #region Quad Ease\r\n        public static float QuadEaseIn(float t, float b, float c, float d)\r\n        {\r\n            return c * (t /= d) * t + b;\r\n        }\r\n        public static float QuadEaseOut(float t, float b, float c, float d)\r\n        {\r\n            return -c * (t /= d) * (t - 2) + b;\r\n        }\r\n        public static float QuadEaseInOut(float t, float b, float c, float d)\r\n        {\r\n            if ((t /= d / 2) < 1) return c / 2 * t * t + b;\r\n            return -c / 2 * ((--t) * (t - 2) - 1) + b;\r\n        }\r\n        #endregion\r\n\r\n        #region Quart Ease\r\n        public static float QuartEaseIn(float t, float b, float c, float d)\r\n        {\r\n            return c * (t /= d) * t * t * t + b;\r\n        }\r\n        public static float QuartEaseOut(float t, float b, float c, float d)\r\n        {\r\n            return -c * ((t = t / d - 1) * t * t * t - 1) + b;\r\n        }\r\n        public static float QuartEaseInOut(float t, float b, float c, float d)\r\n        {\r\n            if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b;\r\n            return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\r\n        }\r\n        #endregion\r\n\r\n        #region Quint Ease\r\n        public static float QuintEaseIn(float t, float b, float c, float d)\r\n        {\r\n            return c * (t /= d) * t * t * t * t + b;\r\n        }\r\n        public static float QuintEaseOut(float t, float b, float c, float d)\r\n        {\r\n            return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\r\n        }\r\n        public static float QuintEaseInOut(float t, float b, float c, float d)\r\n        {\r\n            if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b;\r\n            return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\r\n        }\r\n        #endregion\r\n\r\n        #region Sine Ease\r\n        public static float SineEaseIn(float t, float b, float c, float d)\r\n        {\r\n            return -c * (float)Math.Cos(t / d * _HALF_PI) + c + b;\r\n        }\r\n        public static float SineEaseOut(float t, float b, float c, float d)\r\n        {\r\n            return c * (float)Math.Sin(t / d * _HALF_PI) + b;\r\n        }\r\n        public static float SineEaseInOut(float t, float b, float c, float d)\r\n        {\r\n            return -c / 2 * ((float)Math.Cos(Math.PI * t / d) - 1) + b;\r\n        }\r\n        #endregion\r\n\r\n        #region Strong Ease\r\n        public static float StrongEaseIn(float t, float b, float c, float d)\r\n        {\r\n            return c * (t /= d) * t * t * t * t + b;\r\n        }\r\n        public static float StrongEaseOut(float t, float b, float c, float d)\r\n        {\r\n            return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\r\n        }\r\n        public static float StrongEaseInOut(float t, float b, float c, float d)\r\n        {\r\n            if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b;\r\n            return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\r\n        }\r\n        #endregion\r\n        \r\n    }\r\n\r\n    /// <summary>\r\n    /// References to Ease delegates for use, this avoids the garbage of the ease delegate.\r\n    /// </summary>\r\n    public static class EaseMethods\r\n    {\r\n\r\n        public static Ease GetEase(EaseStyle style)\r\n        {\r\n            switch (style)\r\n            {\r\n                case EaseStyle.Linear: return EaseMethods.LinearEaseNone;\r\n                case EaseStyle.LinearEaseIn: return EaseMethods.LinearEaseIn;\r\n                case EaseStyle.LinearEaseOut: return EaseMethods.LinearEaseOut;\r\n                case EaseStyle.LinearEaseInOut: return EaseMethods.LinearEaseInOut;\r\n\r\n                case EaseStyle.BackEaseIn: return EaseMethods.BackEaseIn;\r\n                case EaseStyle.BackEaseOut: return EaseMethods.BackEaseOut;\r\n                case EaseStyle.BackEaseInOut: return EaseMethods.BackEaseInOut;\r\n\r\n                case EaseStyle.BounceEaseIn: return EaseMethods.BounceEaseIn;\r\n                case EaseStyle.BounceEaseOut: return EaseMethods.BounceEaseOut;\r\n                case EaseStyle.BounceEaseInOut: return EaseMethods.BounceEaseInOut;\r\n\r\n                case EaseStyle.CircleEaseIn: return EaseMethods.CircleEaseIn;\r\n                case EaseStyle.CircleEaseOut: return EaseMethods.CircleEaseOut;\r\n                case EaseStyle.CircleEaseInOut: return EaseMethods.CircleEaseInOut;\r\n\r\n                case EaseStyle.CubicEaseIn: return EaseMethods.CubicEaseIn;\r\n                case EaseStyle.CubicEaseOut: return EaseMethods.CubicEaseOut;\r\n                case EaseStyle.CubicEaseInOut: return EaseMethods.CubicEaseInOut;\r\n\r\n                case EaseStyle.ElasticEaseIn: return EaseMethods.ElasticEaseIn;\r\n                case EaseStyle.ElasticEaseOut: return EaseMethods.ElasticEaseOut;\r\n                case EaseStyle.ElasticEaseInOut: return EaseMethods.ElasticEaseInOut;\r\n\r\n                case EaseStyle.ExpoEaseIn: return EaseMethods.ExpoEaseIn;\r\n                case EaseStyle.ExpoEaseOut: return EaseMethods.ExpoEaseOut;\r\n                case EaseStyle.ExpoEaseInOut: return EaseMethods.ExpoEaseInOut;\r\n\r\n                case EaseStyle.QuadEaseIn: return EaseMethods.QuadEaseIn;\r\n                case EaseStyle.QuadEaseOut: return EaseMethods.QuadEaseOut;\r\n                case EaseStyle.QuadEaseInOut: return EaseMethods.QuadEaseInOut;\r\n\r\n                case EaseStyle.QuartEaseIn: return EaseMethods.QuartEaseIn;\r\n                case EaseStyle.QuartEaseOut: return EaseMethods.QuartEaseOut;\r\n                case EaseStyle.QuartEaseInOut: return EaseMethods.QuartEaseInOut;\r\n\r\n                case EaseStyle.QuintEaseIn: return EaseMethods.QuintEaseIn;\r\n                case EaseStyle.QuintEaseOut: return EaseMethods.QuintEaseOut;\r\n                case EaseStyle.QuintEaseInOut: return EaseMethods.QuintEaseInOut;\r\n\r\n                case EaseStyle.SineEaseIn: return EaseMethods.SineEaseIn;\r\n                case EaseStyle.SineEaseOut: return EaseMethods.SineEaseOut;\r\n                case EaseStyle.SineEaseInOut: return EaseMethods.SineEaseInOut;\r\n\r\n                case EaseStyle.StrongEaseIn: return EaseMethods.StrongEaseIn;\r\n                case EaseStyle.StrongEaseOut: return EaseMethods.StrongEaseOut;\r\n                case EaseStyle.StrongEaseInOut: return EaseMethods.StrongEaseInOut;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static float EasedLerp(Ease ease, float from, float to, float t)\r\n        {\r\n            return ease(t, from, to - from, 1f);\r\n        }\r\n\r\n\r\n\r\n        #region Back Ease\r\n\r\n        private static Ease _backEaseIn;\r\n        public static Ease BackEaseIn\r\n        {\r\n            get\r\n            {\r\n                if (_backEaseIn == null) _backEaseIn = ConcreteEaseMethods.BackEaseIn;\r\n                return _backEaseIn;\r\n            }\r\n        }\r\n\r\n        private static Ease _backEaseOut;\r\n        public static Ease BackEaseOut\r\n        {\r\n            get\r\n            {\r\n                if (_backEaseOut == null) _backEaseOut = ConcreteEaseMethods.BackEaseOut;\r\n                return _backEaseOut;\r\n            }\r\n        }\r\n\r\n        private static Ease _backEaseInOut;\r\n        public static Ease BackEaseInOut\r\n        {\r\n            get\r\n            {\r\n                if (_backEaseInOut == null) _backEaseInOut = ConcreteEaseMethods.BackEaseInOut;\r\n                return _backEaseInOut;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Bounce Ease\r\n\r\n        private static Ease _bounceEaseIn;\r\n        public static Ease BounceEaseIn\r\n        {\r\n            get\r\n            {\r\n                if (_bounceEaseIn == null) _bounceEaseIn = ConcreteEaseMethods.BounceEaseIn;\r\n                return _bounceEaseIn;\r\n            }\r\n        }\r\n\r\n        private static Ease _bounceEaseOut;\r\n        public static Ease BounceEaseOut\r\n        {\r\n            get\r\n            {\r\n                if (_bounceEaseOut == null) _bounceEaseOut = ConcreteEaseMethods.BounceEaseOut;\r\n                return _bounceEaseOut;\r\n            }\r\n        }\r\n\r\n        private static Ease _bounceEaseInOut;\r\n        public static Ease BounceEaseInOut\r\n        {\r\n            get\r\n            {\r\n                if (_bounceEaseInOut == null) _bounceEaseInOut = ConcreteEaseMethods.BounceEaseInOut;\r\n                return _bounceEaseInOut;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Circle Ease\r\n\r\n        private static Ease _circleEaseIn;\r\n        public static Ease CircleEaseIn\r\n        {\r\n            get\r\n            {\r\n                if (_circleEaseIn == null) _circleEaseIn = ConcreteEaseMethods.CircleEaseIn;\r\n                return _circleEaseIn;\r\n            }\r\n        }\r\n\r\n        private static Ease _circleEaseOut;\r\n        public static Ease CircleEaseOut\r\n        {\r\n            get\r\n            {\r\n                if (_circleEaseOut == null) _circleEaseOut = ConcreteEaseMethods.CircleEaseOut;\r\n                return _circleEaseOut;\r\n            }\r\n        }\r\n\r\n        private static Ease _circleEaseInOut;\r\n        public static Ease CircleEaseInOut\r\n        {\r\n            get\r\n            {\r\n                if (_circleEaseInOut == null) _circleEaseInOut = ConcreteEaseMethods.CircleEaseInOut;\r\n                return _circleEaseInOut;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Cubic Ease\r\n\r\n        private static Ease _cubicEaseIn;\r\n        public static Ease CubicEaseIn\r\n        {\r\n            get\r\n            {\r\n                if (_cubicEaseIn == null) _cubicEaseIn = ConcreteEaseMethods.CubicEaseIn;\r\n                return _cubicEaseIn;\r\n            }\r\n        }\r\n\r\n        private static Ease _cubicEaseOut;\r\n        public static Ease CubicEaseOut\r\n        {\r\n            get\r\n            {\r\n                if (_cubicEaseOut == null) _cubicEaseOut = ConcreteEaseMethods.CubicEaseOut;\r\n                return _cubicEaseOut;\r\n            }\r\n        }\r\n\r\n        private static Ease _cubicEaseInOut;\r\n        public static Ease CubicEaseInOut\r\n        {\r\n            get\r\n            {\r\n                if (_cubicEaseInOut == null) _cubicEaseInOut = ConcreteEaseMethods.CubicEaseInOut;\r\n                return _cubicEaseInOut;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Elastic Ease\r\n\r\n        private static Ease _elasticEaseIn;\r\n        public static Ease ElasticEaseIn\r\n        {\r\n            get\r\n            {\r\n                if (_elasticEaseIn == null) _elasticEaseIn = ConcreteEaseMethods.ElasticEaseIn;\r\n                return _elasticEaseIn;\r\n            }\r\n        }\r\n\r\n        private static Ease _elasticEaseOut;\r\n        public static Ease ElasticEaseOut\r\n        {\r\n            get\r\n            {\r\n                if (_elasticEaseOut == null) _elasticEaseOut = ConcreteEaseMethods.ElasticEaseOut;\r\n                return _elasticEaseOut;\r\n            }\r\n        }\r\n\r\n        private static Ease _elasticEaseInOut;\r\n        public static Ease ElasticEaseInOut\r\n        {\r\n            get\r\n            {\r\n                if (_elasticEaseInOut == null) _elasticEaseInOut = ConcreteEaseMethods.ElasticEaseInOut;\r\n                return _elasticEaseInOut;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Expo Ease\r\n\r\n        private static Ease _expoEaseIn;\r\n        public static Ease ExpoEaseIn\r\n        {\r\n            get\r\n            {\r\n                if (_expoEaseIn == null) _expoEaseIn = ConcreteEaseMethods.ExpoEaseIn;\r\n                return _expoEaseIn;\r\n            }\r\n        }\r\n\r\n        private static Ease _expoEaseOut;\r\n        public static Ease ExpoEaseOut\r\n        {\r\n            get\r\n            {\r\n                if (_expoEaseOut == null) _expoEaseOut = ConcreteEaseMethods.ExpoEaseOut;\r\n                return _expoEaseOut;\r\n            }\r\n        }\r\n\r\n        private static Ease _expoEaseInOut;\r\n        public static Ease ExpoEaseInOut\r\n        {\r\n            get\r\n            {\r\n                if (_expoEaseInOut == null) _expoEaseInOut = ConcreteEaseMethods.ExpoEaseInOut;\r\n                return _expoEaseInOut;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Linear Ease\r\n\r\n        private static Ease _linearEaseNone;\r\n        public static Ease LinearEaseNone\r\n        {\r\n            get\r\n            {\r\n                if (_linearEaseNone == null) _linearEaseNone = ConcreteEaseMethods.LinearEaseNone;\r\n                return _linearEaseNone;\r\n            }\r\n        }\r\n\r\n        private static Ease _linearEaseIn;\r\n        public static Ease LinearEaseIn\r\n        {\r\n            get\r\n            {\r\n                if (_linearEaseIn == null) _linearEaseIn = ConcreteEaseMethods.LinearEaseIn;\r\n                return _linearEaseIn;\r\n            }\r\n        }\r\n\r\n        private static Ease _linearEaseOut;\r\n        public static Ease LinearEaseOut\r\n        {\r\n            get\r\n            {\r\n                if (_linearEaseOut == null) _linearEaseOut = ConcreteEaseMethods.LinearEaseOut;\r\n                return _linearEaseOut;\r\n            }\r\n        }\r\n\r\n        private static Ease _linearEaseInOut;\r\n        public static Ease LinearEaseInOut\r\n        {\r\n            get\r\n            {\r\n                if (_linearEaseInOut == null) _linearEaseInOut = ConcreteEaseMethods.LinearEaseInOut;\r\n                return _linearEaseInOut;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Quad Ease\r\n\r\n        private static Ease _quadEaseIn;\r\n        public static Ease QuadEaseIn\r\n        {\r\n            get\r\n            {\r\n                if (_quadEaseIn == null) _quadEaseIn = ConcreteEaseMethods.QuadEaseIn;\r\n                return _quadEaseIn;\r\n            }\r\n        }\r\n\r\n        private static Ease _quadEaseOut;\r\n        public static Ease QuadEaseOut\r\n        {\r\n            get\r\n            {\r\n                if (_quadEaseOut == null) _quadEaseOut = ConcreteEaseMethods.QuadEaseOut;\r\n                return _quadEaseOut;\r\n            }\r\n        }\r\n\r\n        private static Ease _quadEaseInOut;\r\n        public static Ease QuadEaseInOut\r\n        {\r\n            get\r\n            {\r\n                if (_quadEaseInOut == null) _quadEaseInOut = ConcreteEaseMethods.QuadEaseInOut;\r\n                return _quadEaseInOut;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Quart Ease\r\n\r\n        private static Ease _quartEaseIn;\r\n        public static Ease QuartEaseIn\r\n        {\r\n            get\r\n            {\r\n                if (_quartEaseIn == null) _quartEaseIn = ConcreteEaseMethods.QuartEaseIn;\r\n                return _quartEaseIn;\r\n            }\r\n        }\r\n\r\n        private static Ease _quartEaseOut;\r\n        public static Ease QuartEaseOut\r\n        {\r\n            get\r\n            {\r\n                if (_quartEaseOut == null) _quartEaseOut = ConcreteEaseMethods.QuartEaseOut;\r\n                return _quartEaseOut;\r\n            }\r\n        }\r\n\r\n        private static Ease _quartEaseInOut;\r\n        public static Ease QuartEaseInOut\r\n        {\r\n            get\r\n            {\r\n                if (_quartEaseInOut == null) _quartEaseInOut = ConcreteEaseMethods.QuartEaseInOut;\r\n                return _quartEaseInOut;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Quint Ease\r\n\r\n        private static Ease _quintEaseIn;\r\n        public static Ease QuintEaseIn\r\n        {\r\n            get\r\n            {\r\n                if (_quintEaseIn == null) _quintEaseIn = ConcreteEaseMethods.QuintEaseIn;\r\n                return _quintEaseIn;\r\n            }\r\n        }\r\n\r\n        private static Ease _quintEaseOut;\r\n        public static Ease QuintEaseOut\r\n        {\r\n            get\r\n            {\r\n                if (_quintEaseOut == null) _quintEaseOut = ConcreteEaseMethods.QuintEaseOut;\r\n                return _quintEaseOut;\r\n            }\r\n        }\r\n\r\n        private static Ease _quintEaseInOut;\r\n        public static Ease QuintEaseInOut\r\n        {\r\n            get\r\n            {\r\n                if (_quintEaseInOut == null) _quintEaseInOut = ConcreteEaseMethods.QuintEaseInOut;\r\n                return _quintEaseInOut;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Sine Ease\r\n\r\n        private static Ease _sineEaseIn;\r\n        public static Ease SineEaseIn\r\n        {\r\n            get\r\n            {\r\n                if (_sineEaseIn == null) _sineEaseIn = ConcreteEaseMethods.SineEaseIn;\r\n                return _sineEaseIn;\r\n            }\r\n        }\r\n\r\n        private static Ease _sineEaseOut;\r\n        public static Ease SineEaseOut\r\n        {\r\n            get\r\n            {\r\n                if (_sineEaseOut == null) _sineEaseOut = ConcreteEaseMethods.SineEaseOut;\r\n                return _sineEaseOut;\r\n            }\r\n        }\r\n\r\n        private static Ease _sineEaseInOut;\r\n        public static Ease SineEaseInOut\r\n        {\r\n            get\r\n            {\r\n                if (_sineEaseInOut == null) _sineEaseInOut = ConcreteEaseMethods.SineEaseInOut;\r\n                return _sineEaseInOut;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Strong Ease\r\n\r\n        private static Ease _strongEaseIn;\r\n        public static Ease StrongEaseIn\r\n        {\r\n            get\r\n            {\r\n                if (_strongEaseIn == null) _strongEaseIn = ConcreteEaseMethods.StrongEaseIn;\r\n                return _strongEaseIn;\r\n            }\r\n        }\r\n\r\n        private static Ease _strongEaseOut;\r\n        public static Ease StrongEaseOut\r\n        {\r\n            get\r\n            {\r\n                if (_strongEaseOut == null) _strongEaseOut = ConcreteEaseMethods.StrongEaseOut;\r\n                return _strongEaseOut;\r\n            }\r\n        }\r\n\r\n        private static Ease _strongEaseInOut;\r\n        public static Ease StrongEaseInOut\r\n        {\r\n            get\r\n            {\r\n                if (_strongEaseInOut == null) _strongEaseInOut = ConcreteEaseMethods.StrongEaseInOut;\r\n                return _strongEaseInOut;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region AnimationCurve\r\n\r\n        /// <summary>\r\n        /// Returns an Ease method that ignores start and end. Instead just returning the value in the curve for 'c', as if you called Evaluate(c).\r\n        /// </summary>\r\n        /// <param name=\"curve\"></param>\r\n        /// <returns></returns>\r\n        public static Ease FromAnimationCurve(AnimationCurve curve)\r\n        {\r\n            return (c, s, e, d) =>\r\n            {\r\n                return curve.Evaluate(c);\r\n            };\r\n        }\r\n\r\n        /// <summary>\r\n        /// This treats the curve as if it's a scaling factor. The vertical from 0->1 is the value s->e. And the horizontal is just 'c'. 'd' is ignored in favor of the duration of the curve.\r\n        /// </summary>\r\n        /// <param name=\"curve\"></param>\r\n        /// <returns></returns>\r\n        public static Ease FromVerticalScalingAnimationCurve(AnimationCurve curve)\r\n        {\r\n            return (c, s, e, d) =>\r\n            {\r\n                if (d <= 0f) return e;\r\n                return Mathf.LerpUnclamped(s, e, curve.Evaluate(c / d));\r\n            };\r\n        }\r\n\r\n        /// <summary>\r\n        /// This treats the curve as if it's a scaling factor. The vertical from 0->1 is the value s->e. And the horizontal from 0->1 is the time from c->d.\r\n        /// </summary>\r\n        /// <param name=\"curve\"></param>\r\n        /// <returns></returns>\r\n        public static Ease FromScalingAnimationCurve(AnimationCurve curve)\r\n        {\r\n            return (c, s, e, d) =>\r\n            {\r\n                if (d <= 0f) return e;\r\n                return Mathf.LerpUnclamped(s, e, curve.Evaluate(c / d));\r\n            };\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Configurable Cubic Bezier\r\n\r\n        public static Ease CubicBezier(float p0, float p1, float p2, float p3)\r\n        {\r\n            return (c, s, e, d) =>\r\n            {\r\n                var t = c / d;\r\n                var it = 1f - t;\r\n                var r = (Mathf.Pow(it, 3f) * p0)\r\n                      + (3f * Mathf.Pow(it, 2f) * t * p1)\r\n                      + (3f * it * Mathf.Pow(t, 2f) * p2)\r\n                      + (Mathf.Pow(t, 3f) * p3);\r\n                return s + e * r;\r\n            };\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n        public static Vector2 EaseVector2(Ease ease, Vector2 start, Vector2 end, float t, float dur)\r\n        {\r\n            return (ease(t, 0, 1, dur) * (end - start)) + start;\r\n\r\n            //return new Vector2(ease(t, start.x, end.x - start.x, dur), ease(t, start.y, end.y - start.y, dur));\r\n        }\r\n\r\n        public static Vector3 EaseVector3(Ease ease, Vector3 start, Vector3 end, float t, float dur)\r\n        {\r\n            return (ease(t, 0, 1, dur) * (end - start)) + start;\r\n\r\n            //return new Vector3(ease(t, start.x, end.x - start.x, dur), ease(t, start.y, end.y - start.y, dur), ease(t, start.z, end.z - start.z, dur));\r\n        }\r\n\r\n        public static Vector4 EaseVector4(Ease ease, Vector4 start, Vector4 end, float t, float dur)\r\n        {\r\n            return (ease(t, 0, 1, dur) * (end - start)) + start;\r\n\r\n            //return new Vector4(ease(t, start.x, end.x - start.x, dur), ease(t, start.y, end.y - start.y, dur), ease(t, start.z, end.z - start.z, dur), ease(t, start.w, end.w - start.w, dur));\r\n        }\r\n\r\n        public static Quaternion EaseQuaternion(Ease ease, Quaternion start, Quaternion end, float t, float dur)\r\n        {\r\n            return Quaternion.Slerp(start, end, ease(t, 0, 1, dur));\r\n        }\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Enums.cs",
    "content": "﻿using System;\r\n\r\nnamespace com.spacepuppy.Tween\r\n{\r\n\r\n    public enum TweenWrapMode\r\n    {\r\n        Once = 0,\r\n        Loop = 1,\r\n        PingPong = 2\r\n    }\r\n\r\n    [Flags()]\r\n    public enum StringTweenStyle\r\n    {\r\n        Default = 0,\r\n        LeftToRight = 0,\r\n        RightToLeft = 1,\r\n        Jumble = 2,\r\n        LeftToRightJumble = 2,\r\n        RightToLeftJumble = 3\r\n    }\r\n\r\n    public enum QuaternionTweenOption\r\n    {\r\n        Spherical,\r\n        Linear,\r\n        /// <summary>\r\n        /// Rotate full rotation. So if you pass in values 0,0,0 -> 0,720,0 \r\n        /// it will rotate the full 720 degrees.\r\n        /// </summary>\r\n        Long\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/ITweenHash.cs",
    "content": "﻿namespace com.spacepuppy.Tween\r\n{\r\n    public interface ITweenHash\r\n    {\r\n\r\n        ITweenHash SetId(object id);\r\n        ITweenHash Ease(Ease ease);\r\n        ITweenHash Delay(float delay);\r\n        ITweenHash UseUpdate();\r\n        ITweenHash UseFixedUpdate();\r\n        ITweenHash UseLateUpdate();\r\n        ITweenHash Use(UpdateSequence type);\r\n        ITweenHash UseNormalTime();\r\n        ITweenHash UseRealTime();\r\n        ITweenHash UseSmoothTime();\r\n        ITweenHash Use(ITimeSupplier type);\r\n        ITweenHash PlayOnce();\r\n        ITweenHash Loop(int count = -1);\r\n        ITweenHash PingPong(int count = -1);\r\n        ITweenHash Wrap(TweenWrapMode wrap, int count = -1);\r\n        ITweenHash Reverse();\r\n        ITweenHash Reverse(bool reverse);\r\n        ITweenHash SpeedScale(float scale);\r\n        ITweenHash OnStep(System.EventHandler d);\r\n        ITweenHash OnStep(System.Action<Tweener> d);\r\n        ITweenHash OnWrap(System.EventHandler d);\r\n        ITweenHash OnWrap(System.Action<Tweener> d);\r\n        ITweenHash OnFinish(System.EventHandler d);\r\n        ITweenHash OnFinish(System.Action<Tweener> d);\r\n        ITweenHash OnStopped(System.EventHandler d);\r\n        ITweenHash OnStopped(System.Action<Tweener> d);\r\n        \r\n        Tweener Play(bool autoKill, object autoKillToken = null);\r\n        Tweener Play(float playHeadPosition, bool autoKill, object autoKillToken = null);\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/ITweenMemberAccessor.cs",
    "content": "﻿\r\nusing com.spacepuppy.Dynamic.Accessors;\r\n\r\nnamespace com.spacepuppy.Tween\r\n{\r\n\r\n    /// <summary>\r\n    /// Implement this interface along with the class attribute 'CustomTweenMemberAccessorAttribute' to define a custom accessor \r\n    /// that will be used to set the value of an object.\r\n    /// \r\n    /// The CustomTweenMemberAccessorAttribute requires accepts a type to apply this accessor to, as well as the name of the property. \r\n    /// The property doesn't have to be an actual property on the type, and can be any custom name you define. For example the \r\n    /// 'GeneralMoveAccessor' is called upon for Rigidbody, Transform, and GameObject for the property \"*Move\".\r\n    /// </summary>\r\n    public interface ITweenMemberAccessor : IMemberAccessor\r\n    {\r\n\r\n        /// <summary>\r\n        /// Return the member type that Get/Set expects.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        System.Type GetMemberType();\r\n\r\n        /// <summary>\r\n        /// Initialize the member accessor, and return the type this accessor is supposed to handle.\r\n        /// </summary>\r\n        /// <param name=\"propName\"></param>\r\n        /// <returns>Return the member type that Get/Set expects.</returns>\r\n        System.Type Init(object target, string propName, string args);\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/MemberCurve.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Tween.Accessors;\r\nusing com.spacepuppy.Tween.Curves;\r\nusing com.spacepuppy.Utils;\r\nusing com.spacepuppy.Dynamic.Accessors;\r\n\r\nnamespace com.spacepuppy.Tween\r\n{\r\n\r\n    public interface ISupportRedirectToMemberCurve\r\n    {\r\n        void ConfigureAsRedirectTo(System.Type memberType, float totalDur, object current, object start, object end, object option);\r\n    }\r\n\r\n    /// <summary>\r\n    /// Base class for curves that reflectively access members of a target object.\r\n    /// If the member curve is a CustomMemberCurve that should be buildable by the MemberCurve.Create factory method, \r\n    /// it MUST contain a 0 parameter constructor.\r\n    /// </summary>\r\n    public abstract class MemberCurve : TweenCurve\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Ease _ease;\r\n        private float _dur;\r\n\r\n        private string _memberName;\r\n        private IMemberAccessor _accessor;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        /// <summary>\r\n        /// This MUST exist for reflective creation.\r\n        /// </summary>\r\n        protected MemberCurve()\r\n        {\r\n        }\r\n\r\n        public MemberCurve(string propName, float dur)\r\n        {\r\n            _memberName = propName;\r\n            _ease = EaseMethods.LinearEaseNone;\r\n            _dur = dur;\r\n        }\r\n\r\n        public MemberCurve(string propName, Ease ease, float dur)\r\n        {\r\n            _memberName = propName;\r\n            _ease = ease;\r\n            _dur = dur;\r\n        }\r\n        \r\n        /// <summary>\r\n        /// Override this method to handle the reflective creation of this object.\r\n        /// </summary>\r\n        /// <param name=\"start\"></param>\r\n        /// <param name=\"end\"></param>\r\n        /// <param name=\"option\"></param>\r\n        protected abstract void ReflectiveInit(System.Type memberType, object start, object end, object option);\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Ease Ease\r\n        {\r\n            get { return _ease; }\r\n            set\r\n            {\r\n                if (value == null) throw new System.ArgumentNullException(\"value\");\r\n                _ease = value;\r\n            }\r\n        }\r\n\r\n        public float Duration\r\n        {\r\n            get { return _dur; }\r\n            protected set { _dur = value; }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Returns the appropriate value of the member on the curve at t, where t is a scalar (t would be 1.0, not 100, for 100%).\r\n        /// </summary>\r\n        /// <param name=\"t\">The percentage of completion across the curve that the member is at.</param>\r\n        /// <returns></returns>\r\n        protected abstract object GetValueAt(float dt, float t);\r\n        \r\n        #endregion\r\n\r\n        #region ICurve Interface\r\n\r\n        public float TotalDuration\r\n        {\r\n            get { return _dur; }\r\n        }\r\n\r\n        public override float TotalTime\r\n        {\r\n            get { return  _dur; }\r\n        }\r\n\r\n        public sealed override void Update(object targ, float dt, float t)\r\n        {\r\n            if (t > _dur) t = _dur;\r\n            var value = GetValueAt(dt, t);\r\n            if (_accessor == null)\r\n            {\r\n                System.Type memberType;\r\n                _accessor = MemberCurve.GetAccessor(targ, _memberName, out memberType);\r\n            }\r\n            _accessor.Set(targ, value);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Factory\r\n\r\n        private static IMemberAccessor GetAccessor(object target, string propName, out System.Type memberType)\r\n        {\r\n            string args = null;\r\n            if (propName != null)\r\n            {\r\n                int fi = propName.IndexOf(\"(\");\r\n                if (fi >= 0)\r\n                {\r\n                    int li = propName.LastIndexOf(\")\");\r\n                    if (li < fi) li = propName.Length;\r\n                    args = propName.Substring(fi + 1, li - fi - 1);\r\n                    propName = propName.Substring(0, fi);\r\n                }\r\n            }\r\n\r\n            ITweenMemberAccessor acc;\r\n            if (CustomTweenMemberAccessorFactory.TryGetMemberAccessor(target, propName, out acc))\r\n            {\r\n                memberType = acc.Init(target, propName, args);\r\n                return acc;\r\n            }\r\n\r\n            //return MemberAccessorPool.GetAccessor(target.GetType(), propName, out memberType);\r\n            return MemberAccessorPool.GetDynamicAccessor(target, propName, out memberType);\r\n        }\r\n\r\n\r\n\r\n\r\n        #region Curve Accessors\r\n\r\n        private static Dictionary<System.Type, System.Type> _memberTypeToCurveType;\r\n\r\n        private static void BuildCurveTypeDictionary()\r\n        {\r\n            _memberTypeToCurveType = new Dictionary<System.Type, System.Type>();\r\n\r\n            var priorities = new Dictionary<System.Type, int>();\r\n            foreach(var tp in TypeUtil.GetTypesAssignableFrom(typeof(MemberCurve)))\r\n            {\r\n                var attribs = tp.GetCustomAttributes(typeof(CustomMemberCurveAttribute), false).Cast<CustomMemberCurveAttribute>().ToArray();\r\n                foreach(var attrib in attribs)\r\n                {\r\n                    if (!priorities.ContainsKey(attrib.HandledMemberType) || priorities[attrib.HandledMemberType] < attrib.priority)\r\n                    {\r\n                        priorities[attrib.HandledMemberType] = attrib.priority;\r\n                        _memberTypeToCurveType[attrib.HandledMemberType] = tp;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        private static MemberCurve Create(System.Type memberType, IMemberAccessor accessor, Ease ease, float dur, object start, object end, object option)\r\n        {\r\n            if (_memberTypeToCurveType == null) BuildCurveTypeDictionary();\r\n\r\n            if (_memberTypeToCurveType.ContainsKey(memberType))\r\n            {\r\n                try\r\n                {\r\n                    if (ease == null) throw new System.ArgumentNullException(\"ease\");\r\n                    var curve = System.Activator.CreateInstance(_memberTypeToCurveType[memberType], true) as MemberCurve;\r\n                    curve._dur = dur;\r\n                    curve._ease = ease;\r\n                    curve._accessor = accessor;\r\n                    curve.ReflectiveInit(memberType, start, end, option);\r\n                    return curve;\r\n                }\r\n                catch (System.Exception ex)\r\n                {\r\n                    throw new System.InvalidOperationException(\"Failed to create a MemberCurve for the desired MemberInfo.\", ex);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new System.ArgumentException(\"MemberInfo is for a member type that is not supported.\", \"info\");\r\n            }\r\n        }\r\n\r\n        private static MemberCurve CreateUnitializedCurve(System.Type memberType, IMemberAccessor accessor)\r\n        {\r\n            if (_memberTypeToCurveType == null) BuildCurveTypeDictionary();\r\n\r\n            if (_memberTypeToCurveType.ContainsKey(memberType))\r\n            {\r\n                try\r\n                {\r\n                    return System.Activator.CreateInstance(_memberTypeToCurveType[memberType], true) as MemberCurve;\r\n                }\r\n                catch (System.Exception ex)\r\n                {\r\n                    throw new System.InvalidOperationException(\"Failed to create a MemberCurve for the desired MemberInfo.\", ex);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new System.ArgumentException(\"MemberInfo is for a member type that is not supported.\", \"info\");\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        public new static MemberCurve CreateTo(object target, string propName, Ease ease, object end, float dur, object option = null)\r\n        {\r\n            if (target == null) throw new System.ArgumentNullException(\"target\");\r\n            System.Type memberType;\r\n            var accessor = MemberCurve.GetAccessor(target, propName, out memberType);\r\n\r\n            object start = accessor.Get(target);\r\n\r\n            return MemberCurve.Create(memberType, accessor, ease, dur, start, end, option);\r\n        }\r\n\r\n        public new static MemberCurve CreateFrom(object target, string propName, Ease ease, object start, float dur, object option = null)\r\n        {\r\n            if (target == null) throw new System.ArgumentNullException(\"target\");\r\n            System.Type memberType;\r\n            var accessor = MemberCurve.GetAccessor(target, propName, out memberType);\r\n\r\n            object end = accessor.Get(target);\r\n\r\n            return MemberCurve.Create(memberType, accessor, ease, dur, start, end, option);\r\n        }\r\n\r\n        public new static MemberCurve CreateBy(object target, string propName, Ease ease, object amt, float dur, object option = null)\r\n        {\r\n            if (target == null) throw new System.ArgumentNullException(\"target\");\r\n            System.Type memberType;\r\n            var accessor = MemberCurve.GetAccessor(target, propName, out memberType);\r\n\r\n            object start = accessor.Get(target);\r\n            object end = TweenCurve.TrySum(memberType, start, amt);\r\n\r\n            return MemberCurve.Create(memberType, accessor, ease, dur, start, end, option);\r\n        }\r\n\r\n        public new static MemberCurve CreateFromTo(object target, string propName, Ease ease, object start, object end, float dur, object option = null)\r\n        {\r\n            if (target == null) throw new System.ArgumentNullException(\"target\");\r\n            System.Type memberType;\r\n            var accessor = MemberCurve.GetAccessor(target, propName, out memberType);\r\n            \r\n            return MemberCurve.Create(memberType, accessor, ease, dur, start, end, option);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates a curve that will animate from the current value to the end value, but will rescale the duration from how long it should have \r\n        /// taken from start to end, but already animated up to current.\r\n        /// </summary>\r\n        /// <param name=\"target\"></param>\r\n        /// <param name=\"propName\"></param>\r\n        /// <param name=\"ease\"></param>\r\n        /// <param name=\"start\"></param>\r\n        /// <param name=\"end\"></param>\r\n        /// <param name=\"dur\"></param>\r\n        /// <param name=\"option\"></param>\r\n        /// <returns></returns>\r\n        public new static MemberCurve CreateRedirectTo(object target, string propName, Ease ease, float start, float end, float dur, object option = null)\r\n        {\r\n            if (target == null) throw new System.ArgumentNullException(\"target\");\r\n            System.Type memberType;\r\n            var accessor = MemberCurve.GetAccessor(target, propName, out memberType);\r\n\r\n            var current = accessor.Get(target);\r\n            dur = (1f - MathUtil.PercentageOffMinMax(ConvertUtil.ToSingle(current), end, start)) * dur;\r\n\r\n            return MemberCurve.Create(memberType, accessor, ease, dur, current, ConvertUtil.ToPrim(end, memberType), option);\r\n        }\r\n\r\n        public static MemberCurve CreateRedirectTo(object target, string propName, Ease ease, object start, object end, float dur, object option = null)\r\n        {\r\n            if (target == null) throw new System.ArgumentNullException(\"target\");\r\n            if (ease == null) throw new System.ArgumentNullException(\"ease\");\r\n\r\n            System.Type memberType;\r\n            var accessor = MemberCurve.GetAccessor(target, propName, out memberType);\r\n\r\n            var curve = CreateUnitializedCurve(memberType, accessor);\r\n            curve._ease = ease;\r\n            curve._accessor = accessor;\r\n            if (curve is ISupportRedirectToMemberCurve)\r\n            {\r\n                (curve as ISupportRedirectToMemberCurve).ConfigureAsRedirectTo(memberType, dur, accessor.Get(target), start, end, option);\r\n            }\r\n            else\r\n            {\r\n                //try to coerce\r\n                curve._dur = dur;\r\n                var current = accessor.Get(target);\r\n                dur = (1f - MathUtil.PercentageOffMinMax(ConvertUtil.ToSingle(current), ConvertUtil.ToSingle(end), ConvertUtil.ToSingle(start))) * dur;\r\n                return MemberCurve.Create(memberType, accessor, ease, dur, current, ConvertUtil.ToPrim(end, memberType), option);\r\n            }\r\n            \r\n            return curve;\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/ObjectTweener.cs",
    "content": "﻿\r\nusing System;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween\r\n{\r\n    public class ObjectTweener : Tweener\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private object _target;\r\n        private TweenCurve _curve;\r\n        private object _id;\r\n\r\n        #endregion\r\n        \r\n        #region CONSTRUCTOR\r\n\r\n        public ObjectTweener(object targ, TweenCurve curve)\r\n        {\r\n            if (targ == null) throw new System.ArgumentNullException(\"targ\");\r\n            if (curve == null) throw new System.ArgumentNullException(\"curve\");\r\n            if (curve.Tween != null) throw new System.ArgumentException(\"Tweener can only be created with an unregistered Curve.\", \"curve\");\r\n\r\n            _target = targ;\r\n            _curve = curve;\r\n            _curve.Init(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public override object Id\r\n        {\r\n            get\r\n            {\r\n                return (_id != null) ? _id : _target;\r\n            }\r\n            set\r\n            {\r\n                _id = value;\r\n            }\r\n        }\r\n\r\n        public object Target { get { return _target; } }\r\n\r\n        #endregion\r\n\r\n        #region Tweener Interface\r\n\r\n        protected internal override bool GetTargetIsDestroyed()\r\n        {\r\n            return _target.IsNullOrDestroyed();\r\n        }\r\n\r\n        protected internal override float GetPlayHeadLength()\r\n        {\r\n            return _curve.TotalTime;\r\n        }\r\n\r\n        protected internal override void DoUpdate(float dt, float t)\r\n        {\r\n            if (_target.IsNullOrDestroyed())\r\n            {\r\n                this.Stop();\r\n                return;\r\n            }\r\n            _curve.Update(_target, dt, t);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private struct TokenPairing\r\n        {\r\n            public object Target;\r\n            public object TokenUid;\r\n\r\n            public TokenPairing(object targ, object uid)\r\n            {\r\n                this.Target = targ;\r\n                this.TokenUid = uid;\r\n            }\r\n\r\n            //public override bool Equals(object obj)\r\n            //{\r\n            //    if (obj == null) return false;\r\n            //    if (!(obj is TokenPairing)) return false;\r\n\r\n            //    var token = (TokenPairing)obj;\r\n            //    return token.Target == this.Target && token.TokenUid == this.TokenUid;\r\n            //}\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/SPTween.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.SceneManagement;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween\r\n{\r\n\r\n    //[Singleton.Config(SingletonLifeCycleRule.LivesForever, ExcludeFromSingletonManager = true, LifeCycleReadOnly = true)]\r\n    public sealed class SPTween : ServiceComponent<SPTween>, IService\r\n    {\r\n\r\n        #region Singleton Entrance\r\n\r\n        private const string SPECIAL_NAME = \"Spacepuppy.SPTween\";\r\n        private static SPTween _instance;\r\n\r\n        #endregion\r\n\r\n        #region Instance Interface\r\n\r\n        #region Fields\r\n\r\n        private HashSet<Tweener> _runningTweens = new HashSet<Tweener>();\r\n        private HashSet<Tweener> _toAdd = new HashSet<Tweener>();\r\n        private HashSet<Tweener> _toRemove = new HashSet<Tweener>();\r\n        private bool _locked;\r\n\r\n        private static Dictionary<TokenPairing, Tweener> _autoKillDict = new Dictionary<TokenPairing, Tweener>(new TokenPairingComparer());\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public static void Init()\r\n        {\r\n            if (!object.ReferenceEquals(_instance, null))\r\n            {\r\n                if (ObjUtil.IsDestroyed(_instance))\r\n                {\r\n                    ObjUtil.SmartDestroy(_instance.gameObject);\r\n                    _instance = null;\r\n                }\r\n                else\r\n                {\r\n                    return;\r\n                }\r\n            }\r\n\r\n            _instance = Services.Create<SPTween>(true, SPECIAL_NAME);\r\n            //_instance = Singleton.CreateSpecialInstance<SPTween>(SPECIAL_NAME, SingletonLifeCycleRule.LivesForever);\r\n        }\r\n\r\n        protected override void OnValidAwake()\r\n        {\r\n            base.OnValidAwake();\r\n\r\n            SceneManager.sceneUnloaded += this.OnSceneUnloaded;\r\n        }\r\n\r\n        protected override void OnDestroy()\r\n        {\r\n            base.OnDestroy();\r\n\r\n            SceneManager.sceneUnloaded -= this.OnSceneUnloaded;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int RunningTweenCount\r\n        {\r\n            get { return _runningTweens.Count; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        internal static bool IsRunning(Tweener tween)\r\n        {\r\n            if (GameLoopEntry.ApplicationClosing) return false;\r\n            if (_instance == null) return false;\r\n            return _instance._runningTweens.Contains(tween) || _instance._toAdd.Contains(tween);\r\n        }\r\n\r\n        internal static void AddReference(Tweener tween)\r\n        {\r\n            if (GameLoopEntry.ApplicationClosing) return;\r\n            if (_instance == null) Init();\r\n            _instance.AddReference_Imp(tween);\r\n        }\r\n        private void AddReference_Imp(Tweener tween)\r\n        {\r\n            if(_locked)\r\n            {\r\n                if (_runningTweens.Contains(tween) || _toAdd.Contains(tween)) return;\r\n                _toAdd.Add(tween);\r\n            }\r\n            else\r\n            {\r\n                if (_runningTweens.Contains(tween)) return;\r\n\r\n                _runningTweens.Add(tween);\r\n                tween.Scrub(0f); //scrub to initialize values, this way if update doesn't happen for an entire frame, we get that init value\r\n\r\n                if(tween.Id != null)\r\n                {\r\n                    var token = new TokenPairing(tween.Id, tween.AutoKillToken);\r\n                    Tweener old;\r\n                    if (_autoKillDict.TryGetValue(token, out old) && old != tween)\r\n                    {\r\n                        old.Kill();\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        internal static void RemoveReference(Tweener tween)\r\n        {\r\n            if (GameLoopEntry.ApplicationClosing) return;\r\n            if (_instance == null) return;\r\n            _instance.RemoveReference_Imp(tween);\r\n        }\r\n        private void RemoveReference_Imp(Tweener tween)\r\n        {\r\n            if (_locked)\r\n            {\r\n                if (!_runningTweens.Contains(tween)) return;\r\n                if (_toRemove.Contains(tween)) return;\r\n                _toRemove.Add(tween);\r\n            }\r\n            else\r\n            {\r\n                _runningTweens.Remove(tween);\r\n                if(tween.Id != null && tween.IsComplete)\r\n                {\r\n                    var token = new TokenPairing(tween.Id, tween.AutoKillToken);\r\n                    Tweener auto;\r\n                    if(_autoKillDict.TryGetValue(token, out auto) && auto == tween)\r\n                    {\r\n                        _autoKillDict.Remove(token);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n        private void LockTweenSet()\r\n        {\r\n            _locked = true;\r\n        }\r\n\r\n        private void UnlockTweenSet()\r\n        {\r\n            _locked = false;\r\n\r\n            if (_toRemove.Count > 0)\r\n            {\r\n                var e = _toRemove.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    this.RemoveReference_Imp(e.Current);\r\n                }\r\n                _toRemove.Clear();\r\n            }\r\n            if (_toAdd.Count > 0)\r\n            {\r\n                var e = _toAdd.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    this.AddReference_Imp(e.Current);\r\n                }\r\n                _toAdd.Clear();\r\n            }\r\n        }\r\n\r\n\r\n\r\n        public static bool IsActiveAutoKill(object id, object autoKillToken)\r\n        {\r\n            var token = new TokenPairing(id, autoKillToken);\r\n            return _autoKillDict.ContainsKey(token);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Flag a Tweener that implements IAutoKillableTweener to be auto killed if another tween targeting the same object is played. \r\n        /// Until the Tweener is either killed, or finished, it will be eligible for being automatically \r\n        /// killed if another Tweener starts playing that tweens the same target object. Note that other tweener \r\n        /// must implement IAutoKillableTweener as well (though doesn't have to be flagged to AutoKill).\r\n        /// </summary>\r\n        /// <param name=\"tween\"></param>\r\n        public static void AutoKill(Tweener tween)\r\n        {\r\n            if (tween == null) throw new System.ArgumentNullException(\"tween\");\r\n            if (tween.Id == null) throw new System.ArgumentException(\"Can only register a Tweener with a valid 'Id' for autokill.\");\r\n            if (GameLoopEntry.ApplicationClosing) return;\r\n            if (!tween.IsPlaying) throw new System.ArgumentException(\"Can only register a playing Tweener for autokill.\");\r\n            if (_instance == null) Init();\r\n\r\n            var token = new TokenPairing(tween.Id, tween.AutoKillToken);\r\n            \r\n            Tweener old;\r\n            if (_autoKillDict.TryGetValue(token, out old) && old != tween)\r\n            {\r\n                old.Kill();\r\n            }\r\n            _autoKillDict[token] = tween;\r\n        }\r\n\r\n        \r\n        public static void KillAll()\r\n        {\r\n            if (GameLoopEntry.ApplicationClosing) return;\r\n            if (_instance == null) return;\r\n            if (_instance._runningTweens.Count == 0) return;\r\n            \r\n            var e = _instance._runningTweens.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                e.Current.SetKilled();\r\n            }\r\n            _instance._runningTweens.Clear();\r\n        }\r\n        public static void KillAll(object id)\r\n        {\r\n            if (GameLoopEntry.ApplicationClosing) return;\r\n            if (_instance == null) return;\r\n            if (_instance._runningTweens.Count == 0) return;\r\n\r\n            using (var lst = TempCollection.GetList<Tweener>())\r\n            {\r\n                var e = _instance._runningTweens.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (e.Current.Id == id) lst.Add(e.Current);\r\n                }\r\n\r\n                var e2 = lst.GetEnumerator();\r\n                while (e2.MoveNext())\r\n                {\r\n                    e2.Current.Kill();\r\n                }\r\n            }\r\n        }\r\n        public static void KillAll(object id, object token)\r\n        {\r\n            var tk = new TokenPairing(id, token);\r\n            Tweener old;\r\n            if (_autoKillDict.TryGetValue(tk, out old))\r\n            {\r\n                old.Kill();\r\n                _autoKillDict.Remove(tk);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Enumerate over all active tweeen and call a function with them as an arg. Return true to stop enumerating.\r\n        /// </summary>\r\n        /// <param name=\"pred\"></param>\r\n        public static void Find(System.Func<Tweener, bool> pred)\r\n        {\r\n            if (pred == null) return;\r\n            if (GameLoopEntry.ApplicationClosing) return;\r\n            if (_instance == null) return;\r\n            if (_instance._runningTweens.Count == 0) return;\r\n\r\n            _instance.LockTweenSet();\r\n            var e = _instance._runningTweens.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if (pred(e.Current)) return;\r\n            }\r\n            _instance.UnlockTweenSet();\r\n        }\r\n\r\n\r\n        #endregion\r\n\r\n        #region Update Methods\r\n\r\n        private void Update()\r\n        {\r\n            this.DoUpdate(UpdateSequence.Update);\r\n\r\n            //if(Application.isEditor)\r\n            //{\r\n            //    if (this.name.StartsWith(SPECIAL_NAME)) this.name = SPECIAL_NAME + \" [ActiveTweens: \" + _runningTweens.Count.ToString() + \"]\";\r\n            //}\r\n        }\r\n\r\n        private void FixedUpdate()\r\n        {\r\n            this.DoUpdate(UpdateSequence.FixedUpdate);\r\n        }\r\n\r\n        private void LateUpdate()\r\n        {\r\n            this.DoUpdate(UpdateSequence.LateUpdate);\r\n        }\r\n\r\n        private void DoUpdate(UpdateSequence updateType)\r\n        {\r\n            this.LockTweenSet();\r\n            \r\n            var e = _runningTweens.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if (e.Current.UpdateType == updateType)\r\n                {\r\n                    try\r\n                    {\r\n                        e.Current.Update();\r\n                    }\r\n                    catch\r\n                    {\r\n                        _toRemove.Add(e.Current);\r\n                    }\r\n                }\r\n            }\r\n\r\n            this.UnlockTweenSet();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Event Handlers\r\n\r\n        private void OnSceneUnloaded(Scene scene)\r\n        {\r\n            this.LockTweenSet();\r\n\r\n            var e = _runningTweens.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                if (e.Current.GetTargetIsDestroyed()) _toRemove.Add(e.Current);\r\n            }\r\n\r\n            this.UnlockTweenSet();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n\r\n        public static TweenHash Tween(object targ)\r\n        {\r\n            return new TweenHash(targ);\r\n        }\r\n\r\n        public static ITweenHash Tween(TweenerUpdateCallback callback, float dur)\r\n        {\r\n            return new CallbackTweener(callback, dur);\r\n        }\r\n\r\n        public static Tweener PlayCurve(object targ, TweenCurve curve)\r\n        {\r\n            var tween = new ObjectTweener(targ, curve);\r\n            tween.Play();\r\n            return tween;\r\n        }\r\n\r\n        public static Tweener PlayCurve(object targ, string propName, AnimationCurve curve, object option = null)\r\n        {\r\n            if (curve == null) throw new System.ArgumentNullException(\"curve\");\r\n            float dur = (curve.keys.Length > 0) ? curve.keys.Last().time : 0f;\r\n            var tween = new ObjectTweener(targ, MemberCurve.CreateFromTo(targ, propName, \r\n                                                                         EaseMethods.FromAnimationCurve(curve), \r\n                                                                         null, null, dur, option));\r\n            tween.Play();\r\n            return tween;\r\n        }\r\n\r\n        public static Tweener PlayCurve(object targ, string propName, AnimationCurve curve, float dur, object option = null)\r\n        {\r\n            if (curve == null) throw new System.ArgumentNullException(\"curve\");\r\n            var tween = new ObjectTweener(targ, MemberCurve.CreateFromTo(targ, propName,\r\n                                          EaseMethods.FromAnimationCurve(curve), \r\n                                          null, null, dur, option));\r\n            tween.Play();\r\n            return tween;\r\n        }\r\n\r\n        public static Tweener PlayTo(object targ, string propName, object end, float dur, object option = null)\r\n        {\r\n            var tween = new ObjectTweener(targ, MemberCurve.CreateTo(targ, propName, EaseMethods.LinearEaseNone, end, dur, option));\r\n            tween.Play();\r\n            return tween;\r\n        }\r\n\r\n        public static Tweener PlayTo(object targ, string propName, Ease ease, object end, float dur, object option = null)\r\n        {\r\n            var tween = new ObjectTweener(targ, MemberCurve.CreateTo(targ, propName, ease, end, dur, option));\r\n            tween.Play();\r\n            return tween;\r\n        }\r\n\r\n        public static Tweener PlayFrom(object targ, string propName, object start, float dur, object option = null)\r\n        {\r\n            var tween = new ObjectTweener(targ, MemberCurve.CreateFrom(targ, propName, EaseMethods.LinearEaseNone, start, dur, option));\r\n            tween.Play();\r\n            return tween;\r\n        }\r\n\r\n        public static Tweener PlayFrom(object targ, string propName, Ease ease, object start, float dur, object option = null)\r\n        {\r\n            var tween = new ObjectTweener(targ, MemberCurve.CreateFrom(targ, propName, ease, start, dur, option));\r\n            tween.Play();\r\n            return tween;\r\n        }\r\n\r\n        public static Tweener PlayBy(object targ, string propName, object amt, float dur, object option = null)\r\n        {\r\n            var tween = new ObjectTweener(targ, MemberCurve.CreateBy(targ, propName, EaseMethods.LinearEaseNone, amt, dur, option));\r\n            tween.Play();\r\n            return tween;\r\n        }\r\n\r\n        public static Tweener PlayBy(object targ, string propName, Ease ease, object amt, float dur, object option = null)\r\n        {\r\n            var tween = new ObjectTweener(targ, MemberCurve.CreateBy(targ, propName, ease, amt, dur, option));\r\n            tween.Play();\r\n            return tween;\r\n        }\r\n\r\n        public static Tweener PlayFromTo(object targ, string propName, object start, object end, float dur, object option = null)\r\n        {\r\n            var tween = new ObjectTweener(targ, MemberCurve.CreateFromTo(targ, propName, EaseMethods.LinearEaseNone, start, end, dur, option));\r\n            tween.Play();\r\n            return tween;\r\n        }\r\n\r\n        public static Tweener PlayFromTo(object targ, string propName, Ease ease, object start, object end, float dur, object option = null)\r\n        {\r\n            var tween = new ObjectTweener(targ, MemberCurve.CreateFromTo(targ, propName, ease, start, end, dur, option));\r\n            tween.Play();\r\n            return tween;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private struct TokenPairing\r\n        {\r\n            public object Target;\r\n            public object TokenUid;\r\n\r\n            public TokenPairing(object targ, object uid)\r\n            {\r\n                this.Target = targ;\r\n                this.TokenUid = uid;\r\n            }\r\n\r\n            public bool IsNull { get { return Target == null && TokenUid == null; } }\r\n\r\n        }\r\n\r\n        private class TokenPairingComparer : IEqualityComparer<TokenPairing>\r\n        {\r\n\r\n            public bool Equals(TokenPairing x, TokenPairing y)\r\n            {\r\n                //return x.Target == y.Target && x.TokenUid == y.TokenUid;\r\n                if (object.ReferenceEquals(x.Target, null)) return object.ReferenceEquals(y.Target, null);\r\n                if (object.ReferenceEquals(y.Target, null)) return false;\r\n                if (object.ReferenceEquals(x.TokenUid, null)) return object.ReferenceEquals(y.TokenUid, null);\r\n                if (object.ReferenceEquals(y.TokenUid, null)) return false;\r\n                return x.Target.Equals(y.Target) && x.TokenUid.Equals(y.TokenUid);\r\n            }\r\n\r\n            public int GetHashCode(TokenPairing obj)\r\n            {\r\n                int a = (!object.ReferenceEquals(obj.Target, null)) ? obj.Target.GetHashCode() : 0;\r\n                int b = (!object.ReferenceEquals(obj.TokenUid, null)) ? obj.TokenUid.GetHashCode() : 0;\r\n                return a ^ b;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/TweenCurve.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween\r\n{\r\n\r\n    public abstract class TweenCurve\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Tweener _tween;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TweenCurve()\r\n        {\r\n\r\n        }\r\n\r\n        protected internal virtual void Init(Tweener twn)\r\n        {\r\n            if (_tween != null) throw new System.InvalidOperationException(\"Curve can only be registered with one Tweener at a time, and should not be doubly nested in any Curve collections.\");\r\n            _tween = twn;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Tweener Tween { get { return _tween; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n\r\n\r\n        #endregion\r\n\r\n        #region Curve Interface\r\n\r\n        /// <summary>\r\n        /// The duration of this curve from beginning to end, including any delays.\r\n        /// </summary>\r\n        public abstract float TotalTime { get; }\r\n\r\n        /// <summary>\r\n        /// Updates the targ in an appropriate manner, if the targ is of a type that can be updated by this curve.\r\n        /// </summary>\r\n        /// <param name=\"dt\">The change in time since last update.</param>\r\n        /// <param name=\"t\">A value from 0 to TotalDuration representing the position the curve aught to be at.</param>\r\n        public abstract void Update(object targ, float dt, float t);\r\n\r\n        #endregion\r\n\r\n        #region Factory\r\n\r\n        private static NullCurve _null;\r\n        public static TweenCurve Null\r\n        {\r\n            get\r\n            {\r\n                if (_null == null) _null = new NullCurve();\r\n                return _null;\r\n            }\r\n        }\r\n\r\n\r\n\r\n        public static TweenCurve CreateFromTo(object target, string propName, Ease ease, object start, object end, float dur, object option = null)\r\n        {\r\n            return MemberCurve.CreateFromTo(target, propName, ease, start, end, dur, option);\r\n        }\r\n\r\n        public static TweenCurve CreateTo(object target, string propName, Ease ease, object end, float dur, object option = null)\r\n        {\r\n            return MemberCurve.CreateTo(target, propName, ease, end, dur, option);\r\n        }\r\n\r\n        public static TweenCurve CreateFrom(object target, string propName, Ease ease, object start, float dur, object option = null)\r\n        {\r\n            return MemberCurve.CreateFrom(target, propName, ease, start, dur, option);\r\n        }\r\n\r\n        public static TweenCurve CreateBy(object target, string propName, Ease ease, object amt, float dur, object option = null)\r\n        {\r\n            return MemberCurve.CreateBy(target, propName, ease, amt, dur, option);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates a curve that will animate from the current value to the end value, but will rescale the duration from how long it should have \r\n        /// taken from start to end, but already animated up to current.\r\n        /// </summary>\r\n        /// <param name=\"target\"></param>\r\n        /// <param name=\"propName\"></param>\r\n        /// <param name=\"ease\"></param>\r\n        /// <param name=\"start\"></param>\r\n        /// <param name=\"end\"></param>\r\n        /// <param name=\"dur\"></param>\r\n        /// <param name=\"option\"></param>\r\n        /// <returns></returns>\r\n        public static TweenCurve CreateRedirectTo(object target, string propName, Ease ease, float start, float end, float dur, object option = null)\r\n        {\r\n            return MemberCurve.CreateRedirectTo(target, propName, ease, start, end, dur, option);\r\n        }\r\n\r\n\r\n        #endregion\r\n\r\n        #region Internal Util\r\n\r\n        internal static object TrySum(System.Type tp, object a, object b)\r\n        {\r\n            if (tp == null) return b;\r\n\r\n            if (ConvertUtil.IsNumericType(tp))\r\n            {\r\n                return ConvertUtil.ToPrim(ConvertUtil.ToDouble(a) + ConvertUtil.ToDouble(b), tp);\r\n            }\r\n            else if (tp == typeof(Vector2))\r\n            {\r\n                return ConvertUtil.ToVector2(a) + ConvertUtil.ToVector2(b);\r\n            }\r\n            else if (tp == typeof(Vector3))\r\n            {\r\n                return ConvertUtil.ToVector3(a) + ConvertUtil.ToVector3(b);\r\n            }\r\n            else if (tp == typeof(Vector4))\r\n            {\r\n                return ConvertUtil.ToVector4(a) + ConvertUtil.ToVector4(b);\r\n            }\r\n            else if (tp == typeof(Quaternion))\r\n            {\r\n                return ConvertUtil.ToQuaternion(a) * ConvertUtil.ToQuaternion(b);\r\n            }\r\n            else if (tp == typeof(Color))\r\n            {\r\n                return ConvertUtil.ToColor(a) + ConvertUtil.ToColor(b);\r\n            }\r\n            else if (tp == typeof(Color32))\r\n            {\r\n                return ConvertUtil.ToColor32(ConvertUtil.ToColor(a) + ConvertUtil.ToColor(b));\r\n            }\r\n\r\n            return b;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Special Types\r\n\r\n        private class NullCurve : TweenCurve\r\n        {\r\n\r\n            protected internal override void Init(Tweener twn)\r\n            {\r\n                //don't init\r\n            }\r\n\r\n            public override float TotalTime\r\n            {\r\n                get { return 0f; }\r\n            }\r\n\r\n            public override void Update(object targ, float dt, float t)\r\n            {\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/TweenCurveGroup.cs",
    "content": "﻿using System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Tween\r\n{\r\n\r\n    public class TweenCurveGroup : TweenCurve\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private CurveGroupCollection _curves;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TweenCurveGroup()\r\n        {\r\n            _curves = new CurveGroupCollection(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ICollection<TweenCurve> Curves { get { return _curves; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        #endregion\r\n\r\n        #region Curve Interface\r\n\r\n        protected internal override void Init(Tweener twn)\r\n        {\r\n            base.Init(twn);\r\n\r\n            for (int i = 0; i < _curves._lst.Count; i++)\r\n            {\r\n                _curves._lst[i].Init(twn);\r\n            }\r\n        }\r\n\r\n        public override float TotalTime\r\n        {\r\n            get\r\n            {\r\n                float dur = 0f;\r\n                float d;\r\n                for (int i = 0; i < _curves._lst.Count; i++)\r\n                {\r\n                    d = _curves._lst[i].TotalTime;\r\n                    if (d > dur) dur = d;\r\n                }\r\n                return dur;\r\n            }\r\n        }\r\n\r\n        public override void Update(object targ, float dt, float t)\r\n        {\r\n            for (int i = 0; i < _curves._lst.Count; i++)\r\n            {\r\n                _curves._lst[i].Update(targ, dt, t);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private class CurveGroupCollection : ICollection<TweenCurve>\r\n        {\r\n\r\n            #region Fields\r\n\r\n            private TweenCurveGroup _owner;\r\n            internal List<TweenCurve> _lst = new List<TweenCurve>();\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            internal CurveGroupCollection(TweenCurveGroup owner)\r\n            {\r\n                _owner = owner;\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region ICollection Interface\r\n\r\n            public void Add(TweenCurve item)\r\n            {\r\n                if (_lst.Contains(item)) return;\r\n                _lst.Add(item);\r\n            }\r\n\r\n            public void Clear()\r\n            {\r\n                _lst.Clear();\r\n            }\r\n\r\n            public bool Contains(TweenCurve item)\r\n            {\r\n                return _lst.Contains(item);\r\n            }\r\n\r\n            public void CopyTo(TweenCurve[] array, int arrayIndex)\r\n            {\r\n                _lst.CopyTo(array, arrayIndex);\r\n            }\r\n\r\n            public int Count\r\n            {\r\n                get { return _lst.Count; }\r\n            }\r\n\r\n            public bool IsReadOnly\r\n            {\r\n                get { return false; }\r\n            }\r\n\r\n            public bool Remove(TweenCurve item)\r\n            {\r\n                return _lst.Remove(item);\r\n            }\r\n\r\n            public IEnumerator<TweenCurve> GetEnumerator()\r\n            {\r\n                return _lst.GetEnumerator();\r\n            }\r\n\r\n            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n            {\r\n                return _lst.GetEnumerator();\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/TweenHash.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween\r\n{\r\n\r\n    public class TweenHash : ITweenHash, System.ICloneable\r\n    {\r\n\r\n        public enum AnimMode\r\n        {\r\n            AnimCurve = -2,\r\n            Curve = -1,\r\n            To = 0,\r\n            From = 1,\r\n            By = 2,\r\n            FromTo = 3,\r\n            RedirectTo = 4\r\n        }\r\n\r\n        #region Fields\r\n\r\n        private TweenHash _prevNode;\r\n\r\n        private object _id;\r\n        private object _targ;\r\n        private List<PropInfo> _props = new List<PropInfo>();\r\n        private Ease _defaultEase = EaseMethods.LinearEaseNone;\r\n        private float _delay;\r\n        private UpdateSequence _updateType;\r\n        private ITimeSupplier _timeSupplier;\r\n        private TweenWrapMode _wrap;\r\n        private int _wrapCount;\r\n        private bool _reverse;\r\n        private float _speedScale = 1.0f;\r\n        private System.EventHandler _onStep;\r\n        private System.EventHandler _onWrap;\r\n        private System.EventHandler _onFinish;\r\n        private System.EventHandler _onStopped;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TweenHash(object targ)\r\n        {\r\n            if (targ == null) throw new System.ArgumentNullException(\"targ\");\r\n            _targ = targ;\r\n            _id = null;\r\n        }\r\n\r\n        public TweenHash(object targ, object id)\r\n        {\r\n            if (targ == null) throw new System.ArgumentNullException(\"targ\");\r\n            _targ = targ;\r\n            _id = id;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        #endregion\r\n\r\n        #region Config Methods\r\n\r\n        /// <summary>\r\n        /// Sets the id for the tween, if a FollowOn sequence, the entire sequence id is updated.\r\n        /// </summary>\r\n        /// <param name=\"id\"></param>\r\n        /// <returns></returns>\r\n        public TweenHash SetId(object id)\r\n        {\r\n            _id = id;\r\n            if (_prevNode != null) _prevNode.SetId(id);\r\n            return this;\r\n        }\r\n\r\n        public TweenHash Ease(Ease ease)\r\n        {\r\n            _defaultEase = ease ?? EaseMethods.LinearEaseNone;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash Delay(float delay)\r\n        {\r\n            _delay = delay;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash UseUpdate()\r\n        {\r\n            _updateType = UpdateSequence.Update;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash UseFixedUpdate()\r\n        {\r\n            _updateType = UpdateSequence.FixedUpdate;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash UseLateUpdate()\r\n        {\r\n            _updateType = UpdateSequence.LateUpdate;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash Use(UpdateSequence type)\r\n        {\r\n            _updateType = type;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash UseNormalTime()\r\n        {\r\n            _timeSupplier = SPTime.Normal;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash UseRealTime()\r\n        {\r\n            _timeSupplier = SPTime.Real;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash UseSmoothTime()\r\n        {\r\n            _timeSupplier = SPTime.Smooth;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash Use(ITimeSupplier time)\r\n        {\r\n            _timeSupplier = time ?? SPTime.Normal;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash PlayOnce()\r\n        {\r\n            _wrap = TweenWrapMode.Once;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash Loop(int count = -1)\r\n        {\r\n            _wrap = TweenWrapMode.Loop;\r\n            _wrapCount = count;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash PingPong(int count = -1)\r\n        {\r\n            _wrap = TweenWrapMode.PingPong;\r\n            _wrapCount = count;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash Wrap(TweenWrapMode wrap, int count = -1)\r\n        {\r\n            _wrap = wrap;\r\n            _wrapCount = count;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash Reverse()\r\n        {\r\n            _reverse = true;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash Reverse(bool reverse)\r\n        {\r\n            _reverse = reverse;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash SpeedScale(float scale)\r\n        {\r\n            _speedScale = scale;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash OnStep(System.EventHandler d)\r\n        {\r\n            if (d == null) return this;\r\n            _onStep += d;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash OnStep(System.Action<Tweener> d)\r\n        {\r\n            if (d == null) return this;\r\n            _onStep += (s, e) => d(s as Tweener);\r\n            return this;\r\n        }\r\n\r\n        public TweenHash OnWrap(System.EventHandler d)\r\n        {\r\n            if (d == null) return this;\r\n            _onWrap += d;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash OnWrap(System.Action<Tweener> d)\r\n        {\r\n            if (d == null) return this;\r\n            _onWrap += (s, e) => d(s as Tweener);\r\n            return this;\r\n        }\r\n\r\n        public TweenHash OnFinish(System.EventHandler d)\r\n        {\r\n            if (d == null) return this;\r\n            _onFinish += d;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash OnFinish(System.Action<Tweener> d)\r\n        {\r\n            if (d == null) return this;\r\n            _onFinish += (s, e) => d(s as Tweener);\r\n            return this;\r\n        }\r\n\r\n        public TweenHash OnStopped(System.EventHandler d)\r\n        {\r\n            if (d == null) return this;\r\n            _onStopped += d;\r\n            return this;\r\n        }\r\n\r\n        public TweenHash OnStopped(System.Action<Tweener> d)\r\n        {\r\n            if (d == null) return this;\r\n            _onStopped += (s, e) => d(s as Tweener);\r\n            return this;\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region Curve Methods\r\n\r\n        /// <summary>\r\n        /// Follow this tween with another tween.\r\n        /// \r\n        /// Inherits updateType and timeSupplier, unless otherwise changed.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public TweenHash FollowOn()\r\n        {\r\n            var hash = new TweenHash(_targ, _id);\r\n            hash._prevNode = this;\r\n            hash._updateType = _updateType;\r\n            hash._timeSupplier = _timeSupplier;\r\n            return hash;\r\n        }\r\n\r\n        public TweenHash Apply(TweenConfigCallback callback, Ease ease, float dur)\r\n        {\r\n            if (callback != null) callback(this, ease, dur);\r\n            return this;\r\n        }\r\n\r\n        //#########################\r\n        // CURVES\r\n        //\r\n\r\n        public TweenHash UseCurve(TweenCurve curve)\r\n        {\r\n            _props.Add(new PropInfo(AnimMode.Curve, null, null, float.NaN, curve, null));\r\n            return this;\r\n        }\r\n\r\n        public TweenHash UseCurve(string memberName, AnimationCurve curve, object option = null)\r\n        {\r\n            if (curve == null) throw new System.ArgumentNullException(\"curve\");\r\n            float dur = (curve.keys.Length > 0) ? curve.keys.Last().time : 0f;\r\n            _props.Add(new PropInfo(AnimMode.AnimCurve, memberName, \r\n                                    EaseMethods.FromAnimationCurve(curve), \r\n                                    dur, null, option));\r\n            return this;\r\n        }\r\n\r\n        public TweenHash UseCurve(string memberName, AnimationCurve curve, float dur, object option = null)\r\n        {\r\n            if (curve == null) throw new System.ArgumentNullException(\"curve\");\r\n            _props.Add(new PropInfo(AnimMode.AnimCurve, memberName, \r\n                                    EaseMethods.FromAnimationCurve(curve), \r\n                                    dur, null, option));\r\n            return this;\r\n        }\r\n        \r\n        public TweenHash To(string memberName, Ease ease, float dur, object end, object option = null)\r\n        {\r\n            _props.Add(new PropInfo(AnimMode.To, memberName, ease, dur, end, option));\r\n            return this;\r\n        }\r\n\r\n        public TweenHash To(string memberName, float dur, object end, object option = null)\r\n        {\r\n            _props.Add(new PropInfo(AnimMode.To, memberName, null, dur, end, option));\r\n            return this;\r\n        }\r\n\r\n        public TweenHash From(string memberName, Ease ease, float dur, object start, object option = null)\r\n        {\r\n            _props.Add(new PropInfo(AnimMode.From, memberName, ease, dur, start, option));\r\n            return this;\r\n        }\r\n\r\n        public TweenHash From(string memberName, float dur, object start, object option = null)\r\n        {\r\n            _props.Add(new PropInfo(AnimMode.From, memberName, null, dur, start, option));\r\n            return this;\r\n        }\r\n\r\n        public TweenHash By(string memberName, Ease ease, float dur, object amt, object option = null)\r\n        {\r\n            _props.Add(new PropInfo(AnimMode.By, memberName, ease, dur, amt, option));\r\n            return this;\r\n        }\r\n\r\n        public TweenHash By(string memberName, float dur, object amt, object option = null)\r\n        {\r\n            _props.Add(new PropInfo(AnimMode.By, memberName, null, dur, amt, option));\r\n            return this;\r\n        }\r\n\r\n        public TweenHash FromTo(string memberName, Ease ease, float dur, object start, object end, object option = null)\r\n        {\r\n            _props.Add(new PropInfo(AnimMode.FromTo, memberName, ease, dur, start, option, end));\r\n            return this;\r\n        }\r\n\r\n        public TweenHash FromTo(string memberName, float dur, object start, object end, object option = null)\r\n        {\r\n            _props.Add(new PropInfo(AnimMode.FromTo, memberName, null, dur, start, option, end));\r\n            return this;\r\n        }\r\n\r\n        public TweenHash ByAnimMode(AnimMode mode, string memberName, Ease ease, float dur, object value, object end)\r\n        {\r\n            _props.Add(new PropInfo(mode, memberName, ease, dur, value, null, end));\r\n            return this;\r\n        }\r\n\r\n        public TweenHash ByAnimMode(AnimMode mode, string memberName, Ease ease, float dur, object value, object end, object option)\r\n        {\r\n            _props.Add(new PropInfo(mode, memberName, ease, dur, value, option, end));\r\n            return this;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates a curve that will animate from the current value to the end value, but will rescale the duration from how long it should have \r\n        /// taken from start to end, but already animated up to current.\r\n        /// </summary>\r\n        /// <param name=\"memberName\"></param>\r\n        /// <param name=\"ease\"></param>\r\n        /// <param name=\"start\"></param>\r\n        /// <param name=\"end\"></param>\r\n        /// <param name=\"dur\"></param>\r\n        /// <param name=\"option\"></param>\r\n        /// <returns></returns>\r\n        public TweenHash RedirectTo(string memberName, Ease ease, float dur, object start, object end, object option = null)\r\n        {\r\n            _props.Add(new PropInfo(AnimMode.RedirectTo, memberName, ease, dur, start, option, end));\r\n            return this;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates a curve that will animate from the current value to the end value, but will rescale the duration from how long it should have \r\n        /// taken from start to end, but already animated up to current.\r\n        /// </summary>\r\n        /// <param name=\"memberName\"></param>\r\n        /// <param name=\"start\"></param>\r\n        /// <param name=\"end\"></param>\r\n        /// <param name=\"dur\"></param>\r\n        /// <param name=\"option\"></param>\r\n        /// <returns></returns>\r\n        public TweenHash RedirectTo(string memberName, float dur, object start, object end, object option = null)\r\n        {\r\n            _props.Add(new PropInfo(AnimMode.RedirectTo, memberName, null, dur, start, option, end));\r\n            return this;\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region Play Methods\r\n\r\n        public Tweener Play(bool autoKill, object autoKillToken = null)\r\n        {\r\n            if (_targ == null) return null;\r\n\r\n            var tween = this.Create();\r\n            if (autoKill)\r\n            {\r\n                tween.AutoKillToken = autoKillToken;\r\n                tween.Play();\r\n                if(tween.IsPlaying) SPTween.AutoKill(tween);\r\n            }\r\n            else\r\n            {\r\n                tween.Play();\r\n            }\r\n            return tween;\r\n        }\r\n\r\n        public Tweener Play(float playHeadPos, bool autoKill, object autoKillToken = null)\r\n        {\r\n            if (_targ == null) return null;\r\n\r\n            var tween = this.Create();\r\n            if (autoKill)\r\n            {\r\n                tween.AutoKillToken = autoKillToken;\r\n                tween.Play(playHeadPos);\r\n                SPTween.AutoKill(tween);\r\n            }\r\n            else\r\n            {\r\n                tween.Play(playHeadPos);\r\n            }\r\n            return tween;\r\n        }\r\n        \r\n        public Tweener Create()\r\n        {\r\n            if (_targ == null) return null;\r\n\r\n            //set curves\r\n            Tweener tween = null;\r\n            if (_props.Count > 1)\r\n            {\r\n                var grp = new TweenCurveGroup();\r\n                for (int i = 0; i < _props.Count; i++)\r\n                {\r\n                    var curve = this.CreateCurve(_props[i]);\r\n                    if (curve == null)\r\n                        Debug.LogWarning(\"Failed to create tween for property '\" + _props[i].name + \"' on target.\", _targ as Object);\r\n                    else\r\n                        grp.Curves.Add(curve);\r\n                }\r\n                tween = new ObjectTweener(_targ, grp);\r\n            }\r\n            else if (_props.Count == 1)\r\n            {\r\n                var curve = this.CreateCurve(_props[0]);\r\n                if (curve == null)\r\n                {\r\n                    Debug.LogWarning(\"Failed to create tween for property '\" + _props[0].name + \"' on target.\", _targ as UnityEngine.Object);\r\n                    return new ObjectTweener(_targ, TweenCurve.Null);\r\n                }\r\n                else\r\n                    tween = new ObjectTweener(_targ, curve);\r\n            }\r\n            else\r\n            {\r\n                tween = new ObjectTweener(_targ, TweenCurve.Null);\r\n            }\r\n\r\n            //set props\r\n            if (_id != null) tween.Id = _id;\r\n            tween.UpdateType = _updateType;\r\n            tween.TimeSupplier = _timeSupplier;\r\n            tween.SpeedScale = _speedScale;\r\n            tween.WrapMode = _wrap;\r\n            tween.WrapCount = _wrapCount;\r\n            tween.Reverse = _reverse;\r\n            tween.Delay = _delay;\r\n            if (_onStep != null) tween.OnStep += _onStep;\r\n            if (_onWrap != null) tween.OnWrap += _onWrap;\r\n            if (_onFinish != null) tween.OnFinish += _onFinish;\r\n            if (_onStopped != null) tween.OnStopped += _onStopped;\r\n            \r\n            if(_prevNode != null)\r\n            {\r\n                var seq = new TweenSequence();\r\n                seq.Id = tween.Id;\r\n                seq.Tweens.Add(tween);\r\n\r\n                var node = _prevNode;\r\n                while(node != null)\r\n                {\r\n                    seq.Tweens.Insert(0, node.Create());\r\n                    node = node._prevNode;\r\n                }\r\n\r\n                tween = seq;\r\n            }\r\n\r\n            return tween;\r\n        }\r\n\r\n        private TweenCurve CreateCurve(PropInfo prop)\r\n        {\r\n            try\r\n            {\r\n                Ease ease = (prop.ease == null) ? _defaultEase : prop.ease;\r\n                float dur = prop.dur;\r\n                switch (prop.mode)\r\n                {\r\n                    case AnimMode.AnimCurve:\r\n                        return MemberCurve.CreateFromTo(_targ, prop.name, ease, null, null, dur, prop.option);\r\n                    case AnimMode.Curve:\r\n                        return prop.value as TweenCurve;\r\n                    case AnimMode.To:\r\n                        return MemberCurve.CreateTo(_targ, prop.name, ease, prop.value, dur, prop.option);\r\n                    case AnimMode.From:\r\n                        return MemberCurve.CreateFrom(_targ, prop.name, ease, prop.value, dur, prop.option);\r\n                    case AnimMode.By:\r\n                        return MemberCurve.CreateBy(_targ, prop.name, ease, prop.value, dur, prop.option);\r\n                    case AnimMode.FromTo:\r\n                        return MemberCurve.CreateFromTo(_targ, prop.name, ease, prop.value, prop.altValue, dur, prop.option);\r\n                    case AnimMode.RedirectTo:\r\n                        return MemberCurve.CreateRedirectTo(_targ, prop.name, ease, prop.value, prop.altValue, dur, prop.option);\r\n                }\r\n            }\r\n            catch\r\n            {\r\n                return null;\r\n            }\r\n\r\n            return null;\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region ITweenHash Interface\r\n\r\n        ITweenHash ITweenHash.SetId(object id)\r\n        {\r\n            return this.SetId(id);\r\n        }\r\n\r\n        ITweenHash ITweenHash.Ease(Ease ease)\r\n        {\r\n            return this.Ease(ease);\r\n        }\r\n\r\n        ITweenHash ITweenHash.Delay(float delay)\r\n        {\r\n            return this.Delay(delay);\r\n        }\r\n\r\n        ITweenHash ITweenHash.UseUpdate()\r\n        {\r\n            return this.UseUpdate();\r\n        }\r\n\r\n        ITweenHash ITweenHash.UseFixedUpdate()\r\n        {\r\n            return this.UseFixedUpdate();\r\n        }\r\n\r\n        ITweenHash ITweenHash.UseLateUpdate()\r\n        {\r\n            return this.UseLateUpdate();\r\n        }\r\n\r\n        ITweenHash ITweenHash.Use(UpdateSequence type)\r\n        {\r\n            return this.Use(type);\r\n        }\r\n\r\n        ITweenHash ITweenHash.UseNormalTime()\r\n        {\r\n            return this.UseNormalTime();\r\n        }\r\n\r\n        ITweenHash ITweenHash.UseRealTime()\r\n        {\r\n            return this.UseRealTime();\r\n        }\r\n\r\n        ITweenHash ITweenHash.UseSmoothTime()\r\n        {\r\n            return this.UseSmoothTime();\r\n        }\r\n\r\n        ITweenHash ITweenHash.Use(ITimeSupplier time)\r\n        {\r\n            return this.Use(time);\r\n        }\r\n\r\n        ITweenHash ITweenHash.PlayOnce()\r\n        {\r\n            return this.PlayOnce();\r\n        }\r\n\r\n        ITweenHash ITweenHash.Loop(int count)\r\n        {\r\n            return this.Loop(count);\r\n        }\r\n\r\n        ITweenHash ITweenHash.PingPong(int count)\r\n        {\r\n            return this.PingPong(count);\r\n        }\r\n\r\n        ITweenHash ITweenHash.Wrap(TweenWrapMode wrap, int count)\r\n        {\r\n            return this.Wrap(wrap, count);\r\n        }\r\n\r\n        ITweenHash ITweenHash.Reverse()\r\n        {\r\n            return this.Reverse();\r\n        }\r\n\r\n        ITweenHash ITweenHash.Reverse(bool reverse)\r\n        {\r\n            return this.Reverse(reverse);\r\n        }\r\n\r\n        ITweenHash ITweenHash.SpeedScale(float scale)\r\n        {\r\n            return this.SpeedScale(scale);\r\n        }\r\n\r\n        ITweenHash ITweenHash.OnStep(System.EventHandler d)\r\n        {\r\n            return this.OnStep(d);\r\n        }\r\n\r\n        ITweenHash ITweenHash.OnStep(System.Action<Tweener> d)\r\n        {\r\n            return this.OnStep(d);\r\n        }\r\n\r\n        ITweenHash ITweenHash.OnWrap(System.EventHandler d)\r\n        {\r\n            return this.OnWrap(d);\r\n        }\r\n\r\n        ITweenHash ITweenHash.OnWrap(System.Action<Tweener> d)\r\n        {\r\n            return this.OnWrap(d);\r\n        }\r\n\r\n        ITweenHash ITweenHash.OnFinish(System.EventHandler d)\r\n        {\r\n            return this.OnFinish(d);\r\n        }\r\n\r\n        ITweenHash ITweenHash.OnFinish(System.Action<Tweener> d)\r\n        {\r\n            return this.OnFinish(d);\r\n        }\r\n\r\n        ITweenHash ITweenHash.OnStopped(System.EventHandler d)\r\n        {\r\n            return this.OnStopped(d);\r\n        }\r\n\r\n        ITweenHash ITweenHash.OnStopped(System.Action<Tweener> d)\r\n        {\r\n            return this.OnFinish(d);\r\n        }\r\n\r\n        Tweener ITweenHash.Play(bool autoKill, object autoKillToken)\r\n        {\r\n            return this.Play(autoKill, autoKillToken);\r\n        }\r\n\r\n        Tweener ITweenHash.Play(float playHeadPosition, bool autoKill, object autoKillToken)\r\n        {\r\n            return this.Play(playHeadPosition, autoKill, autoKillToken);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ICloneable INterface\r\n\r\n        public TweenHash Clone()\r\n        {\r\n            var hash = new TweenHash(_targ, _id);\r\n            hash._props = _props.ToList();\r\n            hash._defaultEase = _defaultEase;\r\n            hash._delay = _delay;\r\n            hash._updateType = _updateType;\r\n            hash._timeSupplier = _timeSupplier;\r\n            hash._wrap = _wrap;\r\n            hash._wrapCount = _wrapCount;\r\n            hash._reverse = _reverse;\r\n            hash._speedScale = _speedScale;\r\n            hash._onStep = _onStep;\r\n            hash._onWrap = _onWrap;\r\n            hash._onFinish = _onFinish;\r\n            hash._onStopped = _onStopped;\r\n            return hash;\r\n        }\r\n\r\n        object System.ICloneable.Clone()\r\n        {\r\n            return this.Clone();\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region Special Types\r\n\r\n        private struct PropInfo\r\n        {\r\n            public AnimMode mode;\r\n            public string name;\r\n            public Ease ease;\r\n            public float dur;\r\n            public object value;\r\n            public object altValue;\r\n            public object option;\r\n\r\n            public PropInfo(AnimMode mode, string nm, Ease e, float d, object v, object option)\r\n            {\r\n                this.mode = mode;\r\n                this.name = nm;\r\n                this.ease = e;\r\n                this.value = v;\r\n                this.dur = d;\r\n                this.altValue = null;\r\n                this.option = option;\r\n            }\r\n\r\n            public PropInfo(AnimMode mode, string nm, Ease e, float d, object v, object option, object altV)\r\n            {\r\n                this.mode = mode;\r\n                this.name = nm;\r\n                this.ease = e;\r\n                this.value = v;\r\n                this.dur = d;\r\n                this.altValue = altV;\r\n                this.option = option;\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/TweenSequence.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Tween\r\n{\r\n\r\n    public class TweenSequence : Tweener\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private object _id;\r\n        private TweenSequenceCollection _sequence;\r\n\r\n        #endregion\r\n        \r\n        #region CONSTRUCTOR\r\n\r\n        public TweenSequence()\r\n        {\r\n            _sequence = new TweenSequenceCollection(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public override object Id\r\n        {\r\n            get\r\n            {\r\n                return _id;\r\n            }\r\n            set\r\n            {\r\n                _id = value;\r\n            }\r\n        }\r\n\r\n        public TweenSequenceCollection Tweens { get { return _sequence; } }\r\n\r\n        #endregion\r\n\r\n        #region Tweener Interface\r\n\r\n        protected internal override bool GetTargetIsDestroyed()\r\n        {\r\n            for (int i = 0; i < _sequence.Count; i++)\r\n            {\r\n                if (_sequence[i].GetTargetIsDestroyed()) return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        protected internal override float GetPlayHeadLength()\r\n        {\r\n            float dur = 0f;\r\n            var e = _sequence.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                dur += e.Current.GetPlayHeadLength();\r\n            }\r\n            return dur;\r\n        }\r\n\r\n        protected internal override void DoUpdate(float dt, float t)\r\n        {\r\n\r\n            float _lastT = 0f;\r\n            float totalTime = 0f;\r\n            var e = _sequence.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                totalTime = e.Current.TotalTime;\r\n                if (t < _lastT + totalTime)\r\n                {\r\n                    e.Current.DoUpdate(dt, t - _lastT);\r\n                    break;\r\n                }\r\n                else\r\n                {\r\n                    _lastT += totalTime;\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public class TweenSequenceCollection : IList<Tweener>\r\n        {\r\n            private TweenSequence _owner;\r\n            private List<Tweener> _lst = new List<Tweener>();\r\n\r\n            internal TweenSequenceCollection(TweenSequence owner)\r\n            {\r\n                _owner = owner;\r\n            }\r\n\r\n            #region IList Interface\r\n\r\n            public int IndexOf(Tweener item)\r\n            {\r\n                return _lst.IndexOf(item);\r\n            }\r\n\r\n            public void Insert(int index, Tweener item)\r\n            {\r\n                if (item == null) throw new System.ArgumentNullException(\"item\");\r\n\r\n\r\n                _lst.Insert(index, item);\r\n            }\r\n\r\n            public void RemoveAt(int index)\r\n            {\r\n                if (_owner.IsPlaying) throw new System.InvalidOperationException(\"Cannot modify TweenSequence while it is playing.\");\r\n\r\n                _lst.RemoveAt(index);\r\n            }\r\n\r\n            public Tweener this[int index]\r\n            {\r\n                get\r\n                {\r\n                    return _lst[index];\r\n                }\r\n                set\r\n                {\r\n                    if (_lst[index] == value) return;\r\n\r\n                    if (_owner.IsPlaying) throw new System.InvalidOperationException(\"Cannot modify TweenSequence while it is playing.\");\r\n                    _lst[index] = value;\r\n                }\r\n            }\r\n\r\n            public void Add(Tweener item)\r\n            {\r\n                if (_owner.IsPlaying) throw new System.InvalidOperationException(\"Cannot modify TweenSequence while it is playing.\");\r\n\r\n                _lst.Add(item);\r\n            }\r\n\r\n            public void Clear()\r\n            {\r\n                if (_owner.IsPlaying) throw new System.InvalidOperationException(\"Cannot modify TweenSequence while it is playing.\");\r\n\r\n                _lst.Clear();\r\n            }\r\n\r\n            public bool Contains(Tweener item)\r\n            {\r\n                return _lst.Contains(item);\r\n            }\r\n\r\n            public void CopyTo(Tweener[] array, int arrayIndex)\r\n            {\r\n                _lst.CopyTo(array, arrayIndex);\r\n            }\r\n\r\n            public int Count\r\n            {\r\n                get { return _lst.Count; }\r\n            }\r\n\r\n            public bool IsReadOnly\r\n            {\r\n                get { return _owner.IsPlaying; }\r\n            }\r\n\r\n            public bool Remove(Tweener item)\r\n            {\r\n                if (_owner.IsPlaying) throw new System.InvalidOperationException(\"Cannot modify TweenSequence while it is playing.\");\r\n\r\n                return _lst.Remove(item);\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IEnumerable Interface\r\n\r\n            public Enumerator GetEnumerator()\r\n            {\r\n                return new Enumerator(this);\r\n            }\r\n\r\n            IEnumerator<Tweener> IEnumerable<Tweener>.GetEnumerator()\r\n            {\r\n                return this.GetEnumerator();\r\n            }\r\n\r\n            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n            {\r\n                return this.GetEnumerator();\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Special Types\r\n\r\n            public struct Enumerator : IEnumerator<Tweener>\r\n            {\r\n\r\n                #region Fields\r\n\r\n                private List<Tweener>.Enumerator _e;\r\n\r\n                #endregion\r\n\r\n                #region CONSTRUCTOR\r\n\r\n                public Enumerator(TweenSequenceCollection coll)\r\n                {\r\n                    if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n                    _e = coll._lst.GetEnumerator();\r\n                }\r\n\r\n                #endregion\r\n\r\n                #region IEnumerator Interface\r\n\r\n                public Tweener Current\r\n                {\r\n                    get\r\n                    {\r\n                        return _e.Current;\r\n                    }\r\n                }\r\n\r\n                object IEnumerator.Current\r\n                {\r\n                    get\r\n                    {\r\n                        return _e.Current;\r\n                    }\r\n                }\r\n\r\n                public void Dispose()\r\n                {\r\n                    _e.Dispose();\r\n                }\r\n\r\n                public bool MoveNext()\r\n                {\r\n                    return _e.MoveNext();\r\n                }\r\n\r\n                void IEnumerator.Reset()\r\n                {\r\n                    (_e as IEnumerator).Reset();\r\n                }\r\n\r\n                #endregion\r\n\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Tween/Tweener.cs",
    "content": "using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Tween\r\n{\r\n\r\n    public abstract class Tweener : ISPDisposable, IProgressingYieldInstruction, IRadicalWaitHandle\r\n    {\r\n\r\n        #region Events\r\n\r\n        /// <summary>\r\n        /// Raised every tick of the tweener\r\n        /// </summary>\r\n        public event System.EventHandler OnStep;\r\n        /// <summary>\r\n        /// Raised every time a looping/ping-ponging tweener reaches a peek.\r\n        /// </summary>\r\n        public event System.EventHandler OnWrap;\r\n        /// <summary>\r\n        /// Raised when the tween successfully finishes\r\n        /// </summary>\r\n        public event System.EventHandler OnFinish;\r\n        /// <summary>\r\n        /// Raised when the tween is stopped, killed, or finished. You can determine if the tween finished or was \r\n        /// killed on this event by testing the 'IsComplete' and 'IsDead' properties respectively. \r\n        /// </summary>\r\n        public event System.EventHandler OnStopped;\r\n        \r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        private UpdateSequence _updateType;\r\n        private ITimeSupplier _timeSupplier = SPTime.Normal;\r\n        private TweenWrapMode _wrap;\r\n        private int _wrapCount;\r\n        private bool _reverse;\r\n        private float _speedScale = 1.0f;\r\n        private float _delay;\r\n\r\n\r\n        private bool _isPlaying;\r\n        private float _playHeadLength;\r\n        private float _time; //the time since the tween was first played\r\n        private float _unwrappedPlayHeadPosition; //we need an unwrapped value so that we can pingpong/loop the playhead\r\n        private float _normalizedPlayHeadPosition; //this position the playhead is currently at, with wrap applied\r\n\r\n        private int _currentWrapCount;\r\n\r\n        private object _autoKillToken;\r\n        \r\n        #endregion\r\n\r\n        #region Configurable Properties\r\n\r\n        /// <summary>\r\n        /// An identifier for this tween to relate it to other tweens. Usually its the object being tweened, if one exists.\r\n        /// </summary>\r\n        public abstract object Id\r\n        {\r\n            get;\r\n            set;\r\n        }\r\n\r\n        public object AutoKillToken\r\n        {\r\n            get { return _autoKillToken; }\r\n            set\r\n            {\r\n                if (this.IsPlaying) throw new System.InvalidOperationException(\"Can only chnage the AutoKillToken on a Tweener that is not currently playing.\");\r\n\r\n                _autoKillToken = value;\r\n            }\r\n        }\r\n        \r\n        public UpdateSequence UpdateType\r\n        {\r\n            get { return _updateType; }\r\n            set { _updateType = value; }\r\n        }\r\n\r\n        public ITimeSupplier TimeSupplier\r\n        {\r\n            get { return _timeSupplier; }\r\n            set { _timeSupplier = value ?? SPTime.Normal; }\r\n        }\r\n\r\n        public DeltaTimeType DeltaType\r\n        {\r\n            get { return SPTime.GetDeltaType(_timeSupplier); }\r\n        }\r\n\r\n        public TweenWrapMode WrapMode\r\n        {\r\n            get { return _wrap; }\r\n            set\r\n            {\r\n                if (_wrap == value) return;\r\n\r\n                _wrap = value;\r\n                //normalized time is dependent on WrapMode, so we force update the play head\r\n                this.MovePlayHeadPosition(0f);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Amount of times the tween should wrap if WrapMode loops or pingpongs. \r\n        /// A value of 0 or less will wrap infinitely.\r\n        /// </summary>\r\n        public int WrapCount\r\n        {\r\n            get { return _wrapCount; }\r\n            set { _wrapCount = value; }\r\n        }\r\n\r\n        public bool Reverse\r\n        {\r\n            get { return _reverse; }\r\n            set { _reverse = value; }\r\n        }\r\n\r\n        public float SpeedScale\r\n        {\r\n            get { return _speedScale; }\r\n            set\r\n            {\r\n                _speedScale = value;\r\n                if (_speedScale < 0f || float.IsNaN(_speedScale)) _speedScale = 0f;\r\n                else if (float.IsInfinity(_speedScale)) _speedScale = float.MaxValue;\r\n            }\r\n        }\r\n\r\n        public float Delay\r\n        {\r\n            get { return _delay; }\r\n            set\r\n            {\r\n                _delay = Mathf.Clamp(value, 0f, float.MaxValue);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Status Properties\r\n\r\n        public bool IsDead\r\n        {\r\n            get { return float.IsNaN(_time); }\r\n        }\r\n\r\n        public bool IsPlaying\r\n        {\r\n            get { return _isPlaying; }\r\n        }\r\n\r\n        public bool IsComplete\r\n        {\r\n            get\r\n            {\r\n                if (float.IsNaN(_time)) return true;\r\n                switch(_wrap)\r\n                {\r\n                    case TweenWrapMode.Once:\r\n                        return _time >= this.PlayHeadLength + _delay;\r\n                    case TweenWrapMode.Loop:\r\n                    case TweenWrapMode.PingPong:\r\n                        if (_wrapCount <= 0)\r\n                            return false;\r\n                        else\r\n                            return (_time - _delay) >= (this.PlayHeadLength * _wrapCount);\r\n                }\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public float PlayHeadLength\r\n        {\r\n            get\r\n            {\r\n                return (_isPlaying) ? _playHeadLength : this.GetPlayHeadLength();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The amount of time that has passed for the tween (sum of all calls to update).\r\n        /// </summary>\r\n        public float Time\r\n        {\r\n            get { return _time; }\r\n        }\r\n\r\n        public float TotalTime\r\n        {\r\n            get\r\n            {\r\n                switch(_wrap)\r\n                {\r\n                    case TweenWrapMode.Once:\r\n                        return this.PlayHeadLength;\r\n                    case TweenWrapMode.Loop:\r\n                    case TweenWrapMode.PingPong:\r\n                        return (_wrapCount <= 0) ? float.PositiveInfinity : this.PlayHeadLength * _wrapCount;\r\n                }\r\n                return 0f;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The position of the play-head relative to PlayHeadLength of the tween.\r\n        /// </summary>\r\n        public float PlayHeadPosition\r\n        {\r\n            get { return _normalizedPlayHeadPosition; }\r\n        } \r\n\r\n        [System.Obsolete(\"User PlayHeadPosition\")]\r\n        public float PlayHeadTime\r\n        {\r\n            get { return _normalizedPlayHeadPosition; }\r\n        }\r\n\r\n        public int CurrentWrapCount\r\n        {\r\n            get { return _currentWrapCount; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Does the configuration of this tween result in a tween that plays forever.\r\n        /// </summary>\r\n        public bool PlaysIndefinitely\r\n        {\r\n            get { return _wrap != TweenWrapMode.Once && _wrapCount <= 0; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Play()\r\n        {\r\n            if (_isPlaying) return;\r\n            this.Play((_reverse) ? this.PlayHeadLength : 0f);\r\n        }\r\n\r\n        public virtual void Play(float playHeadPosition)\r\n        {\r\n            if (this.IsDead) throw new System.InvalidOperationException(\"Cannot play a dead Tweener.\");\r\n\r\n            if (!_isPlaying)\r\n            {\r\n                _isPlaying = true;\r\n                _playHeadLength = this.GetPlayHeadLength();\r\n                SPTween.AddReference(this);\r\n            }\r\n\r\n            _unwrappedPlayHeadPosition = playHeadPosition;\r\n            _normalizedPlayHeadPosition = playHeadPosition;\r\n        }\r\n\r\n        public void Resume()\r\n        {\r\n            if (_isPlaying) return;\r\n            this.Play(this.PlayHeadPosition);\r\n        }\r\n\r\n        public void ResumeReverse()\r\n        {\r\n            _reverse = !_reverse;\r\n            if (_isPlaying) return;\r\n            this.Play(this.PlayHeadPosition);\r\n        }\r\n\r\n        public virtual void Stop()\r\n        {\r\n            if (!_isPlaying) return;\r\n            _isPlaying = false;\r\n            SPTween.RemoveReference(this);\r\n            if (this.OnStopped != null) this.OnStopped(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        public virtual void Kill()\r\n        {\r\n            SPTween.RemoveReference(this);\r\n            this.SetKilled();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called internally if killed by SPTween.\r\n        /// </summary>\r\n        internal void SetKilled()\r\n        {\r\n            _isPlaying = false;\r\n            _time = float.NaN;\r\n            if (this.OnStopped != null) this.OnStopped(this, System.EventArgs.Empty);\r\n            this.OnFinish = null;\r\n            this.OnStopped = null;\r\n            this.OnStep = null;\r\n            this.OnWrap = null;\r\n        }\r\n\r\n        public virtual void Reset()\r\n        {\r\n            this.Stop();\r\n            _currentWrapCount = 0;\r\n            _time = 0f;\r\n            _unwrappedPlayHeadPosition = 0f;\r\n            _normalizedPlayHeadPosition = 0f;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Moves the playhead to the end and raises the finished event. \r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public bool CompleteImmediately()\r\n        {\r\n            if (!this.IsPlaying) return false;\r\n\r\n            switch (_wrap)\r\n            {\r\n                case TweenWrapMode.Once:\r\n                    float odt = this.PlayHeadLength - _time;\r\n                    _time = this.PlayHeadLength + _delay + 0.0001f;\r\n                    _normalizedPlayHeadPosition = (_reverse) ? 0f : _time;\r\n                    _unwrappedPlayHeadPosition = _normalizedPlayHeadPosition;\r\n                    this.DoUpdate(odt, _normalizedPlayHeadPosition);\r\n                    this.Stop();\r\n                    if (this.OnFinish != null) this.OnFinish(this, System.EventArgs.Empty);\r\n                    return true;\r\n                case TweenWrapMode.Loop:\r\n                case TweenWrapMode.PingPong:\r\n                    if (_wrapCount <= 0)\r\n                    {\r\n                        //this doesn't make sense... you can't complete an infinite tween\r\n                    }\r\n                    else\r\n                    {\r\n                        float pdt = (this.PlayHeadLength * _wrapCount) - _time;\r\n                        _time = this.PlayHeadLength * _wrapCount + _delay + 0.0001f;\r\n                        _normalizedPlayHeadPosition = (_reverse) ? 0f : (_wrapCount % 2 == 0) ? 0f : this.PlayHeadLength;\r\n                        _unwrappedPlayHeadPosition = _normalizedPlayHeadPosition;\r\n                        this.DoUpdate(pdt, _normalizedPlayHeadPosition);\r\n                        this.Stop();\r\n                        if (this.OnFinish != null) this.OnFinish(this, System.EventArgs.Empty);\r\n                        return true;\r\n                    }\r\n                    break;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Move the playhead an amount of change.\r\n        /// </summary>\r\n        /// <param name=\"dt\"></param>\r\n        public virtual void Scrub(float dt)\r\n        {\r\n            if (this.IsDead) return;\r\n\r\n            this.MovePlayHeadPosition(dt);\r\n\r\n            this.DoUpdate(dt, _normalizedPlayHeadPosition);\r\n\r\n            switch (_wrap)\r\n            {\r\n                case TweenWrapMode.Once:\r\n                    if (this.IsComplete)\r\n                    {\r\n                        _time = this.PlayHeadLength + _delay + 0.0001f;\r\n                        this.Stop();\r\n                        if (this.OnFinish != null) this.OnFinish(this, System.EventArgs.Empty);\r\n                        break;\r\n                    }\r\n                    else\r\n                    {\r\n                        if (this.OnStep != null) this.OnStep(this, System.EventArgs.Empty);\r\n                    }\r\n                    break;\r\n                case TweenWrapMode.Loop:\r\n                case TweenWrapMode.PingPong:\r\n                    if (_time > this.PlayHeadLength * (_currentWrapCount + 1))\r\n                    {\r\n                        _currentWrapCount++;\r\n                        if (this.IsComplete)\r\n                        {\r\n                            _time = this.PlayHeadLength * _wrapCount + _delay + 0.0001f;\r\n                            this.Stop();\r\n                            if (this.OnFinish != null) this.OnFinish(this, System.EventArgs.Empty);\r\n                        }\r\n                        else\r\n                        {\r\n                            if (this.OnStep != null) this.OnStep(this, System.EventArgs.Empty);\r\n                            if (this.OnWrap != null) this.OnWrap(this, System.EventArgs.Empty);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (this.OnStep != null) this.OnStep(this, System.EventArgs.Empty);\r\n                    }\r\n                    break;\r\n            }\r\n        }\r\n\r\n        private void MovePlayHeadPosition(float dt)\r\n        {\r\n            _time += Mathf.Abs(dt);\r\n            if (_reverse)\r\n                _unwrappedPlayHeadPosition -= dt;\r\n            else\r\n                _unwrappedPlayHeadPosition += dt;\r\n\r\n            var totalDur = this.PlayHeadLength;\r\n            if (totalDur > 0f)\r\n            {\r\n                switch (_wrap)\r\n                {\r\n                    case TweenWrapMode.Once:\r\n                        _normalizedPlayHeadPosition = Mathf.Clamp(_unwrappedPlayHeadPosition - _delay, 0, totalDur);\r\n                        break;\r\n                    case TweenWrapMode.Loop:\r\n                        if (_unwrappedPlayHeadPosition < _delay)\r\n                            _normalizedPlayHeadPosition = 0f;\r\n                        else\r\n                            _normalizedPlayHeadPosition = Mathf.Repeat(_unwrappedPlayHeadPosition - _delay, totalDur);\r\n                        break;\r\n                    case TweenWrapMode.PingPong:\r\n                        if (_normalizedPlayHeadPosition < _delay)\r\n                            _normalizedPlayHeadPosition = 0f;\r\n                        else\r\n                            _normalizedPlayHeadPosition = Mathf.PingPong(_unwrappedPlayHeadPosition - _delay, totalDur);\r\n                        break;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                _normalizedPlayHeadPosition = 0f;\r\n            }\r\n        }\r\n\r\n        internal virtual void Update()\r\n        {\r\n            this.Scrub(_timeSupplier.Delta * _speedScale);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Tweener Interface\r\n\r\n        /// <summary>\r\n        /// Return true if the target was destroyed, used to purge unneeded tweens on a scene unload.\r\n        /// </summary>\r\n        protected internal abstract bool GetTargetIsDestroyed();\r\n\r\n        protected internal abstract float GetPlayHeadLength();\r\n\r\n        protected internal abstract void DoUpdate(float dt, float t);\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        bool ISPDisposable.IsDisposed\r\n        {\r\n            get { return this.IsDead; }\r\n        }\r\n\r\n        void System.IDisposable.Dispose()\r\n        {\r\n            if (this.IsDead) return;\r\n\r\n            this.Kill();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalYieldInstruction Interface\r\n\r\n        bool IRadicalYieldInstruction.IsComplete\r\n        {\r\n            get { return this.IsComplete; }\r\n        }\r\n\r\n        float IProgressingYieldInstruction.Progress\r\n        {\r\n            get\r\n            {\r\n                if (this.IsComplete) return 1f;\r\n\r\n                switch (_wrap)\r\n                {\r\n                    case TweenWrapMode.Once:\r\n                        return _time / (this.PlayHeadLength + _delay);\r\n                    case TweenWrapMode.Loop:\r\n                    case TweenWrapMode.PingPong:\r\n                        if (_wrapCount <= 0)\r\n                            return 0f;\r\n                        else\r\n                            return _time / (this.PlayHeadLength * _wrapCount + _delay);\r\n                }\r\n                return 0f;\r\n            }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            yieldObject = null;\r\n            return !this.IsComplete;\r\n        }\r\n\r\n        void IRadicalWaitHandle.OnComplete(System.Action<IRadicalWaitHandle> callback)\r\n        {\r\n            if (callback == null) return;\r\n\r\n            System.EventHandler d = null;\r\n            d = (s, e) =>\r\n            {\r\n                this.OnStopped -= d;\r\n                callback(this);\r\n            };\r\n\r\n            this.OnStopped += d;\r\n        }\r\n        \r\n        bool IRadicalWaitHandle.Cancelled\r\n        {\r\n            get { return float.IsNaN(_time); }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/TypeReference.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Allows for a serializable reference to a type in the namespace.\r\n    /// \r\n    /// If the serialized type deserializes improperly, the Type returned with be the 'void' type. \r\n    /// A property 'IsVoid' exists to easily test this. This state implies that the serialized data \r\n    /// was loaded with out the required namespace loaded.\r\n    /// </summary>\r\n    [System.Serializable()]\r\n    public class TypeReference : System.Runtime.Serialization.ISerializable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private string _typeHash;\r\n\r\n        [System.NonSerialized()]\r\n        private System.Type _type;\r\n        \r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TypeReference()\r\n        {\r\n        }\r\n\r\n        public TypeReference(System.Type tp)\r\n        {\r\n            this.Type = tp;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public System.Type Type\r\n        {\r\n            get\r\n            {\r\n                if (_type == null) _type = UnHashType(_typeHash);\r\n                return _type;\r\n            }\r\n            set\r\n            {\r\n                _type = value;\r\n                _typeHash = HashType(_type);\r\n            }\r\n        }\r\n\r\n        public bool IsVoid\r\n        {\r\n            get\r\n            {\r\n                return this.Type == typeof(void);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region ISerializable Interface\r\n\r\n        protected TypeReference(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)\r\n        {\r\n            _typeHash = info.GetString(\"hash\");\r\n        }\r\n\r\n        void System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)\r\n        {\r\n            _typeHash = HashType(_type);\r\n            info.AddValue(\"hash\", _typeHash);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Operators\r\n\r\n        public static implicit operator System.Type(TypeReference a)\r\n        {\r\n            if (a != null) return a.Type;\r\n            else return null;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Special Types\r\n\r\n        [System.AttributeUsage(System.AttributeTargets.Field)]\r\n        public class ConfigAttribute : System.Attribute\r\n        {\r\n\r\n            public System.Type inheritsFromType;\r\n            public bool allowAbstractClasses = false;\r\n            public bool allowInterfaces = false;\r\n            public System.Type defaultType = null;\r\n            public System.Type[] excludedTypes = null;\r\n            public TypeDropDownListingStyle dropDownStyle = TypeDropDownListingStyle.Namespace;\r\n\r\n            public ConfigAttribute(System.Type inheritsFromType)\r\n            {\r\n                this.inheritsFromType = inheritsFromType;\r\n            }\r\n\r\n            public ConfigAttribute(System.Type inheritsFromType, params System.Type[] excludedTypes)\r\n            {\r\n                this.inheritsFromType = inheritsFromType;\r\n                this.excludedTypes = excludedTypes;\r\n            }\r\n\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Util Methods\r\n\r\n        public static string HashType(System.Type tp)\r\n        {\r\n            if (tp != null)\r\n            {\r\n                return tp.Assembly.GetName().Name + \"|\" + tp.FullName;\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public static System.Type UnHashType(string hash)\r\n        {\r\n            if (!string.IsNullOrEmpty(hash))\r\n            {\r\n                var arr = StringUtil.SplitFixedLength(hash, \"|\", 2);\r\n                var tp = TypeUtil.ParseType(arr[0], arr[1]);\r\n\r\n                //set type to void if the type is unfruitful, this way we're not constantly retesting this\r\n                if (tp == null) tp = typeof(void);\r\n                return tp;\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/UI/TextSettings.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.UI;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.UI\r\n{\r\n\r\n    [System.Serializable]\r\n    public struct TextSettings\r\n    {\r\n\r\n        [Header(\"Character\")]\r\n        public Color Color;\r\n        public Font Font;\r\n        public FontStyle FontStyle;\r\n        public int FontSize;\r\n        public float LineSpacing;\r\n        public bool RichText;\r\n        [Header(\"Paragraph\")]\r\n        public TextAnchor Alignment;\r\n        public bool AlignByGeometry;\r\n        public HorizontalWrapMode HorizontalOverflow;\r\n        public VerticalWrapMode VerticalOverflow;\r\n        public bool BestFit;\r\n\r\n        public void Apply(Text txt)\r\n        {\r\n            if (txt == null) throw new System.ArgumentNullException(\"txt\");\r\n\r\n            txt.color = this.Color;\r\n            txt.font = this.Font;\r\n            txt.fontStyle = this.FontStyle;\r\n            txt.fontSize = this.FontSize;\r\n            txt.lineSpacing = this.LineSpacing;\r\n            txt.supportRichText = this.RichText;\r\n            txt.alignment = this.Alignment;\r\n            txt.alignByGeometry = this.AlignByGeometry;\r\n            txt.horizontalOverflow = this.HorizontalOverflow;\r\n            txt.verticalOverflow = this.VerticalOverflow;\r\n            txt.resizeTextForBestFit = this.BestFit;\r\n        }\r\n\r\n        public static TextSettings FromText(Text txt)\r\n        {\r\n            if (txt == null) throw new System.ArgumentNullException(\"txt\");\r\n\r\n            var settings = new TextSettings();\r\n            settings.Color = txt.color;\r\n            settings.Font = txt.font;\r\n            settings.FontStyle = txt.fontStyle;\r\n            settings.FontSize = txt.fontSize;\r\n            settings.LineSpacing = txt.lineSpacing;\r\n            settings.RichText = txt.supportRichText;\r\n            settings.Alignment = txt.alignment;\r\n            settings.AlignByGeometry = txt.alignByGeometry;\r\n            settings.HorizontalOverflow = txt.horizontalOverflow;\r\n            settings.VerticalOverflow = txt.verticalOverflow;\r\n            settings.BestFit = txt.resizeTextForBestFit;\r\n            return settings;\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/ArrayUtil.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\n\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n\r\n    public static class ArrayUtil\r\n    {\r\n\r\n        #region General Methods\r\n\r\n        public static bool IsEmpty(this IEnumerable lst)\r\n        {\r\n            if(lst is IList)\r\n            {\r\n                return (lst as IList).Count == 0;\r\n            }\r\n            else\r\n            {\r\n                return !lst.GetEnumerator().MoveNext();\r\n            }\r\n        }\r\n\r\n        public static T LastOrDefault<T>(this IEnumerable<T> e, T defaultvalue)\r\n        {\r\n            var lst = e as IList<T>;\r\n            if(lst != null)\r\n            {\r\n                int cnt = lst.Count;\r\n                return cnt > 0 ? lst[cnt - 1] : defaultvalue;\r\n            }\r\n            else\r\n            {\r\n                var en = e.GetEnumerator();\r\n                T result = defaultvalue;\r\n                while(en.MoveNext())\r\n                {\r\n                    result = en.Current;\r\n                }\r\n                return result;\r\n            }\r\n        }\r\n\r\n        public static T FirstOrDefault<T>(this IEnumerable<T> e, T defaultvalue)\r\n        {\r\n            var lst = e as IList<T>;\r\n            if (lst != null)\r\n            {\r\n                int cnt = lst.Count;\r\n                return cnt > 0 ? lst[0] : defaultvalue;\r\n            }\r\n            else\r\n            {\r\n                var en = e.GetEnumerator();\r\n                T result = defaultvalue;\r\n                if (en.MoveNext())\r\n                {\r\n                    result = en.Current;\r\n                }\r\n                return result;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get how deep into the enumerable the first instance of the object is.\r\n        /// </summary>\r\n        /// <param name=\"lst\"></param>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public static int Depth(this IEnumerable lst, object obj)\r\n        {\r\n            int i = 0;\r\n            foreach(var o in lst)\r\n            {\r\n                if (object.Equals(o, obj)) return i;\r\n                i++;\r\n            }\r\n            return -1;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get how deep into the enumerable the first instance of the value is.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"lst\"></param>\r\n        /// <param name=\"value\"></param>\r\n        /// <returns></returns>\r\n        public static int Depth<T>(this IEnumerable<T> lst, T value)\r\n        {\r\n            int i = 0;\r\n            foreach (var v in lst)\r\n            {\r\n                if (object.Equals(v, value)) return i;\r\n                i++;\r\n            }\r\n            return -1;\r\n        }\r\n\r\n        public static IEnumerable<T> Like<T>(this IEnumerable lst)\r\n        {\r\n            foreach (var obj in lst)\r\n            {\r\n                if (obj is T) yield return (T)obj;\r\n            }\r\n        }\r\n\r\n        public static IEnumerable Like(this IEnumerable lst, System.Type tp)\r\n        {\r\n            foreach (var obj in lst)\r\n            {\r\n                if (TypeUtil.IsType(obj.GetType(), tp)) yield return obj;\r\n            }\r\n        }\r\n\r\n        public static bool Compare<T>(this IEnumerable<T> first, IEnumerable<T> second)\r\n        {\r\n            var e1 = first.GetEnumerator();\r\n            var e2 = second.GetEnumerator();\r\n\r\n            while (true)\r\n            {\r\n                var b1 = e1.MoveNext();\r\n                var b2 = e2.MoveNext();\r\n                if (!b1 && !b2) break; //reached end of list\r\n\r\n                if (b1 && b2)\r\n                {\r\n                    if (!object.Equals(e1.Current, e2.Current)) return false;\r\n                }\r\n                else\r\n                {\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Each enumerable contains the same elements, not necessarily in the same order, or of the same count. Just the same elements.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"first\"></param>\r\n        /// <param name=\"second\"></param>\r\n        /// <returns></returns>\r\n        public static bool SimilarTo<T>(this IEnumerable<T> first, IEnumerable<T> second)\r\n        {\r\n            return first.Except(second).Count() + second.Except(first).Count() == 0;\r\n        }\r\n\r\n        public static bool ContainsAny<T>(this IEnumerable<T> lst, params T[] objs)\r\n        {\r\n            if (objs == null) return false;\r\n            return lst.Intersect(objs).Count() > 0;\r\n        }\r\n\r\n        public static bool ContainsAny<T>(this IEnumerable<T> lst, IEnumerable<T> objs)\r\n        {\r\n            return lst.Intersect(objs).Count() > 0;\r\n        }\r\n\r\n        public static IEnumerable<T> Append<T>(this IEnumerable<T> lst, T obj)\r\n        {\r\n            var e = new LightEnumerator<T>(lst);\r\n            while (e.MoveNext())\r\n            {\r\n                yield return e.Current;\r\n            }\r\n            yield return obj;\r\n        }\r\n\r\n        public static IEnumerable<T> Append<T>(this IEnumerable<T> first, IEnumerable<T> next)\r\n        {\r\n            var e = new LightEnumerator<T>(first);\r\n            while (e.MoveNext())\r\n            {\r\n                yield return e.Current;\r\n            }\r\n            e = new LightEnumerator<T>(next);\r\n            while (e.MoveNext())\r\n            {\r\n                yield return e.Current;\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<T> Prepend<T>(this IEnumerable<T> lst, T obj)\r\n        {\r\n            yield return obj;\r\n            var e = new LightEnumerator<T>(lst);\r\n            while(e.MoveNext())\r\n            {\r\n                yield return e.Current;\r\n            }\r\n        }\r\n\r\n        public static bool Contains(this IEnumerable lst, object obj)\r\n        {\r\n            //foreach (var o in lst)\r\n            //{\r\n            //    if (Object.Equals(o, obj)) return true;\r\n            //}\r\n            var e = new LightEnumerator(lst);\r\n            while(e.MoveNext())\r\n            {\r\n                if (Object.Equals(e.Current, obj)) return true;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        public static bool Contains<T>(this T[,] arr, T value)\r\n        {\r\n            for(int i = 0; i < arr.GetLength(0); i++)\r\n            {\r\n                for(int j = 0; j < arr.GetLength(1); j++)\r\n                {\r\n                    if (EqualityComparer<T>.Default.Equals(arr[i, j], value)) return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static void AddRange<T>(this ICollection<T> lst, IEnumerable<T> elements)\r\n        {\r\n            //foreach (var e in elements)\r\n            //{\r\n            //    lst.Add(e);\r\n            //}\r\n            var e = new LightEnumerator<T>(elements);\r\n            while(e.MoveNext())\r\n            {\r\n                lst.Add(e.Current);\r\n            }\r\n        }\r\n\r\n        public static T GetValueAfterOrDefault<T>(this IEnumerable<T> lst, T element, bool loop = false)\r\n        {\r\n            if (lst is IList<T>)\r\n            {\r\n                var arr = lst as IList<T>;\r\n                if (arr.Count == 0) return default(T);\r\n\r\n                int i = arr.IndexOf(element) + 1;\r\n                if (loop) i = i % arr.Count;\r\n                else if (i >= arr.Count) return default(T);\r\n                return arr[i];\r\n            }\r\n            else\r\n            {\r\n                var e = lst.GetEnumerator();\r\n                if (!e.MoveNext()) return default(T);\r\n                var first = e.Current;\r\n                if (object.Equals(e.Current, element))\r\n                {\r\n                    if (e.MoveNext())\r\n                    {\r\n                        return e.Current;\r\n                    }\r\n                    else if (loop)\r\n                    {\r\n                        return first;\r\n                    }\r\n                    else\r\n                    {\r\n                        return default(T);\r\n                    }\r\n                }\r\n\r\n                while (e.MoveNext())\r\n                {\r\n                    if (object.Equals(e.Current, element))\r\n                    {\r\n                        if (e.MoveNext())\r\n                        {\r\n                            return e.Current;\r\n                        }\r\n                        else if (loop)\r\n                        {\r\n                            return first;\r\n                        }\r\n                        else\r\n                        {\r\n                            return default(T);\r\n                        }\r\n                    }\r\n                }\r\n                return default(T);\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<T> Except<T>(this IEnumerable<T> lst, T element)\r\n        {\r\n            if (lst == null) throw new System.ArgumentNullException(\"lst\");\r\n            foreach(var e in lst)\r\n            {\r\n                if (!object.Equals(e, element)) yield return e;\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<T> Except<T>(this IEnumerable<T> lst, T element, IEqualityComparer<T> comparer)\r\n        {\r\n            if (lst == null) throw new System.ArgumentNullException(\"lst\");\r\n            if (comparer == null) throw new System.ArgumentNullException(\"comparer\");\r\n            foreach (var e in lst)\r\n            {\r\n                if (!comparer.Equals(e, element)) yield return e;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Array Methods\r\n\r\n        public static T[] Empty<T>()\r\n        {\r\n            return TempArray<T>.Empty;\r\n        }\r\n\r\n        public static T[] Temp<T>(T value)\r\n        {\r\n            return TempArray<T>.Temp(value);\r\n        }\r\n\r\n        public static T[] Temp<T>(T value1, T value2)\r\n        {\r\n            return TempArray<T>.Temp(value1, value2);\r\n        }\r\n\r\n        public static T[] Temp<T>(T value1, T value2, T value3)\r\n        {\r\n            return TempArray<T>.Temp(value1, value2, value3);\r\n        }\r\n\r\n        public static T[] Temp<T>(T value1, T value2, T value3, T value4)\r\n        {\r\n            return TempArray<T>.Temp(value1, value2, value3, value4);\r\n        }\r\n\r\n        public static void ReleaseTemp<T>(T[] arr)\r\n        {\r\n            TempArray<T>.Release(arr);\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n\r\n        public static int IndexOf(this System.Array lst, object obj)\r\n        {\r\n            return System.Array.IndexOf(lst, obj);\r\n        }\r\n\r\n        public static int IndexOf<T>(this T[] lst, T obj)\r\n        {\r\n            return System.Array.IndexOf(lst, obj);\r\n        }\r\n\r\n        public static bool InBounds(this System.Array arr, int index)\r\n        {\r\n            return index >= 0 && index <= arr.Length - 1;\r\n        }\r\n\r\n        public static void Clear(this System.Array arr)\r\n        {\r\n            if (arr == null) return;\r\n            System.Array.Clear(arr, 0, arr.Length);\r\n        }\r\n\r\n        public static void Copy<T>(IEnumerable<T> source, System.Array destination, int index)\r\n        {\r\n            if (source is System.Collections.ICollection)\r\n                (source as System.Collections.ICollection).CopyTo(destination, index);\r\n            else\r\n            {\r\n                int i = 0;\r\n                foreach(var el in source)\r\n                {\r\n                    destination.SetValue(el, i + index);\r\n                    i++;\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n        #endregion\r\n\r\n        #region Random Methods\r\n\r\n        public static void Shuffle<T>(T[] arr, IRandom rng = null)\r\n        {\r\n            if (arr == null) throw new System.ArgumentNullException(\"arr\");\r\n            if (rng == null) rng = RandomUtil.Standard;\r\n\r\n            int j;\r\n            T temp;\r\n            for (int i = 0; i < arr.Length - 1; i++)\r\n            {\r\n                j = rng.Next(i, arr.Length);\r\n                temp = arr[j];\r\n                arr[j] = arr[i];\r\n                arr[i] = temp;\r\n            }\r\n        }\r\n\r\n        public static void Shuffle<T>(T[,] arr, IRandom rng = null)\r\n        {\r\n            if (arr == null) throw new System.ArgumentNullException(\"arr\");\r\n            if (rng == null) rng = RandomUtil.Standard;\r\n\r\n            int width = arr.GetLength(0);\r\n            for (int i = 0; i < arr.Length - 1; i++)\r\n            {\r\n                int j = rng.Next(i, arr.Length);\r\n                int ix = i % width;\r\n                int iy = (int)(i / width);\r\n                int jx = j % width;\r\n                int jy = (int)(j / width);\r\n                T temp = arr[jx, jy];\r\n                arr[jx, jy] = arr[ix, iy];\r\n                arr[ix, iy] = temp;\r\n            }\r\n        }\r\n\r\n        public static void Shuffle(IList lst, IRandom rng = null)\r\n        {\r\n            if (lst == null) throw new System.ArgumentNullException(\"lst\");\r\n            if (rng == null) rng = RandomUtil.Standard;\r\n\r\n            int j;\r\n            object temp;\r\n            int cnt = lst.Count;\r\n            for (int i = 0; i < cnt - 1; i++)\r\n            {\r\n                j = rng.Next(i, cnt);\r\n                temp = lst[j];\r\n                lst[j] = lst[i];\r\n                lst[i] = temp;\r\n            }\r\n        }\r\n\r\n        public static void Shuffle<T>(IList<T> lst, IRandom rng = null)\r\n        {\r\n            if (lst == null) throw new System.ArgumentNullException(\"lst\");\r\n            if (rng == null) rng = RandomUtil.Standard;\r\n\r\n            int j;\r\n            T temp;\r\n            int cnt = lst.Count;\r\n            for (int i = 0; i < cnt - 1; i++)\r\n            {\r\n                j = rng.Next(i, cnt);\r\n                temp = lst[j];\r\n                lst[j] = lst[i];\r\n                lst[i] = temp;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region HashSet Methods\r\n\r\n        public static T Pop<T>(this HashSet<T> set)\r\n        {\r\n            if (set == null) throw new System.ArgumentNullException(\"set\");\r\n\r\n            var e = set.GetEnumerator();\r\n            if(e.MoveNext())\r\n            {\r\n                set.Remove(e.Current);\r\n                return e.Current;\r\n            }\r\n\r\n            throw new System.ArgumentException(\"HashSet must not be empty.\");\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private class TempArray<T>\r\n        {\r\n\r\n            private static object _lock = new object();\r\n            private static volatile T[] _empty;\r\n            private static volatile T[] _oneArray;\r\n            private static volatile T[] _twoArray;\r\n            private static volatile T[] _threeArray;\r\n            private static volatile T[] _fourArray;\r\n\r\n            public static T[] Empty\r\n            {\r\n                get\r\n                {\r\n                    if (_empty == null) _empty = new T[0];\r\n                    return _empty;\r\n                }\r\n            }\r\n\r\n            public static T[] Temp(T value)\r\n            {\r\n                T[] arr;\r\n\r\n                lock (_lock)\r\n                {\r\n                    if(_oneArray != null)\r\n                    {\r\n                        arr = _oneArray;\r\n                        _oneArray = null;\r\n                    }\r\n                    else\r\n                    {\r\n                        arr = new T[1];\r\n                    }\r\n                }\r\n\r\n                arr[0] = value;\r\n                return arr;\r\n            }\r\n\r\n            public static T[] Temp(T value1, T value2)\r\n            {\r\n                T[] arr;\r\n\r\n                lock (_lock)\r\n                {\r\n                    if (_oneArray != null)\r\n                    {\r\n                        arr = _twoArray;\r\n                        _twoArray = null;\r\n                    }\r\n                    else\r\n                    {\r\n                        arr = new T[2];\r\n                    }\r\n                }\r\n\r\n                arr[0] = value1;\r\n                arr[1] = value2;\r\n                return arr;\r\n            }\r\n\r\n            public static T[] Temp(T value1, T value2, T value3)\r\n            {\r\n                T[] arr;\r\n\r\n                lock (_lock)\r\n                {\r\n                    if (_oneArray != null)\r\n                    {\r\n                        arr = _threeArray;\r\n                        _threeArray = null;\r\n                    }\r\n                    else\r\n                    {\r\n                        arr = new T[3];\r\n                    }\r\n                }\r\n\r\n                arr[0] = value1;\r\n                arr[1] = value2;\r\n                arr[2] = value3;\r\n                return arr;\r\n            }\r\n\r\n            public static T[] Temp(T value1, T value2, T value3, T value4)\r\n            {\r\n                T[] arr;\r\n\r\n                lock (_lock)\r\n                {\r\n                    if (_oneArray != null)\r\n                    {\r\n                        arr = _fourArray;\r\n                        _fourArray = null;\r\n                    }\r\n                    else\r\n                    {\r\n                        arr = new T[4];\r\n                    }\r\n                }\r\n\r\n                arr[0] = value1;\r\n                arr[1] = value2;\r\n                arr[2] = value3;\r\n                arr[3] = value4;\r\n                return arr;\r\n            }\r\n\r\n\r\n            public static void Release(T[] arr)\r\n            {\r\n                if (arr == null) return;\r\n                System.Array.Clear(arr, 0, arr.Length);\r\n\r\n                lock(_lock)\r\n                {\r\n                    switch (arr.Length)\r\n                    {\r\n                        case 1:\r\n                            _oneArray = arr;\r\n                            break;\r\n                        case 2:\r\n                            _twoArray = arr;\r\n                            break;\r\n                        case 3:\r\n                            _threeArray = arr;\r\n                            break;\r\n                        case 4:\r\n                            _fourArray = arr;\r\n                            break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/Assertions.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n\r\n    public static class Assertions\r\n    {\r\n\r\n        public static void Assert(string msg)\r\n        {\r\n            //throw new System.Exception(msg);\r\n            Debug.LogWarning(msg);\r\n        }\r\n\r\n        public static void Assert(string msg, UnityEngine.Object context)\r\n        {\r\n            //throw new System.Exception(msg);\r\n            Debug.LogWarning(msg, context);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Throws error message if obj is not null.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <returns></returns>\r\n        public static bool AssertNull(object obj, string msg)\r\n        {\r\n            if (obj != null)\r\n            {\r\n                Assert(msg);\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Throws error message if obj is null.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <returns></returns>\r\n        public static bool AssertNotNull(object obj, string msg)\r\n        {\r\n            if (obj == null)\r\n            {\r\n                Assert(msg);\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Throws error message if index is less than 0 or greater than len - 1.\r\n        /// </summary>\r\n        /// <param name=\"index\"></param>\r\n        /// <param name=\"len\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <returns></returns>\r\n        public static bool AssertInBounds(int index, int len, string msg = \"index out of range.\")\r\n        {\r\n            if (index < 0 || index >= len)\r\n            {\r\n                Assert(msg);\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #region HasLikeComponent\r\n\r\n        public static bool AssertHasLikeComponent(GameObject go, System.Type tp)\r\n        {\r\n            if (!go.HasComponent(tp))\r\n            {\r\n                Assert(System.String.Format(\"(GameObject:{1}) GameObject requires a component of type {0}.\", tp.Name, go.name), go);\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool AssertRequireLikeComponentAttrib(Component comp, bool silent = false)\r\n        {\r\n            System.Type missingCompType;\r\n\r\n            return AssertRequireLikeComponentAttrib(comp, out missingCompType, silent);\r\n        }\r\n\r\n        public static bool AssertRequireLikeComponentAttrib(Component comp, out System.Type missingCompType, bool silent = false)\r\n        {\r\n            if (comp == null) throw new System.ArgumentNullException(\"comp\");\r\n            missingCompType = null;\r\n\r\n            var tp = comp.GetType();\r\n            foreach (var obj in tp.GetCustomAttributes(typeof(RequireLikeComponentAttribute), true))\r\n            {\r\n                RequireLikeComponentAttribute attrib = obj as RequireLikeComponentAttribute;\r\n                foreach (var reqType in attrib.Types)\r\n                {\r\n                    if (!comp.HasComponent(reqType))\r\n                    {\r\n                        missingCompType = reqType;\r\n                        if(!silent) Assert(System.String.Format(\"(GameObject:{2}) Component type {0} requires the gameobject to also have a component of type {1}.\", tp.Name, reqType.Name, comp.gameObject.name), comp);\r\n                        return true;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool AssertRequireComponentInEntityAttrib(Component comp, bool silent = false)\r\n        {\r\n            System.Type missingCompType;\r\n\r\n            return AssertRequireComponentInEntityAttrib(comp, out missingCompType, silent);\r\n        }\r\n\r\n        public static bool AssertRequireComponentInEntityAttrib(Component comp, out System.Type missingCompType, bool silent = false)\r\n        {\r\n            if (comp == null) throw new System.ArgumentNullException(\"comp\");\r\n            missingCompType = null;\r\n\r\n            var tp = comp.GetType();\r\n            foreach (var obj in tp.GetCustomAttributes(typeof(RequireComponentInEntityAttribute), true))\r\n            {\r\n                RequireComponentInEntityAttribute attrib = obj as RequireComponentInEntityAttribute;\r\n                foreach (var reqType in attrib.Types)\r\n                {\r\n                    if (!comp.EntityHasComponent(reqType))\r\n                    {\r\n                        missingCompType = reqType;\r\n                        if(!silent) Assert(System.String.Format(\"(Entity:{2}) Component type {0} requires the entity to also have a component of type {1}.\", tp.Name, reqType.Name, comp.FindRoot().name), comp);\r\n                        return true;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n\r\n        public static bool AssertUniqueToEntityAttrib(Component comp, bool silent = false)\r\n        {\r\n            var tp = comp.GetType();\r\n            var attrib = tp.GetCustomAttributes(typeof(UniqueToEntityAttribute), false).FirstOrDefault() as UniqueToEntityAttribute;\r\n\r\n            if (attrib.IgnoreInactive && !comp.gameObject.activeInHierarchy) return false;\r\n\r\n            if (attrib != null)\r\n            {\r\n                if (attrib.MustBeAttachedToRoot)\r\n                {\r\n                    if (!comp.HasComponent<SPEntity>())\r\n                    {\r\n                        if(!silent) Assert(System.String.Format(\"(Entity:{1}) Component type {0} must be attached to the root gameObject.\", tp.Name, comp.FindRoot().name), comp);\r\n                        return true;\r\n                    }\r\n                }\r\n                \r\n\r\n                var root = comp.FindRoot();\r\n                \r\n                foreach (var c in root.GetComponentsInChildren(tp, !attrib.IgnoreInactive))\r\n                {\r\n                    if(c.gameObject != comp.gameObject)\r\n                    {\r\n                        if (!silent) Assert(System.String.Format(\"(Entity:{1}) Only one component of type {0} must be attached to a root or any of its children.\", tp.Name, root.name), comp);\r\n                        return true;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBase/Utils/AudioUtils.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class AudioUtils\r\n    {\r\n\r\n        public static void Play(this AudioSource src, AudioClip clip, AudioInterruptMode mode)\r\n        {\r\n            if (src == null) throw new System.ArgumentNullException(\"src\");\r\n            if (clip == null) throw new System.ArgumentNullException(\"clip\");\r\n            \r\n            switch(mode)\r\n            {\r\n                case AudioInterruptMode.StopIfPlaying:\r\n                    if (src.isPlaying) src.Stop();\r\n                    break;\r\n                case AudioInterruptMode.DoNotPlayIfPlaying:\r\n                    if (src.isPlaying) return;\r\n                    break;\r\n                case AudioInterruptMode.PlayOverExisting:\r\n                    break;\r\n            }\r\n\r\n            src.PlayOneShot(clip);\r\n        }\r\n\r\n        public static void Play(this AudioSource src, AudioClip clip, float volumeScale, AudioInterruptMode mode)\r\n        {\r\n            if (src == null) throw new System.ArgumentNullException(\"src\");\r\n            if (clip == null) throw new System.ArgumentNullException(\"clip\");\r\n\r\n            switch (mode)\r\n            {\r\n                case AudioInterruptMode.StopIfPlaying:\r\n                    if (src.isPlaying) src.Stop();\r\n                    break;\r\n                case AudioInterruptMode.DoNotPlayIfPlaying:\r\n                    if (src.isPlaying) return;\r\n                    break;\r\n                case AudioInterruptMode.PlayOverExisting:\r\n                    break;\r\n            }\r\n\r\n            src.PlayOneShot(clip, volumeScale);\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/ColliderUtil.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Utils\n{\n\n    public static class ColliderUtil\n    {\n\n        public delegate void TriggerEventCallback(Collider sender, Collider other);\n        public delegate void CollisionEventCallback(Collider sender, Collision collision);\n\n        #region Trigger Event Handlers\n\n        public static void AddOnTriggerEnterCallback(this Rigidbody rb, TriggerEventCallback callback)\n        {\n            if (rb == null || callback == null) return;\n\n            var handle = rb.AddOrGetComponent<OnTriggerEnterCallbackHandle>();\n            handle.TriggerEntered += callback;\n        }\n\n        public static void AddOnTriggerExitCallback(this Rigidbody rb, TriggerEventCallback callback)\n        {\n            if (rb == null || callback == null) return;\n\n            var handle = rb.AddOrGetComponent<OnTriggerExitCallbackHandle>();\n            handle.TriggerExited += callback;\n        }\n\n        public static void AddOnTriggerEnterCallback(this Collider collider, TriggerEventCallback callback)\n        {\n            if (collider == null || callback == null) return;\n\n            var handle = collider.AddOrGetComponent<OnTriggerEnterCallbackHandle>();\n            handle.TriggerEntered += callback;\n        }\n\n        public static void AddOnTriggerExitCallback(this Collider collider, TriggerEventCallback callback)\n        {\n            if (collider == null || callback == null) return;\n\n            var handle = collider.AddOrGetComponent<OnTriggerExitCallbackHandle>();\n            handle.TriggerExited += callback;\n        }\n\n        public static void RemoveOnTriggerEnterCallback(this Rigidbody rb, TriggerEventCallback callback)\n        {\n            if (rb == null || callback == null) return;\n\n            var handle = rb.GetComponent<OnTriggerEnterCallbackHandle>();\n            if (handle != null)\n            {\n                handle.TriggerEntered -= callback;\n            }\n        }\n\n        public static void RemoveOnTriggerExitCallback(this Rigidbody rb, TriggerEventCallback callback)\n        {\n            if (rb == null || callback == null) return;\n\n            var handle = rb.GetComponent<OnTriggerExitCallbackHandle>();\n            if (handle != null)\n            {\n                handle.TriggerExited -= callback;\n            }\n        }\n\n        public static void RemoveOnTriggerEnterCallback(this Collider collider, TriggerEventCallback callback)\n        {\n            if (collider == null || callback == null) return;\n\n            var handle = collider.GetComponent<OnTriggerEnterCallbackHandle>();\n            if(handle != null)\n            {\n                handle.TriggerEntered -= callback;\n            }\n        }\n\n        public static void RemoveOnTriggerExitCallback(this Collider collider, TriggerEventCallback callback)\n        {\n            if (collider == null || callback == null) return;\n\n            var handle = collider.GetComponent<OnTriggerExitCallbackHandle>();\n            if (handle != null)\n            {\n                handle.TriggerExited -= callback;\n            }\n        }\n\n        #endregion\n\n        #region Special Types\n\n        private sealed class OnTriggerEnterCallbackHandle : MonoBehaviour\n        {\n\n            public event TriggerEventCallback TriggerEntered\n            {\n                add\n                {\n                    _triggerEntered += value;\n                    this.enabled = (_triggerEntered != null);\n                }\n                remove\n                {\n                    _triggerEntered -= value;\n                    this.enabled = (_triggerEntered != null);\n                }\n            }\n\n            private TriggerEventCallback _triggerEntered;\n            private Collider _collider;\n            \n            void Awake()\n            {\n                _collider = this.GetComponent<Collider>();\n            }\n\n            private void OnTriggerEnter(Collider other)\n            {\n                var d = _triggerEntered;\n                if (d != null) d(_collider, other);\n            }\n\n        }\n\n        private sealed class OnTriggerExitCallbackHandle : MonoBehaviour\n        {\n\n            public event TriggerEventCallback TriggerExited\n            {\n                add\n                {\n                    _triggerExited += value;\n                    this.enabled = (_triggerExited != null);\n                }\n                remove\n                {\n                    _triggerExited -= value;\n                    this.enabled = (_triggerExited != null);\n                }\n            }\n\n            private TriggerEventCallback _triggerExited;\n            private Collider _collider;\n\n            void Awake()\n            {\n                _collider = this.GetComponent<Collider>();\n            }\n\n            private void OnTriggerEnter(Collider other)\n            {\n                var d = _triggerExited;\n                if (d != null) d(_collider, other);\n            }\n\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Utils/ColorUtil.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class ColorUtil\r\n    {\r\n\r\n        #region Setters\r\n\r\n        public static Color SetAlpha(this Color c, float a)\r\n        {\r\n            c.a = a;\r\n            return c;\r\n        }\r\n\r\n        public static Color SetRed(this Color c, float r)\r\n        {\r\n            c.r = r;\r\n            return c;\r\n        }\r\n\r\n        public static Color SetBlue(this Color c, float b)\r\n        {\r\n            c.b = b;\r\n            return c;\r\n        }\r\n\r\n        public static Color SetGreen(this Color c, float g)\r\n        {\r\n            c.g = g;\r\n            return c;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Extraction\r\n\r\n        /// <summary>\r\n        /// Luma is returned as a percentage from 0 to 1\r\n        /// </summary>\r\n        /// <param name=\"c\"></param>\r\n        /// <returns></returns>\r\n        public static float ExtractLuma(this Color c)\r\n        {\r\n            return 0.299f * c.r + 0.587f * c.g + 0.114f * c.b;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Hue is returned as an angle in degrees around the standard hue colour wheel.\r\n        /// see: http://en.wikipedia.org/wiki/HSL_and_HSV\r\n        /// </summary>\r\n        /// <param name=\"c\"></param>\r\n        /// <returns></returns>\r\n        public static float ExtractHue(this Color c)\r\n        {\r\n            var max = Mathf.Max(c.r, Mathf.Max(c.g, c.b));\r\n            var min = Mathf.Min(c.r, Mathf.Min(c.g, c.b));\r\n            var delta = max - min;\r\n            if (Mathf.Abs(delta) < 0.0001f)\r\n            {\r\n                return 0f;\r\n            }\r\n            else if(c.r >= c.g && c.r >= c.b)\r\n            {\r\n                return 60f * (((c.g - c.b) / delta) % 6f);\r\n            }\r\n            else if(c.g >= c.b)\r\n            {\r\n                return 60f * ((c.b - c.r) / delta + 2f);\r\n            }\r\n            else\r\n            {\r\n                return 60f * ((c.r - c.g) / delta + 4f);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns the value of an RGB color. This can be used in an HSV representation of a colour.\r\n        /// </summary>\r\n        /// <param name=\"c\"></param>\r\n        /// <returns></returns>\r\n        public static float ExtractValue(this Color c)\r\n        {\r\n            return Mathf.Max(c.r, Mathf.Max(c.g, c.b));\r\n        }\r\n\r\n        public static float ExtractSaturation(this Color c)\r\n        {\r\n            ////ala HSL formula\r\n            //var max = Mathf.Max(c.r, c.g, c.b);\r\n            //var min = Mathf.Min(c.r, c.g, c.b);\r\n            //var delta = max - min;\r\n            //if (Mathf.Abs(delta) < 0.0001f) return 0f;\r\n            //else\r\n            //    return delta / (1f - Mathf.Abs(max + min - 1f));\r\n\r\n            //ala HSV formula\r\n            var max = Mathf.Max(c.r, Mathf.Max(c.g, c.b));\r\n            if (Mathf.Abs(max) < 0.0001f) return 0f;\r\n            var min = Mathf.Min(c.r, Mathf.Min(c.g, c.b));\r\n            return (max - min) / max;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Lerp\r\n\r\n        /// <summary>\r\n        /// Unity's Color.Lerp clamps between 0->1, this allows a true lerp of all ranges.\r\n        /// </summary>\r\n        /// <param name=\"a\"></param>\r\n        /// <param name=\"b\"></param>\r\n        /// <param name=\"t\"></param>\r\n        /// <returns></returns>\r\n        public static Color Lerp(Color a, Color b, float t)\r\n        {\r\n            return new Color(a.r + (b.r - a.r) * t, a.g + (b.g - a.g) * t, a.b + (b.b - a.b) * t, a.a + (b.a - a.a) * t);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Unity's Color32.Lerp clamps between 0->1, this allows a true lerp of all ranges.\r\n        /// </summary>\r\n        /// <param name=\"a\"></param>\r\n        /// <param name=\"b\"></param>\r\n        /// <param name=\"t\"></param>\r\n        /// <returns></returns>\r\n        public static Color32 Lerp(Color32 a, Color32 b, float t)\r\n        {\r\n            return new Color32((byte)MathUtil.Clamp((float)a.r + (float)((int)b.r - (int)a.r) * t, 0, 255), \r\n                               (byte)MathUtil.Clamp((float)a.g + (float)((int)b.g - (int)a.g) * t, 0, 255), \r\n                               (byte)MathUtil.Clamp((float)a.b + (float)((int)b.b - (int)a.b) * t, 0, 255), \r\n                               (byte)MathUtil.Clamp((float)a.a + (float)((int)b.a - (int)a.a) * t, 0, 255));\r\n        }\r\n\r\n        public static Color Lerp(float t, params Color[] colors)\r\n        {\r\n            if (colors == null || colors.Length == 0) return Color.black;\r\n            if (colors.Length == 1) return colors[0];\r\n\r\n            int i = Mathf.FloorToInt(colors.Length * t);\r\n            if (i < 0) i = 0;\r\n            if (i >= colors.Length - 1) return colors[colors.Length - 1];\r\n            \r\n            t %= 1f / (float)(colors.Length - 1);\r\n            return Color.Lerp(colors[i], colors[i + 1], t);\r\n        }\r\n\r\n        public static Color Slerp(Color a, Color b, float t)\r\n        {\r\n            return (Color)ColorHSV.Slerp((ColorHSV)a, (ColorHSV)b, t);\r\n        }\r\n\r\n        public static Color Slerp(float t, params Color[] colors)\r\n        {\r\n            if (colors == null || colors.Length == 0) return Color.black;\r\n            if (colors.Length == 1) return colors[0];\r\n\r\n            int i = Mathf.FloorToInt(colors.Length * t);\r\n            if (i < 0) i = 0;\r\n            if (i >= colors.Length - 1) return colors[colors.Length - 1];\r\n\r\n            t %= 1f / (float)(colors.Length - 1);\r\n            return (Color)ColorHSV.Slerp((ColorHSV)colors[i], (ColorHSV)colors[i + 1], t);\r\n        }\r\n        \r\n        #endregion\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/CompareUtil.cs",
    "content": "﻿namespace com.spacepuppy.Utils\r\n{\r\n    public static class CompareUtil\r\n    {\r\n\r\n        private const int GT = (int)(ComparisonOperator.GreaterThan);\r\n        private const int GT_EQUAL = (int)(ComparisonOperator.GreaterThan | ComparisonOperator.Equal);\r\n        private const int LT = (int)(ComparisonOperator.LessThan);\r\n        private const int LT_EQUAL = (int)(ComparisonOperator.LessThan | ComparisonOperator.Equal);\r\n        private const int EQUAL = (int)(ComparisonOperator.Equal);\r\n        private const int NOT_EQUAL = (int)(ComparisonOperator.NotEqual);\r\n        private const int NOT_EQUAL_ALT = (int)(ComparisonOperator.LessThan | ComparisonOperator.GreaterThan);\r\n        private const int ALWAYS_EQUAL = (int)(ComparisonOperator.GreaterThan | ComparisonOperator.LessThan | ComparisonOperator.Equal);\r\n\r\n        public static bool Compare(ComparisonOperator op, int a, int b)\r\n        {\r\n            switch ((int)op)\r\n            {\r\n                case GT:\r\n                    return a > b;\r\n                case GT_EQUAL:\r\n                    return a >= b;\r\n                case LT:\r\n                    return a < b;\r\n                case LT_EQUAL:\r\n                    return a <= b;\r\n                case EQUAL:\r\n                    return a == b;\r\n                case NOT_EQUAL:\r\n                case NOT_EQUAL_ALT:\r\n                    return a != b;\r\n                case ALWAYS_EQUAL:\r\n                    return true;\r\n                default:\r\n                    return false;\r\n            }\r\n        }\r\n\r\n        public static bool Compare(ComparisonOperator op, long a, long b)\r\n        {\r\n            switch ((int)op)\r\n            {\r\n                case GT:\r\n                    return a > b;\r\n                case GT_EQUAL:\r\n                    return a >= b;\r\n                case LT:\r\n                    return a < b;\r\n                case LT_EQUAL:\r\n                    return a <= b;\r\n                case EQUAL:\r\n                    return a == b;\r\n                case NOT_EQUAL:\r\n                case NOT_EQUAL_ALT:\r\n                    return a != b;\r\n                case ALWAYS_EQUAL:\r\n                    return true;\r\n                default:\r\n                    return false;\r\n            }\r\n        }\r\n\r\n        public static bool Compare(ComparisonOperator op, float a, float b)\r\n        {\r\n            switch ((int)op)\r\n            {\r\n                case GT:\r\n                    return a > b;\r\n                case GT_EQUAL:\r\n                    return a >= b;\r\n                case LT:\r\n                    return a < b;\r\n                case LT_EQUAL:\r\n                    return a <= b;\r\n                case EQUAL:\r\n                    return a == b;\r\n                case NOT_EQUAL:\r\n                case NOT_EQUAL_ALT:\r\n                    return a != b;\r\n                case ALWAYS_EQUAL:\r\n                    return true;\r\n                default:\r\n                    return false;\r\n            }\r\n        }\r\n\r\n        public static bool Compare(ComparisonOperator op, double a, double b)\r\n        {\r\n            switch ((int)op)\r\n            {\r\n                case GT:\r\n                    return a > b;\r\n                case GT_EQUAL:\r\n                    return a >= b;\r\n                case LT:\r\n                    return a < b;\r\n                case LT_EQUAL:\r\n                    return a <= b;\r\n                case EQUAL:\r\n                    return a == b;\r\n                case NOT_EQUAL:\r\n                case NOT_EQUAL_ALT:\r\n                    return a != b;\r\n                case ALWAYS_EQUAL:\r\n                    return true;\r\n                default:\r\n                    return false;\r\n            }\r\n        }\r\n\r\n        public static bool Compare(ComparisonOperator op, decimal a, decimal b)\r\n        {\r\n            switch ((int)op)\r\n            {\r\n                case GT:\r\n                    return a > b;\r\n                case GT_EQUAL:\r\n                    return a >= b;\r\n                case LT:\r\n                    return a < b;\r\n                case LT_EQUAL:\r\n                    return a <= b;\r\n                case EQUAL:\r\n                    return a == b;\r\n                case NOT_EQUAL:\r\n                case NOT_EQUAL_ALT:\r\n                    return a != b;\r\n                case ALWAYS_EQUAL:\r\n                    return true;\r\n                default:\r\n                    return false;\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/ComponentUtil.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class ComponentUtil\r\n    {\r\n        \r\n        public static bool IsComponentType(System.Type tp)\r\n        {\r\n            if (tp == null) return false;\r\n            return typeof(Component).IsAssignableFrom(tp) || typeof(IComponent).IsAssignableFrom(tp);\r\n        }\r\n\r\n        public static bool IsAcceptableComponentType(System.Type tp)\r\n        {\r\n            if (tp == null) return false;\r\n            return tp.IsInterface || typeof(Component).IsAssignableFrom(tp);\r\n        }\r\n\r\n        public static bool IsComponentSource(object obj)\r\n        {\r\n            return (obj is GameObject || obj is Component);\r\n        }\r\n\r\n        public static T GetComponentFromSource<T>(object obj) where T : class\r\n        {\r\n            if (obj == null) return null;\r\n            if (obj is T) return obj as T;\r\n            if (obj is IComponent)\r\n            {\r\n                var c = (obj as IComponent).component;\r\n                if (c is T) return c as T;\r\n                else return c.GetComponent<T>();\r\n            }\r\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n            if (go != null)\r\n            {\r\n                return go.GetComponent<T>();\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static Component GetComponentFromSource(System.Type tp, object obj)\r\n        {\r\n            if (obj == null) return null;\r\n            if(TypeUtil.IsType(obj.GetType(), tp))\r\n            {\r\n                if (obj is Component) return obj as Component;\r\n                else if (obj is IComponent) return (obj as IComponent).component;\r\n            }\r\n\r\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n            if (go != null)\r\n                return go.GetComponent(tp);\r\n\r\n            return null;\r\n        }\r\n\r\n        public static Component GetComponentFromSourceAsComponent<T>(object obj) where T : class\r\n        {\r\n            if (obj == null) return null;\r\n            if(obj is T)\r\n            {\r\n                if (obj is Component) return obj as Component;\r\n                else if (obj is IComponent) return (obj as IComponent).component;\r\n                else return null;\r\n            }\r\n\r\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n            if (go != null)\r\n                return go.GetComponent(typeof(T));\r\n\r\n            return null;\r\n        }\r\n\r\n        public static T[] GetComponentsFromSource<T>(object obj) where T : class\r\n        {\r\n            if (obj == null) return ArrayUtil.Empty<T>();\r\n            if (obj is T) return new T[] { obj as T };\r\n            if (obj is IComponent)\r\n            {\r\n                var c = (obj as IComponent).component;\r\n                if (c is T) return new T[] { c as T };\r\n                else return c.GetComponents<T>();\r\n            }\r\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n            if (go != null)\r\n                return go.GetComponents<T>();\r\n\r\n            return ArrayUtil.Empty<T>();\r\n        }\r\n\r\n        public static Component[] GetComponentsFromSource(System.Type tp, object obj)\r\n        {\r\n            if (obj == null) return ArrayUtil.Empty<Component>();\r\n            if (TypeUtil.IsType(obj.GetType(), tp))\r\n            {\r\n                if (obj is Component) return new Component[] { obj as Component };\r\n                else if (obj is IComponent && (obj as IComponent).component != null) return (obj as IComponent).component.GetComponents<Component>();\r\n            }\r\n\r\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n            if (go != null)\r\n                return go.GetComponents<Component>();\r\n\r\n            return ArrayUtil.Empty<Component>();\r\n        }\r\n\r\n\r\n        public static bool IsEnabled(this Component comp)\r\n        {\r\n            if (comp == null) return false;\r\n            if (comp is Behaviour) return (comp as Behaviour).enabled;\r\n            if (comp is Collider) return (comp as Collider).enabled;\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Implementation of 'Behaviour.isActiveAnEnabled' that also works for all Components (including Colliders).\r\n        /// </summary>\r\n        /// <param name=\"comp\"></param>\r\n        /// <returns></returns>\r\n        public static bool IsActiveAndEnabled(this Component comp)\r\n        {\r\n            if (comp == null) return false;\r\n            if (comp is Behaviour) return (comp as Behaviour).isActiveAndEnabled;\r\n            if (!comp.gameObject.activeInHierarchy) return false;\r\n            if (comp is Collider) return (comp as Collider).enabled;\r\n            return true;\r\n        }\r\n\r\n        public static void SetEnabled(this Component comp, bool enabled)\r\n        {\r\n            if (comp == null) return;\r\n            else if (comp is Behaviour) (comp as Behaviour).enabled = enabled;\r\n            else if (comp is Collider) (comp as Collider).enabled = enabled;\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n        #region HasComponent\r\n\r\n        public static bool HasComponent<T>(this GameObject obj, bool testIfEnabled = false) where T : class\r\n        {\r\n            return HasComponent(obj, typeof(T), testIfEnabled);\r\n        }\r\n        public static bool HasComponent<T>(this Component obj, bool testIfEnabled = false) where T : class\r\n        {\r\n            return HasComponent(obj, typeof(T), testIfEnabled);\r\n        }\r\n\r\n        public static bool HasComponent(this GameObject obj, System.Type tp, bool testIfEnabled = false)\r\n        {\r\n            if (obj == null) return false;\r\n\r\n            if (testIfEnabled)\r\n            {\r\n                foreach (var c in obj.GetComponents(tp))\r\n                {\r\n                    if (c.IsEnabled()) return true;\r\n                }\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                return (obj.GetComponent(tp) != null);\r\n            }\r\n        }\r\n        public static bool HasComponent(this Component obj, System.Type tp, bool testIfEnabled = false)\r\n        {\r\n            if (obj == null) return false;\r\n\r\n            if (testIfEnabled)\r\n            {\r\n                foreach (var c in obj.GetComponents(tp))\r\n                {\r\n                    if (c.IsEnabled()) return true;\r\n                }\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                return (obj.GetComponent(tp) != null);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region AddComponent\r\n\r\n        public static T AddComponent<T>(this Component c) where T : Component\r\n        {\r\n            if (c == null) return null;\r\n            return c.gameObject.AddComponent<T>();\r\n        }\r\n        public static Component AddComponent(this Component c, System.Type tp)\r\n        {\r\n            if (c == null) return null;\r\n            return c.gameObject.AddComponent(tp);\r\n        }\r\n\r\n        public static T AddOrGetComponent<T>(this GameObject obj) where T : Component\r\n        {\r\n            if (obj == null) return null;\r\n\r\n            T comp = obj.GetComponent<T>();\r\n            if (comp == null)\r\n            {\r\n                comp = obj.AddComponent<T>();\r\n            }\r\n\r\n            return comp;\r\n        }\r\n\r\n        public static T AddOrGetComponent<T>(this Component obj) where T : Component\r\n        {\r\n            if (obj == null) return null;\r\n\r\n            T comp = obj.GetComponent<T>();\r\n            if (comp == null)\r\n            {\r\n                comp = obj.gameObject.AddComponent<T>();\r\n            }\r\n\r\n            return comp;\r\n        }\r\n\r\n        public static Component AddOrGetComponent(this GameObject obj, System.Type tp)\r\n        {\r\n            if (obj == null) return null;\r\n            if (!TypeUtil.IsType(tp, typeof(Component))) return null;\r\n\r\n            var comp = obj.GetComponent(tp);\r\n            if (comp == null)\r\n            {\r\n                comp = obj.AddComponent(tp);\r\n            }\r\n\r\n            return comp;\r\n        }\r\n\r\n        public static Component AddOrGetComponent(this Component obj, System.Type tp)\r\n        {\r\n            if (obj == null) return null;\r\n            if (!TypeUtil.IsType(tp, typeof(Component))) return null;\r\n\r\n            var comp = obj.GetComponent(tp);\r\n            if (comp == null)\r\n            {\r\n                comp = obj.gameObject.AddComponent(tp);\r\n            }\r\n\r\n            return comp;\r\n        }\r\n\r\n        \r\n        public static T AddOrFindComponent<T>(this GameObject obj) where T : Component\r\n        {\r\n            if (obj == null) return null;\r\n\r\n            T comp = obj.FindComponent<T>();\r\n            if (comp == null)\r\n            {\r\n                comp = obj.AddComponent<T>();\r\n            }\r\n\r\n            return comp;\r\n        }\r\n\r\n        public static T AddOrFindComponent<T>(this Component obj) where T : Component\r\n        {\r\n            if (obj == null) return null;\r\n\r\n            T comp = obj.FindComponent<T>();\r\n            if (comp == null)\r\n            {\r\n                comp = obj.gameObject.AddComponent<T>();\r\n            }\r\n\r\n            return comp;\r\n        }\r\n\r\n        public static Component AddOrFindComponent(this GameObject obj, System.Type tp)\r\n        {\r\n            if (obj == null) return null;\r\n            if (!TypeUtil.IsType(tp, typeof(Component))) return null;\r\n\r\n            var comp = obj.FindComponent(tp);\r\n            if (comp == null)\r\n            {\r\n                comp = obj.AddComponent(tp);\r\n            }\r\n\r\n            return comp;\r\n        }\r\n\r\n        public static Component AddOrFindComponent(this Component obj, System.Type tp)\r\n        {\r\n            if (obj == null) return null;\r\n            if (!TypeUtil.IsType(tp, typeof(Component))) return null;\r\n\r\n            var comp = obj.FindComponent(tp);\r\n            if (comp == null)\r\n            {\r\n                comp = obj.gameObject.AddComponent(tp);\r\n            }\r\n\r\n            return comp;\r\n        }\r\n        \r\n#endregion\r\n\r\n#region GetComponent\r\n\r\n        /// <summary>\r\n        /// Generic access of GetComponent that supports interfaces.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        [System.Obsolete(\"No longer needed, unity added appropriate support for generic component access by interface.\")]\r\n        public static T GetComponentAlt<T>(this GameObject obj) where T : class\r\n        {\r\n            if (obj == null) return null;\r\n            return obj.GetComponent(typeof(T)) as T;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Generic access of GetComponent that supports interfaces.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        [System.Obsolete(\"No longer needed, unity added appropriate support for generic component access by interface.\")]\r\n        public static T GetComponentAlt<T>(this Component obj) where T : class\r\n        {\r\n            if (obj == null) return null;\r\n            return obj.GetComponent(typeof(T)) as T;\r\n        }\r\n\r\n        public static bool GetComponent<T>(this GameObject obj, out T comp) where T : class\r\n        {\r\n            if (obj == null)\r\n            {\r\n                comp = null;\r\n                return false;\r\n            }\r\n            comp = obj.GetComponent<T>();\r\n            return ObjUtil.IsObjectAlive(comp as UnityEngine.Object);\r\n        }\r\n        public static bool GetComponent<T>(this Component obj, out T comp) where T : class\r\n        {\r\n            if (obj == null)\r\n            {\r\n                comp = null;\r\n                return false;\r\n            }\r\n            comp = obj.GetComponent<T>();\r\n            return ObjUtil.IsObjectAlive(comp as UnityEngine.Object);\r\n        }\r\n\r\n        public static bool GetComponent(this GameObject obj, System.Type tp, out Component comp)\r\n        {\r\n            if (obj == null)\r\n            {\r\n                comp = null;\r\n                return false;\r\n            }\r\n            comp = obj.GetComponent(tp);\r\n            return ObjUtil.IsObjectAlive(comp as UnityEngine.Object);\r\n        }\r\n        public static bool GetComponent(this Component obj, System.Type tp, out Component comp)\r\n        {\r\n            if (obj == null)\r\n            {\r\n                comp = null;\r\n                return false;\r\n            }\r\n            comp = obj.GetComponent(tp);\r\n            return ObjUtil.IsObjectAlive(comp as UnityEngine.Object);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region GetComponents\r\n\r\n        /// <summary>\r\n        /// Generic access of GetComponents that supports interfaces.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        [System.Obsolete(\"No longer needed, unity added appropriate support for generic component access by interface.\")]\r\n        public static T[] GetComponentsAlt<T>(this GameObject obj) where T : class\r\n        {\r\n            //if (obj == null) return Enumerable.Empty<T>();\r\n            //return obj.GetComponents(typeof(T)).Cast<T>();\r\n\r\n            if (obj == null) return ArrayUtil.Empty<T>();\r\n\r\n            using (var tmpLst = TempCollection.GetList<Component>())\r\n            {\r\n                obj.GetComponents(typeof(T), tmpLst);\r\n                T[] result = new T[tmpLst.Count];\r\n                for (int i = 0; i < tmpLst.Count; i++)\r\n                {\r\n                    result[i] = tmpLst[i] as T;\r\n                }\r\n                return result;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Generic access of GetComponents that supports interfaces.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        [System.Obsolete(\"No longer needed, unity added appropriate support for generic component access by interface.\")]\r\n        public static T[] GetComponentsAlt<T>(this Component obj) where T : class\r\n        {\r\n            if (obj == null) return ArrayUtil.Empty<T>();\r\n            return GetComponentsAlt<T>(obj.gameObject);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Generic access of GetComponents that supports collections other than just List<T>/>\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public static void GetComponentsAlt<T>(this GameObject obj, ICollection<T> lst) where T : class\r\n        {\r\n            if (obj == null) return;\r\n\r\n            using (var tmpLst = TempCollection.GetList<Component>())\r\n            {\r\n                obj.GetComponents(typeof(T), tmpLst);\r\n                var e = tmpLst.GetEnumerator();\r\n                T c = null;\r\n                while (e.MoveNext())\r\n                {\r\n                    c = e.Current as T;\r\n                    if (ObjUtil.IsObjectAlive(c as UnityEngine.Object)) lst.Add(c);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Generic access of GetComponents that supports collections other than just List<T>/>\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public static void GetComponentsAlt<T>(this Component obj, ICollection<T> lst) where T : class\r\n        {\r\n            if (obj == null) return;\r\n\r\n            GetComponentsAlt<T>(obj.gameObject, lst);\r\n        }\r\n       \r\n        public static void GetComponents<T>(this GameObject obj, ICollection<T> lst, System.Func<Component, T> filter) where T : class\r\n        {\r\n            if (obj == null) return;\r\n            \r\n            using (var tmpLst = TempCollection.GetList<Component>())\r\n            {\r\n                obj.GetComponents(typeof(Component), tmpLst);\r\n                var e = tmpLst.GetEnumerator();\r\n                T c;\r\n                while (e.MoveNext())\r\n                {\r\n                    c = (filter != null) ? filter(e.Current) : e.Current as T;\r\n                    if (ObjUtil.IsObjectAlive(c as UnityEngine.Object))\r\n                    {\r\n                        lst.Add(c);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void GetComponents<T>(this Component obj, ICollection<T> lst, System.Func<Component, T> filter) where T : class\r\n        {\r\n            if (obj == null) return;\r\n\r\n            GetComponents(obj.gameObject, lst, filter);\r\n        }\r\n\r\n\r\n        public static Component[] GetComponents(this GameObject obj, params System.Type[] types)\r\n        {\r\n            if (obj == null) return ArrayUtil.Empty<Component>();\r\n\r\n            using (var tmpLst = TempCollection.GetList<Component>())\r\n            using (var set = ReduceLikeTypes(types))\r\n            {\r\n                var e = set.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    obj.GetComponents(e.Current, tmpLst);\r\n                }\r\n                return tmpLst.ToArray();\r\n            }\r\n        }\r\n\r\n        public static void GetComponents(this GameObject obj, System.Type[] types, ICollection<Component> lst)\r\n        {\r\n            if (obj == null) return;\r\n\r\n            using (var tmpLst = TempCollection.GetList<Component>())\r\n            using (var set = ReduceLikeTypes(types))\r\n            {\r\n                var e = set.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    obj.GetComponents(e.Current, tmpLst);\r\n                }\r\n\r\n                var e2 = tmpLst.GetEnumerator();\r\n                while(e2.MoveNext())\r\n                {\r\n                    lst.Add(e2.Current);\r\n                }\r\n            }\r\n        }\r\n\r\n#endregion\r\n\r\n#region ChildComponent\r\n\r\n        public static bool GetComponentInChildren<T>(this GameObject obj, out T comp) where T : class\r\n        {\r\n            if (obj == null)\r\n            {\r\n                comp = null;\r\n                return false;\r\n            }\r\n            comp = obj.GetComponentInChildren(typeof(T)) as T;\r\n            return ObjUtil.IsObjectAlive(comp as UnityEngine.Object);\r\n        }\r\n\r\n        public static bool GetComponentInChildren<T>(this Component obj, out T comp) where T : class\r\n        {\r\n            if (obj == null)\r\n            {\r\n                comp = null;\r\n                return false;\r\n            }\r\n            comp = obj.GetComponentInChildren(typeof(T)) as T;\r\n            return ObjUtil.IsObjectAlive(comp as UnityEngine.Object);\r\n        }\r\n\r\n        public static bool GetComponentInChildren<T>(this GameObject obj, System.Type tp, out Component comp)\r\n        {\r\n            if (obj == null)\r\n            {\r\n                comp = null;\r\n                return false;\r\n            }\r\n            comp = obj.GetComponentInChildren(tp);\r\n            return ObjUtil.IsObjectAlive(comp);\r\n        }\r\n\r\n        public static bool GetComponentInChildren<T>(this Component obj, System.Type tp, out Component comp)\r\n        {\r\n            if (obj == null)\r\n            {\r\n                comp = null;\r\n                return false;\r\n            }\r\n            comp = obj.GetComponentInChildren(tp);\r\n            return ObjUtil.IsObjectAlive(comp);\r\n        }\r\n\r\n        public static T GetComponentInChildrenAlt<T>(this GameObject obj) where T : class\r\n        {\r\n            if (obj == null) return null;\r\n            return obj.GetComponentInChildren(typeof(T)) as T;\r\n        }\r\n\r\n        public static T GetComponentInChildrenAlt<T>(this Component obj) where T : class\r\n        {\r\n            if (obj == null) return null;\r\n            return obj.GetComponentInChildren(typeof(T)) as T;\r\n        }\r\n\r\n#endregion\r\n\r\n#region Child Components\r\n\r\n        public static IEnumerable<T> GetChildComponents<T>(this GameObject obj, bool bIncludeSelf = false, bool bIncludeInactive = false) where T : class\r\n        {\r\n            if (obj == null) return Enumerable.Empty<T>();\r\n            if(bIncludeSelf)\r\n            {\r\n                return obj.GetComponentsInChildren(typeof(T), bIncludeInactive).Cast<T>();\r\n            }\r\n            else\r\n            {\r\n                using (var temp = TempCollection.GetList<T>())\r\n                {\r\n                    GetChildComponents<T>(obj, temp, false, bIncludeInactive);\r\n                    return temp.ToArray();\r\n                }\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<T> GetChildComponents<T>(this Component obj, bool bIncludeSelf = false, bool bIncludeInactive = false) where T : class\r\n        {\r\n            if (obj == null) return Enumerable.Empty<T>();\r\n            return GetChildComponents<T>(obj.gameObject, bIncludeSelf, bIncludeInactive);\r\n        }\r\n\r\n        public static void GetChildComponents<T>(this GameObject obj, ICollection<T> coll, bool bIncludeSelf = false, bool bIncludeInactive = false) where T : class\r\n        {\r\n            if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n            if (obj == null) return;\r\n\r\n            //using (var tmpLst = TempCollection.GetList<Component>())\r\n            //{\r\n            //    if (bIncludeSelf)\r\n            //    {\r\n            //        obj.GetComponentsInChildren<Component>(bIncludeInactive, tmpLst);\r\n            //        var e = tmpLst.GetEnumerator();\r\n            //        while (e.MoveNext())\r\n            //        {\r\n            //            if (e.Current is T) coll.Add(e.Current as T);\r\n            //        }\r\n            //    }\r\n            //    else\r\n            //    {\r\n            //        obj.GetComponentsInChildren<Component>(bIncludeInactive, tmpLst);\r\n            //        var e = tmpLst.GetEnumerator();\r\n            //        while (e.MoveNext())\r\n            //        {\r\n            //            if (e.Current is T && e.Current.gameObject != obj) coll.Add(e.Current as T);\r\n            //        }\r\n            //    }\r\n            //}\r\n\r\n            using (var tmpLst = TempCollection.GetList<T>())\r\n            {\r\n                if(bIncludeSelf)\r\n                {\r\n                    obj.GetComponentsInChildren<T>(bIncludeInactive, tmpLst);\r\n                    var e = tmpLst.GetEnumerator();\r\n                    while(e.MoveNext())\r\n                    {\r\n                        coll.Add(e.Current);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    obj.GetComponentsInChildren<T>(bIncludeInactive, tmpLst);\r\n                    var e = tmpLst.GetEnumerator();\r\n                    while(e.MoveNext())\r\n                    {\r\n                        if ((e.Current as Component).gameObject != obj) coll.Add(e.Current);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void GetChildComponents<T>(this Component obj, ICollection<T> coll, bool bIncludeSelf = false, bool bIncludeInactive = false) where T : class\r\n        {\r\n            if (obj == null) return;\r\n            GetChildComponents<T>(obj.gameObject, coll, bIncludeSelf, bIncludeInactive);\r\n        }\r\n\r\n\r\n\r\n\r\n        public static IEnumerable<Component> GetChildComponents(this GameObject obj, System.Type tp, bool bIncludeSelf = false, bool bIncludeInactive = false)\r\n        {\r\n            if (obj == null) return Enumerable.Empty<Component>();\r\n\r\n            if (bIncludeSelf)\r\n            {\r\n                return obj.GetComponentsInChildren(tp, bIncludeInactive);\r\n            }\r\n            else\r\n            {\r\n                using (var temp = TempCollection.GetList<Component>())\r\n                {\r\n                    GetChildComponents(obj, tp, temp, false, bIncludeInactive);\r\n                    return temp.ToArray();\r\n                }\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<Component> GetChildComponents(this Component obj, System.Type tp, bool bIncludeSelf = false, bool bIncludeInactive = false)\r\n        {\r\n            if (obj == null) return Enumerable.Empty<Component>();\r\n            return GetChildComponents(obj.gameObject, tp, bIncludeSelf, bIncludeInactive);\r\n        }\r\n\r\n        public static void GetChildComponents(this GameObject obj, System.Type tp, ICollection<Component> coll, bool bIncludeSelf = false, bool bIncludeInactive = false)\r\n        {\r\n            if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n            if (obj == null) return;\r\n\r\n            using (var tmpLst = TempCollection.GetList<Component>())\r\n            {\r\n                if (bIncludeSelf)\r\n                {\r\n                    obj.GetComponentsInChildren<Component>(bIncludeInactive, tmpLst);\r\n                    var e = tmpLst.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (TypeUtil.IsType(e.Current.GetType(), tp)) coll.Add(e.Current);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    obj.GetComponentsInChildren<Component>(bIncludeInactive, tmpLst);\r\n                    var e = tmpLst.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (e.Current.gameObject != obj && TypeUtil.IsType(e.Current.GetType(), tp)) coll.Add(e.Current);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void GetChildComponents(this Component obj, System.Type tp, ICollection<Component> coll, bool bIncludeSelf = false, bool bIncludeInactive = false)\r\n        {\r\n            if (obj == null) return;\r\n            GetChildComponents(obj.gameObject, tp, coll, bIncludeSelf, bIncludeInactive);\r\n        }\r\n\r\n#endregion\r\n\r\n#region RemoveComponent\r\n\r\n        //public static void RemoveComponent<T>(this GameObject obj) where T : class\r\n        //{\r\n        //    RemoveComponent(obj, typeof(T));\r\n        //}\r\n\r\n        //public static void RemoveComponent<T>(this Component obj) where T : class\r\n        //{\r\n        //    RemoveComponent(obj, typeof(T));\r\n        //}\r\n\r\n        //public static void RemoveComponent(this GameObject obj, System.Type tp)\r\n        //{\r\n        //    var comp = obj.GetComponent(tp);\r\n        //    if (comp != null)\r\n        //    {\r\n        //        ObjUtil.SmartDestroy(comp);\r\n        //    }\r\n        //}\r\n\r\n        //public static void RemoveComponent(this Component obj, System.Type tp)\r\n        //{\r\n        //    var comp = obj.GetComponent(tp);\r\n        //    if (comp != null)\r\n        //    {\r\n        //        ObjUtil.SmartDestroy(comp);\r\n        //    }\r\n        //}\r\n\r\n        public static void RemoveComponents<T>(this GameObject obj) where T : class\r\n        {\r\n            RemoveComponents(obj, typeof(T));\r\n        }\r\n\r\n        public static void RemoveComponents<T>(this Component obj) where T : class\r\n        {\r\n            RemoveComponents(obj, typeof(T));\r\n        }\r\n\r\n        public static void RemoveComponents(this GameObject obj, System.Type tp)\r\n        {\r\n            if (obj == null) return;\r\n            var arr = obj.GetComponents(tp);\r\n            for (int i = 0; i < arr.Length; i++)\r\n            {\r\n                ObjUtil.SmartDestroy(arr[i]);\r\n            }\r\n        }\r\n\r\n        public static void RemoveComponents(this Component obj, System.Type tp)\r\n        {\r\n            if (obj == null) return;\r\n            var arr = obj.GetComponents(tp);\r\n            for (int i = 0; i < arr.Length; i++)\r\n            {\r\n                ObjUtil.SmartDestroy(arr[i]);\r\n            }\r\n        }\r\n\r\n        public static void RemoveFromOwner(this Component comp)\r\n        {\r\n            if (comp != null)\r\n            {\r\n                ObjUtil.SmartDestroy(comp);\r\n            }\r\n        }\r\n\r\n#endregion\r\n        \r\n#region EntityHasComponent\r\n\r\n        public static bool EntityHasComponent<T>(this GameObject obj, bool testIfEnabled = false) where T : class\r\n        {\r\n            return EntityHasComponent(obj, typeof(T), testIfEnabled);\r\n        }\r\n\r\n        public static bool EntityHasComponent<T>(this Component obj, bool testIfEnabled = false) where T : class\r\n        {\r\n            return EntityHasComponent(obj.gameObject, typeof(T), testIfEnabled);\r\n        }\r\n\r\n        public static bool EntityHasComponent(this GameObject obj, System.Type tp, bool testIfEnabled = false)\r\n        {\r\n            if (obj == null) return false;\r\n            var root = obj.FindRoot();\r\n\r\n            //foreach (var t in root.GetAllChildrenAndSelf())\r\n            //{\r\n            //    if (t.HasComponent(tp, testIfEnabled)) return true;\r\n            //}\r\n            //return false;\r\n\r\n            var c = root.GetComponentInChildren(tp);\r\n            if (c == null) return false;\r\n            return (testIfEnabled) ? c.IsEnabled() : true;\r\n        }\r\n\r\n        public static bool EntityHasComponent(this Component obj, System.Type tp, bool testIfEnabled = false)\r\n        {\r\n            return EntityHasComponent(obj.gameObject, tp, testIfEnabled);\r\n        }\r\n\r\n#endregion\r\n\r\n#region FindComponent\r\n\r\n        /// <summary>\r\n        /// Finds a component starting at a gameobjects root and digging downward. First component found will be returned. \r\n        /// This method aught to be reserved for components that are unique to an Entity.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"go\"></param>\r\n        /// <returns></returns>\r\n        public static T FindComponent<T>(this GameObject go) where T : class\r\n        {\r\n            if (go == null) return null;\r\n\r\n            var entity = SPEntity.Pool.GetFromSource(go);\r\n            if (entity != null) return entity.GetComponentInChildren<T>();\r\n            else\r\n            {\r\n                var root = go.FindRoot();\r\n                return root.GetComponentInChildren<T>();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Finds a component starting at a gameobjects root and digging downward. First component found will be returned. \r\n        /// This method aught to be reserved for components that are unique to an Entity.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"c\"></param>\r\n        /// <returns></returns>\r\n        public static T FindComponent<T>(this Component c) where T : class\r\n        {\r\n            if (c == null) return null;\r\n            return FindComponent<T>(c.gameObject);\r\n        }\r\n\r\n        public static bool FindComponent<T>(this GameObject go, out T comp) where T : class\r\n        {\r\n            comp = FindComponent<T>(go);\r\n            return ObjUtil.IsObjectAlive(comp as UnityEngine.Object);\r\n        }\r\n\r\n        public static bool FindComponent<T>(this Component c, out T comp) where T : class\r\n        {\r\n            if (c == null)\r\n            {\r\n                comp = null;\r\n                return false;\r\n            }\r\n            comp = FindComponent<T>(c.gameObject);\r\n            return ObjUtil.IsObjectAlive(comp as UnityEngine.Object);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Finds a component starting at a gameobjects root and digging downward. First component found will be returned. \r\n        /// This method aught to be reserved for components that are unique to an Entity.\r\n        /// </summary>\r\n        /// <param name=\"go\"></param>\r\n        /// <param name=\"tp\"></param>\r\n        /// <returns></returns>\r\n        public static Component FindComponent(this GameObject go, System.Type tp)\r\n        {\r\n            if (go == null) return null;\r\n\r\n            var entity = SPEntity.Pool.GetFromSource(go);\r\n            if (entity != null) return entity.GetComponentInChildren(tp);\r\n            else\r\n            {\r\n                var root = go.FindRoot();\r\n                return root.GetComponentInChildren(tp);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Finds a component starting at a gameobjects root and digging downward. First component found will be returned. \r\n        /// This method aught to be reserved for components that are unique to an Entity.\r\n        /// </summary>\r\n        /// <param name=\"c\"></param>\r\n        /// <param name=\"tp\"></param>\r\n        /// <returns></returns>\r\n        public static Component FindComponent(this Component c, System.Type tp)\r\n        {\r\n            if (c == null) return null;\r\n            return FindComponent(c.gameObject, tp);\r\n        }\r\n\r\n        public static bool FindComponent(this GameObject go, System.Type tp, out Component comp)\r\n        {\r\n            comp = FindComponent(go, tp);\r\n            return ObjUtil.IsObjectAlive(comp);\r\n        }\r\n\r\n        public static bool FindComponent(this Component c, System.Type tp, out Component comp)\r\n        {\r\n            if (c == null)\r\n            {\r\n                comp = null;\r\n                return false;\r\n            }\r\n            comp = FindComponent(c.gameObject, tp);\r\n            return ObjUtil.IsObjectAlive(comp);\r\n        }\r\n\r\n#endregion\r\n\r\n#region FindComponents\r\n\r\n        public static T[] FindComponents<T>(this GameObject go, bool bIncludeInactive = false) where T : class\r\n        {\r\n            if (go == null) return ArrayUtil.Empty<T>();\r\n\r\n            var root = go.FindRoot();\r\n            return root.GetComponentsInChildren<T>(bIncludeInactive);\r\n        }\r\n        public static T[] FindComponents<T>(this Component c, bool bIncludeInactive = false) where T : class\r\n        {\r\n            if (c == null) return ArrayUtil.Empty<T>();\r\n            return FindComponents<T>(c.gameObject, bIncludeInactive);\r\n        }\r\n\r\n        public static Component[] FindComponents(this GameObject go, System.Type tp, bool bIncludeInactive = false)\r\n        {\r\n            if (go == null) return ArrayUtil.Empty<Component>();\r\n            return go.FindRoot().GetComponentsInChildren(tp, bIncludeInactive);\r\n        }\r\n        public static Component[] FindComponents(this Component c, System.Type tp, bool bIncludeInactive = false)\r\n        {\r\n            if (c == null) return ArrayUtil.Empty<Component>();\r\n            return FindComponents(c.gameObject, tp, bIncludeInactive);\r\n        }\r\n\r\n\r\n        public static void FindComponents<T>(this GameObject go, ICollection<T> coll, bool bIncludeInactive = false) where T : class\r\n        {\r\n            if (go == null) return;\r\n            GetChildComponents<T>(go.FindRoot(), coll, true, bIncludeInactive);\r\n        }\r\n        public static void FindComponents<T>(this Component c, ICollection<T> coll, bool bIncludeInactive = false) where T : class\r\n        {\r\n            if (c == null) return;\r\n            GetChildComponents<T>(c.FindRoot(), coll, true, bIncludeInactive);\r\n        }\r\n\r\n        public static void FindComponents(this GameObject go, System.Type tp, ICollection<Component> coll, bool bIncludeInactive = false)\r\n        {\r\n            if (go == null) return;\r\n            GetChildComponents(go.FindRoot(), tp, coll, true, bIncludeInactive);\r\n        }\r\n        public static void FindComponents(this Component c, System.Type tp, ICollection<Component> coll, bool bIncludeInactive = false)\r\n        {\r\n            if (c == null) return;\r\n            GetChildComponents(c.FindRoot(), tp, coll, true, bIncludeInactive);\r\n        }\r\n\r\n        public static Component[] FindComponents(this GameObject go, System.Type[] types, bool bIncludeInactive = false)\r\n        {\r\n            if (go == null) return ArrayUtil.Empty<Component>();\r\n\r\n            go = go.FindRoot();\r\n\r\n            using (var lst = TempCollection.GetList<Component>())\r\n            using (var set = ReduceLikeTypes(types))\r\n            {\r\n                var e = set.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    GetChildComponents(go, e.Current, lst, true, bIncludeInactive);\r\n                }\r\n                return lst.ToArray();\r\n            }\r\n        }\r\n\r\n        public static Component[] FindComponents(this Component c, System.Type[] types, bool bIncludeInactive = false)\r\n        {\r\n            if (c == null) return ArrayUtil.Empty<Component>();\r\n\r\n            return FindComponents(c.gameObject, types, bIncludeInactive);\r\n        }\r\n\r\n        public static void FindComponents(this GameObject go, System.Type[] types, ICollection<Component> coll, bool bIncludeInactive = false)\r\n        {\r\n            if (go == null) return;\r\n\r\n            go = go.FindRoot();\r\n\r\n            using (var set = ReduceLikeTypes(types))\r\n            {\r\n                var e = set.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    GetChildComponents(go, e.Current, coll, true, bIncludeInactive);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void FindComponents(this Component c, System.Type[] types, ICollection<Component> coll, bool bIncludeInactive = false)\r\n        {\r\n            if (c == null) return;\r\n\r\n            FindComponents(c.gameObject, types, coll,bIncludeInactive);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n\r\n\r\n\r\n        #region Utils\r\n\r\n        private static TempHashSet<System.Type> ReduceLikeTypes(System.Type[] arr)\r\n        {\r\n            var set = TempCollection.GetSet<System.Type>();\r\n            foreach(var tp in arr)\r\n            {\r\n                if (set.Contains(tp)) continue;\r\n\r\n                var e = set.GetEnumerator();\r\n                bool donotadd = false;\r\n                while(e.MoveNext())\r\n                {\r\n                    if (TypeUtil.IsType(tp, e.Current))\r\n                    {\r\n                        donotadd = true;\r\n                        break;\r\n                    }\r\n                    if (TypeUtil.IsType(e.Current, tp))\r\n                    {\r\n                        set.Remove(e.Current);\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if (!donotadd)\r\n                    set.Add(tp);\r\n            }\r\n            return set;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/ConvertUtil.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Text.RegularExpressions;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class ConvertUtil\r\n    {\r\n\r\n        #region RegEx Constants\r\n\r\n        private const string RX_ISHEX = @\"(?<sign>[-+]?)(?<flag>0x|#|&H)(?<num>[\\dA-F]+)(?<fractional>(\\.[\\dA-F]+)?)$\";\r\n\r\n        #endregion\r\n\r\n        #region Color\r\n\r\n        public static int ToInt(Color color)\r\n        {\r\n            return (Mathf.RoundToInt(color.a * 255) << 24) +\r\n                   (Mathf.RoundToInt(color.r * 255) << 16) +\r\n                   (Mathf.RoundToInt(color.g * 255) << 8) +\r\n                   Mathf.RoundToInt(color.b * 255);\r\n        }\r\n\r\n        public static Color ToColor(int value)\r\n        {\r\n            var a = (float)(value >> 24 & 0xFF) / 255f;\r\n            var r = (float)(value >> 16 & 0xFF) / 255f;\r\n            var g = (float)(value >> 8 & 0xFF) / 255f;\r\n            var b = (float)(value & 0xFF) / 255f;\r\n            return new Color(r, g, b, a);\r\n        }\r\n\r\n        public static Color ToColor(string value)\r\n        {\r\n            return ToColor(ToInt(value));\r\n        }\r\n\r\n        public static Color ToColor(Color32 value)\r\n        {\r\n            return new Color((float)value.r / 255f,\r\n                             (float)value.g / 255f,\r\n                             (float)value.b / 255f,\r\n                             (float)value.a / 255f);\r\n        }\r\n\r\n        public static Color ToColor(Vector3 value)\r\n        {\r\n\r\n            return new Color((float)value.x,\r\n                             (float)value.y,\r\n                             (float)value.z);\r\n        }\r\n\r\n        public static Color ToColor(Vector4 value)\r\n        {\r\n            return new Color((float)value.x,\r\n                             (float)value.y,\r\n                             (float)value.z,\r\n                             (float)value.w);\r\n        }\r\n\r\n        public static Color ToColor(object value)\r\n        {\r\n            if (value is Color) return (Color)value;\r\n            if (value is Color32) return ToColor((Color32)value);\r\n            if (value is Vector3) return ToColor((Vector3)value);\r\n            if (value is Vector4) return ToColor((Vector4)value);\r\n            return ToColor(ToInt(value));\r\n        }\r\n\r\n        public static int ToInt(Color32 color)\r\n        {\r\n            return (color.a << 24) +\r\n                   (color.r << 16) +\r\n                   (color.g << 8) +\r\n                   color.b;\r\n        }\r\n\r\n        public static Color32 ToColor32(int value)\r\n        {\r\n            byte a = (byte)(value >> 24 & 0xFF);\r\n            byte r = (byte)(value >> 16 & 0xFF);\r\n            byte g = (byte)(value >> 8 & 0xFF);\r\n            byte b = (byte)(value & 0xFF);\r\n            return new Color32(r, g, b, a);\r\n        }\r\n        \r\n        public static Color32 ToColor32(string value)\r\n        {\r\n            return ToColor32(ToInt(value));\r\n        }\r\n\r\n        public static Color32 ToColor32(Color value)\r\n        {\r\n            return new Color32((byte)(value.r * 255f),\r\n                               (byte)(value.g * 255f),\r\n                               (byte)(value.b * 255f),\r\n                               (byte)(value.a * 255f));\r\n        }\r\n\r\n        public static Color32 ToColor32(Vector3 value)\r\n        {\r\n\r\n            return new Color32((byte)(value.x * 255f),\r\n                               (byte)(value.y * 255f),\r\n                               (byte)(value.z * 255f), 255);\r\n        }\r\n\r\n        public static Color32 ToColor32(Vector4 value)\r\n        {\r\n            return new Color32((byte)(value.x * 255f),\r\n                               (byte)(value.y * 255f),\r\n                               (byte)(value.z * 255f),\r\n                               (byte)(value.w * 255f));\r\n        }\r\n\r\n        public static Color32 ToColor32(object value)\r\n        {\r\n            if (value is Color32) return (Color32)value;\r\n            if (value is Color) return ToColor32((Color)value);\r\n            if (value is Vector3) return ToColor32((Vector3)value);\r\n            if (value is Vector4) return ToColor32((Vector4)value);\r\n            return ToColor32(ToInt(value));\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ToEnum\r\n\r\n        public static T ToEnum<T>(string val, T defaultValue) where T : struct, System.IConvertible\r\n        {\r\n            if (!typeof(T).IsEnum) throw new System.ArgumentException(\"T must be an enumerated type\");\r\n\r\n            try\r\n            {\r\n                T result = (T)System.Enum.Parse(typeof(T), val, true);\r\n                return result;\r\n            }\r\n            catch\r\n            {\r\n                return defaultValue;\r\n            }\r\n        }\r\n\r\n        public static T ToEnum<T>(int val, T defaultValue) where T : struct, System.IConvertible\r\n        {\r\n            if (!typeof(T).IsEnum) throw new System.ArgumentException(\"T must be an enumerated type\");\r\n            \r\n            try\r\n            {\r\n                return (T)System.Enum.ToObject(typeof(T), val);\r\n            }\r\n            catch\r\n            {\r\n                return defaultValue;\r\n            }\r\n        }\r\n\r\n        public static T ToEnum<T>(long val, T defaultValue) where T : struct, System.IConvertible\r\n        {\r\n            if (!typeof(T).IsEnum) throw new System.ArgumentException(\"T must be an enumerated type\");\r\n\r\n            try\r\n            {\r\n                return (T)System.Enum.ToObject(typeof(T), val);\r\n            }\r\n            catch\r\n            {\r\n                return defaultValue;\r\n            }\r\n        }\r\n\r\n        public static T ToEnum<T>(object val, T defaultValue) where T : struct, System.IConvertible\r\n        {\r\n            return ToEnum<T>(System.Convert.ToString(val), defaultValue);\r\n        }\r\n\r\n        public static T ToEnum<T>(string val) where T : struct, System.IConvertible\r\n        {\r\n            return ToEnum<T>(val, default(T));\r\n        }\r\n\r\n        public static T ToEnum<T>(int val) where T : struct, System.IConvertible\r\n        {\r\n            return ToEnum<T>(val, default(T));\r\n        }\r\n\r\n        public static T ToEnum<T>(object val) where T : struct, System.IConvertible\r\n        {\r\n            return ToEnum<T>(System.Convert.ToString(val), default(T));\r\n        }\r\n\r\n        public static System.Enum ToEnumOfType(System.Type enumType, object value)\r\n        {\r\n            if (value == null)\r\n                return System.Enum.ToObject(enumType, 0) as System.Enum;\r\n            else if (IsNumeric(value))\r\n                return System.Enum.ToObject(enumType, ToInt(value)) as System.Enum;\r\n            else\r\n                return System.Enum.Parse(enumType, System.Convert.ToString(value), true) as System.Enum;\r\n\r\n        }\r\n\r\n        public static bool TryToEnum<T>(object value, out T result) where T : struct, System.IConvertible\r\n        {\r\n            if (!typeof(T).IsEnum) throw new System.ArgumentException(\"T must be an enumerated type\");\r\n\r\n            try\r\n            {\r\n                if (value == null)\r\n                    result = (T)System.Enum.ToObject(typeof(T), 0);\r\n                else if (IsNumeric(value))\r\n                    result = (T)System.Enum.ToObject(typeof(T), ToInt(value));\r\n                else\r\n                    result = (T)System.Enum.Parse(typeof(T), System.Convert.ToString(value), true);\r\n                return true;\r\n            }\r\n            catch\r\n            {\r\n                result = default(T);\r\n                return false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ConvertToUInt\r\n\r\n        /// <summary>\r\n        /// This will convert an integer to a uinteger. The negative integer value is treated as what the memory representation of that negative \r\n        /// value would be as a uinteger.\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static uint ToUInt(sbyte value)\r\n        {\r\n            return System.Convert.ToUInt32(value);\r\n        }\r\n\r\n        public static uint ToUInt(byte value)\r\n        {\r\n            return System.Convert.ToUInt32(value);\r\n        }\r\n\r\n        public static uint ToUInt(short value)\r\n        {\r\n            return System.Convert.ToUInt32(value);\r\n        }\r\n\r\n        public static uint ToUInt(ushort value)\r\n        {\r\n            return System.Convert.ToUInt32(value);\r\n        }\r\n\r\n        public static uint ToUInt(int value)\r\n        {\r\n            return System.Convert.ToUInt32(value & 0xffffffffu);\r\n        }\r\n\r\n        public static uint ToUInt(uint value)\r\n        {\r\n            return value;\r\n        }\r\n\r\n        public static uint ToUInt(long value)\r\n        {\r\n            return System.Convert.ToUInt32(value & 0xffffffffu);\r\n        }\r\n\r\n        public static uint ToUInt(ulong value)\r\n        {\r\n            return System.Convert.ToUInt32(value & 0xffffffffu);\r\n        }\r\n\r\n        ////public static uint ToUInt(float value)\r\n        ////{\r\n        ////    return System.Convert.ToUInt32(value & 0xffffffffu);\r\n        ////}\r\n\r\n        ////public static uint ToUInt(double value)\r\n        ////{\r\n        ////    return System.Convert.ToUInt32(value & 0xffffffffu);\r\n        ////}\r\n\r\n        ////public static uint ToUInt(decimal value)\r\n        ////{\r\n        ////    return System.Convert.ToUInt32(value & 0xffffffffu);\r\n        ////}\r\n\r\n        public static uint ToUInt(bool value)\r\n        {\r\n            return (value) ? 1u : 0u;\r\n        }\r\n\r\n        public static uint ToUInt(char value)\r\n        {\r\n            return System.Convert.ToUInt32(value);\r\n        }\r\n\r\n        public static uint ToUInt(object value)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return 0;\r\n            }\r\n            else if (value is System.IConvertible)\r\n            {\r\n                try\r\n                {\r\n                    return System.Convert.ToUInt32(value);\r\n                }\r\n                catch\r\n                {\r\n                    return 0;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return ToUInt(value.ToString());\r\n            }\r\n        }\r\n\r\n        public static uint ToUInt(string value, System.Globalization.NumberStyles style)\r\n        {\r\n            return ToUInt(ToDouble(value, style));\r\n        }\r\n\r\n        public static uint ToUInt(string value)\r\n        {\r\n            return ToUInt(ToDouble(value, System.Globalization.NumberStyles.Any));\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ConvertToInt\r\n\r\n        public static int ToInt(sbyte value)\r\n        {\r\n            return System.Convert.ToInt32(value);\r\n        }\r\n\r\n        public static int ToInt(byte value)\r\n        {\r\n            return System.Convert.ToInt32(value);\r\n        }\r\n\r\n        public static int ToInt(short value)\r\n        {\r\n            return System.Convert.ToInt32(value);\r\n        }\r\n\r\n        public static int ToInt(ushort value)\r\n        {\r\n            return System.Convert.ToInt32(value);\r\n        }\r\n\r\n        public static int ToInt(int value)\r\n        {\r\n            return value;\r\n        }\r\n\r\n        public static int ToInt(uint value)\r\n        {\r\n            if (value > int.MaxValue)\r\n            {\r\n                return int.MinValue + System.Convert.ToInt32(value & 0x7fffffff);\r\n            }\r\n            else\r\n            {\r\n                return System.Convert.ToInt32(value & 0xffffffff);\r\n            }\r\n        }\r\n\r\n        public static int ToInt(long value)\r\n        {\r\n            if (value > int.MaxValue)\r\n            {\r\n                return int.MinValue + System.Convert.ToInt32(value & 0x7fffffff);\r\n            }\r\n            else\r\n            {\r\n                return System.Convert.ToInt32(value & 0xffffffff);\r\n            }\r\n        }\r\n\r\n        public static int ToInt(ulong value)\r\n        {\r\n            if (value > int.MaxValue)\r\n            {\r\n                return int.MinValue + System.Convert.ToInt32(value & 0x7fffffff);\r\n            }\r\n            else\r\n            {\r\n                return System.Convert.ToInt32(value & 0xffffffff);\r\n            }\r\n        }\r\n\r\n        public static int ToInt(float value)\r\n        {\r\n            return System.Convert.ToInt32(value);\r\n            //if (value > int.MaxValue)\r\n            //{\r\n            //    return int.MinValue + System.Convert.ToInt32(value & 0x7fffffff);\r\n            //}\r\n            //else\r\n            //{\r\n            //    return System.Convert.ToInt32(value & 0xffffffff);\r\n            //}\r\n        }\r\n\r\n        public static int ToInt(double value)\r\n        {\r\n            return System.Convert.ToInt32(value);\r\n            //if (value > int.MaxValue)\r\n            //{\r\n            //    return int.MinValue + System.Convert.ToInt32(value & 0x7fffffff);\r\n            //}\r\n            //else\r\n            //{\r\n            //    return System.Convert.ToInt32(value & 0xffffffff);\r\n            //}\r\n        }\r\n\r\n        public static int ToInt(decimal value)\r\n        {\r\n            return System.Convert.ToInt32(value);\r\n            //if (value > int.MaxValue)\r\n            //{\r\n            //    return int.MinValue + System.Convert.ToInt32(value & 0x7fffffff);\r\n            //}\r\n            //else\r\n            //{\r\n            //    return System.Convert.ToInt32(value & 0xffffffff);\r\n            //}\r\n        }\r\n\r\n        public static int ToInt(bool value)\r\n        {\r\n            return value ? 1 : 0;\r\n        }\r\n\r\n        public static int ToInt(char value)\r\n        {\r\n            return System.Convert.ToInt32(value);\r\n        }\r\n\r\n        public static int ToInt(object value)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return 0;\r\n            }\r\n            else if (value is Color)\r\n            {\r\n                return ToInt((Color)value);\r\n            }\r\n            else if(value is Color32)\r\n            {\r\n                return ToInt((Color32)value);\r\n            }\r\n            else if (value is System.IConvertible)\r\n            {\r\n                try\r\n                {\r\n                    return System.Convert.ToInt32(value);\r\n                }\r\n                catch\r\n                {\r\n                    return 0;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return ToInt(value.ToString());\r\n            }\r\n        }\r\n\r\n        public static int ToInt(string value, System.Globalization.NumberStyles style)\r\n        {\r\n            return ToInt(ToDouble(value, style));\r\n        }\r\n        public static int ToInt(string value)\r\n        {\r\n            return ToInt(ToDouble(value, System.Globalization.NumberStyles.Any));\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region \"ConvertToULong\"\r\n        /// <summary>\r\n        /// This will System.Convert an integer to a uinteger. The negative integer value is treated as what the memory representation of that negative \r\n        /// value would be as a uinteger.\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static ulong ToULong(sbyte value)\r\n        {\r\n            return System.Convert.ToUInt64(value);\r\n        }\r\n\r\n        public static ulong ToULong(byte value)\r\n        {\r\n            return System.Convert.ToUInt64(value);\r\n        }\r\n\r\n        public static ulong ToULong(short value)\r\n        {\r\n            return System.Convert.ToUInt64(value);\r\n        }\r\n\r\n        public static ulong ToULong(ushort value)\r\n        {\r\n            return System.Convert.ToUInt64(value);\r\n        }\r\n\r\n        public static ulong ToULong(int value)\r\n        {\r\n            return System.Convert.ToUInt64(value & long.MaxValue);\r\n        }\r\n\r\n        public static ulong ToULong(uint value)\r\n        {\r\n            return System.Convert.ToUInt64(value);\r\n        }\r\n\r\n        public static ulong ToULong(long value)\r\n        {\r\n            return System.Convert.ToUInt64(value & long.MaxValue);\r\n        }\r\n\r\n        public static ulong ToULong(ulong value)\r\n        {\r\n            return value;\r\n        }\r\n\r\n        ////public static ulong ToULong(float value)\r\n        ////{\r\n        ////    return System.Convert.ToUInt64(value & long.MaxValue);\r\n        ////}\r\n\r\n        ////public static ulong ToULong(double value)\r\n        ////{\r\n        ////    return System.Convert.ToUInt64(value & long.MaxValue);\r\n        ////}\r\n\r\n        ////public static ulong ToULong(decimal value)\r\n        ////{\r\n        ////    return System.Convert.ToUInt64(value & long.MaxValue);\r\n        ////}\r\n\r\n        public static ulong ToULong(bool value)\r\n        {\r\n            return (value) ? 1ul : 0ul;\r\n        }\r\n\r\n        public static ulong ToULong(char value)\r\n        {\r\n            return System.Convert.ToUInt64(value);\r\n        }\r\n\r\n        public static ulong ToULong(object value)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return 0;\r\n            }\r\n            else if (value is System.IConvertible)\r\n            {\r\n                try\r\n                {\r\n                    return System.Convert.ToUInt64(value);\r\n                }\r\n                catch\r\n                {\r\n                    return 0;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return ToULong(value.ToString());\r\n            }\r\n        }\r\n\r\n        public static ulong ToULong(string value, System.Globalization.NumberStyles style)\r\n        {\r\n            return ToULong(ToDouble(value, style));\r\n        }\r\n        public static ulong ToULong(string value)\r\n        {\r\n            return ToULong(ToDouble(value, System.Globalization.NumberStyles.Any));\r\n        }\r\n        #endregion\r\n\r\n        #region \"ConvertToLong\"\r\n\r\n        public static long ToLong(sbyte value)\r\n        {\r\n            return System.Convert.ToInt64(value);\r\n        }\r\n\r\n        public static long ToLong(byte value)\r\n        {\r\n            return System.Convert.ToInt64(value);\r\n        }\r\n\r\n        public static long ToLong(short value)\r\n        {\r\n            return System.Convert.ToInt64(value);\r\n        }\r\n\r\n        public static long ToLong(ushort value)\r\n        {\r\n            return System.Convert.ToInt64(value);\r\n        }\r\n\r\n        public static long ToLong(int value)\r\n        {\r\n            return System.Convert.ToInt64(value);\r\n        }\r\n\r\n        public static long ToLong(uint value)\r\n        {\r\n            return System.Convert.ToInt64(value);\r\n        }\r\n\r\n        public static long ToLong(long value)\r\n        {\r\n            return value;\r\n        }\r\n\r\n        public static long ToLong(ulong value)\r\n        {\r\n            if (value > long.MaxValue)\r\n            {\r\n                return int.MinValue + System.Convert.ToInt32(value & long.MaxValue);\r\n            }\r\n            else\r\n            {\r\n                return System.Convert.ToInt64(value & long.MaxValue);\r\n            }\r\n        }\r\n\r\n        ////public static long ToLong(float value)\r\n        ////{\r\n        ////    return System.Convert.ToInt64(value & long.MaxValue);\r\n        ////}\r\n\r\n        ////public static long ToLong(double value)\r\n        ////{\r\n        ////    return System.Convert.ToInt64(value & long.MaxValue);\r\n        ////}\r\n\r\n        ////public static long ToLong(decimal value)\r\n        ////{\r\n        ////    return System.Convert.ToInt64(value & long.MaxValue);\r\n        ////}\r\n\r\n        public static long ToLong(bool value)\r\n        {\r\n            return value ? 1 : 0;\r\n        }\r\n\r\n        public static long ToLong(char value)\r\n        {\r\n            return System.Convert.ToInt64(value);\r\n        }\r\n\r\n        public static long ToLong(object value)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return 0;\r\n            }\r\n            else if (value is System.IConvertible)\r\n            {\r\n                try\r\n                {\r\n                    return System.Convert.ToInt64(value);\r\n                }\r\n                catch\r\n                {\r\n                    return 0;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return ToLong(value.ToString());\r\n            }\r\n        }\r\n\r\n        public static long ToLong(string value, System.Globalization.NumberStyles style)\r\n        {\r\n            return ToLong(ToDouble(value, style));\r\n        }\r\n\r\n        public static long ToLong(string value)\r\n        {\r\n            return ToLong(ToDouble(value, System.Globalization.NumberStyles.Any));\r\n        }\r\n        #endregion\r\n\r\n        #region \"ToSingle\"\r\n\r\n        public static float ToSingle(sbyte value)\r\n        {\r\n            return System.Convert.ToSingle(value);\r\n        }\r\n\r\n        public static float ToSingle(byte value)\r\n        {\r\n            return System.Convert.ToSingle(value);\r\n        }\r\n\r\n        public static float ToSingle(short value)\r\n        {\r\n            return System.Convert.ToSingle(value);\r\n        }\r\n\r\n        public static float ToSingle(ushort value)\r\n        {\r\n            return System.Convert.ToSingle(value);\r\n        }\r\n\r\n        public static float ToSingle(int value)\r\n        {\r\n            return System.Convert.ToSingle(value);\r\n        }\r\n\r\n        public static float ToSingle(uint value)\r\n        {\r\n            return System.Convert.ToSingle(value);\r\n        }\r\n\r\n        public static float ToSingle(long value)\r\n        {\r\n            return System.Convert.ToSingle(value);\r\n        }\r\n\r\n        public static float ToSingle(ulong value)\r\n        {\r\n            return System.Convert.ToSingle(value);\r\n        }\r\n\r\n        public static float ToSingle(float value)\r\n        {\r\n            return System.Convert.ToSingle(value);\r\n        }\r\n\r\n        public static float ToSingle(double value)\r\n        {\r\n            return (float)value;\r\n        }\r\n\r\n        public static float ToSingle(decimal value)\r\n        {\r\n            return System.Convert.ToSingle(value);\r\n        }\r\n\r\n        public static float ToSingle(bool value)\r\n        {\r\n            return value ? 1 : 0;\r\n        }\r\n\r\n        public static float ToSingle(char value)\r\n        {\r\n            return ToSingle(System.Convert.ToInt32(value));\r\n        }\r\n\r\n        public static float ToSingle(Vector2 value)\r\n        {\r\n            return value.x;\r\n        }\r\n\r\n        public static float ToSingle(Vector3 value)\r\n        {\r\n            return value.x;\r\n        }\r\n\r\n        public static float ToSingle(Vector4 value)\r\n        {\r\n            return value.x;\r\n        }\r\n        \r\n        public static float ToSingle(object value)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return 0;\r\n            }\r\n            else if (value is System.IConvertible)\r\n            {\r\n                try\r\n                {\r\n                    return System.Convert.ToSingle(value);\r\n                }\r\n                catch\r\n                {\r\n                    return 0;\r\n                }\r\n            }\r\n            else if(value is Vector2)\r\n            {\r\n                return ToSingle((Vector2)value);\r\n            }\r\n            else if(value is Vector3)\r\n            {\r\n                return ToSingle((Vector3)value);\r\n            }\r\n            else if (value is Vector4)\r\n            {\r\n                return ToSingle((Vector3)value);\r\n            }\r\n            else\r\n            {\r\n                return ToSingle(value.ToString());\r\n            }\r\n        }\r\n\r\n        public static float ToSingle(string value, System.Globalization.NumberStyles style)\r\n        {\r\n            return System.Convert.ToSingle(ToDouble(value, style));\r\n        }\r\n        public static float ToSingle(string value)\r\n        {\r\n            return System.Convert.ToSingle(ToDouble(value, System.Globalization.NumberStyles.Any));\r\n        }\r\n        #endregion\r\n\r\n        #region \"ToDouble\"\r\n\r\n        public static double ToDouble(sbyte value)\r\n        {\r\n            return System.Convert.ToDouble(value);\r\n        }\r\n\r\n        public static double ToDouble(byte value)\r\n        {\r\n            return System.Convert.ToDouble(value);\r\n        }\r\n\r\n        public static double ToDouble(short value)\r\n        {\r\n            return System.Convert.ToDouble(value);\r\n        }\r\n\r\n        public static double ToDouble(ushort value)\r\n        {\r\n            return System.Convert.ToDouble(value);\r\n        }\r\n\r\n        public static double ToDouble(int value)\r\n        {\r\n            return System.Convert.ToDouble(value);\r\n        }\r\n\r\n        public static double ToDouble(uint value)\r\n        {\r\n            return System.Convert.ToDouble(value);\r\n        }\r\n\r\n        public static double ToDouble(long value)\r\n        {\r\n            return System.Convert.ToDouble(value);\r\n        }\r\n\r\n        public static double ToDouble(ulong value)\r\n        {\r\n            return System.Convert.ToDouble(value);\r\n        }\r\n\r\n        public static double ToDouble(float value)\r\n        {\r\n            return System.Convert.ToDouble(value);\r\n        }\r\n\r\n        public static double ToDouble(double value)\r\n        {\r\n            return value;\r\n        }\r\n\r\n        public static double ToDouble(decimal value)\r\n        {\r\n            return System.Convert.ToDouble(value);\r\n        }\r\n\r\n        public static double ToDouble(bool value)\r\n        {\r\n            return value ? 1 : 0;\r\n        }\r\n\r\n        public static double ToDouble(char value)\r\n        {\r\n            return ToDouble(System.Convert.ToInt32(value));\r\n        }\r\n\r\n        public static double ToDouble(Vector2 value)\r\n        {\r\n            return value.x;\r\n        }\r\n\r\n        public static double ToDouble(Vector3 value)\r\n        {\r\n            return value.x;\r\n        }\r\n\r\n        public static double ToDouble(Vector4 value)\r\n        {\r\n            return value.x;\r\n        }\r\n        \r\n        public static double ToDouble(object value)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return 0;\r\n            }\r\n            else if (value is System.IConvertible)\r\n            {\r\n                try\r\n                {\r\n                    return System.Convert.ToDouble(value);\r\n                }\r\n                catch\r\n                {\r\n                    return 0;\r\n                }\r\n            }\r\n            else if (value is Vector2)\r\n            {\r\n                return ToDouble((Vector2)value);\r\n            }\r\n            else if (value is Vector3)\r\n            {\r\n                return ToDouble((Vector3)value);\r\n            }\r\n            else if (value is Vector4)\r\n            {\r\n                return ToDouble((Vector3)value);\r\n            }\r\n            else\r\n            {\r\n                return ToDouble(value.ToString(), System.Globalization.NumberStyles.Any, null);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// System.Converts any string to a number with no errors.\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <param name=\"style\"></param>\r\n        /// <param name=\"provider\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks>\r\n        /// TODO: I would also like to possibly include support for other number system bases. At least binary and octal.\r\n        /// </remarks>\r\n        public static double ToDouble(string value, System.Globalization.NumberStyles style, System.IFormatProvider provider)\r\n        {\r\n            if (string.IsNullOrEmpty(value)) return 0d;\r\n\r\n            style = style & System.Globalization.NumberStyles.Any;\r\n            double dbl = 0;\r\n            if(double.TryParse(value, style, provider, out dbl))\r\n            {\r\n                return dbl;\r\n            }\r\n            else\r\n            {\r\n                //test hex\r\n                int i;\r\n                bool isNeg = false;\r\n                for (i = 0; i < value.Length; i++)\r\n                {\r\n                    if (value[i] == ' ' || value[i] == '+') continue;\r\n                    if (value[i] == '-')\r\n                    {\r\n                        isNeg = !isNeg;\r\n                        continue;\r\n                    }\r\n                    break;\r\n                }\r\n\r\n                if (i < value.Length - 1 &&\r\n                        (\r\n                        (value[i] == '#') ||\r\n                        (value[i] == '0' && (value[i + 1] == 'x' || value[i + 1] == 'X')) ||\r\n                        (value[i] == '&' && (value[i + 1] == 'h' || value[i + 1] == 'H'))\r\n                        ))\r\n                {\r\n                    //is hex\r\n                    style = (style & System.Globalization.NumberStyles.HexNumber) | System.Globalization.NumberStyles.AllowHexSpecifier;\r\n\r\n                    if (value[i] == '#') i++;\r\n                    else i += 2;\r\n                    int j = value.IndexOf('.', i);\r\n\r\n                    if (j >= 0)\r\n                    {\r\n                        long lng = 0;\r\n                        long.TryParse(value.Substring(i, j - i), style, provider, out lng);\r\n\r\n                        if (isNeg)\r\n                            lng = -lng;\r\n\r\n                        long flng = 0;\r\n                        string sfract = value.Substring(j + 1).Trim();\r\n                        long.TryParse(sfract, style, provider, out flng);\r\n                        return System.Convert.ToDouble(lng) + System.Convert.ToDouble(flng) / System.Math.Pow(16d, sfract.Length);\r\n                    }\r\n                    else\r\n                    {\r\n                        string num = value.Substring(i);\r\n                        long l;\r\n                        if (long.TryParse(num, style, provider, out l))\r\n                            return System.Convert.ToDouble(l);\r\n                        else\r\n                            return 0d;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    return 0d;\r\n                }\r\n            }\r\n            \r\n\r\n            ////################\r\n            ////OLD garbage heavy version\r\n\r\n            //if (value == null) return 0d;\r\n            //value = value.Trim();\r\n            //if (string.IsNullOrEmpty(value)) return 0d;\r\n\r\n            //#if UNITY_WEBPLAYER\r\n            //\t\t\tMatch m = Regex.Match(value, RX_ISHEX, RegexOptions.IgnoreCase);\r\n            //#else\r\n            //            Match m = Regex.Match(value, RX_ISHEX, RegexOptions.IgnoreCase | RegexOptions.Compiled);\r\n            //#endif\r\n\r\n            //if (m.Success)\r\n            //{\r\n            //    long lng = 0;\r\n            //    style = (style & System.Globalization.NumberStyles.HexNumber) | System.Globalization.NumberStyles.AllowHexSpecifier;\r\n            //    long.TryParse(m.Groups[\"num\"].Value, style, provider, out lng);\r\n\r\n            //    if (m.Groups[\"sign\"].Value == \"-\")\r\n            //        lng = -lng;\r\n\r\n            //    if (m.Groups[\"fractional\"].Success)\r\n            //    {\r\n            //        long flng = 0;\r\n            //        string sfract = m.Groups[\"fractional\"].Value.Substring(1);\r\n            //        long.TryParse(sfract, style, provider, out flng);\r\n            //        return System.Convert.ToDouble(lng) + System.Convert.ToDouble(flng) / System.Math.Pow(16d, sfract.Length);\r\n            //    }\r\n            //    else\r\n            //    {\r\n            //        return System.Convert.ToDouble(lng);\r\n            //    }\r\n\r\n            //}\r\n            //else\r\n            //{\r\n            //    style = style & System.Globalization.NumberStyles.Any;\r\n            //    double dbl = 0;\r\n            //    double.TryParse(value, style, provider, out dbl);\r\n            //    return dbl;\r\n\r\n            //}\r\n        }\r\n\r\n        public static double ToDouble(string value, System.Globalization.NumberStyles style)\r\n        {\r\n            return ToDouble(value, style, null);\r\n        }\r\n\r\n        public static double ToDouble(string value)\r\n        {\r\n            return ToDouble(value, System.Globalization.NumberStyles.Any, null);\r\n        }\r\n        #endregion\r\n\r\n        #region \"ToDecimal\"\r\n        public static decimal ToDecimal(sbyte value)\r\n        {\r\n            return System.Convert.ToDecimal(value);\r\n        }\r\n\r\n        public static decimal ToDecimal(byte value)\r\n        {\r\n            return System.Convert.ToDecimal(value);\r\n        }\r\n\r\n        public static decimal ToDecimal(short value)\r\n        {\r\n            return System.Convert.ToDecimal(value);\r\n        }\r\n\r\n        public static decimal ToDecimal(ushort value)\r\n        {\r\n            return System.Convert.ToDecimal(value);\r\n        }\r\n\r\n        public static decimal ToDecimal(int value)\r\n        {\r\n            return System.Convert.ToDecimal(value);\r\n        }\r\n\r\n        public static decimal ToDecimal(uint value)\r\n        {\r\n            return System.Convert.ToDecimal(value);\r\n        }\r\n\r\n        public static decimal ToDecimal(long value)\r\n        {\r\n            return System.Convert.ToDecimal(value);\r\n        }\r\n\r\n        public static decimal ToDecimal(ulong value)\r\n        {\r\n            return System.Convert.ToDecimal(value);\r\n        }\r\n\r\n        public static decimal ToDecimal(float value)\r\n        {\r\n            return System.Convert.ToDecimal(value);\r\n        }\r\n\r\n        public static decimal ToDecimal(double value)\r\n        {\r\n            return System.Convert.ToDecimal(value);\r\n        }\r\n\r\n        public static decimal ToDecimal(decimal value)\r\n        {\r\n            return value;\r\n        }\r\n\r\n        public static decimal ToDecimal(bool value)\r\n        {\r\n            return value ? 1 : 0;\r\n        }\r\n\r\n        public static decimal ToDecimal(char value)\r\n        {\r\n            return ToDecimal(System.Convert.ToInt32(value));\r\n        }\r\n\r\n        public static decimal ToDecimal(Vector2 value)\r\n        {\r\n            return (decimal)value.x;\r\n        }\r\n\r\n        public static decimal ToDecimal(Vector3 value)\r\n        {\r\n            return (decimal)value.x;\r\n        }\r\n\r\n        public static decimal ToDecimal(Vector4 value)\r\n        {\r\n            return (decimal)value.x;\r\n        }\r\n\r\n        public static decimal ToDecimal(object value)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return 0;\r\n            }\r\n            else if (value is System.IConvertible)\r\n            {\r\n                try\r\n                {\r\n                    return System.Convert.ToDecimal(value);\r\n                }\r\n                catch\r\n                {\r\n                    return 0;\r\n                }\r\n            }\r\n            else if (value is Vector2)\r\n            {\r\n                return ToDecimal((Vector2)value);\r\n            }\r\n            else if (value is Vector3)\r\n            {\r\n                return ToDecimal((Vector3)value);\r\n            }\r\n            else if (value is Vector4)\r\n            {\r\n                return ToDecimal((Vector3)value);\r\n            }\r\n            else\r\n            {\r\n                return ToDecimal(value.ToString());\r\n            }\r\n        }\r\n\r\n        public static decimal ToDecimal(string value, System.Globalization.NumberStyles style)\r\n        {\r\n            return System.Convert.ToDecimal(ToDouble(value, style));\r\n        }\r\n        public static decimal ToDecimal(string value)\r\n        {\r\n            return System.Convert.ToDecimal(ToDouble(value, System.Globalization.NumberStyles.Any));\r\n        }\r\n        #endregion\r\n\r\n        #region \"ToBool\"\r\n        public static bool ToBool(sbyte value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBool(byte value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBool(short value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBool(ushort value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBool(int value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBool(uint value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBool(long value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBool(ulong value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBool(float value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBool(double value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBool(decimal value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBool(bool value)\r\n        {\r\n            return value;\r\n        }\r\n\r\n        public static bool ToBool(char value)\r\n        {\r\n            return System.Convert.ToInt32(value) != 0;\r\n        }\r\n\r\n        public static bool ToBool(object value)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return false;\r\n            }\r\n            else if (value is System.IConvertible)\r\n            {\r\n                try\r\n                {\r\n                    return System.Convert.ToBoolean(value);\r\n                }\r\n                catch\r\n                {\r\n                    return false;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return ToBool(value.ToString());\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts a string to boolean. Is FALSE greedy.\r\n        /// A string is considered TRUE if it DOES meet one of the following criteria:\r\n        /// \r\n        /// doesn't read blank: \"\"\r\n        /// doesn't read false (not case-sensitive)\r\n        /// doesn't read 0\r\n        /// doesn't read off (not case-sensitive)\r\n        /// </summary>\r\n        /// <param name=\"str\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static bool ToBool(string str)\r\n        {\r\n            //str = (str + \"\").Trim().ToLower();\r\n            //return !System.Convert.ToBoolean(string.IsNullOrEmpty(str) || str == \"false\" || str == \"0\" || str == \"off\");\r\n\r\n            return !(string.IsNullOrEmpty(str) || str.Equals(\"false\", System.StringComparison.OrdinalIgnoreCase) || str.Equals(\"0\", System.StringComparison.OrdinalIgnoreCase) || str.Equals(\"off\", System.StringComparison.OrdinalIgnoreCase));\r\n        }\r\n\r\n\r\n        public static bool ToBoolInverse(sbyte value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBoolInverse(byte value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBoolInverse(short value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBoolInverse(ushort value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBoolInverse(int value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBoolInverse(uint value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBoolInverse(long value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBoolInverse(ulong value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBoolInverse(float value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBoolInverse(double value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBoolInverse(decimal value)\r\n        {\r\n            return value != 0;\r\n        }\r\n\r\n        public static bool ToBoolInverse(bool value)\r\n        {\r\n            return value;\r\n        }\r\n\r\n        public static bool ToBoolInverse(char value)\r\n        {\r\n            return System.Convert.ToInt32(value) != 0;\r\n        }\r\n\r\n        public static bool ToBoolInverse(object value)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return false;\r\n            }\r\n            else if (value is System.IConvertible)\r\n            {\r\n                try\r\n                {\r\n                    return System.Convert.ToBoolean(value);\r\n                }\r\n                catch\r\n                {\r\n                    return false;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return ToBoolInverse(value.ToString());\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts a string to boolean. Is TRUE greedy (inverse of ToBool)\r\n        /// A string is considered TRUE if it DOESN'T meet any of the following criteria:\r\n        /// \r\n        /// reads blank: \"\"\r\n        /// reads false (not case-sensitive)\r\n        /// reads 0\r\n        /// </summary>\r\n        /// <param name=\"str\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static bool ToBoolInverse(string str)\r\n        {\r\n            //str = (str + \"\").Trim().ToLower();\r\n            //return (!string.IsNullOrEmpty(str) && str != \"false\" && str != \"0\");\r\n\r\n            return !string.IsNullOrEmpty(str) && \r\n                   !str.Equals(\"false\", System.StringComparison.OrdinalIgnoreCase) && \r\n                   !str.Equals(\"0\", System.StringComparison.OrdinalIgnoreCase) && \r\n                   !str.Equals(\"off\", System.StringComparison.OrdinalIgnoreCase);\r\n        }\r\n        #endregion\r\n\r\n        #region \"Time/Date\"\r\n\r\n        /// <summary>\r\n        /// Converts an object value to a date value first by straight conversion then by changing it to string if the \r\n        /// straight conversion doesn't work\r\n        /// </summary>\r\n        /// <param name=\"value\">Object vale</param>\r\n        /// <returns>Date</returns>\r\n        /// <remarks></remarks>\r\n        public static System.DateTime ToDate(object value)\r\n        {\r\n            try\r\n            {\r\n                //'try straight convert\r\n                return System.Convert.ToDateTime(value);\r\n\r\n            }\r\n            catch\r\n            {\r\n            }\r\n\r\n            try\r\n            {\r\n                //'if straight convert failed, try by string\r\n                return System.Convert.ToDateTime(System.Convert.ToString(value));\r\n\r\n            }\r\n            catch\r\n            {\r\n            }\r\n\r\n            //'if all fail, return Date(0)\r\n            return new System.DateTime(0);\r\n        }\r\n\r\n        public static System.DateTime ToDate(object day, object secondsIntoDay)\r\n        {\r\n            return ConvertUtil.ToDate(day).Date + ConvertUtil.ToTime(secondsIntoDay);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts the input to the time of day. If value is numeric it is considered as seconds into the day.\r\n        /// </summary>\r\n        /// <param name=\"value\">Object Value treated as number of seconds in the day</param>\r\n        /// <returns>TimeSpan Value</returns>\r\n        /// <remarks>\r\n        /// If input is a TimeSpan, that TimeSpan is just returned.\r\n        /// \r\n        /// If input is numeric, it is considered as seconds into the day.\r\n        /// \r\n        /// If value is formatted as LoD supported time format (i.e. '5 seconds', '3.2 days', '100 ticks', etc), it is converted accordingly\r\n        /// \r\n        /// Lastly it'll attempt to parse to a TimeSpan using normal .Net TimeSpan formatting with system region.\r\n        /// \r\n        /// If all else, TimeSpan.Zero is returned.\r\n        /// \r\n        /// \r\n        /// Supported LoD time formats:\r\n        /// Ticks (any decimal will be rounded off):\r\n        /// #.# t\r\n        /// #.# tick\r\n        /// #.# ticks\r\n        /// \r\n        /// Milliseconds:\r\n        /// #.# ms\r\n        /// #.# millisecond\r\n        /// #.# milliseconds\r\n        /// \r\n        /// Seconds:\r\n        /// #.# s\r\n        /// #.# sec\r\n        /// #.# secs\r\n        /// #.# seconds\r\n        /// #.# seconds\r\n        /// \r\n        /// Minutes:\r\n        /// #.# m\r\n        /// #.# min\r\n        /// #.# mins\r\n        /// #.# minute\r\n        /// #.# minutes\r\n        /// \r\n        /// Hours:\r\n        /// #.# h\r\n        /// #.# hour\r\n        /// #.# hours\r\n        /// \r\n        /// Days:\r\n        /// #.# d\r\n        /// #.# day\r\n        /// #.# days\r\n        /// </remarks>\r\n        public static System.TimeSpan ToTime(object value)\r\n        {\r\n            const string RX_TIME = \"^\\\\d+(\\\\.\\\\d+)?\\\\s+((t)|(tick)|(ticks)|(ms)|(millisecond)|(milliseconds)|(s)|(sec)|(secs)|(second)|(seconds)|(m)|(min)|(mins)|(minute)|(minutes)|(h)|(hour)|(hours)|(d)|(day)|(days))$\";\r\n\r\n            if (value is System.TimeSpan)\r\n            {\r\n                return (System.TimeSpan)value;\r\n            }\r\n            else\r\n            {\r\n                if (IsNumeric(value))\r\n                {\r\n                    return System.TimeSpan.FromSeconds(ToDouble(value));\r\n                }\r\n                else\r\n                {\r\n                    var sval = System.Convert.ToString(value);\r\n#if UNITY_WEBPLAYER\r\n\t\t\t\t\tif (sval != null && Regex.IsMatch(sval.Trim(), RX_TIME, RegexOptions.IgnoreCase))\r\n#else\r\n                    if (sval != null && Regex.IsMatch(sval.Trim(), RX_TIME, RegexOptions.IgnoreCase | RegexOptions.Compiled))\r\n#endif\r\n                    {\r\n                        sval = Regex.Replace(sval.Trim(), \"\\\\s+\", \" \");\r\n                        var arr = sval.Split(' ');\r\n                        switch (arr[1].ToLower())\r\n                        {\r\n                            case \"t\":\r\n                            case \"tick\":\r\n                            case \"ticks\":\r\n                                return System.TimeSpan.FromTicks(ConvertUtil.ToLong(arr[0]));\r\n                            case \"ms\":\r\n                            case \"millisecond\":\r\n                            case \"milliseconds\":\r\n                                return System.TimeSpan.FromMilliseconds(ConvertUtil.ToDouble(arr[0]));\r\n                            case \"s\":\r\n                            case \"sec\":\r\n                            case \"secs\":\r\n                            case \"second\":\r\n                            case \"seconds\":\r\n                                return System.TimeSpan.FromSeconds(ConvertUtil.ToDouble(arr[0]));\r\n                            case \"m\":\r\n                            case \"min\":\r\n                            case \"mins\":\r\n                            case \"minute\":\r\n                            case \"minutes\":\r\n                                return System.TimeSpan.FromMinutes(ConvertUtil.ToDouble(arr[0]));\r\n                            case \"h\":\r\n                            case \"hour\":\r\n                            case \"hours\":\r\n                                return System.TimeSpan.FromHours(ConvertUtil.ToDouble(arr[0]));\r\n                            case \"d\":\r\n                            case \"day\":\r\n                            case \"days\":\r\n                                return System.TimeSpan.FromDays(ConvertUtil.ToDouble(arr[0]));\r\n                            default:\r\n                                return System.TimeSpan.Zero;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        System.TimeSpan result = default(System.TimeSpan);\r\n                        if (System.TimeSpan.TryParse(sval, out result))\r\n                        {\r\n                            return result;\r\n                        }\r\n                        else\r\n                        {\r\n                            return System.TimeSpan.Zero;\r\n                        }\r\n                    }\r\n\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns number of seconds into the day a timeofday is. Acts similar to 'TimeToJulian' from old Dockmaster.\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static int TimeOfDayToSeconds(object value)\r\n        {\r\n            if (value is System.TimeSpan)\r\n            {\r\n                return (int)((System.TimeSpan)value).TotalSeconds;\r\n            }\r\n            else if (value is System.DateTime)\r\n            {\r\n                return (int)((System.DateTime)value).TimeOfDay.TotalSeconds;\r\n\r\n            }\r\n            else\r\n            {\r\n                try\r\n                {\r\n                    return (int)System.DateTime.Parse(ConvertUtil.ToString(value)).TimeOfDay.TotalSeconds;\r\n                }\r\n                catch\r\n                {\r\n                    return 0;\r\n                }\r\n\r\n            }\r\n\r\n        }\r\n\r\n        public static double TimeOfDayToMinutes(object value)\r\n        {\r\n            if (value is System.TimeSpan)\r\n            {\r\n                return ((System.TimeSpan)value).TotalMinutes;\r\n            }\r\n            else if (value is System.DateTime)\r\n            {\r\n                return ((System.DateTime)value).TimeOfDay.TotalMinutes;\r\n\r\n            }\r\n            else\r\n            {\r\n                try\r\n                {\r\n                    return System.DateTime.Parse(ConvertUtil.ToString(value)).TimeOfDay.TotalMinutes;\r\n                }\r\n                catch\r\n                {\r\n                    return 0;\r\n                }\r\n\r\n            }\r\n\r\n        }\r\n\r\n        public static double TimeOfDayToHours(object value)\r\n        {\r\n            if (value is System.TimeSpan)\r\n            {\r\n                return ((System.TimeSpan)value).TotalHours;\r\n            }\r\n            else if (value is System.DateTime)\r\n            {\r\n                return ((System.DateTime)value).TimeOfDay.TotalHours;\r\n\r\n            }\r\n            else\r\n            {\r\n                try\r\n                {\r\n                    return System.DateTime.Parse(ConvertUtil.ToString(value)).TimeOfDay.TotalHours;\r\n                }\r\n                catch\r\n                {\r\n                    return 0;\r\n                }\r\n\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region \"Object Only odd prims, TODO\"\r\n\r\n        public static sbyte ToSByte(object value)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return 0;\r\n            }\r\n            else\r\n            {\r\n                return System.Convert.ToSByte(ToInt(value.ToString()) & 0x7f);\r\n            }\r\n        }\r\n\r\n        public static byte ToByte(object value)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return 0;\r\n            }\r\n            else\r\n            {\r\n                return System.Convert.ToByte(ToInt(value.ToString()) & 0xff);\r\n            }\r\n        }\r\n\r\n        public static short ToShort(object value)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return 0;\r\n            }\r\n            else\r\n            {\r\n                return System.Convert.ToInt16(ToInt(value.ToString()) & 0x7fff);\r\n            }\r\n        }\r\n\r\n        public static System.UInt16 ToUShort(object value)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return 0;\r\n            }\r\n            else\r\n            {\r\n                return System.Convert.ToUInt16(ToInt(value.ToString()) & 0xffff);\r\n            }\r\n        }\r\n\r\n        public static char ToChar(object value)\r\n        {\r\n            try\r\n            {\r\n                return System.Convert.ToChar(value);\r\n\r\n            }\r\n            catch (System.Exception)\r\n            {\r\n            }\r\n\r\n            return System.Char.Parse(\"\");\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region \"ToString\"\r\n\r\n        public static string ToString(sbyte value)\r\n        {\r\n            return System.Convert.ToString(value);\r\n        }\r\n\r\n        public static string ToString(byte value)\r\n        {\r\n            return System.Convert.ToString(value);\r\n        }\r\n\r\n        public static string ToString(short value)\r\n        {\r\n            return System.Convert.ToString(value);\r\n        }\r\n\r\n        public static string ToString(ushort value)\r\n        {\r\n            return System.Convert.ToString(value);\r\n        }\r\n\r\n        public static string ToString(int value)\r\n        {\r\n            return System.Convert.ToString(value);\r\n        }\r\n\r\n        public static string ToString(uint value)\r\n        {\r\n            return System.Convert.ToString(value);\r\n        }\r\n\r\n        public static string ToString(long value)\r\n        {\r\n            return System.Convert.ToString(value);\r\n        }\r\n\r\n        public static string ToString(ulong value)\r\n        {\r\n            return System.Convert.ToString(value);\r\n        }\r\n\r\n        public static string ToString(float value)\r\n        {\r\n            return System.Convert.ToString(value);\r\n        }\r\n\r\n        public static string ToString(double value)\r\n        {\r\n            return System.Convert.ToString(value);\r\n        }\r\n\r\n        public static string ToString(decimal value)\r\n        {\r\n            return System.Convert.ToString(value);\r\n        }\r\n\r\n        public static string ToString(bool value, string sFormat)\r\n        {\r\n            switch (sFormat)\r\n            {\r\n                case \"num\":\r\n                    return (value) ? \"1\" : \"0\";\r\n                case \"normal\":\r\n                case \"\":\r\n                case null:\r\n                    return System.Convert.ToString(value);\r\n                default:\r\n                    return System.Convert.ToString(value);\r\n            }\r\n        }\r\n\r\n        public static string ToString(bool value)\r\n        {\r\n            return System.Convert.ToString(value);\r\n        }\r\n\r\n        public static string ToString(char value)\r\n        {\r\n            return System.Convert.ToString(value);\r\n        }\r\n\r\n        public static string ToString(object value)\r\n        {\r\n            return System.Convert.ToString(value);\r\n        }\r\n\r\n        public static string ToString(string str)\r\n        {\r\n            return str;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts the object into a string, if it's a type that ConvertUtil works with, said string will be friendly to ConvertUtil.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public static string Stringify(object obj)\r\n        {\r\n            if (obj == null)\r\n                return null;\r\n\r\n            if (obj is string)\r\n                return obj as string;\r\n            else if (obj is System.Enum)\r\n                return EnumUtil.ToEnumsNumericType(obj as System.Enum).ToString();\r\n            else if (obj is bool)\r\n                return (bool)obj ? \"1\" : \"0\";\r\n            else if (obj is Vector2)\r\n                return VectorUtil.Stringify((Vector2)obj);\r\n            else if (obj is Vector3)\r\n                return VectorUtil.Stringify((Vector3)obj);\r\n            else if (obj is Vector4)\r\n                return VectorUtil.Stringify((Vector4)obj);\r\n            else if (obj is Quaternion)\r\n                return QuaternionUtil.Stringify((Quaternion)obj);\r\n            else if (obj is Color)\r\n                return ToInt((Color)obj).ToString();\r\n            else if (obj is Color32)\r\n                return ToInt((Color32)obj).ToString();\r\n            else\r\n                return System.Convert.ToString(obj);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ToVector2\r\n\r\n        public static Vector2 ToVector2(string sval)\r\n        {\r\n            if (System.String.IsNullOrEmpty(sval)) return Vector2.zero;\r\n\r\n            var arr = StringUtil.SplitFixedLength(sval, ',', 2);\r\n\r\n            return new Vector2(ConvertUtil.ToSingle(arr[0]), ConvertUtil.ToSingle(arr[1]));\r\n        }\r\n\r\n        public static Vector2 ToVector2(float value)\r\n        {\r\n            return new Vector2(value, value);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates Vector2 from X and Y values of a Vector3\r\n        /// </summary>\r\n        /// <param name=\"vec\"></param>\r\n        /// <returns></returns>\r\n        public static Vector2 ToVector2(Vector3 vec)\r\n        {\r\n            return new Vector2(vec.x, vec.y);\r\n        }\r\n\r\n        public static Vector2 ToVector2(Vector4 vec)\r\n        {\r\n            return new Vector2(vec.x, vec.y);\r\n        }\r\n\r\n        public static Vector2 ToVector2(Quaternion vec)\r\n        {\r\n            return new Vector2(vec.x, vec.y);\r\n        }\r\n\r\n        public static Vector2 ToVector2(object value)\r\n        {\r\n            if (value == null) return Vector2.zero;\r\n            if (value is Vector2) return (Vector2)value;\r\n            if (value is Vector3)\r\n            {\r\n                var v = (Vector3)value;\r\n                return new Vector2(v.x, v.y);\r\n            }\r\n            if (value is Vector4)\r\n            {\r\n                var v = (Vector4)value;\r\n                return new Vector2(v.x, v.y);\r\n            }\r\n            if (value is Quaternion)\r\n            {\r\n                var q = (Quaternion)value;\r\n                return new Vector2(q.x, q.y);\r\n            }\r\n            if (value is Color)\r\n            {\r\n                var c = (Color)value;\r\n                return new Vector2(c.r, c.g);\r\n            }\r\n            if (ValueIsNumericType(value))\r\n            {\r\n                return Vector2.one * ToSingle(value);\r\n            }\r\n            return ToVector2(System.Convert.ToString(value));\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ToVector3\r\n\r\n        public static Vector3 ToVector3(float value)\r\n        {\r\n            return new Vector3(value, value, value);\r\n        }\r\n\r\n        public static Vector3 ToVector3(Vector2 vec)\r\n        {\r\n            return new Vector3(vec.x, vec.y, 0);\r\n        }\r\n\r\n        public static Vector3 ToVector3(Vector4 vec)\r\n        {\r\n            return new Vector3(vec.x, vec.y, vec.z);\r\n        }\r\n\r\n        public static Vector3 ToVector3(Quaternion vec)\r\n        {\r\n            return new Vector3(vec.x, vec.y, vec.z);\r\n        }\r\n\r\n        public static Vector3 ToVector3(string sval)\r\n        {\r\n            if (System.String.IsNullOrEmpty(sval)) return Vector3.zero;\r\n\r\n            var arr = StringUtil.SplitFixedLength(sval, ',', 3);\r\n\r\n            return new Vector3(ConvertUtil.ToSingle(arr[0]), ConvertUtil.ToSingle(arr[1]), ConvertUtil.ToSingle(arr[2]));\r\n        }\r\n\r\n        public static Vector3 ToVector3(object value)\r\n        {\r\n            if (value == null) return Vector3.zero;\r\n            if (value is Vector2)\r\n            {\r\n                var v = (Vector2)value;\r\n                return new Vector3(v.x, v.y, 0f);\r\n            }\r\n            if (value is Vector3)\r\n            {\r\n                return (Vector3)value;\r\n            }\r\n            if (value is Vector4)\r\n            {\r\n                var v = (Vector4)value;\r\n                return new Vector3(v.x, v.y, v.z);\r\n            }\r\n            if (value is Quaternion)\r\n            {\r\n                var q = (Quaternion)value;\r\n                return new Vector3(q.x, q.y, q.z);\r\n            }\r\n            if (value is Color)\r\n            {\r\n                var c = (Color)value;\r\n                return new Vector3(c.r, c.g, c.b);\r\n            }\r\n            if (ValueIsNumericType(value))\r\n            {\r\n                return Vector3.one * ToSingle(value);\r\n            }\r\n            return ToVector3(System.Convert.ToString(value));\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ToVector4\r\n\r\n        public static Vector4 ToVector4(float value)\r\n        {\r\n            return new Vector4(value, value, value, value);\r\n        }\r\n\r\n        public static Vector4 ToVector4(Vector2 vec)\r\n        {\r\n            return new Vector4(vec.x, vec.y, 0f, 0f);\r\n        }\r\n\r\n        public static Vector4 ToVector4(Vector3 vec)\r\n        {\r\n            return new Vector4(vec.x, vec.y, vec.z, 0f);\r\n        }\r\n\r\n        public static Vector4 ToVector4(Quaternion vec)\r\n        {\r\n            return new Vector4(vec.x, vec.y, vec.z, vec.w);\r\n        }\r\n\r\n        public static Vector4 ToVector4(string sval)\r\n        {\r\n            if (System.String.IsNullOrEmpty(sval)) return Vector3.zero;\r\n\r\n            var arr = StringUtil.SplitFixedLength(sval, ',', 4);\r\n\r\n            return new Vector4(ConvertUtil.ToSingle(arr[0]), ConvertUtil.ToSingle(arr[1]), ConvertUtil.ToSingle(arr[2]), ConvertUtil.ToSingle(arr[3]));\r\n        }\r\n\r\n        public static Vector4 ToVector4(object value)\r\n        {\r\n            if (value == null) return Vector4.zero;\r\n            if (value is Vector2)\r\n            {\r\n                var v = (Vector2)value;\r\n                return new Vector4(v.x, v.y, 0f, 0f);\r\n            }\r\n            if (value is Vector3)\r\n            {\r\n                var v = (Vector3)value;\r\n                return new Vector4(v.x, v.y, v.z, 0f);\r\n            }\r\n            if (value is Vector4)\r\n            {\r\n                return (Vector4)value;\r\n            }\r\n            if (value is Quaternion)\r\n            {\r\n                var q = (Quaternion)value;\r\n                return new Vector4(q.x, q.y, q.z, q.w);\r\n            }\r\n            if (value is Color)\r\n            {\r\n                var c = (Color)value;\r\n                return new Vector4(c.r, c.g, c.b, c.a);\r\n            }\r\n            if (value is Rect)\r\n            {\r\n                var r = (Rect)value;\r\n                return new Vector4(r.x, r.y, r.width, r.height);\r\n            }\r\n            if (ValueIsNumericType(value))\r\n            {\r\n                return new Vector4(ToSingle(value), 0f);\r\n            }\r\n            return Vector4.one * ToSingle(value);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ToQuaternion\r\n\r\n        public static Quaternion ToQuaternion(Vector2 vec)\r\n        {\r\n            return new Quaternion(vec.x, vec.y, 0f, 0f);\r\n        }\r\n\r\n        public static Quaternion ToQuaternion(Vector3 vec)\r\n        {\r\n            return new Quaternion(vec.x, vec.y, vec.z, 0f);\r\n        }\r\n\r\n        public static Quaternion ToQuaternion(Vector4 vec)\r\n        {\r\n            return new Quaternion(vec.x, vec.y, vec.z, vec.w);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Parses a Quaterion\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <param name=\"a\"></param>\r\n        /// <param name=\"axis\"></param>\r\n        /// <param name=\"bUseRadians\"></param>\r\n        /// <returns></returns>\r\n        public static Quaternion ToQuaternion(string sval)\r\n        {\r\n            if (string.IsNullOrEmpty(sval)) return Quaternion.identity;\r\n\r\n            var arr = StringUtil.SplitFixedLength(sval.Replace(\" \", \"\"), ',', 4);\r\n            return new Quaternion(ConvertUtil.ToSingle(arr[0]), ConvertUtil.ToSingle(arr[1]), ConvertUtil.ToSingle(arr[2]), ConvertUtil.ToSingle(arr[3]));\r\n        }\r\n\r\n        public static Quaternion ToQuaternion(object value)\r\n        {\r\n            if (value == null) return Quaternion.identity;\r\n            if (value is Vector2)\r\n            {\r\n                var v = (Vector2)value;\r\n                return new Quaternion(v.x, v.y, 0f, 0f);\r\n            }\r\n            if (value is Vector3)\r\n            {\r\n                var v = (Vector3)value;\r\n                return new Quaternion(v.x, v.y, v.z, 0f);\r\n            }\r\n            if (value is Vector4)\r\n            {\r\n                var v = (Vector4)value;\r\n                return new Quaternion(v.x, v.y, v.z, v.w);\r\n            }\r\n            if (value is Quaternion)\r\n            {\r\n                return (Quaternion)value;\r\n            }\r\n            if (ValueIsNumericType(value))\r\n            {\r\n                return new Quaternion(ToSingle(value), 0f, 0f, 0f);\r\n            }\r\n            return ToQuaternion(System.Convert.ToString(value));\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ToNumeric\r\n\r\n        public static INumeric ToNumeric(System.Type tp, float value)\r\n        {\r\n            return Numerics.CreateNumeric(tp, (double)value);\r\n        }\r\n\r\n        public static INumeric ToNumeric(System.Type tp, double value)\r\n        {\r\n            return Numerics.CreateNumeric(tp, value);\r\n        }\r\n\r\n        public static INumeric ToNumeric(System.Type tp, int value)\r\n        {\r\n            return Numerics.CreateNumeric(tp, (long)value);\r\n        }\r\n\r\n        public static INumeric ToNumeric(System.Type tp, long value)\r\n        {\r\n            return Numerics.CreateNumeric(tp, value);\r\n        }\r\n\r\n        public static INumeric ToNumeric(System.Type tp, object value)\r\n        {\r\n            var result = Numerics.CreateNumeric(tp, 0);\r\n            if (value == null) return result;\r\n\r\n            if(value is System.IConvertible)\r\n            {\r\n                var tc = (value as System.IConvertible).GetTypeCode();\r\n                if (tc == System.TypeCode.Object && value is INumeric) tc = (value as INumeric).GetUnderlyingTypeCode();\r\n\r\n                switch (tc)\r\n                {\r\n                    case System.TypeCode.Boolean:\r\n                    case System.TypeCode.Char:\r\n                    case System.TypeCode.Byte:\r\n                    case System.TypeCode.Int16:\r\n                    case System.TypeCode.UInt16:\r\n                    case System.TypeCode.Int32:\r\n                    case System.TypeCode.UInt32:\r\n                    case System.TypeCode.Int64:\r\n                    case System.TypeCode.UInt64:\r\n                        result.FromLong((value as System.IConvertible).ToInt64(null));\r\n                        break;\r\n                    case System.TypeCode.Single:\r\n                    case System.TypeCode.Double:\r\n                        result.FromDouble((value as System.IConvertible).ToDouble(null));\r\n                        break;\r\n                    default:\r\n                        result.FromDouble(ConvertUtil.ToDouble(value));\r\n                        break;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                result.FromDouble(ConvertUtil.ToDouble(value));\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region \"Is Supported\"\r\n\r\n        /// <summary>\r\n        /// If type passed is a support TypeCode\r\n        /// </summary>\r\n        /// <param name=\"tp\">Type</param>\r\n        /// <returns>Returns true is type given is a supported type</returns>\r\n        /// <remarks></remarks>\r\n        public static bool IsSupportedType(System.Type tp)\r\n        {\r\n            System.TypeCode code = System.Type.GetTypeCode(tp);\r\n            return IsSupportedType(tp, code);\r\n        }\r\n\r\n        private static bool IsSupportedType(System.Type tp, System.TypeCode code)\r\n        {\r\n            if (tp != null && tp.IsEnum) return true;\r\n\r\n            if (code == System.TypeCode.Object)\r\n            {\r\n                if (tp == typeof(object)) return true;\r\n                else if (tp == typeof(System.TimeSpan)) return true;\r\n                else if (tp == typeof(Vector2)) return true;\r\n                else if (tp == typeof(Vector3)) return true;\r\n                else if (tp == typeof(Vector4)) return true;\r\n                else if (tp == typeof(Quaternion)) return true;\r\n                else if (tp == typeof(Color)) return true;\r\n                else if (typeof(INumeric).IsAssignableFrom(tp) && !tp.IsAbstract) return true;\r\n                else return false;\r\n            }\r\n            else\r\n            {\r\n                return !(code < 0 || (int)code > 18 || (int)code == 17);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns true if the object could be converted to a number by ConvertUtil\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static bool IsNumeric(object value, System.Globalization.NumberStyles style = System.Globalization.NumberStyles.Any, System.IFormatProvider provider = null, bool bBlankIsZero = false)\r\n        {\r\n            if (value == null) return bBlankIsZero;\r\n            if (ValueIsNumericType(value)) return true;\r\n\r\n            string sval = System.Convert.ToString(value);\r\n            if (string.IsNullOrEmpty(sval))\r\n                return bBlankIsZero;\r\n\r\n            sval = sval.Trim();\r\n\r\n            if(IsHex(sval))\r\n            {\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                style = style & System.Globalization.NumberStyles.Any;\r\n                double dbl = 0;\r\n                return double.TryParse(sval, style, provider, out dbl);\r\n            }\r\n\r\n\r\n            ////################\r\n            ////OLD garbage heavy version\r\n\r\n            //#if UNITY_WEBPLAYER\r\n            //\t\t\tMatch m = Regex.Match(sval, RX_ISHEX, RegexOptions.IgnoreCase);\r\n            //#else\r\n            //            Match m = Regex.Match(sval, RX_ISHEX, RegexOptions.IgnoreCase | RegexOptions.Compiled);\r\n            //#endif\r\n\r\n            //            if (m.Success)\r\n            //            {\r\n            //                return true;\r\n            //            }\r\n            //            else\r\n            //            {\r\n            //                style = style & System.Globalization.NumberStyles.Any;\r\n            //                double dbl = 0;\r\n            //                return double.TryParse(sval, style, provider, out dbl);\r\n            //            }\r\n\r\n\r\n        }\r\n\r\n        public static bool IsHex(string value)\r\n        {\r\n            int i;\r\n            for (i = 0; i < value.Length; i++)\r\n            {\r\n                if (value[i] == ' ' || value[i] == '+' || value[i] == '-') continue;\r\n\r\n                break;\r\n            }\r\n\r\n            return (i < value.Length - 1 &&\r\n                    (\r\n                    (value[i] == '#') ||\r\n                    (value[i] == '0' && (value[i + 1] == 'x' || value[i + 1] == 'X')) ||\r\n                    (value[i] == '&' && (value[i + 1] == 'h' || value[i + 1] == 'H'))\r\n                    ));\r\n        }\r\n        \r\n        /// <summary>\r\n        /// Returns true if the value is a numeric type that is a whole round number.\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <param name=\"bBlankIsZero\"></param>\r\n        /// <returns></returns>\r\n        public static bool IsInteger(object value)\r\n        {\r\n            if (value == null) return false;\r\n\r\n            if(value is System.IConvertible)\r\n            {\r\n                var conv = value as System.IConvertible;\r\n                if (IsInteger(conv.GetTypeCode())) return true;\r\n                return (conv.ToDouble(null) % 1d) == 0d;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool IsInteger(System.TypeCode code)\r\n        {\r\n            switch (code)\r\n            {\r\n                case System.TypeCode.SByte:\r\n                    //5\r\n                    return true;\r\n                case System.TypeCode.Byte:\r\n                    //6\r\n                    return true;\r\n                case System.TypeCode.Int16:\r\n                    //7\r\n                    return true;\r\n                case System.TypeCode.UInt16:\r\n                    //8\r\n                    return true;\r\n                case System.TypeCode.Int32:\r\n                    //9\r\n                    return true;\r\n                case System.TypeCode.UInt32:\r\n                    //10\r\n                    return true;\r\n                case System.TypeCode.Int64:\r\n                    //11\r\n                    return true;\r\n                case System.TypeCode.UInt64:\r\n                    //12\r\n                    return true;\r\n                default:\r\n                    return false;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tests if the typeof the value passed in is a numeric type. Handles IWrapper types as well.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static bool ValueIsNumericType(object obj)\r\n        {\r\n            if (obj == null) return false;\r\n            if (obj is INumeric) return true;\r\n\r\n            var tp = obj.GetType();\r\n            return tp.IsEnum || IsNumericType(System.Type.GetTypeCode(tp));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tests if the type is a numeric type.\r\n        /// </summary>\r\n        /// <param name=\"tp\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static bool IsNumericType(System.Type tp)\r\n        {\r\n            if (tp == null) return false;\r\n            return typeof(INumeric).IsAssignableFrom(tp) || tp.IsEnum || IsNumericType(System.Type.GetTypeCode(tp));\r\n        }\r\n\r\n        public static bool IsNumericType(System.TypeCode code)\r\n        {\r\n            switch (code)\r\n            {\r\n                case System.TypeCode.SByte:\r\n                    //5\r\n                    return true;\r\n                case System.TypeCode.Byte:\r\n                    //6\r\n                    return true;\r\n                case System.TypeCode.Int16:\r\n                    //7\r\n                    return true;\r\n                case System.TypeCode.UInt16:\r\n                    //8\r\n                    return true;\r\n                case System.TypeCode.Int32:\r\n                    //9\r\n                    return true;\r\n                case System.TypeCode.UInt32:\r\n                    //10\r\n                    return true;\r\n                case System.TypeCode.Int64:\r\n                    //11\r\n                    return true;\r\n                case System.TypeCode.UInt64:\r\n                    //12\r\n                    return true;\r\n                case System.TypeCode.Single:\r\n                    //13\r\n                    return true;\r\n                case System.TypeCode.Double:\r\n                    //14\r\n                    return true;\r\n                case System.TypeCode.Decimal:\r\n                    //15\r\n\r\n                    return true;\r\n                default:\r\n                    return false;\r\n            }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region \"wildcard\"\r\n\r\n        //'ToString\r\n        public const string LOD_STR = \"str\";\r\n        //'ToString\r\n        public const string LOD_STRING = \"string\";\r\n        //'To Nullable Decimal\r\n        public const string LOD_NULLABLE_NUM = \"num?\";\r\n        //'ToSingle\r\n        public const string LOD_FLOAT = \"float\";\r\n        //'ToSingle\r\n        public const string LOD_SINGLE = \"single\";\r\n        //TODOuble\r\n        public const string LOD_DBL = \"dbl\";\r\n        //TODOuble\r\n        public const string LOD_DOUBLE = \"double\";\r\n        //'ToDecimal\r\n        public const string LOD_NUM = \"num\";\r\n        //'ToDecimal\r\n        public const string LOD_DEC = \"dec\";\r\n        //'ToDecimal\r\n        public const string LOD_CASH = \"cash\";\r\n        //'ToInt\r\n        public const string LOD_INT = \"int\";\r\n        //'ToBool\r\n        public const string LOD_BOOL = \"bool\";\r\n        //'get ascii code for a char\r\n        public const string LOD_ASCII = \"ascii\";\r\n        //'get char from an ascii code\r\n        public const string LOD_CHAR = \"char\";\r\n        //'ToDate\r\n        public const string LOD_DATE = \"date\";\r\n        //'ToTime\r\n        public const string LOD_TIME = \"time\";\r\n\r\n        public const string LOD_TIMEOFDAYTOSECONDS = \"timeofdaytoseconds\";\r\n\r\n        public const string LOD_PSHIFT_0 = \"p0\";\r\n        public const string LOD_PSHIFT_L1 = \"p1\";\r\n        public const string LOD_PSHIFT_L2 = \"p2\";\r\n        public const string LOD_PSHIFT_L3 = \"p3\";\r\n        public const string LOD_PSHIFT_L4 = \"p4\";\r\n        public const string LOD_PSHIFT_L5 = \"p5\";\r\n        public const string LOD_PSHIFT_L6 = \"p6\";\r\n        public const string LOD_PSHIFT_R1 = \"p-1\";\r\n        public const string LOD_PSHIFT_R2 = \"p-2\";\r\n        public const string LOD_PSHIFT_R3 = \"p-3\";\r\n        public const string LOD_PSHIFT_R4 = \"p-4\";\r\n        public const string LOD_PSHIFT_R5 = \"p-5\";\r\n\r\n        public const string LOD_PSHIFT_R6 = \"p-6\";\r\n        public const string LOD_STRARR_COMMA = \"str[,]\";\r\n        public const string LOD_STRARR_SEMICOLON = \"str[;]\";\r\n\r\n        public const string LOD_STRARR_PIPE = \"str[|]\";\r\n        public static bool IsLoDConvertType(string sType)\r\n        {\r\n            //sType = (sType + \"\").Trim();\r\n            if (string.IsNullOrEmpty(sType)) return false;\r\n\r\n            const string sREGX = \"^((p-?\\\\d+)|(str)|(string)|(num\\\\?)|(float)|(single)|(dbl)|(double)|(num)|(dec)|(cash)|(int)|(bool)|(ascii)|(char)|(date)|(time)|(timeofday))(\\\\[.\\\\])?$\";\r\n\r\n            return Regex.IsMatch(sType, sREGX, RegexOptions.IgnoreCase);\r\n\r\n        }\r\n\r\n        public static bool IsLoDNumericConvertType(string sType)\r\n        {\r\n            //sType = (sType + \"\").Trim();\r\n            if (string.IsNullOrEmpty(sType)) return false;\r\n\r\n            const string sREGX = \"^((p-?\\\\d+)|(num\\\\?)|(float)|(single)|(dbl)|(double)|(num)|(dec)|(cash)|(int))$\";\r\n\r\n            return Regex.IsMatch(sType, sREGX, RegexOptions.IgnoreCase);\r\n\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns true if the format string is preceeded by an lod conversion.\r\n        /// </summary>\r\n        /// <param name=\"sFormatString\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static bool IsValidLoDLedFormatString(string sFormatString)\r\n        {\r\n            const string sREGX = \"^((p-?\\\\d+)|(str)|(string)|(num\\\\?)|(float)|(single)|(dbl)|(double)|(num)|(dec)|(cash)|(int)|(bool)|(ascii)|(char)|(date)|(time)|(timeofday))(\\\\[.\\\\])?:\";\r\n\r\n            if (sFormatString == null)\r\n                return false;\r\n\r\n            return Regex.IsMatch(sFormatString, sREGX, RegexOptions.IgnoreCase);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns true if the format string is preceeded by an lod conversion.\r\n        /// </summary>\r\n        /// <param name=\"sFormatString\">The format string to test.</param>\r\n        /// <param name=\"outLoDConvertType\">A return argument for the lod convert type.</param>\r\n        /// <param name=\"outRemainingFormatString\">A return argument for the formatstring with the lod convert spliced off.</param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static bool IsValidLoDLedFormatString(string sFormatString, out string outLoDConvertType)\r\n        {\r\n            string blargh = null;\r\n            return IsValidLoDLedFormatString(sFormatString, out outLoDConvertType, out blargh);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns true if the format string is preceeded by an lod conversion.\r\n        /// </summary>\r\n        /// <param name=\"sFormatString\">The format string to test.</param>\r\n        /// <param name=\"outLoDConvertType\">A return argument for the lod convert type.</param>\r\n        /// <param name=\"outRemainingFormatString\">A return argument for the formatstring with the lod convert spliced off.</param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static bool IsValidLoDLedFormatString(string sFormatString, out string outLoDConvertType, out string outRemainingFormatString)\r\n        {\r\n            const string sREGX = \"^((p-?\\\\d+)|(str)|(string)|(num\\\\?)|(float)|(single)|(dbl)|(double)|(num)|(dec)|(cash)|(int)|(bool)|(ascii)|(char)|(date)|(timeofdaytoseconds)|(time)|(timeofday))(\\\\[.\\\\])?:\";\r\n\r\n            outLoDConvertType = null;\r\n            outRemainingFormatString = null;\r\n\r\n            if (sFormatString == null)\r\n                return false;\r\n\r\n            Match match = Regex.Match(sFormatString, sREGX, RegexOptions.IgnoreCase);\r\n            if (match.Success)\r\n            {\r\n                outLoDConvertType = match.Value.Substring(0, match.Value.Length - 1);\r\n                outRemainingFormatString = sFormatString.Substring(match.Length, sFormatString.Length - match.Length);\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets the Type associated with an LoD convert type. \r\n        /// </summary>\r\n        /// <param name=\"sType\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static System.Type GetLoDConvertType(string sType)\r\n        {\r\n\r\n            const string sREGX = \"^(?<type>(p-?\\\\d+)|(str)|(string)|(num\\\\?)|(float)|(single)|(dbl)|(double)|(num)|(dec)|(cash)|(int)|(bool)|(ascii)|(char)|(date)|(time)|(timeofday))(?<array>(\\\\[.\\\\]))?$\";\r\n\r\n            //sType = (sType + \"\").Trim();\r\n            if (string.IsNullOrEmpty(sType)) return null;\r\n\r\n            var match = Regex.Match(sType, sREGX, RegexOptions.IgnoreCase);\r\n            if (!match.Success)\r\n                return null;\r\n\r\n            sType = match.Groups[\"type\"].Value.ToLower();\r\n            bool bIsArray = match.Groups[\"array\"].Success;\r\n\r\n            if (Regex.IsMatch(sType, \"^p-?\\\\d+$\"))\r\n            {\r\n                return bIsArray ? typeof(decimal[]) : typeof(decimal);\r\n            }\r\n\r\n            switch (sType)\r\n            {\r\n                case LOD_STR:\r\n                case LOD_STRING:\r\n                    return bIsArray ? typeof(string[]) : typeof(string);\r\n                case LOD_FLOAT:\r\n                case LOD_SINGLE:\r\n                    return bIsArray ? typeof(float[]) : typeof(float);\r\n                case LOD_DBL:\r\n                case LOD_DOUBLE:\r\n                    return bIsArray ? typeof(double[]) : typeof(double);\r\n                case LOD_NUM:\r\n                case LOD_DEC:\r\n                case LOD_CASH:\r\n                    return bIsArray ? typeof(decimal[]) : typeof(decimal);\r\n                case LOD_INT:\r\n                    return bIsArray ? typeof(int[]) : typeof(int);\r\n                case LOD_NULLABLE_NUM:\r\n                    return bIsArray ? typeof(decimal[]) : typeof(decimal);\r\n                case LOD_BOOL:\r\n                    return bIsArray ? typeof(bool[]) : typeof(bool);\r\n                case LOD_ASCII:\r\n                    return bIsArray ? typeof(byte[]) : typeof(byte);\r\n                case LOD_CHAR:\r\n                    return bIsArray ? typeof(char[]) : typeof(char);\r\n                case LOD_DATE:\r\n                    return bIsArray ? typeof(System.DateTime[]) : typeof(System.DateTime);\r\n                case LOD_TIME:\r\n                    return bIsArray ? typeof(System.TimeSpan[]) : typeof(System.TimeSpan);\r\n                case LOD_TIMEOFDAYTOSECONDS:\r\n                    return bIsArray ? typeof(int[]) : typeof(int);\r\n                default:\r\n\r\n                    return null;\r\n            }\r\n\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts an object to a type described as a string from a list of approved string names.\r\n        /// </summary>\r\n        /// <param name=\"value\">Object to be converted</param>\r\n        /// <param name=\"sType\">String type you want sval converted to</param>\r\n        /// <returns></returns>\r\n        /// <remarks>\r\n        /// Approved types:<br/>\r\n        /// String - str, string<br/>\r\n        /// Single - float, single<br/>\r\n        /// Double - dbl, double<br/>\r\n        /// Decimal - num, dec, cash<br/>\r\n        /// Nullable Decimal - num?<br/>\r\n        /// Integer - int<br/>\r\n        /// Boolean - bool<br/>\r\n        /// Asc() - ascii<br/>\r\n        /// Char - char<br/>\r\n        /// DateTime - date, pickdate, pickdatetodate<br/>\r\n        ///     *date is treated as a string formatted as a date, ex: 8/17/2011. Region will be decided by runtime machines region settings.<br/>\r\n        ///     *pickdate is treated as an integer count of days from Dec 31st 1967<br/>\r\n        /// TimeSpan - time, timeofday, timeofdaytoseconds<br/>\r\n        ///     *time value is treated as number of seconds from midnight<br/>\r\n        ///     *timeofday value is treated as number of seconds and returns as a string formatted as hh:mm tt\r\n        ///     *timeofdaytoseconds value is first converted to time, and then extracts the seconds into that day as an int\r\n        /// </remarks>\r\n        public static object LoDConvertTo(object value, string sType)\r\n        {\r\n            const string sREGX = \"^(?<type>(p-?\\\\d+)|(str)|(string)|(num\\\\?)|(float)|(single)|(dbl)|(double)|(num)|(dec)|(cash)|(int)|(bool)|(ascii)|(char)|(date)|(timeofdaytoseconds)|(time)|(timeofday))(?<array>(\\\\[.\\\\]))?$\";\r\n\r\n            //if (value == null)\r\n            //    value = \"\";\r\n            //if (string.IsNullOrEmpty(sType))\r\n            //    sType = \"str\";\r\n            //else\r\n            //    sType = sType.Trim();\r\n            if (string.IsNullOrEmpty(sType)) return null;\r\n            \r\n            var match = Regex.Match(sType, sREGX, RegexOptions.IgnoreCase);\r\n            if (!match.Success)\r\n                return null;\r\n\r\n            sType = match.Groups[\"type\"].Value.ToLower();\r\n\r\n            if (match.Groups[\"array\"].Success)\r\n            {\r\n                char cDelim = match.Groups[\"array\"].Value[1];\r\n                var sval = System.Convert.ToString(value);\r\n                var arr = string.IsNullOrEmpty(sval) ? new string[] { } : sval.Split(cDelim);\r\n                if (arr == null)\r\n                    return null;\r\n\r\n                if (Regex.IsMatch(sType, \"^p-?\\\\d+$\"))\r\n                {\r\n                    decimal[] result = new decimal[arr.Length];\r\n                    int move = 0;\r\n                    System.Int32.TryParse(sType.Substring(1), out move);\r\n\r\n                    for (int i = 0; i <= arr.Length - 1; i++)\r\n                    {\r\n                        decimal argNum = ConvertUtil.ToDecimal(arr[i]);\r\n                        result[i] = argNum / (decimal)Mathf.Pow(10, move);\r\n                    }\r\n\r\n                    return result;\r\n                }\r\n\r\n                switch (sType)\r\n                {\r\n                    case LOD_STR:\r\n                    case LOD_STRING:\r\n                        string[] strResult = new string[arr.Length];\r\n                        for (int i = 0; i <= arr.Length - 1; i++)\r\n                        {\r\n                            strResult[i] = System.Convert.ToString(arr[i]);\r\n                        }\r\n\r\n\r\n                        return strResult;\r\n                    case LOD_FLOAT:\r\n                    case LOD_SINGLE:\r\n                        float[] singleResult = new float[arr.Length];\r\n                        for (int i = 0; i <= arr.Length - 1; i++)\r\n                        {\r\n                            singleResult[i] = ConvertUtil.ToSingle(arr[i]);\r\n                        }\r\n\r\n                        return singleResult;\r\n                    case LOD_DBL:\r\n                    case LOD_DOUBLE:\r\n                        double[] dblResult = new double[arr.Length];\r\n                        for (int i = 0; i <= arr.Length - 1; i++)\r\n                        {\r\n                            dblResult[i] = ConvertUtil.ToDouble(arr[i]);\r\n                        }\r\n\r\n                        return dblResult;\r\n                    case LOD_NUM:\r\n                    case LOD_DEC:\r\n                    case LOD_CASH:\r\n                        decimal[] decResult = new decimal[arr.Length];\r\n                        for (int i = 0; i <= arr.Length - 1; i++)\r\n                        {\r\n                            decResult[i] = ConvertUtil.ToDecimal(arr[i]);\r\n                        }\r\n\r\n                        return decResult;\r\n                    case LOD_INT:\r\n                        int[] intResult = new int[arr.Length];\r\n                        for (int i = 0; i <= arr.Length - 1; i++)\r\n                        {\r\n                            intResult[i] = ConvertUtil.ToInt(arr[i]);\r\n                        }\r\n\r\n                        return intResult;\r\n                    case LOD_NULLABLE_NUM:\r\n                        decimal?[] nullNumResult = new decimal?[arr.Length];\r\n                        for (int i = 0; i <= arr.Length - 1; i++)\r\n                        {\r\n                            if (StringUtil.IsNullOrWhitespace(arr[i]))\r\n                            {\r\n                                nullNumResult[i] = null;\r\n                            }\r\n                            else\r\n                            {\r\n                                nullNumResult[i] = ConvertUtil.ToDecimal(arr[i]);\r\n                            }\r\n                        }\r\n\r\n                        return nullNumResult;\r\n                    case LOD_BOOL:\r\n                        bool[] boolResult = new bool[arr.Length];\r\n                        for (int i = 0; i <= arr.Length - 1; i++)\r\n                        {\r\n                            boolResult[i] = ConvertUtil.ToBool(arr[i]);\r\n                        }\r\n\r\n                        return boolResult;\r\n                    case LOD_ASCII:\r\n                        int[] ascResult = new int[arr.Length];\r\n                        for (int i = 0; i <= arr.Length - 1; i++)\r\n                        {\r\n                            if (string.IsNullOrEmpty(arr[i]))\r\n                            {\r\n                                ascResult[i] = 0;\r\n                            }\r\n                            else\r\n                            {\r\n                                ascResult[i] = (int)arr[i][0];\r\n                            }\r\n                        }\r\n\r\n                        return ascResult;\r\n                    case LOD_CHAR:\r\n                        char[] charResult = new char[arr.Length];\r\n                        for (int i = 0; i <= arr.Length - 1; i++)\r\n                        {\r\n                            if (string.IsNullOrEmpty(arr[i]))\r\n                            {\r\n                                charResult[i] = ' ';\r\n                            }\r\n                            else\r\n                            {\r\n                                charResult[i] = System.Convert.ToChar(arr[i][0]);\r\n                            }\r\n                        }\r\n\r\n                        return charResult;\r\n                    case LOD_DATE:\r\n                        System.DateTime[] dateResult = new System.DateTime[arr.Length];\r\n                        for (int i = 0; i <= arr.Length - 1; i++)\r\n                        {\r\n                            dateResult[i] = ConvertUtil.ToDate(arr[i]);\r\n                        }\r\n\r\n                        return dateResult;\r\n                    case LOD_TIME:\r\n                        System.TimeSpan[] timeResult = new System.TimeSpan[arr.Length];\r\n                        for (int i = 0; i <= arr.Length - 1; i++)\r\n                        {\r\n                            timeResult[i] = ConvertUtil.ToTime(arr[i]);\r\n                        }\r\n\r\n\r\n                        return timeResult;\r\n                    case LOD_TIMEOFDAYTOSECONDS:\r\n                        int[] secondsResult = new int[arr.Length];\r\n                        for (int i = 0; i <= arr.Length - 1; i++)\r\n                        {\r\n                            secondsResult[i] = ConvertUtil.TimeOfDayToSeconds(arr[i]);\r\n                        }\r\n\r\n                        return secondsResult;\r\n                }\r\n\r\n            }\r\n            else\r\n            {\r\n                if (Regex.IsMatch(sType, \"^p-?\\\\d+$\"))\r\n                {\r\n                    if (value == null)\r\n                        return 0m;\r\n                    if (value is string && StringUtil.IsNullOrWhitespace(value as string))\r\n                        return 0m;\r\n\r\n                    decimal argNum = ConvertUtil.ToDecimal(value);\r\n                    int move = 0;\r\n                    int.TryParse(sType.Substring(1), out move);\r\n                    return argNum / (decimal)Mathf.Pow(10, move);\r\n                }\r\n\r\n                switch (sType)\r\n                {\r\n                    case LOD_STR:\r\n                    case LOD_STRING:\r\n\r\n                        return System.Convert.ToString(value);\r\n                    case LOD_FLOAT:\r\n                    case LOD_SINGLE:\r\n\r\n                        return ConvertUtil.ToSingle(value);\r\n                    case LOD_DBL:\r\n                    case LOD_DOUBLE:\r\n\r\n                        return ConvertUtil.ToDouble(value);\r\n                    case LOD_NUM:\r\n                    case LOD_DEC:\r\n                    case LOD_CASH:\r\n\r\n                        return ConvertUtil.ToDecimal(value);\r\n                    case LOD_INT:\r\n\r\n                        return ConvertUtil.ToInt(value);\r\n                    case LOD_NULLABLE_NUM:\r\n                        if (value == null || StringUtil.IsNullOrWhitespace(value.ToString()))\r\n                        {\r\n                            return null;\r\n                        }\r\n                        else\r\n                        {\r\n                            return ConvertUtil.ToDecimal(value);\r\n                        }\r\n\r\n                    case LOD_BOOL:\r\n\r\n                        return ConvertUtil.ToBool(value);\r\n                    case LOD_ASCII:\r\n                        if (value == null || string.IsNullOrEmpty(value.ToString()))\r\n                        {\r\n                            return 0;\r\n                        }\r\n                        else\r\n                        {\r\n                            //return Strings.Asc(value);\r\n                            if (value is char)\r\n                            {\r\n                                return (int)((char)value);\r\n                            }\r\n                            else\r\n                            {\r\n                                return (int)(value.ToString())[0];\r\n                            }\r\n                        }\r\n\r\n                    case LOD_CHAR:\r\n                        if (value == null || string.IsNullOrEmpty(value.ToString()))\r\n                        {\r\n                            return \"\";\r\n                        }\r\n                        else\r\n                        {\r\n                            return System.Convert.ToChar(value.ToString()[0]);\r\n                        }\r\n\r\n                    case LOD_DATE:\r\n                        return ConvertUtil.ToDate(value);\r\n\r\n                    case LOD_TIME:\r\n                        return ConvertUtil.ToTime(value);\r\n\r\n                    case LOD_TIMEOFDAYTOSECONDS:\r\n                        return ConvertUtil.TimeOfDayToSeconds(value);\r\n                }\r\n            }\r\n\r\n            //should never reach here\r\n            return null;\r\n\r\n        }\r\n\r\n        /// <summary>\r\n        /// Format an abstract value as a string to a specific manner. Value is first converted to supplied type before formatting. \r\n        /// Available types include:\r\n        /// str - string\r\n        /// float - a double floating-point value\r\n        /// dec - a decimal\r\n        /// int - an integer\r\n        /// num - a numeric value (includes hex)\r\n        /// bool - a boolean\r\n        /// ascii - converts the string to its ascii code\r\n        /// char - converts an integer value to its char\r\n        /// \r\n        /// default is string\r\n        /// </summary>\r\n        /// <param name=\"value\">Object Value to be converted</param>\r\n        /// <param name=\"sType\">Type that value is to be converted to</param>\r\n        /// <param name=\"sFormatStr\">Formatting characters</param>\r\n        /// <returns>Value converted to specified type and formated based on formatting string</returns>\r\n        /// <remarks>\r\n        /// TODO!: change around dict.config.xml so that we no longer have {0:...} in it, and rewrite this to enable a better method of formatting by the dict config\r\n        /// </remarks>\r\n        public static string LoDConvertTo(object value, string sType, string sFormatStr)\r\n        {\r\n            if (value == null)\r\n                return \"\";\r\n            if (string.IsNullOrEmpty(sType))\r\n                sType = \"str\";\r\n            if (string.IsNullOrEmpty(sFormatStr))\r\n                sFormatStr = \"{0}\";\r\n            else\r\n                sFormatStr = \"{0:\" + sFormatStr + \"}\";\r\n\r\n            value = LoDConvertTo(value, sType);\r\n\r\n            return StringUtil.Format(sFormatStr, value);\r\n\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts value to a Prim type of \"T\"\r\n        /// </summary>\r\n        /// <typeparam name=\"T\">Prim type to be converted to</typeparam>\r\n        /// <param name=\"value\">Object value to be converted</param>\r\n        /// <returns>Value as new converted type</returns>\r\n        /// <remarks></remarks>\r\n        public static T ToPrim<T>(object value)\r\n        {\r\n            if (value is T) return (T)value;\r\n\r\n            System.Type tp = typeof(T);\r\n            System.TypeCode code = System.Type.GetTypeCode(tp);\r\n            if (!ConvertUtil.IsSupportedType(tp, code))\r\n            {\r\n                throw new System.Exception(typeof(T).Name + \" is not accepted as a generic type for ConvertUtil.ToPrim.\");\r\n            }\r\n\r\n            return (T)ConvertUtil.ToPrim(value, tp, code);\r\n        }\r\n\r\n        public static object ToPrim(object value, System.Type tp)\r\n        {\r\n            if (tp == null) throw new System.ArgumentException(\"Type must be non-null\", \"tp\");\r\n            if (value != null && tp.IsAssignableFrom(value.GetType())) return value;\r\n\r\n            System.TypeCode code = System.Type.GetTypeCode(tp);\r\n            if (!ConvertUtil.IsSupportedType(tp, code))\r\n            {\r\n                throw new System.Exception(tp.Name + \" is not accepted as a type for ConvertUtil.ToPrim.\");\r\n            }\r\n\r\n            return ConvertUtil.ToPrim(value, tp, code);\r\n        }\r\n\r\n        public static bool TryToPrim<T>(object value, out T output)\r\n        {\r\n            try\r\n            {\r\n                output = ToPrim<T>(value);\r\n                return true;\r\n\r\n            }\r\n            catch\r\n            {\r\n                output = default(T);\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool TryToPrim(object value, System.Type tp, out object output)\r\n        {\r\n            try\r\n            {\r\n                output = ToPrim(value, tp);\r\n                return true;\r\n            }\r\n            catch\r\n            {\r\n                output = null;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static object ToPrim(object value, System.TypeCode code)\r\n        {\r\n            if (System.Convert.GetTypeCode(value) == code) return value;\r\n            return ToPrim(value, null, code);\r\n        }\r\n\r\n        private static object ToPrim(object value, System.Type tp, System.TypeCode code)\r\n        {\r\n            //first make sure it's not an enum\r\n            if(tp != null && tp.IsEnum)\r\n            {\r\n                if (value is string)\r\n                    return System.Enum.Parse(tp, value as string, true);\r\n                else if (value == null)\r\n                    value = 0;\r\n                \r\n                switch (System.Type.GetTypeCode(value.GetType()))\r\n                {\r\n                    case System.TypeCode.SByte:\r\n                    case System.TypeCode.Byte:\r\n                    case System.TypeCode.Int16:\r\n                    case System.TypeCode.UInt16:\r\n                    case System.TypeCode.Int32:\r\n                    case System.TypeCode.UInt32:\r\n                    case System.TypeCode.Int64:\r\n                    case System.TypeCode.UInt64:\r\n                        return System.Enum.ToObject(tp, value);\r\n                    default:\r\n                        return System.Enum.Parse(tp, System.Convert.ToString(value), true);\r\n                }\r\n            }\r\n\r\n            //now base off of the TypeCode\r\n            switch (code)\r\n            {\r\n                case System.TypeCode.Empty:\r\n                    //0\r\n                    return null;\r\n                case System.TypeCode.Object:\r\n                    //1\r\n                    if (tp == null || object.ReferenceEquals(tp, typeof(object))) return value;\r\n                    else if (tp == typeof(System.TimeSpan)) return ConvertUtil.ToTime(value);\r\n                    else if (tp == typeof(Vector2)) return ToVector2(value);\r\n                    else if (tp == typeof(Vector3)) return ToVector3(value);\r\n                    else if (tp == typeof(Vector4)) return ToVector4(value);\r\n                    else if (tp == typeof(Quaternion)) return ToQuaternion(value);\r\n                    else if (tp == typeof(Color)) return ToColor(value);\r\n                    else if (typeof(INumeric).IsAssignableFrom(tp) && !tp.IsAbstract) return ToNumeric(tp, value);\r\n                    else return null;\r\n\r\n                case System.TypeCode.DBNull:\r\n                    //2\r\n                    return System.DBNull.Value;\r\n                case System.TypeCode.Boolean:\r\n                    //3\r\n                    return ConvertUtil.ToBool(value);\r\n                case System.TypeCode.Char:\r\n                    //4\r\n                    return ConvertUtil.ToChar(value);\r\n                case System.TypeCode.SByte:\r\n                    //5\r\n                    return ConvertUtil.ToSByte(value);\r\n                case System.TypeCode.Byte:\r\n                    //6\r\n                    return ConvertUtil.ToByte(value);\r\n                case System.TypeCode.Int16:\r\n                    //7\r\n                    return ConvertUtil.ToShort(value);\r\n                case System.TypeCode.UInt16:\r\n                    //8\r\n                    return ConvertUtil.ToUShort(value);\r\n                case System.TypeCode.Int32:\r\n                    //9\r\n                    return ConvertUtil.ToInt(value);\r\n                case System.TypeCode.UInt32:\r\n                    //10\r\n                    return ConvertUtil.ToUInt(value);\r\n                case System.TypeCode.Int64:\r\n                    //11\r\n                    return ConvertUtil.ToLong(value);\r\n                case System.TypeCode.UInt64:\r\n                    //12\r\n                    return ConvertUtil.ToULong(value);\r\n                case System.TypeCode.Single:\r\n                    //13\r\n                    return ConvertUtil.ToSingle(value);\r\n                case System.TypeCode.Double:\r\n                    //14\r\n                    return ConvertUtil.ToDouble(value);\r\n                case System.TypeCode.Decimal:\r\n                    //15\r\n                    return ConvertUtil.ToDecimal(value);\r\n                case System.TypeCode.DateTime:\r\n                    //16\r\n                    return ConvertUtil.ToDate(value);\r\n                case System.TypeCode.String:\r\n                    //18\r\n                    return System.Convert.ToString(value);\r\n                default:\r\n                    return null;\r\n            }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region \"BitArray\"\r\n\r\n        public static byte[] ToByteArray(this System.Collections.BitArray bits)\r\n        {\r\n            int numBytes = (int)System.Math.Ceiling(bits.Count / 8.0f);\r\n            byte[] bytes = new byte[numBytes];\r\n\r\n            for (int i = 0; i < bits.Count; i++)\r\n            {\r\n                if (bits[i])\r\n                {\r\n                    int j = i / 8;\r\n                    int m = i % 8;\r\n                    bytes[j] |= (byte)(1 << m);\r\n                }\r\n            }\r\n\r\n            return bytes;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region CastTo Methods\r\n\r\n        /*\r\n\r\n        /// <summary>\r\n        /// Unique casting routine that will allow for casting between components of a gameobject \r\n        /// this allows you to treat a gameobject as its component...\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public static T CastTo<T>(object obj)\r\n        {\r\n            if (obj is T) return (T)obj;\r\n\r\n            var tp = typeof(T);\r\n            int itype = 0;\r\n            if (TypeUtil.IsType(tp, typeof(GameObject)))\r\n                itype = 1;\r\n            if (TypeUtil.IsType(tp, typeof(Component)))\r\n                itype = 2;\r\n            else if (TypeUtil.IsType(tp, typeof(IComponent)))\r\n                itype = 3;\r\n\r\n            if (itype == 1 && GameObjectUtil.IsGameObjectSource(obj))\r\n                return (T)(object)GameObjectUtil.GetGameObjectFromSource(obj);\r\n\r\n            if (itype > 1 && GameObjectUtil.IsGameObjectSource(obj))\r\n            {\r\n                var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n                T comp = go.GetFirstLikeComponent<T>();\r\n                return comp;\r\n            }\r\n\r\n            if (ConvertUtil.IsSupportedType(tp))\r\n            {\r\n                return ConvertUtil.ToPrim<T>(obj);\r\n            }\r\n\r\n            return default(T);\r\n        }\r\n\r\n        public static T[] CastManyTo<T>(System.Collections.IEnumerable objects)\r\n        {\r\n            var lst = new List<T>();\r\n\r\n            var tp = typeof(T);\r\n            int itype = 0;\r\n            if (TypeUtil.IsType(tp, typeof(GameObject)))\r\n                itype = 1;\r\n            if (TypeUtil.IsType(tp, typeof(Component)))\r\n                itype = 2;\r\n            else if (TypeUtil.IsType(tp, typeof(IComponent)))\r\n                itype = 3;\r\n\r\n            foreach (object obj in objects)\r\n            {\r\n                if (obj is T)\r\n                {\r\n                    lst.Add((T)obj);\r\n                }\r\n                else if (itype == 1 && GameObjectUtil.IsGameObjectSource(obj))\r\n                {\r\n                    lst.Add((T)(object)GameObjectUtil.GetGameObjectFromSource(obj));\r\n                }\r\n                else if (itype > 1 && GameObjectUtil.IsGameObjectSource(obj))\r\n                {\r\n                    var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n                    T comp = go.GetFirstLikeComponent<T>();\r\n                    lst.Add(comp);\r\n                }\r\n                else if (ConvertUtil.IsSupportedType(tp))\r\n                {\r\n                    lst.Add(ConvertUtil.ToPrim<T>(obj));\r\n                }\r\n                else\r\n                {\r\n                    lst.Add(default(T));\r\n                }\r\n            }\r\n\r\n            return lst.ToArray();\r\n        }\r\n \r\n         */\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/CoroutineUtil.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class CoroutineUtil\r\n    {\r\n\r\n        public static System.Collections.IEnumerator Wait(object instruction, System.Action<object> callback)\r\n        {\r\n            if (callback == null) throw new System.ArgumentNullException(\"callback\");\r\n            yield return instruction;\r\n            callback(instruction);\r\n        }\r\n        \r\n        #region StartCoroutine\r\n\r\n        public static Coroutine StartCoroutine(this MonoBehaviour behaviour, System.Collections.IEnumerable enumerable)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            return behaviour.StartCoroutine(enumerable.GetEnumerator());\r\n        }\r\n\r\n        public static Coroutine StartCoroutine(this MonoBehaviour behaviour, System.Func<System.Collections.IEnumerator> method)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (method == null) throw new System.ArgumentNullException(\"method\");\r\n\r\n            return behaviour.StartCoroutine(method());\r\n        }\r\n\r\n        public static Coroutine StartCoroutine(this MonoBehaviour behaviour, System.Delegate method, params object[] args)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (method == null) throw new System.ArgumentNullException(\"method\");\r\n\r\n            System.Collections.IEnumerator e;\r\n            if (com.spacepuppy.Utils.TypeUtil.IsType(method.Method.ReturnType, typeof(System.Collections.IEnumerable)))\r\n            {\r\n                e = (method.DynamicInvoke(args) as System.Collections.IEnumerable).GetEnumerator();\r\n            }\r\n            else if (com.spacepuppy.Utils.TypeUtil.IsType(method.Method.ReturnType, typeof(System.Collections.IEnumerator)))\r\n            {\r\n                e = (method.DynamicInvoke(args) as System.Collections.IEnumerator);\r\n            }\r\n            else\r\n            {\r\n                throw new System.ArgumentException(\"Delegate must have a return type of IEnumerable or IEnumerator.\", \"method\");\r\n            }\r\n\r\n            return behaviour.StartCoroutine(e);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region RadicalCoroutine\r\n\r\n        public static RadicalCoroutine StartRadicalCoroutine(this MonoBehaviour behaviour, System.Collections.IEnumerator routine, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            var co = new RadicalCoroutine(routine);\r\n            co.Start(behaviour, disableMode);\r\n            return co;\r\n        }\r\n\r\n        public static RadicalCoroutine StartRadicalCoroutine(this MonoBehaviour behaviour, System.Collections.IEnumerable routine, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            var co = new RadicalCoroutine(routine.GetEnumerator());\r\n            co.Start(behaviour, disableMode);\r\n            return co;\r\n        }\r\n\r\n        public static RadicalCoroutine StartRadicalCoroutine(this MonoBehaviour behaviour, System.Func<System.Collections.IEnumerator> method, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (method == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            var co = new RadicalCoroutine(method());\r\n            co.Start(behaviour, disableMode);\r\n            return co;\r\n        }\r\n\r\n        public static RadicalCoroutine StartRadicalCoroutine(this MonoBehaviour behaviour, System.Delegate method, object[] args = null, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (method == null) throw new System.ArgumentNullException(\"method\");\r\n\r\n            System.Collections.IEnumerator e;\r\n            if (com.spacepuppy.Utils.TypeUtil.IsType(method.Method.ReturnType, typeof(System.Collections.IEnumerable)))\r\n            {\r\n                e = (method.DynamicInvoke(args) as System.Collections.IEnumerable).GetEnumerator();\r\n            }\r\n            else if (com.spacepuppy.Utils.TypeUtil.IsType(method.Method.ReturnType, typeof(System.Collections.IEnumerator)))\r\n            {\r\n                e = (method.DynamicInvoke(args) as System.Collections.IEnumerator);\r\n            }\r\n            else\r\n            {\r\n                throw new System.ArgumentException(\"Delegate must have a return type of IEnumerable or IEnumerator.\", \"method\");\r\n            }\r\n\r\n            var co = new RadicalCoroutine(e);\r\n            co.Start(behaviour, disableMode);\r\n            return co;\r\n        }\r\n        \r\n\r\n\r\n\r\n        public static RadicalCoroutine StartRadicalCoroutineAsync(this MonoBehaviour behaviour, System.Collections.IEnumerator routine, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            var co = new RadicalCoroutine(routine);\r\n            co.StartAsync(behaviour, disableMode);\r\n            return co;\r\n        }\r\n\r\n        public static RadicalCoroutine StartRadicalCoroutineAsync(this MonoBehaviour behaviour, System.Collections.IEnumerable routine, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            var co = new RadicalCoroutine(routine.GetEnumerator());\r\n            co.StartAsync(behaviour, disableMode);\r\n            return co;\r\n        }\r\n\r\n        public static RadicalCoroutine StartRadicalCoroutineAsync(this MonoBehaviour behaviour, System.Func<System.Collections.IEnumerator> method, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (method == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            var co = new RadicalCoroutine(method());\r\n            co.StartAsync(behaviour, disableMode);\r\n            return co;\r\n        }\r\n\r\n        public static RadicalCoroutine StartRadicalCoroutineAsync(this MonoBehaviour behaviour, System.Delegate method, object[] args = null, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (method == null) throw new System.ArgumentNullException(\"method\");\r\n\r\n            System.Collections.IEnumerator e;\r\n            if (com.spacepuppy.Utils.TypeUtil.IsType(method.Method.ReturnType, typeof(System.Collections.IEnumerable)))\r\n            {\r\n                e = (method.DynamicInvoke(args) as System.Collections.IEnumerable).GetEnumerator();\r\n            }\r\n            else if (com.spacepuppy.Utils.TypeUtil.IsType(method.Method.ReturnType, typeof(System.Collections.IEnumerator)))\r\n            {\r\n                e = (method.DynamicInvoke(args) as System.Collections.IEnumerator);\r\n            }\r\n            else\r\n            {\r\n                throw new System.ArgumentException(\"Delegate must have a return type of IEnumerable or IEnumerator.\", \"method\");\r\n            }\r\n\r\n            var co = new RadicalCoroutine(e);\r\n            co.StartAsync(behaviour, disableMode);\r\n            return co;\r\n        }\r\n\r\n\r\n\r\n        public static RadicalCoroutine StartAutoKillRadicalCoroutine(this MonoBehaviour behaviour, System.Collections.IEnumerator routine, object autoKillToken, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            var co = new RadicalCoroutine(routine);\r\n            co.StartAutoKill(behaviour, autoKillToken, disableMode);\r\n            return co;\r\n        }\r\n\r\n        public static RadicalCoroutine StartAutoKillRadicalCoroutine(this MonoBehaviour behaviour, System.Collections.IEnumerable routine, object autoKillToken, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            var co = new RadicalCoroutine(routine.GetEnumerator());\r\n            co.StartAutoKill(behaviour, autoKillToken, disableMode);\r\n            return co;\r\n        }\r\n\r\n        public static RadicalCoroutine StartAutoKillRadicalCoroutine(this MonoBehaviour behaviour, System.Func<System.Collections.IEnumerator> method, object autoKillToken, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (method == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            var co = new RadicalCoroutine(method());\r\n            co.StartAutoKill(behaviour, autoKillToken, disableMode);\r\n            return co;\r\n        }\r\n        \r\n\r\n\r\n        public static RadicalCoroutine StartValidatedRadicalCoroutine(this MonoBehaviour behaviour, System.Collections.IEnumerator routine, System.Func<bool> validator, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.Default)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n            if (validator == null) throw new System.ArgumentNullException(\"validator\");\r\n\r\n            var co = new RadicalCoroutine(ValidatedRoutine(routine, validator));\r\n            co.Start(behaviour, disableMode);\r\n            return co;\r\n        }\r\n\r\n        public static System.Collections.IEnumerator ValidatedRoutine(System.Collections.IEnumerator routine, System.Func<bool> validator)\r\n        {\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n            if (validator == null) throw new System.ArgumentNullException(\"validator\");\r\n\r\n            while(validator() && routine.MoveNext())\r\n            {\r\n                yield return routine.Current;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Invoke\r\n\r\n#if SP_LIB\r\n\r\n        public static Coroutine InvokeLegacy(this MonoBehaviour behaviour, System.Action method, float delay)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (method == null) throw new System.ArgumentNullException(\"method\");\r\n\r\n            return behaviour.StartCoroutine(InvokeRedirect(method, delay));\r\n        }\r\n\r\n        public static RadicalCoroutine Invoke(this MonoBehaviour behaviour, System.Action method, float delay, ITimeSupplier time = null, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.CancelOnDisable)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (method == null) throw new System.ArgumentNullException(\"method\");\r\n\r\n            return StartRadicalCoroutine(behaviour, RadicalInvokeRedirect(method, delay, -1f, time), disableMode);\r\n        }\r\n\r\n        public static RadicalCoroutine InvokeRepeating(this MonoBehaviour behaviour, System.Action method, float delay, float repeatRate, ITimeSupplier time = null, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.CancelOnDisable)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (method == null) throw new System.ArgumentNullException(\"method\");\r\n\r\n            return StartRadicalCoroutine(behaviour, RadicalInvokeRedirect(method, delay, repeatRate, time), disableMode);\r\n        }\r\n\r\n        public static InvokeHandle InvokeGuaranteed(this MonoBehaviour behaviour, System.Action method, float delay, ITimeSupplier time = null)\r\n        {\r\n            if (method == null) throw new System.ArgumentNullException(\"method\");\r\n            //return StartRadicalCoroutine(GameLoopEntry.Hook, RadicalInvokeRedirect(method, delay, -1f, time));\r\n            \r\n            return InvokeHandle.Begin(GameLoopEntry.UpdatePump, method, delay, time);\r\n        }\r\n        \r\n        private static System.Collections.IEnumerator InvokeRedirect(System.Action method, float delay, float repeatRate = -1f)\r\n        {\r\n            yield return new WaitForSeconds(delay);\r\n\r\n            if (repeatRate < 0f)\r\n            {\r\n                method();\r\n            }\r\n            else if (repeatRate == 0f)\r\n            {\r\n                while (true)\r\n                {\r\n                    method();\r\n                    yield return null;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var w = new WaitForSeconds(repeatRate);\r\n                while (true)\r\n                {\r\n                    method();\r\n                    yield return w;\r\n                }\r\n            }\r\n        }\r\n\r\n        internal static System.Collections.IEnumerator RadicalInvokeRedirect(System.Action method, float delay, float repeatRate = -1f, ITimeSupplier time = null)\r\n        {\r\n            //if (delay < SPConstants.MIN_FRAME_DELTA)\r\n            //    yield return null;\r\n            //else if (delay > 0f)\r\n            //    yield return WaitForDuration.Seconds(delay, time);\r\n\r\n            if (time == null) time = SPTime.Normal;\r\n            float t = time.Total;\r\n            while (time.Total - t < delay)\r\n            {\r\n                yield return null;\r\n            }\r\n\r\n            if (repeatRate < 0f)\r\n            {\r\n                method();\r\n            }\r\n            else if (repeatRate == 0f)\r\n            {\r\n                while (true)\r\n                {\r\n                    method();\r\n                    yield return null;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                while (true)\r\n                {\r\n                    method();\r\n                    yield return WaitForDuration.Seconds(repeatRate, time);\r\n                }\r\n            }\r\n        }\r\n\r\n#endif\r\n\r\n\r\n        public static RadicalCoroutine InvokeAfterYield(this MonoBehaviour behaviour, System.Action method, object yieldInstruction, RadicalCoroutineDisableMode disableMode = RadicalCoroutineDisableMode.CancelOnDisable)\r\n        {\r\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\r\n            if (method == null) throw new System.ArgumentNullException(\"method\");\r\n\r\n            return StartRadicalCoroutine(behaviour, InvokeAfterYieldRedirect(method, yieldInstruction));\r\n        }\r\n\r\n        internal static System.Collections.IEnumerator InvokeAfterYieldRedirect(System.Action method, object yieldInstruction)\r\n        {\r\n            yield return yieldInstruction;\r\n            method();\r\n        }\r\n\r\n#endregion\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/Diminish/DiminishingWeightOverDuration.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Utils.Diminish\r\n{\r\n\r\n    [System.Serializable()]\r\n    public class DiminishingWeightOverDuration\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private float _weight = 1f;\r\n        [SerializeField()]\r\n        [Tooltip(\"Number of times that can be selected before weight is forced to zero no matter the diminish rate.\")]\r\n        private DiscreteFloat _maxCount = DiscreteFloat.PositiveInfinity;\r\n        [SerializeField()]\r\n        [Tooltip(\"Every time the option is selected the weight is multipled by this rate.\")]\r\n        private float _diminishRate = 1.0f;\r\n        [SerializeField()]\r\n        [Tooltip(\"Amount of time each compounded diminish lasts against the weight.\")]\r\n        private float _diminishPeriodDuration = 1f;\r\n\r\n        [System.NonSerialized()]\r\n        private ITimeSupplier _timeSupplier;\r\n        [System.NonSerialized()]\r\n        private int _count;\r\n        [System.NonSerialized()]\r\n        private float _lastTime;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public DiminishingWeightOverDuration()\r\n        {\r\n\r\n        }\r\n\r\n        public DiminishingWeightOverDuration(float weight)\r\n        {\r\n            _weight = weight;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ITimeSupplier TimeSupplier\r\n        {\r\n            get\r\n            {\r\n                if (_timeSupplier == null) _timeSupplier = SPTime.Normal;\r\n                return _timeSupplier;\r\n            }\r\n            set { _timeSupplier = value ?? SPTime.Normal; }\r\n        }\r\n\r\n        public float Weight\r\n        {\r\n            get { return _weight; }\r\n            set { _weight = value; }\r\n        }\r\n\r\n        public float DiminishRate\r\n        {\r\n            get { return _diminishRate; }\r\n            set { _diminishRate = Mathf.Max(0f, value); }\r\n        }\r\n\r\n        public float DiminishPeriodDuration\r\n        {\r\n            get { return _diminishPeriodDuration; }\r\n            set { _diminishPeriodDuration = Mathf.Max(0f, value); }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Signal()\r\n        {\r\n            var dt = this.TimeSupplier.Total - _lastTime;\r\n            int cnt = Mathf.FloorToInt(dt / _diminishPeriodDuration);\r\n            if (cnt > 0)\r\n            {\r\n                _count = Mathf.Max(0, _count - cnt);\r\n                _lastTime += cnt * _diminishPeriodDuration;\r\n            }\r\n\r\n            if(_count == 0)\r\n            {\r\n                _lastTime = this.TimeSupplier.Total;\r\n                _count = 1;\r\n            }\r\n            else\r\n            {\r\n                _count++;\r\n            }\r\n        }\r\n\r\n        public float GetAdjustedWeight()\r\n        {\r\n            if (_count >= _maxCount) return 0f;\r\n            if (_count == 0 || MathUtil.FuzzyEqual(_diminishRate, 1f)) return _weight;\r\n\r\n            var dt = this.TimeSupplier.Total - _lastTime;\r\n            int cnt = Mathf.FloorToInt(dt / _diminishPeriodDuration);\r\n            if (cnt > 0)\r\n            {\r\n                _count = Mathf.Max(0, _count - cnt);\r\n                _lastTime += cnt * _diminishPeriodDuration;\r\n            }\r\n\r\n            float w = _weight;\r\n            for (int i = 0; i < _count; i++)\r\n            {\r\n                w *= _diminishRate;\r\n            }\r\n            return w;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/EnumUtil.cs",
    "content": "﻿using System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n\r\n    /// <summary>\r\n    /// Readable shorthand methods for enum operations. The underlying bitwise operators are substantially faster. \r\n    /// These methods are intended for making code more readable, rather than more optimized. Use sparingly.\r\n    /// </summary>\r\n    public static class EnumUtil\r\n    {\r\n\r\n        public static object ToEnumsNumericType(System.Enum e)\r\n        {\r\n            if (e == null) return null;\r\n\r\n            switch(e.GetTypeCode())\r\n            {\r\n                case System.TypeCode.SByte:\r\n                    return System.Convert.ToSByte(e);\r\n                case System.TypeCode.Byte:\r\n                    return System.Convert.ToByte(e);\r\n                case System.TypeCode.Int16:\r\n                    return System.Convert.ToInt16(e);\r\n                case System.TypeCode.UInt16:\r\n                    return System.Convert.ToUInt16(e);\r\n                case System.TypeCode.Int32:\r\n                    return System.Convert.ToInt32(e);\r\n                case System.TypeCode.UInt32:\r\n                    return System.Convert.ToUInt32(e);\r\n                case System.TypeCode.Int64:\r\n                    return System.Convert.ToInt64(e);\r\n                case System.TypeCode.UInt64:\r\n                    return System.Convert.ToUInt64(e);\r\n                default:\r\n                    return null;\r\n            }\r\n        }\r\n\r\n        private static object ToEnumsNumericType(ulong v, System.TypeCode code)\r\n        {\r\n            switch (code)\r\n            {\r\n                case System.TypeCode.Byte:\r\n                    return (byte)v;\r\n                case System.TypeCode.SByte:\r\n                    return (sbyte)v;\r\n                case System.TypeCode.Int16:\r\n                    return (short)v;\r\n                case System.TypeCode.UInt16:\r\n                    return (ushort)v;\r\n                case System.TypeCode.Int32:\r\n                    return (int)v;\r\n                case System.TypeCode.UInt32:\r\n                    return (uint)v;\r\n                case System.TypeCode.Int64:\r\n                    return (long)v;\r\n                case System.TypeCode.UInt64:\r\n                    return v;\r\n                default:\r\n                    return null;\r\n            }\r\n        }\r\n\r\n        public static bool EnumValueIsDefined(object value, System.Type enumType)\r\n        {\r\n            if (enumType == null) throw new System.ArgumentNullException(\"enumType\");\r\n            if (!enumType.IsEnum) throw new System.ArgumentException(\"Must be enum type.\", \"enumType\");\r\n            if (value == null) return false;\r\n\r\n            try\r\n            {\r\n                if (value is string)\r\n                    return System.Enum.IsDefined(enumType, value);\r\n                else if (ConvertUtil.IsNumeric(value))\r\n                {\r\n                    value = ConvertUtil.ToPrim(value, System.Type.GetTypeCode(enumType));\r\n                    return System.Enum.IsDefined(enumType, value);\r\n                }\r\n            }\r\n            catch\r\n            {\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool EnumValueIsDefined<T>(object value)\r\n        {\r\n            return EnumValueIsDefined(value, typeof(T));\r\n        }\r\n\r\n        public static T AddFlag<T>(this T e, T value) where T : struct, System.IConvertible\r\n        {\r\n            return (T)System.Enum.ToObject(typeof(T), System.Convert.ToInt64(e) | System.Convert.ToInt64(value));\r\n        }\r\n\r\n        public static T RedactFlag<T>(this T e, T value) where T : struct, System.IConvertible\r\n        {\r\n            var x = System.Convert.ToInt64(e);\r\n            var y = System.Convert.ToInt64(value);\r\n            return (T)System.Enum.ToObject(typeof(T), x & ~(x & y));\r\n        }\r\n\r\n        public static T SetFlag<T>(this T e, T flag, bool status) where T : struct, System.IConvertible\r\n        {\r\n            var x = System.Convert.ToInt64(e);\r\n            var y = System.Convert.ToInt64(flag);\r\n            if (status)\r\n                x |= y;\r\n            else\r\n                x &= ~(x & y);\r\n            return (T)System.Enum.ToObject(typeof(T), x);\r\n        }\r\n\r\n        public static bool HasFlag(this System.Enum e, System.Enum value)\r\n        {\r\n            long v = System.Convert.ToInt64(value);\r\n            return (System.Convert.ToInt64(e) & v) == v;\r\n        }\r\n        \r\n        public static bool HasFlag(this System.Enum e, ulong value)\r\n        {\r\n            return (System.Convert.ToUInt64(e) & value) == value;\r\n        }\r\n\r\n        public static bool HasFlag(this System.Enum e, long value)\r\n        {\r\n            return (System.Convert.ToInt64(e) & value) == value;\r\n        }\r\n\r\n        public static bool HasAnyFlag(this System.Enum e, System.Enum value)\r\n        {\r\n            return (System.Convert.ToInt64(e) & System.Convert.ToInt64(value)) != 0;\r\n        }\r\n\r\n        public static bool HasAnyFlag(this System.Enum e, ulong value)\r\n        {\r\n            return (System.Convert.ToUInt64(e) & value) != 0;\r\n        }\r\n\r\n        public static bool HasAnyFlag(this System.Enum e, long value)\r\n        {\r\n            return (System.Convert.ToInt64(e) & value) != 0;\r\n        }\r\n\r\n        public static IEnumerable<System.Enum> EnumerateFlags(System.Enum e)\r\n        {\r\n            if (e == null) throw new System.ArgumentNullException(\"e\");\r\n\r\n            var tp = e.GetType();\r\n            ulong max = 0;\r\n            foreach (var en in System.Enum.GetValues(tp))\r\n            {\r\n                ulong v = System.Convert.ToUInt64(en);\r\n                if (v > max) max = v;\r\n            }\r\n            int loops = (int)System.Math.Log(max, 2) + 1;\r\n\r\n\r\n            ulong ie = System.Convert.ToUInt64(e);\r\n            for (int i = 0; i < loops; i++)\r\n            {\r\n                ulong j = (ulong)System.Math.Pow(2, i);\r\n                if ((ie & j) != 0)\r\n                {\r\n                    var js = ToEnumsNumericType(j, e.GetTypeCode());\r\n                    if (System.Enum.IsDefined(tp, js)) yield return (System.Enum)System.Enum.Parse(tp, js.ToString());\r\n                }\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<T> EnumerateFlags<T>(T e) where T : struct, System.IConvertible\r\n        {\r\n            var tp = e.GetType();\r\n            if (!tp.IsEnum) throw new System.ArgumentException(\"Type must be an enum.\", \"T\");\r\n\r\n            ulong max = 0;\r\n            foreach (var en in System.Enum.GetValues(tp))\r\n            {\r\n                ulong v = System.Convert.ToUInt64(en);\r\n                if (v > max) max = v;\r\n            }\r\n            int loops = (int)System.Math.Log(max, 2) + 1;\r\n\r\n\r\n            ulong ie = System.Convert.ToUInt64(e);\r\n            for (int i = 0; i < loops; i++)\r\n            {\r\n                ulong j = (ulong)System.Math.Pow(2, i);\r\n                if ((ie & j) != 0)\r\n                {\r\n                    var js = ToEnumsNumericType(j, e.GetTypeCode());\r\n                    if (System.Enum.IsDefined(tp, js))\r\n                    {\r\n                        yield return (T)js;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<System.Enum> GetUniqueEnumFlags(System.Type enumType)\r\n        {\r\n            if (enumType == null) throw new System.ArgumentNullException(\"enumType\");\r\n            if (!enumType.IsEnum) throw new System.ArgumentException(\"Type must be an enum.\", \"enumType\");\r\n\r\n            foreach (System.Enum e in System.Enum.GetValues(enumType))\r\n            {\r\n                //var d = System.Convert.ToDecimal(e);\r\n                //if (d > 0 && MathUtil.IsPowerOfTwo(System.Convert.ToUInt64(d))) yield return e as System.Enum;\r\n\r\n                switch (e.GetTypeCode())\r\n                {\r\n                    case System.TypeCode.Byte:\r\n                    case System.TypeCode.UInt16:\r\n                    case System.TypeCode.UInt32:\r\n                    case System.TypeCode.UInt64:\r\n                        if (MathUtil.IsPowerOfTwo(System.Convert.ToUInt64(e))) yield return e;\r\n                        break;\r\n                    case System.TypeCode.SByte:\r\n                        {\r\n                            sbyte i = System.Convert.ToSByte(e);\r\n                            if (i == -128 || (i > 0 && MathUtil.IsPowerOfTwo((ulong)i))) yield return e;\r\n                        }\r\n                        break;\r\n                    case System.TypeCode.Int16:\r\n                        {\r\n                            short i = System.Convert.ToInt16(e);\r\n                            if (i == -32768 || (i > 0 && MathUtil.IsPowerOfTwo((ulong)i))) yield return e;\r\n                        }\r\n                        break;\r\n                    case System.TypeCode.Int32:\r\n                        {\r\n                            int i = System.Convert.ToInt32(e);\r\n                            if (i == -2147483648 || (i > 0 && MathUtil.IsPowerOfTwo((ulong)i))) yield return e;\r\n                        }\r\n                        break;\r\n                    case System.TypeCode.Int64:\r\n                        {\r\n                            long i = System.Convert.ToInt64(e);\r\n                            if (i == -9223372036854775808 || (i > 0 && MathUtil.IsPowerOfTwo((ulong)i))) yield return e;\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<string> GetFriendlyNames(System.Type enumType)\r\n        {\r\n            if (!enumType.IsEnum) throw new System.ArgumentException(\"Type must be an enum.\", \"enumType\");\r\n\r\n            return enumType.GetFields(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public).OrderBy(fi => fi.GetValue(null)).Select(fi =>\r\n            {\r\n                var desc = fi.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false).FirstOrDefault() as System.ComponentModel.DescriptionAttribute;\r\n                return desc != null ? desc.Description : StringUtil.NicifyVariableName(fi.Name);\r\n            });\r\n        }\r\n\r\n        public static string GetFriendlyName(System.Enum value)\r\n        {\r\n            if (value == null) return string.Empty;\r\n\r\n            var tp = value.GetType();\r\n            var nm = System.Enum.GetName(tp, value);\r\n            var fi = tp.GetField(nm);\r\n            if (fi == null) return nm;\r\n\r\n            var desc = fi.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false).FirstOrDefault() as System.ComponentModel.DescriptionAttribute;\r\n            return desc != null ? desc.Description : StringUtil.NicifyVariableName(nm);\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/GameObjUtil.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Geom;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class GameObjectUtil\r\n    {\r\n        \r\n#region Get*FromSource\r\n\r\n        public static bool IsGameObjectSource(object obj)\r\n        {\r\n            return (obj is GameObject || obj is Component || obj is IGameObjectSource);\r\n        }\r\n\r\n        public static bool IsGameObjectSource(object obj, bool respectProxy)\r\n        {\r\n            if (respectProxy && obj is IProxy)\r\n            {\r\n                obj = (obj as IProxy).GetTarget();\r\n                if (obj == null) return false;\r\n            }\r\n\r\n            return (obj is GameObject || obj is Component || obj is IGameObjectSource);\r\n        }\r\n        \r\n        /*\r\n        public static GameObject GetGameObjectFromSource(object obj)\r\n        {\r\n            if (obj == null) return null;\r\n            if (obj is GameObject)\r\n                return obj as GameObject;\r\n            if (obj is Component)\r\n                return (obj as Component).gameObject;\r\n            if (obj is IGameObjectSource)\r\n                return (obj as IGameObjectSource).gameObject;\r\n\r\n            return null;\r\n        }\r\n        */\r\n\r\n        public static GameObject GetGameObjectFromSource(object obj, bool respectProxy = false)\r\n        {\r\n            if (obj == null) return null;\r\n\r\n            if(respectProxy && obj is IProxy)\r\n            {\r\n                obj = (obj as IProxy).GetTarget();\r\n                if (obj == null) return null;\r\n            }\r\n\r\n            if (obj is GameObject)\r\n                return obj as GameObject;\r\n            if (obj is Component)\r\n                return ObjUtil.IsObjectAlive(obj as Component) ? (obj as Component).gameObject : null;\r\n            if (obj is IGameObjectSource)\r\n                return obj.IsNullOrDestroyed() ? null : (obj as IGameObjectSource).gameObject;\r\n\r\n            return null;\r\n        }\r\n\r\n        /*\r\n        public static Transform GetTransformFromSource(object obj)\r\n        {\r\n            if (obj == null) return null;\r\n            if (obj is Transform)\r\n                return obj as Transform;\r\n            if (obj is GameObject)\r\n                return (obj as GameObject).transform;\r\n            if (obj is Component)\r\n                return (obj as Component).transform;\r\n            if (obj is IGameObjectSource)\r\n                return (obj as IGameObjectSource).transform;\r\n\r\n            return null;\r\n        }\r\n        */\r\n\r\n        public static Transform GetTransformFromSource(object obj, bool respectProxy = false)\r\n        {\r\n            if (obj == null) return null;\r\n\r\n            if (respectProxy && obj is IProxy)\r\n            {\r\n                obj = (obj as IProxy).GetTarget();\r\n                if (obj == null) return null;\r\n            }\r\n\r\n            if (obj is Transform)\r\n                return obj as Transform;\r\n            if (obj is GameObject)\r\n                return ObjUtil.IsObjectAlive(obj as GameObject) ? (obj as GameObject).transform : null;\r\n            if (obj is Component)\r\n                return ObjUtil.IsObjectAlive(obj as Component) ? (obj as Component).transform : null;\r\n            if (obj is IGameObjectSource)\r\n                return obj.IsNullOrDestroyed() ? null : (obj as IGameObjectSource).transform;\r\n\r\n            return null;\r\n        }\r\n\r\n        public static GameObject GetRootFromSource(object obj, bool respectProxy = false)\r\n        {\r\n            if (obj.IsNullOrDestroyed()) return null;\r\n\r\n            if (respectProxy && obj is IProxy)\r\n            {\r\n                obj = (obj as IProxy).GetTarget();\r\n                if (obj.IsNullOrDestroyed()) return null;\r\n            }\r\n\r\n            if (obj is IComponent) obj = (obj as IComponent).component;\r\n\r\n            if (obj is Transform)\r\n                return (obj as Transform).FindRoot();\r\n            else if (obj is GameObject)\r\n                return (obj as GameObject).FindRoot();\r\n            else if (obj is SPEntityComponent)\r\n                return (obj as SPEntityComponent).entityRoot.gameObject;\r\n            else if (obj is Component)\r\n                return (obj as Component).FindRoot();\r\n            else if (obj is IGameObjectSource)\r\n                return (obj as IGameObjectSource).gameObject.FindRoot();\r\n\r\n            return null;\r\n        }\r\n\r\n        public static GameObject GetTrueRootFromSource(object obj, bool respectProxy = false)\r\n        {\r\n            if (obj.IsNullOrDestroyed()) return null;\r\n\r\n            if (respectProxy && obj is IProxy)\r\n            {\r\n                obj = (obj as IProxy).GetTarget();\r\n                if (obj.IsNullOrDestroyed()) return null;\r\n            }\r\n\r\n            if (obj is IComponent) obj = (obj as IComponent).component;\r\n\r\n            if (obj is Transform)\r\n                return (obj as Transform).FindTrueRoot();\r\n            else if (obj is GameObject)\r\n                return (obj as GameObject).FindTrueRoot();\r\n            else if (obj is SPEntityComponent)\r\n            {\r\n                var r = (obj as SPEntityComponent).entityRoot.gameObject;\r\n                if (r.HasTag(SPConstants.TAG_ROOT))\r\n                    return r;\r\n                else\r\n                    return null;\r\n            }\r\n            else if (obj is Component)\r\n                return (obj as Component).FindTrueRoot();\r\n            else if (obj is IGameObjectSource)\r\n                return (obj as IGameObjectSource).gameObject.FindTrueRoot();\r\n\r\n            return null;\r\n        }\r\n\r\n#endregion\r\n\r\n\r\n\r\n#region Kill Extension Methods\r\n\r\n        /// <summary>\r\n        /// Object is not null, dead/killed, and is active in hierarchy.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public static bool IsAliveAndActive(this GameObject obj)\r\n        {\r\n            return obj != null && obj.activeInHierarchy && !obj.IsKilled();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Object is not null, dead/killed, and is active in hierarchy as well as enabled.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public static bool IsAliveAndActive(this Component obj)\r\n        {\r\n            return obj != null && obj.IsActiveAndEnabled() && !obj.IsKilled();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Object is not null, dead/killed, and is active in hierarchy as well as enabled.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public static bool IsAliveAndActive(this Behaviour obj)\r\n        {\r\n            return obj != null && obj.isActiveAndEnabled && !obj.IsKilled();\r\n        }\r\n\r\n        public static bool TrySetActive(this GameObject go, bool active)\r\n        {\r\n            if (go != null)\r\n            {\r\n                go.SetActive(active);\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static bool TrySetActive(this IGameObjectSource src, bool active)\r\n        {\r\n            if (src == null) return false;\r\n            var go = src.gameObject;\r\n            if (go != null)\r\n            {\r\n                go.SetActive(active);\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tests if the object is either destroyed or killed.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public static bool IsKilled(this GameObject obj)\r\n        {\r\n            if (obj == null) return true;\r\n            \r\n            using (var lst = TempCollection.GetList<IKillableEntity>())\r\n            {\r\n                obj.GetComponents<IKillableEntity>(lst);\r\n                if (lst.Count > 0)\r\n                {\r\n                    var e = lst.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (e.Current.IsDead) return true;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tests if the object is either destroyed or killed.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public static bool IsKilled(this Component obj)\r\n        {\r\n            if (obj == null) return true;\r\n            \r\n            using (var lst = TempCollection.GetList<IKillableEntity>())\r\n            {\r\n                obj.GetComponents<IKillableEntity>(lst);\r\n                if (lst.Count > 0)\r\n                {\r\n                    var e = lst.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (e.Current.IsDead) return true;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Destroys the GameObject and its children, if the GameObject contains a KillableEntity component that will handle the death first and foremost.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        public static void Kill(this GameObject obj)\r\n        {\r\n            if (obj.IsNullOrDestroyed()) return;\r\n\r\n            if(Application.isEditor && !Application.isPlaying)\r\n            {\r\n                UnityEngine.Object.Destroy(obj);\r\n            }\r\n            else\r\n            {\r\n                using (var lst = TempCollection.GetList<IKillableEntity>())\r\n                {\r\n                    //this returns in the order from top down, we will loop backwards to kill bottom up\r\n                    obj.GetComponentsInChildren<IKillableEntity>(true, lst);\r\n                    if (lst.Count > 0)\r\n                    {\r\n                        for (int i = lst.Count - 1; i > -1; i--)\r\n                        {\r\n                            lst[i].Kill();\r\n                        }\r\n\r\n                        if (lst[0].gameObject != obj)\r\n                        {\r\n                            UnityEngine.Object.Destroy(obj);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        UnityEngine.Object.Destroy(obj);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Destroys the entire entity, if the entity contains a KillableEntity component that will handle death first and foremost.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        public static void KillEntity(this GameObject obj)\r\n        {\r\n            Kill(obj.FindRoot());\r\n        }\r\n        \r\n#endregion\r\n\r\n#region Layer Methods\r\n\r\n        public static IEnumerable<GameObject> FindGameObjectOnLayer(int mask)\r\n        {\r\n            var arr = GameObject.FindObjectsOfType(typeof(GameObject));\r\n\r\n            foreach (GameObject go in arr)\r\n            {\r\n                if (((1 << go.layer) & mask) != 0) yield return go;\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<GameObject> FindGameObjectOnLayer(this GameObject go, int mask)\r\n        {\r\n            if (go == null) yield break;\r\n            if (((1 << go.layer) & mask) != 0) yield return go;\r\n\r\n            foreach (Transform child in go.transform.IterateAllChildren())\r\n            {\r\n                if (((1 << child.gameObject.layer) & mask) != 0) yield return child.gameObject;\r\n            }\r\n        }\r\n\r\n        public static void ChangeLayer(this GameObject obj, int layer, bool recursive, params string[] ignoreNames)\r\n        {\r\n            obj.layer = layer;\r\n\r\n            if (recursive)\r\n            {\r\n                foreach (Transform child in obj.transform)\r\n                {\r\n                    if (!StringUtil.Equals(child.name, ignoreNames))\r\n                    {\r\n                        ChangeLayer(child.gameObject, layer, recursive, ignoreNames);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static bool IntersectsLayerMask(this GameObject obj, int layerMask)\r\n        {\r\n            if (obj == null) return false;\r\n\r\n            return ((1 << obj.layer) & layerMask) != 0;\r\n        }\r\n\r\n#endregion\r\n        \r\n#region Search/Find\r\n\r\n        public static GameObject Find(this GameObject go, string spath)\r\n        {\r\n            if (go == null) throw new System.ArgumentNullException(\"go\");\r\n\r\n            var child = go.transform.Find(spath);\r\n            return (child != null) ? child.gameObject : null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Finds a gameobject based on some path. This works just like Transform.Find, but added a case sensitivity option.\r\n        /// </summary>\r\n        /// <param name=\"go\"></param>\r\n        /// <param name=\"spath\"></param>\r\n        /// <param name=\"bIgnoreCase\"></param>\r\n        /// <returns></returns>\r\n        public static GameObject Find(this GameObject go, string spath, bool bIgnoreCase)\r\n        {\r\n            var result = Find(go.transform, spath, bIgnoreCase);\r\n            if (result != null)\r\n                return result.gameObject;\r\n            else\r\n                return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Finds a gameobject based on some path. This works just like Transform.Find, but added a case sensitivity option.\r\n        /// </summary>\r\n        /// <param name=\"trans\"></param>\r\n        /// <param name=\"spath\"></param>\r\n        /// <param name=\"bIgnoreCase\"></param>\r\n        /// <returns></returns>\r\n        public static Transform Find(this Transform trans, string spath, bool bIgnoreCase)\r\n        {\r\n            if (bIgnoreCase)\r\n            {\r\n                var arr = spath.Split('/');\r\n                if (arr == null || arr.Length == 0) return null;\r\n\r\n                foreach (string sname in arr)\r\n                {\r\n                    bool foundNext = false;\r\n                    foreach (Transform child in trans)\r\n                    {\r\n                        if (StringUtil.Equals(sname, child.name, true))\r\n                        {\r\n                            foundNext = true;\r\n                            trans = child;\r\n                            break;\r\n                        }\r\n                    }\r\n                    if (!foundNext) return null;\r\n                }\r\n\r\n                return trans;\r\n            }\r\n            else\r\n            {\r\n                return trans.Find(spath);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Attempts to find a gameobject based on some name, if it isn't found a gameobject is created with the name and added as a child. \r\n        /// Note, this is unlike Transform.Find in that it only searches for direct children, and does not traverse the hierarchy.\r\n        /// </summary>\r\n        /// <param name=\"go\"></param>\r\n        /// <param name=\"name\"></param>\r\n        /// <param name=\"bIgnoreCase\"></param>\r\n        /// <returns></returns>\r\n        public static GameObject FindOrAddChild(this GameObject go, string name, bool bIgnoreCase)\r\n        {\r\n            if (go == null) throw new System.ArgumentNullException(\"go\");\r\n\r\n            GameObject child = (from Transform c in go.transform where StringUtil.Equals(c.name, name, bIgnoreCase) select c.gameObject).FirstOrDefault();\r\n\r\n            if (child == null)\r\n            {\r\n                child = new GameObject(name);\r\n                child.transform.parent = go.transform;\r\n                child.transform.ZeroOut(false);\r\n            }\r\n\r\n            return child;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Attempts to find a gameobject based on some name, if it isn't found a gameobject is created with the name and added as a child. \r\n        /// Note, this is unlike Transform.Find in that it only searches for direct children, and does not traverse the hierarchy.\r\n        /// </summary>\r\n        /// <param name=\"go\"></param>\r\n        /// <param name=\"name\"></param>\r\n        /// <param name=\"bIgnoreCase\"></param>\r\n        /// <returns></returns>\r\n        public static Transform FindOrAddChild(this Transform trans, string name, bool bIgnoreCase)\r\n        {\r\n            if (trans == null) throw new System.ArgumentNullException(\"trans\");\r\n\r\n            Transform child = (from Transform c in trans where StringUtil.Equals(c.name, name, bIgnoreCase) select c).FirstOrDefault();\r\n\r\n            if (child == null)\r\n            {\r\n                var childGo = new GameObject(name);\r\n                child = childGo.transform;\r\n                child.parent = trans;\r\n                child.ZeroOut(false);\r\n            }\r\n\r\n            return child;\r\n        }\r\n\r\n        /// <summary>\r\n        /// This is similar to Find, but allows for arbitrary path definitions using the '*'.\r\n        /// </summary>\r\n        /// <param name=\"go\"></param>\r\n        /// <param name=\"spath\"></param>\r\n        /// <param name=\"bIgnoreCase\"></param>\r\n        /// <returns></returns>\r\n        public static GameObject Search(this GameObject go, string spath, bool bIgnoreCase = false)\r\n        {\r\n            var result = Search(go.transform, spath, bIgnoreCase);\r\n            if (result != null)\r\n                return result.gameObject;\r\n            else\r\n                return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// This is similar to Find, but allows for arbitrary path definitions using the '*'.\r\n        /// </summary>\r\n        /// <param name=\"trans\"></param>\r\n        /// <param name=\"spath\"></param>\r\n        /// <param name=\"bIgnoreCase\"></param>\r\n        /// <returns></returns>\r\n        public static Transform Search(this Transform trans, string spath, bool bIgnoreCase = false)\r\n        {\r\n            if (!spath.Contains(\"*\"))\r\n            {\r\n                return trans.Find(spath, bIgnoreCase);\r\n            }\r\n            else\r\n            {\r\n                var arr = spath.Split('/');\r\n                string sval;\r\n                spath = \"\";\r\n\r\n                for (int i = 0; i < arr.Length; i++)\r\n                {\r\n                    sval = arr[i];\r\n\r\n                    if (sval == \"*\")\r\n                    {\r\n                        if (spath != \"\")\r\n                        {\r\n                            trans = trans.Find(spath, bIgnoreCase);\r\n                            if (trans == null) return null;\r\n                            spath = \"\";\r\n                        }\r\n\r\n                        i++;\r\n                        if (i >= arr.Length)\r\n                            return (trans.childCount > 0) ? trans.GetChild(0) : null;\r\n                        else\r\n                        {\r\n                            sval = arr[i];\r\n                            //now we're going to do our recursing search\r\n                            trans = FindByName(trans, sval, bIgnoreCase);\r\n                            if (trans == null) return null;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (spath != \"\") spath += \"/\";\r\n                        spath += sval;\r\n                    }\r\n\r\n                }\r\n\r\n                return trans;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Recurses through all children until a child of some name is found.\r\n        /// </summary>\r\n        /// <param name=\"go\"></param>\r\n        /// <param name=\"sname\"></param>\r\n        /// <param name=\"bIgnoreCase\"></param>\r\n        /// <returns></returns>\r\n        public static GameObject FindByName(this GameObject go, string sname, bool bIgnoreCase = false)\r\n        {\r\n            if (go == null) return null;\r\n            var result = FindByName(go.transform, sname, bIgnoreCase);\r\n            if (result != null)\r\n                return result.gameObject;\r\n            else\r\n                return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Recurses through all children until a child of some name is found.\r\n        /// </summary>\r\n        /// <param name=\"trans\"></param>\r\n        /// <param name=\"sname\"></param>\r\n        /// <param name=\"bIgnoreCase\"></param>\r\n        /// <returns></returns>\r\n        public static Transform FindByName(this Transform trans, string sname, bool bIgnoreCase = false)\r\n        {\r\n            if (trans == null) return null;\r\n            foreach (var child in trans.IterateAllChildren())\r\n            {\r\n                if (StringUtil.Equals(child.name, sname, bIgnoreCase)) return child;\r\n            }\r\n            return null;\r\n        }\r\n\r\n        public static IEnumerable<GameObject> FindAllByName(string sname, bool bIgnoreCase = false)\r\n        {\r\n            foreach (var go in Object.FindObjectsOfType<GameObject>())\r\n            {\r\n                if (StringUtil.Equals(go.name, sname, bIgnoreCase)) yield return go;\r\n            }\r\n        }\r\n\r\n        public static void FindAllByName(string sname, ICollection<GameObject> results, bool bIgnoreCase = false)\r\n        {\r\n            if (results == null) throw new System.ArgumentNullException(\"results\");\r\n            \r\n            foreach (var go in Object.FindObjectsOfType<GameObject>())\r\n            {\r\n                if (StringUtil.Equals(go.name, sname, bIgnoreCase)) results.Add(go);\r\n            }\r\n        }\r\n\r\n\r\n        public static Transform[] FindAllByName(this Transform trans, string sname, bool bIgnoreCase = false)\r\n        {\r\n            if (trans == null) return ArrayUtil.Empty<Transform>();\r\n\r\n            using (var results = TempCollection.GetList<Transform>())\r\n            {\r\n                FindAllByName(trans, sname, results, bIgnoreCase);\r\n                return results.ToArray();\r\n            }\r\n        }\r\n\r\n        public static void FindAllByName(this Transform trans, string sname, ICollection<Transform> results, bool bIgnoreCase = false)\r\n        {\r\n            if (results == null) throw new System.ArgumentNullException(\"results\");\r\n            if (trans == null) return;\r\n            \r\n            using (var lst = TempCollection.GetList<Transform>())\r\n            {\r\n                trans.GetAllChildrenAndSelf(lst);\r\n                var e = lst.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (StringUtil.Equals(e.Current.name, sname, bIgnoreCase))\r\n                    {\r\n                        results.Add(e.Current);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static GameObject FindParentWithName(this GameObject go, string sname, bool bIgnoreCase = false)\r\n        {\r\n            if (go == null) return null;\r\n            var result = FindParentWithName(go.transform, sname, bIgnoreCase);\r\n            if (result != null)\r\n                return result.gameObject;\r\n            else\r\n                return null;\r\n        }\r\n\r\n        public static Transform FindParentWithName(this Transform trans, string sname, bool bIgnoreCase = false)\r\n        {\r\n            var p = trans.parent;\r\n            while(p != null)\r\n            {\r\n                if (StringUtil.Equals(p.name, sname, bIgnoreCase)) return p;\r\n                p = p.parent;\r\n            }\r\n            return null;\r\n        }\r\n\r\n        public static string GetPathNameRelativeTo(this GameObject go, Transform parent)\r\n        {\r\n            if (go == null) return null;\r\n            return GetPathNameRelativeTo(go.transform, parent);\r\n        }\r\n\r\n        public static string GetPathNameRelativeTo(this Transform t, Transform parent)\r\n        {\r\n            if (t == null) return null;\r\n            if (parent != null && !t.IsChildOf(parent)) return null;\r\n\r\n            var bldr = StringUtil.GetTempStringBuilder();\r\n            bldr.Append(t.name);\r\n            t = t.parent;\r\n            while(t != parent)\r\n            {\r\n                bldr.Insert(0, '/');\r\n                bldr.Insert(0, t.name);\r\n                t = t.parent;\r\n            }\r\n            return StringUtil.Release(bldr);\r\n        }\r\n\r\n        public static string GetFullPathName(this Transform t)\r\n        {\r\n            var bldr = StringUtil.GetTempStringBuilder();\r\n            bldr.Append(t.name);\r\n            t = t.parent;\r\n            while (t != null)\r\n            {\r\n                bldr.Insert(0, @\"\\\");\r\n                bldr.Insert(0, t.name);\r\n                t = t.parent;\r\n            }\r\n            return StringUtil.Release(bldr);\r\n        }\r\n\r\n#endregion\r\n\r\n#region Tags\r\n\r\n        /**\r\n         * Find\r\n         */\r\n\r\n        public static GameObject[] FindGameObjectsWithMultiTag(string tag)\r\n        {\r\n            if (tag == SPConstants.TAG_MULTITAG)\r\n            {\r\n                return GameObject.FindGameObjectsWithTag(SPConstants.TAG_MULTITAG);\r\n            }\r\n            else\r\n            {\r\n                using (var tmp = TempList<GameObject>.GetList())\r\n                {\r\n                    foreach (var go in GameObject.FindGameObjectsWithTag(tag)) tmp.Add(go);\r\n\r\n                    MultiTag.FindAll(tag, tmp);\r\n\r\n                    return tmp.ToArray();\r\n                }\r\n            }\r\n        }\r\n\r\n        public static int FindGameObjectsWithMultiTag(string tag, ICollection<UnityEngine.GameObject> coll)\r\n        {\r\n            if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n\r\n            int cnt = coll.Count;\r\n            if(tag == SPConstants.TAG_MULTITAG)\r\n            {\r\n                coll.AddRange(GameObject.FindGameObjectsWithTag(SPConstants.TAG_MULTITAG));\r\n            }\r\n            else\r\n            {\r\n                foreach (var go in GameObject.FindGameObjectsWithTag(tag)) coll.Add(go);\r\n\r\n                MultiTag.FindAll(tag, coll);\r\n            }\r\n            return coll.Count - cnt;\r\n        }\r\n\r\n        public static GameObject FindWithMultiTag(string tag)\r\n        {\r\n            if (tag == SPConstants.TAG_MULTITAG)\r\n            {\r\n                return GameObject.FindWithTag(SPConstants.TAG_MULTITAG);\r\n            }\r\n            else\r\n            {\r\n                var directHit = GameObject.FindWithTag(tag);\r\n                if (directHit != null) return directHit;\r\n\r\n                //MultiTag comp;\r\n                //foreach (var go in GameObject.FindGameObjectsWithTag(SPConstants.TAG_MULTITAG))\r\n                //{\r\n                //    if (go.GetComponent<MultiTag>(out comp))\r\n                //    {\r\n                //        if (comp.ContainsTag(tag)) return go;\r\n                //    }\r\n                //}\r\n\r\n                var comp = MultiTag.Find(tag);\r\n                return (comp != null) ? comp.gameObject : null;\r\n            }\r\n        }\r\n\r\n        public static GameObject FindWithMultiTag(this GameObject go, string tag)\r\n        {\r\n            if (MultiTagHelper.HasTag(go, tag)) return go;\r\n\r\n            foreach (var child in go.transform.IterateAllChildren())\r\n            {\r\n                if (MultiTagHelper.HasTag(child.gameObject, tag)) return child.gameObject;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static IEnumerable<GameObject> FindAllWithMultiTag(this GameObject go, string tag)\r\n        {\r\n            if (MultiTagHelper.HasTag(go)) yield return go;\r\n\r\n            foreach(var child in go.transform.IterateAllChildren())\r\n            {\r\n                if (MultiTagHelper.HasTag(child.gameObject, tag)) yield return child.gameObject;\r\n            }\r\n        }\r\n\r\n        /**\r\n         * FindParentWithTag\r\n         */\r\n\r\n        public static GameObject FindParentWithTag(this GameObject go, string stag)\r\n        {\r\n            if (go == null) return null;\r\n            return FindParentWithTag(go.transform, stag);\r\n        }\r\n\r\n        public static GameObject FindParentWithTag(this Component c, string stag)\r\n        {\r\n            if (c == null) return null;\r\n            return FindParentWithTag(c.transform, stag);\r\n        }\r\n\r\n        public static GameObject FindParentWithTag(this Transform t, string stag)\r\n        {\r\n            while(t != null)\r\n            {\r\n                if (MultiTagHelper.HasTag(t, stag)) return t.gameObject;\r\n                t = t.parent;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        /*\r\n         * ReduceToParent\r\n         */\r\n\r\n        public static IEnumerable<GameObject> ReduceToParentWithTag(this IEnumerable<GameObject> e, string tag, bool bdistinct = true)\r\n        {\r\n            if (bdistinct)\r\n            {\r\n                foreach (var obj in ReduceToParentWithTag(e, tag, false).Distinct()) yield return obj;\r\n            }\r\n            else\r\n            {\r\n                foreach (var obj in e)\r\n                {\r\n                    var o = FindParentWithTag(obj, tag);\r\n                    if (o != null) yield return o;\r\n                }\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<GameObject> ReduceToParentWithTag(this IEnumerable<Component> e, string tag, bool bdistinct = true)\r\n        {\r\n            if (bdistinct)\r\n            {\r\n                foreach (var obj in ReduceToParentWithTag(e, tag, false).Distinct()) yield return obj;\r\n            }\r\n            else\r\n            {\r\n                foreach (var obj in e)\r\n                {\r\n                    var o = FindParentWithTag(obj, tag);\r\n                    if (o != null) yield return o;\r\n                }\r\n            }\r\n        }\r\n\r\n#endregion\r\n\r\n#region Find Root\r\n        \r\n        /**\r\n         * FindTrueRoot\r\n         */\r\n\r\n        /// <summary>\r\n        /// Attempts to find a parent with a tag of 'Root', if none is found, null is returned.\r\n        /// </summary>\r\n        /// <param name=\"go\"></param>\r\n        /// <returns></returns>\r\n        public static GameObject FindTrueRoot(this GameObject go)\r\n        {\r\n            if (go == null) return null;\r\n\r\n            var entity = SPEntity.Pool.GetFromSource(go);\r\n            if (entity != null)\r\n                return entity.gameObject;\r\n            else\r\n                return FindParentWithTag(go.transform, SPConstants.TAG_ROOT);\r\n        }\r\n\r\n        public static GameObject FindTrueRoot(this Component c)\r\n        {\r\n            if (c == null) return null;\r\n\r\n            var entity = SPEntity.Pool.GetFromSource(c);\r\n            if (entity != null)\r\n                return entity.gameObject;\r\n            else\r\n                return FindParentWithTag(c.transform, SPConstants.TAG_ROOT);\r\n        }\r\n\r\n        /**\r\n         * FindRoot\r\n         */\r\n\r\n        /// <summary>\r\n        /// Attempts to find a parent with a tag of 'Root', if none is found, self is returned.\r\n        /// </summary>\r\n        /// <param name=\"go\"></param>\r\n        /// <returns></returns>\r\n        public static GameObject FindRoot(this GameObject go)\r\n        {\r\n            if (go == null) return null;\r\n            \r\n            var entity = SPEntity.Pool.GetFromSource(go);\r\n            if (entity != null)\r\n                return entity.gameObject;\r\n            else\r\n            {\r\n                var root = FindParentWithTag(go.transform, SPConstants.TAG_ROOT);\r\n                return (root != null) ? root : go; //we return self if no root was found...\r\n            }\r\n        }\r\n\r\n        public static GameObject FindRoot(this Component c)\r\n        {\r\n            if (c == null) return null;\r\n\r\n            var entity = SPEntity.Pool.GetFromSource(c);\r\n            if (entity != null)\r\n                return entity.gameObject;\r\n            else\r\n            {\r\n                var root = FindParentWithTag(c.transform, SPConstants.TAG_ROOT);\r\n                return (root != null) ? root : c.gameObject;\r\n            }\r\n        }\r\n\r\n\r\n        /**\r\n         * ReduceToRoot IEnum\r\n         */\r\n\r\n        public static IEnumerable<GameObject> ReduceToRoot(this IEnumerable<GameObject> e, bool bdistinct = true)\r\n        {\r\n            if (bdistinct)\r\n            {\r\n                foreach (var obj in ReduceToRoot(e, false).Distinct()) yield return obj;\r\n            }\r\n            else\r\n            {\r\n                foreach (var obj in e)\r\n                {\r\n                    yield return FindRoot(obj);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<GameObject> ReduceToRoot(this IEnumerable<Component> e, bool bdistinct = true)\r\n        {\r\n            if (bdistinct)\r\n            {\r\n                foreach (var obj in ReduceToRoot(e, false).Distinct()) yield return obj;\r\n            }\r\n            else\r\n            {\r\n                foreach (var obj in e)\r\n                {\r\n                    yield return FindRoot(obj);\r\n                }\r\n            }\r\n        }\r\n\r\n#endregion\r\n\r\n#region RigidBody Parenting\r\n\r\n        public static Rigidbody FindRigidbody(this GameObject go, bool stopAtRoot = false)\r\n        {\r\n            if (go == null) return null;\r\n\r\n            var rb = go.GetComponent<Rigidbody>();\r\n            if (rb != null) return rb;\r\n\r\n            foreach (var p in go.GetParents(stopAtRoot))\r\n            {\r\n                rb = p.GetComponent<Rigidbody>();\r\n                if (rb != null) return rb;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static Rigidbody FindRigidbody(this Component comp, bool stopAtRoot = false)\r\n        {\r\n            if (comp == null) return null;\r\n            return FindRigidbody(comp.gameObject, stopAtRoot);\r\n        }\r\n\r\n#endregion\r\n\r\n#region Parenting\r\n\r\n        public static GameObject SetParent(this GameObject obj, Transform parent)\r\n        {\r\n            obj.transform.parent = parent;\r\n            return obj;\r\n        }\r\n\r\n        public static Transform SetParent(this Transform obj, Transform parent)\r\n        {\r\n            obj.parent = parent;\r\n            return obj;\r\n        }\r\n\r\n        public static IEnumerable<Transform> IterateAllChildren(this Transform trans)\r\n        {\r\n            for(int i = 0; i < trans.childCount; i++)\r\n            {\r\n                yield return trans.GetChild(i);\r\n            }\r\n            \r\n            for(int i = 0; i < trans.childCount; i++)\r\n            {\r\n                foreach (var c in IterateAllChildren(trans.GetChild(i)))\r\n                    yield return c;\r\n            }\r\n        }\r\n\r\n        public static Transform[] GetAllChildren(this GameObject go)\r\n        {\r\n            if (go == null) return null;\r\n            return GetAllChildren(go.transform);\r\n        }\r\n\r\n        public static Transform[] GetAllChildren(this Component c)\r\n        {\r\n            if (c == null) return null;\r\n            return GetAllChildren(c.transform);\r\n        }\r\n\r\n        public static Transform[] GetAllChildren(this Transform t)\r\n        {\r\n            using (var lst = TempCollection.GetList<Transform>())\r\n            {\r\n                GetAllChildren(t, lst);\r\n\r\n                return lst.ToArray();\r\n            }\r\n        }\r\n\r\n        public static void GetAllChildren(this Transform t, ICollection<Transform> coll)\r\n        {\r\n            if(coll is IList<Transform>)\r\n            {\r\n                GetAllChildren(t, coll as IList<Transform>);\r\n            }\r\n            else\r\n            {\r\n                using (var lst = TempCollection.GetList<Transform>())\r\n                {\r\n                    GetAllChildren(t, lst);\r\n                    var e = lst.GetEnumerator();\r\n                    while (e.MoveNext()) coll.Add(e.Current);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void GetAllChildren(this Transform t, IList<Transform> lst)\r\n        {\r\n            int i = lst.Count;\r\n            \r\n            for(int j = 0; j < t.childCount; j++)\r\n            {\r\n                lst.Add(t.GetChild(j));\r\n            }\r\n\r\n            while (i < lst.Count)\r\n            {\r\n                t = lst[i];\r\n                for (int j = 0; j < t.childCount; j++)\r\n                {\r\n                    lst.Add(t.GetChild(j));\r\n                }\r\n                i++;\r\n            }\r\n        }\r\n\r\n        public static Transform[] GetAllChildrenAndSelf(this GameObject go)\r\n        {\r\n            if (go == null) return null;\r\n            return GetAllChildrenAndSelf(go.transform);\r\n        }\r\n\r\n        public static Transform[] GetAllChildrenAndSelf(this Component c)\r\n        {\r\n            if (c == null) return null;\r\n            return GetAllChildrenAndSelf(c.transform);\r\n        }\r\n\r\n        public static Transform[] GetAllChildrenAndSelf(this Transform t)\r\n        {\r\n            using (var lst = TempCollection.GetList<Transform>())\r\n            {\r\n                GetAllChildrenAndSelf(t, lst);\r\n                return lst.ToArray();\r\n            }\r\n        }\r\n\r\n        public static void GetAllChildrenAndSelf(this Transform t, ICollection<Transform> coll)\r\n        {\r\n            if (coll is IList<Transform>)\r\n            {\r\n                GetAllChildrenAndSelf(t, coll as IList<Transform>);\r\n            }\r\n            else\r\n            {\r\n                using (var lst = TempCollection.GetList<Transform>())\r\n                {\r\n                    GetAllChildrenAndSelf(t, lst);\r\n                    var e = lst.GetEnumerator();\r\n                    while (e.MoveNext()) coll.Add(e.Current);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void GetAllChildrenAndSelf(this Transform t, IList<Transform> lst)\r\n        {\r\n            int i = lst.Count;\r\n            lst.Add(t);\r\n\r\n            while (i < lst.Count)\r\n            {\r\n                t = lst[i];\r\n                for(int j = 0; j < t.childCount; j++)\r\n                {\r\n                    lst.Add(t.GetChild(j));\r\n                }\r\n                i++;\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<Transform> GetParents(this GameObject go, bool stopAtRoot = false)\r\n        {\r\n            if (go == null) return null;\r\n            return GetParents(go.transform, stopAtRoot);\r\n        }\r\n\r\n        public static IEnumerable<Transform> GetParents(this Component c, bool stopAtRoot = false)\r\n        {\r\n            if (c == null) return null;\r\n            return GetParents(c.transform, stopAtRoot);\r\n        }\r\n\r\n        public static IEnumerable<Transform> GetParents(this Transform t, bool stopAtRoot = false)\r\n        {\r\n            if (stopAtRoot)\r\n            {\r\n                if (t.HasTag(SPConstants.TAG_ROOT)) yield break;\r\n\r\n                t = t.parent;\r\n                while (t != null)\r\n                {\r\n                    yield return t;\r\n                    if (t.HasTag(SPConstants.TAG_ROOT)) yield break;\r\n                    t = t.parent;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                t = t.parent;\r\n                while (t != null)\r\n                {\r\n                    yield return t;\r\n                    t = t.parent;\r\n                }\r\n            }\r\n        }\r\n\r\n        // ##############\r\n        // Is Parent\r\n        // ##########\r\n\r\n        public static bool IsParentOf(this GameObject parent, GameObject possibleChild)\r\n        {\r\n            if (parent == null || possibleChild == null) return false;\r\n            return possibleChild.transform.IsChildOf(parent.transform);\r\n        }\r\n\r\n        public static bool IsParentOf(this Transform parent, GameObject possibleChild)\r\n        {\r\n            if (parent == null || possibleChild == null) return false;\r\n            return possibleChild.transform.IsChildOf(parent);\r\n        }\r\n\r\n        public static bool IsParentOf(this GameObject parent, Transform possibleChild)\r\n        {\r\n            if (parent == null || possibleChild == null) return false;\r\n            return possibleChild.IsChildOf(parent.transform);\r\n        }\r\n\r\n        public static bool IsParentOf(this Transform parent, Transform possibleChild)\r\n        {\r\n            if (parent == null || possibleChild == null) return false;\r\n            /*\r\n             * Since implementation of this, Unity has since added 'IsChildOf' that is far superior in efficiency\r\n             * \r\n            while (possibleChild != null)\r\n            {\r\n                if (parent == possibleChild.parent) return true;\r\n                possibleChild = possibleChild.parent;\r\n            }\r\n            return false;\r\n            */\r\n\r\n            return possibleChild.IsChildOf(parent);\r\n        }\r\n\r\n        // ##############\r\n        // Add Child\r\n        // ##########\r\n\r\n        /// <summary>\r\n        /// Set the parent of some GameObject to this GameObject.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"child\"></param>\r\n        /// <param name=\"suppressChangeHierarchyMessage\"></param>\r\n        public static GameObject AddChild(this GameObject obj, GameObject child)\r\n        {\r\n            if (child == null) throw new System.ArgumentNullException(\"child\");\r\n\r\n            var p = (obj != null) ? obj.transform : null;\r\n            child.transform.parent = p;\r\n            return obj;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Set the parent of some GameObject to this GameObject.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"child\"></param>\r\n        public static GameObject AddChild(this GameObject obj, Transform child)\r\n        {\r\n            if (child == null) throw new System.ArgumentNullException(\"child\");\r\n\r\n            var p = (obj != null) ? obj.transform : null;\r\n            child.transform.parent = p;\r\n            return obj;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Set the parent of some GameObject to this GameObject.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"child\"></param>\r\n        public static Transform AddChild(this Transform obj, GameObject child)\r\n        {\r\n            if (child == null) throw new System.ArgumentNullException(\"child\");\r\n\r\n            child.transform.parent = obj;\r\n            return obj;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Set the parent of some GameObject to this GameObject.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"child\"></param>\r\n        public static Transform AddChild(this Transform obj, Transform child)\r\n        {\r\n            if (child == null) throw new System.ArgumentNullException(\"child\");\r\n\r\n            child.transform.parent = obj;\r\n            return obj;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Sets the parent property of this GameObject to null.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        public static GameObject RemoveFromParent(this GameObject obj)\r\n        {\r\n            if (obj == null) throw new System.ArgumentNullException(\"obj\");\r\n\r\n            var t = obj.transform;\r\n            t.parent = null;\r\n            return obj;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Sets the parent property of this GameObject to null.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        public static Transform RemoveFromParent(this Transform obj)\r\n        {\r\n            if (obj == null) throw new System.ArgumentNullException(\"obj\");\r\n\r\n            obj.transform.parent = null;\r\n            return obj;\r\n        }\r\n\r\n#endregion\r\n\r\n#region Transform\r\n\r\n        public static void ZeroOut(this GameObject go, bool bIgnoreScale, bool bGlobal = false)\r\n        {\r\n            if (bGlobal)\r\n            {\r\n                go.transform.position = Vector3.zero;\r\n                go.transform.rotation = Quaternion.identity;\r\n                if (!bIgnoreScale) go.transform.localScale = Vector3.one;\r\n            }\r\n            else\r\n            {\r\n                go.transform.localPosition = Vector3.zero;\r\n                go.transform.localRotation = Quaternion.identity;\r\n                if (!bIgnoreScale) go.transform.localScale = Vector3.one;\r\n            }\r\n\r\n            var rb = go.GetComponent<Rigidbody>();\r\n            if (rb != null && !rb.isKinematic)\r\n            {\r\n                rb.velocity = Vector3.zero;\r\n                rb.angularVelocity = Vector3.zero;\r\n\r\n            }\r\n        }\r\n\r\n        public static void ZeroOut(this Transform trans, bool bIgnoreScale, bool bGlobal = false)\r\n        {\r\n            if (bGlobal)\r\n            {\r\n                trans.position = Vector3.zero;\r\n                trans.rotation = Quaternion.identity;\r\n                if (!bIgnoreScale) trans.localScale = Vector3.one;\r\n            }\r\n            else\r\n            {\r\n                trans.localPosition = Vector3.zero;\r\n                trans.localRotation = Quaternion.identity;\r\n                if (!bIgnoreScale) trans.localScale = Vector3.one;\r\n            }\r\n        }\r\n\r\n        public static void ZeroOut(this Rigidbody body)\r\n        {\r\n            if (body.isKinematic) return;\r\n\r\n            body.velocity = Vector3.zero;\r\n            body.angularVelocity = Vector3.zero;\r\n        }\r\n\r\n        public static void CopyTransform(GameObject src, GameObject dst, bool bSetScale = false)\r\n        {\r\n            if (src == null) throw new System.ArgumentNullException(\"src\");\r\n            if (dst == null) throw new System.ArgumentNullException(\"dst\");\r\n            CopyTransform(src.transform, dst.transform);\r\n        }\r\n\r\n        public static void CopyTransform(Transform src, Transform dst, bool bSetScale = false)\r\n        {\r\n            if (src == null) throw new System.ArgumentNullException(\"src\");\r\n            if (dst == null) throw new System.ArgumentNullException(\"dst\");\r\n\r\n            Trans.GetGlobal(src).SetToGlobal(dst, bSetScale);\r\n\r\n            foreach (Transform child in dst)\r\n            {\r\n                //match the transform by name\r\n                var srcChild = src.Find(child.name);\r\n                if (srcChild != null) CopyTransform(srcChild, child);\r\n            }\r\n        }\r\n\r\n#endregion\r\n\r\n\r\n\r\n\r\n        public static bool Equals(this object obj, params object[] any)\r\n        {\r\n            return System.Array.IndexOf(any, obj) >= 0;\r\n        }\r\n\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/Gizmo/GizmoGhost.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Utils.Gizmo\r\n{\r\n    \r\n    [ExecuteInEditMode()]\r\n    public class GizmoGhost : Singleton\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private const float DUR_LIFE = 5f;\r\n\r\n        private static GizmoGhost _instance;\r\n        private static GizmoGhost Instance\r\n        {\r\n            get\r\n            {\r\n                if (_instance == null) _instance = Singleton.CreateSpecialInstance<GizmoGhost>(\"Spacepuppy.GizmoGhost\", SingletonLifeCycleRule.LivesForever);\r\n                return _instance;\r\n            }\r\n        }\r\n\r\n        private List<DrawHandle> _handles = new List<DrawHandle>();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnValidAwake()\r\n        {\r\n            if (!Application.isEditor)\r\n            {\r\n                if (this.gameObject == Singleton.GetGameObjectSource(false))\r\n                    Object.Destroy(this);\r\n                else\r\n                    Object.Destroy(this.gameObject);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public static void DrawCube(Color c, Vector3 center, Vector3 size)\r\n        {\r\n            if (!Application.isEditor) return;\r\n\r\n            GizmoGhost.Instance._handles.Add(new DrawHandle(() =>\r\n            {\r\n                Gizmos.color = c;\r\n                Gizmos.DrawCube(center, size);\r\n            }, DUR_LIFE));\r\n        }\r\n\r\n        public static void DrawSphere(Color c, Vector3 center, float radius)\r\n        {\r\n            if (!Application.isEditor) return;\r\n\r\n            GizmoGhost.Instance._handles.Add(new DrawHandle(() =>\r\n            {\r\n                Gizmos.color = c;\r\n                Gizmos.DrawSphere(center, radius);\r\n            }, DUR_LIFE));\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region Messages\r\n\r\n        private void Update()\r\n        {\r\n            if (!Application.isEditor) return;\r\n\r\n            for(int i = 0; i < _handles.Count; i++)\r\n            {\r\n                _handles[i].Life -= Time.deltaTime;\r\n                if(_handles[i].Life <= 0f)\r\n                {\r\n                    _handles.RemoveAt(i);\r\n                    i--;\r\n                }\r\n            }\r\n        }\r\n\r\n        private void OnDrawGizmos()\r\n        {\r\n            if (!Application.isEditor) return;\r\n\r\n            for(int i = 0; i <_handles.Count; i++)\r\n            {\r\n                _handles[i].Draw();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private class DrawHandle\r\n        {\r\n\r\n            public float Life;\r\n            public System.Action Draw;\r\n\r\n            public DrawHandle(System.Action act, float lifeTime)\r\n            {\r\n                this.Draw = act;\r\n                this.Life = lifeTime;\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/InvokeHandle.cs",
    "content": "﻿using System;\nusing com.spacepuppy.Collections;\n\nnamespace com.spacepuppy.Utils\n{\n\n    /// <summary>\n    /// Waits a duration of time and then calls a System.Action.\n    /// \n    /// This can accept a System.Collections.IEnumerator just like a Coroutine, but it does not respect any yield instructions. All yielded objects wait a single frame.\n    /// </summary>\n    public sealed class InvokeHandle : IUpdateable, IRadicalWaitHandle, IDisposable\n    {\n\n        #region Fields\n\n        private UpdatePump _pump;\n        private System.Action _callback;\n        private System.Collections.IEnumerator _handle;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        private InvokeHandle()\n        {\n\n        }\n\n        #endregion\n\n        #region IUpdateable Interface\n\n        void IUpdateable.Update()\n        {\n            if(_handle == null || !_handle.MoveNext())\n            {\n                var d = _callback;\n                this.Dispose();\n                if (d != null) d();\n            }\n        }\n\n        #endregion\n\n        #region IRadicalWaitHandle Interface\n\n        bool IRadicalWaitHandle.Cancelled\n        {\n            get { return false; }\n        }\n\n        public bool IsComplete\n        {\n            get { return _handle == null; }\n        }\n\n        void IRadicalWaitHandle.OnComplete(System.Action<IRadicalWaitHandle> callback)\n        {\n            if (_handle == null || callback == null) return;\n\n            _callback += () => callback(this);\n        }\n\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\n        {\n            yieldObject = null;\n            return _handle != null;\n        }\n\n        #endregion\n\n        #region ISPDisposable Interface\n\n        public void Dispose()\n        {\n            if (_pump != null) _pump.Remove(this);\n            _pump = null;\n            _callback = null;\n            if (_handle is IPooledYieldInstruction) (_handle as IPooledYieldInstruction).Dispose();\n            _handle = null;\n            _pool.Release(this);\n        }\n\n        #endregion\n\n        #region Static Factory\n\n        private static ObjectCachePool<InvokeHandle> _pool = new ObjectCachePool<InvokeHandle>(-1, () => new InvokeHandle());\n\n        public static InvokeHandle Begin(UpdatePump pump, System.Action callback, float duration, ITimeSupplier time)\n        {\n            if (pump == null) throw new System.ArgumentNullException(\"pump\");\n\n            var handle = _pool.GetInstance();\n            handle._callback = callback;\n            handle._handle = WaitForDuration.Seconds(duration, time);\n            handle._pump = pump;\n\n            pump.Add(handle);\n\n            return handle;\n        }\n\n        public static InvokeHandle Begin(UpdatePump pump, System.Action callback, System.Collections.IEnumerator e)\n        {\n            if (pump == null) throw new System.ArgumentNullException(\"pump\");\n\n            var handle = _pool.GetInstance();\n            handle._callback = callback;\n            handle._handle = e;\n            handle._pump = pump;\n\n            pump.Add(handle);\n\n            return handle;\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Utils/LayerUtil.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class LayerUtil\r\n    {\r\n\r\n        private static List<int> layerNumbers;\r\n        private static List<string> layerNames;\r\n        private static long lastUpdateTick;\r\n\r\n        private static void TestUpdateLayers()\r\n        {\r\n            if (layerNumbers == null || (System.DateTime.UtcNow.Ticks - lastUpdateTick > 10000000L && Event.current.type == EventType.Layout))\r\n            {\r\n                lastUpdateTick = System.DateTime.UtcNow.Ticks;\r\n                if (layerNumbers == null)\r\n                {\r\n                    layerNumbers = new List<int>();\r\n                    layerNames = new List<string>();\r\n                }\r\n                else\r\n                {\r\n                    layerNumbers.Clear();\r\n                    layerNames.Clear();\r\n                }\r\n\r\n                for (int i = 0; i < 32; i++)\r\n                {\r\n                    string layerName = LayerMask.LayerToName(i);\r\n\r\n                    if (layerName != \"\")\r\n                    {\r\n                        layerNumbers.Add(i);\r\n                        layerNames.Add(layerName);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static string[] GetLayerNames()\r\n        {\r\n            TestUpdateLayers();\r\n\r\n            return layerNames.ToArray();\r\n        }\r\n\r\n        public static string[] GetAllLayerNames()\r\n        {\r\n            TestUpdateLayers();\r\n\r\n            string[] names = new string[32];\r\n            for (int i = 0; i < 32; i++)\r\n            {\r\n                if (layerNumbers.Contains(i))\r\n                {\r\n                    names[i] = LayerMask.LayerToName(i);\r\n                }\r\n                else\r\n                {\r\n                    names[i] = \"Layer \" + i.ToString();\r\n                }\r\n            }\r\n            return names;\r\n        }\r\n\r\n        public static bool Intersects(this LayerMask mask, int layer)\r\n        {\r\n            return (mask.value & (1 << layer)) != 0;\r\n        }\r\n\r\n        public static bool Intersects(this LayerMask mask, GameObject go)\r\n        {\r\n            return (mask.value & (1 << go.layer)) != 0;\r\n        }\r\n\r\n        public static bool Intersects(this LayerMask mask, Component c)\r\n        {\r\n            return (mask.value & (1 << c.gameObject.layer)) != 0;\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/MathUtil.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    /// <summary>\r\n    /// A port of the LoDMath static member class written in AS3 under the MIT license agreement.\r\n    /// \r\n    /// A collection of math functions that can be very useful for many things.\r\n    /// \r\n    /// \r\n    /// As per the license agrrement of the lodGameBox license agreement\r\n    /// \r\n    /// Copyright (c) 2009 Dylan Engelman\r\n    ///\r\n    ///Permission is hereby granted, free of charge, to any person obtaining a copy\r\n    ///of this software and associated documentation files (the \"Software\"), to deal\r\n    ///in the Software without restriction, including without limitation the rights\r\n    ///to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n    ///copies of the Software, and to permit persons to whom the Software is\r\n    ///furnished to do so, subject to the following conditions:\r\n    ///\r\n    ///The above copyright notice and this permission notice shall be included in\r\n    ///all copies or substantial portions of the Software.\r\n    ///\r\n    ///THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n    ///IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n    ///FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n    ///AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n    ///LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n    ///OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n    ///THE SOFTWARE.\r\n    /// \r\n    /// http://code.google.com/p/lodgamebox/source/browse/trunk/com/lordofduct/util/LoDMath.as\r\n    /// </summary>\r\n    /// <remarks>\r\n    /// \r\n    /// </remarks>\r\n    public static class MathUtil\r\n    {\r\n\r\n        #region \"Public ReadOnly Properties\"\r\n\r\n        // Number pi\r\n        public const float PI = 3.14159265358979f;\r\n        // PI / 2 OR 90 deg\r\n        public const float PI_2 = 1.5707963267949f;\r\n        // PI / 2 OR 60 deg\r\n        public const float PI_3 = 1.04719755119659666667f;\r\n        // PI / 4 OR 45 deg\r\n        public const float PI_4 = 0.785398163397448f;\r\n        // PI / 8 OR 22.5 deg\r\n        public const float PI_8 = 0.392699081698724f;\r\n        // PI / 16 OR 11.25 deg\r\n        public const float PI_16 = 0.196349540849362f;\r\n        // 2 * PI OR 180 deg\r\n        public const float TWO_PI = 6.28318530717959f;\r\n        // 3 * PI_2 OR 270 deg\r\n        public const float THREE_PI_2 = 4.71238898038469f;\r\n        // Number e\r\n        public const float E = 2.71828182845905f;\r\n        // ln(10)\r\n        public const float LN10 = 2.30258509299405f;\r\n        // ln(2)\r\n        public const float LN2 = 0.693147180559945f;\r\n        // logB10(e)\r\n        public const float LOG10E = 0.434294481903252f;\r\n        // logB2(e)\r\n        public const float LOG2E = 1.44269504088896f;\r\n        // sqrt( 1 / 2 )\r\n        public const float SQRT1_2 = 0.707106781186548f;\r\n        // sqrt( 2 )\r\n        public const float SQRT2 = 1.4142135623731f;\r\n        // PI / 180\r\n        public const float DEG_TO_RAD = 0.0174532925199433f;\r\n        //  180.0 / PI\r\n        public const float RAD_TO_DEG = 57.2957795130823f;\r\n\r\n        // 2^16\r\n        public const int B_16 = 65536;\r\n        // 2^31\r\n        public const long B_31 = 2147483648L;\r\n        // 2^32\r\n        public const long B_32 = 4294967296L;\r\n        // 2^48\r\n        public const long B_48 = 281474976710656L;\r\n        // 2^53 !!NOTE!! largest accurate double floating point whole value\r\n        public const long B_53 = 9007199254740992L;\r\n        // 2^63\r\n        public const ulong B_63 = 9223372036854775808;\r\n        //18446744073709551615 or 2^64 - 1 or ULong.MaxValue...\r\n        public const ulong B_64_m1 = ulong.MaxValue;\r\n\r\n        //  1.0/3.0\r\n        public const float ONE_THIRD = 0.333333333333333f;\r\n        //  2.0/3.0\r\n        public const float TWO_THIRDS = 0.666666666666667f;\r\n        //  1.0/6.0\r\n        public const float ONE_SIXTH = 0.166666666666667f;\r\n\r\n        // COS( PI / 3 )\r\n        public const float COS_PI_3 = 0.866025403784439f;\r\n        //  SIN( 2*PI/3 )\r\n        public const float SIN_2PI_3 = 0.03654595f;\r\n\r\n        // 4*(Math.sqrt(2)-1)/3.0\r\n        public const float CIRCLE_ALPHA = 0.552284749830793f;\r\n\r\n        public const bool ONN = true;\r\n\r\n        public const bool OFF = false;\r\n        // round integer epsilon\r\n        public const float SHORT_EPSILON = 0.1f;\r\n        // percentage epsilon\r\n        public const float PERC_EPSILON = 0.001f;\r\n        // single float average epsilon\r\n        public const float EPSILON = 0.0001f;\r\n        public const float EPSILON_SQR = 0.0000001f;\r\n        public const double DBL_EPSILON = 9.99999943962493E-11;\r\n\r\n        public static readonly float MACHINE_SNG_EPSILON = MathUtil.ComputeMachineEpsilon();\r\n\r\n        public static float ComputeMachineEpsilon()\r\n        {\r\n            float fourThrids = 4.0f / 3.0f;\r\n            float third = fourThrids - 1.0f;\r\n            float one = third + third + third;\r\n            return Math.Abs(1.0f - one);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region \"Public Shared Methods\"\r\n\r\n        public static bool IsReal(float f)\r\n        {\r\n            return !float.IsNaN(f) && !float.IsNegativeInfinity(f) && !float.IsPositiveInfinity(f);\r\n        }\r\n\r\n        public static bool IsReal(double f)\r\n        {\r\n            return !double.IsNaN(f) && !double.IsNegativeInfinity(f) && !double.IsPositiveInfinity(f);\r\n        }\r\n        \r\n        /// <summary>\r\n        /// This exists because Mathf.Sign returns 1 when the input value is 0. I'm personally used to the System.Math.Sign method that returns 0 on 0.\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <returns></returns>\r\n        public static float Sign(float value)\r\n        {\r\n            if (float.IsNaN(value)) return float.NaN;\r\n            if (value == 0f) return 0f;\r\n            return (value > 0f) ? 1.0f : -1.0f;\r\n        }\r\n\r\n        /// <summary>\r\n        /// This is an overload of MathUtil.Sign that allows defining what is returned on 0. This is nice if you are checking if 0 was returned anyways and changing the value.\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <param name=\"valueOnZero\"></param>\r\n        /// <returns></returns>\r\n        public static float Sign(float value, float valueOnZero)\r\n        {\r\n            if (float.IsNaN(value)) return float.NaN;\r\n            if (value == 0f) return valueOnZero;\r\n            return (value > 0f) ? 1.0f : -1.0f;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Calculates the integral part of a float\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float Truncate(float value)\r\n        {\r\n            return (float)Math.Truncate(value);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns the fractional part of a float.\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float Shear(float value)\r\n        {\r\n            return value % 1.0f;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns if the value is in between or equal to max and min\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <param name=\"max\"></param>\r\n        /// <param name=\"min\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static bool InRange(float value, float max, float min = 0f)\r\n        {\r\n            if (max < min) return (value >= max && value <= min);\r\n            else return (value >= min && value <= max);\r\n\r\n        }\r\n        \r\n        public static bool InRange(int value, int max, int min = 0)\r\n        {\r\n            if (max < min) return (value >= max && value <= min);\r\n            else return (value >= min && value <= max);\r\n        }\r\n        \r\n        public static bool InRangeExclusive(float value, float max, float min = 0f)\r\n        {\r\n            if (max < min) return (value > max && value < min);\r\n            else return (value > min && value < max);\r\n        }\r\n        \r\n        /// <summary>\r\n        /// Returns if the value is a valid index in list of length 'bound'.\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <param name=\"max\"></param>\r\n        /// <param name=\"min\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static bool InBounds(int value, int bound)\r\n        {\r\n            return (value >= 0 && value < bound);\r\n        }\r\n\r\n        public static bool IsPowerOfTwo(ulong value)\r\n        {\r\n            return value != 0 && (value & (value - 1)) == 0;\r\n        }\r\n\r\n        #region \"series\"\r\n\r\n        /// <summary>\r\n        /// Sums a series of numeric values passed as a param array...\r\n        /// \r\n        /// MathUtil.Sum(1,2,3,4) == 10\r\n        /// </summary>\r\n        /// <param name=\"arr\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static short Sum(params short[] arr)\r\n        {\r\n            short result = 0;\r\n\r\n            foreach (short value in arr)\r\n            {\r\n                result += value;\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Sums a series of numeric values passed as a param array...\r\n        /// \r\n        /// MathUtil.Sum(1,2,3,4) == 10\r\n        /// </summary>\r\n        /// <param name=\"arr\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static int Sum(params int[] arr)\r\n        {\r\n            int result = 0;\r\n\r\n            foreach (int value in arr)\r\n            {\r\n                result += value;\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        public static int Sum(int[] arr, int startIndex, int endIndex)\r\n        {\r\n            int result = 0;\r\n\r\n            for (int i = startIndex; i <= Math.Min(endIndex, arr.Length - 1); i++)\r\n            {\r\n                result += arr[i];\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        public static int Sum(int[] arr, int startIndex)\r\n        {\r\n            return Sum(arr, startIndex, int.MaxValue);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Sums a series of numeric values passed as a param array...\r\n        /// \r\n        /// MathUtil.Sum(1,2,3,4) == 10\r\n        /// </summary>\r\n        /// <param name=\"arr\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static long Sum(params long[] arr)\r\n        {\r\n            long result = 0;\r\n\r\n            foreach (long value in arr)\r\n            {\r\n                result += value;\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Sums a series of numeric values passed as a param array...\r\n        /// \r\n        /// MathUtil.Sum(1,2,3,4) == 10\r\n        /// </summary>\r\n        /// <param name=\"arr\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float Sum(params float[] arr)\r\n        {\r\n            float result = 0;\r\n\r\n            foreach (float value in arr)\r\n            {\r\n                result += value;\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n\r\n        /// <summary>\r\n        /// Multiplies a series of numeric values passed as a param array...\r\n        /// \r\n        /// MathUtil.Product(2,3,4) == 24\r\n        /// </summary>\r\n        /// <param name=\"arr\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float Product(params short[] arr)\r\n        {\r\n            if (arr == null || arr.Length == 0)\r\n                return float.NaN;\r\n\r\n            float result = 1;\r\n\r\n            foreach (short value in arr)\r\n            {\r\n                result *= value;\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiplies a series of numeric values passed as a param array...\r\n        /// \r\n        /// MathUtil.Product(2,3,4) == 24\r\n        /// </summary>\r\n        /// <param name=\"arr\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float Product(params int[] arr)\r\n        {\r\n            if (arr == null || arr.Length == 0)\r\n                return float.NaN;\r\n\r\n            float result = 1;\r\n\r\n            foreach (int value in arr)\r\n            {\r\n                result *= value;\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiplies a series of numeric values passed as a param array...\r\n        /// \r\n        /// MathUtil.ProductSeries(2,3,4) == 24\r\n        /// </summary>\r\n        /// <param name=\"arr\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float Product(params long[] arr)\r\n        {\r\n            if (arr == null || arr.Length == 0)\r\n                return float.NaN;\r\n\r\n            float result = 1;\r\n\r\n            foreach (long value in arr)\r\n            {\r\n                result *= value;\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiplies a series of numeric values passed as a param array...\r\n        /// \r\n        /// MathUtil.ProductSeries(2,3,4) == 24\r\n        /// </summary>\r\n        /// <param name=\"arr\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float Product(params float[] arr)\r\n        {\r\n            if (arr == null || arr.Length == 0)\r\n                return float.NaN;\r\n\r\n            float result = 1f;\r\n\r\n            foreach (float value in arr)\r\n            {\r\n                result *= value;\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        public static float Product(this IEnumerable<float> coll)\r\n        {\r\n            if (coll == null) return float.NaN;\r\n\r\n            float result = 1f;\r\n            foreach(float value in coll)\r\n            {\r\n                result *= value;\r\n            }\r\n            return result;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region \"Value interpolating and warping\"\r\n\r\n        /// <summary>\r\n        /// The average of an array of values\r\n        /// </summary>\r\n        /// <param name=\"values\">An array of values</param>\r\n        /// <returns>the average</returns>\r\n        /// <remarks></remarks>\r\n        public static float Average(params short[] values)\r\n        {\r\n            float avg = 0;\r\n\r\n            foreach (float value in values)\r\n            {\r\n                avg += value;\r\n            }\r\n\r\n            return avg / values.Length;\r\n        }\r\n\r\n        public static float Average(params int[] values)\r\n        {\r\n            float avg = 0;\r\n\r\n            foreach (float value in values)\r\n            {\r\n                avg += value;\r\n            }\r\n\r\n            return avg / values.Length;\r\n        }\r\n\r\n        public static float Average(params long[] values)\r\n        {\r\n            float avg = 0;\r\n\r\n            foreach (float value in values)\r\n            {\r\n                avg += value;\r\n            }\r\n\r\n            return avg / values.Length;\r\n        }\r\n\r\n        public static float Average(float a, float b)\r\n        {\r\n            return (a + b) / 2f;\r\n        }\r\n\r\n        public static float Average(float a, float b, float c)\r\n        {\r\n            return (a + b + c) / 3f;\r\n        }\r\n\r\n        public static float Average(float a, float b, float c, float d)\r\n        {\r\n            return (a + b + c + d) / 4f;\r\n        }\r\n\r\n        public static float Average(params float[] values)\r\n        {\r\n            float avg = 0;\r\n\r\n            foreach (float value in values)\r\n            {\r\n                avg += value;\r\n            }\r\n\r\n            return avg / values.Length;\r\n        }\r\n\r\n        /// <summary>\r\n        /// a one dimensional linear interpolation of a value.\r\n        /// </summary>\r\n        /// <param name=\"a\">from value</param>\r\n        /// <param name=\"b\">to value</param>\r\n        /// <param name=\"weight\">lerp value</param>\r\n        /// <returns>the value lerped from a to b</returns>\r\n        /// <remarks></remarks>\r\n        public static float Interpolate(float a, float b, float weight)\r\n        {\r\n            return (b - a) * weight + a;\r\n        }\r\n\r\n        public static int Interpolate(int a, int b, float weight)\r\n        {\r\n            return (int)Math.Round((b - a) * weight + a);\r\n        }\r\n\r\n        public static float SpeedLerp(float a, float b, float speed, float dt)\r\n        {\r\n            var v = b - a;\r\n            var dv = speed * dt;\r\n            if (dv > Math.Abs(v))\r\n                return b;\r\n            else\r\n                return a + Math.Sign(v) * dv;\r\n        }\r\n\r\n        public static float AccelerativeLerp(float a, float b, float accel, float dt)\r\n        {\r\n            if (b > a)\r\n            {\r\n                a += accel * dt;\r\n                return (a > b) ? b : a;\r\n            }\r\n            else\r\n            {\r\n                a -= accel * dt;\r\n                return (a < b) ? b : a;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The percentage a value is from min to max\r\n        /// \r\n        /// eg:\r\n        /// 8 of 10 out of 0->10 would be 0.8f\r\n        /// \r\n        /// Good for calculating the lerp weight\r\n        /// </summary>\r\n        /// <param name=\"value\">The value to text</param>\r\n        /// <param name=\"max\">The max value</param>\r\n        /// <param name=\"min\">The min value</param>\r\n        /// <returns>The percentage value is from min</returns>\r\n        /// <remarks></remarks>\r\n        public static float PercentageMinMax(float value, float max, float min)\r\n        {\r\n            value -= min;\r\n            max -= min;\r\n\r\n            if (max == 0f)\r\n            {\r\n                return 0f;\r\n            }\r\n            else\r\n            {\r\n                return value / max;\r\n            }\r\n        }\r\n\r\n        public static float PercentageMinMax(float value, float max)\r\n        {\r\n            return PercentageMinMax(value, max, 0);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The percentage a value is from max to min\r\n        /// \r\n        /// eg:\r\n        /// 8 of 10 out of 0->10 would be 0.2f\r\n        /// \r\n        /// Good for calculating a discount\r\n        /// </summary>\r\n        /// <param name=\"value\">The value to text</param>\r\n        /// <param name=\"max\">The max value</param>\r\n        /// <param name=\"min\">The min value</param>\r\n        /// <returns>The percentage value is from max</returns>\r\n        /// <remarks></remarks>\r\n        public static float PercentageOffMinMax(float value, float max, float min)\r\n        {\r\n            value -= max;\r\n            min -= max;\r\n\r\n            if (min == 0)\r\n            {\r\n                return 0;\r\n            }\r\n            else\r\n            {\r\n                return value / min;\r\n            }\r\n        }\r\n\r\n        public static float PercentageOffMinMax(float value, float max)\r\n        {\r\n            return PercentageOffMinMax(value, max, 0);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Return the minimum value of several values\r\n        /// </summary>\r\n        /// <param name=\"args\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float Min(params float[] args)\r\n        {\r\n            if (args.Length == 0)\r\n                return float.NaN;\r\n            float value = args[0];\r\n\r\n            for (int i = 0; i <= args.Length - 1; i++)\r\n            {\r\n                if (args[i] < value)\r\n                    value = args[i];\r\n            }\r\n\r\n            return value;\r\n        }\r\n\r\n        public static short Min(params short[] args)\r\n        {\r\n            if (args.Length == 0)\r\n                return 0;\r\n            short value = args[0];\r\n\r\n            for (int i = 0; i <= args.Length - 1; i++)\r\n            {\r\n                if (args[i] < value)\r\n                    value = args[i];\r\n            }\r\n\r\n            return value;\r\n        }\r\n\r\n        public static int Min(params int[] args)\r\n        {\r\n            if (args.Length == 0)\r\n                return 0;\r\n            int value = args[0];\r\n\r\n            for (int i = 0; i <= args.Length - 1; i++)\r\n            {\r\n                if (args[i] < value)\r\n                    value = args[i];\r\n            }\r\n\r\n            return value;\r\n        }\r\n\r\n        public static long Min(params long[] args)\r\n        {\r\n            if (args.Length == 0)\r\n                return 0;\r\n            long value = args[0];\r\n\r\n            for (int i = 0; i <= args.Length - 1; i++)\r\n            {\r\n                if (args[i] < value)\r\n                    value = args[i];\r\n            }\r\n\r\n            return value;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Return the maximum of several values\r\n        /// </summary>\r\n        /// <param name=\"args\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float Max(params float[] args)\r\n        {\r\n            if (args.Length == 0)\r\n                return float.NaN;\r\n            float value = args[0];\r\n\r\n            for (int i = 1; i <= args.Length - 1; i++)\r\n            {\r\n                if (args[i] > value)\r\n                    value = args[i];\r\n            }\r\n\r\n            return value;\r\n        }\r\n\r\n        public static short Max(params short[] args)\r\n        {\r\n            if (args.Length == 0)\r\n                return 0;\r\n            short value = args[0];\r\n\r\n            for (int i = 0; i <= args.Length - 1; i++)\r\n            {\r\n                if (args[i] > value)\r\n                    value = args[i];\r\n            }\r\n\r\n            return value;\r\n        }\r\n\r\n        public static int Max(params int[] args)\r\n        {\r\n            if (args.Length == 0)\r\n                return 0;\r\n            int value = args[0];\r\n\r\n            for (int i = 0; i <= args.Length - 1; i++)\r\n            {\r\n                if (args[i] > value)\r\n                    value = args[i];\r\n            }\r\n\r\n            return value;\r\n        }\r\n\r\n        public static long Max(params long[] args)\r\n        {\r\n            if (args.Length == 0)\r\n                return 0;\r\n            long value = args[0];\r\n\r\n            for (int i = 0; i <= args.Length - 1; i++)\r\n            {\r\n                if (args[i] > value)\r\n                    value = args[i];\r\n            }\r\n\r\n            return value;\r\n        }\r\n\r\n        public static float Wrap01(float value)\r\n        {\r\n            return (float)((double)value - Math.Floor((double)value));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Wraps a value around some significant range.\r\n        /// \r\n        /// Similar to modulo, but works in a unary direction over any range (including negative values).\r\n        /// \r\n        /// ex:\r\n        /// Wrap(8,6,2) == 4\r\n        /// Wrap(4,2,0) == 0\r\n        /// Wrap(4,2,-2) == 0\r\n        /// </summary>\r\n        /// <param name=\"value\">value to wrap</param>\r\n        /// <param name=\"max\">max in range</param>\r\n        /// <param name=\"min\">min in range</param>\r\n        /// <returns>A value wrapped around min to max</returns>\r\n        /// <remarks></remarks>\r\n        public static int Wrap(int value, int max, int min)\r\n        {\r\n            max -= min;\r\n            if (max == 0)\r\n                return min;\r\n\r\n            return value - max * (int)Math.Floor((double)(value - min) / max);\r\n        }\r\n        public static int Wrap(int value, int max)\r\n        {\r\n            return Wrap(value, max, 0);\r\n        }\r\n\r\n        public static long Wrap(long value, long max, long min)\r\n        {\r\n            max -= min;\r\n            if (max == 0)\r\n                return min;\r\n\r\n            return value - max * (long)Math.Floor((double)(value - min) / max);\r\n        }\r\n        public static long Wrap(long value, long max)\r\n        {\r\n            return Wrap(value, max, 0);\r\n        }\r\n\r\n        public static float Wrap(float value, float max, float min)\r\n        {\r\n            max -= min;\r\n            if (max == 0)\r\n                return min;\r\n\r\n            return value - max * (float)Math.Floor((value - min) / max);\r\n\r\n\r\n            // //old method using while loop, slow for large numbers\r\n            //value -= min;\r\n            //max -= min;\r\n            //if (max == 0)\r\n            //    return min;\r\n\r\n            //value = value % max;\r\n            //value += min;\r\n            //while (value < min)\r\n            //{\r\n            //    value += max;\r\n            //}\r\n\r\n            //return value;\r\n\r\n        }\r\n        public static float Wrap(float value, float max)\r\n        {\r\n            return Wrap(value, max, 0);\r\n\r\n\r\n            // //old method using while loop, slow for large numbers\r\n            //float min = 0;\r\n\r\n            //value -= min;\r\n            //max -= min;\r\n            //if (max == 0)\r\n            //    return min;\r\n\r\n            //value = (value % max);\r\n            //value += min;\r\n            //while (value < min)\r\n            //{\r\n            //    value += max;\r\n            //}\r\n\r\n            //return value;\r\n\r\n\r\n        }\r\n\r\n        /// <summary>\r\n        /// Alt of Wrap, obsolete.\r\n        /// </summary>\r\n        /// <param name=\"value\">value to wrap</param>\r\n        /// <param name=\"max\">max in range</param>\r\n        /// <param name=\"min\">min in range</param>\r\n        /// <returns>A value wrapped around min to max</returns>\r\n        /// <remarks></remarks>\r\n        [System.Obsolete(\"Use MathUtil.Wrap\")]\r\n        public static float ArithWrap(float value, float max, float min)\r\n        {\r\n            max -= min;\r\n            if (max == 0)\r\n                return min;\r\n\r\n            return value - max * (float)Math.Floor((value - min) / max);\r\n        }\r\n        [System.Obsolete(\"Use MathUtil.Wrap\")]\r\n        public static float ArithWrap(float value, float max)\r\n        {\r\n            return ArithWrap(value, max, 0);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Clamp a value into a range.\r\n        /// \r\n        /// If input is LT min, min returned\r\n        /// If input is GT max, max returned\r\n        /// else input returned\r\n        /// </summary>\r\n        /// <param name=\"input\">value to clamp</param>\r\n        /// <param name=\"max\">max in range</param>\r\n        /// <param name=\"min\">min in range</param>\r\n        /// <returns>calmped value</returns>\r\n        /// <remarks></remarks>\r\n        public static short Clamp(short input, short max, short min)\r\n        {\r\n            return Math.Max(min, Math.Min(max, input));\r\n        }\r\n        public static short Clamp(short input, short max)\r\n        {\r\n            return Math.Max((short)0, Math.Min(max, input));\r\n        }\r\n\r\n        public static int Clamp(int input, int max, int min)\r\n        {\r\n            return Math.Max(min, Math.Min(max, input));\r\n        }\r\n        public static int Clamp(int input, int max)\r\n        {\r\n            return Math.Max(0, Math.Min(max, input));\r\n        }\r\n\r\n        public static long Clamp(long input, long max, long min)\r\n        {\r\n            return Math.Max(min, Math.Min(max, input));\r\n        }\r\n        public static long Clamp(long input, long max)\r\n        {\r\n            return Math.Max(0, Math.Min(max, input));\r\n        }\r\n\r\n        public static float Clamp(float input, float max, float min)\r\n        {\r\n            return Math.Max(min, Math.Min(max, input));\r\n        }\r\n        public static float Clamp(float input, float max)\r\n        {\r\n            return Math.Max(0, Math.Min(max, input));\r\n        }\r\n\r\n        public static float Clamp01(float input)\r\n        {\r\n            if (input < 0f) return 0f;\r\n            else if (input > 1f) return 1f;\r\n            else return input;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Ensures a value is within some range. If it doesn't fall in that range than some default value is returned.\r\n        /// </summary>\r\n        /// <param name=\"input\">value to clamp</param>\r\n        /// <param name=\"max\">max in range</param>\r\n        /// <param name=\"min\">min in range</param>\r\n        /// <param name=\"defaultValue\">default value if not in range</param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static short ClampOrDefault(short input, short max, short min, short defaultValue)\r\n        {\r\n            return input < min || input > max ? defaultValue : input;\r\n        }\r\n\r\n        public static int ClampOrDefault(int input, int max, int min, int defaultValue)\r\n        {\r\n            return input < min || input > max ? defaultValue : input;\r\n        }\r\n\r\n        public static long ClampOrDefault(long input, long max, long min, long defaultValue)\r\n        {\r\n            return input < min || input > max ? defaultValue : input;\r\n        }\r\n\r\n        public static float ClampOrDefault(float input, float max, float min, float defaultValue)\r\n        {\r\n            return input < min || input > max ? defaultValue : input;\r\n        }\r\n\r\n        public static int ClampOrDefault(int input, int defaultValue, Type enumType)\r\n        {\r\n            return Enum.IsDefined(enumType, input) ? input : defaultValue;\r\n        }\r\n\r\n        /// <summary>\r\n        /// roundTo some place comparative to a 'base', default is 10 for decimal place\r\n        /// \r\n        /// 'place' is represented by the power applied to 'base' to get that place\r\n        /// </summary>\r\n        /// <param name=\"value\">the value to round</param>\r\n        /// <param name=\"place\">the place to round to</param>\r\n        /// <param name=\"base\">the base to round in... default is 10 for decimal</param>\r\n        /// <returns>The value rounded</returns>\r\n        /// <remarks>e.g.\r\n        /// \r\n        /// 2000/7 ~= 285.714285714285714285714 ~= (bin)100011101.1011011011011011\r\n        /// \r\n        /// roundTo(2000/7,-3) == 0\r\n        /// roundTo(2000/7,-2) == 300\r\n        /// roundTo(2000/7,-1) == 290\r\n        /// roundTo(2000/7,0) == 286\r\n        /// roundTo(2000/7,1) == 285.7\r\n        /// roundTo(2000/7,2) == 285.71\r\n        /// roundTo(2000/7,3) == 285.714\r\n        /// roundTo(2000/7,4) == 285.7143\r\n        /// roundTo(2000/7,5) == 285.71429\r\n        /// \r\n        /// roundTo(2000/7,-3,2)  == 288       -- 100100000\r\n        /// roundTo(2000/7,-2,2)  == 284       -- 100011100\r\n        /// roundTo(2000/7,-1,2)  == 286       -- 100011110\r\n        /// roundTo(2000/7,0,2)  == 286       -- 100011110\r\n        /// roundTo(2000/7,1,2) == 285.5     -- 100011101.1\r\n        /// roundTo(2000/7,2,2) == 285.75    -- 100011101.11\r\n        /// roundTo(2000/7,3,2) == 285.75    -- 100011101.11\r\n        /// roundTo(2000/7,4,2) == 285.6875  -- 100011101.1011\r\n        /// roundTo(2000/7,5,2) == 285.71875 -- 100011101.10111\r\n        /// \r\n        /// note what occurs when we round to the 3rd space (8ths place), 100100000, this is to be assumed \r\n        /// because we are rounding 100011.1011011011011011 which rounds up.</remarks>\r\n        public static float RoundTo(float value, int place, uint @base)\r\n        {\r\n            if (place == 0)\r\n            {\r\n                //'if zero no reason going through the math hoops\r\n                return (float)Math.Round(value);\r\n            }\r\n            else if (@base == 10 && place > 0 && place <= 15)\r\n            {\r\n                //'Math.Round has a rounding to decimal spaces that is very efficient\r\n                //'only useful for base 10 if places are from 1 to 15\r\n                return (float)Math.Round(value, place);\r\n            }\r\n            else\r\n            {\r\n                float p = (float)Math.Pow(@base, place);\r\n                return (float)Math.Round(value * p) / p;\r\n            }\r\n        }\r\n\r\n        public static float RoundTo(float value, int place)\r\n        {\r\n            return RoundTo(value, place, 10);\r\n        }\r\n\r\n        public static float RoundTo(float value)\r\n        {\r\n            return RoundTo(value, 0, 10);\r\n        }\r\n\r\n        /// <summary>\r\n        /// FloorTo some place comparative to a 'base', default is 10 for decimal place\r\n        /// \r\n        /// 'place' is represented by the power applied to 'base' to get that place\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <param name=\"place\"></param>\r\n        /// <param name=\"base\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float FloorTo(float value, int place, uint @base)\r\n        {\r\n            if (place == 0)\r\n            {\r\n                //'if zero no reason going through the math hoops\r\n                return (float)Math.Floor(value);\r\n            }\r\n            else\r\n            {\r\n                float p = (float)Math.Pow(@base, place);\r\n                return (float)Math.Floor(value * p) / p;\r\n            }\r\n        }\r\n\r\n        public static float FloorTo(float value, int place)\r\n        {\r\n            return FloorTo(value, place, 10);\r\n        }\r\n\r\n        public static float FloorTo(float value)\r\n        {\r\n            return FloorTo(value, 0, 10);\r\n        }\r\n\r\n        /// <summary>\r\n        /// CeilTo some place comparative to a 'base', default is 10 for decimal place\r\n        /// \r\n        /// 'place' is represented by the power applied to 'base' to get that place\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <param name=\"place\"></param>\r\n        /// <param name=\"base\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float CeilTo(float value, int place, uint @base)\r\n        {\r\n            if (place == 0)\r\n            {\r\n                //'if zero no reason going through the math hoops\r\n                return (float)Math.Ceiling(value);\r\n            }\r\n            else\r\n            {\r\n                float p = (float)Math.Pow(@base, place);\r\n                return (float)Math.Ceiling(value * p) / p;\r\n            }\r\n        }\r\n\r\n        public static float CeilTo(float value, int place)\r\n        {\r\n            return CeilTo(value, place, 10);\r\n        }\r\n\r\n        public static float CeilTo(float value)\r\n        {\r\n            return CeilTo(value, 0, 10);\r\n        }\r\n\r\n\r\n        /// <summary>\r\n        /// Rounds to the nearest interval. This can allow you to round to the nearest repeating range, for instance every 45 degrees for an angle.\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <param name=\"interval\"></param>\r\n        /// <returns></returns>\r\n        public static float RoundToInterval(float value, float interval)\r\n        {\r\n            if (interval < EPSILON && interval > -EPSILON) return value;\r\n            return (float)Math.Round(value / interval) * interval;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Rounds to the nearest interval offset by mean. A value of 7, for interval 4, with mean 2 would be 6.\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <param name=\"interval\"></param>\r\n        /// <param name=\"mean\"></param>\r\n        /// <returns></returns>\r\n        public static float RoundToInterval(float value, float interval, float mean)\r\n        {\r\n            if (interval < EPSILON && interval > -EPSILON) return value;\r\n            return (float)Math.Round((value - mean) / interval) * interval + mean;\r\n        }\r\n\r\n        public static float FloorToInterval(float value, float interval)\r\n        {\r\n            if (interval < EPSILON && interval > -EPSILON) return value;\r\n            return (float)Math.Floor(value / interval) * interval;\r\n        }\r\n\r\n        public static float FloorToInterval(float value, float interval, float mean)\r\n        {\r\n            if (interval < EPSILON && interval > -EPSILON) return value;\r\n            return (float)Math.Floor((value - mean) / interval) * interval + mean;\r\n        }\r\n\r\n        public static float CeilToInterval(float value, float interval)\r\n        {\r\n            if (interval < EPSILON && interval > -EPSILON) return value;\r\n            return (float)Math.Ceiling(value / interval) * interval;\r\n        }\r\n\r\n        public static float CeilToInterval(float value, float interval, float mean)\r\n        {\r\n            if (interval < EPSILON && interval > -EPSILON) return value;\r\n            return (float)Math.Ceiling((value - mean) / interval) * interval + mean;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region \"Simple fuzzy arithmetic\"\r\n\r\n        /// <summary>\r\n        /// Test if float is kind of equal to some other value by some epsilon.\r\n        /// \r\n        /// Due to float error, two values may be considered similar... but the computer considers them different. \r\n        /// By using some epsilon (degree of error) once can test if the two values are similar.\r\n        /// </summary>\r\n        /// <param name=\"a\"></param>\r\n        /// <param name=\"b\"></param>\r\n        /// <param name=\"epsilon\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static bool FuzzyEqual(float a, float b, float epsilon)\r\n        {\r\n            return Math.Abs(a - b) < epsilon;\r\n        }\r\n\r\n        public static bool FuzzyEqual(float a, float b)\r\n        {\r\n            return FuzzyEqual(a, b, EPSILON);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Test if float is less than some other value by some degree of error in epsilon.\r\n        /// \r\n        /// Due to float error, two values may be considered similar... but the computer considers them different. \r\n        /// By using some epsilon (degree of error) once can test if the two values are similar.\r\n        /// </summary>\r\n        /// <param name=\"a\"></param>\r\n        /// <param name=\"b\"></param>\r\n        /// <param name=\"epsilon\"></param>\r\n        /// <param name=\"exclusive\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static bool FuzzyLessThan(float a, float b, float epsilon, bool exclusive)\r\n        {\r\n            //exclusive means we prefer to easily exclude a true result\r\n            if (exclusive)\r\n                return a < b - epsilon;\r\n            else\r\n                return a < b + epsilon;\r\n        }\r\n\r\n        public static bool FuzzyLessThan(float a, float b, bool exclusive)\r\n        {\r\n            return FuzzyLessThan(a, b, EPSILON, exclusive);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Test if float is less than some other value by some degree of error in epsilon.\r\n        /// \r\n        /// Due to float error, two values may be considered similar... but the computer considers them different. \r\n        /// By using some epsilon (degree of error) once can test if the two values are similar.\r\n        /// </summary>\r\n        /// <param name=\"a\"></param>\r\n        /// <param name=\"b\"></param>\r\n        /// <param name=\"epsilon\"></param>\r\n        /// <param name=\"exclusive\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static bool FuzzyGreaterThan(float a, float b, float epsilon, bool exclusive)\r\n        {\r\n            //exclusive means we prefer to easily exclude a true result\r\n            if (exclusive)\r\n                return a > b + epsilon;\r\n            else\r\n                return a > b - epsilon;\r\n        }\r\n\r\n        public static bool FuzzyGreaterThan(float a, float b, bool exclusive)\r\n        {\r\n            return FuzzyGreaterThan(a, b, EPSILON, exclusive);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Test if a value is near some target value, if with in some range of 'epsilon', the target is returned.\r\n        /// \r\n        /// eg:\r\n        /// Slam(1.52,2,0.1) == 1.52\r\n        /// Slam(1.62,2,0.1) == 1.62\r\n        /// Slam(1.72,2,0.1) == 1.72\r\n        /// Slam(1.82,2,0.1) == 1.82\r\n        /// Slam(1.92,2,0.1) == 2\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <param name=\"target\"></param>\r\n        /// <param name=\"epsilon\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float Slam(float value, float target, float epsilon)\r\n        {\r\n            if (Math.Abs(value - target) < epsilon)\r\n            {\r\n                return target;\r\n            }\r\n            else\r\n            {\r\n                return value;\r\n            }\r\n        }\r\n\r\n        public static float Slam(float value, float target)\r\n        {\r\n            return Slam(value, target, EPSILON);\r\n        }\r\n        #endregion\r\n\r\n        #region \"Angular Math\"\r\n\r\n        /// <summary>\r\n        /// convert radians to degrees\r\n        /// </summary>\r\n        /// <param name=\"angle\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float RadiansToDegrees(float angle)\r\n        {\r\n            return angle * RAD_TO_DEG;\r\n        }\r\n\r\n        /// <summary>\r\n        /// convert degrees to radians\r\n        /// </summary>\r\n        /// <param name=\"angle\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float DegreesToRadians(float angle)\r\n        {\r\n            return angle * DEG_TO_RAD;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Find the angle of a segment from (x1, y1) -> (x2, y2 )\r\n        /// </summary>\r\n        /// <param name=\"x1\"></param>\r\n        /// <param name=\"y1\"></param>\r\n        /// <param name=\"x2\"></param>\r\n        /// <param name=\"y2\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float AngleBetween(float x1, float y1, float x2, float y2)\r\n        {\r\n            return (float)Math.Atan2(y2 - y1, x2 - x1);\r\n        }\r\n\r\n        /// <summary>\r\n        /// set an angle with in the bounds of -PI to PI\r\n        /// </summary>\r\n        /// <param name=\"angle\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float NormalizeAngle(float angle, bool useRadians)\r\n        {\r\n            float rd = (useRadians ? PI : 180);\r\n            return Wrap(angle, rd, -rd);\r\n        }\r\n\r\n        /// <summary>\r\n        /// closest angle from a1 to a2\r\n        /// absolute value the return for exact angle\r\n        /// </summary>\r\n        /// <param name=\"a1\"></param>\r\n        /// <param name=\"a2\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float NearestAngleBetween(float a1, float a2, bool useRadians)\r\n        {\r\n            var rd = useRadians ? PI : 180f;\r\n            var ra = Wrap(a2 - a1, rd * 2f);\r\n            if (ra > rd) ra -= (rd * 2f);\r\n            return ra;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns a value for dependant that is a value that is the shortest angle between dep and ind from ind.\r\n        /// \r\n        /// \r\n        /// for instance if dep=-190 degrees and ind=10 degrees then 170 degrees will be returned \r\n        /// since the shortest path from 10 to -190 is to rotate to 170.\r\n        /// </summary>\r\n        /// <param name=\"dep\"></param>\r\n        /// <param name=\"ind\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float ShortenAngleToAnother(float dep, float ind, bool useRadians)\r\n        {\r\n            return ind + NearestAngleBetween(ind, dep, useRadians);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns a value for dependant that is the shortest angle in the positive direction from ind.\r\n        /// \r\n        /// for instance if dep=-170 degrees, and ind=10 degrees, then 190 degrees will be returned as an alternative to -170. \r\n        /// Since 190 is the smallest angle > 10 equal to -170.\r\n        /// </summary>\r\n        /// <param name=\"dep\"></param>\r\n        /// <param name=\"ind\"></param>\r\n        /// <param name=\"useRadians\"></param>\r\n        /// <returns></returns>\r\n        public static float NormalizeAngleToAnother(float dep, float ind, bool useRadians)\r\n        {\r\n            float div = useRadians ? TWO_PI : 360f;\r\n            float v = (dep - ind) / div;\r\n            return dep - (float)Math.Floor(v) * div;\r\n        }\r\n\r\n        public static float NormalizeAngleToRange(float value, float start, float end, bool useRadians)\r\n        {\r\n            float div = useRadians ? TWO_PI : 360f;\r\n            float d = (end - start) / div;\r\n            float v = (value - start) / div;\r\n            if (!MathUtil.InRange(v, d))\r\n            {\r\n                if (Math.Abs(d) > 1.0)\r\n                {\r\n                    //the start->end range is larger than 360, so just land inside it\r\n                    v = (float)Math.Round((double)v, System.MidpointRounding.AwayFromZero);\r\n                    value -= v * div;\r\n                }\r\n                else\r\n                {\r\n                    //the start->end range is smaller than 360\r\n                    //so lets land as close as we can to the bounds of the range on either end\r\n                    v = (float)Math.Truncate((double)v);\r\n                    value -= v * div;\r\n                    if (Math.Abs(value - end) > 180.0) value -= Math.Sign(value - end) * div;\r\n                }\r\n            }\r\n            return value;\r\n        }\r\n\r\n        /// <summary>\r\n        /// interpolate across the shortest arc between two angles\r\n        /// </summary>\r\n        /// <param name=\"a1\"></param>\r\n        /// <param name=\"a2\"></param>\r\n        /// <param name=\"weight\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static float InterpolateAngle(float a, float b, float weight, bool useRadians)\r\n        {\r\n            var rd = (useRadians) ? PI : 180f;\r\n            var delta = (b - a) % (rd * 2f);\r\n            return Wrap(a + delta * weight, rd, -rd);\r\n        }\r\n\r\n        //public static float ClampAngle(float a, float max, float min, bool bUseRadians)\r\n        //{\r\n        //    a = NormalizeAngle(a, bUseRadians);\r\n        //    max = NormalizeAngleToAnother(max, a, bUseRadians);\r\n        //    min = NormalizeAngleToAnother(min, a, bUseRadians);\r\n        //    return MathUtil.Clamp(a, max, min);\r\n        //}\r\n\r\n        public static float ClampIn180(float a, bool bUseRadians = false)\r\n        {\r\n            return NormalizeAngle(a, bUseRadians);\r\n        }\r\n\r\n        public static float ClampIn360(float a, bool bUseRadians = false)\r\n        {\r\n            a = NormalizeAngle(a, bUseRadians);\r\n            if (a < 0f) a += (bUseRadians) ? TWO_PI : 360.0f;\r\n            return a;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region \"Advanced Math\"\r\n\r\n        /// <summary>\r\n        /// Compute the logarithm of any value of any base\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <param name=\"base\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks>\r\n        /// a logarithm is the exponent that some constant (base) would have to be raised to \r\n        /// to be equal to value.\r\n        /// \r\n        /// i.e.\r\n        /// 4 ^ x = 16\r\n        /// can be rewritten as to solve for x\r\n        /// logB4(16) = x\r\n        /// which with this function would be \r\n        /// LoDMath.logBaseOf(16,4)\r\n        /// \r\n        /// which would return 2, because 4^2 = 16\r\n        /// </remarks>\r\n        public static float LogBaseOf(float value, float @base)\r\n        {\r\n            return (float)(Math.Log(value) / Math.Log(@base));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Check if a value is prime.\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks>\r\n        /// In this method to increase speed we first check if the value is ltOReq 1, because values ltOReq 1 are not prime by definition. \r\n        /// Then we check if the value is even but not equal to 2. If so the value is most certainly not prime. \r\n        /// Lastly we loop through all odd divisors. No point in checking 1 or even divisors, because if it were divisible by an even \r\n        /// number it would be divisible by 2. If any divisor existed when i > value / i then its compliment would have already \r\n        /// been located. And lastly the loop will never reach i == val because i will never be > sqrt(val).\r\n        /// \r\n        /// proof of validity for algorithm:\r\n        /// \r\n        /// all trivial values are thrown out immediately by checking if even or less then 2\r\n        /// \r\n        /// all remaining possibilities MUST be odd, an odd is resolved as the multiplication of 2 odd values only. (even * anyValue == even)\r\n        /// \r\n        /// in resolution a * b = val, a = val / b. As every compliment a for b, b and a can be swapped resulting in b being ltOReq a. If a compliment for b \r\n        /// exists then that compliment would have already occured (as it is odd) in the swapped addition at the even split.\r\n        /// \r\n        /// Example...\r\n        /// \r\n        /// 16\r\n        /// 1 * 16\r\n        /// 2 * 8\r\n        /// 4 * 4\r\n        /// 8 * 2\r\n        /// 16 * 1\r\n        /// \r\n        /// checks for 1, 2, and 4 would have already checked the validity of 8 and 16.\r\n        /// \r\n        /// Thusly we would only have to loop as long as i ltOReq val / i. Once we've reached the middle compliment, all subsequent factors have been resolved.\r\n        /// \r\n        /// This shrinks the number of loops for odd values from [ floor(val / 2) - 1 ] down to [ ceil(sqrt(val) / 2) - 1 ]\r\n        /// \r\n        /// example, if we checked EVERY odd number for the validity of the prime 7927, we'd loop 3962 times\r\n        /// \r\n        /// but by this algorithm we loop only 43 times. Significant improvement!\r\n        /// </remarks>\r\n        public static bool IsPrime(long value)\r\n        {\r\n            // check if value is in prime number range\r\n            if (value < 2)\r\n                return false;\r\n\r\n            // check if even, but not equal to 2\r\n            if ((value % 2) == 0 & value != 2)\r\n                return false;\r\n\r\n            // if 2 or odd, check if any non-trivial divisors exist\r\n            long sqrrt = (long)Math.Floor(Math.Sqrt(value));\r\n            for (long i = 3; i <= sqrrt; i += 2)\r\n            {\r\n                if ((value % i) == 0)\r\n                    return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Relative Primality between two integers\r\n        /// \r\n        /// By definition two integers are considered relatively prime if their \r\n        /// 'greatest common divisor' is 1. So thusly we simply just check if \r\n        /// the GCD of m and n is 1.\r\n        /// </summary>\r\n        /// <param name=\"m\"></param>\r\n        /// <param name=\"n\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static bool IsRelativelyPrime(short m, short n)\r\n        {\r\n            return GCD(m, n) == 1;\r\n        }\r\n\r\n        public static bool IsRelativelyPrime(int m, int n)\r\n        {\r\n            return GCD(m, n) == 1;\r\n        }\r\n\r\n        public static bool IsRelativelyPrime(long m, long n)\r\n        {\r\n            return GCD(m, n) == 1;\r\n        }\r\n\r\n        public static int[] FactorsOf(int value)\r\n        {\r\n            value = Math.Abs(value);\r\n            List<int> arr = new List<int>();\r\n            int sqrrt = (int)Math.Sqrt(value);\r\n            int c = 0;\r\n\r\n            for (int i = 1; i <= sqrrt; i++)\r\n            {\r\n                if ((value % i) == 0)\r\n                {\r\n                    arr.Add(i);\r\n                    c = value / i;\r\n                    if (c != i)\r\n                        arr.Add(c);\r\n                }\r\n            }\r\n\r\n            arr.Sort();\r\n\r\n            return arr.ToArray();\r\n        }\r\n        \r\n        public static int[] CommonFactorsOf(int m, int n)\r\n        {\r\n            int i = 0;\r\n            int j = 0;\r\n            if (m < 0) m = -m;\r\n            if (n < 0) n = -n;\r\n\r\n            if(m > n)\r\n            {\r\n                i = m;\r\n                m = n;\r\n                n = i;\r\n            }\r\n\r\n            var set = new HashSet<int>(); //ensures no duplicates\r\n\r\n            int r = (int)Math.Sqrt(m);\r\n            for(i = 1; i <= r; i++)\r\n            {\r\n                if((m % i) == 0 && (n % i) == 0)\r\n                {\r\n                    set.Add(i);\r\n                    j = m / i;\r\n                    if ((n % j) == 0) set.Add(j);\r\n                    j = n / i;\r\n                    if ((m % j) == 0) set.Add(j);\r\n                }\r\n            }\r\n\r\n            int[] arr = System.Linq.Enumerable.ToArray(set);\r\n            System.Array.Sort(arr);\r\n            return arr;\r\n\r\n\r\n\r\n            //more loops\r\n            /*\r\n            List<int> arr = new List<int>();\r\n\r\n            int i = 0;\r\n            if (m < 0) m = -m;\r\n            if (n < 0) n = -n;\r\n\r\n            //make sure m is < n\r\n            if (m > n)\r\n            {\r\n                i = m;\r\n                m = n;\r\n                n = i;\r\n            }\r\n\r\n            //could be sped up by looping to sqrt(m), but then would have to do extra work to make sure duplicates don't occur\r\n            for (i = 1; i <= m; i++)\r\n            {\r\n                if ((m % i) == 0 && (n % i) == 0)\r\n                {\r\n                    arr.Add(i);\r\n                }\r\n            }\r\n\r\n            return arr.ToArray();\r\n            */\r\n        }\r\n\r\n        /// <summary>\r\n        /// Greatest Common Divisor using Euclid's algorithm\r\n        /// </summary>\r\n        /// <param name=\"m\"></param>\r\n        /// <param name=\"n\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static int GCD(int m, int n)\r\n        {\r\n            int r = 0;\r\n\r\n            // make sure positive, GCD is always positive\r\n            if (m < 0) m = -m;\r\n            if (n < 0) n = -n;\r\n\r\n            // m must be >= n\r\n            if (m < n)\r\n            {\r\n                r = m;\r\n                m = n;\r\n                n = r;\r\n            }\r\n\r\n            // now start loop, loop is infinite... we will cancel out sooner or later\r\n            while (true)\r\n            {\r\n                r = m % n;\r\n                if (r == 0)\r\n                    return n;\r\n                m = n;\r\n                n = r;\r\n            }\r\n\r\n            // fail safe\r\n            //return 1;\r\n        }\r\n\r\n        public static long GCD(long m, long n)\r\n        {\r\n            long r = 0;\r\n\r\n            // make sure positive, GCD is always positive\r\n            if (m < 0) m = -m;\r\n            if (n < 0) n = -n;\r\n\r\n            // m must be >= n\r\n            if (m < n)\r\n            {\r\n                r = m;\r\n                m = n;\r\n                n = r;\r\n            }\r\n\r\n            // now start loop, loop is infinite... we will cancel out sooner or later\r\n            while (true)\r\n            {\r\n                r = m % n;\r\n                if (r == 0)\r\n                    return n;\r\n                m = n;\r\n                n = r;\r\n            }\r\n\r\n            // fail safe\r\n            //return 1;\r\n        }\r\n\r\n        public static int LCM(int m, int n)\r\n        {\r\n            return (m * n) / GCD(m, n);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Factorial - N!\r\n        /// \r\n        /// Simple product series\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks>\r\n        /// By definition 0! == 1\r\n        /// \r\n        /// Factorial assumes the idea that the value is an integer >= 0... thusly UInteger is used\r\n        /// </remarks>\r\n        public static long Factorial(uint value)\r\n        {\r\n            if (value <= 0)\r\n                return 1;\r\n\r\n            long res = value;\r\n\r\n            while (--value != 0)\r\n            {\r\n                res *= value;\r\n            }\r\n\r\n            return res;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Falling facotiral\r\n        /// \r\n        /// defined: (N)! / (N - x)!\r\n        /// \r\n        /// written subscript: (N)x OR (base)exp\r\n        /// </summary>\r\n        /// <param name=\"base\"></param>\r\n        /// <param name=\"exp\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static long FallingFactorial(uint @base, uint exp)\r\n        {\r\n            return Factorial(@base) / Factorial(@base - exp);\r\n        }\r\n\r\n        /// <summary>\r\n        /// rising factorial\r\n        /// \r\n        /// defined: (N + x - 1)! / (N - 1)!\r\n        /// \r\n        /// written superscript N^(x) OR base^(exp)\r\n        /// </summary>\r\n        /// <param name=\"base\"></param>\r\n        /// <param name=\"exp\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static long RisingFactorial(uint @base, uint exp)\r\n        {\r\n            return Factorial(@base + exp - 1) / Factorial(@base - 1);\r\n        }\r\n\r\n        /// <summary>\r\n        /// binomial coefficient\r\n        /// \r\n        /// defined: N! / (k!(N-k)!)\r\n        /// reduced: N! / (N-k)! == (N)k (fallingfactorial)\r\n        /// reduced: (N)k / k!\r\n        /// </summary>\r\n        /// <param name=\"n\"></param>\r\n        /// <param name=\"k\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static long BinCoef(uint n, uint k)\r\n        {\r\n            return FallingFactorial(n, k) / Factorial(k);\r\n        }\r\n\r\n        /// <summary>\r\n        /// rising binomial coefficient\r\n        /// \r\n        /// as one can notice in the analysis of binCoef(...) that \r\n        /// binCoef is the (N)k divided by k!. Similarly rising binCoef \r\n        /// is merely N^(k) / k! \r\n        /// </summary>\r\n        /// <param name=\"n\"></param>\r\n        /// <param name=\"k\"></param>\r\n        /// <returns></returns>\r\n        /// <remarks></remarks>\r\n        public static long RisingBinCoef(uint n, uint k)\r\n        {\r\n            return RisingFactorial(n, k) / Factorial(k);\r\n        }\r\n        #endregion\r\n\r\n\r\n\r\n        #region Geometric Calculations\r\n\r\n        public static float ApproxCircumOfEllipse(float a, float b)\r\n        {\r\n            return (float)(PI * Math.Sqrt((a * a + b * b) / 2));\r\n        }\r\n\r\n        #endregion\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/Messaging.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class Messaging\r\n    {\r\n\r\n        #region Standard Execute Methods\r\n\r\n        public static void Execute<T>(this GameObject go, System.Action<T> functor, bool includeDisabledComponents = false) where T : class\r\n        {\r\n            if (functor == null) throw new System.ArgumentNullException(\"functor\");\r\n\r\n            using (var lst = TempCollection.GetList<T>())\r\n            {\r\n                go.GetComponents<T>(lst);\r\n                if (lst.Count > 0)\r\n                {\r\n                    for (int i = 0; i < lst.Count; i++)\r\n                    {\r\n                        if(includeDisabledComponents || TargetIsValid(lst[i]))\r\n                            functor(lst[i]);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void Execute<TInterface, TArg>(this GameObject go, TArg arg, System.Action<TInterface, TArg> functor, bool includeDisabledComponents = false) where TInterface : class\r\n        {\r\n            if (functor == null) throw new System.ArgumentNullException(\"functor\");\r\n\r\n            using (var lst = TempCollection.GetList<TInterface>())\r\n            {\r\n                go.GetComponents<TInterface>(lst);\r\n                if (lst.Count > 0)\r\n                {\r\n                    for (int i = 0; i < lst.Count; i++)\r\n                    {\r\n                        if (includeDisabledComponents || TargetIsValid(lst[i]))\r\n                            functor(lst[i], arg);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Broadcast message to all children of a GameObject\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"go\"></param>\r\n        /// <param name=\"functor\"></param>\r\n        /// <param name=\"includeInactive\"></param>\r\n        public static void Broadcast<T>(this GameObject go, System.Action<T> functor, bool includeInactiveObjects = false, bool includeDisabledComponents = false) where T : class\r\n        {\r\n            if (functor == null) throw new System.ArgumentNullException(\"functor\");\r\n\r\n            using (var lst = TempCollection.GetList<T>())\r\n            {\r\n                go.GetComponentsInChildren<T>(includeInactiveObjects, lst);\r\n                if(lst.Count > 0)\r\n                {\r\n                    for(int i = 0; i < lst.Count; i++)\r\n                    {\r\n                        if (includeDisabledComponents || TargetIsValid(lst[i]))\r\n                            functor(lst[i]);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Broadcast message to all children of a GameObject\r\n        /// </summary>\r\n        /// <typeparam name=\"TInterface\"></typeparam>\r\n        /// <typeparam name=\"TArg\"></typeparam>\r\n        /// <param name=\"go\"></param>\r\n        /// <param name=\"arg\"></param>\r\n        /// <param name=\"functor\"></param>\r\n        /// <param name=\"includeInactive\"></param>\r\n        public static void Broadcast<TInterface, TArg>(this GameObject go, TArg arg, System.Action<TInterface, TArg> functor, bool includeInactiveObjects = false, bool includeDisabledComponents = false) where TInterface : class\r\n        {\r\n            if (functor == null) throw new System.ArgumentNullException(\"functor\");\r\n\r\n            using (var lst = TempCollection.GetList<TInterface>())\r\n            {\r\n                go.GetComponentsInChildren<TInterface>(includeInactiveObjects, lst);\r\n                if (lst.Count > 0)\r\n                {\r\n                    for (int i = 0; i < lst.Count; i++)\r\n                    {\r\n                        if (includeDisabledComponents || TargetIsValid(lst[i]))\r\n                            functor(lst[i], arg);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void ExecuteUpwards<T>(this GameObject go, System.Action<T> functor, bool includeDisabledComponents = false) where T : class\r\n        {\r\n            var p = go.transform;\r\n            while(p != null)\r\n            {\r\n                Execute<T>(p.gameObject, functor, includeDisabledComponents);\r\n                p = p.parent;\r\n            }\r\n        }\r\n\r\n        public static void ExecuteUpwards<TInterface, TArg>(this GameObject go, TArg arg, System.Action<TInterface, TArg> functor, bool includeDisabledComponents = false) where TInterface : class\r\n        {\r\n            var p = go.transform;\r\n            while (p != null)\r\n            {\r\n                Execute<TInterface, TArg>(p.gameObject, arg, functor, includeDisabledComponents);\r\n                p = p.parent;\r\n            }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Global Execute\r\n\r\n        /// <summary>\r\n        /// Register a listener for a global Broadcast.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"listener\"></param>\r\n        public static void RegisterGlobal<T>(T listener) where T : class\r\n        {\r\n            if (listener == null) throw new System.ArgumentNullException(\"listener\");\r\n            GlobalMessagePool<T>.Add(listener);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Register a listener for a global broadcast.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"listener\"></param>\r\n        public static void UnregisterGlobal<T>(T listener) where T : class\r\n        {\r\n            if(object.ReferenceEquals(listener, null)) throw new System.ArgumentNullException(\"listener\");\r\n            GlobalMessagePool<T>.Remove(listener);\r\n        }\r\n\r\n        public static bool ContainsGlobalListener<T>(T listener) where T : class\r\n        {\r\n            if (object.ReferenceEquals(listener, null)) throw new System.ArgumentNullException(\"listener\");\r\n            return GlobalMessagePool<T>.Contains(listener);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Broadcast a message globally to all registered for T. This is faster than FindAndBroadcast, but requires manuall registering/unregistering.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"functor\"></param>\r\n        /// <param name=\"includeDisabledComponents\"></param>\r\n        public static void Broadcast<T>(System.Action<T> functor) where T : class\r\n        {\r\n            if (functor == null) throw new System.ArgumentNullException(\"functor\");\r\n\r\n            GlobalMessagePool<T>.Execute(functor);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Broadcast a message globally to all registered for T. This is faster than FindAndBroadcast, but requires manuall registering/unregistering.\r\n        /// </summary>\r\n        /// <typeparam name=\"TInterface\"></typeparam>\r\n        /// <typeparam name=\"TArg\"></typeparam>\r\n        /// <param name=\"arg\"></param>\r\n        /// <param name=\"functor\"></param>\r\n        /// <param name=\"includeDisabledComponents\"></param>\r\n        public static void Broadcast<TInterface, TArg>(TArg arg, System.Action<TInterface, TArg> functor) where TInterface : class\r\n        {\r\n            if (functor == null) throw new System.ArgumentNullException(\"functor\");\r\n\r\n            GlobalMessagePool<TInterface>.Execute<TArg>(arg, functor);\r\n        }\r\n        \r\n        /// <summary>\r\n        /// Broadcast a message globally to all that match T. This can be slow, use sparingly.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"functor\"></param>\r\n        public static void FindAndBroadcast<T>(System.Action<T> functor, bool includeDisabledComponents = false) where T : class\r\n        {\r\n            if (functor == null) throw new System.ArgumentNullException(\"functor\");\r\n\r\n            using (var coll = TempCollection.GetSet<T>())\r\n            {\r\n                ObjUtil.FindObjectsOfInterface<T>(coll);\r\n                GlobalMessagePool<T>.CopyReceivers(coll);\r\n                var e = coll.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (includeDisabledComponents || TargetIsValid(e.Current))\r\n                        functor(e.Current);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Broadcast a message globally to all that match T. This can be slow, use sparingly.\r\n        /// </summary>\r\n        /// <typeparam name=\"TInterface\"></typeparam>\r\n        /// <typeparam name=\"TArg\"></typeparam>\r\n        /// <param name=\"arg\"></param>\r\n        /// <param name=\"functor\"></param>\r\n        public static void FindAndBroadcast<TInterface, TArg>(TArg arg, System.Action<TInterface, TArg> functor, bool includeDisabledComponents = false) where TInterface : class\r\n        {\r\n            if (functor == null) throw new System.ArgumentNullException(\"functor\");\r\n\r\n            using (var coll = TempCollection.GetSet<TInterface>())\r\n            {\r\n                ObjUtil.FindObjectsOfInterface<TInterface>(coll);\r\n                GlobalMessagePool<TInterface>.CopyReceivers(coll);\r\n                var e = coll.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    if (includeDisabledComponents || TargetIsValid(e.Current))\r\n                        functor(e.Current, arg);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region Broadcast Token\r\n\r\n        /// <summary>\r\n        /// Create a MessageToken to invoke at a later point. If no targets found null is returned.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"go\"></param>\r\n        /// <returns></returns>\r\n        public static MessageToken<T> CreateExecuteToken<T>(GameObject go) where T : class\r\n        {\r\n            using (var lst = TempCollection.GetList<T>())\r\n            {\r\n                go.GetComponents<T>(lst);\r\n                if (lst.Count > 0)\r\n                {\r\n                    return new MessageToken<T>(lst.ToArray());\r\n                }\r\n            }\r\n\r\n\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Create a MessageToken to invoke at a later point. If no targets found null is returned.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"go\"></param>\r\n        /// <returns></returns>\r\n        public static MessageToken<T> CreateExecuteUpwardsToken<T>(GameObject go) where T : class\r\n        {\r\n            using (var lst = TempCollection.GetList<T>())\r\n            {\r\n                var p = go.transform;\r\n                while (p != null)\r\n                {\r\n                    p.GetComponents<T>(lst);\r\n                    p = p.parent;\r\n                }\r\n\r\n                if (lst.Count > 0)\r\n                    return new MessageToken<T>(lst.ToArray());\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Create a MessageToken to invoke at a later point. If no targets found null is returned.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"go\"></param>\r\n        /// <param name=\"includeInactiveObjects\"></param>\r\n        /// <param name=\"includeDisabledComponents\"></param>\r\n        /// <returns></returns>\r\n        public static MessageToken<T> CreateBroadcastToken<T>(GameObject go, bool includeInactiveObjects = false, bool includeDisabledComponents = false) where T : class\r\n        {\r\n            if (go == null) return null;\r\n\r\n            using (var lst = TempCollection.GetList<T>())\r\n            {\r\n                go.GetComponentsInChildren<T>(includeInactiveObjects, lst);\r\n                if (lst.Count > 0)\r\n                {\r\n                    return new MessageToken<T>(lst.ToArray());\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Create a MessageToken to invoke at a later point. If no targets found null is returned.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <returns></returns>\r\n        public static MessageToken<T> CreateBroadcastToken<T>() where T : class\r\n        {\r\n            if (GlobalMessagePool<T>.Count == 0) return null;\r\n\r\n            return new MessageToken<T>(GlobalMessagePool<T>.CopyReceivers());\r\n        }\r\n\r\n        /// <summary>\r\n        /// Create a MessageToken to invoke at a later point. If no targets found null is returned.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"includeDisabledComponents\"></param>\r\n        /// <returns></returns>\r\n        public static MessageToken<T> CreateFindAndBroadcastToken<T>(bool includeDisabledComponents = false) where T : class\r\n        {\r\n            using (var lst = TempCollection.GetSet<T>())\r\n            {\r\n                ObjUtil.FindObjectsOfInterface<T>(lst);\r\n                if (lst.Count == 0) return null;\r\n\r\n                if (includeDisabledComponents)\r\n                    return new MessageToken<T>(lst.ToArray());\r\n\r\n                using (var lst2 = TempCollection.GetList<T>(lst.Count))\r\n                {\r\n                    var e = lst.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (TargetIsValid(e.Current)) lst.Add(e.Current);\r\n                    }\r\n\r\n                    if (lst.Count > 0)\r\n                        return new MessageToken<T>(lst2.ToArray());\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public class MessageToken<T> where T : class\r\n        {\r\n\r\n            private T[] _targets;\r\n\r\n            public MessageToken(T[] targets)\r\n            {\r\n                if (targets == null) throw new System.ArgumentNullException(\"targets\");\r\n                _targets = targets;\r\n            }\r\n\r\n            public int Count\r\n            {\r\n                get { return _targets.Length; }\r\n            }\r\n\r\n            public void Invoke(System.Action<T> functor)\r\n            {\r\n                if (functor == null) throw new System.ArgumentNullException(\"functor\");\r\n\r\n                foreach(var t in _targets)\r\n                {\r\n                    functor(t);\r\n                }\r\n            }\r\n\r\n            public void Invoke<TArg>(TArg arg, System.Action<T, TArg> functor)\r\n            {\r\n                if (functor == null) throw new System.ArgumentNullException(\"functor\");\r\n\r\n                foreach (var t in _targets)\r\n                {\r\n                    functor(t, arg);\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region Internal Utils\r\n\r\n        private static bool TargetIsValid(object obj)\r\n        {\r\n            if (obj is Behaviour) return (obj as Behaviour).isActiveAndEnabled;\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// TODO - currently is not thread safe, need to add a check to make sure on the main thread OR make it thread safe.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        private static class GlobalMessagePool<T> where T : class\r\n        {\r\n\r\n            private enum ExecutingState\r\n            {\r\n                None,\r\n                Executing,\r\n                CleaningUp\r\n            }\r\n\r\n            private static HashSet<T> _receivers;\r\n            private static ExecutingState _state;\r\n            private static TempHashSet<T> _toAdd;\r\n            private static TempHashSet<T> _toRemove;\r\n\r\n            public static int Count\r\n            {\r\n                get { return _receivers.Count; }\r\n            }\r\n\r\n            public static void Add(T listener)\r\n            {\r\n                if (_receivers == null) _receivers = new HashSet<T>();\r\n\r\n                switch(_state)\r\n                {\r\n                    case ExecutingState.None:\r\n                        _receivers.Add(listener);\r\n                        break;\r\n                    case ExecutingState.Executing:\r\n                        if (_toAdd == null) _toAdd = TempCollection.GetSet<T>();\r\n                        _toAdd.Add(listener);\r\n                        break;\r\n                    case ExecutingState.CleaningUp:\r\n                        _receivers.Add(listener);\r\n                        break;\r\n                }\r\n            }\r\n\r\n            public static void Remove(T listener)\r\n            {\r\n                if (_receivers == null || _receivers.Count == 0) return;\r\n\r\n                switch (_state)\r\n                {\r\n                    case ExecutingState.None:\r\n                        _receivers.Remove(listener);\r\n                        break;\r\n                    case ExecutingState.Executing:\r\n                        if (_toRemove == null) _toRemove = TempCollection.GetSet<T>();\r\n                        _toRemove.Add(listener);\r\n                        break;\r\n                    case ExecutingState.CleaningUp:\r\n                        _receivers.Remove(listener);\r\n                        break;\r\n                }\r\n            }\r\n\r\n            public static bool Contains(T listener)\r\n            {\r\n                return _receivers != null && _receivers.Contains(listener);\r\n            }\r\n\r\n            public static T[] CopyReceivers()\r\n            {\r\n                if (_receivers == null || _receivers.Count == 0) return ArrayUtil.Empty<T>();\r\n                return _receivers.ToArray();\r\n            }\r\n\r\n            public static int CopyReceivers(ICollection<T> coll)\r\n            {\r\n                if (_receivers == null || _receivers.Count == 0) return 0;\r\n\r\n                int cnt = coll.Count;\r\n                var e = _receivers.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    coll.Add(e.Current);\r\n                }\r\n                return coll.Count - cnt;\r\n            }\r\n\r\n            public static void Execute(System.Action<T> functor)\r\n            {\r\n                if (_state != ExecutingState.None) throw new System.InvalidOperationException(\"Can not globally broadcast a message currently executing.\");\r\n                if (_receivers == null || _receivers.Count == 0) return;\r\n                \r\n                _state = ExecutingState.Executing;\r\n                try\r\n                {\r\n                    var e = _receivers.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (e.Current is UnityEngine.Object && (e.Current as UnityEngine.Object) == null)\r\n                        {\r\n                            //skip & remove destroyed objects\r\n                            Remove(e.Current);\r\n                        }\r\n                        else\r\n                        {\r\n                            try\r\n                            {\r\n                                functor(e.Current);\r\n                            }\r\n                            catch (System.Exception ex)\r\n                            {\r\n                                Debug.LogException(ex);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                finally\r\n                {\r\n                    _state = ExecutingState.CleaningUp;\r\n\r\n                    if (_toRemove != null)\r\n                    {\r\n                        var e = _toRemove.GetEnumerator();\r\n                        while (e.MoveNext())\r\n                        {\r\n                            _receivers.Remove(e.Current);\r\n                        }\r\n                        _toRemove.Dispose();\r\n                        _toRemove = null;\r\n                    }\r\n\r\n                    if (_toAdd != null)\r\n                    {\r\n                        var e = _toAdd.GetEnumerator();\r\n                        while (e.MoveNext())\r\n                        {\r\n                            _receivers.Add(e.Current);\r\n                        }\r\n                        _toAdd.Dispose();\r\n                        _toAdd = null;\r\n                    }\r\n\r\n                    _state = ExecutingState.None;\r\n                }\r\n            }\r\n\r\n            public static void Execute<TArg>(TArg arg, System.Action<T, TArg> functor)\r\n            {\r\n                if (_state != ExecutingState.None) throw new System.InvalidOperationException(\"Can not globally broadcast a message currently executing.\");\r\n                if (_receivers == null || _receivers.Count == 0) return;\r\n                \r\n                _state = ExecutingState.Executing;\r\n                try\r\n                {\r\n                    var e = _receivers.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        if (e.Current is UnityEngine.Object && (e.Current as UnityEngine.Object) == null)\r\n                        {\r\n                            //skip & remove destroyed objects\r\n                            Remove(e.Current);\r\n                        }\r\n                        else\r\n                        {\r\n                            try\r\n                            {\r\n                                functor(e.Current, arg);\r\n                            }\r\n                            catch (System.Exception ex)\r\n                            {\r\n                                Debug.LogException(ex);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                finally\r\n                {\r\n                    _state = ExecutingState.CleaningUp;\r\n\r\n                    if (_toRemove != null)\r\n                    {\r\n                        var e = _toRemove.GetEnumerator();\r\n                        while (e.MoveNext())\r\n                        {\r\n                            _receivers.Remove(e.Current);\r\n                        }\r\n                        _toRemove.Dispose();\r\n                        _toRemove = null;\r\n                    }\r\n\r\n                    if (_toAdd != null)\r\n                    {\r\n                        var e = _toAdd.GetEnumerator();\r\n                        while (e.MoveNext())\r\n                        {\r\n                            _receivers.Add(e.Current);\r\n                        }\r\n                        _toAdd.Dispose();\r\n                        _toAdd = null;\r\n                    }\r\n\r\n                    _state = ExecutingState.None;\r\n                }\r\n            }\r\n            \r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/MouseUtil.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class MouseUtil\r\n    {\r\n\r\n        public const int BTN_LEFT = 0;\r\n        public const int BTN_RIGHT = 1;\r\n\r\n        public static bool GuiClicked(Event ev, int btn, Rect area)\r\n        {\r\n            return (ev.type == EventType.MouseDown && ev.button == btn && area.Contains(ev.mousePosition));\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/NameCache.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy.Utils\n{\n\n    public static class NameCache\n    {\n\n        /// <summary>\n        /// Attempts to reduce garbage when comparing names.\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <param name=\"name\"></param>\n        /// <returns></returns>\n        public static bool CompareName(this UnityEngine.Object obj, string name)\n        {\n            if (obj == null) return false;\n\n            if (obj is INameable) return (obj as INameable).CompareName(name);\n\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\n            if (go != null) return go.AddOrGetComponent<GameObjectNameCache>().CompareName(name);\n\n            return obj.name == name;\n        }\n\n        public static bool CompareName(this UnityEngine.Object obj, string name, bool respectProxy)\n        {\n            if (respectProxy && obj is IProxy) obj = (obj as IProxy).GetTarget() as UnityEngine.Object;\n            if (obj == null) return false;\n\n            if (obj is INameable) return (obj as INameable).CompareName(name);\n\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\n            if (go != null) return go.AddOrGetComponent<GameObjectNameCache>().CompareName(name);\n\n            return obj.name == name;\n        }\n\n        public static string GetCachedName(UnityEngine.Object obj)\n        {\n            if (obj == null) return null;\n            if (obj is INameable) return (obj as INameable).Name;\n\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\n            if(go != null) return go.AddOrGetComponent<GameObjectNameCache>().Name;\n\n            return obj.name;\n        }\n\n        public static string GetCachedName(UnityEngine.Object obj, bool respectProxy)\n        {\n            if (respectProxy && obj is IProxy) obj = (obj as IProxy).GetTarget() as UnityEngine.Object;\n            if (obj == null) return null;\n\n            if (obj is INameable) return (obj as INameable).Name;\n\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\n            if (go != null) return go.AddOrGetComponent<GameObjectNameCache>().Name;\n\n            return obj.name;\n        }\n\n        /// <summary>\n        /// Set the cached name dirty so that the next time it's read it's updated to the current state of the object.\n        /// Call this if you rename an object.\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <param name=\"respectProxy\"></param>\n        public static void SetDirty(UnityEngine.Object obj, bool respectProxy = false)\n        {\n            if (respectProxy && obj is IProxy) obj = (obj as IProxy).GetTarget() as UnityEngine.Object;\n            if (obj == null) return;\n\n            if (obj is INameable)\n            {\n                (obj as INameable).SetDirty();\n                return;\n            }\n\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\n            if (go != null)\n            {\n                var cache = go.GetComponent<GameObjectNameCache>();\n                if (cache != null) cache.SetDirty();\n                return;\n            }\n        }\n\n\n\n        #region Special Types\n\n        public class UnityObjectNameCache : INameable\n        {\n\n            private UnityEngine.Object _obj;\n            private string _nameCache;\n\n            public UnityObjectNameCache(UnityEngine.Object obj)\n            {\n                if (object.ReferenceEquals(obj, null)) throw new System.ArgumentNullException(\"obj\");\n                _obj = obj;\n            }\n\n            public string Name\n            {\n                get\n                {\n                    if (_nameCache == null) _nameCache = _obj.name ?? string.Empty;\n                    return _nameCache;\n                }\n                set\n                {\n                    _nameCache = value ?? string.Empty;\n                    _obj.name = _nameCache;\n                }\n            }\n\n            public bool CompareName(string nm)\n            {\n                if (_nameCache == null) _nameCache = _obj.name ?? string.Empty;\n                return _nameCache == nm;\n            }\n\n            public void SetDirty()\n            {\n                _nameCache = null;\n            }\n\n        }\n\n        private class GameObjectNameCache : MonoBehaviour, INameable\n        {\n            private string _nameCache;\n\n            public string Name\n            {\n                get\n                {\n                    if (_nameCache == null) _nameCache = this.gameObject.name ?? string.Empty;\n                    return _nameCache;\n                }\n                set\n                {\n                    _nameCache = value ?? string.Empty;\n                    this.gameObject.name = _nameCache;\n                }\n            }\n\n            public bool CompareName(string nm)\n            {\n                if (_nameCache == null) _nameCache = this.gameObject.name ?? string.Empty;\n                return _nameCache == nm;\n            }\n\n            public void SetDirty()\n            {\n                _nameCache = null;\n            }\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Utils/ObjUtil.cs",
    "content": "﻿#pragma warning disable 0168 // variable declared but not used.\r\n\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class ObjUtil\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private static System.Func<UnityEngine.Object, bool> _isObjectAlive;\r\n\r\n        private static Dictionary<System.Type, System.Type[]> _interfaceToComponentMap;\r\n\r\n        private static System.Type[] GetInterfaceComponentMap(System.Type tp)\r\n        {\r\n            if (!tp.IsInterface) throw new System.ArgumentException(\"Generic Type is not an interface.\");\r\n\r\n            System.Type[] arr;\r\n            if(_interfaceToComponentMap != null && _interfaceToComponentMap.TryGetValue(tp, out arr))\r\n                return arr;\r\n\r\n            System.Type utp = typeof(UnityEngine.Object);\r\n            arr = (from t in TypeUtil.GetTypesAssignableFrom(tp)\r\n                   where utp.IsAssignableFrom(t)\r\n                   select t).ToArray();\r\n            if (_interfaceToComponentMap == null) _interfaceToComponentMap = new Dictionary<System.Type, System.Type[]>();\r\n            _interfaceToComponentMap[tp] = arr;\r\n\r\n            return arr;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        static ObjUtil()\r\n        {\r\n            try\r\n            {\r\n                var tp = typeof(UnityEngine.Object);\r\n                var meth = tp.GetMethod(\"IsNativeObjectAlive\", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);\r\n                if (meth != null)\r\n                {\r\n                    var d = System.Delegate.CreateDelegate(typeof(System.Func<UnityEngine.Object, bool>), meth) as System.Func<UnityEngine.Object, bool>;\r\n                    _isObjectAlive = (a) => !object.ReferenceEquals(a, null) && d(a);\r\n                }\r\n                else\r\n                    _isObjectAlive = (a) => a != null;\r\n            }\r\n            catch\r\n            {\r\n                //incase there was a change to the UnityEngine.dll\r\n                _isObjectAlive = (a) => a != null;\r\n                UnityEngine.Debug.LogWarning(\"This version of Spacepuppy Framework does not support the version of Unity it's being used with. (ObjUtil)\");\r\n                //throw new System.InvalidOperationException(\"This version of Spacepuppy Framework does not support the version of Unity it's being used with.\");\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Search Methods\r\n        \r\n        public static UnityEngine.Object Find(SearchBy search, string query)\r\n        {\r\n            switch(search)\r\n            {\r\n                case SearchBy.Nothing:\r\n                    return null;\r\n                case SearchBy.Tag:\r\n                    return GameObjectUtil.FindWithMultiTag(query);\r\n                case SearchBy.Name:\r\n                    return UnityEngine.GameObject.Find(query);\r\n                case SearchBy.Type:\r\n                    return ObjUtil.FindObjectOfType(TypeUtil.FindType(query));\r\n                default:\r\n                    return null;\r\n            }\r\n        }\r\n\r\n        public static T Find<T>(SearchBy search, string query) where T : class\r\n        {\r\n            switch (search)\r\n            {\r\n                case SearchBy.Nothing:\r\n                    return null;\r\n                case SearchBy.Tag:\r\n                    return ObjUtil.GetAsFromSource<T>(GameObjectUtil.FindWithMultiTag(query));\r\n                case SearchBy.Name:\r\n                    return ObjUtil.GetAsFromSource<T>(UnityEngine.GameObject.Find(query));\r\n                case SearchBy.Type:\r\n                    return ObjUtil.GetAsFromSource<T>(ObjUtil.FindObjectOfType(TypeUtil.FindType(query)));\r\n                default:\r\n                    return null;\r\n            }\r\n        }\r\n\r\n        public static UnityEngine.Object[] FindAll(SearchBy search, string query)\r\n        {\r\n            switch (search)\r\n            {\r\n                case SearchBy.Nothing:\r\n                    return ArrayUtil.Empty<UnityEngine.Object>();\r\n                case SearchBy.Tag:\r\n                    return GameObjectUtil.FindGameObjectsWithMultiTag(query);\r\n                case SearchBy.Name:\r\n                    {\r\n                        using (var tmp = com.spacepuppy.Collections.TempCollection.GetList<UnityEngine.GameObject>())\r\n                        {\r\n                            GameObjectUtil.FindAllByName(query, tmp);\r\n                            return tmp.ToArray();\r\n                        }\r\n                    }\r\n                case SearchBy.Type:\r\n                    return ObjUtil.FindObjectsOfType(TypeUtil.FindType(query));\r\n                default:\r\n                    return null;\r\n            }\r\n        }\r\n\r\n        public static UnityEngine.Object[] FindAll(SearchBy search, string query, System.Type tp)\r\n        {\r\n            switch (search)\r\n            {\r\n                case SearchBy.Nothing:\r\n                    return ArrayUtil.Empty<UnityEngine.Object>();\r\n                case SearchBy.Tag:\r\n                    {\r\n                        using (var tmp = com.spacepuppy.Collections.TempCollection.GetList<UnityEngine.GameObject>())\r\n                        using (var results = com.spacepuppy.Collections.TempCollection.GetList<UnityEngine.Object>())\r\n                        {\r\n                            GameObjectUtil.FindGameObjectsWithMultiTag(query, tmp);\r\n                            var e = tmp.GetEnumerator();\r\n                            while (e.MoveNext())\r\n                            {\r\n                                var o = ObjUtil.GetAsFromSource(tp, e.Current) as UnityEngine.Object;\r\n                                if (o != null) results.Add(o);\r\n                            }\r\n                            return results.ToArray();\r\n                        }\r\n                    }\r\n                case SearchBy.Name:\r\n                    {\r\n                        using (var tmp = com.spacepuppy.Collections.TempCollection.GetList<UnityEngine.GameObject>())\r\n                        using (var results = com.spacepuppy.Collections.TempCollection.GetList<UnityEngine.Object>())\r\n                        {\r\n                            GameObjectUtil.FindAllByName(query, tmp);\r\n                            var e = tmp.GetEnumerator();\r\n                            while (e.MoveNext())\r\n                            {\r\n                                var o = ObjUtil.GetAsFromSource(tp, e.Current) as UnityEngine.Object;\r\n                                if (o != null) results.Add(o);\r\n                            }\r\n                            return results.ToArray();\r\n                        }\r\n                    }\r\n                case SearchBy.Type:\r\n                    {\r\n                        using (var results = com.spacepuppy.Collections.TempCollection.GetList<UnityEngine.Object>())\r\n                        {\r\n                            foreach (var o in ObjUtil.FindObjectsOfType(TypeUtil.FindType(query)))\r\n                            {\r\n                                var o2 = ObjUtil.GetAsFromSource(tp, o) as UnityEngine.Object;\r\n                                if (o2 != null) results.Add(o2);\r\n                            }\r\n                            return results.ToArray();\r\n                        }\r\n                    }\r\n                default:\r\n                    return null;\r\n            }\r\n        }\r\n\r\n        public static T[] FindAll<T>(SearchBy search, string query) where T : class\r\n        {\r\n            switch (search)\r\n            {\r\n                case SearchBy.Nothing:\r\n                    return ArrayUtil.Empty<T>();\r\n                case SearchBy.Tag:\r\n                    {\r\n                        using (var tmp = com.spacepuppy.Collections.TempCollection.GetList<UnityEngine.GameObject>())\r\n                        using (var results = com.spacepuppy.Collections.TempCollection.GetList<T>())\r\n                        {\r\n                            GameObjectUtil.FindGameObjectsWithMultiTag(query, tmp);\r\n                            var e = tmp.GetEnumerator();\r\n                            while(e.MoveNext())\r\n                            {\r\n                                var o = ObjUtil.GetAsFromSource<T>(e.Current);\r\n                                if (o != null) results.Add(o);\r\n                            }\r\n                            return results.ToArray();\r\n                        }\r\n                    }\r\n                case SearchBy.Name:\r\n                    {\r\n                        using (var tmp = com.spacepuppy.Collections.TempCollection.GetList<UnityEngine.GameObject>())\r\n                        using (var results = com.spacepuppy.Collections.TempCollection.GetList<T>())\r\n                        {\r\n                            GameObjectUtil.FindAllByName(query, tmp);\r\n                            var e = tmp.GetEnumerator();\r\n                            while (e.MoveNext())\r\n                            {\r\n                                var o = ObjUtil.GetAsFromSource<T>(e.Current);\r\n                                if (o != null) results.Add(o);\r\n                            }\r\n                            return results.ToArray();\r\n                        }\r\n                    }\r\n                case SearchBy.Type:\r\n                    {\r\n                        using (var results = com.spacepuppy.Collections.TempCollection.GetList<T>())\r\n                        {\r\n                            foreach(var o in ObjUtil.FindObjectsOfType(TypeUtil.FindType(query)))\r\n                            {\r\n                                var o2 = ObjUtil.GetAsFromSource<T>(o);\r\n                                if (o2 != null) results.Add(o2);\r\n                            }\r\n                            return results.ToArray();\r\n                        }\r\n                    }\r\n                default:\r\n                    return null;\r\n            }\r\n        }\r\n\r\n\r\n        public static T FindObjectOfInterface<T>() where T : class\r\n        {\r\n            var tp = typeof(T);\r\n            var map = GetInterfaceComponentMap(tp);\r\n            if (map.Length == 0) return null;\r\n\r\n            foreach(var ctp in map)\r\n            {\r\n                var obj = UnityEngine.Object.FindObjectOfType(ctp);\r\n                if (obj != null) return obj as T;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static UnityEngine.Object FindObjectOfType(System.Type tp)\r\n        {\r\n            if (tp == null) return null;\r\n\r\n            if(tp.IsInterface)\r\n            {\r\n                var map = GetInterfaceComponentMap(tp);\r\n                if (map.Length == 0) return null;\r\n\r\n                foreach (var ctp in map)\r\n                {\r\n                    var obj = UnityEngine.Object.FindObjectOfType(ctp);\r\n                    if (obj != null) return obj;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return UnityEngine.Object.FindObjectOfType(tp);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n\r\n        public static T[] FindObjectsOfInterface<T>() where T : class\r\n        {\r\n            var tp = typeof(T);\r\n            var map = GetInterfaceComponentMap(tp);\r\n            using (var lst = TempCollection.GetSet<T>())\r\n            {\r\n                foreach(var ctp in map)\r\n                {\r\n                    foreach(var obj in UnityEngine.Object.FindObjectsOfType(ctp))\r\n                    {\r\n                        lst.Add(obj as T);\r\n                    }\r\n                }\r\n                return lst.ToArray();\r\n            }\r\n        }\r\n\r\n        public static int FindObjectsOfInterface<T>(ICollection<T> lst) where T : class\r\n        {\r\n            var tp = typeof(T);\r\n            var map = GetInterfaceComponentMap(tp);\r\n            int cnt = 0;\r\n            foreach (var ctp in map)\r\n            {\r\n                var arr = UnityEngine.Object.FindObjectsOfType(ctp);\r\n                cnt += arr.Length;\r\n                foreach (var obj in arr)\r\n                {\r\n                    lst.Add(obj as T);\r\n                }\r\n            }\r\n            return cnt;\r\n        }\r\n\r\n        public static UnityEngine.Object[] FindObjectsOfType(System.Type tp)\r\n        {\r\n            if (tp == null) return ArrayUtil.Empty<UnityEngine.Object>();\r\n\r\n            if (tp.IsInterface)\r\n            {\r\n                var map = GetInterfaceComponentMap(tp);\r\n                using (var lst = TempCollection.GetList<UnityEngine.Object>())\r\n                {\r\n                    foreach (var ctp in map)\r\n                    {\r\n                        lst.AddRange(UnityEngine.Object.FindObjectsOfType(ctp));\r\n                    }\r\n                    return lst.ToArray();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return UnityEngine.Object.FindObjectsOfType(tp);\r\n            }\r\n        }\r\n\r\n        public static int FindObjectsOfType(System.Type tp, ICollection<UnityEngine.Object> lst)\r\n        {\r\n            if (tp == null) return 0;\r\n\r\n            if (tp.IsInterface)\r\n            {\r\n                var map = GetInterfaceComponentMap(tp);\r\n                int cnt = 0;\r\n                foreach (var ctp in map)\r\n                {\r\n                    var arr = UnityEngine.Object.FindObjectsOfType(ctp);\r\n                    cnt += arr.Length;\r\n                    lst.AddRange(arr);\r\n                }\r\n                return cnt;\r\n            }\r\n            else\r\n            {\r\n                var arr = UnityEngine.Object.FindObjectsOfType(tp);\r\n                foreach (var obj in arr)\r\n                {\r\n                    lst.Add(obj);\r\n                }\r\n                return arr.Length;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Casting\r\n        \r\n        public static object ReduceIfProxy(this object obj)\r\n        {\r\n            if (obj is IProxy) return (obj as IProxy).GetTarget();\r\n\r\n            return obj;\r\n        }\r\n\r\n        public static object ReduceIfProxy(this object obj, object arg)\r\n        {\r\n            if (obj is IProxy) return (obj as IProxy).GetTarget(arg);\r\n\r\n            return obj;\r\n        }\r\n\r\n        public static T GetAsFromSource<T>(object obj) where T : class\r\n        {\r\n            if (obj == null) return null;\r\n            if (obj is T) return obj as T;\r\n            if (obj is IComponent)\r\n            {\r\n                var c = (obj as IComponent).component;\r\n                if (c is T) return c as T;\r\n            }\r\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n            if (go is T) return go as T;\r\n            \r\n            //if (go != null && ComponentUtil.IsAcceptableComponentType(typeof(T))) return go.GetComponentAlt<T>();\r\n            if (go != null)\r\n            {\r\n                var tp = typeof(T);\r\n                if (typeof(SPEntity).IsAssignableFrom(tp))\r\n                    return SPEntity.Pool.GetFromSource(tp, go) as T;\r\n                else if (ComponentUtil.IsAcceptableComponentType(tp))\r\n                    return go.GetComponent(tp) as T;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static bool GetAsFromSource<T>(object obj, out T result, bool respectProxy = false) where T : class\r\n        {\r\n            result = null;\r\n            if (obj == null) return false;\r\n\r\n            if (respectProxy && obj is IProxy)\r\n            {\r\n                obj = (obj as IProxy).GetTarget();\r\n                if (obj == null) return false;\r\n            }\r\n\r\n            if (obj is T)\r\n            {\r\n                result = obj as T;\r\n                return true;\r\n            }\r\n            if (obj is IComponent)\r\n            {\r\n                var c = (obj as IComponent).component;\r\n                if (c is T)\r\n                {\r\n                    result = c as T;\r\n                    return true;\r\n                }\r\n            }\r\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n            if (go is T)\r\n            {\r\n                result = go as T;\r\n                return true;\r\n            }\r\n\r\n            //if (go != null && ComponentUtil.IsAcceptableComponentType(typeof(T))) return go.GetComponentAlt<T>();\r\n            if (go != null)\r\n            {\r\n                var tp = typeof(T);\r\n                if (typeof(SPEntity).IsAssignableFrom(tp))\r\n                {\r\n                    var uobj = SPEntity.Pool.GetFromSource(tp, go);\r\n                    if (uobj == null) return false;\r\n\r\n                    result = uobj as T;\r\n                    return result != null;\r\n                }\r\n                else if (ComponentUtil.IsAcceptableComponentType(tp))\r\n                {\r\n                    var uobj = go.GetComponent(tp);\r\n                    if (uobj == null) return false;\r\n\r\n                    result = uobj as T;\r\n                    return result != null;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static object GetAsFromSource(System.Type tp, object obj)\r\n        {\r\n            if (obj == null) return null;\r\n\r\n            var otp = obj.GetType();\r\n            if (TypeUtil.IsType(otp, tp)) return obj;\r\n            if (obj is IComponent)\r\n            {\r\n                var c = (obj as IComponent).component;\r\n                if (!object.ReferenceEquals(c, null) && TypeUtil.IsType(c.GetType(), tp)) return c;\r\n            }\r\n\r\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n            if (tp == typeof(UnityEngine.GameObject)) return go;\r\n\r\n            if(go != null)\r\n            {\r\n                if (typeof(SPEntity).IsAssignableFrom(tp))\r\n                    return SPEntity.Pool.GetFromSource(tp, go);\r\n                else if (ComponentUtil.IsAcceptableComponentType(tp))\r\n                    return go.GetComponent(tp);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static bool GetAsFromSource(System.Type tp, object obj, out object result, bool respectProxy = false)\r\n        {\r\n            result = null;\r\n            if (obj == null) return false;\r\n\r\n            if (respectProxy && obj is IProxy)\r\n            {\r\n                obj = (obj as IProxy).GetTarget();\r\n                if (obj == null) return false;\r\n            }\r\n\r\n            var otp = obj.GetType();\r\n            if (TypeUtil.IsType(otp, tp))\r\n            {\r\n                result = obj;\r\n                return true;\r\n            }\r\n            if (obj is IComponent)\r\n            {\r\n                var c = (obj as IComponent).component;\r\n                if (!object.ReferenceEquals(c, null) && TypeUtil.IsType(c.GetType(), tp))\r\n                {\r\n                    result = c;\r\n                    return true;\r\n                }\r\n            }\r\n\r\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n            if (tp == typeof(UnityEngine.GameObject))\r\n            {\r\n                result = go;\r\n                return true;\r\n            }\r\n\r\n            if (go != null)\r\n            {\r\n                if (typeof(SPEntity).IsAssignableFrom(tp))\r\n                {\r\n                    var uobj = SPEntity.Pool.GetFromSource(tp, go);\r\n                    if (uobj == null) return false;\r\n\r\n                    result = uobj;\r\n                    return true;\r\n                }\r\n                else if (ComponentUtil.IsAcceptableComponentType(tp))\r\n                {\r\n                    var uobj = go.GetComponent(tp);\r\n                    if (uobj == null) return false;\r\n\r\n                    result = uobj;\r\n                    return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n\r\n        public static T GetAsFromSource<T>(object obj, bool respectProxy) where T : class\r\n        {\r\n            if (obj == null) return null;\r\n\r\n            if (respectProxy && obj is IProxy)\r\n            {\r\n                obj = (obj as IProxy).GetTarget();\r\n                if (obj == null) return null;\r\n            }\r\n\r\n            if (obj is T) return obj as T;\r\n            if (obj is IComponent)\r\n            {\r\n                var c = (obj as IComponent).component;\r\n                if (c is T) return c as T;\r\n            }\r\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n            if (go is T) return go as T;\r\n\r\n            //if (go != null && ComponentUtil.IsAcceptableComponentType(typeof(T))) return go.GetComponentAlt<T>();\r\n            if (go != null)\r\n            {\r\n                var tp = typeof(T);\r\n                if (typeof(SPEntity).IsAssignableFrom(tp))\r\n                    return SPEntity.Pool.GetFromSource(tp, go) as T;\r\n                else if (ComponentUtil.IsAcceptableComponentType(tp))\r\n                    return go.GetComponent(tp) as T;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static object GetAsFromSource(System.Type tp, object obj, bool respectProxy)\r\n        {\r\n            if (obj == null) return null;\r\n\r\n            if (respectProxy && obj is IProxy)\r\n            {\r\n                obj = (obj as IProxy).GetTarget();\r\n                if (obj == null) return null;\r\n            }\r\n\r\n            var otp = obj.GetType();\r\n            if (TypeUtil.IsType(otp, tp)) return obj;\r\n            if (obj is IComponent)\r\n            {\r\n                var c = (obj as IComponent).component;\r\n                if (!object.ReferenceEquals(c, null) && TypeUtil.IsType(c.GetType(), tp)) return c;\r\n            }\r\n\r\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n            if (tp == typeof(UnityEngine.GameObject)) return go;\r\n\r\n            if (go != null)\r\n            {\r\n                if (typeof(SPEntity).IsAssignableFrom(tp))\r\n                    return SPEntity.Pool.GetFromSource(tp, go);\r\n                else if (ComponentUtil.IsAcceptableComponentType(tp))\r\n                    return go.GetComponent(tp);\r\n            }\r\n\r\n            return null;\r\n        }\r\n        \r\n\r\n\r\n        public static T[] GetAllFromSource<T>(object obj, bool includeChildren = false) where T : class\r\n        {\r\n            if (obj == null) return ArrayUtil.Empty<T>();\r\n\r\n            using (var set = TempCollection.GetSet<T>())\r\n            {\r\n                if (obj is T) set.Add(obj as T);\r\n                if (obj is IComponent)\r\n                {\r\n                    var c = (obj as IComponent).component;\r\n                    if (c is T) set.Add(c as T);\r\n                }\r\n\r\n                var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n                if (go is T) set.Add(go as T);\r\n\r\n                //if (go != null && ComponentUtil.IsAcceptableComponentType(typeof(T))) go.GetComponentsAlt<T>(set);\r\n                if (go != null)\r\n                {\r\n                    var tp = typeof(T);\r\n                    if (typeof(SPEntity).IsAssignableFrom(tp))\r\n                    {\r\n                        var entity = SPEntity.Pool.GetFromSource(tp, go) as T;\r\n                        if (entity != null) set.Add(entity);\r\n                    }\r\n                    else if (typeof(UnityEngine.GameObject).IsAssignableFrom(tp))\r\n                    {\r\n                        if (includeChildren)\r\n                        {\r\n                            using (var lst = TempCollection.GetList<UnityEngine.Transform>())\r\n                            {\r\n                                go.GetComponentsInChildren<UnityEngine.Transform>(lst);\r\n\r\n                                var e = lst.GetEnumerator();\r\n                                while (e.MoveNext())\r\n                                {\r\n                                    set.Add(e.Current.gameObject as T);\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    if (ComponentUtil.IsAcceptableComponentType(tp))\r\n                    {\r\n                        if (includeChildren)\r\n                            go.GetChildComponents<T>(set, true);\r\n                        else\r\n                            go.GetComponentsAlt<T>(set);\r\n                    }\r\n                }\r\n\r\n                return set.Count > 0 ? set.ToArray() : ArrayUtil.Empty<T>();\r\n            }\r\n        }\r\n\r\n        public static object[] GetAllFromSource(System.Type tp, object obj, bool includeChildren = false)\r\n        {\r\n            if (obj == null) return ArrayUtil.Empty<object>();\r\n\r\n            using (var set = TempCollection.GetSet<object>())\r\n            {\r\n                var otp = obj.GetType();\r\n                if (TypeUtil.IsType(otp, tp)) set.Add(obj);\r\n                if (obj is IComponent)\r\n                {\r\n                    var c = (obj as IComponent).component;\r\n                    if (!object.ReferenceEquals(c, null) && TypeUtil.IsType(c.GetType(), tp)) set.Add(c);\r\n                }\r\n\r\n                var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n                if (go != null)\r\n                {\r\n                    if (typeof(SPEntity).IsAssignableFrom(tp))\r\n                    {\r\n                        var entity = SPEntity.Pool.GetFromSource(tp, go);\r\n                        if (entity != null) set.Add(entity);\r\n                    }\r\n                    else if(typeof(UnityEngine.GameObject).IsAssignableFrom(tp))\r\n                    {\r\n                        if (includeChildren)\r\n                        {\r\n                            using (var lst = TempCollection.GetList<UnityEngine.Transform>())\r\n                            {\r\n                                go.GetComponentsInChildren<UnityEngine.Transform>(lst);\r\n\r\n                                var e = lst.GetEnumerator();\r\n                                while (e.MoveNext())\r\n                                {\r\n                                    set.Add(e.Current.gameObject);\r\n                                }\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            set.Add(go);\r\n                        }\r\n                    }\r\n                    else if(ComponentUtil.IsAcceptableComponentType(tp))\r\n                    {\r\n                        using (var lst = TempCollection.GetList<UnityEngine.Component>())\r\n                        {\r\n                            if (includeChildren)\r\n                                ComponentUtil.GetChildComponents(go, tp, lst, true);\r\n                            else\r\n                                go.GetComponents(tp, lst);\r\n\r\n                            var e = lst.GetEnumerator();\r\n                            while(e.MoveNext())\r\n                            {\r\n                                set.Add(e.Current);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                return set.Count > 0 ? set.ToArray() : ArrayUtil.Empty<object>();\r\n            }\r\n        }\r\n\r\n\r\n\r\n        public static bool IsType(object obj, System.Type tp)\r\n        {\r\n            if (obj == null) return false;\r\n\r\n            return TypeUtil.IsType(obj.GetType(), tp);\r\n        }\r\n\r\n        public static bool IsType(object obj, System.Type tp, bool respectProxy)\r\n        {\r\n            if (obj == null) return false;\r\n\r\n            if (respectProxy && obj is IProxy)\r\n            {\r\n                return TypeUtil.IsType((obj as IProxy).GetTargetType(), tp);\r\n            }\r\n            else\r\n            {\r\n                return TypeUtil.IsType(obj.GetType(), tp);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Destruction Methods\r\n\r\n        public static void SmartDestroy(UnityEngine.Object obj)\r\n        {\r\n            if (obj.IsNullOrDestroyed()) return;\r\n\r\n            if (UnityEngine.Application.isEditor && !UnityEngine.Application.isPlaying)\r\n            {\r\n                UnityEngine.Object.DestroyImmediate(obj);\r\n            }\r\n            else\r\n            {\r\n                //UnityEngine.Object.Destroy(obj);\r\n                if (obj is UnityEngine.GameObject)\r\n                    (obj as UnityEngine.GameObject).Kill();\r\n                else if (obj is UnityEngine.Transform)\r\n                    (obj as UnityEngine.Transform).gameObject.Kill();\r\n                else\r\n                    UnityEngine.Object.Destroy(obj);\r\n            }\r\n        }\r\n\r\n        public static System.Func<UnityEngine.Object, bool> IsObjectAlive\r\n        {\r\n            get { return _isObjectAlive; }\r\n        }\r\n        \r\n        public static bool IsDisposed(this ISPDisposable obj)\r\n        {\r\n            if (object.ReferenceEquals(obj, null)) return true;\r\n\r\n            return obj.IsDisposed;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns true if the object is either a null reference or has been destroyed by unity. \r\n        /// This will respect ISPDisposable over all else.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public static bool IsNullOrDestroyed(this System.Object obj)\r\n        {\r\n            if (object.ReferenceEquals(obj, null)) return true;\r\n\r\n            if (obj is ISPDisposable)\r\n                return (obj as ISPDisposable).IsDisposed;\r\n            else if (obj is UnityEngine.Object)\r\n                return !_isObjectAlive(obj as UnityEngine.Object);\r\n            else if (obj is UnityEngine.TrackedReference)\r\n                return (obj as UnityEngine.TrackedReference) == null;\r\n            else if (obj is IComponent)\r\n                return !_isObjectAlive((obj as IComponent).component);\r\n            else if (obj is IGameObjectSource)\r\n                return !_isObjectAlive((obj as IGameObjectSource).gameObject);\r\n            \r\n            return false;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Unlike IsNullOrDestroyed, this only returns true if the managed object half of the object still exists, \r\n        /// but the unmanaged half has been destroyed by unity. \r\n        /// This will respect ISPDisposable over all else.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public static bool IsDestroyed(this System.Object obj)\r\n        {\r\n            if (object.ReferenceEquals(obj, null)) return false;\r\n\r\n            if (obj is ISPDisposable)\r\n                return (obj as ISPDisposable).IsDisposed;\r\n            else if (obj is UnityEngine.Object)\r\n                return !_isObjectAlive(obj as UnityEngine.Object);\r\n            else if (obj is UnityEngine.TrackedReference)\r\n                return (obj as UnityEngine.TrackedReference) == null;\r\n            else if (obj is IComponent)\r\n                return !_isObjectAlive((obj as IComponent).component);\r\n            else if (obj is IGameObjectSource)\r\n                return !_isObjectAlive((obj as IGameObjectSource).gameObject);\r\n\r\n\r\n            //if (obj is UnityEngine.Object)\r\n            //    return (obj as UnityEngine.Object) == null;\r\n            //else if (obj is IComponent)\r\n            //    return (obj as IComponent).component == null;\r\n            //else if (obj is IGameObjectSource)\r\n            //    return (obj as IGameObjectSource).gameObject == null;\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool IsAlive(this System.Object obj)\r\n        {\r\n            if (object.ReferenceEquals(obj, null)) return false;\r\n\r\n            if (obj is ISPDisposable)\r\n                return !(obj as ISPDisposable).IsDisposed;\r\n            else if (obj is UnityEngine.Object)\r\n                return _isObjectAlive(obj as UnityEngine.Object);\r\n            else if (obj is IComponent)\r\n                return _isObjectAlive((obj as IComponent).component);\r\n            else if (obj is IGameObjectSource)\r\n                return _isObjectAlive((obj as IGameObjectSource).gameObject);\r\n\r\n\r\n            //if (obj is UnityEngine.Object)\r\n            //    return (obj as UnityEngine.Object) != null;\r\n            //else if (obj is IComponent)\r\n            //    return (obj as IComponent).component != null;\r\n            //else if (obj is IGameObjectSource)\r\n            //    return (obj as IGameObjectSource).gameObject != null;\r\n\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns true if the object passed in is one of the many UnityEngine.Object's that unity will create that are invalid and report being null, but ReferenceEquals reports not being null. \r\n        /// This is opposed to 'IsDestroyed' since this object should have never existed in the first place.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public static bool IsInvalidObject(UnityEngine.Object obj)\r\n        {\r\n            //note - we use 'GetHashCode' because it returns the instanceId BUT doesn't do the stupid main thread test\r\n            return !object.ReferenceEquals(obj, null) && obj.GetHashCode() == 0;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns true if the Unity object passed in is not null but isn't necessarily alive/destroyed. \r\n        /// This is a compliment to IsInvalidObject for use when you want to determine if some value was ever once valid. \r\n        /// For example if in the inspector you leave a UnityEngin.Object field null, the serializer will actually populate it with an 'Invalid Object'. \r\n        /// If you ever needed to differentiate between if that value was ever a value but since destroyed VS being an invalid object, this will help.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public static bool IsValidObject(UnityEngine.Object obj)\r\n        {\r\n            //note - we use 'GetHashCode' because it returns the instanceId BUT doesn't do the stupid main thread test\r\n            return !object.ReferenceEquals(obj, null) && obj.GetHashCode() != 0;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Misc\r\n\r\n        /// <summary>\r\n        /// Returns true if 'obj' is 'parent', attached to 'parent', or part of the child hiearchy of 'parent'.\r\n        /// </summary>\r\n        /// <param name=\"parent\"></param>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public static bool IsRelatedTo(UnityEngine.Object parent, UnityEngine.Object obj)\r\n        {\r\n            if (parent == null || obj == null) return false;\r\n            if (parent == obj) return true;\r\n\r\n            var go = GameObjectUtil.GetGameObjectFromSource(parent);\r\n            if (go == null) return false;\r\n\r\n            var child = GameObjectUtil.GetGameObjectFromSource(obj);\r\n            if (child == null) return false;\r\n\r\n            if (go == child) return true;\r\n            return child.transform.IsChildOf(go.transform);\r\n        }\r\n\r\n        public static bool EqualsAny(System.Object obj, params System.Object[] others)\r\n        {\r\n            return System.Array.IndexOf(others, obj) >= 0;\r\n        }\r\n\r\n\r\n        public static T ExtractDelegate<T>(object obj, string name, bool ignoreCase = false, bool throwOnBindFailure = false) where T : class\r\n        {\r\n            if (obj == null) throw new System.ArgumentNullException(\"obj\");\r\n            var delegateType = typeof(T);\r\n            if (!delegateType.IsSubclassOf(typeof(System.Delegate))) throw new TypeArgumentMismatchException(delegateType, typeof(System.Delegate), \"T\");\r\n\r\n            return System.Delegate.CreateDelegate(delegateType, obj, name, ignoreCase, throwOnBindFailure) as T;\r\n        }\r\n\r\n        public static System.Delegate ExtractDelegate(System.Type delegateType, object obj, string name, bool ignoreCase = false, bool throwOnBindFailure = false)\r\n        {\r\n            if (delegateType == null) throw new System.ArgumentNullException(\"delegateType\");\r\n            if (obj == null) throw new System.ArgumentNullException(\"obj\");\r\n            if (!delegateType.IsSubclassOf(typeof(System.Delegate))) throw new TypeArgumentMismatchException(delegateType, typeof(System.Delegate), \"delegateType\");\r\n\r\n            return System.Delegate.CreateDelegate(delegateType, obj, name, ignoreCase, throwOnBindFailure);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/PrefabUtil.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class PrefabUtil\r\n    {\r\n\r\n\r\n        public static GameObject Create(GameObject prefab)\r\n        {\r\n            return UnityEngine.Object.Instantiate(prefab) as GameObject;\r\n        }\r\n\r\n        public static GameObject Create(GameObject prefab, Vector3 pos, Quaternion rot)\r\n        {\r\n            return UnityEngine.Object.Instantiate(prefab, pos, rot) as GameObject;\r\n        }\r\n\r\n        public static GameObject Create(GameObject prefab, Transform parent)\r\n        {\r\n            if (parent == null) return Create(prefab);\r\n\r\n            //NOTE - old method, no longer works in unity 5.3.x, replaced with new version\r\n            //prefab.AddOrGetComponent<EarlyParentSetter>().Init(parent);\r\n            //return UnityEngine.Object.Instantiate(prefab, parent.position, parent.rotation) as GameObject;\r\n\r\n            //NOTE - this appears to work, thanks to help from @Polymorphik\r\n            bool isActive = prefab.activeSelf;\r\n            prefab.SetActive(false);\r\n            var result = UnityEngine.Object.Instantiate(prefab, parent.position, parent.rotation) as GameObject;\r\n            result.transform.parent = parent;\r\n            result.SetActive(isActive);\r\n            prefab.SetActive(isActive);\r\n            return result;\r\n        }\r\n\r\n        public static GameObject Create(GameObject prefab, Vector3 pos, Quaternion rot, Transform parent)\r\n        {\r\n            if (parent == null) return Create(prefab, pos, rot);\r\n\r\n            //NOTE - old method, no longer works in unity 5.3.x, replaced with new version\r\n            //prefab.AddOrGetComponent<EarlyParentSetter>().Init(parent);\r\n            //return UnityEngine.Object.Instantiate(prefab, pos, rot) as GameObject;\r\n\r\n            //NOTE - this appears to work, thanks to help from @Polymorphik\r\n            bool isActive = prefab.activeSelf;\r\n            prefab.SetActive(false);\r\n            var result = UnityEngine.Object.Instantiate(prefab, pos, rot) as GameObject;\r\n            result.transform.parent = parent;\r\n            result.SetActive(isActive);\r\n            prefab.SetActive(isActive);\r\n            return result;\r\n        }\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/PrimitiveUtil.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class PrimitiveUtil\r\n    {\r\n\r\n        #region CreatePrimitive\r\n\r\n        public static GameObject CreatePrimitive(PrimitiveType type)\r\n        {\r\n            return GameObject.CreatePrimitive(type);\r\n        }\r\n\r\n        public static GameObject CreatePrimitive(PrimitiveType type, bool bLeaveOutMesh)\r\n        {\r\n            return CreatePrimitive(type, bLeaveOutMesh, false);\r\n        }\r\n\r\n        public static GameObject CreatePrimitive(PrimitiveType type, bool bLeaveOutMesh, bool bTrigger)\r\n        {\r\n            GameObject go = null;\r\n            if (bLeaveOutMesh)\r\n            {\r\n                switch (type)\r\n                {\r\n                    case PrimitiveType.Cube:\r\n                        go = new GameObject(type.ToString());\r\n                        go.AddComponent<BoxCollider>();\r\n                        break;\r\n                    case PrimitiveType.Capsule:\r\n                        go = new GameObject(type.ToString());\r\n                        var cap = go.AddComponent<CapsuleCollider>();\r\n                        cap.radius = 0.5f;\r\n                        cap.height = 2.0f;\r\n                        break;\r\n                    case PrimitiveType.Sphere:\r\n                        go = new GameObject(type.ToString());\r\n                        go.AddComponent<SphereCollider>();\r\n                        break;\r\n                    case PrimitiveType.Cylinder:\r\n                        go = GameObject.CreatePrimitive(PrimitiveType.Cylinder);\r\n                        ObjUtil.SmartDestroy(go.GetComponent<MeshCollider>());\r\n                        var coll = go.AddComponent<MeshCollider>();\r\n                        coll.sharedMesh = go.GetComponent<MeshFilter>().sharedMesh;\r\n                        ObjUtil.SmartDestroy(go.GetComponent<MeshFilter>());\r\n                        ObjUtil.SmartDestroy(go.GetComponent<MeshRenderer>());\r\n                        break;\r\n                    case PrimitiveType.Plane:\r\n                        go = GameObject.CreatePrimitive(PrimitiveType.Plane);\r\n                        ObjUtil.SmartDestroy(go.GetComponent<MeshFilter>());\r\n                        ObjUtil.SmartDestroy(go.GetComponent<MeshRenderer>());\r\n                        break;\r\n                    case PrimitiveType.Quad:\r\n                        go = GameObject.CreatePrimitive(PrimitiveType.Quad);\r\n                        ObjUtil.SmartDestroy(go.GetComponent<MeshFilter>());\r\n                        ObjUtil.SmartDestroy(go.GetComponent<MeshRenderer>());\r\n                        break;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                go = GameObject.CreatePrimitive(type);\r\n            }\r\n\r\n            if (go != null)\r\n            {\r\n                go.GetComponent<Collider>().isTrigger = bTrigger;\r\n            }\r\n            return go;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region AddPrimitiveCollider\r\n\r\n        public static Collider AddPrimitiveCollider(this Component comp, PrimitiveType type, bool bTrigger)\r\n        {\r\n            if (comp == null) throw new System.ArgumentNullException(\"comp\");\r\n            return AddPrimitiveCollider(comp.gameObject, type, bTrigger);\r\n        }\r\n\r\n        public static Collider AddPrimitiveCollider(this GameObject go, PrimitiveType type, bool bTrigger)\r\n        {\r\n            switch (type)\r\n            {\r\n                case PrimitiveType.Cube:\r\n                    return go.AddComponent<BoxCollider>();\r\n                case PrimitiveType.Capsule:\r\n                case PrimitiveType.Cylinder:\r\n                    var cap = go.AddComponent<CapsuleCollider>();\r\n                    cap.radius = 0.5f;\r\n                    cap.height = 2.0f;\r\n                    return cap;\r\n                case PrimitiveType.Sphere:\r\n                    return go.AddComponent<SphereCollider>();\r\n                case PrimitiveType.Plane:\r\n                case PrimitiveType.Quad:\r\n                    var box = go.AddComponent<BoxCollider>();\r\n                    box.size = new Vector3(1f, 0.01f, 1f);\r\n                    return box;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region CreateMesh\r\n\r\n        private static Mesh _sphereMesh;\r\n        private static Mesh _capsuleMesh;\r\n        private static Mesh _cylinderMesh;\r\n        private static Mesh _cubeMesh;\r\n        private static Mesh _planeMesh;\r\n        private static Mesh _quadMesh;\r\n        private static Mesh _ringMesh;\r\n        private static Mesh _lineMesh;\r\n\r\n        public static Mesh SphereMesh\r\n        {\r\n            get\r\n            {\r\n                if (_sphereMesh == null) _sphereMesh = CreateMesh(PrimitiveType.Sphere);\r\n                return _sphereMesh;\r\n            }\r\n        }\r\n        public static Mesh CapsuleMesh\r\n        {\r\n            get\r\n            {\r\n                if (_capsuleMesh == null) _capsuleMesh = CreateMesh(PrimitiveType.Capsule);\r\n                return _capsuleMesh;\r\n            }\r\n        }\r\n        public static Mesh CylinderMesh\r\n        {\r\n            get\r\n            {\r\n                if (_cylinderMesh == null) _cylinderMesh = CreateMesh(PrimitiveType.Cylinder);\r\n                return _cylinderMesh;\r\n            }\r\n        }\r\n        public static Mesh CubeMesh\r\n        {\r\n            get\r\n            {\r\n                if (_cubeMesh == null) _cubeMesh = CreateMesh(PrimitiveType.Cube);\r\n                return _cubeMesh;\r\n            }\r\n        }\r\n        public static Mesh PlaneMesh\r\n        {\r\n            get\r\n            {\r\n                if (_planeMesh == null) _planeMesh = CreateMesh(PrimitiveType.Plane);\r\n                return _planeMesh;\r\n            }\r\n        }\r\n        public static Mesh QuadMesh\r\n        {\r\n            get\r\n            {\r\n                if (_quadMesh == null) _quadMesh = CreateMesh(PrimitiveType.Quad);\r\n                return _quadMesh;\r\n            }\r\n        }\r\n        public static Mesh RingMesh\r\n        {\r\n            get\r\n            {\r\n                if (_ringMesh == null) _ringMesh = CreateRingMesh();\r\n                return _ringMesh;\r\n            }\r\n        }\r\n        public static Mesh LineMesh\r\n        {\r\n            get\r\n            {\r\n                if (_lineMesh == null) _lineMesh = CreateLineMesh();\r\n                return _lineMesh;\r\n            }\r\n        }\r\n\r\n        public static Mesh GetMesh(PrimitiveType type)\r\n        {\r\n            switch (type)\r\n            {\r\n                case PrimitiveType.Sphere:\r\n                    return SphereMesh;\r\n                case PrimitiveType.Capsule:\r\n                    return CapsuleMesh;\r\n                case PrimitiveType.Cylinder:\r\n                    return CylinderMesh;\r\n                case PrimitiveType.Cube:\r\n                    return CubeMesh;\r\n                case PrimitiveType.Plane:\r\n                    return PlaneMesh;\r\n                case PrimitiveType.Quad:\r\n                    return QuadMesh;\r\n            }\r\n            return null;\r\n        }\r\n\r\n        public static Mesh CreateMesh(PrimitiveType type)\r\n        {\r\n            var go = CreatePrimitive(type);\r\n            var mesh = go.GetComponent<MeshFilter>().sharedMesh;\r\n            ObjUtil.SmartDestroy(go);\r\n            return mesh;\r\n        }\r\n        public static Mesh CreateRingMesh()\r\n        {\r\n            const float OUT_RADIUS = 0.5f;\r\n            const float IN_RADIUS = 0.45f;\r\n            const int SEGMENT_CNT = 64;\r\n\r\n            List<Vector3> verts = new List<Vector3>();\r\n            List<Vector2> uvs = new List<Vector2>();\r\n            List<int> tris = new List<int>();\r\n\r\n            Vector3 outv = new Vector3(0f, 0f, OUT_RADIUS);\r\n            Vector3 inv = new Vector3(0f, 0f, IN_RADIUS);\r\n            for (int i = 0; i < SEGMENT_CNT; i++)\r\n            {\r\n                float a1 = (float)i * 360f / (float)SEGMENT_CNT;\r\n                float a2 = (float)(i + 1) * 360f / (float)SEGMENT_CNT;\r\n                Quaternion r1 = Quaternion.Euler(0f, 180f + a1, 0f);\r\n                Quaternion r2 = Quaternion.Euler(0f, 180f + a2, 0f);\r\n\r\n                int cnt = verts.Count;\r\n                verts.Add(r1 * inv);\r\n                verts.Add(r1 * outv);\r\n                verts.Add(r2 * outv);\r\n                verts.Add(r2 * inv);\r\n\r\n                uvs.Add(new Vector2(0f, a1 / 360f));\r\n                uvs.Add(new Vector2(1f, a1 / 360f));\r\n                uvs.Add(new Vector2(1f, a2 / 360f));\r\n                uvs.Add(new Vector2(0f, a2 / 360f));\r\n\r\n                tris.Add(cnt);\r\n                tris.Add(cnt + 1);\r\n                tris.Add(cnt + 2);\r\n                tris.Add(cnt);\r\n                tris.Add(cnt + 2);\r\n                tris.Add(cnt + 3);\r\n                tris.Add(cnt + 2);\r\n                tris.Add(cnt + 1);\r\n                tris.Add(cnt);\r\n                tris.Add(cnt + 3);\r\n                tris.Add(cnt + 2);\r\n                tris.Add(cnt);\r\n            }\r\n\r\n            var mesh = new Mesh();\r\n            mesh.vertices = verts.ToArray();\r\n            mesh.uv = uvs.ToArray();\r\n            mesh.triangles = tris.ToArray();\r\n            mesh.RecalculateNormals();\r\n            mesh.RecalculateBounds();\r\n\r\n            return mesh;\r\n        }\r\n        public static Mesh CreateLineMesh()\r\n        {\r\n            var mesh = new Mesh();\r\n            mesh.vertices = new Vector3[] {\r\n                new Vector3(0f, 0.05f, 0f),\r\n                new Vector3(0f, 0.05f, 0.5f),\r\n                new Vector3(0f, -0.05f, 0.5f),\r\n                new Vector3(0f, -0.05f, 0f)\r\n            };\r\n            mesh.uv = new Vector2[4];\r\n            mesh.triangles = new int[]\r\n            {\r\n                0,1,2,0,2,3,3,2,1,3,1,0\r\n            };\r\n            mesh.RecalculateNormals();\r\n            mesh.RecalculateBounds();\r\n            return mesh;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/QuaternionUtil.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class QuaternionUtil\r\n    {\r\n\r\n        public static bool IsNaN(Quaternion q)\r\n        {\r\n            return float.IsNaN(q.x * q.y * q.z * q.w);\r\n        }\r\n\r\n        #region Utils\r\n\r\n        public static Quaternion Normalize(Quaternion q)\r\n        {\r\n            var mag = System.Math.Sqrt(q.w * q.w + q.x * q.x + q.y * q.y + q.z * q.z);\r\n            q.w = (float)((double)q.w / mag);\r\n            q.x = (float)((double)q.x / mag);\r\n            q.y = (float)((double)q.y / mag);\r\n            q.z = (float)((double)q.z / mag);\r\n            return q;\r\n        }\r\n\r\n        /// <summary>\r\n        /// A cleaner version of FromToRotation, Quaternion.FromToRotation for some reason can only handle down to #.## precision.\r\n        /// This will result in true 7 digits of precision down to depths of 0.00000# (depth tested so far).\r\n        /// </summary>\r\n        /// <param name=\"v1\"></param>\r\n        /// <param name=\"v2\"></param>\r\n        /// <returns></returns>\r\n        public static Quaternion FromToRotation(Vector3 v1, Vector3 v2)\r\n        {\r\n            var a = Vector3.Cross(v1, v2);\r\n            double w = System.Math.Sqrt(v1.sqrMagnitude * v2.sqrMagnitude) + Vector3.Dot(v1, v2);\r\n            if (a.sqrMagnitude < 0.0001f)\r\n            {\r\n                //the vectors are parallel, check w to find direction\r\n                //if w is 0 then values are opposite, and we should rotate 180 degrees around some axis\r\n                //otherwise the vectors in the same direction and no rotation should occur\r\n                return (System.Math.Abs(w) < 0.0001d) ? new Quaternion(0f, 1f, 0f, 0f) : Quaternion.identity;\r\n            }\r\n            else\r\n            {\r\n                return new Quaternion(a.x, a.y, a.z, (float)w).normalized;\r\n            }\r\n        }\r\n\r\n        public static Quaternion FromToRotation(Vector3 v1, Vector3 v2, Vector3 defaultAxis)\r\n        {\r\n            var a = Vector3.Cross(v1, v2);\r\n            double w = System.Math.Sqrt(v1.sqrMagnitude * v2.sqrMagnitude) + Vector3.Dot(v1, v2);\r\n            if (a.sqrMagnitude < 0.0001f)\r\n            {\r\n                //the vectors are parallel, check w to find direction\r\n                //if w is 0 then values are opposite, and we should rotate 180 degrees around the supplied axis\r\n                //otherwise the vectors in the same direction and no rotation should occur\r\n                return (System.Math.Abs(w) < 0.0001d) ? new Quaternion(defaultAxis.x, defaultAxis.y, defaultAxis.z, 0f).normalized : Quaternion.identity;\r\n            }\r\n            else\r\n            {\r\n                return new Quaternion(a.x, a.y, a.z, (float)w).normalized;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get the rotation that would be applied to 'start' to end up at 'end'.\r\n        /// </summary>\r\n        /// <param name=\"start\"></param>\r\n        /// <param name=\"end\"></param>\r\n        /// <returns></returns>\r\n        public static Quaternion FromToRotation(Quaternion start, Quaternion end)\r\n        {\r\n            return Quaternion.Inverse(start) * end;\r\n        }\r\n        \r\n        public static Quaternion SpeedSlerp(Quaternion from, Quaternion to, float angularSpeed, float dt, bool bUseRadians = false)\r\n        {\r\n            if (bUseRadians) angularSpeed *= Mathf.Rad2Deg;\r\n            var da = angularSpeed * dt;\r\n            return Quaternion.RotateTowards(from, to, da);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Massages incoming data as a Quaternion.\r\n        /// Vectors will be treated as euler values.\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <returns></returns>\r\n        public static Quaternion MassageAsQuaternion(object value)\r\n        {\r\n            if (value == null) return Quaternion.identity;\r\n            if (value is Quaternion)\r\n            {\r\n                return (Quaternion)value;\r\n            }\r\n            if (value is Vector3)\r\n            {\r\n                var v = (Vector3)value;\r\n                return Quaternion.Euler(v);\r\n            }\r\n            if (value is Vector2)\r\n            {\r\n                var v = (Vector2)value;\r\n                return Quaternion.Euler(v.x, v.y, 0f);\r\n            }\r\n            if (value is Vector4)\r\n            {\r\n                var v = (Vector4)value;\r\n                return new Quaternion(v.x, v.y, v.z, v.w);\r\n            }\r\n            if (ConvertUtil.ValueIsNumericType(value))\r\n            {\r\n                float v = ConvertUtil.ToSingle(value);\r\n                return Quaternion.Euler(v, 0f, 0f);\r\n            }\r\n            return ConvertUtil.ToQuaternion(System.Convert.ToString(value));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Massages incoming data as a an euler vector.\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        /// <returns></returns>\r\n        public static Vector3 MassageAsEuler(object value)\r\n        {\r\n            if (value == null) return Vector3.zero;\r\n            if (value is Vector3)\r\n            {\r\n                var v = (Vector3)value;\r\n                return v;\r\n            }\r\n            if (value is Quaternion)\r\n            {\r\n                return ((Quaternion)value).eulerAngles;\r\n            }\r\n            if (value is Vector2)\r\n            {\r\n                var v = (Vector2)value;\r\n                return new Vector3(v.x, v.y, 0f);\r\n            }\r\n            if (value is Vector4)\r\n            {\r\n                var v = (Vector4)value;\r\n                return (new Quaternion(v.x, v.y, v.z, v.w)).eulerAngles;\r\n            }\r\n            if (ConvertUtil.ValueIsNumericType(value))\r\n            {\r\n                float v = ConvertUtil.ToSingle(value);\r\n                return new Vector3(v, 0f, 0f);\r\n            }\r\n            \r\n            return ConvertUtil.ToVector3(System.Convert.ToString(value));\r\n        }\r\n\r\n        public static Vector3 Normalize(Vector3 euler)\r\n        {\r\n            euler.x = MathUtil.NormalizeAngle(euler.x, false);\r\n            euler.y = MathUtil.NormalizeAngle(euler.y, false);\r\n            euler.z = MathUtil.NormalizeAngle(euler.z, false);\r\n            return euler;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Transform\r\n\r\n        ///// <summary>\r\n        ///// Create a LookRotation for a non-standard 'forward' axis.\r\n        ///// </summary>\r\n        ///// <param name=\"dir\"></param>\r\n        ///// <param name=\"forwardAxis\"></param>\r\n        ///// <returns></returns>\r\n        //public static Quaternion AltForwardLookRotation(Vector3 dir, Vector3 forwardAxis)\r\n        //{\r\n        //    return Quaternion.LookRotation(dir) * Quaternion.FromToRotation(forwardAxis, Vector3.forward);\r\n        //}\r\n\r\n        /// <summary>\r\n        /// Create a LookRotation for a non-standard 'forward' axis.\r\n        /// </summary>\r\n        /// <param name=\"dir\"></param>\r\n        /// <param name=\"forwardAxis\"></param>\r\n        /// <returns></returns>\r\n        public static Quaternion AltForwardLookRotation(Vector3 dir, Vector3 forwardAxis, Vector3 upAxis)\r\n        {\r\n            //return Quaternion.LookRotation(dir, upAxis) * Quaternion.FromToRotation(forwardAxis, Vector3.forward);\r\n            return Quaternion.LookRotation(dir) * Quaternion.Inverse(Quaternion.LookRotation(forwardAxis, upAxis));\r\n        }\r\n        \r\n        /// <summary>\r\n        /// Get the rotated forward axis based on some base forward.\r\n        /// </summary>\r\n        /// <param name=\"rot\">The rotation</param>\r\n        /// <param name=\"baseForward\">Forward with no rotation</param>\r\n        /// <returns></returns>\r\n        public static Vector3 GetAltForward(Quaternion rot, Vector3 baseForward)\r\n        {\r\n            return rot * baseForward;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns a rotation of up attempting to face in the general direction of forward.\r\n        /// </summary>\r\n        /// <param name=\"up\"></param>\r\n        /// <param name=\"targForward\"></param>\r\n        /// <returns></returns>\r\n        public static Quaternion FaceRotation(Vector3 forward, Vector3 up)\r\n        {\r\n            forward = VectorUtil.GetForwardTangent(forward, up);\r\n            return Quaternion.LookRotation(forward, up);\r\n        }\r\n\r\n        public static void GetAngleAxis(this Quaternion q, out Vector3 axis, out float angle)\r\n        {\r\n            if (q.w > 1) q = QuaternionUtil.Normalize(q);\r\n\r\n            //get as doubles for precision\r\n            var qw = (double)q.w;\r\n            var qx = (double)q.x;\r\n            var qy = (double)q.y;\r\n            var qz = (double)q.z;\r\n            var ratio = System.Math.Sqrt(1.0d - qw * qw);\r\n\r\n            angle = (float)(2.0d * System.Math.Acos(qw)) * Mathf.Rad2Deg;\r\n            if (ratio < 0.001d)\r\n            {\r\n                axis = new Vector3(1f, 0f, 0f);\r\n            }\r\n            else\r\n            {\r\n                axis = new Vector3(\r\n                    (float)(qx / ratio),\r\n                    (float)(qy / ratio),\r\n                    (float)(qz / ratio));\r\n                axis.Normalize();\r\n            }\r\n        }\r\n\r\n        public static void GetShortestAngleAxisBetween(Quaternion a, Quaternion b, out Vector3 axis, out float angle)\r\n        {\r\n            var dq = Quaternion.Inverse(a) * b;\r\n            if (dq.w > 1) dq = QuaternionUtil.Normalize(dq);\r\n\r\n            //get as doubles for precision\r\n            var qw = (double)dq.w;\r\n            var qx = (double)dq.x;\r\n            var qy = (double)dq.y;\r\n            var qz = (double)dq.z;\r\n            var ratio = System.Math.Sqrt(1.0d - qw * qw);\r\n\r\n            angle = (float)(2.0d * System.Math.Acos(qw)) * Mathf.Rad2Deg;\r\n            if (ratio < 0.001d)\r\n            {\r\n                axis = new Vector3(1f, 0f, 0f);\r\n            }\r\n            else\r\n            {\r\n                axis = new Vector3(\r\n                    (float)(qx / ratio),\r\n                    (float)(qy / ratio),\r\n                    (float)(qz / ratio));\r\n                axis.Normalize();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region String\r\n\r\n        public static string Stringify(Quaternion q)\r\n        {\r\n            return q.x.ToString() + \",\" + q.y.ToString() + \",\" + q.z.ToString() + \",\" + q.w.ToString();\r\n        }\r\n\r\n        public static string ToDetailedString(this Quaternion v)\r\n        {\r\n            return System.String.Format(\"<{0}, {1}, {2}, {3}>\", v.x, v.y, v.z, v.w);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/Rand/RandomRange.cs",
    "content": "﻿namespace com.spacepuppy.Utils.Rand\r\n{\r\n    public struct IntRange\r\n    {\r\n\r\n        public int Min;\r\n        public int Max;\r\n        public float Weight;\r\n\r\n    }\r\n\r\n    public struct FloatRange\r\n    {\r\n        public float Min;\r\n        public float Max;\r\n        public float Weight;\r\n    }\r\n\r\n    public static class RandomRange\r\n    {\r\n\r\n        public static int Range(this IRandom rng, params IntRange[] ranges)\r\n        {\r\n            if (rng == null) throw new System.ArgumentNullException(\"rng\");\r\n            if (ranges.Length == 0) throw new System.ArgumentException(\"At least one range must be included.\");\r\n            if (ranges.Length == 1) return rng.Range(ranges[0].Max, ranges[0].Min);\r\n\r\n            float total = 0f;\r\n            for (int i = 0; i < ranges.Length; i++) total += ranges[i].Weight;\r\n\r\n            float r = rng.Next();\r\n            float s = 0f;\r\n            //float t;\r\n\r\n            int cnt = ranges.Length - 1;\r\n            for (int i = 0; i < cnt; i++)\r\n            {\r\n                s += ranges[i].Weight / total;\r\n                if (s >= r)\r\n                {\r\n                    //float s2 = (s + ranges[i + 1].Weight) / total;\r\n                    //t = (r - s) / (s2 - s);\r\n                    //return (int)((ranges[i].Max - ranges[i].Min) * t) + ranges[i].Min;\r\n                    return rng.Range(ranges[i].Max, ranges[i].Min);\r\n                }\r\n            }\r\n\r\n            //t = (r - s) / (1f - s);\r\n            //return (int)((ranges[cnt].Max - ranges[cnt].Min) * t) + ranges[cnt].Min;\r\n            return rng.Range(ranges[cnt].Max, ranges[cnt].Min);\r\n        }\r\n\r\n        public static float Range(this IRandom rng, params FloatRange[] ranges)\r\n        {\r\n            if (rng == null) throw new System.ArgumentNullException(\"rng\");\r\n            if (ranges.Length == 0) throw new System.ArgumentException(\"At least one range must be included.\");\r\n            if (ranges.Length == 1) return rng.Range(ranges[0].Max, ranges[0].Min);\r\n\r\n            float total = 0f;\r\n            for (int i = 0; i < ranges.Length; i++) total += ranges[i].Weight;\r\n\r\n            float r = rng.Next();\r\n            float s = 0f;\r\n            //float t;\r\n\r\n            int cnt = ranges.Length - 1;\r\n            for (int i = 0; i < cnt; i++)\r\n            {\r\n                s += ranges[i].Weight / total;\r\n                if (s >= r)\r\n                {\r\n                    //float s2 = (s + ranges[i + 1].Weight) / total;\r\n                    //t = (r - s) / (s2 - s);\r\n                    //return (ranges[i].Max - ranges[i].Min) * t + ranges[i].Min;\r\n                    return rng.Range(ranges[i].Max, ranges[i].Min);\r\n                }\r\n            }\r\n\r\n            //t = (r - s) / (1f - s);\r\n            //return (ranges[cnt].Max - ranges[cnt].Min) * t + ranges[cnt].Min;\r\n            return rng.Range(ranges[cnt].Max, ranges[cnt].Min);\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/RandomEnumUtil.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nusing System.Linq;\n\nusing com.spacepuppy.Collections;\nusing UnityEngine.Rendering;\n\nnamespace com.spacepuppy.Utils\n{\n\n    public interface IWeightedPair<T>\n    {\n        T Value { get; }\n        float Weight { get; }\n    }\n\n    public interface IWeightedPairResolver<TPair, TValue> where TPair : IWeightedPair<TValue>\n    {\n        Func<TPair, float> WeightPredicate { get; }\n        TValue GetValue(TPair pair);\n        float GetWeight(TPair pair);\n    }\n\n    public class WeightedPairResolver<TPair, TValue> : IWeightedPairResolver<TPair, TValue> where TPair : IWeightedPair<TValue>\n    {\n        public static readonly WeightedPairResolver<TPair, TValue> Default = new WeightedPairResolver<TPair, TValue>();\n\n        private Func<TPair, float> _weightPred = (p) => p != null ? p.Weight : 0f;\n        public Func<TPair, float> WeightPredicate { get { return _weightPred; } }\n\n        public TValue GetValue(TPair pair)\n        {\n            return pair != null ? pair.Value : default(TValue);\n        }\n\n        public float GetWeight(TPair pair)\n        {\n            return pair != null ? pair.Weight : 0f;\n        }\n    }\n\n    public class WeightedPairResolver<T> : IWeightedPairResolver<IWeightedPair<T>, T>\n    {\n        public static readonly WeightedPairResolver<T> Default = new WeightedPairResolver<T>();\n\n        private Func<IWeightedPair<T>, float> _weightPred = (p) => p != null ? p.Weight : 0f;\n        public Func<IWeightedPair<T>, float> WeightPredicate { get { return _weightPred; } }\n\n        public T GetValue(IWeightedPair<T> pair)\n        {\n            return pair != null ? pair.Value : default(T);\n        }\n\n        public float GetWeight(IWeightedPair<T> pair)\n        {\n            return pair != null ? pair.Weight : 0f;\n        }\n    }\n\n    public static class RandomEnumUtil\n    {\n\n        #region Enumerable Methods\n\n        public static IEnumerable<T> Shuffled<T>(this IEnumerable<T> coll, IRandom rng = null)\n        {\n            if (coll == null) throw new System.ArgumentNullException(\"coll\");\n            if (rng == null) rng = RandomUtil.Standard;\n\n            using (var buffer = TempCollection.GetList<T>(coll))\n            {\n                int j;\n                for (int i = 0; i < buffer.Count; i++)\n                {\n                    j = rng.Next(i, buffer.Count);\n                    yield return buffer[j];\n                    buffer[j] = buffer[i];\n                }\n            }\n        }\n\n        public static T PickRandom<T>(this IEnumerable<T> lst, IRandom rng = null)\n        {\n            //return lst.PickRandom(1).FirstOrDefault();\n            if (lst is IList<T>)\n            {\n                if (rng == null) rng = RandomUtil.Standard;\n                var a = lst as IList<T>;\n                if (a.Count == 0) return default(T);\n                return a[rng.Range(a.Count)];\n            }\n            else\n            {\n                return lst.PickRandom(1, rng).FirstOrDefault();\n            }\n        }\n\n        public static IEnumerable<T> PickRandom<T>(this IEnumerable<T> lst, int count, IRandom rng = null)\n        {\n            return lst.Shuffled(rng).Take(count);\n        }\n\n        public static T PickRandom<T>(this IEnumerable<T> lst, System.Func<T, float> weightPredicate, IRandom rng = null)\n        {\n            var arr = (lst is IList<T>) ? lst as IList<T> : lst.ToList();\n            if (arr.Count == 0) return default(T);\n\n            using (var weights = com.spacepuppy.Collections.TempCollection.GetList<float>(arr.Count))\n            {\n                int i;\n                float w;\n                float total = 0f;\n                for (i = 0; i < arr.Count; i++)\n                {\n                    w = weightPredicate(arr[i]);\n                    if (float.IsPositiveInfinity(w)) return arr[i];\n                    else if (w >= 0f && !float.IsNaN(w)) total += w;\n                    weights.Add(w);\n                }\n\n                if (rng == null) rng = RandomUtil.Standard;\n                float r = rng.Next();\n                float s = 0f;\n\n                for (i = 0; i < weights.Count; i++)\n                {\n                    w = weights[i];\n                    if (float.IsNaN(w) || w <= 0f) continue;\n\n                    s += w / total;\n                    if (s > r)\n                    {\n                        return arr[i];\n                    }\n                }\n\n                //should only get here if last element had a zero weight, and the r was large\n                i = arr.Count - 1;\n                while (i > 0 && weights[i] <= 0f) i--;\n                return arr[i];\n            }\n        }\n\n        public static T PickRandomWeighted<T>(this IEnumerable<IWeightedPair<T>> lst, IRandom rng = null)\n        {\n            var resolver = WeightedPairResolver<T>.Default;\n            return resolver.GetValue(PickRandom(lst, resolver.WeightPredicate, rng));\n        }\n\n        public static TValue PickRandomWeighted<TPair, TValue>(this IEnumerable<TPair> lst, IRandom rng = null, IWeightedPairResolver<TPair, TValue> resolver = null) where TPair : IWeightedPair<TValue>\n        {\n            if (resolver == null) resolver = WeightedPairResolver<TPair, TValue>.Default;\n            return resolver.GetValue(PickRandom(lst, resolver.WeightPredicate, rng));\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyBase/Utils/RandomUtil.cs",
    "content": "﻿using UnityEngine;\r\nusing BitConverter = System.BitConverter;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class RandomUtil\r\n    {\r\n\r\n        #region Static Fields\r\n\r\n        private static UnityRNG _unityRNG = new UnityRNG();\r\n\r\n        public static IRandom Standard { get { return _unityRNG; } }\r\n\r\n        /// <summary>\r\n        /// Create an rng that is deterministic to that 'seed' across all platforms.\r\n        /// </summary>\r\n        /// <param name=\"seed\"></param>\r\n        /// <returns></returns>\r\n        public static IRandom CreateDeterministicRNG(int seed)\r\n        {\r\n            return new SimplePCG(seed);\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Static Properties\r\n\r\n        public static float Angle(this IRandom rng)\r\n        {\r\n            return rng.Next() * 360f;\r\n        }\r\n\r\n        public static float Radian(this IRandom rng)\r\n        {\r\n            return rng.Next() * MathUtil.TWO_PI;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Return 0 or 1. Numeric version of Bool.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public static int Pop(this IRandom rng)\r\n        {\r\n            return rng.Next(1000) % 2;\r\n        }\r\n\r\n        public static int Sign(this IRandom rng)\r\n        {\r\n            int n = rng.Next(1000) % 2;\r\n            return n + n - 1;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Return a true randomly.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public static bool Bool(this IRandom rng)\r\n        {\r\n            return (rng.Next(1000) % 2 != 0);\r\n        }\r\n\r\n        public static bool Bool(this IRandom rng, float oddsOfTrue)\r\n        {\r\n            int i = rng.Next(100000);\r\n            int m = (int)(oddsOfTrue * 100000);\r\n            return i < m;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Return -1, 0, 1 randomly. This can be used for bizarre things like randomizing an array.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public static int Shift(this IRandom rng)\r\n        {\r\n            return (rng.Next(999) % 3) - 1;\r\n        }\r\n\r\n        public static UnityEngine.Vector3 OnUnitSphere(this IRandom rng)\r\n        {\r\n            //uniform, using angles\r\n            var a = rng.Next() * MathUtil.TWO_PI;\r\n            var b = rng.Next() * MathUtil.TWO_PI;\r\n            var sa = Mathf.Sin(a);\r\n            return new Vector3(sa * Mathf.Cos(b), sa * Mathf.Sin(b), Mathf.Cos(a));\r\n\r\n            //non-uniform, needs to test for 0 vector\r\n            /*\r\n            var v = new UnityEngine.Vector3(Value, Value, Value);\r\n            return (v == UnityEngine.Vector3.zero) ? UnityEngine.Vector3.right : v.normalized;\r\n                */\r\n        }\r\n\r\n        public static UnityEngine.Vector2 OnUnitCircle(this IRandom rng)\r\n        {\r\n            //uniform, using angles\r\n            var a = rng.Next() * MathUtil.TWO_PI;\r\n            return new Vector2(Mathf.Sin(a), Mathf.Cos(a));\r\n        }\r\n\r\n        public static UnityEngine.Vector3 InsideUnitSphere(this IRandom rng)\r\n        {\r\n            return rng.OnUnitSphere() * rng.Next();\r\n        }\r\n\r\n        public static UnityEngine.Vector2 InsideUnitCircle(this IRandom rng)\r\n        {\r\n            return rng.OnUnitCircle() * rng.Next();\r\n        }\r\n\r\n        public static UnityEngine.Vector3 AroundAxis(this IRandom rng, Vector3 axis)\r\n        {\r\n            var a = rng.Angle();\r\n            if(VectorUtil.NearSameAxis(axis, Vector3.forward))\r\n            {\r\n                return Quaternion.AngleAxis(a, axis) * VectorUtil.GetForwardTangent(Vector3.up, axis);\r\n            }\r\n            else\r\n            {\r\n                return Quaternion.AngleAxis(a, axis) * VectorUtil.GetForwardTangent(Vector3.forward, axis);\r\n            }\r\n        }\r\n\r\n        public static UnityEngine.Quaternion Rotation(this IRandom rng)\r\n        {\r\n            return UnityEngine.Quaternion.AngleAxis(rng.Angle(), rng.OnUnitSphere());\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Range Methods\r\n\r\n        /// <summary>\r\n        /// Select between min and max, exclussive of max.\r\n        /// </summary>\r\n        /// <param name=\"rng\"></param>\r\n        /// <param name=\"max\"></param>\r\n        /// <param name=\"min\"></param>\r\n        /// <returns></returns>\r\n        public static float Range(this IRandom rng, float max, float min = 0.0f)\r\n        {\r\n            return (float)(rng.NextDouble() * (max - min)) + min;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Select between min and max, exclussive of max.\r\n        /// </summary>\r\n        /// <param name=\"rng\"></param>\r\n        /// <param name=\"max\"></param>\r\n        /// <param name=\"min\"></param>\r\n        /// <returns></returns>\r\n        public static int Range(this IRandom rng, int max, int min = 0)\r\n        {\r\n            return rng.Next(min, max);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Select an weighted index from 0 to length of weights.\r\n        /// </summary>\r\n        /// <param name=\"rng\"></param>\r\n        /// <param name=\"weights\"></param>\r\n        /// <returns></returns>\r\n        public static int Range(this IRandom rng, params float[] weights)\r\n        {\r\n            int i;\r\n            float w;\r\n            float total = 0f;\r\n            for (i = 0; i < weights.Length; i++)\r\n            {\r\n                w = weights[i];\r\n                if (float.IsPositiveInfinity(w)) return i;\r\n                else if (w >= 0f && !float.IsNaN(w)) total += w;\r\n            }\r\n\r\n            if (rng == null) rng = RandomUtil.Standard;\r\n            if (total == 0f) return rng.Next(weights.Length);\r\n\r\n            float r = rng.Next();\r\n            float s = 0f;\r\n\r\n            for (i = 0; i < weights.Length; i++)\r\n            {\r\n                w = weights[i];\r\n                if (float.IsNaN(w) || w <= 0f) continue;\r\n\r\n                s += w / total;\r\n                if (s > r)\r\n                {\r\n                    return i;\r\n                }\r\n            }\r\n\r\n            //should only get here if last element had a zero weight, and the r was large\r\n            i = weights.Length - 1;\r\n            while (i > 0 && weights[i] <= 0f) i--;\r\n            return i;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Select an weighted index from 0 to length of weights.\r\n        /// </summary>\r\n        /// <param name=\"rng\"></param>\r\n        /// <param name=\"weights\"></param>\r\n        /// <returns></returns>\r\n        public static int Range(this IRandom rng, float[] weights, int startIndex, int count = -1)\r\n        {\r\n            int i;\r\n            float w;\r\n            float total = 0f;\r\n            int last = count < 0 ? weights.Length : System.Math.Min(startIndex + count, weights.Length);\r\n            for (i = startIndex; i < last; i++)\r\n            {\r\n                w = weights[i];\r\n                if (float.IsPositiveInfinity(w)) return i;\r\n                else if (w >= 0f && !float.IsNaN(w)) total += w;\r\n            }\r\n\r\n            if (rng == null) rng = RandomUtil.Standard;\r\n            if (total == 0f) return rng.Next(weights.Length);\r\n\r\n            float r = rng.Next();\r\n            float s = 0f;\r\n\r\n            for (i = startIndex; i < last; i++)\r\n            {\r\n                w = weights[i];\r\n                if (float.IsNaN(w) || w <= 0f) continue;\r\n\r\n                s += w / total;\r\n                if (s > r)\r\n                {\r\n                    return i;\r\n                }\r\n            }\r\n\r\n            //should only get here if last element had a zero weight, and the r was large\r\n            i = last - 1;\r\n            while (i > 0 && weights[i] <= 0f) i--;\r\n            return i;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region Special Types\r\n\r\n        private class UnityRNG : IRandom\r\n        {\r\n\r\n            public float Next()\r\n            {\r\n                //return Random.value;\r\n                //because unity's Random returns in range 0->1, which is dumb\r\n                //why you might say? Well it means that the 1 is the least likely value to generate, so for generating indices you get uneven results\r\n                return Random.value * 0.9999f;\r\n            }\r\n\r\n            public double NextDouble()\r\n            {\r\n                //return (double)Random.value;\r\n                //because unity's Random returns in range 0->1, which is dumb\r\n                //why you might say? Well it means that the 1 is the least likely value to generate, so for generating indices you get uneven results\r\n                return (double)Random.value * 0.99999999d;\r\n            }\r\n\r\n            public int Next(int size)\r\n            {\r\n                return (int)((double)size * NextDouble());\r\n            }\r\n\r\n\r\n            public int Next(int low, int high)\r\n            {\r\n                return (int)(NextDouble() * (high - low)) + low;\r\n            }\r\n        }\r\n\r\n        public class MicrosoftRNG : System.Random, IRandom\r\n        {\r\n\r\n            public MicrosoftRNG() : base()\r\n            {\r\n\r\n            }\r\n\r\n            public MicrosoftRNG(int seed) : base(seed)\r\n            {\r\n\r\n            }\r\n\r\n\r\n            float IRandom.Next()\r\n            {\r\n                return (float)this.NextDouble();\r\n            }\r\n\r\n            double IRandom.NextDouble()\r\n            {\r\n                return this.NextDouble();\r\n            }\r\n\r\n            int IRandom.Next(int size)\r\n            {\r\n                return this.Next(size);\r\n            }\r\n\r\n            int IRandom.Next(int low, int high)\r\n            {\r\n                return this.Next(low, high);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        /// A simple deterministic rng using a linear congruential algorithm. \r\n        /// Not the best, but fast and effective for deterministic rng for games.\r\n        /// \r\n        /// Various known parameter configurations are included as static factory methods for ease of creating known long-period generators.\r\n        /// See the wiki article for a list of more known long period parameters: https://en.wikipedia.org/wiki/Linear_congruential_generator\r\n        /// </summary>\r\n        public class LinearCongruentialRNG : IRandom\r\n        {\r\n\r\n            #region Fields\r\n\r\n            private ulong _mode;\r\n            private ulong _mult;\r\n            private ulong _incr;\r\n            private ulong _seed;\r\n\r\n            private System.Func<double> _getNext;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            public LinearCongruentialRNG(long seed, ulong increment, ulong mult, ulong mode)\r\n            {\r\n                _mode = mode;\r\n                _mult = System.Math.Max(1, System.Math.Min(mode - 1, mult));\r\n                _incr = System.Math.Max(0, System.Math.Min(mode - 1, increment));\r\n                if (seed < 0)\r\n                {\r\n                    seed = System.DateTime.Now.Millisecond;\r\n                }\r\n                _seed = (ulong)seed % _mode;\r\n\r\n                if(_mode == 0)\r\n                {\r\n                    //this counts as using 2^64 as the mode\r\n                    _getNext = () =>\r\n                    {\r\n                        _seed = _mult * _seed + _incr;\r\n                        return (double)((decimal)_seed / 18446744073709551616m); //use decimal for larger sig range\r\n                    };\r\n                }\r\n                else if(_mode > 0x10000000000000)\r\n                {\r\n                    //double doesn't have the sig range to handle these, so we'll use decimal\r\n                    _getNext = () =>\r\n                    {\r\n                        _seed = (_mult * _seed + _incr) % _mode;\r\n                        return (double)((decimal)_seed / 18446744073709551616m); //use decimal for larger sig range\r\n                    };\r\n                }\r\n                else\r\n                {\r\n                    //just do the maths\r\n                    _getNext = () => (double)(_seed = (_mult * _seed + _incr) % _mode) / (double)(_mode);\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IRandom Interface\r\n\r\n            public double NextDouble()\r\n            {\r\n                return _getNext();\r\n            }\r\n\r\n            public float Next()\r\n            {\r\n                return (float)_getNext();\r\n            }\r\n\r\n            public int Next(int size)\r\n            {\r\n                return (int)(size * _getNext());\r\n            }\r\n\r\n            public int Next(int low, int high)\r\n            {\r\n                return (int)((high - low) * _getNext() + low);\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Static Factory\r\n\r\n            public static LinearCongruentialRNG CreateMMIXKnuth(long seed = -1)\r\n            {\r\n                return new LinearCongruentialRNG(seed, 1442695040888963407, 6364136223846793005, 0);\r\n            }\r\n\r\n            public static LinearCongruentialRNG CreateAppleCarbonLib(int seed = -1)\r\n            {\r\n                return new LinearCongruentialRNG(seed, 0, 16807, 16807);\r\n            }\r\n\r\n            public static LinearCongruentialRNG CreateGLibc(int seed = -1)\r\n            {\r\n                return new LinearCongruentialRNG(seed, 12345, 1103515245, 2147483648);\r\n            }\r\n\r\n            public static LinearCongruentialRNG CreateVB6(int seed = -1)\r\n            {\r\n                return new LinearCongruentialRNG(seed, 12820163, 1140671485, 16777216);\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        public class SimplePCG : IRandom\r\n        {\r\n\r\n            #region Fields\r\n\r\n            private ulong _seed;\r\n            private ulong _inc;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            public SimplePCG(long seed = -1, ulong inc = 1)\r\n            {\r\n                if(seed < 0)\r\n                {\r\n                    seed = System.DateTime.Now.Ticks;\r\n                }\r\n                _seed = 0;\r\n                _inc = (inc << 1) | 1;\r\n                this.GetNext();\r\n                _seed += (ulong)seed;\r\n                this.GetNext();\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Methods\r\n\r\n            private uint GetNext()\r\n            {\r\n                ulong old = _seed;\r\n                _seed = old * 6364136223846793005 + _inc;\r\n                uint xor = (uint)(((old >> 18) ^ old) >> 27);\r\n                int rot = (int)(old >> 59);\r\n                return (xor >> rot) | (xor << (64 - rot));\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IRandom Interface\r\n\r\n            public double NextDouble()\r\n            {\r\n                return (double)this.GetNext() / (double)(0x100000000u);\r\n            }\r\n\r\n            public float Next()\r\n            {\r\n                return (float)((double)this.GetNext() / (double)(0x100000000u));\r\n            }\r\n\r\n            public int Next(int size)\r\n            {\r\n                return (int)(size * this.NextDouble());\r\n            }\r\n\r\n            public int Next(int low, int high)\r\n            {\r\n                return (int)((high - low) * this.NextDouble()) + low;\r\n            }\r\n\r\n            #endregion\r\n            \r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/StreamUtil.cs",
    "content": "﻿using System;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class StreamUtil\r\n    {\r\n\r\n        public static void CopyTo(this System.IO.Stream source, System.IO.Stream destination)\r\n        {\r\n            const int BUFFER = 4096;\r\n\r\n            byte[] buffer = new byte[BUFFER];\r\n            int count;\r\n            while((count = source.Read(buffer, 0, buffer.Length)) > 0)\r\n            {\r\n                destination.Write(buffer, 0, count);\r\n            }\r\n        }\r\n\r\n        public static byte[] ToByteArray(this System.IO.Stream strm)\r\n        {\r\n            if(strm is System.IO.MemoryStream)\r\n            {\r\n                return (strm as System.IO.MemoryStream).ToArray();\r\n            }\r\n\r\n            long originalPosition = -1;\r\n            if(strm.CanSeek)\r\n            {\r\n                originalPosition = strm.Position;\r\n            }\r\n\r\n            try\r\n            {\r\n                using (var ms = new System.IO.MemoryStream())\r\n                {\r\n                    ms.CopyTo(ms);\r\n                    return ms.ToArray();\r\n                }\r\n            }\r\n            catch(Exception ex)\r\n            {\r\n                throw ex;\r\n            }\r\n            finally\r\n            {\r\n                if (originalPosition >= 0) strm.Position = originalPosition;\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/StringUtil.cs",
    "content": "﻿using System;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\n\r\nusing com.spacepuppy.Collections;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class StringUtil\r\n    {\r\n\r\n        public enum Alignment\r\n        {\r\n            Left = 0,\r\n            Right = 1,\r\n            Center = 2\r\n        }\r\n\r\n        #region Constants\r\n\r\n        public const string RX_OPEN_TO_CLOSE_PARENS = @\"\\(\" +\r\n                                                      @\"[^\\(\\)]*\" +\r\n                                                      @\"(\" +\r\n                                                      @\"(\" +\r\n                                                      @\"(?<Open>\\()\" +\r\n                                                      @\"[^\\(\\)]*\" +\r\n                                                      @\")+\" +\r\n                                                      @\"(\" +\r\n                                                      @\"(?<Close-Open>\\))\" +\r\n                                                      @\"[^\\(\\)]*\" +\r\n                                                      @\")+\" +\r\n                                                      @\")*\" +\r\n                                                      @\"(?(Open)(?!))\" +\r\n                                                      @\"\\)\";\r\n        public const string RX_OPEN_TO_CLOSE_ANGLES = @\"<\" +\r\n                                                      @\"[^<>]*\" +\r\n                                                      @\"(\" +\r\n                                                      @\"(\" +\r\n                                                      @\"(?<Open><)\" +\r\n                                                      @\"[^<>]*\" +\r\n                                                      @\")+\" +\r\n                                                      @\"(\" +\r\n                                                      @\"(?<Close-Open>>)\" +\r\n                                                      @\"[^<>]*\" +\r\n                                                      @\")+\" +\r\n                                                      @\")*\" +\r\n                                                      @\"(?(Open)(?!))\" +\r\n                                                      @\">\";\r\n        public const string RX_OPEN_TO_CLOSE_BRACKETS = @\"\\[\" +\r\n                                                        @\"[^\\[\\]]*\" +\r\n                                                        @\"(\" +\r\n                                                        @\"(\" +\r\n                                                        @\"(?<Open>\\[)\" +\r\n                                                        @\"[^\\[\\]]*\" +\r\n                                                        @\")+\" +\r\n                                                        @\"(\" +\r\n                                                        @\"(?<Close-Open>\\])\" +\r\n                                                        @\"[^\\[\\]]*\" +\r\n                                                        @\")+\" +\r\n                                                        @\")*\" +\r\n                                                        @\"(?(Open)(?!))\" +\r\n                                                        @\"\\]\";\r\n\r\n        public const string RX_UNESCAPED_COMMA = @\"(?<!\\\\),\";\r\n        public const string RX_UNESCAPED_COMMA_NOTINPARENS = @\"(?<!\\\\),(?![^()]*\\))\";\r\n\r\n        #endregion\r\n\r\n\r\n        #region Matching\r\n\r\n        public static bool IsNullOrEmpty(string value)\r\n        {\r\n            return System.String.IsNullOrEmpty(value);\r\n            //return (value + \"\") == \"\";\r\n        }\r\n\r\n        public static bool IsNotNullOrEmpty(string value)\r\n        {\r\n            return !System.String.IsNullOrEmpty(value);\r\n            //return (value + \"\") != \"\";\r\n        }\r\n\r\n        public static bool IsNullOrWhitespace(string value)\r\n        {\r\n            return (value + \"\").Trim() == \"\";\r\n        }\r\n\r\n        public static bool IsNotNullOrWhitespace(string value)\r\n        {\r\n            return (value + \"\").Trim() != \"\";\r\n        }\r\n\r\n\r\n        public static bool Equals(string valueA, string valueB, bool bIgnoreCase)\r\n        {\r\n            return (bIgnoreCase) ? String.Equals(valueA, valueB) : String.Equals(valueA, valueB, StringComparison.OrdinalIgnoreCase);\r\n        }\r\n        public static bool Equals(string valueA, string valueB)\r\n        {\r\n            return Equals(valueA, valueB, false);\r\n        }\r\n        public static bool Equals(string value, params string[] others)\r\n        {\r\n            if ((others == null || others.Length == 0))\r\n            {\r\n                return String.IsNullOrEmpty(value);\r\n            }\r\n\r\n            foreach (var sval in others)\r\n            {\r\n                if (value == sval) return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n        public static bool Equals(string value, string[] others, bool bIgnoreCase)\r\n        {\r\n            if ((others == null || others.Length == 0))\r\n            {\r\n                return String.IsNullOrEmpty(value);\r\n            }\r\n\r\n            foreach (var sval in others)\r\n            {\r\n                if (StringUtil.Equals(value, sval, bIgnoreCase)) return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool StartsWith(string value, string start)\r\n        {\r\n            return StartsWith(value, start);\r\n        }\r\n\r\n        public static bool StartsWith(string value, string start, bool bIgnoreCase)\r\n        {\r\n            return value.StartsWith(start, (bIgnoreCase) ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);\r\n        }\r\n\r\n        public static bool EndsWith(string value, string end)\r\n        {\r\n            return EndsWith(value, end, false);\r\n        }\r\n\r\n        public static bool EndsWith(string value, string end, bool bIgnoreCase)\r\n        {\r\n            return value.EndsWith(end, (bIgnoreCase) ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);\r\n        }\r\n\r\n        public static bool Contains(string str, params string[] values)\r\n        {\r\n            if (str == null || values == null || values.Length == 0) return false;\r\n\r\n            foreach (var sother in values)\r\n            {\r\n                if (str.Contains(sother)) return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool Contains(string str, bool ignorCase, string sother)\r\n        {\r\n            if (string.IsNullOrEmpty(str)) return string.IsNullOrEmpty(sother);\r\n            if (sother == null) return false;\r\n\r\n            if (ignorCase)\r\n            {\r\n                str = str.ToLower();\r\n                if (str.Contains(sother.ToLower())) return true;\r\n            }\r\n            else\r\n            {\r\n                if (str.Contains(sother)) return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool Contains(string str, bool ignorCase, params string[] values)\r\n        {\r\n            if (str == null || values == null || values.Length == 0) return false;\r\n\r\n            if (ignorCase)\r\n            {\r\n                str = str.ToLower();\r\n                foreach (var sother in values)\r\n                {\r\n                    if (str.Contains(sother.ToLower())) return true;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                foreach (var sother in values)\r\n                {\r\n                    if (str.Contains(sother)) return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Morphing\r\n\r\n        public static string NicifyVariableName(string nm)\r\n        {\r\n            if (string.IsNullOrEmpty(nm)) return string.Empty;\r\n\r\n            int index = 0;\r\n            while(index < nm.Length && char.IsWhiteSpace(nm[index]))\r\n            {\r\n                index++;\r\n            }\r\n            if (index >= nm.Length) return string.Empty;\r\n\r\n            if(nm.IndexOf(\"m_\", index) == 0)\r\n            {\r\n                index += 2;\r\n            }\r\n            else if(nm[index] == 'k' && nm.Length > (index + 2) && char.IsUpper(nm[index + 1]))\r\n            {\r\n                index += 1;\r\n            }\r\n\r\n            while(index < nm.Length && nm[index] == '_')\r\n            {\r\n                index++;\r\n            }\r\n            if (index >= nm.Length) return string.Empty;\r\n\r\n\r\n            var sb = GetTempStringBuilder();\r\n            sb.Append(char.ToUpper(nm[index]));\r\n            for (int i = index + 1; i < nm.Length; i++)\r\n            {\r\n                if(char.IsUpper(nm[i]))\r\n                {\r\n                    sb.Append(' ');\r\n                }\r\n                sb.Append(nm[i]);\r\n            }\r\n            return Release(sb);\r\n        }\r\n\r\n        public static string ToLower(string value)\r\n        {\r\n            //return (value != null) ? value.ToLower() : null;\r\n            return (value + \"\").ToLower();\r\n        }\r\n\r\n        public static string ToUpper(string value)\r\n        {\r\n            //return (value != null) ? value.ToUpper() : null;\r\n            return (value + \"\").ToUpper();\r\n        }\r\n\r\n        public static string Trim(string value)\r\n        {\r\n            if (value == null) return null;\r\n\r\n            return value.Trim();\r\n        }\r\n\r\n        public static string[] Split(string value, string delim)\r\n        {\r\n            if (value == null) return null;\r\n            return value.Split(new string[] { delim }, StringSplitOptions.None);\r\n        }\r\n\r\n        public static string[] Split(string value, params char[] delim)\r\n        {\r\n            if (value == null) return null;\r\n            return value.Split(delim);\r\n        }\r\n\r\n        public static string[] SplitFixedLength(string value, string delim, int len)\r\n        {\r\n            if (value == null) return new string[len];\r\n\r\n            string[] arr = value.Split(new string[] { delim }, StringSplitOptions.None);\r\n            if (arr.Length != len) Array.Resize(ref arr, len);\r\n            return arr;\r\n        }\r\n\r\n        public static string[] SplitFixedLength(string value, char delim, int len)\r\n        {\r\n            if (value == null) return new string[len];\r\n\r\n            string[] arr = value.Split(delim);\r\n            if (arr.Length != len) Array.Resize(ref arr, len);\r\n            return arr;\r\n        }\r\n\r\n        public static string[] SplitFixedLength(string value, char[] delims, int len)\r\n        {\r\n            if (value == null) return new string[len];\r\n\r\n            string[] arr = value.Split(delims);\r\n            if (arr.Length != len) Array.Resize(ref arr, len);\r\n            return arr;\r\n        }\r\n\r\n        public static string EnsureLength(string sval, int len, bool bPadWhiteSpace = false, Alignment eAlign = Alignment.Left)\r\n        {\r\n            if (sval.Length > len) sval = sval.Substring(0, len);\r\n\r\n            if (bPadWhiteSpace) sval = PadWithChar(sval, len, eAlign, ' ');\r\n\r\n            return sval;\r\n        }\r\n\r\n        public static string EnsureLength(string sval, int len, char cPadChar, Alignment eAlign = Alignment.Left)\r\n        {\r\n            if (sval.Length > len) sval = sval.Substring(0, len);\r\n\r\n            sval = PadWithChar(sval, len, eAlign, cPadChar);\r\n\r\n            return sval;\r\n        }\r\n\r\n\r\n        public static string PadWithChar(string sString,\r\n                                              int iLength,\r\n                                              Alignment eAlign = 0,\r\n                                              char sChar = ' ')\r\n        {\r\n            if (sChar == '\\0') return null;\r\n\r\n            switch (eAlign)\r\n            {\r\n                case Alignment.Right:\r\n                    return new String(sChar, (int)Math.Max(0, iLength - sString.Length)) + sString;\r\n                case Alignment.Center:\r\n                    iLength = Math.Max(0, iLength - sString.Length);\r\n                    var sr = new String(sChar, (int)(Math.Ceiling(iLength / 2.0f))); // if odd, pad more on the right\r\n                    var sl = new String(sChar, (int)(Math.Floor(iLength / 2.0f)));\r\n                    return sl + sString + sr;\r\n                case Alignment.Left:\r\n                    return sString + new String(sChar, (int)Math.Max(0, iLength - sString.Length));\r\n            }\r\n\r\n            //default trap\r\n            return sString;\r\n        }\r\n\r\n        public static string PadWithChar(string sString,\r\n                                          int iLength,\r\n                                          char sAlign,\r\n                                          char sChar = ' ')\r\n        {\r\n            switch (Char.ToUpper(sAlign))\r\n            {\r\n                case 'L':\r\n                    return PadWithChar(sString, iLength, Alignment.Left, sChar);\r\n                case 'C':\r\n                    return PadWithChar(sString, iLength, Alignment.Center, sChar);\r\n                case 'R':\r\n                    return PadWithChar(sString, iLength, Alignment.Right, sChar);\r\n\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Special Formatting\r\n\r\n        private class LoDExtendedFormatter : ICustomFormatter, IFormatProvider\r\n        {\r\n\r\n            #region ICustomFormatter Interface\r\n\r\n            public string Format(string formatString, object arg, IFormatProvider formatProvider)\r\n            {\r\n                const string sREGX = @\"^((p-?\\d+)|(str)|(string)|(num\\?)|(float)|(single)|(dbl)|(double)|(num)|(dec)|(cash)|(int)|(bool)|(ascii)|(char)|(date)|(time)):\";\r\n\r\n                try\r\n                {\r\n                    if (System.String.IsNullOrEmpty(formatString)) return Convert.ToString(arg);\r\n\r\n                    var m = Regex.Match(formatString, sREGX, RegexOptions.IgnoreCase);\r\n                    if (m.Success)\r\n                    {\r\n                        string sType = m.Value.Substring(0, m.Value.Length - 1);\r\n                        formatString = formatString.Substring(m.Length);\r\n                        if (formatString.EndsWith(\"??\"))\r\n                        {\r\n                            if (arg == null || (arg is string && StringUtil.IsNullOrWhitespace(arg as string)))\r\n                                return \"\";\r\n                            else\r\n                                formatString = formatString.Substring(0, formatString.Length - 2);\r\n                        }\r\n\r\n                        arg = ConvertUtil.LoDConvertTo(arg, sType);\r\n                    }\r\n                    else\r\n                    {\r\n                        if (formatString.EndsWith(\"??\"))\r\n                        {\r\n                            if (arg == null || (arg is string && StringUtil.IsNullOrWhitespace(arg as string)))\r\n                                return \"\";\r\n                            else\r\n                                formatString = formatString.Substring(0, formatString.Length - 2);\r\n                        }\r\n                    }\r\n\r\n                    if (arg is bool && formatString.Contains(\";\"))\r\n                    {\r\n                        //bool\r\n                        string[] arr = StringUtil.Split(formatString, \";\");\r\n                        return (ConvertUtil.ToBool(arg)) ? arr[0] : arr[1];\r\n                    }\r\n                    else if (arg is string)\r\n                    {\r\n                        //string\r\n                        string sval = arg as String;\r\n                        if (Regex.Match(formatString, @\"^\\<\\d+$\").Success)\r\n                        {\r\n                            int len = int.Parse(formatString.Substring(1));\r\n                            return StringUtil.EnsureLength(sval, len, true, Alignment.Left);\r\n                        }\r\n                        else if (Regex.Match(formatString, @\"^\\>\\d+$\").Success)\r\n                        {\r\n                            int len = int.Parse(formatString.Substring(1));\r\n                            return StringUtil.EnsureLength(sval, len, true, Alignment.Right);\r\n                        }\r\n                        else if (Regex.Match(formatString, @\"^\\^\\d+$\").Success)\r\n                        {\r\n                            int len = int.Parse(formatString.Substring(1));\r\n                            return StringUtil.EnsureLength(sval, len, true, Alignment.Center);\r\n                        }\r\n                        else\r\n                        {\r\n                            return System.String.Format(\"{0:\" + formatString + \"}\", sval);\r\n                        }\r\n                    }\r\n                    else if (arg is TimeSpan && formatString.StartsWith(\"-?\"))\r\n                    {\r\n                        //timespan with neg\r\n                        formatString = formatString.Substring(2);\r\n                        if ((TimeSpan)arg < TimeSpan.Zero)\r\n                            return \"-\" + System.String.Format(\"{0:\" + formatString + \"}\", arg);\r\n                        else\r\n                            return System.String.Format(\"{0:\" + formatString + \"}\", arg);\r\n                    }\r\n                    else if (arg != null)\r\n                    {\r\n                        //all else\r\n                        return System.String.Format(\"{0:\" + formatString + \"}\", arg);\r\n                    }\r\n                    else\r\n                    {\r\n                        return \"\";\r\n                    }\r\n                }\r\n                catch\r\n                {\r\n\r\n                }\r\n\r\n                return \"\";\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region FormatPrivider Interface\r\n\r\n            public object GetFormat(Type formatType)\r\n            {\r\n                return this;\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        private static LoDExtendedFormatter _cachedFormatter = new LoDExtendedFormatter();\r\n\r\n        public static string Format(string sFormatString, params object[] oParams)\r\n        {\r\n            try\r\n            {\r\n                return String.Format(_cachedFormatter, sFormatString, oParams);\r\n            }\r\n            catch\r\n            {\r\n                throw new ArgumentException(\"format string syntax error\");\r\n            }\r\n        }\r\n\r\n        public static string FormatValue(object obj, string sFormat)\r\n        {\r\n            return String.Format(_cachedFormatter, \"{0:\" + sFormat + \"}\", obj);\r\n        }\r\n\r\n        public static string[] FormatValues(object[] objs, string sFormat)\r\n        {\r\n            if (objs == null) return null;\r\n            if (objs.Length == 0) return new String[] { };\r\n\r\n            string[] arr = new string[objs.Length];\r\n            for (int i = 0; i < objs.Length; i++)\r\n            {\r\n                arr[i] = String.Format(_cachedFormatter, \"{0:\" + sFormat + \"}\", objs[i]);\r\n            }\r\n            return arr;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Replace Chars\r\n\r\n        //####################\r\n        //EnsureNotStartWith\r\n\r\n        public static string EnsureNotStartWith(this string value, string start)\r\n        {\r\n            if (value.StartsWith(start)) return value.Substring(start.Length);\r\n            else return value;\r\n        }\r\n\r\n        public static string EnsureNotStartWith(this string value, string start, bool ignoreCase)\r\n        {\r\n            if (value.StartsWith(start, StringComparison.OrdinalIgnoreCase)) return value.Substring(start.Length);\r\n            else return value;\r\n        }\r\n\r\n        public static string EnsureNotStartWith(this string value, string start, bool ignoreCase, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value.StartsWith(start, ignoreCase, culture)) return value.Substring(start.Length);\r\n            else return value;\r\n        }\r\n\r\n        public static string EnsureNotStartWith(this string value, string start, StringComparison comparison)\r\n        {\r\n            if (value.StartsWith(start, comparison)) return value.Substring(start.Length);\r\n            else return value;\r\n        }\r\n\r\n\r\n        //####################\r\n        //EnsureNotStartWith\r\n\r\n        public static string EnsureNotEndsWith(this string value, string end)\r\n        {\r\n            if (value.EndsWith(end)) return value.Substring(0, value.Length - end.Length);\r\n            else return value;\r\n        }\r\n\r\n        public static string EnsureNotEndsWith(this string value, string end, bool ignoreCase)\r\n        {\r\n            if (value.EndsWith(end, StringComparison.OrdinalIgnoreCase)) return value.Substring(0, value.Length - end.Length);\r\n            else return value;\r\n        }\r\n\r\n        public static string EnsureNotEndsWith(this string value, string end, bool ignoreCase, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value.EndsWith(end, ignoreCase, culture)) return value.Substring(0, value.Length - end.Length);\r\n            else return value;\r\n        }\r\n\r\n        public static string EnsureNotEndsWith(this string value, string end, StringComparison comparison)\r\n        {\r\n            if (value.EndsWith(end, comparison)) return value.Substring(0, value.Length - end.Length);\r\n            else return value;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n\r\n\r\n        #region StringBuilders\r\n\r\n        private static ObjectCachePool<StringBuilder> _pool = new ObjectCachePool<StringBuilder>(10, () => new StringBuilder());\r\n        \r\n        public static StringBuilder GetTempStringBuilder()\r\n        {\r\n            return _pool.GetInstance();\r\n        }\r\n\r\n        public static string Release(StringBuilder b)\r\n        {\r\n            if (b == null) return null;\r\n\r\n            var result = b.ToString();\r\n            b.Length = 0;\r\n            _pool.Release(b);\r\n            return result;\r\n        }\r\n        \r\n        public static string ToStringHax(this StringBuilder sb)\r\n        {\r\n            var info = typeof(StringBuilder).GetField(\"_str\",\r\n                                                        System.Reflection.BindingFlags.NonPublic |\r\n                                                        System.Reflection.BindingFlags.Instance);\r\n            if (info == null)\r\n                return sb.ToString();\r\n            else\r\n                return info.GetValue(sb) as string;\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/TextureUtil.cs",
    "content": "﻿using UnityEngine;\nusing System.IO;\n\nnamespace com.spacepuppy.Utils\n{\n    \n    public static class TextureUtil\n    {\n\n        #region EncodeToTGA\n\n        /*\n         * This section is taken from this openly available code whose license (at time of my using it) is \n         * 'free and unencumbered software released into the public domain' and can be found here:\n         * https://github.com/phwitti/EncodeToTGA/blob/master/EncodeToTGAExtension.cs\n         * \n         * License as it was found on the original source code:\n         * \n        // This is free and unencumbered software released into the public domain.\n        //\n        // Anyone is free to copy, modify, publish, use, compile, sell, or\n        // distribute this software, either in source code form or as a compiled\n        // binary, for any purpose, commercial or non-commercial, and by any\n        // means.\n        //\n        // In jurisdictions that recognize copyright laws, the author or authors\n        // of this software dedicate any and all copyright interest in the\n        // software to the public domain. We make this dedication for the benefit\n        // of the public at large and to the detriment of our heirs and\n        // successors. We intend this dedication to be an overt act of\n        // relinquishment in perpetuity of all present and future rights to this\n        // software under copyright law.\n        //\n        // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n        // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n        // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n        // IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n        // OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n        // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n        // OTHER DEALINGS IN THE SOFTWARE.\n        //\n        // For more information, please refer to <http://unlicense.org/>\n         * \n         */\n\n        public static byte[] EncodeToTGA(this Texture2D _texture2D)\n        {\n            const int iTgaHeaderSize = 18;\n            const int iBytesPerPixelRGB24 = 3; // 1 byte per channel (rgb)\n            const int iBytesPerPixelARGB32 = 4; // ~ (rgba)\n\n            var useAlpha = SupportsAlpha(_texture2D.format);\n            int iBytesPerPixel = useAlpha ? iBytesPerPixelARGB32 : iBytesPerPixelRGB24;\n\n            //\n\n            using (MemoryStream memoryStream = new MemoryStream(iTgaHeaderSize + _texture2D.width * _texture2D.height * iBytesPerPixel))\n            {\n                using (BinaryWriter binaryWriter = new BinaryWriter(memoryStream))\n                {\n                    // Write TGA Header\n\n                    binaryWriter.Write((byte)0);                    // IDLength (not in use)\n                    binaryWriter.Write((byte)0);                    // ColorMapType (not in use)\n                    binaryWriter.Write((byte)10);                   // DataTypeCode == 10 (Runlength encoded RGB images)\n                    binaryWriter.Write((short)0);                   // ColorMapOrigin (not in use)\n                    binaryWriter.Write((short)0);                   // ColorMapLength (not in use)\n                    binaryWriter.Write((byte)0);                    // ColorMapDepth (not in use)\n                    binaryWriter.Write((short)0);                   // Origin X\n                    binaryWriter.Write((short)0);                   // Origin Y\n                    binaryWriter.Write((short)_texture2D.width);    // Width\n                    binaryWriter.Write((short)_texture2D.height);   // Height\n                    binaryWriter.Write((byte)(iBytesPerPixel * 8)); // Bits Per Pixel\n                    binaryWriter.Write((byte)0);                    // ImageDescriptor (not in use)\n\n                    // Write RLE Encoded Pixels\n\n                    Color32[] arPixels = _texture2D.GetPixels32();\n\n                    const int iMaxPacketLength = 128;\n                    int iPacketStart = 0;\n                    int iPacketEnd = 0;\n\n                    while (iPacketStart < arPixels.Length)\n                    {\n                        Color32 c32PreviousPixel = arPixels[iPacketStart];\n\n                        // Get current Packet Type\n                        RLEPacketType packetType = TextureUtil.PacketType(arPixels, iPacketStart);\n\n                        // Find Packet End\n                        int iReadEnd = Mathf.Min(iPacketStart + iMaxPacketLength, arPixels.Length);\n                        for (iPacketEnd = iPacketStart + 1; iPacketEnd < iReadEnd; ++iPacketEnd)\n                        {\n                            bool bPreviousEqualsCurrent = TextureUtil.Equals(arPixels[iPacketEnd - 1], arPixels[iPacketEnd]);\n\n                            // Packet End if change in Packet Type or if max Packet-Size reached\n                            if (packetType == RLEPacketType.RAW && bPreviousEqualsCurrent ||\n                                packetType == RLEPacketType.RLE && !bPreviousEqualsCurrent)\n                            {\n                                break;\n                            }\n                        }\n\n                        // Write Packet\n\n                        int iPacketLength = iPacketEnd - iPacketStart;\n\n                        switch (packetType)\n                        {\n                            case RLEPacketType.RLE:\n\n                                // Add RLE-Bit to PacketLength\n                                binaryWriter.Write((byte)((iPacketLength - 1) | (1 << 7)));\n\n                                binaryWriter.Write(c32PreviousPixel.b);\n                                binaryWriter.Write(c32PreviousPixel.g);\n                                binaryWriter.Write(c32PreviousPixel.r);\n\n                                if (useAlpha)\n                                    binaryWriter.Write(c32PreviousPixel.a);\n\n                                break;\n                            case RLEPacketType.RAW:\n\n                                binaryWriter.Write((byte)(iPacketLength - 1));\n\n                                for (int iPacketPosition = iPacketStart; iPacketPosition < iPacketEnd; ++iPacketPosition)\n                                {\n                                    binaryWriter.Write(arPixels[iPacketPosition].b);\n                                    binaryWriter.Write(arPixels[iPacketPosition].g);\n                                    binaryWriter.Write(arPixels[iPacketPosition].r);\n\n                                    if (useAlpha)\n                                        binaryWriter.Write(arPixels[iPacketPosition].a);\n                                }\n\n                                break;\n                        }\n\n                        iPacketStart = iPacketEnd;\n                    }\n                }\n\n                return memoryStream.GetBuffer();\n            }\n        }\n\n        //\n\n        // RLE Helper\n\n        private enum RLEPacketType { RLE, RAW }\n\n        private static bool Equals(Color32 _first, Color32 _second)\n        {\n            return _first.r == _second.r && _first.g == _second.g && _first.b == _second.b && _first.a == _second.a;\n        }\n\n        private static RLEPacketType PacketType(Color32[] _arData, int _iPacketPosition)\n        {\n            if ((_iPacketPosition != _arData.Length - 1) && TextureUtil.Equals(_arData[_iPacketPosition], _arData[_iPacketPosition + 1]))\n            {\n                return RLEPacketType.RLE;\n            }\n            else\n            {\n                return RLEPacketType.RAW;\n            }\n        }\n\n        private static bool SupportsAlpha(TextureFormat format)\n        {\n            switch(format)\n            {\n                case TextureFormat.RGBA32:\n                case TextureFormat.ARGB32:\n                    return true;\n                default:\n                    return false;\n            }\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyBase/Utils/TransformUtil.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Geom;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class TransformUtil\r\n    {\r\n        \r\n        public static Trans ToTrans(this Transform trans)\r\n        {\r\n            return Trans.GetGlobal(trans);\r\n        }\r\n\r\n        public static Trans ToRelativeTrans(this Transform trans, Transform relativeTo)\r\n        {\r\n            var m = trans.localToWorldMatrix;\r\n            return Trans.Transform(relativeTo.worldToLocalMatrix * m);\r\n        }\r\n\r\n        public static Trans ToLocalTrans(this Transform trans)\r\n        {\r\n            return Trans.GetLocal(trans);\r\n        }\r\n\r\n        public static Matrix4x4 GetMatrix(this Transform trans)\r\n        {\r\n            return trans.localToWorldMatrix;\r\n        }\r\n\r\n        public static Matrix4x4 GetRelativeMatrix(this Transform trans, Transform relativeTo)\r\n        {\r\n            var m = trans.localToWorldMatrix;\r\n            return relativeTo.worldToLocalMatrix * m;\r\n        }\r\n\r\n        public static Matrix4x4 GetLocalMatrix(this Transform trans)\r\n        {\r\n            return Matrix4x4.TRS(trans.localPosition, trans.localRotation, trans.localScale);\r\n        }\r\n\r\n\r\n\r\n        #region Matrix Methods\r\n\r\n        public static Vector3 GetTranslation(this Matrix4x4 m)\r\n        {\r\n            var col = m.GetColumn(3);\r\n            return new Vector3(col.x, col.y, col.z);\r\n        }\r\n\r\n        public static Quaternion GetRotation(this Matrix4x4 m)\r\n        {\r\n            // Adapted from: http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\r\n            Quaternion q = new Quaternion();\r\n            q.w = Mathf.Sqrt(Mathf.Max(0, 1 + m[0, 0] + m[1, 1] + m[2, 2])) / 2;\r\n            q.x = Mathf.Sqrt(Mathf.Max(0, 1 + m[0, 0] - m[1, 1] - m[2, 2])) / 2;\r\n            q.y = Mathf.Sqrt(Mathf.Max(0, 1 - m[0, 0] + m[1, 1] - m[2, 2])) / 2;\r\n            q.z = Mathf.Sqrt(Mathf.Max(0, 1 - m[0, 0] - m[1, 1] + m[2, 2])) / 2;\r\n            q.x *= Mathf.Sign(q.x * (m[2, 1] - m[1, 2]));\r\n            q.y *= Mathf.Sign(q.y * (m[0, 2] - m[2, 0]));\r\n            q.z *= Mathf.Sign(q.z * (m[1, 0] - m[0, 1]));\r\n            return q;\r\n        }\r\n\r\n        public static Vector3 GetScale(this Matrix4x4 m)\r\n        {\r\n            //var xs = m.GetColumn(0);\r\n            //var ys = m.GetColumn(1);\r\n            //var zs = m.GetColumn(2);\r\n\r\n            //var sc = new Vector3();\r\n            //sc.x = Vector3.Magnitude(new Vector3(xs.x, xs.y, xs.z));\r\n            //sc.y = Vector3.Magnitude(new Vector3(ys.x, ys.y, ys.z));\r\n            //sc.z = Vector3.Magnitude(new Vector3(zs.x, zs.y, zs.z));\r\n\r\n            //return sc;\r\n\r\n            return new Vector3(m.GetColumn(0).magnitude, m.GetColumn(1).magnitude, m.GetColumn(2).magnitude);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region GetAxis\r\n\r\n        public static Vector3 GetAxis(CartesianAxis axis)\r\n        {\r\n            switch (axis)\r\n            {\r\n                case CartesianAxis.Xneg:\r\n                    return Vector3.left;\r\n                case CartesianAxis.Yneg:\r\n                    return Vector3.down;\r\n                case CartesianAxis.Zneg:\r\n                    return Vector3.back;\r\n                case CartesianAxis.X:\r\n                    return Vector3.right;\r\n                case CartesianAxis.Y:\r\n                    return Vector3.up;\r\n                case CartesianAxis.Z:\r\n                    return Vector3.forward;\r\n            }\r\n\r\n            return Vector3.zero;\r\n        }\r\n        \r\n        public static Vector3 GetAxis(this Transform trans, CartesianAxis axis)\r\n        {\r\n            if (trans == null) throw new System.ArgumentNullException(\"trans\");\r\n\r\n            switch (axis)\r\n            {\r\n                case CartesianAxis.Xneg:\r\n                    return -trans.right;\r\n                case CartesianAxis.Yneg:\r\n                    return -trans.up;\r\n                case CartesianAxis.Zneg:\r\n                    return -trans.forward;\r\n                case CartesianAxis.X:\r\n                    return trans.right;\r\n                case CartesianAxis.Y:\r\n                    return trans.up;\r\n                case CartesianAxis.Z:\r\n                    return trans.forward;\r\n            }\r\n\r\n            return Vector3.zero;\r\n        }\r\n        \r\n        public static Vector3 GetAxis(this Transform trans, CartesianAxis axis, bool inLocalSpace)\r\n        {\r\n            if (trans == null) throw new System.ArgumentNullException(\"trans\");\r\n\r\n            Vector3 v = Vector3.zero;\r\n            switch (axis)\r\n            {\r\n                case CartesianAxis.Xneg:\r\n                    v= -trans.right;\r\n                    break;\r\n                case CartesianAxis.Yneg:\r\n                    v = -trans.up;\r\n                    break;\r\n                case CartesianAxis.Zneg:\r\n                    v = -trans.forward;\r\n                    break;\r\n                case CartesianAxis.X:\r\n                    v = trans.right;\r\n                    break;\r\n                case CartesianAxis.Y:\r\n                    v = trans.up;\r\n                    break;\r\n                case CartesianAxis.Z:\r\n                    v = trans.forward;\r\n                    break;\r\n            }\r\n\r\n            return (inLocalSpace) ? trans.InverseTransformDirection(v) : v;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Parent\r\n\r\n        public static Vector3 ParentTransformPoint(this Transform t, Vector3 pnt)\r\n        {\r\n            if (t.parent == null) return pnt;\r\n            return t.parent.TransformPoint(pnt);\r\n        }\r\n\r\n        public static Vector3 ParentInverseTransformPoint(this Transform t, Vector3 pnt)\r\n        {\r\n            if (t.parent == null) return pnt;\r\n            return t.parent.InverseTransformPoint(pnt);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Transform Methods\r\n\r\n        public static Vector3 GetRelativePosition(this Transform trans, Transform relativeTo)\r\n        {\r\n            return relativeTo.InverseTransformPoint(trans.position);\r\n        }\r\n\r\n        public static Quaternion GetRelativeRotation(this Transform trans, Transform relativeTo)\r\n        {\r\n            //return trans.rotation * Quaternion.Inverse(relativeTo.rotation);\r\n            return Quaternion.Inverse(relativeTo.rotation) * trans.rotation;\r\n            //return Quaternion.Inverse(trans.rotation) * relativeTo.rotation;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply a vector by only the scale part of a transformation\r\n        /// </summary>\r\n        /// <param name=\"m\"></param>\r\n        /// <param name=\"v\"></param>\r\n        /// <returns></returns>\r\n        public static Vector3 ScaleVector(this Matrix4x4 m, Vector3 v)\r\n        {\r\n            var sc = m.GetScale();\r\n            return Matrix4x4.Scale(sc).MultiplyPoint(v);\r\n        }\r\n\r\n        public static Vector3 ScaleVector(this Trans t, Vector3 v)\r\n        {\r\n            return Matrix4x4.Scale(t.Scale).MultiplyPoint(v);\r\n        }\r\n\r\n        public static Vector3 ScaleVector(this Transform t, Vector3 v)\r\n        {\r\n            var sc = t.localToWorldMatrix.GetScale();\r\n            return Matrix4x4.Scale(sc).MultiplyPoint(v);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Inverse multiply a vector by on the scale part of a transformation\r\n        /// </summary>\r\n        /// <param name=\"m\"></param>\r\n        /// <param name=\"v\"></param>\r\n        /// <returns></returns>\r\n        public static Vector3 InverseScaleVector(this Matrix4x4 m, Vector3 v)\r\n        {\r\n            var sc = m.inverse.GetScale();\r\n            return Matrix4x4.Scale(sc).MultiplyPoint(v);\r\n        }\r\n\r\n        public static Vector3 InvserScaleVector(this Trans t, Vector3 v)\r\n        {\r\n            var sc = t.Matrix.inverse.GetScale();\r\n            return Matrix4x4.Scale(sc).MultiplyPoint(v);\r\n        }\r\n\r\n        public static Vector3 InverseScaleVector(this Transform t, Vector3 v)\r\n        {\r\n            var sc = t.worldToLocalMatrix.GetScale();\r\n            return Matrix4x4.Scale(sc).MultiplyPoint(v);\r\n        }\r\n\r\n        public static Quaternion TranformRotation(this Matrix4x4 m, Quaternion rot)\r\n        {\r\n            return rot * m.GetRotation();\r\n        }\r\n\r\n        public static Quaternion TransformRotation(Trans t, Quaternion rot)\r\n        {\r\n            return rot * t.Rotation;\r\n        }\r\n\r\n        public static Quaternion TransformRotation(this Transform t, Quaternion rot)\r\n        {\r\n            return rot * t.rotation;\r\n        }\r\n\r\n        public static Quaternion InverseTranformRotation(this Matrix4x4 m, Quaternion rot)\r\n        {\r\n            //return rot * Quaternion.Inverse(m.GetRotation());\r\n            return Quaternion.Inverse(m.GetRotation()) * rot;\r\n        }\r\n\r\n        public static Quaternion InverseTransformRotation(Trans t, Quaternion rot)\r\n        {\r\n            //return rot * Quaternion.Inverse(t.Rotation);\r\n            return Quaternion.Inverse(t.Rotation) * rot;\r\n        }\r\n\r\n        public static Quaternion InverseTransformRotation(this Transform t, Quaternion rot)\r\n        {\r\n            //return rot * Quaternion.Inverse(t.rotation);\r\n            return Quaternion.Inverse(t.rotation) * rot;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Apply a transform to a Trans.\r\n        /// </summary>\r\n        /// <param name=\"m\"></param>\r\n        /// <param name=\"t\"></param>\r\n        /// <returns></returns>\r\n        public static Trans TransformTrans(this Matrix4x4 m, Trans t)\r\n        {\r\n            t.Matrix *= m;\r\n            return t;\r\n        }\r\n\r\n        public static Trans TransformTrans(this Trans t, Trans t2)\r\n        {\r\n            t2.Matrix *= t.Matrix;\r\n            return t2;\r\n        }\r\n\r\n        public static Trans TransformTrans(this Transform t, Trans t2)\r\n        {\r\n            t2.Matrix *= t.localToWorldMatrix;\r\n            return t2;\r\n        }\r\n\r\n        public static Trans InverseTransformTrans(this Matrix4x4 m, Trans t)\r\n        {\r\n            t.Matrix *= m.inverse;\r\n            return t;\r\n        }\r\n\r\n        public static Trans InverseTransformTrans(this Trans t, Trans t2)\r\n        {\r\n            t2.Matrix *= t.Matrix.inverse;\r\n            return t2;\r\n        }\r\n\r\n        public static Trans InverseTransformTrans(this Transform t, Trans t2)\r\n        {\r\n            t2.Matrix *= t.worldToLocalMatrix;\r\n            return t2;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Transform a ray by a transformation\r\n        /// </summary>\r\n        /// <param name=\"m\"></param>\r\n        /// <param name=\"r\"></param>\r\n        /// <returns></returns>\r\n        public static Ray TransformRay(this Matrix4x4 m, Ray r)\r\n        {\r\n            return new Ray(m.MultiplyPoint(r.origin), m.MultiplyVector(r.direction));\r\n        }\r\n\r\n        public static Ray TransformRay(this Trans t, Ray r)\r\n        {\r\n            return new Ray(t.TransformPoint(r.origin), t.TransformDirection(r.direction));\r\n        }\r\n\r\n        public static Ray TransformRay(this Transform t, Ray r)\r\n        {\r\n            return new Ray(t.TransformPoint(r.origin), t.TransformDirection(r.direction));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Inverse transform a ray by a transformation\r\n        /// </summary>\r\n        /// <param name=\"m\"></param>\r\n        /// <param name=\"r\"></param>\r\n        /// <returns></returns>\r\n        public static Ray InverseTransformRay(this Matrix4x4 m, Ray r)\r\n        {\r\n            m = m.inverse;\r\n            return new Ray(m.MultiplyPoint(r.origin), m.MultiplyVector(r.direction));\r\n        }\r\n\r\n        public static Ray InverseTransformRay(this Trans t, Ray r)\r\n        {\r\n            return new Ray(t.InverseTransformPoint(r.origin), t.InverseTransformDirection(r.direction));\r\n        }\r\n\r\n        public static Ray InverseTransformRay(this Transform t, Ray r)\r\n        {\r\n            return new Ray(t.InverseTransformPoint(r.origin), t.InverseTransformDirection(r.direction));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Transform ray cast info by a transformation\r\n        /// </summary>\r\n        /// <param name=\"m\"></param>\r\n        /// <param name=\"r\"></param>\r\n        /// <returns></returns>\r\n        public static RaycastInfo TransformRayCastInfo(this Matrix4x4 m, RaycastInfo r)\r\n        {\r\n            float dist = r.Distance;\r\n            var sc = m.GetScale();\r\n            if (sc.sqrMagnitude != 1.0f)\r\n            {\r\n                var v = r.Direction * r.Distance;\r\n                v = Matrix4x4.Scale(sc).MultiplyPoint(v);\r\n                dist = v.magnitude;\r\n            }\r\n\r\n            return new RaycastInfo(m.MultiplyPoint(r.Origin), m.MultiplyVector(r.Direction), dist);\r\n        }\r\n\r\n        public static RaycastInfo TransformRayCastInfo(this Trans t, RaycastInfo r)\r\n        {\r\n            float dist = r.Distance;\r\n            var sc = t.Scale;\r\n            if (sc.sqrMagnitude != 1.0f)\r\n            {\r\n                var v = r.Direction * r.Distance;\r\n                v = Matrix4x4.Scale(sc).MultiplyPoint(v);\r\n                dist = v.magnitude;\r\n            }\r\n\r\n            return new RaycastInfo(t.TransformPoint(r.Origin), t.TransformDirection(r.Direction), dist);\r\n        }\r\n\r\n        public static RaycastInfo TransformRayCastInfo(this Transform t, RaycastInfo r)\r\n        {\r\n            float dist = r.Distance;\r\n            var sc = t.localToWorldMatrix.GetScale();\r\n            if (sc.sqrMagnitude != 1.0f)\r\n            {\r\n                var v = r.Direction * r.Distance;\r\n                v = Matrix4x4.Scale(sc).MultiplyPoint(v);\r\n                dist = v.magnitude;\r\n            }\r\n\r\n            return new RaycastInfo(t.TransformPoint(r.Origin), t.TransformDirection(r.Direction), dist);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Transpose Methods\r\n\r\n        /// <summary>\r\n        /// Set the position and rotation of a Transform as if its origin were that of 'anchor'. \r\n        /// Anchor should be in world space.\r\n        /// </summary>\r\n        /// <param name=\"trans\">The transform to transpose.</param>\r\n        /// <param name=\"anchor\">The point around which to transpose in world space.</param>\r\n        /// <param name=\"position\">The new position in world space.</param>\r\n        /// <param name=\"rotation\">The new rotation in world space.</param>\r\n        public static void TransposeAroundGlobalAnchor(this Transform trans, Vector3 anchor, Vector3 position, Quaternion rotation)\r\n        {\r\n            anchor = trans.InverseTransformPoint(anchor);\r\n            if (trans.parent != null)\r\n            {\r\n                position = trans.parent.InverseTransformPoint(position);\r\n                rotation = trans.parent.InverseTransformRotation(rotation);\r\n            }\r\n\r\n            LocalTransposeAroundAnchor(trans, anchor, position, rotation);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Set the position and rotation of a Transform as if its origin were that of 'anchor'. \r\n        /// Anchor should be in world space.\r\n        /// </summary>\r\n        /// <param name=\"trans\">The transform to transpose.</param>\r\n        /// <param name=\"anchor\">The point around which to transpose in world space.</param>\r\n        /// <param name=\"position\">The new position in world space.</param>\r\n        /// <param name=\"rotation\">The new rotation in world space.</param>\r\n        public static void TransposeAroundGlobalAnchor(this Transform trans, Trans anchor, Vector3 position, Quaternion rotation)\r\n        {\r\n            //anchor.Matrix *= trans.worldToLocalMatrix;\r\n            anchor.Matrix = trans.worldToLocalMatrix * anchor.Matrix;\r\n            if (trans.parent != null)\r\n            {\r\n                position = trans.parent.InverseTransformPoint(position);\r\n                rotation = trans.parent.InverseTransformRotation(rotation);\r\n            }\r\n\r\n            LocalTransposeAroundAnchor(trans, anchor, position, rotation);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Set the position and rotation of a Transform as if its origin were that of 'anchor'. \r\n        /// Anchor should be local to the Transform where <0,0,0> would be the same as its true origin.\r\n        /// </summary>\r\n        /// <param name=\"trans\">The transform to transpose.</param>\r\n        /// <param name=\"anchor\">The point around which to transpose in local space.</param>\r\n        /// <param name=\"position\">The new position in world space.</param>\r\n        /// <param name=\"rotation\">The new rotation in world space.</param>\r\n        public static void TransposeAroundAnchor(this Transform trans, Vector3 anchor, Vector3 position, Quaternion rotation)\r\n        {\r\n            if(trans.parent != null)\r\n            {\r\n                position = trans.parent.InverseTransformPoint(position);\r\n                rotation = trans.parent.InverseTransformRotation(rotation);\r\n            }\r\n\r\n            LocalTransposeAroundAnchor(trans, anchor, position, rotation);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Set the position and rotation of a Transform as if its origin were that of 'anchor'. \r\n        /// Anchor should be local to the Transform where <0,0,0> would be the same as its true origin.\r\n        /// </summary>\r\n        /// <param name=\"trans\">The transform to transpose.</param>\r\n        /// <param name=\"anchor\">The point around which to transpose in local space.</param>\r\n        /// <param name=\"position\">The new position in world space.</param>\r\n        /// <param name=\"rotation\">The new rotation in world space.</param>\r\n        public static void TransposeAroundAnchor(this Transform trans, Trans anchor, Vector3 position, Quaternion rotation)\r\n        {\r\n            if (trans.parent != null)\r\n            {\r\n                position = trans.parent.InverseTransformPoint(position);\r\n                rotation = trans.parent.InverseTransformRotation(rotation);\r\n            }\r\n\r\n            LocalTransposeAroundAnchor(trans, anchor, position, rotation);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Set the position and rotation of a Transform as if its origin were that of 'anchor'. \r\n        /// Anchor should be local to the Transform where <0,0,0> would be the same as its true origin.\r\n        /// </summary>\r\n        /// <param name=\"trans\">The transform to transpose.</param>\r\n        /// <param name=\"anchor\">The point around which to transpose in world space.</param>\r\n        /// <param name=\"position\">The new position in world space.</param>\r\n        /// <param name=\"rotation\">The new rotation in world space.</param>\r\n        public static void TransposeAroundAnchor(this Transform trans, Transform anchor, Vector3 position, Quaternion rotation)\r\n        {\r\n            if (trans.parent != null)\r\n            {\r\n                position = trans.parent.InverseTransformPoint(position);\r\n                rotation = trans.parent.InverseTransformRotation(rotation);\r\n            }\r\n\r\n            LocalTransposeAroundAnchor(trans, anchor.ToRelativeTrans(trans), position, rotation);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Set the localPosition and localRotation of a Transform as if its origin were that of 'anchor'. \r\n        /// Anchor should be local to the Transform where <0,0,0> would be the same as its true origin.\r\n        /// </summary>\r\n        /// <param name=\"trans\">The transform to transpose.</param>\r\n        /// <param name=\"anchor\">The point around which to transpose relative to the transform.</param>\r\n        /// <param name=\"position\"></param>\r\n        /// <param name=\"rotation\"></param>\r\n        public static void LocalTransposeAroundAnchor(this Transform trans, Vector3 anchor, Vector3 position, Quaternion rotation)\r\n        {\r\n            anchor = rotation * Vector3.Scale(anchor, trans.localScale);\r\n            trans.localPosition = position - anchor;\r\n            trans.localRotation = rotation;\r\n        }\r\n\r\n        public static void LocalTransposeAroundAnchor(this Transform trans, Trans anchor, Vector3 position, Quaternion rotation)\r\n        {\r\n            var anchorPos = rotation * Vector3.Scale(anchor.Position, trans.localScale);\r\n            trans.localPosition = position - anchorPos;\r\n            trans.localRotation = anchor.Rotation * rotation;\r\n        }\r\n\r\n        public static void LocalTransposeAroundAnchor(this Transform trans, Transform anchor, Vector3 position, Quaternion rotation)\r\n        {\r\n            var m = anchor.GetRelativeMatrix(trans);\r\n\r\n            var anchorPos = rotation * Vector3.Scale(m.GetTranslation(), trans.localScale);\r\n            trans.localPosition = position - anchorPos;\r\n            trans.localRotation = m.GetRotation() * rotation;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/TypeUtil.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class TypeUtil\r\n    {\r\n\r\n        public static IEnumerable<Type> GetTypes(System.Func<System.Type, bool> predicate)\r\n        {\r\n            foreach (var assemb in System.AppDomain.CurrentDomain.GetAssemblies())\r\n            {\r\n                foreach (var tp in assemb.GetTypes())\r\n                {\r\n                    if (predicate == null || predicate(tp)) yield return tp;\r\n                }\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<Type> GetTypesAssignableFrom(System.Type rootType)\r\n        {\r\n            foreach (var assemb in System.AppDomain.CurrentDomain.GetAssemblies())\r\n            {\r\n                foreach (var tp in assemb.GetTypes())\r\n                {\r\n                    if (rootType.IsAssignableFrom(tp)) yield return tp;\r\n                }\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<Type> GetTypesAssignableFrom(System.Reflection.Assembly assemb, System.Type rootType)\r\n        {\r\n            foreach (var tp in assemb.GetTypes())\r\n            {\r\n                if (rootType.IsAssignableFrom(tp) && rootType != tp) yield return tp;\r\n            }\r\n        }\r\n\r\n        public static bool IsType(System.Type tp, System.Type assignableType)\r\n        {\r\n            if (assignableType.IsGenericType)\r\n            {\r\n                while (tp != null && tp != typeof(object))\r\n                {\r\n                    var ctp = tp.IsGenericType ? tp.GetGenericTypeDefinition() : tp;\r\n                    if (ctp == assignableType) return true;\r\n                    tp = tp.BaseType;\r\n                }\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                return assignableType.IsAssignableFrom(tp);\r\n            }\r\n        }\r\n\r\n        public static bool IsType(System.Type tp, params System.Type[] assignableTypes)\r\n        {\r\n            foreach (var otp in assignableTypes)\r\n            {\r\n                if (otp.IsAssignableFrom(tp)) return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static object GetDefaultValue(this System.Type tp)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n\r\n            if (tp.IsValueType)\r\n                return System.Activator.CreateInstance(tp);\r\n            else\r\n                return null;\r\n        }\r\n\r\n\r\n        public static System.Type ParseType(string assembName, string typeName)\r\n        {\r\n            var assemb = (from a in System.AppDomain.CurrentDomain.GetAssemblies()\r\n                          where a.GetName().Name == assembName || a.FullName == assembName\r\n                          select a).FirstOrDefault();\r\n            if (assemb != null)\r\n            {\r\n                return (from t in assemb.GetTypes()\r\n                        where t.FullName == typeName\r\n                        select t).FirstOrDefault();\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public static System.Type FindType(string typeName, bool useFullName = false, bool ignoreCase = false)\r\n        {\r\n            if (string.IsNullOrEmpty(typeName)) return null;\r\n\r\n            bool isArray = typeName.EndsWith(\"[]\");\r\n            if (isArray)\r\n                typeName = typeName.Substring(0, typeName.Length - 2);\r\n\r\n            StringComparison e = (ignoreCase) ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal;\r\n            if (useFullName)\r\n            {\r\n                foreach (var assemb in System.AppDomain.CurrentDomain.GetAssemblies())\r\n                {\r\n                    foreach (var t in assemb.GetTypes())\r\n                    {\r\n                        if (string.Equals(t.FullName, typeName, e))\r\n                        {\r\n                            if (isArray)\r\n                                return t.MakeArrayType();\r\n                            else\r\n                                return t;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                foreach (var assemb in System.AppDomain.CurrentDomain.GetAssemblies())\r\n                {\r\n                    foreach (var t in assemb.GetTypes())\r\n                    {\r\n                        if (string.Equals(t.Name, typeName, e) || string.Equals(t.FullName, typeName, e))\r\n                        {\r\n                            if (isArray)\r\n                                return t.MakeArrayType();\r\n                            else\r\n                                return t;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            return null;\r\n        }\r\n\r\n        public static System.Type FindType(string typeName, System.Type baseType, bool useFullName = false, bool ignoreCase = false)\r\n        {\r\n            if (string.IsNullOrEmpty(typeName)) return null;\r\n            if (baseType == null) throw new System.ArgumentNullException(\"baseType\");\r\n\r\n            bool isArray = typeName.EndsWith(\"[]\");\r\n            if (isArray)\r\n                typeName = typeName.Substring(0, typeName.Length - 2);\r\n\r\n            StringComparison e = (ignoreCase) ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal;\r\n            if(useFullName)\r\n            {\r\n                foreach (var assemb in System.AppDomain.CurrentDomain.GetAssemblies())\r\n                {\r\n                    foreach (var t in assemb.GetTypes())\r\n                    {\r\n                        if (baseType.IsAssignableFrom(t) && string.Equals(t.FullName, typeName, e))\r\n                        {\r\n                            if (isArray)\r\n                                return t.MakeArrayType();\r\n                            else\r\n                                return t;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                foreach (var assemb in System.AppDomain.CurrentDomain.GetAssemblies())\r\n                {\r\n                    foreach (var t in assemb.GetTypes())\r\n                    {\r\n                        if (baseType.IsAssignableFrom(t) && (string.Equals(t.Name, typeName, e) || string.Equals(t.FullName, typeName, e)))\r\n                        {\r\n                            if (isArray)\r\n                                return t.MakeArrayType();\r\n                            else\r\n                                return t;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static bool IsListType(this System.Type tp)\r\n        {\r\n            if (tp == null) return false;\r\n\r\n            if (tp.IsArray) return tp.GetArrayRank() == 1;\r\n\r\n            var interfaces = tp.GetInterfaces();\r\n            //if (interfaces.Contains(typeof(System.Collections.IList)) || interfaces.Contains(typeof(IList<>)))\r\n            if (Array.IndexOf(interfaces, typeof(System.Collections.IList)) >= 0 || Array.IndexOf(interfaces, typeof(IList<>)) >= 0)\r\n            {\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool IsListType(this System.Type tp, bool ignoreAsInterface)\r\n        {\r\n            if (tp == null) return false;\r\n\r\n            if (tp.IsArray) return tp.GetArrayRank() == 1;\r\n\r\n            if (ignoreAsInterface)\r\n            {\r\n                //if (tp == typeof(System.Collections.ArrayList) || (tp.IsGenericType && tp.GetGenericTypeDefinition() == typeof(List<>))) return true;\r\n                if (tp.IsGenericType && tp.GetGenericTypeDefinition() == typeof(List<>)) return true;\r\n            }\r\n            else\r\n            {\r\n                var interfaces = tp.GetInterfaces();\r\n                //if (interfaces.Contains(typeof(System.Collections.IList)) || interfaces.Contains(typeof(IList<>)))\r\n                if (Array.IndexOf(interfaces, typeof(System.Collections.IList)) >= 0 || Array.IndexOf(interfaces, typeof(IList<>)) >= 0)\r\n                {\r\n                    return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool IsListType(this System.Type tp, out System.Type innerType)\r\n        {\r\n            innerType = null;\r\n            if (tp == null) return false;\r\n\r\n            if (tp.IsArray)\r\n            {\r\n                if (tp.GetArrayRank() == 1)\r\n                {\r\n                    innerType = tp.GetElementType();\r\n                    return true;\r\n                }\r\n                else\r\n                    return false;\r\n            }\r\n\r\n            var interfaces = tp.GetInterfaces();\r\n            if (Array.IndexOf(interfaces, typeof(System.Collections.IList)) >= 0 || Array.IndexOf(interfaces, typeof(IList<>)) >= 0)\r\n            {\r\n                if (tp.IsGenericType)\r\n                {\r\n                    innerType = tp.GetGenericArguments()[0];\r\n                }\r\n                else\r\n                {\r\n                    innerType = typeof(object);\r\n                }\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool IsListType(this System.Type tp, bool ignoreAsInterface, out System.Type innerType)\r\n        {\r\n            innerType = null;\r\n            if (tp == null) return false;\r\n\r\n            if (tp.IsArray)\r\n            {\r\n                if (tp.GetArrayRank() == 1)\r\n                {\r\n                    innerType = tp.GetElementType();\r\n                    return true;\r\n                }\r\n                else\r\n                    return false;\r\n            }\r\n\r\n            if (ignoreAsInterface)\r\n            {\r\n                if (tp.IsGenericType && tp.GetGenericTypeDefinition() == typeof(List<>))\r\n                {\r\n                    innerType = tp.GetGenericArguments()[0];\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    return false;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var interfaces = tp.GetInterfaces();\r\n                if (Array.IndexOf(interfaces, typeof(System.Collections.IList)) >= 0 || Array.IndexOf(interfaces, typeof(IList<>)) >= 0)\r\n                {\r\n                    if (tp.IsGenericType)\r\n                    {\r\n                        innerType = tp.GetGenericArguments()[0];\r\n                    }\r\n                    else\r\n                    {\r\n                        innerType = typeof(object);\r\n                    }\r\n                    return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static System.Type GetElementTypeOfListType(this System.Type tp)\r\n        {\r\n            if (tp == null) return null;\r\n\r\n            if (tp.IsArray) return tp.GetElementType();\r\n\r\n            var interfaces = tp.GetInterfaces();\r\n            //if (interfaces.Contains(typeof(System.Collections.IList)) || interfaces.Contains(typeof(IList<>)))\r\n            if (Array.IndexOf(interfaces, typeof(System.Collections.IList)) >= 0 || Array.IndexOf(interfaces, typeof(IList<>)) >= 0)\r\n            {\r\n                if (tp.IsGenericType) return tp.GetGenericArguments()[0];\r\n                else return typeof(object);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n\r\n\r\n        private static System.Type _obsoleteAttribType = typeof(System.ObsoleteAttribute);\r\n        public static bool IsObsolete(this System.Reflection.MemberInfo member)\r\n        {\r\n            return Attribute.IsDefined(member, _obsoleteAttribType);\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/Utils/UIEventUtil.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.EventSystems;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Utils\n{\n\n    public static class UIEventUtil\n    {\n\n        public static bool SetSelectedGameObject(GameObject selected)\n        {\n            var ev = EventSystem.current;\n            if (ev == null) return false;\n\n            if (selected != null && ev.currentSelectedGameObject == selected)\n            {\n                ev.SetSelectedGameObject(null);\n                ev.SetSelectedGameObject(selected);\n            }\n            else\n            {\n                ev.SetSelectedGameObject(selected);\n            }\n            return true;\n        }\n\n        public static GameObject GetSelectedGameObjet()\n        {\n            var ev = EventSystem.current;\n            return ev != null ? ev.currentSelectedGameObject : null;\n        }\n        \n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/Utils/VectorUtil.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n\r\n    /// <summary>\r\n    /// A collection of vector methods. Any statements regarding the clockwise relative directions of a rotation are under the consideration of x-axis is right, and y-axis is up. \r\n    /// A clockwise rotation would go from y-up to x-right.\r\n    /// </summary>\r\n    public static class VectorUtil\r\n    {\r\n\r\n        public static Vector2 NaNVector2 { get { return new Vector2(float.NaN, float.NaN); } }\r\n        public static Vector3 NaNVector3 { get { return new Vector3(float.NaN, float.NaN, float.NaN); } }\r\n        public static Vector2 PosInfVector2 { get { return new Vector2(float.PositiveInfinity, float.PositiveInfinity); } }\r\n        public static Vector3 PosInfVector3 { get { return new Vector3(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); } }\r\n        public static Vector2 NegInfVector2 { get { return new Vector2(float.NegativeInfinity, float.NegativeInfinity); } }\r\n        public static Vector3 NegInfVector3 { get { return new Vector3(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); } }\r\n\r\n        public static bool IsNaN(Vector2 v)\r\n        {\r\n            return float.IsNaN(v.sqrMagnitude);\r\n        }\r\n\r\n        public static bool IsNaN(Vector3 v)\r\n        {\r\n            return float.IsNaN(v.sqrMagnitude);\r\n        }\r\n\r\n        public static bool IsNaN(Vector4 v)\r\n        {\r\n            return float.IsNaN(v.sqrMagnitude);\r\n        }\r\n\r\n        public static float SqrDistance(Vector2 a, Vector2 b)\r\n        {\r\n            return (a - b).sqrMagnitude;\r\n        }\r\n\r\n        public static float SqrDistance(Vector3 a, Vector3 b)\r\n        {\r\n            return (a - b).sqrMagnitude;\r\n        }\r\n\r\n        #region Vector Convert\r\n\r\n        public static string Stringify(Vector2 v)\r\n        {\r\n            return v.x.ToString() + \",\" + v.y.ToString();\r\n        }\r\n\r\n        public static string Stringify(Vector3 v)\r\n        {\r\n            return v.x.ToString() + \",\" + v.y.ToString() + \",\" + v.z.ToString();\r\n        }\r\n\r\n        public static string Stringify(Vector4 v)\r\n        {\r\n            return v.x.ToString() + \",\" + v.y.ToString() + \",\" + v.z.ToString() + \",\" + v.w.ToString();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get Vector2 from angle\r\n        /// </summary>\r\n        /// <param name=\"a\"></param>\r\n        /// <returns></returns>\r\n        public static Vector2 AngleToVector2(float a, bool useRadians = false, bool yDominant = false)\r\n        {\r\n            if (!useRadians) a *= MathUtil.DEG_TO_RAD;\r\n            if (yDominant)\r\n            {\r\n                return new Vector2(Mathf.Sin(a), Mathf.Cos(a));\r\n            }\r\n            else\r\n            {\r\n                return new Vector2(Mathf.Cos(a), Mathf.Sin(a));\r\n            }\r\n        }\r\n\r\n        public static Vector3 Clamp(Vector3 input, Vector3 max, Vector3 min)\r\n        {\r\n            input.x = MathUtil.Clamp(input.x, max.x, min.x);\r\n            input.y = MathUtil.Clamp(input.y, max.y, min.y);\r\n            input.z = MathUtil.Clamp(input.z, max.z, min.z);\r\n            return input;\r\n        }\r\n\r\n        public static Vector3 Clamp(Vector2 input, Vector2 max, Vector2 min)\r\n        {\r\n            input.x = MathUtil.Clamp(input.x, max.x, min.x);\r\n            input.y = MathUtil.Clamp(input.y, max.y, min.y);\r\n            return input;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Vector2 Trig\r\n\r\n        /// <summary>\r\n        /// Get the angle in degrees off the forward defined by x.\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <returns></returns>\r\n        public static float Angle(Vector2 v)\r\n        {\r\n            return Mathf.Atan2(v.y, v.x) * MathUtil.RAD_TO_DEG;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get the angle in degrees off the forward defined by x.\r\n        /// </summary>\r\n        /// <param name=\"x\"></param>\r\n        /// <param name=\"y\"></param>\r\n        /// <returns></returns>\r\n        public static float Angle(float x, float y)\r\n        {\r\n            return Mathf.Atan2(y, x) * MathUtil.RAD_TO_DEG;\r\n        }\r\n\r\n        public static float AngleBetween(Vector2 a, Vector2 b)\r\n        {\r\n            // // Due to float error the dot / mag can sometimes be ever so slightly over 1, which can cause NaN in acos.\r\n            //return Mathf.Acos(Vector2.Dot(a, b) / (a.magnitude * b.magnitude)) * MathUtil.RAD_TO_DEG;\r\n            double d = (double)Vector2.Dot(a, b) / ((double)a.magnitude * (double)b.magnitude);\r\n            if (d >= 1d) return 0f;\r\n            else if (d <= -1d) return 180f;\r\n            return (float)System.Math.Acos(d) * MathUtil.RAD_TO_DEG;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Angle in degrees off some axis in the counter-clockwise direction. Think of like 'Angle' or 'Atan2' where you get to control \r\n        /// which axis as opposed to only measuring off of <1,0>. \r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <param name=\"axis\"></param>\r\n        /// <returns></returns>\r\n        public static float AngleOff(Vector2 v, Vector2 axis)\r\n        {\r\n            if (axis.sqrMagnitude < 0.0001f) return float.NaN;\r\n            axis.Normalize();\r\n            var tang = new Vector2(-axis.y, axis.x);\r\n            return AngleBetween(v, axis) * Mathf.Sign(Vector2.Dot(v, tang));\r\n        }\r\n\r\n        public static void Reflect(ref Vector2 v, Vector2 normal)\r\n        {\r\n            var dp = 2f * Vector2.Dot(v, normal);\r\n            var ix = v.x - normal.x * dp;\r\n            var iy = v.y - normal.y * dp;\r\n            v.x = ix;\r\n            v.y = iy;\r\n        }\r\n\r\n        public static Vector2 Reflect(Vector2 v, Vector2 normal)\r\n        {\r\n            var dp = 2 * Vector2.Dot(v, normal);\r\n            return new Vector2(v.x - normal.x * dp, v.y - normal.y * dp);\r\n        }\r\n\r\n        public static void Mirror(ref Vector2 v, Vector2 axis)\r\n        {\r\n            v = (2 * (Vector2.Dot(v, axis) / Vector2.Dot(axis, axis)) * axis) - v;\r\n        }\r\n\r\n        public static Vector2 Mirror(Vector2 v, Vector2 axis)\r\n        {\r\n            return (2 * (Vector2.Dot(v, axis) / Vector2.Dot(axis, axis)) * axis) - v;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Rotate Vector2 counter-clockwise by 'a'\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <param name=\"a\"></param>\r\n        /// <returns></returns>\r\n        public static Vector2 RotateBy(Vector2 v, float a, bool bUseRadians = false)\r\n        {\r\n            if (!bUseRadians) a *= MathUtil.DEG_TO_RAD;\r\n            var ca = System.Math.Cos(a);\r\n            var sa = System.Math.Sin(a);\r\n            var rx = v.x * ca - v.y * sa;\r\n\r\n            return new Vector2((float)rx, (float)(v.x * sa + v.y * ca));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Rotate Vector2 counter-clockwise by 'a'\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <param name=\"a\"></param>\r\n        public static void RotateBy(ref Vector2 v, float a, bool bUseRadians = false)\r\n        {\r\n            if (!bUseRadians) a *= MathUtil.DEG_TO_RAD;\r\n            var ca = System.Math.Cos(a);\r\n            var sa = System.Math.Sin(a);\r\n            var rx = v.x * ca - v.y * sa;\r\n\r\n            v.x = (float)rx;\r\n            v.y = (float)(v.x * sa + v.y * ca);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Rotates a vector toward another. Magnitude of the from vector is maintained.\r\n        /// </summary>\r\n        /// <param name=\"from\"></param>\r\n        /// <param name=\"to\"></param>\r\n        /// <param name=\"a\"></param>\r\n        /// <param name=\"bUseRadians\"></param>\r\n        /// <returns></returns>\r\n        public static Vector2 RotateToward(Vector2 from, Vector2 to, float a, bool bUseRadians = false)\r\n        {\r\n            //var angleBetween = Mathf.Acos(Vector2.Dot(from, to) / (from.magnitude * to.magnitude));\r\n            //if (!bUseRadians) a *= MathUtil.DEG_TO_RAD;\r\n            //var t = angleBetween / a;\r\n            //return Slerp(from, to, t);\r\n\r\n            if (!bUseRadians) a *= MathUtil.DEG_TO_RAD;\r\n            var a1 = Mathf.Atan2(from.y, from.x);\r\n            var a2 = Mathf.Atan2(to.y, to.x);\r\n            a2 = MathUtil.ShortenAngleToAnother(a2, a1, true);\r\n            var ra = (a2 - a1 >= 0f) ? a1 + a : a1 - a;\r\n            var l = from.magnitude;\r\n            return new Vector2(Mathf.Cos(ra) * l, Mathf.Sin(ra) * l);\r\n        }\r\n\r\n        public static Vector2 RotateTowardClamped(Vector2 from, Vector2 to, float a, bool bUseRadians = false)\r\n        {\r\n            if (!bUseRadians) a *= MathUtil.DEG_TO_RAD;\r\n            var a1 = Mathf.Atan2(from.y, from.x);\r\n            var a2 = Mathf.Atan2(to.y, to.x);\r\n            a2 = MathUtil.ShortenAngleToAnother(a2, a1, true);\r\n\r\n            var da = a2 - a1;\r\n            var ra = a1 + Mathf.Clamp(Mathf.Abs(a), 0f, Mathf.Abs(da)) * Mathf.Sign(da);\r\n\r\n            var l = from.magnitude;\r\n            return new Vector2(Mathf.Cos(ra) * l, Mathf.Sin(ra) * l);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Angular interpolates between two vectors.\r\n        /// </summary>\r\n        /// <param name=\"from\"></param>\r\n        /// <param name=\"to\"></param>\r\n        /// <param name=\"t\"></param>\r\n        /// <returns>The vectors are 2 dimensional, so technically this is not a spherical linear interpolation. The name Slerp is kept for consistency. \r\n        /// The result would be if you Slerped between 2 Vector3's that had a z value of 0. The direction interpolates at an angular rate, where as the \r\n        /// magnitude interpolates at a linear rate.</returns>\r\n        public static Vector2 Slerp(Vector2 from, Vector2 to, float t)\r\n        {\r\n            var a = MathUtil.NormalizeAngle(Mathf.Lerp(Mathf.Atan2(from.y, from.x), Mathf.Atan2(to.y, to.x), t), true);\r\n            var l = Mathf.Lerp(from.magnitude, to.magnitude, t);\r\n            return new Vector2(Mathf.Cos(a) * l, Mathf.Sin(a) * l);\r\n        }\r\n\r\n        public static Vector2 Orth(Vector2 v)\r\n        {\r\n            return new Vector2(-v.y, v.x);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Vector3 Trig\r\n\r\n        public static float AngleBetween(Vector3 a, Vector3 b)\r\n        {\r\n            // // Due to float error the dot / mag can sometimes be ever so slightly over 1, which can cause NaN in acos.\r\n            //return Mathf.Acos(Vector3.Dot(a, b) / (a.magnitude * b.magnitude)) * MathUtil.RAD_TO_DEG;\r\n            double d = System.Math.Sqrt((double)a.sqrMagnitude * (double)b.sqrMagnitude);\r\n            if (d < MathUtil.DBL_EPSILON) return 0f;\r\n\r\n            d = (double)Vector3.Dot(a, b) / d;\r\n            if (d >= 1d) return 0f;\r\n            else if (d <= -1d) return 180f;\r\n            return (float)System.Math.Acos(d) * MathUtil.RAD_TO_DEG;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Emulates Vector3.SignedAngle from unity 2017. Note that this does not do any projections, so this is not a measure of the rotation around that axis, just the direction around that axis.\r\n        /// Use AngleOffAroundAxis to get the projected rotation around an axis.\r\n        /// </summary>\r\n        /// <param name=\"a\"></param>\r\n        /// <param name=\"b\"></param>\r\n        /// <param name=\"axis\"></param>\r\n        /// <returns></returns>\r\n        public static float SignedAngle(Vector3 a, Vector3 b, Vector3 axis)\r\n        {\r\n            a.Normalize();\r\n            b.Normalize();\r\n            return Mathf.Acos(Mathf.Clamp(Vector3.Dot(a, b), -1f, 1f)) * MathUtil.RAD_TO_DEG * Mathf.Sign(Vector3.Dot(axis, Vector3.Cross(a, b)));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns a vector orthogonal to up in the general direction of forward.\r\n        /// </summary>\r\n        /// <param name=\"up\"></param>\r\n        /// <param name=\"targForward\"></param>\r\n        /// <returns></returns>\r\n        public static Vector3 GetForwardTangent(Vector3 forward, Vector3 up)\r\n        {\r\n            return Vector3.Cross(Vector3.Cross(up, forward), up);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Find some projected angle measure off some forward around some axis.\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <param name=\"forward\"></param>\r\n        /// <param name=\"axis\"></param>\r\n        /// <returns>Angle in degrees</returns>\r\n        public static float AngleOffAroundAxis(Vector3 v, Vector3 forward, Vector3 axis, bool clockwise = false)\r\n        {\r\n            Vector3 right;\r\n            if (clockwise)\r\n            {\r\n                right = Vector3.Cross(forward, axis);\r\n                forward = Vector3.Cross(axis, right);\r\n            }\r\n            else\r\n            {\r\n                right = Vector3.Cross(axis, forward);\r\n                forward = Vector3.Cross(right, axis);\r\n            }\r\n            return Mathf.Atan2(Vector3.Dot(v, right), Vector3.Dot(v, forward)) * MathUtil.RAD_TO_DEG;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Rotate a vector around some axis.\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <param name=\"a\"></param>\r\n        /// <param name=\"axis\"></param>\r\n        /// <param name=\"clockwise\"></param>\r\n        /// <param name=\"bUseRadians\"></param>\r\n        /// <returns></returns>\r\n        public static Vector3 RotateAroundAxis(Vector3 v, float a, Vector3 axis, bool clockwise = false, bool bUseRadians = false)\r\n        {\r\n            if (bUseRadians) a *= MathUtil.RAD_TO_DEG;\r\n            Quaternion q;\r\n            if (clockwise)\r\n                q = Quaternion.AngleAxis(a, axis);\r\n            else\r\n                q = Quaternion.AngleAxis(-a, axis);\r\n            return q * v;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Vector2 Mod\r\n\r\n        public static Vector2 Normalize(this Vector2 v)\r\n        {\r\n            return v.normalized;\r\n        }\r\n\r\n        public static Vector2 Normalize(float x, float y)\r\n        {\r\n            float l = Mathf.Sqrt(x * x + y * y);\r\n            return new Vector2(x / l, y / l);\r\n        }\r\n\r\n        public static Vector2 ClampToAxis(this Vector2 v, Vector2 axis)\r\n        {\r\n            var n = new Vector2(-axis.y, axis.x);\r\n            n.Normalize();\r\n            return v - n * Vector2.Dot(v, n);\r\n        }\r\n\r\n        public static Vector2 SetLengthOnAxis(this Vector2 v, Vector2 axis, float len)\r\n        {\r\n            //var n = new Vector2(-axis.y, axis.x);\r\n            //n.Normalize();\r\n\r\n            //var d = Vector2.Dot(v, n);\r\n            //v -= n * d;\r\n            //v = v.normalized * len;\r\n            //v += n * d;\r\n            //return v;\r\n\r\n            axis.Normalize();\r\n            var d = len - Vector2.Dot(v, axis);\r\n            return v + axis * d;\r\n        }\r\n\r\n        public static Vector2 Average(Vector2 a, Vector2 b)\r\n        {\r\n            return (a + b) / 2f;\r\n        }\r\n\r\n        public static Vector2 Average(Vector2 a, Vector2 b, Vector2 c)\r\n        {\r\n            return (a + b + c) / 3f;\r\n        }\r\n\r\n        public static Vector2 Average(Vector2 a, Vector2 b, Vector2 c, Vector2 d)\r\n        {\r\n            return (a + b + c + d) / 4f;\r\n        }\r\n\r\n        public static Vector2 Average(params Vector2[] values)\r\n        {\r\n            if (values == null || values.Length == 0) return Vector3.zero;\r\n\r\n            Vector2 v = Vector2.zero;\r\n            for (int i = 0; i < values.Length; i++)\r\n            {\r\n                v += values[i];\r\n            }\r\n            return v / values.Length;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Vector3 Mod\r\n\r\n        public static Vector3 Normalize(float x, float y, float z)\r\n        {\r\n            float l = Mathf.Sqrt(x * x + y * y + z * z);\r\n            return new Vector3(x / l, y / l, z / l);\r\n        }\r\n\r\n        public static Vector3 SetLengthOnAxis(this Vector3 v, Vector3 axis, float len)\r\n        {\r\n            axis.Normalize();\r\n            var d = len - Vector3.Dot(v, axis);\r\n            return v + axis * d;\r\n        }\r\n\r\n        public static Vector3 Average(Vector3 a, Vector3 b)\r\n        {\r\n            return (a + b) / 2f;\r\n        }\r\n\r\n        public static Vector3 Average(Vector3 a, Vector3 b, Vector3 c)\r\n        {\r\n            return (a + b + c) / 3f;\r\n        }\r\n\r\n        public static Vector3 Average(Vector3 a, Vector3 b, Vector3 c, Vector3 d)\r\n        {\r\n            return (a + b + c + d) / 4f;\r\n        }\r\n\r\n        public static Vector3 Average(params Vector3[] values)\r\n        {\r\n            if (values == null || values.Length == 0) return Vector3.zero;\r\n\r\n            Vector3 v = Vector3.zero;\r\n            for(int i = 0; i < values.Length; i++)\r\n            {\r\n                v += values[i];\r\n            }\r\n            return v / values.Length;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Scale Vector\r\n\r\n        public static float GetMaxScalar(Vector2 v)\r\n        {\r\n            return Mathf.Max(v.x, v.y);\r\n        }\r\n\r\n        public static float GetMaxScalar(Vector3 v)\r\n        {\r\n            return Mathf.Max(v.x, v.y, v.z);\r\n        }\r\n\r\n        public static float GetMaxScalar(Vector4 v)\r\n        {\r\n            return Mathf.Max(v.x, v.y, v.z, v.z);\r\n        }\r\n\r\n        public static float GetMinScalar(Vector2 v)\r\n        {\r\n            return Mathf.Min(v.x, v.y);\r\n        }\r\n\r\n        public static float GetMinScalar(Vector3 v)\r\n        {\r\n            return Mathf.Min(v.x, v.y, v.z);\r\n        }\r\n\r\n        public static float GetMinScalar(Vector4 v)\r\n        {\r\n            return Mathf.Min(v.x, v.y, v.z, v.z);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Compare Vector\r\n\r\n        /// <summary>\r\n        /// Compares if a and b are nearly on the same axis and will probably return a zero vector from a cross product\r\n        /// </summary>\r\n        /// <param name=\"a\"></param>\r\n        /// <param name=\"b\"></param>\r\n        /// <param name=\"epsilon\"></param>\r\n        /// <returns></returns>\r\n        public static bool NearSameAxis(Vector3 a, Vector3 b, float epsilon = MathUtil.EPSILON)\r\n        {\r\n            return MathUtil.FuzzyEqual(Mathf.Abs(Vector3.Dot(a.normalized, b.normalized)), 1.0f, epsilon);\r\n        }\r\n\r\n        public static bool NearZeroVector(this Vector4 v)\r\n        {\r\n            return MathUtil.FuzzyEqual(v.sqrMagnitude, 0f, MathUtil.EPSILON_SQR);\r\n        }\r\n\r\n        public static bool NearZeroVector(this Vector3 v)\r\n        {\r\n            return MathUtil.FuzzyEqual(v.sqrMagnitude, 0f, MathUtil.EPSILON_SQR);\r\n        }\r\n\r\n        public static bool NearZeroVector(this Vector2 v)\r\n        {\r\n            return MathUtil.FuzzyEqual(v.sqrMagnitude, 0f, MathUtil.EPSILON_SQR);\r\n        }\r\n\r\n        public static bool FuzzyEquals(this Vector2 a, Vector2 b)\r\n        {\r\n            return MathUtil.FuzzyEqual(Vector3.SqrMagnitude(a - b), 0f, MathUtil.EPSILON_SQR);\r\n        }\r\n\r\n        public static bool FuzzyEquals(this Vector2 a, Vector2 b, float epsilon)\r\n        {\r\n            return MathUtil.FuzzyEqual(Vector3.SqrMagnitude(a - b), 0f, epsilon);\r\n        }\r\n\r\n        public static bool FuzzyEquals(this Vector3 a, Vector3 b)\r\n        {\r\n            return MathUtil.FuzzyEqual(Vector3.SqrMagnitude(a - b), 0f, MathUtil.EPSILON_SQR);\r\n        }\r\n\r\n        public static bool FuzzyEquals(this Vector3 a, Vector3 b, float epsilon)\r\n        {\r\n            return MathUtil.FuzzyEqual(Vector3.SqrMagnitude(a - b), 0f, epsilon);\r\n        }\r\n\r\n        public static bool FuzzyEquals(this Vector4 a, Vector4 b)\r\n        {\r\n            return MathUtil.FuzzyEqual(Vector4.SqrMagnitude(a - b), 0f, MathUtil.EPSILON_SQR);\r\n        }\r\n\r\n        public static bool FuzzyEquals(this Vector4 a, Vector4 b, float epsilon)\r\n        {\r\n            return MathUtil.FuzzyEqual(Vector4.SqrMagnitude(a - b), 0f, epsilon);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Lerp Like\r\n\r\n        /// <summary>\r\n        /// Unity's Vector2.Lerp clamps between 0->1, this allows a true lerp of all ranges.\r\n        /// </summary>\r\n        /// <param name=\"a\"></param>\r\n        /// <param name=\"b\"></param>\r\n        /// <param name=\"t\"></param>\r\n        /// <returns></returns>\r\n        public static Vector2 Lerp(Vector2 a, Vector2 b, float t)\r\n        {\r\n            return (b - a) * t + a;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Unity's Vector3.Lerp clamps between 0->1, this allows a true lerp of all ranges.\r\n        /// </summary>\r\n        /// <param name=\"a\"></param>\r\n        /// <param name=\"b\"></param>\r\n        /// <param name=\"t\"></param>\r\n        /// <returns></returns>\r\n        public static Vector3 Lerp(Vector3 a, Vector3 b, float t)\r\n        {\r\n            return (b - a) * t + a;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Unity's Vector4.Lerp clamps between 0->1, this allows a true lerp of all ranges.\r\n        /// </summary>\r\n        /// <param name=\"a\"></param>\r\n        /// <param name=\"b\"></param>\r\n        /// <param name=\"t\"></param>\r\n        /// <returns></returns>\r\n        public static Vector4 Lerp(Vector4 a, Vector4 b, float t)\r\n        {\r\n            return (b - a) * t + a;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Moves from a to b at some speed dependent of a delta time with out passing b.\r\n        /// </summary>\r\n        /// <param name=\"a\"></param>\r\n        /// <param name=\"b\"></param>\r\n        /// <param name=\"speed\"></param>\r\n        /// <param name=\"dt\"></param>\r\n        /// <returns></returns>\r\n        public static Vector2 SpeedLerp(Vector2 a, Vector2 b, float speed, float dt)\r\n        {\r\n            var v = b - a;\r\n            var dv = speed * dt;\r\n            if (dv > v.magnitude)\r\n                return b;\r\n            else\r\n                return a + v.normalized * dv;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Moves from a to b at some speed dependent of a delta time with out passing b.\r\n        /// </summary>\r\n        /// <param name=\"a\"></param>\r\n        /// <param name=\"b\"></param>\r\n        /// <param name=\"speed\"></param>\r\n        /// <param name=\"dt\"></param>\r\n        /// <returns></returns>\r\n        public static Vector3 SpeedLerp(Vector3 a, Vector3 b, float speed, float dt)\r\n        {\r\n            var v = b - a;\r\n            var dv = speed * dt;\r\n            if (dv > v.magnitude)\r\n                return b;\r\n            else\r\n                return a + v.normalized * dv;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Linq\r\n\r\n        public static Vector3 Sum(this IEnumerable<Vector3> vectors)\r\n        {\r\n            //Vector3 sum = Vector3.zero;\r\n            //foreach(var v in vectors)\r\n            //{\r\n            //    sum += v;\r\n            //}\r\n            //return sum;\r\n\r\n            Vector3 sum = Vector3.zero;\r\n            var e = com.spacepuppy.Collections.LightEnumerator.Create(vectors);\r\n            while(e.MoveNext())\r\n            {\r\n                sum += e.Current;\r\n            }\r\n            return sum;\r\n        }\r\n\r\n        public static Vector3 Average(this IEnumerable<Vector3> vectors)\r\n        {\r\n            //int cnt = 0;\r\n            //Vector3 sum = Vector3.zero;\r\n            //foreach(var v in vectors)\r\n            //{\r\n            //    cnt++;\r\n            //    sum += v;\r\n            //}\r\n            //return (cnt > 0) ? sum / (float)cnt : Vector3.zero;\r\n\r\n            int cnt = 0;\r\n            Vector3 sum = Vector3.zero;\r\n            var e = com.spacepuppy.Collections.LightEnumerator.Create(vectors);\r\n            while(e.MoveNext())\r\n            {\r\n                cnt++;\r\n                sum += e.Current;\r\n            }\r\n            return (cnt > 0) ? sum / (float)cnt : Vector3.zero;\r\n        }\r\n\r\n        public static Vector3 SphericalAverage(this IEnumerable<Vector3> vectors)\r\n        {\r\n            //int cnt = 0;\r\n            //float theta = 0f;\r\n            //float phi = 0f;\r\n            //foreach(var v in vectors)\r\n            //{\r\n            //    cnt++;\r\n            //    theta += Mathf.Acos(v.z / Mathf.Sqrt(v.x * v.x + v.y * v.y + v.z * v.z));\r\n            //    phi += Mathf.Atan(v.y / v.x);\r\n            //}\r\n            //if (cnt == 0 || float.IsNaN(theta)) return Vector3.zero;\r\n            //theta /= (float)cnt;\r\n            //phi /= (float)cnt;\r\n            //float st = Mathf.Sin(theta);\r\n            //return new Vector3(st * Mathf.Cos(phi), st * Mathf.Sin(phi), Mathf.Cos(theta));\r\n\r\n            int cnt = 0;\r\n            float theta = 0f;\r\n            float phi = 0f;\r\n            var e = com.spacepuppy.Collections.LightEnumerator.Create(vectors);\r\n            while (e.MoveNext())\r\n            {\r\n                cnt++;\r\n                var v = e.Current;\r\n                theta += Mathf.Acos(v.z / Mathf.Sqrt(v.x * v.x + v.y * v.y + v.z * v.z));\r\n                phi += Mathf.Atan(v.y / v.x);\r\n            }\r\n            if (cnt == 0 || float.IsNaN(theta)) return Vector3.zero;\r\n            theta /= (float)cnt;\r\n            phi /= (float)cnt;\r\n            float st = Mathf.Sin(theta);\r\n            return new Vector3(st * Mathf.Cos(phi), st * Mathf.Sin(phi), Mathf.Cos(theta));\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n        public static Vector2 Sum(this IEnumerable<Vector2> vectors)\r\n        {\r\n            //Vector2 sum = Vector2.zero;\r\n            //foreach (var v in vectors)\r\n            //{\r\n            //    sum += v;\r\n            //}\r\n            //return sum;\r\n\r\n\r\n            Vector2 sum = Vector2.zero;\r\n            var e = com.spacepuppy.Collections.LightEnumerator.Create(vectors);\r\n            while (e.MoveNext())\r\n            {\r\n                sum += e.Current;\r\n            }\r\n            return sum;\r\n        }\r\n\r\n        public static Vector2 Average(this IEnumerable<Vector2> vectors)\r\n        {\r\n            //int cnt = 0;\r\n            //Vector2 sum = Vector3.zero;\r\n            //foreach (var v in vectors)\r\n            //{\r\n            //    cnt++;\r\n            //    sum += v;\r\n            //}\r\n            //return (cnt > 0) ? sum / (float)cnt : Vector2.zero;\r\n\r\n            int cnt = 0;\r\n            Vector2 sum = Vector3.zero;\r\n            var e = com.spacepuppy.Collections.LightEnumerator.Create(vectors);\r\n            while (e.MoveNext())\r\n            {\r\n                cnt++;\r\n                sum += e.Current;\r\n            }\r\n            return (cnt > 0) ? sum / (float)cnt : Vector2.zero;\r\n        }\r\n\r\n        public static Vector2 PolarAverage(this IEnumerable<Vector2> vectors)\r\n        {\r\n            //int cnt = 0;\r\n            //float sum = 0f;\r\n            //foreach (var v in vectors)\r\n            //{\r\n            //    cnt++;\r\n            //    sum += Mathf.Atan2(v.y, v.x);\r\n            //}\r\n            //if (cnt == 0 || float.IsNaN(sum)) return Vector2.zero;\r\n            //sum /= (float)cnt;\r\n            //return new Vector2(Mathf.Cos(sum), Mathf.Sin(sum));\r\n\r\n            int cnt = 0;\r\n            float sum = 0f;\r\n            var e = com.spacepuppy.Collections.LightEnumerator.Create(vectors);\r\n            while (e.MoveNext())\r\n            {\r\n                cnt++;\r\n                var v = e.Current;\r\n                sum += Mathf.Atan2(v.y, v.x);\r\n            }\r\n            if (cnt == 0 || float.IsNaN(sum)) return Vector2.zero;\r\n            sum /= (float)cnt;\r\n            return new Vector2(Mathf.Cos(sum), Mathf.Sin(sum));\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Setters\r\n\r\n        public static Vector2 SetX(this Vector2 v, float x)\r\n        {\r\n            v.x = x;\r\n            return v;\r\n        }\r\n\r\n        public static Vector2 SetY(this Vector2 v, float y)\r\n        {\r\n            v.y = y;\r\n            return v;\r\n        }\r\n\r\n        public static Vector3 SetX(this Vector3 v, float x)\r\n        {\r\n            v.x = x;\r\n            return v;\r\n        }\r\n\r\n        public static Vector3 SetY(this Vector3 v, float y)\r\n        {\r\n            v.y = y;\r\n            return v;\r\n        }\r\n\r\n        public static Vector3 SetZ(this Vector3 v, float z)\r\n        {\r\n            v.z = z;\r\n            return v;\r\n        }\r\n\r\n        public static Vector3 Set(this Vector3 v, CartesianAxis axis, float value)\r\n        {\r\n            switch(axis)\r\n            {\r\n                case CartesianAxis.Zneg:\r\n                    v.z = -value;\r\n                    return v;\r\n                case CartesianAxis.Yneg:\r\n                    v.y = -value;\r\n                    return v;\r\n                case CartesianAxis.Xneg:\r\n                    v.x = -value;\r\n                    return v;\r\n                case CartesianAxis.X:\r\n                    v.x = value;\r\n                    return v;\r\n                case CartesianAxis.Y:\r\n                    v.y = value;\r\n                    return v;\r\n                case CartesianAxis.Z:\r\n                    v.z = value;\r\n                    return v;\r\n                default:\r\n                    return v;\r\n            }\r\n        }\r\n\r\n        public static void Set(ref Vector3 v, CartesianAxis axis, float value)\r\n        {\r\n            switch (axis)\r\n            {\r\n                case CartesianAxis.Zneg:\r\n                    v.z = -value;\r\n                    break;\r\n                case CartesianAxis.Yneg:\r\n                    v.y = -value;\r\n                    break;\r\n                case CartesianAxis.Xneg:\r\n                    v.x = -value;\r\n                    break;\r\n                case CartesianAxis.X:\r\n                    v.x = value;\r\n                    break;\r\n                case CartesianAxis.Y:\r\n                    v.y = value;\r\n                    break;\r\n                case CartesianAxis.Z:\r\n                    v.z = value;\r\n                    break;\r\n            }\r\n        }\r\n\r\n        public static float Get(this Vector3 v, CartesianAxis axis)\r\n        {\r\n            switch (axis)\r\n            {\r\n                case CartesianAxis.Zneg:\r\n                    return -v.z;\r\n                case CartesianAxis.Yneg:\r\n                    return -v.y;\r\n                case CartesianAxis.Xneg:\r\n                    return -v.x;\r\n                case CartesianAxis.X:\r\n                    return v.x;\r\n                case CartesianAxis.Y:\r\n                    return v.y;\r\n                case CartesianAxis.Z:\r\n                    return v.z;\r\n                default:\r\n                    return 0f;\r\n            }\r\n        }\r\n\r\n        public static Vector2 IncrementX(this Vector2 v, float x)\r\n        {\r\n            v.x += x;\r\n            return v;\r\n        }\r\n\r\n        public static Vector2 IncrementY(this Vector2 v, float y)\r\n        {\r\n            v.y += y;\r\n            return v;\r\n        }\r\n\r\n        public static Vector3 IncrementX(this Vector3 v, float x)\r\n        {\r\n            v.x += x;\r\n            return v;\r\n        }\r\n\r\n        public static Vector3 IncrementY(this Vector3 v, float y)\r\n        {\r\n            v.y += y;\r\n            return v;\r\n        }\r\n\r\n        public static Vector3 IncrementZ(this Vector3 v, float z)\r\n        {\r\n            v.z += z;\r\n            return v;\r\n        }\r\n\r\n        public static Vector3 GetUnitVector(CartesianAxis axis)\r\n        {\r\n            switch(axis)\r\n            {\r\n                case CartesianAxis.Zneg:\r\n                    return Vector3.back;\r\n                case CartesianAxis.Yneg:\r\n                    return Vector3.down;\r\n                case CartesianAxis.Xneg:\r\n                    return Vector3.right;\r\n                case CartesianAxis.X:\r\n                    return Vector3.right;\r\n                case CartesianAxis.Y:\r\n                    return Vector3.up;\r\n                case CartesianAxis.Z:\r\n                    return Vector3.forward;\r\n                default:\r\n                    return Vector3.zero;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        public static string ToDetailedString(this Vector2 v)\r\n        {\r\n            return System.String.Format(\"<{0}, {1}>\", v.x, v.y);\r\n        }\r\n        public static string ToDetailedString(this Vector3 v)\r\n        {\r\n            return System.String.Format(\"<{0}, {1}, {2}>\", v.x, v.y, v.z);\r\n        }\r\n        public static string ToDetailedString(this Vector4 v)\r\n        {\r\n            return System.String.Format(\"<{0}, {1}, {2}, {3}>\", v.x, v.y, v.z, v.w);\r\n        }\r\n\r\n\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "SpacepuppyBase/VariableStore.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\n\r\nusing com.spacepuppy.Dynamic;\r\nusing System.Collections.Generic;\r\nusing System.Reflection;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// A component you can stick variables into willy-nilly.\r\n    /// </summary>\r\n    public class VariableStore : SPComponent, IStateToken\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private TypeReference _reflectNamesFromType;\r\n\r\n        [SerializeField()]\r\n        private VariantCollection _variables = new VariantCollection();\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public System.Type ReflectNamesFromType\r\n        {\r\n            get { return _reflectNamesFromType.Type; }\r\n            set { _reflectNamesFromType.Type = value; }\r\n        }\r\n\r\n        public VariantCollection Variables\r\n        {\r\n            get { return _variables; }\r\n        }\r\n\r\n        public object this[string key]\r\n        {\r\n            get\r\n            {\r\n                return _variables[key];\r\n            }\r\n            set\r\n            {\r\n                _variables[key] = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDynamic Interface\r\n        \r\n        MemberInfo IDynamic.GetMember(string sMemberName, bool includeNonPublic)\r\n        {\r\n            return (_variables as IDynamic).GetMember(sMemberName, includeNonPublic);\r\n        }\r\n\r\n        IEnumerable<MemberInfo> IDynamic.GetMembers(bool includeNonPublic)\r\n        {\r\n            return (_variables as IDynamic).GetMembers(includeNonPublic);\r\n        }\r\n\r\n        IEnumerable<string> IDynamic.GetMemberNames(bool includeNonPublic)\r\n        {\r\n            return (_variables as IDynamic).GetMemberNames(includeNonPublic);\r\n        }\r\n\r\n        object IDynamic.GetValue(string sMemberName, params object[] args)\r\n        {\r\n            return (_variables as IDynamic).GetValue(sMemberName, args);\r\n        }\r\n\r\n        bool IDynamic.TryGetValue(string sMemberName, out object result, params object[] args)\r\n        {\r\n            return (_variables as IDynamic).TryGetValue(sMemberName, out result, args);\r\n        }\r\n\r\n        bool IDynamic.HasMember(string sMemberName, bool includeNonPublic)\r\n        {\r\n            return (_variables as IDynamic).HasMember(sMemberName, includeNonPublic);\r\n        }\r\n\r\n        object IDynamic.InvokeMethod(string sMemberName, params object[] args)\r\n        {\r\n            return (_variables as IDynamic).InvokeMethod(sMemberName, args);\r\n        }\r\n\r\n        bool IDynamic.SetValue(string sMemberName, object value, params object[] index)\r\n        {\r\n            return (_variables as IDynamic).SetValue(sMemberName, value, index);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IToken Interface\r\n\r\n        public void CopyTo(object obj)\r\n        {\r\n            _variables.CopyTo(obj);\r\n        }\r\n\r\n        public void SyncFrom(object obj)\r\n        {\r\n            _variables.SyncFrom(obj);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITokenizable Interface\r\n\r\n        public object CreateStateToken()\r\n        {\r\n            return _variables.CreateStateToken();\r\n        }\r\n\r\n        public void RestoreFromStateToken(object token)\r\n        {\r\n            _variables.RestoreFromStateToken(token);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    /// <summary>\r\n    /// A ScriptableObject you can stick variables into willy-nilly.\r\n    /// </summary>\r\n    [CreateAssetMenu(fileName = \"VariableStore\", menuName = \"Spacepuppy/VariableStore\")]\r\n    public class VariableStoreAsset : ScriptableObject, IStateToken\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private TypeReference _reflectNamesFromType;\r\n\r\n        [SerializeField()]\r\n        private VariantCollection _variables = new VariantCollection();\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public System.Type ReflectNamesFromType\r\n        {\r\n            get { return _reflectNamesFromType.Type; }\r\n            set { _reflectNamesFromType.Type = value; }\r\n        }\r\n\r\n        public VariantCollection Variables\r\n        {\r\n            get { return _variables; }\r\n        }\r\n\r\n        public object this[string key]\r\n        {\r\n            get\r\n            {\r\n                return _variables[key];\r\n            }\r\n            set\r\n            {\r\n                _variables[key] = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDynamic Interface\r\n\r\n        MemberInfo IDynamic.GetMember(string sMemberName, bool includeNonPublic)\r\n        {\r\n            return (_variables as IDynamic).GetMember(sMemberName, includeNonPublic);\r\n        }\r\n\r\n        IEnumerable<MemberInfo> IDynamic.GetMembers(bool includeNonPublic)\r\n        {\r\n            return (_variables as IDynamic).GetMembers(includeNonPublic);\r\n        }\r\n\r\n        IEnumerable<string> IDynamic.GetMemberNames(bool includeNonPublic)\r\n        {\r\n            return (_variables as IDynamic).GetMemberNames(includeNonPublic);\r\n        }\r\n\r\n        object IDynamic.GetValue(string sMemberName, params object[] args)\r\n        {\r\n            return (_variables as IDynamic).GetValue(sMemberName, args);\r\n        }\r\n\r\n        bool IDynamic.TryGetValue(string sMemberName, out object result, params object[] args)\r\n        {\r\n            return (_variables as IDynamic).TryGetValue(sMemberName, out result, args);\r\n        }\r\n\r\n        bool IDynamic.HasMember(string sMemberName, bool includeNonPublic)\r\n        {\r\n            return (_variables as IDynamic).HasMember(sMemberName, includeNonPublic);\r\n        }\r\n\r\n        object IDynamic.InvokeMethod(string sMemberName, params object[] args)\r\n        {\r\n            return (_variables as IDynamic).InvokeMethod(sMemberName, args);\r\n        }\r\n\r\n        bool IDynamic.SetValue(string sMemberName, object value, params object[] index)\r\n        {\r\n            return (_variables as IDynamic).SetValue(sMemberName, value, index);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IToken Interface\r\n\r\n        public void CopyTo(object obj)\r\n        {\r\n            _variables.CopyTo(obj);\r\n        }\r\n\r\n        public void SyncFrom(object obj)\r\n        {\r\n            _variables.SyncFrom(obj);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITokenizable Interface\r\n\r\n        public object CreateStateToken()\r\n        {\r\n            return _variables.CreateStateToken();\r\n        }\r\n\r\n        public void RestoreFromStateToken(object token)\r\n        {\r\n            _variables.RestoreFromStateToken(token);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/VariantCollection.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Runtime.Serialization;\r\n\r\nusing com.spacepuppy.Dynamic;\r\nusing System.Collections;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    [System.Serializable()]\r\n    public class VariantCollection : IStateToken, ISerializationCallbackReceiver, ISerializable, IEnumerable<KeyValuePair<string, object>>\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        [System.NonSerialized()]\r\n        private Dictionary<string, VariantReference> _table = new Dictionary<string,VariantReference>();\r\n\r\n        [SerializeField()]\r\n        private string[] _keys;\r\n        [SerializeField()]\r\n        private VariantReference[] _values;\r\n        \r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public VariantCollection()\r\n        {\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Properties\r\n        \r\n        public object this[string key]\r\n        {\r\n            get\r\n            {\r\n                VariantReference v;\r\n                if (_table.TryGetValue(key, out v))\r\n                {\r\n                    return v.Value;\r\n                }\r\n                else\r\n                {\r\n                    return null;\r\n                }\r\n            }\r\n            set\r\n            {\r\n                VariantReference v;\r\n                if (_table.TryGetValue(key, out v))\r\n                {\r\n                    v.Value = value;\r\n                }\r\n                else\r\n                {\r\n                    _table.Add(key, new VariantReference(value));\r\n                }\r\n            }\r\n        }\r\n\r\n        public IEnumerable<string> Names { get { return _table.Keys; } }\r\n\r\n        public int Count\r\n        {\r\n            get { return _table.Count; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public object GetValue(string key)\r\n        {\r\n            return this[key];\r\n        }\r\n\r\n        public bool TryGetValue(string skey, out object result)\r\n        {\r\n            VariantReference v;\r\n            if(_table.TryGetValue(skey, out v))\r\n            {\r\n                result = v.Value;\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                result = null;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public void SetValue(string key, object value)\r\n        {\r\n            this[key] = value;\r\n        }\r\n\r\n        public VariantReference GetVariant(string key)\r\n        {\r\n            VariantReference v;\r\n            if (_table.TryGetValue(key, out v))\r\n                return v;\r\n            else\r\n                return null;\r\n        }\r\n\r\n        public VariantReference GetVariant(string key, bool createIfNotExist)\r\n        {\r\n            if(createIfNotExist)\r\n            {\r\n                VariantReference v;\r\n                if (_table.TryGetValue(key, out v))\r\n                {\r\n                    return v;\r\n                }\r\n                else\r\n                {\r\n                    v = new VariantReference();\r\n                    _table.Add(key, v);\r\n                    return v;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return _table[key];\r\n            }\r\n        }\r\n\r\n        public bool GetBool(string key)\r\n        {\r\n            VariantReference v;\r\n            if (_table.TryGetValue(key, out v))\r\n                return v.BoolValue;\r\n            else\r\n                return false;\r\n        }\r\n\r\n        public void SetBool(string key, bool value)\r\n        {\r\n            VariantReference v;\r\n            if (_table.TryGetValue(key, out v))\r\n            {\r\n                v.BoolValue = value;\r\n            }\r\n            else\r\n            {\r\n                _table.Add(key, new VariantReference()\r\n                {\r\n                    BoolValue = value\r\n                });\r\n            }\r\n        }\r\n\r\n        public int GetInt(string key)\r\n        {\r\n            VariantReference v;\r\n            if (_table.TryGetValue(key, out v))\r\n                return v.IntValue;\r\n            else\r\n                return 0;\r\n        }\r\n\r\n        public void SetInt(string key, int value)\r\n        {\r\n            VariantReference v;\r\n            if (_table.TryGetValue(key, out v))\r\n            {\r\n                v.IntValue = value;\r\n            }\r\n            else\r\n            {\r\n                _table.Add(key, new VariantReference()\r\n                {\r\n                    IntValue = value\r\n                });\r\n            }\r\n        }\r\n\r\n        public float GetFloat(string key)\r\n        {\r\n            VariantReference v;\r\n            if (_table.TryGetValue(key, out v))\r\n                return v.FloatValue;\r\n            else\r\n                return 0f;\r\n        }\r\n\r\n        public void SetFloat(string key, float value)\r\n        {\r\n            VariantReference v;\r\n            if (_table.TryGetValue(key, out v))\r\n            {\r\n                v.FloatValue = value;\r\n            }\r\n            else\r\n            {\r\n                _table.Add(key, new VariantReference()\r\n                {\r\n                    FloatValue = value\r\n                });\r\n            }\r\n        }\r\n\r\n        public double GetDouble(string key)\r\n        {\r\n            VariantReference v;\r\n            if (_table.TryGetValue(key, out v))\r\n                return v.DoubleValue;\r\n            else\r\n                return 0f;\r\n        }\r\n\r\n        public void SetDouble(string key, double value)\r\n        {\r\n            VariantReference v;\r\n            if (_table.TryGetValue(key, out v))\r\n            {\r\n                v.DoubleValue = value;\r\n            }\r\n            else\r\n            {\r\n                _table.Add(key, new VariantReference()\r\n                {\r\n                    DoubleValue = value\r\n                });\r\n            }\r\n        }\r\n\r\n        public Vector2 GetVector2(string key)\r\n        {\r\n            VariantReference v;\r\n            if (_table.TryGetValue(key, out v))\r\n                return v.Vector2Value;\r\n            else\r\n                return Vector2.zero;\r\n        }\r\n\r\n        public void SetVector2(string key, Vector2 value)\r\n        {\r\n            VariantReference v;\r\n            if (_table.TryGetValue(key, out v))\r\n            {\r\n                v.Vector2Value = value;\r\n            }\r\n            else\r\n            {\r\n                _table.Add(key, new VariantReference()\r\n                {\r\n                    Vector2Value = value\r\n                });\r\n            }\r\n        }\r\n\r\n        public Vector3 GetVector3(string key)\r\n        {\r\n            VariantReference v;\r\n            if (_table.TryGetValue(key, out v))\r\n                return v.Vector3Value;\r\n            else\r\n                return Vector3.zero;\r\n        }\r\n\r\n        public void SetVector3(string key, Vector3 value)\r\n        {\r\n            VariantReference v;\r\n            if (_table.TryGetValue(key, out v))\r\n            {\r\n                v.Vector3Value = value;\r\n            }\r\n            else\r\n            {\r\n                _table.Add(key, new VariantReference()\r\n                {\r\n                    Vector3Value = value\r\n                });\r\n            }\r\n        }\r\n\r\n        public Quaternion GetQuaternion(string key)\r\n        {\r\n            VariantReference v;\r\n            if (_table.TryGetValue(key, out v))\r\n                return v.QuaternionValue;\r\n            else\r\n                return Quaternion.identity;\r\n        }\r\n\r\n        public void SetQuaternion(string key, Quaternion value)\r\n        {\r\n            VariantReference v;\r\n            if (_table.TryGetValue(key, out v))\r\n            {\r\n                v.QuaternionValue = value;\r\n            }\r\n            else\r\n            {\r\n                _table.Add(key, new VariantReference()\r\n                {\r\n                    QuaternionValue = value\r\n                });\r\n            }\r\n        }\r\n\r\n        public Color GetColor(string key)\r\n        {\r\n            VariantReference v;\r\n            if (_table.TryGetValue(key, out v))\r\n                return v.ColorValue;\r\n            else\r\n                return Color.black;\r\n        }\r\n\r\n        public void SetColor(string key, Color value)\r\n        {\r\n            VariantReference v;\r\n            if (_table.TryGetValue(key, out v))\r\n            {\r\n                v.ColorValue = value;\r\n            }\r\n            else\r\n            {\r\n                _table.Add(key, new VariantReference()\r\n                {\r\n                    ColorValue = value\r\n                });\r\n            }\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n        public bool HasMember(string key)\r\n        {\r\n            return _table.ContainsKey(key);\r\n        }\r\n\r\n        public bool Remove(string key)\r\n        {\r\n            return _table.Remove(key);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IToken Interface\r\n\r\n        /// <summary>\r\n        /// Iterates over members of the collection and attempts to set them to an object as if they \r\n        /// were property names on that object.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        public void CopyTo(object obj)\r\n        {\r\n            var e = _table.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                DynamicUtil.SetValue(obj, e.Current.Key, e.Current.Value.Value);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Iterates over keys in this collection and attempts to update the values associated with that \r\n        /// key to the value pulled from a property on object.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        public void SyncFrom(object obj)\r\n        {\r\n            var e = _table.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                e.Current.Value.Value = DynamicUtil.GetValue(obj, e.Current.Key);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Lerp the target objects values to the state of the VarianteCollection. If the member doesn't have a current state/undefined, \r\n        /// then the member is set to the current state in this VariantCollection.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"t\"></param>\r\n        public void LerpTo(object obj, float t)\r\n        {\r\n            var e = _table.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                object value;\r\n                if (DynamicUtil.TryGetValue(obj, e.Current.Key, out value))\r\n                {\r\n                    value = Evaluator.TryLerp(value, e.Current.Value.Value, t);\r\n                    DynamicUtil.SetValue(obj, e.Current.Key, value);\r\n                }\r\n                else\r\n                {\r\n                    DynamicUtil.SetValue(obj, e.Current.Key, e.Current.Value.Value);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void TweenTo(com.spacepuppy.Tween.TweenHash hash, com.spacepuppy.Tween.Ease ease, float dur)\r\n        {\r\n            var e = _table.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                var value = e.Current.Value.Value;\r\n                if (value == null) continue;\r\n\r\n                switch(VariantReference.GetVariantType(value.GetType()))\r\n                {\r\n                    case VariantType.Integer:\r\n                    case VariantType.Float:\r\n                    case VariantType.Double:\r\n                    case VariantType.Vector2:\r\n                    case VariantType.Vector3:\r\n                    case VariantType.Vector4:\r\n                    case VariantType.Quaternion:\r\n                    case VariantType.Color:\r\n                    case VariantType.Rect:\r\n                        hash.To(e.Current.Key, ease, dur, value);\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITokenizable Interface\r\n\r\n        public object CreateStateToken()\r\n        {\r\n            if (_table.Count == 0) return com.spacepuppy.Utils.ArrayUtil.Empty<KeyValuePair<string, VariantReference>>();\r\n            KeyValuePair<string, VariantReference>[] arr = new KeyValuePair<string, VariantReference>[_table.Count];\r\n            var e = _table.GetEnumerator();\r\n            int i = 0;\r\n            while(e.MoveNext())\r\n            {\r\n                arr[i] = e.Current;\r\n                i++;\r\n            }\r\n            return arr;\r\n        }\r\n\r\n        public void RestoreFromStateToken(object token)\r\n        {\r\n            if(token is KeyValuePair<string, VariantReference>[])\r\n            {\r\n                _table.Clear();\r\n                var arr = token as KeyValuePair<string, VariantReference>[];\r\n                foreach(var pair in arr)\r\n                {\r\n                    _table[pair.Key] = pair.Value;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                DynamicUtil.CopyState(this, token);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDynamic Interface\r\n\r\n        object IDynamic.this[string sMemberName]\r\n        {\r\n            get { return (this as IDynamic).GetValue(sMemberName); }\r\n            set { (this as IDynamic).SetValue(sMemberName, value); }\r\n        }\r\n\r\n        bool IDynamic.SetValue(string sMemberName, object value, params object[] index)\r\n        {\r\n            if (_table.ContainsKey(sMemberName))\r\n            {\r\n                this[sMemberName] = value;\r\n                return true;\r\n            }\r\n            else if (DynamicUtil.HasMemberDirect(this, sMemberName, true))\r\n                return DynamicUtil.SetValueDirect(this, sMemberName, value, index);\r\n            else\r\n            {\r\n                this[sMemberName] = value;\r\n                return true;\r\n            }\r\n        }\r\n\r\n        object IDynamic.GetValue(string sMemberName, params object[] args)\r\n        {\r\n            if (_table.ContainsKey(sMemberName))\r\n                return this[sMemberName];\r\n            else\r\n                return DynamicUtil.GetValueDirect(this, sMemberName, args);\r\n        }\r\n\r\n        bool IDynamic.TryGetValue(string sMemberName, out object result, params object[] args)\r\n        {\r\n            if (_table.ContainsKey(sMemberName))\r\n            {\r\n                result = this[sMemberName];\r\n                return true;\r\n            }\r\n            else\r\n                return DynamicUtil.TryGetValueDirect(this, sMemberName, out result, args);\r\n        }\r\n\r\n        object IDynamic.InvokeMethod(string sMemberName, params object[] args)\r\n        {\r\n            //throw new System.NotSupportedException();\r\n            return DynamicUtil.InvokeMethodDirect(this, sMemberName, args);\r\n        }\r\n\r\n        bool IDynamic.HasMember(string sMemberName, bool includeNonPublic)\r\n        {\r\n            if (_table.ContainsKey(sMemberName))\r\n                return true;\r\n            else\r\n                return DynamicUtil.TypeHasMember(this.GetType(), sMemberName, includeNonPublic);\r\n        }\r\n\r\n        IEnumerable<System.Reflection.MemberInfo> IDynamic.GetMembers(bool includeNonPublic)\r\n        {\r\n            var tp = this.GetType();\r\n            if(Application.isEditor && !Application.isPlaying)\r\n            {\r\n                var ptp = typeof(Variant);\r\n                for(int i = 0; i < _keys.Length; i++)\r\n                {\r\n                    yield return new DynamicPropertyInfo(_keys[i], tp, ptp);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var ptp = typeof(Variant);\r\n                var e = _table.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    yield return new DynamicPropertyInfo(e.Current.Key, tp, ptp);\r\n                }\r\n            }\r\n\r\n            foreach(var p in DynamicUtil.GetMembersFromType(tp, includeNonPublic))\r\n            {\r\n                if(p.Name != \"_table\" && p.Name != \"_values\" && p.Name != \"_keys\")\r\n                    yield return p;\r\n            }\r\n        }\r\n\r\n        IEnumerable<string> IDynamic.GetMemberNames(bool includeNonPublic)\r\n        {\r\n            return _table.Keys;\r\n        }\r\n\r\n        System.Reflection.MemberInfo IDynamic.GetMember(string sMemberName, bool includeNonPublic)\r\n        {\r\n            if (Application.isEditor && !Application.isPlaying)\r\n            {\r\n                if(_keys.Contains(sMemberName)) return new DynamicPropertyInfo(sMemberName, this.GetType(), typeof(Variant));\r\n            }\r\n            else if(_table.ContainsKey(sMemberName))\r\n            {\r\n                return new DynamicPropertyInfo(sMemberName, this.GetType(), typeof(Variant));\r\n            }\r\n\r\n            return DynamicUtil.GetMemberFromType(this.GetType(), sMemberName, includeNonPublic);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISerializationCallbackReceiver Interface\r\n\r\n        void ISerializationCallbackReceiver.OnAfterDeserialize()\r\n        {\r\n            _table.Clear();\r\n            var cnt = Mathf.Min(_values.Length, _keys.Length);\r\n            for(int i = 0; i < cnt; i++)\r\n            {\r\n                _table.Add(_keys[i], _values[i]);\r\n            }\r\n\r\n            //_keys = null;\r\n            //_values = null;\r\n        }\r\n\r\n        void ISerializationCallbackReceiver.OnBeforeSerialize()\r\n        {\r\n            _keys = _table.Keys.ToArray();\r\n            _values = _table.Values.ToArray();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISerializable Interface\r\n\r\n        void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)\r\n        {\r\n            this.GetObjectData(info, context);\r\n        }\r\n\r\n        protected virtual void GetObjectData(SerializationInfo info, StreamingContext context)\r\n        {\r\n            (this as ISerializationCallbackReceiver).OnBeforeSerialize();\r\n            info.AddValue(\"_keys\", _keys);\r\n            info.AddValue(\"_values\", _values);\r\n        }\r\n\r\n        protected VariantCollection(SerializationInfo info, StreamingContext context)\r\n        {\r\n            _keys = info.GetValue(\"_keys\", typeof(string[])) as string[];\r\n            _values = info.GetValue(\"_values\", typeof(VariantReference[])) as VariantReference[];\r\n\r\n            (this as ISerializationCallbackReceiver).OnAfterDeserialize();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public Enumerator GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator<KeyValuePair<string, object>> IEnumerable<KeyValuePair<string, object>>.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        IEnumerator IEnumerable.GetEnumerator()\r\n        {\r\n            return new Enumerator(this);\r\n        }\r\n\r\n        public struct Enumerator : IEnumerator<KeyValuePair<string, object>>\r\n        {\r\n\r\n            private Dictionary<string, VariantReference>.Enumerator _e;\r\n            private KeyValuePair<string, object> _current;\r\n\r\n            internal Enumerator(VariantCollection coll)\r\n            {\r\n                _e = coll._table.GetEnumerator();\r\n                _current = default(KeyValuePair<string, object>);\r\n            }\r\n\r\n\r\n\r\n            public KeyValuePair<string, object> Current\r\n            {\r\n                get\r\n                {\r\n                    return _current;\r\n                }\r\n            }\r\n\r\n            object IEnumerator.Current\r\n            {\r\n                get\r\n                {\r\n                    return _current;\r\n                }\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                _e.Dispose();\r\n                _current = default(KeyValuePair<string, object>);\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                if(_e.MoveNext())\r\n                {\r\n                    _current = new KeyValuePair<string, object>(_e.Current.Key, _e.Current.Value.Value);\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            void System.Collections.IEnumerator.Reset()\r\n            {\r\n                (_e as System.Collections.IEnumerator).Reset();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        /// <summary>\r\n        /// Configure the list to include name/type pairs reflected from a target type.\r\n        /// </summary>\r\n        [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n        public class AsPropertyListAttribute : System.Attribute\r\n        {\r\n\r\n            private System.Type _tp;\r\n\r\n            public AsPropertyListAttribute(System.Type tp)\r\n            {\r\n                _tp = tp;\r\n            }\r\n\r\n            public System.Type TargetType { get { return _tp; } }\r\n\r\n        }\r\n\r\n        /// <summary>\r\n        /// Configure the list to only accept a single type through the inspector.\r\n        /// </summary>\r\n        [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false)]\r\n        public class AsTypedList : System.Attribute\r\n        {\r\n\r\n            private System.Type _tp;\r\n\r\n            public AsTypedList(System.Type tp)\r\n            {\r\n                _tp = tp;\r\n            }\r\n\r\n            public System.Type TargetType { get { return _tp; } }\r\n\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n        [System.Obsolete(\"No longer used by VariantCollectionPropertyDrawer\")]\r\n        private class EditorHelper : System.Collections.IList\r\n        {\r\n\r\n            private VariantCollection _coll;\r\n\r\n            #region Properties\r\n\r\n            public VariantCollection Collection { get { return _coll; } }\r\n\r\n            public int Count { get { return (_coll == null) ? 0 : _coll._table.Count; } }\r\n\r\n            public System.Type EntryType { get { return typeof(KeyValuePair<string, VariantReference>); } }\r\n\r\n            #endregion\r\n\r\n            #region Methods\r\n\r\n            public void UpdateCollection(VariantCollection coll)\r\n            {\r\n                _coll = coll;\r\n            }\r\n\r\n            public string GetNameAt(int index)\r\n            {\r\n                if (_coll == null) return null;\r\n\r\n                if (index < 0 || index >= _coll._table.Count) throw new System.IndexOutOfRangeException();\r\n                int i = 0;\r\n                foreach (var key in _coll._table.Keys)\r\n                {\r\n                    if (i == index) return key;\r\n                    i++;\r\n                }\r\n                return null;\r\n            }\r\n\r\n            public VariantReference GetVariant(string key)\r\n            {\r\n                if (_coll == null) return null;\r\n\r\n                return _coll.GetVariant(key);\r\n            }\r\n\r\n            public VariantReference AddEntry()\r\n            {\r\n                if (_coll == null) return null;\r\n\r\n                int cnt = _coll._table.Count + 1;\r\n                string key = \"Entry \" + cnt.ToString();\r\n                while(_coll._table.ContainsKey(key))\r\n                {\r\n                    cnt++;\r\n                    key = \"Entry \" + cnt.ToString();\r\n                }\r\n\r\n                var v = new VariantReference();\r\n                _coll._table.Add(key, v);\r\n                return v;\r\n            }\r\n\r\n            public bool ChangeEntryName(string name, string newName)\r\n            {\r\n                if (_coll == null) return false;\r\n                if (string.IsNullOrEmpty(newName)) return false;\r\n\r\n                var names = _coll._table.Keys.ToArray();\r\n                int index = System.Array.IndexOf(names, name);\r\n                if (index < 0 || names.Contains(newName)) return false;\r\n\r\n                var values = _coll._table.Values.ToArray();\r\n                _coll._table.Clear();\r\n                names[index] = newName;\r\n\r\n                for(int i = 0; i < names.Length; i++)\r\n                {\r\n                    _coll._table.Add(names[i], values[i]);\r\n                }\r\n                return true;\r\n            }\r\n\r\n            #endregion\r\n\r\n\r\n            #region IList Interface\r\n\r\n            int System.Collections.IList.Add(object value)\r\n            {\r\n                if (_coll == null) return -1;\r\n                var key = System.Convert.ToString(value);\r\n                if (_coll._table.ContainsKey(key)) return -1;\r\n\r\n                _coll._table.Add(key, new VariantReference());\r\n                return _coll._table.Count - 1;\r\n            }\r\n\r\n            void System.Collections.IList.Clear()\r\n            {\r\n                if (_coll == null) return;\r\n\r\n                _coll._table.Clear();\r\n            }\r\n\r\n            bool System.Collections.IList.Contains(object value)\r\n            {\r\n                if (_coll == null) return false;\r\n                return _coll.HasMember(System.Convert.ToString(value));\r\n            }\r\n\r\n            int System.Collections.IList.IndexOf(object value)\r\n            {\r\n                if(_coll == null) return -1;\r\n\r\n                string svalue = System.Convert.ToString(value);\r\n                int i = 0;\r\n                foreach(var key in _coll._table.Keys)\r\n                {\r\n                    if (key == svalue) return i;\r\n                    i++;\r\n                }\r\n                return -1;\r\n            }\r\n\r\n            void System.Collections.IList.Insert(int index, object value)\r\n            {\r\n                throw new System.NotSupportedException();\r\n            }\r\n\r\n            bool System.Collections.IList.IsFixedSize\r\n            {\r\n                get { return false; }\r\n            }\r\n\r\n            bool System.Collections.IList.IsReadOnly\r\n            {\r\n                get { return false; }\r\n            }\r\n\r\n            void System.Collections.IList.Remove(object value)\r\n            {\r\n                if (_coll == null) return;\r\n                var key = System.Convert.ToString(value);\r\n                _coll._table.Remove(key);\r\n            }\r\n\r\n            void System.Collections.IList.RemoveAt(int index)\r\n            {\r\n                if (_coll == null) return;\r\n\r\n                var key = this.GetNameAt(index);\r\n                _coll.Remove(key);\r\n            }\r\n\r\n            object System.Collections.IList.this[int index]\r\n            {\r\n                get\r\n                {\r\n                    return this.GetNameAt(index);\r\n                }\r\n                set\r\n                {\r\n                    if (_coll == null) return;\r\n                    string key = this.GetNameAt(index);\r\n                    this.ChangeEntryName(key, System.Convert.ToString(value));\r\n                }\r\n            }\r\n\r\n            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n            {\r\n                if (_coll == null) return Enumerable.Empty<string>().GetEnumerator();\r\n\r\n                return _coll._table.Keys.GetEnumerator();\r\n            }\r\n\r\n            void System.Collections.ICollection.CopyTo(System.Array array, int index)\r\n            {\r\n                if (_coll == null) return;\r\n\r\n                (_coll._table.Keys as System.Collections.ICollection).CopyTo(array, index);\r\n            }\r\n\r\n            int System.Collections.ICollection.Count\r\n            {\r\n                get { return (_coll == null) ? 0 : _coll._table.Count; }\r\n            }\r\n\r\n            bool System.Collections.ICollection.IsSynchronized\r\n            {\r\n                get { return false; }\r\n            }\r\n\r\n            object System.Collections.ICollection.SyncRoot\r\n            {\r\n                get { return this; }\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/VariantMember.cs",
    "content": "﻿using UnityEngine;\n\nusing com.spacepuppy.Dynamic;\nusing com.spacepuppy.Dynamic.Accessors;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy\n{\n\n    /// <summary>\n    /// Configure a target property/field of an object.\n    /// </summary>\n    [System.Serializable()]\n    public class VariantMember\n    {\n\n        private enum MemberStatus\n        {\n            Fault = -1,\n            Unknown = 0,\n            Primitive = 1,\n            Complex = 2\n        }\n\n        #region Fields\n\n        [SerializeField()]\n        [SelectableObject]\n        private UnityEngine.Object _target;\n        [SerializeField()]\n        private string _memberName;\n\n        [System.NonSerialized]\n        private IMemberAccessor _accessor;\n        [System.NonSerialized]\n        private System.Type _memberType;\n        [System.NonSerialized]\n        private MemberStatus _status;\n\n        #endregion\n\n        #region Properties\n\n        public UnityEngine.Object Target\n        {\n            get { return _target; }\n            set\n            {\n                if (_target == value) return;\n                _target = value;\n                this.SetDirty();\n            }\n        }\n\n        public string MemberName\n        {\n            get { return _memberName; }\n            set\n            {\n                if (_memberName == value) return;\n                _memberName = value;\n                this.SetDirty();\n            }\n        }\n\n        public System.Type MemberType\n        {\n            get\n            {\n                if (_status == MemberStatus.Unknown) this.InitAccessor();\n                return _memberType;\n            }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public object GetValue()\n        {\n            switch(_status)\n            {\n                case MemberStatus.Unknown:\n                    this.InitAccessor();\n                    return _accessor != null ? _accessor.Get(_target) : null;\n                case MemberStatus.Primitive:\n                case MemberStatus.Complex:\n                    return _accessor.Get(_target);\n                default:\n                    return null;\n            }\n\n        }\n\n        public void SetValue(object value)\n        {\n            Restart:\n            switch (_status)\n            {\n                case MemberStatus.Unknown:\n                    this.InitAccessor();\n                    goto Restart;\n                case MemberStatus.Primitive:\n                    _accessor.Set(_target, ConvertUtil.ToPrim(value, _memberType));\n                    break;\n                case MemberStatus.Complex:\n                    _accessor.Set(_target, value);\n                    break;\n            }\n        }\n\n        public void SetDirty()\n        {\n            _accessor = null;\n            _memberType = null;\n            _status = MemberStatus.Unknown;\n        }\n\n        private void InitAccessor()\n        {\n            _accessor = MemberAccessorPool.GetDynamicAccessor(_target, _memberName, out _memberType);\n            if(_accessor == null)\n            {\n                _status = MemberStatus.Fault;\n            }\n            else if(ConvertUtil.IsSupportedType(_memberType))\n            {\n                _status = MemberStatus.Primitive;\n            }\n            else\n            {\n                _status = MemberStatus.Complex;\n            }\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBase/VariantReference.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Facilitates creating a serializable field that references any of multiple of common unity types. \r\n    /// This includes any of the prims easily serialized by unity (int, float, double, bool, etc), any \r\n    /// UnityEngine.Object reference, a property of said objects, or even evaluate a simple arithmetic operation.\r\n    /// \r\n    /// In the case of arithmetic evaluations, you can evaluate them based on the properties of a referenced \r\n    /// object. See com.spacepuppy.Dynamic.Evaluator for more information on how to format eval statements.\r\n    /// </summary>\r\n    [System.Serializable()]\r\n    public sealed class VariantReference : System.Runtime.Serialization.ISerializable, ISPDisposable\r\n    {\r\n        \r\n        public enum RefMode : byte\r\n        {\r\n            Value = 0,\r\n            Property = 1,\r\n            Eval = 2\r\n        }\r\n\r\n        #region Fields\r\n\r\n        //these used for serialization\r\n        [SerializeField()]\r\n        private RefMode _mode;\r\n        [SerializeField()]\r\n        private VariantType _type;\r\n\r\n        [SerializeField()]\r\n        private float _x;\r\n        [SerializeField()]\r\n        private float _y;\r\n        [SerializeField()]\r\n        private float _z;\r\n        [SerializeField()]\r\n        private double _w;\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"_valueReference\")]\r\n        private string _string;\r\n\r\n        [SerializeField()]\r\n        private UnityEngine.Object _unityObjectReference;\r\n\r\n        [System.NonSerialized]\r\n        private INumeric _numeric;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public VariantReference()\r\n        {\r\n        }\r\n\r\n        public VariantReference(object value)\r\n        {\r\n            this.Value = value;\r\n        }\r\n\r\n        public VariantReference(RefMode mode)\r\n        {\r\n            _mode = mode;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public object Value\r\n        {\r\n            get\r\n            {\r\n                switch(_mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        {\r\n                            switch (_type)\r\n                            {\r\n                                case VariantType.Object:\r\n                                    return this.ObjectValue;\r\n                                case VariantType.String:\r\n                                    return this.StringValue;\r\n                                case VariantType.Boolean:\r\n                                    return this.BoolValue;\r\n                                case VariantType.Integer:\r\n                                    return this.IntValue;\r\n                                case VariantType.Float:\r\n                                    return this.FloatValue;\r\n                                case VariantType.Double:\r\n                                    return this.DoubleValue;\r\n                                case VariantType.Vector2:\r\n                                    return this.Vector2Value;\r\n                                case VariantType.Vector3:\r\n                                    return this.Vector3Value;\r\n                                case VariantType.Quaternion:\r\n                                    return this.QuaternionValue;\r\n                                case VariantType.Color:\r\n                                    return this.ColorValue;\r\n                                case VariantType.DateTime:\r\n                                    return this.DateValue;\r\n                                case VariantType.GameObject:\r\n                                    return this.GameObjectValue;\r\n                                case VariantType.Component:\r\n                                    return this.ComponentValue;\r\n                                case VariantType.LayerMask:\r\n                                    return this.LayerMaskValue;\r\n                                case VariantType.Rect:\r\n                                    return this.RectValue;\r\n                                case VariantType.Numeric:\r\n                                    return this.NumericValue;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case RefMode.Property:\r\n                        return this.EvaluateProperty();\r\n                    case RefMode.Eval:\r\n                        {\r\n                            try\r\n                            {\r\n                                return Evaluator.EvalValue(_string, ObjUtil.ReduceIfProxy(_unityObjectReference));\r\n                            }\r\n                            catch\r\n                            {\r\n                                Debug.LogWarning(\"Failed to evaluate statement defined in VariantRefernce\");\r\n                            }\r\n                        }\r\n                        break;\r\n                }\r\n\r\n                return null;\r\n                /*\r\n                if(_mode == RefMode.Eval)\r\n                {\r\n                    try\r\n                    {\r\n                        return Evaluator.EvalValue(_string, ObjUtil.ReduceIfProxy(_unityObjectReference));\r\n                    }\r\n                    catch\r\n                    {\r\n                        Debug.LogWarning(\"Failed to evaluate statement defined in VariantRefernce\");\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    switch (_type)\r\n                    {\r\n                        case VariantType.Object:\r\n                            return this.ObjectValue;\r\n                        case VariantType.String:\r\n                            return this.StringValue;\r\n                        case VariantType.Boolean:\r\n                            return this.BoolValue;\r\n                        case VariantType.Integer:\r\n                            return this.IntValue;\r\n                        case VariantType.Float:\r\n                            return this.FloatValue;\r\n                        case VariantType.Double:\r\n                            return this.DoubleValue;\r\n                        case VariantType.Vector2:\r\n                            return this.Vector2Value;\r\n                        case VariantType.Vector3:\r\n                            return this.Vector3Value;\r\n                        case VariantType.Quaternion:\r\n                            return this.QuaternionValue;\r\n                        case VariantType.Color:\r\n                            return this.ColorValue;\r\n                        case VariantType.DateTime:\r\n                            return this.DateValue;\r\n                        case VariantType.GameObject:\r\n                            return this.GameObjectValue;\r\n                        case VariantType.Component:\r\n                            return this.ComponentValue;\r\n                        case VariantType.LayerMask:\r\n                            return this.LayerMaskValue;\r\n                        case VariantType.Rect:\r\n                            return this.RectValue;\r\n                        case VariantType.Numeric:\r\n                            return this.NumericValue;\r\n                    }\r\n                }\r\n                return null;\r\n                */\r\n            }\r\n            set\r\n            {\r\n                _mode = RefMode.Value;\r\n                if (value == null)\r\n                {\r\n                    _x = 0f;\r\n                    _y = 0f;\r\n                    _z = 0f;\r\n                    _w = 0d;\r\n                    _string = null;\r\n                    _unityObjectReference = null;\r\n                    _type = VariantType.Null;\r\n                }\r\n                else\r\n                {\r\n                    _type = VariantReference.GetVariantType(value.GetType());\r\n                    switch (_type)\r\n                    {\r\n                        case VariantType.Object:\r\n                            this.ObjectValue = value as UnityEngine.Object;\r\n                            break;\r\n                        case VariantType.String:\r\n                            this.StringValue = System.Convert.ToString(value);\r\n                            break;\r\n                        case VariantType.Boolean:\r\n                            this.BoolValue = ConvertUtil.ToBool(value);\r\n                            break;\r\n                        case VariantType.Integer:\r\n                            this.IntValue = ConvertUtil.ToInt(value);\r\n                            break;\r\n                        case VariantType.Float:\r\n                            this.FloatValue = ConvertUtil.ToSingle(value);\r\n                            break;\r\n                        case VariantType.Double:\r\n                            this.DoubleValue = ConvertUtil.ToDouble(value);\r\n                            break;\r\n                        case VariantType.Vector2:\r\n                            this.Vector2Value = ConvertUtil.ToVector2(value);\r\n                            break;\r\n                        case VariantType.Vector3:\r\n                            this.Vector3Value = ConvertUtil.ToVector3(value);\r\n                            break;\r\n                        case VariantType.Quaternion:\r\n                            this.QuaternionValue = ConvertUtil.ToQuaternion(value);\r\n                            break;\r\n                        case VariantType.Color:\r\n                            this.ColorValue = ConvertUtil.ToColor(value);\r\n                            break;\r\n                        case VariantType.DateTime:\r\n                            this.DateValue = ConvertUtil.ToDate(value);\r\n                            break;\r\n                        case VariantType.GameObject:\r\n                            this.GameObjectValue = value as GameObject;\r\n                            break;\r\n                        case VariantType.Component:\r\n                            this.ComponentValue = value as Component;\r\n                            break;\r\n                        case VariantType.LayerMask:\r\n                            this.LayerMaskValue = (LayerMask)value;\r\n                            break;\r\n                        case VariantType.Rect:\r\n                            this.RectValue = (Rect)value;\r\n                            break;\r\n                        case VariantType.Numeric:\r\n                            this.SetToNumeric(value as INumeric);\r\n                            break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public RefMode Mode\r\n        {\r\n            get { return _mode; }\r\n        }\r\n\r\n        public VariantType ValueType\r\n        {\r\n            get\r\n            {\r\n                return _type;\r\n            }\r\n        }\r\n        \r\n        public string StringValue\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        switch (_type)\r\n                        {\r\n                            case VariantType.Object:\r\n                                return null;\r\n                            case VariantType.String:\r\n                                return _string;\r\n                            case VariantType.Boolean:\r\n                                return this.BoolValue.ToString();\r\n                            case VariantType.Integer:\r\n                                return this.IntValue.ToString();\r\n                            case VariantType.Float:\r\n                                return this.FloatValue.ToString();\r\n                            case VariantType.Double:\r\n                                return this.DoubleValue.ToString();\r\n                            case VariantType.Vector2:\r\n                                return this.Vector2Value.ToString();\r\n                            case VariantType.Vector3:\r\n                                return this.Vector3Value.ToString();\r\n                            case VariantType.Vector4:\r\n                                return this.Vector4Value.ToString();\r\n                            case VariantType.Quaternion:\r\n                                return this.QuaternionValue.ToString();\r\n                            case VariantType.Color:\r\n                                return this.ColorValue.ToString();\r\n                            case VariantType.DateTime:\r\n                                return this.DateValue.ToString();\r\n                            case VariantType.GameObject:\r\n                            case VariantType.Component:\r\n                                return (_unityObjectReference != null) ? _unityObjectReference.ToString() : null;\r\n                            case VariantType.LayerMask:\r\n                                return this.LayerMaskValue.ToString();\r\n                            case VariantType.Rect:\r\n                                return this.RectValue.ToString();\r\n                            case VariantType.Numeric:\r\n                                return ConvertUtil.ToString(this.NumericValue);\r\n                        }\r\n                        break;\r\n                    case RefMode.Property:\r\n                        return System.Convert.ToString(this.EvaluateProperty());\r\n                    case RefMode.Eval:\r\n                        try\r\n                        {\r\n                            return Evaluator.EvalString(_string, ObjUtil.ReduceIfProxy(_unityObjectReference));\r\n                        }\r\n                        catch\r\n                        {\r\n                            Debug.LogWarning(\"Failed to evaluate statement defined in VariantRefernce\");\r\n                        }\r\n                        break;\r\n                }\r\n                return null;\r\n            }\r\n            set\r\n            {\r\n                _x = 0f;\r\n                _y = 0f;\r\n                _z = 0f;\r\n                _w = 0d;\r\n                _string = value;\r\n                _unityObjectReference = null;\r\n                _numeric = null;\r\n                _type = VariantType.String;\r\n                _mode = RefMode.Value;\r\n            }\r\n        }\r\n        public bool BoolValue\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        switch(_type)\r\n                        {\r\n                            case VariantType.Object:\r\n                                return _unityObjectReference != null;\r\n                            case VariantType.String:\r\n                                return !string.IsNullOrEmpty(_string);\r\n                            case VariantType.Boolean:\r\n                                return _x != 0f;\r\n                            case VariantType.Integer:\r\n                            case VariantType.Float:\r\n                            case VariantType.Double:\r\n                            case VariantType.Vector2:\r\n                            case VariantType.Vector3:\r\n                            case VariantType.Vector4:\r\n                            case VariantType.Quaternion:\r\n                            case VariantType.Color:\r\n                            case VariantType.DateTime:\r\n                                return (_x + _y + _z + _w) != 0;\r\n                            case VariantType.GameObject:\r\n                            case VariantType.Component:\r\n                                return _unityObjectReference != null;\r\n                            case VariantType.LayerMask:\r\n                                return (_x + _y + _z + _w) != 0;\r\n                            case VariantType.Rect:\r\n                                return (_x + _y + _z + _w) != 0;\r\n                            case VariantType.Numeric:\r\n                                return ConvertUtil.ToBool(this.NumericValue);\r\n                        }\r\n                        break;\r\n                    case RefMode.Property:\r\n                        return ConvertUtil.ToBool(this.EvaluateProperty());\r\n                    case RefMode.Eval:\r\n                        try\r\n                        {\r\n                            return Evaluator.EvalBool(_string, ObjUtil.ReduceIfProxy(_unityObjectReference));\r\n                        }\r\n                        catch\r\n                        {\r\n                            Debug.LogWarning(\"Failed to evaluate statement defined in VariantRefernce\");\r\n                        }\r\n                        break;\r\n                }\r\n                return false;\r\n            }\r\n            set\r\n            {\r\n                _x = (value) ? 1f : 0f;\r\n                _y = 0f;\r\n                _z = 0f;\r\n                _w = 0d;\r\n                _string = null;\r\n                _unityObjectReference = null;\r\n                _numeric = null;\r\n                _type = VariantType.Boolean;\r\n                _mode = RefMode.Value;\r\n            }\r\n        }\r\n        public int IntValue\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        switch (_type)\r\n                        {\r\n                            case VariantType.Object:\r\n                                return 0;\r\n                            case VariantType.String:\r\n                                return ConvertUtil.ToInt(_string);\r\n                            case VariantType.Boolean:\r\n                                return (_x != 0f) ? 1 : 0;\r\n                            case VariantType.Integer:\r\n                                return (int)_w;\r\n                            case VariantType.Float:\r\n                                return (int)_x;\r\n                            case VariantType.Double:\r\n                                return (int)_w;\r\n                            case VariantType.Vector2:\r\n                            case VariantType.Vector3:\r\n                            case VariantType.Vector4:\r\n                            case VariantType.Quaternion:\r\n                                return (int)_x;\r\n                            case VariantType.Color:\r\n                                return ConvertUtil.ToInt(new Color(_x, _y, _z, (float)_w));\r\n                            case VariantType.DateTime:\r\n                                return 0;\r\n                            case VariantType.GameObject:\r\n                            case VariantType.Component:\r\n                                return 0;\r\n                            case VariantType.LayerMask:\r\n                                return (int)_w;\r\n                            case VariantType.Rect:\r\n                                return (int)_x;\r\n                            case VariantType.Numeric:\r\n                                return ConvertUtil.ToInt(this.NumericValue);\r\n                        }\r\n                        break;\r\n                    case RefMode.Property:\r\n                        return ConvertUtil.ToInt(this.EvaluateProperty());\r\n                    case RefMode.Eval:\r\n                        try\r\n                        {\r\n                            return (int)Evaluator.EvalNumber(_string, ObjUtil.ReduceIfProxy(_unityObjectReference));\r\n                        }\r\n                        catch\r\n                        {\r\n                            Debug.LogWarning(\"Failed to evaluate statement defined in VariantRefernce\");\r\n                        }\r\n                        break;\r\n                }\r\n                return 0;\r\n            }\r\n            set\r\n            {\r\n                _x = 0f;\r\n                _y = 0f;\r\n                _z = 0f;\r\n                _w = value;\r\n                _string = null;\r\n                _unityObjectReference = null;\r\n                _numeric = null;\r\n                _type = VariantType.Integer;\r\n                _mode = RefMode.Value;\r\n            }\r\n        }\r\n        public float FloatValue\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        switch (_type)\r\n                        {\r\n                            case VariantType.Object:\r\n                                return 0;\r\n                            case VariantType.String:\r\n                                return ConvertUtil.ToSingle(_string);\r\n                            case VariantType.Boolean:\r\n                                return (_x != 0f) ? 1 : 0;\r\n                            case VariantType.Integer:\r\n                                return (float)_w;\r\n                            case VariantType.Float:\r\n                                return _x;\r\n                            case VariantType.Double:\r\n                                return (float)_w;\r\n                            case VariantType.Vector2:\r\n                            case VariantType.Vector3:\r\n                            case VariantType.Vector4:\r\n                            case VariantType.Quaternion:\r\n                            case VariantType.Color:\r\n                                return _x;\r\n                            case VariantType.DateTime:\r\n                                return 0f;\r\n                            case VariantType.GameObject:\r\n                            case VariantType.Component:\r\n                                return 0f;\r\n                            case VariantType.LayerMask:\r\n                                return (int)_w;\r\n                            case VariantType.Rect:\r\n                                return _x;\r\n                            case VariantType.Numeric:\r\n                                return ConvertUtil.ToSingle(this.NumericValue);\r\n                        }\r\n                        break;\r\n                    case RefMode.Property:\r\n                        return ConvertUtil.ToSingle(this.EvaluateProperty());\r\n                    case RefMode.Eval:\r\n                        try\r\n                        {\r\n                            return Evaluator.EvalNumber(_string, ObjUtil.ReduceIfProxy(_unityObjectReference));\r\n                        }\r\n                        catch\r\n                        {\r\n                            Debug.LogWarning(\"Failed to evaluate statement defined in VariantRefernce\");\r\n                        }\r\n                        break;\r\n                }\r\n                return 0f;\r\n            }\r\n            set\r\n            {\r\n                _x = value;\r\n                _y = 0f;\r\n                _z = 0f;\r\n                _w = 0d;\r\n                _string = null;\r\n                _unityObjectReference = null;\r\n                _numeric = null;\r\n                _type = VariantType.Float;\r\n                _mode = RefMode.Value;\r\n            }\r\n        }\r\n        public double DoubleValue\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        switch (_type)\r\n                        {\r\n                            case VariantType.Object:\r\n                                return 0d;\r\n                            case VariantType.String:\r\n                                return ConvertUtil.ToDouble(_string);\r\n                            case VariantType.Boolean:\r\n                                return (_x != 0f) ? 1d : 0d;\r\n                            case VariantType.Integer:\r\n                                return _w;\r\n                            case VariantType.Float:\r\n                                return (double)_x;\r\n                            case VariantType.Double:\r\n                                return _w;\r\n                            case VariantType.Vector2:\r\n                            case VariantType.Vector3:\r\n                            case VariantType.Vector4:\r\n                            case VariantType.Quaternion:\r\n                            case VariantType.Color:\r\n                                return _x;\r\n                            case VariantType.DateTime:\r\n                                return 0d;\r\n                            case VariantType.GameObject:\r\n                            case VariantType.Component:\r\n                                return 0d;\r\n                            case VariantType.LayerMask:\r\n                                return (int)_w;\r\n                            case VariantType.Rect:\r\n                                return _x;\r\n                            case VariantType.Numeric:\r\n                                return ConvertUtil.ToDouble(this.NumericValue);\r\n                        }\r\n                        break;\r\n                    case RefMode.Property:\r\n                        return ConvertUtil.ToDouble(this.EvaluateProperty());\r\n                    case RefMode.Eval:\r\n                        try\r\n                        {\r\n                            return (double)Evaluator.EvalNumber(_string, ObjUtil.ReduceIfProxy(_unityObjectReference));\r\n                        }\r\n                        catch\r\n                        {\r\n                            Debug.LogWarning(\"Failed to evaluate statement defined in VariantRefernce\");\r\n                        }\r\n                        break;\r\n                }\r\n                return 0d;\r\n            }\r\n            set\r\n            {\r\n                _x = 0f;\r\n                _y = 0f;\r\n                _z = 0f;\r\n                _w = value;\r\n                _string = null;\r\n                _unityObjectReference = null;\r\n                _numeric = null;\r\n                _type = VariantType.Double;\r\n                _mode = RefMode.Value;\r\n            }\r\n        }\r\n        public Vector2 Vector2Value\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        switch (_type)\r\n                        {\r\n                            case VariantType.Object:\r\n                                return Vector2.zero;\r\n                            case VariantType.String:\r\n                                return ConvertUtil.ToVector2(_string);\r\n                            case VariantType.Boolean:\r\n                                return (_x != 0f) ? Vector2.one : Vector2.zero;\r\n                            case VariantType.Integer:\r\n                                return new Vector2((float)_w, 0f);\r\n                            case VariantType.Float:\r\n                                return new Vector2(_x, 0f);\r\n                            case VariantType.Double:\r\n                                return new Vector2((float)_w, 0f);\r\n                            case VariantType.Vector2:\r\n                            case VariantType.Vector3:\r\n                            case VariantType.Vector4:\r\n                            case VariantType.Quaternion:\r\n                            case VariantType.Color:\r\n                                return new Vector2(_x, _y);\r\n                            case VariantType.DateTime:\r\n                                return Vector2.zero;\r\n                            case VariantType.GameObject:\r\n                            case VariantType.Component:\r\n                                return Vector2.zero;\r\n                            case VariantType.LayerMask:\r\n                                return new Vector2((float)_w, 0f);\r\n                            case VariantType.Rect:\r\n                                return new Vector2(_x, _y);\r\n                            case VariantType.Numeric:\r\n                                return ConvertUtil.ToVector2(this.NumericValue);\r\n                        }\r\n                        break;\r\n                    case RefMode.Property:\r\n                        return ConvertUtil.ToVector2(this.EvaluateProperty());\r\n                    case RefMode.Eval:\r\n                        try\r\n                        {\r\n                            return Evaluator.EvalVector2(_string, ObjUtil.ReduceIfProxy(_unityObjectReference));\r\n                        }\r\n                        catch\r\n                        {\r\n                            Debug.LogWarning(\"Failed to evaluate statement defined in VariantRefernce\");\r\n                        }\r\n                        break;\r\n                }\r\n                return Vector2.zero;\r\n            }\r\n            set\r\n            {\r\n                _x = value.x;\r\n                _y = value.y;\r\n                _z = 0f;\r\n                _w = 0d;\r\n                _string = null;\r\n                _unityObjectReference = null;\r\n                _numeric = null;\r\n                _type = VariantType.Vector2;\r\n                _mode = RefMode.Value;\r\n            }\r\n        }\r\n        public Vector3 Vector3Value\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        switch (_type)\r\n                        {\r\n                            case VariantType.Object:\r\n                                return Vector3.zero;\r\n                            case VariantType.String:\r\n                                return ConvertUtil.ToVector3(_string);\r\n                            case VariantType.Boolean:\r\n                                return (_x != 0f) ? Vector3.one : Vector3.zero;\r\n                            case VariantType.Integer:\r\n                                return new Vector3((float)_w, 0f, 0f);\r\n                            case VariantType.Float:\r\n                                return new Vector3(_x, 0f, 0f);\r\n                            case VariantType.Double:\r\n                                return new Vector3((float)_w, 0f, 0f);\r\n                            case VariantType.Vector2:\r\n                            case VariantType.Vector3:\r\n                            case VariantType.Vector4:\r\n                            case VariantType.Quaternion:\r\n                            case VariantType.Color:\r\n                                return new Vector3(_x, _y, _z);\r\n                            case VariantType.DateTime:\r\n                                return Vector3.zero;\r\n                            case VariantType.GameObject:\r\n                            case VariantType.Component:\r\n                                return Vector3.zero;\r\n                            case VariantType.LayerMask:\r\n                                return new Vector3((float)_w, 0f, 0f);\r\n                            case VariantType.Rect:\r\n                                return new Vector3(_x, _y, _z);\r\n                            case VariantType.Numeric:\r\n                                return ConvertUtil.ToVector3(this.NumericValue);\r\n                        }\r\n                        break;\r\n                    case RefMode.Property:\r\n                        return ConvertUtil.ToVector3(this.EvaluateProperty());\r\n                    case RefMode.Eval:\r\n                        try\r\n                        {\r\n                            return Evaluator.EvalVector3(_string, ObjUtil.ReduceIfProxy(_unityObjectReference));\r\n                        }\r\n                        catch\r\n                        {\r\n                            Debug.LogWarning(\"Failed to evaluate statement defined in VariantRefernce\");\r\n                        }\r\n                        break;\r\n                }\r\n                return Vector3.zero;\r\n            }\r\n            set\r\n            {\r\n                _x = value.x;\r\n                _y = value.y;\r\n                _z = value.z;\r\n                _w = 0d;\r\n                _string = null;\r\n                _unityObjectReference = null;\r\n                _numeric = null;\r\n                _type = VariantType.Vector3;\r\n                _mode = RefMode.Value;\r\n            }\r\n        }\r\n        public Vector4 Vector4Value\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        switch (_type)\r\n                        {\r\n                            case VariantType.Object:\r\n                                return Vector4.zero;\r\n                            case VariantType.String:\r\n                                return ConvertUtil.ToVector4(_string);\r\n                            case VariantType.Boolean:\r\n                                return (_x != 0f) ? Vector4.one : Vector4.zero;\r\n                            case VariantType.Integer:\r\n                                return new Vector4((float)_w, 0f, 0f, 0f);\r\n                            case VariantType.Float:\r\n                                return new Vector4(_x, 0f, 0f, 0f);\r\n                            case VariantType.Double:\r\n                                return new Vector4((float)_w, 0f, 0f, 0f);\r\n                            case VariantType.Vector2:\r\n                            case VariantType.Vector3:\r\n                            case VariantType.Vector4:\r\n                            case VariantType.Quaternion:\r\n                            case VariantType.Color:\r\n                                return new Vector4(_x, _y, _z, (float)_w);\r\n                            case VariantType.DateTime:\r\n                                return Vector4.zero;\r\n                            case VariantType.GameObject:\r\n                            case VariantType.Component:\r\n                                return Vector4.zero;\r\n                            case VariantType.LayerMask:\r\n                                return new Vector4((float)_w, 0f, 0f, 0f);\r\n                            case VariantType.Rect:\r\n                                return new Vector4(_x, _y, _z, (float)_w);\r\n                            case VariantType.Numeric:\r\n                                return ConvertUtil.ToVector4(this.NumericValue);\r\n                        }\r\n                        break;\r\n                    case RefMode.Property:\r\n                        return ConvertUtil.ToVector4(this.EvaluateProperty());\r\n                    case RefMode.Eval:\r\n                        try\r\n                        {\r\n                            return Evaluator.EvalVector4(_string, ObjUtil.ReduceIfProxy(_unityObjectReference));\r\n                        }\r\n                        catch\r\n                        {\r\n                            Debug.LogWarning(\"Failed to evaluate statement defined in VariantRefernce\");\r\n                        }\r\n                        break;\r\n                }\r\n                return Vector4.zero;\r\n            }\r\n            set\r\n            {\r\n                _x = value.x;\r\n                _y = value.y;\r\n                _z = value.z;\r\n                _w = value.w;\r\n                _string = null;\r\n                _unityObjectReference = null;\r\n                _numeric = null;\r\n                _type = VariantType.Vector4;\r\n                _mode = RefMode.Value;\r\n            }\r\n        }\r\n        public Quaternion QuaternionValue\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        if (_type == VariantType.Quaternion || _type == VariantType.Vector4)\r\n                            return new Quaternion(_x, _y, _z, (float)_w);\r\n                        else\r\n                            return Quaternion.identity;\r\n                    case RefMode.Property:\r\n                        var obj = this.EvaluateProperty();\r\n                        if (obj is Quaternion)\r\n                            return (Quaternion)obj;\r\n                        else if (obj is Vector3)\r\n                            return Quaternion.Euler((Vector3)obj);\r\n                        else\r\n                            return Quaternion.identity;\r\n                    case RefMode.Eval:\r\n                        try\r\n                        {\r\n                            return Evaluator.EvalQuaternion(_string, ObjUtil.ReduceIfProxy(_unityObjectReference));\r\n                        }\r\n                        catch\r\n                        {\r\n                            Debug.LogWarning(\"Failed to evaluate statement defined in VariantRefernce\");\r\n                        }\r\n                        break;\r\n                }\r\n                return Quaternion.identity;\r\n            }\r\n            set\r\n            {\r\n                _x = value.x;\r\n                _y = value.y;\r\n                _z = value.z;\r\n                _w = value.w;\r\n                _string = null;\r\n                _unityObjectReference = null;\r\n                _numeric = null;\r\n                _type = VariantType.Quaternion;\r\n                _mode = RefMode.Value;\r\n            }\r\n        }\r\n        public Color ColorValue\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        switch (_type)\r\n                        {\r\n                            case VariantType.Object:\r\n                                return Color.black;\r\n                            case VariantType.String:\r\n                                return ConvertUtil.ToColor(_string);\r\n                            case VariantType.Boolean:\r\n                                return (_x != 0f) ? Color.white : Color.black;\r\n                            case VariantType.Integer:\r\n                                return ConvertUtil.ToColor((int)_w);\r\n                            case VariantType.Float:\r\n                                return ConvertUtil.ToColor((int)_x);\r\n                            case VariantType.Double:\r\n                                return ConvertUtil.ToColor((int)_w);\r\n                            case VariantType.Vector2:\r\n                                return new Color(_x, _y, 0f);\r\n                            case VariantType.Vector3:\r\n                                return new Color(_x, _y, _z);\r\n                            case VariantType.Vector4:\r\n                            case VariantType.Quaternion:\r\n                                return new Color(_x, _y, _z, (float)_w);\r\n                            case VariantType.Color:\r\n                                return new Color(_x, _y, _z, (float)_w);\r\n                            case VariantType.DateTime:\r\n                                return Color.black;\r\n                            case VariantType.GameObject:\r\n                            case VariantType.Component:\r\n                                return Color.black;\r\n                            case VariantType.LayerMask:\r\n                                return ConvertUtil.ToColor((int)_w);\r\n                            case VariantType.Rect:\r\n                                return new Color(_x, _y, _z, (float)_w);\r\n                            case VariantType.Numeric:\r\n                                return ConvertUtil.ToColor(this.NumericValue);\r\n                        }\r\n                        break;\r\n                    case RefMode.Property:\r\n                        return ConvertUtil.ToColor(this.EvaluateProperty());\r\n                    case RefMode.Eval:\r\n                        try\r\n                        {\r\n                            return Evaluator.EvalColor(_string, ObjUtil.ReduceIfProxy(_unityObjectReference));\r\n                        }\r\n                        catch\r\n                        {\r\n                            Debug.LogWarning(\"Failed to evaluate statement defined in VariantRefernce\");\r\n                        }\r\n                        break;\r\n                }\r\n                return Color.black;\r\n            }\r\n            set\r\n            {\r\n                _x = value.r;\r\n                _y = value.g;\r\n                _z = value.b;\r\n                _w = value.a;\r\n                _string = null;\r\n                _unityObjectReference = null;\r\n                _numeric = null;\r\n                _type = VariantType.Color;\r\n                _mode = RefMode.Value;\r\n            }\r\n        }\r\n        public System.DateTime DateValue\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        switch (_type)\r\n                        {\r\n                            case VariantType.Object:\r\n                                return new System.DateTime(0L);\r\n                            case VariantType.String:\r\n                                return ConvertUtil.ToDate(_string);\r\n                            case VariantType.Boolean:\r\n                            case VariantType.Integer:\r\n                            case VariantType.Float:\r\n                            case VariantType.Double:\r\n                            case VariantType.Vector2:\r\n                            case VariantType.Vector3:\r\n                            case VariantType.Vector4:\r\n                            case VariantType.Quaternion:\r\n                            case VariantType.Color:\r\n                                return new System.DateTime(0L);\r\n                            case VariantType.DateTime:\r\n                                return DecodeDateTime(_w, _x);\r\n                            case VariantType.GameObject:\r\n                            case VariantType.Component:\r\n                                return new System.DateTime(0L);\r\n                            case VariantType.LayerMask:\r\n                                return new System.DateTime(0L);\r\n                            case VariantType.Rect:\r\n                                return new System.DateTime(0L);\r\n                            case VariantType.Numeric:\r\n                                return new System.DateTime(0L);\r\n                        }\r\n                        break;\r\n                    case RefMode.Property:\r\n                        return ConvertUtil.ToDate(this.EvaluateProperty());\r\n                }\r\n                return new System.DateTime(0L);\r\n            }\r\n            set\r\n            {\r\n                EncodeDateTime(value, out _w, out _x);\r\n                _y = 0f;\r\n                _z = 0f;\r\n                _string = null;\r\n                _unityObjectReference = null;\r\n                _numeric = null;\r\n                _type = VariantType.DateTime;\r\n                _mode = RefMode.Value;\r\n            }\r\n        }\r\n        public GameObject GameObjectValue\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        return _unityObjectReference as GameObject;\r\n                    case RefMode.Property:\r\n                        return GameObjectUtil.GetGameObjectFromSource(this.EvaluateProperty());\r\n                }\r\n                return null;\r\n            }\r\n            set\r\n            {\r\n                _x = 0f;\r\n                _y = 0f;\r\n                _z = 0f;\r\n                _w = 0d;\r\n                _string = null;\r\n                _unityObjectReference = value;\r\n                _numeric = null;\r\n                _type = VariantType.GameObject;\r\n                _mode = RefMode.Value;\r\n            }\r\n        }\r\n        public Component ComponentValue\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        return _unityObjectReference as Component;\r\n                    case RefMode.Property:\r\n                        var obj = this.EvaluateProperty();\r\n                        if (obj is Component)\r\n                            return obj as Component;\r\n                        else if (obj is IComponent)\r\n                            return (obj as IComponent).component;\r\n                        else\r\n                            return null;\r\n                }\r\n                return null;\r\n            }\r\n            set\r\n            {\r\n                _x = 0f;\r\n                _y = 0f;\r\n                _z = 0f;\r\n                _w = 0d;\r\n                _string = null;\r\n                _unityObjectReference = value;\r\n                _numeric = null;\r\n                _type = VariantType.Component;\r\n                _mode = RefMode.Value;\r\n            }\r\n        }\r\n        public UnityEngine.Object ObjectValue\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        return _unityObjectReference == null ? null : _unityObjectReference;\r\n                    case RefMode.Property:\r\n                        var obj = this.EvaluateProperty();\r\n                        if (obj is UnityEngine.Object)\r\n                            return obj as UnityEngine.Object;\r\n                        else if (obj is IComponent)\r\n                            return (obj as IComponent).component;\r\n                        else if (obj is IGameObjectSource)\r\n                            return (obj as IGameObjectSource).gameObject;\r\n                        else\r\n                            return null;\r\n                }\r\n                return null;\r\n            }\r\n            set\r\n            {\r\n                _mode = RefMode.Value;\r\n                _x = 0f;\r\n                _y = 0f;\r\n                _z = 0f;\r\n                _w = 0d;\r\n                _string = null;\r\n                _unityObjectReference = value;\r\n                _numeric = null;\r\n                if (_unityObjectReference is GameObject)\r\n                    _type = VariantType.GameObject;\r\n                else if (_unityObjectReference is Component)\r\n                    _type = VariantType.Component;\r\n                else\r\n                    _type = VariantType.Object;\r\n            }\r\n        }\r\n        public LayerMask LayerMaskValue\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        switch (_type)\r\n                        {\r\n                            case VariantType.Object:\r\n                                return 0;\r\n                            case VariantType.String:\r\n                                return ConvertUtil.ToInt(_string);\r\n                            case VariantType.Boolean:\r\n                                return (_x != 0f) ? 1 : 0;\r\n                            case VariantType.Integer:\r\n                                return (int)_w;\r\n                            case VariantType.Float:\r\n                                return (int)_x;\r\n                            case VariantType.Double:\r\n                                return (int)_w;\r\n                            case VariantType.Vector2:\r\n                            case VariantType.Vector3:\r\n                            case VariantType.Vector4:\r\n                            case VariantType.Quaternion:\r\n                                return (int)_x;\r\n                            case VariantType.Color:\r\n                                return ConvertUtil.ToInt(new Color(_x, _y, _z, (float)_w));\r\n                            case VariantType.DateTime:\r\n                                return 0;\r\n                            case VariantType.GameObject:\r\n                            case VariantType.Component:\r\n                                return 0;\r\n                            case VariantType.LayerMask:\r\n                                return new LayerMask() { value = (int)_w };\r\n                            case VariantType.Rect:\r\n                                return new LayerMask();\r\n                            case VariantType.Numeric:\r\n                                {\r\n                                    var n = this.NumericValue;\r\n                                    return n != null ? n.ToInt32(null) : 0;\r\n                                }\r\n                        }\r\n                        break;\r\n                    case RefMode.Property:\r\n                        return ConvertUtil.ToInt(this.EvaluateProperty());\r\n                    case RefMode.Eval:\r\n                        try\r\n                        {\r\n                            return (int)Evaluator.EvalNumber(_string, ObjUtil.ReduceIfProxy(_unityObjectReference));\r\n                        }\r\n                        catch\r\n                        {\r\n                            Debug.LogWarning(\"Failed to evaluate statement defined in VariantRefernce\");\r\n                            return 0;\r\n                        }\r\n                }\r\n                return 0;\r\n            }\r\n            set\r\n            {\r\n                _x = 0f;\r\n                _y = 0f;\r\n                _z = 0f;\r\n                _w = value;\r\n                _string = null;\r\n                _unityObjectReference = null;\r\n                _numeric = null;\r\n                _type = VariantType.LayerMask;\r\n                _mode = RefMode.Value;\r\n            }\r\n        }\r\n        public Rect RectValue\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        switch (_type)\r\n                        {\r\n                            case VariantType.Object:\r\n                                return new Rect();\r\n                            case VariantType.String:\r\n                                {\r\n                                    var v = ConvertUtil.ToVector4(_string);\r\n                                    return new Rect(v.x, v.y, v.z, v.w);\r\n                                }\r\n                            case VariantType.Boolean:\r\n                                return new Rect();\r\n                            case VariantType.Integer:\r\n                                return new Rect((float)_w, 0f, 0f, 0f);\r\n                            case VariantType.Float:\r\n                                return new Rect(_x, 0f, 0f, 0f);\r\n                            case VariantType.Double:\r\n                                return new Rect((float)_w, 0f, 0f, 0f);\r\n                            case VariantType.Vector2:\r\n                            case VariantType.Vector3:\r\n                            case VariantType.Vector4:\r\n                            case VariantType.Quaternion:\r\n                            case VariantType.Color:\r\n                                return new Rect(_x, _y, _z, (float)_w);\r\n                            case VariantType.DateTime:\r\n                                return new Rect();\r\n                            case VariantType.GameObject:\r\n                            case VariantType.Component:\r\n                                return new Rect();\r\n                            case VariantType.LayerMask:\r\n                                return new Rect();\r\n                            case VariantType.Rect:\r\n                                return new Rect(_x, _y, _z, (float)_w);\r\n                            case VariantType.Numeric:\r\n                                {\r\n                                    var n = this.NumericValue;\r\n                                    return n != null ? new Rect(n.ToSingle(null), 0f, 0f, 0f) : new Rect();\r\n                                }\r\n                        }\r\n                        break;\r\n                    case RefMode.Property:\r\n                        {\r\n                            var r = this.EvaluateProperty();\r\n                            if (r is Rect)\r\n                                return (Rect)r;\r\n                            else\r\n                                return new Rect();\r\n                        }\r\n                    case RefMode.Eval:\r\n                        try\r\n                        {\r\n                            return Evaluator.EvalRect(_string, ObjUtil.ReduceIfProxy(_unityObjectReference));\r\n                        }\r\n                        catch\r\n                        {\r\n                            Debug.LogWarning(\"Failed to evaluate statement defined in VariantRefernce\");\r\n                        }\r\n                        break;\r\n                }\r\n                return new Rect();\r\n            }\r\n            set\r\n            {\r\n                _x = value.xMin;\r\n                _y = value.yMin;\r\n                _z = value.width;\r\n                _w = value.height;\r\n                _string = null;\r\n                _unityObjectReference = null;\r\n                _numeric = null;\r\n                _type = VariantType.Rect;\r\n                _mode = RefMode.Value;\r\n            }\r\n        }\r\n\r\n        public INumeric NumericValue\r\n        {\r\n            get\r\n            {\r\n                switch(_mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        switch(_type)\r\n                        {\r\n                            case VariantType.Object:\r\n                            case VariantType.Component:\r\n                                return _unityObjectReference as INumeric;\r\n                            case VariantType.Numeric:\r\n                                {\r\n                                    if (_numeric == null)\r\n                                    {\r\n                                        _numeric = this.UnravelNumeric();\r\n                                        if (_numeric == null) this.Value = null; //couldn't resolve numeric, set value to null\r\n                                    }\r\n                                    return _numeric;\r\n                                }\r\n                            default:\r\n                                return null;\r\n                        }\r\n                    case RefMode.Property:\r\n                        {\r\n                            var result = this.EvaluateProperty();\r\n                            if (result is INumeric)\r\n                                return result as INumeric;\r\n                            else\r\n                                return null;\r\n                        }\r\n                    case RefMode.Eval:\r\n                        try\r\n                        {\r\n                            var result = Evaluator.EvalValue(_string, ObjUtil.ReduceIfProxy(_unityObjectReference));\r\n                            if (result is INumeric)\r\n                                return result as INumeric;\r\n                            else\r\n                                return null;\r\n                        }\r\n                        catch\r\n                        {\r\n                            Debug.LogWarning(\"Failed to evaluate statement defined in VariantRefernce\");\r\n                        }\r\n                        break;\r\n                }\r\n\r\n                return null;\r\n            }\r\n            set\r\n            {\r\n                this.SetToNumeric(value);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public object GetValue(VariantType etp)\r\n        {\r\n            switch (etp)\r\n            {\r\n                case VariantType.Object:\r\n                    return this.ObjectValue;\r\n                case VariantType.Null:\r\n                    return null;\r\n                case VariantType.String:\r\n                    return this.StringValue;\r\n                case VariantType.Boolean:\r\n                    return this.BoolValue;\r\n                case VariantType.Integer:\r\n                    return this.IntValue;\r\n                case VariantType.Float:\r\n                    return this.FloatValue;\r\n                case VariantType.Double:\r\n                    return this.DoubleValue;\r\n                case VariantType.Vector2:\r\n                    return this.Vector2Value;\r\n                case VariantType.Vector3:\r\n                    return this.Vector3Value;\r\n                case VariantType.Vector4:\r\n                    return this.Vector4Value;\r\n                case VariantType.Quaternion:\r\n                    return this.QuaternionValue;\r\n                case VariantType.Color:\r\n                    return this.ColorValue;\r\n                case VariantType.DateTime:\r\n                    return this.DateValue;\r\n                case VariantType.GameObject:\r\n                    return this.GameObjectValue;\r\n                case VariantType.Component:\r\n                    return this.ComponentValue;\r\n                case VariantType.LayerMask:\r\n                    return this.LayerMaskValue;\r\n                case VariantType.Rect:\r\n                    return this.RectValue;\r\n                case VariantType.Numeric:\r\n                    return this.NumericValue;\r\n                default:\r\n                    return null;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// If variant reference is in Property mode, this will SET the target property.\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        public void ModifyProperty(object value)\r\n        {\r\n            if (_mode != RefMode.Property) return;\r\n            \r\n            DynamicUtil.SetValue(ObjUtil.ReduceIfProxy(_unityObjectReference), _string, value);\r\n        }\r\n\r\n        public void SetToProperty(UnityEngine.Object obj, string property)\r\n        {\r\n            if (obj == null) throw new System.ArgumentNullException(\"obj\");\r\n            var member = DynamicUtil.GetMember(obj, property, false);\r\n            if(member == null)\r\n            {\r\n                _type = VariantType.Null;\r\n            }\r\n            else\r\n            {\r\n                var tp = DynamicUtil.GetReturnType(member);\r\n                if (tp != null)\r\n                    _type = VariantReference.GetVariantType(tp);\r\n                else\r\n                    _type = VariantType.Null;\r\n            }\r\n\r\n            _mode = RefMode.Property;\r\n            _x = 0f;\r\n            _y = 0f;\r\n            _z = 0f;\r\n            _w = 0d;\r\n\r\n            _string = property;\r\n            _unityObjectReference = obj;\r\n        }\r\n\r\n        /// <summary>\r\n        /// If Mode is RefMode.Property this will attempt to determine the member type of the target property. Null is returned if it can't be determined.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public System.Type GetPropertyReturnType()\r\n        {\r\n            if(_mode == RefMode.Property)\r\n            {\r\n                var member = DynamicUtil.GetMember(_unityObjectReference, _string, false);\r\n                if(member != null)\r\n                {\r\n                    return DynamicUtil.GetReturnType(member);\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public void SetToEvalStatement(string statement, UnityEngine.Object optionalParam = null)\r\n        {\r\n            _mode = RefMode.Eval;\r\n            _x = 0f;\r\n            _y = 0f;\r\n            _z = 0f;\r\n            _w = 0d;\r\n\r\n            _string = statement;\r\n            _unityObjectReference = optionalParam;\r\n            _type = VariantType.Null;\r\n        }\r\n\r\n        private object EvaluateProperty()\r\n        {\r\n            if (_unityObjectReference == null) return null;\r\n            return DynamicUtil.GetValue(ObjUtil.ReduceIfProxy(_unityObjectReference), _string);\r\n        }\r\n\r\n\r\n\r\n        public void SetToNumeric(INumeric value)\r\n        {\r\n            _x = 0f;\r\n            _y = 0f;\r\n            _z = 0f;\r\n            _w = 0d;\r\n            _string = null;\r\n            _unityObjectReference = null;\r\n            _numeric = value;\r\n            _type = (_numeric != null) ? VariantType.Numeric : VariantType.Null;\r\n            _mode = RefMode.Value;\r\n\r\n            if (_numeric != null)\r\n            {\r\n                var tc = _numeric.GetUnderlyingTypeCode();\r\n                switch (tc)\r\n                {\r\n                    case System.TypeCode.Boolean:\r\n                    case System.TypeCode.Char:\r\n                    case System.TypeCode.Byte:\r\n                    case System.TypeCode.Int16:\r\n                    case System.TypeCode.UInt16:\r\n                    case System.TypeCode.Int32:\r\n                    case System.TypeCode.UInt32:\r\n                        {\r\n                            _x = (int)tc;\r\n                            _string = TypeReference.HashType(_numeric.GetType());\r\n                            _w = _numeric.ToDouble(null);\r\n                        }\r\n                        break;\r\n                    case System.TypeCode.Int64:\r\n                    case System.TypeCode.UInt64:\r\n                        {\r\n                            _x = (int)tc;\r\n                            _string = TypeReference.HashType(_numeric.GetType());\r\n                            long v = _numeric.ToInt64(null);\r\n                            _w = (double)(v >> 16);\r\n                            _z = (float)(v & 0xFFFF);\r\n                        }\r\n                        break;\r\n                    case System.TypeCode.Single:\r\n                    case System.TypeCode.Double:\r\n                        {\r\n                            _x = (int)tc;\r\n                            _string = TypeReference.HashType(_numeric.GetType());\r\n                            _w = _numeric.ToDouble(null);\r\n                        }\r\n                        break;\r\n                    default:\r\n                        {\r\n                            _x = 0;\r\n                            _string = EncodeB64Numeric(_numeric);\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n        private INumeric UnravelNumeric()\r\n        {\r\n            var tc = (System.TypeCode)((int)_x);\r\n            switch (tc)\r\n            {\r\n                case System.TypeCode.Boolean:\r\n                case System.TypeCode.Char:\r\n                case System.TypeCode.Byte:\r\n                case System.TypeCode.Int16:\r\n                case System.TypeCode.UInt16:\r\n                case System.TypeCode.Int32:\r\n                case System.TypeCode.UInt32:\r\n                    {\r\n                        var tp = TypeReference.UnHashType(_string);\r\n                        if (tp == null || !typeof(INumeric).IsAssignableFrom(tp)) return null;\r\n\r\n                        return Numerics.CreateNumeric(tp, _w);\r\n                    }\r\n                case System.TypeCode.Int64:\r\n                case System.TypeCode.UInt64:\r\n                    {\r\n                        var tp = TypeReference.UnHashType(_string);\r\n                        if (tp == null || !typeof(INumeric).IsAssignableFrom(tp)) return null;\r\n\r\n                        long v = (long)_w;\r\n                        v = v << 16;\r\n                        v |= (long)((int)_z & 0xFFFF);\r\n                        return Numerics.CreateNumeric(tp, v);\r\n                    }\r\n                case System.TypeCode.Single:\r\n                case System.TypeCode.Double:\r\n                    {\r\n                        var tp = TypeReference.UnHashType(_string);\r\n                        if (tp == null || !typeof(INumeric).IsAssignableFrom(tp)) return null;\r\n\r\n                        return Numerics.CreateNumeric(tp, _w);\r\n                    }\r\n                default:\r\n                    return DecodeB64Numeric(_string);\r\n            }\r\n        }\r\n\r\n\r\n        public void CopyValue(VariantReference v)\r\n        {\r\n            if(v == null)\r\n            {\r\n                this.Value = null;\r\n                return;\r\n            }\r\n\r\n            _mode = v._mode;\r\n            _type = v._type;\r\n            _x = v._x;\r\n            _y = v._y;\r\n            _z = v._z;\r\n            _w = v._w;\r\n            _string = v._string;\r\n            _unityObjectReference = v._unityObjectReference;\r\n            _numeric = v._numeric;\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region ISerializable Interface\r\n\r\n        void System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)\r\n        {\r\n            info.SetValue(\"mode\", (byte)_mode);\r\n            switch(_mode)\r\n            {\r\n                case RefMode.Value:\r\n                    {\r\n                        info.AddValue(\"type\", (int)_type);\r\n                        switch (_type)\r\n                        {\r\n                            case VariantType.Object:\r\n                            case VariantType.Null:\r\n                                //do nothing\r\n                                break;\r\n                            case VariantType.String:\r\n                                info.SetValue(\"value\", this.StringValue);\r\n                                break;\r\n                            case VariantType.Boolean:\r\n                                info.SetValue(\"value\", this.BoolValue);\r\n                                break;\r\n                            case VariantType.Integer:\r\n                                info.SetValue(\"value\", this.IntValue);\r\n                                break;\r\n                            case VariantType.Float:\r\n                                info.SetValue(\"value\", this.FloatValue);\r\n                                break;\r\n                            case VariantType.Double:\r\n                                info.SetValue(\"value\", this.DoubleValue);\r\n                                break;\r\n                            case VariantType.Vector2:\r\n                            case VariantType.Vector3:\r\n                            case VariantType.Quaternion:\r\n                            case VariantType.Color:\r\n                                info.SetValue(\"value\", string.Format(\"{0},{1},{2},{3}\", _x, _y, _z, _w));\r\n                                break;\r\n                            case VariantType.DateTime:\r\n                                info.SetValue(\"value\", this.DateValue);\r\n                                break;\r\n                            case VariantType.GameObject:\r\n                            case VariantType.Component:\r\n                                //do nothing\r\n                                break;\r\n                            case VariantType.Numeric:\r\n                                {\r\n                                    var n = this.NumericValue;\r\n                                    if(n == null)\r\n                                    {\r\n                                        info.SetValue(\"value\", null);\r\n                                    }\r\n                                    else if(n.GetType().IsSerializable)\r\n                                    {\r\n                                        info.SetValue(\"value\", n);\r\n                                    }\r\n                                    else\r\n                                    {\r\n                                        info.SetValue(\"value\", EncodeB64Numeric(n));\r\n                                    }\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n                case RefMode.Property:\r\n                    //do nothing\r\n                    break;\r\n            }\r\n        }\r\n\r\n        private VariantReference(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)\r\n        {\r\n            var mode = (RefMode)info.GetByte(\"mode\");\r\n            switch(mode)\r\n            {\r\n                case RefMode.Value:\r\n                    _mode = RefMode.Value;\r\n                    _type = (VariantType)info.GetInt32(\"type\");\r\n                    switch (_type)\r\n                    {\r\n                        case VariantType.Object:\r\n                        case VariantType.Null:\r\n                            this.Value = null;\r\n                            break;\r\n                        case VariantType.String:\r\n                            this.StringValue = info.GetString(\"value\");\r\n                            break;\r\n                        case VariantType.Boolean:\r\n                            this.BoolValue = info.GetBoolean(\"value\");\r\n                            break;\r\n                        case VariantType.Integer:\r\n                            this.IntValue = info.GetInt32(\"value\");\r\n                            break;\r\n                        case VariantType.Float:\r\n                            this.FloatValue = info.GetSingle(\"value\");\r\n                            break;\r\n                        case VariantType.Double:\r\n                            this.DoubleValue = info.GetDouble(\"value\");\r\n                            break;\r\n                        case VariantType.Vector2:\r\n                        case VariantType.Vector3:\r\n                        case VariantType.Quaternion:\r\n                        case VariantType.Color:\r\n                            var arr = StringUtil.SplitFixedLength(info.GetString(\"value\"), \",\", 4);\r\n                            _x = ConvertUtil.ToSingle(arr[0]);\r\n                            _y = ConvertUtil.ToSingle(arr[1]);\r\n                            _z = ConvertUtil.ToSingle(arr[2]);\r\n                            _w = ConvertUtil.ToDouble(arr[3]);\r\n                            break;\r\n                        case VariantType.DateTime:\r\n                            this.DateValue = info.GetDateTime(\"value\");\r\n                            break;\r\n                        case VariantType.GameObject:\r\n                        case VariantType.Component:\r\n                            this.Value = null;\r\n                            break;\r\n                        case VariantType.Numeric:\r\n                            {\r\n                                var data = info.GetValue(\"value\", typeof(object));\r\n                                if(data is INumeric)\r\n                                {\r\n                                    this.NumericValue = data as INumeric;\r\n                                }\r\n                                else if(data is string)\r\n                                {\r\n                                    this.NumericValue = DecodeB64Numeric(data as string);\r\n                                }\r\n                                else\r\n                                {\r\n                                    this.Value = null;\r\n                                }\r\n                            }\r\n                            break;\r\n                    }\r\n                    break;\r\n                case RefMode.Property:\r\n                    this.Value = null; //just set to null value\r\n                    break;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        bool ISPDisposable.IsDisposed\r\n        {\r\n            get\r\n            {\r\n                if(!object.ReferenceEquals(_unityObjectReference, null))\r\n                {\r\n                    return !ObjUtil.IsObjectAlive(_unityObjectReference);\r\n                }\r\n                else\r\n                {\r\n                    return _mode == RefMode.Value && _type == VariantType.Null;\r\n                }\r\n            }\r\n        }\r\n\r\n        void System.IDisposable.Dispose()\r\n        {\r\n            _mode = RefMode.Value;\r\n            _type = VariantType.Null;\r\n            _x = 0f;\r\n            _y = 0f;\r\n            _z = 0f;\r\n            _w = 0.0;\r\n            _string = null;\r\n            _unityObjectReference = null;\r\n            _numeric = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Utils\r\n\r\n        /// <summary>\r\n        /// Returns true if the supplied type is an acceptable type for a value stored in a VariantReference\r\n        /// </summary>\r\n        /// <param name=\"tp\"></param>\r\n        /// <returns></returns>\r\n        public static bool AcceptableType(System.Type tp)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n            \r\n            switch (System.Type.GetTypeCode(tp))\r\n            {\r\n                case System.TypeCode.String:\r\n                case System.TypeCode.Boolean:\r\n                case System.TypeCode.Int32:\r\n                case System.TypeCode.Single:\r\n                case System.TypeCode.Double:\r\n                case System.TypeCode.DateTime:\r\n                    return true;\r\n            }\r\n\r\n            if (tp == typeof(Vector2)) return true;\r\n            else if (tp == typeof(Vector3)) return true;\r\n            else if (tp == typeof(Vector4)) return true;\r\n            else if (tp == typeof(Quaternion)) return true;\r\n            else if (tp == typeof(Color)) return true;\r\n            else if (tp == typeof(LayerMask)) return true;\r\n            else if (tp == typeof(Rect)) return true;\r\n            else if (tp == typeof(GameObject)) return true;\r\n            else if (typeof(Component).IsAssignableFrom(tp)) return true;\r\n            else if (typeof(UnityEngine.Object).IsAssignableFrom(tp)) return true;\r\n            else if (typeof(IComponent).IsAssignableFrom(tp)) return true;\r\n            else if (typeof(INumeric).IsAssignableFrom(tp)) return true;\r\n            else if (tp.IsInterface) return true;\r\n            else if (tp == typeof(Variant)) return true;\r\n            else return false;\r\n        }\r\n\r\n        public static VariantType GetVariantType(System.Type tp)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n\r\n            switch (System.Type.GetTypeCode(tp))\r\n            {\r\n                case System.TypeCode.String:\r\n                    return VariantType.String;\r\n                case System.TypeCode.Boolean:\r\n                    return VariantType.Boolean;\r\n                case System.TypeCode.Int32:\r\n                    return VariantType.Integer;\r\n                case System.TypeCode.Single:\r\n                    return VariantType.Float;\r\n                case System.TypeCode.Double:\r\n                    return VariantType.Double;\r\n                case System.TypeCode.DateTime:\r\n                    return VariantType.DateTime;\r\n            }\r\n\r\n            if (tp == typeof(Vector2)) return VariantType.Vector2;\r\n            else if (tp == typeof(Vector3)) return VariantType.Vector3;\r\n            else if (tp == typeof(Vector4)) return VariantType.Vector4;\r\n            else if (tp == typeof(Quaternion)) return VariantType.Quaternion;\r\n            else if (tp == typeof(Color)) return VariantType.Color;\r\n            else if (tp == typeof(LayerMask)) return VariantType.LayerMask;\r\n            else if (tp == typeof(Rect)) return VariantType.Rect;\r\n            else if (tp == typeof(GameObject)) return VariantType.GameObject;\r\n            else if (typeof(Component).IsAssignableFrom(tp)) return VariantType.Component;\r\n            else if (typeof(UnityEngine.Object).IsAssignableFrom(tp)) return VariantType.Object;\r\n            else if (typeof(IComponent).IsAssignableFrom(tp)) return VariantType.Component;\r\n            else if (typeof(INumeric).IsAssignableFrom(tp)) return VariantType.Numeric;\r\n            else if (tp.IsInterface) return VariantType.Object;\r\n\r\n            return VariantType.Null;\r\n        }\r\n\r\n        public static System.Type GetTypeFromVariantType(VariantType etp)\r\n        {\r\n            switch (etp)\r\n            {\r\n                case VariantType.Object:\r\n                    return typeof(UnityEngine.Object);\r\n                case VariantType.String:\r\n                    return typeof(string);\r\n                case VariantType.Boolean:\r\n                    return typeof(bool);\r\n                case VariantType.Integer:\r\n                    return typeof(System.Int32);\r\n                case VariantType.Float:\r\n                    return typeof(float);\r\n                case VariantType.Double:\r\n                    return typeof(double);\r\n                case VariantType.Vector2:\r\n                    return typeof(Vector2);\r\n                case VariantType.Vector3:\r\n                    return typeof(Vector3);\r\n                case VariantType.Quaternion:\r\n                    return typeof(Quaternion);\r\n                case VariantType.Color:\r\n                    return typeof(UnityEngine.Color);\r\n                case VariantType.DateTime:\r\n                    return typeof(System.DateTime);\r\n                case VariantType.GameObject:\r\n                    return typeof(GameObject);\r\n                case VariantType.Component:\r\n                    return typeof(Component);\r\n                case VariantType.LayerMask:\r\n                    return typeof(LayerMask);\r\n                case VariantType.Rect:\r\n                    return typeof(Rect);\r\n                case VariantType.Numeric:\r\n                    return typeof(INumeric);\r\n            }\r\n\r\n            return typeof(object);\r\n        }\r\n\r\n        private static void EncodeDateTime(System.DateTime dt, out double low, out float high)\r\n        {\r\n            const long MASK_LOW = ((1L << 48) - 1L);\r\n            const long MASK_HIGH = ((1L << 8) - 1L) << 48;\r\n\r\n            low = (double)(dt.Ticks & MASK_LOW);\r\n            high = (float)((dt.Ticks & MASK_HIGH) >> 48);\r\n        }\r\n\r\n        private static System.DateTime DecodeDateTime(double low, float high)\r\n        {\r\n            const long MASK_LOW = ((1L << 48) - 1L);\r\n            const long MASK_HIGH = ((1L << 8) - 1L);\r\n\r\n            long ticks = (long)low & MASK_LOW;\r\n            ticks |= ((long)high & MASK_HIGH) << 48;\r\n            return new System.DateTime(ticks);\r\n        }\r\n\r\n        private static string EncodeB64Numeric(INumeric n)\r\n        {\r\n            if (n == null) return null;\r\n            return System.Convert.ToBase64String(n.ToByteArray()) + \"|\" + TypeReference.HashType(n.GetType());\r\n        }\r\n\r\n        private static INumeric DecodeB64Numeric(string sdata)\r\n        {\r\n            if (sdata == null) return null;\r\n            try\r\n            {\r\n                int i = sdata.IndexOf('|', 0);\r\n                if (i < 0) return null;\r\n                var tp = TypeReference.UnHashType(sdata.Substring(i + 1));\r\n                if (tp == null) return null;\r\n                var data = System.Convert.FromBase64String(sdata.Substring(0, i));\r\n                return Numerics.CreateNumeric(tp, data);\r\n            }\r\n            catch (System.Exception)\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public class EditorHelper\r\n        {\r\n\r\n            private VariantReference _variant;\r\n\r\n            public EditorHelper()\r\n            {\r\n                _variant = new VariantReference();\r\n            }\r\n\r\n            public EditorHelper(VariantReference obj)\r\n            {\r\n                _variant = obj;\r\n            }\r\n\r\n            public VariantReference Target\r\n            {\r\n                get { return _variant; }\r\n            }\r\n\r\n            public RefMode _mode\r\n            {\r\n                get { return _variant._mode; }\r\n                set { _variant._mode = value; }\r\n            }\r\n\r\n            public VariantType _type\r\n            {\r\n                get { return _variant._type; }\r\n                set { _variant._type = value; }\r\n            }\r\n\r\n            public float _x\r\n            {\r\n                get { return _variant._x; }\r\n                set { _variant._x = value; }\r\n            }\r\n\r\n            public float _y\r\n            {\r\n                get { return _variant._y; }\r\n                set { _variant._y = value; }\r\n            }\r\n\r\n            public float _z\r\n            {\r\n                get { return _variant._z; }\r\n                set { _variant._z = value; }\r\n            }\r\n\r\n            public double _w\r\n            {\r\n                get { return _variant._w; }\r\n                set { _variant._w = value; }\r\n            }\r\n\r\n            public string _string\r\n            {\r\n                get { return _variant._string; }\r\n                set { _variant._string = value; }\r\n            }\r\n\r\n            public UnityEngine.Object _unityObjectReference\r\n            {\r\n                get { return _variant._unityObjectReference; }\r\n                set { _variant._unityObjectReference = value; }\r\n            }\r\n\r\n\r\n            public void PrepareForValueTypeChange(VariantType type)\r\n            {\r\n                _variant._type = type;\r\n                _variant._mode = RefMode.Value;\r\n                _variant._x = 0f;\r\n                _variant._y = 0f;\r\n                _variant._z = 0f;\r\n                _variant._w = 0d;\r\n                _variant._string = string.Empty;\r\n                switch(type)\r\n                {\r\n                    case VariantType.Object:\r\n                        break;\r\n                    case VariantType.Null:\r\n                    case VariantType.String:\r\n                    case VariantType.Boolean:\r\n                    case VariantType.Integer:\r\n                    case VariantType.Float:\r\n                    case VariantType.Double:\r\n                    case VariantType.Vector2:\r\n                    case VariantType.Vector3:\r\n                    case VariantType.Quaternion:\r\n                    case VariantType.Color:\r\n                    case VariantType.DateTime:\r\n                        _variant._unityObjectReference = null;\r\n                        break;\r\n                    case VariantType.GameObject:\r\n                        _variant._unityObjectReference = GameObjectUtil.GetGameObjectFromSource(_variant._unityObjectReference);\r\n                        break;\r\n                    case VariantType.Component:\r\n                        _variant._unityObjectReference = _variant._unityObjectReference as Component;\r\n                        break;\r\n                    case VariantType.Numeric:\r\n                        _variant._unityObjectReference = null;\r\n                        break;\r\n                }\r\n            }\r\n\r\n            public void PrepareForRefModeChange(RefMode mode)\r\n            {\r\n                _variant._mode = mode;\r\n                _variant._x = 0f;\r\n                _variant._y = 0f;\r\n                _variant._z = 0f;\r\n                _variant._w = 0d;\r\n                _variant._string = string.Empty;\r\n                switch(mode)\r\n                {\r\n                    case RefMode.Value:\r\n                        //_variant._type = ...;\r\n                        _variant._unityObjectReference = null;\r\n                        break;\r\n                    case RefMode.Property:\r\n                        _variant._type = VariantType.Null;\r\n                        break;\r\n                    case RefMode.Eval:\r\n                        //_variant._type = VariantType.Double;\r\n                        break;\r\n                }\r\n            }\r\n\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/VersionInfo.cs",
    "content": "﻿using System;\nusing System.Text.RegularExpressions;\nusing UnityEngine;\n\nnamespace com.spacepuppy\n{\n\n    [System.Serializable]\n    public struct VersionInfo : IComparable<VersionInfo>\n    {\n\n        #region Fields\n\n        [SerializeField]\n        public int Major;\n        [SerializeField]\n        public int Minor;\n        [SerializeField]\n        public int Patch;\n        [SerializeField]\n        public int Build;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public VersionInfo(int major, int minor = 0, int patch = 0, int build = 0)\n        {\n            this.Major = major;\n            this.Minor = minor;\n            this.Patch = patch;\n            this.Build = build;\n        }\n\n        #endregion\n\n        #region Methods\n\n        public int CompareTo(VersionInfo other)\n        {\n            if (Major < other.Major) return -1;\n            if (Major > other.Major) return +1;\n            if (Minor < other.Minor) return -1;\n            if (Minor > other.Minor) return +1;\n            if (Patch < other.Patch) return -1;\n            if (Patch > other.Patch) return +1;\n            if (Build < other.Build) return -1;\n            if (Build > other.Build) return +1;\n            return 0;\n        }\n\n        public override string ToString()\n        {\n            if (this.Build == 0)\n                return string.Format(\"{0}.{1}.{2}\", Major, Minor, Patch);\n            else\n                return string.Format(\"{0}.{1}.{2}.{3}\", Major, Minor, Patch, Build);\n        }\n\n        public override bool Equals(object other)\n        {\n            if (other is VersionInfo)\n                return this == (VersionInfo)other;\n            else\n                return false;\n        }\n\n        public override int GetHashCode()\n        {\n            return Major.GetHashCode() ^ Minor.GetHashCode() ^ Patch.GetHashCode() ^ Build.GetHashCode();\n        }\n\n        #endregion\n\n        #region Operators\n\n        public static bool operator ==(VersionInfo a, VersionInfo b)\n        {\n            return a.CompareTo(b) == 0;\n        }\n\n\n        public static bool operator !=(VersionInfo a, VersionInfo b)\n        {\n            return a.CompareTo(b) != 0;\n        }\n\n\n        public static bool operator <=(VersionInfo a, VersionInfo b)\n        {\n            return a.CompareTo(b) <= 0;\n        }\n\n\n        public static bool operator >=(VersionInfo a, VersionInfo b)\n        {\n            return a.CompareTo(b) >= 0;\n        }\n\n\n        public static bool operator <(VersionInfo a, VersionInfo b)\n        {\n            return a.CompareTo(b) < 0;\n        }\n\n\n        public static bool operator >(VersionInfo a, VersionInfo b)\n        {\n            return a.CompareTo(b) > 0;\n        }\n\n        #endregion\n\n        #region Static Accessors\n\n        private static VersionInfo? _unityVersion;\n        public static VersionInfo UnityVersion\n        {\n            get\n            {\n                if (_unityVersion == null || !_unityVersion.HasValue)\n                {\n                    var m = Regex.Match(Application.unityVersion, @\"^(\\d+)\\.(\\d+)\\.(\\d+)\");\n                    _unityVersion = new VersionInfo()\n                    {\n                        Major = Convert.ToInt32(m.Groups[1].Value),\n                        Minor = Convert.ToInt32(m.Groups[2].Value),\n                        Patch = Convert.ToInt32(m.Groups[3].Value),\n                        Build = 0\n                    };\n                }\n                return _unityVersion.Value;\n            }\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyBase/WaitForComplete.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// A composite yield instruction that waits for multiple instructions to all complete before continuing.\r\n    /// </summary>\r\n    public class WaitForAllComplete : RadicalYieldInstruction\r\n    {\r\n\r\n        private MonoBehaviour _handle;\r\n        private System.Collections.Generic.List<object> _instructions;\r\n        private int _waitCount;\r\n\r\n        public WaitForAllComplete(MonoBehaviour handle, params object[] instructions)\r\n        {\r\n            _handle = handle;\r\n            _instructions = new System.Collections.Generic.List<object>(instructions);\r\n        }\r\n\r\n        public void Add(object instruction)\r\n        {\r\n            _instructions.Add(instruction);\r\n        }\r\n\r\n        protected override bool Tick(out object yieldObject)\r\n        {\r\n            if (this.IsComplete)\r\n            {\r\n                yieldObject = null;\r\n                return false;\r\n            }\r\n\r\n            object current;\r\n            for (int i = 0; i < _instructions.Count; i++)\r\n            {\r\n                current = _instructions[i];\r\n                if (current == null)\r\n                {\r\n                    _instructions.RemoveAt(i);\r\n                    i--;\r\n                }\r\n                else if (current is YieldInstruction || current is WWW)\r\n                {\r\n                    _instructions.RemoveAt(i);\r\n                    i--;\r\n                    _handle.StartCoroutine(this.WaitForStandard(current));\r\n                }\r\n                else if (current is RadicalCoroutine)\r\n                {\r\n                    if ((current as RadicalCoroutine).CompletedSuccessfully)\r\n                    {\r\n                        _instructions.RemoveAt(i);\r\n                        i--;\r\n                    }\r\n                }\r\n                else if (current is IRadicalYieldInstruction)\r\n                {\r\n                    object sub;\r\n                    if ((current as IRadicalYieldInstruction).Tick(out sub))\r\n                    {\r\n                        if (sub != null)\r\n                        {\r\n                            _instructions[i] = _handle.StartRadicalCoroutine(this.WaitForRadical(current as IRadicalYieldInstruction));\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        _instructions.RemoveAt(i);\r\n                        i--;\r\n                    }\r\n                }\r\n                else if (current is IEnumerable)\r\n                {\r\n                    var e = (current as IEnumerable).GetEnumerator();\r\n                    _instructions[i] = e;\r\n                    if (e.MoveNext())\r\n                    {\r\n                        if (e.Current != null) _instructions.Add(e.Current);\r\n                    }\r\n                    else\r\n                    {\r\n                        _instructions.RemoveAt(i);\r\n                        i--;\r\n                    }\r\n                }\r\n                else if (current is IEnumerator)\r\n                {\r\n                    var e = current as IEnumerator;\r\n                    if (e.MoveNext())\r\n                    {\r\n                        if (e.Current != null) _instructions.Add(e.Current);\r\n                    }\r\n                    else\r\n                    {\r\n                        _instructions.RemoveAt(i);\r\n                        i--;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    _instructions[i] = null;\r\n                }\r\n            }\r\n\r\n            if (_instructions.Count == 0 && _waitCount <= 0)\r\n            {\r\n                this.SetSignal();\r\n                yieldObject = null;\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                yieldObject = null;\r\n                return true;\r\n            }\r\n        }\r\n\r\n        private IEnumerator WaitForStandard(object inst)\r\n        {\r\n            _waitCount++;\r\n            yield return inst;\r\n            _waitCount--;\r\n        }\r\n\r\n        private IEnumerator WaitForRadical(IRadicalYieldInstruction inst)\r\n        {\r\n            object yieldObject;\r\n            while (inst.Tick(out yieldObject))\r\n            {\r\n                yield return yieldObject;\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n    /// <summary>\r\n    /// A composite yield instruction that waits for any one of multiple instruction to complete before continuing.\r\n    /// </summary>\r\n    public class WaitForAnyComplete : RadicalYieldInstruction\r\n    {\r\n\r\n        private MonoBehaviour _handle;\r\n        private System.Collections.Generic.List<object> _instructions;\r\n        private System.Collections.Generic.List<object> _waitingRoutines = new System.Collections.Generic.List<object>();\r\n        private bool _signalNextTime;\r\n        private object _signaledInstruction;\r\n\r\n        public WaitForAnyComplete(MonoBehaviour handle, params object[] instructions)\r\n        {\r\n            _handle = handle;\r\n            _instructions = new System.Collections.Generic.List<object>(instructions);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The instruction that caused this WaitForAny to signal complete.\r\n        /// </summary>\r\n        public object SignaledInstruction\r\n        {\r\n            get { return _signaledInstruction; }\r\n        }\r\n\r\n        protected override void SetSignal()\r\n        {\r\n            object obj;\r\n            for (int i = 0; i < _waitingRoutines.Count; i++)\r\n            {\r\n                obj = _waitingRoutines[i];\r\n                if (obj is Coroutine)\r\n                    _handle.StopCoroutine(obj as Coroutine);\r\n                else if (obj is RadicalCoroutine)\r\n                    (obj as RadicalCoroutine).Cancel();\r\n            }\r\n            _waitingRoutines.Clear();\r\n            base.SetSignal();\r\n        }\r\n\r\n        protected override bool Tick(out object yieldObject)\r\n        {\r\n            yieldObject = null;\r\n            if (this.IsComplete) return false;\r\n            if (_signalNextTime)\r\n            {\r\n                this.SetSignal();\r\n                return false;\r\n            }\r\n\r\n            _signaledInstruction = null;\r\n            object current;\r\n            for (int i = 0; i < _instructions.Count; i++)\r\n            {\r\n                current = _instructions[i];\r\n                if (current == null)\r\n                {\r\n                    _signalNextTime = true;\r\n                }\r\n                else if (current is YieldInstruction || current is WWW)\r\n                {\r\n                    _instructions.RemoveAt(i);\r\n                    i--;\r\n                    _waitingRoutines.Add(_handle.StartCoroutine(this.WaitForStandard(current)));\r\n                }\r\n                else if (current is RadicalCoroutine)\r\n                {\r\n                    if ((current as RadicalCoroutine).CompletedSuccessfully)\r\n                    {\r\n                        _signaledInstruction = current;\r\n                        this.SetSignal();\r\n                        return false;\r\n                    }\r\n                }\r\n                else if (current is IRadicalYieldInstruction)\r\n                {\r\n                    object sub;\r\n                    if ((current as IRadicalYieldInstruction).Tick(out sub))\r\n                    {\r\n                        if (sub != null)\r\n                        {\r\n                            _instructions.RemoveAt(i);\r\n                            i--;\r\n                            _waitingRoutines.Add(_handle.StartRadicalCoroutine(this.WaitForRadical(current)));\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        _signaledInstruction = current;\r\n                        this.SetSignal();\r\n                        return false;\r\n                    }\r\n                }\r\n                else if (current is IEnumerator || current is IEnumerable)\r\n                {\r\n                    _instructions.RemoveAt(i);\r\n                    i--;\r\n                    _waitingRoutines.Add(_handle.StartRadicalCoroutine(this.WaitForRadical(current)));\r\n                }\r\n                else\r\n                {\r\n                    _signalNextTime = true;\r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        private IEnumerator WaitForStandard(object inst)\r\n        {\r\n            yield return inst;\r\n            if (!this.IsComplete)\r\n                _signaledInstruction = inst;\r\n            this.SetSignal();\r\n        }\r\n\r\n        private IEnumerator WaitForRadical(object inst)\r\n        {\r\n            yield return inst;\r\n            if (!this.IsComplete)\r\n                _signaledInstruction = inst;\r\n            this.SetSignal();\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/WaitForDuration.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Represents a duration of time to wait for that can be paused, and can use various kinds of TimeSuppliers. \r\n    /// Reset must be called if reused.\r\n    /// \r\n    /// NOTE - If you use the WaitForDuration objects that are spawned by the static factory methods, these objects are \r\n    /// pooled. The WaitForDuration object should be yielded immediately in a RadicalCoroutine and not reused.\r\n    /// </summary>\r\n    public class WaitForDuration : IRadicalEnumerator, IPausibleYieldInstruction, IProgressingYieldInstruction\r\n    {\r\n\r\n#if SP_LIB\r\n\r\n        #region Events\r\n\r\n        public event System.EventHandler OnComplete;\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        private ITimeSupplier _supplier;\r\n        private double _t;\r\n        private double _lastTotal;\r\n        private float _dur;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public WaitForDuration(float dur, ITimeSupplier supplier)\r\n        {\r\n            this.Reset(dur, supplier);\r\n        }\r\n\r\n        internal WaitForDuration()\r\n        {\r\n            //allow overriding\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float Duration { get { return _dur; } }\r\n\r\n        public double CurrentTime { get { return _t; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Reset()\r\n        {\r\n            _t = 0d;\r\n            _lastTotal = double.NegativeInfinity;\r\n        }\r\n\r\n        public void Reset(float dur, ITimeSupplier supplier)\r\n        {\r\n            _supplier = supplier ?? SPTime.Normal;\r\n            _dur = dur;\r\n            _t = 0d;\r\n            _lastTotal = double.NegativeInfinity;\r\n        }\r\n\r\n        public void Cancel()\r\n        {\r\n            _t = double.PositiveInfinity;\r\n            _lastTotal = double.NegativeInfinity;\r\n        }\r\n\r\n        private bool Tick()\r\n        {\r\n            if (this.IsComplete) return false;\r\n\r\n            if (double.IsNaN(_lastTotal))\r\n            {\r\n                //we're paused\r\n            }\r\n            else if (double.IsNegativeInfinity(_lastTotal))\r\n            {\r\n                //first time being called\r\n                _lastTotal = _supplier.TotalPrecise;\r\n                if (_dur <= 0f && _t <= 0d && this.OnComplete != null)\r\n                {\r\n                    _t = 0d;\r\n                    this.OnComplete(this, System.EventArgs.Empty);\r\n                    return false;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                _t += (_supplier.TotalPrecise - _lastTotal);\r\n                _lastTotal = _supplier.TotalPrecise;\r\n                if (this.OnComplete != null && this.IsComplete)\r\n                {\r\n                    this.OnComplete(this, System.EventArgs.Empty);\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            return !this.IsComplete;\r\n        }\r\n\r\n        protected void Dispose()\r\n        {\r\n            this.OnComplete = null;\r\n            _supplier = null;\r\n            _t = 0d;\r\n            _lastTotal = float.NegativeInfinity;\r\n            _dur = 0f;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalYieldInstruction Interface\r\n\r\n        public bool IsComplete\r\n        {\r\n            get { return _t >= _dur; }\r\n        }\r\n\r\n        float IProgressingYieldInstruction.Progress\r\n        {\r\n            get { return Mathf.Clamp01((float)(_t / _dur)); }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            yieldObject = null;\r\n            return this.Tick();\r\n        }\r\n\r\n        void IPausibleYieldInstruction.OnPause()\r\n        {\r\n            _lastTotal = double.NaN;\r\n        }\r\n\r\n        void IPausibleYieldInstruction.OnResume()\r\n        {\r\n            _lastTotal = _supplier.TotalPrecise;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerator Interface\r\n\r\n        object IEnumerator.Current\r\n        {\r\n            get\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        bool IEnumerator.MoveNext()\r\n        {\r\n            if (this.Tick())\r\n            {\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                //in case a PooledYieldInstruction was used in a regular Unity Coroutine\r\n                if (this is IPooledYieldInstruction)\r\n                    (this as IPooledYieldInstruction).Dispose();\r\n                return false;\r\n            }\r\n        }\r\n\r\n        void IEnumerator.Reset()\r\n        {\r\n            this.Reset();\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region Static Interface\r\n\r\n        private static com.spacepuppy.Collections.ObjectCachePool<PooledWaitForDuration> _pool = new com.spacepuppy.Collections.ObjectCachePool<PooledWaitForDuration>(-1, () => new PooledWaitForDuration());\r\n        private class PooledWaitForDuration : WaitForDuration, IPooledYieldInstruction\r\n        {\r\n\r\n            void System.IDisposable.Dispose()\r\n            {\r\n                this.Dispose();\r\n                _pool.Release(this);\r\n            }\r\n\r\n        }\r\n\r\n        /// <summary>\r\n        /// Create a WaitForDuration in seconds as a pooled object.\r\n        /// \r\n        /// NOTE - This retrieves a pooled WaitForDuration that should be used only once. It should be immediately yielded and not used again.\r\n        /// </summary>\r\n        /// <param name=\"seconds\"></param>\r\n        /// <param name=\"supplier\"></param>\r\n        /// <returns></returns>\r\n        public static WaitForDuration Seconds(float seconds, ITimeSupplier supplier = null)\r\n        {\r\n            var w = _pool.GetInstance();\r\n            w.Reset(seconds, supplier);\r\n            return w;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Create a WaitForDuration from a WaitForSeconds object as a pooled object.\r\n        /// \r\n        /// NOTE - This retrieves a pooled WaitForDuration that should be used only once. It should be immediately yielded and not used again.\r\n        /// </summary>\r\n        /// <param name=\"wait\"></param>\r\n        /// <param name=\"returnNullIfZero\"></param>\r\n        /// <returns></returns>\r\n        public static WaitForDuration FromWaitForSeconds(WaitForSeconds wait, bool returnObjEvenIfZero = false)\r\n        {\r\n            //var dur = ConvertUtil.ToSingle(DynamicUtil.GetValue(wait, \"m_Seconds\"));\r\n            var field = typeof(WaitForSeconds).GetField(\"m_Seconds\", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);\r\n            float dur = (float)field.GetValue(wait);\r\n            if (dur <= 0f && !returnObjEvenIfZero)\r\n            {\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                var w = _pool.GetInstance();\r\n                w.Reset(dur, SPTime.Normal);\r\n                return w;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Create a WaitForDuration from a SPTimePeriod as a pooled object.\r\n        /// \r\n        /// NOTE - This retrieves a pooled WaitForDuration that should be used only once. It should be immediately yielded and not used again.\r\n        /// </summary>\r\n        /// <param name=\"period\"></param>\r\n        /// <returns></returns>\r\n        public static WaitForDuration Period(SPTimePeriod period)\r\n        {\r\n            var w = _pool.GetInstance();\r\n            w.Reset((float)period.Seconds, period.TimeSupplier);\r\n            return w;\r\n        }\r\n\r\n        #endregion\r\n\r\n#else\r\n\r\n        #region Events\r\n\r\n        public event System.EventHandler OnComplete;\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n        \r\n        private double _t;\r\n        private double _lastTotal;\r\n        private float _dur;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public WaitForDuration(float dur)\r\n        {\r\n            this.Reset(dur);\r\n        }\r\n\r\n        internal WaitForDuration()\r\n        {\r\n            //allow overriding\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float Duration { get { return _dur; } }\r\n\r\n        public double CurrentTime { get { return _t; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Reset()\r\n        {\r\n            _t = 0d;\r\n            _lastTotal = double.NegativeInfinity;\r\n        }\r\n\r\n        public void Reset(float dur)\r\n        {\r\n            _dur = dur;\r\n            _t = 0d;\r\n            _lastTotal = double.NegativeInfinity;\r\n        }\r\n\r\n        public void Cancel()\r\n        {\r\n            _t = double.PositiveInfinity;\r\n            _lastTotal = double.NegativeInfinity;\r\n        }\r\n\r\n        private bool Tick()\r\n        {\r\n            if (this.IsComplete) return false;\r\n\r\n            if (double.IsNaN(_lastTotal))\r\n            {\r\n                //we're paused\r\n            }\r\n            else if (_lastTotal == double.NegativeInfinity)\r\n            {\r\n                //first time being called\r\n                _lastTotal = Time.time;\r\n                if (_dur <= 0f && _t <= 0d && this.OnComplete != null)\r\n                {\r\n                    _t = 0d;\r\n                    this.OnComplete(this, System.EventArgs.Empty);\r\n                    return false;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                _t += (Time.time - _lastTotal);\r\n                _lastTotal = Time.time;\r\n                if (this.OnComplete != null && this.IsComplete)\r\n                {\r\n                    this.OnComplete(this, System.EventArgs.Empty);\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            return !this.IsComplete;\r\n        }\r\n\r\n        protected void Dispose()\r\n        {\r\n            this.OnComplete = null;\r\n            _t = 0d;\r\n            _lastTotal = float.NegativeInfinity;\r\n            _dur = 0f;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalYieldInstruction Interface\r\n\r\n        public bool IsComplete\r\n        {\r\n            get { return _t >= _dur; }\r\n        }\r\n\r\n        float IProgressingYieldInstruction.Progress\r\n        {\r\n            get { return Mathf.Clamp01((float)(_t / _dur)); }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            yieldObject = null;\r\n            return this.Tick();\r\n        }\r\n\r\n        void IPausibleYieldInstruction.OnPause()\r\n        {\r\n            _lastTotal = double.NaN;\r\n        }\r\n\r\n        void IPausibleYieldInstruction.OnResume()\r\n        {\r\n            _lastTotal = Time.time;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerator Interface\r\n\r\n        object IEnumerator.Current\r\n        {\r\n            get\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        bool IEnumerator.MoveNext()\r\n        {\r\n            if (this.Tick())\r\n            {\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                //in case a PooledYieldInstruction was used in a regular Unity Coroutine\r\n                if (this is IPooledYieldInstruction)\r\n                    (this as IPooledYieldInstruction).Dispose();\r\n                return false;\r\n            }\r\n        }\r\n\r\n        void IEnumerator.Reset()\r\n        {\r\n            this.Reset();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n\r\n        private static com.spacepuppy.Collections.ObjectCachePool<PooledWaitForDuration> _pool = new com.spacepuppy.Collections.ObjectCachePool<PooledWaitForDuration>(-1, () => new PooledWaitForDuration());\r\n        private class PooledWaitForDuration : WaitForDuration, IPooledYieldInstruction\r\n        {\r\n\r\n            void System.IDisposable.Dispose()\r\n            {\r\n                this.Dispose();\r\n                _pool.Release(this);\r\n            }\r\n\r\n        }\r\n\r\n        /// <summary>\r\n        /// Create a WaitForDuration in seconds as a pooled object.\r\n        /// \r\n        /// NOTE - This retrieves a pooled WaitForDuration that should be used only once. It should be immediately yielded and not used again.\r\n        /// </summary>\r\n        /// <param name=\"seconds\"></param>\r\n        /// <param name=\"supplier\"></param>\r\n        /// <returns></returns>\r\n        public static WaitForDuration Seconds(float seconds)\r\n        {\r\n            var w = _pool.GetInstance();\r\n            w.Reset(seconds);\r\n            return w;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Create a WaitForDuration from a WaitForSeconds object as a pooled object.\r\n        /// \r\n        /// NOTE - This retrieves a pooled WaitForDuration that should be used only once. It should be immediately yielded and not used again.\r\n        /// </summary>\r\n        /// <param name=\"wait\"></param>\r\n        /// <param name=\"returnNullIfZero\"></param>\r\n        /// <returns></returns>\r\n        public static WaitForDuration FromWaitForSeconds(WaitForSeconds wait, bool returnObjEvenIfZero = false)\r\n        {\r\n            //var dur = ConvertUtil.ToSingle(DynamicUtil.GetValue(wait, \"m_Seconds\"));\r\n            var field = typeof(WaitForSeconds).GetField(\"m_Seconds\", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);\r\n            float dur = (float)field.GetValue(wait);\r\n            if (dur <= 0f && !returnObjEvenIfZero)\r\n            {\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                var w = _pool.GetInstance();\r\n                w.Reset(dur);\r\n                return w;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n#endif\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/WaitForLateUpdate.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n    public sealed class WaitForLateUpdate : IImmediatelyResumingYieldInstruction\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private System.EventHandler _signal;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private WaitForLateUpdate()\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalYieldInstruction Interface\r\n\r\n        bool IRadicalYieldInstruction.IsComplete\r\n        {\r\n            get\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            yieldObject = null;\r\n            return true;\r\n        }\r\n\r\n        event System.EventHandler IImmediatelyResumingYieldInstruction.Signal\r\n        {\r\n            add\r\n            {\r\n                if (_signal == null)\r\n                    _signal = value;\r\n                else if (_signal == value)\r\n                    return;\r\n                else\r\n                    _signal += value;\r\n            }\r\n            remove\r\n            {\r\n                if (_signal == null)\r\n                    return;\r\n                else if (_signal == value)\r\n                    _signal = null;\r\n                else\r\n                    _signal -= value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Factory\r\n\r\n        /*\r\n        private static WaitForLateUpdate _handle;\r\n        private static bool _active;\r\n        private static EventHandler _onLateUpdateCallback;\r\n        private static EventHandler OnLateUpdateCallback\r\n        {\r\n            get\r\n            {\r\n                if (_onLateUpdateCallback == null)\r\n                    _onLateUpdateCallback = (s, e) =>\r\n                    {\r\n                        GameLoopEntry.OnLateUpdate -= OnLateUpdateCallback;\r\n                        _active = false;\r\n                        if (_handle != null && _handle._signal != null)\r\n                        {\r\n                            _handle._signal(_handle, EventArgs.Empty);\r\n                        }\r\n                    };\r\n                return _onLateUpdateCallback;\r\n            }\r\n        }\r\n\r\n        public static WaitForLateUpdate Create()\r\n        {\r\n            if (_handle == null)\r\n                _handle = new WaitForLateUpdate();\r\n            \r\n            if(!_active)\r\n            {\r\n                _active = true;\r\n                GameLoopEntry.OnLateUpdate += OnLateUpdateCallback;\r\n            }\r\n\r\n            return _handle;\r\n        }\r\n        */\r\n\r\n        private static WaitForLateUpdate _handle;\r\n        private static PumpToken _token;\r\n        public static WaitForLateUpdate Create()\r\n        {\r\n            if (_handle == null) _handle = new WaitForLateUpdate();\r\n            if (_token == null)\r\n            {\r\n                _token = new PumpToken();\r\n                GameLoopEntry.LateUpdatePump.Add(_token);\r\n            }\r\n            return _handle;\r\n        }\r\n\r\n        private class PumpToken : IUpdateable\r\n        {\r\n            void IUpdateable.Update()\r\n            {\r\n                if (_handle != null && _handle._signal != null)\r\n                {\r\n                    _handle._signal(_handle, EventArgs.Empty);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/WaitForNotification.cs",
    "content": "﻿\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Blocks until the dispatcher fires some notification. See the notification system in com.spacepuppy.Notification.\r\n    /// </summary>\r\n    /// <typeparam name=\"T\"></typeparam>\r\n    public class WaitForNotification<T> : ImmediatelyResumingYieldInstruction where T : Notification\r\n    {\r\n\r\n        private INotificationDispatcher _dispatcher;\r\n        private T _notification;\r\n        private System.Func<T, bool> _ignoreCheck;\r\n\r\n        public WaitForNotification(INotificationDispatcher dispatcher, System.Func<T, bool> ignoreCheck = null)\r\n        {\r\n            _dispatcher = dispatcher;\r\n            _dispatcher.Observers.RegisterObserver<T>(this.OnNotification);\r\n            _ignoreCheck = ignoreCheck;\r\n        }\r\n\r\n        public T Notification { get { return _notification; } }\r\n\r\n        private void OnNotification(object sender, T n)\r\n        {\r\n            if (_ignoreCheck != null && _ignoreCheck(n)) return;\r\n\r\n            _notification = n;\r\n            _dispatcher.Observers.RemoveObserver<T>(this.OnNotification);\r\n            this.SetSignal();\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBase/WaitUntilTime.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    public class WaitUntilTime : IRadicalEnumerator\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private ITimeSupplier _timeSupplier;\r\n        private float _finishTime;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected WaitUntilTime()\r\n        {\r\n            //for resusable factory\r\n        }\r\n\r\n        public WaitUntilTime(float time, ITimeSupplier timeSupplier)\r\n        {\r\n            this.Init(time, timeSupplier);\r\n        }\r\n\r\n        private void Init(float time, ITimeSupplier timeSupplier)\r\n        {\r\n            _finishTime = time;\r\n            _timeSupplier = timeSupplier ?? SPTime.Normal;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected void Dispose()\r\n        {\r\n            _timeSupplier = null;\r\n            _finishTime = 0f;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IRadicalYieldInstruction Interface\r\n\r\n        public bool IsComplete\r\n        {\r\n            get\r\n            {\r\n                return _timeSupplier.Total >= _finishTime;\r\n            }\r\n        }\r\n\r\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\r\n        {\r\n            yieldObject = null;\r\n            return !this.IsComplete;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerator Interface\r\n\r\n        object IEnumerator.Current\r\n        {\r\n            get\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        bool IEnumerator.MoveNext()\r\n        {\r\n            return !this.IsComplete;\r\n        }\r\n\r\n        void IEnumerator.Reset()\r\n        {\r\n            //this.Reset();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Factory\r\n\r\n        private static com.spacepuppy.Collections.ObjectCachePool<PooledWaitForNextInterval> _pool = new com.spacepuppy.Collections.ObjectCachePool<PooledWaitForNextInterval>(-1, () => new PooledWaitForNextInterval());\r\n        private class PooledWaitForNextInterval : WaitUntilTime, IPooledYieldInstruction\r\n        {\r\n\r\n            void System.IDisposable.Dispose()\r\n            {\r\n                this.Dispose();\r\n                _pool.Release(this);\r\n            }\r\n\r\n        }\r\n\r\n        public WaitUntilTime Time(float time, ITimeSupplier timeSupplier = null)\r\n        {\r\n            var obj = _pool.GetInstance();\r\n            obj.Init(time, timeSupplier);\r\n            return obj;\r\n        }\r\n\r\n        public WaitUntilTime NextInterval(float interval, ITimeSupplier timeSupplier = null)\r\n        {\r\n            var obj = _pool.GetInstance();\r\n            var ts = timeSupplier ?? SPTime.Normal;\r\n            float t = MathUtil.FloorToInterval(ts.Total, interval) + interval;\r\n            obj.Init(t, ts);\r\n            return obj;\r\n        }\r\n\r\n        public WaitUntilTime NextInterval(float interval, float offset, ITimeSupplier timeSupplier = null)\r\n        {\r\n            var obj = _pool.GetInstance();\r\n            var ts = timeSupplier ?? SPTime.Normal;\r\n            float t = MathUtil.FloorToInterval(ts.Total, interval, offset) + interval;\r\n            obj.Init(t, ts);\r\n            return obj;\r\n        }\r\n\r\n        public WaitUntilTime NextInterval(SPTimePeriod interval)\r\n        {\r\n            var obj = _pool.GetInstance();\r\n            var ts = interval.TimeSupplier ?? SPTime.Normal;\r\n            float t = MathUtil.FloorToInterval(ts.Total, interval.Seconds) + interval.Seconds;\r\n            obj.Init(t, ts);\r\n            return obj;\r\n        }\r\n\r\n        public WaitUntilTime NextInterval(SPTimePeriod interval, float offset)\r\n        {\r\n            var obj = _pool.GetInstance();\r\n            var ts = interval.TimeSupplier ?? SPTime.Normal;\r\n            float t = MathUtil.FloorToInterval(ts.Total, interval.Seconds, offset) + interval.Seconds;\r\n            obj.Init(t, ts);\r\n            return obj;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/AssetHelper.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.IO;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n    public static class AssetHelper\r\n    {\r\n\r\n        public static string ProjectPath\r\n        {\r\n            get\r\n            {\r\n                return Path.GetDirectoryName(Application.dataPath);\r\n            }\r\n        }\r\n\r\n        public static string GetRelativeResourcePath(string spath)\r\n        {\r\n            if (string.IsNullOrEmpty(spath)) return string.Empty;\r\n\r\n            int i = spath.IndexOf(\"Resources\") + 9;\r\n            if (i >= spath.Length) return string.Empty;\r\n\r\n            spath = spath.Substring(i);\r\n            spath = Path.Combine(Path.GetDirectoryName(spath), Path.GetFileNameWithoutExtension(spath)).Replace(@\"\\\", \"/\");\r\n            return spath.EnsureNotStartWith(\"/\");\r\n        }\r\n\r\n        public static void MoveFolder(string fromPath, string toPath)\r\n        {\r\n            fromPath = Path.Combine(AssetHelper.ProjectPath, fromPath);\r\n            toPath = Path.Combine(AssetHelper.ProjectPath, toPath);\r\n\r\n            if(Directory.Exists(fromPath) && !Directory.Exists(toPath))\r\n            {\r\n                Directory.Move(fromPath, toPath);\r\n                File.Move(fromPath + \".meta\", toPath + \".meta\");\r\n            }\r\n            else\r\n            {\r\n                throw new DirectoryNotFoundException();\r\n            }\r\n        }\r\n\r\n\r\n        public static string GetSelectedPath()\r\n        {\r\n            string path = \"Assets\";\r\n\r\n            foreach (var obj in Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets))\r\n            {\r\n                path = AssetDatabase.GetAssetPath(obj);\r\n                if (!string.IsNullOrEmpty(path) && System.IO.File.Exists(path))\r\n                {\r\n                    path = System.IO.Path.GetDirectoryName(path);\r\n                    break;\r\n                }\r\n            }\r\n\r\n            return path;\r\n        }\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/AdvancedInputManagerWindow.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppyeditor;\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    public class AdvancedInputManagerWindow : EditorWindow\r\n    {\r\n\r\n        #region Consts\r\n\r\n        public const string MENU_NAME = SPMenu.MENU_NAME_SETTINGS + \"/Advanced Input Manager\";\r\n        public const int MENU_PRIORITY = SPMenu.MENU_PRIORITY_SETTINGS;\r\n        \r\n        #endregion\r\n\r\n        #region Menu Entries\r\n\r\n        [MenuItem(MENU_NAME, priority = MENU_PRIORITY)]\r\n        public static void OpenAdvancedInputManager()\r\n        {\r\n            if (_openWindow == null)\r\n            {\r\n                EditorWindow.GetWindow<AdvancedInputManagerWindow>();\r\n            }\r\n            else\r\n            {\r\n                GUI.BringWindowToFront(_openWindow.GetInstanceID());\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Window\r\n\r\n        private static AdvancedInputManagerWindow _openWindow;\r\n\r\n        private SerializedObject _inputManagerAsset;\r\n        private SPReorderableList _axesList;\r\n        private Vector2 _scrollPos = Vector2.zero;\r\n\r\n\r\n        private void OnEnable()\r\n        {\r\n            if (_openWindow == null)\r\n                _openWindow = this;\r\n            else\r\n                Object.DestroyImmediate(this);\r\n\r\n            this.titleContent = new GUIContent(\"Advanced Input Manager\");\r\n\r\n            var asset = AssetDatabase.LoadAllAssetsAtPath(\"ProjectSettings/InputManager.asset\").FirstOrDefault();\r\n            if (asset != null)\r\n            {\r\n                _inputManagerAsset = new SerializedObject(asset);\r\n                _axesList = new SPReorderableList(_inputManagerAsset, _inputManagerAsset.FindProperty(InputSettings.PROP_AXES));\r\n                _axesList.elementHeight = EditorGUIUtility.singleLineHeight;\r\n                _axesList.drawHeaderCallback = _axesList_DrawHeader;\r\n                _axesList.drawElementCallback = _axesList_DrawElement;\r\n            }\r\n        }\r\n\r\n        private void OnDisable()\r\n        {\r\n            if (_openWindow == this) _openWindow = null;\r\n            if (_inputManagerAsset != null)\r\n            {\r\n                _inputManagerAsset.Dispose();\r\n                _inputManagerAsset = null;\r\n            }\r\n        }\r\n\r\n        private void OnGUI()\r\n        {\r\n            if (_inputManagerAsset == null)\r\n            {\r\n                EditorGUILayout.LabelField(\"NO INPUT MANAGER EXISTS.\");\r\n                return;\r\n            }\r\n\r\n            _inputManagerAsset.Update();\r\n            EditorGUI.BeginChangeCheck();\r\n\r\n            const float MARGIN_BOTTOM = 15f;\r\n            float lstHeight = _axesList.GetHeight();\r\n            float otherHeight = (_axesList.index >= 0 && _axesList.index < _axesList.serializedProperty.arraySize) ? EditorGUI.GetPropertyHeight(_axesList.serializedProperty.GetArrayElementAtIndex(_axesList.index)) : 0f;\r\n            float totalHeight = lstHeight + otherHeight + MARGIN_BOTTOM;\r\n            if(totalHeight > this.position.height)\r\n            {\r\n                _scrollPos = EditorGUILayout.BeginScrollView(_scrollPos, GUILayout.Height(this.position.height - otherHeight - MARGIN_BOTTOM));\r\n                _axesList.DoLayoutList();\r\n                EditorGUILayout.EndScrollView();\r\n            }\r\n            else\r\n            {\r\n                _scrollPos = Vector2.zero;\r\n                _axesList.DoLayoutList();\r\n            }\r\n\r\n            this.DrawCurrentElementExtended();\r\n\r\n            if (EditorGUI.EndChangeCheck())\r\n                _inputManagerAsset.ApplyModifiedProperties();\r\n        }\r\n\r\n        private void DrawCurrentElementExtended()\r\n        {\r\n            if (_axesList.index < 0 || _axesList.index >= _axesList.serializedProperty.arraySize) return;\r\n\r\n            var el = _axesList.serializedProperty.GetArrayElementAtIndex(_axesList.index);\r\n            el.isExpanded = true;\r\n            EditorGUILayout.PropertyField(el, true);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region List Drawer Methods\r\n\r\n        private void _axesList_DrawHeader(Rect area)\r\n        {\r\n            EditorGUI.LabelField(area, \"Inputs\");\r\n        }\r\n\r\n        private void _axesList_DrawElement(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            var el = _axesList.serializedProperty.GetArrayElementAtIndex(index);\r\n            var nameProp = el.FindPropertyRelative(\"m_Name\");\r\n            EditorGUI.PropertyField(area, nameProp, EditorHelper.TempContent(string.Format(\"Input {0:00}\", index)));\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Commands/ComponentSearchWindow.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base.Commands\r\n{\r\n    public class ComponentSearchWindow : EditorWindow\r\n    {\r\n\r\n        public const string MENU_NAME = SPMenu.MENU_NAME_ROOT + \"/Find References To Scripts\";\r\n        public const int MENU_PRIORITY = SPMenu.MENU_PRIORITY_GROUP2;\r\n\r\n        #region Singleton\r\n\r\n        private static ComponentSearchWindow _window;\r\n\r\n        private void OnEnable()\r\n        {\r\n            if (_window == null) _window = this;\r\n            else Object.DestroyImmediate(this);\r\n        }\r\n\r\n        private void OnDisable()\r\n        {\r\n            if (_window == this) _window = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Menu Entries\r\n\r\n        [MenuItem(MENU_NAME, priority = MENU_PRIORITY)]\r\n        private static void OpenFromMenu()\r\n        {\r\n            if(_window == null)\r\n            {\r\n                _window = EditorWindow.GetWindow<ComponentSearchWindow>();\r\n                _window.Show();\r\n                _window.position = new Rect(20, 80, 500, 300);\r\n            }\r\n            else\r\n            {\r\n                _window.Focus();\r\n            }\r\n        }\r\n\r\n        [MenuItem(\"Assets/Find References In Prefabs\")]\r\n        private static void DoFind(MenuCommand data)\r\n        {\r\n            var script = Selection.activeObject as MonoScript;\r\n            if (script == null) return;\r\n\r\n            var klass = script.GetClass();\r\n            if (typeof(Component).IsAssignableFrom(klass))\r\n            {\r\n                if (_window == null)\r\n                {\r\n                    _window = EditorWindow.GetWindow<ComponentSearchWindow>();\r\n                    _window._mode = 0;\r\n                    _window._targetScript = script.GetClass();\r\n                    _window._forceRefresh = true;\r\n                    _window.Show();\r\n                    _window.position = new Rect(20, 80, 500, 300);\r\n                }\r\n                else\r\n                {\r\n                    _window._mode = 0;\r\n                    _window._targetScript = script.GetClass();\r\n                    _window._forceRefresh = true;\r\n                    _window.Focus();\r\n                }\r\n            }\r\n        }\r\n\r\n        [MenuItem(\"Assets/Find References In Prefabs\", validate = true)]\r\n        private static bool ValidateDoFind(MenuCommand data)\r\n        {\r\n            return Selection.activeObject is MonoScript;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        private string[] _modes = new string[] { \"Search for component usage in Prefabs\", \"Search for component usage in Scene\", \"Search for missing components in Prefabs\", \"Search for missing components in Scene\" };\r\n        private int _mode;\r\n\r\n        private List<string> _prefabResults = new List<string>();\r\n        private List<GameObject> _sceneResults = new List<GameObject>();\r\n        private bool _forceRefresh;\r\n\r\n        private System.Type _targetScript;\r\n\r\n        private Vector2 _scrollPos;\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void OnGUI()\r\n        {\r\n            //draw header\r\n            GUILayout.Space(3);\r\n            EditorGUI.BeginChangeCheck();\r\n            _mode = SPEditorGUILayout.SelectionTabs(_mode, _modes, 2);\r\n            if(EditorGUI.EndChangeCheck())\r\n            {\r\n                _prefabResults.Clear();\r\n                _sceneResults.Clear();\r\n                _forceRefresh = true;\r\n            }\r\n            GUILayout.Space(3);\r\n\r\n            switch(_mode)\r\n            {\r\n                case 0:\r\n                    EditorGUI.BeginChangeCheck();\r\n                    _targetScript = SPEditorGUILayout.TypeDropDown(GUIContent.none, typeof(Component), _targetScript, false, false);\r\n                    if (EditorGUI.EndChangeCheck() || _forceRefresh)\r\n                    {\r\n                        this.FillBySearchForComponentUsage(false);\r\n                    }\r\n                    if (_prefabResults.Count == 0)\r\n                    {\r\n                        var msgStyle = new GUIStyle(GUI.skin.label);\r\n                        msgStyle.alignment = TextAnchor.MiddleCenter;\r\n                        msgStyle.fontStyle = FontStyle.Bold;\r\n                        string msg = (_targetScript == null) ? \"Choose a script file.\" : \"No prefabs use component \" + _targetScript.FullName;\r\n                        EditorGUI.LabelField(new Rect(0f, this.position.height / 2f, this.position.width, EditorGUIUtility.singleLineHeight), msg, msgStyle);\r\n                    }\r\n                    else\r\n                    {\r\n                        this.DoDrawPrefabList();\r\n                    }\r\n                    break;\r\n                case 1:\r\n                    EditorGUI.BeginChangeCheck();\r\n                    _targetScript = SPEditorGUILayout.TypeDropDown(GUIContent.none, typeof(Component), _targetScript, false, false);\r\n                    if (EditorGUI.EndChangeCheck() || _forceRefresh)\r\n                    {\r\n                        this.FillBySearchForComponentUsage(true);\r\n                    }\r\n                    if (_prefabResults.Count == 0)\r\n                    {\r\n                        var msgStyle = new GUIStyle(GUI.skin.label);\r\n                        msgStyle.alignment = TextAnchor.MiddleCenter;\r\n                        msgStyle.fontStyle = FontStyle.Bold;\r\n                        string msg = (_targetScript == null) ? \"Choose a script file.\" : \"No scene objects use component \" + _targetScript.FullName;\r\n                        EditorGUI.LabelField(new Rect(0f, this.position.height / 2f, this.position.width, EditorGUIUtility.singleLineHeight), msg, msgStyle);\r\n                    }\r\n                    else\r\n                    {\r\n                        this.DoDrawSceneList();\r\n                    }\r\n                    break;\r\n                case 2:\r\n                    if(GUILayout.Button(\"Search!\"))\r\n                    {\r\n                        this.FillBySearchForMissingComponents(false);\r\n                    }\r\n                    if (_prefabResults.Count == 0)\r\n                    {\r\n                        var msgStyle = new GUIStyle(GUI.skin.label);\r\n                        msgStyle.alignment = TextAnchor.MiddleCenter;\r\n                        msgStyle.fontStyle = FontStyle.Bold;\r\n                        EditorGUI.LabelField(new Rect(0f, this.position.height / 2f, this.position.width, EditorGUIUtility.singleLineHeight * 2f), \"No prefabs are missing any script references!\\nClick Search to check again.\", msgStyle);\r\n                    }\r\n                    else\r\n                    {\r\n                        this.DoDrawPrefabList();\r\n                    }\r\n                    break;\r\n                case 3:\r\n                    if(GUILayout.Button(\"Search!\"))\r\n                    {\r\n                        this.FillBySearchForMissingComponents(true);\r\n                    }\r\n                    if (_prefabResults.Count == 0)\r\n                    {\r\n                        var msgStyle = new GUIStyle(GUI.skin.label);\r\n                        msgStyle.alignment = TextAnchor.MiddleCenter;\r\n                        msgStyle.fontStyle = FontStyle.Bold;\r\n                        EditorGUI.LabelField(new Rect(0f, this.position.height / 2f, this.position.width, EditorGUIUtility.singleLineHeight * 2f), \"No scene objects are missing any script references!\\nClick Search to check again.\", msgStyle);\r\n                    }\r\n                    else\r\n                    {\r\n                        this.DoDrawSceneList();\r\n                    }\r\n                    break;\r\n            }\r\n\r\n            _forceRefresh = false;\r\n        }\r\n\r\n        private void DoDrawPrefabList()\r\n        {\r\n            _scrollPos = GUILayout.BeginScrollView(_scrollPos);\r\n            float w = this.position.width - 10f;\r\n            float lw = w * 0.8f;\r\n            float bw = w * 0.2f;\r\n            foreach(var p in _prefabResults)\r\n            {\r\n                GUILayout.BeginHorizontal();\r\n                GUILayout.Label(p, GUILayout.Width(lw));\r\n                if(GUILayout.Button(\"Select\", GUILayout.Width(bw)))\r\n                {\r\n                    EditorGUIUtility.PingObject(AssetDatabase.LoadMainAssetAtPath(p));\r\n                }\r\n                GUILayout.EndHorizontal();\r\n            }\r\n            GUILayout.EndScrollView();\r\n        }\r\n\r\n        private void DoDrawSceneList()\r\n        {\r\n            _scrollPos = GUILayout.BeginScrollView(_scrollPos);\r\n            float w = this.position.width - 10f;\r\n            float lw = w * 0.8f;\r\n            float bw = w * 0.2f;\r\n            foreach (var go in _sceneResults)\r\n            {\r\n                GUILayout.BeginHorizontal();\r\n                GUILayout.Label(go.transform.GetFullPathName(), GUILayout.Width(lw));\r\n                if (GUILayout.Button(\"Select\", GUILayout.Width(bw)))\r\n                {\r\n                    Selection.activeObject = go;\r\n                }\r\n                GUILayout.EndHorizontal();\r\n            }\r\n            GUILayout.EndScrollView();\r\n        }\r\n\r\n\r\n\r\n\r\n        private void FillBySearchForComponentUsage(bool testScene)\r\n        {\r\n            _prefabResults.Clear();\r\n            _sceneResults.Clear();\r\n\r\n            if (_targetScript != null)\r\n            {\r\n                if(testScene)\r\n                {\r\n                    foreach (var go in GameObject.FindObjectsOfType<GameObject>())\r\n                    {\r\n                        if (go.HasComponent(_targetScript)) _sceneResults.Add(go);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    _prefabResults.AddRange(PrefabHelper.GetAllPrefabAssetPathsDependantOn(_targetScript));\r\n                }\r\n            }\r\n        }\r\n        \r\n        private void FillBySearchForMissingComponents(bool testScene)\r\n        {\r\n            _prefabResults.Clear();\r\n            _sceneResults.Clear();\r\n\r\n            if (_targetScript != null)\r\n            {\r\n                if (testScene)\r\n                {\r\n                    foreach(var go in GameObject.FindObjectsOfType<GameObject>())\r\n                    {\r\n                        foreach(var c in go.GetComponents<Component>())\r\n                        {\r\n                            if(c == null)\r\n                            {\r\n                                _sceneResults.Add(go);\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    GameObject go;\r\n                    foreach(var p in PrefabHelper.GetAllPrefabAssetPaths())\r\n                    {\r\n                        go = AssetDatabase.LoadMainAssetAtPath(p) as GameObject;\r\n                        if(go != null && PrefabUtility.GetPrefabType(go) == PrefabType.Prefab)\r\n                        {\r\n                            foreach(var c in go.GetComponentsInChildren<Component>(true))\r\n                            {\r\n                                if (c == null) _prefabResults.Add(p);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Commands/FindReferencesToObjectMenu.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\n\r\nusing System.Reflection;\r\nusing System.Linq;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base.Commands\r\n{\r\n    public class FindReferencesToObjectMenu\r\n    {\r\n\r\n        #region Menu Entries\r\n\r\n        private static FindReferencesToObjectMenu _defaultSearchTool;\r\n\r\n        //[MenuItem(\"CONTEXT/ALT/Find References To\", validate=true)]\r\n        //private static bool Validate_Search()\r\n        //{\r\n        //    return true;\r\n        //}\r\n\r\n        [MenuItem(\"CONTEXT/Transform/Find References To\", priority = 100)]\r\n        private static void Menu_Search(MenuCommand cmnd)\r\n        {\r\n            if (cmnd.context == null) return;\r\n            if (_defaultSearchTool == null) _defaultSearchTool = new FindReferencesToObjectMenu();\r\n\r\n            GameObject go = GameObjectUtil.GetGameObjectFromSource(cmnd.context);\r\n            if (go == null) return;\r\n\r\n            int iid = go.GetInstanceID();\r\n            var arr = _defaultSearchTool.Search_Imp(iid);\r\n            //Selection.objects = arr;\r\n\r\n            foreach (var obj in arr)\r\n            {\r\n                Debug.Log(obj.GetType().FullName, obj);\r\n                if(obj is Component)\r\n                EditorGUIUtility.PingObject(obj.gameObject.GetInstanceID());\r\n            }\r\n        }\r\n\r\n        [MenuItem(\"GameObject/Find References To\", false, 0)]\r\n        private static void Menu_GO_Search(MenuCommand cmnd)\r\n        {\r\n            if (cmnd.context == null) return;\r\n            if (_defaultSearchTool == null) _defaultSearchTool = new FindReferencesToObjectMenu();\r\n\r\n            GameObject go = GameObjectUtil.GetGameObjectFromSource(cmnd.context);\r\n            if (go == null) return;\r\n\r\n            int iid = go.GetInstanceID();\r\n            var arr = _defaultSearchTool.Search_Imp(iid);\r\n            //Selection.objects = arr;\r\n\r\n            foreach (var obj in arr)\r\n            {\r\n                Debug.Log(obj.GetType().FullName, obj);\r\n                EditorGUIUtility.PingObject(obj.gameObject.GetInstanceID());\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Fields\r\n\r\n        private Dictionary<System.Type, FieldInfo[]> _fieldTable = new Dictionary<System.Type, FieldInfo[]>();\r\n        private HashSet<Component> _hits = new HashSet<Component>();\r\n        private HashSet<object> _referenceLoopHits = new HashSet<object>();\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public Component[] Search(GameObject target)\r\n        {\r\n            if (target == null) throw new System.ArgumentNullException(\"target\");\r\n\r\n            return this.Search_Imp(target.GetInstanceID());\r\n        }\r\n\r\n        public Component[] Search(int instanceId)\r\n        {\r\n            var obj = EditorUtility.InstanceIDToObject(instanceId);\r\n            if (obj == null) return ArrayUtil.Empty<Component>();\r\n\r\n            return this.Search_Imp(instanceId);\r\n        }\r\n\r\n        private Component[] Search_Imp(int instanceId)\r\n        {\r\n            _hits.Clear();\r\n            var comps = Object.FindObjectsOfType<Component>();\r\n\r\n            foreach (var c in comps)\r\n            {\r\n                if (_hits.Contains(c)) continue;\r\n\r\n                _referenceLoopHits.Clear();\r\n                var tp = c.GetType();\r\n                var infos = GetRelevantFieldInfos(tp);\r\n\r\n                foreach (var field in infos)\r\n                {\r\n                    if (TestField(instanceId, field, c))\r\n                    {\r\n                        _hits.Add(c);\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            var arr = _hits.ToArray();\r\n            _hits.Clear();\r\n            _referenceLoopHits.Clear();\r\n\r\n            return arr;\r\n        }\r\n\r\n        private FieldInfo[] GetRelevantFieldInfos(System.Type tp)\r\n        {\r\n            FieldInfo[] infos;\r\n            if (!_fieldTable.TryGetValue(tp, out infos))\r\n            {\r\n                infos = (from f in GetAllFields(tp)\r\n                         where ValidateFieldInfo(f)\r\n                         select f).ToArray();\r\n                _fieldTable[tp] = infos;\r\n            }\r\n            return infos;\r\n        }\r\n\r\n        private bool TestField(int instanceIdToFind, FieldInfo field, object obj)\r\n        {\r\n            var ftp = field.FieldType;\r\n            var fieldValue = field.GetValue(obj);\r\n\r\n            if (fieldValue == null) return false;\r\n            if (_referenceLoopHits.Contains(fieldValue)) return false;\r\n\r\n            _referenceLoopHits.Add(fieldValue);\r\n            if (ftp.IsListType() && fieldValue is System.Collections.IEnumerable)\r\n            {\r\n                ftp = ftp.GetElementTypeOfListType();\r\n                var e = fieldValue as System.Collections.IEnumerable;\r\n                foreach (var v in e)\r\n                {\r\n                    if (_referenceLoopHits.Contains(v)) continue;\r\n                    _referenceLoopHits.Add(v);\r\n                    if (TestFieldValue(instanceIdToFind, ftp, v)) return true;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (TestFieldValue(instanceIdToFind, ftp, fieldValue)) return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        private bool TestFieldValue(int instanceIdToFind, System.Type ftp, object fieldValue)\r\n        {\r\n            try\r\n            {\r\n                GameObject go = GameObjectUtil.GetGameObjectFromSource(fieldValue);\r\n                if (go != null && go.GetInstanceID() == instanceIdToFind)\r\n                {\r\n                    return true;\r\n                }\r\n            }\r\n            catch\r\n            {\r\n            }\r\n\r\n            if (fieldValue != null && !GameObjectUtil.IsGameObjectSource(fieldValue))\r\n            {\r\n                var infos = GetRelevantFieldInfos(ftp);\r\n                foreach (var subfield in infos)\r\n                {\r\n                    if (TestField(instanceIdToFind, subfield, fieldValue)) return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Static Util Methods\r\n\r\n        private static IEnumerable<FieldInfo> GetAllFields(System.Type tp)\r\n        {\r\n            if (tp == null) yield break;\r\n\r\n            foreach (var f in tp.GetFields(BindingFlags.Public | BindingFlags.Instance))\r\n            {\r\n                yield return f;\r\n            }\r\n\r\n            System.Type stopType = null;\r\n            if (TypeUtil.IsType(tp, typeof(MonoBehaviour)))\r\n                stopType = typeof(MonoBehaviour);\r\n            else if (TypeUtil.IsType(tp, typeof(UnityEngine.Object)))\r\n                stopType = tp.BaseType;\r\n            else\r\n                stopType = typeof(object);\r\n\r\n            while (tp != null && tp != stopType)\r\n            {\r\n                foreach (var f in tp.GetFields(BindingFlags.NonPublic | BindingFlags.Instance))\r\n                {\r\n                    yield return f;\r\n                }\r\n                tp = tp.BaseType;\r\n            }\r\n        }\r\n\r\n        private static bool ValidateFieldInfo(FieldInfo field)\r\n        {\r\n            var ftp = field.FieldType;\r\n            if (ftp.IsListType()) ftp = ftp.GetElementTypeOfListType();\r\n\r\n            if (TypeUtil.IsType(ftp, typeof(UnityEngine.Object))) return true;\r\n            if (!ftp.IsSerializable) return false;\r\n            if (field.GetCustomAttributes(typeof(SerializeField), false).Length > 0) return true;\r\n            if (field.IsPublic && field.GetCustomAttributes(typeof(System.NonSerializedAttribute), false).Length == 0) return true;\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Commands/SPCreateRagdollWizard.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    public class SPCreateRagdollWizard : ScriptableWizard\r\n    {\r\n\r\n        public const string MENU_NAME = SPMenu.MENU_NAME_ROOT + \"/Create Ragdoll\";\r\n        public const int MENU_PRIORITY = SPMenu.MENU_PRIORITY_GROUP2;\r\n\r\n        #region Menu Entries\r\n\r\n        [MenuItem(\"Spacepuppy/Create Ragdoll\", priority = MENU_PRIORITY)]\r\n        public static void StartWizard()\r\n        {\r\n            ScriptableWizard.DisplayWizard(\"Create Ragdoll\", typeof(SPCreateRagdollWizard));\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        public Transform root;\r\n\r\n        public Transform leftHips;\r\n        public Transform leftKnee;\r\n        public Transform leftFoot;\r\n\r\n        public Transform rightHips;\r\n        public Transform rightKnee;\r\n        public Transform rightFoot;\r\n\r\n        public Transform leftArm;\r\n        public Transform leftElbow;\r\n\r\n        public Transform rightArm;\r\n        public Transform rightElbow;\r\n\r\n        public Transform middleSpine;\r\n        public Transform head;\r\n\r\n\r\n        public float totalMass = 20;\r\n        public float strength = 0.0F;\r\n\r\n        Vector3 right = Vector3.right;\r\n        Vector3 up = Vector3.up;\r\n        Vector3 forward = Vector3.forward;\r\n\r\n        Vector3 worldRight = Vector3.right;\r\n        Vector3 worldUp = Vector3.up;\r\n        Vector3 worldForward = Vector3.forward;\r\n        public bool flipForward = false;\r\n\r\n        class BoneInfo\r\n        {\r\n            public string name;\r\n\r\n            public Transform anchor;\r\n            public CharacterJoint joint;\r\n            public BoneInfo parent;\r\n\r\n            public float minLimit;\r\n            public float maxLimit;\r\n            public float swingLimit;\r\n\r\n            public Vector3 axis;\r\n            public Vector3 normalAxis;\r\n\r\n            public float radiusScale;\r\n            public System.Type colliderType;\r\n\r\n            public ArrayList children = new ArrayList();\r\n            public float density;\r\n            public float summedMass;// The mass of this and all children bodies\r\n        }\r\n\r\n        ArrayList bones;\r\n        BoneInfo rootBone;\r\n\r\n        string CheckConsistency()\r\n        {\r\n            PrepareBones();\r\n            Hashtable map = new Hashtable();\r\n            foreach (BoneInfo bone in bones)\r\n            {\r\n                if (bone.anchor)\r\n                {\r\n                    if (map[bone.anchor] != null)\r\n                    {\r\n                        BoneInfo oldBone = (BoneInfo)map[bone.anchor];\r\n                        return string.Format(\"{0} and {1} may not be assigned to the same bone.\", bone.name, oldBone.name);\r\n                    }\r\n                    map[bone.anchor] = bone;\r\n                }\r\n            }\r\n\r\n            foreach (BoneInfo bone in bones)\r\n            {\r\n                if (bone.anchor == null)\r\n                    return string.Format(\"{0} has not been assigned yet.\\n\", bone.name);\r\n            }\r\n\r\n            return \"\";\r\n        }\r\n\r\n        void OnDrawGizmos()\r\n        {\r\n            if (root)\r\n            {\r\n                Gizmos.color = Color.red; Gizmos.DrawRay(root.position, root.TransformDirection(right));\r\n                Gizmos.color = Color.green; Gizmos.DrawRay(root.position, root.TransformDirection(up));\r\n                Gizmos.color = Color.blue; Gizmos.DrawRay(root.position, root.TransformDirection(forward));\r\n            }\r\n        }\r\n\r\n        void DecomposeVector(out Vector3 normalCompo, out Vector3 tangentCompo, Vector3 outwardDir, Vector3 outwardNormal)\r\n        {\r\n            outwardNormal = outwardNormal.normalized;\r\n            normalCompo = outwardNormal * Vector3.Dot(outwardDir, outwardNormal);\r\n            tangentCompo = outwardDir - normalCompo;\r\n        }\r\n\r\n        void CalculateAxes()\r\n        {\r\n            if (head != null && root != null)\r\n                up = CalculateDirectionAxis(root.InverseTransformPoint(head.position));\r\n            if (rightElbow != null && root != null)\r\n            {\r\n                Vector3 removed, temp;\r\n                DecomposeVector(out temp, out removed, root.InverseTransformPoint(rightElbow.position), up);\r\n                right = CalculateDirectionAxis(removed);\r\n            }\r\n\r\n            forward = Vector3.Cross(right, up);\r\n            if (flipForward)\r\n                forward = -forward;\r\n        }\r\n\r\n        void OnWizardUpdate()\r\n        {\r\n            errorString = CheckConsistency();\r\n            CalculateAxes();\r\n\r\n            if (errorString.Length != 0)\r\n            {\r\n                helpString = \"Drag all bones from the hierarchy into their slots.\\nMake sure your character is in T-Stand.\\n\";\r\n            }\r\n            else\r\n            {\r\n                helpString = \"Make sure your character is in T-Stand.\\nMake sure the blue axis faces in the same direction the chracter is looking.\\nUse flipForward to flip the direction\";\r\n            }\r\n\r\n            isValid = errorString.Length == 0;\r\n        }\r\n\r\n        void PrepareBones()\r\n        {\r\n            if (root)\r\n            {\r\n                worldRight = root.TransformDirection(right);\r\n                worldUp = root.TransformDirection(up);\r\n                worldForward = root.TransformDirection(forward);\r\n            }\r\n\r\n            bones = new ArrayList();\r\n\r\n            rootBone = new BoneInfo();\r\n            rootBone.name = \"Root\";\r\n            rootBone.anchor = root;\r\n            rootBone.parent = null;\r\n            rootBone.density = 2.5F;\r\n            bones.Add(rootBone);\r\n\r\n            AddMirroredJoint(\"Hips\", leftHips, rightHips, \"Root\", worldRight, worldForward, -20, 70, 30, typeof(CapsuleCollider), 0.3F, 1.5F);\r\n            AddMirroredJoint(\"Knee\", leftKnee, rightKnee, \"Hips\", worldRight, worldForward, -80, 0, 0, typeof(CapsuleCollider), 0.25F, 1.5F);\r\n            //\t\tAddMirroredJoint (\"Hips\", leftHips, rightHips, \"Root\", worldRight, worldForward, -0, -70, 30, typeof(CapsuleCollider), 0.3F, 1.5F);\r\n            //\t\tAddMirroredJoint (\"Knee\", leftKnee, rightKnee, \"Hips\", worldRight, worldForward, -0, -50, 0, typeof(CapsuleCollider), .25F, 1.5F);\r\n\r\n            AddJoint(\"Middle Spine\", middleSpine, \"Root\", worldRight, worldForward, -20, 20, 10, null, 1, 2.5F);\r\n\r\n            AddMirroredJoint(\"Arm\", leftArm, rightArm, \"Middle Spine\", worldUp, worldForward, -70, 10, 50, typeof(CapsuleCollider), 0.25F, 1.0F);\r\n            AddMirroredJoint(\"Elbow\", leftElbow, rightElbow, \"Arm\", worldForward, worldUp, -90, 0, 0, typeof(CapsuleCollider), 0.20F, 1.0F);\r\n\r\n            AddJoint(\"Head\", head, \"Middle Spine\", worldRight, worldForward, -40, 25, 25, null, 1, 1.0F);\r\n        }\r\n\r\n        void OnWizardCreate()\r\n        {\r\n\r\n            Cleanup();\r\n            BuildCapsules();\r\n            AddBreastColliders();\r\n            AddHeadCollider();\r\n\r\n            BuildBodies();\r\n            BuildJoints();\r\n            CalculateMass();\r\n            CalculateSpringDampers();\r\n        }\r\n\r\n        BoneInfo FindBone(string name)\r\n        {\r\n            foreach (BoneInfo bone in bones)\r\n            {\r\n                if (bone.name == name)\r\n                    return bone;\r\n            }\r\n            return null;\r\n        }\r\n\r\n        void AddMirroredJoint(string name, Transform leftAnchor, Transform rightAnchor, string parent, Vector3 worldTwistAxis, Vector3 worldSwingAxis, float minLimit, float maxLimit, float swingLimit, System.Type colliderType, float radiusScale, float density)\r\n        {\r\n            AddJoint(\"Left \" + name, leftAnchor, parent, worldTwistAxis, worldSwingAxis, minLimit, maxLimit, swingLimit, colliderType, radiusScale, density);\r\n            AddJoint(\"Right \" + name, rightAnchor, parent, worldTwistAxis, worldSwingAxis, minLimit, maxLimit, swingLimit, colliderType, radiusScale, density);\r\n        }\r\n\r\n\r\n        void AddJoint(string name, Transform anchor, string parent, Vector3 worldTwistAxis, Vector3 worldSwingAxis, float minLimit, float maxLimit, float swingLimit, System.Type colliderType, float radiusScale, float density)\r\n        {\r\n            BoneInfo bone = new BoneInfo();\r\n            bone.name = name;\r\n            bone.anchor = anchor;\r\n            bone.axis = worldTwistAxis;\r\n            bone.normalAxis = worldSwingAxis;\r\n            bone.minLimit = minLimit;\r\n            bone.maxLimit = maxLimit;\r\n            bone.swingLimit = swingLimit;\r\n            bone.density = density;\r\n            bone.colliderType = colliderType;\r\n            bone.radiusScale = radiusScale;\r\n\r\n            if (FindBone(parent) != null)\r\n                bone.parent = FindBone(parent);\r\n            else if (name.StartsWith(\"Left\"))\r\n                bone.parent = FindBone(\"Left \" + parent);\r\n            else if (name.StartsWith(\"Right\"))\r\n                bone.parent = FindBone(\"Right \" + parent);\r\n\r\n\r\n            bone.parent.children.Add(bone);\r\n            bones.Add(bone);\r\n        }\r\n\r\n        void BuildCapsules()\r\n        {\r\n            foreach (BoneInfo bone in bones)\r\n            {\r\n                if (bone.colliderType != typeof(CapsuleCollider))\r\n                    continue;\r\n\r\n                int direction;\r\n                float distance;\r\n                if (bone.children.Count == 1)\r\n                {\r\n                    BoneInfo childBone = (BoneInfo)bone.children[0];\r\n                    Vector3 endPoint = childBone.anchor.position;\r\n                    CalculateDirection(bone.anchor.InverseTransformPoint(endPoint), out direction, out distance);\r\n                }\r\n                else\r\n                {\r\n                    Vector3 endPoint = (bone.anchor.position - bone.parent.anchor.position) + bone.anchor.position;\r\n                    CalculateDirection(bone.anchor.InverseTransformPoint(endPoint), out direction, out distance);\r\n\r\n                    if (bone.anchor.GetComponentsInChildren(typeof(Transform)).Length > 1)\r\n                    {\r\n                        Bounds bounds = new Bounds();\r\n                        foreach (Transform child in bone.anchor.GetComponentsInChildren(typeof(Transform)))\r\n                        {\r\n                            bounds.Encapsulate(bone.anchor.InverseTransformPoint(child.position));\r\n                        }\r\n\r\n                        if (distance > 0)\r\n                            distance = bounds.max[direction];\r\n                        else\r\n                            distance = bounds.min[direction];\r\n                    }\r\n                }\r\n\r\n                CapsuleCollider collider = bone.anchor.gameObject.AddComponent<CapsuleCollider>();\r\n                collider.direction = direction;\r\n\r\n                Vector3 center = Vector3.zero;\r\n                center[direction] = distance * 0.5F;\r\n                collider.center = center;\r\n                collider.height = Mathf.Abs(distance);\r\n                collider.radius = Mathf.Abs(distance * bone.radiusScale);\r\n            }\r\n        }\r\n\r\n        void Cleanup()\r\n        {\r\n            foreach (BoneInfo bone in bones)\r\n            {\r\n                if (!bone.anchor)\r\n                    continue;\r\n\r\n                Component[] joints = bone.anchor.GetComponentsInChildren(typeof(Joint));\r\n                foreach (Joint joint in joints)\r\n                    DestroyImmediate(joint);\r\n\r\n                Component[] bodies = bone.anchor.GetComponentsInChildren(typeof(Rigidbody));\r\n                foreach (Rigidbody body in bodies)\r\n                    DestroyImmediate(body);\r\n\r\n                Component[] colliders = bone.anchor.GetComponentsInChildren(typeof(Collider));\r\n                foreach (Collider collider in colliders)\r\n                    DestroyImmediate(collider);\r\n            }\r\n        }\r\n\r\n        void BuildBodies()\r\n        {\r\n            foreach (BoneInfo bone in bones)\r\n            {\r\n                var rb = bone.anchor.gameObject.AddComponent<Rigidbody>();\r\n                //\t\t\tbone.anchor.rigidbody.SetDensity (bone.density);\r\n                rb.mass = bone.density;\r\n            }\r\n        }\r\n\r\n        void BuildJoints()\r\n        {\r\n            foreach (BoneInfo bone in bones)\r\n            {\r\n                if (bone.parent == null)\r\n                    continue;\r\n\r\n                CharacterJoint joint = (CharacterJoint)bone.anchor.gameObject.AddComponent<CharacterJoint>();\r\n                bone.joint = joint;\r\n\r\n                // Setup connection and axis\r\n                joint.axis = CalculateDirectionAxis(bone.anchor.InverseTransformDirection(bone.axis));\r\n                joint.swingAxis = CalculateDirectionAxis(bone.anchor.InverseTransformDirection(bone.normalAxis));\r\n                joint.anchor = Vector3.zero;\r\n                joint.connectedBody = bone.parent.anchor.GetComponent<Rigidbody>();\r\n\r\n                // Setup limits\t\t\t\r\n                SoftJointLimit limit = new SoftJointLimit();\r\n\r\n                limit.limit = bone.minLimit;\r\n                joint.lowTwistLimit = limit;\r\n\r\n                limit.limit = bone.maxLimit;\r\n                joint.highTwistLimit = limit;\r\n\r\n                limit.limit = bone.swingLimit;\r\n                joint.swing1Limit = limit;\r\n\r\n                limit.limit = 0;\r\n                joint.swing2Limit = limit;\r\n            }\r\n        }\r\n\r\n        void CalculateMassRecurse(BoneInfo bone)\r\n        {\r\n            float mass = bone.anchor.GetComponent<Rigidbody>().mass;\r\n            foreach (BoneInfo child in bone.children)\r\n            {\r\n                CalculateMassRecurse(child);\r\n                mass += child.summedMass;\r\n            }\r\n            bone.summedMass = mass;\r\n        }\r\n\r\n        void CalculateMass()\r\n        {\r\n            // Calculate allChildMass by summing all bodies\r\n            CalculateMassRecurse(rootBone);\r\n\r\n            // Rescale the mass so that the whole character weights totalMass\r\n            float massScale = totalMass / rootBone.summedMass;\r\n            foreach (BoneInfo bone in bones)\r\n                bone.anchor.GetComponent<Rigidbody>().mass *= massScale;\r\n\r\n            // Recalculate allChildMass by summing all bodies\r\n            CalculateMassRecurse(rootBone);\r\n        }\r\n\r\n        ///@todo: This should take into account the inertia tensor.\r\n        JointDrive CalculateSpringDamper(float frequency, float damping, float mass)\r\n        {\r\n            JointDrive drive = new JointDrive();\r\n            drive.positionSpring = 9 * frequency * frequency * mass;\r\n            drive.positionDamper = 4.5F * frequency * damping * mass;\r\n            return drive;\r\n        }\r\n\r\n        void CalculateSpringDampers()\r\n        {\r\n            // Calculate the rotation drive based on the strength and how much mass the character needs to pull around.\r\n            foreach (BoneInfo bone in bones)\r\n            {\r\n                if (bone.joint)\r\n                {\r\n                    //NOTE - removed for Unity5\r\n                    //bone.joint.rotationDrive = CalculateSpringDamper(strength / 100.0F, 1, bone.summedMass);\r\n                }\r\n            }\r\n        }\r\n        /*\t\r\n \r\n            void AddJoint (string name, Complexity complexity, Transform anchor, Transform connectTo, Vector3 worldTwistAxis, Vector3 worldSwingAxis, float minLimit, float maxLimit, float swingLimit, float mass)\r\n            {\r\n                if (!connectTo.rigidbody)\r\n                    connectTo.gameObject.AddComponent(\"Rigidbody\");\r\n \r\n                CharacterJoint joint = (CharacterJoint)anchor.gameObject.AddComponent (\"CharacterJoint\");\r\n \r\n                joint.axis = CalculateDirectionAxis (anchor.InverseTransformDirection(worldTwistAxis));\r\n                joint.swingAxis = CalculateDirectionAxis (anchor.InverseTransformDirection(worldSwingAxis));\r\n                joint.anchor = Vector3.zero;\r\n                joint.connectedBody = connectTo.rigidbody;\r\n \r\n                SoftJointLimit limit = new SoftJointLimit ();\r\n \r\n                limit.limit = minLimit;\r\n                joint.lowTwistLimit = limit;\r\n \r\n                limit.limit = maxLimit;\r\n                joint.highTwistLimit = limit;\r\n \r\n                limit.limit = swingLimit;\r\n                joint.swing1Limit = limit;\r\n \r\n                limit.limit = 0;\r\n                joint.swing2Limit = limit;\r\n \r\n                JointDrive drive = new JointDrive ();\r\n                drive.spring = 0.2F;\r\n                drive.damper = .1F;\r\n                drive.force = 10.0F;\r\n                joint.rotationDrive = drive;\r\n \r\n                connectTo.rigidbody.mass = 2;\r\n                anchor.rigidbody.mass = 2;\r\n            }\r\n            /*\r\n            void BuildCapsule (BoneInfo bone)\r\n            {\r\n                CapsuleCollider collider = (CapsuleCollider)bone.body.gameObject.AddComponent (\"CapsuleCollider\");\r\n \r\n                Bounds bounds;\r\n                if (Editor.CalculateSkinnedAABB (bone.body, bone.body, out bounds))\r\n                {\r\n                    int direction;\r\n                    float distance;\r\n                    CalculateDirection (bounds.max, out direction, out distance);\r\n \r\n                    collider.direction = direction;\r\n                    collider.height = distance;\r\n                    collider.radius = SecondLargestComponent ();\r\n                }\r\n                else\r\n                {\r\n \r\n                }\r\n \r\n                if (bone.children.Count == 1)\r\n                {\r\n \r\n                }\r\n            }\r\n            */\r\n        /*\t\r\n \r\n        void AddCapsule (Transform anchor, Transform parent, Transform next, float directionScale, float radiusScale)\r\n        {\r\n            if (anchor.collider)\r\n                Destroy (anchor.collider);\r\n \r\n            Vector3 endPoint;\r\n \r\n            if (next)\r\n                endPoint = next.position;\r\n            else\r\n                endPoint = directionScale * (anchor.position - parent.position) + anchor.position;\r\n \r\n            int direction;\r\n            float distance;\r\n            CalculateDirection (anchor.InverseTransformPoint(endPoint), out direction, out distance);\r\n            distance = distance / anchor.lossyScale[direction];\r\n \r\n            CapsuleCollider collider = (CapsuleCollider)anchor.gameObject.AddComponent (\"CapsuleCollider\");\r\n            collider.direction = direction;\r\n \r\n            Vector3 center = Vector3.zero;\r\n            center[direction] = distance * 0.5F;\r\n            collider.center = center;\r\n            collider.height = Mathf.Abs (distance);\r\n            collider.radius = Mathf.Abs (distance * radiusScale);\r\n        }*/\r\n\r\n        static void CalculateDirection(Vector3 point, out int direction, out float distance)\r\n        {\r\n            // Calculate longest axis\r\n            direction = 0;\r\n            if (Mathf.Abs(point[1]) > Mathf.Abs(point[0]))\r\n                direction = 1;\r\n            if (Mathf.Abs(point[2]) > Mathf.Abs(point[direction]))\r\n                direction = 2;\r\n\r\n            distance = point[direction];\r\n        }\r\n\r\n        static Vector3 CalculateDirectionAxis(Vector3 point)\r\n        {\r\n            int direction = 0;\r\n            float distance;\r\n            CalculateDirection(point, out direction, out distance);\r\n            Vector3 axis = Vector3.zero;\r\n            if (distance > 0)\r\n                axis[direction] = 1.0F;\r\n            else\r\n                axis[direction] = -1.0F;\r\n            return axis;\r\n        }\r\n\r\n        static int SmallestComponent(Vector3 point)\r\n        {\r\n            int direction = 0;\r\n            if (Mathf.Abs(point[1]) < Mathf.Abs(point[0]))\r\n                direction = 1;\r\n            if (Mathf.Abs(point[2]) < Mathf.Abs(point[direction]))\r\n                direction = 2;\r\n            return direction;\r\n        }\r\n\r\n        static int LargestComponent(Vector3 point)\r\n        {\r\n            int direction = 0;\r\n            if (Mathf.Abs(point[1]) > Mathf.Abs(point[0]))\r\n                direction = 1;\r\n            if (Mathf.Abs(point[2]) > Mathf.Abs(point[direction]))\r\n                direction = 2;\r\n            return direction;\r\n        }\r\n\r\n        static int SecondLargestComponent(Vector3 point)\r\n        {\r\n            int smallest = SmallestComponent(point);\r\n            int largest = LargestComponent(point);\r\n            if (smallest < largest)\r\n            {\r\n                int temp = largest;\r\n                largest = smallest;\r\n                smallest = temp;\r\n            }\r\n\r\n            if (smallest == 0 && largest == 1)\r\n                return 2;\r\n            else if (smallest == 0 && largest == 2)\r\n                return 1;\r\n            else\r\n                return 0;\r\n        }\r\n\r\n        Bounds Clip(Bounds bounds, Transform relativeTo, Transform clipTransform, bool below)\r\n        {\r\n            int axis = LargestComponent(bounds.size);\r\n\r\n            if (Vector3.Dot(worldUp, relativeTo.TransformPoint(bounds.max)) > Vector3.Dot(worldUp, relativeTo.TransformPoint(bounds.min)) == below)\r\n            {\r\n                Vector3 min = bounds.min;\r\n                min[axis] = relativeTo.InverseTransformPoint(clipTransform.position)[axis];\r\n                bounds.min = min;\r\n            }\r\n            else\r\n            {\r\n                Vector3 max = bounds.max;\r\n                max[axis] = relativeTo.InverseTransformPoint(clipTransform.position)[axis];\r\n                bounds.max = max;\r\n            }\r\n            return bounds;\r\n        }\r\n\r\n        Bounds GetBreastBounds(Transform relativeTo)\r\n        {\r\n            // Root bounds\r\n            Bounds bounds = new Bounds();\r\n            bounds.Encapsulate(relativeTo.InverseTransformPoint(leftHips.position));\r\n            bounds.Encapsulate(relativeTo.InverseTransformPoint(rightHips.position));\r\n            bounds.Encapsulate(relativeTo.InverseTransformPoint(leftArm.position));\r\n            bounds.Encapsulate(relativeTo.InverseTransformPoint(rightArm.position));\r\n            Vector3 size = bounds.size;\r\n            size[SmallestComponent(bounds.size)] = size[LargestComponent(bounds.size)] / 2.0F;\r\n            bounds.size = size;\r\n            return bounds;\r\n        }\r\n\r\n        void AddBreastColliders()\r\n        {\r\n            // Middle spine and root\r\n            if (middleSpine != null && root != null)\r\n            {\r\n                Bounds bounds;\r\n                BoxCollider box;\r\n\r\n                // Middle spine bounds\r\n                bounds = Clip(GetBreastBounds(root), root, middleSpine, false);\r\n                box = (BoxCollider)root.gameObject.AddComponent<BoxCollider>();\r\n                box.center = bounds.center;\r\n                box.size = bounds.size;\r\n\r\n                bounds = Clip(GetBreastBounds(middleSpine), middleSpine, middleSpine, true);\r\n                box = (BoxCollider)middleSpine.gameObject.AddComponent<BoxCollider>();\r\n                box.center = bounds.center;\r\n                box.size = bounds.size;\r\n            }\r\n            // Only root\r\n            else\r\n            {\r\n                Bounds bounds = new Bounds();\r\n                bounds.Encapsulate(root.InverseTransformPoint(leftHips.position));\r\n                bounds.Encapsulate(root.InverseTransformPoint(rightHips.position));\r\n                bounds.Encapsulate(root.InverseTransformPoint(leftArm.position));\r\n                bounds.Encapsulate(root.InverseTransformPoint(rightArm.position));\r\n\r\n                Vector3 size = bounds.size;\r\n                size[SmallestComponent(bounds.size)] = size[LargestComponent(bounds.size)] / 2.0F;\r\n\r\n                BoxCollider box = (BoxCollider)root.gameObject.AddComponent<BoxCollider>();\r\n                box.center = bounds.center;\r\n                box.size = size;\r\n            }\r\n        }\r\n\r\n        void AddHeadCollider()\r\n        {\r\n            var coll = head.GetComponent<Collider>();\r\n            if (coll)\r\n                Destroy(coll);\r\n\r\n            float radius = Vector3.Distance(leftArm.transform.position, rightArm.transform.position);\r\n            radius /= 4;\r\n\r\n            SphereCollider sphere = head.gameObject.AddComponent<SphereCollider>();\r\n            sphere.radius = radius;\r\n            Vector3 center = Vector3.zero;\r\n\r\n            int direction;\r\n            float distance;\r\n            CalculateDirection(head.InverseTransformPoint(root.position), out direction, out distance);\r\n            if (distance > 0)\r\n                center[direction] = -radius;\r\n            else\r\n                center[direction] = radius;\r\n            sphere.center = center;\r\n        }\r\n\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Commands/ScreenshotRecorderWindow.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Base.Commands\n{\n\n    public sealed class ScreenshotRecorderWindow : EditorWindow\n    {\n\n        #region Singleton\n\n        private static ScreenshotRecorderWindow _window;\n\n        private void OnEnable()\n        {\n            if (_window == null) _window = this;\n            else Object.DestroyImmediate(this);\n\n            this.titleContent = new GUIContent(\"Screenshot Recorder\");\n        }\n\n        private void OnDisable()\n        {\n            if (_window == this) _window = null;\n        }\n\n        #endregion\n\n        #region Menu Entries\n\n        [MenuItem(\"Tools/Screenshot Recorder\")]\n        private static void OpenFromMenu()\n        {\n            if (_window == null)\n            {\n                _window = EditorWindow.GetWindow<ScreenshotRecorderWindow>();\n                _window.Show();\n                _window.position = new Rect(20, 80, 500, 300);\n            }\n            else\n            {\n                _window.Focus();\n            }\n        }\n\n        #endregion\n\n        #region Fields\n\n        public static string DefaultOutputFolder\n        {\n            get\n            {\n                return System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyPictures), \"UnityImgRecorderOutput\");\n            }\n        }\n\n        private string _filePath = DefaultOutputFolder;\n        private float _frequency = 1f;\n        private ScreenshotUtil.ImageFormat _format;\n        private bool _timestamp = true;\n        private bool _recording;\n\n        private float _lastRecordTime;\n        private string _status = \"Idle...\";\n        private int _frameCount;\n\n        #endregion\n\n        #region Methods\n\n        private void OnGUI()\n        {\n            _filePath = EditorGUILayout.TextField(\"File Path:\", _filePath);\n            GUILayout.BeginHorizontal();\n            GUILayout.FlexibleSpace();\n            if(GUILayout.Button(\"Browse...\", GUILayout.Width(75f)))\n            {\n                _filePath = EditorUtility.OpenFolderPanel(\"Select Folder\", _filePath, string.Empty);\n            }\n            GUILayout.EndHorizontal();\n            _timestamp = EditorGUILayout.ToggleLeft(\"Timestamp\", _timestamp);\n\n            _format = (ScreenshotUtil.ImageFormat)EditorGUILayout.EnumPopup(\"Format: \", _format);\n            _frequency = EditorGUILayout.FloatField(\"Frequency/sec:\", _frequency);\n            if (_frequency <= 0.0001f) _frequency = 0.0001f;\n\n            if(GUILayout.Button(_recording ? \"Stop\" : \"Record\"))\n            {\n                _recording = !_recording;\n                _lastRecordTime = Time.unscaledTime;\n                _frameCount = 0;\n                _status = \"Idle...\";\n            }\n\n            EditorGUILayout.LabelField(\"Status: \", _status);\n        }\n\n        private void Update()\n        {\n            if (!_recording) return;\n\n            float t = Time.unscaledTime - _lastRecordTime;\n            if (t > (1f / _frequency))\n            {\n                _frameCount++;\n                _lastRecordTime = Time.unscaledTime;\n\n                string fn;\n                if (_timestamp)\n                    fn = string.Format(\"Image{0}_{1:yyyyMMdd_HHmmss_fff}{2}\", _frameCount, System.DateTime.Now, ScreenshotUtil.GetExtension(_format));\n                else\n                    fn = string.Format(\"Image{0}{1}\", _frameCount, ScreenshotUtil.GetExtension(_format));\n\n                ScreenshotUtil.TakeScreenshot(System.IO.Path.Combine(_filePath, fn), _format);\n                _status = \"Recorded \" + fn;\n                this.Repaint();\n            }\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Commands/ScreenshotUtil.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Base.Commands\n{\n\n    public static class ScreenshotUtil\n    {\n\n        public enum ImageFormat\n        {\n            PNG = 0,\n            Jpeg = 1,\n            TGA = 2\n        }\n\n        public static TextureFormat TextureFormat = TextureFormat.RGBA32;\n\n        [MenuItem(\"CONTEXT/Camera/Take Screen Cap (TGA)\")]\n        private static void ScreenCapFromCameraTGA_ContextMenu(MenuCommand command)\n        {\n            TakeScreenshot(ImageFormat.TGA, command.context as Camera);\n        }\n\n        [MenuItem(\"CONTEXT/Camera/Take Screen Cap (JPG)\")]\n        private static void ScreenCapFromCameraJPG_ContextMenu(MenuCommand command)\n        {\n            TakeScreenshot(ImageFormat.Jpeg, command.context as Camera);\n        }\n\n        [MenuItem(\"CONTEXT/Camera/Take Screen Cap (PNG)\")]\n        private static void ScreenCapFromCameraPNG_ContextMenu(MenuCommand command)\n        {\n            TakeScreenshot(ImageFormat.PNG, command.context as Camera);\n        }\n\n\n        [MenuItem(\"Tools/Screenshot (TGA)\")]\n        private static void ScreenCapFromCameraTGA_ToolMenu(MenuCommand command)\n        {\n            TakeScreenshot(ImageFormat.TGA);\n        }\n\n        [MenuItem(\"Tools/Screenshot (JPG)\")]\n        private static void ScreenCapFromCameraJPG_ToolMenu(MenuCommand command)\n        {\n            TakeScreenshot(ImageFormat.Jpeg);\n        }\n\n        [MenuItem(\"Tools/Screenshot (PNG)\")]\n        private static void ScreenCapFromCameraPNG_ToolMenu(MenuCommand command)\n        {\n            TakeScreenshot(ImageFormat.PNG);\n        }\n\n        public static bool TakeScreenshot(ImageFormat format, Camera cam = null)\n        {\n            var dir = EditorProjectPrefs.Local.GetString(\"LastScreenshotDirectory\", string.Empty);\n            string path;\n            switch (format)\n            {\n                case ImageFormat.PNG:\n                    path = EditorUtility.SaveFilePanel(\"Save Screenshot\", dir, \"Screenshot.png\", \"png\");\n                    break;\n                case ImageFormat.Jpeg:\n                    path = EditorUtility.SaveFilePanel(\"Save Screenshot\", dir, \"Screenshot.jpg\", \"jpg\");\n                    break;\n                case ImageFormat.TGA:\n                    path = EditorUtility.SaveFilePanel(\"Save Screenshot\", dir, \"Screenshot.tga\", \"tga\");\n                    break;\n                default:\n                    return false;\n            }\n\n            if (string.IsNullOrEmpty(path)) return false;\n            dir = System.IO.Path.GetDirectoryName(path) + @\"\\\";\n            EditorProjectPrefs.Local.SetString(\"LastScreenShotDirectory\", dir);\n\n            return TakeScreenshot(path, format, cam);\n        }\n\n        public static bool TakeScreenshot(string path, ImageFormat format, Camera cam = null)\n        {\n            if (cam != null || format != ImageFormat.PNG)\n            {\n                Texture2D screenshot;\n                if(cam != null)\n                {\n                    var tmp = RenderTexture.GetTemporary(cam.pixelWidth, cam.pixelHeight);\n                    var cache = cam.targetTexture;\n                    cam.targetTexture = tmp;\n                    cam.Render();\n\n                    RenderTexture.active = tmp;\n                    screenshot = new Texture2D(tmp.width, tmp.height, ScreenshotUtil.TextureFormat, false);\n                    screenshot.ReadPixels(new Rect(0, 0, tmp.width, tmp.height), 0, 0);\n\n                    RenderTexture.active = null;\n\n                    cam.targetTexture = cache;\n                    tmp.Release();\n                }\n                else\n                {\n                    screenshot = new Texture2D(Screen.width, Screen.height, ScreenshotUtil.TextureFormat, false);\n                    screenshot.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);\n                    screenshot.Apply();\n                }\n                \n                byte[] bytes;\n                switch(format)\n                {\n                    case ImageFormat.PNG:\n                        bytes = screenshot.EncodeToPNG();\n                        break;\n                    case ImageFormat.Jpeg:\n                        bytes = screenshot.EncodeToJPG();\n                        break;\n                    case ImageFormat.TGA:\n                        bytes = screenshot.EncodeToTGA();\n                        break;\n                    default:\n                        UnityEngine.Object.DestroyImmediate(screenshot);\n                        return false;\n                }\n                \n                System.IO.File.WriteAllBytes(path, bytes);\n\n                UnityEngine.Object.DestroyImmediate(screenshot);\n                return true;\n            }\n            else\n            {\n                //Application.CaptureScreenshot(path);\n                ScreenCapture.CaptureScreenshot(path);\n                return true;\n            }\n        }\n\n        public static string GetExtension(ImageFormat format)\n        {\n            switch(format)\n            {\n                case ImageFormat.PNG:\n                    return \".png\";\n                case ImageFormat.Jpeg:\n                    return \".jpg\";\n                case ImageFormat.TGA:\n                    return \".tga\";\n                default:\n                    return string.Empty;\n            }\n        }\n        \n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Commands/TransformCopyMenu.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Geom;\r\n\r\nnamespace com.spacepuppyeditor.Base.Commands\r\n{\r\n    public static class TransformCopyMenu\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private static Trans? _currentTrans;\r\n        private static bool _local;\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        [MenuItem(\"GameObject/Transform/Copy Transform Local\", priority = 0)]\r\n        static void CopyTransformLocal()\r\n        {\r\n            var tr = Selection.activeTransform;\r\n            if (tr == null) return;\r\n\r\n            _currentTrans = Trans.GetLocal(tr);\r\n            _local = true;\r\n        }\r\n\r\n        [MenuItem(\"GameObject/Transform/Copy Transform Local\", validate = true)]\r\n        static bool CopyTransformLocal_Validate()\r\n        {\r\n            return Selection.activeTransform != null;\r\n        }\r\n\r\n        [MenuItem(\"CONTEXT/Transform/Copy Transform Local\", priority=100)]\r\n        static void CopyTransformLocal_Transform(MenuCommand cmnd)\r\n        {\r\n            var tr = cmnd.context as Transform;\r\n            if (tr == null) return;\r\n\r\n            _currentTrans = Trans.GetLocal(tr);\r\n            _local = true;\r\n        }\r\n\r\n\r\n\r\n\r\n        [MenuItem(\"GameObject/Transform/Copy Transform Global\", priority = 0)]\r\n        static void CopyTransformGlobal()\r\n        {\r\n            var tr = Selection.activeTransform;\r\n            if (tr == null) return;\r\n\r\n            _currentTrans = Trans.GetGlobal(tr);\r\n            _local = false;\r\n        }\r\n\r\n        [MenuItem(\"GameObject/Transform/Copy Transform Global\", validate = true)]\r\n        static bool CopyTransformGlobal_Validate()\r\n        {\r\n            return Selection.activeTransform != null;\r\n        }\r\n\r\n        [MenuItem(\"CONTEXT/Transform/Copy Transform Global\", priority = 100)]\r\n        static void CopyTransformGlobal_Transform(MenuCommand cmnd)\r\n        {\r\n            var tr = cmnd.context as Transform;\r\n            if (tr == null) return;\r\n\r\n            _currentTrans = Trans.GetGlobal(tr);\r\n            _local = false;\r\n        }\r\n\r\n\r\n\r\n\r\n        [MenuItem(\"GameObject/Transform/Paste Transform\", priority = 0)]\r\n        static void PasteTransform()\r\n        {\r\n            if (_currentTrans == null) return;\r\n\r\n            var tr = Selection.activeTransform;\r\n            if (tr == null) return;\r\n\r\n            if (_local)\r\n                _currentTrans.Value.SetToLocal(tr);\r\n            else\r\n                _currentTrans.Value.SetToGlobal(tr, false);\r\n        }\r\n\r\n        [MenuItem(\"GameObject/Transform/Paste Transform\", validate = true)]\r\n        static bool PasteTransform_Validate(MenuCommand cmnd)\r\n        {\r\n            if (_currentTrans == null) return false;\r\n\r\n            var tr = Selection.activeTransform;\r\n            if (tr == null) return false;\r\n\r\n            return true;\r\n\r\n        }\r\n\r\n        [MenuItem(\"CONTEXT/Transform/Paste Transform\", priority = 100)]\r\n        static void PasteTransform_Transform(MenuCommand cmnd)\r\n        {\r\n            if (_currentTrans == null) return;\r\n\r\n            var tr = cmnd.context as Transform;\r\n            if (tr == null) return;\r\n\r\n            if (_local)\r\n                _currentTrans.Value.SetToLocal(tr);\r\n            else\r\n                _currentTrans.Value.SetToGlobal(tr, false);\r\n        }\r\n\r\n        [MenuItem(\"CONTEXT/Transform/Paste Transform\", validate=true)]\r\n        static bool PasteTransform_Transform_Validate(MenuCommand cmnd)\r\n        {\r\n            if (_currentTrans == null) return false;\r\n\r\n            var tr = cmnd.context as Transform;\r\n            if (tr == null) return false;\r\n\r\n            return true;\r\n\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n        [MenuItem(\"GameObject/Transform/Move To Scene Camera\")]\r\n        public static void MoveToSceneCamera()\r\n        {\r\n            var go = Selection.activeGameObject;\r\n            if (go == null) return;\r\n\r\n            var view = SceneView.lastActiveSceneView;\r\n            if (view == null || view.camera == null) return;\r\n\r\n            var t = view.camera.transform;\r\n            go.transform.position = t.position;\r\n            go.transform.rotation = t.rotation;\r\n        }\r\n        [MenuItem(\"GameObject/Transform/Move To Scene Camera\", validate = true)]\r\n        public static bool MoveToSceneCamera_Validate(MenuCommand cmnd)\r\n        {\r\n            var go = Selection.activeGameObject;\r\n            if (go == null) return false;\r\n\r\n            return true;\r\n        }\r\n\r\n        [MenuItem(\"CONTEXT/Transform/Move To Scene Camera\")]\r\n        public static void MoveToSceneCamera_Transform(MenuCommand cmnd)\r\n        {\r\n            var go = com.spacepuppy.Utils.GameObjectUtil.GetGameObjectFromSource(cmnd.context);\r\n            if (go == null) return;\r\n\r\n            var view = SceneView.lastActiveSceneView;\r\n            if (view == null || view.camera == null) return;\r\n\r\n            var t = view.camera.transform;\r\n            go.transform.position = t.position;\r\n            go.transform.rotation = t.rotation;\r\n        }\r\n        [MenuItem(\"CONTEXT/Transform/Move To Scene Camera\", validate = true)]\r\n        public static bool MoveToSceneCamera_Transform_Validate(MenuCommand cmnd)\r\n        {\r\n            var go = com.spacepuppy.Utils.GameObjectUtil.GetGameObjectFromSource(cmnd.context);\r\n            if (go == null) return false;\r\n\r\n            return true;\r\n        }\r\n\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/ComponentHeaderDrawers/ForceRootTagHeaderDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n    [CustomPropertyDrawer(typeof(ForceRootTagAttribute))]\r\n    public class ForceRootTagHeaderDrawer : ComponentHeaderDrawer\r\n    {\r\n\r\n\r\n        public override float GetHeight(SerializedObject serializedObject)\r\n        {\r\n            return 0f;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedObject serializedObject)\r\n        {\r\n            var go = GameObjectUtil.GetGameObjectFromSource(serializedObject.targetObject);\r\n            if (go != null && !go.HasTag(SPConstants.TAG_ROOT)) go.AddTag(SPConstants.TAG_ROOT);\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/ComponentHeaderDrawers/RequireColliderHeaderDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(RequireColliderAttribute))]\r\n    public class RequireColliderHeaderDrawer : ComponentHeaderDrawer\r\n    {\r\n        private const string MSG_FRM = \"Component of type '{0}' requires a collider or rigidbody to be attached.\";\r\n\r\n        public override float GetHeight(SerializedObject serializedObject)\r\n        {\r\n            var attrib = this.Attribute as RequireColliderAttribute;\r\n            if (attrib == null || this.Validate(serializedObject))\r\n            {\r\n                return 0f;\r\n            }\r\n            else\r\n            {\r\n                GUIStyle style = GUI.skin.GetStyle(\"HelpBox\");\r\n                return Mathf.Max(40f, style.CalcHeight(EditorHelper.TempContent(string.Format(MSG_FRM, this.ComponentType.Name)), EditorGUIUtility.currentViewWidth));\r\n            }\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedObject serializedObject)\r\n        {\r\n            var attrib = this.Attribute as ComponentHeaderAttribute;\r\n            if (attrib != null && !this.Validate(serializedObject))\r\n            {\r\n                EditorGUI.HelpBox(position, string.Format(MSG_FRM, this.ComponentType.Name), MessageType.Error);\r\n            }\r\n        }\r\n\r\n        private bool Validate(SerializedObject serializedObject)\r\n        {\r\n            var go = GameObjectUtil.GetGameObjectFromSource(serializedObject.targetObject);\r\n            if(go == null) return true;\r\n\r\n            return (go.HasComponent<Rigidbody>() || go.HasComponent<Collider>() || go.HasComponent<Rigidbody2D>() || go.HasComponent<Collider2D>());\r\n        }\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/ComponentHeaderDrawers/RequireComponentInEntityHeaderDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(RequireComponentInEntityAttribute))]\r\n    public class RequireComponentInEntityHeaderDrawer : ComponentHeaderDrawer\r\n    {\r\n\r\n        private const string MSG_FRM = \"Component of type '{0}' requires a '{1}' component to be attached somewhere in the entity.\";\r\n\r\n        public override float GetHeight(SerializedObject serializedObject)\r\n        {\r\n            var attrib = this.Attribute as RequireComponentInEntityAttribute;\r\n            System.Type missingComponentType;\r\n            if (attrib == null || this.Validate(serializedObject, out missingComponentType))\r\n            {\r\n                return 0f;\r\n            }\r\n            else\r\n            {\r\n                GUIStyle style = GUI.skin.GetStyle(\"HelpBox\");\r\n                return Mathf.Max(40f, style.CalcHeight(EditorHelper.TempContent(string.Format(MSG_FRM, this.ComponentType.Name, missingComponentType.Name)), EditorGUIUtility.currentViewWidth));\r\n            }\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedObject serializedObject)\r\n        {\r\n            var attrib = this.Attribute as RequireComponentInEntityAttribute;\r\n            System.Type missingComponentType;\r\n            if (attrib != null && !this.Validate(serializedObject, out missingComponentType))\r\n            {\r\n                EditorGUI.HelpBox(position, string.Format(MSG_FRM, this.ComponentType.Name, missingComponentType.Name), MessageType.Error);\r\n            }\r\n        }\r\n\r\n        private bool Validate(SerializedObject serializedObject, out System.Type missingComponentType)\r\n        {\r\n            var c = serializedObject.targetObject as Component;\r\n            missingComponentType = null;\r\n            if (c == null) return true;\r\n            return !com.spacepuppy.Utils.Assertions.AssertRequireComponentInEntityAttrib(c, out missingComponentType, true);\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/ComponentHeaderDrawers/RequireLayerHeaderDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(RequireLayerAttribute))]\r\n    public class RequireLayerHeaderDrawer : ComponentHeaderDrawer\r\n    {\r\n\r\n        public override float GetHeight(SerializedObject serializedObject)\r\n        {\r\n            var attrib = this.Attribute as RequireLayerAttribute;\r\n            if(attrib == null) return 0f;\r\n\r\n            GUIStyle style = GUI.skin.GetStyle(\"HelpBox\");\r\n            return Mathf.Max(40f, style.CalcHeight(EditorHelper.TempContent(\"This component requires the current layer to be set to '\" + LayerMask.LayerToName(attrib.Layer) + \"'.\"), EditorGUIUtility.currentViewWidth));\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedObject serializedObject)\r\n        {\r\n            var attrib = this.Attribute as RequireLayerAttribute;\r\n\r\n            if (attrib != null)\r\n            {\r\n                var go = (serializedObject.targetObject as Component).gameObject;\r\n                if(go.layer != attrib.Layer)\r\n                {\r\n                    go.layer = attrib.Layer;\r\n                    EditorUtility.SetDirty(go);\r\n                }\r\n            }\r\n\r\n            EditorGUI.HelpBox(position, \"This component requires the current layer to be set to '\" + LayerMask.LayerToName(attrib.Layer) + \"'.\", MessageType.Info);\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/ComponentHeaderDrawers/RequireLikeComponentHeaderDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(RequireLikeComponentAttribute))]\r\n    public class RequireLikeComponentHeaderDrawer : ComponentHeaderDrawer\r\n    {\r\n\r\n        private const string MSG_FRM = \"Component of type '{0}' requires a component like '{1}' to also be attached to the GameObject.\";\r\n\r\n        public override float GetHeight(SerializedObject serializedObject)\r\n        {\r\n            var attrib = this.Attribute as RequireLikeComponentAttribute;\r\n            System.Type missingComponentType;\r\n            if (attrib == null || this.Validate(serializedObject, out missingComponentType))\r\n            {\r\n                return 0f;\r\n            }\r\n            else\r\n            {\r\n                GUIStyle style = GUI.skin.GetStyle(\"HelpBox\");\r\n                return Mathf.Max(40f, style.CalcHeight(EditorHelper.TempContent(string.Format(MSG_FRM, this.ComponentType.Name, missingComponentType.Name)), EditorGUIUtility.currentViewWidth));\r\n            }\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedObject serializedObject)\r\n        {\r\n            var attrib = this.Attribute as RequireLikeComponentAttribute;\r\n            System.Type missingComponentType;\r\n            if (attrib != null && !this.Validate(serializedObject, out missingComponentType))\r\n            {\r\n                EditorGUI.HelpBox(position, string.Format(MSG_FRM, this.ComponentType.Name, missingComponentType.Name), MessageType.Error);\r\n            }\r\n        }\r\n\r\n        private bool Validate(SerializedObject serializedObject, out System.Type missingComponentType)\r\n        {\r\n            var c = serializedObject.targetObject as Component;\r\n            missingComponentType = null;\r\n            if (c == null) return true;\r\n            return !com.spacepuppy.Utils.Assertions.AssertRequireLikeComponentAttrib(c, out missingComponentType, true);\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/ComponentHeaderDrawers/UniqueToEntityHeaderDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(UniqueToEntityAttribute))]\r\n    public class UniqueToEntityHeaderDrawer : ComponentHeaderDrawer\r\n    {\r\n\r\n        private const string MSG_FRM = \"Component of type '{0}' must be unique to the entity.\";\r\n\r\n        public override float GetHeight(SerializedObject serializedObject)\r\n        {\r\n            var attrib = this.Attribute as UniqueToEntityAttribute;\r\n            if (attrib == null || this.Validate(serializedObject))\r\n            {\r\n                return 0f;\r\n            }\r\n            else\r\n            {\r\n                GUIStyle style = GUI.skin.GetStyle(\"HelpBox\");\r\n                return Mathf.Max(40f, style.CalcHeight(EditorHelper.TempContent(string.Format(MSG_FRM, this.ComponentType.Name)), EditorGUIUtility.currentViewWidth));\r\n            }\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedObject serializedObject)\r\n        {\r\n            var attrib = this.Attribute as UniqueToEntityAttribute;\r\n            if (attrib != null && !this.Validate(serializedObject))\r\n            {\r\n                EditorGUI.HelpBox(position, string.Format(MSG_FRM, this.ComponentType.Name), MessageType.Error);\r\n            }\r\n        }\r\n\r\n        private bool Validate(SerializedObject serializedObject)\r\n        {\r\n            var c = serializedObject.targetObject as Component;\r\n            if (c == null) return true;\r\n            return !com.spacepuppy.Utils.Assertions.AssertUniqueToEntityAttrib(c, true);\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Decorators/InfoboxDecorator.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(InfoboxAttribute))]\r\n    public class InfoboxDecorator : DecoratorDrawer\r\n    {\r\n\r\n        public override float GetHeight()\r\n        {\r\n            return InfoboxDecorator.GetHeight(this.attribute as InfoboxAttribute);\r\n        }\r\n\r\n        public override void OnGUI(Rect position)\r\n        {\r\n            InfoboxDecorator.OnGUI(position, this.attribute as InfoboxAttribute);\r\n        }\r\n\r\n\r\n        public static float GetHeight(InfoboxAttribute attrib)\r\n        {\r\n            GUIStyle style = GUI.skin.GetStyle(\"HelpBox\");\r\n            return Mathf.Max(40f, style.CalcHeight(new GUIContent(attrib.Message), EditorGUIUtility.currentViewWidth));\r\n        }\r\n\r\n        public static void OnGUI(Rect position, InfoboxAttribute attrib)\r\n        {\r\n            EditorGUI.HelpBox(position, attrib.Message, (MessageType)attrib.MessageType);\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/AdvancedAnimationInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomEditor(typeof(Animation), true)]\r\n    public class AdvancedAnimationInspector : SPEditor\r\n    {\r\n        private const string PROP_ANIMATION = \"m_Animation\";\r\n        private const string PROP_ANIMATIONS = \"m_Animations\";\r\n        private const string PROP_PLAYAUTOMATICALLY = \"m_PlayAutomatically\";\r\n        private const string PROP_ANIMATE_PHYSICS = \"m_AnimatePhysics\";\r\n        private const string PROP_CULLINGTYPE = \"m_CullingType\";\r\n\r\n        #region Fields\r\n\r\n        private SPReorderableList _animList;\r\n\r\n        #endregion\r\n\r\n        #region OnGUI\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _animList = new SPReorderableList(this.serializedObject, this.serializedObject.FindProperty(PROP_ANIMATIONS), true, true, true, true);\r\n            _animList.drawHeaderCallback = this._animList_DrawHeader;\r\n            _animList.drawElementCallback = this._animList_DrawElement;\r\n            _animList.onAddCallback = this._animList_OnAdded;\r\n            _animList.onRemoveCallback = this._animList_OnRemoved;\r\n\r\n            _animList.draggable = !Application.isPlaying;\r\n            _animList.displayAdd = !Application.isPlaying;\r\n            _animList.displayRemove = !Application.isPlaying;\r\n        }\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            if (!SpacepuppySettings.UseAdvancedAnimationInspector)\r\n            {\r\n                this.DrawDefaultStandardInspector();\r\n                return;\r\n            }\r\n\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPlayAnimPopup();\r\n\r\n            //_animList.DoLayoutList();\r\n            var rect = EditorGUILayout.GetControlRect(false, _animList.GetHeight());\r\n            _animList.DoList(rect);\r\n\r\n            rect = new Rect(rect.xMin, rect.yMax - EditorGUIUtility.singleLineHeight + 1f, Mathf.Min(EditorGUIUtility.labelWidth, 60f), EditorGUIUtility.singleLineHeight - 1f);\r\n            if(GUI.Button(rect, \"Clear All\"))\r\n            {\r\n                _animList.serializedProperty.arraySize = 0;\r\n            }\r\n\r\n\r\n            this.DrawPropertyField(PROP_ANIMATE_PHYSICS);\r\n            this.DrawPropertyField(PROP_CULLINGTYPE);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n        private void DrawPlayAnimPopup()\r\n        {\r\n            var clips = new List<AnimationClip>();\r\n            for (int i = 0; i < _animList.serializedProperty.arraySize; i++)\r\n            {\r\n                var clip = _animList.serializedProperty.GetArrayElementAtIndex(i).objectReferenceValue as AnimationClip;\r\n                if(clip != null)\r\n                {\r\n                    clips.Add(clip);\r\n                }\r\n            }\r\n\r\n            var names = from c in clips select c.name;\r\n\r\n            var animToPlayProp = this.serializedObject.FindProperty(PROP_ANIMATION);\r\n            int index = clips.IndexOf(animToPlayProp.objectReferenceValue as AnimationClip) + 1;\r\n            index = EditorGUILayout.Popup(new GUIContent(\"Play Automatically\"), index, (from n in names.Prepend(\"Play Nothing\") select new GUIContent(n)).ToArray());\r\n            animToPlayProp.objectReferenceValue = (index > 0) ? clips[index - 1] : null;\r\n\r\n\r\n            this.serializedObject.FindProperty(PROP_PLAYAUTOMATICALLY).boolValue = animToPlayProp.objectReferenceValue != null;\r\n        }\r\n\r\n        public override bool RequiresConstantRepaint()\r\n        {\r\n            return Application.isPlaying;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Anim ReorderableList Handlers\r\n\r\n        private void _animList_DrawHeader(Rect area)\r\n        {\r\n            EditorGUI.LabelField(area, \"Animation States\");\r\n        }\r\n\r\n        private void _animList_DrawElement(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            var element = _animList.serializedProperty.GetArrayElementAtIndex(index);\r\n\r\n            GUIContent label;\r\n            if (Application.isPlaying && !this.serializedObject.isEditingMultipleObjects)\r\n            {\r\n                var targ = this.target as Animation;\r\n                var clip = element.objectReferenceValue as AnimationClip;\r\n                if (targ.IsPlaying(clip.name))\r\n                {\r\n                    label = EditorHelper.TempContent(\"Anim \" + index.ToString(\"00\") + \" : (Playing)\");\r\n                }\r\n                else\r\n                {\r\n                    label = EditorHelper.TempContent(\"Anim \" + index.ToString(\"00\"));\r\n                }\r\n            }\r\n            else\r\n            {\r\n                label = EditorHelper.TempContent(\"Anim \" + index.ToString(\"00\"));\r\n            }\r\n\r\n            area.height = EditorGUIUtility.singleLineHeight;\r\n            //EditorGUI.PropertyField(area, element, label);\r\n\r\n            area = EditorGUI.PrefixLabel(area, label);\r\n            if(Application.isPlaying && !this.serializedObject.isEditingMultipleObjects)\r\n            {\r\n                if(SPEditorGUI.PlayButton(ref area))\r\n                {\r\n                    var targ = this.target as Animation;\r\n                    var clip = element.objectReferenceValue as AnimationClip;\r\n                    if (targ != null && clip != null)\r\n                    {\r\n                        targ.Play(clip.name, PlayMode.StopSameLayer);\r\n                    }\r\n                }\r\n            }\r\n            EditorGUI.PropertyField(area, element, GUIContent.none);\r\n\r\n\r\n            if (GUI.enabled) ReorderableListHelper.DrawDraggableElementDeleteContextMenu(_animList, area, index, isActive, isFocused);\r\n\r\n        }\r\n\r\n        private void _animList_OnAdded(ReorderableList lst)\r\n        {\r\n            lst.serializedProperty.arraySize++;\r\n            lst.index = lst.serializedProperty.arraySize - 1;\r\n\r\n            var element = lst.serializedProperty.GetArrayElementAtIndex(lst.serializedProperty.arraySize - 1);\r\n            element.objectReferenceValue = null;\r\n        }\r\n\r\n        private void _animList_OnRemoved(ReorderableList lst)\r\n        {\r\n            if(lst.index >= 0)\r\n            {\r\n                var element = lst.serializedProperty.GetArrayElementAtIndex(lst.index);\r\n                var animToPlay = this.serializedObject.FindProperty(PROP_ANIMATION);\r\n                if(animToPlay.objectReferenceValue != null && animToPlay.objectReferenceValue == element.objectReferenceValue)\r\n                {\r\n                    animToPlay.objectReferenceValue = null;\r\n                    this.serializedObject.FindProperty(PROP_PLAYAUTOMATICALLY).boolValue = false;\r\n                }\r\n                element.objectReferenceValue = null;\r\n                lst.serializedProperty.DeleteArrayElementAtIndex(lst.index);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/AnimationCurveConstraintPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Base\n{\n\n    [CustomPropertyDrawer(typeof(AnimationCurveConstraintAttribute))]\n    [CustomPropertyDrawer(typeof(AnimationCurveEaseScaleAttribute))]\n    public class AnimationCurveConstraintPropertyDrawer : PropertyDrawer\n    {\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            if(property.propertyType != SerializedPropertyType.AnimationCurve)\n            {\n                SPEditorGUI.DefaultPropertyField(position, property, label);\n                return;\n            }\n\n            \n            if(this.attribute is AnimationCurveConstraintAttribute)\n            {\n                var attrib = this.attribute as AnimationCurveConstraintAttribute;\n                var ranges = new Rect(attrib.x, attrib.y, attrib.width, attrib.height);\n                property.animationCurveValue = EditorGUI.CurveField(position, label, property.animationCurveValue, attrib.color, ranges);\n            }\n            else if (this.attribute is AnimationCurveEaseScaleAttribute)\n            {\n                var attrib = this.attribute as AnimationCurveEaseScaleAttribute;\n                var ranges = new Rect(0f, -Mathf.Max(0f, attrib.overscan), 1f, Mathf.Max(1f, 1f + attrib.overscan * 2f));\n                property.animationCurveValue = EditorGUI.CurveField(position, label, property.animationCurveValue, attrib.color, ranges);\n            }\n            else\n            {\n                SPEditorGUI.DefaultPropertyField(position, property, label);\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/ComparisonOperatorPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(ComparisonOperator))]\r\n    public class ComparisonOperatorPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        private static GUIContent[] _names = new GUIContent[] {\r\n            new GUIContent(\">\"),\r\n            new GUIContent(\">=\"),\r\n            new GUIContent(\"<\"),\r\n            new GUIContent(\"<=\"),\r\n            new GUIContent(\"==\"),\r\n            new GUIContent(\"!=\"),\r\n            new GUIContent(\"Always\")\r\n        };\r\n        private static ComparisonOperator[] _ops = new ComparisonOperator[] {\r\n            ComparisonOperator.GreaterThan,\r\n            ComparisonOperator.GreaterThan | ComparisonOperator.Equal,\r\n            ComparisonOperator.LessThan,\r\n            ComparisonOperator.LessThan | ComparisonOperator.Equal,\r\n            ComparisonOperator.Equal,\r\n            ComparisonOperator.NotEqual,\r\n            ComparisonOperator.Always\r\n        };\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var e = ConvertUtil.ToEnum<ComparisonOperator>(property.intValue);\r\n            if (e == ComparisonOperator.NotEqualAlt) e = ComparisonOperator.NotEqual;\r\n            int i = _ops.IndexOf(e);\r\n\r\n            i = EditorGUI.Popup(position, label, i, _names);\r\n            property.intValue = (i >= 0) ? (int)(_ops[i]) : (int)ComparisonOperator.GreaterThan;\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/ConstraintPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(Constraint))]\r\n    public class ConstraintPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            if (property.isExpanded)\r\n                return EditorGUIUtility.singleLineHeight * 3f;\r\n            else\r\n                return EditorGUIUtility.singleLineHeight;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            if(property.isExpanded)\r\n            {\r\n                var r1 = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n                var r2 = new Rect(position.xMin, r1.yMax, position.width, EditorGUIUtility.singleLineHeight);\r\n                var r3 = new Rect(position.xMin, r2.yMax, position.width, EditorGUIUtility.singleLineHeight);\r\n\r\n                property.isExpanded = EditorGUI.Foldout(r1, property.isExpanded, label);\r\n\r\n                EditorGUI.indentLevel++;\r\n\r\n                const float TOGGLE_WIDTH = 30f;\r\n                var e = property.GetEnumValue<Constraint>();\r\n                bool b;\r\n\r\n                //POSITION\r\n                r2 = EditorGUI.PrefixLabel(r2, EditorHelper.TempContent(\"Position\"));\r\n\r\n                b = (e & Constraint.XPosition) != 0;\r\n                EditorGUI.BeginChangeCheck();\r\n                b = GUI.Toggle(new Rect(r2.xMin, r2.yMin, TOGGLE_WIDTH, r2.height), b, \"X\");\r\n                if (EditorGUI.EndChangeCheck())\r\n                {\r\n                    if (b)\r\n                        e |= Constraint.XPosition;\r\n                    else\r\n                        e &= ~Constraint.XPosition;\r\n                }\r\n\r\n                b = (e & Constraint.YPosition) != 0;\r\n                EditorGUI.BeginChangeCheck();\r\n                b = GUI.Toggle(new Rect(r2.xMin + TOGGLE_WIDTH, r2.yMin, TOGGLE_WIDTH, r2.height), b, \"Y\");\r\n                if (EditorGUI.EndChangeCheck())\r\n                {\r\n                    if (b)\r\n                        e |= Constraint.YPosition;\r\n                    else\r\n                        e &= ~Constraint.YPosition;\r\n                }\r\n\r\n                b = (e & Constraint.ZPosition) != 0;\r\n                EditorGUI.BeginChangeCheck();\r\n                b = GUI.Toggle(new Rect(r2.xMin + TOGGLE_WIDTH + TOGGLE_WIDTH, r2.yMin, TOGGLE_WIDTH, r2.height), b, \"Z\");\r\n                if (EditorGUI.EndChangeCheck())\r\n                {\r\n                    if (b)\r\n                        e |= Constraint.ZPosition;\r\n                    else\r\n                        e &= ~Constraint.ZPosition;\r\n                }\r\n\r\n\r\n                //ROTATION\r\n                r3 = EditorGUI.PrefixLabel(r3, EditorHelper.TempContent(\"Rotation\"));\r\n\r\n                b = (e & Constraint.XRotation) != 0;\r\n                EditorGUI.BeginChangeCheck();\r\n                b = GUI.Toggle(new Rect(r3.xMin, r3.yMin, TOGGLE_WIDTH, r3.height), b, \"X\");\r\n                if (EditorGUI.EndChangeCheck())\r\n                {\r\n                    if (b)\r\n                        e |= Constraint.XRotation;\r\n                    else\r\n                        e &= ~Constraint.XRotation;\r\n                }\r\n\r\n                b = (e & Constraint.YRotation) != 0;\r\n                EditorGUI.BeginChangeCheck();\r\n                b = GUI.Toggle(new Rect(r3.xMin + TOGGLE_WIDTH, r3.yMin, TOGGLE_WIDTH, r3.height), b, \"Y\");\r\n                if (EditorGUI.EndChangeCheck())\r\n                {\r\n                    if (b)\r\n                        e |= Constraint.YRotation;\r\n                    else\r\n                        e &= ~Constraint.YRotation;\r\n                }\r\n\r\n                b = (e & Constraint.ZRotation) != 0;\r\n                EditorGUI.BeginChangeCheck();\r\n                b = GUI.Toggle(new Rect(r3.xMin + TOGGLE_WIDTH + TOGGLE_WIDTH, r3.yMin, TOGGLE_WIDTH, r3.height), b, \"Z\");\r\n                if (EditorGUI.EndChangeCheck())\r\n                {\r\n                    if (b)\r\n                        e |= Constraint.ZRotation;\r\n                    else\r\n                        e &= ~Constraint.ZRotation;\r\n                }\r\n\r\n\r\n                property.SetEnumValue<Constraint>(e & Constraint.All);\r\n\r\n                EditorGUI.indentLevel--;\r\n            }\r\n            else\r\n            {\r\n                property.isExpanded = EditorGUI.Foldout(position, property.isExpanded, label);\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/DefaultOrConfiguredAttributePropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(DefaultOrConfiguredAttribute), true)]\r\n    public class DefaultOrConfiguredAttributePropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var attrib = this.attribute as DefaultOrConfiguredAttribute;\r\n            if(attrib == null)\r\n            {\r\n                SPEditorGUI.DefaultPropertyField(position, property, label);\r\n                return;\r\n            }\r\n\r\n            \r\n            if(attrib.DrawAsDefault(EditorHelper.GetPropertyValue(property)))\r\n            {\r\n                var value = attrib.GetValueToDisplayAsDefault();\r\n\r\n                label.text += \" (Default Value)\";\r\n                EditorGUI.BeginChangeCheck();\r\n                value = SPEditorGUI.DefaultPropertyField(position, label, value, attrib.FieldType);\r\n                if (EditorGUI.EndChangeCheck())\r\n                    EditorHelper.SetPropertyValue(property, value);\r\n            }\r\n            else\r\n            {\r\n                var r0 = new Rect(position.xMin, position.yMin, Mathf.Max(0f, position.width - SPEditorGUI.X_BTN_WIDTH), position.height);\r\n                SPEditorGUI.DefaultPropertyField(r0, property, label);\r\n\r\n                var w = position.width = r0.width;\r\n                if(w > 1f)\r\n                {\r\n                    var r1 = new Rect(position.xMax - w, position.yMin, w, EditorGUIUtility.singleLineHeight);\r\n                    if (SPEditorGUI.XButton(r1, \"Reset to default value.\"))\r\n                    {\r\n                        EditorHelper.SetPropertyValue(property, attrib.GetDefaultValue());\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/DiscreteFloatPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(DiscreteFloat))]\r\n    public class DiscreteFloatPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var valueProp = property.FindPropertyRelative(\"_value\");\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n\r\n            var value = EditorGUI.FloatField(position, label, valueProp.floatValue);\r\n            \r\n            if (EditorGUI.EndChangeCheck())\r\n            {\r\n                //if the value increased ever so much, ceil the value, good for the mouse scroll\r\n                value = NormalizeValue(valueProp.floatValue, value);\r\n\r\n                if (this.fieldInfo != null)\r\n                {\r\n                    var attribs = this.fieldInfo.GetCustomAttributes(typeof(DiscreteFloat.ConfigAttribute), false) as DiscreteFloat.ConfigAttribute[];\r\n                    foreach (var attrib in attribs)\r\n                    {\r\n                        value = attrib.Normalize(value);\r\n                    }\r\n\r\n                    //if the value increased ever so much, ceil the value, good for the mouse scroll\r\n                    value = NormalizeValue(valueProp.floatValue, value);\r\n                }\r\n\r\n                valueProp.floatValue = value;\r\n            }\r\n        }\r\n\r\n\r\n        public static float NormalizeValue(float oldValue, float newValue)\r\n        {\r\n            return (newValue != oldValue && MathUtil.Shear(newValue) == oldValue) ? Mathf.Ceil(newValue) : Mathf.Floor(newValue);\r\n        }\r\n\r\n        public static float GetValue(SerializedProperty prop)\r\n        {\r\n            if(prop != null)\r\n            {\r\n                var propValue = prop.FindPropertyRelative(\"_value\");\r\n                return propValue != null && propValue.propertyType == SerializedPropertyType.Float ? propValue.floatValue : float.NaN;\r\n            }\r\n\r\n            return float.NaN;\r\n        }\r\n\r\n        public static float SetValue(SerializedProperty prop, float value)\r\n        {\r\n            if (prop != null)\r\n            {\r\n                var propValue = prop.FindPropertyRelative(\"_value\");\r\n                if (propValue != null && propValue.propertyType == SerializedPropertyType.Float)\r\n                {\r\n                    propValue.floatValue = Mathf.Round(value);\r\n                }\r\n            }\r\n\r\n            return float.NaN;\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/DisplayFlatPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(DisplayFlatAttribute))]\r\n    public class DisplayFlatPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        private static readonly float TOP_PAD = 2f + EditorGUIUtility.singleLineHeight;\r\n        private const float BOTTOM_PAD = 2f;\r\n        private const float MARGIN = 2f;\r\n        \r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            bool canShrink = this.attribute is DisplayFlatAttribute ? (this.attribute as DisplayFlatAttribute).CanShrinkAndExpand : false;\r\n\r\n            bool cache = property.isExpanded;\r\n            if (!canShrink)\r\n            {\r\n                property.isExpanded = true;\r\n            }\r\n\r\n            try\r\n            {\r\n                if(property.isExpanded)\r\n                {\r\n                    if (property.hasChildren)\r\n                    {\r\n                        return SPEditorGUI.GetDefaultPropertyHeight(property, label, true) + BOTTOM_PAD + TOP_PAD - EditorGUIUtility.singleLineHeight;\r\n                    }\r\n                    else\r\n                    {\r\n                        return SPEditorGUI.GetDefaultPropertyHeight(property, label);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    return EditorGUIUtility.singleLineHeight + BOTTOM_PAD;\r\n                }\r\n            }\r\n            catch(System.Exception ex)\r\n            {\r\n                throw ex;\r\n            }\r\n            finally\r\n            {\r\n                property.isExpanded = cache;\r\n            }\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            bool canShrink = this.attribute is DisplayFlatAttribute ? (this.attribute as DisplayFlatAttribute).CanShrinkAndExpand : false;\r\n\r\n            bool cache = property.isExpanded;\r\n            if (!canShrink)\r\n            {\r\n                property.isExpanded = true;\r\n            }\r\n            try\r\n            {\r\n                if (!property.hasChildren)\r\n                {\r\n                    SPEditorGUI.DefaultPropertyField(position, property, label);\r\n                    return;\r\n                }\r\n\r\n                if (canShrink) cache = SPEditorGUI.PrefixFoldoutLabel(position, property.isExpanded, GUIContent.none);\r\n\r\n                if (property.isExpanded)\r\n                {\r\n                    float h = SPEditorGUI.GetDefaultPropertyHeight(property, label, true) + BOTTOM_PAD + TOP_PAD - EditorGUIUtility.singleLineHeight;\r\n                    var area = new Rect(position.x, position.yMax - h, position.width, h);\r\n                    var drawArea = new Rect(area.x, area.y + TOP_PAD, area.width - MARGIN, area.height - TOP_PAD);\r\n\r\n                    GUI.BeginGroup(area, label, GUI.skin.box);\r\n                    GUI.EndGroup();\r\n\r\n                    EditorGUI.indentLevel++;\r\n                    SPEditorGUI.FlatChildPropertyField(drawArea, property);\r\n                    EditorGUI.indentLevel--;\r\n                }\r\n                else\r\n                {\r\n                    GUI.BeginGroup(position, label, GUI.skin.box);\r\n                    GUI.EndGroup();\r\n                }\r\n            }\r\n            catch (System.Exception ex)\r\n            {\r\n                throw ex;\r\n            }\r\n            finally\r\n            {\r\n                property.isExpanded = cache;\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/DisplayNestedPropertyPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(DisplayNestedPropertyAttribute))]\r\n    public class DisplayNestedPropertyPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            var attrib = this.attribute as DisplayNestedPropertyAttribute;\r\n            if(attrib != null)\r\n            {\r\n                var p = property.FindPropertyRelative(attrib.InnerPropName);\r\n                return EditorGUI.GetPropertyHeight(property, label);\r\n            }\r\n            else\r\n            {\r\n                return EditorGUIUtility.singleLineHeight;\r\n            }\r\n\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var attrib = this.attribute as DisplayNestedPropertyAttribute;\r\n            if(attrib == null)\r\n            {\r\n                EditorGUI.LabelField(position, label, EditorHelper.TempContent(\"DisplayNestedPropertyAttribute could not be found.\"));\r\n                return;\r\n            }\r\n\r\n            var p = property.FindPropertyRelative(attrib.InnerPropName);\r\n            if (p != null)\r\n            {\r\n                if(attrib.Label != null) label = EditorHelper.TempContent(attrib.Label, attrib.Tooltip);\r\n                SPEditorGUI.DefaultPropertyField(position, p, label);\r\n            }\r\n            else\r\n            {\r\n                EditorGUI.LabelField(position, label, EditorHelper.TempContent(string.Format(\"Nested Property with name {0} could not be found.\", attrib.InnerPropName)));\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/EnumFlagsPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(EnumFlagsAttribute))]\r\n    public class EnumFlagsPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            EditorGUI.BeginProperty(position, label, property);\r\n\r\n            var attrib = this.attribute as EnumFlagsAttribute;\r\n            var tp = (attrib.EnumType != null && attrib.EnumType.IsEnum) ? attrib.EnumType : this.fieldInfo.FieldType;\r\n            if(tp.IsEnum)\r\n            {\r\n                property.intValue = SPEditorGUI.EnumFlagField(position, tp, label, property.intValue);\r\n                property.serializedObject.ApplyModifiedProperties();\r\n            }\r\n            else\r\n            {\r\n                EditorGUI.LabelField(position, label);\r\n            }\r\n\r\n            EditorGUI.EndProperty();\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/EnumInCustomOrderPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Utils;\nusing System;\n\nnamespace com.spacepuppyeditor.Base\n{\n\n    [CustomPropertyDrawer(typeof(EnumInCustomOrderAttribute))]\n    public class EnumInCustomOrderPropertyDrawer : PropertyDrawer\n    {\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            var enumType = this.fieldInfo.FieldType;\n            if (!enumType.IsEnum)\n            {\n                EditorGUI.PropertyField(position, property, label);\n                return;\n            }\n\n            System.Enum evalue = property.GetEnumValue(enumType);\n            var attrib = this.attribute as EnumInCustomOrderAttribute;\n            if(attrib != null && attrib.customOrder != null)\n            {\n                var values = attrib.customOrder.Select(i => EditorHelper.TempContent(EnumUtil.GetFriendlyName(System.Enum.ToObject(enumType, i) as System.Enum))).ToArray();\n                int index = System.Array.IndexOf(attrib.customOrder, property.intValue);\n                index = EditorGUI.Popup(position, label, index, values);\n                property.intValue = index >= 0 && index < attrib.customOrder.Length ? attrib.customOrder[index] : -1;\n            }\n            else\n            {\n                property.SetEnumValue(EditorGUI.EnumPopup(position, label, evalue));\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/EnumPopupExcludingPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(EnumPopupExcludingAttribute))]\r\n    public class EnumPopupExcludingPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var enumType = this.fieldInfo.FieldType;\r\n            if(!enumType.IsEnum)\r\n            {\r\n                EditorGUI.PropertyField(position, property, label);\r\n                return;\r\n            }\r\n\r\n            System.Enum evalue = property.GetEnumValue(enumType);\r\n            var attrib = this.attribute as EnumPopupExcludingAttribute;\r\n            if(attrib != null && attrib.excludedValues != null && attrib.excludedValues.Length > 0)\r\n            {\r\n                var excludedValues = (from i in attrib.excludedValues select ConvertUtil.ToEnumOfType(enumType, i)).ToArray();\r\n                //property.enumValueIndex = ConvertUtil.ToInt(SPEditorGUI.EnumPopupExcluding(position, label, evalue, excludedValues));\r\n                property.SetEnumValue(SPEditorGUI.EnumPopupExcluding(position, label, evalue, excludedValues));\r\n            }\r\n            else\r\n            {\r\n                //property.enumValueIndex = ConvertUtil.ToInt(EditorGUI.EnumPopup(position, label, evalue));\r\n                property.SetEnumValue(EditorGUI.EnumPopup(position, label, evalue));\r\n            }\r\n\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/EnumPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Base\n{\n\n    [CustomPropertyDrawer(typeof(System.Enum), true)]\n    public class EnumPropertyDrawer : PropertyDrawer\n    {\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            var tp = this.fieldInfo.FieldType;\n            if (TypeUtil.IsListType(tp)) tp = TypeUtil.GetElementTypeOfListType(tp);\n            if (!tp.IsEnum)\n            {\n                SPEditorGUI.DefaultPropertyField(position, property, label);\n                return;\n            }\n\n            System.Enum e = property.GetEnumValue(tp);\n            e = SPEditorGUI.EnumPopup(position, label, e);\n            property.SetEnumValue(e);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/EulerRotationInspectorPropertyDrawer.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(EulerRotationInspectorAttribute))]\r\n    public class EulerRotationInspectorPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            EditorGUI.BeginChangeCheck();\r\n            EditorGUI.BeginProperty(position, label, property);\r\n\r\n            var attr = this.attribute as EulerRotationInspectorAttribute;\r\n            switch (property.propertyType)\r\n            {\r\n                case SerializedPropertyType.Quaternion:\r\n                    property.quaternionValue = SPEditorGUI.QuaternionField(position, label, property.quaternionValue, attr.UseRadians);\r\n                    break;\r\n                case SerializedPropertyType.Vector3:\r\n                    //3d rotation\r\n                    var v = property.vector3Value;\r\n                    v.x = MathUtil.NormalizeAngle(v.x, attr.UseRadians);\r\n                    v.y = MathUtil.NormalizeAngle(v.y, attr.UseRadians);\r\n                    v.z = MathUtil.NormalizeAngle(v.z, attr.UseRadians);\r\n\r\n                    v = EditorGUI.Vector3Field(position, label, v);\r\n\r\n                    v.x = MathUtil.NormalizeAngle(v.x, attr.UseRadians);\r\n                    v.y = MathUtil.NormalizeAngle(v.y, attr.UseRadians);\r\n                    v.z = MathUtil.NormalizeAngle(v.z, attr.UseRadians);\r\n\r\n                    property.vector3Value = v;\r\n                    break;\r\n                case SerializedPropertyType.Float:\r\n                    //2d rotation\r\n                    float a = MathUtil.NormalizeAngle(property.floatValue, attr.UseRadians);\r\n\r\n                    a = EditorGUI.FloatField(position, label, a);\r\n\r\n                    a = MathUtil.NormalizeAngle(a, attr.UseRadians);\r\n\r\n                    property.floatValue = a;\r\n\r\n                    //property.floatValue = FloatAngle(new Rect(0, 0, 30, 30), property.floatValue);\r\n                    break;\r\n            }\r\n\r\n            EditorGUI.EndProperty();\r\n            if (EditorGUI.EndChangeCheck())\r\n                property.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n\r\n\r\n\r\n        //private static Texture KnobBack;\r\n        private static Texture Knob;\r\n        private static Vector2 mousePosition;\r\n\r\n        public static float FloatAngle(Rect rect, float value)\r\n        {\r\n            return FloatAngle(rect, value, -1, -1, -1);\r\n        }\r\n\r\n        public static float FloatAngle(Rect rect, float value, float snap)\r\n        {\r\n            return FloatAngle(rect, value, snap, -1, -1);\r\n        }\r\n\r\n        public static float FloatAngle(Rect rect, float value, float snap, float min, float max)\r\n        {\r\n            if (Knob == null)\r\n            {\r\n                Knob = EditorGUIUtility.Load(\"../Assets/Knob.png\") as Texture;\r\n            }\r\n\r\n\r\n            int id = GUIUtility.GetControlID(FocusType.Passive, rect);\r\n\r\n            Rect knobRect = new Rect(rect.x, rect.y, rect.height, rect.height);\r\n\r\n            float delta;\r\n            if (min != max)\r\n                delta = ((max - min) / 360);\r\n            else\r\n                delta = 1;\r\n\r\n            if (Event.current != null)\r\n            {\r\n                if (Event.current.type == EventType.MouseDown && knobRect.Contains(Event.current.mousePosition))\r\n                {\r\n                    GUIUtility.hotControl = id;\r\n                    mousePosition = Event.current.mousePosition;\r\n                }\r\n                else if (Event.current.type == EventType.MouseUp && GUIUtility.hotControl == id)\r\n                    GUIUtility.hotControl = 0;\r\n                else if (Event.current.type == EventType.MouseDrag && GUIUtility.hotControl == id)\r\n                {\r\n                    Vector2 move = mousePosition - Event.current.mousePosition;\r\n                    value += delta * (-move.x - move.y);\r\n\r\n                    if (snap > 0)\r\n                    {\r\n                        float mod = value % snap;\r\n\r\n                        if (mod < (delta * 3) || Mathf.Abs(mod - snap) < (delta * 3))\r\n                            value = Mathf.Round(value / snap) * snap;\r\n                    }\r\n\r\n                    mousePosition = Event.current.mousePosition;\r\n                    GUI.changed = true;\r\n                }\r\n            }\r\n\r\n            //GUI.DrawTexture(knobRect, KnobBack);\r\n            Matrix4x4 matrix = GUI.matrix;\r\n\r\n            if (min != max)\r\n                GUIUtility.RotateAroundPivot(value * (360 / (max - min)), knobRect.center);\r\n            else\r\n                GUIUtility.RotateAroundPivot(value, knobRect.center);\r\n\r\n            GUI.DrawTexture(knobRect, Knob);\r\n            GUI.matrix = matrix;\r\n\r\n            Rect label = new Rect(rect.x + rect.height, rect.y + (rect.height / 2) - 9, rect.height, 18);\r\n            value = EditorGUI.FloatField(label, value);\r\n\r\n            if (min != max)\r\n                value = Mathf.Clamp(value, min, max);\r\n\r\n            return value;\r\n        }\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/FixedPercentDecimalPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(FixedPercentDecimal))]\r\n    public class FixedPercentDecimalPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var obj = EditorHelper.GetTargetObjectWithProperty(property);\r\n            FixedPercentDecimal value = (FixedPercentDecimal)this.fieldInfo.GetValue(obj);\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            value = (FixedPercentDecimal)EditorGUI.DoubleField(position, label, (double)value);\r\n            if (EditorGUI.EndChangeCheck())\r\n                this.fieldInfo.SetValue(obj, value);\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/FixedPercentLongPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(FixedPercentLong))]\r\n    public class FixedPercentLongPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var valueProp = property.FindPropertyRelative(\"_value\");\r\n            var fractProp = property.FindPropertyRelative(\"_fract\");\r\n            decimal value = (decimal)valueProp.longValue + (decimal)fractProp.intValue / FixedPercentLong.RNG_FRACT;\r\n\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            value = (FixedPercentDecimal)EditorGUI.DoubleField(position, label, (double)value);\r\n            if (EditorGUI.EndChangeCheck())\r\n            {\r\n                valueProp.longValue = (long)System.Math.Floor(value);\r\n                fractProp.intValue = (int)((value % 1M) * FixedPercentLong.RNG_FRACT);\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/FixedPercentPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(FixedPercent))]\r\n    public class FixedPercentPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var attrib = this.fieldInfo.GetCustomAttributes(typeof(FixedPercent.ConfigAttribute), false).FirstOrDefault() as FixedPercent.ConfigAttribute;\r\n            decimal min = FixedPercent.MIN_VALUE;\r\n            decimal max = FixedPercent.MAX_VALUE;\r\n            bool useSlider = false;\r\n            bool asPercent = false;\r\n            if (attrib != null)\r\n            {\r\n                useSlider = attrib.displayAsRange;\r\n                if (attrib.min > (float)min && attrib.min < (float)FixedPercent.MAX_VALUE) min = (decimal)attrib.min;\r\n                if (attrib.max < (float)max && attrib.max > (float)FixedPercent.MIN_VALUE) max = (decimal)attrib.max;\r\n                asPercent = attrib.displayAsPercent;\r\n            }\r\n\r\n\r\n\r\n            if (asPercent) label.text += \" (Percentage)\";\r\n            position = EditorGUI.PrefixLabel(position, label);\r\n\r\n            var valueProp = property.FindPropertyRelative(\"_value\");\r\n            decimal value = (decimal)valueProp.intValue / (decimal)FixedPercent.PRECISION;\r\n            \r\n            if(asPercent)\r\n            {\r\n                value *= 100M;\r\n                min *= 100M;\r\n                max *= 100M;\r\n            }\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            if(useSlider)\r\n            {\r\n                value = (decimal)EditorGUI.Slider(position, (float)value, (float)min, (float)max);\r\n            }\r\n            else\r\n            {\r\n                //value = EditorGUI.FloatField(position, value);\r\n                string sval = EditorGUI.TextField(position, value.ToString(\"0.######\"));\r\n                value = ConvertUtil.ToDecimal(sval);\r\n            }\r\n\r\n            if(EditorGUI.EndChangeCheck())\r\n            {\r\n                if (asPercent)\r\n                {\r\n                    value /= 100M;\r\n                    min /= 100M;\r\n                    max /= 100M;\r\n                }\r\n                \r\n                if (value > max) value = max;\r\n                if (value < min) value = min;\r\n                valueProp.intValue = (int)(value * (decimal)FixedPercent.PRECISION);\r\n            }\r\n\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/GameLoopEntryInspector.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing UnityEditorInternal;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Base\n{\n\n    [CustomEditor(typeof(GameLoopEntry))]\n    public class GameLoopEntryInspector : SingletonInspector\n    {\n\n        protected override void OnSPInspectorGUI()\n        {\n            base.OnSPInspectorGUI();\n            \n            if(Application.isPlaying)\n            {\n                EditorGUILayout.Space();\n                EditorGUILayout.LabelField(\"Runtime Info\", EditorStyles.boldLabel);\n                EditorGUILayout.LabelField(\"Running UpdatePump Hooks\", GameLoopEntry.UpdatePump.Count.ToString());\n                EditorGUILayout.LabelField(\"Running LateUpdatePump Hooks\", GameLoopEntry.LateUpdatePump.Count.ToString());\n                EditorGUILayout.LabelField(\"Running FixedUpdatePump Hooks\", GameLoopEntry.FixedUpdatePump.Count.ToString());\n            }\n        }\n\n        public override bool RequiresConstantRepaint()\n        {\n            return Application.isPlaying || base.RequiresConstantRepaint();\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/GameObjectNotificationDispatcherInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomEditor(typeof(GameObjectNotificationDispatcher))]\r\n    class GameObjectNotificationDispatcherInspector : SPEditor\r\n    {\r\n\r\n        private bool _expanded;\r\n\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            var targ = this.target as GameObjectNotificationDispatcher;\r\n            if(targ == null) return;\r\n\r\n            _expanded = EditorGUILayout.Foldout(_expanded, \"Observed Notifications\");\r\n\r\n            if(_expanded)\r\n            {\r\n                var observeredNotifications = targ.ListObserveredNotifications();\r\n                foreach (var tp in observeredNotifications)\r\n                {\r\n                    EditorGUILayout.LabelField(tp.Name);\r\n                }\r\n            }\r\n        }\r\n\r\n    }\r\n}"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/GenericMaskPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(GenericMaskAttribute))]\r\n    public class GenericMaskPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var attrib = this.attribute as GenericMaskAttribute;\r\n            if(attrib == null)\r\n            {\r\n                base.OnGUI(position, property, label);\r\n                return;\r\n            }\r\n\r\n            property.intValue = EditorGUI.MaskField(position, label, property.intValue, attrib.MaskNames);\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/InputIDPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Base\n{\n\n    [CustomPropertyDrawer(typeof(InputIDAttribute))]\n    public class InputIDPropertyDrawer : PropertyDrawer\n    {\n\n        private string[] _inputIds;\n\n        private void Init()\n        {\n            _inputIds = InputSettings.GetGlobalInputIds();\n        }\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            if (property.propertyType == SerializedPropertyType.String)\n            {\n                if (_inputIds == null) this.Init();\n\n                /*\n                var guiIds = (from s in _inputIds select EditorHelper.TempContent(s)).Append(EditorHelper.TempContent(\"Custom...\")).ToArray();\n                int index = System.Array.IndexOf(_inputIds, property.stringValue);\n                if (index < 0) index = _inputIds.Length;\n                if (index == _inputIds.Length)\n                {\n                    var fw = position.width - EditorGUIUtility.labelWidth;\n                    var wl = EditorGUIUtility.labelWidth + (fw / 4f);\n                    var wr = position.width - wl - 1f;\n\n                    var rl = new Rect(position.xMin, position.yMin, wl, EditorGUIUtility.singleLineHeight);\n                    var rr = new Rect(rl.xMax + 1f, rl.yMin, wr, EditorGUIUtility.singleLineHeight);\n\n                    index = EditorGUI.Popup(rl, label, index, guiIds);\n                    if (index >= 0 && index < _inputIds.Length)\n                    {\n                        property.stringValue = _inputIds[index];\n                    }\n                    else\n                    {\n                        property.stringValue = EditorGUI.TextField(rr, property.stringValue);\n                    }\n                }\n                else\n                {\n                    index = EditorGUI.Popup(position, label, index, guiIds);\n                    property.stringValue = (index >= 0 && index < _inputIds.Length) ? _inputIds[index] : null;\n                }\n                */\n\n                property.stringValue = SPEditorGUI.OptionPopupWithCustom(position, label, property.stringValue, _inputIds);\n            }\n            else\n            {\n                EditorGUI.PropertyField(position, property, label);\n            }\n        }\n        \n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/MaxRangePropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(MaxRangeAttribute))]\r\n    public class MaxRangePropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var attrib = this.attribute as MaxRangeAttribute;\r\n\r\n            switch (attrib != null ? property.propertyType : SerializedPropertyType.Generic)\r\n            {\r\n                case SerializedPropertyType.Float:\r\n                    property.floatValue = Mathf.Min(EditorGUI.FloatField(position, label, property.floatValue), attrib.Max);\r\n                    break;\r\n                case SerializedPropertyType.Integer:\r\n                    property.intValue = (int)Mathf.Min(EditorGUI.IntField(position, label, property.intValue), attrib.Max);\r\n                    break;\r\n                default:\r\n                    SPEditorGUI.DefaultPropertyField(position, property, label);\r\n                    break;\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/MinRangePropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(MinRangeAttribute))]\r\n    public class MinRangePropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var attrib = this.attribute as MinRangeAttribute;\r\n\r\n            switch(attrib != null ? property.propertyType : SerializedPropertyType.Generic)\r\n            {\r\n                case SerializedPropertyType.Float:\r\n                    property.floatValue = Mathf.Max(EditorGUI.FloatField(position, label, property.floatValue), attrib.Min);\r\n                    break;\r\n                case SerializedPropertyType.Integer:\r\n                    property.intValue = (int)Mathf.Max(EditorGUI.IntField(position, label, property.intValue), attrib.Min);\r\n                    break;\r\n                default:\r\n                    SPEditorGUI.DefaultPropertyField(position, property, label);\r\n                    break;\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/MultiTagInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomEditor(typeof(MultiTag))]\r\n    public class MultiTagInspector : SPEditor\r\n    {\r\n\r\n        public const string PROP_SEARCHABLEIFINACTIVE = \"_searchableIfInactive\";\r\n        public const string PROP_TAGS = \"_tags\";\r\n\r\n        #region Properties\r\n        \r\n        private bool _showTags;\r\n\r\n        #endregion\r\n\r\n        protected override void OnBeforeSPInspectorGUI()\r\n        {\r\n            var go = com.spacepuppy.Utils.GameObjectUtil.GetGameObjectFromSource(this.target);\r\n\r\n            if (go != null && !go.CompareTag(SPConstants.TAG_MULTITAG))\r\n            {\r\n                go.tag = SPConstants.TAG_MULTITAG;\r\n                EditorUtility.SetDirty(go);\r\n            }\r\n        }\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            //this.DrawPropertyField(PROP_SEARCHABLEIFINACTIVE);\r\n            var searchableProp = this.serializedObject.FindProperty(PROP_SEARCHABLEIFINACTIVE);\r\n            searchableProp.boolValue = EditorGUILayout.ToggleLeft(searchableProp.displayName, searchableProp.boolValue);\r\n\r\n            //this may change in later releases...\r\n            _showTags = EditorGUILayout.Foldout(_showTags, \"Tags\");\r\n\r\n            if (_showTags)\r\n            {\r\n                EditorGUI.indentLevel++;\r\n\r\n                var tagsProp = this.serializedObject.FindProperty(PROP_TAGS);\r\n                var currentTags = this.GetTags(tagsProp);\r\n                var selectedTags = new List<string>();\r\n\r\n                EditorGUI.BeginChangeCheck();\r\n                var tags = from tag in UnityEditorInternal.InternalEditorUtility.tags where (tag != SPConstants.TAG_UNTAGGED && tag != SPConstants.TAG_MULTITAG && tag != SPConstants.TAG_EDITORONLY) select tag;\r\n                foreach (var tag in tags)\r\n                {\r\n                    var bSelected = currentTags.Contains(tag);\r\n                    if (EditorGUILayout.Toggle(tag, bSelected))\r\n                    {\r\n                        selectedTags.Add(tag);\r\n                    }\r\n                }\r\n\r\n                if (EditorGUI.EndChangeCheck())\r\n                {\r\n                    this.SetTags(tagsProp, selectedTags.ToArray());\r\n                }\r\n\r\n                EditorGUI.indentLevel--;\r\n            }\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_SEARCHABLEIFINACTIVE, PROP_TAGS);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n\r\n\r\n\r\n        private string[] GetTags(SerializedProperty prop)\r\n        {\r\n            string[] tags = new string[prop.arraySize];\r\n            for (int i = 0; i < prop.arraySize; i++)\r\n            {\r\n                tags[i] = prop.GetArrayElementAtIndex(i).stringValue;\r\n            }\r\n            return tags;\r\n        }\r\n\r\n        private void SetTags(SerializedProperty prop, string[] tags)\r\n        {\r\n            prop.arraySize = tags.Length;\r\n            for(int i = 0; i < tags.Length; i++)\r\n            {\r\n                prop.GetArrayElementAtIndex(i).stringValue = tags[i];\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/OneOrManyPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    /// <summary>\r\n    /// Currently only works with builtin unity types.\r\n    /// </summary>\r\n    [CustomPropertyDrawer(typeof(OneOrManyAttribute))]\r\n    public class OneOrManyPropertyDrawer : PropertyDrawer, IArrayHandlingPropertyDrawer\r\n    {\r\n        private const float BTN_WIDTH = 42f;\r\n        private const float SIZE_WIDTH = 50f;\r\n        private GUIContent _moreBtnLabel = new GUIContent(\"Many\", \"Change between accepting a configured argument or not.\");\r\n        private GUIContent _oneBtnLabel = new GUIContent(\"One\", \"Change between accepting a configured argument or not.\");\r\n\r\n        private PropertyDrawer _internalDrawer;\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            if (!property.isArray) return EditorGUIUtility.singleLineHeight;\r\n\r\n            if (property.arraySize == 0) property.arraySize = 1;\r\n\r\n            if (property.arraySize == 1)\r\n            {\r\n                return (_internalDrawer != null) ? _internalDrawer.GetPropertyHeight(property.GetArrayElementAtIndex(0), EditorHelper.TempContent(\"Element 0\")) : EditorGUIUtility.singleLineHeight;\r\n            }\r\n            else\r\n            {\r\n                var h = EditorGUIUtility.singleLineHeight;\r\n                var lbl = EditorHelper.TempContent(\"Element 0\");\r\n                for (int i = 0; i < property.arraySize; i++)\r\n                {\r\n                    h += (_internalDrawer != null) ? _internalDrawer.GetPropertyHeight(property.GetArrayElementAtIndex(i), lbl) : EditorGUIUtility.singleLineHeight;\r\n                }\r\n                return h;\r\n            }\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            if(!property.isArray)\r\n            {\r\n                EditorGUI.PropertyField(position, property, label, false);\r\n                return;\r\n            }\r\n\r\n            if (property.arraySize == 0) property.arraySize = 1;\r\n\r\n            if (property.arraySize == 1)\r\n            {\r\n                var elementHeight = (_internalDrawer != null) ? _internalDrawer.GetPropertyHeight(property.GetArrayElementAtIndex(0), label) : EditorGUIUtility.singleLineHeight;\r\n                var propArea = new Rect(position.xMin, position.yMin, Mathf.Max(0f, position.width - BTN_WIDTH), elementHeight);\r\n                var btnArea = new Rect(propArea.xMax, position.yMin, Mathf.Min(BTN_WIDTH, position.width), EditorGUIUtility.singleLineHeight);\r\n\r\n                if (_internalDrawer != null)\r\n                    _internalDrawer.OnGUI(propArea, property.GetArrayElementAtIndex(0), label);\r\n                else\r\n                    SPEditorGUI.DefaultPropertyField(propArea, property.GetArrayElementAtIndex(0), label);\r\n                if (GUI.Button(btnArea, _moreBtnLabel))\r\n                {\r\n                    property.arraySize = 2;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var elementArea = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n\r\n                //draw header\r\n                var leftOverArea = EditorGUI.PrefixLabel(elementArea, label ?? GUIContent.none);\r\n                var sizeArea = new Rect(Mathf.Max(leftOverArea.xMin, leftOverArea.xMax - BTN_WIDTH - SIZE_WIDTH),\r\n                                        leftOverArea.yMin,\r\n                                        Mathf.Min(SIZE_WIDTH, Mathf.Max(0f, leftOverArea.width - BTN_WIDTH)), EditorGUIUtility.singleLineHeight);\r\n                var btnArea = new Rect(sizeArea.xMax, position.yMin, Mathf.Min(BTN_WIDTH, position.width), EditorGUIUtility.singleLineHeight);\r\n                property.arraySize = Mathf.Max(EditorGUI.IntField(sizeArea, property.arraySize), 1);\r\n                if(GUI.Button(btnArea, _oneBtnLabel))\r\n                {\r\n                    property.arraySize = 1;\r\n                }\r\n\r\n                EditorGUI.indentLevel++;\r\n                for(int i = 0; i < property.arraySize; i++)\r\n                {\r\n                    var lbl = EditorHelper.TempContent(\"Element \" + i.ToString());\r\n                    var elementHeight = (_internalDrawer != null) ? _internalDrawer.GetPropertyHeight(property.GetArrayElementAtIndex(i), lbl) : EditorGUIUtility.singleLineHeight;\r\n                    elementArea = new Rect(position.xMin, elementArea.yMax, position.width, elementHeight);\r\n\r\n                    if (_internalDrawer != null)\r\n                        _internalDrawer.OnGUI(elementArea, property.GetArrayElementAtIndex(i), lbl);\r\n                    else\r\n                        SPEditorGUI.DefaultPropertyField(elementArea, property.GetArrayElementAtIndex(i), lbl);\r\n                }\r\n                EditorGUI.indentLevel--;\r\n            }\r\n        }\r\n\r\n        #region IArrayHandlingPropertyDrawer Interface\r\n\r\n        PropertyDrawer IArrayHandlingPropertyDrawer.InternalDrawer\r\n        {\r\n            get\r\n            {\r\n                return _internalDrawer;\r\n            }\r\n            set\r\n            {\r\n                _internalDrawer = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/ProxyPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\nusing com.spacepuppyeditor.Components;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(QueryProxy))]\r\n    public class QueryProxyPropertyDrawer : PropertyDrawer\r\n    {\r\n        \r\n        private const string PROP_TARGET = \"_target\";\r\n        private const string PROP_SEARCHBY = \"_searchBy\";\r\n        private const string PROP_QUERY = \"_queryString\";\r\n\r\n        private enum SearchByAlt\r\n        {\r\n            Direct = SearchBy.Nothing,\r\n            Tag = SearchBy.Tag,\r\n            Name = SearchBy.Name,\r\n            Type = SearchBy.Type\r\n        }\r\n\r\n\r\n        #region Fields\r\n        \r\n        private SelectableComponentPropertyDrawer _selectableDrawer;\r\n        \r\n        private System.Type _inheritsFromType;\r\n        private bool _allowProxy;\r\n        private bool _manuallyConfigured;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public System.Type InheritsFromType\r\n        {\r\n            get { return _inheritsFromType; }\r\n            set\r\n            {\r\n                _inheritsFromType = value;\r\n                _manuallyConfigured = true;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void Init(SerializedProperty property)\r\n        {\r\n            if (_manuallyConfigured) return;\r\n\r\n            var attrib = this.fieldInfo.GetCustomAttributes(typeof(QueryProxy.ConfigAttribute), false).FirstOrDefault() as QueryProxy.ConfigAttribute;\r\n            if(attrib != null)\r\n            {\r\n                _inheritsFromType = attrib.TargetType;\r\n                _allowProxy = attrib.AllowProxy;\r\n            }\r\n            else\r\n            {\r\n                _inheritsFromType = null;\r\n                _allowProxy = true;\r\n            }\r\n        }\r\n\r\n        \r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            return EditorGUIUtility.singleLineHeight;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            this.Init(property);\r\n\r\n            EditorGUI.BeginProperty(position, label, property);\r\n\r\n            //################################\r\n            //FIRST LINE\r\n            var rect = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n\r\n            rect = EditorGUI.PrefixLabel(rect, label);\r\n\r\n            var targetProp = property.FindPropertyRelative(PROP_TARGET);\r\n\r\n            var w0 = Mathf.Min(rect.width * 0.3f, 80f);\r\n            var w1 = rect.width - w0;\r\n            var r0 = new Rect(rect.xMin, rect.yMin, w0, EditorGUIUtility.singleLineHeight);\r\n            var r1 = new Rect(r0.xMax, rect.yMin, w1, EditorGUIUtility.singleLineHeight);\r\n            \r\n            var searchProp = property.FindPropertyRelative(PROP_SEARCHBY);\r\n            var queryProp = property.FindPropertyRelative(PROP_QUERY);\r\n            \r\n            var eSearchBy = (SearchByAlt)searchProp.GetEnumValue<SearchBy>();\r\n            EditorGUI.BeginChangeCheck();\r\n            eSearchBy = (SearchByAlt)EditorGUI.EnumPopup(r0, eSearchBy);\r\n            if (EditorGUI.EndChangeCheck())\r\n                searchProp.SetEnumValue((SearchBy)eSearchBy);\r\n\r\n            switch (eSearchBy)\r\n            {\r\n                case SearchByAlt.Direct:\r\n                    {\r\n                        //SPEditorGUI.PropertyField(r1, targetProp, GUIContent.none);\r\n                        if(_selectableDrawer == null)\r\n                        {\r\n                            _selectableDrawer = new SelectableComponentPropertyDrawer();\r\n                        }\r\n                        _selectableDrawer.AllowSceneObjects = true;\r\n                        _selectableDrawer.RestrictionType = _inheritsFromType;\r\n                        _selectableDrawer.AllowProxy = _allowProxy;\r\n                        _selectableDrawer.OnGUI(r1, targetProp, GUIContent.none);\r\n                    }\r\n                    break;\r\n                case SearchByAlt.Tag:\r\n                    {\r\n                        queryProp.stringValue = EditorGUI.TagField(r1, queryProp.stringValue);\r\n                        targetProp.objectReferenceValue = null;\r\n                    }\r\n                    break;\r\n                case SearchByAlt.Name:\r\n                    {\r\n                        queryProp.stringValue = EditorGUI.TextField(r1, queryProp.stringValue);\r\n                        targetProp.objectReferenceValue = null;\r\n                    }\r\n                    break;\r\n                case SearchByAlt.Type:\r\n                    {\r\n                        var tp = TypeUtil.FindType(queryProp.stringValue);\r\n                        if (!TypeUtil.IsType(tp, typeof(UnityEngine.Object))) tp = null;\r\n                        tp = SPEditorGUI.TypeDropDown(r1, GUIContent.none, typeof(UnityEngine.Object),tp);\r\n                        queryProp.stringValue = (tp != null) ? tp.FullName : null;\r\n                        targetProp.objectReferenceValue = null;\r\n                    }\r\n                    break;\r\n            }\r\n            \r\n            EditorGUI.EndProperty();\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n\r\n    \r\n    [CustomPropertyDrawer(typeof(MemberProxy))]\r\n    public class MemberProxyPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            return EditorGUIUtility.singleLineHeight * 2f;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            DynamicMemberAccess access = DynamicMemberAccess.Read;\r\n            if(this.fieldInfo != null)\r\n            {\r\n                var attrib = this.fieldInfo.GetCustomAttributes(typeof(MemberProxy.ConfigAttribute), true).FirstOrDefault() as MemberProxy.ConfigAttribute;\r\n                if (attrib != null) access = attrib.MemberAccessLevel;\r\n            }\r\n\r\n            DrawMemberProxy(position, property, label);\r\n        }\r\n        \r\n        public static System.Reflection.MemberInfo DrawMemberProxy(Rect position, SerializedProperty property, GUIContent label, DynamicMemberAccess memberAccessLevel = DynamicMemberAccess.Read)\r\n        {\r\n            var r0 = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n            var r1 = new Rect(position.xMin, r0.yMax, position.width, EditorGUIUtility.singleLineHeight);\r\n\r\n            var targProp = property.FindPropertyRelative(\"_target\");\r\n            var memberProp = property.FindPropertyRelative(\"_memberName\");\r\n\r\n            SPEditorGUI.PropertyField(r0, targProp, label);\r\n            System.Reflection.MemberInfo selectedMember;\r\n            memberProp.stringValue = SPEditorGUI.ReflectedPropertyField(r1,\r\n                                                                        EditorHelper.TempContent(\" - Property\", \"The property on the target to set.\"),\r\n                                                                        targProp.objectReferenceValue,\r\n                                                                        memberProp.stringValue,\r\n                                                                        memberAccessLevel,\r\n                                                                        out selectedMember);\r\n            return selectedMember;\r\n        }\r\n\r\n    }\r\n    \r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/RadicalCoroutineManagerInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n#if SP_LIB\r\n\r\n    [CustomEditor(typeof(RadicalCoroutineManager))]\r\n    public class RadicalCoroutineManagerInspector : SPEditor\r\n    {\r\n\r\n        private bool _expanded = true;\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            var targ = this.target as RadicalCoroutineManager;\r\n            if(targ == null) return;\r\n\r\n            var routines = targ.GetAllCoroutines().ToArray();\r\n            EditorGUILayout.HelpBox(string.Format(\"Managing '{0}' RadicalCoroutines.\", routines.Length), MessageType.Info);\r\n\r\n            _expanded = EditorGUILayout.Foldout(_expanded, EditorHelper.TempContent(\"Coroutine Breakdown\"));\r\n            if(_expanded)\r\n            {\r\n                EditorGUI.indentLevel++;\r\n                for(int i = 0; i < routines.Length; i++)\r\n                {\r\n                    var routine = routines[i];\r\n                    EditorGUILayout.LabelField(string.Format(\"[{0:00}] Routine {1}\", i, RadicalCoroutine.EditorHelper.GetInternalRoutineID(routine)));\r\n                    EditorGUI.indentLevel += 2;\r\n                    EditorGUILayout.LabelField(\"Component:\", (routine.Owner != null) ? routine.Owner.GetType().Name : \"UNKNOWN\");\r\n                    EditorGUILayout.LabelField(\"State:\", routine.OperatingState.ToString());\r\n                    EditorGUILayout.LabelField(\"Yield:\", RadicalCoroutine.EditorHelper.GetYieldID(routine));\r\n                    EditorGUILayout.LabelField(\"Derivative:\", RadicalCoroutine.EditorHelper.GetDerivativeID(routine));\r\n                    EditorGUI.indentLevel -= 2;\r\n                }\r\n                EditorGUI.indentLevel--;\r\n            }\r\n        }\r\n\r\n        public override bool RequiresConstantRepaint()\r\n        {\r\n            return Application.isPlaying && _expanded;\r\n        }\r\n\r\n    }\r\n\r\n#else\r\n\r\n    [CustomEditor(typeof(RadicalCoroutineManager))]\r\n    public class RadicalCoroutineManagerInspector : Editor\r\n    {\r\n\r\n        private bool _expanded = true;\r\n\r\n        public override void OnInspectorGUI()\r\n        {\r\n            var targ = this.target as RadicalCoroutineManager;\r\n            if(targ == null) return;\r\n\r\n            var routines = targ.GetAllCoroutines().ToArray();\r\n            EditorGUILayout.HelpBox(string.Format(\"Managing '{0}' RadicalCoroutines.\", routines.Length), MessageType.Info);\r\n    \r\n            _expanded = EditorGUILayout.Foldout(_expanded, \"Coroutine Breakdown\");\r\n            if(_expanded)\r\n            {\r\n                EditorGUI.indentLevel++;\r\n                for(int i = 0; i < routines.Length; i++)\r\n                {\r\n                    var routine = routines[i];\r\n                    EditorGUILayout.LabelField(string.Format(\"[{0:00}] Routine {1}\", i, RadicalCoroutine.EditorHelper.GetInternalRoutineID(routine)));\r\n                    EditorGUI.indentLevel += 2;\r\n                    EditorGUILayout.LabelField(\"Component:\", (routine.Operator != null) ? routine.Operator.GetType().Name : \"UNKNOWN\");\r\n                    EditorGUILayout.LabelField(\"State:\", routine.OperatingState.ToString());\r\n                    EditorGUILayout.LabelField(\"Yield:\", RadicalCoroutine.EditorHelper.GetYieldID(routine));\r\n                    EditorGUILayout.LabelField(\"Derivative:\", RadicalCoroutine.EditorHelper.GetDerivativeID(routine));\r\n                    EditorGUI.indentLevel -= 2;\r\n                }\r\n                EditorGUI.indentLevel--;\r\n            }\r\n        }\r\n\r\n        public override bool RequiresConstantRepaint()\r\n        {\r\n            return Application.isPlaying && _expanded;\r\n        }\r\n\r\n    }\r\n\r\n#endif\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/ReorderableArrayPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(ReorderableArrayAttribute), true)]\r\n    public class ReorderableArrayPropertyDrawer : PropertyDrawer, IArrayHandlingPropertyDrawer\r\n    {\r\n\r\n        public event System.EventHandler ElementAdded;\r\n\r\n        public delegate string FormatElementLabelCallback(SerializedProperty property, int index, bool isActive, bool isFocused);\r\n\r\n        private static readonly float TOP_PAD = 2f + EditorGUIUtility.singleLineHeight;\r\n        private const float BOTTOM_PAD = 2f;\r\n        private const float MARGIN = 2f;\r\n\r\n        #region Fields\r\n\r\n        public GUIContent CustomLabel;\r\n        private CachedReorderableList _lst;\r\n        private GUIContent _labelContent;\r\n        private bool _disallowFoldout;\r\n        private bool _removeBackgroundWhenCollapsed;\r\n        private bool _draggable = true;\r\n        private bool _drawElementAtBottom;\r\n        private bool _hideElementLabel = false;\r\n        private string _childPropertyAsLabel;\r\n        private string _childPropertyAsEntry;\r\n        private ReorderableList.AddCallbackDelegate _addCallback;\r\n        private bool _allowDragAndDrop = true;\r\n        private bool _showTooltipInHeader;\r\n\r\n        private PropertyDrawer _internalDrawer;\r\n        \r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public ReorderableArrayPropertyDrawer()\r\n        {\r\n\r\n        }\r\n\r\n        /// <summary>\r\n        /// Use this to set the element type of the list for drag & drop, if you're manually calling the drawer.\r\n        /// </summary>\r\n        /// <param name=\"elementType\"></param>\r\n        public ReorderableArrayPropertyDrawer(System.Type dragDropElementType)\r\n        {\r\n            this.DragDropElementType = dragDropElementType;\r\n        }\r\n\r\n\r\n        protected virtual CachedReorderableList GetList(SerializedProperty property, GUIContent label)\r\n        {\r\n            var lst = CachedReorderableList.GetListDrawer(property, _maskList_DrawHeader, _maskList_DrawElement, _maskList_OnElementAdded);\r\n            lst.draggable = _draggable;\r\n\r\n            if(property.arraySize > 0)\r\n            {\r\n                if(_drawElementAtBottom)\r\n                {\r\n                    lst.elementHeight = EditorGUIUtility.singleLineHeight;\r\n                }\r\n                else\r\n                {\r\n                    var pchild = property.GetArrayElementAtIndex(0);\r\n                    /*\r\n                    if (_internalDrawer != null)\r\n                    {\r\n                        lst.elementHeight = _internalDrawer.GetPropertyHeight(pchild, label);\r\n                    }\r\n                    else if(ElementIsFlatChildField(pchild))\r\n                    {\r\n                        //we don't draw this way if it's a built-in type from Unity\r\n                        pchild.isExpanded = true;\r\n                        if(_hideElementLabel)\r\n                        {\r\n                            lst.elementHeight = SPEditorGUI.GetDefaultPropertyHeight(pchild, label, true) + 2f - EditorGUIUtility.singleLineHeight;\r\n                        }\r\n                        else\r\n                        {\r\n                            lst.elementHeight = SPEditorGUI.GetDefaultPropertyHeight(pchild, label, true) + 2f; //height when showing label\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        lst.elementHeight = SPEditorGUI.GetDefaultPropertyHeight(pchild, label) + 1f;\r\n                    }\r\n                    */\r\n                    lst.elementHeight = this.GetElementHeight(pchild, label, false) + 2f;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                lst.elementHeight = EditorGUIUtility.singleLineHeight;\r\n            }\r\n\r\n            return lst;\r\n        }\r\n\r\n        private void StartOnGUI(SerializedProperty property, GUIContent label)\r\n        {\r\n            var attrib = this.attribute as ReorderableArrayAttribute;\r\n            if (attrib != null)\r\n            {\r\n                _disallowFoldout = attrib.DisallowFoldout;\r\n                _removeBackgroundWhenCollapsed = attrib.RemoveBackgroundWhenCollapsed;\r\n                _draggable = attrib.Draggable;\r\n                _drawElementAtBottom = attrib.DrawElementAtBottom;\r\n                _hideElementLabel = attrib.HideElementLabel;\r\n                _childPropertyAsLabel = attrib.ChildPropertyToDrawAsElementLabel;\r\n                _childPropertyAsEntry = attrib.ChildPropertyToDrawAsElementEntry;\r\n                _allowDragAndDrop = attrib.AllowDragAndDrop;\r\n                _showTooltipInHeader = attrib.ShowTooltipInHeader;\r\n            }\r\n\r\n            _labelContent = label;\r\n\r\n            _lst = this.GetList(property, label);\r\n            if (_lst.index >= _lst.count) _lst.index = -1;\r\n\r\n            if (this.fieldInfo != null)\r\n            {\r\n                this.DragDropElementType = TypeUtil.GetElementTypeOfListType(this.fieldInfo.FieldType);\r\n\r\n                if (!string.IsNullOrEmpty(_childPropertyAsEntry) && this.DragDropElementType != null)\r\n                {\r\n                    var field = this.DragDropElementType.GetMember(_childPropertyAsEntry,\r\n                                                                   System.Reflection.MemberTypes.Field,\r\n                                                                   System.Reflection.BindingFlags.Public |\r\n                                                                   System.Reflection.BindingFlags.NonPublic |\r\n                                                                   System.Reflection.BindingFlags.Instance).FirstOrDefault() as System.Reflection.FieldInfo;\r\n                    if (field != null) this.DragDropElementType = field.FieldType;\r\n                }\r\n            }\r\n        }\r\n\r\n        private void EndOnGUI(SerializedProperty property, GUIContent label)\r\n        {\r\n            _lst.serializedProperty = null;\r\n            _labelContent = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        /*\r\n         * Current State\r\n         */\r\n\r\n        public ReorderableList CurrentReorderableList { get { return _lst; } }\r\n\r\n        public SerializedProperty CurrentArrayProperty { get { return _lst != null ? _lst.serializedProperty : null; } }\r\n\r\n        /*\r\n         * Configuration\r\n         */\r\n\r\n        public bool DisallowFoldout\r\n        {\r\n            get { return _disallowFoldout; }\r\n            set { _disallowFoldout = value; }\r\n        }\r\n\r\n        public bool RemoveBackgroundWhenCollapsed\r\n        {\r\n            get { return _removeBackgroundWhenCollapsed; }\r\n            set { _removeBackgroundWhenCollapsed = value; }\r\n        }\r\n\r\n        public bool Draggable\r\n        {\r\n            get { return _draggable; }\r\n            set { _draggable = value; }\r\n        }\r\n\r\n        public bool DrawElementAtBottom\r\n        {\r\n            get { return _drawElementAtBottom; }\r\n            set { _drawElementAtBottom = value; }\r\n        }\r\n\r\n        public string ChildPropertyAsLabel\r\n        {\r\n            get { return _childPropertyAsLabel; }\r\n            set { _childPropertyAsLabel = value; }\r\n        }\r\n\r\n        public string ChildPropertyAsEntry\r\n        {\r\n            get { return _childPropertyAsEntry; }\r\n            set { _childPropertyAsEntry = value; }\r\n        }\r\n\r\n        public FormatElementLabelCallback FormatElementLabel\r\n        {\r\n            get;\r\n            set;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Can drag entries onto the inspector without needing to click + button. Only works for array/list of UnityEngine.Object sub/types.\r\n        /// </summary>\r\n        public bool AllowDragAndDrop\r\n        {\r\n            get { return _allowDragAndDrop; }\r\n            set { _allowDragAndDrop = false; }\r\n        }\r\n\r\n        public bool ShowTooltipInHeader\r\n        {\r\n            get { return _showTooltipInHeader; }\r\n            set { _showTooltipInHeader = value; }\r\n        }\r\n        \r\n        /// <summary>\r\n        /// The type of the element in the array/list, will effect drag & drop filtering (unless overriden).\r\n        /// </summary>\r\n        public System.Type DragDropElementType\r\n        {\r\n            get;\r\n            set;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region OnGUI\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            float h;\r\n            if (EditorHelper.AssertMultiObjectEditingNotSupportedHeight(property, label, out h)) return h;\r\n\r\n            if (property.isArray)\r\n            {\r\n                this.StartOnGUI(property, label);\r\n                if (_disallowFoldout || property.isExpanded)\r\n                {\r\n                    h = _lst.GetHeight();\r\n                    if(_drawElementAtBottom && _lst.index >= 0 && _lst.index < property.arraySize)\r\n                    {\r\n                        var pchild = property.GetArrayElementAtIndex(_lst.index);\r\n                        /*\r\n                        if (_internalDrawer != null)\r\n                        {\r\n                            h += _internalDrawer.GetPropertyHeight(pchild, label) + BOTTOM_PAD + TOP_PAD;\r\n                        }\r\n                        else if (ElementIsFlatChildField(pchild))\r\n                        {\r\n                            //we don't draw this way if it's a built-in type from Unity\r\n                            pchild.isExpanded = true;\r\n                            h += SPEditorGUI.GetDefaultPropertyHeight(pchild, label, true) + BOTTOM_PAD + TOP_PAD - EditorGUIUtility.singleLineHeight;\r\n                        }\r\n                        else\r\n                        {\r\n                            h += SPEditorGUI.GetDefaultPropertyHeight(pchild, label, false) + BOTTOM_PAD + TOP_PAD;\r\n                        }\r\n                        */\r\n                        h += this.GetElementHeight(pchild, label, true) + BOTTOM_PAD + TOP_PAD;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    h = EditorGUIUtility.singleLineHeight;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                h = EditorGUIUtility.singleLineHeight;\r\n            }\r\n            return h;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            if (EditorHelper.AssertMultiObjectEditingNotSupported(position, property, label)) return;\r\n\r\n            if (property.isArray)\r\n            {\r\n                if (this.CustomLabel != null)\r\n                {\r\n                    label = this.CustomLabel;\r\n                }\r\n                else if (label != null)\r\n                {\r\n                    label = EditorHelper.CloneContent(label);\r\n                    if (_showTooltipInHeader)\r\n                    {\r\n                        label.text = string.Format(\"{0} [{1:0}] - {2}\", label.text, property.arraySize, (string.IsNullOrEmpty(label.tooltip) ? property.tooltip : label.tooltip));\r\n                    }\r\n                    else\r\n                    {\r\n                        label.text = string.Format(\"{0} [{1:0}]\", label.text, property.arraySize);\r\n                    }\r\n\r\n                    if (string.IsNullOrEmpty(label.tooltip)) label.tooltip = property.tooltip;\r\n                }\r\n                else\r\n                {\r\n                    label = EditorHelper.TempContent(property.displayName, property.tooltip);\r\n                }\r\n\r\n\r\n                //const float WIDTH_FOLDOUT = 5f;\r\n                var foldoutRect = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n                position = EditorGUI.IndentedRect(position);\r\n                Rect listArea = position;\r\n\r\n                if(_disallowFoldout)\r\n                {\r\n                    listArea = new Rect(position.xMin, position.yMin, position.width, _lst.GetHeight());\r\n                    this.StartOnGUI(property, label);\r\n                    //_lst.DoList(EditorGUI.IndentedRect(position));\r\n                    _lst.DoList(listArea);\r\n                    this.EndOnGUI(property, label);\r\n                }\r\n                else\r\n                {\r\n                    if (property.isExpanded)\r\n                    {\r\n                        listArea = new Rect(position.xMin, position.yMin, position.width, _lst.GetHeight());\r\n                        this.StartOnGUI(property, label);\r\n                        property.isExpanded = EditorGUI.Foldout(foldoutRect, property.isExpanded, GUIContent.none);\r\n                        //_lst.DoList(EditorGUI.IndentedRect(position));\r\n                        _lst.DoList(listArea);\r\n                        this.EndOnGUI(property, label);\r\n                    }\r\n                    else\r\n                    {\r\n                        if(_removeBackgroundWhenCollapsed)\r\n                        {\r\n                            property.isExpanded = EditorGUI.Foldout(foldoutRect, property.isExpanded, label);\r\n                        }\r\n                        else\r\n                        {\r\n                            property.isExpanded = EditorGUI.Foldout(foldoutRect, property.isExpanded, GUIContent.none);\r\n                            //ReorderableListHelper.DrawRetractedHeader(EditorGUI.IndentedRect(position), label);\r\n                            ReorderableListHelper.DrawRetractedHeader(position, label);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                this.DoDragAndDrop(property, listArea);\r\n\r\n                if(property.isExpanded && _drawElementAtBottom && _lst.index >= 0 && _lst.index < property.arraySize)\r\n                {\r\n                    var pchild = property.GetArrayElementAtIndex(_lst.index);\r\n                    var label2 = TempElementLabel(pchild, _lst.index); //(string.IsNullOrEmpty(_childPropertyAsLabel)) ? TempElementLabel(_lst.index) : GUIContent.none;\r\n\r\n                    pchild.isExpanded = true;\r\n                    float h;\r\n                    if (_internalDrawer != null)\r\n                    {\r\n                        h = _internalDrawer.GetPropertyHeight(pchild, label2) + BOTTOM_PAD + TOP_PAD;\r\n                    }\r\n                    else if (pchild.hasChildren)\r\n                    {\r\n                        h = SPEditorGUI.GetDefaultPropertyHeight(pchild, label, true) + BOTTOM_PAD + TOP_PAD - EditorGUIUtility.singleLineHeight;\r\n                    }\r\n                    else\r\n                    {\r\n                        h = SPEditorGUI.GetDefaultPropertyHeight(pchild, label2, true) + BOTTOM_PAD + TOP_PAD;\r\n                    }\r\n                    var area = new Rect(position.x, position.yMax - h, position.width, h);\r\n                    var drawArea = new Rect(area.x, area.y + TOP_PAD, area.width - MARGIN, area.height - TOP_PAD);\r\n\r\n                    GUI.BeginGroup(area, label2, GUI.skin.box);\r\n                    GUI.EndGroup();\r\n\r\n                    EditorGUI.indentLevel++;\r\n                    if (_internalDrawer != null)\r\n                    {\r\n                        _internalDrawer.OnGUI(drawArea, pchild, label2);\r\n                    }\r\n                    else if(pchild.hasChildren)\r\n                    {\r\n                        SPEditorGUI.FlatChildPropertyField(drawArea, pchild);\r\n                    }\r\n                    else\r\n                    {\r\n                        SPEditorGUI.DefaultPropertyField(drawArea, pchild, GUIContent.none, false);\r\n                    }\r\n                    EditorGUI.indentLevel--;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                SPEditorGUI.DefaultPropertyField(position, property, label, false);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Masks ReorderableList Handlers\r\n\r\n        private void _maskList_DrawHeader(Rect area)\r\n        {\r\n            if(_labelContent != null)\r\n            {\r\n                EditorGUI.LabelField(area, _labelContent);\r\n            }\r\n        }\r\n\r\n        private void _maskList_DrawElement(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            var element = _lst.serializedProperty.GetArrayElementAtIndex(index);\r\n            if (element == null) return;\r\n\r\n            var label = this.GetFormattedElementLabel(area, index, isActive, isFocused);\r\n            this.DrawElement(area, element, label, index);\r\n\r\n            if (GUI.enabled) ReorderableListHelper.DrawDraggableElementDeleteContextMenu(_lst, area, index, isActive, isFocused);\r\n        }\r\n\r\n        private void _maskList_OnElementAdded(ReorderableList lst)\r\n        {\r\n            lst.serializedProperty.arraySize++;\r\n            lst.index = lst.serializedProperty.arraySize - 1;\r\n\r\n            var attrib = this.attribute as ReorderableArrayAttribute;\r\n            if (attrib != null && !string.IsNullOrEmpty(attrib.OnAddCallback))\r\n            {\r\n                lst.serializedProperty.serializedObject.ApplyModifiedProperties();\r\n\r\n                var prop = lst.serializedProperty.GetArrayElementAtIndex(lst.index);\r\n                var obj = EditorHelper.GetTargetObjectOfProperty(prop);\r\n                obj = com.spacepuppy.Dynamic.DynamicUtil.InvokeMethod(lst.serializedProperty.serializedObject.targetObject, attrib.OnAddCallback, obj);\r\n                EditorHelper.SetTargetObjectOfProperty(prop, obj);\r\n                lst.serializedProperty.serializedObject.Update();\r\n            }\r\n\r\n            this.OnElementAdded(lst);\r\n        }\r\n\r\n        protected virtual void OnElementAdded(ReorderableList lst)\r\n        {\r\n            var d = this.ElementAdded;\r\n            if (d != null) d(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        protected virtual GUIContent GetFormattedElementLabel(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            var element = _lst.serializedProperty.GetArrayElementAtIndex(index);\r\n            if (element == null) return GUIContent.none;\r\n\r\n            var attrib = this.attribute as ReorderableArrayAttribute;\r\n            GUIContent label = null;\r\n            if (this.FormatElementLabel != null)\r\n            {\r\n                string slbl = this.FormatElementLabel(element, index, isActive, isFocused);\r\n                if (slbl != null) label = EditorHelper.TempContent(slbl);\r\n            }\r\n            else if (attrib != null)\r\n            {\r\n                if (!string.IsNullOrEmpty(attrib.ElementLabelFormatString))\r\n                {\r\n                    label = EditorHelper.TempContent(string.Format(attrib.ElementLabelFormatString, index));\r\n                }\r\n                if (attrib.ElementPadding > 0f)\r\n                {\r\n                    area = new Rect(area.xMin + attrib.ElementPadding, area.yMin, Mathf.Max(0f, area.width - attrib.ElementPadding), area.height);\r\n                }\r\n            }\r\n            if (label == null) label = (_hideElementLabel) ? GUIContent.none : TempElementLabel(element, index);\r\n\r\n            return label;\r\n        }\r\n\r\n        protected virtual void DrawElement(Rect area, SerializedProperty element, GUIContent label, int elementIndex)\r\n        {\r\n\r\n            if (_drawElementAtBottom)\r\n            {\r\n                SerializedProperty prop = string.IsNullOrEmpty(_childPropertyAsEntry) ? null : element.FindPropertyRelative(_childPropertyAsEntry);\r\n\r\n                if (prop != null)\r\n                {\r\n                    SPEditorGUI.PropertyField(area, prop, label);\r\n                }\r\n                else\r\n                {\r\n                    EditorGUI.LabelField(area, label);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (_internalDrawer != null)\r\n                {\r\n                    _internalDrawer.OnGUI(area, element, label);\r\n                }\r\n                else if (ElementIsFlatChildField(element))\r\n                {\r\n                    //we don't draw this way if it's a built-in type from Unity\r\n\r\n                    if (_hideElementLabel)\r\n                    {\r\n                        //no label\r\n                        SPEditorGUI.FlatChildPropertyField(area, element);\r\n                    }\r\n                    else\r\n                    {\r\n                        //showing label\r\n                        var labelArea = new Rect(area.xMin, area.yMin, area.width, EditorGUIUtility.singleLineHeight);\r\n                        EditorGUI.LabelField(labelArea, label);\r\n                        var childArea = new Rect(area.xMin, area.yMin + EditorGUIUtility.singleLineHeight + 1f, area.width, area.height - EditorGUIUtility.singleLineHeight);\r\n                        SPEditorGUI.FlatChildPropertyField(childArea, element);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    SPEditorGUI.DefaultPropertyField(area, element, label, false);\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n        protected virtual float GetElementHeight(SerializedProperty element, GUIContent label, bool elementIsAtBottom)\r\n        {\r\n            if (_internalDrawer != null)\r\n            {\r\n                return _internalDrawer.GetPropertyHeight(element, label);\r\n            }\r\n            else if (ElementIsFlatChildField(element))\r\n            {\r\n                //we don't draw this way if it's a built-in type from Unity\r\n                element.isExpanded = true;\r\n                if (_hideElementLabel || elementIsAtBottom)\r\n                {\r\n                    return SPEditorGUI.GetDefaultPropertyHeight(element, label, true) - EditorGUIUtility.singleLineHeight;\r\n                }\r\n                else\r\n                {\r\n                    return SPEditorGUI.GetDefaultPropertyHeight(element, label, true);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return SPEditorGUI.GetDefaultPropertyHeight(element, label, false);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Drag & Drop\r\n\r\n        protected virtual void DoDragAndDrop(SerializedProperty property, Rect listArea)\r\n        {\r\n            if (_allowDragAndDrop && this.DragDropElementType != null && Event.current != null)\r\n            {\r\n                var ev = Event.current;\r\n                switch (ev.type)\r\n                {\r\n                    case EventType.DragUpdated:\r\n                    case EventType.DragPerform:\r\n                        {\r\n                            if (listArea.Contains(ev.mousePosition))\r\n                            {\r\n                                var refs = (from o in DragAndDrop.objectReferences let obj = ObjUtil.GetAsFromSource(this.DragDropElementType, o, false) where obj != null select obj);\r\n                                DragAndDrop.visualMode = refs.Any() ? DragAndDropVisualMode.Link : DragAndDropVisualMode.Rejected;\r\n\r\n                                if (ev.type == EventType.DragPerform && refs.Any())\r\n                                {\r\n                                    DragAndDrop.AcceptDrag();\r\n                                    AddObjectsToArray(property, refs.ToArray(), _childPropertyAsEntry);\r\n                                    GUI.changed = true;\r\n                                }\r\n                            }\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        private GUIContent TempElementLabel(SerializedProperty element, int index)\r\n        {\r\n            var target = EditorHelper.GetTargetObjectOfProperty(element);\r\n            string slbl = ConvertUtil.ToString(com.spacepuppy.Dynamic.DynamicUtil.GetValue(target, _childPropertyAsLabel));\r\n\r\n            if(string.IsNullOrEmpty(slbl))\r\n            {\r\n                var propLabel = (!string.IsNullOrEmpty(_childPropertyAsLabel)) ? element.FindPropertyRelative(_childPropertyAsLabel) : null;\r\n                if (propLabel != null)\r\n                    slbl = ConvertUtil.ToString(EditorHelper.GetPropertyValue(propLabel));\r\n            }\r\n\r\n            if(string.IsNullOrEmpty(slbl))\r\n                slbl = string.Format(\"Element {0:00}\", index);\r\n\r\n            return EditorHelper.TempContent(slbl);\r\n        }\r\n\r\n        #region IArrayHandlingPropertyDrawer Interface\r\n\r\n        PropertyDrawer IArrayHandlingPropertyDrawer.InternalDrawer\r\n        {\r\n            get\r\n            {\r\n                return _internalDrawer;\r\n            }\r\n            set\r\n            {\r\n                _internalDrawer = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Utils\r\n\r\n        private static bool ElementIsFlatChildField(SerializedProperty property)\r\n        {\r\n            //return property.hasChildren && property.objectReferenceValue is MonoBehaviour;\r\n            return property.hasChildren && property.propertyType == SerializedPropertyType.Generic;\r\n        }\r\n\r\n        private static void AddObjectsToArray(SerializedProperty listProp, object[] objs, string optionalChildProp = null)\r\n        {\r\n            if (listProp == null) throw new System.ArgumentNullException(\"listProp\");\r\n            if (!listProp.isArray) throw new System.ArgumentException(\"Must be a SerializedProperty for an array/list.\", \"listProp\");\r\n            if (objs == null || objs.Length == 0) return;\r\n\r\n            try\r\n            {\r\n                int start = listProp.arraySize;\r\n                listProp.arraySize += objs.Length;\r\n                for(int i = 0; i < objs.Length; i++)\r\n                {\r\n                    var element = listProp.GetArrayElementAtIndex(start + i);\r\n                    if (!string.IsNullOrEmpty(optionalChildProp)) element = element.FindPropertyRelative(optionalChildProp);\r\n\r\n                    if (element != null && element.propertyType == SerializedPropertyType.ObjectReference)\r\n                    {\r\n                        element.objectReferenceValue = objs[i] as UnityEngine.Object;\r\n                    }\r\n                }\r\n            }\r\n            catch (System.Exception ex)\r\n            {\r\n                Debug.LogException(ex);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/SPEntityInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [InitializeOnLoad()]\r\n    [CustomEditor(typeof(SPEntity), true)]\r\n    public class SPEntityInspector : SPEditor\r\n    {\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.EnsureHasRootTag();\r\n\r\n            this.DrawDefaultInspector();\r\n        }\r\n\r\n        public void EnsureHasRootTag()\r\n        {\r\n            var ent = this.target as SPEntity;\r\n            if (!ent.HasTag(SPConstants.TAG_ROOT)) ent.AddTag(SPConstants.TAG_ROOT);\r\n        }\r\n\r\n\r\n        static SPEntityInspector()\r\n        {\r\n            var tp = typeof(SPEntity);\r\n            var field = tp.GetMember(\"_pool\", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic).FirstOrDefault() as System.Reflection.FieldInfo;\r\n            if (field != null)\r\n            {\r\n                var pool = new EditorEntityPool();\r\n                var old = field.GetValue(null) as SPEntity.EntityPool;\r\n                field.SetValue(null, pool);\r\n                if(old != null)\r\n                {\r\n                    var e = old.GetEnumerator();\r\n                    while(e.MoveNext())\r\n                    {\r\n                        pool.AddReference(e.Current);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n\r\n        private class EditorEntityPool : SPEntity.EntityPool\r\n        {\r\n\r\n            public override SPEntity GetFromSource(object obj)\r\n            {\r\n                //if (Application.isPlaying)\r\n                //    return base.GetFromSource(obj);\r\n\r\n                var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n                if (go != null)\r\n                    return go.GetComponentInParent<SPEntity>();\r\n                else\r\n                    return null;\r\n            }\r\n\r\n            public override TSub GetFromSource<TSub>(object obj)\r\n            {\r\n                //if (Application.isPlaying)\r\n                //    return base.GetFromSource<TSub>(obj);\r\n\r\n                var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n                if (go != null)\r\n                {\r\n                    var e = go.GetComponentInParent<SPEntity>();\r\n                    if (e is TSub) return e as TSub;\r\n                }\r\n\r\n                return null;\r\n            }\r\n\r\n            public override SPEntity GetFromSource(System.Type tp, object obj)\r\n            {\r\n                //if (Application.isPlaying)\r\n                //    return base.GetFromSource(tp, obj);\r\n\r\n                var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n                if (go != null)\r\n                {\r\n                    var e = go.GetComponentInParent<SPEntity>();\r\n                    if (TypeUtil.IsType(e.GetType(), tp)) return e;\r\n                }\r\n\r\n                return null;\r\n            }\r\n\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/SPTimePeriodPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(SPTimePeriod))]\r\n    public class SPTimePeriodPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public const string PROP_SECONDS = \"_seconds\";\r\n\r\n        private TimeUnitsSelectorPropertyDrawer _timeDrawer = new TimeUnitsSelectorPropertyDrawer();\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            position = EditorGUI.PrefixLabel(position, label);\r\n\r\n            this.DrawTimePeriodSansLabel(position, property);\r\n        }\r\n\r\n        protected virtual void DrawTimePeriodSansLabel(Rect position, SerializedProperty property)\r\n        {\r\n            var secondsProp = property.FindPropertyRelative(PROP_SECONDS);\r\n            var w = position.width / 3f;\r\n            var attrib = this.fieldInfo.GetCustomAttributes(typeof(SPTime.Config), false).FirstOrDefault() as SPTime.Config;\r\n            var availNames = (attrib != null) ? attrib.AvailableCustomTimeNames : null;\r\n\r\n            if (w > 75f)\r\n            {\r\n                position = _timeDrawer.DrawDuration(position, secondsProp, Mathf.Min(w, 150f));\r\n                position = _timeDrawer.DrawUnits(position, secondsProp, 75f);\r\n                position = SPTimePropertyDrawer.DrawTimeSupplier(position, property, position.width, availNames); //we mirror the SPTime prop drawer, we can do this because the property names are identical\r\n            }\r\n            else\r\n            {\r\n                position = _timeDrawer.DrawDuration(position, secondsProp, w);\r\n                position = _timeDrawer.DrawUnits(position, secondsProp, w);\r\n\r\n\r\n                position = SPTimePropertyDrawer.DrawTimeSupplier(position, property, position.width, availNames); //we mirror the SPTime prop drawer, we can do this because the property names are identical\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/SPTimePropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Project;\r\nusing com.spacepuppy.Collections;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(SPTime))]\r\n    public class SPTimePropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public const string PROP_TIMESUPPLIERTYPE = \"_timeSupplierType\";\r\n        public const string PROP_TIMESUPPLIERNAME = \"_timeSupplierName\";\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            position = EditorGUI.PrefixLabel(position, label);\r\n\r\n            var attrib = this.fieldInfo.GetCustomAttributes(typeof(SPTime.Config), false).FirstOrDefault() as SPTime.Config;\r\n            var availNames = (attrib != null) ? attrib.AvailableCustomTimeNames : null;\r\n\r\n            SPTimePropertyDrawer.DrawTimeSupplier(position, property, position.width, availNames); \r\n        }\r\n\r\n\r\n\r\n        public static Rect DrawTimeSupplier(Rect position, SerializedProperty property, float desiredWidth, string[] availableNames)\r\n        {\r\n            if (position.width <= 0f) return position;\r\n\r\n            var r = new Rect(position.xMin, position.yMin, Mathf.Min(position.width, desiredWidth), position.height);\r\n\r\n            var tsTypeProp = property.FindPropertyRelative(PROP_TIMESUPPLIERTYPE);\r\n            var tsNameProp = property.FindPropertyRelative(PROP_TIMESUPPLIERNAME);\r\n\r\n            int index = -1;\r\n            using (var lst = TempCollection.GetList<string>())\r\n            {\r\n                lst.Add(\"Normal\");\r\n                lst.Add(\"Real\");\r\n                lst.Add(\"Smooth\");\r\n\r\n                foreach (var nm in CustomTimeLayersData.Layers)\r\n                {\r\n                    if (!lst.Contains(nm)) lst.Add(nm);\r\n                }\r\n\r\n                if (availableNames != null)\r\n                {\r\n                    foreach (var nm in availableNames)\r\n                    {\r\n                        if (!lst.Contains(nm)) lst.Add(nm);\r\n                    }\r\n                }\r\n\r\n                var e = tsTypeProp.GetEnumValue<DeltaTimeType>();\r\n                if (e == DeltaTimeType.Custom)\r\n                {\r\n                    index = lst.IndexOf(tsNameProp.stringValue);\r\n                    if (index < 0)\r\n                    {\r\n                        tsTypeProp.SetEnumValue(DeltaTimeType.Normal);\r\n                        tsNameProp.stringValue = null;\r\n                        index = 0;\r\n                    }\r\n                }\r\n                else\r\n                    index = (int)e;\r\n                \r\n                var cache = SPGUI.DisableIfPlaying();\r\n                EditorGUI.BeginChangeCheck();\r\n                index = Mathf.Max(EditorGUI.Popup(position, index, lst.ToArray()), 0);\r\n                if (EditorGUI.EndChangeCheck())\r\n                {\r\n                    if (index < 3)\r\n                    {\r\n                        tsTypeProp.SetEnumValue((DeltaTimeType)index);\r\n                        tsNameProp.stringValue = null;\r\n                    }\r\n                    else\r\n                    {\r\n                        tsTypeProp.SetEnumValue(DeltaTimeType.Custom);\r\n                        tsNameProp.stringValue = lst[index];\r\n                    }\r\n                }\r\n                cache.Reset();\r\n            }\r\n\r\n            return new Rect(r.xMax, position.yMin, Mathf.Max(position.width - r.width, 0f), position.height);\r\n        }\r\n\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/ShortUidPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(ShortUid))]\r\n    public class ShortUidPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            return EditorGUIUtility.singleLineHeight;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            EditorGUI.BeginProperty(position, label, property);\r\n\r\n            position = EditorGUI.PrefixLabel(position, label);\r\n            float w = Mathf.Min(position.width, 60f);\r\n            var r2 = new Rect(position.xMax - w, position.yMin, w, position.height);\r\n            var r1 = new Rect(position.xMin, position.yMin, Mathf.Max(position.width - w, 0f), position.height);\r\n\r\n            var lowProp = property.FindPropertyRelative(\"_low\");\r\n            var highProp = property.FindPropertyRelative(\"_high\");\r\n            long value = (lowProp.longValue & uint.MaxValue) | (highProp.longValue << 32);\r\n\r\n            var attrib = this.fieldInfo.GetCustomAttributes(typeof(ShortUid.ConfigAttribute), false).FirstOrDefault() as ShortUid.ConfigAttribute;\r\n            bool resetOnZero = attrib == null || !attrib.AllowZero;\r\n            bool readWrite = attrib == null || !attrib.ReadOnly;\r\n\r\n            if(readWrite)\r\n            {\r\n                //read-write\r\n                EditorGUI.BeginChangeCheck();\r\n                var sval = EditorGUI.TextField(r1, value.ToString(\"X16\"));\r\n                if (EditorGUI.EndChangeCheck())\r\n                {\r\n                    if (long.TryParse(sval, System.Globalization.NumberStyles.HexNumber, null, out value))\r\n                    {\r\n                        lowProp.longValue = (value & uint.MaxValue);\r\n                        highProp.longValue = (value >> 32);\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                //read-only\r\n                EditorGUI.SelectableLabel(r1, value.ToString(\"X16\"), EditorStyles.textField);\r\n            }\r\n\r\n            if (GUI.Button(r2, \"New Id\") || (resetOnZero && value == 0))\r\n            {\r\n                value = ShortUid.NewId().Value;\r\n                lowProp.longValue = (value & uint.MaxValue);\r\n                highProp.longValue = (value >> 32);\r\n            }\r\n\r\n            EditorGUI.EndProperty();\r\n        }\r\n\r\n    }\r\n\r\n    [CustomPropertyDrawer(typeof(TokenId))]\r\n    public class TokenIdPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            return EditorGUIUtility.singleLineHeight;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            EditorGUI.BeginProperty(position, label, property);\r\n\r\n            position = EditorGUI.PrefixLabel(position, label);\r\n            float w = Mathf.Min(position.width, 60f);\r\n            var r2 = new Rect(position.xMax - w, position.yMin, w, position.height);\r\n            var r1 = new Rect(position.xMin, position.yMin, Mathf.Max(position.width - w, 0f), position.height);\r\n\r\n            var lowProp = property.FindPropertyRelative(\"_low\");\r\n            var highProp = property.FindPropertyRelative(\"_high\");\r\n            var idProp = property.FindPropertyRelative(\"_id\");\r\n\r\n            long lval = (lowProp.longValue & uint.MaxValue) | (highProp.longValue << 32);\r\n            string sval = idProp.stringValue;\r\n\r\n            var attrib = this.fieldInfo.GetCustomAttributes(typeof(TokenId.ConfigAttribute), false).FirstOrDefault() as TokenId.ConfigAttribute;\r\n            bool resetOnZero = attrib == null || !attrib.AllowZero;\r\n            bool readWrite = attrib == null || !attrib.ReadOnly;\r\n            \r\n            if (readWrite)\r\n            {\r\n                //read-write\r\n                EditorGUI.BeginChangeCheck();\r\n                if(lval == 0)\r\n                    sval = EditorGUI.TextField(r1, sval);\r\n                else\r\n                    sval = EditorGUI.TextField(r1, lval.ToString(\"X16\"));\r\n\r\n                if (EditorGUI.EndChangeCheck())\r\n                {\r\n                    if (long.TryParse(sval, System.Globalization.NumberStyles.HexNumber, null, out lval))\r\n                    {\r\n                        lowProp.longValue = (lval & uint.MaxValue);\r\n                        highProp.longValue = (lval >> 32);\r\n                        idProp.stringValue = string.Empty;\r\n                    }\r\n                    else\r\n                    {\r\n                        idProp.stringValue = sval;\r\n                        lowProp.longValue = 0;\r\n                        highProp.longValue = 0;\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                //read-only\r\n                if (lval == 0)\r\n                    EditorGUI.SelectableLabel(r1, lval.ToString(\"X16\"), EditorStyles.textField);\r\n                else\r\n                    EditorGUI.SelectableLabel(r1, sval, EditorStyles.textField);\r\n            }\r\n\r\n            if (GUI.Button(r2, \"New Id\") || (resetOnZero && lval == 0 && string.IsNullOrEmpty(sval)))\r\n            {\r\n                long value = TokenId.NewId().LongValue;\r\n                lowProp.longValue = (value & uint.MaxValue);\r\n                highProp.longValue = (value >> 32);\r\n                idProp.stringValue = string.Empty;\r\n            }\r\n\r\n            EditorGUI.EndProperty();\r\n        }\r\n\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/SingletonInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomEditor(typeof(SingletonManager))]\r\n    public class SingletonManagerInspector : SPEditor\r\n    {\r\n\r\n        private static System.Type[] IgnoredSpecialSingletonTypes;\r\n        static SingletonManagerInspector()\r\n        {\r\n            var lst = new List<System.Type>();\r\n            foreach(var tp in TypeUtil.GetTypesAssignableFrom(typeof(IManagedSingleton)))\r\n            {\r\n                var attribs = tp.GetCustomAttributes(typeof(Singleton.ConfigAttribute), false) as Singleton.ConfigAttribute[];\r\n                if(attribs != null && attribs.Length > 0)\r\n                {\r\n                    if (attribs[0].ExcludeFromSingletonManager) lst.Add(tp);\r\n                }\r\n            }\r\n            IgnoredSpecialSingletonTypes = lst.ToArray();\r\n        }\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.DrawDefaultInspector();\r\n\r\n            //var selectedTypes = (from c in (this.target as SingletonManager).GetComponents<Singleton>() select c.GetType()).ToArray();\r\n            //var selectedTypes = (from c in Singleton.AllSingletons select c.GetType()).ToArray();\r\n\r\n            var singletonType = typeof(Singleton);\r\n            var types = (from t in TypeUtil.GetTypesAssignableFrom(singletonType)\r\n                         where t != singletonType &&\r\n                         !IgnoredSpecialSingletonTypes.Contains(t) && \r\n                         SingletonCount(t) == 0 //!selectedTypes.Contains(t)\r\n                         select t\r\n                        ).ToArray();\r\n            var typeNames = (from t in types select t.Name).ToArray();\r\n\r\n            int index = EditorGUILayout.Popup(\"Add Singleton\", -1, typeNames);\r\n            if (index >= 0)\r\n            {\r\n                var tp = types[index];\r\n                (this.target as SingletonManager).gameObject.AddComponent(tp);\r\n                EditorUtility.SetDirty(this.target);\r\n            }\r\n\r\n            if(this.target is SingletonManager)\r\n            {\r\n                var arr = (this.target as SingletonManager).GetComponents<Singleton>();\r\n                for (int i = 0; i < arr.Length; i ++ )\r\n                {\r\n                    if(arr[i] != this.target && (arr[i].LifeCycle & SingletonLifeCycleRule.LivesForever) != 0)\r\n                    {\r\n                        (this.target as SingletonManager).MaintainOnLoad = true;\r\n                        EditorUtility.SetDirty(this.target);\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        internal static int SingletonCount(System.Type tp)\r\n        {\r\n            return GameObject.FindObjectsOfType(tp).Length;\r\n        }\r\n\r\n    }\r\n\r\n    [CustomPropertyDrawer(typeof(Singleton.Maintainer))]\r\n    public class SingletonMaintainerPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        private string _message;\r\n        private MessageType _messageType;\r\n\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            if (property.serializedObject.isEditingMultipleObjects) return 0f;\r\n\r\n            if (property.serializedObject.targetObject is IManagedSingleton && SingletonManagerInspector.SingletonCount(property.serializedObject.targetObject.GetType()) > 1)\r\n            {\r\n                _message = \"Multiple Singletons of this type exist, you should purge the scene of duplicates!\";\r\n                _messageType = MessageType.Error;\r\n                return EditorGUIUtility.singleLineHeight * 2f;\r\n            }\r\n\r\n            var go = GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n            if (object.ReferenceEquals(go, null))\r\n            {\r\n                _message = \"This Singleton appears to not be attached to a GameObject.\";\r\n                _messageType = MessageType.Error;\r\n                return EditorGUIUtility.singleLineHeight * 2f;\r\n            }\r\n\r\n            if (go.HasComponent<SingletonManager>())\r\n            {\r\n                _message = \"This Singleton is managed by a SingletonManager.\";\r\n                _messageType = MessageType.Info;\r\n                return EditorGUIUtility.singleLineHeight * 3f;\r\n            }\r\n            else if (go.GetComponents<IManagedSingleton>().Count() > 1)\r\n            {\r\n                _message = \"A GameObject with multiple Singletons on it should have a SingletonManager attached!\";\r\n                _messageType = MessageType.Warning;\r\n                return EditorGUIUtility.singleLineHeight * 2f;\r\n            }\r\n            else\r\n            {\r\n                _message = null;\r\n                _messageType = MessageType.None;\r\n                return EditorGUIUtility.singleLineHeight;\r\n            }\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            if (property.serializedObject.isEditingMultipleObjects) return;\r\n\r\n            var lifeCycleProp = property.FindPropertyRelative(\"_lifeCycle\");\r\n            if (_message != null)\r\n            {\r\n                var r = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight * 2f);\r\n                EditorGUI.HelpBox(r, _message, _messageType);\r\n\r\n                r = new Rect(r.xMin, r.yMax, r.width, EditorGUIUtility.singleLineHeight);\r\n                var b = lifeCycleProp.GetEnumValue<SingletonLifeCycleRule>().HasFlag(SingletonLifeCycleRule.AlwaysReplace);\r\n                b = EditorGUI.Toggle(r, \"Always Replace\", b);\r\n                lifeCycleProp.SetEnumValue((b) ? SingletonLifeCycleRule.AlwaysReplace : SingletonLifeCycleRule.LivesForDurationOfScene);\r\n            }\r\n            else\r\n            {\r\n                SPEditorGUI.PropertyField(position, lifeCycleProp);\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n    [CustomEditor(typeof(Singleton), true)]\r\n    public class SingletonInspector : SPEditor\r\n    {\r\n\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            if(this.target is Singleton)\r\n            {\r\n                var attrib = this.target.GetType().GetCustomAttributes(typeof(Singleton.ConfigAttribute), false).FirstOrDefault() as Singleton.ConfigAttribute;\r\n                if(attrib != null && attrib.LifeCycleReadOnly)\r\n                {\r\n                    this.DrawReadOnlyInspector(attrib);\r\n                }\r\n                else\r\n                {\r\n                    this.DrawDefaultInspector();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                this.DrawDefaultInspector();\r\n            }\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n\r\n        private void DrawReadOnlyInspector(Singleton.ConfigAttribute attrib)\r\n        {\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n\r\n            var prop = this.serializedObject.FindProperty(\"_maintainer._lifeCycle\");\r\n            if (prop.GetEnumValue<SingletonLifeCycleRule>() != attrib.DefaultLifeCycle) prop.SetEnumValue(attrib.DefaultLifeCycle);\r\n\r\n            var cache = SPGUI.Disable();\r\n            EditorGUILayout.EnumPopup(\"Life Cycle\", prop.GetEnumValue<SingletonLifeCycleRule>());\r\n            cache.Reset();\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, \"_maintainer\");\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/SingletonProxyInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Dynamic;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomEditor(typeof(SingletonProxy))]\r\n    public class SingletonProxyInspector : SPEditor\r\n    {\r\n\r\n        public const string PROP_SINGLETONTYPE = \"_singletonType\";\r\n        public const string PROP_CREATEIFNONE = \"_createIfNone\";\r\n\r\n        private TypeReferencePropertyDrawer _typeRefDrawer;\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _typeRefDrawer = new TypeReferencePropertyDrawer();\r\n            _typeRefDrawer.AllowAbstractTypes = true;\r\n            _typeRefDrawer.AllowInterfaces = true;\r\n            _typeRefDrawer.DropDownStyle = TypeDropDownListingStyle.Flat;\r\n            _typeRefDrawer.SearchPredicate = (tp) =>\r\n            {\r\n                if (typeof(IManagedSingleton).IsAssignableFrom(tp))\r\n                {\r\n                    //managed singletons can't be interfaces/abstract\r\n                    return !tp.IsInterface && !tp.IsAbstract;\r\n                }\r\n                else if (typeof(IService).IsAssignableFrom(tp))\r\n                {\r\n                    if (tp == typeof(IService)) return false;\r\n\r\n                    //currently only allow interface services be listed\r\n                    //return tp.IsInterface;\r\n                    return true;\r\n                }\r\n                else if (typeof(ISingleton).IsAssignableFrom(tp))\r\n                {\r\n                    //standard singletons can't be interfaces/abstract\r\n                    return !tp.IsInterface && !tp.IsAbstract;\r\n                }\r\n                else\r\n                    return false;\r\n            };\r\n        }\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            //this.DrawDefaultInspector();\r\n\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n\r\n            var typeProp = this.serializedObject.FindProperty(PROP_SINGLETONTYPE);\r\n            var label = EditorHelper.TempContent(\"Singleton Type\");\r\n            var area = EditorGUILayout.GetControlRect(true, _typeRefDrawer.GetPropertyHeight(typeProp, label));\r\n            _typeRefDrawer.OnGUI(area, typeProp, label);\r\n\r\n            var tp = TypeReferencePropertyDrawer.GetTypeFromTypeReference(typeProp);\r\n            if(tp != null && typeof(IManagedSingleton).IsAssignableFrom(tp))\r\n            {\r\n                this.DrawPropertyField(PROP_CREATEIFNONE);\r\n            }\r\n            \r\n            this.serializedObject.ApplyModifiedProperties();\r\n\r\n\r\n\r\n\r\n\r\n            //DRAW MEMBERS FOR PREVIEW\r\n            this.DrawTargetMembersPreview();\r\n        }\r\n\r\n\r\n        private bool _propFoldout;\r\n        private bool _methFoldout;\r\n\r\n        private void DrawTargetMembersPreview()\r\n        {\r\n            var comp = this.serializedObject.targetObject as SingletonProxy;\r\n            if (comp == null) return;\r\n\r\n            const MemberTypes MASK_PROP = MemberTypes.Property | MemberTypes.Field;\r\n            const MemberTypes MASK_METH = MemberTypes.Method;\r\n            var members = DynamicUtil.GetEasilySerializedMembers(comp, MASK_PROP | MASK_METH, DynamicMemberAccess.Read).ToArray();\r\n\r\n            _propFoldout = EditorGUILayout.Foldout(_propFoldout, \"Properties:\");\r\n            if (_propFoldout)\r\n            {\r\n                EditorGUI.indentLevel++;\r\n                foreach (var m in members)\r\n                {\r\n                    if ((m.MemberType & MASK_PROP) != 0)\r\n                    {\r\n                        if ((DynamicUtil.GetMemberAccessLevel(m) & DynamicMemberAccess.Write) != 0)\r\n                            EditorGUILayout.LabelField(m.Name);\r\n                        else\r\n                            EditorGUILayout.LabelField(m.Name + \" (readonly)\");\r\n                    }\r\n                }\r\n                EditorGUI.indentLevel--;\r\n            }\r\n\r\n            _methFoldout = EditorGUILayout.Foldout(_methFoldout, \"Methods:\");\r\n            if (_methFoldout)\r\n            {\r\n                EditorGUI.indentLevel++;\r\n                foreach (var m in members)\r\n                {\r\n                    if (m.MemberType == MASK_METH)\r\n                    {\r\n                        EditorGUILayout.LabelField(m.Name);\r\n                    }\r\n                }\r\n                EditorGUI.indentLevel--;\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/TagMaskInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(TagMask))]\r\n    public class TagMaskInspector : PropertyDrawer\r\n    {\r\n\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            return EditorGUIUtility.singleLineHeight;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            com.spacepuppyeditor.Project.TagDataInspector.Touch();\r\n            var targ = EditorHelper.GetTargetObjectOfProperty(property) as TagMask;\r\n\r\n            var tags = UnityEditorInternal.InternalEditorUtility.tags;\r\n            int mask = 0;\r\n            if(targ.IntersectAll)\r\n            {\r\n                mask = -1;\r\n            }\r\n            else\r\n            {\r\n                for (int i = 0; i < tags.Length; i++)\r\n                {\r\n                    if (targ != null && targ.Intersects(tags[i]))\r\n                    {\r\n                        mask |= (1 << i);\r\n                    }\r\n                }\r\n            }\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            mask = EditorGUI.MaskField(position, label, mask, tags);\r\n\r\n            if (EditorGUI.EndChangeCheck())\r\n            {\r\n                property.serializedObject.ApplyModifiedProperties();\r\n                if (mask == -1 || mask == (1 << tags.Length) - 1)\r\n                {\r\n                    targ.IntersectAll = true;\r\n                }\r\n                else\r\n                {\r\n                    targ.Clear();\r\n                    for (int i = 0; i < tags.Length; i++)\r\n                    {\r\n                        if((mask & (1 << i)) != 0)\r\n                        {\r\n                            targ.Add(tags[i]);\r\n                        }\r\n                    }\r\n                }\r\n                property.serializedObject.Update();\r\n            }\r\n\r\n        }\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/TagSelectorPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Collections;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(TagSelectorAttribute))]\r\n    public class TagSelectorPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            if (property.propertyType == SerializedPropertyType.String)\r\n            {\r\n                EditorGUI.BeginChangeCheck();\r\n                EditorGUI.BeginProperty(position, label, property);\r\n\r\n                var attrib = this.attribute as TagSelectorAttribute;\r\n\r\n                if (attrib != null && attrib.AllowUntagged)\r\n                {\r\n                    property.stringValue = EditorGUI.TagField(position, label, property.stringValue);\r\n                }\r\n                else\r\n                {\r\n                    var tags = (from s in UnityEditorInternal.InternalEditorUtility.tags where s != SPConstants.TAG_UNTAGGED select new GUIContent(s)).ToArray();\r\n                    var stag = property.stringValue;\r\n                    int index = -1;\r\n                    for (int i = 0; i < tags.Length; i++)\r\n                    {\r\n                        if (tags[i].text == stag)\r\n                        {\r\n                            index = i;\r\n                            break;\r\n                        }\r\n                    }\r\n                    index = EditorGUI.Popup(position, label, index, tags);\r\n                    if (index >= 0)\r\n                    {\r\n                        property.stringValue = tags[index].text;\r\n                    }\r\n                    else\r\n                    {\r\n                        property.stringValue = null;\r\n                    }\r\n                }\r\n\r\n                EditorGUI.EndProperty();\r\n                if (EditorGUI.EndChangeCheck()) property.serializedObject.ApplyModifiedProperties();\r\n            }\r\n            else\r\n            {\r\n                EditorGUI.PropertyField(position, property, label);\r\n            }\r\n\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/TetherJointInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomEditor(typeof(TetherJoint))]\r\n    public class TetherJointInspector : SPEditor\r\n    {\r\n        \r\n        public const string PROP_LINKTARGET = \"_linkTarget\";\r\n        public const string PROP_UPDATEMODE = \"_updateMode\";\r\n        public const string PROP_CONSTRAINT = \"_constraint\";\r\n        public const string PROP_DOPOSDAMPING = \"_doPositionDamping\";\r\n        public const string PROP_POSDAMPING = \"_positionDampingStyle\";\r\n        public const string PROP_POSDAMPINGSTR = \"_positionDampingStrength\";\r\n        public const string PROP_DOROTDAMPING = \"_doRotationDamping\";\r\n        public const string PROP_ROTDAMPING = \"_rotationDampingStyle\";\r\n        public const string PROP_ROTDAMPINGSTR = \"_rotationDampingStrength\";\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n            this.DrawPropertyField(PROP_LINKTARGET);\r\n            this.DrawPropertyField(PROP_UPDATEMODE);\r\n            this.DrawPropertyField(PROP_CONSTRAINT);\r\n\r\n            SerializedProperty prop;\r\n            Rect r;\r\n\r\n            prop = this.serializedObject.FindProperty(PROP_DOPOSDAMPING);\r\n            r = EditorGUILayout.GetControlRect();\r\n            prop.isExpanded = EditorGUI.Foldout(new Rect(r.xMin, r.yMin, EditorGUIUtility.labelWidth, r.height), prop.isExpanded, \"Ease Position\");\r\n            r = new Rect(r.xMin + EditorGUIUtility.labelWidth, r.yMin, r.width - EditorGUIUtility.labelWidth, r.height);\r\n            prop.boolValue = GUI.Toggle(r, prop.boolValue, GUIContent.none);\r\n            if(prop.isExpanded)\r\n            {\r\n                EditorGUI.indentLevel++;\r\n                this.DrawPropertyField(PROP_POSDAMPING);\r\n                this.DrawPropertyField(PROP_POSDAMPINGSTR);\r\n                EditorGUI.indentLevel--;\r\n            }\r\n\r\n            prop = this.serializedObject.FindProperty(PROP_DOROTDAMPING);\r\n            r = EditorGUILayout.GetControlRect();\r\n            prop.isExpanded = EditorGUI.Foldout(new Rect(r.xMin, r.yMin, EditorGUIUtility.labelWidth, r.height), prop.isExpanded, \"Ease Rotation\");\r\n            r = new Rect(r.xMin + EditorGUIUtility.labelWidth, r.yMin, r.width - EditorGUIUtility.labelWidth, r.height);\r\n            prop.boolValue = GUI.Toggle(r, prop.boolValue, GUIContent.none);\r\n            if (prop.isExpanded)\r\n            {\r\n                EditorGUI.indentLevel++;\r\n                this.DrawPropertyField(PROP_ROTDAMPING);\r\n                this.DrawPropertyField(PROP_ROTDAMPINGSTR);\r\n                EditorGUI.indentLevel--;\r\n            }\r\n\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_LINKTARGET, PROP_UPDATEMODE, PROP_CONSTRAINT, PROP_DOPOSDAMPING, PROP_POSDAMPING, PROP_POSDAMPINGSTR, PROP_DOROTDAMPING, PROP_ROTDAMPING, PROP_ROTDAMPINGSTR);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/TimeUnitsSelectorPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n    [CustomPropertyDrawer(typeof(TimeUnitsSelectorAttribute))]\r\n    public class TimeUnitsSelectorPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        #region Get/Set TimeUnits\r\n\r\n        //private static Dictionary<int, TimeUnits> _unitsCache = new Dictionary<int, TimeUnits>();\r\n        //private static TimeUnits GetUnits(SerializedProperty property, TimeUnitsSelectorAttribute attrib)\r\n        //{\r\n        //    int hash = com.spacepuppyeditor.Internal.PropertyHandlerCache.GetPropertyHash(property);\r\n        //    TimeUnits units;\r\n        //    if (_unitsCache.TryGetValue(hash, out units))\r\n        //        return units;\r\n        //    else\r\n        //    {\r\n        //        if (attrib == null)\r\n        //            return TimeUnits.Seconds;\r\n        //        else\r\n        //            return attrib.DefaultUnits;\r\n        //    }\r\n        //}\r\n        //private static void SetUnits(SerializedProperty property, TimeUnits units)\r\n        //{\r\n        //    int hash = com.spacepuppyeditor.Internal.PropertyHandlerCache.GetPropertyHash(property);\r\n        //    _unitsCache[hash] = units;\r\n        //}\r\n        private static Dictionary<int, string> _unitsCache = new Dictionary<int, string>();\r\n        private static string GetUnits(SerializedProperty property, TimeUnitsSelectorAttribute attrib, ITimeUnitsCalculator calculator)\r\n        {\r\n            int hash = com.spacepuppyeditor.Internal.PropertyHandlerCache.GetPropertyHash(property);\r\n            \r\n            string units;\r\n            if(!_unitsCache.TryGetValue(hash,out units))\r\n            {\r\n                if (attrib != null)\r\n                    units = attrib.DefaultUnits; \r\n            }\r\n\r\n            if(!calculator.TimeUnits.Contains(units))\r\n            {\r\n                units = calculator.DefaultUnits;\r\n            }\r\n            return units;\r\n        }\r\n        private static void SetUnits(SerializedProperty property, string units)\r\n        {\r\n            int hash = com.spacepuppyeditor.Internal.PropertyHandlerCache.GetPropertyHash(property);\r\n            _unitsCache[hash] = units;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        private ITimeUnitsCalculator _calculator;\r\n\r\n        public ITimeUnitsCalculator TimeUnitsCalculator\r\n        {\r\n            get { return _calculator ?? _defaultCalculator; }\r\n            set\r\n            {\r\n                _calculator = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n\r\n            position = EditorGUI.PrefixLabel(position, label);\r\n\r\n            var w = position.width / 2f;\r\n            if (w > 75f)\r\n            {\r\n                position = this.DrawDuration(position, property, position.width - 75f);\r\n                position = this.DrawUnits(position, property, 75f);\r\n            }\r\n            else\r\n            {\r\n                position = this.DrawDuration(position, property, w);\r\n                position = this.DrawUnits(position, property, w);\r\n            }\r\n        }\r\n\r\n        public Rect DrawDuration(Rect position, SerializedProperty property, float desiredWidth)\r\n        {\r\n            if (position.width <= 0f) return position;\r\n\r\n            var r = new Rect(position.xMin, position.yMin, Mathf.Min(position.width, desiredWidth), position.height);\r\n\r\n            if (property.IsNumericValue())\r\n            {\r\n                var units = GetUnits(property, this.attribute as TimeUnitsSelectorAttribute, this.TimeUnitsCalculator);\r\n\r\n                double dur = property.GetNumericValue();\r\n                if (MathUtil.IsReal(dur)) dur = this.TimeUnitsCalculator.SecondsToTimeUnits(units, dur);\r\n                EditorGUI.BeginChangeCheck();\r\n                dur = EditorGUI.DoubleField(r, (float)dur);\r\n                if (EditorGUI.EndChangeCheck())\r\n                {\r\n                    if (MathUtil.IsReal(dur)) dur = this.TimeUnitsCalculator.TimeUnitsToSeconds(units, dur);\r\n                    property.SetNumericValue(dur);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                EditorGUI.LabelField(r, \"Unsupported type: \" + property.type);\r\n            }\r\n\r\n            return new Rect(r.xMax, position.yMin, Mathf.Max(position.width - r.width, 0f), position.height);\r\n        }\r\n\r\n        public Rect DrawUnits(Rect position, SerializedProperty property, float desiredWidth)\r\n        {\r\n            if (position.width <= 0f) return position;\r\n\r\n            var r = new Rect(position.xMin, position.yMin, Mathf.Min(position.width, desiredWidth), position.height);\r\n\r\n            var units = GetUnits(property, this.attribute as TimeUnitsSelectorAttribute, this.TimeUnitsCalculator);\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n\r\n            var allowedUnits = this.TimeUnitsCalculator.TimeUnits;\r\n            int i = allowedUnits.IndexOf(units);\r\n            i = EditorGUI.Popup(r, i, allowedUnits);\r\n\r\n            if (EditorGUI.EndChangeCheck())\r\n                SetUnits(property, (i < 0) ? allowedUnits.FirstOrDefault() : allowedUnits[i]);\r\n\r\n            return new Rect(r.xMax, position.yMin, Mathf.Max(position.width - r.width, 0f), position.height);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region Special Types\r\n\r\n        private static ITimeUnitsCalculator _defaultCalculator;\r\n\r\n        static TimeUnitsSelectorPropertyDrawer()\r\n        {\r\n            int order = int.MinValue;\r\n            System.Type selectedType = null;\r\n\r\n            foreach(var tp in TypeUtil.GetTypesAssignableFrom(typeof(ITimeUnitsCalculator)))\r\n            {\r\n                var attrib = tp.GetCustomAttributes(typeof(OverrideDefaultTimeUnitsCalculatorAttribute), false).FirstOrDefault() as OverrideDefaultTimeUnitsCalculatorAttribute;\r\n                if(attrib != null)\r\n                {\r\n                    if(attrib.order > order || selectedType == null)\r\n                    {\r\n                        order = attrib.order;\r\n                        selectedType = tp;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (selectedType != null)\r\n            {\r\n                try\r\n                {\r\n                    _defaultCalculator = System.Activator.CreateInstance(selectedType) as ITimeUnitsCalculator;\r\n                }\r\n                catch\r\n                {\r\n                    Debug.LogWarning(\"Failed to create an override time units calculator of type '\" + selectedType.FullName + \"'\");\r\n                }\r\n            }\r\n\r\n            if(_defaultCalculator == null)\r\n            {\r\n                _defaultCalculator = new DefaultTimeUnitsCalculator();\r\n            }\r\n\r\n        }\r\n\r\n        public class OverrideDefaultTimeUnitsCalculatorAttribute : System.Attribute\r\n        {\r\n            public int order;\r\n        }\r\n\r\n        public interface ITimeUnitsCalculator\r\n        {\r\n\r\n            string[] TimeUnits { get; }\r\n\r\n            string DefaultUnits { get; }\r\n\r\n            double SecondsToTimeUnits(string units, double seconds);\r\n\r\n            double TimeUnitsToSeconds(string units, double time);\r\n\r\n        }\r\n\r\n        public class DefaultTimeUnitsCalculator : ITimeUnitsCalculator\r\n        {\r\n\r\n            public const double DAYS_IN_YEAR = 365d;\r\n\r\n            private string[] _units = new string[]\r\n            {\r\n                \"Seconds\",\r\n                \"Minutes\",\r\n                \"Hours\",\r\n                \"Days\",\r\n                \"Years\"\r\n            };\r\n\r\n            public virtual string[] TimeUnits\r\n            {\r\n                get { return _units; }\r\n            }\r\n\r\n            public virtual string DefaultUnits\r\n            {\r\n                get { return \"Seconds\"; }\r\n            }\r\n\r\n            public virtual double SecondsToTimeUnits(string units, double seconds)\r\n            {\r\n                var span = System.TimeSpan.FromSeconds(seconds);\r\n\r\n                switch(units)\r\n                {\r\n                    case \"Seconds\":\r\n                        return span.TotalSeconds;\r\n                    case \"Minutes\":\r\n                        return span.TotalMinutes;\r\n                    case \"Hours\":\r\n                        return span.TotalHours;\r\n                    case \"Days\":\r\n                        return span.TotalDays;\r\n                    case \"Years\":\r\n                        return span.Ticks / (System.TimeSpan.TicksPerDay * DAYS_IN_YEAR);\r\n                    default:\r\n                        return seconds;\r\n                }\r\n            }\r\n\r\n            public virtual double TimeUnitsToSeconds(string units, double time)\r\n            {\r\n                switch(units)\r\n                {\r\n                    case \"Seconds\":\r\n                        return time;\r\n                    case \"Minutes\":\r\n                        return System.TimeSpan.FromMinutes(time).TotalSeconds;\r\n                    case \"Hours\":\r\n                        return System.TimeSpan.FromHours(time).TotalSeconds;\r\n                    case \"Days\":\r\n                        return System.TimeSpan.FromDays(time).TotalSeconds;\r\n                    case \"Years\":\r\n                        return System.TimeSpan.FromTicks((long)(time * System.TimeSpan.TicksPerDay * DAYS_IN_YEAR)).TotalSeconds;\r\n                    default:\r\n                        return time;\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/TypeReferencePropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n\r\n    [CustomPropertyDrawer(typeof(TypeReference))]\r\n    public class TypeReferencePropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public const string PROP_TYPEHASH = \"_typeHash\";\r\n\r\n        #region Manually Configured Properties\r\n\r\n        private System.Type _inheritsFromType;\r\n        private bool _allowAbstractTypes;\r\n        private bool _allowInterfaces;\r\n        private System.Type _defaultType;\r\n        private System.Type[] _excludedTypes;\r\n        private TypeDropDownListingStyle _dropDownStyle = TypeDropDownListingStyle.Namespace;\r\n        private System.Predicate<System.Type> _searchPredicate;\r\n        private bool _isManuallyConfigured;\r\n\r\n        public System.Type InheritsFromType\r\n        {\r\n            get { return _inheritsFromType; }\r\n            set\r\n            {\r\n                _inheritsFromType = value;\r\n                _isManuallyConfigured = true;\r\n            }\r\n        }\r\n\r\n        public bool AllowAbstractTypes\r\n        {\r\n            get { return _allowAbstractTypes; }\r\n            set\r\n            {\r\n                _allowAbstractTypes = value;\r\n                _isManuallyConfigured = true;\r\n            }\r\n        }\r\n\r\n        public bool AllowInterfaces\r\n        {\r\n            get { return _allowInterfaces; }\r\n            set\r\n            {\r\n                _allowInterfaces = value;\r\n                _isManuallyConfigured = true;\r\n            }\r\n        }\r\n\r\n        public System.Type DefaultType\r\n        {\r\n            get { return _defaultType; }\r\n            set\r\n            {\r\n                _defaultType = value;\r\n                _isManuallyConfigured = true;\r\n            }\r\n        }\r\n\r\n        public System.Type[] ExcludedTypes\r\n        {\r\n            get { return _excludedTypes; }\r\n            set\r\n            {\r\n                _excludedTypes = value;\r\n                _isManuallyConfigured = true;\r\n            }\r\n        }\r\n\r\n        public TypeDropDownListingStyle DropDownStyle\r\n        {\r\n            get { return _dropDownStyle; }\r\n            set\r\n            {\r\n                _dropDownStyle = value;\r\n                _isManuallyConfigured = true;\r\n            }\r\n        }\r\n\r\n        public System.Predicate<System.Type> SearchPredicate\r\n        {\r\n            get { return _searchPredicate; }\r\n            set\r\n            {\r\n                _searchPredicate = value;\r\n                _isManuallyConfigured = true;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            EditorGUI.BeginProperty(position, label, property);\r\n            \r\n            \r\n            var baseType = typeof(object);\r\n            bool allowAbstractTypes = false;\r\n            bool allowInterfaces = false;\r\n            System.Type defaultType = null;\r\n            System.Type[] excludedTypes = null;\r\n            TypeDropDownListingStyle style = TypeDropDownListingStyle.Namespace;\r\n            System.Predicate<System.Type> searchPredicate = null;\r\n\r\n            if(_isManuallyConfigured)\r\n            {\r\n                baseType = _inheritsFromType ?? typeof(object);\r\n                allowAbstractTypes = _allowAbstractTypes;\r\n                allowInterfaces = _allowInterfaces;\r\n                defaultType = _defaultType;\r\n                excludedTypes = _excludedTypes;\r\n                style = _dropDownStyle;\r\n                searchPredicate = _searchPredicate;\r\n            }\r\n            else if(this.fieldInfo != null)\r\n            {\r\n                var attrib = this.fieldInfo.GetCustomAttributes(typeof(TypeReference.ConfigAttribute), true).FirstOrDefault() as TypeReference.ConfigAttribute;\r\n                if (attrib != null)\r\n                {\r\n                    baseType = attrib.inheritsFromType;\r\n                    allowAbstractTypes = attrib.allowAbstractClasses;\r\n                    allowInterfaces = attrib.allowInterfaces;\r\n                    defaultType = attrib.defaultType;\r\n                    excludedTypes = attrib.excludedTypes;\r\n                    style = attrib.dropDownStyle;\r\n                    searchPredicate = null;\r\n                }\r\n            }\r\n            \r\n\r\n\r\n            //var tpref = EditorHelper.GetTargetObjectOfProperty(property) as TypeReference;\r\n            //if(tpref == null)\r\n            //{\r\n            //    tpref = new TypeReference();\r\n            //    EditorHelper.SetTargetObjectOfProperty(property, tpref);\r\n            //    property.serializedObject.ApplyModifiedProperties();\r\n            //}\r\n\r\n            //EditorGUI.BeginChangeCheck();\r\n            //tpref.Type = SPEditorGUI.TypeDropDown(position, label, baseType, tpref.Type, allowAbstractTypes, allowInterfaces, defaultType, excludedTypes, style);\r\n            //if (EditorGUI.EndChangeCheck())\r\n            //    property.serializedObject.Update();\r\n\r\n\r\n\r\n            var tp = GetTypeFromTypeReference(property);\r\n            EditorGUI.BeginChangeCheck();\r\n            tp = SPEditorGUI.TypeDropDown(position, label, baseType, tp, allowAbstractTypes, allowInterfaces, defaultType, excludedTypes, style, searchPredicate);\r\n            if (EditorGUI.EndChangeCheck())\r\n                SetTypeToTypeReference(property, tp);\r\n\r\n            EditorGUI.EndProperty();\r\n        }\r\n\r\n\r\n        public static System.Type GetTypeFromTypeReference(SerializedProperty property)\r\n        {\r\n            if (property == null) return null;\r\n            var hashProp = property.FindPropertyRelative(PROP_TYPEHASH);\r\n            if (hashProp == null) return null;\r\n            return TypeReference.UnHashType(hashProp.stringValue);\r\n        }\r\n\r\n        public static void SetTypeToTypeReference(SerializedProperty property, System.Type tp)\r\n        {\r\n            if (property == null) return;\r\n\r\n            var hashProp = property.FindPropertyRelative(PROP_TYPEHASH);\r\n            if (hashProp == null) return;\r\n\r\n            hashProp.stringValue = TypeReference.HashType(tp);\r\n\r\n            if(Application.isPlaying)\r\n            {\r\n                var tpref = EditorHelper.GetTargetObjectOfProperty(property) as TypeReference;\r\n                if(tpref != null)\r\n                {\r\n                    tpref.Type = tp;\r\n                }\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/UnitVectorPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(UnitVectorAttribute))]\r\n    public class UnitVectorPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public const float BTN_WIDTH = 100f;\r\n\r\n        private enum Vector2Directions\r\n        {\r\n            Up,\r\n            Down,\r\n            Right,\r\n            Left,\r\n            Configure\r\n        }\r\n\r\n        private enum Vector3Directions\r\n        {\r\n            Up,\r\n            Down,\r\n            Right,\r\n            Left,\r\n            Forward,\r\n            Backward,\r\n            Configure\r\n        }\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            return EditorGUIUtility.singleLineHeight;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            switch(property.propertyType)\r\n            {\r\n                case SerializedPropertyType.Vector2:\r\n                    this.DrawVector2(position, property, label);\r\n                    break;\r\n                case SerializedPropertyType.Vector3:\r\n                    this.DrawVector3(position, property, label);\r\n                    break;\r\n                case SerializedPropertyType.Vector4:\r\n                    this.DrawVector4(position, property, label);\r\n                    break;\r\n                default:\r\n                    SPEditorGUI.DefaultPropertyField(position, property, label);\r\n                    break;\r\n            }\r\n        }\r\n\r\n\r\n\r\n        private void DrawVector2(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            position = EditorGUI.PrefixLabel(position, label);\r\n\r\n            float btnw = Mathf.Min(position.width, BTN_WIDTH);\r\n            var rbtn = new Rect(position.xMax - btnw, position.yMin, btnw, EditorGUIUtility.singleLineHeight);\r\n\r\n            var v = property.vector2Value;\r\n            if (v == Vector2.zero)\r\n            {\r\n                v = Vector2.right;\r\n                property.vector2Value = Vector2.right;\r\n            }\r\n\r\n            Vector2Directions i = Vector2Directions.Configure;\r\n            if (v == Vector2.up)\r\n                i = Vector2Directions.Up;\r\n            else if (v == Vector2.down)\r\n                i = Vector2Directions.Down;\r\n            else if (v == Vector2.right)\r\n                i = Vector2Directions.Right;\r\n            else if (v == Vector2.left)\r\n                i = Vector2Directions.Left;\r\n            else\r\n                i = Vector2Directions.Configure;\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            i = (Vector2Directions)EditorGUI.EnumPopup(rbtn, i);\r\n            if (EditorGUI.EndChangeCheck())\r\n            {\r\n                switch (i)\r\n                {\r\n                    case Vector2Directions.Up:\r\n                        property.vector2Value = Vector2.up;\r\n                        break;\r\n                    case Vector2Directions.Down:\r\n                        property.vector2Value = Vector2.down;\r\n                        break;\r\n                    case Vector2Directions.Right:\r\n                        property.vector2Value = Vector2.right;\r\n                        break;\r\n                    case Vector2Directions.Left:\r\n                        property.vector2Value = Vector2.left;\r\n                        break;\r\n                }\r\n            }\r\n\r\n            if (i < Vector2Directions.Configure)\r\n            {\r\n                float w = (position.width - btnw) / 2f;\r\n                var r1 = new Rect(position.xMin, position.yMin, w, EditorGUIUtility.singleLineHeight);\r\n                var r2 = new Rect(r1.xMax, position.yMin, w, EditorGUIUtility.singleLineHeight);\r\n                EditorGUI.LabelField(r1, \"X: \" + v.x.ToString(\"0.#######\"));\r\n                EditorGUI.LabelField(r2, \"Y: \" + v.y.ToString(\"0.#######\"));\r\n            }\r\n            else\r\n            {\r\n                //TODO - need way to make this work effectively\r\n                var r = new Rect(position.xMin, position.yMin, position.width - btnw, EditorGUIUtility.singleLineHeight);\r\n                EditorGUI.BeginChangeCheck();\r\n                v = EditorGUI.Vector2Field(r, GUIContent.none, v);\r\n                if (EditorGUI.EndChangeCheck())\r\n                {\r\n                    property.vector2Value = v.normalized;\r\n                }\r\n            }\r\n        }\r\n\r\n        private void DrawVector3(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            position = EditorGUI.PrefixLabel(position, label);\r\n\r\n            float btnw = Mathf.Min(position.width, BTN_WIDTH);\r\n            var rbtn = new Rect(position.xMax - btnw, position.yMin, btnw, EditorGUIUtility.singleLineHeight);\r\n\r\n            var v = property.vector3Value;\r\n            if (v == Vector3.zero)\r\n            {\r\n                v = Vector3.forward;\r\n                property.vector3Value = Vector3.forward;\r\n            }\r\n\r\n            Vector3Directions i = Vector3Directions.Configure;\r\n            if (v == Vector3.up)\r\n                i = Vector3Directions.Up;\r\n            else if (v == Vector3.down)\r\n                i = Vector3Directions.Down;\r\n            else if (v == Vector3.right)\r\n                i = Vector3Directions.Right;\r\n            else if (v == Vector3.left)\r\n                i = Vector3Directions.Left;\r\n            else if (v == Vector3.forward)\r\n                i = Vector3Directions.Forward;\r\n            else if (v == Vector3.back)\r\n                i = Vector3Directions.Backward;\r\n            else\r\n                i = Vector3Directions.Configure;\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            i = (Vector3Directions)EditorGUI.EnumPopup(rbtn, i);\r\n            if(EditorGUI.EndChangeCheck())\r\n            {\r\n                switch (i)\r\n                {\r\n                    case Vector3Directions.Up:\r\n                        property.vector3Value = Vector3.up;\r\n                        break;\r\n                    case Vector3Directions.Down:\r\n                        property.vector3Value = Vector3.down;\r\n                        break;\r\n                    case Vector3Directions.Right:\r\n                        property.vector3Value = Vector3.right;\r\n                        break;\r\n                    case Vector3Directions.Left:\r\n                        property.vector3Value = Vector3.left;\r\n                        break;\r\n                    case Vector3Directions.Forward:\r\n                        property.vector3Value = Vector3.forward;\r\n                        break;\r\n                    case Vector3Directions.Backward:\r\n                        property.vector3Value = Vector3.back;\r\n                        break;\r\n                }\r\n            }\r\n\r\n            if (i < Vector3Directions.Configure)\r\n            {\r\n                float w = (position.width - btnw) / 3f;\r\n                var r1 = new Rect(position.xMin, position.yMin, w, EditorGUIUtility.singleLineHeight);\r\n                var r2 = new Rect(r1.xMax, position.yMin, w, EditorGUIUtility.singleLineHeight);\r\n                var r3 = new Rect(r2.xMax, position.yMin, w, EditorGUIUtility.singleLineHeight);\r\n\r\n                EditorGUI.LabelField(r1, \"X: \" + v.x.ToString(\"0.#######\"));\r\n                EditorGUI.LabelField(r2, \"Y: \" + v.y.ToString(\"0.#######\"));\r\n                EditorGUI.LabelField(r3, \"Z: \" + v.z.ToString(\"0.#######\"));\r\n            }\r\n            else\r\n            {\r\n                //TODO - need way to make this work effectively\r\n                var r = new Rect(position.xMin, position.yMin, position.width - btnw, EditorGUIUtility.singleLineHeight);\r\n                EditorGUI.BeginChangeCheck();\r\n                v = SPEditorGUI.DelayedVector3Field(r, GUIContent.none, v);\r\n                if(EditorGUI.EndChangeCheck())\r\n                {\r\n                    property.vector3Value = v.normalized;\r\n                }\r\n            }\r\n        }\r\n\r\n        private void DrawVector4(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            position = EditorGUI.PrefixLabel(position, label);\r\n\r\n            float btnw = Mathf.Min(position.width, BTN_WIDTH);\r\n            float w = (position.width - btnw) / 4f;\r\n            float h = position.height;\r\n            float y = position.yMin;\r\n\r\n            var r1 = new Rect(position.xMin, y, w, h);\r\n            var r2 = new Rect(r1.xMax, y, w, h);\r\n            var r3 = new Rect(r2.xMax, y, w, h);\r\n            var r4 = new Rect(r3.xMax, y, w, h);\r\n            var rbtn = new Rect(r4.xMax, y, btnw, h);\r\n\r\n            var v = property.vector4Value;\r\n            EditorGUI.LabelField(r1, \"X: \" + v.x.ToString(\"0.#######\"));\r\n            EditorGUI.LabelField(r2, \"Y: \" + v.y.ToString(\"0.#######\"));\r\n            EditorGUI.LabelField(r3, \"Z: \" + v.z.ToString(\"0.#######\"));\r\n            EditorGUI.LabelField(r4, \"W: \" + v.w.ToString(\"0.#######\"));\r\n            \r\n            if(GUI.Button(rbtn, \"Configure\"))\r\n            {\r\n                //TODO\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/VariableStoreInspector.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Base\n{\n\n    [CustomEditor(typeof(VariableStore))]\n    public class VariableStoreInspector : SPEditor\n    {\n\n        public const string PROP_REFLECTNAMES = \"_reflectNamesFromType\";\n        public const string PROP_VARIABLES = \"_variables\";\n\n        private VariantCollectionPropertyDrawer _variablesDrawer = new VariantCollectionPropertyDrawer();\n\n        protected override void OnSPInspectorGUI()\n        {\n            this.serializedObject.Update();\n\n            var propReflect = this.serializedObject.FindProperty(PROP_REFLECTNAMES);\n            SPEditorGUILayout.PropertyField(propReflect);\n\n            var propVars = this.serializedObject.FindProperty(PROP_VARIABLES);\n            var lbl_Vars = EditorHelper.TempContent(\"Variables\");\n            _variablesDrawer.ConfigurePropertyList((TypeReferencePropertyDrawer.GetTypeFromTypeReference(propReflect)));\n            var h = _variablesDrawer.GetPropertyHeight(propVars, lbl_Vars);\n            var r = EditorGUILayout.GetControlRect(true, _variablesDrawer.GetPropertyHeight(propVars, lbl_Vars));\n            _variablesDrawer.OnGUI(r, propVars, lbl_Vars);\n\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_REFLECTNAMES, PROP_VARIABLES);\n\n            this.serializedObject.ApplyModifiedProperties();\n        }\n\n    }\n\n    [CustomEditor(typeof(VariableStoreAsset))]\n    public class VariableStoreAssetInspector : VariableStoreInspector\n    {\n\n        /*\n        public const string PROP_REFLECTNAMES = \"_reflectNamesFromType\";\n        public const string PROP_VARIABLES = \"_variables\";\n\n        private VariantCollectionPropertyDrawer _variablesDrawer = new VariantCollectionPropertyDrawer();\n\n        protected override void OnSPInspectorGUI()\n        {\n            this.serializedObject.Update();\n\n            var propReflect = this.serializedObject.FindProperty(PROP_REFLECTNAMES);\n            SPEditorGUILayout.PropertyField(propReflect);\n\n            var propVars = this.serializedObject.FindProperty(PROP_VARIABLES);\n            var lbl_Vars = EditorHelper.TempContent(\"Variables\");\n            _variablesDrawer.ConfigurePropertyList((TypeReferencePropertyDrawer.GetTypeFromTypeReference(propReflect)));\n            var h = _variablesDrawer.GetPropertyHeight(propVars, lbl_Vars);\n            var r = EditorGUILayout.GetControlRect(true, _variablesDrawer.GetPropertyHeight(propVars, lbl_Vars));\n            _variablesDrawer.OnGUI(r, propVars, lbl_Vars);\n\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_REFLECTNAMES, PROP_VARIABLES);\n\n            this.serializedObject.ApplyModifiedProperties();\n        }\n        */\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/VariantCollectionPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(VariantCollection), true)]\r\n    public class VariantCollectionPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private VariantReferencePropertyDrawer _variantDrawer = new VariantReferencePropertyDrawer();\r\n\r\n        private ReorderableList _lst;\r\n        private GUIContent _label;\r\n        private SerializedProperty _currentProp;\r\n        private SerializedProperty _currentKeysProp;\r\n        private SerializedProperty _currentValuesProp;\r\n\r\n        private System.Type _propertyListTargetType; //if the VariantCollection is treated as a PropertyList\r\n        private System.Reflection.MemberInfo[] _propertyListMembers;\r\n        private string[] _propertyListNames;\r\n\r\n        private List<int> _memberLookupTable = new List<int>(); \r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private void StartOnGUI(SerializedProperty property, GUIContent label)\r\n        {\r\n            _currentProp = property;\r\n            _label = label;\r\n            _currentKeysProp = _currentProp.FindPropertyRelative(\"_keys\");\r\n            _currentValuesProp = _currentProp.FindPropertyRelative(\"_values\");\r\n\r\n            _currentValuesProp.arraySize = _currentKeysProp.arraySize;\r\n\r\n            _lst = CachedReorderableList.GetListDrawer(_memberLookupTable, _currentProp, _lst_DrawHeader, _lst_DrawElement, _lst_OnAdd, _lst_OnRemove, null, null, _lst_OnReorder);\r\n            //_lst.draggable = false;\r\n            _memberLookupTable.Clear();\r\n            for(int i = 0; i < _currentKeysProp.arraySize; i++)\r\n            {\r\n                _memberLookupTable.Add(i);\r\n            }\r\n\r\n            if (this.fieldInfo != null)\r\n            {\r\n                var asPropAttrib = this.fieldInfo.GetCustomAttributes(typeof(VariantCollection.AsPropertyListAttribute), false).FirstOrDefault() as VariantCollection.AsPropertyListAttribute;\r\n                if(asPropAttrib != null && asPropAttrib.TargetType != null)\r\n                {\r\n                    this.ConfigurePropertyList(asPropAttrib.TargetType);\r\n                }\r\n\r\n                var asTypedList = this.fieldInfo.GetCustomAttributes(typeof(VariantCollection.AsTypedList), false).FirstOrDefault() as VariantCollection.AsTypedList;\r\n                if(asTypedList != null && asTypedList.TargetType != null && VariantReference.AcceptableType(asTypedList.TargetType))\r\n                {\r\n                    _variantDrawer.RestrictVariantType = true;\r\n                    _variantDrawer.TypeRestrictedTo = asTypedList.TargetType;\r\n                    _variantDrawer.ForcedObjectType = asTypedList.TargetType;\r\n                }\r\n\r\n            }\r\n        }\r\n\r\n        private void EndOnGUI(SerializedProperty property, GUIContent label)\r\n        {\r\n            _lst = null;\r\n            _currentProp = null;\r\n            _currentKeysProp = null;\r\n            _currentValuesProp = null;\r\n            _label = null;\r\n\r\n            if(this.fieldInfo != null)\r\n            {\r\n                _propertyListTargetType = null;\r\n                _propertyListMembers = null;\r\n                _propertyListNames = null;\r\n            }\r\n\r\n            _variantDrawer.RestrictVariantType = false;\r\n            _variantDrawer.ForcedObjectType = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void ConfigurePropertyList(System.Type tp)\r\n        {\r\n            _propertyListTargetType = tp;\r\n            if(tp != null)\r\n            {\r\n                _propertyListMembers = (from m\r\n                                         in DynamicUtil.GetEasilySerializedMembersFromType(_propertyListTargetType, System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property, DynamicMemberAccess.Write)\r\n                                        select m).ToArray();\r\n                _propertyListNames = (from m in _propertyListMembers select m.Name).ToArray();\r\n            }\r\n            else\r\n            {\r\n                _propertyListMembers = null;\r\n                _propertyListNames = null;\r\n            }\r\n        }\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            float h;\r\n            if (EditorHelper.AssertMultiObjectEditingNotSupportedHeight(property, label, out h)) return h;\r\n\r\n            this.StartOnGUI(property, label);\r\n\r\n            h = _lst.GetHeight();\r\n\r\n            this.EndOnGUI(property, label);\r\n\r\n            return h;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            if (EditorHelper.AssertMultiObjectEditingNotSupported(position, property, label)) return;\r\n\r\n            this.StartOnGUI(property, label);\r\n\r\n            _lst.DoList(position);\r\n\r\n            this.EndOnGUI(property, label);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ReorderableList Handlers\r\n\r\n        private void _lst_DrawHeader(Rect area)\r\n        {\r\n            EditorGUI.LabelField(area, _label);\r\n        }\r\n\r\n        private void _lst_DrawElement(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            if (_currentValuesProp.arraySize <= index) _currentValuesProp.arraySize = index + 1;\r\n            var keyProp = _currentKeysProp.GetArrayElementAtIndex(index);\r\n            var variantProp = _currentValuesProp.GetArrayElementAtIndex(index);\r\n\r\n            var w = area.width / 3f;\r\n            if(_propertyListTargetType != null)\r\n            {\r\n                var nameRect = new Rect(area.xMin, area.yMin, w, EditorGUIUtility.singleLineHeight);\r\n                EditorGUI.BeginChangeCheck();\r\n                int i = EditorGUI.Popup(nameRect, _propertyListNames.IndexOf(keyProp.stringValue), _propertyListNames);\r\n                if (EditorGUI.EndChangeCheck() && i >= 0 && !NameIsInUse(_currentKeysProp, _propertyListNames[i]))\r\n                    keyProp.stringValue = _propertyListNames[i];\r\n\r\n                var variantRect = new Rect(nameRect.xMax + 1f, area.yMin, area.width - (nameRect.width + 1f), area.height);\r\n                if (i >= 0)\r\n                {\r\n                    var propType = com.spacepuppy.Dynamic.DynamicUtil.GetReturnType(_propertyListMembers[i]);\r\n                    _variantDrawer.RestrictVariantType = true;\r\n                    _variantDrawer.TypeRestrictedTo = propType;\r\n                    _variantDrawer.ForcedObjectType = propType;\r\n                    _variantDrawer.DrawValueField(variantRect, variantProp);\r\n                }\r\n                else\r\n                {\r\n                    EditorGUI.LabelField(variantRect, \"Select Property\");\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var nameRect = new Rect(area.xMin, area.yMin, w, EditorGUIUtility.singleLineHeight);\r\n                keyProp.stringValue = EditorGUI.TextField(nameRect, keyProp.stringValue);\r\n\r\n                var variantRect = new Rect(nameRect.xMax + 1f, area.yMin, area.width - (nameRect.width + 1f), area.height);\r\n                _variantDrawer.DrawValueField(variantRect, variantProp);\r\n            }\r\n        }\r\n\r\n        private void _lst_OnAdd(ReorderableList lst)\r\n        {\r\n            if (_propertyListTargetType != null)\r\n            {\r\n                int i = _currentKeysProp.arraySize;\r\n                _currentKeysProp.arraySize = i + 1;\r\n                _currentKeysProp.GetArrayElementAtIndex(i).stringValue = null;\r\n                _currentValuesProp.arraySize = i + 1;\r\n            }\r\n            else\r\n            {\r\n                int i = _currentKeysProp.arraySize;\r\n                _currentKeysProp.arraySize = i + 1;\r\n                _currentKeysProp.GetArrayElementAtIndex(i).stringValue = \"Entry \" + i.ToString();\r\n                _currentValuesProp.arraySize = i + 1;\r\n            }\r\n        }\r\n        \r\n        private void _lst_OnRemove(ReorderableList lst)\r\n        {\r\n            var index = lst.index;\r\n            if(index < 0 || index >= _currentKeysProp.arraySize) return;\r\n            _currentKeysProp.DeleteArrayElementAtIndex(index);\r\n            if (index < _currentValuesProp.arraySize) _currentValuesProp.DeleteArrayElementAtIndex(index);\r\n        }\r\n        \r\n        private void _lst_OnReorder(ReorderableList lst)\r\n        {\r\n            if (lst.index < 0 || lst.index >= _memberLookupTable.Count) return;\r\n\r\n            int i = lst.index;\r\n            int j = _memberLookupTable[lst.index];\r\n\r\n            _currentKeysProp.MoveArrayElement(j, i);\r\n            _currentValuesProp.MoveArrayElement(j, i);\r\n            _currentProp.serializedObject.ApplyModifiedProperties();\r\n            _currentProp.serializedObject.Update();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Utils\r\n\r\n        private static bool NameIsInUse(SerializedProperty keysArrayProp, string name)\r\n        {\r\n            for(int i = 0; i < keysArrayProp.arraySize; i++)\r\n            {\r\n                if (keysArrayProp.GetArrayElementAtIndex(i).stringValue == name) return true;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/VariantMemberPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\n\nusing com.spacepuppy;\nusing com.spacepuppyeditor.Components;\n\nnamespace com.spacepuppyeditor.Base\n{\n\n    [CustomPropertyDrawer(typeof(VariantMember))]\n    public class VariantMemberPropertyDrawer : PropertyDrawer\n    {\n\n        public const string PROP_TARGET = \"_target\";\n        public const string PROP_MEMBER = \"_memberName\";\n\n        private SelectableObjectPropertyDrawer _objectDrawer = new SelectableObjectPropertyDrawer();\n\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n        {\n            return EditorGUIUtility.singleLineHeight;\n        }\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            var propTarget = property.FindPropertyRelative(PROP_TARGET);\n            var propMember = property.FindPropertyRelative(PROP_MEMBER);\n\n            position = EditorGUI.PrefixLabel(position, label);\n            \n            if(propTarget.objectReferenceValue == null)\n            {\n                _objectDrawer.OnGUI(position, propTarget, GUIContent.none);\n            }\n            else\n            {\n                var r0 = new Rect(position.xMin, position.yMin, position.width * 0.5f, position.height);\n                var r1 = new Rect(r0.xMax, position.yMin, position.width - r0.width, position.height);\n\n                EditorGUI.BeginChangeCheck();\n                _objectDrawer.OnGUI(r0, propTarget, GUIContent.none);\n                if (EditorGUI.EndChangeCheck())\n                {\n                    this.PurgeIfPlaying(property);\n                    if (propTarget.objectReferenceValue == null) return;\n                }\n\n                EditorGUI.BeginChangeCheck();\n                System.Reflection.MemberInfo info;\n                propMember.stringValue = SPEditorGUI.ReflectedPropertyField(r1, GUIContent.none,\n                                                                                propTarget.objectReferenceValue,\n                                                                                propMember.stringValue,\n                                                                                com.spacepuppy.Dynamic.DynamicMemberAccess.ReadWrite,\n                                                                                out info);\n                if(EditorGUI.EndChangeCheck())\n                {\n                    this.PurgeIfPlaying(property);\n                }\n            }\n        }\n\n        private void PurgeIfPlaying(SerializedProperty property)\n        {\n            if(Application.isPlaying)\n            {\n                var obj = EditorHelper.GetTargetObjectOfProperty(property);\n                if (obj is VariantMember) (obj as VariantMember).SetDirty();\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/VariantReferencePropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Components;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(VariantReference))]\r\n    public class VariantReferencePropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        #region Fields\r\n\r\n        const string PROP_VARIANTTYPE = \"_type\";\r\n        const string PROP_UNITYOBJREF = \"_unityObjectReference\";\r\n        const string PROP_STRING = \"_string\";\r\n        const float REF_SELECT_WIDTH = 70f;\r\n\r\n        public bool RestrictVariantType = false;\r\n\r\n        \r\n        private VariantType _variantTypeRestrictedTo;\r\n        private System.Type _typeRestrictedTo = typeof(UnityEngine.Object);\r\n        private System.Type _forcedObjectType = typeof(UnityEngine.Object);\r\n\r\n        private VariantReference.EditorHelper _helper = new VariantReference.EditorHelper(new VariantReference());\r\n        private SelectableComponentPropertyDrawer _selectComponentDrawer = new SelectableComponentPropertyDrawer();\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n        \r\n        public VariantType VariantTypeRestrictedTo\r\n        {\r\n            get { return _variantTypeRestrictedTo; }\r\n        }\r\n\r\n        public System.Type TypeRestrictedTo\r\n        {\r\n            get { return _typeRestrictedTo; }\r\n            set\r\n            {\r\n                _typeRestrictedTo = value ?? typeof(UnityEngine.Object);\r\n                _variantTypeRestrictedTo = VariantReference.GetVariantType(_typeRestrictedTo);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Unity Object type restriction, if the restricted type is a UnityEngine.Object.\r\n        /// </summary>\r\n        public System.Type ForcedObjectType\r\n        {\r\n            get { return _forcedObjectType; }\r\n            set\r\n            {\r\n                if (ComponentUtil.IsAcceptableComponentType(value))\r\n                    _forcedObjectType = value;\r\n                else if (TypeUtil.IsType(value, typeof(UnityEngine.Object)))\r\n                    _forcedObjectType = value;\r\n                else\r\n                    _forcedObjectType = typeof(UnityEngine.Object);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            return base.GetPropertyHeight(property, label);\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var labelWidthCache = EditorGUIUtility.labelWidth;\r\n            EditorGUIUtility.labelWidth = Mathf.Max(0f, labelWidthCache - REF_SELECT_WIDTH);\r\n            EditorGUI.BeginProperty(position, label, property);\r\n\r\n            position = EditorGUI.PrefixLabel(position, label);\r\n            this.DrawValueField(position, property);\r\n\r\n            EditorGUI.EndProperty();\r\n            EditorGUIUtility.labelWidth = labelWidthCache;\r\n        }\r\n\r\n        public void DrawValueField(Rect position, SerializedProperty property)\r\n        {\r\n            CopyValuesToHelper(property, _helper);\r\n\r\n            //draw ref selection\r\n            position = this.DrawRefModeSelectionDropDown(position, property, _helper);\r\n\r\n            //draw value\r\n            switch(_helper._mode)\r\n            {\r\n                case VariantReference.RefMode.Value:\r\n                    {\r\n                        EditorGUI.BeginChangeCheck();\r\n                        this.DrawValueFieldInValueMode(position, property, _helper);\r\n                        if (EditorGUI.EndChangeCheck())\r\n                        {\r\n                            CopyValuesFromHelper(property, _helper);\r\n                        }\r\n                    }\r\n                    break;\r\n                case VariantReference.RefMode.Property:\r\n                    this.DrawValueFieldInPropertyMode(position, property, _helper);\r\n                    break;\r\n                case VariantReference.RefMode.Eval:\r\n                    this.DrawValueFieldInEvalMode(position, property, _helper);\r\n                    break;\r\n            }\r\n        }\r\n\r\n        private Rect DrawRefModeSelectionDropDown(Rect position, SerializedProperty property, VariantReference.EditorHelper helper)\r\n        {\r\n            var r0 = new Rect(position.xMin, position.yMin, Mathf.Min(REF_SELECT_WIDTH, position.width), position.height);\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            var mode = (VariantReference.RefMode)EditorGUI.EnumPopup(r0, GUIContent.none, _helper._mode);\r\n            if (EditorGUI.EndChangeCheck())\r\n            {\r\n                _helper.PrepareForRefModeChange(mode);\r\n                CopyValuesFromHelper(property, helper);\r\n            }\r\n\r\n            return new Rect(r0.xMax, r0.yMin, position.width - r0.width, r0.height);\r\n        }\r\n\r\n        private void DrawValueFieldInValueMode(Rect position, SerializedProperty property, VariantReference.EditorHelper helper)\r\n        {\r\n            if (helper.Target == null) return;\r\n            var variant = helper.Target;\r\n\r\n            if (this.RestrictVariantType && helper._type != this.VariantTypeRestrictedTo)\r\n            {\r\n                helper.PrepareForValueTypeChange(this.VariantTypeRestrictedTo);\r\n                GUI.changed = true; //force change\r\n            }\r\n\r\n            var r0 = new Rect(position.xMin, position.yMin, 90.0f, EditorGUIUtility.singleLineHeight);\r\n            var r1 = new Rect(r0.xMax, position.yMin, position.xMax - r0.xMax, EditorGUIUtility.singleLineHeight);\r\n            \r\n            var cache = SPGUI.DisableIf(this.RestrictVariantType);\r\n            EditorGUI.BeginChangeCheck();\r\n            var valueType = variant.ValueType;\r\n            valueType = (VariantType)EditorGUI.EnumPopup(r0, GUIContent.none, valueType);\r\n            if (EditorGUI.EndChangeCheck())\r\n            {\r\n                helper.PrepareForValueTypeChange(valueType);\r\n            }\r\n            cache.Reset();\r\n\r\n            if(_typeRestrictedTo.IsEnum)\r\n            {\r\n                variant.IntValue = ConvertUtil.ToInt(EditorGUI.EnumPopup(r1, ConvertUtil.ToEnumOfType(_typeRestrictedTo, variant.IntValue)));\r\n            }\r\n            else\r\n            {\r\n                switch (valueType)\r\n                {\r\n                    case VariantType.Null:\r\n                        cache = SPGUI.Disable();\r\n                        EditorGUI.TextField(r1, \"Null\");\r\n                        cache.Reset();\r\n                        break;\r\n                    case VariantType.String:\r\n                        variant.StringValue = EditorGUI.TextField(r1, variant.StringValue);\r\n                        break;\r\n                    case VariantType.Boolean:\r\n                        variant.BoolValue = EditorGUI.Toggle(r1, variant.BoolValue);\r\n                        break;\r\n                    case VariantType.Integer:\r\n                        variant.IntValue = EditorGUI.IntField(r1, variant.IntValue);\r\n                        break;\r\n                    case VariantType.Float:\r\n                        variant.FloatValue = EditorGUI.FloatField(r1, variant.FloatValue);\r\n                        break;\r\n                    case VariantType.Double:\r\n                        //variant.DoubleValue = ConvertUtil.ToDouble(EditorGUI.TextField(r1, variant.DoubleValue.ToString()));\r\n                        variant.DoubleValue = EditorGUI.DoubleField(r1, variant.DoubleValue);\r\n                        break;\r\n                    case VariantType.Vector2:\r\n                        variant.Vector2Value = EditorGUI.Vector2Field(r1, GUIContent.none, variant.Vector2Value);\r\n                        break;\r\n                    case VariantType.Vector3:\r\n                        variant.Vector3Value = EditorGUI.Vector3Field(r1, GUIContent.none, variant.Vector3Value);\r\n                        break;\r\n                    case VariantType.Vector4:\r\n                        variant.Vector4Value = EditorGUI.Vector4Field(r1, (string)null, variant.Vector4Value);\r\n                        break;\r\n                    case VariantType.Quaternion:\r\n                        variant.QuaternionValue = SPEditorGUI.QuaternionField(r1, GUIContent.none, variant.QuaternionValue);\r\n                        break;\r\n                    case VariantType.Color:\r\n                        variant.ColorValue = EditorGUI.ColorField(r1, variant.ColorValue);\r\n                        break;\r\n                    case VariantType.DateTime:\r\n                        variant.DateValue = ConvertUtil.ToDate(EditorGUI.TextField(r1, variant.DateValue.ToString()));\r\n                        break;\r\n                    case VariantType.GameObject:\r\n                        variant.GameObjectValue = EditorGUI.ObjectField(r1, variant.GameObjectValue, typeof(GameObject), true) as GameObject;\r\n                        break;\r\n                    case VariantType.Component:\r\n                        {\r\n                            _selectComponentDrawer.AllowNonComponents = false;\r\n                            _selectComponentDrawer.RestrictionType = ComponentUtil.IsAcceptableComponentType(_forcedObjectType) ? _forcedObjectType : typeof(Component);\r\n                            _selectComponentDrawer.ShowXButton = true;\r\n                            var targProp = property.FindPropertyRelative(PROP_UNITYOBJREF);\r\n                            EditorGUI.BeginChangeCheck();\r\n                            _selectComponentDrawer.OnGUI(r1, targProp);\r\n                            if (EditorGUI.EndChangeCheck())\r\n                            {\r\n                                variant.ComponentValue = targProp.objectReferenceValue as Component;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case VariantType.Object:\r\n                        {\r\n                            var obj = variant.ObjectValue;\r\n                            if(ComponentUtil.IsAcceptableComponentType(_forcedObjectType))\r\n                            {\r\n                                if (obj is GameObject || obj is Component)\r\n                                {\r\n                                    _selectComponentDrawer.AllowNonComponents = false;\r\n                                    _selectComponentDrawer.RestrictionType = _forcedObjectType;\r\n                                    _selectComponentDrawer.ShowXButton = true;\r\n                                    var targProp = property.FindPropertyRelative(PROP_UNITYOBJREF);\r\n                                    EditorGUI.BeginChangeCheck();\r\n                                    _selectComponentDrawer.OnGUI(r1, targProp);\r\n                                    if (EditorGUI.EndChangeCheck())\r\n                                    {\r\n                                        variant.ObjectValue = targProp.objectReferenceValue as Component;\r\n                                    }\r\n                                }\r\n                                else\r\n                                {\r\n                                    EditorGUI.BeginChangeCheck();\r\n                                    obj = EditorGUI.ObjectField(r1, obj, typeof(UnityEngine.Object), true);\r\n                                    if(EditorGUI.EndChangeCheck())\r\n                                    {\r\n                                        if(obj == null)\r\n                                        {\r\n                                            variant.ObjectValue = null;\r\n                                        }\r\n                                        else if(TypeUtil.IsType(obj.GetType(), _forcedObjectType))\r\n                                        {\r\n                                            variant.ObjectValue = obj;\r\n                                        }\r\n                                        else\r\n                                        {\r\n                                            var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n                                            if (go != null)\r\n                                                variant.ObjectValue = go.GetComponent(_forcedObjectType);\r\n                                            else\r\n                                                variant.ObjectValue = null;\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                            else\r\n                            {\r\n                                variant.ObjectValue = EditorGUI.ObjectField(r1, obj, _forcedObjectType, true);\r\n                            }\r\n                        }\r\n                        break;\r\n                    case VariantType.LayerMask:\r\n                        {\r\n                            variant.LayerMaskValue = SPEditorGUI.LayerMaskField(r1, GUIContent.none, (int)variant.LayerMaskValue);\r\n                        }\r\n                        break;\r\n                    case VariantType.Rect:\r\n                        {\r\n                            variant.RectValue = EditorGUI.RectField(r1, variant.RectValue);\r\n                        }\r\n                        break;\r\n                    case VariantType.Numeric:\r\n                        {\r\n                            //we just treat numeric types as double and let the numeric deal with it\r\n                            var tp = this.TypeRestrictedTo;\r\n                            if(tp != null && typeof(INumeric).IsAssignableFrom(tp))\r\n                            {\r\n                                var n = variant.NumericValue;\r\n                                double d = n != null ? n.ToDouble(null) : 0d;\r\n                                EditorGUI.BeginChangeCheck();\r\n                                d = EditorGUI.DoubleField(r1, d);\r\n                                if(EditorGUI.EndChangeCheck())\r\n                                {\r\n                                    variant.NumericValue = Numerics.CreateNumeric(tp, d);\r\n                                }\r\n                            }\r\n                            else\r\n                            {\r\n                                variant.DoubleValue = EditorGUI.DoubleField(r1, variant.DoubleValue);\r\n                            }\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n        \r\n        private void DrawValueFieldInPropertyMode(Rect position, SerializedProperty property, VariantReference.EditorHelper helper)\r\n        {\r\n            _selectComponentDrawer.AllowNonComponents = true;\r\n            _selectComponentDrawer.RestrictionType = null;\r\n            _selectComponentDrawer.ShowXButton = false;\r\n            var targProp = property.FindPropertyRelative(PROP_UNITYOBJREF);\r\n            var memberProp = property.FindPropertyRelative(PROP_STRING);\r\n            var vtypeProp = property.FindPropertyRelative(PROP_VARIANTTYPE);\r\n\r\n            if (targProp.objectReferenceValue == null)\r\n            {\r\n                _selectComponentDrawer.OnGUI(position, targProp);\r\n            }\r\n            else\r\n            {\r\n                var r1 = new Rect(position.xMin, position.yMin, position.width * 0.4f, position.height);\r\n                var r2 = new Rect(r1.xMax, position.yMin, position.width - r1.width, position.height);\r\n                _selectComponentDrawer.OnGUI(r1, targProp);\r\n                \r\n                System.Reflection.MemberInfo selectedMember;\r\n                EditorGUI.BeginChangeCheck();\r\n                memberProp.stringValue = SPEditorGUI.ReflectedPropertyField(r2, targProp.objectReferenceValue, memberProp.stringValue, com.spacepuppy.Dynamic.DynamicMemberAccess.Read, out selectedMember);\r\n                if (EditorGUI.EndChangeCheck())\r\n                    vtypeProp.SetEnumValue<VariantType>(selectedMember != null ? VariantReference.GetVariantType(DynamicUtil.GetReturnType(selectedMember)) : VariantType.Null);\r\n            }\r\n        }\r\n\r\n        private void DrawValueFieldInEvalMode(Rect position, SerializedProperty property, VariantReference.EditorHelper helper)\r\n        {\r\n            _selectComponentDrawer.AllowNonComponents = true;\r\n            _selectComponentDrawer.RestrictionType = null;\r\n            _selectComponentDrawer.ShowXButton = false;\r\n            var targProp = property.FindPropertyRelative(PROP_UNITYOBJREF);\r\n            var evalProp = property.FindPropertyRelative(PROP_STRING);\r\n            var vtypeProp = property.FindPropertyRelative(PROP_VARIANTTYPE);\r\n\r\n            var r1 = new Rect(position.xMin, position.yMin, position.width * 0.4f, position.height);\r\n            var r2 = new Rect(r1.xMax, position.yMin, position.width - r1.width, position.height);\r\n            _selectComponentDrawer.OnGUI(r1, targProp);\r\n            evalProp.stringValue = EditorGUI.TextField(r2, evalProp.stringValue);\r\n            vtypeProp.SetEnumValue<VariantType>(VariantType.Null);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Utils\r\n\r\n        public static void CopyValuesToHelper(SerializedProperty property, VariantReference.EditorHelper helper)\r\n        {\r\n            helper._mode = property.FindPropertyRelative(\"_mode\").GetEnumValue<VariantReference.RefMode>();\r\n            helper._type = property.FindPropertyRelative(\"_type\").GetEnumValue<VariantType>();\r\n            helper._x = property.FindPropertyRelative(\"_x\").floatValue;\r\n            helper._y = property.FindPropertyRelative(\"_y\").floatValue;\r\n            helper._z = property.FindPropertyRelative(\"_z\").floatValue;\r\n            helper._w = property.FindPropertyRelative(\"_w\").doubleValue;\r\n            helper._string = property.FindPropertyRelative(\"_string\").stringValue;\r\n            helper._unityObjectReference = property.FindPropertyRelative(\"_unityObjectReference\").objectReferenceValue;\r\n        }\r\n\r\n        public static void CopyValuesFromHelper(SerializedProperty property, VariantReference.EditorHelper helper)\r\n        {\r\n            property.FindPropertyRelative(\"_mode\").SetEnumValue(helper._mode);\r\n            property.FindPropertyRelative(\"_type\").SetEnumValue(helper._type);\r\n            property.FindPropertyRelative(\"_x\").floatValue = helper._x;\r\n            property.FindPropertyRelative(\"_y\").floatValue = helper._y;\r\n            property.FindPropertyRelative(\"_z\").floatValue = helper._z;\r\n            property.FindPropertyRelative(\"_w\").doubleValue = helper._w;\r\n            property.FindPropertyRelative(\"_string\").stringValue = helper._string;\r\n            property.FindPropertyRelative(\"_unityObjectReference\").objectReferenceValue = helper._unityObjectReference;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/VectorInspectorPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Base\n{\n\n    [CustomPropertyDrawer(typeof(VectorInspectorAttribute))]\n    public class VectorInspectorPropertyDrawer : PropertyDrawer\n    {\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            EditorGUI.BeginChangeCheck();\n            EditorGUI.BeginProperty(position, label, property);\n\n            var attr = this.attribute as EulerRotationInspectorAttribute;\n            switch (property.propertyType)\n            {\n                case SerializedPropertyType.Quaternion:\n                    property.quaternionValue = ConvertUtil.ToQuaternion(EditorGUI.Vector4Field(position, label, ConvertUtil.ToVector4(property.quaternionValue)));\n                    break;\n                case SerializedPropertyType.Vector2:\n                    property.vector2Value = EditorGUI.Vector2Field(position, label, property.vector2Value);\n                    break;\n                case SerializedPropertyType.Vector3:\n                    property.vector3Value = EditorGUI.Vector3Field(position, label, property.vector3Value);\n                    break;\n                case SerializedPropertyType.Vector4:\n                    property.vector4Value = EditorGUI.Vector3Field(position, label, property.vector4Value);\n                    break;\n                default:\n                    SPEditorGUI.DefaultPropertyField(position, property, label);\n                    break;\n            }\n\n            EditorGUI.EndProperty();\n            if (EditorGUI.EndChangeCheck())\n                property.serializedObject.ApplyModifiedProperties();\n        }\n\n\n        \n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/VersionInfoPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\n\nusing com.spacepuppy;\n\nnamespace com.spacepuppyeditor.Base\n{\n\n    [CustomPropertyDrawer(typeof(VersionInfo))]\n    public class VersionInfoPropertyDrawer : PropertyDrawer\n    {\n\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n        {\n            return EditorGUIUtility.singleLineHeight;\n        }\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            var p1 = property.FindPropertyRelative(\"Major\");\n            var p2 = property.FindPropertyRelative(\"Minor\");\n            var p3 = property.FindPropertyRelative(\"Patch\");\n            var p4 = property.FindPropertyRelative(\"Build\");\n\n            position = EditorGUI.PrefixLabel(position, label);\n\n            const float MARGIN = 9f;\n            const float TOTAL_MARGIN = MARGIN * 3f;\n            float w = (position.width - TOTAL_MARGIN) / 4f;\n\n            if (w <= 0f) return;\n\n            Rect r;\n\n            r = new Rect(position.xMin, position.yMin, w, position.height);\n            p1.intValue = EditorGUI.IntField(r, p1.intValue);\n            r = new Rect(r.xMax, r.yMin, MARGIN, r.height);\n            EditorGUI.LabelField(r, \".\");\n\n            r = new Rect(r.xMax, r.yMin, w, r.height);\n            p2.intValue = EditorGUI.IntField(r, p2.intValue);\n            r = new Rect(r.xMax, r.yMin, MARGIN, r.height);\n            EditorGUI.LabelField(r, \".\");\n\n            r = new Rect(r.xMax, r.yMin, w, r.height);\n            p3.intValue = EditorGUI.IntField(r, p3.intValue);\n            r = new Rect(r.xMax, r.yMin, MARGIN, r.height);\n            EditorGUI.LabelField(r, \".\");\n\n            r = new Rect(r.xMax, r.yMin, w, r.height);\n            p4.intValue = EditorGUI.IntField(r, p4.intValue);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Inspectors/WeightedValueCollectionPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing UnityEditorInternal;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Utils;\n\nusing com.spacepuppyeditor.Internal;\n\nnamespace com.spacepuppyeditor.Base.Inspectors\n{\n\n    [CustomPropertyDrawer(typeof(WeightedValueCollectionAttribute))]\n    public class WeightedValueCollectionPropertyDrawer : ReorderableArrayPropertyDrawer\n    {\n\n        #region Fields\n\n        public bool ManuallyConfigured;\n        public string WeightPropertyName = \"Weight\";\n\n        private float _totalWeight;\n\n        public string ValuePropertyName\n        {\n            get { return this.ChildPropertyAsEntry; }\n            set { this.ChildPropertyAsEntry = value; }\n        }\n\n        #endregion\n\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n        {\n            if (!property.isArray)\n            {\n                return SPEditorGUI.GetDefaultPropertyHeight(property, label);\n            }\n\n            if (!this.ManuallyConfigured && !(this.attribute is WeightedValueCollectionAttribute))\n            {\n                return SPEditorGUI.GetDefaultPropertyHeight(property, label);\n            }\n\n            return base.GetPropertyHeight(property, label);\n        }\n\n        protected override float GetElementHeight(SerializedProperty element, GUIContent label, bool elementIsAtBottom)\n        {\n            if (elementIsAtBottom)\n            {\n                return base.GetElementHeight(element, label, elementIsAtBottom);\n            }\n            else\n            {\n                return EditorGUIUtility.singleLineHeight;\n            }\n        }\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            _totalWeight = 0f;\n            if (!property.isArray)\n            {\n                SPEditorGUI.DefaultPropertyField(position, property, label);\n                return;\n            }\n\n            if (!this.ManuallyConfigured)\n            {\n                var attrib = this.attribute as WeightedValueCollectionAttribute;\n                if (attrib == null)\n                {\n                    SPEditorGUI.DefaultPropertyField(position, property, label);\n                    return;\n                }\n                else\n                {\n                    this.WeightPropertyName = attrib.WeightPropertyName;\n                }\n            }\n\n            for (int i = 0; i < property.arraySize; i++)\n            {\n                var element = property.GetArrayElementAtIndex(i);\n                var weightProp = element.FindPropertyRelative(this.WeightPropertyName);\n                if (weightProp != null && weightProp.propertyType == SerializedPropertyType.Float)\n                {\n                    _totalWeight += weightProp.floatValue;\n                }\n            }\n\n            base.OnGUI(position, property, label);\n        }\n\n        #region Reorderable List\n\n        protected override CachedReorderableList GetList(SerializedProperty property, GUIContent label)\n        {\n            var result = base.GetList(property, label);\n            result.onAddCallback = (lst) =>\n            {\n                ReorderableList.defaultBehaviours.DoAddButton(lst);\n                if (lst.serializedProperty != null && lst.serializedProperty.arraySize > 0)\n                {\n                    var element = lst.serializedProperty.GetArrayElementAtIndex(lst.serializedProperty.arraySize - 1);\n                    if (element != null) this.SetWeight(element, 1f);\n                }\n            };\n            return result;\n        }\n\n        protected override void DrawElement(Rect area, SerializedProperty element, GUIContent label, int elementIndex)\n        {\n            var weightProp = element.FindPropertyRelative(this.WeightPropertyName);\n            if (weightProp == null || weightProp.propertyType != SerializedPropertyType.Float)\n            {\n                EditorGUI.LabelField(area, EditorHelper.TempContent(\"Malformed DataType for WeightValueCollection\"));\n                return;\n            }\n\n            //DO DRAW\n            const float MARGIN = 1.0f;\n            const float WEIGHT_FIELD_WIDTH = 60f;\n            const float PERC_FIELD_WIDTH = 45f;\n            const float FULLWEIGHT_WIDTH = WEIGHT_FIELD_WIDTH + PERC_FIELD_WIDTH;\n\n            Rect valueRect;\n            if (area.width > FULLWEIGHT_WIDTH)\n            {\n                var top = area.yMin + MARGIN;\n                var labelRect = new Rect(area.xMin, top, EditorGUIUtility.labelWidth - FULLWEIGHT_WIDTH, EditorGUIUtility.singleLineHeight);\n                var weightRect = new Rect(area.xMin + EditorGUIUtility.labelWidth - FULLWEIGHT_WIDTH, top, WEIGHT_FIELD_WIDTH, EditorGUIUtility.singleLineHeight);\n                var percRect = new Rect(area.xMin + EditorGUIUtility.labelWidth - PERC_FIELD_WIDTH, top, PERC_FIELD_WIDTH, EditorGUIUtility.singleLineHeight);\n                valueRect = new Rect(area.xMin + EditorGUIUtility.labelWidth, top, area.width - EditorGUIUtility.labelWidth, EditorGUIUtility.singleLineHeight);\n\n                float weight = weightProp.floatValue;\n\n                EditorGUI.LabelField(labelRect, label);\n                weightProp.floatValue = EditorGUI.FloatField(weightRect, weight);\n                float p = (_totalWeight > 0f) ? (100f * weight / _totalWeight) : ((elementIndex == 0) ? 100f : 0f);\n                EditorGUI.LabelField(percRect, string.Format(\"{0:0.#}%\", p));\n            }\n            else\n            {\n                //Draw Triggerable - this is the simple case to make a clean designer set up for newbs\n                var top = area.yMin + MARGIN;\n                var labelRect = new Rect(area.xMin, top, area.width, EditorGUIUtility.singleLineHeight);\n\n                valueRect = EditorGUI.PrefixLabel(labelRect, label);\n            }\n\n            this.DrawElementValue(valueRect, element, label, elementIndex);\n        }\n\n        protected virtual void DrawElementValue(Rect area, SerializedProperty element, GUIContent label, int elementIndex)\n        {\n            var valueProp = element.FindPropertyRelative(this.ValuePropertyName);\n            if (valueProp != null)\n            {\n                SPEditorGUI.PropertyField(area, valueProp, GUIContent.none);\n            }\n        }\n\n        #endregion\n\n\n        #region Drag & Drop\n\n        protected override void DoDragAndDrop(SerializedProperty property, Rect listArea)\n        {\n            if (this.AllowDragAndDrop && this.fieldInfo != null && Event.current != null)\n            {\n                var ev = Event.current;\n                switch (ev.type)\n                {\n                    case EventType.DragUpdated:\n                    case EventType.DragPerform:\n                        {\n                            if (listArea.Contains(ev.mousePosition))\n                            {\n                                DragAndDrop.visualMode = DragAndDropVisualMode.Rejected; //default\n\n                                var valueMember = com.spacepuppy.Dynamic.DynamicUtil.GetMemberFromType(TypeUtil.GetElementTypeOfListType(this.fieldInfo.FieldType), this.ValuePropertyName, true);\n                                if (valueMember == null) return;\n                                var tp = com.spacepuppy.Dynamic.DynamicUtil.GetReturnType(valueMember);\n                                if (tp == null) return;\n\n                                var refs = (from o in DragAndDrop.objectReferences let obj = ObjUtil.GetAsFromSource(tp, o, false) where obj != null select obj);\n                                DragAndDrop.visualMode = refs.Any() ? DragAndDropVisualMode.Link : DragAndDropVisualMode.Rejected;\n\n                                if (ev.type == EventType.DragPerform && refs.Any())\n                                {\n                                    DragAndDrop.AcceptDrag();\n                                    this.AddObjectsToArray(property, refs.ToArray());\n                                    GUI.changed = true;\n                                }\n                            }\n                        }\n                        break;\n                }\n            }\n        }\n\n        private void AddObjectsToArray(SerializedProperty listProp, object[] objs)\n        {\n            if (listProp == null) throw new System.ArgumentNullException(\"listProp\");\n            if (!listProp.isArray) throw new System.ArgumentException(\"Must be a SerializedProperty for an array/list.\", \"listProp\");\n            if (objs == null || objs.Length == 0) return;\n\n            try\n            {\n                int start = listProp.arraySize;\n                listProp.arraySize += objs.Length;\n                for (int i = 0; i < objs.Length; i++)\n                {\n                    var element = listProp.GetArrayElementAtIndex(start + i);\n                    if(element != null)\n                    {\n                        this.SetWeight(element, 1f);\n                        var objProp = element.FindPropertyRelative(this.ValuePropertyName);\n                        if (objProp != null && objProp.propertyType == SerializedPropertyType.ObjectReference)\n                        {\n                            objProp.objectReferenceValue = objs[i] as UnityEngine.Object;\n                        }\n                    }\n                }\n            }\n            catch (System.Exception ex)\n            {\n                Debug.LogException(ex);\n            }\n        }\n\n        #endregion\n\n        #region Static Utils\n\n        private void SetWeight(SerializedProperty element, float value)\n        {\n            var weight = element.FindPropertyRelative(this.WeightPropertyName);\n            if (weight == null) return;\n\n            switch (weight.propertyType)\n            {\n                case SerializedPropertyType.Float:\n                    weight.floatValue = value;\n                    break;\n                case SerializedPropertyType.Integer:\n                    weight.intValue = (int)value;\n                    break;\n            }\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Modifiers/DefaultFromSelfModifier.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Modifiers\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(DefaultFromSelfAttribute))]\r\n    public class DefaultFromSelfModifier : PropertyModifier\r\n    {\r\n        \r\n        private HashSet<int> _handled = new HashSet<int>();\r\n\r\n        protected internal override void OnBeforeGUI(SerializedProperty property, ref bool cancelDraw)\r\n        {\r\n            int hash = com.spacepuppyeditor.Internal.PropertyHandlerCache.GetIndexRespectingPropertyHash(property);\r\n            if (_handled.Contains(hash)) return;\r\n            if ((this.attribute as DefaultFromSelfAttribute).HandleOnce) _handled.Add(hash);\r\n\r\n            var relativity = (this.attribute as DefaultFromSelfAttribute).Relativity;\r\n\r\n            if (property.isArray && TypeUtil.IsListType(fieldInfo.FieldType, true))\r\n            {\r\n                var elementType = TypeUtil.GetElementTypeOfListType(this.fieldInfo.FieldType);\r\n                var restrictionType = EditorHelper.GetRestrictedFieldType(this.fieldInfo, true) ?? elementType;\r\n                ApplyDefaultAsList(property, elementType, restrictionType, relativity);\r\n            }\r\n            else\r\n            {\r\n                ApplyDefaultAsSingle(property, this.fieldInfo.FieldType, EditorHelper.GetRestrictedFieldType(this.fieldInfo), relativity);\r\n            }\r\n        }\r\n\r\n\r\n\r\n        private static void ApplyDefaultAsSingle(SerializedProperty property, System.Type fieldType, System.Type restrictionType, EntityRelativity relativity)\r\n        {\r\n            if (fieldType == null) return;\r\n            \r\n            if (TypeUtil.IsType(fieldType, typeof(VariantReference)))\r\n            {\r\n                var variant = EditorHelper.GetTargetObjectOfProperty(property) as VariantReference;\r\n                if (variant == null) return;\r\n                if (variant.Value != null) return;\r\n\r\n                var targ = GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n                if (targ == null)\r\n                {\r\n                    var obj = ObjUtil.GetAsFromSource(restrictionType, property.serializedObject.targetObject);\r\n                    if (obj != null)\r\n                    {\r\n                        variant.Value = obj;\r\n                        property.serializedObject.Update();\r\n                        GUI.changed = true;\r\n                    }\r\n                    return;\r\n                }\r\n\r\n                switch (relativity)\r\n                {\r\n                    case EntityRelativity.Entity:\r\n                        {\r\n                            targ = targ.FindRoot();\r\n\r\n                            var obj = ObjUtil.GetAsFromSource(restrictionType, targ);\r\n                            if (obj == null && ComponentUtil.IsAcceptableComponentType(restrictionType)) obj = targ.GetComponentInChildren(restrictionType);\r\n                            if (obj != null)\r\n                            {\r\n                                variant.Value = obj;\r\n                                property.serializedObject.Update();\r\n                            }\r\n                        }\r\n                        break;\r\n                    case EntityRelativity.Self:\r\n                        {\r\n                            var obj = ObjUtil.GetAsFromSource(restrictionType, targ);\r\n                            if (obj != null)\r\n                            {\r\n                                variant.Value = obj;\r\n                                property.serializedObject.Update();\r\n                            }\r\n                        }\r\n                        break;\r\n                    case EntityRelativity.SelfAndChildren:\r\n                        {\r\n                            var obj = ObjUtil.GetAsFromSource(restrictionType, targ);\r\n                            if (obj == null && ComponentUtil.IsAcceptableComponentType(restrictionType)) obj = targ.GetComponentInChildren(restrictionType);\r\n                            if (obj != null)\r\n                            {\r\n                                variant.Value = obj;\r\n                                property.serializedObject.Update();\r\n                            }\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n            else if (property.propertyType == SerializedPropertyType.ObjectReference)\r\n            {\r\n                if (property.objectReferenceValue != null) return;\r\n\r\n                var targ = GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n                if (targ == null)\r\n                {\r\n                    property.objectReferenceValue = ObjUtil.GetAsFromSource(restrictionType, property.serializedObject.targetObject) as UnityEngine.Object;\r\n                    return;\r\n                }\r\n\r\n                switch (relativity)\r\n                {\r\n                    case EntityRelativity.Entity:\r\n                        {\r\n                            targ = targ.FindRoot();\r\n\r\n                            var obj = ObjUtil.GetAsFromSource(restrictionType, targ) as UnityEngine.Object;\r\n                            if (obj == null && ComponentUtil.IsAcceptableComponentType(restrictionType)) obj = targ.GetComponentInChildren(restrictionType);\r\n                            if (obj != null)\r\n                            {\r\n                                property.objectReferenceValue = obj;\r\n                                GUI.changed = true;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case EntityRelativity.Self:\r\n                        {\r\n                            var obj = ObjUtil.GetAsFromSource(restrictionType, targ) as UnityEngine.Object;\r\n                            if (obj != null)\r\n                            {\r\n                                property.objectReferenceValue = obj;\r\n                                GUI.changed = true;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case EntityRelativity.SelfAndChildren:\r\n                        {\r\n                            var obj = ObjUtil.GetAsFromSource(restrictionType, targ) as UnityEngine.Object;\r\n                            if (obj == null && ComponentUtil.IsAcceptableComponentType(restrictionType)) obj = targ.GetComponentInChildren(restrictionType);\r\n                            if (obj != null)\r\n                            {\r\n                                property.objectReferenceValue = obj;\r\n                                GUI.changed = true;\r\n                            }\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n        \r\n        private static void ApplyDefaultAsList(SerializedProperty property, System.Type elementType, System.Type restrictionType, EntityRelativity relativity)\r\n        {\r\n            if (property.arraySize != 0) return;\r\n            if (elementType == null || restrictionType == null) return;\r\n\r\n            if (TypeUtil.IsType(elementType, typeof(VariantReference)))\r\n            {\r\n                var targ = GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n                if (targ == null)\r\n                {\r\n                    var obj = ObjUtil.GetAsFromSource(restrictionType, property.serializedObject.targetObject);\r\n                    if (obj != null)\r\n                    {\r\n                        property.arraySize = 1;\r\n                        var variant = EditorHelper.GetTargetObjectOfProperty(property.GetArrayElementAtIndex(0)) as VariantReference;\r\n                        if (variant == null) return;\r\n                        variant.Value = obj;\r\n                        property.serializedObject.Update();\r\n                        GUI.changed = true;\r\n                    }\r\n                    else if (property.arraySize > 0)\r\n                    {\r\n                        property.arraySize = 0;\r\n                        GUI.changed = true;\r\n                    }\r\n                    return;\r\n                }\r\n\r\n                switch (relativity)\r\n                {\r\n                    case EntityRelativity.Entity:\r\n                        {\r\n                            targ = targ.FindRoot();\r\n                            var arr = ObjUtil.GetAllFromSource(restrictionType, targ, true);\r\n\r\n                            property.arraySize = arr.Length;\r\n                            for (int i = 0; i < arr.Length; i++)\r\n                            {\r\n                                var variant = EditorHelper.GetTargetObjectOfProperty(property.GetArrayElementAtIndex(i)) as VariantReference;\r\n                                if (variant != null) variant.Value = arr[i];\r\n                            }\r\n                            property.serializedObject.Update();\r\n                            GUI.changed = true;\r\n                        }\r\n                        break;\r\n                    case EntityRelativity.Self:\r\n                        {\r\n                            var arr = ObjUtil.GetAllFromSource(restrictionType, targ, false);\r\n\r\n                            property.arraySize = arr.Length;\r\n                            for (int i = 0; i < arr.Length; i++)\r\n                            {\r\n                                var variant = EditorHelper.GetTargetObjectOfProperty(property.GetArrayElementAtIndex(i)) as VariantReference;\r\n                                if (variant != null) variant.Value = arr[i];\r\n                            }\r\n                            property.serializedObject.Update();\r\n                            GUI.changed = true;\r\n                        }\r\n                        break;\r\n                    case EntityRelativity.SelfAndChildren:\r\n                        {\r\n                            var arr = ObjUtil.GetAllFromSource(restrictionType, targ, true);\r\n\r\n                            property.arraySize = arr.Length;\r\n                            for (int i = 0; i < arr.Length; i++)\r\n                            {\r\n                                var variant = EditorHelper.GetTargetObjectOfProperty(property.GetArrayElementAtIndex(i)) as VariantReference;\r\n                                if (variant != null) variant.Value = arr[i];\r\n                            }\r\n                            property.serializedObject.Update();\r\n                            GUI.changed = true;\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n            else if (TypeUtil.IsType(elementType, typeof(UnityEngine.Object)))\r\n            {\r\n                var targ = GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n                if (targ == null)\r\n                {\r\n                    var obj = ObjUtil.GetAsFromSource(restrictionType, property.serializedObject.targetObject) as UnityEngine.Object;\r\n                    if (obj != null)\r\n                    {\r\n                        property.arraySize = 1;\r\n                        property.GetArrayElementAtIndex(0).objectReferenceValue = obj;\r\n                        GUI.changed = true;\r\n                    }\r\n                    else if (property.arraySize > 0)\r\n                    {\r\n                        property.arraySize = 0;\r\n                        GUI.changed = true;\r\n                    }\r\n                    return;\r\n                }\r\n\r\n                switch (relativity)\r\n                {\r\n                    case EntityRelativity.Entity:\r\n                        {\r\n                            targ = targ.FindRoot();\r\n                            var arr = ObjUtil.GetAllFromSource(restrictionType, targ, true);\r\n\r\n                            property.arraySize = arr.Length;\r\n                            for (int i = 0; i < arr.Length; i++)\r\n                            {\r\n                                property.GetArrayElementAtIndex(i).objectReferenceValue = arr[i] as UnityEngine.Object;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case EntityRelativity.Self:\r\n                        {\r\n                            var arr = ObjUtil.GetAllFromSource(restrictionType, targ, false);\r\n\r\n                            property.arraySize = arr.Length;\r\n                            for (int i = 0; i < arr.Length; i++)\r\n                            {\r\n                                property.GetArrayElementAtIndex(i).objectReferenceValue = arr[i] as UnityEngine.Object;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case EntityRelativity.SelfAndChildren:\r\n                        {\r\n                            var arr = ObjUtil.GetAllFromSource(restrictionType, targ, true);\r\n\r\n                            property.arraySize = arr.Length;\r\n                            for (int i = 0; i < arr.Length; i++)\r\n                            {\r\n                                property.GetArrayElementAtIndex(i).objectReferenceValue = arr[i] as UnityEngine.Object;\r\n                            }\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Modifiers/DisableIfModifier.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Dynamic;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Modifiers\n{\n\n    [CustomPropertyDrawer(typeof(DisableIfAttribute))]\n    public class DisableIfModifier : PropertyModifier\n    {\n        \n        protected internal override void OnBeforeGUI(SerializedProperty property, ref bool cancelDraw)\n        {\n            var attrib = this.attribute as DisableIfAttribute;\n            var targ = EditorHelper.GetTargetObjectWithProperty(property);\n\n            bool disable = false;\n            if (attrib != null && targ != null)\n            {\n                disable = ConvertUtil.ToBool(DynamicUtil.GetValue(targ, attrib.MemberName));\n                if (attrib.DisableIfNot) disable = !disable;\n            }\n\n            EditorGUI.BeginDisabledGroup(disable);\n        }\n\n        protected internal override void OnPostGUI(SerializedProperty property)\n        {\n            EditorGUI.EndDisabledGroup();\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Modifiers/DisableOnPlayModifier.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor.Modifiers\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(DisableOnPlayAttribute))]\r\n    public class DisableOnPlayModifier : PropertyModifier\r\n    {\r\n        \r\n        protected internal override void OnBeforeGUI(SerializedProperty property, ref bool cancelDraw)\r\n        {\r\n            if (Application.isPlaying)\r\n            {\r\n                EditorGUI.BeginDisabledGroup(true);\r\n            }\r\n        }\r\n\r\n        protected internal override void OnPostGUI(SerializedProperty property)\r\n        {\r\n            if (Application.isPlaying)\r\n            {\r\n                EditorGUI.EndDisabledGroup();\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Modifiers/DisplayIfPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Dynamic;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Modifiers\n{\n\n    [CustomPropertyDrawer(typeof(DisplayIfAttribute))]\n    public class DisplayIfPropertyDrawer : PropertyModifier\n    {\n\n        protected internal override void OnBeforeGUI(SerializedProperty property, ref bool cancelDraw)\n        {\n            var attrib = this.attribute as DisplayIfAttribute;\n            var targ = EditorHelper.GetTargetObjectWithProperty(property);\n            \n            if (property.serializedObject.isEditingMultipleObjects)\n            {\n                cancelDraw = true;\n            }\n            else if (attrib != null && targ != null)\n            {\n                cancelDraw = !ConvertUtil.ToBool(DynamicUtil.GetValue(targ, attrib.MemberName));\n                if (attrib.DisplayIfNot) cancelDraw = !cancelDraw;\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Modifiers/FindInSelfModifier.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Modifiers\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(FindInSelfAttribute))]\r\n    public class FindInSelfModifier : PropertyModifier\r\n    {\r\n\r\n        protected internal override void OnBeforeGUI(SerializedProperty property, ref bool cancelDraw)\r\n        {\r\n            string name = (this.attribute as FindInSelfAttribute).Name;\r\n            bool bUseEntity = (this.attribute as FindInSelfAttribute).UseEntity;\r\n\r\n            if (property.isArray && TypeUtil.IsListType(fieldInfo.FieldType, true))\r\n            {\r\n                var elementType = EditorHelper.GetRestrictedFieldType(this.fieldInfo, true) ?? TypeUtil.GetElementTypeOfListType(this.fieldInfo.FieldType);\r\n                ApplyDefaultAsList(property, elementType, name, bUseEntity);\r\n            }\r\n            else\r\n            {\r\n                var elementType = EditorHelper.GetRestrictedFieldType(this.fieldInfo);\r\n                ApplyDefaultAsSingle(property, elementType, name, bUseEntity);\r\n            }\r\n        }\r\n\r\n\r\n\r\n\r\n        private static void ApplyDefaultAsSingle(SerializedProperty property, System.Type fieldType, string name, bool bUseEntity)\r\n        {\r\n            if (fieldType == null) return;\r\n\r\n            var targ = GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n            if (targ == null) return;\r\n            if (bUseEntity) targ = targ.FindRoot();\r\n\r\n            if (TypeUtil.IsType(fieldType, typeof(VariantReference)))\r\n            {\r\n                var variant = EditorHelper.GetTargetObjectOfProperty(property) as VariantReference;\r\n                if (variant != null && variant.Value == null && variant.ValueType == VariantType.GameObject)\r\n                {\r\n                    var go = targ.FindByName(name);\r\n                    if (go != null)\r\n                    {\r\n                        variant.GameObjectValue = go;\r\n                        property.serializedObject.Update();\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n            else if (property.objectReferenceValue == null)\r\n            {\r\n                foreach (var obj in targ.transform.FindAllByName(name))\r\n                {\r\n                    var o = ObjUtil.GetAsFromSource(fieldType, obj) as UnityEngine.Object;\r\n                    if(o != null)\r\n                    {\r\n                        property.objectReferenceValue = o;\r\n                        property.serializedObject.ApplyModifiedProperties();\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n        private static void ApplyDefaultAsList(SerializedProperty property, System.Type elementType, string name, bool bUseEntity)\r\n        {\r\n            if (elementType == null) return;\r\n            if (property.arraySize != 0) return;\r\n            \r\n            var targ = GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n            if (targ == null) return;\r\n            if (bUseEntity) targ = targ.FindRoot();\r\n\r\n            if (TypeUtil.IsType(elementType, typeof(VariantReference)))\r\n            {\r\n                var arr = targ.transform.FindAllByName(name);\r\n                if (arr.Length > 0)\r\n                {\r\n                    property.arraySize = arr.Length;\r\n                    property.serializedObject.ApplyModifiedProperties();\r\n                    for (int i = 0; i < arr.Length; i++)\r\n                    {\r\n                        var variant = EditorHelper.GetTargetObjectOfProperty(property.GetArrayElementAtIndex(i)) as VariantReference;\r\n                        if (variant != null && variant.Value == null && variant.ValueType == VariantType.GameObject)\r\n                        {\r\n                            variant.GameObjectValue = arr[i].gameObject;\r\n                        }\r\n                    }\r\n                    property.serializedObject.Update();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (ComponentUtil.IsAcceptableComponentType(elementType))\r\n                {\r\n                    using (var lst = TempCollection.GetList<Component>())\r\n                    {\r\n                        foreach (var child in targ.transform.FindAllByName(name))\r\n                        {\r\n                            child.GetComponents(elementType, lst);\r\n                            if (lst.Count > 0)\r\n                            {\r\n                                int low = property.arraySize;\r\n                                property.arraySize += lst.Count;\r\n                                for (int i = 0; i < lst.Count; i++)\r\n                                {\r\n                                    property.GetArrayElementAtIndex(low + i).objectReferenceValue = lst[i];\r\n                                }\r\n                            }\r\n                            lst.Clear();\r\n                        }\r\n                    }\r\n                }\r\n                else if (TypeUtil.IsType(elementType, typeof(GameObject)))\r\n                {\r\n                    var arr = targ.transform.FindAllByName(name);\r\n                    if (arr.Length > 0)\r\n                    {\r\n                        property.arraySize = arr.Length;\r\n                        for (int i = 0; i < arr.Length; i++)\r\n                        {\r\n                            property.GetArrayElementAtIndex(i).objectReferenceValue = arr[i].gameObject;\r\n                        }\r\n                        property.serializedObject.ApplyModifiedProperties();\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Modifiers/ForceFromSelfModifier.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Modifiers\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(ForceFromSelfAttribute))]\r\n    public class ForceFromSelfModifier : PropertyModifier\r\n    {\r\n        \r\n        protected internal override void OnBeforeGUI(SerializedProperty property, ref bool cancelDraw)\r\n        {\r\n            var relativity = (this.attribute as ForceFromSelfAttribute).Relativity;\r\n\r\n            if (property.isArray && TypeUtil.IsListType(fieldInfo.FieldType, true))\r\n            {\r\n                var elementType = TypeUtil.GetElementTypeOfListType(this.fieldInfo.FieldType);\r\n                var restrictedType = EditorHelper.GetRestrictedFieldType(this.fieldInfo, true) ?? elementType;\r\n                ApplyDefaultAsList(property, elementType, restrictedType, relativity);\r\n            }\r\n            else\r\n            {\r\n                ApplyDefaultAsSingle(property, this.fieldInfo.FieldType, EditorHelper.GetRestrictedFieldType(this.fieldInfo), relativity);\r\n            }\r\n        }\r\n        \r\n        private static void ApplyDefaultAsSingle(SerializedProperty property, System.Type fieldType, System.Type restrictionType, EntityRelativity relativity)\r\n        {\r\n            if (fieldType == null || restrictionType == null) return;\r\n            \r\n            if (TypeUtil.IsType(fieldType, typeof(VariantReference)))\r\n            {\r\n                var variant = EditorHelper.GetTargetObjectOfProperty(property) as VariantReference;\r\n                if (variant == null) return;\r\n\r\n                var targ = GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n                if (targ == null)\r\n                {\r\n                    var obj = ObjUtil.GetAsFromSource(restrictionType, property.serializedObject.targetObject);\r\n                    if (obj != null)\r\n                    {\r\n                        variant.Value = obj;\r\n                        property.serializedObject.Update();\r\n                        GUI.changed = true;\r\n                    }\r\n                    else if (variant.Value != null)\r\n                    {\r\n                        variant.Value = null;\r\n                        property.serializedObject.Update();\r\n                        GUI.changed = true;\r\n                    }\r\n                    return;\r\n                }\r\n\r\n                switch (relativity)\r\n                {\r\n                    case EntityRelativity.Entity:\r\n                        {\r\n                            targ = targ.FindRoot();\r\n                            if (ObjUtil.IsRelatedTo(targ, variant.ObjectValue)) return;\r\n                            \r\n                            var obj = ObjUtil.GetAsFromSource(restrictionType, targ);\r\n                            if (obj == null && ComponentUtil.IsAcceptableComponentType(restrictionType)) obj = targ.GetComponentInChildren(restrictionType);\r\n                            if (obj != null)\r\n                            {\r\n                                variant.Value = obj;\r\n                                property.serializedObject.Update();\r\n                                GUI.changed = true;\r\n                            }\r\n                            else if(variant.Value != null)\r\n                            {\r\n                                variant.Value = null;\r\n                                property.serializedObject.Update();\r\n                                GUI.changed = true;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case EntityRelativity.Self:\r\n                        {\r\n                            if (ObjUtil.IsRelatedTo(targ, variant.ObjectValue)) return;\r\n\r\n                            var obj = ObjUtil.GetAsFromSource(restrictionType, targ);\r\n                            if (obj != null)\r\n                            {\r\n                                variant.Value = obj;\r\n                                property.serializedObject.Update();\r\n                            }\r\n                            else if (variant.Value != null)\r\n                            {\r\n                                variant.Value = null;\r\n                                property.serializedObject.Update();\r\n                                GUI.changed = true;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case EntityRelativity.SelfAndChildren:\r\n                        {\r\n                            if (ObjUtil.IsRelatedTo(targ, variant.ObjectValue)) return;\r\n\r\n                            var obj = ObjUtil.GetAsFromSource(restrictionType, targ);\r\n                            if (obj == null && ComponentUtil.IsAcceptableComponentType(restrictionType)) obj = targ.GetComponentInChildren(restrictionType);\r\n                            if(obj != null)\r\n                            {\r\n                                variant.Value = obj;\r\n                                property.serializedObject.Update();\r\n                            }\r\n                            else if (variant.Value != null)\r\n                            {\r\n                                variant.Value = null;\r\n                                property.serializedObject.Update();\r\n                                GUI.changed = true;\r\n                            }\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n            else if(property.propertyType == SerializedPropertyType.ObjectReference)\r\n            {\r\n                var targ = GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n                if (targ == null)\r\n                {\r\n                    property.objectReferenceValue = ObjUtil.GetAsFromSource(restrictionType, property.serializedObject.targetObject) as UnityEngine.Object;\r\n                    return;\r\n                }\r\n\r\n                switch (relativity)\r\n                {\r\n                    case EntityRelativity.Entity:\r\n                        {\r\n                            targ = targ.FindRoot();\r\n                            if (ObjUtil.IsRelatedTo(targ, property.objectReferenceValue)) return;\r\n\r\n                            var obj = ObjUtil.GetAsFromSource(restrictionType, targ) as UnityEngine.Object;\r\n                            if (obj == null && ComponentUtil.IsAcceptableComponentType(restrictionType)) obj = targ.GetComponentInChildren(restrictionType);\r\n                            if (obj != null)\r\n                            {\r\n                                property.objectReferenceValue = obj;\r\n                                GUI.changed = true;\r\n                            }\r\n                            else if(property.objectReferenceValue != null)\r\n                            {\r\n                                property.objectReferenceValue = null;\r\n                                GUI.changed = true;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case EntityRelativity.Self:\r\n                        {\r\n                            if (ObjUtil.IsRelatedTo(targ, property.objectReferenceValue)) return;\r\n\r\n                            var obj = ObjUtil.GetAsFromSource(restrictionType, targ) as UnityEngine.Object;\r\n                            if (obj != null)\r\n                            {\r\n                                property.objectReferenceValue = obj;\r\n                                GUI.changed = true;\r\n                            }\r\n                            else if (property.objectReferenceValue != null)\r\n                            {\r\n                                property.objectReferenceValue = null;\r\n                                GUI.changed = true;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case EntityRelativity.SelfAndChildren:\r\n                        {\r\n                            if (ObjUtil.IsRelatedTo(targ, property.objectReferenceValue)) return;\r\n\r\n                            var obj = ObjUtil.GetAsFromSource(restrictionType, targ) as UnityEngine.Object;\r\n                            if (obj == null && ComponentUtil.IsAcceptableComponentType(restrictionType)) obj = targ.GetComponentInChildren(restrictionType);\r\n                            if (obj != null)\r\n                            {\r\n                                property.objectReferenceValue = obj;\r\n                                GUI.changed = true;\r\n                            }\r\n                            else if (property.objectReferenceValue != null)\r\n                            {\r\n                                property.objectReferenceValue = null;\r\n                                GUI.changed = true;\r\n                            }\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n        private static void ApplyDefaultAsList(SerializedProperty property, System.Type elementType, System.Type restrictionType, EntityRelativity relativity)\r\n        {\r\n            if (elementType == null || restrictionType == null) return;\r\n\r\n            if (TypeUtil.IsType(elementType, typeof(VariantReference)))\r\n            {\r\n                var targ = GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n                if (targ == null)\r\n                {\r\n                    var obj = ObjUtil.GetAsFromSource(restrictionType, property.serializedObject.targetObject);\r\n                    if (obj != null)\r\n                    {\r\n                        property.arraySize = 1;\r\n                        var variant = EditorHelper.GetTargetObjectOfProperty(property.GetArrayElementAtIndex(0)) as VariantReference;\r\n                        if (variant == null) return;\r\n                        variant.Value = obj;\r\n                        property.serializedObject.Update();\r\n                        GUI.changed = true;\r\n                    }\r\n                    else if (property.arraySize > 0)\r\n                    {\r\n                        property.arraySize = 0;\r\n                        GUI.changed = true;\r\n                    }\r\n                    return;\r\n                }\r\n\r\n                switch (relativity)\r\n                {\r\n                    case EntityRelativity.Entity:\r\n                        {\r\n                            targ = targ.FindRoot();\r\n                            var arr = ObjUtil.GetAllFromSource(restrictionType, targ, true);\r\n                            if (ValidateSerializedPropertyArray(property, arr, true)) return;\r\n\r\n                            property.arraySize = arr.Length;\r\n                            for (int i = 0; i < arr.Length; i++)\r\n                            {\r\n                                var variant = EditorHelper.GetTargetObjectOfProperty(property.GetArrayElementAtIndex(i)) as VariantReference;\r\n                                if (variant != null) variant.Value = arr[i];\r\n                            }\r\n                            property.serializedObject.Update();\r\n                            GUI.changed = true;\r\n                        }\r\n                        break;\r\n                    case EntityRelativity.Self:\r\n                        {\r\n                            var arr = ObjUtil.GetAllFromSource(restrictionType, targ, false);\r\n                            if (ValidateSerializedPropertyArray(property, arr, true)) return;\r\n\r\n                            property.arraySize = arr.Length;\r\n                            for (int i = 0; i < arr.Length; i++)\r\n                            {\r\n                                var variant = EditorHelper.GetTargetObjectOfProperty(property.GetArrayElementAtIndex(i)) as VariantReference;\r\n                                if (variant != null) variant.Value = arr[i];\r\n                            }\r\n                            property.serializedObject.Update();\r\n                            GUI.changed = true;\r\n                        }\r\n                        break;\r\n                    case EntityRelativity.SelfAndChildren:\r\n                        {\r\n                            var arr = ObjUtil.GetAllFromSource(restrictionType, targ, true);\r\n                            if (ValidateSerializedPropertyArray(property, arr, true)) return;\r\n\r\n                            property.arraySize = arr.Length;\r\n                            for (int i = 0; i < arr.Length; i++)\r\n                            {\r\n                                var variant = EditorHelper.GetTargetObjectOfProperty(property.GetArrayElementAtIndex(i)) as VariantReference;\r\n                                if (variant != null) variant.Value = arr[i];\r\n                            }\r\n                            property.serializedObject.Update();\r\n                            GUI.changed = true;\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n            else if (TypeUtil.IsType(elementType, typeof(UnityEngine.Object)))\r\n            {\r\n                var targ = GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n                if (targ == null)\r\n                {\r\n                    var obj = ObjUtil.GetAsFromSource(restrictionType, property.serializedObject.targetObject) as UnityEngine.Object;\r\n                    if (obj != null)\r\n                    {\r\n                        property.arraySize = 1;\r\n                        property.GetArrayElementAtIndex(0).objectReferenceValue = obj;\r\n                        GUI.changed = true;\r\n                    }\r\n                    else if (property.arraySize > 0)\r\n                    {\r\n                        property.arraySize = 0;\r\n                        GUI.changed = true;\r\n                    }\r\n                    return;\r\n                }\r\n\r\n                switch (relativity)\r\n                {\r\n                    case EntityRelativity.Entity:\r\n                        {\r\n                            targ = targ.FindRoot();\r\n                            var arr = ObjUtil.GetAllFromSource(restrictionType, targ, true);\r\n                            if (ValidateSerializedPropertyArray(property, arr, false)) return;\r\n\r\n                            property.arraySize = arr.Length;\r\n                            for(int i = 0; i < arr.Length; i++)\r\n                            {\r\n                                property.GetArrayElementAtIndex(i).objectReferenceValue = arr[i] as UnityEngine.Object;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case EntityRelativity.Self:\r\n                        {\r\n                            var arr = ObjUtil.GetAllFromSource(restrictionType, targ, false);\r\n                            if (ValidateSerializedPropertyArray(property, arr, false)) return;\r\n\r\n                            property.arraySize = arr.Length;\r\n                            for (int i = 0; i < arr.Length; i++)\r\n                            {\r\n                                property.GetArrayElementAtIndex(i).objectReferenceValue = arr[i] as UnityEngine.Object;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case EntityRelativity.SelfAndChildren:\r\n                        {\r\n                            var arr = ObjUtil.GetAllFromSource(restrictionType, targ, true);\r\n                            if (ValidateSerializedPropertyArray(property, arr, false)) return;\r\n\r\n                            property.arraySize = arr.Length;\r\n                            for (int i = 0; i < arr.Length; i++)\r\n                            {\r\n                                property.GetArrayElementAtIndex(i).objectReferenceValue = arr[i] as UnityEngine.Object;\r\n                            }\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n        private static bool ValidateSerializedPropertyArray(SerializedProperty property, object[] arr, bool isVariant)\r\n        {\r\n            if (arr == null && property.arraySize > 0) return false;\r\n            if (property.arraySize != arr.Length) return false;\r\n            if (property.arraySize == 0) return true;\r\n\r\n            using (var lst = TempCollection.GetList<object>())\r\n            {\r\n                for(int i = 0; i < property.arraySize; i++)\r\n                {\r\n                    var el = property.GetArrayElementAtIndex(i);\r\n                    if (isVariant)\r\n                    {\r\n                        var variant = EditorHelper.GetTargetObjectOfProperty(el) as VariantReference;\r\n                        if (variant == null)\r\n                            lst.Add(null);\r\n                        else\r\n                            lst.Add(variant.Value);\r\n                    }\r\n                    else if(el.propertyType == SerializedPropertyType.ObjectReference)\r\n                    {\r\n                        lst.Add(el.objectReferenceValue);\r\n                    }\r\n                    else\r\n                    {\r\n                        lst.Add(null);\r\n                    }\r\n                }\r\n\r\n                return lst.SimilarTo(arr);\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Modifiers/InsertButtonModifier.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Modifiers\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(InsertButtonAttribute))]\r\n    public class InsertButtonModifier : PropertyModifier\r\n    {\r\n\r\n        protected internal override void OnBeforeGUI(SerializedProperty property, ref bool cancelDraw)\r\n        {\r\n            var attrib = this.attribute as InsertButtonAttribute;\r\n            if(attrib.PrecedeProperty && (!attrib.RuntimeOnly || Application.isPlaying))\r\n            {\r\n                this.DrawButton(property, attrib);\r\n            }\r\n        }\r\n\r\n        protected internal override void OnPostGUI(SerializedProperty property)\r\n        {\r\n            var attrib = this.attribute as InsertButtonAttribute;\r\n            if (!attrib.PrecedeProperty && (!attrib.RuntimeOnly || Application.isPlaying))\r\n            {\r\n                this.DrawButton(property, attrib);\r\n            }\r\n        }\r\n\r\n\r\n        private void DrawButton(SerializedProperty property, InsertButtonAttribute attrib)\r\n        {\r\n            if(GUILayout.Button(attrib.Label))\r\n            {\r\n                var obj = EditorHelper.GetTargetObjectWithProperty(property);\r\n                DynamicUtil.InvokeMethod(obj, attrib.OnClick);\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Modifiers/OnChangedInEditorModifier.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor.Modifiers\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(OnChangedInEditorAttribute))]\r\n    public class OnChangedInEditorModifier : PropertyModifier\r\n    {\r\n\r\n        private object _valueBeforeChange;\r\n        private bool _valueDidChange;\r\n\r\n        protected internal override void OnBeforeGUI(SerializedProperty property, ref bool cancelDraw)\r\n        {\r\n            _valueDidChange = false;\r\n            _valueBeforeChange = EditorHelper.GetTargetObjectOfProperty(property);\r\n        }\r\n\r\n        protected internal override void OnPostGUI(SerializedProperty property)\r\n        {\r\n            _valueDidChange = GUI.changed;\r\n        }\r\n\r\n\r\n        protected internal override void OnValidate(SerializedProperty property)\r\n        {\r\n            if (_valueDidChange)\r\n            {\r\n                var attrib = this.attribute as OnChangedInEditorAttribute;\r\n                if (attrib.OnlyAtRuntime && !Application.isPlaying) return;\r\n                var targ = EditorHelper.GetTargetObjectWithProperty(property);\r\n                if (targ == null) return;\r\n\r\n                var tp = targ.GetType();\r\n                try\r\n                {\r\n                    var methInfo = tp.GetMethod(attrib.MethodName,\r\n                                                System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic,\r\n                                                null,\r\n                                                new System.Type[] { this.fieldInfo.FieldType },\r\n                                                null);\r\n                    if (methInfo != null)\r\n                    {\r\n                        methInfo.Invoke(targ, new object[] { _valueBeforeChange });\r\n                        return;\r\n                    }\r\n                    methInfo = tp.GetMethod(attrib.MethodName,\r\n                                                System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic,\r\n                                                null,\r\n                                                new System.Type[] { typeof(object) },\r\n                                                null);\r\n                    if (methInfo != null)\r\n                    {\r\n                        methInfo.Invoke(targ, new object[] { _valueBeforeChange });\r\n                        return;\r\n                    }\r\n                    methInfo = tp.GetMethod(attrib.MethodName,\r\n                                            System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic,\r\n                                            null,\r\n                                            System.Type.EmptyTypes,\r\n                                            null);\r\n                    if (methInfo != null)\r\n                    {\r\n                        methInfo.Invoke(targ, null);\r\n                        return;\r\n                    }\r\n                }\r\n                catch\r\n                {\r\n                }\r\n\r\n                _valueDidChange = false;\r\n                _valueBeforeChange = null;\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Modifiers/PropertyModifier.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Modifiers\r\n{\r\n\r\n    public abstract class PropertyModifier : PropertyDrawer\r\n    {\r\n\r\n        #region Fields\r\n        \r\n        public bool IsDrawer\r\n        {\r\n            get;\r\n            internal set;\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region Draw\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            return ScriptAttributeUtility.SharedNullPropertyHandler.GetHeight(property, label, true);\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            ScriptAttributeUtility.SharedNullPropertyHandler.OnGUI(position, property, label, true);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Overridables\r\n\r\n        protected internal virtual void OnBeforeGUI(SerializedProperty property, ref bool cancelDraw)\r\n        {\r\n\r\n        }\r\n\r\n        protected internal virtual void OnPostGUI(SerializedProperty property)\r\n        {\r\n\r\n        }\r\n\r\n        protected internal virtual void OnValidate(SerializedProperty property)\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/Modifiers/ReadOnlyModifier.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor.Modifiers\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(ReadOnlyAttribute))]\r\n    public class ReadOnlyModifier : PropertyModifier\r\n    {\r\n\r\n        private bool? _cached = null;\r\n\r\n        protected internal override void OnBeforeGUI(SerializedProperty property, ref bool cancelDraw)\r\n        {\r\n            if(this.IsDrawer)\r\n            {\r\n                _cached = null;\r\n            }\r\n            else\r\n            {\r\n                _cached = GUI.enabled;\r\n                GUI.enabled = false;\r\n            }\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            switch(property.propertyType)\r\n            {\r\n                case SerializedPropertyType.String:\r\n                    EditorGUI.TextField(position, label, property.stringValue);\r\n                    break;\r\n                case SerializedPropertyType.Integer:\r\n                    EditorGUI.IntField(position, label, property.intValue);\r\n                    break;\r\n                case SerializedPropertyType.Float:\r\n                    EditorGUI.FloatField(position, label, property.floatValue);\r\n                    break;\r\n                case SerializedPropertyType.Vector2:\r\n                    EditorGUI.Vector2Field(position, label, property.vector2Value);\r\n                    break;\r\n                case SerializedPropertyType.Vector3:\r\n                    EditorGUI.Vector2Field(position, label, property.vector3Value);\r\n                    break;\r\n                case SerializedPropertyType.Vector4:\r\n                    EditorGUI.Vector2Field(position, label, property.vector4Value);\r\n                    break;\r\n                case SerializedPropertyType.Quaternion:\r\n                    EditorGUI.Vector3Field(position, label, property.quaternionValue.eulerAngles);\r\n                    break;\r\n                default:\r\n                    var cache = GUI.enabled;\r\n                    GUI.enabled = false;\r\n                    base.OnGUI(position, property, label);\r\n                    GUI.enabled = cache;\r\n                    break;\r\n            }\r\n        }\r\n\r\n        protected internal override void OnPostGUI(SerializedProperty property)\r\n        {\r\n            if (_cached != null)\r\n            {\r\n                GUI.enabled = (bool)_cached.Value;\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/SpacepuppySettingsWindow.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.IO;\n\nusing com.spacepuppy.Project;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Base\n{\n\n    public class SpacepuppySettingsWindow : EditorWindow\n    {\n\n        #region Consts\n\n        private const float BTN_WIDTH = 275f;\n\n        public const string MENU_NAME = SPMenu.MENU_NAME_SETTINGS + \"/Spacepuppy Settings\";\n        public const int MENU_PRIORITY = SPMenu.MENU_PRIORITY_SETTINGS;\n        \n        #endregion\n\n        #region Menu Entries\n\n        [MenuItem(MENU_NAME, priority = MENU_PRIORITY)]\n        public static void OpenWindow()\n        {\n            if (_openWindow == null)\n            {\n                EditorWindow.GetWindow<SpacepuppySettingsWindow>();\n            }\n            else\n            {\n                GUI.BringWindowToFront(_openWindow.GetInstanceID());\n            }\n        }\n\n        #endregion\n        \n        #region Window\n\n        private static SpacepuppySettingsWindow _openWindow;\n\n\n        private GameSettings _gameSettings;\n        private CustomTimeLayersData _timeLayersData;\n\n        private Vector2 _scenesScrollBarPosition;\n\n        private void OnEnable()\n        {\n            if (_openWindow == null)\n                _openWindow = this;\n            else\n                Object.DestroyImmediate(this);\n\n            this.titleContent = new GUIContent(\"SP Settings\");\n\n            _gameSettings = AssetDatabase.LoadAssetAtPath(GameSettings.PATH_DEFAULTSETTINGS_FULL, typeof(GameSettings)) as GameSettings;\n            _timeLayersData = AssetDatabase.LoadAssetAtPath(CustomTimeLayersData.PATH_DEFAULTSETTINGS_FULL, typeof(CustomTimeLayersData)) as CustomTimeLayersData;\n        }\n\n        private void OnDisable()\n        {\n            if(_openWindow == this) _openWindow = null;\n        }\n\n        private void OnGUI()\n        {\n            Rect rect;\n\n            var boxStyle = new GUIStyle(GUI.skin.box);\n            boxStyle.stretchHeight = false;\n\n            EditorGUILayout.Space();\n\n            EditorGUI.BeginChangeCheck();\n            bool storeLocal = EditorGUILayout.ToggleLeft(\"Store Settings Local\", SpacepuppySettings.StoreSettingsLocal);\n            if (EditorGUI.EndChangeCheck()) SpacepuppySettings.StoreSettingsLocal = storeLocal;\n\n            /*\n             * Editor Use\n             */\n\n            EditorGUILayout.Space();\n            GUILayout.BeginVertical(\"Editor Settings\", boxStyle);\n            EditorGUILayout.Space();\n\n            EditorGUI.BeginChangeCheck();\n            bool useSPEditor = EditorGUILayout.ToggleLeft(\"Use SPEditor as default editor for MonoBehaviour\", SpacepuppySettings.UseSPEditorAsDefaultEditor);\n            if (EditorGUI.EndChangeCheck()) SpacepuppySettings.UseSPEditorAsDefaultEditor = useSPEditor;\n\n            EditorGUI.BeginChangeCheck();\n            bool useAdvancedAnimInspector = EditorGUILayout.ToggleLeft(\"Use Advanced Animation Inspector\", SpacepuppySettings.UseAdvancedAnimationInspector);\n            if (EditorGUI.EndChangeCheck()) SpacepuppySettings.UseAdvancedAnimationInspector = useAdvancedAnimInspector;\n\n            EditorGUI.BeginChangeCheck();\n            bool hierarchyDrawerActive = EditorGUILayout.ToggleLeft(\"Use Hierarchy Drawers\", SpacepuppySettings.UseHierarchDrawer);\n            if (EditorGUI.EndChangeCheck())\n            {\n                SpacepuppySettings.UseHierarchDrawer = hierarchyDrawerActive;\n                EditorHierarchyDrawerEvents.SetActive(hierarchyDrawerActive);\n            }\n\n            EditorGUI.BeginChangeCheck();\n            bool hierarchCustomContextMenu = EditorGUILayout.ToggleLeft(\"Use Alternate Hierarchy Context Menu\", SpacepuppySettings.UseHierarchyAlternateContextMenu);\n            if(EditorGUI.EndChangeCheck())\n            {\n                SpacepuppySettings.UseHierarchyAlternateContextMenu = hierarchCustomContextMenu;\n                EditorHierarchyAlternateContextMenuEvents.SetActive(hierarchCustomContextMenu);\n            }\n\n            EditorGUI.BeginChangeCheck();\n            bool signalValidateReceiver = EditorGUILayout.ToggleLeft(\"Signal IValidateReceiver OnValidate Event\", SpacepuppySettings.SignalValidateReceiver);\n            if (EditorGUI.EndChangeCheck())\n            {\n                SpacepuppySettings.SignalValidateReceiver = signalValidateReceiver;\n            }\n\n            GUILayout.EndVertical();\n\n            /*\n             * Material Search Settings\n             */\n\n            GUILayout.BeginVertical(\"Material Settings\", boxStyle);\n            EditorGUILayout.Space();\n\n            EditorGUI.BeginChangeCheck();\n            bool setMaterialSearch = EditorGUILayout.ToggleLeft(\"Configure Material Settings On Import\", SpacepuppySettings.SetMaterialSearchOnImport);\n            if (EditorGUI.EndChangeCheck()) SpacepuppySettings.SetMaterialSearchOnImport = setMaterialSearch;\n\n            EditorGUI.BeginChangeCheck();\n            var materialSearch = (ModelImporterMaterialSearch)EditorGUILayout.EnumPopup(\"Material Search\", SpacepuppySettings.MaterialSearch);\n            if (EditorGUI.EndChangeCheck()) SpacepuppySettings.MaterialSearch = materialSearch;\n\n            GUILayout.EndVertical();\n\n            /*\n             * Animation Settings\n             */\n\n            GUILayout.BeginVertical(\"Animation Settings\", boxStyle);\n            EditorGUILayout.Space();\n\n            EditorGUI.BeginChangeCheck();\n            bool setAnimSettings = EditorGUILayout.ToggleLeft(\"Configure Animation Settings On Import\", SpacepuppySettings.SetAnimationSettingsOnImport);\n            if (EditorGUI.EndChangeCheck()) SpacepuppySettings.SetAnimationSettingsOnImport = setAnimSettings;\n\n            EditorGUI.BeginChangeCheck();\n            var animRigType = (ModelImporterAnimationType)EditorGUILayout.EnumPopup(\"Aimation Rig Type\", SpacepuppySettings.ImportAnimRigType);\n            if (EditorGUI.EndChangeCheck()) SpacepuppySettings.ImportAnimRigType = animRigType;\n\n            GUILayout.EndVertical();\n\n            /*\n             * Game Settings\n             */\n\n            GUILayout.BeginVertical(\"Game Settings\", boxStyle);\n            EditorGUILayout.Space();\n            EditorGUILayout.Space();\n\n            if (_gameSettings == null)\n            {\n                rect = EditorGUILayout.GetControlRect();\n                rect.width = Mathf.Min(rect.width, BTN_WIDTH);\n\n                if (GUI.Button(rect, \"Create Default GameSettings Data Resource\"))\n                {\n                    var tps = (from t in TypeUtil.GetTypesAssignableFrom(typeof(GameSettings)) where !t.IsAbstract && !t.IsInterface select t).ToArray();\n                    \n                    var menu = new GenericMenu();\n                    foreach(var tp in tps)\n                    {\n                        menu.AddItem(EditorHelper.TempContent(tp.Name), false, () =>\n                        {\n                            _gameSettings = ScriptableObjectHelper.CreateAsset(tp, GameSettings.PATH_DEFAULTSETTINGS_FULL) as GameSettings;\n                        });\n                    }\n                    menu.ShowAsContext();\n                }\n            }\n            else\n            {\n                EditorGUILayout.ObjectField(\"Game Settings\", _gameSettings, typeof(GameSettings), false);\n            }\n\n            EditorGUILayout.Space();\n\n            if (_timeLayersData == null)\n            {\n                rect = EditorGUILayout.GetControlRect();\n                rect.width = Mathf.Min(rect.width, BTN_WIDTH);\n                if(GUI.Button(rect, \"Create Custom Time Layers Data Resource\"))\n                {\n                    _timeLayersData = ScriptableObjectHelper.CreateAsset<CustomTimeLayersData>(CustomTimeLayersData.PATH_DEFAULTSETTINGS_FULL);\n                }\n            }\n            else\n            {\n                EditorGUILayout.ObjectField(\"Custom Time Layers Data\", _timeLayersData, typeof(CustomTimeLayersData), false);\n            }\n\n            GUILayout.EndVertical();\n\n\n\n\n            EditorGUILayout.Space();\n            EditorGUILayout.Space();\n            this.DrawScenes();\n        }\n\n        #endregion\n\n\n\n\n\n\n\n\n\n\n\n\n\n        #region Debug Build Scenes - OBSOLETE\n\n        private void DrawScenes()\n        {\n            EditorGUILayout.LabelField(\"Scenes in Build\", EditorStyles.boldLabel);\n\n            //EditorGUI.indentLevel++;\n            \n            var style = new GUIStyle(GUI.skin.box);\n            style.stretchHeight = true;\n            _scenesScrollBarPosition = EditorGUILayout.BeginScrollView(_scenesScrollBarPosition, style);\n\n            bool changed = false;\n            var scenes = EditorBuildSettings.scenes;\n            for (int i = 0; i < scenes.Length; i++)\n            {\n                var r = EditorGUILayout.GetControlRect();\n                var r0 = new Rect(r.xMin, r.yMin, 25f, r.height);\n                var r1 = new Rect(r0.xMax, r.yMin, (r.xMax - r0.xMax) * 0.66f, r.height);\n                var r2 = new Rect(r1.xMax, r.yMin, r.xMax - r1.xMax, r.height);\n\n                EditorGUI.BeginChangeCheck();\n                scenes[i].enabled = EditorGUI.Toggle(r0, scenes[i].enabled);\n                if (EditorGUI.EndChangeCheck()) changed = true;\n\n                EditorGUI.LabelField(r1, EditorHelper.TempContent(scenes[i].path));\n                var scene = AssetDatabase.LoadAssetAtPath<SceneAsset>(scenes[i].path);\n                EditorGUI.BeginChangeCheck();\n                scene = EditorGUI.ObjectField(r2, GUIContent.none, scene, typeof(SceneAsset), false) as SceneAsset;\n                if (EditorGUI.EndChangeCheck())\n                {\n                    changed = true;\n                    scenes[i] = new EditorBuildSettingsScene(AssetDatabase.GetAssetPath(scene), scenes[i].enabled);\n                }\n            }\n            if (changed) EditorBuildSettings.scenes = scenes;\n\n            EditorGUILayout.EndScrollView();\n\n            \n            //DRAG & DROP ON SCROLLVIEW\n            var dropArea = GUILayoutUtility.GetLastRect();\n\n            var ev = Event.current;\n            switch (ev.type)\n            {\n                case EventType.DragUpdated:\n                    if (dropArea.Contains(ev.mousePosition) && (from o in DragAndDrop.objectReferences where o is SceneAsset select o).Any())\n                        DragAndDrop.visualMode = DragAndDropVisualMode.Copy;\n                    break;\n                case EventType.DragPerform:\n                    if (dropArea.Contains(ev.mousePosition) && (from o in DragAndDrop.objectReferences where o is SceneAsset select o).Any())\n                    {\n                        DragAndDrop.visualMode = DragAndDropVisualMode.Copy;\n                        DragAndDrop.AcceptDrag();\n\n                        var lst = new List<EditorBuildSettingsScene>(EditorBuildSettings.scenes);\n                        foreach (var o in DragAndDrop.objectReferences)\n                        {\n                            var scene = o as SceneAsset;\n                            if (scene == null) continue;\n\n                            var p = AssetDatabase.GetAssetPath(scene);\n                            if (!(from s in lst where s.path == p select s).Any())\n                            {\n                                lst.Add(new EditorBuildSettingsScene(p, true));\n                            }\n                        }\n                        EditorBuildSettings.scenes = lst.ToArray();\n                    }\n                    break;\n\n            }\n\n\n\n            ////////////////\n            //BUTTONS!\n            var rect = EditorGUILayout.GetControlRect();\n\n            //DESELECT\n            var selectAllPosition = new Rect(rect.xMin, rect.yMin, 100f, rect.height);\n            if (GUI.Button(selectAllPosition, new GUIContent(\"Select All\")))\n            {\n                var arr = EditorBuildSettings.scenes;\n                foreach (var s in arr)\n                {\n                    s.enabled = true;\n                }\n                EditorBuildSettings.scenes = arr;\n            }\n\n            //DESELECT\n            var deselectPosition = new Rect(rect.xMin + 105f, rect.yMin, 100f, rect.height);\n            if (GUI.Button(deselectPosition, new GUIContent(\"Deselect All\")))\n            {\n                var arr = EditorBuildSettings.scenes;\n                foreach (var s in arr)\n                {\n                    s.enabled = false;\n                }\n                EditorBuildSettings.scenes = arr;\n            }\n\n            //CLEAR\n            var cancelPosition = new Rect(rect.xMax - 110f, rect.yMin, 50f, rect.height);\n            if (GUI.Button(cancelPosition, new GUIContent(\"Clear\")))\n            {\n                EditorBuildSettings.scenes = new EditorBuildSettingsScene[] { };\n            }\n            //SYNC\n            var applyPosition = new Rect(rect.xMax - 55f, rect.yMin, 50f, rect.height);\n            var oldScenes = EditorBuildSettings.scenes;\n            if (GUI.Button(applyPosition, new GUIContent(\"Add All\")))\n            {\n                var lst = new List<EditorBuildSettingsScene>();\n                var mainFolder = Application.dataPath.EnsureNotEndsWith(\"Assets\");\n                foreach (var file in Directory.GetFiles(Application.dataPath + \"/Scenes\", \"*.unity\", SearchOption.AllDirectories))\n                {\n                    var normalizedFile = file.EnsureNotStartWith(mainFolder);\n                    bool enabled = (from s in oldScenes where s.enabled && s.path == normalizedFile select s).Any();\n                    lst.Add(new EditorBuildSettingsScene(normalizedFile, enabled));\n                }\n                EditorBuildSettings.scenes = lst.ToArray();\n            }\n\n\n\n            //EditorGUI.indentLevel--;\n\n        }\n\n        /*\n        private void DrawScenes()\n        {\n            EditorGUILayout.LabelField(\"Scenes in Build\", EditorStyles.boldLabel);\n\n            EditorGUI.indentLevel++;\n\n            //var h = (this.position.height - GUILayoutUtility.GetLastRect().yMax);\n            //if (h < 0f) h = 0f;\n            //_scenesScrollBarPosition = EditorGUILayout.BeginScrollView(_scenesScrollBarPosition, GUI.skin.box, GUILayout.Height(h));\n\n            var style = new GUIStyle(GUI.skin.box);\n            style.stretchHeight = true;\n            _scenesScrollBarPosition = EditorGUILayout.BeginScrollView(_scenesScrollBarPosition, style);\n\n            EditorGUI.BeginChangeCheck();\n            var scenes = EditorBuildSettings.scenes;\n            foreach (var scene in scenes)\n            {\n                //EditorGUILayout.LabelField(scene.path);\n                scene.enabled = EditorGUILayout.ToggleLeft(EditorHelper.TempContent(scene.path), scene.enabled);\n            }\n            if (EditorGUI.EndChangeCheck()) EditorBuildSettings.scenes = scenes;\n\n            EditorGUILayout.EndScrollView();\n\n            //DRAG & DROP ON SCROLLVIEW\n            var dropArea = GUILayoutUtility.GetLastRect();\n\n            var ev = Event.current;\n            switch (ev.type)\n            {\n                case EventType.DragUpdated:\n                    if (dropArea.Contains(ev.mousePosition) && (from o in DragAndDrop.objectReferences where o is SceneAsset select o).Any())\n                        DragAndDrop.visualMode = DragAndDropVisualMode.Copy;\n                    break;\n                case EventType.DragPerform:\n                    if (dropArea.Contains(ev.mousePosition) && (from o in DragAndDrop.objectReferences where o is SceneAsset select o).Any())\n                    {\n                        DragAndDrop.visualMode = DragAndDropVisualMode.Copy;\n                        DragAndDrop.AcceptDrag();\n\n                        var lst = new List<EditorBuildSettingsScene>(EditorBuildSettings.scenes);\n                        foreach (var o in DragAndDrop.objectReferences)\n                        {\n                            var scene = o as SceneAsset;\n                            if (scene == null) continue;\n\n                            var p = AssetDatabase.GetAssetPath(scene);\n                            if (!(from s in lst where s.path == p select s).Any())\n                            {\n                                lst.Add(new EditorBuildSettingsScene(p, true));\n                            }\n                        }\n                        EditorBuildSettings.scenes = lst.ToArray();\n                    }\n                    break;\n\n            }\n\n\n\n            ////////////////\n            //BUTTONS!\n            var rect = EditorGUILayout.GetControlRect();\n\n            //DESELECT\n            var selectAllPosition = new Rect(rect.xMin, rect.yMin, 100f, rect.height);\n            if (GUI.Button(selectAllPosition, new GUIContent(\"Select All\")))\n            {\n                var arr = EditorBuildSettings.scenes;\n                foreach (var s in arr)\n                {\n                    s.enabled = true;\n                }\n                EditorBuildSettings.scenes = arr;\n            }\n\n            //DESELECT\n            var deselectPosition = new Rect(rect.xMin + 105f, rect.yMin, 100f, rect.height);\n            if(GUI.Button(deselectPosition, new GUIContent(\"Deselect All\")))\n            {\n                var arr = EditorBuildSettings.scenes;\n                foreach (var s in arr)\n                {\n                    s.enabled = false;\n                }\n                EditorBuildSettings.scenes = arr;\n            }\n\n            //CLEAR\n            var cancelPosition = new Rect(rect.xMax - 110f, rect.yMin, 50f, rect.height);\n            if (GUI.Button(cancelPosition, new GUIContent(\"Clear\")))\n            {\n                EditorBuildSettings.scenes = new EditorBuildSettingsScene[] { };\n            }\n            //SYNC\n            var applyPosition = new Rect(rect.xMax - 55f, rect.yMin, 50f, rect.height);\n            var oldScenes = EditorBuildSettings.scenes;\n            if (GUI.Button(applyPosition, new GUIContent(\"Sync\")))\n            {\n                var lst = new List<EditorBuildSettingsScene>();\n                var mainFolder = Application.dataPath.EnsureNotEndsWith(\"Assets\");\n                foreach (var file in Directory.GetFiles(Application.dataPath + \"/Scenes\", \"*.unity\", SearchOption.AllDirectories))\n                {\n                    var normalizedFile = file.EnsureNotStartWith(mainFolder);\n                    bool enabled = (from s in oldScenes where s.enabled && s.path == normalizedFile select s).Any();\n                    lst.Add(new EditorBuildSettingsScene(normalizedFile, enabled));\n                }\n                EditorBuildSettings.scenes = lst.ToArray();\n            }\n            EditorGUI.indentLevel--;\n\n        }\n        */\n    \n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Base/TypeSelectionDropDownWindow.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Base\r\n{\r\n    public class TypeSelectionDropDownWindow : EditorWindow\r\n    {\r\n\r\n        private const string PREF_SEARCHSTRING = \"TypeDropDownSearchHistory\";\r\n        private static int s_TypePopupHash = \"TypeEditorPopup\".GetHashCode();\r\n        private static int s_TypeCustomHash = \"TypeEditorCustomDropDown\".GetHashCode();\r\n        private const string CNTRL_TYPESEARCH = \"TypeSearch\";\r\n\r\n        #region Fields\r\n\r\n        private Styles _style;\r\n\r\n        private System.Type _baseType = typeof(object);\r\n        private System.Type _defaultType = null;\r\n        private bool _allowAbstractTypes;\r\n        private bool _allowInterfaces;\r\n        private System.Type[] _excludedTypes;\r\n        private TypeDropDownListingStyle _listStyle;\r\n        private System.Predicate<System.Type> _searchPredicate;\r\n\r\n\r\n        private string _header;\r\n        private string _search = string.Empty;\r\n        private string _lastSearch = string.Empty;\r\n        private List<SearchElement> _searchElements = new List<SearchElement>();\r\n        private bool _searchIsDirty;\r\n\r\n        private Vector2 _scrollPosition;\r\n        private int _selectedIndex = -1;\r\n        private bool _scrollToSelected;\r\n        \r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected virtual void Awake()\r\n        {\r\n            _style = new Styles();\r\n        }\r\n\r\n        protected virtual void OnEnable()\r\n        {\r\n            _search = EditorPrefs.GetString(PREF_SEARCHSTRING, string.Empty);\r\n            this.wantsMouseMove = true;\r\n        }\r\n\r\n        protected virtual void OnDestroy()\r\n        {\r\n            if (object.ReferenceEquals(this, _window)) _window = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public System.Type BaseType\r\n        {\r\n            get { return _baseType; }\r\n            set\r\n            {\r\n                if (_baseType == value) return;\r\n                _baseType = value ?? typeof(object);\r\n                _searchIsDirty = true;\r\n            }\r\n        }\r\n\r\n        public System.Type DefaultType\r\n        {\r\n            get { return _defaultType; }\r\n            set\r\n            {\r\n                if (value != null && TypeUtil.IsType(value, _baseType))\r\n                {\r\n                    if (_defaultType == value) return;\r\n                    _defaultType = value;\r\n                    _searchIsDirty = true;\r\n                }\r\n                else\r\n                {\r\n                    if (_defaultType == null) return;\r\n                    _defaultType = null;\r\n                    _searchIsDirty = true;\r\n                }\r\n\r\n            }\r\n        }\r\n\r\n        public bool AllowAbstractTypes\r\n        {\r\n            get { return _allowAbstractTypes; }\r\n            set\r\n            {\r\n                if (_allowAbstractTypes == value) return;\r\n                _allowAbstractTypes = value;\r\n                _searchIsDirty = true;\r\n            }\r\n        }\r\n\r\n        public bool AllowInterface\r\n        {\r\n            get { return _allowInterfaces; }\r\n            set\r\n            {\r\n                if (_allowInterfaces == value) return;\r\n                _allowInterfaces = value;\r\n                _searchIsDirty = true;\r\n            }\r\n        }\r\n\r\n        public System.Type[] ExcludedTypes\r\n        {\r\n            get { return _excludedTypes; }\r\n            set\r\n            {\r\n                _excludedTypes = value;\r\n                _searchIsDirty = true;\r\n            }\r\n        }\r\n\r\n        public TypeDropDownListingStyle ListingStyle\r\n        {\r\n            get { return _listStyle; }\r\n            set\r\n            {\r\n                if (_listStyle == value) return;\r\n                _listStyle = value;\r\n                _searchIsDirty = true;\r\n            }\r\n        }\r\n\r\n        public System.Predicate<System.Type> SearchPredicate\r\n        {\r\n            get { return _searchPredicate; }\r\n            set { _searchPredicate = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Private Redirect Properties\r\n\r\n        private SearchElement _activeElement\r\n        {\r\n            get\r\n            {\r\n                if (_selectedIndex < 0 || _selectedIndex >= _searchElements.Count) return null;\r\n                return _searchElements[_selectedIndex];\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected virtual void OnGUI()\r\n        {\r\n            this.HandleKeyboard();\r\n\r\n            GUI.Label(new Rect(0.0f, 0.0f, this.position.width, this.position.height), GUIContent.none, _style.background);\r\n            GUILayout.Space(7f);\r\n            EditorGUI.FocusTextInControl(CNTRL_TYPESEARCH);\r\n\r\n            //first draw search area and update search if needed\r\n            var rect = GUILayoutUtility.GetRect(10f, 20f);\r\n            rect.x += 8f;\r\n            rect.width -= 16f;\r\n\r\n            GUI.SetNextControlName(CNTRL_TYPESEARCH);\r\n            _search = SPEditorGUI.SearchField(rect, _search);\r\n            if(_search != _lastSearch)\r\n            {\r\n                this.RebuildSearch();\r\n            }\r\n            else if(_searchIsDirty)\r\n            {\r\n                this.RebuildSearch();\r\n            }\r\n\r\n\r\n            //next draw type header (display the name of the base type)\r\n            rect = GUILayoutUtility.GetRect(10f, 25f);\r\n            EditorGUI.LabelField(rect, _header, _style.header);\r\n\r\n            //lastly list found types\r\n            this.DrawList();\r\n        }\r\n\r\n        private void DrawList()\r\n        {\r\n            _scrollPosition = GUILayout.BeginScrollView(_scrollPosition);\r\n\r\n            Event current = Event.current;\r\n            Rect selectedRect = new Rect();\r\n            EditorGUI.indentLevel++;\r\n            for(int index = 0; index < _searchElements.Count; index++)\r\n            {\r\n                var e = _searchElements[index];\r\n                Rect rect = GUILayoutUtility.GetRect(16f, 20f, new GUILayoutOption[1]\r\n                {\r\n                    GUILayout.ExpandWidth(true)\r\n                });\r\n                rect.x += 2f;\r\n                rect.width -= 2f;\r\n\r\n                if ((current.type == EventType.MouseMove || current.type == EventType.MouseDown) && rect.Contains(current.mousePosition))\r\n                {\r\n                    _selectedIndex = index;\r\n                    this.Repaint();\r\n                }\r\n                bool selectedFlag = false;\r\n                if(index == _selectedIndex)\r\n                {\r\n                    selectedFlag = true;\r\n                    selectedRect = rect;\r\n                }\r\n                if (current.type == EventType.Repaint)\r\n                {\r\n                    _style.componentButton.Draw(rect, e.Content, false, false, selectedFlag, selectedFlag);\r\n                }\r\n                if (current.type == EventType.MouseUp && rect.Contains(current.mousePosition))\r\n                {\r\n                    current.Use();\r\n                    _selectedIndex = index;\r\n                    this.SelectElement(e);\r\n                }\r\n            }\r\n            EditorGUI.indentLevel--;\r\n            \r\n            GUILayout.EndScrollView();\r\n\r\n\r\n\r\n            if (!_scrollToSelected || Event.current.type != EventType.Repaint)\r\n                return;\r\n            _scrollToSelected = false;\r\n            Rect lastRect = GUILayoutUtility.GetLastRect();\r\n            if ((double)selectedRect.yMax - (double)lastRect.height > (double)_scrollPosition.y)\r\n            {\r\n                _scrollPosition.y = selectedRect.yMax - lastRect.height;\r\n                this.Repaint();\r\n            }\r\n            if ((double)selectedRect.y >= (double)_scrollPosition.y)\r\n                return;\r\n            _scrollPosition.y = selectedRect.y;\r\n            this.Repaint();\r\n        }\r\n\r\n        private void HandleKeyboard()\r\n        {\r\n            Event current = Event.current;\r\n            if (current.type != EventType.KeyDown)\r\n                return;\r\n\r\n            switch(current.keyCode)\r\n            {\r\n                case KeyCode.DownArrow:\r\n                    ++_selectedIndex;\r\n                    _selectedIndex = Mathf.Min(_selectedIndex, _searchElements.Count - 1);\r\n                    this._scrollToSelected = true;\r\n                    current.Use();\r\n                    break;\r\n                case KeyCode.UpArrow:\r\n                    --_selectedIndex;\r\n                    _selectedIndex = Mathf.Max(_selectedIndex, 0);\r\n                    this._scrollToSelected = true;\r\n                    current.Use();\r\n                    break;\r\n                case KeyCode.Return:\r\n                case KeyCode.KeypadEnter:\r\n                    this.SelectElement(_activeElement);\r\n                    current.Use();\r\n                    break;\r\n                case KeyCode.LeftArrow:\r\n                case KeyCode.Backspace:\r\n                    //if (this.hasSearch) return;\r\n                    //this.GoToParent();\r\n                    //current.Use();\r\n                    break;\r\n                case KeyCode.RightArrow:\r\n                    //if (this.hasSearch) return;\r\n                    //this.GoToChild(this.activeElement, false);\r\n                    //current.Use();\r\n                    break;\r\n                case KeyCode.Escape:\r\n                    this.Close();\r\n                    current.Use();\r\n                    break;\r\n            }\r\n        }\r\n\r\n        private void SelectElement(SearchElement el)\r\n        {\r\n            this.Close();\r\n            if (this == _window && el != null)\r\n            {\r\n                if (CallbackInfo.instance != null)\r\n                {\r\n                    CallbackInfo.instance.SignalChange(el.Type);\r\n                }\r\n\r\n                _window = null;\r\n            }\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n        private void RebuildSearch()\r\n        {\r\n            _lastSearch = _search;\r\n            _searchIsDirty = false;\r\n            _scrollPosition = Vector2.zero;\r\n            _selectedIndex = -1;\r\n            EditorPrefs.SetString(PREF_SEARCHSTRING, _search);\r\n\r\n            if (string.IsNullOrEmpty(_search))\r\n            {\r\n                _searchElements.Clear();\r\n                if (_defaultType == null)\r\n                    _searchElements.Add(new SearchElement()\r\n                    {\r\n                        Content = GetTypeLabel(null)\r\n                    });\r\n                _searchElements.AddRange(from tp in TypeUtil.GetTypes(this.TestIfValidType)\r\n                                         where _searchPredicate == null || _searchPredicate(tp)\r\n                                         select new SearchElement()\r\n                                         {\r\n                                             Name = tp.Name,\r\n                                             Type = tp,\r\n                                             Content = GetTypeLabel(tp)\r\n                                         });\r\n\r\n\r\n\r\n                _header = (_baseType == typeof(object)) ? \"All Types\" : _baseType.Name + \"/s\";\r\n            }\r\n            else\r\n            {\r\n                var match = _search.ToLower();\r\n                _searchElements.Clear();\r\n                if (_defaultType == null)\r\n                    _searchElements.Add(new SearchElement()\r\n                    {\r\n                        Content = GetTypeLabel(null)\r\n                    });\r\n                _searchElements.AddRange(from tp in TypeUtil.GetTypes(this.TestIfValidType)\r\n                                         where tp.Name.ToLower().Contains(match) && (_searchPredicate == null || _searchPredicate(tp))\r\n                                         select new SearchElement()\r\n                                         {\r\n                                             Name = tp.Name,\r\n                                             Type = tp,\r\n                                             Content = GetTypeLabel(tp)\r\n                                         });\r\n\r\n                _header = (_baseType == typeof(object)) ? \"Search All Types\" : \"Search \" + _baseType.Name + \"/s\";\r\n            }\r\n        }\r\n\r\n        private bool TestIfValidType(System.Type tp)\r\n        {\r\n            if (tp == null) return false;\r\n\r\n            if (!_baseType.IsAssignableFrom(tp)) return false;\r\n            if (tp.IsInterface && !_allowInterfaces) return false;\r\n            if (tp.IsAbstract && !_allowAbstractTypes) return false;\r\n            if (_excludedTypes != null && _excludedTypes.IndexOf(tp) >= 0) return false;\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Utils\r\n\r\n        private static GUIContent GetTypeLabel(System.Type tp)\r\n        {\r\n            if (tp == null)\r\n                return new GUIContent(\"Nothing...\");\r\n            else\r\n                return new GUIContent(tp.Name, tp.FullName);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private class SearchElement\r\n        {\r\n\r\n            public string Name;\r\n            public System.Type Type;\r\n            public GUIContent Content;\r\n\r\n        }\r\n\r\n        private class Styles\r\n        {\r\n            public GUIStyle header;\r\n            public GUIStyle componentButton = new GUIStyle((GUIStyle)\"PR Label\");\r\n            public GUIStyle background = (GUIStyle)\"grey_border\";\r\n            public GUIStyle previewBackground = (GUIStyle)\"PopupCurveSwatchBackground\";\r\n            public GUIStyle previewHeader = new GUIStyle(EditorStyles.label);\r\n            public GUIStyle previewText = new GUIStyle(EditorStyles.wordWrappedLabel);\r\n            public GUIStyle rightArrow = (GUIStyle)\"AC RightArrow\";\r\n            public GUIStyle leftArrow = (GUIStyle)\"AC LeftArrow\";\r\n            public GUIStyle groupButton;\r\n\r\n            public Styles()\r\n            {\r\n                header = SPEditorStyles.GetStyle(\"In BigTitle\");\r\n                this.header.font = EditorStyles.boldLabel.font;\r\n                this.componentButton.alignment = TextAnchor.MiddleLeft;\r\n                this.componentButton.padding.left -= 15;\r\n                this.componentButton.fixedHeight = 20f;\r\n                this.groupButton = new GUIStyle(this.componentButton);\r\n                this.groupButton.padding.left += 17;\r\n                this.previewText.padding.left += 3;\r\n                this.previewText.padding.right += 3;\r\n                ++this.previewHeader.padding.left;\r\n                this.previewHeader.padding.right += 3;\r\n                this.previewHeader.padding.top += 3;\r\n                this.previewHeader.padding.bottom += 2;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Inspector Show Methods\r\n\r\n        private static TypeSelectionDropDownWindow _window;\r\n\r\n        public static System.Type Popup(Rect position, GUIContent label,\r\n                                               System.Type baseType, System.Type selectedType,\r\n                                               bool allowAbstractTypes = false, bool allowInterfaces = false,\r\n                                               System.Type defaultType = null, System.Type[] excludedTypes = null,\r\n                                               TypeDropDownListingStyle listType = TypeDropDownListingStyle.Namespace,\r\n                                               System.Predicate<System.Type> searchPredicate = null)\r\n        {\r\n            int controlID = GUIUtility.GetControlID(TypeSelectionDropDownWindow.s_TypePopupHash, FocusType.Passive, position);\r\n            position = EditorGUI.PrefixLabel(position, controlID, label);\r\n\r\n            selectedType = CallbackInfo.GetSelectedValueForControl(controlID, selectedType);\r\n\r\n            var content = GetTypeLabel(selectedType);\r\n            var current = Event.current;\r\n            var type = current.type;\r\n            switch(type)\r\n            {\r\n                case EventType.KeyDown:\r\n                    {\r\n                        //TODO?\r\n                        //EditorStyles.popup.Draw(position, content, controlID);\r\n                    }\r\n                    break;\r\n                case EventType.Repaint:\r\n                    {\r\n                        EditorStyles.popup.Draw(position, content, controlID);\r\n                    }\r\n                    break;\r\n                case EventType.MouseDown:\r\n                    {\r\n                        if(current.button == 0 && position.Contains(current.mousePosition))\r\n                        {\r\n                            CallbackInfo.instance = new CallbackInfo(controlID, selectedType);\r\n                            TypeSelectionDropDownWindow.DisplayCustomMenu(position, label, baseType, selectedType, allowAbstractTypes, allowInterfaces, defaultType, excludedTypes, listType, searchPredicate);\r\n                            GUIUtility.keyboardControl = controlID;\r\n                            current.Use();\r\n                        }\r\n                    }\r\n                    break;\r\n            }\r\n\r\n            return selectedType;\r\n        }\r\n\r\n        public static void ShowAndCallbackOnSelect(Rect positionUnder, System.Type baseType,\r\n                                           System.Action<System.Type> callback,\r\n                                           bool allowAbstractTypes = false, bool allowInterfaces = false,\r\n                                           System.Type defaultType = null, System.Type[] excludedTypes = null,\r\n                                           TypeDropDownListingStyle listType = TypeDropDownListingStyle.Namespace,\r\n                                           System.Predicate<System.Type> searchPredicate = null)\r\n        {\r\n            int controlID = GUIUtility.GetControlID(TypeSelectionDropDownWindow.s_TypeCustomHash, FocusType.Passive, positionUnder);\r\n            CallbackInfo.instance = new CallbackInfo(controlID, null, callback);\r\n            TypeSelectionDropDownWindow.DisplayCustomMenu(positionUnder, GUIContent.none, baseType, null, allowAbstractTypes, allowInterfaces, defaultType, excludedTypes, listType, searchPredicate);\r\n        }\r\n\r\n        private static void DisplayCustomMenu(Rect position, GUIContent label,\r\n                                               System.Type baseType, System.Type selectedType,\r\n                                               bool allowAbstractTypes = false, bool allowInterfaces = false,\r\n                                               System.Type defaultType = null, System.Type[] excludedTypes = null,\r\n                                               TypeDropDownListingStyle listType = TypeDropDownListingStyle.Namespace,\r\n                                               System.Predicate<System.Type> searchPredicate = null)\r\n        {\r\n            if (_window != null)\r\n            {\r\n                _window.Close();\r\n            }\r\n\r\n            var pos = GUIUtility.GUIToScreenPoint(new Vector2(position.x, position.y));\r\n            position.x = pos.x;\r\n            position.y = pos.y;\r\n\r\n            _window = EditorWindow.CreateInstance<TypeSelectionDropDownWindow>();\r\n            _window.BaseType = baseType;\r\n            _window.AllowAbstractTypes = allowAbstractTypes;\r\n            _window.AllowInterface = allowInterfaces;\r\n            _window.DefaultType = defaultType;\r\n            _window.ExcludedTypes = excludedTypes;\r\n            _window.ListingStyle = listType;\r\n            _window.SearchPredicate = searchPredicate;\r\n\r\n            _window.ShowAsDropDown(position, new Vector2(position.width, 320f));\r\n            _window.Focus();\r\n        }\r\n\r\n\r\n        private class CallbackInfo\r\n        {\r\n            public const string CMND_MENUCHANGED = \"TypeSelectionPopupMenuChanged\";\r\n            public static CallbackInfo instance;\r\n\r\n            private int _controlID;\r\n            private System.Type _selectedType;\r\n            private com.spacepuppyeditor.Internal.GUIViewProxy _sourceView;\r\n            private System.Action<System.Type> _callback;\r\n\r\n            public CallbackInfo(int controlId, System.Type tp)\r\n            {\r\n                _controlID = controlId;\r\n                _selectedType = tp;\r\n                _sourceView = com.spacepuppyeditor.Internal.GUIViewProxy.GetCurrent();\r\n            }\r\n\r\n            public CallbackInfo(int controlId, System.Type tp, System.Action<System.Type> callback)\r\n            {\r\n                _controlID = controlId;\r\n                _selectedType = tp;\r\n                _sourceView = com.spacepuppyeditor.Internal.GUIViewProxy.GetCurrent();\r\n                _callback = callback;\r\n            }\r\n\r\n            public void SignalChange(System.Type tp)\r\n            {\r\n                if (tp != this._selectedType)\r\n                {\r\n                    _selectedType = tp;\r\n                    if(_sourceView != null) _sourceView.SendEvent(EditorGUIUtility.CommandEvent(CMND_MENUCHANGED));\r\n                    if (_callback != null) _callback(_selectedType);\r\n                }\r\n            }\r\n\r\n            public static System.Type GetSelectedValueForControl(int controlID, System.Type selected)\r\n            {\r\n                Event current = Event.current;\r\n                if(current.type == EventType.ExecuteCommand && current.commandName == CMND_MENUCHANGED)\r\n                {\r\n                    if(instance != null && instance._controlID == controlID)\r\n                    {\r\n                        selected = instance._selectedType;\r\n                        GUI.changed = true;\r\n                        current.Use();\r\n                    }\r\n                }\r\n                return selected;\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/BuildSettings.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Reflection;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n\r\n    [CreateAssetMenu(fileName = \"BuildSettings\", menuName = \"Spacepuppy Build Pipeline/Build Settings\")]\r\n    public class BuildSettings : ScriptableObject\r\n    {\r\n\r\n        [System.Flags]\r\n        public enum PostBuildOption\r\n        {\r\n            Nothing = 0,\r\n            OpenFolder = 1,\r\n            Run = 2,\r\n            OpenFolderAndRun = 3\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        [Tooltip(\"Leave blank if you want to be asked for a filename every time you build.\")]\r\n        public string BuildFileName;\r\n        [SerializeField]\r\n        [Tooltip(\"Paths can be relative to the 'Assets' folder.\\nLeave blank if you want to be asked for a directory every time you build.\")]\r\n        public string BuildDirectory;\r\n\r\n        [SerializeField]\r\n        public VersionInfo Version;\r\n\r\n        [SerializeField]\r\n        private SceneAsset _bootScene;\r\n\r\n        [SerializeField]\r\n        [ReorderableArray]\r\n        private List<SceneAsset> _scenes;\r\n        \r\n        [SerializeField]\r\n        private BuildTarget _buildTarget = BuildTarget.StandaloneWindows;\r\n\r\n        [SerializeField]\r\n        [EnumFlags]\r\n        private BuildOptions _buildOptions;\r\n\r\n        [SerializeField]\r\n        [Tooltip(\"Leave blank if you want to use default settings found in the Input Settings screen.\")]\r\n        private InputSettings _inputSettings;\r\n\r\n        [SerializeField]\r\n        private bool _defineSymbols;\r\n\r\n        [SerializeField]\r\n        [Tooltip(\"Semi-colon delimited symbols.\")]\r\n        private string _symbols;\r\n\r\n        [SerializeField]\r\n        [ReorderableArray]\r\n        private List<PlayerSettingOverride> _playerSettingOverrides = new List<PlayerSettingOverride>();\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n        \r\n        public SceneAsset BootScene\r\n        {\r\n            get { return _bootScene; }\r\n            set { _bootScene = value; }\r\n        }\r\n\r\n        public IList<SceneAsset> Scenes\r\n        {\r\n            get { return _scenes; }\r\n        }\r\n\r\n        public BuildTarget BuildTarget\r\n        {\r\n            get { return _buildTarget; }\r\n            set { _buildTarget = value; }\r\n        }\r\n\r\n        public BuildOptions BuildOptions\r\n        {\r\n            get { return _buildOptions; }\r\n            set { _buildOptions = value; }\r\n        }\r\n        \r\n        public InputSettings InputSettings\r\n        {\r\n            get { return _inputSettings; }\r\n            set { _inputSettings = value; }\r\n        }\r\n\r\n        public bool DefineSymbols\r\n        {\r\n            get { return _defineSymbols; }\r\n            set { _defineSymbols = value; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Semi-colon delimited symbols.\r\n        /// </summary>\r\n        public string Symbols\r\n        {\r\n            get { return _symbols; }\r\n            set { _symbols = value; }\r\n        }\r\n\r\n        public List<PlayerSettingOverride> PlayerSettingsOverrides\r\n        {\r\n            get { return _playerSettingOverrides; }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Methods\r\n\r\n        public string GetBuildFileNameWithExtension()\r\n        {\r\n            if (string.IsNullOrEmpty(this.BuildFileName)) return string.Empty;\r\n\r\n            string extension = GetExtension(this.BuildTarget);\r\n            string fileName = this.BuildFileName;\r\n            if (!string.IsNullOrEmpty(extension))\r\n            {\r\n                string ext = \".\" + extension;\r\n                if (!fileName.EndsWith(ext)) fileName += ext;\r\n            }\r\n            return fileName;\r\n        }\r\n\r\n        public virtual string[] GetScenePaths()\r\n        {\r\n            using (var lst = TempCollection.GetList<string>())\r\n            {\r\n                if (this.BootScene != null) lst.Add(AssetDatabase.GetAssetPath(this.BootScene));\r\n\r\n                foreach (var scene in this.Scenes)\r\n                {\r\n                    lst.Add(AssetDatabase.GetAssetPath(scene));\r\n                }\r\n\r\n                return lst.ToArray();\r\n            }\r\n        }\r\n\r\n        public virtual bool Build(PostBuildOption option)\r\n        {\r\n            string path;\r\n            try\r\n            {\r\n                //get output directory\r\n                var dir = EditorProjectPrefs.Local.GetString(\"LastBuildDirectory\", string.Empty);\r\n                if (string.IsNullOrEmpty(this.BuildFileName))\r\n                {\r\n                    string extension = GetExtension(this.BuildTarget);\r\n                    path = EditorUtility.SaveFilePanel(\"Build\", dir, string.IsNullOrEmpty(extension) ? Application.productName + \".\" + extension : Application.productName, extension);\r\n                    if(!string.IsNullOrEmpty(path))\r\n                    {\r\n                        return false;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    string possiblePath = this.BuildDirectory;\r\n                    if (!string.IsNullOrEmpty(possiblePath) && possiblePath.StartsWith(\".\")) possiblePath = System.IO.Path.Combine(Application.dataPath, possiblePath);\r\n                    if(!string.IsNullOrEmpty(possiblePath) && System.IO.Directory.Exists(possiblePath))\r\n                    {\r\n                        path = System.IO.Path.Combine(possiblePath, this.GetBuildFileNameWithExtension());\r\n                        path = System.IO.Path.GetFullPath(path);\r\n                    }\r\n                    else\r\n                    {\r\n                        path = EditorUtility.OpenFolderPanel(\"Build\", dir, string.Empty);\r\n                        if (!string.IsNullOrEmpty(path))\r\n                        {\r\n                            path = System.IO.Path.Combine(path, this.GetBuildFileNameWithExtension());\r\n                        }\r\n                        else\r\n                        {\r\n                            return false;\r\n                        }\r\n                    }\r\n                }\r\n\r\n            }\r\n            catch (System.Exception ex)\r\n            {\r\n                Debug.LogException(ex);\r\n                return false;\r\n            }\r\n\r\n            return this.Build(path, option);\r\n        }\r\n\r\n        public virtual bool Build(string path, PostBuildOption option)\r\n        {\r\n            try\r\n            {\r\n                AssetDatabase.SaveAssets();\r\n\r\n                var scenes = this.GetScenePaths();\r\n                var buildGroup = BuildPipeline.GetBuildTargetGroup(this.BuildTarget);\r\n\r\n                //set version\r\n                this.Version.Build++;\r\n                EditorUtility.SetDirty(this);\r\n                PlayerSettings.bundleVersion = this.Version.ToString();\r\n                AssetDatabase.SaveAssets();\r\n                \r\n                //build\r\n                if (!string.IsNullOrEmpty(path))\r\n                {\r\n                    //save last build directory\r\n                    EditorProjectPrefs.Local.SetString(\"LastBuildDirectory\", System.IO.Path.GetDirectoryName(path));\r\n\r\n\r\n                    //do build\r\n                    InputSettings cacheInputs = null;\r\n                    string cacheSymbols = null;\r\n                    Dictionary<BuildSettings.PlayerSettingOverride, object> cachePlayerSettings = null;\r\n\r\n                    if (this.InputSettings != null)\r\n                    {\r\n                        cacheInputs = InputSettings.LoadGlobalInputSettings(false);\r\n                        this.InputSettings.ApplyToGlobal();\r\n                    }\r\n                    if (this.DefineSymbols)\r\n                    {\r\n                        cacheSymbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(buildGroup) ?? string.Empty;\r\n                        PlayerSettings.SetScriptingDefineSymbolsForGroup(buildGroup, this.Symbols);\r\n                    }\r\n\r\n                    if (_playerSettingOverrides.Count > 0)\r\n                    {\r\n                        cachePlayerSettings = new Dictionary<PlayerSettingOverride, object>();\r\n                        foreach(var setting in _playerSettingOverrides)\r\n                        {\r\n                            if (setting.SettingInfo != null)\r\n                            {\r\n                                cachePlayerSettings[setting] = setting.SettingInfo.GetValue(null, null);\r\n                                try\r\n                                {\r\n                                    setting.SettingInfo.SetValue(null, setting.SettingValue, null);\r\n                                }\r\n                                catch(System.Exception)\r\n                                { }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    var report = BuildPipeline.BuildPlayer(scenes, path, this.BuildTarget, this.BuildOptions);\r\n\r\n                    if (cacheInputs != null)\r\n                    {\r\n                        cacheInputs.ApplyToGlobal();\r\n                    }\r\n                    if (cacheSymbols != null)\r\n                    {\r\n                        PlayerSettings.SetScriptingDefineSymbolsForGroup(buildGroup, cacheSymbols);\r\n                    }\r\n                    if(cachePlayerSettings != null)\r\n                    {\r\n                        //loop backwards when resetting from cache\r\n                        for (int i = _playerSettingOverrides.Count - 1; i >= 0; i--)\r\n                        {\r\n                            var setting = _playerSettingOverrides[i];\r\n                            if(setting.SettingInfo != null)\r\n                            {\r\n                                try\r\n                                {\r\n                                    setting.SettingInfo.SetValue(null, cachePlayerSettings[setting], null);\r\n                                }\r\n                                catch(System.Exception)\r\n                                { }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    EditorUtility.SetDirty(this);\r\n                    AssetDatabase.SaveAssets();\r\n\r\n                    if(report != null && report.summary.result == UnityEditor.Build.Reporting.BuildResult.Succeeded)\r\n                    {\r\n                        //save\r\n                        if ((option & PostBuildOption.OpenFolder) != 0)\r\n                        {\r\n                            EditorUtility.RevealInFinder(path);\r\n                        }\r\n                        if ((option & PostBuildOption.Run) != 0)\r\n                        {\r\n                            var proc = new System.Diagnostics.Process();\r\n                            proc.StartInfo.FileName = path;\r\n                            proc.Start();\r\n                        }\r\n\r\n                        return true;\r\n                    }\r\n                    else\r\n                    {\r\n                        return false;\r\n                    }\r\n                }\r\n\r\n            }\r\n            catch (System.Exception ex)\r\n            {\r\n                Debug.LogException(ex);\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Utils\r\n\r\n        [System.Serializable]\r\n        public class PlayerSettingOverride : ISerializationCallbackReceiver\r\n        {\r\n\r\n            [System.NonSerialized]\r\n            private PropertyInfo _settingInfo;\r\n            public PropertyInfo SettingInfo\r\n            {\r\n                get { return _settingInfo; }\r\n                set\r\n                {\r\n                    if (value == null || BuildSettings.IsValidPropertySettingInfo(value))\r\n                        _settingInfo = value;\r\n                    else\r\n                        throw new System.ArgumentException(\"PropertyInfo must be for a static property of the 'PlayerSettings' class.\");\r\n                }\r\n            }\r\n            [System.NonSerialized]\r\n            public object SettingValue;\r\n            \r\n            #region Serialization Interface\r\n\r\n            [SerializeField]\r\n            private string _propertyName;\r\n            [SerializeField]\r\n            private string _serializedValue;\r\n            [SerializeField]\r\n            private UnityEngine.Object _serializedRef;\r\n\r\n            void ISerializationCallbackReceiver.OnAfterDeserialize()\r\n            {\r\n                _settingInfo = null;\r\n                this.SettingValue = null;\r\n                var info = typeof(PlayerSettings).GetProperty(_propertyName, BindingFlags.Static | BindingFlags.Public);\r\n                if (BuildSettings.IsValidPropertySettingInfo(info))\r\n                {\r\n                    var tp = info.PropertyType;\r\n                    if (typeof(UnityEngine.Object).IsAssignableFrom(tp))\r\n                    {\r\n                        _settingInfo = info;\r\n                        this.SettingValue = _serializedRef;\r\n                    }\r\n                    else if (ConvertUtil.IsSupportedType(tp))\r\n                    {\r\n                        _settingInfo = info;\r\n                        this.SettingValue = ConvertUtil.ToPrim(_serializedValue, tp);\r\n                    }\r\n                }\r\n            }\r\n\r\n            void ISerializationCallbackReceiver.OnBeforeSerialize()\r\n            {\r\n                if(BuildSettings.IsValidPropertySettingInfo(_settingInfo))\r\n                {\r\n                    _propertyName = _settingInfo.Name;\r\n                    if(typeof(UnityEngine.Object).IsAssignableFrom(_settingInfo.PropertyType))\r\n                    {\r\n                        _serializedRef = this.SettingValue as UnityEngine.Object;\r\n                        _serializedValue = null;\r\n                    }\r\n                    else\r\n                    {\r\n                        _serializedRef = null;\r\n                        _serializedValue = ConvertUtil.Stringify(this.SettingValue);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    _propertyName = null;\r\n                    _serializedRef = null;\r\n                    _serializedValue = null;\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        public static bool IsValidPropertySettingInfo(PropertyInfo info)\r\n        {\r\n            //is read write\r\n            if (info == null || !info.CanRead || !info.CanWrite) return false;\r\n            //is implemented by PlayerSettings\r\n            if (!info.DeclaringType.IsAssignableFrom(typeof(PlayerSettings))) return false;\r\n            //is supported type\r\n            if (!(typeof(UnityEngine.Object).IsAssignableFrom(info.PropertyType) || ConvertUtil.IsSupportedType(info.PropertyType))) return false;\r\n\r\n            //getter is public and static\r\n            var getter = info.GetGetMethod();\r\n            if (!getter.IsStatic || !getter.IsPublic) return false;\r\n\r\n            //setter is public and static\r\n            var setter = info.GetSetMethod();\r\n            if (!setter.IsStatic || !setter.IsPublic) return false;\r\n\r\n            return true;\r\n        }\r\n\r\n        public static IEnumerable<PropertyInfo> GetOverridablePlayerSettings()\r\n        {\r\n            return (from info in typeof(PlayerSettings).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static)\r\n                    where info != null && info.CanRead && info.CanWrite &&\r\n                          (typeof(UnityEngine.Object).IsAssignableFrom(info.PropertyType) || ConvertUtil.IsSupportedType(info.PropertyType)) &&\r\n                          info.GetGetMethod().IsPublic && info.GetSetMethod().IsPublic\r\n                    select info);\r\n        }\r\n\r\n        public static string GetExtension(BuildTarget target)\r\n        {\r\n            switch (target)\r\n            {\r\n                case BuildTarget.StandaloneWindows:\r\n                case BuildTarget.StandaloneWindows64:\r\n                    return \"exe\";\r\n                case BuildTarget.StandaloneLinux:\r\n                case BuildTarget.StandaloneLinuxUniversal:\r\n                    return \"x86\";\r\n                case BuildTarget.StandaloneLinux64:\r\n                    return \"x86_64\";\r\n                case BuildTarget.StandaloneOSX:\r\n                //case BuildTarget.StandaloneOSXIntel:\r\n                //case BuildTarget.StandaloneOSXIntel64:\r\n                //case BuildTarget.StandaloneOSXUniversal:\r\n                    return \"app\";\r\n                default:\r\n                    return string.Empty;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    [CustomEditor(typeof(BuildSettings), true)]\r\n    public class BuildSettingsEditor : SPEditor\r\n    {\r\n        \r\n        public const string PROP_BUILDFILENAME = \"BuildFileName\";\r\n        public const string PROP_BUILDDIR = \"BuildDirectory\";\r\n        public const string PROP_VERSION = \"Version\";\r\n        public const string PROP_BOOTSCENE = \"_bootScene\";\r\n        public const string PROP_SCENES = \"_scenes\";\r\n        public const string PROP_BUILDTARGET = \"_buildTarget\";\r\n        public const string PROP_BUILDOPTIONS = \"_buildOptions\";\r\n        public const string PROP_INPUTSETTINGS = \"_inputSettings\";\r\n        public const string PROP_DEFINESYMBOLS = \"_defineSymbols\";\r\n        public const string PROP_SYMBOLS = \"_symbols\";\r\n        public const string PROP_PLAYERSETTINGSOVERRIDES = \"_playerSettingOverrides\";\r\n\r\n        #region Fields\r\n\r\n        private com.spacepuppyeditor.Base.ReorderableArrayPropertyDrawer _scenesDrawer = new com.spacepuppyeditor.Base.ReorderableArrayPropertyDrawer(typeof(SceneAsset));\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public com.spacepuppyeditor.Base.ReorderableArrayPropertyDrawer ScenesDrawer\r\n        {\r\n            get { return _scenesDrawer; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _scenesDrawer.FormatElementLabel = (p, i, b1, b2) =>\r\n            {\r\n                return string.Format(\"Scene #{0}\", i + 1);\r\n            };\r\n        }\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n\r\n            var propFileName = this.serializedObject.FindProperty(PROP_BUILDFILENAME);\r\n            EditorGUILayout.PropertyField(propFileName);\r\n            if(!string.IsNullOrEmpty(propFileName.stringValue))\r\n            {\r\n                var propBuildDir = this.serializedObject.FindProperty(PROP_BUILDDIR);\r\n                propBuildDir.stringValue = SPEditorGUILayout.FolderPathTextfield(EditorHelper.TempContent(propBuildDir.displayName, propBuildDir.tooltip), propBuildDir.stringValue, \"Build Directory\");\r\n            }\r\n            \r\n            this.DrawPropertyField(PROP_VERSION);\r\n\r\n            this.DrawScenes();\r\n\r\n            this.DrawBuildOptions();\r\n\r\n            this.DrawInputSettings();\r\n\r\n            this.DrawPlayerSettingOverrides();\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n\r\n            //build button\r\n            if (this.serializedObject.isEditingMultipleObjects) return;\r\n\r\n            EditorGUILayout.Space();\r\n\r\n            this.DrawBuildButtons();\r\n        }\r\n\r\n        public virtual void DrawScenes()\r\n        {\r\n            //this.DrawPropertyField(PROP_BOOTSCENE);\r\n            //this.DrawPropertyField(PROP_SCENES);\r\n\r\n            this.DrawPropertyField(PROP_BOOTSCENE, \"Boot Scene #0\", false);\r\n\r\n            var propScenes = this.serializedObject.FindProperty(PROP_SCENES);\r\n            var lblScenes = EditorHelper.TempContent(propScenes.displayName, propScenes.tooltip);\r\n            var h = _scenesDrawer.GetPropertyHeight(propScenes, lblScenes);\r\n            _scenesDrawer.OnGUI(EditorGUILayout.GetControlRect(true, h), propScenes, lblScenes);\r\n        }\r\n\r\n        public virtual void DrawBuildOptions()\r\n        {\r\n            //TODO - upgrade this to more specialized build options gui\r\n            this.DrawPropertyField(PROP_BUILDTARGET);\r\n            this.DrawPropertyField(PROP_BUILDOPTIONS);\r\n\r\n            var propDefineSymbols = this.serializedObject.FindProperty(PROP_DEFINESYMBOLS);\r\n            SPEditorGUILayout.PropertyField(propDefineSymbols);\r\n            if (propDefineSymbols.boolValue)\r\n            {\r\n                this.DrawPropertyField(PROP_SYMBOLS);\r\n            }\r\n        }\r\n\r\n        public virtual void DrawInputSettings()\r\n        {\r\n            this.DrawPropertyField(PROP_INPUTSETTINGS);\r\n        }\r\n\r\n        public virtual void DrawPlayerSettingOverrides()\r\n        {\r\n            this.DrawPropertyField(PROP_PLAYERSETTINGSOVERRIDES);\r\n        }\r\n\r\n        public virtual void DrawBuildButtons()\r\n        {\r\n            if (GUILayout.Button(\"Build\"))\r\n            {\r\n                EditorCoroutine.StartEditorCoroutine(this.DoBuild(BuildSettings.PostBuildOption.OpenFolder));\r\n            }\r\n            if (GUILayout.Button(\"Build & Run\"))\r\n            {\r\n                EditorCoroutine.StartEditorCoroutine(this.DoBuild(BuildSettings.PostBuildOption.OpenFolderAndRun));\r\n            }\r\n            if (GUILayout.Button(\"Sync To Global Build\"))\r\n            {\r\n                this.SyncToGlobalBuild();\r\n            }\r\n        }\r\n\r\n        protected virtual System.Collections.IEnumerator DoBuild(BuildSettings.PostBuildOption postBuildOption)\r\n        {\r\n            var settings = this.target as BuildSettings;\r\n            if(settings != null)\r\n            {\r\n                settings.Build(postBuildOption);\r\n            }\r\n\r\n            yield break;\r\n        }\r\n\r\n\r\n\r\n        \r\n        public virtual void SyncToGlobalBuild()\r\n        {\r\n            var lst = new List<EditorBuildSettingsScene>();\r\n            var settings = this.target as BuildSettings;\r\n            foreach (var sc in settings.GetScenePaths())\r\n            {\r\n                lst.Add(new EditorBuildSettingsScene(sc, true));\r\n            }\r\n            EditorBuildSettings.scenes = lst.ToArray();\r\n        }\r\n        \r\n        #endregion\r\n        \r\n    }\r\n\r\n    [CustomPropertyDrawer(typeof(BuildSettings.PlayerSettingOverride))]\r\n    internal class PlayerSettingsOverridePropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public const string PROP_NAME = \"_propertyName\";\r\n        public const string PROP_VALUE = \"_serializedValue\";\r\n        public const string PROP_REF = \"_serializedRef\";\r\n\r\n        private static PropertyInfo[] _knownPlayerSettings;\r\n        private static string[] _knownPlayerSettingPropNames;\r\n        private static GUIContent[] _knownPlayerSettingPropNamesPretty;\r\n        static PlayerSettingsOverridePropertyDrawer()\r\n        {\r\n            _knownPlayerSettings = BuildSettings.GetOverridablePlayerSettings().ToArray();\r\n            _knownPlayerSettingPropNames = (from info in _knownPlayerSettings select info.Name).ToArray();\r\n            _knownPlayerSettingPropNamesPretty = (from info in _knownPlayerSettings select new GUIContent(ObjectNames.NicifyVariableName(info.Name))).ToArray();\r\n        }\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            return EditorGUIUtility.singleLineHeight;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var r0 = new Rect(position.xMin, position.yMin, position.width / 2f, position.height);\r\n            var r1 = new Rect(r0.xMax, position.yMin, position.width - r0.width, position.height);\r\n\r\n            var propName = property.FindPropertyRelative(PROP_NAME);\r\n            var propValue = property.FindPropertyRelative(PROP_VALUE);\r\n            var propRef = property.FindPropertyRelative(PROP_REF);\r\n\r\n            int index = System.Array.IndexOf(_knownPlayerSettingPropNames, propName.stringValue);\r\n            EditorGUI.BeginChangeCheck();\r\n            index = EditorGUI.Popup(r0, GUIContent.none, index, _knownPlayerSettingPropNamesPretty);\r\n            if(EditorGUI.EndChangeCheck())\r\n            {\r\n                if (index >= 0 && index < _knownPlayerSettingPropNames.Length)\r\n                    propName.stringValue = _knownPlayerSettingPropNames[index];\r\n                else\r\n                    propName.stringValue = string.Empty;\r\n\r\n                propValue.stringValue = string.Empty;\r\n                propRef.objectReferenceValue = null;\r\n            }\r\n\r\n            if (index < 0 || index >= _knownPlayerSettings.Length) return;\r\n\r\n            var info = _knownPlayerSettings[index];\r\n            if (info.PropertyType.IsEnum)\r\n            {\r\n                int ei = ConvertUtil.ToInt(propValue.stringValue);\r\n                propValue.stringValue = ConvertUtil.ToInt(EditorGUI.EnumPopup(r1, ConvertUtil.ToEnumOfType(info.PropertyType, ei))).ToString();\r\n                propRef.objectReferenceValue = null;\r\n            }\r\n            else\r\n            {\r\n                var etp = VariantReference.GetVariantType(info.PropertyType);\r\n                switch (etp)\r\n                {\r\n                    case VariantType.Null:\r\n                        propValue.stringValue = string.Empty;\r\n                        propRef.objectReferenceValue = null;\r\n                        break;\r\n                    case VariantType.String:\r\n                        propValue.stringValue = EditorGUI.TextField(r1, propValue.stringValue);\r\n                        propRef.objectReferenceValue = null;\r\n                        break;\r\n                    case VariantType.Boolean:\r\n                        propValue.stringValue = ConvertUtil.Stringify(EditorGUI.Toggle(r1, GUIContent.none, ConvertUtil.ToBool(propValue.stringValue)));\r\n                        propRef.objectReferenceValue = null;\r\n                        break;\r\n                    case VariantType.Integer:\r\n                        propValue.stringValue = EditorGUI.IntField(r1, GUIContent.none, ConvertUtil.ToInt(propValue.stringValue)).ToString();\r\n                        propRef.objectReferenceValue = null;\r\n                        break;\r\n                    case VariantType.Float:\r\n                        propValue.stringValue = EditorGUI.FloatField(r1, GUIContent.none, ConvertUtil.ToSingle(propValue.stringValue)).ToString();\r\n                        propRef.objectReferenceValue = null;\r\n                        break;\r\n                    case VariantType.Double:\r\n                        propValue.stringValue = EditorGUI.DoubleField(r1, GUIContent.none, ConvertUtil.ToDouble(propValue.stringValue)).ToString();\r\n                        propRef.objectReferenceValue = null;\r\n                        break;\r\n                    case VariantType.Vector2:\r\n                        propValue.stringValue = ConvertUtil.Stringify(EditorGUI.Vector2Field(r1, GUIContent.none, ConvertUtil.ToVector2(propValue.stringValue)));\r\n                        propRef.objectReferenceValue = null;\r\n                        break;\r\n                    case VariantType.Vector3:\r\n                        propValue.stringValue = ConvertUtil.Stringify(EditorGUI.Vector3Field(r1, GUIContent.none, ConvertUtil.ToVector3(propValue.stringValue)));\r\n                        propRef.objectReferenceValue = null;\r\n                        break;\r\n                    case VariantType.Vector4:\r\n                        propValue.stringValue = ConvertUtil.Stringify(EditorGUI.Vector4Field(r1, (string)null, ConvertUtil.ToVector4(propValue.stringValue)));\r\n                        propRef.objectReferenceValue = null;\r\n                        break;\r\n                    case VariantType.Quaternion:\r\n                        propValue.stringValue = ConvertUtil.Stringify(SPEditorGUI.QuaternionField(r1, GUIContent.none, ConvertUtil.ToQuaternion(propValue.stringValue)));\r\n                        propRef.objectReferenceValue = null;\r\n                        break;\r\n                    case VariantType.Color:\r\n                        propValue.stringValue = ConvertUtil.Stringify(EditorGUI.ColorField(r1, ConvertUtil.ToColor(propValue.stringValue)));\r\n                        propRef.objectReferenceValue = null;\r\n                        break;\r\n                    case VariantType.DateTime:\r\n                        //TODO - should never actually occur\r\n                        propValue.stringValue = string.Empty;\r\n                        propRef.objectReferenceValue = null;\r\n                        break;\r\n                    case VariantType.GameObject:\r\n                    case VariantType.Component:\r\n                    case VariantType.Object:\r\n                        propValue.stringValue = string.Empty;\r\n                        propRef.objectReferenceValue = EditorGUI.ObjectField(r1, GUIContent.none, propValue.objectReferenceValue, info.PropertyType, false);\r\n                        break;\r\n                    case VariantType.LayerMask:\r\n                        propValue.stringValue = SPEditorGUI.LayerMaskField(r1, GUIContent.none, ConvertUtil.ToInt(propValue.stringValue)).ToString();\r\n                        propRef.objectReferenceValue = null;\r\n                        break;\r\n                    case VariantType.Rect:\r\n                        //TODO - should never actually occur\r\n                        propValue.stringValue = string.Empty;\r\n                        propRef.objectReferenceValue = null;\r\n                        break;\r\n                    case VariantType.Numeric:\r\n\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/BulkBuildSettings.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\nusing UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\n\nusing com.spacepuppy;\nusing com.spacepuppyeditor;\n\nnamespace com.spacepuppyeditor\n{\n\n    [CreateAssetMenu(fileName = \"BulkBuildSettings\", menuName = \"Spacepuppy Build Pipeline/Bulk Build Settings\")]\n    public class BulkBuildSettings : ScriptableObject\n    {\n\n        [System.Flags]\n        public enum ScriptOptions\n        {\n            Nothing = 0,\n            Run = 1,\n            CancelIfBuildFails = 2,\n            BlockUntilComplete = 4\n        }\n\n        #region Fields\n\n        [SerializeField]\n        [ReorderableArray]\n        private List<BuildSettings> _builds;\n\n        [SerializeField]\n        [EnumFlags]\n        private ScriptOptions _postBuildScriptRunOptions;\n\n        [SerializeField]\n        [ReorderableArray]\n        private List<string> _postBuildScripts;\n\n        #endregion\n\n        #region Properties\n\n        public List<BuildSettings> Builds\n        {\n            get { return _builds; }\n        }\n\n        public ScriptOptions PostBuildScriptRunOptions\n        {\n            get { return _postBuildScriptRunOptions; }\n            set { _postBuildScriptRunOptions = value; }\n        }\n\n        public List<string> PostBuildScripts\n        {\n            get { return _postBuildScripts; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public System.Collections.IEnumerator BuildRoutine(BuildSettings.PostBuildOption postBuildOption = BuildSettings.PostBuildOption.Nothing)\n        {\n            yield return null;\n\n            bool failed = false;\n            foreach (var settings in _builds)\n            {\n                if (settings != null)\n                {\n                    if (!settings.Build(postBuildOption))\n                    {\n                        failed = true;\n                    }\n                    yield return null;\n                }\n            }\n\n            if ((_postBuildScriptRunOptions & ScriptOptions.Run) == 0) yield break;\n            if ((_postBuildScriptRunOptions & ScriptOptions.CancelIfBuildFails) != 0 && failed) yield break;\n\n            this.RunScripts();\n        }\n\n        private void RunScripts()\n        {\n            foreach (var str in _postBuildScripts)\n            {\n                if (string.IsNullOrEmpty(str)) continue;\n\n                try\n                {\n                    string path = str;\n                    if (path.StartsWith(\".\"))\n                    {\n                        path = System.IO.Path.Combine(Application.dataPath, str);\n                        path = System.IO.Path.GetFullPath(path);\n                    }\n\n                    if (System.IO.File.Exists(path))\n                    {\n                        var proc = new System.Diagnostics.Process();\n                        proc.StartInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(path);\n                        proc.StartInfo.FileName = System.IO.Path.GetFileName(path);\n                        proc.StartInfo.CreateNoWindow = false;\n                        proc.Start();\n\n                        if ((_postBuildScriptRunOptions & ScriptOptions.BlockUntilComplete) != 0)\n                        {\n                            proc.WaitForExit();\n                        }\n                    }\n                }\n                catch (System.Exception ex)\n                {\n                    Debug.LogException(ex);\n                }\n            }\n        }\n\n        #endregion\n\n    }\n\n    [CustomEditor(typeof(BulkBuildSettings))]\n    public class BulkBuildSettingsEditor : SPEditor\n    {\n\n        protected override void OnSPInspectorGUI()\n        {\n            base.OnSPInspectorGUI();\n\n            if (GUILayout.Button(\"Build\"))\n            {\n                if (EditorUtility.DisplayDialog(\"Build?\", \"Confirm that you want to perform a bulk build.\", \"Yes\", \"Cancel\"))\n                {\n                    var settings = this.target as BulkBuildSettings;\n                    if (settings == null) return;\n\n                    EditorCoroutine.StartEditorCoroutine(settings.BuildRoutine());\n                }\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Cameras/CameraControllerInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Cameras.Movement;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Components;\r\n\r\nnamespace com.spacepuppyeditor.Cameras\r\n{\r\n\r\n    [CustomEditor(typeof(CameraMovementController), true)]\r\n    public class CameraControllerInspector : SPEditor\r\n    {\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n            this.DrawDefaultInspectorExcept(\"StartingCameraStyle\");\r\n            this.serializedObject.ApplyModifiedProperties();\r\n\r\n            var targ = this.target as CameraMovementController;\r\n\r\n            var states = this.GetMovementControllerStates();\r\n            var ids = new List<string>();\r\n            ids.Add(\"None\");\r\n            ids.AddRange(DefaultComponentChoiceSelector.GetUniqueComponentNames(states));\r\n\r\n            int i = (targ.StartingCameraStyle != null) ? ids.IndexOf(targ.StartingCameraStyle.GetType().Name) : -1;\r\n            if (i < 0) i = 0;\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            i = EditorGUILayout.Popup(\"Starting Camera Style\", i, ids.ToArray());\r\n            if (EditorGUI.EndChangeCheck())\r\n            {\r\n                if (i <= 0)\r\n                {\r\n                    targ.StartingCameraStyle = null;\r\n                }\r\n                else\r\n                {\r\n                    targ.StartingCameraStyle = states[i - 1] as ICameraMovementControllerState;\r\n                }\r\n\r\n                this.serializedObject.Update();\r\n            }\r\n\r\n\r\n            if(Application.isPlaying)\r\n            {\r\n                try\r\n                {\r\n                    var nm = ids[states.IndexOf(targ.States.Current) + 1];\r\n                    EditorGUILayout.HelpBox(\"Currently active state is '\" + nm + \"'.\", MessageType.Info);\r\n                }\r\n                catch\r\n                {\r\n\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n\r\n        private Component[] GetMovementControllerStates()\r\n        {\r\n            var targ = this.target as CameraMovementController;\r\n            bool allowChildObjects = this.serializedObject.FindProperty(\"_allowStatesAsChildren\").boolValue;\r\n            \r\n            if(allowChildObjects)\r\n            {\r\n                return com.spacepuppy.StateMachine.ParentComponentStateSupplier<ICameraMovementControllerState>.GetComponentsOnTarg(targ.gameObject, true).Cast<Component>().ToArray();\r\n            }\r\n            else\r\n            {\r\n                return com.spacepuppy.StateMachine.ComponentStateSupplier<ICameraMovementControllerState>.GetComponentsOnTarg(targ.gameObject).Cast<Component>().ToArray();\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Cameras/CameraMovementControllerInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Cameras.Movement;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Cameras\r\n{\r\n\r\n    [CustomEditor(typeof(CameraMovementController), true)]\r\n    public class CameraMovementControllerInspector : SPEditor\r\n    {\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n            this.DrawDefaultInspectorExcept(\"_startingCameraStyle\");\r\n            this.serializedObject.ApplyModifiedProperties();\r\n\r\n            var targ = this.target as CameraMovementController;\r\n\r\n            var ids = new List<string>();\r\n            ids.Add(\"None\");\r\n            ids.AddRange(from c in targ.GetComponents<ICameraMovementControllerState>() select c.GetType().Name);\r\n\r\n            int i = (targ.StartingCameraStyle != null) ? ids.IndexOf(targ.StartingCameraStyle.GetType().Name) : -1;\r\n            if (i < 0) i = 0;\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            i = EditorGUILayout.Popup(\"Starting Camera Style\", i, ids.ToArray());\r\n            if (EditorGUI.EndChangeCheck())\r\n            {\r\n                if (i < 0) i = 0;\r\n\r\n                if (i == 0)\r\n                {\r\n                    targ.StartingCameraStyle = null;\r\n                }\r\n                else\r\n                {\r\n                    var id = ids[i];\r\n                    targ.StartingCameraStyle = (from c in targ.GetComponents<ICameraMovementControllerState>() where c.GetType().Name == id select c).FirstOrDefault();\r\n                }\r\n\r\n                this.serializedObject.Update();\r\n            }\r\n\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Cameras/MultiCameraControllerInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Cameras;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Cameras\r\n{\r\n\r\n    [CustomEditor(typeof(MultiCameraController))]\r\n    public class MultiCameraControllerInspector : SPEditor\r\n    {\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n            \r\n            this.DrawDefaultInspectorExcept(\"_defaultCamera\");\r\n\r\n            this.DrawDefaultCameraField();\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n        private void DrawDefaultCameraField()\r\n        {\r\n            var targ = this.target as MultiCameraController;\r\n\r\n            var prop = this.serializedObject.FindProperty(\"_defaultCamera\");\r\n            var cameras = (from c in targ.GetComponentsInChildren<Camera>(true)\r\n                           where c != null && c.IsEnabled()\r\n                           select c).ToArray();\r\n            if(cameras.Length > 0)\r\n            {\r\n                var cameraNames = (from c in cameras select c.name).ToArray();\r\n                int index = (prop.objectReferenceValue != null) ? cameras.IndexOf(prop.objectReferenceValue as Camera) : -1;\r\n                index = EditorGUILayout.Popup(\"Default Camera\", index, cameraNames);\r\n                if (index < 0) index = 0;\r\n                prop.objectReferenceValue = cameras[index];\r\n            }\r\n            else\r\n            {\r\n                EditorGUILayout.Popup(\"Default Camera\", -1, new string[0]);\r\n                prop.objectReferenceValue = null;\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Collections/DictionaryPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Collections\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(DrawableDictionary), true)]\r\n    public class DictionaryPropertyDrawer : PropertyDrawer\r\n    {\r\n        \r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            if(property.isExpanded)\r\n            {\r\n                var keysProp = property.FindPropertyRelative(\"_keys\");\r\n                return (keysProp.arraySize + 2) * (EditorGUIUtility.singleLineHeight + 1f);\r\n            }\r\n            else\r\n            {\r\n                return EditorGUIUtility.singleLineHeight;\r\n            }\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            bool expanded = property.isExpanded;\r\n            var r = GetNextRect(ref position);\r\n            property.isExpanded = EditorGUI.Foldout(r, property.isExpanded, label);\r\n\r\n            if (expanded)\r\n            {\r\n                int lvl = EditorGUI.indentLevel;\r\n                EditorGUI.indentLevel = lvl + 1;\r\n\r\n                var keysProp = property.FindPropertyRelative(\"_keys\");\r\n                var valuesProp = property.FindPropertyRelative(\"_values\");\r\n\r\n                int cnt = keysProp.arraySize;\r\n                if (valuesProp.arraySize != cnt) valuesProp.arraySize = cnt;\r\n\r\n                for(int i = 0; i < cnt; i++)\r\n                {\r\n                    r = GetNextRect(ref position);\r\n                    //r = EditorGUI.IndentedRect(r);\r\n                    var w0 = EditorGUIUtility.labelWidth; // r.width / 2f;\r\n                    var w1 = r.width - w0;\r\n                    var r0 = new Rect(r.xMin, r.yMin, w0, r.height);\r\n                    var r1 = new Rect(r0.xMax, r.yMin, w1, r.height);\r\n\r\n                    var keyProp = keysProp.GetArrayElementAtIndex(i);\r\n                    var valueProp = valuesProp.GetArrayElementAtIndex(i);\r\n\r\n                    this.DrawKey(r0, keyProp);\r\n                    this.DrawValue(r1, valueProp);\r\n                }\r\n\r\n                EditorGUI.indentLevel = lvl;\r\n\r\n                r = GetNextRect(ref position);\r\n                var pRect = new Rect(r.xMax - 60f, r.yMin, 30f, EditorGUIUtility.singleLineHeight);\r\n                var mRect = new Rect(r.xMax - 30f, r.yMin, 30f, EditorGUIUtility.singleLineHeight);\r\n\r\n                if(GUI.Button(pRect, \"+\"))\r\n                {\r\n                    AddKeyElement(keysProp);\r\n                    valuesProp.arraySize = keysProp.arraySize;\r\n                }\r\n                if(GUI.Button(mRect, \"-\"))\r\n                {\r\n                    keysProp.arraySize = Mathf.Max(keysProp.arraySize - 1, 0);\r\n                    valuesProp.arraySize = keysProp.arraySize;\r\n                }\r\n            }\r\n        }\r\n\r\n        protected virtual void DrawKey(Rect area, SerializedProperty keyProp)\r\n        {\r\n#if SP_LIB\r\n            SPEditorGUI.PropertyField(area, keyProp, GUIContent.none, false);\r\n#else\r\n            EditorGUI.PropertyField(area, keyProp, GUIContent.none, false);\r\n#endif\r\n        }\r\n\r\n        protected virtual void DrawValue(Rect area, SerializedProperty valueProp)\r\n        {\r\n#if SP_LIB\r\n            SPEditorGUI.PropertyField(area, valueProp, GUIContent.none, false);\r\n#else\r\n            EditorGUI.PropertyField(area, valueProp, GUIContent.none, false);\r\n#endif\r\n        }\r\n\r\n\r\n\r\n\r\n        private Rect GetNextRect(ref Rect position)\r\n        {\r\n            var r = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n            var h = EditorGUIUtility.singleLineHeight + 1f;\r\n            position = new Rect(position.xMin, position.yMin + h, position.width, position.height = h);\r\n            return r;\r\n        }\r\n\r\n\r\n        private static void AddKeyElement(SerializedProperty keysProp)\r\n        {\r\n            keysProp.arraySize++;\r\n            var prop = keysProp.GetArrayElementAtIndex(keysProp.arraySize - 1);\r\n\r\n            switch (prop.propertyType)\r\n            {\r\n                case SerializedPropertyType.Integer:\r\n                    {\r\n                        int value = 0;\r\n                        for(int i = 0; i < keysProp.arraySize - 1; i++)\r\n                        {\r\n                            if(keysProp.GetArrayElementAtIndex(i).intValue == value)\r\n                            {\r\n                                value++;\r\n                                if (value == int.MaxValue)\r\n                                    break;\r\n                                else\r\n                                    i = -1;\r\n                            }\r\n                        }\r\n                        prop.intValue = value;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Boolean:\r\n                    {\r\n                        bool value = false;\r\n                        for (int i = 0; i < keysProp.arraySize - 1; i++)\r\n                        {\r\n                            if(keysProp.GetArrayElementAtIndex(i).boolValue== value)\r\n                            {\r\n                                value = true;\r\n                                break;\r\n                            }\r\n                        }\r\n                        prop.boolValue = value;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Float:\r\n                    {\r\n                        float value = 0f;\r\n                        for (int i = 0; i < keysProp.arraySize - 1; i++)\r\n                        {\r\n                            if (keysProp.GetArrayElementAtIndex(i).intValue == value)\r\n                            {\r\n                                value++;\r\n                                if (value == int.MaxValue)\r\n                                    break;\r\n                                else\r\n                                    i = -1;\r\n                            }\r\n                        }\r\n                        prop.floatValue = value;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.String:\r\n                    {\r\n                        prop.stringValue = string.Empty;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Color:\r\n                    {\r\n                        Color value = Color.black;\r\n                        for (int i = 0; i < keysProp.arraySize - 1; i++)\r\n                        {\r\n                            if (keysProp.GetArrayElementAtIndex(i).colorValue == value)\r\n                            {\r\n                                value = ConvertUtil.ToColor(ConvertUtil.ToInt(value) + 1);\r\n                                if (value == Color.white)\r\n                                    break;\r\n                                else\r\n                                    i = -1;\r\n                            }\r\n                        }\r\n                        prop.colorValue = value;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.ObjectReference:\r\n                    {\r\n                        prop.objectReferenceValue = null;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.LayerMask:\r\n                    {\r\n                        int value = -1;\r\n                        for (int i = 0; i < keysProp.arraySize - 1; i++)\r\n                        {\r\n                            if (keysProp.GetArrayElementAtIndex(i).intValue == value)\r\n                            {\r\n                                value++;\r\n                                if (value == int.MaxValue)\r\n                                    break;\r\n                                else\r\n                                    i = -1;\r\n                            }\r\n                        }\r\n                        prop.intValue = value;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Enum:\r\n                    {\r\n                        int value = 0;\r\n                        if (keysProp.arraySize > 1)\r\n                        {\r\n                            var first = keysProp.GetArrayElementAtIndex(0);\r\n                            int max = first.enumNames.Length - 1;\r\n\r\n                            for (int i = 0; i < keysProp.arraySize - 1; i++)\r\n                            {\r\n                                if (keysProp.GetArrayElementAtIndex(i).enumValueIndex == value)\r\n                                {\r\n                                    value++;\r\n                                    if (value >= max)\r\n                                        break;\r\n                                    else\r\n                                        i = -1;\r\n                                }\r\n                            }\r\n                        }\r\n                        prop.enumValueIndex = value;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Vector2:\r\n                    {\r\n                        Vector2 value = Vector2.zero;\r\n                        for (int i = 0; i < keysProp.arraySize - 1; i++)\r\n                        {\r\n                            if (keysProp.GetArrayElementAtIndex(i).vector2Value == value)\r\n                            {\r\n                                value.x++;\r\n                                if (value.x == int.MaxValue)\r\n                                    break;\r\n                                else\r\n                                    i = -1;\r\n                            }\r\n                        }\r\n                        prop.vector2Value = value;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Vector3:\r\n                    {\r\n                        Vector3 value = Vector3.zero;\r\n                        for (int i = 0; i < keysProp.arraySize - 1; i++)\r\n                        {\r\n                            if (keysProp.GetArrayElementAtIndex(i).vector3Value == value)\r\n                            {\r\n                                value.x++;\r\n                                if (value.x == int.MaxValue)\r\n                                    break;\r\n                                else\r\n                                    i = -1;\r\n                            }\r\n                        }\r\n                        prop.vector3Value = value;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Vector4:\r\n                    {\r\n                        Vector4 value = Vector4.zero;\r\n                        for (int i = 0; i < keysProp.arraySize - 1; i++)\r\n                        {\r\n                            if (keysProp.GetArrayElementAtIndex(i).vector4Value == value)\r\n                            {\r\n                                value.x++;\r\n                                if (value.x == int.MaxValue)\r\n                                    break;\r\n                                else\r\n                                    i = -1;\r\n                            }\r\n                        }\r\n                        prop.vector4Value = value;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Rect:\r\n                    {\r\n                        prop.rectValue = Rect.zero;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.ArraySize:\r\n                    {\r\n                        int value = 0;\r\n                        for (int i = 0; i < keysProp.arraySize - 1; i++)\r\n                        {\r\n                            if (keysProp.GetArrayElementAtIndex(i).arraySize == value)\r\n                            {\r\n                                value++;\r\n                                if (value == int.MaxValue)\r\n                                    break;\r\n                                else\r\n                                    i = -1;\r\n                            }\r\n                        }\r\n                        prop.arraySize = value;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Character:\r\n                    {\r\n                        int value = 0;\r\n                        for (int i = 0; i < keysProp.arraySize - 1; i++)\r\n                        {\r\n                            if (keysProp.GetArrayElementAtIndex(i).intValue == value)\r\n                            {\r\n                                value++;\r\n                                if (value == char.MaxValue)\r\n                                    break;\r\n                                else\r\n                                    i = -1;\r\n                            }\r\n                        }\r\n                        prop.intValue = value;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.AnimationCurve:\r\n                    {\r\n                        prop.animationCurveValue = null;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Bounds:\r\n                    {\r\n                        prop.boundsValue = default(Bounds);\r\n                    }\r\n                    break;\r\n                default:\r\n                    throw new System.InvalidOperationException(\"Can not handle Type as key.\");\r\n            }\r\n        }\r\n\r\n        private static void SetPropertyDefault(SerializedProperty prop)\r\n        {\r\n            if (prop == null) throw new System.ArgumentNullException(\"prop\");\r\n\r\n            switch (prop.propertyType)\r\n            {\r\n                case SerializedPropertyType.Integer:\r\n                    prop.intValue = 0;\r\n                    break;\r\n                case SerializedPropertyType.Boolean:\r\n                    prop.boolValue = false;\r\n                    break;\r\n                case SerializedPropertyType.Float:\r\n                    prop.floatValue = 0f;\r\n                    break;\r\n                case SerializedPropertyType.String:\r\n                    prop.stringValue = string.Empty;\r\n                    break;\r\n                case SerializedPropertyType.Color:\r\n                    prop.colorValue = Color.black;\r\n                    break;\r\n                case SerializedPropertyType.ObjectReference:\r\n                    prop.objectReferenceValue = null;\r\n                    break;\r\n                case SerializedPropertyType.LayerMask:\r\n                    prop.intValue = -1;\r\n                    break;\r\n                case SerializedPropertyType.Enum:\r\n                    prop.enumValueIndex = 0;\r\n                    break;\r\n                case SerializedPropertyType.Vector2:\r\n                    prop.vector2Value = Vector2.zero;\r\n                    break;\r\n                case SerializedPropertyType.Vector3:\r\n                    prop.vector3Value = Vector3.zero;\r\n                    break;\r\n                case SerializedPropertyType.Vector4:\r\n                    prop.vector4Value = Vector4.zero;\r\n                    break;\r\n                case SerializedPropertyType.Rect:\r\n                    prop.rectValue = Rect.zero;\r\n                    break;\r\n                case SerializedPropertyType.ArraySize:\r\n                    prop.arraySize = 0;\r\n                    break;\r\n                case SerializedPropertyType.Character:\r\n                    prop.intValue = 0;\r\n                    break;\r\n                case SerializedPropertyType.AnimationCurve:\r\n                    prop.animationCurveValue = null;\r\n                    break;\r\n                case SerializedPropertyType.Bounds:\r\n                    prop.boundsValue = default(Bounds);\r\n                    break;\r\n                case SerializedPropertyType.Gradient:\r\n                    throw new System.InvalidOperationException(\"Can not handle Gradient types.\");\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Collections/EnumKeyedCollectionPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\n\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Collections\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(DrawableEnumKeyedCollection), true)]\r\n    public class EnumKeyedCollectionPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public const string PROP_VALUES = \"_values\";\r\n\r\n\r\n        public PropertyDrawer OverridePropertyDrawer;\r\n\r\n        private bool _unsafe;\r\n        private ReorderableList _lst;\r\n        private GUIContent _label;\r\n        private System.Array _keys;\r\n\r\n\r\n\r\n        public EnumKeyedCollectionPropertyDrawer()\r\n        {\r\n\r\n        }\r\n\r\n        public EnumKeyedCollectionPropertyDrawer(bool unsafeUse)\r\n        {\r\n            if(unsafeUse)\r\n            {\r\n                _unsafe = true;\r\n            }\r\n        }\r\n\r\n\r\n        public ReorderableList UnsafeList { get { return _lst; } }\r\n\r\n        public object GetKeyAt(int index)\r\n        {\r\n            return _keys.GetValue(index);\r\n        }\r\n\r\n        private void BeginProperty(SerializedProperty property, GUIContent label)\r\n        {\r\n            var valuesProp = property.FindPropertyRelative(PROP_VALUES);\r\n\r\n            _label = label;\r\n\r\n            _lst = CachedReorderableList.GetListDrawer(valuesProp, _lst_DrawHeader, _lst_DrawElement);\r\n            _lst.displayAdd = false;\r\n            _lst.displayRemove = false;\r\n            _lst.draggable = false;\r\n\r\n            if (valuesProp.arraySize > 0)\r\n            {\r\n                var el = valuesProp.GetArrayElementAtIndex(0);\r\n                if (OverridePropertyDrawer != null)\r\n                    _lst.elementHeight = OverridePropertyDrawer.GetPropertyHeight(el, GUIContent.none);\r\n                else\r\n                    _lst.elementHeight = SPEditorGUI.GetPropertyHeight(el);\r\n            }\r\n            else\r\n            {\r\n                _lst.elementHeight = EditorGUIUtility.singleLineHeight;\r\n            }\r\n        }\r\n\r\n        private void EndProperty()\r\n        {\r\n            _label = null;\r\n            if(!_unsafe)\r\n                _lst = null;\r\n        }\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            float h;\r\n            if (EditorHelper.AssertMultiObjectEditingNotSupportedHeight(property, label, out h)) return h;\r\n\r\n            if (property.isExpanded)\r\n            {\r\n                this.BeginProperty(property, label);\r\n                h = _lst.GetHeight();\r\n                this.EndProperty();\r\n                return h;\r\n            }\r\n            else\r\n            {\r\n                return EditorGUIUtility.singleLineHeight;\r\n            }\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            if (EditorHelper.AssertMultiObjectEditingNotSupported(position, property, label)) return;\r\n\r\n            property.isExpanded = EditorGUI.Foldout(new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight), property.isExpanded, GUIContent.none);\r\n\r\n            if (property.isExpanded)\r\n            {\r\n                _keys = GetKeys(property);\r\n                if (_keys == null)\r\n                {\r\n                    EditorGUI.LabelField(position, \"Failed to determine enum key type.\");\r\n                    return;\r\n                }\r\n\r\n                var valuesProp = property.FindPropertyRelative(PROP_VALUES);\r\n                if (valuesProp.arraySize != _keys.Length) valuesProp.arraySize = _keys.Length;\r\n\r\n                this.BeginProperty(property, label);\r\n                _lst.DoList(position);\r\n                this.EndProperty();\r\n            }\r\n            else\r\n            {\r\n                ReorderableListHelper.DrawRetractedHeader(position, label);\r\n            }\r\n        }\r\n\r\n\r\n\r\n        #region Masks ReorderableList Handlers\r\n\r\n        private void _lst_DrawHeader(Rect area)\r\n        {\r\n            EditorGUI.LabelField(area, _label);\r\n        }\r\n\r\n        private void _lst_DrawElement(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            string id = System.Convert.ToString(_keys.GetValue(index));\r\n            var el = _lst.serializedProperty.GetArrayElementAtIndex(index);\r\n\r\n            if (this.OverridePropertyDrawer != null)\r\n                this.OverridePropertyDrawer.OnGUI(area, el, EditorHelper.TempContent(id));\r\n            else\r\n                SPEditorGUI.PropertyField(area, el, EditorHelper.TempContent(id));\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Static Utils\r\n\r\n        private static System.Array GetKeys(SerializedProperty property)\r\n        {\r\n            var targ = EditorHelper.GetTargetObjectOfProperty(property);\r\n            if (targ == null)\r\n                return null;\r\n\r\n            var tp = targ.GetType();\r\n            var ptp = typeof(DrawableEnumKeyedCollection);\r\n            while(tp != null && tp.BaseType != ptp)\r\n            {\r\n                tp = tp.BaseType;\r\n            }\r\n\r\n            if (tp == null)\r\n                return null;\r\n\r\n            tp = tp.GetGenericArguments().FirstOrDefault();\r\n            if (tp == null || !tp.IsEnum)\r\n                return null;\r\n\r\n            var arr = System.Enum.GetValues(tp);\r\n            System.Array.Sort(arr);\r\n            return arr;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/ComponentHeaderDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n    public class ComponentHeaderDrawer : GUIDrawer\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private ComponentHeaderAttribute _attribute;\r\n        private System.Type _componentType;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        internal void Init(ComponentHeaderAttribute attrib, System.Type compType)\r\n        {\r\n            _attribute = attrib;\r\n            _componentType = compType;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ComponentHeaderAttribute Attribute { get { return _attribute; } }\r\n\r\n        public System.Type ComponentType { get { return _componentType; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public virtual float GetHeight(SerializedObject serializedObject)\r\n        {\r\n            return 0f;\r\n        }\r\n\r\n        public virtual void OnGUI(Rect position, SerializedObject serializedObject)\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Components/IComponentChoiceSelector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Components\r\n{\r\n    public interface IComponentChoiceSelector\r\n    {\r\n\r\n        void BeforeGUI(SelectableComponentPropertyDrawer drawer, SerializedProperty property, System.Type restrictionType, bool allowProxy);\r\n\r\n        Component[] GetComponents();\r\n        GUIContent[] GetPopupEntries();\r\n        int GetPopupIndexOfComponent(Component comp);\r\n        Component GetComponentAtPopupIndex(int index);\r\n\r\n        void GUIComplete(SerializedProperty property, int selectedIndex);\r\n\r\n    }\r\n\r\n    public class DefaultComponentChoiceSelector : IComponentChoiceSelector\r\n    {\r\n\r\n        private SelectableComponentPropertyDrawer _drawer;\r\n        private SerializedProperty _property;\r\n        private System.Type _restrictionType;\r\n        private bool _allowProxy;\r\n        private Component[] _components;\r\n\r\n        public SelectableComponentPropertyDrawer Drawer { get { return _drawer; } }\r\n        public SerializedProperty Property { get { return _property; } }\r\n        public System.Type RestrictionType { get { return _restrictionType; } }\r\n        public bool AllowProxy { get { return _allowProxy; } }\r\n        public Component[] Components { get { return _components; } }\r\n\r\n\r\n\r\n        protected virtual Component[] DoGetComponents()\r\n        {\r\n            return GetComponentsFromSerializedProperty(_property, _restrictionType, _drawer.ForceOnlySelf, _drawer.SearchChildren, _allowProxy);\r\n        }\r\n\r\n        protected virtual void OnBeforeGUI()\r\n        {\r\n\r\n        }\r\n\r\n        protected virtual void OnGUIComplete(int selectedIndex)\r\n        {\r\n\r\n        }\r\n\r\n        #region IComponentChoiceSelector Interface\r\n\r\n        void IComponentChoiceSelector.BeforeGUI(SelectableComponentPropertyDrawer drawer, SerializedProperty property, System.Type restrictionType, bool allowProxy)\r\n        {\r\n            _drawer = drawer;\r\n            _property = property;\r\n            _restrictionType = restrictionType;\r\n            _allowProxy = allowProxy;\r\n            _components = this.DoGetComponents();\r\n            this.OnBeforeGUI();\r\n        }\r\n\r\n        Component[] IComponentChoiceSelector.GetComponents()\r\n        {\r\n            return _components;\r\n        }\r\n\r\n        public virtual GUIContent[] GetPopupEntries()\r\n        {\r\n            //return (from c in components select new GUIContent(c.GetType().Name)).ToArray();\r\n            using (var lst = com.spacepuppy.Collections.TempCollection.GetList<GUIContent>())\r\n            {\r\n                lst.Add(new GUIContent(\"Nothing...\"));\r\n                if (_drawer.SearchChildren)\r\n                {\r\n                    lst.AddRange(from s in DefaultComponentChoiceSelector.GetUniqueComponentNamesWithOwner(_components) select new GUIContent(s));\r\n                }\r\n                else\r\n                {\r\n                    lst.AddRange(from s in DefaultComponentChoiceSelector.GetUniqueComponentNames(_components) select new GUIContent(s));\r\n                }\r\n                return lst.ToArray();\r\n            }\r\n        }\r\n\r\n        public virtual int GetPopupIndexOfComponent(Component comp)\r\n        {\r\n            if (_components == null) return -1;\r\n            return _components.IndexOf(comp) + 1; //adjust for Nothing...\r\n        }\r\n\r\n        public virtual Component GetComponentAtPopupIndex(int index)\r\n        {\r\n            if (_components == null) return null;\r\n            if (index == 0) return null;\r\n            index--; //adjust for Nothing...\r\n            if (index < 0 || index >= _components.Length) return null;\r\n            return _components[index];\r\n        }\r\n\r\n        void IComponentChoiceSelector.GUIComplete(SerializedProperty property, int selectedIndex)\r\n        {\r\n            this.OnGUIComplete(selectedIndex);\r\n            _property = null;\r\n            _restrictionType = null;\r\n            _components = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        public static GameObject GetGameObjectFromSource(SerializedProperty property, bool forceSelfOnly)\r\n        {\r\n            if (forceSelfOnly)\r\n                return GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n            else\r\n                return GameObjectUtil.GetGameObjectFromSource(property.objectReferenceValue);\r\n        }\r\n\r\n        public static Component[] GetComponentsFromSerializedProperty(SerializedProperty property, System.Type restrictionType, bool forceSelfOnly, bool searchChildren, bool allowProxy)\r\n        {\r\n            if (!ComponentUtil.IsAcceptableComponentType(restrictionType))\r\n                return ArrayUtil.Empty<Component>();\r\n\r\n            var go = GetGameObjectFromSource(property, forceSelfOnly);\r\n            if (go == null) return ArrayUtil.Empty<Component>();\r\n\r\n            if(allowProxy)\r\n            {\r\n                if (searchChildren)\r\n                    return (from c in go.GetComponentsInChildren<Component>() where c != null && ObjUtil.IsType(c, restrictionType, allowProxy) select c).ToArray();\r\n                else\r\n                    return (from c in go.GetComponents<Component>() where c != null && ObjUtil.IsType(c, restrictionType, allowProxy) select c).ToArray();\r\n            }\r\n            else\r\n            {\r\n                if (searchChildren)\r\n                    return go.GetComponentsInChildren(restrictionType);\r\n                else\r\n                    return go.GetComponents(restrictionType);\r\n            }\r\n        }\r\n        \r\n        private static Dictionary<System.Type, int> _uniqueCount = new Dictionary<System.Type, int>();\r\n        public static IEnumerable<string> GetUniqueComponentNames(Component[] components)\r\n        {\r\n            _uniqueCount.Clear();\r\n            for (int i = 0; i < components.Length; i++)\r\n            {\r\n                //var tp = components[i].GetType();\r\n                //if (_uniqueCount.ContainsKey(tp))\r\n                //{\r\n                //    _uniqueCount[tp]++;\r\n                //    yield return tp.Name + \" \" + _uniqueCount[tp].ToString();\r\n                //}\r\n                //else\r\n                //{\r\n                //    _uniqueCount.Add(tp, 1);\r\n                //    yield return tp.Name;\r\n                //}\r\n\r\n                if (components[i] == null) continue;\r\n\r\n                var tp = components[i].GetType();\r\n                if (_uniqueCount.ContainsKey(tp))\r\n                {\r\n                    _uniqueCount[tp]++;\r\n                    yield return string.Format(\"{0} ({1} {2})\", components[i].gameObject.name, tp.Name, _uniqueCount[tp]);\r\n                }\r\n                else\r\n                {\r\n                    _uniqueCount.Add(tp, 1);\r\n                    yield return string.Format(\"{0} ({1})\", components[i].gameObject.name, tp.Name);\r\n                }\r\n\r\n            }\r\n            _uniqueCount.Clear();\r\n        }\r\n\r\n        public static IEnumerable<string> GetUniqueComponentNamesWithOwner(Component[] components)\r\n        {\r\n            _uniqueCount.Clear();\r\n            for (int i = 0; i < components.Length; i++)\r\n            {\r\n                //TODO - maybe come up with a better naming scheme for this\r\n                var tp = components[i].GetType();\r\n                if (_uniqueCount.ContainsKey(tp))\r\n                {\r\n                    _uniqueCount[tp]++;\r\n                    yield return components[i].gameObject.name + \"/\" + tp.Name + \" \" + _uniqueCount[tp].ToString();\r\n                }\r\n                else\r\n                {\r\n                    _uniqueCount.Add(tp, 1);\r\n                    yield return components[i].gameObject.name + \"/\" + tp.Name;\r\n                }\r\n            }\r\n            _uniqueCount.Clear();\r\n        }\r\n\r\n    }\r\n\r\n    public class MultiTypeComponentChoiceSelector : DefaultComponentChoiceSelector\r\n    {\r\n\r\n        public System.Type[] AllowedTypes;\r\n\r\n        protected override Component[] DoGetComponents()\r\n        {\r\n            return GetComponentsFromSerializedProperty(this.Property, this.AllowedTypes, this.RestrictionType, this.Drawer.ForceOnlySelf, this.Drawer.SearchChildren, this.AllowProxy);\r\n        }\r\n        \r\n        public static Component[] GetComponentsFromSerializedProperty(SerializedProperty property, System.Type[] allowedTypes, System.Type restrictionType, bool forceSelfOnly, bool searchChildren, bool allowProxy)\r\n        {\r\n            if (allowedTypes == null || allowedTypes.Length == 0) return ArrayUtil.Empty<Component>();\r\n\r\n            var go = DefaultComponentChoiceSelector.GetGameObjectFromSource(property, forceSelfOnly);\r\n            if (go == null) return ArrayUtil.Empty<Component>();\r\n\r\n            using (var set = com.spacepuppy.Collections.TempCollection.GetSet<Component>())\r\n            {\r\n                if (searchChildren)\r\n                {\r\n                    foreach (var c in go.GetComponentsInChildren<Component>())\r\n                    {\r\n                        if (!ObjUtil.IsType(c, restrictionType, allowProxy)) continue;\r\n                        foreach (var tp in allowedTypes)\r\n                        {\r\n                            if (ObjUtil.IsType(c, tp, allowProxy)) set.Add(c);\r\n                        }\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    foreach (var c in go.GetComponents<Component>())\r\n                    {\r\n                        if (!ObjUtil.IsType(c, restrictionType, allowProxy)) continue;\r\n                        foreach (var tp in allowedTypes)\r\n                        {\r\n                            if (ObjUtil.IsType(c, tp, allowProxy)) set.Add(c);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                return (from c in set orderby c.GetType().Name select c).ToArray();\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Components/SelectableComponentPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Components\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(SelectableComponentAttribute))]\r\n    public class SelectableComponentPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        #region Fields\r\n\r\n        public const float DEFAULT_POPUP_WIDTH_SCALE = 0.4f;\r\n\r\n        public bool AllowSceneObjects = true;\r\n        public bool ForceOnlySelf;\r\n        public bool SearchChildren;\r\n        public bool AllowProxy;\r\n        public bool ShowXButton = true;\r\n        public bool XButtonOnRightSide = true;\r\n        public IComponentChoiceSelector ChoiceSelector;\r\n\r\n        /// <summary>\r\n        /// SelectableComponentPropertyDrawer will allow drawing an Object field that will only go into 'Component Select' mode if the object is a Component source.\r\n        /// Otherwise it just remains a simple object field.\r\n        /// </summary>\r\n        public bool AllowNonComponents;\r\n        \r\n        private System.Type _restrictionType;\r\n\r\n        public System.Type RestrictionType\r\n        {\r\n            get\r\n            {\r\n                if (_restrictionType == null)\r\n                {\r\n                    //return typeof(Component);\r\n                    //needs to be this so that it works with VariantReference and allows all types\r\n                    return this.AllowNonComponents ? typeof(UnityEngine.Object) : typeof(Component);\r\n                }\r\n                else\r\n                    return _restrictionType;\r\n            }\r\n            set\r\n            {\r\n                _restrictionType = value;\r\n            }\r\n        }\r\n\r\n        public System.Type ComponentRestrictionType\r\n        {\r\n            get\r\n            {\r\n                return (ComponentUtil.IsAcceptableComponentType(this.RestrictionType)) ? this.RestrictionType : typeof(Component);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private void Init()\r\n        {\r\n            if (this.fieldInfo != null)\r\n            {\r\n                var tp = this.fieldInfo.FieldType;\r\n                if (tp.IsListType()) tp = tp.GetElementTypeOfListType();\r\n                if (_restrictionType == null)\r\n                    _restrictionType = tp;\r\n            }\r\n\r\n            if (this.attribute != null && this.attribute is SelectableComponentAttribute)\r\n            {\r\n                //created as part as a PropertyHandler\r\n                var attrib = (this.attribute as SelectableComponentAttribute);\r\n                this.AllowSceneObjects = attrib.AllowSceneObjects;\r\n                this.ForceOnlySelf = attrib.ForceOnlySelf;\r\n                this.SearchChildren = attrib.SearchChildren;\r\n                this.AllowProxy = attrib.AllowProxy;\r\n                if (attrib.InheritsFromType != null) this.RestrictionType = attrib.InheritsFromType;\r\n            }\r\n\r\n            if (this.ChoiceSelector == null)\r\n            {\r\n                this.ChoiceSelector = new DefaultComponentChoiceSelector();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            return EditorGUIUtility.singleLineHeight;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            position = EditorGUI.PrefixLabel(position, label);\r\n\r\n            this.OnGUI(position, property);\r\n        }\r\n\r\n        public void OnGUI(Rect position, SerializedProperty property)\r\n        {\r\n            //if (property.propertyType != SerializedPropertyType.ObjectReference || !TypeUtil.IsType(_restrictionType, typeof(Component), typeof(IComponent)))\r\n            if (property.propertyType != SerializedPropertyType.ObjectReference || (!this.AllowNonComponents && !ComponentUtil.IsAcceptableComponentType(this.RestrictionType)))\r\n            {\r\n                this.DrawAsMismatchedAttribute(position, property);\r\n                return;\r\n            }\r\n\r\n            this.Init();\r\n\r\n            GameObject targGo;\r\n            if (this.ForceOnlySelf)\r\n            {\r\n                targGo = GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n                if (targGo == null)\r\n                {\r\n                    this.DrawAsMismatchedAttribute(position, property);\r\n                    return;\r\n                }\r\n\r\n                if (property.objectReferenceValue == null)\r\n                {\r\n                    property.objectReferenceValue = this.GetTargetFromSource(targGo);\r\n                }\r\n            }\r\n\r\n            targGo = GameObjectUtil.GetGameObjectFromSource(property.objectReferenceValue);\r\n            if (property.objectReferenceValue == null)\r\n            {\r\n                //SPEditorGUI.DefaultPropertyField(position, property, label);\r\n                if(!this.ForceOnlySelf)\r\n                    this.DrawObjectRefField(position, property);\r\n                else\r\n                {\r\n                    EditorGUI.LabelField(position, \"Malformed serializable field.\");\r\n                }\r\n            }\r\n            else if(this.AllowNonComponents)\r\n            {\r\n                if(targGo == null)\r\n                {\r\n                    this.DrawObjectRefField(position, property);\r\n                }\r\n                else\r\n                {\r\n                    this.ChoiceSelector.BeforeGUI(this, property, this.ComponentRestrictionType, this.AllowProxy);\r\n                    var components = this.ChoiceSelector.GetComponents();\r\n\r\n                    var fullsize = position;\r\n                    if (components.Length == 0 ||\r\n                        (this.ShowXButton && SPEditorGUI.XButton(ref position, \"Clear Selected Object\", this.XButtonOnRightSide)))\r\n                    {\r\n                        property.objectReferenceValue = null;\r\n                        fullsize = this.DrawDotDotButton(fullsize, property);\r\n                        this.DrawObjectRefField(fullsize, property);\r\n\r\n                        this.ChoiceSelector.GUIComplete(property, -1);\r\n                    }\r\n                    else\r\n                    {\r\n                        position = this.DrawDotDotButton(position, property);\r\n                        var names = this.ChoiceSelector.GetPopupEntries();\r\n                        System.Array.Resize(ref names, names.Length + 1);\r\n                        names[names.Length - 1] = EditorHelper.TempContent(targGo.name + \" (...GameObject)\");\r\n\r\n                        int oi = (property.objectReferenceValue is GameObject) ? names.Length - 1 : this.ChoiceSelector.GetPopupIndexOfComponent(property.objectReferenceValue as Component);\r\n                        int ni = EditorGUI.Popup(position, oi, names);\r\n                        \r\n                        if (oi != ni)\r\n                        {\r\n                            if (ni == names.Length - 1)\r\n                                property.objectReferenceValue = targGo;\r\n                            else\r\n                                property.objectReferenceValue = this.ChoiceSelector.GetComponentAtPopupIndex(ni);\r\n\r\n                            //if (ni < components.Length)\r\n                            //    property.objectReferenceValue = this.ChoiceSelector.GetComponentAtPopupIndex(ni);\r\n                            //else\r\n                            //    property.objectReferenceValue = targGo;\r\n                        }\r\n\r\n                        this.ChoiceSelector.GUIComplete(property, ni);\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                this.ChoiceSelector.BeforeGUI(this, property, this.ComponentRestrictionType, this.AllowProxy);\r\n                var components = this.ChoiceSelector.GetComponents();\r\n\r\n                var fullsize = position;\r\n                if (components.Length == 0 || \r\n                    (this.ShowXButton && SPEditorGUI.XButton(ref position, \"Clear Selected Object\", this.XButtonOnRightSide)))\r\n                {\r\n                    property.objectReferenceValue = null;\r\n                    fullsize = this.DrawDotDotButton(fullsize, property);\r\n                    this.DrawObjectRefField(fullsize, property);\r\n\r\n                    this.ChoiceSelector.GUIComplete(property, -1);\r\n                }\r\n                else\r\n                {\r\n                    position = this.DrawDotDotButton(position, property);\r\n                    var names = this.ChoiceSelector.GetPopupEntries();\r\n                    int oi = this.ChoiceSelector.GetPopupIndexOfComponent(property.objectReferenceValue as Component);\r\n                    int ni = EditorGUI.Popup(position, oi, names);\r\n                    if (oi != ni) property.objectReferenceValue = this.ChoiceSelector.GetComponentAtPopupIndex(ni);\r\n\r\n                    this.ChoiceSelector.GUIComplete(property, ni);\r\n                }\r\n\r\n            }\r\n        }\r\n\r\n        private Rect DrawDotDotButton(Rect position, SerializedProperty property)\r\n        {\r\n            var w = Mathf.Min(SPEditorGUI.X_BTN_WIDTH, position.width);\r\n            Rect r = new Rect(position.xMax - w, position.yMin, w, EditorGUIUtility.singleLineHeight);\r\n            position = new Rect(position.xMin, position.yMin, position.width - w, position.height);\r\n\r\n            if(GUI.Button(r, EditorHelper.TempContent(\"...\")))\r\n            {\r\n                EditorGUIUtility.PingObject(property.objectReferenceValue);\r\n            }\r\n\r\n            return position;\r\n        }\r\n\r\n        private void DrawObjectRefField(Rect position, SerializedProperty property)\r\n        {\r\n            if (ComponentUtil.IsAcceptableComponentType(this.RestrictionType))\r\n            {\r\n                //var fieldObjType = (!this.SearchChildren && !this.AllowProxy && TypeUtil.IsType(this.RestrictionType, typeof(UnityEngine.Component))) ? this.RestrictionType : typeof(UnityEngine.GameObject);\r\n                System.Type fieldObjType;\r\n                if (this.AllowProxy)\r\n                    fieldObjType = typeof(UnityEngine.Object);\r\n                else if (!this.SearchChildren && TypeUtil.IsType(this.RestrictionType, typeof(UnityEngine.Component)))\r\n                    fieldObjType = this.RestrictionType;\r\n                else\r\n                    fieldObjType = typeof(UnityEngine.GameObject);\r\n\r\n                var obj = EditorGUI.ObjectField(position, property.objectReferenceValue, fieldObjType, this.AllowSceneObjects);\r\n                if(this.ForceOnlySelf)\r\n                {\r\n                    var targGo = GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n                    var ngo = GameObjectUtil.GetGameObjectFromSource(obj);\r\n                    if(targGo == ngo ||\r\n                       (this.SearchChildren && targGo.IsParentOf(ngo)))\r\n                    {\r\n                        property.objectReferenceValue = this.GetTargetFromSource(obj);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    property.objectReferenceValue = this.GetTargetFromSource(obj);\r\n                }\r\n            }\r\n            else if (this.AllowNonComponents)\r\n            {\r\n                var fieldObjType = (!this.AllowProxy && TypeUtil.IsType(this.RestrictionType, typeof(UnityEngine.Object))) ? this.RestrictionType : typeof(UnityEngine.Object);\r\n                var obj = EditorGUI.ObjectField(position, property.objectReferenceValue, fieldObjType, this.AllowSceneObjects);\r\n                if(this.ForceOnlySelf)\r\n                {\r\n                    var targGo = GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n                    var ngo = GameObjectUtil.GetGameObjectFromSource(obj);\r\n                    if (targGo == ngo ||\r\n                       (this.SearchChildren && targGo.IsParentOf(ngo)))\r\n                    {\r\n                        property.objectReferenceValue = this.GetTargetFromSource(obj);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    property.objectReferenceValue = this.GetTargetFromSource(obj);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var ogo = GameObjectUtil.GetGameObjectFromSource(property.objectReferenceValue);\r\n                var ngo = EditorGUI.ObjectField(position, ogo, typeof(GameObject), this.AllowSceneObjects) as GameObject;\r\n                if (ogo != ngo)\r\n                {\r\n                    if(this.ForceOnlySelf)\r\n                    {\r\n                        var targGo = GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n                        if (targGo == ngo ||\r\n                            (this.SearchChildren && targGo.IsParentOf(ngo)))\r\n                        {\r\n                            property.objectReferenceValue = this.GetTargetFromSource(ngo);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        property.objectReferenceValue = this.GetTargetFromSource(ngo);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        private UnityEngine.Object GetTargetFromSource(UnityEngine.Object obj)\r\n        {\r\n            if (obj == null) return null;\r\n            if (ObjUtil.IsType(obj, this.RestrictionType)) return obj;\r\n            if (this.AllowProxy && obj is IProxy) return obj;\r\n\r\n            var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n            var o = ObjUtil.GetAsFromSource(this.RestrictionType, obj) as UnityEngine.Object;\r\n\r\n            if(this.SearchChildren && o == null && go != null)\r\n                o = go.GetComponentInChildren(this.RestrictionType);\r\n\r\n            if(this.AllowProxy && o == null && go != null)\r\n            {\r\n                if (this.SearchChildren)\r\n                    o = go.GetComponentInChildren<IProxy>() as Component;\r\n                else\r\n                    o = go.GetComponent<IProxy>() as Component;\r\n            }\r\n\r\n            return o;\r\n        }\r\n\r\n\r\n        private void DrawAsMismatchedAttribute(Rect position, SerializedProperty property)\r\n        {\r\n            EditorGUI.LabelField(position, EditorHelper.TempContent(\"Mismatched type of PropertyDrawer attribute with field.\"));\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Components/SelectableObjectPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Components\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(SelectableObjectAttribute))]\r\n    public class SelectableObjectPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private SelectableComponentPropertyDrawer _compPropDrawer = new SelectableComponentPropertyDrawer()\r\n        {\r\n            AllowNonComponents = true\r\n        };\r\n\r\n        private bool _allowSceneObjects = true;\r\n        private System.Type _inheritsFromType;\r\n        private bool _allowProxy;\r\n        private bool _manuallyConfigured;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public SelectableObjectPropertyDrawer()\r\n        {\r\n\r\n        }\r\n\r\n        public SelectableObjectPropertyDrawer(bool allowSceneObjects, System.Type inheritsFromType, bool allowProxy)\r\n        {\r\n            this.AllowSceneObjects = allowSceneObjects;\r\n            this.InheritsFromType = inheritsFromType;\r\n            this.AllowProxy = allowProxy;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool AllowSceneObjects\r\n        {\r\n            get { return _allowSceneObjects; }\r\n            set\r\n            {\r\n                _allowSceneObjects = value;\r\n                _manuallyConfigured = true;\r\n            }\r\n        }\r\n\r\n        public System.Type InheritsFromType\r\n        {\r\n            get { return _inheritsFromType; }\r\n            set\r\n            {\r\n                _inheritsFromType = value;\r\n                _manuallyConfigured = true;\r\n            }\r\n        }\r\n\r\n        public bool AllowProxy\r\n        {\r\n            get { return _allowProxy; }\r\n            set\r\n            {\r\n                _allowProxy = value;\r\n                _manuallyConfigured = true;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            if (property.propertyType != SerializedPropertyType.ObjectReference) return EditorGUIUtility.singleLineHeight;\r\n\r\n            return _compPropDrawer.GetPropertyHeight(property, label);\r\n        }\r\n\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            if (property.propertyType != SerializedPropertyType.ObjectReference)\r\n            {\r\n                this.DrawAsMismatchedAttribute(position, property);\r\n                return;\r\n            }\r\n\r\n            this.InitOnGUI();\r\n            _compPropDrawer.AllowSceneObjects = _allowSceneObjects;\r\n            _compPropDrawer.RestrictionType = _inheritsFromType;\r\n            _compPropDrawer.AllowProxy = _allowProxy;\r\n            _compPropDrawer.OnGUI(position, property, label);\r\n        }\r\n\r\n\r\n\r\n\r\n        private void InitOnGUI()\r\n        {\r\n            if (_manuallyConfigured) return;\r\n\r\n            var attrib = this.attribute as SelectableObjectAttribute;\r\n            if(attrib != null)\r\n            {\r\n                _allowSceneObjects = attrib.AllowSceneObjects;\r\n                _inheritsFromType = attrib.InheritsFromType;\r\n                _allowProxy = attrib.AllowProxy;\r\n            }\r\n            else\r\n            {\r\n                _allowSceneObjects = true;\r\n                _inheritsFromType = null;\r\n                _allowProxy = false;\r\n            }\r\n        }\r\n\r\n        private void DrawAsMismatchedAttribute(Rect position, SerializedProperty property)\r\n        {\r\n            EditorGUI.LabelField(position, EditorHelper.TempContent(\"Mismatched type of PropertyDrawer attribute with field.\"));\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}"
  },
  {
    "path": "SpacepuppyBaseEditor/Components/TypeRestrictionPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Components\n{\n\n    [CustomPropertyDrawer(typeof(TypeRestrictionAttribute))]\n    public class TypeRestrictionPropertyDrawer : PropertyDrawer\n    {\n\n        #region Fields\n        \n        private SelectableComponentPropertyDrawer _selectComponentDrawer;\n\n        #endregion\n\n        #region Utils\n\n        private bool ValidateFieldType()\n        {\n            bool isArray = this.fieldInfo.FieldType.IsListType();\n            var fieldType = (isArray) ? this.fieldInfo.FieldType.GetElementTypeOfListType() : this.fieldInfo.FieldType;\n            if (!TypeUtil.IsType(fieldType, typeof(UnityEngine.Object)))\n                return false;\n            //if (!TypeUtil.IsType(fieldType, typeof(Component))) return false;\n\n            var attrib = this.attribute as TypeRestrictionAttribute;\n            return attrib.InheritsFromType == null ||\n                attrib.InheritsFromType.IsInterface ||\n                TypeUtil.IsType(attrib.InheritsFromType, fieldType);\n        }\n\n        #endregion\n\n        #region Drawer Overrides\n\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n        {\n            var attrib = this.attribute as TypeRestrictionAttribute;\n            if (attrib.HideTypeDropDown)\n                return EditorGUIUtility.singleLineHeight;\n            else\n            {\n                if (_selectComponentDrawer == null) _selectComponentDrawer = new SelectableComponentPropertyDrawer();\n                return _selectComponentDrawer.GetPropertyHeight(property, label);\n            }\n        }\n\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            if (!this.ValidateFieldType())\n            {\n                EditorGUI.PropertyField(position, property, label);\n                return;\n            }\n\n            EditorGUI.BeginProperty(position, label, property);\n\n            //get base type\n            var attrib = this.attribute as TypeRestrictionAttribute;\n\n            bool isArray = this.fieldInfo.FieldType.IsListType();\n            var fieldType = (isArray) ? this.fieldInfo.FieldType.GetElementTypeOfListType() : this.fieldInfo.FieldType;\n            bool fieldIsComponentType = TypeUtil.IsType(fieldType, typeof(Component));\n            bool objIsComponentType = property.objectReferenceValue is Component;\n            var inheritsFromType = attrib.InheritsFromType ?? ((fieldIsComponentType) ? typeof(Component) : fieldType);\n\n            if (attrib.HideTypeDropDown || !objIsComponentType)\n            {\n                //draw object field\n                UnityEngine.Object targ;\n                if(fieldIsComponentType)\n                {\n                    var fieldCompType = (TypeUtil.IsType(fieldType, typeof(Component))) ? fieldType : typeof(Component);\n                    targ = SPEditorGUI.ComponentField(position, label, property.objectReferenceValue as Component, inheritsFromType, true, fieldCompType);\n                }\n                else\n                {\n                    targ = EditorGUI.ObjectField(position, label, property.objectReferenceValue, fieldType, true);\n                }\n\n                if (targ == null)\n                {\n                    property.objectReferenceValue = null;\n                }\n                else\n                {\n                    var o = ObjUtil.GetAsFromSource(inheritsFromType, targ) as UnityEngine.Object;\n                    if (attrib.AllowProxy && o == null)\n                        o = ObjUtil.GetAsFromSource<IProxy>(targ) as UnityEngine.Object;\n                    property.objectReferenceValue = o;\n                }\n            }\n            else\n            {\n                //draw complex field\n                if (_selectComponentDrawer == null)\n                {\n                    _selectComponentDrawer = new SelectableComponentPropertyDrawer();\n                }\n\n                _selectComponentDrawer.RestrictionType = inheritsFromType ?? typeof(Component);\n                _selectComponentDrawer.AllowProxy = attrib.AllowProxy;\n                _selectComponentDrawer.ShowXButton = true;\n                _selectComponentDrawer.AllowNonComponents = true;\n\n                _selectComponentDrawer.OnGUI(position, property, label);\n            }\n\n            EditorGUI.EndProperty();\n        }\n        \n        #endregion\n        \n    }\n    \n    [System.Obsolete(\"Use TypeRestrictionPropertyDrawer Instead\")]\n    [CustomPropertyDrawer(typeof(ComponentTypeRestrictionAttribute))]\n    public class ComponentTypeRestrictionPropertyDrawer : TypeRestrictionPropertyDrawer\n    {\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/EditorCoroutine.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing IEnumerator = System.Collections.IEnumerator;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n    public static class EditorCoroutine\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private static List<CoroutineHandle> _routines = new List<CoroutineHandle>();\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public static RadicalCoroutine StartEditorCoroutine(IEnumerator e)\r\n        {\r\n            var routine = new RadicalCoroutine(e);\r\n            var handle = new CoroutineHandle()\r\n            {\r\n                Routine = routine,\r\n                Yield = null\r\n            };\r\n\r\n            if(_routines.Count == 0)\r\n            {\r\n                EditorApplication.update -= DoUpdate;\r\n                EditorApplication.update += DoUpdate;\r\n            }\r\n\r\n            _routines.Add(handle);\r\n            return routine;\r\n        }\r\n\r\n        public static object YieldForDuration(double dur)\r\n        {\r\n            return new WaitForEditorDuration()\r\n            {\r\n                Duration = dur\r\n            };\r\n        }\r\n\r\n        public static void Invoke(System.Action act, float dur)\r\n        {\r\n            if (act == null) return;\r\n            StartEditorCoroutine(InvokeCallback(act, dur));\r\n        }\r\n        private static System.Collections.IEnumerator InvokeCallback(System.Action act, float dur)\r\n        {\r\n            if (act == null) yield break;\r\n            if (dur > 0f) yield return YieldForDuration(dur);\r\n            act();\r\n        }\r\n\r\n\r\n\r\n        private static void DoUpdate()\r\n        {\r\n            for(int i = 0; i < _routines.Count; i++)\r\n            {\r\n                var handle = _routines[i];\r\n                if(handle.Routine.Finished)\r\n                {\r\n                    _routines.RemoveAt(i);\r\n                    i--;\r\n                    continue;\r\n                }\r\n\r\n                //Wait on yield instruction\r\n                if(handle.Yield is WaitForEditorDuration)\r\n                {\r\n                    var wait = handle.Yield as WaitForEditorDuration;\r\n                    if((System.DateTime.Now - wait.Start).TotalSeconds >= wait.Duration)\r\n                    {\r\n                        handle.Yield = null;\r\n                    }\r\n                    else\r\n                    {\r\n                        continue;\r\n                    }\r\n                }\r\n                else if(handle.Yield is IEnumerator)\r\n                {\r\n                    var e = handle.Yield as IEnumerator;\r\n                    if(e.MoveNext())\r\n                    {\r\n                        continue;\r\n                    }\r\n                    else\r\n                    {\r\n                        handle.Yield = null;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    handle.Yield = null;\r\n                }\r\n\r\n                //perform action\r\n                object yieldObj;\r\n                if(!handle.Routine.ManualTick(out yieldObj) || handle.Routine.Finished)\r\n                {\r\n                    _routines.RemoveAt(i);\r\n                    i--;\r\n                    continue;\r\n                }\r\n\r\n                //store yield object\r\n                if(yieldObj is WaitForEditorDuration)\r\n                {\r\n                    (yieldObj as WaitForEditorDuration).Start = System.DateTime.Now;\r\n                    handle.Yield = yieldObj;\r\n                }\r\n                else if (yieldObj is IEnumerator && (yieldObj as IEnumerator).MoveNext())\r\n                {\r\n                    handle.Yield = yieldObj;\r\n                }\r\n                else\r\n                {\r\n                    handle.Yield = null;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        private class CoroutineHandle\r\n        {\r\n            public RadicalCoroutine Routine;\r\n            public object Yield;\r\n        }\r\n\r\n        private class WaitForEditorDuration\r\n        {\r\n            public System.DateTime Start;\r\n            public double Duration;\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/EditorHelper.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n\r\n    public static class EditorHelper\r\n    {\r\n\r\n        public const string PROP_SCRIPT = \"m_Script\";\r\n        public const string PROP_ORDER = \"_order\";\r\n        public const string PROP_ACTIVATEON = \"_activateOn\";\r\n\r\n        public const float OBJFIELD_DOT_WIDTH = 18f;\r\n\r\n\r\n        private static Texture2D s_WhiteTexture;\r\n        public static Texture2D WhiteTexture\r\n        {\r\n            get\r\n            {\r\n                if (s_WhiteTexture == null)\r\n                {\r\n                    s_WhiteTexture = new Texture2D(1, 1);\r\n                    s_WhiteTexture.SetPixel(0, 0, Color.white);\r\n                    s_WhiteTexture.Apply();\r\n                }\r\n                return s_WhiteTexture;\r\n            }\r\n        }\r\n        private static GUIStyle s_WhiteTextureStyle;\r\n        public static GUIStyle WhiteTextureStyle\r\n        {\r\n            get\r\n            {\r\n                if(s_WhiteTextureStyle == null)\r\n                {\r\n                    s_WhiteTextureStyle = new GUIStyle();\r\n                    s_WhiteTextureStyle.normal.background = EditorHelper.WhiteTexture;\r\n                }\r\n                return s_WhiteTextureStyle;\r\n            }\r\n        }\r\n        \r\n\r\n        static EditorHelper()\r\n        {\r\n            SceneView.onSceneGUIDelegate -= OnSceneGUI;\r\n            SceneView.onSceneGUIDelegate += OnSceneGUI;\r\n        }\r\n\r\n        #region Methods\r\n\r\n        public static bool AssertMultiObjectEditingNotSupportedHeight(SerializedProperty property, GUIContent label, out float height)\r\n        {\r\n            if(property.hasMultipleDifferentValues)\r\n            {\r\n                height = EditorGUIUtility.singleLineHeight;\r\n                return true;\r\n            }\r\n\r\n            height = 0f;\r\n            return false;\r\n        }\r\n\r\n        public static bool AssertMultiObjectEditingNotSupported(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            if(property.hasMultipleDifferentValues)\r\n            {\r\n                EditorGUI.LabelField(position, label, EditorHelper.TempContent(\"Multi-Object editing is not supported.\"));\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region SerializedProperty Helpers\r\n\r\n        public static IEnumerable<SerializedProperty> GetChildren(this SerializedProperty property)\r\n        {\r\n            property = property.Copy();\r\n            var nextElement = property.Copy();\r\n            bool hasNextElement = nextElement.NextVisible(false);\r\n            if (!hasNextElement)\r\n            {\r\n                nextElement = null;\r\n            }\r\n\r\n            property.NextVisible(true);\r\n            while (true)\r\n            {\r\n                if ((SerializedProperty.EqualContents(property, nextElement)))\r\n                {\r\n                    yield break;\r\n                }\r\n\r\n                yield return property;\r\n\r\n                bool hasNext = property.NextVisible(false);\r\n                if (!hasNext)\r\n                {\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        public static System.Type GetTargetType(this SerializedObject obj)\r\n        {\r\n            if (obj == null) return null;\r\n\r\n            if(obj.isEditingMultipleObjects)\r\n            {\r\n                var c = obj.targetObjects[0];\r\n                return c.GetType();\r\n            }\r\n            else\r\n            {\r\n                return obj.targetObject.GetType();\r\n            }\r\n        }\r\n\r\n        public static System.Type GetTargetType(this SerializedProperty prop)\r\n        {\r\n            if (prop == null) return null;\r\n\r\n            System.Reflection.FieldInfo field;\r\n            switch (prop.propertyType)\r\n            {\r\n                case SerializedPropertyType.Generic:\r\n                    return TypeUtil.FindType(prop.type) ?? typeof(object);\r\n                case SerializedPropertyType.Integer:\r\n                    return prop.type == \"long\" ? typeof(int) : typeof(long);\r\n                case SerializedPropertyType.Boolean:\r\n                    return typeof(bool);\r\n                case SerializedPropertyType.Float:\r\n                    return prop.type == \"double\" ? typeof(double) : typeof(float);\r\n                case SerializedPropertyType.String:\r\n                    return typeof(string);\r\n                case SerializedPropertyType.Color:\r\n                    {\r\n                        field = GetFieldOfProperty(prop);\r\n                        return field != null ? field.FieldType : typeof(Color);\r\n                    }\r\n                case SerializedPropertyType.ObjectReference:\r\n                    {\r\n                        field = GetFieldOfProperty(prop);\r\n                        return field != null ? field.FieldType : typeof(UnityEngine.Object);\r\n                    }\r\n                case SerializedPropertyType.LayerMask:\r\n                    return typeof(LayerMask);\r\n                case SerializedPropertyType.Enum:\r\n                    {\r\n                        field = GetFieldOfProperty(prop);\r\n                        return field != null ? field.FieldType : typeof(System.Enum);\r\n                    }\r\n                case SerializedPropertyType.Vector2:\r\n                    return typeof(Vector2);\r\n                case SerializedPropertyType.Vector3:\r\n                    return typeof(Vector3);\r\n                case SerializedPropertyType.Vector4:\r\n                    return typeof(Vector4);\r\n                case SerializedPropertyType.Rect:\r\n                    return typeof(Rect);\r\n                case SerializedPropertyType.ArraySize:\r\n                    return typeof(int);\r\n                case SerializedPropertyType.Character:\r\n                    return typeof(char);\r\n                case SerializedPropertyType.AnimationCurve:\r\n                    return typeof(AnimationCurve);\r\n                case SerializedPropertyType.Bounds:\r\n                    return typeof(Bounds);\r\n                case SerializedPropertyType.Gradient:\r\n                    return typeof(Gradient);\r\n                case SerializedPropertyType.Quaternion:\r\n                    return typeof(Quaternion);\r\n                case SerializedPropertyType.ExposedReference:\r\n                    {\r\n                        field = GetFieldOfProperty(prop);\r\n                        return field != null ? field.FieldType : typeof(UnityEngine.Object);\r\n                    }\r\n                case SerializedPropertyType.FixedBufferSize:\r\n                    return typeof(int);\r\n                case SerializedPropertyType.Vector2Int:\r\n                    return typeof(Vector2Int);\r\n                case SerializedPropertyType.Vector3Int:\r\n                    return typeof(Vector3Int);\r\n                case SerializedPropertyType.RectInt:\r\n                    return typeof(RectInt);\r\n                case SerializedPropertyType.BoundsInt:\r\n                    return typeof(BoundsInt);\r\n                default:\r\n                    {\r\n                        field = GetFieldOfProperty(prop);\r\n                        return field != null ? field.FieldType : typeof(object);\r\n                    }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets the object the property represents.\r\n        /// </summary>\r\n        /// <param name=\"prop\"></param>\r\n        /// <returns></returns>\r\n        public static object GetTargetObjectOfProperty(SerializedProperty prop)\r\n        {\r\n            if (prop == null) return null;\r\n\r\n            var path = prop.propertyPath.Replace(\".Array.data[\", \"[\");\r\n            object obj = prop.serializedObject.targetObject;\r\n            var elements = path.Split('.');\r\n            foreach (var element in elements)\r\n            {\r\n                if (element.Contains(\"[\"))\r\n                {\r\n                    var elementName = element.Substring(0, element.IndexOf(\"[\"));\r\n                    var index = System.Convert.ToInt32(element.Substring(element.IndexOf(\"[\")).Replace(\"[\", \"\").Replace(\"]\", \"\"));\r\n                    obj = GetValue_Imp(obj, elementName, index);\r\n                }\r\n                else\r\n                {\r\n                    obj = GetValue_Imp(obj, element);\r\n                }\r\n            }\r\n            return obj;\r\n        }\r\n\r\n        public static object GetTargetObjectOfProperty(SerializedProperty prop, object targetObj)\r\n        {\r\n            var path = prop.propertyPath.Replace(\".Array.data[\", \"[\");\r\n            var elements = path.Split('.');\r\n            foreach (var element in elements)\r\n            {\r\n                if (element.Contains(\"[\"))\r\n                {\r\n                    var elementName = element.Substring(0, element.IndexOf(\"[\"));\r\n                    var index = System.Convert.ToInt32(element.Substring(element.IndexOf(\"[\")).Replace(\"[\", \"\").Replace(\"]\", \"\"));\r\n                    targetObj = GetValue_Imp(targetObj, elementName, index);\r\n                }\r\n                else\r\n                {\r\n                    targetObj = GetValue_Imp(targetObj, element);\r\n                }\r\n            }\r\n            return targetObj;\r\n        }\r\n\r\n        public static void SetTargetObjectOfProperty(SerializedProperty prop, object value)\r\n        {\r\n            var path = prop.propertyPath.Replace(\".Array.data[\", \"[\");\r\n            object obj = prop.serializedObject.targetObject;\r\n            var elements = path.Split('.');\r\n            foreach (var element in elements.Take(elements.Length - 1))\r\n            {\r\n                if (element.Contains(\"[\"))\r\n                {\r\n                    var elementName = element.Substring(0, element.IndexOf(\"[\"));\r\n                    var index = System.Convert.ToInt32(element.Substring(element.IndexOf(\"[\")).Replace(\"[\", \"\").Replace(\"]\", \"\"));\r\n                    obj = GetValue_Imp(obj, elementName, index);\r\n                }\r\n                else\r\n                {\r\n                    obj = GetValue_Imp(obj, element);\r\n                }\r\n            }\r\n\r\n            if (Object.ReferenceEquals(obj, null)) return;\r\n\r\n            try\r\n            {\r\n                var element = elements.Last();\r\n\r\n                if (element.Contains(\"[\"))\r\n                {\r\n                    //var tp = obj.GetType();\r\n                    //var elementName = element.Substring(0, element.IndexOf(\"[\"));\r\n                    //var index = System.Convert.ToInt32(element.Substring(element.IndexOf(\"[\")).Replace(\"[\", \"\").Replace(\"]\", \"\"));\r\n                    //var field = tp.GetField(elementName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);\r\n                    //var arr = field.GetValue(obj) as System.Collections.IList;\r\n                    //arr[index] = value;\r\n                    var elementName = element.Substring(0, element.IndexOf(\"[\"));\r\n                    var index = System.Convert.ToInt32(element.Substring(element.IndexOf(\"[\")).Replace(\"[\", \"\").Replace(\"]\", \"\"));\r\n                    var arr = DynamicUtil.GetValue(element, elementName) as System.Collections.IList;\r\n                    if (arr != null) arr[index] = value;\r\n                }\r\n                else\r\n                {\r\n                    //var tp = obj.GetType();\r\n                    //var field = tp.GetField(element, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);\r\n                    //if (field != null)\r\n                    //{\r\n                    //    field.SetValue(obj, value);\r\n                    //}\r\n                    DynamicUtil.SetValue(obj, element, value);\r\n                }\r\n\r\n            }\r\n            catch\r\n            {\r\n                return;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets the object that the property is a member of\r\n        /// </summary>\r\n        /// <param name=\"prop\"></param>\r\n        /// <returns></returns>\r\n        public static object GetTargetObjectWithProperty(SerializedProperty prop)\r\n        {\r\n            var path = prop.propertyPath.Replace(\".Array.data[\", \"[\");\r\n            object obj = prop.serializedObject.targetObject;\r\n            var elements = path.Split('.');\r\n            foreach (var element in elements.Take(elements.Length - 1))\r\n            {\r\n                if (element.Contains(\"[\"))\r\n                {\r\n                    var elementName = element.Substring(0, element.IndexOf(\"[\"));\r\n                    var index = System.Convert.ToInt32(element.Substring(element.IndexOf(\"[\")).Replace(\"[\", \"\").Replace(\"]\", \"\"));\r\n                    obj = GetValue_Imp(obj, elementName, index);\r\n                }\r\n                else\r\n                {\r\n                    obj = GetValue_Imp(obj, element);\r\n                }\r\n            }\r\n            return obj;\r\n        }\r\n\r\n        private static object GetValue_Imp(object source, string name)\r\n        {\r\n            if (source == null)\r\n                return null;\r\n            var type = source.GetType();\r\n\r\n            while (type != null)\r\n            {\r\n                var f = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);\r\n                if (f != null)\r\n                    return f.GetValue(source);\r\n\r\n                var p = type.GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);\r\n                if (p != null)\r\n                    return p.GetValue(source, null);\r\n\r\n                type = type.BaseType;\r\n            }\r\n            return null;\r\n        }\r\n\r\n        private static object GetValue_Imp(object source, string name, int index)\r\n        {\r\n            var enumerable = GetValue_Imp(source, name) as System.Collections.IEnumerable;\r\n            if (enumerable == null) return null;\r\n            var enm = enumerable.GetEnumerator();\r\n            //while (index-- >= 0)\r\n            //    enm.MoveNext();\r\n            //return enm.Current;\r\n\r\n            for (int i = 0; i <= index; i++)\r\n            {\r\n                if (!enm.MoveNext()) return null;\r\n            }\r\n            return enm.Current;\r\n        }\r\n\r\n\r\n        public static void SetEnumValue<T>(this SerializedProperty prop, T value) where T : struct\r\n        {\r\n            if (prop == null) throw new System.ArgumentNullException(\"prop\");\r\n            if (prop.propertyType != SerializedPropertyType.Enum) throw new System.ArgumentException(\"SerializedProperty is not an enum type.\", \"prop\");\r\n\r\n            //var tp = typeof(T);\r\n            //if(tp.IsEnum)\r\n            //{\r\n            //    prop.enumValueIndex = prop.enumNames.IndexOf(System.Enum.GetName(tp, value));\r\n            //}\r\n            //else\r\n            //{\r\n            //    int i = ConvertUtil.ToInt(value);\r\n            //    if (i < 0 || i >= prop.enumNames.Length) i = 0;\r\n            //    prop.enumValueIndex = i;\r\n            //}\r\n            prop.intValue = ConvertUtil.ToInt(value);\r\n        }\r\n\r\n        public static void SetEnumValue(this SerializedProperty prop, System.Enum value)\r\n        {\r\n            if (prop == null) throw new System.ArgumentNullException(\"prop\");\r\n            if (prop.propertyType != SerializedPropertyType.Enum) throw new System.ArgumentException(\"SerializedProperty is not an enum type.\", \"prop\");\r\n\r\n            if (value == null)\r\n            {\r\n                prop.enumValueIndex = 0;\r\n                return;\r\n            }\r\n\r\n            //int i = prop.enumNames.IndexOf(System.Enum.GetName(value.GetType(), value));\r\n            //if (i < 0) i = 0;\r\n            //prop.enumValueIndex = i;\r\n            prop.intValue = ConvertUtil.ToInt(value);\r\n        }\r\n\r\n        public static void SetEnumValue(this SerializedProperty prop, object value)\r\n        {\r\n            if (prop == null) throw new System.ArgumentNullException(\"prop\");\r\n            if (prop.propertyType != SerializedPropertyType.Enum) throw new System.ArgumentException(\"SerializedProperty is not an enum type.\", \"prop\");\r\n\r\n            if(value == null)\r\n            {\r\n                prop.enumValueIndex = 0;\r\n                return;\r\n            }\r\n\r\n            //var tp = value.GetType();\r\n            //if (tp.IsEnum)\r\n            //{\r\n            //    int i = prop.enumNames.IndexOf(System.Enum.GetName(tp, value));\r\n            //    if (i < 0) i = 0;\r\n            //    prop.enumValueIndex = i;\r\n            //}\r\n            //else\r\n            //{\r\n            //    int i = ConvertUtil.ToInt(value);\r\n            //    if (i < 0 || i >= prop.enumNames.Length) i = 0;\r\n            //    prop.enumValueIndex = i;\r\n            //}\r\n            prop.intValue = ConvertUtil.ToInt(value);\r\n        }\r\n\r\n        public static T GetEnumValue<T>(this SerializedProperty prop) where T : struct, System.IConvertible\r\n        {\r\n            if (prop == null) throw new System.ArgumentNullException(\"prop\");\r\n\r\n            try\r\n            {\r\n                //var name = prop.enumNames[prop.enumValueIndex];\r\n                //return ConvertUtil.ToEnum<T>(name);\r\n                return ConvertUtil.ToEnum<T>(prop.intValue);\r\n            }\r\n            catch\r\n            {\r\n                return default(T);\r\n            }\r\n        }\r\n\r\n        public static System.Enum GetEnumValue(this SerializedProperty prop, System.Type tp)\r\n        {\r\n            if (prop == null) throw new System.ArgumentNullException(\"prop\");\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n            if (!tp.IsEnum) throw new System.ArgumentException(\"Type must be an enumerated type.\");\r\n\r\n            try\r\n            {\r\n                //var name = prop.enumNames[prop.enumValueIndex];\r\n                //return System.Enum.Parse(tp, name) as System.Enum;\r\n                return ConvertUtil.ToEnumOfType(tp, prop.intValue);\r\n            }\r\n            catch\r\n            {\r\n                return System.Enum.GetValues(tp).Cast<System.Enum>().First();\r\n            }\r\n        }\r\n\r\n        public static void SetPropertyValue(this SerializedProperty prop, object value)\r\n        {\r\n            if (prop == null) throw new System.ArgumentNullException(\"prop\");\r\n\r\n            switch (prop.propertyType)\r\n            {\r\n                case SerializedPropertyType.Integer:\r\n                    prop.intValue = ConvertUtil.ToInt(value);\r\n                    break;\r\n                case SerializedPropertyType.Boolean:\r\n                    prop.boolValue = ConvertUtil.ToBool(value);\r\n                    break;\r\n                case SerializedPropertyType.Float:\r\n                    prop.floatValue = ConvertUtil.ToSingle(value);\r\n                    break;\r\n                case SerializedPropertyType.String:\r\n                    prop.stringValue = ConvertUtil.ToString(value);\r\n                    break;\r\n                case SerializedPropertyType.Color:\r\n                    prop.colorValue = ConvertUtil.ToColor(value);\r\n                    break;\r\n                case SerializedPropertyType.ObjectReference:\r\n                    prop.objectReferenceValue = value as Object;\r\n                    break;\r\n                case SerializedPropertyType.LayerMask:\r\n                    prop.intValue = (value is LayerMask) ? ((LayerMask)value).value : ConvertUtil.ToInt(value);\r\n                    break;\r\n                case SerializedPropertyType.Enum:\r\n                    //prop.enumValueIndex = ConvertUtil.ToInt(value);\r\n                    prop.SetEnumValue(value);\r\n                    break;\r\n                case SerializedPropertyType.Vector2:\r\n                    prop.vector2Value = ConvertUtil.ToVector2(value);\r\n                    break;\r\n                case SerializedPropertyType.Vector3:\r\n                    prop.vector3Value = ConvertUtil.ToVector3(value);\r\n                    break;\r\n                case SerializedPropertyType.Vector4:\r\n                    prop.vector4Value = ConvertUtil.ToVector4(value);\r\n                    break;\r\n                case SerializedPropertyType.Rect:\r\n                    prop.rectValue = (Rect)value;\r\n                    break;\r\n                case SerializedPropertyType.ArraySize:\r\n                    prop.arraySize = ConvertUtil.ToInt(value);\r\n                    break;\r\n                case SerializedPropertyType.Character:\r\n                    prop.intValue = ConvertUtil.ToInt(value);\r\n                    break;\r\n                case SerializedPropertyType.AnimationCurve:\r\n                    prop.animationCurveValue = value as AnimationCurve;\r\n                    break;\r\n                case SerializedPropertyType.Bounds:\r\n                    prop.boundsValue = (Bounds)value;\r\n                    break;\r\n                case SerializedPropertyType.Gradient:\r\n                    throw new System.InvalidOperationException(\"Can not handle Gradient types.\");\r\n            }\r\n        }\r\n\r\n        public static object GetPropertyValue(this SerializedProperty prop)\r\n        {\r\n            if (prop == null) throw new System.ArgumentNullException(\"prop\");\r\n\r\n            switch (prop.propertyType)\r\n            {\r\n                case SerializedPropertyType.Integer:\r\n                    return prop.intValue;\r\n                case SerializedPropertyType.Boolean:\r\n                    return prop.boolValue;\r\n                case SerializedPropertyType.Float:\r\n                    return prop.floatValue;\r\n                case SerializedPropertyType.String:\r\n                    return prop.stringValue;\r\n                case SerializedPropertyType.Color:\r\n                    return prop.colorValue;\r\n                case SerializedPropertyType.ObjectReference:\r\n                    return prop.objectReferenceValue;\r\n                case SerializedPropertyType.LayerMask:\r\n                    return (LayerMask)prop.intValue;\r\n                case SerializedPropertyType.Enum:\r\n                    return prop.enumValueIndex;\r\n                case SerializedPropertyType.Vector2:\r\n                    return prop.vector2Value;\r\n                case SerializedPropertyType.Vector3:\r\n                    return prop.vector3Value;\r\n                case SerializedPropertyType.Vector4:\r\n                    return prop.vector4Value;\r\n                case SerializedPropertyType.Rect:\r\n                    return prop.rectValue;\r\n                case SerializedPropertyType.ArraySize:\r\n                    return prop.arraySize;\r\n                case SerializedPropertyType.Character:\r\n                    return (char)prop.intValue;\r\n                case SerializedPropertyType.AnimationCurve:\r\n                    return prop.animationCurveValue;\r\n                case SerializedPropertyType.Bounds:\r\n                    return prop.boundsValue;\r\n                case SerializedPropertyType.Gradient:\r\n                    throw new System.InvalidOperationException(\"Can not handle Gradient types.\");\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static T GetPropertyValue<T>(this SerializedProperty prop)\r\n        {\r\n            var obj = GetPropertyValue(prop);\r\n            if (obj is T) return (T)obj;\r\n\r\n            var tp = typeof(T);\r\n            try\r\n            {\r\n                return (T)System.Convert.ChangeType(obj, tp);\r\n            }\r\n            catch(System.Exception)\r\n            {\r\n                return default(T);\r\n            }\r\n        }\r\n\r\n        public static SerializedPropertyType GetPropertyType(System.Type tp)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n            \r\n            if(tp.IsEnum) return SerializedPropertyType.Enum;\r\n\r\n            var code = System.Type.GetTypeCode(tp);\r\n            switch(code)\r\n            {\r\n                case System.TypeCode.SByte:\r\n                case System.TypeCode.Byte:\r\n                case System.TypeCode.Int16:\r\n                case System.TypeCode.UInt16:\r\n                case System.TypeCode.Int32:\r\n                case System.TypeCode.UInt32:\r\n                case System.TypeCode.Int64:\r\n                case System.TypeCode.UInt64:\r\n                    return SerializedPropertyType.Integer;\r\n                case System.TypeCode.Boolean:\r\n                    return SerializedPropertyType.Boolean;\r\n                case System.TypeCode.Single:\r\n                case System.TypeCode.Double:\r\n                    return SerializedPropertyType.Float;\r\n                case System.TypeCode.String:\r\n                    return SerializedPropertyType.String;\r\n                case System.TypeCode.Char:\r\n                    return SerializedPropertyType.Character;\r\n                default:\r\n                    {\r\n                        if (TypeUtil.IsType(tp, typeof(Color)))\r\n                            return SerializedPropertyType.Color;\r\n                        else if (TypeUtil.IsType(tp, typeof(UnityEngine.Object)))\r\n                            return SerializedPropertyType.ObjectReference;\r\n                        else if (TypeUtil.IsType(tp, typeof(LayerMask)))\r\n                            return SerializedPropertyType.LayerMask;\r\n                        else if (TypeUtil.IsType(tp, typeof(Vector2)))\r\n                            return SerializedPropertyType.Vector2;\r\n                        else if (TypeUtil.IsType(tp, typeof(Vector3)))\r\n                            return SerializedPropertyType.Vector3;\r\n                        else if (TypeUtil.IsType(tp, typeof(Vector4)))\r\n                            return SerializedPropertyType.Vector4;\r\n                        else if (TypeUtil.IsType(tp, typeof(Quaternion)))\r\n                            return SerializedPropertyType.Quaternion;\r\n                        else if (TypeUtil.IsType(tp, typeof(Rect)))\r\n                            return SerializedPropertyType.Rect;\r\n                        else if (TypeUtil.IsType(tp, typeof(AnimationCurve)))\r\n                            return SerializedPropertyType.AnimationCurve;\r\n                        else if (TypeUtil.IsType(tp, typeof(Bounds)))\r\n                            return SerializedPropertyType.Bounds;\r\n                        else if (TypeUtil.IsType(tp, typeof(Gradient)))\r\n                            return SerializedPropertyType.Gradient;\r\n                    }\r\n                    return SerializedPropertyType.Generic;\r\n\r\n            }\r\n        }\r\n\r\n        public static double GetNumericValue(this SerializedProperty prop)\r\n        {\r\n            switch (prop.propertyType)\r\n            {\r\n                case SerializedPropertyType.Integer:\r\n                    return (double)prop.intValue;\r\n                case SerializedPropertyType.Boolean:\r\n                    return prop.boolValue ? 1d : 0d;\r\n                case SerializedPropertyType.Float:\r\n                    return prop.type == \"double\" ? prop.doubleValue : (double)prop.floatValue;\r\n                case SerializedPropertyType.ArraySize:\r\n                    return (double)prop.arraySize;\r\n                case SerializedPropertyType.Character:\r\n                    return (double)prop.intValue;\r\n                default:\r\n                    return 0d;\r\n            }\r\n        }\r\n\r\n        public static void SetNumericValue(this SerializedProperty prop, double value)\r\n        {\r\n            switch (prop.propertyType)\r\n            {\r\n                case SerializedPropertyType.Integer:\r\n                    prop.intValue = (int)value;\r\n                    break;\r\n                case SerializedPropertyType.Boolean:\r\n                    prop.boolValue = (System.Math.Abs(value) > MathUtil.DBL_EPSILON);\r\n                    break;\r\n                case SerializedPropertyType.Float:\r\n                    if (prop.type == \"double\")\r\n                        prop.doubleValue = value;\r\n                    else\r\n                        prop.floatValue = (float)value;\r\n                    break;\r\n                case SerializedPropertyType.ArraySize:\r\n                    prop.arraySize = (int)value;\r\n                    break;\r\n                case SerializedPropertyType.Character:\r\n                    prop.intValue = (int)value;\r\n                    break;\r\n            }\r\n        }\r\n\r\n        public static bool IsNumericValue(this SerializedProperty prop)\r\n        {\r\n            switch (prop.propertyType)\r\n            {\r\n                case SerializedPropertyType.Integer:\r\n                case SerializedPropertyType.Boolean:\r\n                case SerializedPropertyType.Float:\r\n                case SerializedPropertyType.ArraySize:\r\n                case SerializedPropertyType.Character:\r\n                    return true;\r\n                default:\r\n                    return false;\r\n            }\r\n        }\r\n\r\n        public static T[] GetAsArray<T>(this SerializedProperty prop)\r\n        {\r\n            if (prop == null) throw new System.ArgumentNullException(\"prop\");\r\n            if (!prop.isArray) throw new System.ArgumentException(\"SerializedProperty does not represent an Array.\", \"prop\");\r\n\r\n            var arr = new T[prop.arraySize];\r\n            for(int i = 0; i < arr.Length; i++)\r\n            {\r\n                arr[i] = GetPropertyValue<T>(prop.GetArrayElementAtIndex(i));\r\n            }\r\n            return arr;\r\n        }\r\n\r\n        public static void SetAsArray<T>(this SerializedProperty prop, T[] arr)\r\n        {\r\n            if (prop == null) throw new System.ArgumentNullException(\"prop\");\r\n            if (!prop.isArray) throw new System.ArgumentException(\"SerializedProperty does not represent an Array.\", \"prop\");\r\n\r\n            int sz = arr != null ? arr.Length : 0;\r\n            prop.arraySize = sz;\r\n            for(int i = 0; i < sz; i++)\r\n            {\r\n                prop.GetArrayElementAtIndex(i).SetPropertyValue(arr[i]);\r\n            }\r\n        }\r\n\r\n\r\n        public static int GetChildPropertyCount(SerializedProperty property, bool includeGrandChildren = false)\r\n        {\r\n            var pstart = property.Copy();\r\n            var pend = property.GetEndProperty();\r\n            int cnt = 0;\r\n\r\n            pstart.Next(true);\r\n            while(!SerializedProperty.EqualContents(pstart, pend))\r\n            {\r\n                cnt++;\r\n                pstart.Next(includeGrandChildren);\r\n            }\r\n\r\n            return cnt;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Serialized Field Helpers\r\n\r\n        public static System.Reflection.FieldInfo GetFieldOfProperty(SerializedProperty prop)\r\n        {\r\n            if (prop == null) return null;\r\n\r\n            var tp = GetTargetType(prop.serializedObject);\r\n            if (tp == null) return null;\r\n\r\n            var path = prop.propertyPath.Replace(\".Array.data[\", \"[\");\r\n            var elements = path.Split('.');\r\n            System.Reflection.FieldInfo field = null;\r\n            foreach (var element in elements)\r\n            {\r\n                if (element.Contains(\"[\"))\r\n                {\r\n                    var elementName = element.Substring(0, element.IndexOf(\"[\"));\r\n                    var index = System.Convert.ToInt32(element.Substring(element.IndexOf(\"[\")).Replace(\"[\", \"\").Replace(\"]\", \"\"));\r\n\r\n                    //field = tp.GetMember(elementName, MemberTypes.Field, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).FirstOrDefault() as System.Reflection.FieldInfo;\r\n                    field = DynamicUtil.GetMemberFromType(tp, element, true, MemberTypes.Field) as System.Reflection.FieldInfo;\r\n                    if (field == null) return null;\r\n                    tp = field.FieldType;\r\n                }\r\n                else\r\n                {\r\n                    //tp.GetMember(element, MemberTypes.Field, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).FirstOrDefault() as System.Reflection.FieldInfo;\r\n                    field = DynamicUtil.GetMemberFromType(tp, element, true, MemberTypes.Field) as System.Reflection.FieldInfo;\r\n                    if (field == null) return null;\r\n                    tp = field.FieldType;\r\n                }\r\n            }\r\n            return field;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get the type defined in a TypeRestrictionAttribute attached to the field, otherwise returns the FieldType as defined by the field itself.\r\n        /// </summary>\r\n        /// <param name=\"field\"></param>\r\n        /// <param name=\"returnNullIfNoTypeRestrictionAttribute\">Return null if TypeRestrictionAttribute is not found</param>\r\n        /// <returns></returns>\r\n        public static System.Type GetRestrictedFieldType(System.Reflection.FieldInfo field, bool returnNullIfNoTypeRestrictionAttribute = false)\r\n        {\r\n            if (field == null) return null;\r\n\r\n            var attrib = field.GetCustomAttributes(typeof(TypeRestrictionAttribute), true).FirstOrDefault() as TypeRestrictionAttribute;\r\n            if(attrib != null && attrib.InheritsFromType != null)\r\n            {\r\n                return attrib.InheritsFromType;\r\n            }\r\n            else\r\n            {\r\n                return returnNullIfNoTypeRestrictionAttribute ? null : field.FieldType;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Path\r\n\r\n        public static string GetFullPathForAssetPath(string assetPath)\r\n        {\r\n            return Application.dataPath.EnsureNotEndsWith(\"Assets\") + \"/\" + assetPath.EnsureNotStartWith(\"/\");\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Temp Content\r\n\r\n        private static TrackablObjectCachePool<GUIContent> _temp_text = new TrackablObjectCachePool<GUIContent>(50);\r\n\r\n\r\n        /// <summary>\r\n        /// Single immediate use GUIContent for a label. Should be used immediately and not stored/referenced for later use.\r\n        /// </summary>\r\n        /// <param name=\"text\"></param>\r\n        /// <returns></returns>\r\n        public static GUIContent TempContent(string text)\r\n        {\r\n            var c = _temp_text.GetInstance();\r\n            c.text = text;\r\n            c.tooltip = null;\r\n            return c;\r\n        }\r\n\r\n        public static GUIContent TempContent(string text, string tooltip)\r\n        {\r\n            var c = _temp_text.GetInstance();\r\n            c.text = text;\r\n            c.tooltip = tooltip;\r\n            return c;\r\n        }\r\n\r\n        public static GUIContent CloneContent(GUIContent content)\r\n        {\r\n            var c = _temp_text.GetInstance();\r\n            c.text = content.text;\r\n            c.tooltip = content.tooltip;\r\n            c.image = content.image;\r\n            return c;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Indent Helper\r\n\r\n        private static Stack<int> _indents = new Stack<int>();\r\n\r\n        public static void SuppressIndentLevel()\r\n        {\r\n            _indents.Push(EditorGUI.indentLevel);\r\n            EditorGUI.indentLevel = 0;\r\n        }\r\n\r\n        public static void SuppressIndentLevel(int tempLevel)\r\n        {\r\n            _indents.Push(EditorGUI.indentLevel);\r\n            EditorGUI.indentLevel = tempLevel;\r\n        }\r\n\r\n        public static void ResumeIndentLevel()\r\n        {\r\n            if (_indents.Count > 0)\r\n            {\r\n                EditorGUI.indentLevel = _indents.Pop();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region Event Handlers\r\n\r\n        private static void OnSceneGUI(SceneView scene)\r\n        {\r\n            foreach (var c in _temp_text.ActiveMembers.ToArray())\r\n            {\r\n                _temp_text.Release(c);\r\n            }\r\n\r\n            _indents.Clear();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Value Utils\r\n\r\n        /// <summary>\r\n        /// An editor time safe version of DynamicUtil.GetValueWithMember that attempts to not leak various values into the scene (like materials).\r\n        /// </summary>\r\n        /// <param name=\"info\"></param>\r\n        /// <param name=\"targObj\"></param>\r\n        /// <param name=\"ignoreMethod\"></param>\r\n        /// <returns></returns>\r\n        public static object GetValueWithMemberSafe(MemberInfo info, object targObj, bool ignoreMethod)\r\n        {\r\n            if (info == null) return null;\r\n            targObj = ObjUtil.ReduceIfProxy(targObj);\r\n\r\n            var tp = info.DeclaringType;\r\n            if(TypeUtil.IsType(tp, typeof(Renderer)))\r\n            {\r\n                switch(info.Name)\r\n                {\r\n                    case \"material\":\r\n                        return DynamicUtil.GetValue(targObj, \"sharedMaterial\");\r\n                    case \"materials\":\r\n                        return DynamicUtil.GetValue(targObj, \"sharedMaterials\");\r\n                }\r\n            }\r\n            else if(TypeUtil.IsType(tp, typeof(MeshFilter)))\r\n            {\r\n                switch(info.Name)\r\n                {\r\n                    case \"mesh\":\r\n                        return DynamicUtil.GetValue(targObj, \"sharedMesh\");\r\n                }\r\n            }\r\n\r\n            return DynamicUtil.GetValueWithMember(info, targObj, ignoreMethod);\r\n        }\r\n\r\n        public static int ConvertPopupMaskToEnumMask(int mask, System.Enum[] enumFlagValues)\r\n        {\r\n            if (enumFlagValues == null || enumFlagValues.Length == 0) return 0;\r\n            if (mask == 0) return 0;\r\n            if (mask == -1) return -1;\r\n\r\n            int result = 0;\r\n            for(int i = 0; i < enumFlagValues.Length; i++)\r\n            {\r\n                int flag = 1 << i;\r\n                if((mask & flag) != 0)\r\n                {\r\n                    result |= ConvertUtil.ToInt(enumFlagValues[i]);\r\n                }\r\n            }\r\n            return result;\r\n        }\r\n\r\n        public static int ConvertEnumMaskToPopupMask(int mask, System.Enum[] enumFlagValues)\r\n        {\r\n            if (enumFlagValues == null || enumFlagValues.Length == 0) return 0;\r\n            if (mask == 0) return 0;\r\n            if (mask == -1) return -1;\r\n\r\n            int result = 0;\r\n            for (int i = 0; i < enumFlagValues.Length; i++)\r\n            {\r\n                int e = ConvertUtil.ToInt(enumFlagValues[i]);\r\n                if((mask & e) != 0)\r\n                {\r\n                    result |= (1 << i);\r\n                }\r\n            }\r\n            return result;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region State Cache\r\n\r\n        private static Dictionary<int, object> _states = new Dictionary<int, object>();\r\n\r\n        /// <summary>\r\n        /// Get a state object that can be stored between PropertyHandler.OnGUI calls.\r\n        /// </summary>\r\n        /// <param name=\"property\"></param>\r\n        /// <returns></returns>\r\n        public static T GetCachedState<T>(SerializedProperty property)\r\n        {\r\n            if (property == null) return default(T);\r\n\r\n            int hash = com.spacepuppyeditor.Internal.PropertyHandlerCache.GetIndexRespectingPropertyHash(property);\r\n            object result;\r\n            if (_states.TryGetValue(hash, out result) && result is T)\r\n                return (T)result;\r\n            else\r\n                return default(T);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Set a state object that can be stored between PropertyHandler.OnGUI calls.\r\n        /// </summary>\r\n        /// <param name=\"property\"></param>\r\n        /// <param name=\"state\"></param>\r\n        public static void SetCachedState(SerializedProperty property, object state)\r\n        {\r\n            if (property == null) return;\r\n\r\n            int hash = com.spacepuppyeditor.Internal.PropertyHandlerCache.GetIndexRespectingPropertyHash(property);\r\n            if (state == null)\r\n                _states.Remove(hash);\r\n            else\r\n                _states[hash] = state;\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBaseEditor/EditorHierarchyAlternateContextMenuEvents.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n\r\n    [InitializeOnLoad()]\r\n    public static class EditorHierarchyAlternateContextMenuEvents\r\n    {\r\n\r\n        public const string MENU_PREFIX_ALTCONTEXT = \"CONTEXT/ALT/\";\r\n\r\n        #region Static Fields\r\n\r\n        private static bool _isActive;\r\n\r\n        #endregion\r\n\r\n        #region STATIC CONSTRUCTOR\r\n\r\n        static EditorHierarchyAlternateContextMenuEvents()\r\n        {\r\n            SetActive(SpacepuppySettings.UseHierarchyAlternateContextMenu);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public static bool IsActive\r\n        {\r\n            get { return _isActive; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public static void SetActive(bool active)\r\n        {\r\n            if (_isActive == active) return;\r\n\r\n            _isActive = active;\r\n            if (_isActive)\r\n            {\r\n                EditorApplication.hierarchyWindowItemOnGUI -= OnHierarchyItemGUI;\r\n\r\n                EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyItemGUI;\r\n            }\r\n            else\r\n            {\r\n                EditorApplication.hierarchyWindowItemOnGUI -= OnHierarchyItemGUI;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        \r\n        #region HierarchWindowItemGUI\r\n\r\n        private static void OnHierarchyItemGUI(int instanceID, Rect selectionRect)\r\n        {\r\n            var ev = Event.current;\r\n            if (ev != null && selectionRect.Contains(ev.mousePosition)\r\n                && ev.button == 1 && ev.control && Event.current.type <= EventType.MouseUp)\r\n            {\r\n                // Find what object this is\r\n                GameObject clickedObject = EditorUtility.InstanceIDToObject(instanceID) as GameObject;\r\n\r\n                if (clickedObject != null)\r\n                {\r\n                    var mpos = ev.mousePosition;\r\n                    var rect = new Rect(mpos.x, mpos.y, 0f, 0f);\r\n                    var cmnd = new MenuCommand(clickedObject, instanceID);\r\n                    Selection.activeGameObject = clickedObject;\r\n                    EditorUtility.DisplayPopupMenu(rect, MENU_PREFIX_ALTCONTEXT, cmnd);\r\n                    ev.Use();\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/EditorHierarchyDrawerEvents.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n\r\n    [InitializeOnLoad()]\r\n    public static class EditorHierarchyDrawerEvents\r\n    {\r\n\r\n\r\n        #region Static Fields\r\n\r\n        private static Dictionary<System.Type, System.Type> _componentTypeToDrawerType = new Dictionary<System.Type, System.Type>();\r\n        private static List<System.Type> _supportsChildTypes = new List<System.Type>();\r\n        private static List<System.Type> _supportedInterfaces = new List<System.Type>();\r\n\r\n        private static Dictionary<int, HierarchyDrawer> _activeObjects = new Dictionary<int, HierarchyDrawer>();\r\n        private static List<int> _activeGameObjects = new List<int>();\r\n        private static List<int> _ignoredIds = new List<int>();\r\n\r\n        private static bool _isActive;\r\n\r\n        #endregion\r\n\r\n        #region STATIC CONSTRUCTOR\r\n\r\n        static EditorHierarchyDrawerEvents()\r\n        {\r\n            SetActive(SpacepuppySettings.UseHierarchDrawer);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public static bool IsActive\r\n        {\r\n            get { return _isActive; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public static void SetActive(bool active)\r\n        {\r\n            if (_isActive == active) return;\r\n\r\n            _isActive = active;\r\n            if(_isActive)\r\n            {\r\n                SyncAvailableDrawerTypes();\r\n                SyncActiveDrawers();\r\n                \r\n                EditorApplication.hierarchyChanged -= OnHierarchyChanged;\r\n                EditorApplication.hierarchyWindowItemOnGUI -= OnHierarchyItemGUI;\r\n                EditorApplication.playModeStateChanged -= OnPlaymodeChanged;\r\n\r\n                EditorApplication.hierarchyChanged += OnHierarchyChanged;\r\n                EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyItemGUI;\r\n                EditorApplication.playModeStateChanged += OnPlaymodeChanged;\r\n            }\r\n            else\r\n            {\r\n                _componentTypeToDrawerType.Clear();\r\n                _supportsChildTypes.Clear();\r\n                _supportedInterfaces.Clear();\r\n                foreach (var drawer in _activeObjects.Values)\r\n                {\r\n                    drawer.OnDisable();\r\n                }\r\n                _activeObjects.Clear();\r\n                _activeGameObjects.Clear();\r\n                _ignoredIds.Clear();\r\n\r\n                EditorApplication.hierarchyChanged -= OnHierarchyChanged;\r\n                EditorApplication.hierarchyWindowItemOnGUI -= OnHierarchyItemGUI;\r\n                EditorApplication.playModeStateChanged -= OnPlaymodeChanged;\r\n            }\r\n        }\r\n\r\n        public static bool HasDrawer(System.Type tp)\r\n        {\r\n            System.Type drawerType;\r\n            return HasDrawer(tp, out drawerType);\r\n        }\r\n\r\n        public static bool HasDrawer(System.Type tp, out System.Type drawerType)\r\n        {\r\n            if (_componentTypeToDrawerType.ContainsKey(tp))\r\n            {\r\n                drawerType = _componentTypeToDrawerType[tp];\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                var compTp = typeof(Component);\r\n                bool found = false;\r\n                if (_supportsChildTypes.Count > 0)\r\n                {\r\n                    var btp = tp.BaseType;\r\n                    while (TypeUtil.IsType(btp, compTp))\r\n                    {\r\n                        if (_supportsChildTypes.Contains(btp))\r\n                        {\r\n                            drawerType = _componentTypeToDrawerType[btp];\r\n                            return true;\r\n                        }\r\n                        btp = btp.BaseType;\r\n                    }\r\n                }\r\n\r\n                if (!found && _supportedInterfaces.Count > 0)\r\n                {\r\n                    foreach (var itp in _supportedInterfaces)\r\n                    {\r\n                        if (TypeUtil.IsType(tp, itp))\r\n                        {\r\n                            drawerType = _componentTypeToDrawerType[itp];\r\n                            return true;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            drawerType = null;\r\n            return false;\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n        private static void SyncAvailableDrawerTypes()\r\n        {\r\n            var attribTp = typeof(CustomHierarchyDrawerAttribute);\r\n            var compTp = typeof(Component);\r\n            _componentTypeToDrawerType.Clear();\r\n            _supportsChildTypes.Clear();\r\n            _supportedInterfaces.Clear();\r\n            foreach(var tp in TypeUtil.GetTypesAssignableFrom(typeof(HierarchyDrawer)))\r\n            {\r\n                var attribs = tp.GetCustomAttributes(attribTp, false) as CustomHierarchyDrawerAttribute[];\r\n                foreach(var attrib in attribs)\r\n                {\r\n                    if(TypeUtil.IsType(attrib.TargetType, compTp))\r\n                    {\r\n                        _componentTypeToDrawerType[attrib.TargetType] = tp;\r\n                        if(attrib.UseForChildren)\r\n                        {\r\n                            _supportsChildTypes.Add(tp);\r\n                        }\r\n                    }\r\n                    else if(attrib.TargetType.IsInterface)\r\n                    {\r\n                        _componentTypeToDrawerType[attrib.TargetType] = tp;\r\n                        _supportedInterfaces.Add(attrib.TargetType);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        private static void SyncActiveDrawers()\r\n        {\r\n            var gos = Object.FindObjectsOfType<GameObject>();\r\n            var comps = Object.FindObjectsOfType<Component>();\r\n            var ids = (from c in comps select c.GetInstanceID()).ToArray();\r\n\r\n            //remove dead entries\r\n            foreach(var id in _activeObjects.Keys.Except(ids).ToArray())\r\n            {\r\n                _activeObjects[id].OnDisable();\r\n                _activeObjects.Remove(id);\r\n            }\r\n            foreach(var id in _activeGameObjects.Except(from g in gos select g.GetInstanceID()).ToArray())\r\n            {\r\n                _activeGameObjects.Remove(id);\r\n            }\r\n            foreach (var id in _ignoredIds.Except(ids).ToArray())\r\n            {\r\n                _ignoredIds.Remove(id);\r\n            }\r\n\r\n            //add new entries\r\n            for(int i = 0; i < ids.Length; i++)\r\n            {\r\n                if (_activeObjects.ContainsKey(ids[i])) continue;\r\n                if (_ignoredIds.Contains(ids[i])) continue;\r\n\r\n                var c = comps[i];\r\n                System.Type tp;\r\n                if(HasDrawer(c.GetType(), out tp))\r\n                {\r\n                    try\r\n                    {\r\n                        var drawer = System.Activator.CreateInstance(tp) as HierarchyDrawer;\r\n                        drawer.Init(c);\r\n                        drawer.OnEnable();\r\n                        _activeObjects[c.GetInstanceID()] = drawer;\r\n                        var gid = c.gameObject.GetInstanceID();\r\n                        if (!_activeGameObjects.Contains(gid)) _activeGameObjects.Add(gid);\r\n                    }\r\n                    catch { }\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region HierarchWindowItemGUI\r\n\r\n        private static void OnHierarchyChanged()\r\n        {\r\n            SyncActiveDrawers();\r\n        }\r\n\r\n        private static void OnPlaymodeChanged(PlayModeStateChange mode)\r\n        {\r\n            foreach(var pair in _activeObjects)\r\n            {\r\n                var c = EditorUtility.InstanceIDToObject(pair.Key) as Component;\r\n                pair.Value.Init(c);\r\n            }\r\n        }\r\n\r\n        private static void OnHierarchyItemGUI(int instanceID, Rect selectionRect)\r\n        {\r\n            if (!_activeGameObjects.Contains(instanceID)) return;\r\n\r\n            var go = EditorUtility.InstanceIDToObject(instanceID) as GameObject;\r\n            if (go == null) return;\r\n            HierarchyDrawer drawer;\r\n            foreach(var c in go.GetComponents<Component>())\r\n            {\r\n                if (c == null) continue;\r\n\r\n                var id = c.GetInstanceID();\r\n                if (_activeObjects.TryGetValue(id, out drawer))\r\n                {\r\n                    //drawer.Init(c);\r\n                    drawer.OnHierarchyGUI(selectionRect);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/EditorProjectPrefs.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Xml.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n\r\n    public static class EditorProjectPrefs\r\n    {\r\n\r\n        #region Static Interface\r\n\r\n        private const string PREFS_DIR = @\"../ProjectSettings\";\r\n        private const string PREFS_PATH = PREFS_DIR + @\"/Spacepuppy.EditorProjectPrefs.xml\";\r\n        private static string _path;\r\n        private static bool _autoSaveGroupSettingsOnModify = true;\r\n        private static XDocument _xdoc;\r\n        private static string _projectId;\r\n\r\n        private static LocalSettings _local;\r\n        private static GroupSettings _group;\r\n\r\n        static EditorProjectPrefs()\r\n        {\r\n            _path = System.IO.Path.Combine(Application.dataPath, PREFS_PATH);\r\n            try\r\n            {\r\n                _xdoc = XDocument.Load(_path);\r\n            }\r\n            catch\r\n            {\r\n                _xdoc = null;\r\n            }\r\n\r\n            if(_xdoc == null)\r\n            {\r\n                _projectId = \"SPProj.\" + System.Guid.NewGuid().ToString();\r\n                _xdoc = new XDocument(new XElement(\"root\"));\r\n                _xdoc.Root.Add(new XAttribute(\"projectId\", _projectId));\r\n\r\n                var sdir = System.IO.Path.GetDirectoryName(_path);\r\n                if (!System.IO.Directory.Exists(sdir)) System.IO.Directory.CreateDirectory(sdir);\r\n                _xdoc.Save(_path);\r\n            }\r\n            else\r\n            {\r\n                var xattrib = _xdoc.Root.Attribute(\"projectId\");\r\n                if (xattrib == null)\r\n                {\r\n                    xattrib = new XAttribute(\"projectId\", \"SPProj.\" + System.Guid.NewGuid().ToString());\r\n                    _xdoc.Root.Add(xattrib);\r\n                    _xdoc.Save(_path);\r\n                }\r\n                else if (string.IsNullOrEmpty(xattrib.Value))\r\n                {\r\n                    xattrib.Value = \"SPProj.\" + System.Guid.NewGuid().ToString();\r\n                    _xdoc.Save(_path);\r\n                }\r\n                _projectId = xattrib.Value;\r\n            }\r\n\r\n            _local = new LocalSettings();\r\n            _group = new GroupSettings();\r\n        }\r\n\r\n        public static LocalSettings Local { get { return _local; } }\r\n\r\n        public static GroupSettings Group { get { return _group; } }\r\n\r\n        public static bool AutoSaveGroupSettingsOnModify\r\n        {\r\n            get { return _autoSaveGroupSettingsOnModify; }\r\n            set { _autoSaveGroupSettingsOnModify = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        public class LocalSettings\r\n        {\r\n\r\n            public void DeleteAll()\r\n            {\r\n                foreach (var skey in GetAllKeys())\r\n                {\r\n                    EditorPrefs.DeleteKey(skey);\r\n                }\r\n            }\r\n\r\n            public void DeleteKey(string key)\r\n            {\r\n                key = GetKey(key);\r\n                EditorPrefs.DeleteKey(key);\r\n            }\r\n\r\n            public bool HasKey(string key)\r\n            {\r\n                key = GetKey(key);\r\n                return EditorPrefs.HasKey(key);\r\n            }\r\n\r\n            public bool GetBool(string key)\r\n            {\r\n                key = GetKey(key);\r\n                return EditorPrefs.GetBool(key);\r\n            }\r\n            public bool GetBool(string key, bool defaultValue)\r\n            {\r\n                key = GetKey(key);\r\n                return EditorPrefs.GetBool(key, defaultValue);\r\n            }\r\n\r\n            public int GetInt(string key)\r\n            {\r\n                key = GetKey(key);\r\n                return EditorPrefs.GetInt(key);\r\n            }\r\n            public int GetInt(string key, int defaultValue)\r\n            {\r\n                key = GetKey(key);\r\n                return EditorPrefs.GetInt(key, defaultValue);\r\n            }\r\n\r\n            public float GetFloat(string key)\r\n            {\r\n                key = GetKey(key);\r\n                return EditorPrefs.GetFloat(key);\r\n            }\r\n            public float GetFloat(string key, float defaultValue)\r\n            {\r\n                key = GetKey(key);\r\n                return EditorPrefs.GetFloat(key, defaultValue);\r\n            }\r\n\r\n            public string GetString(string key)\r\n            {\r\n                key = GetKey(key);\r\n                return EditorPrefs.GetString(key);\r\n            }\r\n            public string GetString(string key, string defaultValue)\r\n            {\r\n                key = GetKey(key);\r\n                return EditorPrefs.GetString(key, defaultValue);\r\n            }\r\n\r\n            public T GetEnum<T>(string key) where T : struct, System.IConvertible\r\n            {\r\n                key = GetKey(key);\r\n                int i = EditorPrefs.GetInt(key);\r\n                return ConvertUtil.ToEnum<T>(i);\r\n            }\r\n\r\n            public T GetEnum<T>(string key, T defaultValue) where T : struct, System.IConvertible\r\n            {\r\n                key = GetKey(key);\r\n                int i = EditorPrefs.GetInt(key, System.Convert.ToInt32(defaultValue));\r\n                return ConvertUtil.ToEnum<T>(i, defaultValue);\r\n            }\r\n\r\n            public void SetBool(string key, bool value)\r\n            {\r\n                key = GetKey(key);\r\n                EditorPrefs.SetBool(key, value);\r\n            }\r\n\r\n            public void SetInt(string key, int value)\r\n            {\r\n                key = GetKey(key);\r\n                EditorPrefs.SetInt(key, value);\r\n            }\r\n\r\n            public void SetFloat(string key, float value)\r\n            {\r\n                key = GetKey(key);\r\n                EditorPrefs.SetFloat(key, value);\r\n            }\r\n\r\n            public void SetString(string key, string value)\r\n            {\r\n                key = GetKey(key);\r\n                EditorPrefs.SetString(key, value);\r\n            }\r\n\r\n            public void SetEnum<T>(string key, T value) where T : struct, System.IConvertible\r\n            {\r\n                key = GetKey(key);\r\n                EditorPrefs.SetInt(key, System.Convert.ToInt32(value));\r\n            }\r\n\r\n            #region Utils\r\n\r\n            private string GetKey(string id)\r\n            {\r\n                return _projectId + \".\" + id;\r\n            }\r\n\r\n            private IEnumerable<string> GetAllKeys()\r\n            {\r\n                if (string.IsNullOrEmpty(_projectId)) yield break;\r\n\r\n                var prefsKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@\"Software\\Unity Technologies\\Unity Editor 4.x\");\r\n                foreach (var skey in prefsKey.GetValueNames())\r\n                {\r\n                    if (skey.StartsWith(_projectId)) yield return skey;\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        public class GroupSettings\r\n        {\r\n\r\n            private const string NODE_NAME = \"setting\";\r\n            \r\n            public void Save()\r\n            {\r\n                _xdoc.Save(_path);\r\n            }\r\n\r\n\r\n            public void DeleteAll()\r\n            {\r\n                _xdoc.Root.Elements().Remove();\r\n                if (_autoSaveGroupSettingsOnModify) this.Save();\r\n            }\r\n\r\n            public void DeleteKey(string key)\r\n            {\r\n                _xdoc.Root.Elements(key).Remove();\r\n                if (_autoSaveGroupSettingsOnModify) this.Save();\r\n            }\r\n\r\n            public bool HasKey(string key)\r\n            {\r\n                return _xdoc.Root.Elements(key).Count() > 0;\r\n            }\r\n\r\n            public bool GetBool(string key)\r\n            {\r\n                return this.GetBool(key, false);\r\n            }\r\n            public bool GetBool(string key, bool defaultValue)\r\n            {\r\n                var xel = (from x in _xdoc.Root.Elements(NODE_NAME) where x.Attribute(\"id\").Value == key select x).FirstOrDefault();\r\n                if (xel == null) return defaultValue;\r\n                var xattrib = xel.Attribute(\"value\");\r\n                return (xattrib != null) ? ConvertUtil.ToBool(xel.Attribute(\"value\").Value) : defaultValue;\r\n            }\r\n\r\n            public int GetInt(string key)\r\n            {\r\n                return this.GetInt(key, 0);\r\n            }\r\n            public int GetInt(string key, int defaultValue)\r\n            {\r\n                var xel = (from x in _xdoc.Root.Elements(NODE_NAME) where x.Attribute(\"id\").Value == key select x).FirstOrDefault();\r\n                if (xel == null) return defaultValue;\r\n                var xattrib = xel.Attribute(\"value\");\r\n                return (xattrib != null) ? ConvertUtil.ToInt(xel.Attribute(\"value\").Value) : defaultValue;\r\n            }\r\n\r\n            public float GetFloat(string key)\r\n            {\r\n                return this.GetFloat(key, 0f);\r\n            }\r\n            public float GetFloat(string key, float defaultValue)\r\n            {\r\n                var xel = (from x in _xdoc.Root.Elements(NODE_NAME) where x.Attribute(\"id\").Value == key select x).FirstOrDefault();\r\n                if (xel == null) return defaultValue;\r\n                var xattrib = xel.Attribute(\"value\");\r\n                return (xattrib != null) ? ConvertUtil.ToSingle(xel.Attribute(\"value\").Value) : defaultValue;\r\n            }\r\n\r\n            public string GetString(string key)\r\n            {\r\n                return this.GetString(key, string.Empty);\r\n            }\r\n            public string GetString(string key, string defaultValue)\r\n            {\r\n                var xel = (from x in _xdoc.Root.Elements(NODE_NAME) where x.Attribute(\"id\").Value == key select x).FirstOrDefault();\r\n                if (xel == null) return defaultValue;\r\n                var xattrib = xel.Attribute(\"value\");\r\n                return (xattrib != null) ? xel.Attribute(\"value\").Value : defaultValue;\r\n            }\r\n\r\n            public void SetBool(string key, bool value)\r\n            {\r\n                this.SetValue(key, value);\r\n            }\r\n\r\n            public void SetInt(string key, int value)\r\n            {\r\n                this.SetValue(key, value);\r\n            }\r\n\r\n            public void SetFloat(string key, float value)\r\n            {\r\n                this.SetValue(key, value);\r\n            }\r\n\r\n            public void SetString(string key, string value)\r\n            {\r\n                this.SetValue(key, value);\r\n            }\r\n\r\n\r\n\r\n            private void SetValue(string key, object value)\r\n            {\r\n                var sval = StringUtil.ToLower(ConvertUtil.ToString(value));\r\n\r\n                var xel = (from x in _xdoc.Root.Elements(NODE_NAME) where x.Attribute(\"id\").Value == key select x).FirstOrDefault();\r\n                if (xel == null)\r\n                {\r\n                    xel = new XElement(NODE_NAME, new XAttribute(\"id\", key), new XAttribute(\"value\", sval));\r\n                    _xdoc.Root.Add(xel);\r\n                }\r\n                else\r\n                {\r\n                    var xattrib = xel.Attribute(\"value\");\r\n                    if (xattrib != null)\r\n                        xattrib.Value = sval;\r\n                    else\r\n                        xel.Add(new XAttribute(\"value\", sval));\r\n                }\r\n                if (_autoSaveGroupSettingsOnModify) this.Save();\r\n            }\r\n\r\n        }\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBaseEditor/EditorSceneEvents.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n\r\n    [InitializeOnLoad()]\r\n    public class EditorSceneEvents : SPEditor\r\n    {\r\n\r\n        #region Static Fields\r\n\r\n        //object added to scene vars\r\n        private static bool _dragPerformedLastTime;\r\n\r\n        #endregion\r\n\r\n        #region STATIC CONSTRUCTOR\r\n\r\n        static EditorSceneEvents()\r\n        {\r\n            SceneView.onSceneGUIDelegate -= OnSceneGUI;\r\n            SceneView.onSceneGUIDelegate += OnSceneGUI;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Events\r\n\r\n        public delegate void OnPrefabAddedToSceneHandler(GameObject objectAdded);\r\n        public static event OnPrefabAddedToSceneHandler OnPrefabAddedToScene;\r\n\r\n        #endregion\r\n\r\n        #region OnSceneGUI Message\r\n\r\n        private static void OnSceneGUI(SceneView scene)\r\n        {\r\n            ProcessObjectAddedToScene();\r\n        }\r\n\r\n        private static void ProcessObjectAddedToScene()\r\n        {\r\n            if (_dragPerformedLastTime && OnPrefabAddedToScene != null)\r\n            {\r\n                if (Selection.activeGameObject != null)\r\n                {\r\n                    OnPrefabAddedToScene(Selection.activeGameObject);\r\n                }\r\n            }\r\n\r\n            if (Event.current.type == EventType.DragPerform &&\r\n                DragAndDrop.objectReferences.Length > 0 &&\r\n                DragAndDrop.objectReferences[0] is GameObject)\r\n            {\r\n                _dragPerformedLastTime = true;\r\n            }\r\n            else\r\n            {\r\n                _dragPerformedLastTime = false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyBaseEditor/ExecutionOrderHelper.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor\n{\n\n    /*\n     * TODO\n     * \n    public static class ExecutionOrderHelper\n    {\n        \n        private const string PB_TITLE = \"Updating Execution Order\";\n        private const string ERR_MESSAGE = \"Unable to locate and set execution order for {0}\";\n\n        [InitializeOnLoadMethod]\n        private static void OnLoad()\n        {\n            if (EditorUtility.DisplayCancelableProgressBar(PB_TITLE, \"Scanning for types\", 0f)) return;\n\n            var table = new Dictionary<System.Type, ExecutionOrderAttribute>();\n            \n            foreach(var tp in TypeUtil.GetTypesAssignableFrom(typeof(Component)))\n            {\n                var attrib = tp.GetCustomAttributes(typeof(ExecutionOrderAttribute), false).FirstOrDefault() as ExecutionOrderAttribute;\n                if (attrib == null) continue;\n\n                table[tp] = attrib;\n            }\n            \n            if (EditorUtility.DisplayCancelableProgressBar(PB_TITLE, \"Scanning for inherited types.\", 0.05f)) return;\n\n            foreach (var pair in table)\n            {\n                if(pair.Value.Inherited)\n                {\n                    foreach(var tp in TypeUtil.GetTypesAssignableFrom(pair.Key))\n                    {\n                        if (!table.ContainsKey(tp)) table[tp] = new ExecutionOrderAttribute(pair.Value.Order);\n                    }\n                }\n            }\n\n        }\n        \n    }\n\n    */\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Geom/CubicBezierCurveEditorWindow.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Geom\r\n{\r\n\r\n    public class CubicBezierCurveEditorWindow : EditorWindow\r\n    {\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Geom/CubicBezierCurvePropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Geom\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(CubicBezierCurve))]\r\n    public class CubicBezierCurvePropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            position = EditorGUI.PrefixLabel(position, label);\r\n\r\n            var curve = EditorHelper.GetTargetObjectOfProperty(property) as CubicBezierCurve;\r\n            if (curve == null) return;\r\n\r\n            DoCurveField(position, curve, Color.green, property);\r\n        }\r\n\r\n\r\n\r\n        internal static void DoCurveField(Rect position, CubicBezierCurve curve, Color color, SerializedProperty property)\r\n        {\r\n            int id = GUIUtility.GetControlID(FocusType.Passive, position);\r\n            Event current = Event.current;\r\n            position.width = Mathf.Max(position.width, 2f);\r\n            position.height = Mathf.Max(position.height, 2f);\r\n            \r\n            //TODO - update open curve editor window\r\n\r\n            EventType typeForControl = current.GetTypeForControl(id);\r\n            switch(typeForControl)\r\n            {\r\n                case EventType.KeyDown:\r\n\r\n                    break;\r\n                case EventType.Repaint:\r\n                    Rect position1 = position;\r\n                    ++position1.y;\r\n                    --position1.height;\r\n                    SPEditorGUI.DrawCurveSwatch(position1, curve, color, Color.gray);\r\n                    //EditorStyles.colorPickerBox.Draw(position1, GUIContent.none, id, false);\r\n                    break;\r\n                case EventType.MouseDown:\r\n                    if(position.Contains(current.mousePosition))\r\n                    {\r\n                        //TODO - show CubicBezierCurveEditorWindow\r\n\r\n                        current.Use();\r\n                        GUIUtility.ExitGUI();\r\n                    }\r\n                    break;\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Geom/IntervalInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Geom\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(Interval))]\r\n    public class IntervalInspector : PropertyDrawer\r\n    {\r\n        private const string PROP_MIN = \"_min\";\r\n        private const string PROP_MAX = \"_max\";\r\n\r\n        private GUIContent[] _defaultLabels = new GUIContent[] { new GUIContent(\"Min\"), new GUIContent(\"Max\") };\r\n        private GUIContent[] _reverseLabels = new GUIContent[] { new GUIContent(\"Max\"), new GUIContent(\"Min\") };\r\n        private float[] _values = new float[2];\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            return base.GetPropertyHeight(property, label);\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var prop_min = property.FindPropertyRelative(PROP_MIN);\r\n            var prop_max = property.FindPropertyRelative(PROP_MAX);\r\n\r\n            var attrib = this.fieldInfo.GetCustomAttributes(typeof(Interval.ConfigAttribute), false).Cast<Interval.ConfigAttribute>().FirstOrDefault();\r\n            bool reverse = (attrib != null) ? attrib.Reverse : false;\r\n            float minValue = (attrib != null) ? attrib.MinValue : float.NegativeInfinity;\r\n            float maxValue = (attrib != null) ? attrib.MaxValue : float.PositiveInfinity;\r\n            bool discreteValuesOnly = (attrib != null) ? attrib.DiscreteValuesOnly : false;\r\n\r\n\r\n            GUIContent[] subLabels;\r\n            float labelWidth;\r\n\r\n            if (reverse)\r\n            {\r\n                subLabels = (attrib != null) ? new GUIContent[] { EditorHelper.TempContent(attrib.MaxLabel), EditorHelper.TempContent(attrib.MinLabel) } : _defaultLabels;\r\n                labelWidth = (attrib != null) ? attrib.LabelWidth : 30f;\r\n                _values[1] = prop_min.floatValue;\r\n                _values[0] = prop_max.floatValue;\r\n            }\r\n            else\r\n            {\r\n                subLabels = (attrib != null) ? new GUIContent[] { EditorHelper.TempContent(attrib.MinLabel), EditorHelper.TempContent(attrib.MaxLabel) } : _defaultLabels;\r\n                labelWidth = (attrib != null) ? attrib.LabelWidth : 30f;\r\n                _values[0] = prop_min.floatValue;\r\n                _values[1] = prop_max.floatValue;\r\n            }\r\n\r\n            EditorGUI.BeginProperty(position, label, property);\r\n            EditorGUI.BeginChangeCheck();\r\n            SPEditorGUI.DelayedMultiFloatField(position, label, subLabels, _values, labelWidth);\r\n            if (EditorGUI.EndChangeCheck())\r\n            {\r\n                _values[0] = Mathf.Clamp(_values[0], minValue, maxValue);\r\n                _values[1] = Mathf.Clamp(_values[1], minValue, maxValue);\r\n                if (discreteValuesOnly) _values[0] = Mathf.Round(_values[0]);\r\n                if (discreteValuesOnly) _values[1] = Mathf.Round(_values[1]);\r\n\r\n                float min = reverse ? _values[1] : _values[0];\r\n                float max = reverse ? _values[0] : _values[1];\r\n\r\n                if(!MathUtil.FuzzyEqual(min, prop_min.floatValue))\r\n                {\r\n                    //changed min\r\n                    if (max < min) max = min;\r\n                }\r\n                else\r\n                {\r\n                    //changed max\r\n                    if (min > max) min = max;\r\n                }\r\n\r\n                prop_min.floatValue = min;\r\n                prop_max.floatValue = max;\r\n            }\r\n            EditorGUI.EndProperty();\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Geom/PlanarSurfaceComponentEditor.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Geom;\n\nnamespace com.spacepuppyeditor.Geom\n{\n\n    [CustomEditor(typeof(PlanarSurfaceComponent))]\n    public class PlanarSurfaceComponentEditor : SPEditor\n    {\n\n\n        [DrawGizmo(GizmoType.Selected, drawnType = typeof(PlanarSurfaceComponent))]\n        static void DrawGizmos(PlanarSurfaceComponent surface, GizmoType gizmoType)\n        {\n            var c = Color.green;\n            c.a = 0.3f;\n            Gizmos.color = c;\n            Gizmos.matrix = Matrix4x4.TRS(surface.transform.position, surface.transform.rotation, Vector3.one);\n\n            Gizmos.DrawCube(Vector3.zero, new Vector3(10f, 10f, 0.05f));\n\n            Gizmos.matrix = Matrix4x4.identity;\n        }\n\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Geom/TransformAltContextMenu.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Geom\r\n{\r\n    public static class TransformAltContextMenu\r\n    {\r\n\r\n        [MenuItem(\"CONTEXT/ALT/Zero Out\", priority = 0)]\r\n        public static void ZeroOut()\r\n        {\r\n            foreach(var t in Selection.transforms)\r\n            {\r\n                t.localPosition = Vector3.zero;\r\n                t.localRotation = Quaternion.identity;\r\n                t.localScale = Vector3.one;\r\n            }\r\n        }\r\n\r\n        [MenuItem(\"CONTEXT/ALT/Zero Out 3DS Max\", priority = 1)]\r\n        public static void ZeroOut3DSMAX()\r\n        {\r\n            foreach(var t in Selection.transforms)\r\n            {\r\n                t.localPosition = Vector3.zero;\r\n                t.localRotation = SPConstants.ROT_3DSMAX_TO_UNITY;\r\n                t.localScale = Vector3.one;\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/HandlesHelper.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n    public static class HandlesHelper\r\n    {\r\n\r\n        #region Private Draw Utils\r\n\r\n        private static Color RealHandleColor\r\n        {\r\n            get\r\n            {\r\n                return Handles.color * new Color(1f, 1f, 1f, 0.5f) + (!Handles.lighting ? new Color(0.0f, 0.0f, 0.0f, 0.0f) : new Color(0.0f, 0.0f, 0.0f, 0.5f));\r\n            }\r\n        }\r\n\r\n        private static Matrix4x4 StartDraw(Vector3 position, Quaternion rotation, Vector3 scale)\r\n        {\r\n            Shader.SetGlobalColor(\"_HandleColor\", RealHandleColor);\r\n            Shader.SetGlobalFloat(\"_HandleSize\", 1.0f);\r\n            Matrix4x4 mat = Handles.matrix * Matrix4x4.TRS(position, rotation, scale);\r\n            Shader.SetGlobalMatrix(\"_ObjectToWorld\", mat);\r\n            HandleUtility.handleMaterial.SetPass(0);\r\n            return mat;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        public static void DrawWireCollider(Collider c)\r\n        {\r\n            if (c == null) throw new System.ArgumentNullException(\"c\");\r\n\r\n            if (c is BoxCollider)\r\n            {\r\n                var box = c as BoxCollider;\r\n                DrawWireRectoid(box.transform.TransformPoint(box.center), box.transform.rotation, Vector3.Scale(box.size, box.transform.lossyScale));\r\n            }\r\n            else if (c is SphereCollider)\r\n            {\r\n                var sphereGeom = com.spacepuppy.Geom.Sphere.FromCollider(c as SphereCollider);\r\n                DrawWireSphere(sphereGeom.Center, c.transform.rotation, sphereGeom.Radius);\r\n            }\r\n            else if (c is CapsuleCollider)\r\n            {\r\n                var capGeom = com.spacepuppy.Geom.Capsule.FromCollider(c as CapsuleCollider);\r\n                DrawWireCapsule(capGeom.Start, capGeom.End, capGeom.Radius);\r\n            }\r\n            else if (c is CharacterController)\r\n            {\r\n                var capGeom = com.spacepuppy.Geom.Capsule.FromCollider(c as CharacterController);\r\n                DrawWireCapsule(capGeom.Start, capGeom.End, capGeom.Radius);\r\n            }\r\n            else if (c is MeshCollider)\r\n            {\r\n                //not supported\r\n                throw new System.ArgumentException(\"Unsupported collider type '\" + c.GetType().Name + \"'.\", \"c\");\r\n            }\r\n            else\r\n            {\r\n                //not supported\r\n                throw new System.ArgumentException(\"Unsupported collider type '\" + c.GetType().Name + \"'.\", \"c\");\r\n            }\r\n\r\n        }\r\n\r\n        public static void DrawWireRectoid(Vector3 center, Quaternion rot, Vector3 size)\r\n        {\r\n            Vector3[] verts = new Vector3[5];\r\n            Vector3 dir;\r\n            Vector3 a;\r\n            Vector3 b;\r\n\r\n            //draw top\r\n            dir = Vector3.up * size.y / 2.0f;\r\n            a = Vector3.right * size.x / 2.0f;\r\n            b = Vector3.forward * size.z / 2.0f;\r\n\r\n            verts[0] = center + rot * (dir + a + b);\r\n            verts[1] = center + rot * (dir + a - b);\r\n            verts[2] = center + rot * (dir - a - b);\r\n            verts[3] = center + rot * (dir - a + b);\r\n            verts[4] = verts[0];\r\n\r\n            Handles.DrawPolyLine(verts);\r\n\r\n            //draw bottom\r\n            dir = Vector3.down * size.y / 2.0f;\r\n            a = Vector3.right * size.x / 2.0f;\r\n            b = Vector3.forward * size.z / 2.0f;\r\n\r\n            verts[0] = center + rot * (dir + a + b);\r\n            verts[1] = center + rot * (dir + a - b);\r\n            verts[2] = center + rot * (dir - a - b);\r\n            verts[3] = center + rot * (dir - a + b);\r\n            verts[4] = verts[0];\r\n\r\n            Handles.DrawPolyLine(verts);\r\n\r\n            //draw right\r\n            dir = Vector3.right * size.x / 2.0f;\r\n            a = Vector3.up * size.y / 2.0f;\r\n            b = Vector3.forward * size.z / 2.0f;\r\n\r\n            verts[0] = center + rot * (dir + a + b);\r\n            verts[1] = center + rot * (dir + a - b);\r\n            verts[2] = center + rot * (dir - a - b);\r\n            verts[3] = center + rot * (dir - a + b);\r\n            verts[4] = verts[0];\r\n\r\n            Handles.DrawPolyLine(verts);\r\n\r\n            //draw left\r\n            dir = Vector3.left * size.x / 2.0f;\r\n            a = Vector3.up * size.y / 2.0f;\r\n            b = Vector3.forward * size.z / 2.0f;\r\n\r\n            verts[0] = center + rot * (dir + a + b);\r\n            verts[1] = center + rot * (dir + a - b);\r\n            verts[2] = center + rot * (dir - a - b);\r\n            verts[3] = center + rot * (dir - a + b);\r\n            verts[4] = verts[0];\r\n\r\n            Handles.DrawPolyLine(verts);\r\n\r\n            //draw front\r\n            dir = Vector3.forward * size.z / 2.0f;\r\n            a = Vector3.right * size.x / 2.0f;\r\n            b = Vector3.up * size.y / 2.0f;\r\n\r\n            verts[0] = center + rot * (dir + a + b);\r\n            verts[1] = center + rot * (dir + a - b);\r\n            verts[2] = center + rot * (dir - a - b);\r\n            verts[3] = center + rot * (dir - a + b);\r\n            verts[4] = verts[0];\r\n\r\n            Handles.DrawPolyLine(verts);\r\n\r\n            //draw back\r\n            dir = Vector3.back * size.z / 2.0f;\r\n            a = Vector3.right * size.x / 2.0f;\r\n            b = Vector3.up * size.y / 2.0f;\r\n\r\n            verts[0] = center + rot * (dir + a + b);\r\n            verts[1] = center + rot * (dir + a - b);\r\n            verts[2] = center + rot * (dir - a - b);\r\n            verts[3] = center + rot * (dir - a + b);\r\n            verts[4] = verts[0];\r\n\r\n            Handles.DrawPolyLine(verts);\r\n        }\r\n\r\n        public static void DrawWireSphere(Vector3 center, Quaternion rot, float radius)\r\n        {\r\n            Vector3 norm;\r\n            Vector3 start;\r\n\r\n            //draw right\r\n            norm = rot * Vector3.right;\r\n            start = rot * Vector3.up;\r\n\r\n            Handles.DrawWireArc(center, norm, start, 360.0f, radius);\r\n\r\n            //draw front\r\n            norm = rot * Vector3.forward;\r\n            start = rot * Vector3.up;\r\n\r\n            Handles.DrawWireArc(center, norm, start, 360.0f, radius);\r\n\r\n\r\n            //draw top\r\n            norm = rot * Vector3.up;\r\n            start = rot * Vector3.forward;\r\n\r\n            Handles.DrawWireArc(center, norm, start, 360.0f, radius);\r\n\r\n        }\r\n\r\n        public static void DrawWireCapsule(Vector3 bottom, Vector3 top, float radius)\r\n        {\r\n            DrawWireCylinder(bottom, top, radius);\r\n\r\n            var axis = (top - bottom).normalized;\r\n            var rot = Quaternion.FromToRotation(Vector3.up, axis);\r\n\r\n            Vector3 norm;\r\n            Vector3 start;\r\n\r\n            //draw top circles\r\n            norm = rot * Vector3.right;\r\n            start = rot * Vector3.back;\r\n            Handles.DrawWireArc(top, norm, start, 180.0f, radius);\r\n\r\n            norm = rot * Vector3.forward;\r\n            start = rot * Vector3.right;\r\n            Handles.DrawWireArc(top, norm, start, 180.0f, radius);\r\n\r\n            //draw bottom circles\r\n            norm = rot * Vector3.right;\r\n            start = rot * Vector3.forward;\r\n            Handles.DrawWireArc(bottom, norm, start, 180.0f, radius);\r\n\r\n            norm = rot * Vector3.forward;\r\n            start = rot * Vector3.left;\r\n            Handles.DrawWireArc(bottom, norm, start, 180.0f, radius);\r\n        }\r\n\r\n        public static void DrawWireCylinder(Vector3 bottom, Vector3 top, float radius)\r\n        {\r\n            var axis = (top - bottom).normalized;\r\n            var rot = Quaternion.FromToRotation(Vector3.up, axis);\r\n\r\n            //circles\r\n            Vector3 norm = rot * Vector3.up;\r\n            Vector3 start = rot * Vector3.right;\r\n            Handles.DrawWireArc(top, norm, start, 360.0f, radius);\r\n            Handles.DrawWireArc(bottom, norm, start, 360.0f, radius);\r\n\r\n            //lines\r\n            Vector3 a = rot * Vector3.right;\r\n            Vector3 b = rot * Vector3.forward;\r\n\r\n            Handles.DrawPolyLine(bottom + a * radius, top + a * radius);\r\n            Handles.DrawPolyLine(bottom - a * radius, top - a * radius);\r\n            Handles.DrawPolyLine(bottom + b * radius, top + b * radius);\r\n            Handles.DrawPolyLine(bottom - b * radius, top - b * radius);\r\n        }\r\n\r\n\r\n\r\n        public static void DrawCollider(Collider c)\r\n        {\r\n            if (c == null) throw new System.ArgumentNullException(\"c\");\r\n\r\n            if (c is BoxCollider)\r\n            {\r\n                var box = c as BoxCollider;\r\n                DrawRectoid(box.transform.TransformPoint(box.center), box.transform.rotation, Vector3.Scale(box.size, box.transform.lossyScale));\r\n            }\r\n            else if (c is SphereCollider)\r\n            {\r\n                var sphereGeom = com.spacepuppy.Geom.Sphere.FromCollider(c as SphereCollider);\r\n                DrawSphere(sphereGeom.Center, c.transform.rotation, sphereGeom.Radius);\r\n            }\r\n            else if (c is CapsuleCollider)\r\n            {\r\n                var capGeom = com.spacepuppy.Geom.Capsule.FromCollider(c as CapsuleCollider);\r\n                DrawCapsule(capGeom.Start, capGeom.End, capGeom.Radius);\r\n            }\r\n            else if (c is CharacterController)\r\n            {\r\n                var capGeom = com.spacepuppy.Geom.Capsule.FromCollider(c as CharacterController);\r\n                DrawCapsule(capGeom.Start, capGeom.End, capGeom.Radius);\r\n            }\r\n            else if (c is MeshCollider)\r\n            {\r\n                var mc = c as MeshCollider;\r\n                if (mc.sharedMesh != null)\r\n                {\r\n                    DrawMesh(mc.sharedMesh, mc.transform.position, mc.transform.rotation, mc.transform.lossyScale);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                //not supported\r\n                throw new System.ArgumentException(\"Unsupported collider type '\" + c.GetType().Name + \"'.\", \"c\");\r\n            }\r\n        }\r\n\r\n        public static void DrawRectoid(Vector3 center, Quaternion rot, Vector3 size)\r\n        {\r\n            //Vector3[] verts = new Vector3[5];\r\n            //Vector3 dir;\r\n            //Vector3 a;\r\n            //Vector3 b;\r\n\r\n            ////draw top\r\n            //dir = Vector3.up * size.y / 2.0f;\r\n            //a = Vector3.right * size.x / 2.0f;\r\n            //b = Vector3.forward * size.z / 2.0f;\r\n\r\n            //verts[0] = center + rot * (dir + a + b);\r\n            //verts[1] = center + rot * (dir + a - b);\r\n            //verts[2] = center + rot * (dir - a - b);\r\n            //verts[3] = center + rot * (dir - a + b);\r\n            //verts[4] = verts[0];\r\n\r\n            //Handles.DrawSolidRectangleWithOutline(verts, Handles.color, Handles.color);\r\n\r\n            ////draw bottom\r\n            //dir = Vector3.down * size.y / 2.0f;\r\n            //a = Vector3.right * size.x / 2.0f;\r\n            //b = Vector3.forward * size.z / 2.0f;\r\n\r\n            //verts[0] = center + rot * (dir + a + b);\r\n            //verts[1] = center + rot * (dir + a - b);\r\n            //verts[2] = center + rot * (dir - a - b);\r\n            //verts[3] = center + rot * (dir - a + b);\r\n            //verts[4] = verts[0];\r\n\r\n            //Handles.DrawSolidRectangleWithOutline(verts, Handles.color, Handles.color);\r\n\r\n            ////draw right\r\n            //dir = Vector3.right * size.x / 2.0f;\r\n            //a = Vector3.up * size.y / 2.0f;\r\n            //b = Vector3.forward * size.z / 2.0f;\r\n\r\n            //verts[0] = center + rot * (dir + a + b);\r\n            //verts[1] = center + rot * (dir + a - b);\r\n            //verts[2] = center + rot * (dir - a - b);\r\n            //verts[3] = center + rot * (dir - a + b);\r\n            //verts[4] = verts[0];\r\n\r\n            //Handles.DrawSolidRectangleWithOutline(verts, Handles.color, Handles.color);\r\n\r\n            ////draw left\r\n            //dir = Vector3.left * size.x / 2.0f;\r\n            //a = Vector3.up * size.y / 2.0f;\r\n            //b = Vector3.forward * size.z / 2.0f;\r\n\r\n            //verts[0] = center + rot * (dir + a + b);\r\n            //verts[1] = center + rot * (dir + a - b);\r\n            //verts[2] = center + rot * (dir - a - b);\r\n            //verts[3] = center + rot * (dir - a + b);\r\n            //verts[4] = verts[0];\r\n\r\n            //Handles.DrawSolidRectangleWithOutline(verts, Handles.color, Handles.color);\r\n\r\n            ////draw front\r\n            //dir = Vector3.forward * size.z / 2.0f;\r\n            //a = Vector3.right * size.x / 2.0f;\r\n            //b = Vector3.up * size.y / 2.0f;\r\n\r\n            //verts[0] = center + rot * (dir + a + b);\r\n            //verts[1] = center + rot * (dir + a - b);\r\n            //verts[2] = center + rot * (dir - a - b);\r\n            //verts[3] = center + rot * (dir - a + b);\r\n            //verts[4] = verts[0];\r\n\r\n            //Handles.DrawSolidRectangleWithOutline(verts, Handles.color, Handles.color);\r\n\r\n            ////draw back\r\n            //dir = Vector3.back * size.z / 2.0f;\r\n            //a = Vector3.right * size.x / 2.0f;\r\n            //b = Vector3.up * size.y / 2.0f;\r\n\r\n            //verts[0] = center + rot * (dir + a + b);\r\n            //verts[1] = center + rot * (dir + a - b);\r\n            //verts[2] = center + rot * (dir - a - b);\r\n            //verts[3] = center + rot * (dir - a + b);\r\n            //verts[4] = verts[0];\r\n\r\n            //Handles.DrawSolidRectangleWithOutline(verts, Handles.color, Handles.color);\r\n\r\n\r\n\r\n            var mat = StartDraw(center, rot, size);\r\n            Graphics.DrawMeshNow(PrimitiveUtil.CubeMesh, mat);\r\n        }\r\n\r\n        public static void DrawSphere(Vector3 center, Quaternion rot, float radius)\r\n        {\r\n            //Handles.SphereCap(0, center, rot, radius * 2.0f);\r\n            Handles.SphereHandleCap(0, center, rot, radius * 2.0f, EventType.Repaint);\r\n        }\r\n\r\n        public static void DrawCapsule(Vector3 bottom, Vector3 top, float radius)\r\n        {\r\n            //var axis = (top - bottom).normalized;\r\n            //var rot = Quaternion.FromToRotation(Vector3.up, axis);\r\n\r\n            //////spheres\r\n            ////Handles.SphereCap(0, top, rot, radius * 2.0f);\r\n            ////Handles.SphereCap(0, bottom, rot, radius * 2.0f);\r\n\r\n            //Vector3 norm;\r\n            //Vector3 start;\r\n\r\n            ////draw top circles\r\n            //norm = rot * Vector3.right;\r\n            //start = rot * Vector3.back;\r\n            //Handles.DrawSolidArc(top, norm, start, 180.0f, radius);\r\n\r\n            //norm = rot * Vector3.forward;\r\n            //start = rot * Vector3.right;\r\n            //Handles.DrawSolidArc(top, norm, start, 180.0f, radius);\r\n\r\n            ////draw bottom circles\r\n            //norm = rot * Vector3.right;\r\n            //start = rot * Vector3.forward;\r\n            //Handles.DrawSolidArc(bottom, norm, start, 180.0f, radius);\r\n\r\n            //norm = rot * Vector3.forward;\r\n            //start = rot * Vector3.left;\r\n            //Handles.DrawSolidArc(bottom, norm, start, 180.0f, radius);\r\n\r\n            ////cylinder\r\n            //const int DETAIL = 18;\r\n            //const float ANGLE_STEP = 360.0f / DETAIL;\r\n            //for (int i = 0; i < DETAIL; i++)\r\n            //{\r\n            //    Vector3 a = rot * (com.spacepuppy.Utils.VectorUtil.RotateAroundAxis(Vector3.right, i * ANGLE_STEP, Vector3.up, true)) * radius;\r\n            //    Vector3 b = rot * (com.spacepuppy.Utils.VectorUtil.RotateAroundAxis(Vector3.right, (i + 1) * ANGLE_STEP, Vector3.up, true)) * radius;\r\n\r\n            //    var verts = new Vector3[] { bottom + a, bottom + b, top + b, top + a, bottom + a };\r\n            //    Handles.DrawSolidRectangleWithOutline(verts, Handles.color, Handles.color);\r\n            //}\r\n\r\n            var rod = top - bottom;\r\n            var adjRad = radius / 0.5f;\r\n            var adjHght = rod.magnitude / 2.0f + radius; //(rod.magnitude + radius * 2f);\r\n            var mat = StartDraw(Vector3.Lerp(bottom, top, 0.5f), Quaternion.FromToRotation(Vector3.up, rod.normalized), new Vector3(adjRad, adjHght, adjRad));\r\n            Graphics.DrawMeshNow(PrimitiveUtil.CapsuleMesh, mat);\r\n        }\r\n\r\n        public static void DrawCylinder(Vector3 bottom, Vector3 top, float radius)\r\n        {\r\n            //var axis = (top - bottom).normalized;\r\n            //var rot = Quaternion.FromToRotation(Vector3.up, axis);\r\n\r\n            ////circles\r\n            //Vector3 norm = rot * Vector3.up;\r\n            //Vector3 start = rot * Vector3.right;\r\n            //Handles.DrawSolidArc(top, norm, start, 360.0f, radius);\r\n            //Handles.DrawSolidArc(bottom, norm, start, 360.0f, radius);\r\n\r\n            ////sides\r\n            //const int DETAIL = 18;\r\n            //const float ANGLE_STEP = 360.0f / DETAIL;\r\n            //for (int i = 0; i < DETAIL; i++)\r\n            //{\r\n            //    Vector3 a = rot * (com.spacepuppy.Utils.VectorUtil.RotateAroundAxis(Vector3.right, i * ANGLE_STEP, Vector3.up)) * radius;\r\n            //    Vector3 b = rot * (com.spacepuppy.Utils.VectorUtil.RotateAroundAxis(Vector3.right, (i + 1) * ANGLE_STEP, Vector3.up)) * radius;\r\n\r\n            //    var verts = new Vector3[] { bottom + a, bottom + b, top + b, top + a, bottom + a };\r\n            //    Handles.DrawSolidRectangleWithOutline(verts, Handles.color, Handles.color);\r\n            //}\r\n\r\n\r\n            var rod = top - bottom;\r\n            var adjRad = radius / 0.5f;\r\n            var adjHght = rod.magnitude / 2.0f;\r\n            var mat = StartDraw(Vector3.Lerp(bottom, top, 0.5f), Quaternion.FromToRotation(Vector3.up, rod.normalized), new Vector3(adjRad, adjHght, adjRad));\r\n            Graphics.DrawMeshNow(PrimitiveUtil.CylinderMesh, mat);\r\n\r\n        }\r\n\r\n        public static void DrawMesh(Mesh mesh, Vector3 pos, Quaternion rot, Vector3 scale)\r\n        {\r\n            if (mesh == null) throw new System.ArgumentNullException(\"mesh\");\r\n            var mat = StartDraw(pos, rot, scale);\r\n            Graphics.DrawMeshNow(mesh, mat);\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/HierarchyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n\r\n    [System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple=true, Inherited=false)]\r\n    public class CustomHierarchyDrawerAttribute : System.Attribute\r\n    {\r\n\r\n        public readonly System.Type TargetType;\r\n        public readonly bool UseForChildren;\r\n\r\n        public CustomHierarchyDrawerAttribute(System.Type type)\r\n        {\r\n            this.TargetType = type;\r\n            this.UseForChildren = false;\r\n        }\r\n\r\n        public CustomHierarchyDrawerAttribute(System.Type type, bool useForChildren)\r\n        {\r\n            this.TargetType = type;\r\n            this.UseForChildren = useForChildren;\r\n        }\r\n\r\n    }\r\n\r\n    public class HierarchyDrawer\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Component _target;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        internal void Init(Component targ)\r\n        {\r\n            _target = targ;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Component Target { get { return _target; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Get any components also on the GameObject that also have hierarchy drawers.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public Component[] GetSiblings()\r\n        {\r\n            if (_target == null) return new Component[] { };\r\n            return (from c in _target.GetComponents<Component>() where c != _target && EditorHierarchyDrawerEvents.HasDrawer(c.GetType()) select c).ToArray();\r\n        }\r\n\r\n        public virtual void OnEnable()\r\n        {\r\n\r\n        }\r\n\r\n        public virtual void OnDisable()\r\n        {\r\n\r\n        }\r\n\r\n        public virtual void OnHierarchyGUI(Rect selectionRect)\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Hooks/CollisionSignalSourcePropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Hooks;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Hooks\r\n{\r\n    [CustomPropertyDrawer(typeof(CollisionSignalSource))]\r\n    public class CollisionSignalSourcePropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            var signalSourceProp = property.FindPropertyRelative(\"_signalSource\");\r\n            return SPEditorGUI.GetPropertyHeight(signalSourceProp, label, false);\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var signalSourceProp = property.FindPropertyRelative(\"_signalSource\");\r\n            SPEditorGUI.PropertyField(position, signalSourceProp, label);\r\n\r\n            if (signalSourceProp.objectReferenceValue == null)\r\n            {\r\n                var go = GameObjectUtil.GetGameObjectFromSource(property.serializedObject.targetObject);\r\n                if(go != null && (go.HasComponent<Rigidbody>() || go.HasComponent<Collider>()))\r\n                    signalSourceProp.objectReferenceValue = go;\r\n                else\r\n                {\r\n                    var root = go.FindTrueRoot();\r\n                    if (root != null && (root.HasComponent<Rigidbody>() || root.HasComponent<Collider>()))\r\n                        signalSourceProp.objectReferenceValue = root;\r\n                }\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/IArrayHandlingPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n    public interface IArrayHandlingPropertyDrawer\r\n    {\r\n\r\n        PropertyDrawer InternalDrawer { get; set; }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/IconHelper.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\nusing com.spacepuppy.Dynamic;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n    public static class IconHelper\r\n    {\r\n\r\n        public enum LabelIcon\r\n        {\r\n            Gray = 0,\r\n            Blue,\r\n            Teal,\r\n            Green,\r\n            Yellow,\r\n            Orange,\r\n            Red,\r\n            Purple\r\n        }\r\n\r\n        public enum Icon\r\n        {\r\n            CircleGray = 0,\r\n            CircleBlue,\r\n            CircleTeal,\r\n            CircleGreen,\r\n            CircleYellow,\r\n            CircleOrange,\r\n            CircleRed,\r\n            CirclePurple,\r\n            DiamondGray,\r\n            DiamondBlue,\r\n            DiamondTeal,\r\n            DiamondGreen,\r\n            DiamondYellow,\r\n            DiamondOrange,\r\n            DiamondRed,\r\n            DiamondPurple\r\n        }\r\n\r\n        #region Fields\r\n\r\n        private static TypeAccessWrapper _accessWrapper;\r\n\r\n        private static System.Action<UnityEngine.Object, Texture2D> _imp_setIconForObject;\r\n        private static System.Func<UnityEngine.Object, Texture2D> _imp_getIconForObject;\r\n\r\n        private static ReadOnlyCollection<GUIContent> _labelIcons;\r\n        private static ReadOnlyCollection<GUIContent> _largeIcons;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        static IconHelper()\r\n        {\r\n            _accessWrapper = new TypeAccessWrapper(typeof(EditorGUIUtility), true);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public static IList<GUIContent> LabelIcons\r\n        {\r\n            get\r\n            {\r\n                if (_labelIcons == null) _labelIcons = new ReadOnlyCollection<GUIContent>(GetTextures(\"sv_label_\", string.Empty, 0, 8));\r\n                return _labelIcons;\r\n            }\r\n        }\r\n\r\n        public static IList<GUIContent> Icons\r\n        {\r\n            get\r\n            {\r\n                if (_largeIcons == null) _largeIcons = new ReadOnlyCollection<GUIContent>(GetTextures(\"sv_icon_dot\", \"_pix16_gizmo\", 0, 16));\r\n                return _largeIcons;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public static bool HasIconForObject(GameObject obj)\r\n        {\r\n            return !object.ReferenceEquals(GetIconForObject(obj), null);\r\n        }\r\n\r\n        public static Texture2D GetIconForObject(GameObject obj)\r\n        {\r\n            if (_imp_getIconForObject == null) _imp_getIconForObject = _accessWrapper.GetStaticMethod(\"GetIconForObject\", typeof(System.Func<UnityEngine.Object, Texture2D>)) as System.Func<UnityEngine.Object, Texture2D>;\r\n            return _imp_getIconForObject(obj);\r\n        }\r\n\r\n        public static void SetIconForObject(GameObject obj, LabelIcon icon)\r\n        {\r\n            SetIconForObject(obj, IconHelper.LabelIcons[(int)icon].image as Texture2D);\r\n        }\r\n\r\n        public static void SetIconForObject(GameObject obj, Icon icon)\r\n        {\r\n            SetIconForObject(obj, IconHelper.Icons[(int)icon].image as Texture2D);\r\n        }\r\n\r\n        public static void SetIconForObject(GameObject obj, Texture2D texture)\r\n        {\r\n            if (_imp_setIconForObject == null) _imp_setIconForObject = _accessWrapper.GetStaticMethod(\"SetIconForObject\", typeof(System.Action<UnityEngine.Object, Texture2D>)) as System.Action<UnityEngine.Object, Texture2D>;\r\n            _imp_setIconForObject(obj, texture);\r\n        }\r\n\r\n        private static GUIContent[] GetTextures(string baseName, string postFix, int startIndex, int count)\r\n        {\r\n            GUIContent[] arr = new GUIContent[count];\r\n\r\n            var m = _accessWrapper.GetStaticMethod(\"IconContent\", typeof(System.Func<string, GUIContent>)) as System.Func<string, GUIContent>;\r\n            for (int index = 0; index < count; ++index)\r\n            {\r\n                arr[index] = m(baseName + (startIndex + index).ToString() + postFix);\r\n            }\r\n\r\n            return arr;\r\n        }\r\n\r\n        #endregion\r\n\r\n        /*\r\n         * ICON NAMES\r\n         * \r\nScriptableObject Icon\r\n_Popup\r\n_Help\r\nClipboard\r\nSocialNetworks.UDNOpen\r\nSocialNetworks.Tweet\r\nSocialNetworks.FacebookShare\r\nSocialNetworks.LinkedInShare\r\nSocialNetworks.UDNLogo\r\nanimationvisibilitytoggleoff\r\nanimationvisibilitytoggleon\r\ntree_icon\r\ntree_icon_leaf\r\ntree_icon_frond\r\ntree_icon_branch\r\ntree_icon_branch_frond\r\nediticon.sml\r\nTreeEditor.Refresh\r\nTreeEditor.Duplicate\r\nTreeEditor.Trash\r\nTreeEditor.AddBranches\r\nTreeEditor.AddLeaves\r\nTreeEditor.Trash\r\npreAudioPlayOn\r\npreAudioPlayOff\r\nAvatarInspector/RightFingersIk\r\nAvatarInspector/LeftFingersIk\r\nAvatarInspector/RightFeetIk\r\nAvatarInspector/LeftFeetIk\r\nAvatarInspector/RightFingers\r\nAvatarInspector/LeftFingers\r\nAvatarInspector/RightArm\r\nAvatarInspector/LeftArm\r\nAvatarInspector/RightLeg\r\nAvatarInspector/LeftLeg\r\nAvatarInspector/Head\r\nAvatarInspector/Torso\r\nAvatarInspector/MaskEditor_Root\r\nAvatarInspector/BodyPartPicker\r\nAvatarInspector/BodySIlhouette\r\nMirror\r\nSpeedScale\r\nToolbar Minus\r\nToolbar Plus More\r\nToolbar Plus\r\nAnimatorController Icon\r\nTextAsset Icon\r\nShader Icon\r\nboo Script Icon\r\ncs Script Icon\r\njs Script Icon\r\nPrefab Icon\r\nProfiler.NextFrame\r\nProfiler.PrevFrame\r\nsv_icon_none\r\nColorPicker.CycleSlider\r\nColorPicker.CycleColor\r\nEyeDropper.Large\r\nClothInspector.PaintValue\r\nClothInspector.ViewValue\r\nClothInspector.SettingsTool\r\nClothInspector.PaintTool\r\nClothInspector.SelectTool\r\nWelcomeScreen.AssetStoreLogo\r\nWelcomeScreen.AssetStoreLogo\r\nAboutWindow.MainHeader\r\nUnityLogo\r\nAgeiaLogo\r\nMonoLogo\r\nToolbar Minus\r\nPlayButtonProfile Anim\r\nStepButton Anim\r\nPauseButton Anim\r\nPlayButton Anim\r\nPlayButtonProfile On\r\nStepButton On\r\nPauseButton On\r\nPlayButton On\r\nPlayButtonProfile\r\nStepButton\r\nPauseButton\r\nPlayButton\r\nViewToolOrbit On\r\nViewToolZoom On\r\nViewToolMove On\r\nViewToolOrbit On\r\nViewToolOrbit\r\nViewToolZoom\r\nViewToolMove\r\nViewToolOrbit\r\nScaleTool On\r\nRotateTool On\r\nMoveTool On\r\nScaleTool\r\nRotateTool\r\nMoveTool\r\nPauseButton\r\nPlayButton\r\nToolbar Minus\r\nToolbar Plus\r\nUnityLogo\r\n_Help\r\n_Popup\r\nIcon Dropdown\r\nAvatar Icon\r\nAvatarPivot\r\nSpeedScale\r\nAvatarInspector/DotSelection\r\nAvatarInspector/DotFrameDotted\r\nAvatarInspector/DotFrame\r\nAvatarInspector/DotFill\r\nAvatarInspector/RightHandZoom\r\nAvatarInspector/LeftHandZoom\r\nAvatarInspector/HeadZoom\r\nAvatarInspector/RightLeg\r\nAvatarInspector/LeftLeg\r\nAvatarInspector/RightFingers\r\nAvatarInspector/RightArm\r\nAvatarInspector/LeftFingers\r\nAvatarInspector/LeftArm\r\nAvatarInspector/Head\r\nAvatarInspector/Torso\r\nAvatarInspector/RightHandZoomSilhouette\r\nAvatarInspector/LeftHandZoomSilhouette\r\nAvatarInspector/HeadZoomSilhouette\r\nAvatarInspector/BodySilhouette\r\nAnimation.AddKeyframe\r\nAnimation.NextKey\r\nAnimation.PrevKey\r\nlightMeter/redLight\r\nlightMeter/orangeLight\r\nlightMeter/lightRim\r\nlightMeter/greenLight\r\nAnimation.AddEvent\r\nSceneviewAudio\r\nSceneviewLighting\r\nMeshRenderer Icon\r\nTerrain Icon\r\nsv_icon_none\r\nBuildSettings.SelectedIcon\r\nAnimation.AddEvent\r\nAnimation.AddKeyframe\r\nAnimation.NextKey\r\nAnimation.PrevKey\r\nAnimation.Record\r\nAnimation.Play\r\nPreTextureRGB\r\nPreTextureAlpha\r\nPreTextureMipMapHigh\r\nPreTextureMipMapLow\r\nTerrainInspector.TerrainToolSettings\r\nTerrainInspector.TerrainToolPlants\r\nTerrainInspector.TerrainToolTrees\r\nTerrainInspector.TerrainToolSplat\r\nTerrainInspector.TerrainToolSmoothHeight\r\nTerrainInspector.TerrainToolSetHeight\r\nTerrainInspector.TerrainToolRaise\r\nSettingsIcon\r\nPauseButton\r\nPlayButton\r\nPreMatLight1\r\nPreMatLight0\r\nPreMatTorus\r\nPreMatCylinder\r\nPreMatCube\r\nPreMatSphere\r\nPreMatLight1\r\nPreMatLight0\r\nCamera Icon\r\nToolbar Minus\r\nToolbar Plus\r\nAnimation.EventMarker\r\nAS Badge New\r\nAS Badge Move\r\nAS Badge Delete\r\nWaitSpin00\r\nWaitSpin01\r\nWaitSpin02\r\nWaitSpin03\r\nWaitSpin04\r\nWaitSpin05\r\nWaitSpin06\r\nWaitSpin07\r\nWaitSpin08\r\nWaitSpin09\r\nWaitSpin10\r\nWaitSpin11\r\nWelcomeScreen.AssetStoreLogo\r\nWelcomeScreen.UnityAnswersLogo\r\nWelcomeScreen.UnityForumLogo\r\nWelcomeScreen.UnityBasicsLogo\r\nWelcomeScreen.VideoTutLogo\r\nWelcomeScreen.MainHeader\r\nUnityLogo\r\npreAudioPlayOn\r\npreAudioPlayOff\r\nAnimation.EventMarker\r\nPreMatLight1\r\nPreMatLight0\r\nPreMatTorus\r\nPreMatCylinder\r\nPreMatCube\r\nPreMatSphere\r\nTreeEditor.Duplicate\r\nToolbar Minus\r\nToolbar Plus\r\nPreTextureMipMapHigh\r\nPreTextureMipMapLow\r\nPreTextureRGB\r\nPreTextureAlpha\r\nVerticalSplit\r\nHorizontalSplit\r\nIcon Dropdown\r\nPrefabNormal Icon\r\nPrefabModel Icon\r\nPrefabNormal Icon\r\nPrefab Icon\r\nGameObject Icon\r\npreAudioLoopOn\r\npreAudioLoopOff\r\npreAudioPlayOn\r\npreAudioPlayOff\r\npreAudioAutoPlayOn\r\npreAudioAutoPlayOff\r\nBuildSettings.Web.Small\r\nBuildSettings.Standalone.Small\r\nBuildSettings.iPhone.Small\r\nBuildSettings.Android.Small\r\nBuildSettings.BlackBerry.Small\r\nBuildSettings.Tizen.Small\r\nBuildSettings.XBox360.Small\r\nBuildSettings.XboxOne.Small\r\nBuildSettings.PS3.Small\r\nBuildSettings.PSP2.Small\r\nBuildSettings.PS4.Small\r\nBuildSettings.PSM.Small\r\nBuildSettings.FlashPlayer.Small\r\nBuildSettings.Metro.Small\r\nBuildSettings.WP8.Small\r\nBuildSettings.SamsungTV.Small\r\nBuildSettings.Web\r\nBuildSettings.Standalone\r\nBuildSettings.iPhone\r\nBuildSettings.Android\r\nBuildSettings.BlackBerry\r\nBuildSettings.Tizen\r\nBuildSettings.XBox360\r\nBuildSettings.XboxOne\r\nBuildSettings.PS3\r\nBuildSettings.PSP2\r\nBuildSettings.PS4\r\nBuildSettings.PSM\r\nBuildSettings.FlashPlayer\r\nBuildSettings.Metro\r\nBuildSettings.WP8\r\nBuildSettings.SamsungTV\r\nTreeEditor.BranchTranslate\r\nTreeEditor.BranchRotate\r\nTreeEditor.BranchFreeHand\r\nTreeEditor.BranchTranslate On\r\nTreeEditor.BranchRotate On\r\nTreeEditor.BranchFreeHand On\r\nTreeEditor.LeafTranslate\r\nTreeEditor.LeafRotate\r\nTreeEditor.LeafTranslate On\r\nTreeEditor.LeafRotate On\r\nsv_icon_dot15_pix16_gizmo\r\nsv_icon_dot1_sml\r\nsv_icon_dot4_sml\r\nsv_icon_dot7_sml\r\nsv_icon_dot5_pix16_gizmo\r\nsv_icon_dot11_pix16_gizmo\r\nsv_icon_dot12_sml\r\nsv_icon_dot15_sml\r\nsv_icon_dot9_pix16_gizmo\r\nsv_icon_name6\r\nsv_icon_name3\r\nsv_icon_name4\r\nsv_icon_name0\r\nsv_icon_name1\r\nsv_icon_name2\r\nsv_icon_name5\r\nsv_icon_name7\r\nsv_icon_dot1_pix16_gizmo\r\nsv_icon_dot8_pix16_gizmo\r\nsv_icon_dot2_pix16_gizmo\r\nsv_icon_dot6_pix16_gizmo\r\nsv_icon_dot0_sml\r\nsv_icon_dot3_sml\r\nsv_icon_dot6_sml\r\nsv_icon_dot9_sml\r\nsv_icon_dot11_sml\r\nsv_icon_dot14_sml\r\nsv_label_0\r\nsv_label_1\r\nsv_label_2\r\nsv_label_3\r\nsv_label_5\r\nsv_label_6\r\nsv_label_7\r\nsv_icon_none\r\nsv_icon_dot14_pix16_gizmo\r\nsv_icon_dot7_pix16_gizmo\r\nsv_icon_dot3_pix16_gizmo\r\nsv_icon_dot0_pix16_gizmo\r\nsv_icon_dot2_sml\r\nsv_icon_dot5_sml\r\nsv_icon_dot8_sml\r\nsv_icon_dot10_pix16_gizmo\r\nsv_icon_dot12_pix16_gizmo\r\nsv_icon_dot10_sml\r\nsv_icon_dot13_sml\r\nsv_icon_dot4_pix16_gizmo\r\nsv_label_4\r\nsv_icon_dot13_pix16_gizmo\r\n         */\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/InputSettings.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n\r\n    [CreateAssetMenu(fileName = \"InputSettings\", menuName = \"Spacepuppy Build Pipeline/Input Settings\")]\r\n    public class InputSettings : ScriptableObject\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private List<InputConfig> _entries = new List<InputConfig>();\r\n        [System.NonSerialized]\r\n        private NonNullList _protectedEntries;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IList<InputConfig> Entries\r\n        {\r\n            get\r\n            {\r\n                if (_protectedEntries == null) _protectedEntries = new NonNullList(_entries);\r\n                return _protectedEntries;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public bool ApplyToGlobal()\r\n        {\r\n            var asset = AssetDatabase.LoadAllAssetsAtPath(\"ProjectSettings/InputManager.asset\").FirstOrDefault();\r\n            if (asset == null) return false;\r\n\r\n            var settings = ScriptableObject.CreateInstance<InputSettings>();\r\n            try\r\n            {\r\n                var serializedObject = new SerializedObject(asset);\r\n                var axes = serializedObject.FindProperty(PROP_AXES);\r\n                axes.arraySize = _entries.Count;\r\n\r\n                for(int i = 0; i < _entries.Count; i++)\r\n                {\r\n                    var axis = axes.GetArrayElementAtIndex(i);\r\n                    var config = _entries[i];\r\n                    axis.FindPropertyRelative(PROP_TYPE).enumValueIndex = (int)config.Type;\r\n                    axis.FindPropertyRelative(PROP_NAME).stringValue = config.Name;\r\n                    axis.FindPropertyRelative(PROP_DESCRIPTIVENAME).stringValue = config.DescriptiveName;\r\n                    axis.FindPropertyRelative(PROP_DESCRIPTIVENEGATIVENAME).stringValue = config.DescriptiveNameNegative;\r\n                    axis.FindPropertyRelative(PROP_NEGATIVEBUTTON).stringValue = config.NegativeButton;\r\n                    axis.FindPropertyRelative(PROP_POSITIVEBUTTON).stringValue = config.PositiveButton;\r\n                    axis.FindPropertyRelative(PROP_ALTNEGATIVEBUTTON).stringValue = config.AltNegativeButton;\r\n                    axis.FindPropertyRelative(PROP_ALTPOSITIVEBUTTON).stringValue = config.AltPositiveButton;\r\n                    axis.FindPropertyRelative(PROP_GRAVITY).floatValue = config.Gravity;\r\n                    axis.FindPropertyRelative(PROP_DEAD).floatValue = config.Dead;\r\n                    axis.FindPropertyRelative(PROP_SENSITIVITY).floatValue = config.Sensitivity;\r\n                    axis.FindPropertyRelative(PROP_SNAP).boolValue = config.Snap;\r\n                    axis.FindPropertyRelative(PROP_INVERT).boolValue = config.Invert;\r\n                    axis.FindPropertyRelative(PROP_AXIS).enumValueIndex = (int)config.Axis;\r\n                    axis.FindPropertyRelative(PROP_JOYNUM).enumValueIndex = (int)config.JoyNum;\r\n                }\r\n\r\n                serializedObject.ApplyModifiedProperties();\r\n                return true;\r\n            }\r\n            finally\r\n            {\r\n                ObjUtil.SmartDestroy(settings);\r\n            }\r\n        }\r\n\r\n        public bool CopyFromGlobal(bool cleanInputConfigs = false)\r\n        {\r\n            var asset = AssetDatabase.LoadAllAssetsAtPath(\"ProjectSettings/InputManager.asset\").FirstOrDefault();\r\n            if (asset == null) return false;\r\n            \r\n            try\r\n            {\r\n                var serializedObject = new SerializedObject(asset);\r\n                var axes = serializedObject.FindProperty(PROP_AXES);\r\n\r\n                for (int i = 0; i < axes.arraySize; i++)\r\n                {\r\n                    var axis = axes.GetArrayElementAtIndex(i);\r\n                    var config = new InputConfig()\r\n                    {\r\n                        Type = (InputType)axis.FindPropertyRelative(PROP_TYPE).enumValueIndex,\r\n                        Name = axis.FindPropertyRelative(PROP_NAME).stringValue,\r\n                        DescriptiveName = axis.FindPropertyRelative(PROP_DESCRIPTIVENAME).stringValue,\r\n                        DescriptiveNameNegative = axis.FindPropertyRelative(PROP_DESCRIPTIVENEGATIVENAME).stringValue,\r\n                        NegativeButton = axis.FindPropertyRelative(PROP_NEGATIVEBUTTON).stringValue,\r\n                        PositiveButton = axis.FindPropertyRelative(PROP_POSITIVEBUTTON).stringValue,\r\n                        AltNegativeButton = axis.FindPropertyRelative(PROP_ALTNEGATIVEBUTTON).stringValue,\r\n                        AltPositiveButton = axis.FindPropertyRelative(PROP_ALTPOSITIVEBUTTON).stringValue,\r\n                        Gravity = axis.FindPropertyRelative(PROP_GRAVITY).floatValue,\r\n                        Dead = axis.FindPropertyRelative(PROP_DEAD).floatValue,\r\n                        Sensitivity = axis.FindPropertyRelative(PROP_SENSITIVITY).floatValue,\r\n                        Snap = axis.FindPropertyRelative(PROP_SNAP).boolValue,\r\n                        Invert = axis.FindPropertyRelative(PROP_INVERT).boolValue,\r\n                        Axis = (InputAxis)axis.FindPropertyRelative(PROP_AXIS).enumValueIndex,\r\n                        JoyNum = (JoyNum)axis.FindPropertyRelative(PROP_JOYNUM).enumValueIndex\r\n                    };\r\n                    if (cleanInputConfigs) config.ClearAsType();\r\n\r\n                    _entries.Add(config);\r\n                }\r\n\r\n                return true;\r\n            }\r\n            catch (System.Exception)\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns an InputSettings object for the current configuration in the global unity InputSettings.\r\n        /// \r\n        /// 'cleanInputConfigs' will clean up the input data pulled from the global settings, removing unnecessary \r\n        /// data for inputs that don't need said data (example Gravity only applies to button/key configs, so is \r\n        /// removed from non-button/key configs).\r\n        /// </summary>\r\n        /// <param name=\"cleanInputConfigs\">Clean up the input data pulled from the global settings.</param>\r\n        /// <returns></returns>\r\n        public static InputSettings LoadGlobalInputSettings(bool cleanInputConfigs = false)\r\n        {\r\n            var asset = AssetDatabase.LoadAllAssetsAtPath(\"ProjectSettings/InputManager.asset\").FirstOrDefault();\r\n            if (asset == null) return null;\r\n\r\n            var settings = ScriptableObject.CreateInstance<InputSettings>();\r\n            if(!settings.CopyFromGlobal(cleanInputConfigs))\r\n            {\r\n                ObjUtil.SmartDestroy(settings);\r\n                settings = null;\r\n            }\r\n            return settings;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        private class NonNullList : IList<InputConfig>\r\n        {\r\n            private List<InputConfig> _lst;\r\n\r\n            public NonNullList(List<InputConfig> lst)\r\n            {\r\n                _lst = lst;\r\n            }\r\n\r\n\r\n\r\n\r\n            public InputConfig this[int index]\r\n            {\r\n                get { return _lst[index]; }\r\n                set\r\n                {\r\n                    if (value == null) throw new System.ArgumentNullException(\"value\");\r\n                    _lst[index] = value;\r\n                }\r\n            }\r\n\r\n            public int Count {  get { return _lst.Count; } }\r\n\r\n            public bool IsReadOnly { get { return false; } }\r\n\r\n            public void Add(InputConfig item)\r\n            {\r\n                if (item == null) throw new System.ArgumentNullException(\"item\");\r\n                _lst.Add(item);\r\n            }\r\n\r\n            public void Clear()\r\n            {\r\n                _lst.Clear();\r\n            }\r\n\r\n            public bool Contains(InputConfig item)\r\n            {\r\n                return _lst.Contains(item);\r\n            }\r\n\r\n            public void CopyTo(InputConfig[] array, int arrayIndex)\r\n            {\r\n                _lst.CopyTo(array, arrayIndex);\r\n            }\r\n\r\n            public IEnumerator<InputConfig> GetEnumerator()\r\n            {\r\n                return _lst.GetEnumerator();\r\n            }\r\n\r\n            public int IndexOf(InputConfig item)\r\n            {\r\n                return _lst.IndexOf(item);\r\n            }\r\n\r\n            public void Insert(int index, InputConfig item)\r\n            {\r\n                if (item == null) throw new System.ArgumentNullException(\"item\");\r\n                _lst.Insert(index, item);\r\n            }\r\n\r\n            public bool Remove(InputConfig item)\r\n            {\r\n                return _lst.Remove(item);\r\n            }\r\n\r\n            public void RemoveAt(int index)\r\n            {\r\n                _lst.RemoveAt(index);\r\n            }\r\n\r\n            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n            {\r\n                return _lst.GetEnumerator();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Serialization Types\r\n\r\n        public const string PROP_AXES = \"m_Axes\";\r\n        public const string PROP_NAME = \"m_Name\";\r\n        public const string PROP_DESCRIPTIVENAME = \"descriptiveName\";\r\n        public const string PROP_DESCRIPTIVENEGATIVENAME = \"descriptiveNegativeName\";\r\n        public const string PROP_NEGATIVEBUTTON = \"negativeButton\";\r\n        public const string PROP_POSITIVEBUTTON = \"positiveButton\";\r\n        public const string PROP_ALTNEGATIVEBUTTON = \"altNegativeButton\";\r\n        public const string PROP_ALTPOSITIVEBUTTON = \"altPositiveButton\";\r\n        public const string PROP_GRAVITY = \"gravity\";\r\n        public const string PROP_DEAD = \"dead\";\r\n        public const string PROP_SENSITIVITY = \"sensitivity\";\r\n        public const string PROP_SNAP = \"snap\";\r\n        public const string PROP_INVERT = \"invert\";\r\n        public const string PROP_TYPE = \"type\";\r\n        public const string PROP_AXIS = \"axis\";\r\n        public const string PROP_JOYNUM = \"joyNum\";\r\n\r\n        public enum InputType\r\n        {\r\n            KeyOrMouseButton = 0,\r\n            MouseMovement = 1,\r\n            JoystickAxis = 2\r\n        }\r\n\r\n        public enum InputAxis\r\n        {\r\n            Xaxis = 0,\r\n            Yaxis = 1,\r\n            _3rd = 2,\r\n            _4th = 3,\r\n            _5th = 4,\r\n            _6th = 5,\r\n            _7th = 6,\r\n            _8th = 7,\r\n            _9th = 8,\r\n            _10th = 9,\r\n            _11th = 10,\r\n            _12th = 11,\r\n            _13th = 12,\r\n            _14th = 13,\r\n            _15th = 14,\r\n            _16th = 15,\r\n            _17th = 16,\r\n            _18th = 17,\r\n            _19th = 18,\r\n            _20th = 19,\r\n            _21st = 20,\r\n            _22nd = 21,\r\n            _23rd = 22,\r\n            _24th = 23,\r\n            _25th = 24,\r\n            _26th = 25,\r\n            _27th = 26,\r\n            _28th = 27\r\n        }\r\n\r\n        public enum JoyNum\r\n        {\r\n            All = 0,\r\n            Joystick1,\r\n            Joystick2,\r\n            Joystick3,\r\n            Joystick4,\r\n            Joystick5,\r\n            Joystick6,\r\n            Joystick7,\r\n            Joystick8,\r\n            Joystick9,\r\n            Joystick10,\r\n            Joystick11\r\n        }\r\n\r\n        [System.Serializable]\r\n        public class InputConfig\r\n        {\r\n\r\n\r\n            public InputType Type;\r\n            public string Name;\r\n            public string DescriptiveName;\r\n            public string DescriptiveNameNegative; //button only\r\n            public string NegativeButton; //button only\r\n            public string PositiveButton; //button only\r\n            public string AltNegativeButton; //button only\r\n            public string AltPositiveButton; //button only\r\n            public float Gravity; //button only\r\n            public float Dead;\r\n            public float Sensitivity = 0.1f;\r\n            public bool Snap; //button only\r\n            public bool Invert;\r\n            public InputAxis Axis;\r\n            \r\n            public JoyNum JoyNum;\r\n\r\n            #region Methods\r\n\r\n            internal void ClearAsType()\r\n            {\r\n                switch (this.Type)\r\n                {\r\n                    case InputType.KeyOrMouseButton:\r\n                        this.ClearAsButton();\r\n                        break;\r\n                    case InputType.MouseMovement:\r\n                        this.ClearAsMouseMovement();\r\n                        break;\r\n                    case InputType.JoystickAxis:\r\n                        this.ClearAsJoyAxis();\r\n                        break;\r\n                }\r\n            }\r\n\r\n            internal void ClearAsButton()\r\n            {\r\n                Axis = InputAxis.Xaxis;\r\n            }\r\n\r\n            internal void ClearAsMouseMovement()\r\n            {\r\n                DescriptiveNameNegative = null;\r\n                NegativeButton = null;\r\n                PositiveButton = null;\r\n                AltNegativeButton = null;\r\n                AltPositiveButton = null;\r\n                Gravity = 0f;\r\n                Snap = false;\r\n            }\r\n\r\n            internal void ClearAsJoyAxis()\r\n            {\r\n                DescriptiveNameNegative = null;\r\n                NegativeButton = null;\r\n                PositiveButton = null;\r\n                AltNegativeButton = null;\r\n                AltPositiveButton = null;\r\n                Gravity = 0f;\r\n                Snap = false;\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Serialized Property Fields\r\n            \r\n            public void ApplyToSerializedProperty(SerializedProperty prop)\r\n            {\r\n                SerializedProperty p;\r\n                p = prop.FindPropertyRelative(PROP_NAME);\r\n                if (p != null) p.stringValue = this.Name;\r\n                p = prop.FindPropertyRelative(PROP_DESCRIPTIVENAME);\r\n                if (p != null) p.stringValue = this.DescriptiveName;\r\n                p = prop.FindPropertyRelative(PROP_DESCRIPTIVENEGATIVENAME);\r\n                if (p != null) p.stringValue = this.DescriptiveNameNegative;\r\n                p = prop.FindPropertyRelative(PROP_NEGATIVEBUTTON);\r\n                if (p != null) p.stringValue = this.NegativeButton;\r\n                p = prop.FindPropertyRelative(PROP_POSITIVEBUTTON);\r\n                if (p != null) p.stringValue = this.PositiveButton;\r\n                p = prop.FindPropertyRelative(PROP_ALTNEGATIVEBUTTON);\r\n                if (p != null) p.stringValue = this.AltNegativeButton;\r\n                p = prop.FindPropertyRelative(PROP_ALTPOSITIVEBUTTON);\r\n                if (p != null) p.stringValue = this.AltPositiveButton;\r\n                p = prop.FindPropertyRelative(PROP_GRAVITY);\r\n                if (p != null) p.floatValue = this.Gravity;\r\n                p = prop.FindPropertyRelative(PROP_DEAD);\r\n                if (p != null) p.floatValue = this.Dead;\r\n                p = prop.FindPropertyRelative(PROP_SENSITIVITY);\r\n                if (p != null) p.floatValue = this.Sensitivity;\r\n                p = prop.FindPropertyRelative(PROP_SNAP);\r\n                if (p != null) p.boolValue = this.Snap;\r\n                p = prop.FindPropertyRelative(PROP_INVERT);\r\n                if (p != null) p.boolValue = this.Invert;\r\n                p = prop.FindPropertyRelative(PROP_TYPE);\r\n                if (p != null) p.enumValueIndex = (int)this.Type;\r\n                p = prop.FindPropertyRelative(PROP_AXIS);\r\n                if (p != null) p.enumValueIndex = (int)this.Axis;\r\n                p = prop.FindPropertyRelative(PROP_JOYNUM);\r\n                if (p != null) p.enumValueIndex = (int)this.JoyNum;\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Utils\r\n\r\n        private static System.Func<string[]> _overrideGetGlobalInputIds;\r\n        /// <summary>\r\n        /// Get the input id's that should show up in a drop down list for any InputID property. This includes in the t_OnSimpleButtonPress editor.\r\n        /// \r\n        /// Set this delegate to override the default entries as defined in InputManager.asset. This can be useful if you're using a custom input system \r\n        /// that has named inputs unique from what is found in the InputSettings.asset configuration.\r\n        /// </summary>\r\n        public static System.Func<string[]> GetGlobalInputIds\r\n        {\r\n            get\r\n            {\r\n                if (_overrideGetGlobalInputIds == null) _overrideGetGlobalInputIds = GetGlobalInputIdsDefault;\r\n                return _overrideGetGlobalInputIds;\r\n            }\r\n            set\r\n            {\r\n                _overrideGetGlobalInputIds = value;\r\n            }\r\n        }\r\n\r\n        public static string[] GetGlobalInputIdsDefault()\r\n        {\r\n            var asset = AssetDatabase.LoadAllAssetsAtPath(\"ProjectSettings/InputManager.asset\").FirstOrDefault();\r\n            if (asset != null)\r\n            {\r\n                var obj = new SerializedObject(asset);\r\n                var axes = obj.FindProperty(PROP_AXES);\r\n                string[] arr = new string[axes.arraySize];\r\n                for (int i = 0; i < arr.Length; i++)\r\n                {\r\n                    arr[i] = axes.GetArrayElementAtIndex(i).FindPropertyRelative(\"m_Name\").stringValue;\r\n                }\r\n                obj.Dispose();\r\n                return arr;\r\n            }\r\n            else\r\n            {\r\n                return com.spacepuppy.Utils.ArrayUtil.Empty<string>();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    [CustomEditor(typeof(InputSettings), true)]\r\n    public class InputSettingsEditor : SPEditor\r\n    {\r\n\r\n        public const string PROP_ENTRIES = \"_entries\";\r\n        public const string PROP_TYPE = \"Type\";\r\n        public const string PROP_NAME = \"Name\";\r\n        public const string PROP_DESCRIPTIVENAME = \"DescriptiveName\";\r\n        public const string PROP_DESCRIPTIVENAMENEGATIVE = \"DescriptiveNameNegative\";\r\n        public const string PROP_NEGATIVEBUTTON = \"NegativeButton\";\r\n        public const string PROP_POSITIVEBUTTON = \"PositiveButton\";\r\n        public const string PROP_ALTNEGATIVEBUTTON = \"AltNegativeButton\";\r\n        public const string PROP_ALTPOSITIVEBUTTON = \"AltPositiveButton\";\r\n        public const string PROP_GRAVITY = \"Gravity\";\r\n        public const string PROP_DEAD = \"Dead\";\r\n        public const string PROP_SENSITIVITY = \"Sensitivity\";\r\n        public const string PROP_SNAP = \"Snap\";\r\n        public const string PROP_INVERT = \"Invert\";\r\n        public const string PROP_AXIS = \"Axis\";\r\n        public const string PROP_JOYNUM = \"JoyNum\";\r\n\r\n        #region Fields\r\n\r\n        private SPReorderableList _entryList;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _entryList = new SPReorderableList(this.serializedObject, this.serializedObject.FindProperty(PROP_ENTRIES));\r\n            _entryList.drawHeaderCallback = this._entryList_DrawHeader;\r\n            _entryList.drawElementCallback = this._entryList_DrawElement;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region GUI\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n            _entryList.DoLayoutList();\r\n            this.DrawDetailArea();\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n\r\n            EditorGUILayout.Space();\r\n\r\n\r\n            const float R1_WIDTH = 90f;\r\n            const float R2_WIDTH = 90f;\r\n            const float PADDING = 5f;\r\n            var rect = EditorGUILayout.GetControlRect();\r\n            var r1 = new Rect(Mathf.Max(0f, rect.xMax - R1_WIDTH), rect.yMin, Mathf.Min(rect.width, R1_WIDTH), rect.height);\r\n            var r2 = new Rect(Mathf.Max(0f, r1.xMin - PADDING - R2_WIDTH), rect.yMin, Mathf.Min(Mathf.Max(0f, rect.width - PADDING - R1_WIDTH), R2_WIDTH), rect.height);\r\n\r\n            if(GUI.Button(r1, \"Apply Global\"))\r\n            {\r\n                if(EditorUtility.DisplayDialog(\"Apply Settings to Global Input Manager?\", \"Applying these settings will overwrite the global input settings.\", \"Apply\", \"Cancel\"))\r\n                {\r\n                    var obj = this.serializedObject.targetObject as InputSettings;\r\n                    if(obj != null)\r\n                    {\r\n                        obj.ApplyToGlobal();\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(GUI.Button(r2, \"Load Global\"))\r\n            {\r\n                if (EditorUtility.DisplayDialog(\"Load Global Input Manager Settings?\", \"Loading Global Input Manager Settings will overwrite all entries in this config.\", \"Load\", \"Cancel\"))\r\n                {\r\n                    var obj = this.serializedObject.targetObject as InputSettings;\r\n                    if (obj != null)\r\n                    {\r\n                        Undo.RecordObject(obj, \"Load Global InputSettings to InputSettings Asset\");\r\n                        obj.CopyFromGlobal(true);\r\n                        EditorUtility.SetDirty(obj);\r\n                        AssetDatabase.SaveAssets();\r\n                        Selection.activeObject = obj;\r\n                        this.serializedObject.Update();\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n\r\n        private void DrawDetailArea()\r\n        {\r\n            EditorGUILayout.BeginVertical(\"Box\");\r\n            if (_entryList.index >= 0)\r\n            {\r\n                var element = _entryList.serializedProperty.GetArrayElementAtIndex(_entryList.index);\r\n\r\n                var propType = element.FindPropertyRelative(PROP_TYPE);\r\n                \r\n                SPEditorGUILayout.PropertyField(propType);\r\n                SPEditorGUILayout.PropertyField(element.FindPropertyRelative(PROP_NAME));\r\n                SPEditorGUILayout.PropertyField(element.FindPropertyRelative(PROP_DESCRIPTIVENAME));\r\n\r\n                switch ((InputSettings.InputType)propType.enumValueIndex)\r\n                {\r\n                    case InputSettings.InputType.KeyOrMouseButton:\r\n                        {\r\n                            SPEditorGUILayout.PropertyField(element.FindPropertyRelative(PROP_DESCRIPTIVENAMENEGATIVE));\r\n                            SPEditorGUILayout.PropertyField(element.FindPropertyRelative(PROP_NEGATIVEBUTTON));\r\n                            SPEditorGUILayout.PropertyField(element.FindPropertyRelative(PROP_POSITIVEBUTTON));\r\n                            SPEditorGUILayout.PropertyField(element.FindPropertyRelative(PROP_ALTNEGATIVEBUTTON));\r\n                            SPEditorGUILayout.PropertyField(element.FindPropertyRelative(PROP_ALTPOSITIVEBUTTON));\r\n                            SPEditorGUILayout.PropertyField(element.FindPropertyRelative(PROP_GRAVITY));\r\n                            SPEditorGUILayout.PropertyField(element.FindPropertyRelative(PROP_DEAD));\r\n                            SPEditorGUILayout.PropertyField(element.FindPropertyRelative(PROP_SENSITIVITY));\r\n                            SPEditorGUILayout.PropertyField(element.FindPropertyRelative(PROP_SNAP));\r\n                            SPEditorGUILayout.PropertyField(element.FindPropertyRelative(PROP_INVERT));\r\n                            SPEditorGUILayout.PropertyField(element.FindPropertyRelative(PROP_JOYNUM));\r\n\r\n                            element.FindPropertyRelative(PROP_AXIS).enumValueIndex = 0;\r\n                        }\r\n                        break;\r\n                    case InputSettings.InputType.MouseMovement:\r\n                    case InputSettings.InputType.JoystickAxis:\r\n                        {\r\n                            SPEditorGUILayout.PropertyField(element.FindPropertyRelative(PROP_AXIS));\r\n                            SPEditorGUILayout.PropertyField(element.FindPropertyRelative(PROP_DEAD));\r\n                            SPEditorGUILayout.PropertyField(element.FindPropertyRelative(PROP_SENSITIVITY));\r\n                            SPEditorGUILayout.PropertyField(element.FindPropertyRelative(PROP_INVERT));\r\n                            SPEditorGUILayout.PropertyField(element.FindPropertyRelative(PROP_JOYNUM));\r\n\r\n                            element.FindPropertyRelative(PROP_DESCRIPTIVENAMENEGATIVE).stringValue = string.Empty;\r\n                            element.FindPropertyRelative(PROP_NEGATIVEBUTTON).stringValue = string.Empty;\r\n                            element.FindPropertyRelative(PROP_POSITIVEBUTTON).stringValue = string.Empty;\r\n                            element.FindPropertyRelative(PROP_ALTNEGATIVEBUTTON).stringValue = string.Empty;\r\n                            element.FindPropertyRelative(PROP_ALTPOSITIVEBUTTON).stringValue = string.Empty;\r\n                            element.FindPropertyRelative(PROP_GRAVITY).floatValue = 0f;\r\n                            element.FindPropertyRelative(PROP_SNAP).boolValue = false;\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                EditorGUILayout.HelpBox(\"Select a target to edit.\", MessageType.Info);\r\n            }\r\n            EditorGUILayout.EndVertical();\r\n        }\r\n\r\n        private void _entryList_DrawHeader(Rect area)\r\n        {\r\n            EditorGUI.LabelField(area, \"Entries\");\r\n        }\r\n\r\n        private void _entryList_DrawElement(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            var element = _entryList.serializedProperty.GetArrayElementAtIndex(index);\r\n\r\n            var propName = element.FindPropertyRelative(PROP_NAME);\r\n            var propDesc = element.FindPropertyRelative(PROP_DESCRIPTIVENAME);\r\n\r\n            EditorGUI.LabelField(area, propName.stringValue, propDesc.stringValue);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Internal/CachedReorderableList.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Reflection;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\n\r\nnamespace com.spacepuppyeditor.Internal\r\n{\r\n\r\n    public class SPReorderableList : ReorderableList\r\n    {\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public SPReorderableList(SerializedObject serializedObj, SerializedProperty property)\r\n            : base(serializedObj, property)\r\n        {\r\n\r\n        }\r\n        public SPReorderableList(System.Collections.IList elements, System.Type elementType)\r\n            : base(elements, elementType)\r\n        {\r\n\r\n        }\r\n        public SPReorderableList(System.Collections.IList elements, System.Type elementType, bool draggable, bool displayHeader, bool displayAddButton, bool displayRemoveButton)\r\n            : base(elements, elementType, draggable, displayHeader, displayAddButton, displayRemoveButton)\r\n        {\r\n\r\n        }\r\n        public SPReorderableList(SerializedObject serializedObject, SerializedProperty elements, bool draggable, bool displayHeader, bool displayAddButton, bool displayRemoveButton)\r\n            : base(serializedObject, elements, draggable, displayHeader, displayAddButton, displayRemoveButton)\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public new void DoLayoutList()\r\n        {\r\n            //var beforeRect = GUILayoutUtility.GetLastRect();\r\n            //base.DoLayoutList();\r\n            //var afterRect = GUILayoutUtility.GetLastRect();\r\n\r\n            //var area = new Rect(afterRect.xMin, beforeRect.yMax, afterRect.width, this.headerHeight);\r\n            //this.DoHeaderContextMenu(area);\r\n\r\n            var area = EditorGUILayout.GetControlRect(false, this.GetHeight());\r\n            this.DoList(area);\r\n\r\n            var headerArea = new Rect(area.xMin, area.yMin, area.width, this.headerHeight);\r\n            this.DoHeaderContextMenu(headerArea);\r\n        }\r\n\r\n        public new void DoList(Rect rect)\r\n        {\r\n            base.DoList(rect);\r\n\r\n            var area = new Rect(rect.xMin, rect.yMin, rect.width, this.headerHeight);\r\n            this.DoHeaderContextMenu(area);\r\n        }\r\n\r\n        private void DoHeaderContextMenu(Rect area)\r\n        {\r\n            if(ReorderableListHelper.IsClickingArea(area, MouseUtil.BTN_RIGHT))\r\n            {\r\n                Event.current.Use();\r\n\r\n                if(this.serializedProperty != null)\r\n                {\r\n                    var menu = new GenericMenu();\r\n                    var prop = this.serializedProperty;\r\n                    menu.AddItem(new GUIContent(\"Clear\"), false, () =>\r\n                    {\r\n                        prop.serializedObject.Update();\r\n                        prop.arraySize = 0;\r\n                        prop.serializedObject.ApplyModifiedProperties();\r\n                    });\r\n                    menu.ShowAsContext();\r\n                }\r\n                else if(this.list != null)\r\n                {\r\n\r\n                    var menu = new GenericMenu();\r\n                    var lst = this.list;\r\n                    menu.AddItem(new GUIContent(\"Clear\"), false, () =>\r\n                    {\r\n                        lst.Clear();\r\n                    });\r\n                    menu.ShowAsContext();\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    public sealed class CachedReorderableList : SPReorderableList\r\n    {\r\n\r\n        public GUIContent Label;\r\n\r\n        private CachedReorderableList(SerializedObject serializedObj, SerializedProperty property)\r\n            : base(serializedObj, property)\r\n        {\r\n        }\r\n\r\n        private CachedReorderableList(System.Collections.IList memberList)\r\n            : base(memberList, null)\r\n        {\r\n        }\r\n\r\n        #region Methods\r\n\r\n        private static FieldInfo _m_SerializedObject;\r\n        private void ReInit(SerializedObject obj, SerializedProperty prop)\r\n        {\r\n            try\r\n            {\r\n                if (_m_SerializedObject == null)\r\n                    _m_SerializedObject = typeof(ReorderableList).GetField(\"m_SerializedObject\", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);\r\n                _m_SerializedObject.SetValue(this, obj);\r\n            }\r\n            catch\r\n            {\r\n                UnityEngine.Debug.LogWarning(\"This version of Spacepuppy Framework does not support the version of Unity it's being used with (CachedReorderableList).\");\r\n            }\r\n\r\n            this.serializedProperty = prop;\r\n            this.list = null;\r\n        }\r\n\r\n        private void ReInit(System.Collections.IList memberList)\r\n        {\r\n            try\r\n            {\r\n                if (_m_SerializedObject == null)\r\n                    _m_SerializedObject = typeof(ReorderableList).GetField(\"m_SerializedObject\", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);\r\n                _m_SerializedObject.SetValue(this, null);\r\n            }\r\n            catch\r\n            {\r\n                UnityEngine.Debug.LogWarning(\"This version of Spacepuppy Framework does not support the version of Unity it's being used with (CachedReorderableList).\");\r\n            }\r\n\r\n            this.serializedProperty = null;\r\n            this.list = memberList;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Static Factory\r\n\r\n        private static Dictionary<int, CachedReorderableList> _lstCache = new Dictionary<int, CachedReorderableList>();\r\n\r\n        public static CachedReorderableList GetListDrawer(SerializedProperty property, ReorderableList.HeaderCallbackDelegate drawHeaderCallback, ReorderableList.ElementCallbackDelegate drawElementCallback,\r\n                                                          ReorderableList.AddCallbackDelegate onAddCallback = null, ReorderableList.RemoveCallbackDelegate onRemoveCallback = null, ReorderableList.SelectCallbackDelegate onSelectCallback = null,\r\n                                                          ReorderableList.ChangedCallbackDelegate onChangedCallback = null, ReorderableList.ReorderCallbackDelegate onReorderCallback = null, ReorderableList.CanRemoveCallbackDelegate onCanRemoveCallback = null,\r\n                                                          ReorderableList.AddDropdownCallbackDelegate onAddDropdownCallback = null)\r\n        {\r\n            if (property == null) throw new System.ArgumentNullException(\"property\");\r\n            if (!property.isArray) throw new System.ArgumentException(\"SerializedProperty must be a property for an Array or List\", \"property\");\r\n\r\n            int hash = PropertyHandlerCache.GetIndexRespectingPropertyHash(property);\r\n            CachedReorderableList lst;\r\n            if (_lstCache.TryGetValue(hash, out lst))\r\n            {\r\n                lst.ReInit(property.serializedObject, property);\r\n            }\r\n            else\r\n            {\r\n                lst = new CachedReorderableList(property.serializedObject, property);\r\n                _lstCache[hash] = lst;\r\n            }\r\n\r\n            lst.drawHeaderCallback = drawHeaderCallback;\r\n            lst.drawElementCallback = drawElementCallback;\r\n            lst.onAddCallback = onAddCallback;\r\n            lst.onRemoveCallback = onRemoveCallback;\r\n            lst.onSelectCallback = onSelectCallback;\r\n            lst.onChangedCallback = onChangedCallback;\r\n            lst.onReorderCallback = onReorderCallback;\r\n            lst.onCanRemoveCallback = onCanRemoveCallback;\r\n            lst.onAddDropdownCallback = onAddDropdownCallback;\r\n\r\n            return lst;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates a cached ReorderableList that can be used on a IList. The serializedProperty passed is used for look-up and is not used in the ReorderableList itself.\r\n        /// </summary>\r\n        /// <param name=\"memberList\"></param>\r\n        /// <param name=\"tokenProperty\"></param>\r\n        /// <param name=\"drawHeaderCallback\"></param>\r\n        /// <param name=\"drawElementCallback\"></param>\r\n        /// <param name=\"onAddCallback\"></param>\r\n        /// <param name=\"onRemoveCallback\"></param>\r\n        /// <param name=\"onSelectCallback\"></param>\r\n        /// <param name=\"onChangedCallback\"></param>\r\n        /// <param name=\"onReorderCallback\"></param>\r\n        /// <param name=\"onCanRemoveCallback\"></param>\r\n        /// <param name=\"onAddDropdownCallback\"></param>\r\n        /// <returns></returns>\r\n        public static CachedReorderableList GetListDrawer(System.Collections.IList memberList, SerializedProperty tokenProperty, ReorderableList.HeaderCallbackDelegate drawHeaderCallback, ReorderableList.ElementCallbackDelegate drawElementCallback,\r\n                                                  ReorderableList.AddCallbackDelegate onAddCallback = null, ReorderableList.RemoveCallbackDelegate onRemoveCallback = null, ReorderableList.SelectCallbackDelegate onSelectCallback = null,\r\n                                                  ReorderableList.ChangedCallbackDelegate onChangedCallback = null, ReorderableList.ReorderCallbackDelegate onReorderCallback = null, ReorderableList.CanRemoveCallbackDelegate onCanRemoveCallback = null,\r\n                                                  ReorderableList.AddDropdownCallbackDelegate onAddDropdownCallback = null)\r\n        {\r\n            if (memberList == null) throw new System.ArgumentNullException(\"memberList\");\r\n            if (tokenProperty == null) throw new System.ArgumentNullException(\"property\");\r\n\r\n            int hash = PropertyHandlerCache.GetIndexRespectingPropertyHash(tokenProperty);\r\n            CachedReorderableList lst;\r\n            if (_lstCache.TryGetValue(hash, out lst))\r\n            {\r\n                lst.ReInit(memberList);\r\n            }\r\n            else\r\n            {\r\n                lst = new CachedReorderableList(memberList);\r\n                _lstCache[hash] = lst;\r\n            }\r\n\r\n            lst.drawHeaderCallback = drawHeaderCallback;\r\n            lst.drawElementCallback = drawElementCallback;\r\n            lst.onAddCallback = onAddCallback;\r\n            lst.onRemoveCallback = onRemoveCallback;\r\n            lst.onSelectCallback = onSelectCallback;\r\n            lst.onChangedCallback = onChangedCallback;\r\n            lst.onReorderCallback = onReorderCallback;\r\n            lst.onCanRemoveCallback = onCanRemoveCallback;\r\n            lst.onAddDropdownCallback = onAddDropdownCallback;\r\n\r\n            return lst;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Internal/DefaultPropertyHandler.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Internal\r\n{\r\n\r\n    /// <summary>\r\n    /// Draws a SerializedProperty as if itself doesn't have any custom drawers, while respecting the custom drawers of its children. \r\n    /// </summary>\r\n    internal class DefaultPropertyHandler : IPropertyHandler\r\n    {\r\n\r\n        public float GetHeight(SerializedProperty property, GUIContent label, bool includeChildren)\r\n        {\r\n            if (label == null) label = EditorHelper.TempContent(property.displayName);\r\n\r\n            if (!includeChildren || !property.hasVisibleChildren)\r\n            {\r\n                return ScriptAttributeUtility.SharedNullInternalPropertyHandler.GetHeight(property, label, includeChildren);\r\n                //return EditorGUI.GetPropertyHeight(property, label, includeChildren);\r\n            }\r\n            \r\n            float h = EditorGUIUtility.singleLineHeight;\r\n\r\n            if (property.isExpanded)\r\n            {\r\n                var iterator = property.Copy();\r\n                var end = property.GetEndProperty();\r\n                for (bool enterChildren = true; iterator.Next(enterChildren); enterChildren = false)\r\n                {\r\n                    if (SerializedProperty.EqualContents(iterator, end))\r\n                        break;\r\n\r\n                    h += SPEditorGUI.GetPropertyHeight(iterator, EditorHelper.TempContent(iterator.displayName), iterator.hasVisibleChildren);\r\n                }\r\n            }\r\n\r\n            return h;\r\n        }\r\n\r\n        public bool OnGUI(Rect position, SerializedProperty property, GUIContent label, bool includeChildren)\r\n        {\r\n            if (label == null) label = EditorHelper.TempContent(property.displayName);\r\n\r\n            if (!includeChildren || !property.hasVisibleChildren)\r\n            {\r\n                return ScriptAttributeUtility.SharedNullInternalPropertyHandler.OnGUI(position, property, label, includeChildren);\r\n                //return EditorGUI.PropertyField(position, property, label, includeChildren);\r\n            }\r\n\r\n            float h;\r\n            Rect r;\r\n            EditorGUI.BeginChangeCheck();\r\n\r\n            //draw header\r\n            h = EditorGUIUtility.singleLineHeight;\r\n            r = new Rect(position.xMin, position.yMin, position.width, h);\r\n            position = new Rect(r.xMin, r.yMax, r.width, position.height - h);\r\n            property.isExpanded = EditorGUI.Foldout(r, property.isExpanded, label);\r\n\r\n            //draw children\r\n            if(property.isExpanded)\r\n            {\r\n                var iterator = property.Copy();\r\n                var end = property.GetEndProperty();\r\n                for (bool enterChildren = true; iterator.NextVisible(enterChildren); enterChildren = false)\r\n                {\r\n                    if (SerializedProperty.EqualContents(iterator, end))\r\n                        break;\r\n\r\n                    h = SPEditorGUI.GetPropertyHeight(iterator);\r\n                    r = new Rect(position.xMin, position.yMin, position.width, h);\r\n                    position = new Rect(r.xMin, r.yMax, r.width, position.height - h);\r\n\r\n                    SPEditorGUI.PropertyField(r, iterator, EditorHelper.TempContent(iterator.displayName, iterator.tooltip), iterator.hasVisibleChildren);\r\n                }\r\n            }\r\n\r\n            return EditorGUI.EndChangeCheck();\r\n        }\r\n\r\n        public bool OnGUILayout(SerializedProperty property, GUIContent label, bool includeChildren, GUILayoutOption[] options)\r\n        {\r\n            if (label == null) label = EditorHelper.TempContent(property.displayName);\r\n\r\n            if (!includeChildren || !property.hasVisibleChildren)\r\n            {\r\n                //return ScriptAttributeUtility.SharedNullInternalPropertyHandler.OnGUILayout(property, label, includeChildren, options);\r\n                return EditorGUILayout.PropertyField(property, label, includeChildren, options);\r\n            }\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n\r\n            //draw header\r\n            property.isExpanded = EditorGUILayout.Foldout(property.isExpanded, label);\r\n\r\n            //draw children\r\n            if (property.isExpanded)\r\n            {\r\n                var iterator = property.Copy();\r\n                var end = property.GetEndProperty();\r\n                for (bool enterChildren = true; iterator.NextVisible(enterChildren); enterChildren = false)\r\n                {\r\n                    if (SerializedProperty.EqualContents(iterator, end))\r\n                        break;\r\n\r\n                    SPEditorGUILayout.PropertyField(iterator, EditorHelper.TempContent(iterator.displayName, iterator.tooltip), iterator.hasVisibleChildren, options);\r\n                }\r\n            }\r\n\r\n            return EditorGUI.EndChangeCheck();\r\n        }\r\n        \r\n        public void OnValidate(SerializedProperty property)\r\n        {\r\n            //TODO\r\n        }\r\n\r\n    }\r\n\r\n\r\n\r\n\r\n\r\n    /// <summary>\r\n    /// Handler that simulates the default drawing for a SerializedProperty with no special behaviour. Does NOT support arrays.\r\n    /// \r\n    /// Potential candiate for obsolescence, was designed for the 'DefaultPropertyField' methods in SPEditorGUI and SPEditorGUILayout. But because it \r\n    /// still pulled the PropertyDrawer, it doesn't perform what I suspect it was originally intended for (drawing properties without any custom editor. \r\n    /// \r\n    /// In the same regard, I can't remember if that IS what DefaultPropertyDrawer was intended for either... so holding onto just in case \r\n    /// SPEditor.DefaultPropertyField isn't working as expected... since it has several dependencies around.\r\n    /// </summary>\r\n    internal class DefaultPropertyHandler_Old : IPropertyHandler\r\n    {\r\n\r\n        #region Singleton Interface\r\n\r\n        private static DefaultPropertyHandler_Old _instance;\r\n\r\n        public static DefaultPropertyHandler_Old Instance\r\n        {\r\n            get\r\n            {\r\n                if (_instance == null) _instance = new DefaultPropertyHandler_Old();\r\n                return _instance;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        private Dictionary<System.Type, PropertyDrawer> _fieldTypeToDrawer = new Dictionary<System.Type, PropertyDrawer>();\r\n\r\n        private static TypeAccessWrapper _editorGuiAccessWrapper;\r\n        private static System.Func<Rect, SerializedProperty, GUIContent, bool> _imp_DefaultPropertyField;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private DefaultPropertyHandler_Old()\r\n        {\r\n            //block constructor\r\n            _editorGuiAccessWrapper = new TypeAccessWrapper(typeof(EditorGUI));\r\n            _editorGuiAccessWrapper.IncludeNonPublic = true;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private PropertyDrawer GetDrawer(SerializedProperty property)\r\n        {\r\n            if (property.propertyType == SerializedPropertyType.Generic || property.propertyType == SerializedPropertyType.ObjectReference)\r\n            {\r\n                var fieldInfo = ScriptAttributeUtility.GetFieldInfoFromProperty(property);\r\n                if (fieldInfo == null) return null;\r\n\r\n                var tp = fieldInfo.FieldType;\r\n                if (tp.IsListType()) tp = tp.GetElementTypeOfListType();\r\n\r\n                PropertyDrawer drawer = null;\r\n                if (_fieldTypeToDrawer.TryGetValue(tp, out drawer))\r\n                {\r\n                    if (drawer != null) PropertyDrawerActivator.InitializePropertyDrawer(drawer, null, fieldInfo);\r\n                    return drawer;\r\n                }\r\n\r\n                var drawerType = ScriptAttributeUtility.GetDrawerTypeForType(tp);\r\n                if (drawerType == null)\r\n                {\r\n                    _fieldTypeToDrawer[tp] = null;\r\n                    return null;\r\n                }\r\n\r\n                drawer = PropertyDrawerActivator.Create(drawerType, null, fieldInfo);\r\n                _fieldTypeToDrawer[tp] = drawer;\r\n                return drawer;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IPropertyHandler Interface\r\n\r\n        public float GetHeight(SerializedProperty property, GUIContent label, bool includeChildren)\r\n        {\r\n            var drawer = this.GetDrawer(property);\r\n            if (drawer != null)\r\n            {\r\n                return drawer.GetPropertyHeight(property, label);\r\n            }\r\n            else\r\n            {\r\n                return EditorGUIUtility.singleLineHeight;\r\n            }\r\n        }\r\n\r\n        public bool OnGUI(Rect position, SerializedProperty property, GUIContent label, bool includeChildren)\r\n        {\r\n            var drawer = this.GetDrawer(property);\r\n            if (drawer != null)\r\n            {\r\n                EditorGUI.BeginChangeCheck();\r\n                drawer.OnGUI(position, property, label);\r\n                return EditorGUI.EndChangeCheck();\r\n            }\r\n            else\r\n            {\r\n                if (_imp_DefaultPropertyField == null) _imp_DefaultPropertyField = _editorGuiAccessWrapper.GetStaticMethod(\"DefaultPropertyField\", typeof(System.Func<Rect, SerializedProperty, GUIContent, bool>)) as System.Func<Rect, SerializedProperty, GUIContent, bool>;\r\n                return _imp_DefaultPropertyField(position, property, label);\r\n            }\r\n        }\r\n\r\n        public bool OnGUILayout(SerializedProperty property, GUIContent label, bool includeChildren, GUILayoutOption[] options)\r\n        {\r\n            var drawer = this.GetDrawer(property);\r\n            if (drawer != null)\r\n            {\r\n                var h = drawer.GetPropertyHeight(property, label);\r\n                var position = EditorGUILayout.GetControlRect(true, h);\r\n                EditorGUI.BeginChangeCheck();\r\n                drawer.OnGUI(position, property, label);\r\n                return EditorGUI.EndChangeCheck();\r\n            }\r\n            else\r\n            {\r\n                if (_imp_DefaultPropertyField == null) _imp_DefaultPropertyField = _editorGuiAccessWrapper.GetStaticMethod(\"DefaultPropertyField\", typeof(System.Func<Rect, SerializedProperty, GUIContent, bool>)) as System.Func<Rect, SerializedProperty, GUIContent, bool>;\r\n                var position = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight);\r\n                return _imp_DefaultPropertyField(position, property, label);\r\n            }\r\n        }\r\n\r\n        public void OnValidate(SerializedProperty property)\r\n        {\r\n            //do nothing\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n    }\r\n\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Internal/GUIViewProxy.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Dynamic;\r\n\r\nnamespace com.spacepuppyeditor.Internal\r\n{\r\n    public class GUIViewProxy\r\n    {\r\n\r\n        #region Static Interface\r\n\r\n        static GUIViewProxy()\r\n        {\r\n            var klass = InternalTypeUtil.UnityEditorAssembly.GetType(\"UnityEditor.GUIView\");\r\n            _staticWrapper = new TypeAccessWrapper(klass, true);\r\n        }\r\n\r\n        private static TypeAccessWrapper _staticWrapper;\r\n\r\n        public static GUIViewProxy GetCurrent()\r\n        {\r\n            var obj = _staticWrapper.GetStaticProperty(\"current\");\r\n            if (obj == null) return null;\r\n\r\n            return new GUIViewProxy(obj);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Fields\r\n\r\n        private object _internalGUIView;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private GUIViewProxy(object obj)\r\n        {\r\n            _internalGUIView = obj;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public bool SendEvent(Event e)\r\n        {\r\n            return (bool)DynamicUtil.InvokeMethodDirect(_internalGUIView, \"SendEvent\", e);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Internal/HackPropertyDrawers.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppyeditor.Internal\n{\n    internal class HackVector2PropertyDrawer : PropertyDrawer\n    {\n\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n        {\n            return EditorGUIUtility.singleLineHeight;\n        }\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            if (property.propertyType != SerializedPropertyType.Vector2) return;\n            property.vector2Value = EditorGUI.Vector2Field(position, label, property.vector2Value);\n        }\n\n    }\n\n    internal class HackVector3PropertyDrawer : PropertyDrawer\n    {\n\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n        {\n            return EditorGUIUtility.singleLineHeight;\n        }\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            if (property.propertyType != SerializedPropertyType.Vector3) return;\n            property.vector3Value = EditorGUI.Vector3Field(position, label, property.vector3Value);\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Internal/IPropertyHandler.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppyeditor.Internal\r\n{\r\n    internal interface IPropertyHandler\r\n    {\r\n\r\n        float GetHeight(SerializedProperty property, GUIContent label, bool includeChildren);\r\n\r\n        bool OnGUI(Rect position, SerializedProperty property, GUIContent label, bool includeChildren);\r\n\r\n        bool OnGUILayout(SerializedProperty property, GUIContent label, bool includeChildren, GUILayoutOption[] options);\r\n\r\n        void OnValidate(SerializedProperty property);\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Internal/InternalTypeUtil.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\n\r\nnamespace com.spacepuppyeditor.Internal\r\n{\r\n    internal static class InternalTypeUtil\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private static Assembly _unityEditorAssembly;\r\n        public static Assembly UnityEditorAssembly\r\n        {\r\n            get\r\n            {\r\n                if (_unityEditorAssembly == null) _unityEditorAssembly = System.Reflection.Assembly.GetAssembly(typeof(Editor));\r\n                return _unityEditorAssembly;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Internal/MultiPropertyAttributePropertyHandler.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Modifiers;\r\n\r\nnamespace com.spacepuppyeditor.Internal\r\n{\r\n    internal class MultiPropertyAttributePropertyHandler : UnityInternalPropertyHandler\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private System.Reflection.FieldInfo _fieldInfo;\r\n        private bool _propertyIsArray;\r\n\r\n        private PropertyDrawer _drawer;\r\n        private List<PropertyModifier> _modifiers;\r\n        private string _customDisplayName;\r\n        private string _customTooltip;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n        \r\n        public MultiPropertyAttributePropertyHandler(System.Reflection.FieldInfo fieldInfo, bool propertyIsArray, PropertyAttribute[] attribs)\r\n        {\r\n            if (fieldInfo == null) throw new System.ArgumentNullException(\"fieldInfo\");\r\n            if (attribs == null) throw new System.ArgumentNullException(\"attribs\");\r\n            _fieldInfo = fieldInfo;\r\n            _propertyIsArray = propertyIsArray;\r\n\r\n            this.Init(attribs);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public System.Reflection.FieldInfo Field { get { return _fieldInfo; } }\r\n\r\n        public bool PropertyIsArray\r\n        {\r\n            get { return _propertyIsArray; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected virtual void Init(PropertyAttribute[] attribs)\r\n        {\r\n            var fieldType = _fieldInfo.FieldType;\r\n            if (fieldType.IsListType()) fieldType = fieldType.GetElementTypeOfListType();\r\n\r\n            var fieldTypePropertyDrawerType = ScriptAttributeUtility.GetDrawerTypeForType(fieldType);\r\n            if (fieldTypePropertyDrawerType != null && TypeUtil.IsType(fieldTypePropertyDrawerType, typeof(PropertyDrawer)))\r\n            {\r\n                _drawer = PropertyDrawerActivator.Create(fieldTypePropertyDrawerType, null, _fieldInfo);\r\n                if (_drawer != null && _propertyIsArray) _drawer = new ArrayPropertyDrawer(_drawer);\r\n                this.InternalDrawer = _drawer;\r\n            }\r\n\r\n            if (attribs != null)\r\n            {\r\n                foreach (var attrib in attribs)\r\n                {\r\n                    this.HandleAttribute(attrib, _fieldInfo, fieldType);\r\n                }\r\n            }\r\n\r\n            if(_drawer == null)\r\n            {\r\n                if (_modifiers != null && _modifiers.Count > 0)\r\n                {\r\n                    var modifier = _modifiers.Last();\r\n                    modifier.IsDrawer = true;\r\n                    _drawer = modifier;\r\n                    if (_propertyIsArray) _drawer = new ArrayPropertyDrawer(_drawer);\r\n                    this.InternalDrawer = _drawer;\r\n                }\r\n                else\r\n                {\r\n                    _drawer = DefaultPropertyDrawer.SharedInstance;\r\n                    if (_drawer != null && _propertyIsArray) _drawer = new ArrayPropertyDrawer(_drawer);\r\n                    this.InternalDrawer = _drawer;\r\n                }\r\n            }\r\n        }\r\n\r\n        protected override void HandleAttribute(PropertyAttribute attribute, System.Reflection.FieldInfo field, System.Type propertyType)\r\n        {\r\n            if(attribute is PropertyModifierAttribute)\r\n            {\r\n                var mtp = ScriptAttributeUtility.GetDrawerTypeForType(attribute.GetType());\r\n                if (TypeUtil.IsType(mtp, typeof(PropertyModifier)))\r\n                {\r\n                    var modifier = PropertyDrawerActivator.Create(mtp, attribute, field) as PropertyModifier;\r\n                    if (_modifiers == null) _modifiers = new List<PropertyModifier>();\r\n                    _modifiers.Add(modifier);\r\n                }\r\n            }\r\n            else if(attribute is DisplayNameAttribute)\r\n            {\r\n                var dattrib = attribute as DisplayNameAttribute;\r\n                _customDisplayName = dattrib.DisplayName;\r\n                if (dattrib.tooltip != null)\r\n                {\r\n                    _customTooltip = dattrib.tooltip;\r\n                    base.HandleAttribute(attribute, field, propertyType);\r\n                }\r\n            }\r\n            else if(attribute is TooltipAttribute)\r\n            {\r\n                _customTooltip = (attribute as TooltipAttribute).tooltip;\r\n                base.HandleAttribute(attribute, field, propertyType);\r\n            }\r\n            else if(attribute is ContextMenuItemAttribute)\r\n            {\r\n                base.HandleAttribute(attribute, field, propertyType);\r\n            }\r\n            else\r\n            {\r\n                var drawerTypeForType = ScriptAttributeUtility.GetDrawerTypeForType(attribute.GetType());\r\n                if (drawerTypeForType == null)\r\n                    return;\r\n                else if (typeof(PropertyDrawer).IsAssignableFrom(drawerTypeForType))\r\n                {\r\n                    base.HandleAttribute(attribute, field, propertyType);\r\n                    var drawer = this.InternalDrawer; //this retrieves the drawer that was selected by called 'base.HandleAttribute'\r\n                    this.AppendDrawer(drawer);\r\n                }\r\n                else if (typeof(DecoratorDrawer).IsAssignableFrom(drawerTypeForType))\r\n                {\r\n                    DecoratorDrawer instance = (DecoratorDrawer)System.Activator.CreateInstance(drawerTypeForType);\r\n                    com.spacepuppy.Dynamic.DynamicUtil.SetValue(instance, \"m_Attribute\", attribute);\r\n                    if (this.DecoratorDrawers == null)\r\n                        this.DecoratorDrawers = new List<DecoratorDrawer>();\r\n                    this.DecoratorDrawers.Add(instance);\r\n                }\r\n            }\r\n        }\r\n\r\n        protected void AppendDrawer(PropertyDrawer drawer)\r\n        {\r\n            if (_drawer == null)\r\n            {\r\n                //no drawer has been set before... lets see if we got one\r\n                if(drawer is PropertyModifier)\r\n                {\r\n                    if (_modifiers == null) _modifiers = new List<PropertyModifier>();\r\n                    _modifiers.Add(drawer as PropertyModifier);\r\n                    \r\n                    if(_propertyIsArray)\r\n                    {\r\n                        _drawer = new ArrayPropertyDrawer(null);\r\n                    }\r\n                }\r\n                else if(drawer != null)\r\n                {\r\n                    //we got a new drawer, set it\r\n                    if (!(drawer is IArrayHandlingPropertyDrawer) && _propertyIsArray) drawer = new ArrayPropertyDrawer(drawer);\r\n                    _drawer = drawer;\r\n                }\r\n            }\r\n            else if (drawer != _drawer)\r\n            {\r\n                //a new drawer was created, lets see what we need to do with it compared to the last one\r\n                if (drawer is PropertyModifier)\r\n                {\r\n                    if (_modifiers == null) _modifiers = new List<PropertyModifier>();\r\n                    _modifiers.Add(drawer as PropertyModifier);\r\n                }\r\n                else if (drawer is IArrayHandlingPropertyDrawer)\r\n                {\r\n                    //got an array drawer, this overrides previous drawers\r\n                    if (_drawer is IArrayHandlingPropertyDrawer)\r\n                    {\r\n                        var temp = _drawer as IArrayHandlingPropertyDrawer;\r\n                        _drawer = drawer;\r\n                        (_drawer as IArrayHandlingPropertyDrawer).InternalDrawer = temp.InternalDrawer;\r\n                    }\r\n                    else if (_drawer != null)\r\n                    {\r\n                        var temp = _drawer;\r\n                        _drawer = drawer;\r\n                        (_drawer as IArrayHandlingPropertyDrawer).InternalDrawer = temp;\r\n                    }\r\n                    else\r\n                    {\r\n                        _drawer = drawer;\r\n                    }\r\n                }\r\n                else if (_drawer is IArrayHandlingPropertyDrawer)\r\n                {\r\n                    //got an internal drawer for the existing array drawer\r\n                    (_drawer as IArrayHandlingPropertyDrawer).InternalDrawer = drawer;\r\n                }\r\n                else\r\n                {\r\n                    //we got a new drawer, set it\r\n                    if (_propertyIsArray)\r\n                    {\r\n                        _drawer = new ArrayPropertyDrawer(drawer);\r\n                    }\r\n                    else\r\n                    {\r\n                        _drawer = drawer;\r\n                    }\r\n                }\r\n            }\r\n\r\n            //ensure internal drawer is set appropriately\r\n            this.InternalDrawer = _drawer;\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n        public override bool OnGUI(Rect position, SerializedProperty property, GUIContent label, bool includeChildren)\r\n        {\r\n            if(label == null)\r\n            {\r\n                label = EditorHelper.TempContent(_customDisplayName ?? property.displayName, _customTooltip ?? property.tooltip);\r\n            }\r\n            else if(string.IsNullOrEmpty(label.tooltip) && !string.IsNullOrEmpty(_customTooltip))\r\n            {\r\n                label = EditorHelper.CloneContent(label);\r\n                label.tooltip = _customTooltip;\r\n            }\r\n\r\n            bool cancelDraw = false;\r\n\r\n            if (_modifiers != null)\r\n            {\r\n                for (int i = 0; i < _modifiers.Count; i++)\r\n                {\r\n                    _modifiers[i].OnBeforeGUI(property, ref cancelDraw);\r\n                }\r\n            }\r\n\r\n            bool result = false;\r\n            if (!cancelDraw) result = base.OnGUI(position, property, label, includeChildren);\r\n            PropertyHandlerValidationUtility.AddAsHandled(property, this);\r\n\r\n            if (_modifiers != null)\r\n            {\r\n                for (int i = 0; i < _modifiers.Count; i++)\r\n                {\r\n                    _modifiers[i].OnPostGUI(property);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        public override bool OnGUILayout(SerializedProperty property, GUIContent label, bool includeChildren, GUILayoutOption[] options)\r\n        {\r\n            if (label == null)\r\n            {\r\n                label = EditorHelper.TempContent(_customDisplayName ?? property.displayName, _customTooltip ?? property.tooltip);\r\n            }\r\n            else if (string.IsNullOrEmpty(label.tooltip) && !string.IsNullOrEmpty(_customTooltip))\r\n            {\r\n                label = EditorHelper.CloneContent(label);\r\n                label.tooltip = _customTooltip;\r\n            }\r\n\r\n            bool cancelDraw = false;\r\n\r\n            if (_modifiers != null)\r\n            {\r\n                for (int i = 0; i < _modifiers.Count; i++)\r\n                {\r\n                    _modifiers[i].OnBeforeGUI(property, ref cancelDraw);\r\n                }\r\n            }\r\n\r\n            bool result = false;\r\n            if (!cancelDraw) result = base.OnGUILayout(property, label, includeChildren, options);\r\n            PropertyHandlerValidationUtility.AddAsHandled(property, this);\r\n\r\n            if (_modifiers != null)\r\n            {\r\n                for (int i = 0; i < _modifiers.Count; i++)\r\n                {\r\n                    _modifiers[i].OnPostGUI(property);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        public override void OnValidate(SerializedProperty property)\r\n        {\r\n            if (_modifiers != null)\r\n            {\r\n                for (int i = 0; i < _modifiers.Count; i++)\r\n                {\r\n                    _modifiers[i].OnValidate(property);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n\r\n        #region Special Types\r\n\r\n        private class ArrayPropertyDrawer : PropertyDrawer, IArrayHandlingPropertyDrawer\r\n        {\r\n\r\n            #region Fields\r\n\r\n            private PropertyDrawer _drawer;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            public ArrayPropertyDrawer(PropertyDrawer drawer)\r\n            {\r\n                _drawer = drawer;\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region PropertyDrawer Interface\r\n\r\n            public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n            {\r\n                if (label == null) label = EditorHelper.TempContent(property.displayName);\r\n\r\n                if (!property.isArray)\r\n                {\r\n                    if (_drawer != null)\r\n                        return _drawer.GetPropertyHeight(property, label);\r\n                    else\r\n                        return SPEditorGUI.GetDefaultPropertyHeight(property);\r\n                }\r\n                else\r\n                {\r\n                    float h = SPEditorGUI.GetSinglePropertyHeight(property, label);\r\n                    if (!property.isExpanded) return h;\r\n\r\n                    h += EditorGUIUtility.singleLineHeight + 2f;\r\n\r\n                    for (int i = 0; i < property.arraySize; i++)\r\n                    {\r\n                        var pchild = property.GetArrayElementAtIndex(i);\r\n                        if(_drawer != null)\r\n                            h += _drawer.GetPropertyHeight(pchild, EditorHelper.TempContent(pchild.displayName)) + 2f;\r\n                        else\r\n                            h += SPEditorGUI.GetPropertyHeight(pchild, EditorHelper.TempContent(pchild.displayName)) + 2f;\r\n                    }\r\n                    return h;\r\n                }\r\n            }\r\n\r\n            public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n            {\r\n                if (label == null) label = EditorHelper.TempContent(property.displayName);\r\n\r\n                if (!property.isArray)\r\n                {\r\n                    if (_drawer != null)\r\n                        _drawer.OnGUI(position, property, label);\r\n                    else\r\n                        SPEditorGUI.DefaultPropertyField(position, property, label);\r\n                }\r\n                else\r\n                {\r\n                    if (property.isExpanded)\r\n                    {\r\n                        var rect = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n                        property.isExpanded = EditorGUI.Foldout(rect, property.isExpanded, label);\r\n\r\n                        EditorGUI.indentLevel++;\r\n                        rect = new Rect(rect.xMin, rect.yMax + 2f, rect.width, EditorGUIUtility.singleLineHeight);\r\n                        property.arraySize = Mathf.Max(0, EditorGUI.IntField(rect, \"Size\", property.arraySize));\r\n\r\n                        var lbl = EditorHelper.TempContent(\"\");\r\n                        for (int i = 0; i < property.arraySize; i++)\r\n                        {\r\n                            var pchild = property.GetArrayElementAtIndex(i);\r\n                            lbl.text = pchild.displayName;\r\n                            if(_drawer != null)\r\n                            {\r\n                                var h = _drawer.GetPropertyHeight(pchild, lbl);\r\n                                rect = new Rect(rect.xMin, rect.yMax + 2f, rect.width, h);\r\n                                _drawer.OnGUI(rect, pchild, lbl);\r\n                            }\r\n                            else\r\n                            {\r\n                                var h = SPEditorGUI.GetDefaultPropertyHeight(pchild, lbl);\r\n                                rect = new Rect(rect.xMin, rect.yMax + 2f, rect.width, h);\r\n                                SPEditorGUI.DefaultPropertyField(rect, pchild, lbl);\r\n                            }\r\n                        }\r\n\r\n                        EditorGUI.indentLevel--;\r\n                    }\r\n                    else\r\n                    {\r\n                        property.isExpanded = EditorGUI.Foldout(position, property.isExpanded, label);\r\n                    }\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IArrayHandlingPropertyDrawer Interface\r\n\r\n            public PropertyDrawer InternalDrawer\r\n            {\r\n                get\r\n                {\r\n                    return _drawer;\r\n                }\r\n                set\r\n                {\r\n                    if (value != null) _drawer = value;\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        \r\n\r\n        private class DefaultPropertyDrawer : PropertyDrawer\r\n        {\r\n            public readonly static DefaultPropertyDrawer SharedInstance = new DefaultPropertyDrawer();\r\n\r\n            public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n            {\r\n                return ScriptAttributeUtility.SharedNullPropertyHandler.GetHeight(property, label, property.hasVisibleChildren);\r\n            }\r\n\r\n            public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n            {\r\n                ScriptAttributeUtility.SharedNullPropertyHandler.OnGUI(position, property, label, property.hasVisibleChildren);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Internal/PropertyDrawerActivator.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Internal\r\n{\r\n    internal static class PropertyDrawerActivator\r\n    {\r\n\r\n        public static PropertyDrawer Create(System.Type propertyDrawerType)\r\n        {\r\n            return System.Activator.CreateInstance(propertyDrawerType) as PropertyDrawer;\r\n        }\r\n\r\n        public static PropertyDrawer Create(System.Type propertyDrawerType, PropertyAttribute attrib, System.Reflection.FieldInfo fieldInfo)\r\n        {\r\n            var drawer = System.Activator.CreateInstance(propertyDrawerType) as PropertyDrawer;\r\n            if(drawer != null) InitializePropertyDrawer(drawer, attrib, fieldInfo);\r\n            return drawer;\r\n        }\r\n\r\n        public static void InitializePropertyDrawer(PropertyDrawer drawer, PropertyAttribute attrib, System.Reflection.FieldInfo fieldInfo)\r\n        {\r\n            if (drawer == null) throw new System.ArgumentNullException(\"drawer\");\r\n            DynamicUtil.SetValue(drawer, \"m_Attribute\", attrib);\r\n            DynamicUtil.SetValue(drawer, \"m_FieldInfo\", fieldInfo);\r\n        }\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Internal/PropertyHandlerCache.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Modifiers;\r\n\r\nnamespace com.spacepuppyeditor.Internal\r\n{\r\n    internal class PropertyHandlerCache\r\n    {\r\n\r\n        private Dictionary<int, IPropertyHandler> _table = new Dictionary<int, IPropertyHandler>();\r\n\r\n\r\n        public IPropertyHandler GetHandler(SerializedProperty property)\r\n        {\r\n            if (property == null) throw new System.ArgumentNullException(\"property\");\r\n\r\n            var hash = GetPropertyHash(property);\r\n            IPropertyHandler result;\r\n            if (_table.TryGetValue(hash, out result))\r\n                return result;\r\n            else\r\n                return null;\r\n\r\n        }\r\n\r\n        public void SetHandler(SerializedProperty property, IPropertyHandler handler)\r\n        {\r\n            if (property == null) throw new System.ArgumentNullException(\"property\");\r\n\r\n            var hash = GetPropertyHash(property);\r\n            if(handler == null)\r\n            {\r\n                if (_table.ContainsKey(hash)) _table.Remove(hash);\r\n            }\r\n            else\r\n            {\r\n                _table[hash] = handler;\r\n            }\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _table.Clear();\r\n        }\r\n\r\n        public static int GetPropertyHash(SerializedProperty property)\r\n        {\r\n            if (property == null) throw new System.ArgumentNullException(\"property\");\r\n            if (property.serializedObject.targetObject == null)\r\n                return 0;\r\n\r\n            var spath = property.propertyPath;\r\n            int index = spath.IndexOf(\".Array.data[\");\r\n            int len = 0;\r\n            while (index >= 0)\r\n            {\r\n                len = spath.IndexOf(']', index) - index;\r\n                spath = spath.Remove(index, len);\r\n                index = spath.IndexOf(\".Array.data[\");\r\n            }\r\n\r\n            int num = property.serializedObject.targetObject.GetInstanceID() ^ spath.GetHashCode();\r\n            if (property.propertyType == SerializedPropertyType.ObjectReference)\r\n                num ^= property.objectReferenceInstanceIDValue;\r\n\r\n            return num;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Unlike GetPropertyHash, this will respect the index in an array. Useful if you need uniqueness over an array of elements.\r\n        /// </summary>\r\n        /// <param name=\"property\"></param>\r\n        /// <returns></returns>\r\n        public static int GetIndexRespectingPropertyHash(SerializedProperty property)\r\n        {\r\n            if (property == null) throw new System.ArgumentNullException(\"property\");\r\n            if (property.serializedObject.targetObject == null)\r\n                return 0;\r\n\r\n            var spath = property.propertyPath;\r\n\r\n            int num = property.serializedObject.targetObject.GetInstanceID() ^ spath.GetHashCode();\r\n            if (property.propertyType == SerializedPropertyType.ObjectReference)\r\n                num ^= property.objectReferenceInstanceIDValue;\r\n\r\n            return num;\r\n        }\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Internal/PropertyHandlerValidationUtility.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Modifiers;\r\n\r\nnamespace com.spacepuppyeditor.Internal\r\n{\r\n    internal class PropertyHandlerValidationUtility\r\n    {\r\n\r\n        private struct HandlerInfo\r\n        {\r\n            public string propPath;\r\n            public IPropertyHandler handler;\r\n\r\n            public HandlerInfo(string path, IPropertyHandler handler)\r\n            {\r\n                this.propPath = path;\r\n                this.handler = handler;\r\n            }\r\n        }\r\n\r\n        #region Fields\r\n\r\n        private static ListDictionary<int, HandlerInfo> _usedHandlers = new ListDictionary<int, HandlerInfo>();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        static PropertyHandlerValidationUtility()\r\n        {\r\n            _lastPurge = System.DateTime.Now;\r\n            SceneView.onSceneGUIDelegate -= OnGUIHandler;\r\n            SceneView.onSceneGUIDelegate += OnGUIHandler;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        internal static void OnInspectorGUIComplete(SerializedObject obj, bool validate)\r\n        {\r\n            if (obj == null || obj.targetObject == null) return;\r\n\r\n            int id = obj.targetObject.GetInstanceID();\r\n            if (_usedHandlers.ContainsKey(id))\r\n            {\r\n                var lst = _usedHandlers.Lists[id];\r\n                if(validate)\r\n                {\r\n                    HandlerInfo info;\r\n                    for (int i = 0; i < lst.Count; i++)\r\n                    {\r\n                        info = lst[i];\r\n                        info.handler.OnValidate(obj.FindProperty(info.propPath));\r\n                    }\r\n                }\r\n                lst.Clear();\r\n            }\r\n        }\r\n\r\n        internal static void AddAsHandled(SerializedProperty property, IPropertyHandler handler)\r\n        {\r\n            if (property.serializedObject.targetObject != null)\r\n            {\r\n                _usedHandlers.Add(property.serializedObject.targetObject.GetInstanceID(), new HandlerInfo(property.propertyPath, handler));\r\n            }\r\n        }\r\n\r\n        private static System.DateTime _lastPurge;\r\n        private static System.TimeSpan OLD_AGE = System.TimeSpan.FromMinutes(1.0);\r\n        private static void OnGUIHandler(SceneView view)\r\n        {\r\n            if (System.DateTime.Now - _lastPurge > OLD_AGE)\r\n            {\r\n                _lastPurge = System.DateTime.Now;\r\n                _usedHandlers.Purge();\r\n            }\r\n\r\n            foreach(var lst in _usedHandlers.Lists)\r\n            {\r\n                lst.Clear();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Internal/ScriptAttributeUtility.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils;\r\nusing com.spacepuppy.Dynamic;\r\n\r\nnamespace com.spacepuppyeditor.Internal\r\n{\r\n    internal static class ScriptAttributeUtility\r\n    {\r\n\r\n        public static readonly IPropertyHandler SharedNullPropertyHandler = new DefaultPropertyHandler();\r\n        public static readonly IPropertyHandler SharedNullInternalPropertyHandler = new UnityInternalPropertyHandler();\r\n\r\n        #region Fields\r\n\r\n        public static PropertyHandlerCache _handlerCache = new PropertyHandlerCache();\r\n\r\n\r\n\r\n        //Internal Wrapper Fields\r\n\r\n        private static TypeAccessWrapper _accessWrapper;\r\n\r\n        private static System.Func<System.Type, System.Type> _imp_getDrawerTypeForType;\r\n\r\n        private delegate System.Reflection.FieldInfo GetFieldInfoFromPropertyDelegate(SerializedProperty property, out System.Type type);\r\n        private static GetFieldInfoFromPropertyDelegate _imp_getFieldInfoFromProperty;\r\n\r\n        private static System.Func<SerializedProperty, System.Type> _imp_getScriptTypeFromProperty;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        static ScriptAttributeUtility()\r\n        {\r\n            var klass = InternalTypeUtil.UnityEditorAssembly.GetType(\"UnityEditor.ScriptAttributeUtility\");\r\n            _accessWrapper = new TypeAccessWrapper(klass, true);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        //#######################\r\n        // GetDrawerTypeForType\r\n\r\n        public static System.Type GetDrawerTypeForType(System.Type tp)\r\n        {\r\n            //HACK FIX FOR Vector2 AND Vector3\r\n            if(tp == typeof(Vector2))\r\n            {\r\n                return typeof(HackVector2PropertyDrawer);\r\n            }\r\n            else if(tp == typeof(Vector3))\r\n            {\r\n                return typeof(HackVector3PropertyDrawer);\r\n            }\r\n\r\n            if (_imp_getDrawerTypeForType == null) _imp_getDrawerTypeForType = _accessWrapper.GetStaticMethod(\"GetDrawerTypeForType\", typeof(System.Func<System.Type, System.Type>)) as System.Func<System.Type, System.Type>;\r\n            return _imp_getDrawerTypeForType(tp);\r\n        }\r\n\r\n        //#######################\r\n        // GetHandler\r\n        \r\n        public static IPropertyHandler GetHandler(SerializedProperty property)\r\n        {\r\n            if (property == null) throw new System.ArgumentNullException(\"property\");\r\n\r\n            IPropertyHandler result = _handlerCache.GetHandler(property);\r\n            if (result != null)\r\n            {\r\n                return result;\r\n            }\r\n\r\n            //TEST FOR SPECIAL CASE HANDLER\r\n            var fieldInfo = ScriptAttributeUtility.GetFieldInfoFromProperty(property);\r\n            if(fieldInfo != null)\r\n            {\r\n                var attribs = fieldInfo.GetCustomAttributes(typeof(PropertyAttribute), false) as PropertyAttribute[];\r\n                var isListType = property.isArray && !(property.propertyType == SerializedPropertyType.String);\r\n                result = new MultiPropertyAttributePropertyHandler(fieldInfo, isListType, attribs);\r\n                _handlerCache.SetHandler(property, result);\r\n                return result;\r\n            }\r\n            //if(fieldInfo != null && System.Attribute.IsDefined(fieldInfo, typeof(PropertyAttribute)))\r\n            //{\r\n            //    var attribs = fieldInfo.GetCustomAttributes(typeof(PropertyAttribute), false) as PropertyAttribute[];\r\n            //    if (attribs.Any((a) => a is SPPropertyAttribute))\r\n            //    {\r\n            //        result = new MultiPropertyAttributePropertyHandler(fieldInfo, attribs);\r\n            //        _handlerCache.SetHandler(property, result);\r\n            //        return result;\r\n            //    }\r\n            //}\r\n\r\n            //USE STANDARD HANDLER if none was found\r\n            var handler = ScriptAttributeUtility.SharedNullPropertyHandler; //StandardPropertyHandler.Instance;\r\n            _handlerCache.SetHandler(property, handler);\r\n            return handler;\r\n        }\r\n\r\n        //#######################\r\n        // GetFieldInfoFromProperty\r\n\r\n        public static System.Reflection.FieldInfo GetFieldInfoFromProperty(SerializedProperty property)\r\n        {\r\n            if (_imp_getFieldInfoFromProperty == null) _imp_getFieldInfoFromProperty = _accessWrapper.GetStaticMethod(\"GetFieldInfoFromProperty\", typeof(GetFieldInfoFromPropertyDelegate)) as GetFieldInfoFromPropertyDelegate;\r\n            System.Type type;\r\n            return _imp_getFieldInfoFromProperty(property, out type);\r\n        }\r\n\r\n        public static System.Reflection.FieldInfo GetFieldInfoFromProperty(SerializedProperty property, out System.Type type)\r\n        {\r\n            if (_imp_getFieldInfoFromProperty == null) _imp_getFieldInfoFromProperty = _accessWrapper.GetStaticMethod(\"GetFieldInfoFromProperty\", typeof(GetFieldInfoFromPropertyDelegate)) as GetFieldInfoFromPropertyDelegate;\r\n            return _imp_getFieldInfoFromProperty(property, out type);\r\n        }\r\n\r\n        /*\r\n        /// <summary>\r\n        /// Returns the fieldInfo of the property. If the property is an Array/List, the fieldInfo for the Array is returned.\r\n        /// </summary>\r\n        /// <param name=\"prop\"></param>\r\n        /// <returns></returns>\r\n        public static FieldInfo GetFieldInfoFromProperty(SerializedProperty prop)\r\n        {\r\n            var path = prop.propertyPath.Replace(\".Array.data[\", \"[\");\r\n            var scriptType = GetScriptTypeFromProperty(prop);\r\n            var elements = path.Split('.');\r\n\r\n            FieldInfo result = null;\r\n            System.Type tp = scriptType;\r\n            foreach (var element in elements)\r\n            {\r\n                if (element.Contains('['))\r\n                {\r\n                    var name = element.Substring(0, element.IndexOf('['));\r\n                    FieldInfo info = null;\r\n                    for (var tp2 = tp; info == null && tp2 != null; tp2 = tp2.BaseType)\r\n                        info = tp2.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);\r\n                    if (info == null)\r\n                    {\r\n                        return null;\r\n                    }\r\n                    else\r\n                    {\r\n                        result = info;\r\n                        tp = info.FieldType;\r\n                    }\r\n\r\n                    if (ObjUtil.IsListType(tp))\r\n                    {\r\n                        tp = ObjUtil.GetElementTypeOfListType(tp);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    FieldInfo info = null;\r\n                    for (var tp2 = tp; info == null && tp2 != null; tp2 = tp2.BaseType)\r\n                        info = tp2.GetField(element, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);\r\n                    if (info == null)\r\n                    {\r\n                        return null;\r\n                    }\r\n                    else\r\n                    {\r\n                        result = info;\r\n                        tp = info.FieldType;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n         */\r\n\r\n        //#######################\r\n        // GetScriptTypeFromProperty\r\n\r\n        public static System.Type GetScriptTypeFromProperty(SerializedProperty property)\r\n        {\r\n            if (_imp_getScriptTypeFromProperty == null) _imp_getScriptTypeFromProperty = _accessWrapper.GetStaticMethod(\"GetScriptTypeFromProperty\", typeof(System.Func<SerializedProperty, System.Type>)) as System.Func<SerializedProperty, System.Type>;\r\n            return _imp_getScriptTypeFromProperty(property);\r\n        }\r\n\r\n        /*\r\n        public static System.Type GetScriptTypeFromProperty(SerializedProperty prop)\r\n        {\r\n            SerializedProperty scriptProp = prop.serializedObject.FindProperty(PROP_SCRIPT);\r\n            if (scriptProp == null)\r\n                return null;\r\n            MonoScript monoScript = scriptProp.objectReferenceValue as MonoScript;\r\n            if ((UnityEngine.Object)monoScript == (UnityEngine.Object)null)\r\n                return null;\r\n            else\r\n                return monoScript.GetClass();\r\n        }\r\n         */\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Internal/StandardPropertyHandler.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Internal\r\n{\r\n\r\n    internal class StandardPropertyHandler : IPropertyHandler\r\n    {\r\n\r\n        private static StandardPropertyHandler _instance;\r\n\r\n        public static StandardPropertyHandler Instance\r\n        {\r\n            get\r\n            {\r\n                if (_instance == null) _instance = new StandardPropertyHandler();\r\n                return _instance;\r\n            }\r\n        }\r\n\r\n        private StandardPropertyHandler()\r\n        {\r\n            //block constructor\r\n        }\r\n\r\n        #region IPropertyHandler Interface\r\n\r\n        public float GetHeight(SerializedProperty property, GUIContent label, bool includeChildren)\r\n        {\r\n            return EditorGUI.GetPropertyHeight(property, label, includeChildren);\r\n        }\r\n\r\n        public bool OnGUI(Rect position, SerializedProperty property, GUIContent label, bool includeChildren)\r\n        {\r\n            return EditorGUI.PropertyField(position, property, label, includeChildren);\r\n        }\r\n\r\n        public bool OnGUILayout(SerializedProperty property, GUIContent label, bool includeChildren, GUILayoutOption[] options)\r\n        {\r\n            return EditorGUILayout.PropertyField(property, label, includeChildren, options);\r\n        }\r\n\r\n        public void OnValidate(SerializedProperty property)\r\n        {\r\n            //do nothing\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Internal/UnityInternalPropertyHandler.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Internal\r\n{\r\n    internal class UnityInternalPropertyHandler : IPropertyHandler\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private TypeAccessWrapper _internalPropertyHandler;\r\n\r\n        private System.Func<SerializedProperty, GUIContent, bool, float> _imp_GetHeight;\r\n        private System.Func<Rect, SerializedProperty, GUIContent, bool, bool> _imp_OnGUI;\r\n        private System.Func<SerializedProperty, GUIContent, bool, GUILayoutOption[], bool> _imp_OnGUILayout;\r\n\r\n        private System.Action<PropertyAttribute, System.Reflection.FieldInfo, System.Type> _imp_HandleAttribute;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public UnityInternalPropertyHandler()\r\n        {\r\n            var klass = InternalTypeUtil.UnityEditorAssembly.GetType(\"UnityEditor.PropertyHandler\");\r\n            var obj = System.Activator.CreateInstance(klass);\r\n            _internalPropertyHandler = new TypeAccessWrapper(klass, obj, true);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        protected PropertyDrawer InternalDrawer\r\n        {\r\n            get\r\n            {\r\n                return _internalPropertyHandler.GetProperty(\"m_PropertyDrawer\") as PropertyDrawer;\r\n            }\r\n            set\r\n            {\r\n                _internalPropertyHandler.SetProperty(\"m_PropertyDrawer\", value);\r\n            }\r\n        }\r\n\r\n        protected List<DecoratorDrawer> DecoratorDrawers\r\n        {\r\n            get\r\n            {\r\n                return _internalPropertyHandler.GetProperty(\"m_DecoratorDrawers\") as List<DecoratorDrawer>;\r\n            }\r\n            set\r\n            {\r\n                _internalPropertyHandler.SetProperty(\"m_DecoratorDrawers\", value);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected virtual void HandleAttribute(PropertyAttribute attribute, System.Reflection.FieldInfo field, System.Type propertyType)\r\n        {\r\n            if (_imp_HandleAttribute == null) _imp_HandleAttribute = _internalPropertyHandler.GetMethod(\"HandleAttribute\", typeof(System.Action<PropertyAttribute, System.Reflection.FieldInfo, System.Type>)) as System.Action<PropertyAttribute, System.Reflection.FieldInfo, System.Type>;\r\n            _imp_HandleAttribute(attribute, field, propertyType);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IPropertyHandler Interface\r\n\r\n        public virtual float GetHeight(UnityEditor.SerializedProperty property, UnityEngine.GUIContent label, bool includeChildren)\r\n        {\r\n            if (_imp_GetHeight == null) _imp_GetHeight = _internalPropertyHandler.GetMethod(\"GetHeight\", typeof(System.Func<SerializedProperty, GUIContent, bool, float>)) as System.Func<SerializedProperty, GUIContent, bool, float>;\r\n            return _imp_GetHeight(property, label, includeChildren);\r\n        }\r\n\r\n        public virtual bool OnGUI(UnityEngine.Rect position, UnityEditor.SerializedProperty property, UnityEngine.GUIContent label, bool includeChildren)\r\n        {\r\n            if (_imp_OnGUI == null) _imp_OnGUI = _internalPropertyHandler.GetMethod(\"OnGUI\", typeof(System.Func<Rect, SerializedProperty, GUIContent, bool, bool>)) as System.Func<Rect, SerializedProperty, GUIContent, bool, bool>;\r\n            return _imp_OnGUI(position, property, label, includeChildren);\r\n        }\r\n\r\n        public virtual bool OnGUILayout(UnityEditor.SerializedProperty property, UnityEngine.GUIContent label, bool includeChildren, UnityEngine.GUILayoutOption[] options)\r\n        {\r\n            if (_imp_OnGUILayout == null) _imp_OnGUILayout = _internalPropertyHandler.GetMethod(\"OnGUILayout\", typeof(System.Func<SerializedProperty, GUIContent, bool, GUILayoutOption[], bool>)) as System.Func<SerializedProperty, GUIContent, bool, GUILayoutOption[], bool>;\r\n            return _imp_OnGUILayout(property, label, includeChildren, options);\r\n        }\r\n\r\n        public virtual void OnValidate(SerializedProperty property)\r\n        {\r\n            //TODO\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/MaterialHelper.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n    public static class MaterialHelper\r\n    {\r\n\r\n        private static Material _defaultMaterial;\r\n        private static Material _defaultLineMaterial;\r\n\r\n        //private static Texture2D _outlineTexture;\r\n\r\n        public static Material DefaultMaterial\r\n        {\r\n            get\r\n            {\r\n                if (_defaultMaterial == null)\r\n                {\r\n                    //_defaultMaterial = new Material(\"Shader \\\"SPEditor/DefaultShader\\\"{   SubShader   {      Pass      {         BindChannels { Bind \\\"Color\\\", color }         Blend SrcAlpha OneMinusSrcAlpha         ZWrite Off Cull Off Fog { Mode Off }         Color(1, 1, 1, 1)      }   }}\");\r\n                    var shader = Shader.Find(\"SPEditor/DefaultShader\");\r\n                    _defaultMaterial = new Material(shader);\r\n                    _defaultMaterial.hideFlags = HideFlags.HideAndDontSave;\r\n                    _defaultMaterial.shader.hideFlags = HideFlags.HideAndDontSave;\r\n                }\r\n                return _defaultMaterial;\r\n            }\r\n        }\r\n\r\n        public static Material DefaultLineMaterial\r\n        {\r\n            get\r\n            {\r\n                if (_defaultLineMaterial == null)\r\n                {\r\n                    //_defaultLineMaterial = new Material(\"Shader \\\"SPEditor/LineShader\\\"{   SubShader   {      Pass      {         BindChannels { Bind \\\"Color\\\", color }         Blend SrcAlpha OneMinusSrcAlpha         ZWrite Off Cull Off Fog { Mode Off }      }   }}\");\r\n                    var shader = Shader.Find(\"SPEditor/LineShader\");\r\n                    _defaultLineMaterial = new Material(shader);\r\n                    _defaultLineMaterial.hideFlags = HideFlags.HideAndDontSave;\r\n                    _defaultLineMaterial.shader.hideFlags = HideFlags.HideAndDontSave;\r\n                }\r\n                return _defaultLineMaterial;\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/PrefabHelper.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n\r\n    [InitializeOnLoad()]\r\n    public static class PrefabHelper\r\n    {\r\n\r\n        #region Events\r\n\r\n        static PrefabHelper()\r\n        {\r\n            EditorSceneEvents.OnPrefabAddedToScene -= OnPrefabAddedToScene;\r\n            EditorSceneEvents.OnPrefabAddedToScene += OnPrefabAddedToScene;\r\n        }\r\n\r\n        private static void OnPrefabAddedToScene(GameObject go)\r\n        {\r\n            \r\n            if (Event.current.shift)\r\n            {\r\n                PrefabUtility.DisconnectPrefabInstance(go);\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Methods\r\n\r\n        public static IEnumerable<string> GetAllPrefabAssetPaths()\r\n        {\r\n            return (from p in AssetDatabase.GetAllAssetPaths() where p.EndsWith(\".prefab\") select p);\r\n        }\r\n\r\n        public static IEnumerable<string> GetAllPrefabAssetPathsDependentOn(MonoScript script)\r\n        {\r\n            string scriptPath = AssetDatabase.GetAssetPath(script);\r\n            return (from p in AssetDatabase.GetAllAssetPaths() where p.EndsWith(\".prefab\") && AssetDatabase.GetDependencies(new string[] { p }).Contains(scriptPath) select p);\r\n        }\r\n\r\n        public static IEnumerable<string> GetAllPrefabAssetPathsDependantOn(System.Type tp)\r\n        {\r\n            foreach(var p in AssetDatabase.GetAllAssetPaths())\r\n            {\r\n                if(p.EndsWith(\".prefab\"))\r\n                {\r\n                    var go = AssetDatabase.LoadAssetAtPath<GameObject>(p);\r\n                    if (PrefabHasComponent(go, tp)) yield return p;\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n\r\n\r\n        private static bool PrefabHasComponent(GameObject prefab, System.Type tp)\r\n        {\r\n            if (object.ReferenceEquals(prefab, null)) return false;\r\n\r\n            /*\r\n            Component c = prefab.GetComponent(tp);\r\n            if (!object.ReferenceEquals(c, null)) return true;\r\n\r\n            foreach(var child in GameObjectUtil.GetAllChildren(prefab))\r\n            {\r\n                c = child.GetComponent(tp);\r\n                if (!object.ReferenceEquals(c, null)) return true;\r\n            }\r\n            return false;\r\n            */\r\n            return !object.ReferenceEquals(prefab.GetComponentInChildren(tp, true), null);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Project/AssetBundlePackageInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.IO;\r\n\r\nusing com.spacepuppy.Project;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Project\r\n{\r\n\r\n    [CustomEditor(typeof(AssetBundlePackage))]\r\n    public class AssetBundlePackageInspector : SPEditor\r\n    {\r\n\r\n        #region Menu Entries\r\n\r\n        [MenuItem(\"Assets/Create/AssetBundle Package\", priority = 1001)]\r\n        private static void CreateResourceMonitor()\r\n        {\r\n            var spath = (Selection.activeGameObject != null) ? AssetDatabase.GetAssetPath(Selection.activeObject) : \"Assets/\";\r\n            if (!spath.StartsWith(\"Assets\")) return;\r\n            if (Path.HasExtension(spath)) spath = Path.GetDirectoryName(spath);\r\n\r\n            if (!spath.EndsWith(\"/\")) spath += \"/\";\r\n            spath += \"AssetBundlePackage.asset\";\r\n\r\n            ScriptableObjectHelper.CreateAsset<AssetBundlePackage>(spath);\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Inspector\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            EditorGUILayout.HelpBox(\"TODO - must implement building an AssetBundle for the contents of this folder.\", MessageType.Info);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Project/CustomTimeLayersDataInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Project;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Project\r\n{\r\n\r\n    [CustomEditor(typeof(CustomTimeLayersData))]\r\n    public class CustomTimeLayersDataInspector : SPEditor\r\n    {\r\n\r\n        private CustomTimeLayersData.EditorHelper _timeLayersHelper;\r\n        private SPReorderableList _timeLayersListDrawer;\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            var timeLayersData = this.target as CustomTimeLayersData;\r\n            if (timeLayersData != null)\r\n            {\r\n                _timeLayersHelper = new CustomTimeLayersData.EditorHelper(timeLayersData);\r\n                _timeLayersListDrawer = new SPReorderableList(_timeLayersHelper.Layers, typeof(string));\r\n                _timeLayersListDrawer.drawHeaderCallback = _timeLayersList_DrawHeader;\r\n                _timeLayersListDrawer.drawElementCallback = _timeLayers_DrawElement;\r\n                _timeLayersListDrawer.onAddCallback = _timeLayers_AddElement;\r\n            }\r\n        }\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            if (_timeLayersListDrawer == null) return;\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            _timeLayersListDrawer.DoLayoutList();\r\n            if (EditorGUI.EndChangeCheck())\r\n            {\r\n                EditorUtility.SetDirty(_timeLayersHelper.Data);\r\n                AssetDatabase.SaveAssets();\r\n            }\r\n        }\r\n\r\n        #region Time Layers Draw Callback\r\n\r\n        private void _timeLayersList_DrawHeader(Rect area)\r\n        {\r\n            EditorGUI.LabelField(area, \"Custom Time Layers\");\r\n        }\r\n\r\n        private void _timeLayers_AddElement(ReorderableList lst)\r\n        {\r\n            _timeLayersHelper.Layers.Add(null);\r\n        }\r\n\r\n        private void _timeLayers_DrawElement(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            string layerName = _timeLayersHelper.Layers[index] as string;\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            layerName = EditorGUI.TextField(area, layerName);\r\n            if (EditorGUI.EndChangeCheck())\r\n                _timeLayersHelper.Layers[index] = layerName;\r\n\r\n            if (GUI.enabled) ReorderableListHelper.DrawDraggableElementDeleteContextMenu(_timeLayersListDrawer, area, index, isActive, isFocused);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Project/ResourceLinkPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Project;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Project\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(ResourceLink))]\r\n    public class ResourceLinkPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        #region Fields\r\n\r\n        public bool ManualConfig;\r\n        public System.Type ResourceType;\r\n\r\n        #endregion\r\n        \r\n        #region Methods\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var pathProperty = property.FindPropertyRelative(\"_path\");\r\n            var path = pathProperty.stringValue;\r\n\r\n            if(!this.ManualConfig)\r\n            {\r\n                var attrib = this.fieldInfo.GetCustomAttributes(typeof(ResourceLink.ConfigAttribute), false).FirstOrDefault() as ResourceLink.ConfigAttribute;\r\n                this.ResourceType = attrib != null ? attrib.resourceType : null;\r\n            }\r\n\r\n            var tp = (this.ResourceType != null) ? this.ResourceType : typeof(UnityEngine.Object);\r\n            UnityEngine.Object asset = (!StringUtil.IsNullOrWhitespace(path)) ? Resources.Load(path, tp) : null;\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            asset = SPEditorGUI.ObjectFieldX(position, asset, tp, false);\r\n            if(EditorGUI.EndChangeCheck())\r\n            {\r\n                if(asset == null)\r\n                {\r\n                    pathProperty.stringValue = null;\r\n                }\r\n                else\r\n                {\r\n                    path = this.GetPath(asset);\r\n                    if(!string.IsNullOrEmpty(path))\r\n                    {\r\n                        pathProperty.stringValue = path;\r\n                    }\r\n                } \r\n            }\r\n        }\r\n\r\n\r\n        private string GetPath(UnityEngine.Object asset)\r\n        {\r\n            if (asset == null) return string.Empty;\r\n\r\n            var path = AssetDatabase.GetAssetPath(asset);\r\n            if (!path.Contains(\"Resources/\")) return string.Empty;\r\n\r\n            path = path.Substring(path.LastIndexOf(\"Resources/\") + 10);\r\n            path = Combine(System.IO.Path.GetDirectoryName(path), System.IO.Path.GetFileNameWithoutExtension(path));\r\n            \r\n            return path;\r\n        }\r\n\r\n\r\n\r\n        private static string Combine(string path1, string path2)\r\n        {\r\n            if (StringUtil.IsNullOrWhitespace(path1)) return path2;\r\n            if (StringUtil.IsNullOrWhitespace(path2)) return path1;\r\n\r\n            if (path1.EndsWith(\"/\"))\r\n            {\r\n                if (path2.StartsWith(\"/\"))\r\n                    return path1 + path2.Substring(1);\r\n                else\r\n                    return path1 + path2;\r\n            }\r\n            else if(path2.StartsWith(\"/\"))\r\n            {\r\n                return path1 + path2;\r\n            }\r\n            else\r\n            {\r\n                return path1 + \"/\" + path2;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Project/ResourceLinkTablePropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Project;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Collections;\r\n\r\nnamespace com.spacepuppyeditor.Project\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(ResourceLinkTable), true)]\r\n    public class ResourceLinkTablePropertyDrawer : DictionaryPropertyDrawer\r\n    {\r\n\r\n        private ResourceLinkPropertyDrawer _resourcePropertyDrawer = new ResourceLinkPropertyDrawer();\r\n\r\n        protected override void DrawValue(Rect area, SerializedProperty valueProp)\r\n        {\r\n            var attrib = this.fieldInfo.GetCustomAttributes(typeof(ResourceLink.ConfigAttribute), false).FirstOrDefault() as ResourceLink.ConfigAttribute;\r\n            _resourcePropertyDrawer.ManualConfig = true;\r\n            _resourcePropertyDrawer.ResourceType = attrib != null ? attrib.resourceType : null;\r\n\r\n            _resourcePropertyDrawer.OnGUI(area, valueProp, GUIContent.none);\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Project/ResourcePackageInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.IO;\r\n\r\nusing com.spacepuppy.Project;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Project\r\n{\r\n\r\n    [CustomEditor(typeof(ResourcePackage), true)]\r\n    public class ResourcePackageInspector : SPEditor\r\n    {\r\n\r\n        public const string PROP_RELATIVEPATH = \"_relativePath\";\r\n        //public const string PROP_RESOURCES = \"_resources\";\r\n        public const string PROP_PATHS = \"_paths\";\r\n\r\n\r\n        #region Menu Entries\r\n\r\n        [MenuItem(\"Assets/Create/Resource Package\", priority =1000)]\r\n        private static void CreateResourceMonitor()\r\n        {\r\n            var spath = AssetDatabase.GetAssetPath(Selection.activeObject);\r\n            if (!spath.StartsWith(\"Assets\")) return;\r\n            if (Path.HasExtension(spath)) spath = Path.GetDirectoryName(spath);\r\n\r\n            if (!spath.EndsWith(\"/\")) spath += \"/\";\r\n            spath += \"InventoryResourcePackage.asset\";\r\n\r\n            ScriptableObjectHelper.CreateAsset<ResourcePackage>(spath);\r\n        }\r\n\r\n        [MenuItem(\"Assets/Create/Resource Package\", validate = true)]\r\n        private static bool ValidateCreateResourceMonitor()\r\n        {\r\n            var spath = AssetDatabase.GetAssetPath(Selection.activeObject);\r\n            if (spath == null) return false;\r\n            return spath.Contains(\"Resources\");\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Inspector\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawDefaultInspectorExcept(PROP_RELATIVEPATH, PROP_PATHS);\r\n\r\n            this.DrawEntries();\r\n            \r\n            this.DrawSyncButton();\r\n            \r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n        protected void DrawEntries()\r\n        {\r\n            EditorGUILayout.LabelField(\"Relative Path\", this.serializedObject.FindProperty(PROP_RELATIVEPATH).stringValue, EditorStyles.textField);\r\n\r\n            var pathsProp = this.serializedObject.FindProperty(PROP_PATHS);\r\n            pathsProp.isExpanded = EditorGUILayout.Foldout(pathsProp.isExpanded, \"Resources\");\r\n            if(pathsProp.isExpanded)\r\n            {\r\n                EditorGUILayout.BeginVertical(\"Box\");\r\n                EditorGUI.indentLevel++;\r\n                for (int i = 0; i < pathsProp.arraySize; i++)\r\n                {\r\n                    EditorGUILayout.LabelField(pathsProp.GetArrayElementAtIndex(i).stringValue, EditorStyles.textField);\r\n                }\r\n                EditorGUI.indentLevel--;\r\n                EditorGUILayout.EndVertical();\r\n            }\r\n        }\r\n\r\n        protected void DrawSyncButton()\r\n        {\r\n            if (this.serializedObject.isEditingMultipleObjects) return;\r\n\r\n            var r = EditorGUILayout.GetControlRect();\r\n            var w = r.width * 0.9f;\r\n\r\n            r = new Rect(r.xMin + (r.width - w) / 2f, r.yMin, w, r.height);\r\n\r\n            if(GUI.Button(r, \"Sync Resource Paths\"))\r\n            {\r\n                var spath = AssetDatabase.GetAssetPath(this.serializedObject.targetObject);\r\n                var dir = System.IO.Path.GetDirectoryName(spath);\r\n\r\n                \r\n                var relPathProp = this.serializedObject.FindProperty(PROP_RELATIVEPATH);\r\n                var pathsProp = this.serializedObject.FindProperty(PROP_PATHS);\r\n                if (!dir.Contains(\"Resources\"))\r\n                {\r\n                    relPathProp.stringValue = string.Empty;\r\n                    pathsProp.arraySize = 0;\r\n                }\r\n                else\r\n                {\r\n                    var relDir = AssetHelper.GetRelativeResourcePath(dir);\r\n                    relPathProp.stringValue = relDir;\r\n\r\n                    var paths = (from p in AssetDatabase.GetAllAssetPaths() where p.StartsWith(dir) && p != spath && Path.HasExtension(p) let p2 = AssetHelper.GetRelativeResourcePath(p) orderby p2 select p2).ToArray();\r\n                    pathsProp.arraySize = paths.Length;\r\n                    for(int i = 0; i < paths.Length; i++)\r\n                    {\r\n                        var elProp = pathsProp.GetArrayElementAtIndex(i);\r\n                        elProp.stringValue = paths[i];\r\n                    }\r\n                }\r\n\r\n                this.serializedObject.FindProperty(PROP_PATHS).isExpanded = true;\r\n                this.serializedObject.ApplyModifiedProperties();\r\n            }\r\n        }\r\n        \r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Project/SerializableInterfaceRefPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Dynamic;\nusing com.spacepuppy.Project;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Project\n{\n\n    [CustomPropertyDrawer(typeof(BaseSerializableInterfaceRef), true)]\n    public class SerializableInterfaceRefPropertyDrawer : PropertyDrawer\n    {\n\n        public const string PROP_OBJ = \"_obj\";\n\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n        {\n            return EditorGUIUtility.singleLineHeight;\n        }\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            var tp = (this.fieldInfo != null) ? this.fieldInfo.FieldType : null;\n            var objProp = property.FindPropertyRelative(PROP_OBJ);\n            if (tp == null || objProp == null || objProp.propertyType != SerializedPropertyType.ObjectReference)\n            {\n                this.DrawMalformed(position);\n                return;\n            }\n            \n            var valueType = com.spacepuppy.Dynamic.DynamicUtil.GetReturnType(DynamicUtil.GetMemberFromType(tp, \"_value\", true));\n            if(valueType == null || !(valueType.IsClass || valueType.IsInterface))\n            {\n                this.DrawMalformed(position);\n                return;\n            }\n\n            //var val = EditorGUI.ObjectField(position, label, objProp.objectReferenceValue, valueType, true);\n            var val = EditorGUI.ObjectField(position, label, objProp.objectReferenceValue, typeof(UnityEngine.Object), true);\n            if (val != null && !TypeUtil.IsType(val.GetType(), valueType)) val = null;\n            objProp.objectReferenceValue = val as UnityEngine.Object;\n        }\n\n        private void DrawMalformed(Rect position)\n        {\n            EditorGUI.LabelField(position, \"Malformed SerializedInterfaceRef.\");\n            Debug.LogError(\"Malformed SerializedInterfaceRef - make sure you inherit from 'SerializableInterfaceRef'.\");\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Project/TagDataInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Project;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Project\r\n{\r\n\r\n    [InitializeOnLoad()]\r\n    [CustomEditor(typeof(TagData))]\r\n    internal class TagDataInspector : SPEditor\r\n    {\r\n\r\n        #region Static Interface\r\n        \r\n        static TagDataInspector()\r\n        {\r\n            EditorApplication.playModeStateChanged -= Touch;\r\n            EditorApplication.playModeStateChanged += Touch;\r\n            EditorCoroutine.Invoke(Touch, 0f);\r\n        }\r\n\r\n        public static void Touch()\r\n        {\r\n            Touch(PlayModeStateChange.EnteredEditMode);\r\n        }\r\n        \r\n        private static void Touch(PlayModeStateChange mode)\r\n        {\r\n            var asset = TagData.Asset;\r\n            if (asset == null) return;\r\n\r\n            if (TagData.Tags != null && TagData.Tags.Except(UnityEditorInternal.InternalEditorUtility.tags).Count() > 0)\r\n            {\r\n                SPMenu.SyncTagData(TagData.Asset);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Inspector\r\n\r\n        private TagData.EditorHelper _helper;\r\n        \r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _helper = new TagData.EditorHelper(this.target as TagData);\r\n        }\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n\r\n            EditorGUILayout.HelpBox(\"This holds a reference to all the available tags for access at runtime. The data is kept in Assets/Resources and should be the ONLY one that exists. Do not delete.\\n\\nSpacepuppy Framework\", MessageType.Info);\r\n\r\n            EditorGUILayout.LabelField(\"Tags\");\r\n            EditorGUI.indentLevel++;\r\n            foreach(var tag in _helper.Tags)\r\n            {\r\n                EditorGUILayout.LabelField(tag);\r\n            }\r\n            EditorGUI.indentLevel--;\r\n\r\n            if(GUILayout.Button(\"Sync Tags\"))\r\n            {\r\n                SPMenu.SyncTagData(_helper.Target);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Project/TextRefPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Project;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Project\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(TextRef), true)]\r\n    public class TextRefPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public const string PROP_TEXT = \"_text\";\r\n        public const string PROP_OBJ = \"_obj\";\r\n\r\n        private const float MARGIN_TOP = 3f;\r\n        private const float MARGIN_BOTTOM = 2f;\r\n        private const float MARGIN_TEXT = 2f;\r\n        private const int TEXTSRC_MAX_SHOWN = 3;\r\n        private const int TEXTSRC_AREA_LINES = 3;\r\n        \r\n        private enum Mode\r\n        {\r\n            Text,\r\n            TextSource,\r\n            TextAsset\r\n        }\r\n\r\n        #region Fields\r\n\r\n        private bool _disallowFoldout;\r\n        private System.Action<Rect, SerializedProperty, GUIContent, int> _elementLabelCallback;\r\n\r\n        private CachedReorderableList _lst;\r\n        private SerializedProperty _textProp;\r\n        private SerializedProperty _objProp;\r\n        private GUIContent _label;\r\n        private Mode _mode;\r\n        private bool _manuallyConfigured;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TextRefPropertyDrawer()\r\n        {\r\n\r\n        }\r\n\r\n        public TextRefPropertyDrawer(bool disallowFoldout = false, System.Action<Rect, SerializedProperty, GUIContent, int> elementLabelCallback = null)\r\n        {\r\n            this.DisallowFoldout = disallowFoldout;\r\n            this.ElementLabelCallback = elementLabelCallback;\r\n            _manuallyConfigured = true;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool DisallowFoldout\r\n        {\r\n            get { return _disallowFoldout; }\r\n            set\r\n            {\r\n                _disallowFoldout = value;\r\n                _manuallyConfigured = true;\r\n            }\r\n        }\r\n\r\n        public System.Action<Rect, SerializedProperty, GUIContent, int> ElementLabelCallback\r\n        {\r\n            get { return _elementLabelCallback; }\r\n            set\r\n            {\r\n                _elementLabelCallback = value;\r\n                _manuallyConfigured = true;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region PropertyDrawer Interface\r\n\r\n        private void ConfigureSettings()\r\n        {\r\n            if (_manuallyConfigured) return;\r\n\r\n            bool done = false;\r\n            if (this.fieldInfo != null)\r\n            {\r\n                var attrib = this.fieldInfo.GetCustomAttributes(typeof(TextRef.ConfigAttribute), true).FirstOrDefault() as TextRef.ConfigAttribute;\r\n                if (attrib != null)\r\n                {\r\n                    _disallowFoldout = attrib.DisallowFoldout;\r\n                    done = true;\r\n                }\r\n            }\r\n\r\n            if (!done)\r\n            {\r\n                _disallowFoldout = false;\r\n                this.ElementLabelCallback = null;\r\n            }\r\n        }\r\n\r\n        private void OnGUIStart(SerializedProperty property, GUIContent label)\r\n        {\r\n            _textProp = property.FindPropertyRelative(PROP_TEXT);\r\n            _objProp = property.FindPropertyRelative(PROP_OBJ);\r\n            _label = label;\r\n            _lst = CachedReorderableList.GetListDrawer(_textProp, _maskList_DrawHeader, _maskList_DrawElement);\r\n            _lst.headerHeight = EditorGUIUtility.singleLineHeight + 2f;\r\n\r\n            if (_objProp.objectReferenceValue == null)\r\n            {\r\n                _mode = Mode.Text;\r\n                _lst.displayAdd = true;\r\n                _lst.displayRemove = true;\r\n                _lst.elementHeight = EditorGUIUtility.singleLineHeight * TEXTSRC_AREA_LINES + EditorGUIUtility.singleLineHeight + 3f;\r\n            }\r\n            else if (_objProp.objectReferenceValue is ITextSource)\r\n            {\r\n                _mode = Mode.TextSource;\r\n                var src = _objProp.objectReferenceValue as ITextSource;\r\n                int cnt = src.Count;\r\n                _textProp.arraySize = cnt;\r\n\r\n                _lst.displayAdd = false;\r\n                _lst.displayRemove = false;\r\n                _lst.elementHeight = EditorGUIUtility.singleLineHeight * TEXTSRC_AREA_LINES + EditorGUIUtility.singleLineHeight + 3f;\r\n            }\r\n            else if (_objProp.objectReferenceValue is TextAsset)\r\n            {\r\n                _mode = Mode.TextAsset;\r\n                _textProp.arraySize = 1;\r\n\r\n                _lst.displayAdd = false;\r\n                _lst.displayRemove = false;\r\n                _lst.elementHeight = EditorGUIUtility.singleLineHeight * TEXTSRC_AREA_LINES + EditorGUIUtility.singleLineHeight + 3f;\r\n            }\r\n        }\r\n\r\n        private void OnGUIEnd()\r\n        {\r\n            if(_lst != null)\r\n            {\r\n                _lst.serializedProperty = null;\r\n            }\r\n            if(_textProp != null)\r\n            {\r\n                if (_mode != Mode.Text)\r\n                    _textProp.arraySize = 0;\r\n            }\r\n\r\n            _lst = null;\r\n            _textProp = null;\r\n            _objProp = null;\r\n            _label = null;\r\n            _mode = Mode.Text;\r\n        }\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            this.ConfigureSettings();\r\n\r\n            if (_disallowFoldout || property.isExpanded)\r\n            {\r\n                float h = 0f;\r\n\r\n                var objProp = property.FindPropertyRelative(PROP_OBJ);\r\n                var textProp = property.FindPropertyRelative(PROP_TEXT);\r\n                var lst = CachedReorderableList.GetListDrawer(textProp, _maskList_DrawHeader, _maskList_DrawElement);\r\n                lst.headerHeight = EditorGUIUtility.singleLineHeight + 2f;\r\n\r\n                if (objProp.objectReferenceValue == null)\r\n                {\r\n                    lst.displayAdd = true;\r\n                    lst.displayRemove = true;\r\n                    lst.elementHeight = EditorGUIUtility.singleLineHeight * TEXTSRC_AREA_LINES + EditorGUIUtility.singleLineHeight + 3f;\r\n                    h += lst.GetHeight();\r\n                }\r\n                else if (objProp.objectReferenceValue is ITextSource)\r\n                {\r\n                    var src = objProp.objectReferenceValue as ITextSource;\r\n                    int cnt = src.Count;\r\n                    textProp.arraySize = cnt;\r\n\r\n                    lst.displayAdd = false;\r\n                    lst.displayRemove = false;\r\n                    lst.elementHeight = EditorGUIUtility.singleLineHeight * TEXTSRC_AREA_LINES + EditorGUIUtility.singleLineHeight + 3f;\r\n                    h += lst.GetHeight();\r\n                }\r\n                else if (objProp.objectReferenceValue is TextAsset)\r\n                {\r\n                    textProp.arraySize = 1;\r\n\r\n                    lst.displayAdd = false;\r\n                    lst.displayRemove = false;\r\n                    lst.elementHeight = EditorGUIUtility.singleLineHeight * TEXTSRC_AREA_LINES + EditorGUIUtility.singleLineHeight + 3f;\r\n                    h += lst.GetHeight();\r\n                }\r\n\r\n                return h;\r\n            }\r\n            else\r\n            {\r\n                return EditorGUIUtility.singleLineHeight;\r\n            }\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            this.ConfigureSettings();\r\n\r\n            if (_disallowFoldout)\r\n            {\r\n                this.OnGUIStart(property, label);\r\n                _lst.DoList(position);\r\n                this.OnGUIEnd();\r\n            }\r\n            else\r\n            {\r\n                if(property.isExpanded)\r\n                {\r\n                    this.OnGUIStart(property, label);\r\n                    var foldoutRect = new Rect(position.xMin, position.yMin, 20f, EditorGUIUtility.singleLineHeight);\r\n                    property.isExpanded = EditorGUI.Foldout(foldoutRect, property.isExpanded, GUIContent.none);\r\n                    _lst.DoList(position);\r\n                    this.OnGUIEnd();\r\n                }\r\n                else\r\n                {\r\n                    property.isExpanded = EditorGUI.Foldout(position, property.isExpanded, GUIContent.none);\r\n                    ReorderableListHelper.DrawRetractedHeader(position, label);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Text ReorderableList Handlers\r\n\r\n        private void _maskList_DrawHeader(Rect area)\r\n        {\r\n            var objArea = new Rect(area.xMin, area.yMin + 1f, area.width, EditorGUIUtility.singleLineHeight);\r\n            //_objProp.objectReferenceValue = EditorGUI.ObjectField(objArea, _label, _objProp.objectReferenceValue, typeof(UnityEngine.Object), true);\r\n            _objProp.objectReferenceValue = SPEditorGUI.ObjectFieldX(objArea, _label, _objProp.objectReferenceValue, typeof(UnityEngine.Object), true);\r\n        }\r\n\r\n        private void _maskList_DrawElement(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            var element = _textProp.GetArrayElementAtIndex(index);\r\n\r\n            switch (_mode)\r\n            {\r\n                case Mode.Text:\r\n                    {\r\n                        var labelRect = new Rect(area.xMin, area.yMin, area.width, EditorGUIUtility.singleLineHeight);\r\n                        var textRect = new Rect(area.xMin, area.yMin + labelRect.height + 2f, area.width, area.height - labelRect.height - 3f);\r\n\r\n                        var label = EditorHelper.TempContent(\"Element \" + index.ToString(\"00\"));\r\n                        if (this.ElementLabelCallback != null)\r\n                            this.ElementLabelCallback(labelRect, element, label, index);\r\n                        else\r\n                            EditorGUI.LabelField(labelRect, label);\r\n\r\n                        element.stringValue = EditorGUI.TextArea(textRect, element.stringValue);\r\n                    }\r\n                    break;\r\n                case Mode.TextSource:\r\n                    {\r\n                        var src = _objProp.objectReferenceValue as ITextSource;\r\n                        if (src == null) return;\r\n\r\n                        var labelRect = new Rect(area.xMin, area.yMin, area.width, EditorGUIUtility.singleLineHeight);\r\n                        var textRect = new Rect(area.xMin, area.yMin + labelRect.height + 2f, area.width, area.height - labelRect.height - 3f);\r\n\r\n                        var label = EditorHelper.TempContent(\"Element \" + index.ToString(\"00\"));\r\n                        if (this.ElementLabelCallback != null)\r\n                            this.ElementLabelCallback(labelRect, element, label, index);\r\n                        else\r\n                            EditorGUI.LabelField(labelRect, label);\r\n\r\n                        EditorGUI.TextArea(textRect, src[index]);\r\n                    }\r\n                    break;\r\n                case Mode.TextAsset:\r\n                    {\r\n                        var src = _objProp.objectReferenceValue as TextAsset;\r\n                        if (src == null) return;\r\n\r\n                        var labelRect = new Rect(area.xMin, area.yMin, area.width, EditorGUIUtility.singleLineHeight);\r\n                        var textRect = new Rect(area.xMin, area.yMin + labelRect.height + 2f, area.width, area.height - labelRect.height - 3f);\r\n\r\n                        var label = EditorHelper.TempContent(\"Element \" + index.ToString(\"00\"));\r\n                        if (this.ElementLabelCallback != null)\r\n                            this.ElementLabelCallback(labelRect, element, label, index);\r\n                        else\r\n                            EditorGUI.LabelField(labelRect, label);\r\n\r\n                        EditorGUI.TextArea(textRect, src.text);\r\n                    }\r\n                    break;\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Project/WeightedTextDocumentInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Project;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Project\r\n{\r\n\r\n    [CustomEditor(typeof(WeightedTextDocument))]\r\n    public class WeightedTextDocumentInspector : SPEditor\r\n    {\r\n\r\n        private SPReorderableList _lst;\r\n        private SerializedProperty _weightsProp;\r\n        private float _totalOdds;\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _lst = new SPReorderableList(this.serializedObject, this.serializedObject.FindProperty(\"_text\"));\r\n            _lst.drawHeaderCallback += _maskList_DrawHeader;\r\n            _lst.drawElementCallback += _maskList_DrawElement;\r\n            _lst.elementHeight = EditorGUIUtility.singleLineHeight * 4f;\r\n        }\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            _weightsProp = this.serializedObject.FindProperty(\"_weights\");\r\n            _lst.serializedProperty = this.serializedObject.FindProperty(\"_text\");\r\n            _weightsProp.arraySize = _lst.serializedProperty.arraySize;\r\n\r\n            _totalOdds = 0f;\r\n            for (int i = 0; i < _weightsProp.arraySize; i++)\r\n            {\r\n                _totalOdds += _weightsProp.GetArrayElementAtIndex(i).floatValue;\r\n            }\r\n\r\n            _lst.DoLayoutList();\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n\r\n        private void _maskList_DrawHeader(Rect area)\r\n        {\r\n            EditorGUI.LabelField(area, \"Text\");\r\n        }\r\n\r\n        private void _maskList_DrawElement(Rect position, int index, bool isActive, bool isFocused)\r\n        {\r\n            var element = _lst.serializedProperty.GetArrayElementAtIndex(index);\r\n\r\n            var labelRect = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n            var textRect = new Rect(position.xMin, position.yMin + labelRect.height + 2f, position.width, position.height - labelRect.height - 3f);\r\n\r\n            //draw label with odds\r\n            var label = EditorHelper.TempContent(\"Element \" + index.ToString(\"00\"));\r\n            var area = EditorGUI.PrefixLabel(labelRect, label);\r\n\r\n            const float WEIGHT_FIELD_WIDTH = 60f;\r\n            const float PERC_FIELD_WIDTH = 45f;\r\n            const float FULLWEIGHT_WIDTH = WEIGHT_FIELD_WIDTH + PERC_FIELD_WIDTH;\r\n            var weightRect = new Rect(area.xMax - FULLWEIGHT_WIDTH, area.yMin, WEIGHT_FIELD_WIDTH, EditorGUIUtility.singleLineHeight);\r\n            var percRect = new Rect(area.xMax - PERC_FIELD_WIDTH, area.yMin, PERC_FIELD_WIDTH, EditorGUIUtility.singleLineHeight);\r\n            if (index >= _weightsProp.arraySize) _weightsProp.arraySize = index + 1;\r\n\r\n            var weightsProp = _weightsProp.GetArrayElementAtIndex(index);\r\n            weightsProp.floatValue = EditorGUI.FloatField(weightRect, weightsProp.floatValue);\r\n            float p = (_totalOdds > 0f) ? (100f * weightsProp.floatValue / _totalOdds) : ((index == 0) ? 100f : 0f);\r\n            EditorGUI.LabelField(percRect, string.Format(\"{0:0.#}%\", p));\r\n\r\n            //draw text\r\n            element.stringValue = EditorGUI.TextArea(textRect, element.stringValue);\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"SpacepuppyBaseEditor\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"SpacepuppyBaseEditor\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"d7bb2bf6-533d-4532-9595-ec7b789d730b\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Render/MaterialPropertyReferencePropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Render;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Render\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(MaterialPropertyReference))]\r\n    public class MaterialPropertyReferencePropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public const string PROP_MATERIAL = \"_material\";\r\n        public const string PROP_VALUETYPE = \"_valueType\";\r\n        public const string PROP_VALUEMEMBER = \"_member\";\r\n        public const string PROP_PROPERTYNAME = \"_propertyName\";\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            return EditorGUIUtility.singleLineHeight;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            //property.isExpanded = EditorGUI.Foldout(new Rect(position.xMin, position.yMin, 15f, EditorGUIUtility.singleLineHeight), property.isExpanded, GUIContent.none);\r\n            position = EditorGUI.PrefixLabel(position, label);\r\n\r\n\r\n            //START DRAW WITH NO INDENTS\r\n            EditorHelper.SuppressIndentLevel();\r\n\r\n\r\n            var r0 = new Rect(position.xMin, position.yMin, position.width / 2f, position.height);\r\n            var r1 = new Rect(r0.xMax, r0.yMin, position.width - r0.width, r0.height);\r\n\r\n            var matProp = property.FindPropertyRelative(PROP_MATERIAL);\r\n            var valTypeProp = property.FindPropertyRelative(PROP_VALUETYPE);\r\n            var memberProp = property.FindPropertyRelative(PROP_VALUEMEMBER);\r\n            var propNameProp = property.FindPropertyRelative(PROP_PROPERTYNAME);\r\n\r\n            \r\n            EditorGUI.BeginChangeCheck();\r\n            matProp.objectReferenceValue = EditorGUI.ObjectField(r1, matProp.objectReferenceValue, typeof(UnityEngine.Object), true);\r\n            if (EditorGUI.EndChangeCheck())\r\n            {\r\n                if (!MaterialUtil.IsMaterialSource(matProp.objectReferenceValue))\r\n                {\r\n                    var go = GameObjectUtil.GetGameObjectFromSource(matProp.objectReferenceValue);\r\n                    matProp.objectReferenceValue = (go != null) ? go.GetComponent<Renderer>() : null;\r\n                }\r\n            }\r\n            \r\n            var mat = MaterialUtil.GetMaterialFromSource(matProp.objectReferenceValue);\r\n            if (mat != null && mat.shader != null)\r\n            {\r\n                int cnt = ShaderUtil.GetPropertyCount(mat.shader);\r\n                using (var infoLst = TempCollection.GetList<PropInfo>(cnt))\r\n                using (var contentLst = TempCollection.GetList<GUIContent>(cnt))\r\n                {\r\n                    int index = -1;\r\n                    \r\n                    for (int i = 0; i < cnt; i++)\r\n                    {\r\n                        var nm = ShaderUtil.GetPropertyName(mat.shader, i);\r\n                        var tp = ShaderUtil.GetPropertyType(mat.shader, i);\r\n\r\n                        switch (tp)\r\n                        {\r\n                            case ShaderUtil.ShaderPropertyType.Float:\r\n                                {\r\n                                    if (propNameProp.stringValue == nm) index = infoLst.Count;\r\n                                    infoLst.Add(new PropInfo(nm, MaterialPropertyValueType.Float));\r\n                                    contentLst.Add(EditorHelper.TempContent(nm + \" (float)\"));\r\n                                }\r\n                                break;\r\n                            case ShaderUtil.ShaderPropertyType.Range:\r\n                                {\r\n                                    if (propNameProp.stringValue == nm) index = infoLst.Count;\r\n                                    infoLst.Add(new PropInfo(nm, MaterialPropertyValueType.Float));\r\n                                    var min = ShaderUtil.GetRangeLimits(mat.shader, i, 1);\r\n                                    var max = ShaderUtil.GetRangeLimits(mat.shader, i, 2);\r\n                                    contentLst.Add(EditorHelper.TempContent(string.Format(\"{0} (Range [{1}, {2}]])\", nm, min, max)));\r\n                                }\r\n                                break;\r\n                            case ShaderUtil.ShaderPropertyType.Color:\r\n                                {\r\n                                    if (propNameProp.stringValue == nm && memberProp.GetEnumValue<MaterialPropertyValueTypeMember>() == MaterialPropertyValueTypeMember.None) index = infoLst.Count;\r\n                                    infoLst.Add(new PropInfo(nm, MaterialPropertyValueType.Color));\r\n                                    contentLst.Add(EditorHelper.TempContent(nm + \" (color)\"));\r\n\r\n                                    //sub members\r\n                                    if (propNameProp.stringValue == nm && memberProp.GetEnumValue<MaterialPropertyValueTypeMember>() == MaterialPropertyValueTypeMember.X) index = infoLst.Count;\r\n                                    infoLst.Add(new PropInfo(nm, MaterialPropertyValueType.Color, MaterialPropertyValueTypeMember.X));\r\n                                    contentLst.Add(EditorHelper.TempContent(nm + \".r (float)\"));\r\n\r\n                                    if (propNameProp.stringValue == nm && memberProp.GetEnumValue<MaterialPropertyValueTypeMember>() == MaterialPropertyValueTypeMember.Y) index = infoLst.Count;\r\n                                    infoLst.Add(new PropInfo(nm, MaterialPropertyValueType.Color, MaterialPropertyValueTypeMember.Y));\r\n                                    contentLst.Add(EditorHelper.TempContent(nm + \".g (float)\"));\r\n\r\n                                    if (propNameProp.stringValue == nm && memberProp.GetEnumValue<MaterialPropertyValueTypeMember>() == MaterialPropertyValueTypeMember.Z) index = infoLst.Count;\r\n                                    infoLst.Add(new PropInfo(nm, MaterialPropertyValueType.Color, MaterialPropertyValueTypeMember.Z));\r\n                                    contentLst.Add(EditorHelper.TempContent(nm + \".b (float)\"));\r\n\r\n                                    if (propNameProp.stringValue == nm && memberProp.GetEnumValue<MaterialPropertyValueTypeMember>() == MaterialPropertyValueTypeMember.W) index = infoLst.Count;\r\n                                    infoLst.Add(new PropInfo(nm, MaterialPropertyValueType.Color, MaterialPropertyValueTypeMember.W));\r\n                                    contentLst.Add(EditorHelper.TempContent(nm + \".a (float)\"));\r\n                                }\r\n                                break;\r\n                            case ShaderUtil.ShaderPropertyType.Vector:\r\n                                {\r\n                                    if (propNameProp.stringValue == nm && memberProp.GetEnumValue<MaterialPropertyValueTypeMember>() == MaterialPropertyValueTypeMember.None) index = infoLst.Count;\r\n                                    infoLst.Add(new PropInfo(nm, MaterialPropertyValueType.Vector));\r\n                                    contentLst.Add(EditorHelper.TempContent(nm + \" (vector)\"));\r\n\r\n                                    //sub members\r\n                                    if (propNameProp.stringValue == nm && memberProp.GetEnumValue<MaterialPropertyValueTypeMember>() == MaterialPropertyValueTypeMember.X) index = infoLst.Count;\r\n                                    infoLst.Add(new PropInfo(nm, MaterialPropertyValueType.Vector, MaterialPropertyValueTypeMember.X));\r\n                                    contentLst.Add(EditorHelper.TempContent(nm + \".x (float)\"));\r\n\r\n                                    if (propNameProp.stringValue == nm && memberProp.GetEnumValue<MaterialPropertyValueTypeMember>() == MaterialPropertyValueTypeMember.Y) index = infoLst.Count;\r\n                                    infoLst.Add(new PropInfo(nm, MaterialPropertyValueType.Vector, MaterialPropertyValueTypeMember.Y));\r\n                                    contentLst.Add(EditorHelper.TempContent(nm + \".y (float)\"));\r\n\r\n                                    if (propNameProp.stringValue == nm && memberProp.GetEnumValue<MaterialPropertyValueTypeMember>() == MaterialPropertyValueTypeMember.Z) index = infoLst.Count;\r\n                                    infoLst.Add(new PropInfo(nm, MaterialPropertyValueType.Vector, MaterialPropertyValueTypeMember.Z));\r\n                                    contentLst.Add(EditorHelper.TempContent(nm + \".z (float)\"));\r\n\r\n                                    if (propNameProp.stringValue == nm && memberProp.GetEnumValue<MaterialPropertyValueTypeMember>() == MaterialPropertyValueTypeMember.W) index = infoLst.Count;\r\n                                    infoLst.Add(new PropInfo(nm, MaterialPropertyValueType.Vector, MaterialPropertyValueTypeMember.W));\r\n                                    contentLst.Add(EditorHelper.TempContent(nm + \".w (float)\"));\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n\r\n                    EditorGUI.BeginChangeCheck();\r\n                    index = EditorGUI.Popup(r0, index, contentLst.ToArray());\r\n\r\n                    if(EditorGUI.EndChangeCheck())\r\n                    {\r\n                        if (index < 0)\r\n                        {\r\n                            valTypeProp.SetEnumValue(MaterialPropertyValueType.Float);\r\n                            memberProp.SetEnumValue(MaterialPropertyValueTypeMember.None);\r\n                            propNameProp.stringValue = string.Empty;\r\n                        }\r\n                        else\r\n                        {\r\n                            var info = infoLst[index];\r\n                            valTypeProp.SetEnumValue(info.ValueType);\r\n                            memberProp.SetEnumValue(info.MemberType);\r\n                            propNameProp.stringValue = info.Name;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n\r\n            //SET INDENT BACK\r\n            EditorHelper.ResumeIndentLevel();\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n        private struct PropInfo\r\n        {\r\n            public string Name;\r\n            public MaterialPropertyValueType ValueType;\r\n            public MaterialPropertyValueTypeMember MemberType;\r\n\r\n            public PropInfo(string nm, MaterialPropertyValueType valueType, MaterialPropertyValueTypeMember memberType = MaterialPropertyValueTypeMember.None)\r\n            {\r\n                Name = nm;\r\n                ValueType = valueType;\r\n                MemberType = memberType;\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Render/MaterialSourceInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Render;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Render\r\n{\r\n\r\n    [CustomEditor(typeof(RendererMaterialSource))]\r\n    public class RendererMaterialSourceInspector : SPEditor\r\n    {\r\n\r\n        public const string PROP_RENDERER = \"_renderer\";\r\n        public const string PROP_MAKEUNIQUEONSTART = \"_makeUniqueOnStart\";\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n\r\n            this.DrawDefaultMaterialSourceInspector();\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_RENDERER, PROP_MAKEUNIQUEONSTART);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n        protected void DrawDefaultMaterialSourceInspector()\r\n        {\r\n            var prop = this.serializedObject.FindProperty(PROP_RENDERER);\r\n            var source = this.target as RendererMaterialSource;\r\n            var go = GameObjectUtil.GetGameObjectFromSource(source);\r\n            if(go == null)\r\n            {\r\n                EditorGUILayout.HelpBox(\"MaterialSource can not find target GameObject it's attached to.\", MessageType.Error);\r\n                return;\r\n            }\r\n\r\n            if(Application.isPlaying)\r\n            {\r\n                var cache = SPGUI.Disable();\r\n                this.DrawPropertyField(PROP_RENDERER);\r\n                this.DrawPropertyField(PROP_MAKEUNIQUEONSTART);\r\n                EditorGUILayout.Toggle(\"Is Unique\", source.IsUnique);\r\n                cache.Reset();\r\n            }\r\n            else\r\n            {\r\n                if (prop.objectReferenceValue != null && prop.objectReferenceValue is Renderer)\r\n                {\r\n                    var renderer = prop.objectReferenceValue as Renderer;\r\n                    if (renderer.gameObject != go)\r\n                    {\r\n                        prop.objectReferenceValue = null;\r\n                    }\r\n\r\n\r\n                }\r\n\r\n                var renderers = go.GetComponents<Renderer>();\r\n                if (renderers.Length == 0)\r\n                {\r\n                    EditorGUILayout.HelpBox(\"MaterialSource can not find a Renderer on that GameObject it's attached to.\", MessageType.Error);\r\n                    return;\r\n                }\r\n                else\r\n                {\r\n                    var sources = go.GetComponents<RendererMaterialSource>();\r\n                    if (sources.Length > renderers.Length)\r\n                    {\r\n                        Debug.LogWarning(\"There are too many MaterialSources attached to this GameObject. Removing extra.\", go);\r\n                        UnityEngine.Object.DestroyImmediate(this.target);\r\n                        return;\r\n                    }\r\n\r\n                    renderers = renderers.Except((from s in sources where s.Renderer != null && s.Renderer != source.Renderer select s.Renderer)).ToArray();\r\n                    var names = (from r in renderers select EditorHelper.TempContent( r.GetType().Name)).ToArray();\r\n                    int index = renderers.IndexOf(source.Renderer);\r\n\r\n                    index = EditorGUILayout.Popup(EditorHelper.TempContent(\"Renderer\"), index, names);\r\n                    if (index >= 0)\r\n                        prop.objectReferenceValue = renderers[index];\r\n                    else\r\n                        prop.objectReferenceValue = null;\r\n                }\r\n\r\n                this.DrawPropertyField(PROP_MAKEUNIQUEONSTART);\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n    [CustomEditor(typeof(GraphicMaterialSource))]\r\n    public class GraphicMaterialSourceInspector : SPEditor\r\n    {\r\n\r\n        public const string PROP_GRAPHICS = \"_graphics\";\r\n        public const string PROP_MAKEUNIQUEONSTART = \"_makeUniqueOnStart\";\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n\r\n            this.DrawDefaultMaterialSourceInspector();\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_GRAPHICS, PROP_MAKEUNIQUEONSTART);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n        protected void DrawDefaultMaterialSourceInspector()\r\n        {\r\n            var prop = this.serializedObject.FindProperty(PROP_GRAPHICS);\r\n            var source = this.target as GraphicMaterialSource;\r\n            var go = GameObjectUtil.GetGameObjectFromSource(source);\r\n            if (go == null)\r\n            {\r\n                EditorGUILayout.HelpBox(\"MaterialSource can not find target GameObject it's attached to.\", MessageType.Error);\r\n                return;\r\n            }\r\n\r\n            if (Application.isPlaying)\r\n            {\r\n                var cache = SPGUI.Disable();\r\n                this.DrawPropertyField(PROP_GRAPHICS);\r\n                this.DrawPropertyField(PROP_MAKEUNIQUEONSTART);\r\n                EditorGUILayout.Toggle(\"Is Unique\", source.IsUnique);\r\n                cache.Reset();\r\n            }\r\n            else\r\n            {\r\n                if (prop.objectReferenceValue != null && prop.objectReferenceValue is UnityEngine.UI.Graphic)\r\n                {\r\n                    var renderer = prop.objectReferenceValue as UnityEngine.UI.Graphic;\r\n                    if (renderer.gameObject != go)\r\n                    {\r\n                        prop.objectReferenceValue = null;\r\n                    }\r\n\r\n\r\n                }\r\n\r\n                var graphics = go.GetComponents<UnityEngine.UI.Graphic>();\r\n                if (graphics.Length == 0)\r\n                {\r\n                    EditorGUILayout.HelpBox(\"MaterialSource can not find a Renderer on that GameObject it's attached to.\", MessageType.Error);\r\n                    return;\r\n                }\r\n                else\r\n                {\r\n                    var sources = go.GetComponents<GraphicMaterialSource>();\r\n                    if (sources.Length > graphics.Length)\r\n                    {\r\n                        Debug.LogWarning(\"There are too many MaterialSources attached to this GameObject. Removing extra.\", go);\r\n                        UnityEngine.Object.DestroyImmediate(this.target);\r\n                        return;\r\n                    }\r\n\r\n                    graphics = graphics.Except((from s in sources where s.Graphics != null && s.Graphics != source.Graphics select s.Graphics)).ToArray();\r\n                    var names = (from r in graphics select EditorHelper.TempContent(r.GetType().Name)).ToArray();\r\n                    int index = graphics.IndexOf(source.Graphics);\r\n\r\n                    index = EditorGUILayout.Popup(EditorHelper.TempContent(\"Graphics\"), index, names);\r\n                    if (index >= 0)\r\n                        prop.objectReferenceValue = graphics[index];\r\n                    else\r\n                        prop.objectReferenceValue = null;\r\n                }\r\n\r\n                this.DrawPropertyField(PROP_MAKEUNIQUEONSTART);\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Render/MaterialTransitionPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Render;\r\n\r\nusing com.spacepuppyeditor.Base;\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Render\r\n{\r\n\r\n    /// <summary>\r\n    /// It is critical that MaterialTransition mirrors the same 4 properties found in MaterialPropertyReference. \r\n    /// </summary>\r\n    [CustomPropertyDrawer(typeof(MaterialTransition))]\r\n    public class MaterialTransitionPropertyDrawer : PropertyDrawer\r\n    {\r\n        \r\n        public const string PROP_VALUES = \"_values\";\r\n        public const string PROP_POSITION = \"_position\";\r\n\r\n\r\n        private MaterialPropertyReferencePropertyDrawer _matPropRefDrawer = new MaterialPropertyReferencePropertyDrawer();\r\n        private VariantReferencePropertyDrawer _variantDrawer = new VariantReferencePropertyDrawer() { RestrictVariantType = true };\r\n        private SerializedProperty _property;\r\n        private SerializedProperty _valuesProp;\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            float h;\r\n            if (EditorHelper.AssertMultiObjectEditingNotSupportedHeight(property, label, out h)) return h;\r\n\r\n            var valuesProp = property.FindPropertyRelative(PROP_VALUES);\r\n            var lst = CachedReorderableList.GetListDrawer(valuesProp, _valuesList_DrawHeader, _valuesList_DrawElement);\r\n            lst.headerHeight = 1f;\r\n            lst.elementHeight = EditorGUIUtility.singleLineHeight;\r\n\r\n            h = lst.GetHeight();\r\n            h += EditorGUIUtility.singleLineHeight * 2.5f; //material line, position slider, and a small padding\r\n            return h;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            if (EditorHelper.AssertMultiObjectEditingNotSupported(position, property, label)) return;\r\n            \r\n            var cache = SPGUI.DisableIfPlaying();\r\n\r\n            _property = property;\r\n\r\n            GUI.Box(position, GUIContent.none);\r\n\r\n            var r0 = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n            _matPropRefDrawer.OnGUI(r0, property, label); //because we mirror the properties of MaterialPropertyReference, this works\r\n            position = new Rect(position.xMin, r0.yMax, position.width, position.height - r0.height);\r\n\r\n            EditorGUI.indentLevel++;\r\n            \r\n            _valuesProp = property.FindPropertyRelative(PROP_VALUES);\r\n            var lst = CachedReorderableList.GetListDrawer(_valuesProp, _valuesList_DrawHeader, _valuesList_DrawElement);\r\n            lst.headerHeight = 0f;\r\n            lst.elementHeight = EditorGUIUtility.singleLineHeight;\r\n\r\n            var r2 = new Rect(position.xMin, position.yMin, position.width, lst.GetHeight());\r\n            var r3 = new Rect(position.xMin, position.yMax - EditorGUIUtility.singleLineHeight * 1.25f, position.width, EditorGUIUtility.singleLineHeight);\r\n\r\n            //lst.DoList(EditorGUI.IndentedRect(r2));\r\n            lst.DoList(r2);\r\n            EditorGUI.PropertyField(r3, property.FindPropertyRelative(PROP_POSITION));\r\n\r\n            EditorGUI.indentLevel--;\r\n            \r\n            _property = null;\r\n            _valuesProp = null;\r\n\r\n            cache.Reset();\r\n        }\r\n        \r\n\r\n\r\n        #region List Drawer Methods\r\n\r\n        private void _valuesList_DrawHeader(Rect area)\r\n        {\r\n        }\r\n\r\n        private void _valuesList_DrawElement(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            var valueProp = _valuesProp.GetArrayElementAtIndex(index);\r\n\r\n            var evtp = _property.FindPropertyRelative(MaterialPropertyReferencePropertyDrawer.PROP_VALUETYPE).GetEnumValue<MaterialPropertyValueType>();\r\n            var emtp = _property.FindPropertyRelative(MaterialPropertyReferencePropertyDrawer.PROP_VALUEMEMBER).GetEnumValue<MaterialPropertyValueTypeMember>();\r\n\r\n            _variantDrawer.TypeRestrictedTo = GetType(evtp, emtp);\r\n            _variantDrawer.OnGUI(area, valueProp, GUIContent.none);\r\n        }\r\n\r\n        #endregion\r\n\r\n        private static VariantType GetVariantType(MaterialPropertyValueType evtp, MaterialPropertyValueTypeMember emtp)\r\n        {\r\n            switch (evtp)\r\n            {\r\n                case MaterialPropertyValueType.Float:\r\n                    return VariantType.Float;\r\n                case MaterialPropertyValueType.Color:\r\n                    {\r\n                        switch (emtp)\r\n                        {\r\n                            case MaterialPropertyValueTypeMember.None:\r\n                                return VariantType.Color;\r\n                            default:\r\n                                return VariantType.Float;\r\n                        }\r\n                    }\r\n                case MaterialPropertyValueType.Vector:\r\n                    {\r\n                        switch (emtp)\r\n                        {\r\n                            case MaterialPropertyValueTypeMember.None:\r\n                                return VariantType.Vector4;\r\n                            default:\r\n                                return VariantType.Float;\r\n                        }\r\n                    }\r\n                default:\r\n                    return VariantType.Float;\r\n            }\r\n        }\r\n\r\n        private static System.Type GetType(MaterialPropertyValueType evtp, MaterialPropertyValueTypeMember emtp)\r\n        {\r\n            switch (evtp)\r\n            {\r\n                case MaterialPropertyValueType.Float:\r\n                    return typeof(float);\r\n                case MaterialPropertyValueType.Color:\r\n                    {\r\n                        switch(emtp)\r\n                        {\r\n                            case MaterialPropertyValueTypeMember.None:\r\n                                return typeof(UnityEngine.Color);\r\n                            default:\r\n                                return typeof(float);\r\n                        }\r\n                    }\r\n                case MaterialPropertyValueType.Vector:\r\n                    {\r\n                        switch (emtp)\r\n                        {\r\n                            case MaterialPropertyValueTypeMember.None:\r\n                                return typeof(UnityEngine.Vector4);\r\n                            default:\r\n                                return typeof(float);\r\n                        }\r\n                    }\r\n                default:\r\n                    return typeof(float);\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Render/RenderSettingsProxyInpsector.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.Rendering;\nusing UnityEditor;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Render;\n\nnamespace com.spacepuppyeditor.Render\n{\n\n    [CustomEditor(typeof(RenderSettingsProxy))]\n    public class RenderSettingsProxyInpsector : SPEditor\n    {\n        \n        protected override void OnSPInspectorGUI()\n        {\n            base.OnSPInspectorGUI();\n\n            var obj = this.serializedObject.targetObject as RenderSettingsProxy;\n            if(obj != null)\n            {\n                EditorGUILayout.HelpBox(\"This object is a proxy for the RenderSettings to be used as a tween/set target at runtime. The values below are just a reflection of the current render setting's values for reference purposes. You shouldn't really modify these and instead use Window->Lighting instead.\", MessageType.Warning);\n\n                if(Application.isPlaying)\n                {\n                    obj.Skybox = EditorGUILayout.ObjectField(\"Skybox\", obj.Skybox, typeof(Material), false) as Material;\n                    obj.Sun = EditorGUILayout.ObjectField(\"Sun\", obj.Sun, typeof(Light), false) as Light;\n\n                    EditorGUILayout.Space();\n\n                    obj.Fog = EditorGUILayout.Toggle(\"Fog\", obj.Fog);\n                    obj.FogMode = (FogMode)EditorGUILayout.EnumPopup(\"FogMode\", obj.FogMode);\n                    obj.FogColor = EditorGUILayout.ColorField(\"FogColor\", obj.FogColor);\n                    obj.FogStartDistance = EditorGUILayout.FloatField(\"FogStartDistance\", obj.FogStartDistance);\n                    obj.FogDensity = EditorGUILayout.FloatField(\"FogDensity\", obj.FogDensity);\n                    obj.FogEndDistance = EditorGUILayout.FloatField(\"FogEndDistance\", obj.FogEndDistance);\n\n                    EditorGUILayout.Space();\n\n                    obj.AmbientMode = (AmbientMode)EditorGUILayout.EnumPopup(\"AmbientMode\", obj.AmbientMode);\n                    obj.AmbientIntensity = EditorGUILayout.FloatField(\"AmbientIntensity\", obj.AmbientIntensity);\n                    obj.AmbientLight = EditorGUILayout.ColorField(\"AmbientLight\", obj.AmbientLight);\n                    obj.AmbientGroundColor = EditorGUILayout.ColorField(\"AmbientGroundColor\", obj.AmbientGroundColor);\n                    obj.AmbientEquatorColor = EditorGUILayout.ColorField(\"AmbientEquatorColor\", obj.AmbientEquatorColor);\n                    obj.AmbientSkyColor = EditorGUILayout.ColorField(\"AmbientSkyColor\", obj.AmbientSkyColor);\n\n                    EditorGUILayout.Space();\n\n                    obj.DefaultReflectionMode = (DefaultReflectionMode)EditorGUILayout.EnumPopup(\"DefaultReflectionMode\", obj.DefaultReflectionMode);\n                    obj.DefaultReflectionResolution = EditorGUILayout.IntField(\"DefaultReflectionResolution\", obj.DefaultReflectionResolution);\n                    obj.ReflectionIntensity = EditorGUILayout.FloatField(\"ReflectionIntensity\", obj.ReflectionIntensity);\n                    obj.ReflectionBounces = EditorGUILayout.IntField(\"ReflectionBounces\", obj.ReflectionBounces);\n                    obj.CustomReflection = EditorGUILayout.ObjectField(\"CustomReflection\", obj.CustomReflection, typeof(Cubemap), false) as Cubemap;\n\n                    EditorGUILayout.Space();\n\n                    obj.FlareFadeSpeed = EditorGUILayout.FloatField(\"FlareFadeSpeed\", obj.FlareFadeSpeed);\n                    obj.FlareStrength = EditorGUILayout.FloatField(\"FlareStrength\", obj.FlareStrength);\n                    obj.HaloStrength = EditorGUILayout.FloatField(\"HaloStrength\", obj.HaloStrength);\n                    obj.SubtractiveShadowColor = EditorGUILayout.ColorField(\"SubtractiveShadowColor\", obj.SubtractiveShadowColor);\n                    //obj.AmbientProbe = EditorGUILayout...(\"AmbientProbe\", obj.AmbientProbe);\n                }\n                else\n                {\n                    EditorGUILayout.ObjectField(\"Skybox\", obj.Skybox, typeof(Material), false);\n                    EditorGUILayout.ObjectField(\"Sun\", obj.Sun, typeof(Light), false);\n\n                    EditorGUILayout.Space();\n\n                    EditorGUILayout.Toggle(\"Fog\", obj.Fog);\n                    EditorGUILayout.EnumPopup(\"FogMode\", obj.FogMode);\n                    EditorGUILayout.ColorField(\"FogColor\", obj.FogColor);\n                    EditorGUILayout.FloatField(\"FogStartDistance\", obj.FogStartDistance);\n                    EditorGUILayout.FloatField(\"FogDensity\", obj.FogDensity);\n                    EditorGUILayout.FloatField(\"FogEndDistance\", obj.FogEndDistance);\n\n                    EditorGUILayout.Space();\n\n                    EditorGUILayout.EnumPopup(\"AmbientMode\", obj.AmbientMode);\n                    EditorGUILayout.FloatField(\"AmbientIntensity\", obj.AmbientIntensity);\n                    EditorGUILayout.ColorField(\"AmbientLight\", obj.AmbientLight);\n                    EditorGUILayout.ColorField(\"AmbientGroundColor\", obj.AmbientGroundColor);\n                    EditorGUILayout.ColorField(\"AmbientEquatorColor\", obj.AmbientEquatorColor);\n                    EditorGUILayout.ColorField(\"AmbientSkyColor\", obj.AmbientSkyColor);\n\n                    EditorGUILayout.Space();\n\n                    EditorGUILayout.EnumPopup(\"DefaultReflectionMode\", obj.DefaultReflectionMode);\n                    EditorGUILayout.IntField(\"DefaultReflectionResolution\", obj.DefaultReflectionResolution);\n                    EditorGUILayout.FloatField(\"ReflectionIntensity\", obj.ReflectionIntensity);\n                    EditorGUILayout.IntField(\"ReflectionBounces\", obj.ReflectionBounces);\n                    EditorGUILayout.ObjectField(\"CustomReflection\", obj.CustomReflection, typeof(Cubemap), false);\n\n                    EditorGUILayout.Space();\n\n                    EditorGUILayout.FloatField(\"FlareFadeSpeed\", obj.FlareFadeSpeed);\n                    EditorGUILayout.FloatField(\"FlareStrength\", obj.FlareStrength);\n                    EditorGUILayout.FloatField(\"HaloStrength\", obj.HaloStrength);\n                    EditorGUILayout.ColorField(\"SubtractiveShadowColor\", obj.SubtractiveShadowColor);\n                    //EditorGUILayout...(\"AmbientProbe\", obj.AmbientProbe);\n                }\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/ReorderableListHelper.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n    public static class ReorderableListHelper\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private static ReorderableList.Defaults s_Defaults;\r\n        public static ReorderableList.Defaults DefaultBehaviours\r\n        {\r\n            get\r\n            {\r\n                if(ReorderableList.defaultBehaviours == null)\r\n                {\r\n                    if (s_Defaults == null) s_Defaults = new ReorderableList.Defaults();\r\n                    return s_Defaults;\r\n                }\r\n                else\r\n                {\r\n                    return ReorderableList.defaultBehaviours;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n        #region Public Util Methods\r\n\r\n        public static bool IsRightClickingDraggableArea(this ReorderableList lst, Rect area)\r\n        {\r\n            if (!lst.draggable) return false;\r\n\r\n            const float MARGIN = 20f; //this is the size of the draggable handle before the actual content is drawn. Use this area as the left click area.\r\n            var clickArea = new Rect(area.xMin - MARGIN, area.yMin, MARGIN, area.height);\r\n            return Event.current.type == EventType.MouseUp && Event.current.button == MouseUtil.BTN_RIGHT && clickArea.Contains(Event.current.mousePosition);\r\n        }\r\n\r\n        public static bool IsClickingArea(Rect area, int mouseButton = 0)\r\n        {\r\n            return Event.current.type == EventType.MouseUp && Event.current.button == mouseButton && area.Contains(Event.current.mousePosition);\r\n        }\r\n\r\n        public static void DrawDraggableElementDeleteContextMenu(this ReorderableList lst, Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            if (IsRightClickingDraggableArea(lst, area))\r\n            {\r\n                Event.current.Use();\r\n\r\n                var menu = new GenericMenu();\r\n                menu.AddItem(new GUIContent(\"Delete\"), false, () =>\r\n                {\r\n                    //lst.serializedProperty.DeleteArrayElementAtIndex(index);\r\n                    //lst.serializedProperty.serializedObject.ApplyModifiedProperties();\r\n                    lst.index = index;\r\n                    if (lst.onRemoveCallback == null)\r\n                        ReorderableList.defaultBehaviours.DoRemoveButton(lst);\r\n                    else\r\n                        lst.onRemoveCallback(lst);\r\n                });\r\n                menu.ShowAsContext();\r\n            }\r\n        }\r\n\r\n        public static void DrawRetractedHeader(Rect position, GUIContent label)\r\n        {\r\n            DrawRetractedHeader(position, label, ReorderableListHelper.DefaultBehaviours.headerBackground);\r\n        }\r\n\r\n        public static void DrawRetractedHeader(Rect position, GUIContent label, GUIContent label2)\r\n        {\r\n            DrawRetractedHeader(position, label, label2, ReorderableListHelper.DefaultBehaviours.headerBackground);\r\n        }\r\n\r\n        public static void DrawRetractedHeader(Rect position, GUIContent label, GUIStyle backgroundStyle)\r\n        {\r\n            var rbg = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n            if (Event.current.type == EventType.Repaint && backgroundStyle != null)\r\n                backgroundStyle.Draw(rbg, false, false, false, false);\r\n\r\n            var rlbl = rbg;\r\n            rlbl.xMin += 6f;\r\n            rlbl.xMax -= 6f;\r\n            rlbl.y += 1f;\r\n            EditorGUI.LabelField(rlbl, label);\r\n        }\r\n\r\n        public static void DrawRetractedHeader(Rect position, GUIContent label, GUIContent label2, GUIStyle backgroundStyle)\r\n        {\r\n            var rbg = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n            if (Event.current.type == EventType.Repaint && backgroundStyle != null)\r\n                backgroundStyle.Draw(rbg, false, false, false, false);\r\n\r\n            var rlbl = rbg;\r\n            rlbl.xMin += 6f;\r\n            rlbl.xMax -= 6f;\r\n            rlbl.y += 1f;\r\n            EditorGUI.LabelField(rlbl, label, label2);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/SPEditor.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.EditorOnly;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n\r\n    [CustomEditor(typeof(MonoBehaviour), true)]\r\n    [CanEditMultipleObjects()]\r\n    public class SPEditor : Editor\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private List<GUIDrawer> _headerDrawers;\r\n        private SPEditorAddonDrawer[] _addons;\r\n\r\n        private List<ShownPropertyInfo> _shownFields;\r\n        private ConstantlyRepaintEditorAttribute _constantlyRepaint;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected virtual void OnEnable()\r\n        {\r\n            var tp = this.target.GetType();\r\n            var fields = tp.GetMembers(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Static);\r\n            foreach (var f in fields)\r\n            {\r\n                var attribs = f.GetCustomAttributes(typeof(ShowNonSerializedPropertyAttribute), false) as ShowNonSerializedPropertyAttribute[];\r\n                if (attribs != null && attribs.Length > 0)\r\n                {\r\n                    if (_shownFields == null) _shownFields = new List<ShownPropertyInfo>();\r\n                    var attrib = attribs[0];\r\n                    _shownFields.Add(new ShownPropertyInfo()\r\n                    {\r\n                        Attrib = attrib,\r\n                        MemberInfo = f,\r\n                        Label = new GUIContent(attrib.Label ?? f.Name, attrib.Tooltip)\r\n                    });\r\n                }\r\n            }\r\n\r\n            _constantlyRepaint = tp.GetCustomAttributes(typeof(ConstantlyRepaintEditorAttribute), false).FirstOrDefault() as ConstantlyRepaintEditorAttribute;\r\n        }\r\n\r\n        protected virtual void OnDisable()\r\n        {\r\n            \r\n        }\r\n\r\n        #endregion\r\n\r\n        #region GUI Methods\r\n\r\n        public sealed override void OnInspectorGUI()\r\n        {\r\n            if (!(this.target is SPComponent) && !SpacepuppySettings.UseSPEditorAsDefaultEditor)\r\n            {\r\n                base.OnInspectorGUI();\r\n                return;\r\n            }\r\n\r\n            this.OnBeforeSPInspectorGUI();\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n\r\n            //draw header infobox if needed\r\n            this.DrawDefaultInspectorHeader();\r\n            this.OnSPInspectorGUI();\r\n            this.DrawDefaultInspectorFooters();\r\n\r\n            if (EditorGUI.EndChangeCheck())\r\n            {\r\n                //do call onValidate\r\n                PropertyHandlerValidationUtility.OnInspectorGUIComplete(this.serializedObject, true);\r\n                this.OnValidate();\r\n\r\n                if (SpacepuppySettings.SignalValidateReceiver)\r\n                {\r\n                    foreach (var obj in this.serializedObject.targetObjects)\r\n                    {\r\n                        var iterator = serializedObject.GetIterator();\r\n                        while (iterator.Next(true))\r\n                        {\r\n                            if (iterator.propertyType == SerializedPropertyType.ObjectReference) continue;\r\n\r\n                            var validated = EditorHelper.GetTargetObjectOfProperty(iterator, obj) as IValidateReceiver;\r\n                            validated?.OnValidate();\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                PropertyHandlerValidationUtility.OnInspectorGUIComplete(this.serializedObject, false);\r\n            }\r\n\r\n            if (_shownFields != null && UnityEngine.Application.isPlaying)\r\n            {\r\n                GUILayout.Label(\"Runtime Values\", EditorStyles.boldLabel);\r\n\r\n                foreach (var info in _shownFields)\r\n                {\r\n                    var cache = SPGUI.DisableIf(info.Attrib.Readonly);\r\n\r\n                    var value = DynamicUtil.GetValue(this.target, info.MemberInfo);\r\n                    EditorGUI.BeginChangeCheck();\r\n                    value = SPEditorGUILayout.DefaultPropertyField(info.Label, value, DynamicUtil.GetReturnType(info.MemberInfo));\r\n                    if (EditorGUI.EndChangeCheck())\r\n                    {\r\n                        DynamicUtil.SetValue(this.target, info.MemberInfo, value);\r\n                    }\r\n\r\n                    cache.Reset();\r\n                }\r\n            }\r\n        }\r\n\r\n        protected virtual void OnBeforeSPInspectorGUI()\r\n        {\r\n\r\n        }\r\n\r\n        protected virtual void OnSPInspectorGUI()\r\n        {\r\n            this.DrawDefaultInspector();\r\n        }\r\n\r\n        protected virtual void OnValidate()\r\n        {\r\n\r\n        }\r\n\r\n        private void DrawDefaultInspectorHeader()\r\n        {\r\n            //var attribs = this.serializedObject.targetObject.GetType().GetCustomAttributes(typeof(InfoboxAttribute), false);\r\n            //InfoboxAttribute infoboxAttrib = (attribs.Length > 0) ? attribs[0] as InfoboxAttribute : null;\r\n            //if (infoboxAttrib != null)\r\n            //{\r\n            //    var position = EditorGUILayout.GetControlRect(false, com.spacepuppyeditor.Decorators.InfoboxDecorator.GetHeight(infoboxAttrib));\r\n            //    com.spacepuppyeditor.Decorators.InfoboxDecorator.OnGUI(position, infoboxAttrib);\r\n            //}\r\n\r\n            if (_headerDrawers == null)\r\n            {\r\n                _headerDrawers = new List<GUIDrawer>();\r\n                if (serializedObject.targetObject != null)\r\n                {\r\n                    var componentType = serializedObject.targetObject.GetType();\r\n                    if (TypeUtil.IsType(componentType, typeof(Component), typeof(ScriptableObject)))\r\n                    {\r\n                        var attribs = (from o in componentType.GetCustomAttributes(typeof(ComponentHeaderAttribute), true)\r\n                                       let a = o as ComponentHeaderAttribute\r\n                                       where a != null\r\n                                       orderby a.order\r\n                                       select a).ToArray();\r\n                        foreach (var attrib in attribs)\r\n                        {\r\n                            var dtp = ScriptAttributeUtility.GetDrawerTypeForType(attrib.GetType());\r\n                            if (dtp != null)\r\n                            {\r\n                                if (TypeUtil.IsType(dtp, typeof(DecoratorDrawer)))\r\n                                {\r\n                                    var decorator = System.Activator.CreateInstance(dtp) as DecoratorDrawer;\r\n                                    DynamicUtil.SetValue(decorator, \"m_Attribute\", attrib);\r\n                                    _headerDrawers.Add(decorator);\r\n                                }\r\n                                else if (TypeUtil.IsType(dtp, typeof(ComponentHeaderDrawer)))\r\n                                {\r\n                                    var drawer = System.Activator.CreateInstance(dtp) as ComponentHeaderDrawer;\r\n                                    drawer.Init(attrib, componentType);\r\n                                    _headerDrawers.Add(drawer);\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        /*\r\n                         * Unity now supports doing this itself.\r\n                         * \r\n                        var obsoleteAttrib = componentType.GetCustomAttributes(typeof(System.ObsoleteAttribute), false).FirstOrDefault() as System.ObsoleteAttribute;\r\n                        if (obsoleteAttrib != null)\r\n                        {\r\n                            _headerDrawers.Add(new ObsoleteHeaderDrawer(\"This script is considered deprecated:\\n\\t\" + obsoleteAttrib.Message));\r\n                        }\r\n                        */\r\n\r\n                        _addons = SPEditorAddonDrawer.GetDrawers(this.serializedObject);\r\n                    }\r\n                }\r\n            }\r\n\r\n            for (int i = 0; i < _headerDrawers.Count; i++)\r\n            {\r\n                var drawer = _headerDrawers[i];\r\n                if (drawer is DecoratorDrawer)\r\n                {\r\n                    var decorator = drawer as DecoratorDrawer;\r\n                    var h = decorator.GetHeight();\r\n                    Rect position = EditorGUILayout.GetControlRect(false, h);\r\n                    decorator.OnGUI(position);\r\n                }\r\n                else if (drawer is ComponentHeaderDrawer)\r\n                {\r\n                    var compDrawer = drawer as ComponentHeaderDrawer;\r\n                    var h = compDrawer.GetHeight(this.serializedObject);\r\n                    Rect position = EditorGUILayout.GetControlRect(false, h);\r\n                    compDrawer.OnGUI(position, this.serializedObject);\r\n                }\r\n            }\r\n\r\n            if (_addons != null)\r\n            {\r\n                foreach (var d in _addons)\r\n                {\r\n                    if (!d.IsFooter) d.OnInspectorGUI();\r\n                }\r\n            }\r\n        }\r\n\r\n        private void DrawDefaultInspectorFooters()\r\n        {\r\n            if (_addons != null)\r\n            {\r\n                foreach (var d in _addons)\r\n                {\r\n                    if (d.IsFooter) d.OnInspectorGUI();\r\n                }\r\n            }\r\n        }\r\n\r\n        public override bool RequiresConstantRepaint()\r\n        {\r\n            return base.RequiresConstantRepaint() ||\r\n                   (Application.isPlaying && _shownFields != null && _shownFields.Count > 0) ||\r\n                   (_constantlyRepaint != null && (Application.isPlaying || !_constantlyRepaint.RuntimeOnly)) ||\r\n                   (_addons != null && _addons.Length > 0 && _addons.Any((o) => o.RequiresConstantRepaint()));\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Draw Methods\r\n\r\n        /// <summary>\r\n        /// Draw the inspector as it would have been if not an SPEditor.\r\n        /// </summary>\r\n        public void DrawDefaultStandardInspector()\r\n        {\r\n            base.DrawDefaultInspector();\r\n        }\r\n\r\n        public new bool DrawDefaultInspector()\r\n        {\r\n            //draw properties\r\n            this.serializedObject.Update();\r\n            var result = SPEditor.DrawDefaultInspectorExcept(this.serializedObject);\r\n            this.serializedObject.ApplyModifiedProperties();\r\n\r\n            return result;\r\n        }\r\n\r\n        public void DrawDefaultInspectorExcept(params string[] propsNotToDraw)\r\n        {\r\n            DrawDefaultInspectorExcept(this.serializedObject, propsNotToDraw);\r\n        }\r\n\r\n        public bool DrawPropertyField(string prop)\r\n        {\r\n            return SPEditorGUILayout.PropertyField(this.serializedObject, prop);\r\n        }\r\n\r\n        public bool DrawPropertyField(string prop, bool includeChildren)\r\n        {\r\n            return SPEditorGUILayout.PropertyField(this.serializedObject, prop, includeChildren);\r\n        }\r\n\r\n        public bool DrawPropertyField(string prop, string label, bool includeChildren)\r\n        {\r\n            return SPEditorGUILayout.PropertyField(this.serializedObject, prop, label, includeChildren);\r\n        }\r\n\r\n        public bool DrawPropertyField(string prop, GUIContent label, bool includeChildren)\r\n        {\r\n            return SPEditorGUILayout.PropertyField(this.serializedObject, prop, label, includeChildren);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n\r\n        public static bool DrawDefaultInspectorExcept(SerializedObject serializedObject, params string[] propsNotToDraw)\r\n        {\r\n            if (serializedObject == null) throw new System.ArgumentNullException(\"serializedObject\");\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            var iterator = serializedObject.GetIterator();\r\n            for (bool enterChildren = true; iterator.NextVisible(enterChildren); enterChildren = false)\r\n            {\r\n\r\n                if (propsNotToDraw == null || !propsNotToDraw.Contains(iterator.name))\r\n                {\r\n                    //EditorGUILayout.PropertyField(iterator, true);\r\n                    SPEditorGUILayout.PropertyField(iterator, true);\r\n                }\r\n            }\r\n            return EditorGUI.EndChangeCheck();\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region Special Types\r\n\r\n        private class ShownPropertyInfo\r\n        {\r\n\r\n            public ShowNonSerializedPropertyAttribute Attrib;\r\n            public System.Reflection.MemberInfo MemberInfo;\r\n            public GUIContent Label;\r\n\r\n        }\r\n\r\n        private class ObsoleteHeaderDrawer : DecoratorDrawer\r\n        {\r\n\r\n            private string _message;\r\n\r\n            public ObsoleteHeaderDrawer(string msg)\r\n            {\r\n                _message = msg;\r\n            }\r\n\r\n            public override float GetHeight()\r\n            {\r\n                return EditorStyles.helpBox.CalcSize(EditorHelper.TempContent(_message)).y;\r\n            }\r\n\r\n            public override void OnGUI(Rect position)\r\n            {\r\n                EditorGUI.HelpBox(position, _message, MessageType.Warning);\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    [CustomEditor(typeof(ScriptableObject), true)]\r\n    [CanEditMultipleObjects()]\r\n    public class SPScriptableObjectEditor : SPEditor\r\n    {\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/SPEditorAddonDrawer.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n\r\n    public class CustomAddonDrawerAttribute : System.Attribute\r\n    {\r\n\r\n        private Type _inspectedType;\r\n        public bool supportMultiObject;\r\n        public bool displayAsFooter;\r\n\r\n        public CustomAddonDrawerAttribute(Type inspectedType)\r\n        {\r\n            _inspectedType = inspectedType;\r\n        }\r\n\r\n        public Type InspectedType { get { return _inspectedType; } }\r\n\r\n    }\r\n\r\n    /// <summary>\r\n    /// Allows defining custom add-on drawer for various script types to be placed at the beginning of, or at the end of, an inspector draw call. \r\n    /// This is great for things like all scripts that implement some interface get a custom footer relavant to that interface without every script \r\n    /// having to implement it in each inspector.\r\n    /// </summary>\r\n    public abstract class SPEditorAddonDrawer\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private UnityEditor.SerializedObject _serializedObject;\r\n        private bool _isFooter;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool IsFooter\r\n        {\r\n            get { return _isFooter; }\r\n        }\r\n\r\n        public UnityEditor.SerializedObject SerializedObject\r\n        {\r\n            get { return _serializedObject; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public virtual void OnEnable()\r\n        {\r\n\r\n        }\r\n\r\n\r\n        public virtual void OnInspectorGUI()\r\n        {\r\n\r\n        }\r\n\r\n        public virtual bool RequiresConstantRepaint()\r\n        {\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region Static Factory\r\n\r\n        private static Dictionary<Type, object> _inspectedTypeToAddonDrawerType;\r\n\r\n        private static void BuildAddonDrawerTypeTable()\r\n        {\r\n            _inspectedTypeToAddonDrawerType = new Dictionary<Type, object>();\r\n\r\n            foreach (var tp in TypeUtil.GetTypesAssignableFrom(typeof(SPEditorAddonDrawer)))\r\n            {\r\n                if (tp.IsAbstract) continue;\r\n\r\n                var attribs = tp.GetCustomAttributes(typeof(CustomAddonDrawerAttribute), false) as CustomAddonDrawerAttribute[];\r\n                foreach(var attrib in attribs)\r\n                {\r\n                    object v;\r\n                    if(_inspectedTypeToAddonDrawerType.TryGetValue(attrib.InspectedType, out v))\r\n                    {\r\n                        if(v is List<DrawerInfo>)\r\n                        {\r\n                            (v as List<DrawerInfo>).Add(new DrawerInfo()\r\n                            {\r\n                                DrawerType = tp,\r\n                                SupportsMultiObject = attrib.supportMultiObject,\r\n                                IsFooter = attrib.displayAsFooter\r\n                            });\r\n                        }\r\n                        else if(v is DrawerInfo)\r\n                        {\r\n                            var lst = new List<DrawerInfo>();\r\n                            lst.Add(v as DrawerInfo);\r\n                            lst.Add(new DrawerInfo()\r\n                            {\r\n                                DrawerType = tp,\r\n                                SupportsMultiObject = attrib.supportMultiObject,\r\n                                IsFooter = attrib.displayAsFooter\r\n                            });\r\n                            _inspectedTypeToAddonDrawerType[attrib.InspectedType] = lst;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        _inspectedTypeToAddonDrawerType.Add(attrib.InspectedType, new DrawerInfo()\r\n                                                                                    {\r\n                                                                                        DrawerType = tp,\r\n                                                                                        SupportsMultiObject = attrib.supportMultiObject,\r\n                                                                                        IsFooter = attrib.displayAsFooter\r\n                                                                                    });\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static SPEditorAddonDrawer[] GetDrawers(UnityEditor.SerializedObject target)\r\n        {\r\n            if (target == null) return ArrayUtil.Empty<SPEditorAddonDrawer>();\r\n\r\n            Type compType = typeof(UnityEngine.Component);\r\n            Type targType = target.GetTargetType();\r\n            if (!compType.IsAssignableFrom(targType)) return ArrayUtil.Empty<SPEditorAddonDrawer>();\r\n            if (_inspectedTypeToAddonDrawerType == null) BuildAddonDrawerTypeTable();\r\n            if (_inspectedTypeToAddonDrawerType.Count == 0) return ArrayUtil.Empty<SPEditorAddonDrawer>();\r\n\r\n            using (var lst = TempCollection.GetList<SPEditorAddonDrawer>())\r\n            {\r\n                var tp = targType;\r\n                while (tp != null && compType.IsAssignableFrom(tp))\r\n                {\r\n                    object v;\r\n                    if (_inspectedTypeToAddonDrawerType.TryGetValue(tp, out v))\r\n                    {\r\n                        if (v is List<DrawerInfo>)\r\n                        {\r\n                            foreach(var info in (v as List<DrawerInfo>))\r\n                            {\r\n                                var d = info.CreateDrawer(target);\r\n                                if (d != null) lst.Add(d);\r\n                            }\r\n                        }\r\n                        else if (v is DrawerInfo)\r\n                        {\r\n                            var d = (v as DrawerInfo).CreateDrawer(target);\r\n                            if (d != null) lst.Add(d);\r\n                        }\r\n                    }\r\n\r\n                    tp = tp.BaseType;\r\n                }\r\n\r\n                foreach(var itp in targType.GetInterfaces())\r\n                {\r\n                    object v;\r\n                    if (_inspectedTypeToAddonDrawerType.TryGetValue(itp, out v))\r\n                    {\r\n                        if (v is List<DrawerInfo>)\r\n                        {\r\n                            foreach (var info in (v as List<DrawerInfo>))\r\n                            {\r\n                                var d = info.CreateDrawer(target);\r\n                                if (d != null) lst.Add(d);\r\n                            }\r\n                        }\r\n                        else if (v is DrawerInfo)\r\n                        {\r\n                            var d = (v as DrawerInfo).CreateDrawer(target);\r\n                            if (d != null) lst.Add(d);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                return lst.ToArray();\r\n            }\r\n        }\r\n        \r\n\r\n\r\n        private class DrawerInfo\r\n        {\r\n\r\n            public Type DrawerType;\r\n            public bool SupportsMultiObject;\r\n            public bool IsFooter;\r\n\r\n\r\n\r\n            public SPEditorAddonDrawer CreateDrawer(UnityEditor.SerializedObject target)\r\n            {\r\n                if (target.isEditingMultipleObjects && !this.SupportsMultiObject) return null;\r\n\r\n                try\r\n                {\r\n                    var drawer = Activator.CreateInstance(DrawerType) as SPEditorAddonDrawer;\r\n                    drawer._serializedObject = target;\r\n                    drawer._isFooter = this.IsFooter;\r\n                    drawer.OnEnable();\r\n                    return drawer;\r\n                }\r\n                catch\r\n                {\r\n                    return null;\r\n                }\r\n            }\r\n\r\n        }\r\n        \r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/SPEditorGUI.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Utils;\r\nusing com.spacepuppy.Dynamic;\r\n\r\nusing com.spacepuppyeditor.Base;\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n    public static class SPEditorGUI\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private static TypeAccessWrapper _accessWrapper;\r\n\r\n        private static int s_FoldoutHash = \"Foldout\".GetHashCode();\r\n\r\n        private static System.Func<Rect, int, GUIContent, int, Rect> _imp_MultiFieldPrefixLabel;\r\n        //private static System.Action<Rect, GUIContent[], float[], float> _imp_MultiFloatField_01;\r\n        private static System.Func<SerializedProperty, GUIContent, float> _imp_GetSinglePropertyHeight;\r\n        private static System.Func<GUIContent, Rect, Gradient, Gradient> _imp_GradientField;\r\n        private static System.Func<Rect, string, string> _imp_SearchField;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        static SPEditorGUI()\r\n        {\r\n            var klass = InternalTypeUtil.UnityEditorAssembly.GetType(\"UnityEditor.EditorGUI\");\r\n            _accessWrapper = new TypeAccessWrapper(klass, true);\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region Internal EditorGUI Methods\r\n\r\n        public static float GetSinglePropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            if (_imp_GetSinglePropertyHeight == null) _imp_GetSinglePropertyHeight = _accessWrapper.GetStaticMethod(\"GetSinglePropertyHeight\", typeof(System.Func<SerializedProperty, GUIContent, float>)) as System.Func<SerializedProperty, GUIContent, float>;\r\n            return _imp_GetSinglePropertyHeight(property, label);\r\n        }\r\n\r\n        public static bool HasVisibleChildFields(SerializedProperty property)\r\n        {\r\n            switch (property.propertyType)\r\n            {\r\n                case SerializedPropertyType.Vector2:\r\n                case SerializedPropertyType.Vector3:\r\n                case SerializedPropertyType.Rect:\r\n                case SerializedPropertyType.Bounds:\r\n                    return false;\r\n                default:\r\n                    return property.hasVisibleChildren;\r\n            }\r\n        }\r\n\r\n        internal static Rect MultiFieldPrefixLabel(Rect totalPosition, int id, GUIContent label, int columns)\r\n        {\r\n            if (_imp_MultiFieldPrefixLabel == null) _imp_MultiFieldPrefixLabel = _accessWrapper.GetStaticMethod(\"MultiFieldPrefixLabel\", typeof(System.Func<Rect, int, GUIContent, int, Rect>)) as System.Func<Rect, int, GUIContent, int, Rect>;\r\n            return _imp_MultiFieldPrefixLabel(totalPosition, id, label, columns);\r\n        }\r\n\r\n        public static void MultiFloatField(Rect position, GUIContent[] subLabels, float[] values)\r\n        {\r\n            //EditorGUI.MultiFloatField(position, subLabels, values);\r\n            SPEditorGUI.MultiFloatField(position, subLabels, values, 13f);\r\n        }\r\n\r\n        public static void MultiFloatField(Rect position, GUIContent[] subLabels, float[] values, float labelWidth)\r\n        {\r\n            //if (_imp_MultiFloatField_01 == null) _imp_MultiFloatField_01 = _accessWrapper.GetStaticMethod(\"MultiFloatField\", typeof(System.Action<Rect, GUIContent[], float[], float>)) as System.Action<Rect, GUIContent[], float[], float>;\r\n            //_imp_MultiFloatField_01(position, subLabels, values, labelWidth);\r\n\r\n            int length = values.Length;\r\n            float num = (position.width - (float)(length - 1) * 2f) / (float)length;\r\n            Rect position1 = new Rect(position);\r\n            position1.width = num;\r\n            float labelWidthCache = EditorGUIUtility.labelWidth;\r\n            int indentLevelCache = EditorGUI.indentLevel;\r\n            EditorGUIUtility.labelWidth = labelWidth;\r\n            EditorGUI.indentLevel = 0;\r\n            for (int index = 0; index < values.Length; ++index)\r\n            {\r\n                values[index] = EditorGUI.FloatField(position1, subLabels[index], values[index]);\r\n                position1.x += num + 2f;\r\n            }\r\n            EditorGUIUtility.labelWidth = labelWidthCache;\r\n            EditorGUI.indentLevel = indentLevelCache;\r\n        }\r\n\r\n        public static void MultiFloatField(Rect position, GUIContent label, GUIContent[] subLabels, float[] values)\r\n        {\r\n            //EditorGUI.MultiFloatField(position, label, subLabels, values);\r\n\r\n            int controlId = GUIUtility.GetControlID(SPEditorGUI.s_FoldoutHash, FocusType.Passive, position);\r\n            position = SPEditorGUI.MultiFieldPrefixLabel(position, controlId, label, subLabels.Length);\r\n            position.height = EditorGUIUtility.singleLineHeight;\r\n            SPEditorGUI.MultiFloatField(position, subLabels, values);\r\n        }\r\n\r\n        public static void MultiFloatField(Rect position, GUIContent label, GUIContent[] subLabels, float[] values, float labelWidth)\r\n        {\r\n            int controlId = GUIUtility.GetControlID(SPEditorGUI.s_FoldoutHash, FocusType.Passive, position);\r\n            position = SPEditorGUI.MultiFieldPrefixLabel(position, controlId, label, subLabels.Length);\r\n            position.height = EditorGUIUtility.singleLineHeight;\r\n            SPEditorGUI.MultiFloatField(position, subLabels, values, labelWidth);\r\n        }\r\n\r\n\r\n\r\n        public static void DelayedMultiFloatField(Rect position, GUIContent[] subLabels, float[] values)\r\n        {\r\n            SPEditorGUI.DelayedMultiFloatField(position, subLabels, values, 13f);\r\n        }\r\n\r\n        public static void DelayedMultiFloatField(Rect position, GUIContent[] subLabels, float[] values, float labelWidth)\r\n        {\r\n            //if (_imp_MultiFloatField_01 == null) _imp_MultiFloatField_01 = _accessWrapper.GetStaticMethod(\"MultiFloatField\", typeof(System.Action<Rect, GUIContent[], float[], float>)) as System.Action<Rect, GUIContent[], float[], float>;\r\n            //_imp_MultiFloatField_01(position, subLabels, values, labelWidth);\r\n\r\n            int length = values.Length;\r\n            float num = (position.width - (float)(length - 1) * 2f) / (float)length;\r\n            Rect position1 = new Rect(position);\r\n            position1.width = num;\r\n            float labelWidthCache = EditorGUIUtility.labelWidth;\r\n            int indentLevelCache = EditorGUI.indentLevel;\r\n            EditorGUIUtility.labelWidth = labelWidth;\r\n            EditorGUI.indentLevel = 0;\r\n            for (int index = 0; index < values.Length; ++index)\r\n            {\r\n                values[index] = EditorGUI.DelayedFloatField(position1, subLabels[index], values[index]);\r\n                position1.x += num + 2f;\r\n            }\r\n            EditorGUIUtility.labelWidth = labelWidthCache;\r\n            EditorGUI.indentLevel = indentLevelCache;\r\n        }\r\n\r\n        public static void DelayedMultiFloatField(Rect position, GUIContent label, GUIContent[] subLabels, float[] values)\r\n        {\r\n            //EditorGUI.MultiFloatField(position, label, subLabels, values);\r\n\r\n            int controlId = GUIUtility.GetControlID(SPEditorGUI.s_FoldoutHash, FocusType.Passive, position);\r\n            position = SPEditorGUI.MultiFieldPrefixLabel(position, controlId, label, subLabels.Length);\r\n            position.height = EditorGUIUtility.singleLineHeight;\r\n            SPEditorGUI.DelayedMultiFloatField(position, subLabels, values);\r\n        }\r\n\r\n        public static void DelayedMultiFloatField(Rect position, GUIContent label, GUIContent[] subLabels, float[] values, float labelWidth)\r\n        {\r\n            int controlId = GUIUtility.GetControlID(SPEditorGUI.s_FoldoutHash, FocusType.Passive, position);\r\n            position = SPEditorGUI.MultiFieldPrefixLabel(position, controlId, label, subLabels.Length);\r\n            position.height = EditorGUIUtility.singleLineHeight;\r\n            SPEditorGUI.DelayedMultiFloatField(position, subLabels, values, labelWidth);\r\n        }\r\n\r\n\r\n\r\n        public static string SearchField(Rect position, string search)\r\n        {\r\n            if (_imp_SearchField == null) _imp_SearchField = _accessWrapper.GetStaticMethod(\"SearchField\", typeof(System.Func<Rect, string, string>)) as System.Func<Rect, string, string>;\r\n            return _imp_SearchField(position, search);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Prefix\r\n\r\n        public static bool PrefixFoldoutLabel(Rect position, bool foldout, GUIContent label)\r\n        {\r\n            //EditorGUI.PrefixLabel(position, label);\r\n\r\n            var r = new Rect(position.xMin, position.yMin, Mathf.Min(position.width, EditorGUIUtility.labelWidth), EditorGUIUtility.singleLineHeight);\r\n            return EditorGUI.Foldout(r, foldout, label);\r\n        }\r\n\r\n        public static bool PrefixFoldoutLabel(ref Rect position, bool foldout, GUIContent label)\r\n        {\r\n            //EditorGUI.PrefixLabel(position, label);\r\n            \r\n            var r = new Rect(position.xMin, position.yMin, Mathf.Min(position.width, EditorGUIUtility.labelWidth), EditorGUIUtility.singleLineHeight);\r\n            position = new Rect(position.xMin + r.width, position.yMin, position.width - r.width, position.height);\r\n            return EditorGUI.Foldout(r, foldout, label);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region DefaultPropertyField\r\n\r\n        public static float GetDefaultPropertyHeight(SerializedProperty property)\r\n        {\r\n            //return com.spacepuppyeditor.Internal.DefaultPropertyHandler.Instance.GetHeight(property, GUIContent.none, true);\r\n            return ScriptAttributeUtility.SharedNullPropertyHandler.GetHeight(property, GUIContent.none, false);\r\n        }\r\n\r\n        public static float GetDefaultPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            //return com.spacepuppyeditor.Internal.DefaultPropertyHandler.Instance.GetHeight(property, label, true);\r\n            return ScriptAttributeUtility.SharedNullPropertyHandler.GetHeight(property, label, false);\r\n        }\r\n\r\n        public static float GetDefaultPropertyHeight(SerializedProperty property, GUIContent label, bool includeChildren)\r\n        {\r\n            //return com.spacepuppyeditor.Internal.DefaultPropertyHandler.Instance.GetHeight(property, label, includeChildren);\r\n            return ScriptAttributeUtility.SharedNullPropertyHandler.GetHeight(property, label, includeChildren);\r\n        }\r\n\r\n        public static bool DefaultPropertyField(Rect position, SerializedProperty property)\r\n        {\r\n            //return com.spacepuppyeditor.Internal.DefaultPropertyHandler.Instance.OnGUI(position, property, GUIContent.none, true);\r\n            return ScriptAttributeUtility.SharedNullPropertyHandler.OnGUI(position, property, GUIContent.none, false);\r\n        }\r\n\r\n        public static bool DefaultPropertyField(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            //return com.spacepuppyeditor.Internal.DefaultPropertyHandler.Instance.OnGUI(position, property, label, true);\r\n            return ScriptAttributeUtility.SharedNullPropertyHandler.OnGUI(position, property, label, false);\r\n        }\r\n\r\n        public static bool DefaultPropertyField(Rect position, SerializedProperty property, GUIContent label, bool includeChildren)\r\n        {\r\n            //return com.spacepuppyeditor.Internal.DefaultPropertyHandler.Instance.OnGUI(position, property, label, includeChildren);\r\n            return ScriptAttributeUtility.SharedNullPropertyHandler.OnGUI(position, property, label, includeChildren);\r\n        }\r\n        \r\n        public static object DefaultPropertyField(Rect position, string label, object value, System.Type valueType)\r\n        {\r\n            return DefaultPropertyField(position, EditorHelper.TempContent(label), value, valueType);\r\n        }\r\n\r\n        public static object DefaultPropertyField(Rect position, GUIContent label, object value, System.Type valueType)\r\n        {\r\n            SerializedPropertyType propertyType = SerializedPropertyType.Generic;\r\n            if (valueType != null) propertyType = (valueType.IsInterface) ? SerializedPropertyType.ObjectReference : EditorHelper.GetPropertyType(valueType);\r\n\r\n            switch (propertyType)\r\n            {\r\n                case SerializedPropertyType.Integer:\r\n                    EditorGUI.BeginChangeCheck();\r\n                    switch(System.Type.GetTypeCode(valueType))\r\n                    {\r\n                        case System.TypeCode.UInt32:\r\n                        case System.TypeCode.Int64:\r\n                        case System.TypeCode.UInt64:\r\n                            {\r\n                                long num = EditorGUI.LongField(position, label, ConvertUtil.ToLong(value));\r\n                                if (EditorGUI.EndChangeCheck())\r\n                                {\r\n                                    return num;\r\n                                }\r\n                            }\r\n                            break;\r\n                        default:\r\n                            {\r\n                                int num = EditorGUI.IntField(position, label, ConvertUtil.ToInt(value));\r\n                                if (EditorGUI.EndChangeCheck())\r\n                                {\r\n                                    return num;\r\n                                }\r\n                            }\r\n                            break;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Boolean:\r\n                    EditorGUI.BeginChangeCheck();\r\n                    bool flag2 = EditorGUI.Toggle(position, label, ConvertUtil.ToBool(value));\r\n                    if (EditorGUI.EndChangeCheck())\r\n                    {\r\n                        return flag2;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Float:\r\n                    EditorGUI.BeginChangeCheck();\r\n                    switch (System.Type.GetTypeCode(valueType))\r\n                    {\r\n                        case System.TypeCode.Double:\r\n                            {\r\n                                double num = EditorGUI.DoubleField(position, label, ConvertUtil.ToDouble(value));\r\n                                if (EditorGUI.EndChangeCheck())\r\n                                {\r\n                                    return num;\r\n                                }\r\n                            }\r\n                            break;\r\n                        default:\r\n                            {\r\n                                float num = EditorGUI.FloatField(position, label, ConvertUtil.ToSingle(value));\r\n                                if (EditorGUI.EndChangeCheck())\r\n                                {\r\n                                    return num;\r\n                                }\r\n                            }\r\n                            break;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.String:\r\n                    EditorGUI.BeginChangeCheck();\r\n                    string str1 = EditorGUI.TextField(position, label, ConvertUtil.ToString(value));\r\n                    if (EditorGUI.EndChangeCheck())\r\n                    {\r\n                        return str1;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Color:\r\n                    EditorGUI.BeginChangeCheck();\r\n                    Color color = EditorGUI.ColorField(position, label, ConvertUtil.ToColor(value));\r\n                    if (EditorGUI.EndChangeCheck())\r\n                    {\r\n                        return color;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.ObjectReference:\r\n                    EditorGUI.BeginChangeCheck();\r\n                    object obj = EditorGUI.ObjectField(position, label, value as UnityEngine.Object, valueType, true);\r\n                    if (EditorGUI.EndChangeCheck())\r\n                    {\r\n                        return obj;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.LayerMask:\r\n                    EditorGUI.BeginChangeCheck();\r\n                    LayerMask mask = (value is LayerMask) ? (LayerMask)value : (LayerMask)ConvertUtil.ToInt(value);\r\n                    mask = SPEditorGUI.LayerMaskField(position, label, mask);\r\n                    if (EditorGUI.EndChangeCheck())\r\n                    {\r\n                        return mask;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Enum:\r\n                    if (valueType.GetCustomAttributes(typeof(System.FlagsAttribute), false).Any())\r\n                    {\r\n                        EditorGUI.BeginChangeCheck();\r\n                        var e = SPEditorGUI.EnumFlagField(position, label, ConvertUtil.ToEnumOfType(valueType, value));\r\n                        if (EditorGUI.EndChangeCheck())\r\n                        {\r\n                            return e;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        EditorGUI.BeginChangeCheck();\r\n                        var e = SPEditorGUI.EnumPopupExcluding(position, label, ConvertUtil.ToEnumOfType(valueType, value));\r\n                        if (EditorGUI.EndChangeCheck())\r\n                        {\r\n                            return e;\r\n                        }\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Vector2:\r\n                    EditorGUI.BeginChangeCheck();\r\n                    var v2 = EditorGUI.Vector2Field(position, label, ConvertUtil.ToVector2(value));\r\n                    if (EditorGUI.EndChangeCheck())\r\n                    {\r\n                        return v2;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Vector3:\r\n                    EditorGUI.BeginChangeCheck();\r\n                    var v3 = EditorGUI.Vector3Field(position, label, ConvertUtil.ToVector3(value));\r\n                    if (EditorGUI.EndChangeCheck())\r\n                    {\r\n                        return v3;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Vector4:\r\n                    EditorGUI.BeginChangeCheck();\r\n                    var v4 = EditorGUI.Vector4Field(position, label.text, ConvertUtil.ToVector4(value));\r\n                    if (EditorGUI.EndChangeCheck())\r\n                    {\r\n                        return v4;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Rect:\r\n                    EditorGUI.BeginChangeCheck();\r\n                    Rect rect = (value is Rect) ? (Rect)value : new Rect();\r\n                    rect = EditorGUI.RectField(position, label, rect);\r\n                    if (EditorGUI.EndChangeCheck())\r\n                    {\r\n                        return rect;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.ArraySize:\r\n                    EditorGUI.BeginChangeCheck();\r\n                    int num3 = EditorGUI.IntField(position, label, ConvertUtil.ToInt(value), EditorStyles.numberField);\r\n                    if (EditorGUI.EndChangeCheck())\r\n                    {\r\n                        return num3;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Character:\r\n                    bool changed = GUI.changed;\r\n                    GUI.changed = false;\r\n                    string str2 = EditorGUI.TextField(position, label, new string(ConvertUtil.ToChar(value), 1));\r\n                    if (GUI.changed)\r\n                    {\r\n                        if (str2.Length == 1)\r\n                            return str2[0];\r\n                        else\r\n                            GUI.changed = false;\r\n                    }\r\n                    GUI.changed = GUI.changed | changed;\r\n                    break;\r\n                case SerializedPropertyType.AnimationCurve:\r\n                    EditorGUI.BeginChangeCheck();\r\n                    AnimationCurve curve = value as AnimationCurve;\r\n                    curve = EditorGUI.CurveField(position, label, curve);\r\n                    if (EditorGUI.EndChangeCheck())\r\n                    {\r\n                        return curve;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Bounds:\r\n                    EditorGUI.BeginChangeCheck();\r\n                    Bounds bnds = (value is Bounds) ? (Bounds)value : new Bounds();\r\n                    bnds = EditorGUI.BoundsField(position, label, bnds);\r\n                    if (EditorGUI.EndChangeCheck())\r\n                    {\r\n                        return bnds;\r\n                    }\r\n                    break;\r\n                case SerializedPropertyType.Gradient:\r\n                    EditorGUI.BeginChangeCheck();\r\n                    Gradient grad = value as Gradient;\r\n                    grad = SPEditorGUI.GradientField(position, label, grad);\r\n                    if (EditorGUI.EndChangeCheck())\r\n                    {\r\n                        return grad;\r\n                    }\r\n                    break;\r\n                default:\r\n                    EditorGUI.PrefixLabel(position, label);\r\n                    break;\r\n            }\r\n\r\n            return value;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region FlatPropertyField\r\n\r\n        /// <summary>\r\n        /// Draws all children of a property\r\n        /// </summary>\r\n        /// <param name=\"position\"></param>\r\n        /// <param name=\"property\"></param>\r\n        /// <returns></returns>\r\n        public static bool FlatChildPropertyField(Rect position, SerializedProperty property)\r\n        {\r\n            if (property == null) throw new System.ArgumentNullException(\"property\");\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            var iterator = property.Copy();\r\n            var end = property.GetEndProperty();\r\n            for (bool enterChildren = true; iterator.NextVisible(enterChildren); enterChildren = false)\r\n            {\r\n                if (SerializedProperty.EqualContents(iterator, end))\r\n                    break;\r\n\r\n                var h = GetPropertyHeight(iterator);\r\n                var rect = new Rect(position.xMin, position.yMin, position.width, h);\r\n                position = new Rect(position.xMin, rect.yMax, position.width, position.height - h);\r\n                PropertyField(rect, iterator, EditorHelper.TempContent(iterator.displayName), true);\r\n            }\r\n            return EditorGUI.EndChangeCheck();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region PropertyFields\r\n\r\n        public static float GetPropertyHeight(SerializedProperty property)\r\n        {\r\n            return com.spacepuppyeditor.Internal.ScriptAttributeUtility.GetHandler(property).GetHeight(property, GUIContent.none, false);\r\n        }\r\n\r\n        public static float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            return com.spacepuppyeditor.Internal.ScriptAttributeUtility.GetHandler(property).GetHeight(property, label, false);\r\n        }\r\n\r\n        public static float GetPropertyHeight(SerializedProperty property, GUIContent label, bool includeChildren)\r\n        {\r\n            return com.spacepuppyeditor.Internal.ScriptAttributeUtility.GetHandler(property).GetHeight(property, label, includeChildren);\r\n        }\r\n\r\n        public static bool PropertyField(Rect position, SerializedProperty property, bool includeChildren = false)\r\n        {\r\n            return PropertyField(position, property, (GUIContent)null, includeChildren);\r\n        }\r\n\r\n        public static bool PropertyField(Rect position, SerializedProperty property, GUIContent label, bool includeChildren = false)\r\n        {\r\n            return com.spacepuppyeditor.Internal.ScriptAttributeUtility.GetHandler(property).OnGUI(position, property, label, includeChildren);\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region ObjectField w/ X-btn\r\n\r\n        public static void ObjectFieldX(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            if (SPEditorGUI.XButton(ref position, \"Clear Selected Object\", true))\r\n            {\r\n                property.objectReferenceValue = null;\r\n            }\r\n            EditorGUI.ObjectField(position, property, label);\r\n        }\r\n\r\n        public static UnityEngine.Object ObjectFieldX(Rect position, UnityEngine.Object obj, System.Type objType, bool allowSceneObjects)\r\n        {\r\n            if (SPEditorGUI.XButton(ref position, \"Clear Selected Object\", true))\r\n            {\r\n                obj = null;\r\n            }\r\n            obj = EditorGUI.ObjectField(position, obj, objType, allowSceneObjects);\r\n            return obj;\r\n        }\r\n\r\n        public static void ObjectFieldX(Rect position, SerializedProperty property, System.Type objType, GUIContent label)\r\n        {\r\n            if (SPEditorGUI.XButton(ref position, \"Clear Selected Object\", true))\r\n            {\r\n                property.objectReferenceValue = null;\r\n            }\r\n            EditorGUI.ObjectField(position, property, objType, label);\r\n        }\r\n\r\n        public static UnityEngine.Object ObjectFieldX(Rect position, GUIContent label, UnityEngine.Object obj, System.Type objType, bool allowSceneObjects)\r\n        {\r\n            if (SPEditorGUI.XButton(ref position, \"Clear Selected Object\", true))\r\n            {\r\n                obj = null;\r\n            }\r\n            obj = EditorGUI.ObjectField(position, label, obj, objType, allowSceneObjects);\r\n            return obj;\r\n        }\r\n\r\n        public static UnityEngine.Object ObjectFieldX(Rect position, string label, UnityEngine.Object obj, System.Type objType, bool allowSceneObjects)\r\n        {\r\n            if (SPEditorGUI.XButton(ref position, \"Clear Selected Object\", true))\r\n            {\r\n                obj = null;\r\n            }\r\n            obj = EditorGUI.ObjectField(position, label, obj, objType, allowSceneObjects);\r\n            return obj;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region LayerMaskField\r\n\r\n        public static LayerMask LayerMaskField(Rect position, string label, int selectedMask)\r\n        {\r\n            return EditorGUI.MaskField(position, label, selectedMask, LayerUtil.GetAllLayerNames());\r\n        }\r\n\r\n        public static LayerMask LayerMaskField(Rect position, GUIContent label, int selectedMask)\r\n        {\r\n            return EditorGUI.MaskField(position, label, selectedMask, LayerUtil.GetAllLayerNames());\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region GradientField\r\n\r\n        public static Gradient GradientField(Rect position, string label, Gradient gradient)\r\n        {\r\n            return GradientField(position, EditorHelper.TempContent(label), gradient);\r\n        }\r\n\r\n        public static Gradient GradientField(Rect position, GUIContent label, Gradient gradient)\r\n        {\r\n            if (_imp_GradientField == null) _imp_GradientField = _accessWrapper.GetStaticMethod(\"GradientField\", typeof(System.Func<GUIContent, Rect, Gradient, Gradient>)) as System.Func<GUIContent, Rect, Gradient, Gradient>;\r\n            return _imp_GradientField(label, position, gradient);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region EnumPopup Inspector\r\n\r\n        public static System.Enum EnumPopup(Rect position, System.Enum enumValue)\r\n        {\r\n            return EnumPopup(position, GUIContent.none, enumValue);\r\n        }\r\n\r\n        public static System.Enum EnumPopup(Rect position, string label, System.Enum enumValue)\r\n        {\r\n            return EnumPopup(position, EditorHelper.TempContent(label), enumValue);\r\n        }\r\n\r\n        public static System.Enum EnumPopup(Rect position, GUIContent label, System.Enum enumValue)\r\n        {\r\n            var etp = enumValue.GetType();\r\n            var evalues = System.Enum.GetValues(etp).Cast<System.Enum>().ToArray();\r\n            if (evalues.Length == 0) throw new System.ArgumentException(\"Excluded all possible values, not a valid popup.\");\r\n            var names = evalues.Select(e => EditorHelper.TempContent(EnumUtil.GetFriendlyName(e))).ToArray();\r\n            var index = EditorGUI.Popup(position, label, evalues.IndexOf(enumValue), names);\r\n            return (index >= 0) ? evalues[index] : evalues.First();\r\n        }\r\n\r\n        public static System.Enum EnumPopupExcluding(Rect position, System.Enum enumValue, params System.Enum[] ignoredValues)\r\n        {\r\n            return EnumPopupExcluding(position, GUIContent.none, enumValue, ignoredValues);\r\n        }\r\n\r\n        public static System.Enum EnumPopupExcluding(Rect position, string label, System.Enum enumValue, params System.Enum[] ignoredValues)\r\n        {\r\n            return EnumPopupExcluding(position, EditorHelper.TempContent(label), enumValue, ignoredValues);\r\n        }\r\n\r\n        public static System.Enum EnumPopupExcluding(Rect position, GUIContent label, System.Enum enumValue, params System.Enum[] ignoredValues)\r\n        {\r\n            var etp = enumValue.GetType();\r\n            var evalues = System.Enum.GetValues(etp).Cast<System.Enum>().Except(ignoredValues).ToArray();\r\n            if (evalues.Length == 0) throw new System.ArgumentException(\"Excluded all possible values, not a valid popup.\");\r\n            var names = evalues.Select(e => EditorHelper.TempContent(EnumUtil.GetFriendlyName(e))).ToArray();\r\n            var index = EditorGUI.Popup(position, label, evalues.IndexOf(enumValue), names);\r\n            return (index >= 0) ? evalues[index] : evalues.First();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Option Popup w/ Custom\r\n\r\n        public static string OptionPopupWithCustom(Rect position, string label, string value, string[] options)\r\n        {\r\n            if (options == null) options = ArrayUtil.Empty<string>();\r\n\r\n            var guiOptions = (from s in options select EditorHelper.TempContent(s)).Append(EditorHelper.TempContent(\"Custom...\")).ToArray();\r\n\r\n            int index = System.Array.IndexOf(options, value);\r\n            if (index < 0) index = options.Length;\r\n\r\n            if (index == options.Length)\r\n            {\r\n                var fw = position.width - EditorGUIUtility.labelWidth;\r\n                var wl = EditorGUIUtility.labelWidth + (fw / 4f);\r\n                var wr = position.width - wl - 1f;\r\n\r\n                var rl = new Rect(position.xMin, position.yMin, wl, EditorGUIUtility.singleLineHeight);\r\n                var rr = new Rect(rl.xMax + 1f, rl.yMin, wr, EditorGUIUtility.singleLineHeight);\r\n\r\n                index = EditorGUI.Popup(rl, EditorHelper.TempContent(label), index, guiOptions);\r\n                if (index >= 0 && index < options.Length)\r\n                {\r\n                    return options[index];\r\n                }\r\n                else\r\n                {\r\n                    return EditorGUI.TextField(rr, value);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                index = EditorGUI.Popup(position, EditorHelper.TempContent(label), index, guiOptions);\r\n                return (index >= 0 && index < options.Length) ? options[index] : null;\r\n            }\r\n        }\r\n\r\n        public static string OptionPopupWithCustom(Rect position, GUIContent label, string value, string[] options)\r\n        {\r\n            if (options == null) options = ArrayUtil.Empty<string>();\r\n\r\n            var guiOptions = (from s in options select EditorHelper.TempContent(s)).Append(EditorHelper.TempContent(\"Custom...\")).ToArray();\r\n\r\n            int index = System.Array.IndexOf(options, value);\r\n            if (index < 0) index = options.Length;\r\n\r\n            if (index == options.Length)\r\n            {\r\n                var fw = position.width - EditorGUIUtility.labelWidth;\r\n                var wl = EditorGUIUtility.labelWidth + (fw / 4f);\r\n                var wr = position.width - wl - 1f;\r\n\r\n                var rl = new Rect(position.xMin, position.yMin, wl, EditorGUIUtility.singleLineHeight);\r\n                var rr = new Rect(rl.xMax + 1f, rl.yMin, wr, EditorGUIUtility.singleLineHeight);\r\n\r\n                index = EditorGUI.Popup(rl, label, index, guiOptions);\r\n                if (index >= 0 && index < options.Length)\r\n                {\r\n                    return options[index];\r\n                }\r\n                else\r\n                {\r\n                    return EditorGUI.TextField(rr, value);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                index = EditorGUI.Popup(position, label, index, guiOptions);\r\n                return (index >= 0 && index < options.Length) ? options[index] : null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region EnumFlag Inspector\r\n\r\n        public static int EnumFlagField(Rect position, System.Type enumType, GUIContent label, int value)\r\n        {\r\n            var code = System.Type.GetTypeCode(enumType);\r\n            switch(code)\r\n            {\r\n                case System.TypeCode.SByte:\r\n                case System.TypeCode.Int16:\r\n                case System.TypeCode.Int32:\r\n                    {\r\n                        int[] acceptedValues = (from e in EnumUtil.GetUniqueEnumFlags(enumType) select System.Convert.ToInt32(e)).ToArray();\r\n                        return EnumFlagField(position, enumType, acceptedValues, label, value);\r\n                    }\r\n                case System.TypeCode.Byte:\r\n                case System.TypeCode.UInt16:\r\n                case System.TypeCode.UInt32:\r\n                    {\r\n                        int[] acceptedValues = (from e in EnumUtil.GetUniqueEnumFlags(enumType) select (int)System.Convert.ToUInt32(e)).ToArray();\r\n                        return EnumFlagField(position, enumType, acceptedValues, label, value);\r\n                    }\r\n                case System.TypeCode.Int64:\r\n                    {\r\n                        //unity MaskField only supports 'int', so we redact all values that are too large\r\n                        int[] acceptedValues = (from e in EnumUtil.GetUniqueEnumFlags(enumType) let i = System.Convert.ToInt64(e) where i <= int.MaxValue && i >= int.MinValue select (int)i).ToArray();\r\n                        return EnumFlagField(position, enumType, acceptedValues, label, value);\r\n                    }\r\n                case System.TypeCode.UInt64:\r\n                    {\r\n                        //unity MaskField only supports 'int', so we redact all values that are too large\r\n                        int[] acceptedValues = (from e in EnumUtil.GetUniqueEnumFlags(enumType) let i = (long)System.Convert.ToUInt64(e) where i <= int.MaxValue && i >= int.MinValue select (int)i).ToArray();\r\n                        return EnumFlagField(position, enumType, acceptedValues, label, value);\r\n                    }\r\n                default:\r\n                    EditorGUI.LabelField(position, label, EditorHelper.TempContent(\"64-bit enum not supported...\"));\r\n                    return value;\r\n                    \r\n            }\r\n        }\r\n\r\n        public static System.Enum EnumFlagField(Rect position, GUIContent label, System.Enum value)\r\n        {\r\n            if (value == null) throw new System.ArgumentException(\"Enum value must be non-null.\", \"value\");\r\n\r\n            var enumType = value.GetType();\r\n            int i = EnumFlagField(position, enumType, label, System.Convert.ToInt32(value));\r\n            return System.Enum.ToObject(enumType, i) as System.Enum;\r\n        }\r\n\r\n        public static int EnumFlagField(Rect position, System.Type enumType, int[] acceptedFlags, GUIContent label, int value)\r\n        {\r\n            if (enumType == null) throw new System.ArgumentNullException(\"enumType\");\r\n            if (!enumType.IsEnum) throw new System.ArgumentException(\"Must be an enum type.\", \"enumType\");\r\n\r\n            using (var lst = TempCollection.GetList<int>())\r\n            {\r\n                foreach (var e in acceptedFlags)\r\n                {\r\n                    if ((e == (1 << 31) || (e > 0 && MathUtil.IsPowerOfTwo((ulong)e)))\r\n                       && EnumUtil.EnumValueIsDefined(e, enumType))\r\n                        lst.Add(e);\r\n                }\r\n\r\n                //convert to normalized mask\r\n                int normalizedValue;\r\n                if(value == 0)\r\n                {\r\n                    normalizedValue = 0;\r\n                }\r\n                else if(value == -1)\r\n                {\r\n                    normalizedValue = -1;\r\n                }\r\n                else\r\n                {\r\n                    normalizedValue = 0;\r\n                    var evalue = ConvertUtil.ToEnumOfType(enumType, value);\r\n                    for (int i = 0; i < lst.Count; i++)\r\n                    {\r\n                        if (EnumUtil.HasFlag(evalue, lst[i]))\r\n                        {\r\n                            normalizedValue |= (1 << i);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                //show maskfield\r\n                normalizedValue = EditorGUI.MaskField(position, label, normalizedValue, lst.Select(e => EnumUtil.GetFriendlyName(System.Enum.ToObject(enumType, e) as System.Enum)).ToArray());\r\n\r\n                //convert from normalized mask\r\n                if (normalizedValue == 0)\r\n                {\r\n                    return 0;\r\n                }\r\n                else if (normalizedValue == -1)\r\n                {\r\n                    return -1;\r\n                }\r\n                else\r\n                {\r\n                    value = 0;\r\n                    for (int i = 0; i < lst.Count; i++)\r\n                    {\r\n                        int j = (1 << i);\r\n                        if ((normalizedValue & j) == j)\r\n                            value |= lst[i];\r\n                    }\r\n\r\n                    return value;\r\n                }\r\n            }\r\n        }\r\n\r\n        public static WrapMode WrapModeField(Rect position, string label, WrapMode mode, bool allowDefault = false)\r\n        {\r\n            return WrapModeField(position, EditorHelper.TempContent(label), mode, allowDefault);\r\n        }\r\n\r\n        public static WrapMode WrapModeField(Rect position, GUIContent label, WrapMode mode, bool allowDefault = false)\r\n        {\r\n            if(allowDefault)\r\n            {\r\n                int i = 0;\r\n                switch(mode)\r\n                {\r\n                    case WrapMode.Default:\r\n                        i = 0;\r\n                        break;\r\n                    case WrapMode.Once:\r\n                    //case WrapMode.Clamp: //same as once\r\n                        i = 1;\r\n                        break;\r\n                    case WrapMode.Loop:\r\n                        i = 2;\r\n                        break;\r\n                    case WrapMode.PingPong:\r\n                        i = 3;\r\n                        break;\r\n                    case WrapMode.ClampForever:\r\n                        i = 4;\r\n                        break;\r\n                }\r\n                i = EditorGUI.Popup(position, label, i, new GUIContent[] { EditorHelper.TempContent(\"Default\"), EditorHelper.TempContent(\"Once|Clamp\"), EditorHelper.TempContent(\"Loop\"), EditorHelper.TempContent(\"PingPong\"), EditorHelper.TempContent(\"ClampForever\") });\r\n                switch(i)\r\n                {\r\n                    case 0:\r\n                        return WrapMode.Default;\r\n                    case 1:\r\n                        return WrapMode.Once;\r\n                    case 2:\r\n                        return WrapMode.Loop;\r\n                    case 3:\r\n                        return WrapMode.PingPong;\r\n                    case 4:\r\n                        return WrapMode.ClampForever;\r\n                    default:\r\n                        return WrapMode.Default;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                int i = 0;\r\n                switch (mode)\r\n                {\r\n                    case WrapMode.Default:\r\n                    case WrapMode.Once:\r\n                        //case WrapMode.Clamp: //same as once\r\n                        i = 0;\r\n                        break;\r\n                    case WrapMode.Loop:\r\n                        i = 1;\r\n                        break;\r\n                    case WrapMode.PingPong:\r\n                        i = 2;\r\n                        break;\r\n                    case WrapMode.ClampForever:\r\n                        i = 3;\r\n                        break;\r\n                }\r\n                i = EditorGUI.Popup(position, label, i, new GUIContent[] {EditorHelper.TempContent(\"Once|Clamp\"), EditorHelper.TempContent(\"Loop\"), EditorHelper.TempContent(\"PingPong\"), EditorHelper.TempContent(\"ClampForever\") });\r\n                switch (i)\r\n                {\r\n                    case 0:\r\n                        return WrapMode.Once;\r\n                    case 1:\r\n                        return WrapMode.Loop;\r\n                    case 2:\r\n                        return WrapMode.PingPong;\r\n                    case 3:\r\n                        return WrapMode.ClampForever;\r\n                    default:\r\n                        return WrapMode.Default;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Type Dropdown\r\n\r\n        public static System.Type TypeDropDown(Rect position, GUIContent label, \r\n                                               System.Type baseType, System.Type selectedType, \r\n                                               bool allowAbstractTypes = false, bool allowInterfaces = false, \r\n                                               System.Type defaultType = null, System.Type[] excludedTypes = null,\r\n                                               TypeDropDownListingStyle listType = TypeDropDownListingStyle.Namespace,\r\n                                               System.Predicate<System.Type> searchPredicate = null)\r\n        {\r\n            /*\r\n\r\n            if (!TypeUtil.IsType(selectedType, baseType)) selectedType = null;\r\n\r\n            //var knownTypes = (from ass in System.AppDomain.CurrentDomain.GetAssemblies()\r\n            //                  from tp in ass.GetTypes()\r\n            //                  where TypeUtil.IsType(tp, baseType) && (allowAbstractTypes || !tp.IsAbstract) && (allowInterfaces || !tp.IsInterface)\r\n            //                  orderby tp.FullName.Substring(tp.FullName.LastIndexOf(\".\") + 1) ascending\r\n            //                  select tp).ToArray();\r\n            var knownTypes = (from tp in TypeUtil.GetTypesAssignableFrom(baseType)\r\n                              where (allowAbstractTypes || !tp.IsAbstract) && (allowInterfaces || !tp.IsInterface) && (excludedTypes == null || System.Array.IndexOf(excludedTypes, tp) < 0)\r\n                              orderby tp.FullName.Substring(tp.FullName.LastIndexOf(\".\") + 1) ascending\r\n                              select tp).ToArray();\r\n            GUIContent[] knownTypeNames = null;\r\n            switch (listType)\r\n            {\r\n                case TypeDropDownListingStyle.Namespace:\r\n                    knownTypeNames = knownTypes.Select((tp) =>\r\n                    {\r\n                        return new GUIContent(tp.FullName.Replace(\".\", \"/\"));\r\n                    }).ToArray();\r\n                    break;\r\n                case TypeDropDownListingStyle.Flat:\r\n                    knownTypeNames = (from tp in knownTypes select new GUIContent(tp.Name)).ToArray();\r\n                    break;\r\n                case TypeDropDownListingStyle.ComponentMenu:\r\n                    knownTypeNames = knownTypes.Select((tp) =>\r\n                    {\r\n                        var menuAttrib = tp.GetCustomAttributes(typeof(AddComponentMenu), false).FirstOrDefault() as AddComponentMenu;\r\n                        if (menuAttrib != null && !string.IsNullOrEmpty(menuAttrib.componentMenu))\r\n                        {\r\n                            return new GUIContent(menuAttrib.componentMenu);\r\n                        }\r\n                        else if (tp.FullName == tp.Name)\r\n                        {\r\n                            return new GUIContent(\"Scripts/\" + tp.Name);\r\n                        }\r\n                        else\r\n                        {\r\n                            if (tp.FullName.StartsWith(\"UnityEngine.\"))\r\n                            {\r\n                                return new GUIContent(tp.FullName.Replace(\".\", \"/\"));\r\n                            }\r\n                            else\r\n                            {\r\n                                return new GUIContent(\"Scripts/\" + tp.FullName.Replace(\".\", \"/\"));\r\n                            }\r\n                        }\r\n                    }).ToArray();\r\n                    break;\r\n                default:\r\n                    knownTypeNames = new GUIContent[0];\r\n                    break;\r\n            }\r\n\r\n            if (defaultType == null)\r\n            {\r\n                knownTypes = knownTypes.Prepend(null).ToArray();\r\n                knownTypeNames = knownTypeNames.Prepend(new GUIContent(\"Nothing\")).ToArray();\r\n            }\r\n\r\n            int index = knownTypes.IndexOf(selectedType);\r\n            index = EditorGUI.Popup(position, label, index, knownTypeNames);\r\n            return (index >= 0) ? knownTypes[index] : defaultType;\r\n\r\n            */\r\n\r\n            return TypeSelectionDropDownWindow.Popup(position, label, baseType, selectedType, allowAbstractTypes, allowInterfaces, defaultType, excludedTypes, listType, searchPredicate);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Vector Field\r\n\r\n        public static Vector3 DelayedVector3Field(Rect position, GUIContent label, Vector3 value)\r\n        {\r\n            position = EditorGUI.PrefixLabel(position, label);\r\n\r\n            const float LBL_WIDTH = 13f;\r\n            float w = position.width / 3f;\r\n\r\n            EditorGUI.LabelField(new Rect(position.xMin, position.yMin, LBL_WIDTH, EditorGUIUtility.singleLineHeight), \"X\");\r\n            value.x = EditorGUI.DelayedFloatField(new Rect(position.xMin + LBL_WIDTH, position.yMin, w - LBL_WIDTH - 1f, EditorGUIUtility.singleLineHeight), value.x);\r\n            position = new Rect(position.xMin + w, position.yMin, position.width - w, position.height);\r\n\r\n            EditorGUI.LabelField(new Rect(position.xMin, position.yMin, LBL_WIDTH, EditorGUIUtility.singleLineHeight), \"Y\");\r\n            value.y = EditorGUI.DelayedFloatField(new Rect(position.xMin + LBL_WIDTH, position.yMin, w - LBL_WIDTH - 1f, EditorGUIUtility.singleLineHeight), value.y);\r\n            position = new Rect(position.xMin + w, position.yMin, position.width - w, position.height);\r\n\r\n            EditorGUI.LabelField(new Rect(position.xMin, position.yMin, LBL_WIDTH, EditorGUIUtility.singleLineHeight), \"Z\");\r\n            value.z = EditorGUI.DelayedFloatField(new Rect(position.xMin + LBL_WIDTH, position.yMin, w - LBL_WIDTH - 1f, EditorGUIUtility.singleLineHeight), value.z);\r\n            \r\n            return value;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Quaternion Field\r\n\r\n        public static Quaternion QuaternionField(Rect position, GUIContent label, Quaternion value, bool useRadians = false)\r\n        {\r\n            Vector3 vRot = value.eulerAngles;\r\n            if (useRadians)\r\n            {\r\n                vRot.x = vRot.x * Mathf.Deg2Rad;\r\n                vRot.y = vRot.y * Mathf.Deg2Rad;\r\n                vRot.z = vRot.z * Mathf.Deg2Rad;\r\n            }\r\n            \r\n            EditorGUI.BeginChangeCheck();\r\n            var vNewRot = DelayedVector3Field(position, label, vRot);\r\n            if(EditorGUI.EndChangeCheck())\r\n            {\r\n                //vNewRot.x = MathUtil.NormalizeAngle(vNewRot.x, useRadians);\r\n                //vNewRot.y = MathUtil.NormalizeAngle(vNewRot.y, useRadians);\r\n                //vNewRot.z = MathUtil.NormalizeAngle(vNewRot.z, useRadians);\r\n                if (useRadians)\r\n                {\r\n                    vNewRot.x = vNewRot.x * Mathf.Rad2Deg;\r\n                    vNewRot.y = vNewRot.y * Mathf.Rad2Deg;\r\n                    vNewRot.z = vNewRot.z * Mathf.Rad2Deg;\r\n                }\r\n                return Quaternion.Euler(vNewRot);\r\n            }\r\n            else\r\n            {\r\n                return value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IComponentField\r\n\r\n        public static Component ComponentField(Rect position, GUIContent label, Component value, System.Type inheritsFromType, bool allowSceneObjects)\r\n        {\r\n            //if (inheritsFromType == null) inheritsFromType = typeof(Component);\r\n            //else if (!typeof(Component).IsAssignableFrom(inheritsFromType) && !typeof(IComponent).IsAssignableFrom(inheritsFromType)) throw new TypeArgumentMismatchException(inheritsFromType, typeof(IComponent), \"Type must inherit from IComponent or Component.\", \"inheritsFromType\");\r\n            if (inheritsFromType == null) inheritsFromType = typeof(Component);\r\n            else if (!typeof(Component).IsAssignableFrom(inheritsFromType) && !inheritsFromType.IsInterface) throw new TypeArgumentMismatchException(inheritsFromType, typeof(IComponent), \"Type must inherit from Component or be an interface.\", \"inheritsFromType\");\r\n            if (value != null && !inheritsFromType.IsAssignableFrom(value.GetType())) throw new TypeArgumentMismatchException(value.GetType(), inheritsFromType, \"value must inherit from \" + inheritsFromType.Name, \"value\");\r\n\r\n            if (TypeUtil.IsType(inheritsFromType, typeof(Component)))\r\n            {\r\n                return EditorGUI.ObjectField(position, label, value, inheritsFromType, true) as Component;\r\n            }\r\n            else\r\n            {\r\n                value = EditorGUI.ObjectField(position, label, value, typeof(Component), true) as Component;\r\n                var go = GameObjectUtil.GetGameObjectFromSource(value);\r\n                if (go != null)\r\n                {\r\n                    return go.GetComponent(inheritsFromType);\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static Component ComponentField(Rect position, GUIContent label, Component value, System.Type inheritsFromType, bool allowSceneObjects, System.Type targetComponentType)\r\n        {\r\n            //if (inheritsFromType == null) inheritsFromType = typeof(Component);\r\n            //else if (!typeof(Component).IsAssignableFrom(inheritsFromType) && !typeof(IComponent).IsAssignableFrom(inheritsFromType)) throw new TypeArgumentMismatchException(inheritsFromType, typeof(IComponent), \"Type must inherit from IComponent or Component.\", \"inheritsFromType\");\r\n            if (inheritsFromType == null) inheritsFromType = typeof(Component);\r\n            else if (!typeof(Component).IsAssignableFrom(inheritsFromType) && !inheritsFromType.IsInterface) throw new TypeArgumentMismatchException(inheritsFromType, typeof(IComponent), \"Type must inherit from Component or be an interface.\", \"inheritsFromType\");\r\n            if (targetComponentType == null) throw new System.ArgumentNullException(\"targetComponentType\");\r\n            if (!typeof(Component).IsAssignableFrom(targetComponentType)) throw new TypeArgumentMismatchException(targetComponentType, typeof(Component), \"targetComponentType\");\r\n            if (value != null && !targetComponentType.IsAssignableFrom(value.GetType())) throw new TypeArgumentMismatchException(value.GetType(), inheritsFromType, \"value must inherit from \" + inheritsFromType.Name, \"value\");\r\n\r\n            if (TypeUtil.IsType(inheritsFromType, typeof(Component)))\r\n            {\r\n                return EditorGUI.ObjectField(position, label, value, inheritsFromType, true) as Component;\r\n            }\r\n            else\r\n            {\r\n                value = EditorGUI.ObjectField(position, label, value, typeof(Component), true) as Component;\r\n                var go = GameObjectUtil.GetGameObjectFromSource(value);\r\n                if (go != null)\r\n                {\r\n                    foreach (var c in go.GetComponents(inheritsFromType))\r\n                    {\r\n                        if (TypeUtil.IsType(c.GetType(), targetComponentType))\r\n                        {\r\n                            return c as Component;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Path Textfields\r\n\r\n        public const float ELLIPSIS_BTN_WIDTH = 22f;\r\n        public static string FolderPathTextfield(Rect position, string label, string path, string popupTitle)\r\n        {\r\n            return FolderPathTextfield(position, EditorHelper.TempContent(label), path, popupTitle);\r\n        }\r\n        public static string FolderPathTextfield(Rect position, GUIContent label, string path, string popupTitle)\r\n        {\r\n            position = EditorGUI.PrefixLabel(position, label);\r\n\r\n            float w1 = Mathf.Max(position.width - ELLIPSIS_BTN_WIDTH, 0f);\r\n            float w2 = Mathf.Clamp(ELLIPSIS_BTN_WIDTH, 0f, position.width - w1);\r\n            var r1 = new Rect(position.xMin, position.yMin, w1, EditorGUIUtility.singleLineHeight);\r\n            var r2 = new Rect(r1.xMax, position.yMin, w2, EditorGUIUtility.singleLineHeight);\r\n            path = EditorGUI.TextField(r1, path);\r\n            if (GUI.Button(r2, \"...\"))\r\n            {\r\n                var result = EditorUtility.OpenFolderPanel(popupTitle, path, string.Empty);\r\n                if (!string.IsNullOrEmpty(result))\r\n                {\r\n                    path = result;\r\n                }\r\n            }\r\n            return path;\r\n        }\r\n\r\n        public static string SaveFilePathTextfield(Rect position, string label, string path, string popupTitle, string extension)\r\n        {\r\n            return SaveFilePathTextfield(position, EditorHelper.TempContent(label), path, popupTitle, extension);\r\n        }\r\n        public static string SaveFilePathTextfield(Rect position, GUIContent label, string path, string popupTitle, string extension)\r\n        {\r\n            position = EditorGUI.PrefixLabel(position, label);\r\n\r\n            float w1 = Mathf.Max(position.width - ELLIPSIS_BTN_WIDTH, 0f);\r\n            float w2 = Mathf.Clamp(ELLIPSIS_BTN_WIDTH, 0f, position.width - w1);\r\n            var r1 = new Rect(position.xMin, position.yMin, w1, EditorGUIUtility.singleLineHeight);\r\n            var r2 = new Rect(r1.xMax, position.yMin, w2, EditorGUIUtility.singleLineHeight);\r\n            path = EditorGUI.TextField(r1, path);\r\n            if (GUI.Button(r2, \"...\"))\r\n            {\r\n                var result = EditorUtility.SaveFilePanel(popupTitle, System.IO.Path.GetDirectoryName(path), System.IO.Path.GetFileName(path), extension);\r\n                if (!string.IsNullOrEmpty(result))\r\n                {\r\n                    path = result;\r\n                }\r\n            }\r\n            return path;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n\r\n\r\n        #region Component Selection From Source\r\n\r\n        public static Component SelectComponentFromSourceField(Rect position, string label, GameObject source, Component selectedComp, System.Predicate<Component> filter = null)\r\n        {\r\n            return SelectComponentFromSourceField(position, EditorHelper.TempContent(label), source, selectedComp, filter);\r\n        }\r\n\r\n        public static Component SelectComponentFromSourceField(Rect position, GUIContent label, GameObject source, Component selectedComp, System.Predicate<Component> filter = null)\r\n        {\r\n            if (source == null)\r\n            {\r\n\r\n            }\r\n\r\n            //var selectedType = (selectedComp != null) ? selectedComp.GetType() : null;\r\n            //System.Type[] availableMechanismTypes;\r\n            //if (filter != null)\r\n            //    availableMechanismTypes = (from c in source.GetComponents<Component>() where filter(c) select c.GetType()).ToArray();\r\n            //else\r\n            //    availableMechanismTypes = (from c in source.GetComponents<Component>() select c.GetType()).ToArray();\r\n            //var availableMechanismTypeNames = availableMechanismTypes.Select((tp) => EditorHelper.TempContent(tp.Name)).ToArray();\r\n\r\n            //var index = System.Array.IndexOf(availableMechanismTypes, selectedType);\r\n            //index = EditorGUI.Popup(position, label, index, availableMechanismTypeNames);\r\n            //return (index >= 0) ? source.GetComponent(availableMechanismTypes[index]) : null;\r\n\r\n            Component[] components;\r\n            if (filter != null)\r\n                components = (from c in source.GetComponents<Component>() where filter(c) select c).ToArray();\r\n            else\r\n                components = source.GetComponents<Component>();\r\n\r\n            return SelectComponentField(position, label, components, selectedComp);\r\n        }\r\n\r\n        public static Component SelectComponentField(Rect position, string label, Component[] components, Component selectedComp)\r\n        {\r\n            return SelectComponentField(position, EditorHelper.TempContent(label), components, selectedComp);\r\n        }\r\n\r\n        public static Component SelectComponentField(Rect position, GUIContent label, Component[] components, Component selectedComp)\r\n        {\r\n            if (components == null) throw new System.ArgumentNullException(\"components\");\r\n\r\n            System.Type[] availableMechanismTypes = (from c in components select c.GetType()).ToArray();\r\n            var availableMechanismTypeNames = availableMechanismTypes.Select((tp) => EditorHelper.TempContent(tp.Name)).ToArray();\r\n\r\n            var index = System.Array.IndexOf(components, selectedComp);\r\n            index = EditorGUI.Popup(position, label, index, availableMechanismTypeNames);\r\n            return (index >= 0) ? components[index] : null;\r\n        }\r\n\r\n        public static Component SelectComponentField(Rect position, string label, Component[] components, string[] componentLabels, Component selectedComp)\r\n        {\r\n            if (components == null) throw new System.ArgumentNullException(\"components\");\r\n            if (componentLabels == null || componentLabels.Length != components.Length) throw new System.ArgumentException(\"Component Labels collection must be the same size as the component collection.\", \"componentLabels\");\r\n\r\n            var index = System.Array.IndexOf(components, selectedComp);\r\n            index = EditorGUI.Popup(position, label, index, componentLabels);\r\n            return (index >= 0) ? components[index] : null;\r\n        }\r\n\r\n        public static Component SelectComponentField(Rect position, GUIContent label, Component[] components, GUIContent[] componentLabels, Component selectedComp)\r\n        {\r\n            if (components == null) throw new System.ArgumentNullException(\"components\");\r\n            if (componentLabels == null || componentLabels.Length != components.Length) throw new System.ArgumentException(\"Component Labels collection must be the same size as the component collection.\", \"componentLabels\");\r\n\r\n            var index = System.Array.IndexOf(components, selectedComp);\r\n            index = EditorGUI.Popup(position, label, index, componentLabels);\r\n            return (index >= 0) ? components[index] : null;\r\n        }\r\n\r\n        #endregion\r\n        \r\n\r\n\r\n\r\n\r\n        #region Curve Swatch\r\n\r\n        public static void DrawCurveSwatch(Rect position, ICurve curve, Color color, Color bgColor)\r\n        {\r\n            if (Event.current.type != EventType.Repaint)\r\n                return;\r\n            int previewWidth = (int)position.width;\r\n            int previewHeight = (int)position.height;\r\n            Color color1 = GUI.color;\r\n            GUI.color = bgColor;\r\n            EditorHelper.WhiteTextureStyle.Draw(position, false, false, false, false);\r\n            GUI.color = color1;\r\n\r\n            if (curve == null) return;\r\n\r\n            Texture2D tex = GetCurveTexture(Mathf.RoundToInt(position.width), Mathf.RoundToInt(position.height), curve, color);\r\n            GUIStyle basicTextureStyle = GetCurveTextureStyle(tex);\r\n            position.width = (float)tex.width;\r\n            position.height = (float)tex.height;\r\n            basicTextureStyle.Draw(position, false, false, false, false);\r\n        }\r\n\r\n\r\n        private static Texture2D s_CurveTexture;\r\n        private static GUIStyle s_CurveTextureStyle;\r\n        private static Texture2D GetCurveTexture(int width, int height, ICurve curve, Color color)\r\n        {\r\n            if (s_CurveTexture == null)\r\n                s_CurveTexture = new Texture2D(width, height);\r\n            else\r\n                s_CurveTexture.Resize(width, height);\r\n\r\n            var c = new Color(1f, 1f, 1f, 0f);\r\n            var pixels = s_CurveTexture.GetPixels();\r\n            for (int i = 0; i < pixels.Length; i++) pixels[i] = c;\r\n            s_CurveTexture.SetPixels(pixels);\r\n\r\n            for (int i = 0; i < s_CurveTexture.width; i++)\r\n            {\r\n                var t = (float)i / (float)width;\r\n                int j = (int)(curve.GetPosition(t) * height);\r\n                s_CurveTexture.SetPixel(i, j, color);\r\n            }\r\n\r\n            s_CurveTexture.Apply();\r\n            return s_CurveTexture;\r\n        }\r\n        private static GUIStyle GetCurveTextureStyle(Texture2D tex)\r\n        {\r\n            if (s_CurveTextureStyle == null)\r\n                s_CurveTextureStyle = new GUIStyle();\r\n            s_CurveTextureStyle.normal.background = tex;\r\n            return s_CurveTextureStyle;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ReflectedPropertyField\r\n\r\n        /// <summary>\r\n        /// Reflects the available properties and shows them in a dropdown\r\n        /// </summary>\r\n        public static string ReflectedPropertyField(Rect position, GUIContent label, object targObj, string selectedMemberName, DynamicMemberAccess access, out System.Reflection.MemberInfo selectedMember, bool allowSetterMethods = false)\r\n        {\r\n            if (targObj is IDynamic || targObj is IProxy)\r\n            {\r\n                var mask = allowSetterMethods ? System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property | System.Reflection.MemberTypes.Method : System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property;\r\n                System.Reflection.MemberInfo[] members = null;\r\n                System.Type targTp = null;\r\n                if (targObj is IDynamic)\r\n                {\r\n                    targTp = targObj.GetType();\r\n                    members = DynamicUtil.GetEasilySerializedMembers(targObj, mask, access).ToArray();\r\n                }\r\n                else if (targObj is IProxy)\r\n                {\r\n                    targTp = (targObj as IProxy).GetTargetType();\r\n                    members = DynamicUtil.GetEasilySerializedMembersFromType(targTp, mask, access).ToArray();\r\n                }\r\n                else\r\n                {\r\n                    targTp = typeof(object);\r\n                    members = ArrayUtil.Empty<System.Reflection.MemberInfo>();\r\n                }\r\n                var entries = new GUIContent[members.Length + 1];\r\n\r\n                int index = -1;\r\n                for (int i = 0; i < members.Length; i++)\r\n                {\r\n                    var m = members[i];\r\n                    if ((DynamicUtil.GetMemberAccessLevel(m) & DynamicMemberAccess.Write) != 0)\r\n                        entries[i] = EditorHelper.TempContent(string.Format(\"{0} ({1}) -> {2}\", m.Name, DynamicUtil.GetReturnType(m).Name, EditorHelper.GetValueWithMemberSafe(m, targObj, true)));\r\n                    else\r\n                        entries[i] = EditorHelper.TempContent(string.Format(\"{0} (readonly - {1}) -> {2}\", m.Name, DynamicUtil.GetReturnType(m).Name, EditorHelper.GetValueWithMemberSafe(m, targObj, true)));\r\n\r\n                    if (index < 0 && m.Name == selectedMemberName)\r\n                    {\r\n                        index = i;\r\n                    }\r\n                }\r\n\r\n                entries[entries.Length - 1] = EditorHelper.TempContent(\"...Custom\");\r\n                if (index < 0)\r\n                    index = entries.Length - 1;\r\n\r\n                if(index < members.Length)\r\n                {\r\n                    index = EditorGUI.Popup(position, label, index, entries);\r\n                    selectedMember = (index >= 0 && index < members.Length) ? members[index] : null;\r\n                    return (selectedMember != null) ? selectedMember.Name : null;\r\n                }\r\n                else\r\n                {\r\n                    position = EditorGUI.PrefixLabel(position, label);\r\n                    var r0 = new Rect(position.xMin, position.yMin, position.width / 2f, position.height);\r\n                    var r1 = new Rect(r0.xMax, r0.yMin, position.width - r0.width, r0.height);\r\n                    index = EditorGUI.Popup(r0, index, entries);\r\n                    if (index < members.Length)\r\n                    {\r\n                        selectedMember = (index >= 0) ? members[index] : null;\r\n                        return (selectedMember != null) ? selectedMember.Name : null;\r\n                    }\r\n                    else\r\n                    {\r\n                        selectedMemberName = EditorGUI.TextField(r1, selectedMemberName);\r\n                        selectedMember = new DynamicPropertyInfo(selectedMemberName, targTp, typeof(Variant));\r\n                        return selectedMemberName;\r\n                    }\r\n                }\r\n            }\r\n            else if (targObj != null)\r\n            {\r\n                var members = DynamicUtil.GetEasilySerializedMembers(targObj, System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property | System.Reflection.MemberTypes.Method, access).ToArray();\r\n                var entries = new GUIContent[members.Length];\r\n\r\n                int index = -1;\r\n                for (int i = 0; i < members.Length; i++)\r\n                {\r\n                    var m = members[i];\r\n                    if((DynamicUtil.GetMemberAccessLevel(m) & DynamicMemberAccess.Write) != 0)\r\n                        entries[i] = EditorHelper.TempContent(string.Format(\"{0} ({1}) -> {2}\", m.Name, DynamicUtil.GetReturnType(m).Name, EditorHelper.GetValueWithMemberSafe(m, targObj, true)));\r\n                    else\r\n                        entries[i] = EditorHelper.TempContent(string.Format(\"{0} (readonly - {1}) -> {2}\", m.Name, DynamicUtil.GetReturnType(m).Name, EditorHelper.GetValueWithMemberSafe(m, targObj, true)));\r\n\r\n                    if (index < 0 && m.Name == selectedMemberName)\r\n                    {\r\n                        index = i;\r\n                    }\r\n                }\r\n                \r\n                index = EditorGUI.Popup(position, label, index, entries);\r\n                selectedMember = (index >= 0) ? members[index] : null;\r\n                return (selectedMember != null) ? selectedMember.Name : null;\r\n            }\r\n            else\r\n            {\r\n                selectedMember = null;\r\n                EditorGUI.Popup(position, label, -1, new GUIContent[0]);\r\n                return null;\r\n            }\r\n        }\r\n        \r\n        public static string ReflectedPropertyField(Rect position, GUIContent label, object targObj, string selectedMemberName, DynamicMemberAccess access, bool allowSetterMethods = false)\r\n        {\r\n            System.Reflection.MemberInfo selectedMember;\r\n            return ReflectedPropertyField(position, label, targObj, selectedMemberName, access, out selectedMember, allowSetterMethods);\r\n        }\r\n\r\n        public static string ReflectedPropertyField(Rect position, object targObj, string selectedMemberName, DynamicMemberAccess access, out System.Reflection.MemberInfo selectedMember, bool allowSetterMethods = false)\r\n        {\r\n            return ReflectedPropertyField(position, GUIContent.none, targObj, selectedMemberName, access, out selectedMember, allowSetterMethods);\r\n        }\r\n\r\n        public static string ReflectedPropertyField(Rect position, object targObj, string selectedMemberName, DynamicMemberAccess access, bool allowSetterMethods = false)\r\n        {\r\n            System.Reflection.MemberInfo selectedMember;\r\n            return ReflectedPropertyField(position, GUIContent.none, targObj, selectedMemberName, access, out selectedMember, allowSetterMethods);\r\n        }\r\n\r\n\r\n\r\n        /// <summary>\r\n        /// Reflects the available properties and shows them in a dropdown\r\n        /// </summary>\r\n        public static string ReflectedPropertyField(Rect position, GUIContent label, System.Type targType, string selectedMemberName, out System.Reflection.MemberInfo selectedMember, bool allowSetterMethods = false)\r\n        {\r\n            if (targType != null)\r\n            {\r\n                var mask = allowSetterMethods ? System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property | System.Reflection.MemberTypes.Method : System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property;\r\n                var members = com.spacepuppy.Dynamic.DynamicUtil.GetEasilySerializedMembersFromType(targType, mask).ToArray();\r\n\r\n                int index = -1;\r\n                for (int i = 0; i < members.Length; i++)\r\n                {\r\n                    if (members[i].Name == selectedMemberName)\r\n                    {\r\n                        index = i;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                index = EditorGUI.Popup(position, label, index, (from m in members select new GUIContent(string.Format(\"{0} ({1})\", m.Name, DynamicUtil.GetReturnType(m).Name))).ToArray());\r\n                selectedMember = (index >= 0) ? members[index] : null;\r\n                return (selectedMember != null) ? selectedMember.Name : null;\r\n            }\r\n            else\r\n            {\r\n                selectedMember = null;\r\n                EditorGUI.Popup(position, label, -1, new GUIContent[0]);\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public static string ReflectedPropertyField(Rect position, GUIContent label, System.Type targType, string selectedMemberName, bool allowSetterMethods = false)\r\n        {\r\n            System.Reflection.MemberInfo selectedMember;\r\n            return ReflectedPropertyField(position, label, targType, selectedMemberName, out selectedMember, allowSetterMethods);\r\n        }\r\n\r\n        public static string ReflectedPropertyField(Rect position, System.Type targType, string selectedMemberName, out System.Reflection.MemberInfo selectedMember, bool allowSetterMethods = false)\r\n        {\r\n            return ReflectedPropertyField(position, GUIContent.none, targType, selectedMemberName, out selectedMember, allowSetterMethods);\r\n        }\r\n\r\n        public static string ReflectedPropertyField(Rect position, System.Type targType, string selectedMemberName, bool allowSetterMethods = false)\r\n        {\r\n            System.Reflection.MemberInfo selectedMember;\r\n            return ReflectedPropertyField(position, GUIContent.none, targType, selectedMemberName, out selectedMember, allowSetterMethods);\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region X Button\r\n\r\n        public const float X_BTN_WIDTH = 30f;\r\n        public static bool XButton(Vector2 pos, string tooltip = null)\r\n        {\r\n            var r = new Rect(pos.x, pos.y, X_BTN_WIDTH, EditorGUIUtility.singleLineHeight);\r\n            return GUI.Button(r, EditorHelper.TempContent(\"X\", tooltip));\r\n        }\r\n        public static bool XButton(Rect position, string tooltip = null)\r\n        {\r\n            var r = new Rect(position.xMin, position.yMin, Mathf.Min(X_BTN_WIDTH, position.width), EditorGUIUtility.singleLineHeight);\r\n            return GUI.Button(r, EditorHelper.TempContent(\"X\", tooltip));\r\n        }\r\n        public static bool XButton(ref Rect position, string tooltip = null, bool rightSide = true)\r\n        {\r\n            var w = Mathf.Min(X_BTN_WIDTH, position.width);\r\n            Rect r;\r\n            if(rightSide)\r\n            {\r\n                r = new Rect(position.xMax - w, position.yMin, w, EditorGUIUtility.singleLineHeight);\r\n                position = new Rect(position.xMin, position.yMin, position.width - w, position.height);\r\n            }\r\n            else\r\n            {\r\n                r = new Rect(position.xMin, position.yMin, w, EditorGUIUtility.singleLineHeight);\r\n                position = new Rect(r.xMax, position.yMin, position.width - w, position.height);\r\n            }\r\n\r\n            return GUI.Button(r, EditorHelper.TempContent(\"X\", tooltip));\r\n        }\r\n\r\n        public static bool PlayButton(ref Rect position, string tooltip = null, bool rightSide = true)\r\n        {\r\n            var w = Mathf.Min(X_BTN_WIDTH, position.width);\r\n            Rect r;\r\n            if (rightSide)\r\n            {\r\n                r = new Rect(position.xMax - w, position.yMin, w, EditorGUIUtility.singleLineHeight);\r\n                position = new Rect(position.xMin, position.yMin, position.width - w, position.height);\r\n            }\r\n            else\r\n            {\r\n                r = new Rect(position.xMin, position.yMin, w, EditorGUIUtility.singleLineHeight);\r\n                position = new Rect(r.xMax, position.yMin, position.width - w, position.height);\r\n            }\r\n\r\n            return GUI.Button(r, EditorHelper.TempContent(\">\", tooltip));\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/SPEditorGUILayout.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n\r\n    public static class SPEditorGUILayout\r\n    {\r\n\r\n        #region DefaultPropertyField\r\n\r\n        public static bool DefaultPropertyField(SerializedProperty property)\r\n        {\r\n            //return com.spacepuppyeditor.Internal.DefaultPropertyHandler.Instance.OnGUILayout(property, GUIContent.none, false, null);\r\n            return com.spacepuppyeditor.Internal.ScriptAttributeUtility.SharedNullPropertyHandler.OnGUILayout(property, GUIContent.none, false, null);\r\n        }\r\n\r\n        public static bool DefaultPropertyField(SerializedProperty property, GUIContent label)\r\n        {\r\n            //return com.spacepuppyeditor.Internal.DefaultPropertyHandler.Instance.OnGUILayout(property, label, false, null);\r\n            return com.spacepuppyeditor.Internal.ScriptAttributeUtility.SharedNullPropertyHandler.OnGUILayout(property, label, false, null);\r\n        }\r\n\r\n        public static bool DefaultPropertyField(SerializedProperty property, GUIContent label, bool includeChildren)\r\n        {\r\n            //return com.spacepuppyeditor.Internal.DefaultPropertyHandler.Instance.OnGUILayout(property, label, false, null);\r\n            return com.spacepuppyeditor.Internal.ScriptAttributeUtility.SharedNullPropertyHandler.OnGUILayout(property, label, includeChildren, null);\r\n        }\r\n\r\n        public static object DefaultPropertyField(string label, object value, System.Type valueType)\r\n        {\r\n            return SPEditorGUI.DefaultPropertyField(EditorGUILayout.GetControlRect(true), EditorHelper.TempContent(label), value, valueType);\r\n        }\r\n\r\n        public static object DefaultPropertyField(GUIContent label, object value, System.Type valueType)\r\n        {\r\n            return SPEditorGUI.DefaultPropertyField(EditorGUILayout.GetControlRect(true), label, value, valueType);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region PropertyFields\r\n\r\n        public static bool PropertyField(SerializedObject obj, string prop)\r\n        {\r\n            if (obj == null) throw new System.ArgumentNullException(\"obj\");\r\n\r\n            var serial = obj.FindProperty(prop);\r\n            if (serial != null)\r\n            {\r\n                EditorGUI.BeginChangeCheck();\r\n                //EditorGUILayout.PropertyField(serial);\r\n                SPEditorGUILayout.PropertyField(serial);\r\n                return EditorGUI.EndChangeCheck();\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool PropertyField(SerializedObject obj, string prop, bool includeChildren)\r\n        {\r\n            if (obj == null) throw new System.ArgumentNullException(\"obj\");\r\n\r\n            var serial = obj.FindProperty(prop);\r\n            if (serial != null)\r\n            {\r\n                EditorGUI.BeginChangeCheck();\r\n                //EditorGUILayout.PropertyField(serial, includeChildren);\r\n                SPEditorGUILayout.PropertyField(serial, includeChildren);\r\n                return EditorGUI.EndChangeCheck();\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool PropertyField(SerializedObject obj, string prop, string label, bool includeChildren)\r\n        {\r\n            return SPEditorGUILayout.PropertyField(obj, prop, EditorHelper.TempContent(label), includeChildren);\r\n        }\r\n\r\n        public static bool PropertyField(SerializedObject obj, string prop, GUIContent label, bool includeChildren)\r\n        {\r\n            if (obj == null) throw new System.ArgumentNullException(\"obj\");\r\n\r\n            var serial = obj.FindProperty(prop);\r\n            if (serial != null)\r\n            {\r\n                EditorGUI.BeginChangeCheck();\r\n                //EditorGUILayout.PropertyField(serial, label, includeChildren);\r\n                SPEditorGUILayout.PropertyField(serial, label, includeChildren);\r\n                return EditorGUI.EndChangeCheck();\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool PropertyField(SerializedProperty property, params GUILayoutOption[] options)\r\n        {\r\n            return SPEditorGUILayout.PropertyField(property, (GUIContent)null, false, options);\r\n        }\r\n\r\n        public static bool PropertyField(SerializedProperty property, GUIContent label, params GUILayoutOption[] options)\r\n        {\r\n            return SPEditorGUILayout.PropertyField(property, label, false, options);\r\n        }\r\n\r\n        public static bool PropertyField(SerializedProperty property, bool includeChildren, params GUILayoutOption[] options)\r\n        {\r\n            return com.spacepuppyeditor.Internal.ScriptAttributeUtility.GetHandler(property).OnGUILayout(property, null, includeChildren, options);\r\n        }\r\n\r\n        public static bool PropertyField(SerializedProperty property, GUIContent label, bool includeChildren, params GUILayoutOption[] options)\r\n        {\r\n            return com.spacepuppyeditor.Internal.ScriptAttributeUtility.GetHandler(property).OnGUILayout(property, label, includeChildren, options);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region FlatPropertyField\r\n\r\n        /// <summary>\r\n        /// Draws all children of a property\r\n        /// </summary>\r\n        /// <param name=\"position\"></param>\r\n        /// <param name=\"property\"></param>\r\n        /// <returns></returns>\r\n        public static bool FlatChildPropertyField(SerializedProperty property)\r\n        {\r\n            if (property == null) throw new System.ArgumentNullException(\"property\");\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            var iterator = property.Copy();\r\n            var end = property.GetEndProperty();\r\n            for (bool enterChildren = true; iterator.NextVisible(enterChildren); enterChildren = false)\r\n            {\r\n                if (SerializedProperty.EqualContents(iterator, end))\r\n                    break;\r\n                \r\n                PropertyField(iterator, EditorHelper.TempContent(iterator.displayName, iterator.tooltip), true);\r\n            }\r\n            return EditorGUI.EndChangeCheck();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region LayerMaskField\r\n\r\n        public static LayerMask LayerMaskField(string label, int selectedMask)\r\n        {\r\n            return EditorGUILayout.MaskField(label, selectedMask, LayerUtil.GetAllLayerNames());\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region EnumPopup Inspector\r\n\r\n        public static System.Enum EnumPopup(System.Enum enumValue)\r\n        {\r\n            return SPEditorGUI.EnumPopup(EditorGUILayout.GetControlRect(false), enumValue);\r\n        }\r\n\r\n        public static System.Enum EnumPopup(string label, System.Enum enumValue)\r\n        {\r\n            return SPEditorGUI.EnumPopup(EditorGUILayout.GetControlRect(true), EditorHelper.TempContent(label), enumValue);\r\n        }\r\n\r\n        public static System.Enum EnumPopup(GUIContent label, System.Enum enumValue)\r\n        {\r\n            return SPEditorGUI.EnumPopup(EditorGUILayout.GetControlRect(label != null && label != GUIContent.none), label, enumValue);\r\n        }\r\n\r\n        public static System.Enum EnumPopupExcluding(System.Enum enumValue, params System.Enum[] ignoredValues)\r\n        {\r\n            return SPEditorGUI.EnumPopupExcluding(EditorGUILayout.GetControlRect(false), enumValue, ignoredValues);\r\n        }\r\n\r\n        public static System.Enum EnumPopupExcluding(string label, System.Enum enumValue, params System.Enum[] ignoredValues)\r\n        {\r\n            return SPEditorGUI.EnumPopupExcluding(EditorGUILayout.GetControlRect(true), EditorHelper.TempContent(label), enumValue, ignoredValues);\r\n        }\r\n\r\n        public static System.Enum EnumPopupExcluding(GUIContent label, System.Enum enumValue, params System.Enum[] ignoredValues)\r\n        {\r\n            return SPEditorGUI.EnumPopupExcluding(EditorGUILayout.GetControlRect(label != null && label != GUIContent.none), label, enumValue, ignoredValues);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Option Popup w/ Custom\r\n\r\n        public static string OptionPopupWithCustom(string label, string value, string[] options)\r\n        {\r\n            return SPEditorGUI.OptionPopupWithCustom(EditorGUILayout.GetControlRect(false), label, value, options);\r\n        }\r\n\r\n        public static string OptionPopupWithCustom(GUIContent label, string value, string[] options)\r\n        {\r\n            return SPEditorGUI.OptionPopupWithCustom(EditorGUILayout.GetControlRect(false), label, value, options);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region EnumFlag Inspector\r\n\r\n        public static int EnumFlagField(System.Type enumType, int value)\r\n        {\r\n            //var names = (from e in EnumUtil.GetUniqueEnumFlags(enumType) select e.ToString()).ToArray();\r\n            //return EditorGUILayout.MaskField(value, names);\r\n\r\n            var enums = EnumUtil.GetUniqueEnumFlags(enumType).ToArray();\r\n            var names = (from e in enums select e.ToString()).ToArray();\r\n            int mask = EditorHelper.ConvertEnumMaskToPopupMask(value, enums);\r\n            mask = EditorGUILayout.MaskField(mask, names);\r\n            return EditorHelper.ConvertPopupMaskToEnumMask(mask, enums);\r\n        }\r\n\r\n        public static System.Enum EnumFlagField(System.Enum value)\r\n        {\r\n            if (value == null) throw new System.ArgumentException(\"Enum value must be non-null.\", \"value\");\r\n\r\n            var enumType = value.GetType();\r\n            int i = EnumFlagField(enumType, System.Convert.ToInt32(value));\r\n            return System.Enum.ToObject(enumType, i) as System.Enum;\r\n        }\r\n\r\n        public static int EnumFlagField(System.Type enumType, GUIContent label, int value)\r\n        {\r\n            //var names = (from e in EnumUtil.GetUniqueEnumFlags(enumType) select e.ToString()).ToArray();\r\n            //return EditorGUILayout.MaskField(label, value, names);\r\n\r\n            var enums = EnumUtil.GetUniqueEnumFlags(enumType).ToArray();\r\n            var names = (from e in enums select e.ToString()).ToArray();\r\n            int mask = EditorHelper.ConvertEnumMaskToPopupMask(value, enums);\r\n            mask = EditorGUILayout.MaskField(mask, names);\r\n            return EditorHelper.ConvertPopupMaskToEnumMask(mask, enums);\r\n        }\r\n\r\n        public static System.Enum EnumFlagField(GUIContent label, System.Enum value)\r\n        {\r\n            if (value == null) throw new System.ArgumentException(\"Enum value must be non-null.\", \"value\");\r\n\r\n            var enumType = value.GetType();\r\n            int i = EnumFlagField(enumType, label, System.Convert.ToInt32(value));\r\n            return System.Enum.ToObject(enumType, i) as System.Enum;\r\n        }\r\n\r\n        public static int EnumFlagField(System.Type enumType, int[] acceptedFlags, GUIContent label, int value)\r\n        {\r\n            var position = EditorGUILayout.GetControlRect(true);\r\n            return SPEditorGUI.EnumFlagField(position, enumType, acceptedFlags, label, value);\r\n        }\r\n\r\n        public static WrapMode WrapModeField(string label, WrapMode mode, bool allowDefault = false)\r\n        {\r\n            var position = EditorGUILayout.GetControlRect(true);\r\n            return SPEditorGUI.WrapModeField(position, label, mode, allowDefault);\r\n        }\r\n\r\n        public static WrapMode WrapModeField(GUIContent label, WrapMode mode, bool allowDefault = false)\r\n        {\r\n            var position = EditorGUILayout.GetControlRect(label != null && label != GUIContent.none);\r\n            return SPEditorGUI.WrapModeField(position, label, mode, allowDefault);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Type Dropdown\r\n\r\n        public static System.Type TypeDropDown(GUIContent label, \r\n                                               System.Type baseType, System.Type selectedType, \r\n                                               bool allowAbstractTypes = false, bool allowInterfaces = false, \r\n                                               System.Type defaultType = null, System.Type[] excludedTypes = null, \r\n                                               TypeDropDownListingStyle listType = TypeDropDownListingStyle.Namespace,\r\n                                               System.Predicate<System.Type> searchPredicate = null)\r\n        {\r\n            var position = EditorGUILayout.GetControlRect(true);\r\n            return SPEditorGUI.TypeDropDown(position, label, baseType, selectedType, allowAbstractTypes, allowInterfaces, defaultType, excludedTypes, listType, searchPredicate);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Quaternion Field\r\n\r\n        public static Quaternion QuaternionField(GUIContent label, Quaternion value, bool useRadians = false)\r\n        {\r\n            var position = EditorGUILayout.GetControlRect(true);\r\n            return SPEditorGUI.QuaternionField(position, label, value, useRadians);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IComponentField\r\n\r\n        public static Component ComponentField(GUIContent label, Component value, System.Type inheritsFromType, bool allowSceneObjects)\r\n        {\r\n            var position = EditorGUILayout.GetControlRect(true);\r\n            return SPEditorGUI.ComponentField(position, label, value, inheritsFromType, allowSceneObjects);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Component Selection From Source\r\n\r\n        public static Component SelectComponentFromSourceField(string label, GameObject source, Component selectedComp, System.Predicate<Component> filter = null)\r\n        {\r\n            var position = EditorGUILayout.GetControlRect(true);\r\n            return SPEditorGUI.SelectComponentFromSourceField(position, EditorHelper.TempContent(label), source, selectedComp, filter);\r\n        }\r\n\r\n        public static Component SelectComponentFromSourceField(GUIContent label, GameObject source, Component selectedComp, System.Predicate<Component> filter = null)\r\n        {\r\n            var position = EditorGUILayout.GetControlRect(true);\r\n            return SPEditorGUI.SelectComponentFromSourceField(position, label, source, selectedComp, filter);\r\n        }\r\n\r\n        public static Component SelectComponentField(string label, Component[] components, Component selectedComp)\r\n        {\r\n            var position = EditorGUILayout.GetControlRect(true);\r\n            return SPEditorGUI.SelectComponentField(position, EditorHelper.TempContent(label), components, selectedComp);\r\n        }\r\n\r\n        public static Component SelectComponentField(GUIContent label, Component[] components, Component selectedComp)\r\n        {\r\n            var position = EditorGUILayout.GetControlRect(true);\r\n            return SPEditorGUI.SelectComponentField(position, label, components, selectedComp);\r\n        }\r\n\r\n        public static Component SelectComponentField(string label, Component[] components, string[] componentLabels, Component selectedComp)\r\n        {\r\n            var position = EditorGUILayout.GetControlRect(true);\r\n            return SPEditorGUI.SelectComponentField(position, label, components, componentLabels, selectedComp);\r\n        }\r\n\r\n        public static Component SelectComponentField(GUIContent label, Component[] components, GUIContent[] componentLabels, Component selectedComp)\r\n        {\r\n            var position = EditorGUILayout.GetControlRect(true);\r\n            return SPEditorGUI.SelectComponentField(position, label, components, componentLabels, selectedComp);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Path Textfields\r\n        \r\n        public static string FolderPathTextfield(string label, string path, string popupTitle)\r\n        {\r\n            return SPEditorGUI.FolderPathTextfield(EditorGUILayout.GetControlRect(true), label, path, popupTitle);\r\n        }\r\n        public static string FolderPathTextfield(GUIContent label, string path, string popupTitle)\r\n        {\r\n            return SPEditorGUI.FolderPathTextfield(EditorGUILayout.GetControlRect(true), label, path, popupTitle);\r\n        }\r\n\r\n        public static string SaveFilePathTextfield(string label, string path, string popupTitle, string extension)\r\n        {\r\n            return SPEditorGUI.SaveFilePathTextfield(EditorGUILayout.GetControlRect(true), label, path, popupTitle, extension);\r\n        }\r\n        public static string SaveFilePathTextfield(GUIContent label, string path, string popupTitle, string extension)\r\n        {\r\n            return SPEditorGUI.SaveFilePathTextfield(EditorGUILayout.GetControlRect(true), label, path, popupTitle, extension);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region ReflectedPropertyField\r\n\r\n        /// <summary>\r\n        /// Reflects the available properties and shows them in a dropdown\r\n        /// </summary>\r\n        public static string ReflectedPropertyField(GUIContent label, object targObj, string selectedMemberName, com.spacepuppy.Dynamic.DynamicMemberAccess access, out System.Reflection.MemberInfo selectedMember, bool allowSetterMethods = false)\r\n        {\r\n            var position = EditorGUILayout.GetControlRect(label == GUIContent.none);\r\n            return SPEditorGUI.ReflectedPropertyField(position, label, targObj, selectedMemberName, access, out selectedMember, allowSetterMethods);\r\n        }\r\n\r\n        public static string ReflectedPropertyField(GUIContent label, object targObj, string selectedMemberName, com.spacepuppy.Dynamic.DynamicMemberAccess access, bool allowSetterMethods = false)\r\n        {\r\n            var position = EditorGUILayout.GetControlRect(label == GUIContent.none);\r\n            System.Reflection.MemberInfo selectedMember;\r\n            return SPEditorGUI.ReflectedPropertyField(position, label, targObj, selectedMemberName, access, out selectedMember, allowSetterMethods);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Reflects the available properties and shows them in a dropdown\r\n        /// </summary>\r\n        public static string ReflectedPropertyField(GUIContent label, System.Type targType, string selectedMemberName, out System.Reflection.MemberInfo selectedMember, bool allowSetterMethods = false)\r\n        {\r\n            var position = EditorGUILayout.GetControlRect(label == GUIContent.none);\r\n            return SPEditorGUI.ReflectedPropertyField(position, label, targType, selectedMemberName, out selectedMember, allowSetterMethods);\r\n        }\r\n\r\n        public static string ReflectedPropertyField(GUIContent label, System.Type targType, string selectedMemberName, bool allowSetterMethods = false)\r\n        {\r\n            var position = EditorGUILayout.GetControlRect(label == GUIContent.none);\r\n            System.Reflection.MemberInfo selectedMember;\r\n            return SPEditorGUI.ReflectedPropertyField(position, label, targType, selectedMemberName, out selectedMember, allowSetterMethods);\r\n        }\r\n\r\n\r\n        \r\n        public static string ReflectedRecursingPropertyField(GUIContent label, object targObj, string selectedMemberName, DynamicMemberAccess access, out System.Reflection.MemberInfo selectedMember, bool allowSetterMethods = false)\r\n        {\r\n            if (targObj is IDynamic || targObj is IProxy)\r\n            {\r\n                var mask = allowSetterMethods ? System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property | System.Reflection.MemberTypes.Method : System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property;\r\n                System.Reflection.MemberInfo[] members = null;\r\n                System.Type targTp = null;\r\n                if (targObj is IDynamic)\r\n                {\r\n                    targTp = targObj.GetType();\r\n                    members = DynamicUtil.GetEasilySerializedMembers(targObj, mask, access).ToArray();\r\n                }\r\n                else if (targObj is IProxy)\r\n                {\r\n                    targTp = (targObj as IProxy).GetTargetType();\r\n                    members = DynamicUtil.GetEasilySerializedMembersFromType(targTp, mask, access).ToArray();\r\n                }\r\n                else\r\n                {\r\n                    targTp = typeof(object);\r\n                    members = ArrayUtil.Empty<System.Reflection.MemberInfo>();\r\n                }\r\n                var entries = new GUIContent[members.Length + 1];\r\n\r\n                int index = -1;\r\n                for (int i = 0; i < members.Length; i++)\r\n                {\r\n                    var m = members[i];\r\n                    if ((DynamicUtil.GetMemberAccessLevel(m) & DynamicMemberAccess.Write) != 0)\r\n                        entries[i] = EditorHelper.TempContent(string.Format(\"{0} ({1}) -> {2}\", m.Name, DynamicUtil.GetReturnType(m).Name, EditorHelper.GetValueWithMemberSafe(m, targObj, true)));\r\n                    else\r\n                        entries[i] = EditorHelper.TempContent(string.Format(\"{0} (readonly - {1}) -> {2}\", m.Name, DynamicUtil.GetReturnType(m).Name, EditorHelper.GetValueWithMemberSafe(m, targObj, true)));\r\n\r\n                    if (index < 0 && m.Name == selectedMemberName)\r\n                    {\r\n                        index = i;\r\n                    }\r\n                }\r\n\r\n                entries[entries.Length - 1] = EditorHelper.TempContent(\"...Custom\");\r\n                if (index < 0)\r\n                    index = entries.Length - 1;\r\n\r\n                if (index < members.Length)\r\n                {\r\n                    index = EditorGUILayout.Popup(label, index, entries);\r\n                    selectedMember = (index >= 0 && index < members.Length) ? members[index] : null;\r\n                    return (selectedMember != null) ? selectedMember.Name : null;\r\n                }\r\n                else\r\n                {\r\n                    var position = EditorGUILayout.GetControlRect(label == GUIContent.none);\r\n                    position = EditorGUI.PrefixLabel(position, label);\r\n                    var r0 = new Rect(position.xMin, position.yMin, position.width / 2f, position.height);\r\n                    var r1 = new Rect(r0.xMax, r0.yMin, position.width - r0.width, r0.height);\r\n                    index = EditorGUI.Popup(r0, index, entries);\r\n                    if (index < members.Length)\r\n                    {\r\n                        selectedMember = (index >= 0) ? members[index] : null;\r\n                        return (selectedMember != null) ? selectedMember.Name : null;\r\n                    }\r\n                    else\r\n                    {\r\n                        selectedMemberName = EditorGUI.TextField(r1, selectedMemberName);\r\n                        selectedMember = new DynamicPropertyInfo(selectedMemberName, targTp, typeof(Variant));\r\n                        return selectedMemberName;\r\n                    }\r\n                }\r\n            }\r\n            else if (targObj != null)\r\n            {\r\n                var arr = string.IsNullOrEmpty(selectedMemberName) ? ArrayUtil.Empty<string>() : selectedMemberName.Split('.');\r\n                return ReflectedRecursingPropertyField(label, targObj.GetType(), arr, 0, access, out selectedMember, allowSetterMethods);\r\n            }\r\n            else\r\n            {\r\n                selectedMember = null;\r\n                EditorGUILayout.Popup(label, -1, new GUIContent[0]);\r\n                return null;\r\n            }\r\n        }\r\n\r\n        private static string ReflectedRecursingPropertyField(GUIContent label, System.Type tp, string[] selectedMemberNameChain, int chainIndex, DynamicMemberAccess access, out System.Reflection.MemberInfo selectedMember, bool allowSetterMethods = false)\r\n        {\r\n            if (tp != null)\r\n            {\r\n                var easyMembers = DynamicUtil.GetEasilySerializedMembersFromType(tp, System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property | System.Reflection.MemberTypes.Method, access).ToArray();\r\n                var hardMembers = DynamicUtil.GetEditorCompatibleMembersFromType(tp, System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property, DynamicMemberAccess.Read).Where(m => !DynamicUtil.GetReturnType(m).IsValueType).Except(easyMembers).ToArray();\r\n\r\n                var lst = new List<System.Reflection.MemberInfo>();\r\n                lst.AddRange(easyMembers);\r\n                lst.AddRange(hardMembers);\r\n                var members = lst.ToArray();\r\n                var entries = new GUIContent[members.Length];\r\n\r\n                int index = -1;\r\n                for (int i = 0; i < members.Length; i++)\r\n                {\r\n                    var m = members[i];\r\n                    if(i < easyMembers.Length)\r\n                    {\r\n                        if ((DynamicUtil.GetMemberAccessLevel(m) & DynamicMemberAccess.Write) != 0)\r\n                            entries[i] = EditorHelper.TempContent(string.Format(\"{0} ({1})\", m.Name, DynamicUtil.GetReturnType(m).Name));\r\n                        else\r\n                            entries[i] = EditorHelper.TempContent(string.Format(\"{0} (readonly - {1})\", m.Name, DynamicUtil.GetReturnType(m).Name));\r\n                    }\r\n                    else\r\n                    {\r\n                        entries[i] = EditorHelper.TempContent(string.Format(\"-> {0} ({1})\", m.Name, DynamicUtil.GetReturnType(m).Name));\r\n                    }\r\n\r\n                    if (index < 0 && selectedMemberNameChain != null && chainIndex < selectedMemberNameChain.Length && selectedMemberNameChain[chainIndex] == m.Name)\r\n                    {\r\n                        index = i;\r\n                    }\r\n                }\r\n                \r\n                index = EditorGUILayout.Popup(label, index, entries);\r\n                selectedMember = (index >= 0) ? members[index] : null;\r\n                if (hardMembers.Contains(selectedMember))\r\n                {\r\n                    var m = selectedMember;\r\n                    return m.Name + \".\" + ReflectedRecursingPropertyField(EditorHelper.TempContent(\"|-> \" + m.Name), DynamicUtil.GetReturnType(m), selectedMemberNameChain, chainIndex + 1, access, out selectedMember, allowSetterMethods);\r\n                }\r\n                else\r\n                {\r\n                    return (selectedMember != null) ? selectedMember.Name : null;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                selectedMember = null;\r\n                EditorGUILayout.Popup(label, -1, new GUIContent[0]);\r\n                return null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n\r\n        #region SelectionTabs\r\n\r\n        public static int SelectionTabs(int mode, string[] modes, int xCount)\r\n        {\r\n            int yCount = Mathf.CeilToInt((float)modes.Length / (float)xCount);\r\n            int currentRow = Mathf.FloorToInt((float)mode / (float)xCount);\r\n\r\n            var gridStyle = new GUIStyle(GUI.skin.window);\r\n            gridStyle.padding.bottom = -20;\r\n            Rect rect = GUILayoutUtility.GetRect(1, 16f * yCount);\r\n            rect.x += 4;\r\n            rect.width -= 7;\r\n\r\n            if(currentRow == yCount - 1)\r\n            {\r\n                //if selected row is last row, don't bother remapping\r\n                return GUI.SelectionGrid(rect, mode, modes, 2, gridStyle);\r\n            }\r\n            else\r\n            {\r\n                //remap so that selected row is the last row\r\n                var altModes = modes.Clone() as string[];\r\n                for(int i = 0; i < xCount; i++)\r\n                {\r\n                    altModes[(altModes.Length - xCount) + i] = modes[xCount * currentRow + i]; //move selected row to end\r\n                    altModes[xCount * currentRow + i] = modes[(modes.Length - xCount) + i]; //move last row to selected row\r\n                }\r\n                int altMode = (modes.Length - xCount) + (mode % xCount);\r\n                EditorGUI.BeginChangeCheck();\r\n                altMode = GUI.SelectionGrid(rect, altMode, altModes, 2, gridStyle);\r\n                if(EditorGUI.EndChangeCheck())\r\n                {\r\n                    var newRow = Mathf.FloorToInt((float)altMode / (float)xCount);\r\n                    if (newRow == yCount - 1)\r\n                    {\r\n                        return (currentRow * xCount) + (altMode % xCount);\r\n                    }\r\n                    else if(newRow == currentRow)\r\n                    {\r\n                        return (modes.Length - xCount) + (altMode % xCount);\r\n                    }\r\n                    else\r\n                    {\r\n                        return altMode;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    return mode;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/SPEditorStyles.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n    public static class SPEditorStyles\r\n    {\r\n\r\n\r\n\r\n        public static GUIStyle GetStyle(string styleName)\r\n        {\r\n            GUIStyle style = GUI.skin.FindStyle(styleName) ?? EditorGUIUtility.GetBuiltinSkin(EditorSkin.Inspector).FindStyle(styleName);\r\n            if(style == null)\r\n            {\r\n                style = new GUIStyle();\r\n            }\r\n            return style;\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/SPGUI.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n    public static class SPGUI\r\n    {\r\n\r\n        public static GUIDisableCache Disable()\r\n        {\r\n            var result = new GUIDisableCache();\r\n            result.Set();\r\n            return result;\r\n        }\r\n\r\n        public static GUIDisableCache DisableIfPlaying()\r\n        {\r\n            if (Application.isPlaying)\r\n                return Disable();\r\n            else\r\n                return new GUIDisableCache()\r\n                {\r\n                    Flag = GUI.enabled\r\n                };\r\n        }\r\n\r\n        public static GUIDisableCache DisableIf(bool test)\r\n        {\r\n            if (test)\r\n                return Disable();\r\n            else\r\n                return new GUIDisableCache()\r\n                {\r\n                    Flag = GUI.enabled\r\n                };\r\n        }\r\n\r\n        #region Special Types\r\n\r\n        public struct GUIDisableCache\r\n        {\r\n\r\n            public bool Flag;\r\n\r\n            public void Set()\r\n            {\r\n                this.Flag = GUI.enabled;\r\n                GUI.enabled = false;\r\n            }\r\n\r\n            public void Reset()\r\n            {\r\n                GUI.enabled = this.Flag;\r\n            }\r\n            \r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/SPMenu.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Project;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n\r\n    [InitializeOnLoad()]\r\n    public static class SPMenu\r\n    {\r\n\r\n        public const string MENU_NAME_ROOT = \"Spacepuppy\";\r\n        public const string MENU_NAME_SETTINGS = MENU_NAME_ROOT + \"/Settings\";\r\n        public const string MENU_NAME_MODELS = MENU_NAME_ROOT + \"/Models\";\r\n        public const string MENU_NAME_TOOLS = MENU_NAME_ROOT + \"/Tools\";\r\n\r\n        public const int MENU_GAP = 1000;\r\n\r\n        public const int MENU_PRIORITY_GROUP1 = 0;\r\n        public const int MENU_PRIORITY_GROUP2 = MENU_PRIORITY_GROUP1 + MENU_GAP;\r\n        public const int MENU_PRIORITY_GROUP3 = MENU_PRIORITY_GROUP2 + MENU_GAP;\r\n        public const int MENU_PRIORITY_GROUP4 = MENU_PRIORITY_GROUP3 + MENU_GAP;\r\n        public const int MENU_PRIORITY_SETTINGS = MENU_PRIORITY_GROUP1 - 1;\r\n        public const int MENU_PRIORITY_MODELS = MENU_PRIORITY_GROUP3 - 1;\r\n        public const int MENU_PRIORITY_TOOLS = MENU_PRIORITY_GROUP4 - 1;\r\n\r\n        public const int MENU_PRIORITY_SINGLETON = 1000000;\r\n\r\n        #region Special Menu Entries\r\n\r\n        [MenuItem(SPMenu.MENU_NAME_SETTINGS + \"/Sync TagData\", priority = MENU_PRIORITY_SETTINGS)]\r\n        public static void SyncTagData()\r\n        {\r\n            var tagData = (TagData)AssetDatabase.LoadAssetAtPath(@\"Assets/Resources/TagData.asset\", typeof(TagData));\r\n            if (tagData == null)\r\n            {\r\n                if(!System.IO.Directory.Exists(Application.dataPath + \"/Resources\"))\r\n                {\r\n                    System.IO.Directory.CreateDirectory(Application.dataPath + \"/Resources\");\r\n                }\r\n                tagData = ScriptableObjectHelper.CreateAsset<TagData>(@\"Assets/Resources/TagData.asset\");\r\n            }\r\n\r\n            SyncTagData(tagData);\r\n        }\r\n\r\n        public static void SyncTagData(TagData tagData)\r\n        {\r\n            if (!tagData.SimilarTo(UnityEditorInternal.InternalEditorUtility.tags))\r\n            {\r\n                var helper = new TagData.EditorHelper(tagData);\r\n\r\n                using (var tags = com.spacepuppy.Collections.TempCollection.GetList<string>(UnityEditorInternal.InternalEditorUtility.tags))\r\n                {\r\n                    bool added = false;\r\n                    if (!tags.Contains(SPConstants.TAG_MULTITAG))\r\n                    {\r\n                        tags.Add(SPConstants.TAG_MULTITAG);\r\n                        added = true;\r\n                    }\r\n                    if (!tags.Contains(SPConstants.TAG_ROOT))\r\n                    {\r\n                        tags.Add(SPConstants.TAG_ROOT);\r\n                        added = true;\r\n                    }\r\n                    if(added)\r\n                    {\r\n                        try\r\n                        {\r\n                            SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath(\"ProjectSettings/TagManager.asset\")[0]);\r\n                            SerializedProperty tagsProp = tagManager.FindProperty(\"tags\");\r\n\r\n                            var arr = (from st in tags where !string.IsNullOrEmpty(st) && !TagData.IsDefaultUnityTag(st) select st).ToArray();\r\n                            tagsProp.arraySize = arr.Length;\r\n                            for(int i = 0; i < arr.Length; i++)\r\n                            {\r\n                                tagsProp.GetArrayElementAtIndex(i).stringValue = arr[i];\r\n                            }\r\n                            tagManager.ApplyModifiedProperties();\r\n                        }\r\n                        catch\r\n                        {\r\n                            Debug.LogWarning(\"Failed to save TagManager when syncing tags.\");\r\n                        }\r\n                    }\r\n\r\n                    helper.UpdateTags(tags);\r\n                    EditorUtility.SetDirty(tagData);\r\n                    AssetDatabase.SaveAssets();\r\n                }\r\n            }\r\n        }\r\n\r\n        [MenuItem(SPMenu.MENU_NAME_ROOT + \"/Create SingletonSource\", priority = MENU_PRIORITY_SINGLETON)]\r\n        public static void CreateSingletonSource()\r\n        {\r\n            var mainSrc = Singleton.GetGameObjectSource(false);\r\n            if(mainSrc == null)\r\n            {\r\n                mainSrc = new GameObject(Singleton.GAMEOBJECT_NAME);\r\n            }\r\n            if(!mainSrc.HasComponent<SingletonManager>())\r\n            {\r\n                mainSrc.AddComponent<SingletonManager>();\r\n            }\r\n        }\r\n\r\n        [MenuItem(SPMenu.MENU_NAME_ROOT + \"/Create SingletonSource\", validate = true)]\r\n        public static bool CreateSingletonSource_Validate()\r\n        {\r\n            if (Application.isPlaying) return false;\r\n            return true;\r\n        }\r\n\r\n        [MenuItem(SPMenu.MENU_NAME_ROOT + \"/Create GameLoopEntry\", priority = MENU_PRIORITY_SINGLETON)]\r\n        public static void CreateGameLoopEntry()\r\n        {\r\n            GameLoopEntry.Init();\r\n        }\r\n\r\n        [MenuItem(SPMenu.MENU_NAME_ROOT + \"/Create GameLoopEntry\", validate = true)]\r\n        public static bool CreateGameLoopEntry_Validate()\r\n        {\r\n            if (Application.isPlaying) return false;\r\n            return !Singleton.HasInstance<GameLoopEntry>();\r\n        }\r\n\r\n        \r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/EventTriggerEvaluatorInspector.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Scenario;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Scenario\n{\n\n    [InitializeOnLoad()]\n    internal static class EventTriggerEvaluatorInspector\n    {\n\n        #region Fields\n\n        public const long COOLDOWN_TRIGGERED = System.TimeSpan.TicksPerSecond * 1;\n\n        private static long _lastT;\n        private static Dictionary<int, long> _triggered = new Dictionary<int, long>();\n        private static HashSet<int> _cache = new HashSet<int>();\n\n        #endregion\n\n        #region Static Constructor\n\n        static EventTriggerEvaluatorInspector()\n        {\n            EventTriggerEvaluator.SetCurrentEvaluator(new SpecialEventTriggerEvaluator());\n            _lastT = System.DateTime.Now.Ticks;\n            EditorApplication.update += Update;\n            EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyItemGUI;\n        }\n\n        #endregion\n\n        #region Methods\n\n        public static bool MechanismIsActive(ITriggerableMechanism mechanism, out long currentT)\n        {\n            currentT = 0;\n            return false;\n        }\n        \n        private static void SignalTriggered(object obj)\n        {\n            if(obj is IProxy)\n            {\n                var proxy = obj as IProxy;\n                obj = proxy.GetTarget();\n\n                // // SHOULD WE DRAW THE PROXY TOO???\n                //if(GameObjectUtil.IsGameObjectSource(proxy))\n                //{\n                //    var go = GameObjectUtil.GetGameObjectFromSource(proxy);\n                //    if(go != null)\n                //    {\n                //        int id = go.GetInstanceID();\n                //        _triggered[id] = COOLDOWN_TRIGGERED;\n                //    }\n                //}\n            }\n\n            if(GameObjectUtil.IsGameObjectSource(obj))\n            {\n                var go = GameObjectUtil.GetGameObjectFromSource(obj);\n                if(go != null)\n                {\n                    int id = go.GetInstanceID();\n                    _triggered[id] = COOLDOWN_TRIGGERED;\n                }\n            }\n        }\n\n\n\n\n\n        private static void Update()\n        {\n            var t = System.DateTime.Now.Ticks;\n            var dt = t - _lastT;\n            _lastT = t;\n\n            if (_triggered.Count > 0)\n            {\n                _cache.AddRange(_triggered.Keys);\n\n                foreach (var id in _cache)\n                {\n                    long value = _triggered[id] - dt;\n                    if (value <= 0)\n                        _triggered.Remove(id);\n                    else\n                        _triggered[id] = value;\n                }\n\n                _cache.Clear();\n                EditorApplication.RepaintHierarchyWindow();\n            }\n        }\n\n        private static void OnHierarchyItemGUI(int instanceID, Rect selectionRect)\n        {\n            long ticks;\n            if (!_triggered.TryGetValue(instanceID, out ticks)) return;\n\n            float t = (float)((double)ticks / (double)COOLDOWN_TRIGGERED);\n            //t = com.spacepuppy.Tween.EaseMethods.ExpoEaseOut(1f - t, 1f, -1f, 1f);\n            t = Mathf.Clamp01(t * t * t);\n            var c = Color.blue;\n            c.a = t * 0.2f;\n            EditorGUI.DrawRect(selectionRect, c);\n        }\n        \n        #endregion\n\n        #region Special Types\n\n        //private struct EventInfo\n        //{\n        //    public long Time;\n        //    public ITriggerableMechanism Object;\n        //}\n\n        private class SpecialEventTriggerEvaluator : EventTriggerEvaluator.IEvaluator\n        {\n\n            public void GetAllTriggersOnTarget(object target, List<ITriggerableMechanism> outputColl)\n            {\n                if (Application.isPlaying)\n                {\n                    EventTriggerEvaluator.Default.GetAllTriggersOnTarget(target, outputColl);\n                }\n                else\n                {\n                    if (target is IProxy) target = (target as IProxy).GetTarget();\n                    var go = GameObjectUtil.GetGameObjectFromSource(target);\n                    if (go != null)\n                    {\n                        go.GetComponents<ITriggerableMechanism>(outputColl);\n                        outputColl.Sort(TriggerableMechanismOrderComparer.Default);\n                    }\n                    else if (target is ITriggerableMechanism)\n                        outputColl.Add(target as ITriggerableMechanism);\n                }\n            }\n\n            void EventTriggerEvaluator.IEvaluator.TriggerAllOnTarget(object target, object sender, object arg, BlockingTriggerYieldInstruction instruction)\n            {\n                if (Application.isPlaying)\n                {\n                    SignalTriggered(target);\n                    EventTriggerEvaluator.Default.TriggerAllOnTarget(target, sender, arg, instruction);\n                    return;\n                }\n\n                using (var lst = com.spacepuppy.Collections.TempCollection.GetList<ITriggerableMechanism>())\n                {\n                    this.GetAllTriggersOnTarget(target, lst);\n\n                    if (instruction != null)\n                    {\n                        var e = lst.GetEnumerator();\n                        while (e.MoveNext())\n                        {\n                            var t = e.Current;\n                            if (t.CanTrigger)\n                            {\n                                SignalTriggered(t);\n                                if (t is IBlockingTriggerableMechanism)\n                                    (t as IBlockingTriggerableMechanism).Trigger(sender, arg, instruction);\n                                else\n                                    t.Trigger(sender, arg);\n                            }\n                        }\n                    }\n                    else\n                    {\n                        var e = lst.GetEnumerator();\n                        while (e.MoveNext())\n                        {\n                            var t = e.Current;\n                            if (t.CanTrigger)\n                            {\n                                SignalTriggered(t);\n                                t.Trigger(sender, arg);\n                            }\n                        }\n                    }\n                }\n            }\n\n            void EventTriggerEvaluator.IEvaluator.TriggerSelectedTarget(object target, object sender, object arg, BlockingTriggerYieldInstruction instruction)\n            {\n                SignalTriggered(target);\n                EventTriggerEvaluator.Default.TriggerSelectedTarget(target, sender, arg, instruction);\n            }\n\n            void EventTriggerEvaluator.IEvaluator.CallMethodOnSelectedTarget(object target, string methodName, VariantReference[] methodArgs)\n            {\n                SignalTriggered(target);\n                EventTriggerEvaluator.Default.CallMethodOnSelectedTarget(target, methodName, methodArgs);\n            }\n\n            void EventTriggerEvaluator.IEvaluator.SendMessageToTarget(object target, string message, object arg)\n            {\n                SignalTriggered(target);\n                EventTriggerEvaluator.Default.SendMessageToTarget(target, message, arg);\n            }\n\n            void EventTriggerEvaluator.IEvaluator.EnableTarget(object target, EnableMode mode)\n            {\n                SignalTriggered(target);\n                EventTriggerEvaluator.Default.EnableTarget(target, mode);\n            }\n\n            void EventTriggerEvaluator.IEvaluator.DestroyTarget(object target)\n            {\n                SignalTriggered(target);\n                EventTriggerEvaluator.Default.DestroyTarget(target);\n            }\n\n        }\n\n        #endregion\n\n    }\n\n    //[CustomHierarchyDrawer(typeof(ITriggerableMechanism))]\n    //internal class TriggerableHierarchyDrawer : HierarchyDrawer\n    //{\n    //    private Color _activeColor = Color.blue;\n\n    //    public override void OnHierarchyGUI(Rect selectionRect)\n    //    {\n    //        long t;\n    //        if (!EventTriggerEvaluatorInspector.MechanismIsActive(this.Target as ITriggerableMechanism, out t))\n    //        {\n    //            _activeColor = Color.blue;\n    //            return;\n    //        }\n\n    //        _activeColor.a = (float)((double)t / (double)EventTriggerEvaluatorInspector.COOLDOWN_TRIGGERED);\n    //        EditorGUI.DrawRect(selectionRect, _activeColor);\n    //    }\n\n    //}\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/ITriggerableMechanismAddonDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Scenario;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n    [CustomAddonDrawer(typeof(ITriggerableMechanism), displayAsFooter = true)]\r\n    public class ITriggerableMechanismAddonDrawer : SPEditorAddonDrawer\r\n    {\r\n\r\n        public override void OnInspectorGUI()\r\n        {\r\n            if (!Application.isPlaying) return;\r\n\r\n            var targ = this.SerializedObject.targetObject as ITriggerableMechanism;\r\n            if (targ == null) return;\r\n\r\n            var rect = GetActivateButtonControlRect();\r\n\r\n            if(GUI.Button(rect, \"Activate\"))\r\n            {\r\n                targ.Trigger(null, null);\r\n            }\r\n        }\r\n\r\n\r\n        public static Rect GetActivateButtonControlRect()\r\n        {\r\n            var rect = EditorGUILayout.GetControlRect(false, 24f);\r\n            var w = rect.width * 0.6f;\r\n            var pad = (rect.width - w) / 2f;\r\n            rect = new Rect(rect.xMin + pad, rect.yMin + 2f, w, 20f);\r\n            return rect;\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/ObservableTargetDataPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Components;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(ObservableTargetData), true)]\r\n    public class ObservableTargetDataPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public const string PROP_TARGET = \"_target\";\r\n        public const string PROP_TRIGGERINDEX = \"_triggerIndex\";\r\n\r\n        private const float BOX_MARGIN_V = 1f;\r\n        private const float PROP_MARGIN_V = 1f;\r\n        private const float MARGIN_V = BOX_MARGIN_V + PROP_MARGIN_V;\r\n\r\n        private const float BOX_MARGIN_H = 0f;\r\n        private const float PROP_MARGIN_H = 1f;\r\n        private const float MARGIN_H = BOX_MARGIN_H + PROP_MARGIN_H;\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            return EditorGUIUtility.singleLineHeight * 2f + MARGIN_V * 2f;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            GUI.Box(new Rect(position.xMin + BOX_MARGIN_H, position.yMin + BOX_MARGIN_V, position.width - BOX_MARGIN_H * 2f, position.height - BOX_MARGIN_V * 2f), GUIContent.none);\r\n\r\n            var r0 = new Rect(position.xMin + MARGIN_H, position.yMin + MARGIN_V, position.width - MARGIN_H * 2f, EditorGUIUtility.singleLineHeight);\r\n            var r1 = new Rect(position.xMin + MARGIN_H, r0.yMax, position.width - MARGIN_H * 2f, EditorGUIUtility.singleLineHeight);\r\n\r\n            var targProp = property.FindPropertyRelative(PROP_TARGET);\r\n            var indexProp = property.FindPropertyRelative(PROP_TRIGGERINDEX);\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            SPEditorGUI.PropertyField(r0, targProp);\r\n            if (EditorGUI.EndChangeCheck())\r\n                indexProp.intValue = 0;\r\n\r\n            if (targProp.objectReferenceValue is IObservableTrigger)\r\n            {\r\n                var targ = targProp.objectReferenceValue as IObservableTrigger;\r\n                var owner = new SerializedObject(targProp.objectReferenceValue);\r\n\r\n                int i = 0;\r\n                var events = (from e in targ.GetTriggers() select GetTriggerTargsId(owner, e, ++i)).ToArray();\r\n                indexProp.intValue = EditorGUI.Popup(r1, \"Trigger Event\", indexProp.intValue, events);\r\n            }\r\n            else\r\n            {\r\n                EditorGUI.LabelField(r1, \"Trigger Event\", \"Select Target First\");\r\n            }\r\n        }\r\n\r\n\r\n        private static string GetTriggerTargsId(SerializedObject owner, BaseSPEvent e, int index)\r\n        {\r\n            var child = owner.GetIterator();\r\n            child.Next(true);\r\n            do\r\n            {\r\n                var v = EditorHelper.GetTargetObjectOfProperty(child);\r\n                if (v is BaseSPEvent && v == e) return child.displayName;\r\n            }\r\n            while (child.Next(false));\r\n\r\n            if (string.IsNullOrEmpty(e.ObservableTriggerId))\r\n                return \"Trigger (\" + index.ToString() + \")\";\r\n            else\r\n                return e.ObservableTriggerId + \"(\" + index.ToString() + \")\";\r\n        }\r\n\r\n\r\n    }\r\n    \r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/TriggerComponentInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n    \r\n    /// <summary>\r\n    /// TODO - remove this class, deprecated.\r\n    /// </summary>\r\n    //[CustomEditor(typeof(TriggerComponent), true)]\r\n    [System.Obsolete(\"TriggerComponent now lets its trigger properties drawn by the TriggerPropertyDrawer.\")]\r\n    internal class TriggerComponentInspector : SPEditor\r\n    {\r\n\r\n        private const string PROP_TARGETS = \"_targets\";\r\n\r\n        private SPReorderableList _targetList;\r\n        private bool _foldoutTargetExtra;\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _targetList = new SPReorderableList(this.serializedObject, this.serializedObject.FindProperty(PROP_TARGETS), true, true, true, true);\r\n            _targetList.drawHeaderCallback = _targetList_DrawHeader;\r\n            _targetList.drawElementCallback = _targetList_DrawElement;\r\n            _targetList.onAddCallback = _targetList_OnAdd;\r\n        }\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            if (_targetList.index >= _targetList.count) _targetList.index = -1;\r\n\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n\r\n            this.DrawTargets();\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_TARGETS);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n\r\n        #region Draw Targets\r\n\r\n        private void DrawTargets()\r\n        {\r\n            EditorGUI.BeginChangeCheck();\r\n            _targetList.DoLayoutList();\r\n            if (EditorGUI.EndChangeCheck())\r\n                this.serializedObject.ApplyModifiedProperties();\r\n            if (_targetList.index >= _targetList.count) _targetList.index = -1;\r\n\r\n            _foldoutTargetExtra = EditorGUILayout.Foldout(_foldoutTargetExtra, \"Advanced Target Settings\");\r\n            if (_foldoutTargetExtra)\r\n            {\r\n                EditorGUILayout.BeginVertical(\"Box\");\r\n\r\n                if (_targetList.index >= 0)\r\n                {\r\n                    var element = _targetList.serializedProperty.GetArrayElementAtIndex(_targetList.index);\r\n\r\n                    EditorGUILayout.PropertyField(element);\r\n                }\r\n                else\r\n                {\r\n                    EditorGUILayout.HelpBox(\"Select a target to edit.\", MessageType.Info);\r\n                }\r\n\r\n                EditorGUILayout.EndVertical();\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region ReorderableList Handlers\r\n\r\n        private void _targetList_DrawHeader(Rect area)\r\n        {\r\n            EditorGUI.LabelField(area, \"Trigger Targets\");\r\n        }\r\n\r\n        private void _targetList_DrawElement(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            var element = _targetList.serializedProperty.GetArrayElementAtIndex(index);\r\n\r\n            var trigProp = element.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_TRIGGERABLETARG);\r\n            var actProp = element.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_ACTIVATIONTYPE);\r\n            //var act = (TriggerActivationType)actProp.enumValueIndex;\r\n            var act = actProp.GetEnumValue<TriggerActivationType>();\r\n\r\n            const float MARGIN = 1.0f;\r\n            if (act == TriggerActivationType.TriggerAllOnTarget)\r\n            {\r\n                //Draw Triggerable - this is the simple case to make a clean designer set up for newbs\r\n                var trigRect = new Rect(area.xMin, area.yMin + MARGIN, area.width, EditorGUIUtility.singleLineHeight);\r\n                var trigLabel = new GUIContent(\"Target\");\r\n                EditorGUI.BeginProperty(trigRect, trigLabel, trigProp);\r\n                trigProp.objectReferenceValue = SPEditorGUI.ComponentField(trigRect,\r\n                                                                           trigLabel,\r\n                                                                           ValidateTriggerableTargAsMechanism(trigProp.objectReferenceValue) as Component,\r\n                                                                           typeof(ITriggerableMechanism),\r\n                                                                           true);\r\n                EditorGUI.EndProperty();\r\n            }\r\n            else\r\n            {\r\n                //Draw Triggerable - this forces the user to use the advanced settings, not for newbs\r\n                var trigRect = new Rect(area.xMin, area.yMin + MARGIN, area.width, EditorGUIUtility.singleLineHeight);\r\n                var trigLabel = new GUIContent(\"Advanced Target\", \"A target is not set, see advanced settings section to set a target.\");\r\n\r\n                if (trigProp.objectReferenceValue != null)\r\n                {\r\n                    var obj = trigProp.objectReferenceValue;\r\n                    var trigType = trigProp.objectReferenceValue.GetType();\r\n                    GUIContent extraLabel;\r\n                    switch (act)\r\n                    {\r\n                        case TriggerActivationType.SendMessage:\r\n                            extraLabel = new GUIContent(\"(SendMessage) \" + obj.name);\r\n                            break;\r\n                        case TriggerActivationType.TriggerSelectedTarget:\r\n                            extraLabel = new GUIContent(\"(TriggerSelectedTarget) \" + obj.name + \" -> \" + trigType.Name);\r\n                            break;\r\n                        case TriggerActivationType.CallMethodOnSelectedTarget:\r\n                            extraLabel = new GUIContent(\"(CallMethodOnSelectedTarget) \" + obj.name + \" -> \" + trigType.Name + \".\" + element.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_METHODNAME).stringValue);\r\n                            break;\r\n                        default:\r\n                            extraLabel = GUIContent.none;\r\n                            break;\r\n                    }\r\n                    EditorGUI.LabelField(trigRect, trigLabel, extraLabel);\r\n                }\r\n                else\r\n                {\r\n                    EditorGUI.LabelField(trigRect, trigLabel, new GUIContent(\"No Target\"), new GUIStyle(\"Label\") { alignment = TextAnchor.MiddleCenter });\r\n                }\r\n            }\r\n\r\n            ReorderableListHelper.DrawDraggableElementDeleteContextMenu(_targetList, area, index, isActive, isFocused);\r\n        }\r\n\r\n        private void _targetList_OnAdd(ReorderableList lst)\r\n        {\r\n            lst.serializedProperty.arraySize++;\r\n            lst.index = lst.serializedProperty.arraySize - 1;\r\n\r\n            lst.serializedProperty.serializedObject.ApplyModifiedProperties();\r\n\r\n            var obj = EditorHelper.GetTargetObjectOfProperty(lst.serializedProperty.GetArrayElementAtIndex(lst.index)) as TriggerTarget;\r\n            if (obj != null)\r\n            {\r\n                obj.Clear();\r\n                lst.serializedProperty.serializedObject.Update();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        private static Component ValidateTriggerableTargAsMechanism(object value)\r\n        {\r\n            if (value == null) return null;\r\n            if (!(value is Component)) return null;\r\n\r\n            if (value is ITriggerableMechanism) return value as Component;\r\n            else return (value as Component).GetComponent<ITriggerableMechanism>() as Component;\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/TriggerPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(BaseSPEvent), true)]\r\n    public class TriggerPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        private const float MARGIN = 2.0f;\r\n        private const float BTN_ACTIVATE_HEIGHT = 24f;\r\n\r\n        public const string PROP_YIELDING = \"_yield\";\r\n        public const string PROP_TARGETS = \"_targets\";\r\n        private const string PROP_WEIGHT = \"_weight\";\r\n\r\n        #region Fields\r\n\r\n        private GUIContent _currentLabel;\r\n        private CachedReorderableList _targetList;\r\n        private bool _foldoutTargetExtra;\r\n        private TriggerTargetPropertyDrawer _triggerTargetDrawer = new TriggerTargetPropertyDrawer();\r\n\r\n        private bool _drawWeight;\r\n        private float _totalWeight = 0f;\r\n\r\n        private bool _alwaysExpanded;\r\n\r\n        private bool _customInspector;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        private void Init(SerializedProperty prop, GUIContent label)\r\n        {\r\n            _currentLabel = label;\r\n\r\n            _targetList = CachedReorderableList.GetListDrawer(prop.FindPropertyRelative(PROP_TARGETS), _targetList_DrawHeader, _targetList_DrawElement, _targetList_OnAdd);\r\n\r\n            if (!_customInspector)\r\n            {\r\n                if (this.fieldInfo != null)\r\n                {\r\n                    var attribs = this.fieldInfo.GetCustomAttributes(typeof(SPEvent.ConfigAttribute), false) as SPEvent.ConfigAttribute[];\r\n                    if (attribs != null && attribs.Length > 0)\r\n                    {\r\n                        _drawWeight = attribs[0].Weighted;\r\n                        _alwaysExpanded = attribs[0].AlwaysExpanded;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    _drawWeight = false;\r\n                    _alwaysExpanded = false;\r\n                }\r\n            }\r\n            _triggerTargetDrawer.DrawWeight = _drawWeight;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool DrawWeight\r\n        {\r\n            get { return _drawWeight; }\r\n            set\r\n            {\r\n                _drawWeight = value;\r\n                _customInspector = true;\r\n            }\r\n        }\r\n\r\n        public bool AlwaysExpanded\r\n        {\r\n            get { return _alwaysExpanded; }\r\n            set\r\n            {\r\n                _alwaysExpanded = value;\r\n                _customInspector = true;\r\n            }\r\n        }\r\n\r\n        public System.Action<Rect, SerializedProperty, int> OnDrawCustomizedEntryLabel\r\n        {\r\n            get;\r\n            set;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Draw Methods\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            float h;\r\n            if (EditorHelper.AssertMultiObjectEditingNotSupportedHeight(property, label, out h)) return h;\r\n\r\n            this.Init(property, label);\r\n            \r\n            if (_alwaysExpanded || property.isExpanded)\r\n            {\r\n                h = MARGIN * 2f;\r\n                h += _targetList.GetHeight();\r\n                h += EditorGUIUtility.singleLineHeight * 2f;\r\n                if (_foldoutTargetExtra)\r\n                {\r\n                    if (_targetList.index >= 0)\r\n                    {\r\n                        var element = _targetList.serializedProperty.GetArrayElementAtIndex(_targetList.index);\r\n                        h += _triggerTargetDrawer.GetPropertyHeight(element, GUIContent.none);\r\n                    }\r\n                    else\r\n                    {\r\n                        h += EditorGUIUtility.singleLineHeight * 3.0f;\r\n                    }\r\n                }\r\n\r\n                if (Application.isPlaying)\r\n                {\r\n                    h += BTN_ACTIVATE_HEIGHT;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                h = EditorGUIUtility.singleLineHeight;\r\n            }\r\n\r\n            return h;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            if (EditorHelper.AssertMultiObjectEditingNotSupported(position, property, label)) return;\r\n\r\n            this.Init(property, label);\r\n\r\n            //const float WIDTH_FOLDOUT = 5f;\r\n            //if(!_alwaysExpanded) property.isExpanded = EditorGUI.Foldout(new Rect(position.xMin, position.yMin, WIDTH_FOLDOUT, EditorGUIUtility.singleLineHeight), property.isExpanded, GUIContent.none);\r\n            if (!_alwaysExpanded) property.isExpanded = EditorGUI.Foldout(new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight), property.isExpanded, GUIContent.none, true);\r\n\r\n            if (_alwaysExpanded || property.isExpanded)\r\n            {\r\n                if (_drawWeight) this.CalculateTotalWeight();\r\n\r\n                if(!_alwaysExpanded) GUI.Box(position, GUIContent.none);\r\n\r\n                position = new Rect(position.xMin + MARGIN, position.yMin + MARGIN, position.width - MARGIN * 2f, position.height - MARGIN * 2f);\r\n                EditorGUI.BeginProperty(position, label, property);\r\n                \r\n                position = this.DrawList(position, property);\r\n                position = this.DrawYieldToggle(position, property);\r\n                position = this.DrawAdvancedTargetSettings(position, property);\r\n\r\n                EditorGUI.EndProperty();\r\n\r\n                if (Application.isPlaying && !property.serializedObject.isEditingMultipleObjects)\r\n                {\r\n                    var w = position.width * 0.6f;\r\n                    var pad = (position.width - w) / 2f;\r\n                    var rect = new Rect(position.xMin + pad, position.yMax + -BTN_ACTIVATE_HEIGHT + 2f, w, 20f);\r\n                    if (GUI.Button(rect, \"Activate Trigger\"))\r\n                    {\r\n                        var targ = EditorHelper.GetTargetObjectOfProperty(property) as Trigger;\r\n                        if (targ != null) targ.ActivateTrigger(property.serializedObject.targetObject, null);\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                EditorGUI.BeginProperty(position, label, property);\r\n\r\n                ReorderableListHelper.DrawRetractedHeader(position, label, EditorHelper.TempContent(\"Trigger Targets\"));\r\n\r\n                EditorGUI.EndProperty();\r\n            }\r\n\r\n        }\r\n\r\n\r\n        private void CalculateTotalWeight()\r\n        {\r\n            _totalWeight = 0f;\r\n            for(int i = 0; i < _targetList.serializedProperty.arraySize; i++)\r\n            {\r\n                _totalWeight += _targetList.serializedProperty.GetArrayElementAtIndex(i).FindPropertyRelative(PROP_WEIGHT).floatValue;\r\n            }\r\n        }\r\n\r\n\r\n        private Rect DrawList(Rect position, SerializedProperty property)\r\n        {\r\n            var listRect = new Rect(position.xMin, position.yMin, position.width, _targetList.GetHeight());\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            _targetList.DoList(listRect);\r\n            if (EditorGUI.EndChangeCheck())\r\n                property.serializedObject.ApplyModifiedProperties();\r\n            if (_targetList.index >= _targetList.count) _targetList.index = -1;\r\n\r\n            var ev = Event.current;\r\n            if (ev != null)\r\n            {\r\n                switch(ev.type)\r\n                {\r\n                    case EventType.DragUpdated:\r\n                    case EventType.DragPerform:\r\n                        {\r\n                            if(listRect.Contains(ev.mousePosition))\r\n                            {\r\n                                var refs = DragAndDrop.objectReferences;\r\n                                DragAndDrop.visualMode = refs.Length > 0 ? DragAndDropVisualMode.Link : DragAndDropVisualMode.Rejected;\r\n\r\n                                if (ev.type == EventType.DragPerform && refs.Length > 0)\r\n                                {\r\n                                    ev.Use();\r\n                                    AddObjectsToTrigger(property, refs);\r\n                                }\r\n                            }\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n            \r\n            return new Rect(position.xMin, listRect.yMax, position.width, position.height - listRect.height);\r\n        }\r\n\r\n        private Rect DrawAdvancedTargetSettings(Rect position, SerializedProperty property)\r\n        {\r\n            const float FOLDOUT_MRG = 12f;\r\n            var foldoutRect = new Rect(position.xMin + FOLDOUT_MRG, position.yMin, position.width - FOLDOUT_MRG, EditorGUIUtility.singleLineHeight); //for some reason the foldout needs to be pushed in an extra amount for the arrow...\r\n            position = new Rect(position.xMin, foldoutRect.yMax, position.width, position.yMax - foldoutRect.yMax);\r\n            _foldoutTargetExtra = EditorGUI.Foldout(foldoutRect, _foldoutTargetExtra, \"Advanced Target Settings\");\r\n\r\n            if (_foldoutTargetExtra)\r\n            {\r\n                if (_targetList.index >= 0)\r\n                {\r\n                    var element = _targetList.serializedProperty.GetArrayElementAtIndex(_targetList.index);\r\n                    const float INDENT_MRG = 14f;\r\n                    var settingsRect = new Rect(position.xMin + INDENT_MRG, position.yMin, position.width - INDENT_MRG, _triggerTargetDrawer.GetPropertyHeight(element, GUIContent.none));\r\n                    _triggerTargetDrawer.OnGUI(settingsRect, element, GUIContent.none);\r\n\r\n                    position = new Rect(position.xMin, settingsRect.yMax, position.width, position.yMax - settingsRect.yMax);\r\n                }\r\n                else\r\n                {\r\n                    var helpRect = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight * 3.0f);\r\n                    EditorGUI.HelpBox(helpRect, \"Select a target to edit.\", MessageType.Info);\r\n\r\n                    position = new Rect(position.xMin, helpRect.yMax, position.width, position.yMax - helpRect.yMax);\r\n                }\r\n            }\r\n\r\n            return position;\r\n        }\r\n\r\n        private Rect DrawYieldToggle(Rect position, SerializedProperty property)\r\n        {\r\n            var yieldProp = property.FindPropertyRelative(PROP_YIELDING);\r\n            var r = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n\r\n            yieldProp.boolValue = EditorGUI.ToggleLeft(r, EditorHelper.TempContent(\"Yield\", \"Should we yield if called from a coroutine.\"), yieldProp.boolValue);\r\n\r\n            return new Rect(position.xMin, r.yMax, position.width, position.yMax - r.yMax);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ReorderableList Handlers\r\n\r\n        private void _targetList_DrawHeader(Rect area)\r\n        {\r\n            EditorGUI.LabelField(area, _currentLabel, EditorHelper.TempContent(\"Trigger Targets\"));\r\n        }\r\n\r\n        private void _targetList_DrawElement(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            var element = _targetList.serializedProperty.GetArrayElementAtIndex(index);\r\n\r\n            var targProp = element.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_TRIGGERABLETARG);\r\n\r\n            const float MARGIN = 1.0f;\r\n            const float WEIGHT_FIELD_WIDTH = 60f;\r\n            const float PERC_FIELD_WIDTH = 45f;\r\n            const float FULLWEIGHT_WIDTH = WEIGHT_FIELD_WIDTH + PERC_FIELD_WIDTH;\r\n\r\n            EditorGUI.BeginProperty(area, GUIContent.none, targProp);\r\n\r\n            Rect trigRect;\r\n            if (_drawWeight && area.width > FULLWEIGHT_WIDTH)\r\n            {\r\n                var top = area.yMin + MARGIN;\r\n                var labelRect = new Rect(area.xMin, top, EditorGUIUtility.labelWidth - FULLWEIGHT_WIDTH, EditorGUIUtility.singleLineHeight);\r\n                var weightRect = new Rect(area.xMin + EditorGUIUtility.labelWidth - FULLWEIGHT_WIDTH, top, WEIGHT_FIELD_WIDTH, EditorGUIUtility.singleLineHeight);\r\n                var percRect = new Rect(area.xMin + EditorGUIUtility.labelWidth - PERC_FIELD_WIDTH, top, PERC_FIELD_WIDTH, EditorGUIUtility.singleLineHeight);\r\n                trigRect = new Rect(area.xMin + EditorGUIUtility.labelWidth, top, area.width - EditorGUIUtility.labelWidth, EditorGUIUtility.singleLineHeight);\r\n\r\n                var weightProp = element.FindPropertyRelative(PROP_WEIGHT);\r\n                float weight = weightProp.floatValue;\r\n\r\n                if (this.OnDrawCustomizedEntryLabel != null)\r\n                    this.OnDrawCustomizedEntryLabel(labelRect, element, index);\r\n                else\r\n                    DrawDefaultListElementLabel(labelRect, element, index);\r\n                weightProp.floatValue = EditorGUI.FloatField(weightRect, weight);\r\n                float p = (_totalWeight > 0f) ? (100f * weight / _totalWeight) : ((index == 0) ? 100f : 0f);\r\n                EditorGUI.LabelField(percRect, string.Format(\"{0:0.#}%\", p));\r\n            }\r\n            else\r\n            {\r\n                //Draw Triggerable - this is the simple case to make a clean designer set up for newbs\r\n                var top = area.yMin + MARGIN;\r\n                var labelRect = new Rect(area.xMin, top, EditorGUIUtility.labelWidth, EditorGUIUtility.singleLineHeight);\r\n                trigRect = new Rect(area.xMin + EditorGUIUtility.labelWidth, top, area.width - EditorGUIUtility.labelWidth, EditorGUIUtility.singleLineHeight);\r\n\r\n                if (this.OnDrawCustomizedEntryLabel != null)\r\n                    this.OnDrawCustomizedEntryLabel(labelRect, element, index);\r\n                else\r\n                    DrawDefaultListElementLabel(labelRect, element, index);\r\n            }\r\n\r\n            //Draw Triggerable - this is the simple case to make a clean designer set up for newbs\r\n            EditorGUI.BeginChangeCheck();\r\n            var targObj = TriggerTargetPropertyDrawer.TargetObjectField(trigRect, GUIContent.none, targProp.objectReferenceValue);\r\n            if(EditorGUI.EndChangeCheck())\r\n            {\r\n                var actInfo = TriggerTargetPropertyDrawer.GetTriggerActivationInfo(element);\r\n                targProp.objectReferenceValue = TriggerTarget.IsValidTriggerTarget(targObj, actInfo.ActivationType) ? targObj : null;\r\n            }\r\n            EditorGUI.EndProperty();\r\n            \r\n            ReorderableListHelper.DrawDraggableElementDeleteContextMenu(_targetList, area, index, isActive, isFocused);\r\n        }\r\n\r\n        private void _targetList_OnAdd(ReorderableList lst)\r\n        {\r\n            lst.serializedProperty.arraySize++;\r\n            lst.index = lst.serializedProperty.arraySize - 1;\r\n\r\n            lst.serializedProperty.serializedObject.ApplyModifiedProperties();\r\n\r\n            var obj = EditorHelper.GetTargetObjectOfProperty(lst.serializedProperty.GetArrayElementAtIndex(lst.index)) as TriggerTarget;\r\n            if (obj != null)\r\n            {\r\n                obj.Clear();\r\n                obj.Weight = 1f;\r\n                lst.serializedProperty.serializedObject.Update();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Utils\r\n\r\n        public static void DrawDefaultListElementLabel(Rect area, SerializedProperty property, int index)\r\n        {\r\n            var r0 = new Rect(area.xMin, area.yMin, Mathf.Min(25f, area.width), EditorGUIUtility.singleLineHeight);\r\n            var r1 = new Rect(r0.xMax, area.yMin, Mathf.Max(0f, area.width - r0.width), EditorGUIUtility.singleLineHeight);\r\n            EditorGUI.LabelField(r0, index.ToString(\"00:\"));\r\n            TriggerTargetPropertyDrawer.DrawTriggerActivationTypeDropdown(r1, property, false);\r\n        }\r\n        \r\n        /// <summary>\r\n        /// Adds targets to a Trigger/SPEvent.\r\n        /// \r\n        /// This method applies changes to the SerializedProperty. Only call if you expect this behaviour.\r\n        /// </summary>\r\n        /// <param name=\"triggerProperty\"></param>\r\n        /// <param name=\"objs\"></param>\r\n        public static void AddObjectsToTrigger(SerializedProperty triggerProperty, UnityEngine.Object[] objs)\r\n        {\r\n            if (triggerProperty == null) throw new System.ArgumentNullException(\"triggerProperty\");\r\n            if (triggerProperty.serializedObject.isEditingMultipleObjects) throw new System.ArgumentException(\"Can not use this method for multi-selected SerializedObjects.\", \"triggerProperty\");\r\n\r\n            try\r\n            {\r\n                triggerProperty.serializedObject.ApplyModifiedProperties();\r\n                var trigger = EditorHelper.GetTargetObjectOfProperty(triggerProperty) as BaseSPEvent;\r\n                if (trigger == null) return;\r\n\r\n                Undo.RecordObject(triggerProperty.serializedObject.targetObject, \"Add Trigger Targets\");\r\n                using (var set = TempCollection.GetSet<UnityEngine.Object>())\r\n                {\r\n                    for (int i = 0; i < trigger.Targets.Count; i++)\r\n                    {\r\n                        set.Add(trigger.Targets[i].Target);\r\n                    }\r\n\r\n                    foreach (var obj in objs)\r\n                    {\r\n                        if (set.Contains(obj)) continue;\r\n                        set.Add(obj);\r\n\r\n                        var targ = trigger.AddNew();\r\n                        if (TriggerTarget.IsValidTriggerTarget(obj, TriggerActivationType.TriggerAllOnTarget))\r\n                            targ.ConfigureTriggerAll(obj);\r\n                        else\r\n                            targ.ConfigureCallMethod(obj, \"\");\r\n                        targ.Weight = 1f;\r\n                    }\r\n                }\r\n\r\n                triggerProperty.serializedObject.Update();\r\n            }\r\n            catch (System.Exception ex)\r\n            {\r\n                Debug.LogException(ex);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/TriggerTargetPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(TriggerTarget))]\r\n    public class TriggerTargetPropertyDrawer : PropertyDrawer\r\n    {\r\n        \r\n        public const string PROP_TRIGGERABLETARG = \"_triggerable\";\r\n        public const string PROP_TRIGGERABLEARGS = \"_triggerableArgs\";\r\n        public const string PROP_ACTIVATIONTYPE = \"_activationType\";\r\n        public const string PROP_METHODNAME = \"_methodName\";\r\n\r\n\r\n        private const float ARG_BTN_WIDTH = 18f;\r\n\r\n        public bool DrawWeight;\r\n\r\n        private GUIContent _defaultArgLabel = new GUIContent(\"Triggerable Arg\");\r\n        private GUIContent _undefinedArgLabel = new GUIContent(\"Undefined Arg\", \"The argument is not explicitly defined unless the trigger's event defines it.\");\r\n        private GUIContent _messageArgLabel = new GUIContent(\"Message Arg\", \"A parameter to be passed to the message if one is desired.\");\r\n        private GUIContent _argBtnLabel = new GUIContent(\"||\", \"Change between accepting a configured argument or not.\");\r\n        private VariantReferencePropertyDrawer _variantDrawer = new VariantReferencePropertyDrawer();\r\n        private int _callMethodModeExtraLines = 0;\r\n\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            var actProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_ACTIVATIONTYPE);\r\n            //var act = (TriggerActivationType)actProp.enumValueIndex;\r\n            var act = actProp.GetEnumValue<TriggerActivationType>();\r\n\r\n            float h = EditorGUIUtility.singleLineHeight;\r\n\r\n            switch (act)\r\n            {\r\n                case TriggerActivationType.TriggerAllOnTarget:\r\n                    h += EditorGUIUtility.singleLineHeight * 2.0f;\r\n                    break;\r\n                case TriggerActivationType.TriggerSelectedTarget:\r\n                    //h += EditorGUIUtility.singleLineHeight * 3.0f;\r\n                    h += EditorGUIUtility.singleLineHeight * 2.0f;\r\n                    break;\r\n                case TriggerActivationType.SendMessage:\r\n                    h += EditorGUIUtility.singleLineHeight * 3.0f;\r\n                    break;\r\n                case TriggerActivationType.CallMethodOnSelectedTarget:\r\n                    //h += EditorGUIUtility.singleLineHeight * (3.0f + _callMethodModeExtraLines);\r\n                    h += EditorGUIUtility.singleLineHeight * (2.0f + _callMethodModeExtraLines);\r\n                    break;\r\n                case TriggerActivationType.EnableTarget:\r\n                    h += EditorGUIUtility.singleLineHeight;\r\n                    break;\r\n                case TriggerActivationType.DestroyTarget:\r\n                    h += EditorGUIUtility.singleLineHeight;\r\n                    break;\r\n            }\r\n\r\n            return h;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            EditorGUI.BeginProperty(position, label, property);\r\n\r\n            //Draw ActivationType Popup\r\n            var r0 = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n            var act = TriggerTargetPropertyDrawer.DrawTriggerActivationTypeDropdown(r0, property, true);\r\n\r\n            //Draw Advanced\r\n            var area = new Rect(position.xMin, r0.yMax, position.width, position.height - r0.height);\r\n            switch (act)\r\n            {\r\n                case TriggerActivationType.TriggerAllOnTarget:\r\n                    this.DrawAdvanced_TriggerAll(area, property);\r\n                    break;\r\n                case TriggerActivationType.TriggerSelectedTarget:\r\n                    this.DrawAdvanced_TriggerSelected(area, property);\r\n                    break;\r\n                case TriggerActivationType.SendMessage:\r\n                    this.DrawAdvanced_SendMessage(area, property);\r\n                    break;\r\n                case TriggerActivationType.CallMethodOnSelectedTarget:\r\n                    this.DrawAdvanced_CallMethodOnSelected(area, property);\r\n                    break;\r\n                case TriggerActivationType.EnableTarget:\r\n                    this.DrawAdvanced_EnableTarget(area, property);\r\n                    break;\r\n                case TriggerActivationType.DestroyTarget:\r\n                    this.DrawAdvanced_DestroyTarget(area, property);\r\n                    break;\r\n            }\r\n\r\n            EditorGUI.EndProperty();\r\n        }\r\n\r\n\r\n        public static TriggerActivationType DrawTriggerActivationTypeDropdown(Rect area, SerializedProperty property, bool drawLabel)\r\n        {\r\n            var actProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_ACTIVATIONTYPE);\r\n            //EditorGUI.PropertyField(area, actProp);\r\n            \r\n            var actInfo = GetTriggerActivationInfo(property);\r\n            int index = System.Array.IndexOf(_triggerActivationTypeDisplayNames, actInfo.ActivationTypeDisplayName);\r\n            EditorGUI.BeginChangeCheck();\r\n\r\n            if (drawLabel)\r\n                index = EditorGUI.Popup(area, actInfo.ActivationTypeProperty.displayName, index, _triggerActivationTypeDisplayNames);\r\n            else\r\n                index = EditorGUI.Popup(area, index, _triggerActivationTypeDisplayNames);\r\n\r\n            if(EditorGUI.EndChangeCheck())\r\n            {\r\n                if (index <= 3)\r\n                {\r\n                    //the main ones\r\n                    actInfo.ActivationTypeProperty.SetEnumValue<TriggerActivationType>((TriggerActivationType)index);\r\n                }\r\n                else if(index == 4)\r\n                {\r\n                    //enable\r\n                    actInfo.ActivationTypeProperty.SetEnumValue<TriggerActivationType>(TriggerActivationType.EnableTarget);\r\n                    var argProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_METHODNAME);\r\n                    argProp.stringValue = EnableMode.Enable.ToString();\r\n                }\r\n                else if(index == 5)\r\n                {\r\n                    //disable\r\n                    actInfo.ActivationTypeProperty.SetEnumValue<TriggerActivationType>(TriggerActivationType.EnableTarget);\r\n                    var argProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_METHODNAME);\r\n                    argProp.stringValue = EnableMode.Disable.ToString();\r\n                }\r\n                else if(index == 6)\r\n                {\r\n                    //toggle\r\n                    actInfo.ActivationTypeProperty.SetEnumValue<TriggerActivationType>(TriggerActivationType.EnableTarget);\r\n                    var argProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_METHODNAME);\r\n                    argProp.stringValue = EnableMode.Toggle.ToString();\r\n                }\r\n                else if(index == 7)\r\n                {\r\n                    //destroy\r\n                    actInfo.ActivationTypeProperty.SetEnumValue<TriggerActivationType>(TriggerActivationType.DestroyTarget);\r\n                }\r\n                else\r\n                {\r\n                    //unknown\r\n                    actInfo.ActivationTypeProperty.SetEnumValue<TriggerActivationType>(TriggerActivationType.TriggerAllOnTarget);\r\n                }\r\n            }\r\n\r\n            return actInfo.ActivationTypeProperty.GetEnumValue<TriggerActivationType>();\r\n        }\r\n\r\n\r\n        private void DrawAdvanced_TriggerAll(Rect area, SerializedProperty property)\r\n        {\r\n            //Draw Target\r\n            /*\r\n            var targRect = new Rect(area.xMin, area.yMin, area.width, EditorGUIUtility.singleLineHeight);\r\n            var targProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_TRIGGERABLETARG);\r\n            var targLabel = EditorHelper.TempContent(\"Triggerable Target\");\r\n            var targGo = GameObjectUtil.GetGameObjectFromSource(targProp.objectReferenceValue);\r\n            var newTargGo = EditorGUI.ObjectField(targRect, targLabel, targGo, typeof(GameObject), true) as GameObject;\r\n            if (newTargGo != targGo)\r\n            {\r\n                targGo = newTargGo;\r\n                targProp.objectReferenceValue = (targGo != null) ? targGo.transform : null;\r\n            }\r\n            */\r\n            var targRect = new Rect(area.xMin, area.yMin, area.width, EditorGUIUtility.singleLineHeight);\r\n            var targProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_TRIGGERABLETARG);\r\n            var targLabel = EditorHelper.TempContent(\"Triggerable Target\");\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            var targObj = TargetObjectField(targRect, targLabel, targProp.objectReferenceValue);\r\n            if(EditorGUI.EndChangeCheck())\r\n            {\r\n                targProp.objectReferenceValue = TriggerTarget.IsValidTriggerTarget(targObj, TriggerActivationType.TriggerAllOnTarget) ? targObj : null;\r\n            }\r\n\r\n            //Draw Triggerable Arg\r\n            var argRect = new Rect(area.xMin, targRect.yMax, area.width - ARG_BTN_WIDTH, EditorGUIUtility.singleLineHeight);\r\n            var btnRect = new Rect(argRect.xMax, argRect.yMin, ARG_BTN_WIDTH, EditorGUIUtility.singleLineHeight);\r\n            var argArrayProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_TRIGGERABLEARGS);\r\n            if (argArrayProp.arraySize == 0)\r\n            {\r\n                EditorGUI.LabelField(argRect, _defaultArgLabel, _undefinedArgLabel);\r\n                if (GUI.Button(btnRect, _argBtnLabel))\r\n                {\r\n                    argArrayProp.arraySize = 1;\r\n                    argArrayProp.serializedObject.ApplyModifiedProperties();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (argArrayProp.arraySize > 1) argArrayProp.arraySize = 1;\r\n                var argProp = argArrayProp.GetArrayElementAtIndex(0);\r\n                //EditorGUI.PropertyField(argRect, argProp, _defaultArgLabel);\r\n                _variantDrawer.RestrictVariantType = false;\r\n                _variantDrawer.ForcedObjectType = null;\r\n                _variantDrawer.OnGUI(argRect, argProp, _defaultArgLabel);\r\n\r\n                if (GUI.Button(btnRect, _argBtnLabel))\r\n                {\r\n                    argArrayProp.arraySize = 0;\r\n                    argArrayProp.serializedObject.ApplyModifiedProperties();\r\n                }\r\n            }\r\n        }\r\n\r\n        private void DrawAdvanced_TriggerSelected(Rect area, SerializedProperty property)\r\n        {\r\n            var targRect = new Rect(area.xMin, area.yMin, area.width, EditorGUIUtility.singleLineHeight);\r\n            var targProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_TRIGGERABLETARG);\r\n            targRect = EditorGUI.PrefixLabel(targRect, EditorHelper.TempContent(\"Triggerable Target\"));\r\n            \r\n            //validate\r\n            if (!GameObjectUtil.IsGameObjectSource(targProp.objectReferenceValue) && !(targProp.objectReferenceValue is ITriggerableMechanism))\r\n                targProp.objectReferenceValue = null;\r\n\r\n            //draw obj field\r\n            if (targProp.objectReferenceValue != null)\r\n            {\r\n                if (SPEditorGUI.XButton(ref targRect, \"Clear Selected Object\", true))\r\n                {\r\n                    targProp.objectReferenceValue = null;\r\n                    goto DrawTriggerableArg;\r\n                }\r\n\r\n                var targObj = targProp.objectReferenceValue;\r\n\r\n                var availableMechanisms = ObjUtil.GetAllFromSource<ITriggerableMechanism>(targObj);\r\n                var availableMechanismTypeNames = availableMechanisms.Select((o) => EditorHelper.TempContent(o.GetType().Name)).ToArray();\r\n\r\n                var index = System.Array.IndexOf(availableMechanisms, targObj);\r\n                EditorGUI.BeginChangeCheck();\r\n                index = EditorGUI.Popup(targRect, GUIContent.none, index, availableMechanismTypeNames);\r\n                if (EditorGUI.EndChangeCheck())\r\n                {\r\n                    targObj = (index >= 0) ? availableMechanisms[index] as UnityEngine.Object : null;\r\n                    targProp.objectReferenceValue = targObj;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                EditorGUI.BeginChangeCheck();\r\n                var targObj = TargetObjectField(targRect, GUIContent.none, targProp.objectReferenceValue);\r\n                if (EditorGUI.EndChangeCheck())\r\n                {\r\n                    targObj = ObjUtil.GetAsFromSource<ITriggerableMechanism>(targObj) as UnityEngine.Object;\r\n                    targProp.objectReferenceValue = targObj;\r\n                }\r\n            }\r\n\r\n            \r\n            //Draw Triggerable Arg\r\nDrawTriggerableArg:\r\n            var argRect = new Rect(area.xMin, targRect.yMax, area.width - ARG_BTN_WIDTH, EditorGUIUtility.singleLineHeight);\r\n            var btnRect = new Rect(argRect.xMax, argRect.yMin, ARG_BTN_WIDTH, EditorGUIUtility.singleLineHeight);\r\n            var argArrayProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_TRIGGERABLEARGS);\r\n            if (argArrayProp.arraySize == 0)\r\n            {\r\n                EditorGUI.LabelField(argRect, _defaultArgLabel, _undefinedArgLabel);\r\n                if (GUI.Button(btnRect, _argBtnLabel))\r\n                {\r\n                    argArrayProp.arraySize = 1;\r\n                    argArrayProp.serializedObject.ApplyModifiedProperties();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (argArrayProp.arraySize > 1) argArrayProp.arraySize = 1;\r\n                var argProp = argArrayProp.GetArrayElementAtIndex(0);\r\n                //EditorGUI.PropertyField(argRect, argProp, _defaultArgLabel);\r\n                _variantDrawer.RestrictVariantType = false;\r\n                _variantDrawer.ForcedObjectType = null;\r\n                _variantDrawer.OnGUI(argRect, argProp, _defaultArgLabel);\r\n\r\n                if (GUI.Button(btnRect, _argBtnLabel))\r\n                {\r\n                    argArrayProp.arraySize = 0;\r\n                    argArrayProp.serializedObject.ApplyModifiedProperties();\r\n                }\r\n            }\r\n        }\r\n\r\n        private void DrawAdvanced_SendMessage(Rect area, SerializedProperty property)\r\n        {\r\n            //Draw Target\r\n            var targRect = new Rect(area.xMin, area.yMin, area.width, EditorGUIUtility.singleLineHeight);\r\n            var targProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_TRIGGERABLETARG);\r\n            var targLabel = EditorHelper.TempContent(\"Triggerable Target\");\r\n            //targProp.objectReferenceValue = TransformField(targRect, targLabel, targProp.objectReferenceValue);\r\n            targProp.objectReferenceValue = TransformOrProxyField(targRect, targLabel, targProp.objectReferenceValue);\r\n            \r\n\r\n            //Draw MessageName\r\n            var msgRect = new Rect(area.xMin, targRect.yMax, area.width, EditorGUIUtility.singleLineHeight);\r\n            EditorGUI.PropertyField(msgRect, property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_METHODNAME), new GUIContent(\"Message\", \"Name of the message that should be sent.\"), false);\r\n\r\n            //Draw Triggerable Arg\r\n            var argRect = new Rect(area.xMin, msgRect.yMax, area.width - ARG_BTN_WIDTH, EditorGUIUtility.singleLineHeight);\r\n            var btnRect = new Rect(argRect.xMax, argRect.yMin, ARG_BTN_WIDTH, EditorGUIUtility.singleLineHeight);\r\n            var argArrayProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_TRIGGERABLEARGS);\r\n            if (argArrayProp.arraySize == 0)\r\n            {\r\n                EditorGUI.LabelField(argRect, _messageArgLabel, _undefinedArgLabel);\r\n                if (GUI.Button(btnRect, _argBtnLabel))\r\n                {\r\n                    argArrayProp.arraySize = 1;\r\n                    argArrayProp.serializedObject.ApplyModifiedProperties();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (argArrayProp.arraySize > 1) argArrayProp.arraySize = 1;\r\n                var argProp = argArrayProp.GetArrayElementAtIndex(0);\r\n                //EditorGUI.PropertyField(argRect, argProp, _messageArgLabel);\r\n                _variantDrawer.RestrictVariantType = false;\r\n                _variantDrawer.ForcedObjectType = null;\r\n                _variantDrawer.OnGUI(argRect, argProp, _messageArgLabel);\r\n\r\n                if (GUI.Button(btnRect, _argBtnLabel))\r\n                {\r\n                    argArrayProp.arraySize = 0;\r\n                    argArrayProp.serializedObject.ApplyModifiedProperties();\r\n                }\r\n            }\r\n        }\r\n\r\n        private void DrawAdvanced_CallMethodOnSelected(Rect area, SerializedProperty property)\r\n        {\r\n            //Draw Target\r\n            /*\r\n            var targRect = new Rect(area.xMin, area.yMin, area.width, EditorGUIUtility.singleLineHeight);\r\n            var targProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_TRIGGERABLETARG);\r\n            var targLabel = EditorHelper.TempContent(\"Triggerable Target\");\r\n            var targGo = GameObjectUtil.GetGameObjectFromSource(targProp.objectReferenceValue);\r\n            var newTargGo = EditorGUI.ObjectField(targRect, targLabel, targGo, typeof(GameObject), true) as GameObject;\r\n            if (newTargGo != targGo)\r\n            {\r\n                targGo = newTargGo;\r\n                targProp.objectReferenceValue = (targGo != null) ? targGo.transform : null;\r\n            }\r\n\r\n            var targCompPopupRect = new Rect(area.xMin, targRect.yMax, area.width, EditorGUIUtility.singleLineHeight);\r\n            if (targGo != null)\r\n            {\r\n                EditorGUI.BeginChangeCheck();\r\n                var selectedComp = SPEditorGUI.SelectComponentFromSourceField(targCompPopupRect, \"Target Component\", targGo, targProp.objectReferenceValue as Component);\r\n                if (EditorGUI.EndChangeCheck())\r\n                {\r\n                    targProp.objectReferenceValue = selectedComp;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                EditorGUI.LabelField(targCompPopupRect, \"Target Component\", \"(First Select a Target)\");\r\n            }\r\n            */\r\n\r\n\r\n            var targRect = new Rect(area.xMin, area.yMin, area.width, EditorGUIUtility.singleLineHeight);\r\n            var targProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_TRIGGERABLETARG);\r\n            targRect = EditorGUI.PrefixLabel(targRect, EditorHelper.TempContent(\"Triggerable Target\"));\r\n            \r\n            var targGo = GameObjectUtil.GetGameObjectFromSource(targProp.objectReferenceValue);\r\n            if(targGo != null)\r\n            {\r\n                if (SPEditorGUI.XButton(ref targRect, \"Clear Selected Object\", true))\r\n                {\r\n                    targProp.objectReferenceValue = null;\r\n                    goto DrawMethodName;\r\n                }\r\n\r\n                EditorGUI.BeginChangeCheck();\r\n                var selectedComp = SPEditorGUI.SelectComponentFromSourceField(targRect, GUIContent.none, targGo, targProp.objectReferenceValue as Component);\r\n                if (EditorGUI.EndChangeCheck())\r\n                {\r\n                    targProp.objectReferenceValue = selectedComp;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                targProp.objectReferenceValue = TargetObjectField(targRect, GUIContent.none, targProp.objectReferenceValue);\r\n            }\r\n\r\n\r\n            //Draw Method Name\r\nDrawMethodName:\r\n            //var methNameRect = new Rect(area.xMin, targCompPopupRect.yMax, area.width, EditorGUIUtility.singleLineHeight);\r\n            var methNameRect = new Rect(area.xMin, targRect.yMax, area.width, EditorGUIUtility.singleLineHeight);\r\n            System.Reflection.MemberInfo selectedMember = null;\r\n            if (targProp.objectReferenceValue != null)\r\n            {\r\n                var methProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_METHODNAME);\r\n\r\n                //var tp = targProp.objectReferenceValue.GetType();\r\n                //var members = GetAvailableMethods(tp).ToArray();\r\n\r\n                //var members = com.spacepuppy.Dynamic.DynamicUtil.GetEasilySerializedMembers(targProp.objectReferenceValue, System.Reflection.MemberTypes.Method).ToArray();\r\n                var members = com.spacepuppy.Dynamic.DynamicUtil.GetEasilySerializedMembers(targProp.objectReferenceValue, System.Reflection.MemberTypes.All, spacepuppy.Dynamic.DynamicMemberAccess.Write).ToArray();\r\n                System.Array.Sort(members, (a, b) => string.Compare(a.Name, b.Name, true));\r\n                var memberNames = members.Select((m) => m.Name).ToArray();\r\n\r\n                int index = System.Array.IndexOf(memberNames, methProp.stringValue);\r\n                index = EditorGUI.Popup(methNameRect, new GUIContent(\"Method\", \"The method/prop on the target to call.\"), index, (from n in memberNames select new GUIContent(n)).ToArray());\r\n                methProp.stringValue = (index >= 0) ? memberNames[index] : null;\r\n                selectedMember = (index >= 0) ? members[index] : null;\r\n            }\r\n            else\r\n            {\r\n                EditorGUI.Popup(methNameRect, new GUIContent(\"Method\", \"The method/prop on the target to call.\"), -1, new GUIContent[0]);\r\n            }\r\n\r\n            property.serializedObject.ApplyModifiedProperties();\r\n\r\n            //Draw Triggerable Arg\r\n            var parr = (selectedMember != null) ? com.spacepuppy.Dynamic.DynamicUtil.GetDynamicParameterInfo(selectedMember) : null;\r\n            if (parr == null || parr.Length == 0)\r\n            {\r\n                //NO PARAMETERS\r\n                _callMethodModeExtraLines = 1;\r\n\r\n                var argRect = new Rect(area.xMin, methNameRect.yMax, area.width, EditorGUIUtility.singleLineHeight);\r\n                var argArrayProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_TRIGGERABLEARGS);\r\n                if (argArrayProp.arraySize > 0)\r\n                {\r\n                    argArrayProp.arraySize = 0;\r\n                    argArrayProp.serializedObject.ApplyModifiedProperties();\r\n                }\r\n\r\n                var cache = SPGUI.Disable();\r\n                EditorGUI.LabelField(argRect, GUIContent.none, new GUIContent(\"*Zero Parameter Count*\"));\r\n                cache.Reset();\r\n            }\r\n            else\r\n            {\r\n                //MULTIPLE PARAMETERS - special case, does not support trigger event arg\r\n                _callMethodModeExtraLines = parr.Length;\r\n\r\n                var argArrayProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_TRIGGERABLEARGS);\r\n\r\n                if (argArrayProp.arraySize != parr.Length)\r\n                {\r\n                    argArrayProp.arraySize = parr.Length;\r\n                    argArrayProp.serializedObject.ApplyModifiedProperties();\r\n                }\r\n\r\n                EditorGUI.indentLevel++;\r\n                for (int i = 0; i < parr.Length; i++)\r\n                {\r\n                    var paramType = parr[i].ParameterType;\r\n                    var argRect = new Rect(area.xMin, methNameRect.yMax + i * EditorGUIUtility.singleLineHeight, area.width, EditorGUIUtility.singleLineHeight);\r\n                    var argProp = argArrayProp.GetArrayElementAtIndex(i);\r\n\r\n                    if (paramType == typeof(object))\r\n                    {\r\n                        //draw the default variant as the method accepts anything\r\n                        _variantDrawer.RestrictVariantType = false;\r\n                        _variantDrawer.ForcedObjectType = null;\r\n                        _variantDrawer.OnGUI(argRect, argProp, EditorHelper.TempContent(\"Arg \" + i.ToString() + \": \" + parr[i].ParameterName, \"A parameter to be passed to the method if needed.\"));\r\n                    }\r\n                    else\r\n                    {\r\n                        _variantDrawer.RestrictVariantType = true;\r\n                        _variantDrawer.TypeRestrictedTo = paramType;\r\n                        _variantDrawer.ForcedObjectType = (paramType.IsInterface || TypeUtil.IsType(paramType, typeof(Component))) ? paramType : null;\r\n                        _variantDrawer.OnGUI(argRect, argProp, EditorHelper.TempContent(\"Arg \" + i.ToString() + \": \" + parr[i].ParameterName, \"A parameter to be passed to the method if needed.\"));\r\n                    }\r\n                }\r\n                EditorGUI.indentLevel--;\r\n            }\r\n\r\n        }\r\n\r\n        private void DrawAdvanced_EnableTarget(Rect area, SerializedProperty property)\r\n        {\r\n            //Draw Target\r\n            var targRect = new Rect(area.xMin, area.yMin, area.width, EditorGUIUtility.singleLineHeight);\r\n            var targProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_TRIGGERABLETARG);\r\n            var targLabel = EditorHelper.TempContent(\"Triggerable Target\");\r\n            //targProp.objectReferenceValue = TransformField(targRect, targLabel, targProp.objectReferenceValue);\r\n            targProp.objectReferenceValue = TransformOrProxyField(targRect, targLabel, targProp.objectReferenceValue);\r\n\r\n            /*\r\n            //Draw Triggerable Arg\r\n            var argRect = new Rect(area.xMin, targRect.yMax, area.width, EditorGUIUtility.singleLineHeight);\r\n            var argProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_METHODNAME);\r\n\r\n            var e = ConvertUtil.ToEnum<EnableMode>(argProp.stringValue, EnableMode.Enable);\r\n            e = (EnableMode)EditorGUI.EnumPopup(argRect, \"Mode\", e);\r\n            argProp.stringValue = e.ToString();\r\n            */\r\n        }\r\n\r\n        private void DrawAdvanced_DestroyTarget(Rect area, SerializedProperty property)\r\n        {\r\n            //Draw Target\r\n            var targRect = new Rect(area.xMin, area.yMin, area.width, EditorGUIUtility.singleLineHeight);\r\n            var targProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_TRIGGERABLETARG);\r\n            var targLabel = EditorHelper.TempContent(\"Triggerable Target\");\r\n            //targProp.objectReferenceValue = TransformField(targRect, targLabel, targProp.objectReferenceValue);\r\n            targProp.objectReferenceValue = TransformOrProxyField(targRect, targLabel, targProp.objectReferenceValue);\r\n        }\r\n\r\n\r\n\r\n        #region Utils\r\n\r\n        private static string[] _triggerActivationTypeDisplayNames = new string[]\r\n        {\r\n            \"Trigger All On Target\",\r\n            \"Trigger Selected Target\",\r\n            \"Send Message\",\r\n            \"Call Method On Selected Target\",\r\n            \"Enable Target\",\r\n            \"Disable Target\",\r\n            \"Toggle Target\",\r\n            \"Destroy Target\"\r\n        };\r\n        public struct TriggerActivationInfo\r\n        {\r\n            public TriggerActivationType ActivationType;\r\n            public string ActivationTypeDisplayName;\r\n            public SerializedProperty ActivationTypeProperty;\r\n        }\r\n        public static TriggerActivationInfo GetTriggerActivationInfo(SerializedProperty triggerTargetProperty)\r\n        {\r\n            var result = new TriggerActivationInfo();\r\n            result.ActivationTypeProperty = triggerTargetProperty.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_ACTIVATIONTYPE);\r\n            result.ActivationType = result.ActivationTypeProperty.GetEnumValue<TriggerActivationType>();\r\n            switch(result.ActivationType)\r\n            {\r\n                case TriggerActivationType.TriggerAllOnTarget:\r\n                case TriggerActivationType.TriggerSelectedTarget:\r\n                case TriggerActivationType.SendMessage:\r\n                case TriggerActivationType.CallMethodOnSelectedTarget:\r\n                    result.ActivationTypeDisplayName = _triggerActivationTypeDisplayNames[(int)result.ActivationType];\r\n                    break;\r\n                case TriggerActivationType.EnableTarget:\r\n                    {\r\n                        var argProp = triggerTargetProperty.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_METHODNAME);\r\n                        switch (ConvertUtil.ToEnum<EnableMode>(argProp.stringValue))\r\n                        {\r\n                            case EnableMode.Enable:\r\n                                result.ActivationTypeDisplayName = _triggerActivationTypeDisplayNames[4];\r\n                                break;\r\n                            case EnableMode.Disable:\r\n                                result.ActivationTypeDisplayName = _triggerActivationTypeDisplayNames[5];\r\n                                break;\r\n                            case EnableMode.Toggle:\r\n                                result.ActivationTypeDisplayName = _triggerActivationTypeDisplayNames[6];\r\n                                break;\r\n                        }\r\n                    }\r\n                    break;\r\n                case TriggerActivationType.DestroyTarget:\r\n                    result.ActivationTypeDisplayName = _triggerActivationTypeDisplayNames[7];\r\n                    break;\r\n            }\r\n            return result;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Validates target object is appropriate for the activation type. Null is considered valid.\r\n        /// </summary>\r\n        /// <param name=\"property\"></param>\r\n        /// <returns>Returns false if invalid</returns>\r\n        public static bool ValidateTriggerTargetProperty(SerializedProperty property)\r\n        {\r\n            if (property == null) return false;\r\n\r\n            var targProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_TRIGGERABLETARG);\r\n            if (targProp.objectReferenceValue == null) return true;\r\n\r\n            var actProp = property.FindPropertyRelative(TriggerTargetPropertyDrawer.PROP_ACTIVATIONTYPE);\r\n            var act = actProp.GetEnumValue<TriggerActivationType>();\r\n            \r\n            if(!TriggerTarget.IsValidTriggerTarget(targProp.objectReferenceValue, act))\r\n            {\r\n                targProp.objectReferenceValue = null;\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                return true;\r\n            }\r\n        }\r\n        \r\n        public static UnityEngine.Object TargetObjectField(Rect position, GUIContent label, UnityEngine.Object target)\r\n        {\r\n            EditorGUI.BeginChangeCheck();\r\n\r\n            UnityEngine.Object result = target;\r\n            if (GameObjectUtil.IsGameObjectSource(result))\r\n                result = GameObjectUtil.GetGameObjectFromSource(result);\r\n            result = EditorGUI.ObjectField(position, label, result, typeof(UnityEngine.Object), true);\r\n            if (EditorGUI.EndChangeCheck())\r\n            {\r\n                if (GameObjectUtil.IsGameObjectSource(result))\r\n                {\r\n                    return GameObjectUtil.GetGameObjectFromSource(result).transform;\r\n                }\r\n                else\r\n                {\r\n                    return result;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return target;\r\n            }\r\n        }\r\n\r\n        private static Transform TransformField(Rect position, GUIContent label, UnityEngine.Object target)\r\n        {\r\n            if (!GameObjectUtil.IsGameObjectSource(target))\r\n            {\r\n                GUI.changed = true;\r\n                target = null;\r\n            }\r\n\r\n            var go = GameObjectUtil.GetGameObjectFromSource(target);\r\n            go = EditorGUI.ObjectField(position, label, go, typeof(GameObject), true) as GameObject;\r\n            return go != null ? go.transform : null;\r\n        }\r\n\r\n        private static UnityEngine.Object TransformOrProxyField(Rect position, GUIContent label, UnityEngine.Object target)\r\n        {\r\n            if(!GameObjectUtil.IsGameObjectSource(target))\r\n            {\r\n                GUI.changed = true;\r\n                target = null;\r\n            }\r\n\r\n            if(target == null)\r\n            {\r\n                var go = EditorGUI.ObjectField(position, label, target, typeof(GameObject), true) as GameObject;\r\n                return (go != null) ? go.transform : null;\r\n            }\r\n            else\r\n            {\r\n                var targGo = GameObjectUtil.GetGameObjectFromSource(target);\r\n                if(target is IProxy || targGo.HasComponent<IProxy>())\r\n                {\r\n                    using (var lst = com.spacepuppy.Collections.TempCollection.GetList<IProxy>())\r\n                    {\r\n                        targGo.GetComponents<IProxy>(lst);\r\n                        GUIContent[] entries = new GUIContent[lst.Count + 1];\r\n                        int index = -1;\r\n                        entries[0] = EditorHelper.TempContent(\"GameObject\");\r\n                        for(int i = 0; i < lst.Count; i++)\r\n                        {\r\n                            entries[i + 1] = EditorHelper.TempContent(string.Format(\"Proxy -> ({0})\", lst[i].GetType().Name));\r\n                            if (index < 0 && object.ReferenceEquals(target, lst[i]))\r\n                                index = i + 1;\r\n                        }\r\n                        if (index < 0)\r\n                            index = 0;\r\n\r\n                        index = EditorGUI.Popup(position, label, index, entries);\r\n                        if (index < 0 || index >= entries.Length)\r\n                            return null;\r\n\r\n                        return (index == 0) ? targGo.transform : lst[index - 1] as UnityEngine.Object;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    var go = EditorGUI.ObjectField(position, label, targGo, typeof(GameObject), true) as GameObject;\r\n                    return (go != null) ? go.transform : null;\r\n                }\r\n            }\r\n        }\r\n        \r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/TriggerableTargetObjectPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\nusing com.spacepuppyeditor.Components;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(TriggerableTargetObject))]\r\n    public class TriggerableTargetObjectPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public const string PROP_CONFIGURED = \"_configured\";\r\n        public const string PROP_TARGET = \"_target\";\r\n        public const string PROP_FIND = \"_find\";\r\n        public const string PROP_RESOLVEBY = \"_resolveBy\";\r\n        public const string PROP_QUERY = \"_queryString\";\r\n\r\n        public enum TargetSource\r\n        {\r\n            Arg = 0,\r\n            Self = 1,\r\n            Root = 2,\r\n            Config = 3\r\n        }\r\n\r\n        #region Fields\r\n\r\n        private System.Type _targetType;\r\n        public bool ManuallyConfigured;\r\n        public bool DefaultFromSelf;\r\n        public bool AlwaysExpanded;\r\n\r\n        private SelectableComponentPropertyDrawer _objectDrawer = new SelectableComponentPropertyDrawer()\r\n        {\r\n            AllowNonComponents = true,\r\n            AllowProxy = true\r\n        };\r\n        private bool _defaultSet;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public TriggerableTargetObjectPropertyDrawer()\r\n        {\r\n\r\n        }\r\n\r\n        public TriggerableTargetObjectPropertyDrawer(System.Type targetType, bool searchChildren, bool defaultFromSelf = false, bool alwaysExpanded = false)\r\n        {\r\n            this.ManuallyConfigured = true;\r\n            this.TargetType = targetType;\r\n            this.SearchChildren = searchChildren;\r\n            this.DefaultFromSelf = defaultFromSelf;\r\n            this.AlwaysExpanded = alwaysExpanded;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n        \r\n        public System.Type TargetType\r\n        {\r\n            get { return _targetType; }\r\n            set\r\n            {\r\n                _targetType = value;\r\n                _objectDrawer.RestrictionType = value ?? typeof(UnityEngine.Object); //typeof(Component);\r\n            }\r\n        }\r\n\r\n        public bool SearchChildren\r\n        {\r\n            get { return _objectDrawer.SearchChildren; }\r\n            set { _objectDrawer.SearchChildren = value; }\r\n        }\r\n\r\n        public IComponentChoiceSelector ChoiceSelector\r\n        {\r\n            get { return _objectDrawer.ChoiceSelector; }\r\n            set { _objectDrawer.ChoiceSelector = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void Init(SerializedProperty property)\r\n        {\r\n            if (this.ManuallyConfigured) return;\r\n            if (this.fieldInfo == null) return;\r\n\r\n            var attrib = this.fieldInfo.GetCustomAttributes(typeof(TriggerableTargetObject.ConfigAttribute), false).FirstOrDefault() as TriggerableTargetObject.ConfigAttribute;\r\n            if(attrib != null)\r\n            {\r\n                this.TargetType = attrib.TargetType;\r\n                this.SearchChildren = attrib.SearchChildren;\r\n                this.DefaultFromSelf = attrib.DefaultFromSelf;\r\n                this.AlwaysExpanded = attrib.AlwaysExpanded;\r\n            }\r\n            else\r\n            {\r\n                this.TargetType = null;\r\n                this.SearchChildren = false;\r\n                this.DefaultFromSelf = false;\r\n                this.AlwaysExpanded = false;\r\n            }\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            this.Init(property);\r\n\r\n            if(this.AlwaysExpanded || property.isExpanded)\r\n            {\r\n                return EditorGUIUtility.singleLineHeight * 2f;\r\n            }\r\n            else\r\n            {\r\n                return EditorGUIUtility.singleLineHeight;\r\n            }\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            this.Init(property);\r\n\r\n            EditorGUI.BeginProperty(position, label, property);\r\n\r\n            //################################\r\n            //FIRST LINE\r\n            var rect = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n\r\n            var configProp = property.FindPropertyRelative(PROP_CONFIGURED);\r\n            var targetProp = property.FindPropertyRelative(PROP_TARGET);\r\n            var findProp = property.FindPropertyRelative(PROP_FIND);\r\n\r\n            //var r0 = new Rect(rect.xMin, rect.yMin, EditorGUIUtility.labelWidth, rect.height);\r\n            //rect = new Rect(r0.xMax, rect.yMin, rect.width - r0.width, rect.height);\r\n            //property.isExpanded = EditorGUI.Foldout(r0, property.isExpanded, label);\r\n            if (!this.AlwaysExpanded)\r\n                property.isExpanded = SPEditorGUI.PrefixFoldoutLabel(ref rect, property.isExpanded, label);\r\n            else\r\n                rect = EditorGUI.PrefixLabel(rect, label);\r\n\r\n            var r0 = new Rect(rect.xMin, rect.yMin, Mathf.Min(rect.width * 0.25f, 50f), rect.height);\r\n            var e = (configProp.boolValue) ? TargetSource.Config : TargetSource.Arg;\r\n            EditorGUI.BeginChangeCheck();\r\n            e = (TargetSource)EditorGUI.EnumPopup(r0, e);\r\n            if(EditorGUI.EndChangeCheck())\r\n            {\r\n                UpdateTargetFromSource(targetProp, e);\r\n                configProp.boolValue = (e != TargetSource.Arg);\r\n                if(e != TargetSource.Arg) findProp.SetEnumValue(TriggerableTargetObject.FindCommand.Direct);\r\n            }\r\n            else if(e == TargetSource.Config && !_defaultSet && targetProp.objectReferenceValue == null)\r\n            {\r\n                UpdateTargetFromSource(targetProp, e);\r\n                _defaultSet = true;\r\n            }\r\n            else\r\n            {\r\n                _defaultSet = true;\r\n            }\r\n\r\n            var r1 = new Rect(rect.xMin + r0.width, rect.yMin, rect.width - r0.width, rect.height);\r\n            if(!configProp.boolValue)\r\n            {\r\n                var e0 = findProp.GetEnumValue<TriggerableTargetObject.FindCommand>();\r\n                switch(e0)\r\n                {\r\n                    case TriggerableTargetObject.FindCommand.Direct:\r\n                        EditorGUI.LabelField(r1, \"Target determined by activating trigger.\");\r\n                        break;\r\n                    case TriggerableTargetObject.FindCommand.FindParent:\r\n                    case TriggerableTargetObject.FindCommand.FindInChildren:\r\n                    case TriggerableTargetObject.FindCommand.FindInEntity:\r\n                        EditorGUI.LabelField(r1, e0.ToString() + \" of activating trigger arg.\");\r\n                        break;\r\n                    case TriggerableTargetObject.FindCommand.FindInScene:\r\n                    case TriggerableTargetObject.FindCommand.FindEntityInScene:\r\n                    default:\r\n                        configProp.boolValue = false;\r\n                        targetProp.objectReferenceValue = null;\r\n                        EditorGUI.LabelField(r1, e0.ToString());\r\n                        break;\r\n                }\r\n\r\n                targetProp.objectReferenceValue = null;\r\n            }\r\n            else\r\n            {\r\n                _objectDrawer.OnGUI(r1, targetProp, GUIContent.none);\r\n            }\r\n\r\n\r\n            //################################\r\n            //SECOND LINE\r\n            if (this.AlwaysExpanded || property.isExpanded)\r\n            {\r\n                var indent = EditorGUIUtility.labelWidth * 0.5f;\r\n                rect = new Rect(position.xMin + indent, position.yMin + EditorGUIUtility.singleLineHeight, Mathf.Max(0f, position.width - indent), EditorGUIUtility.singleLineHeight);\r\n\r\n                var w0 = Mathf.Min(rect.width * 0.3f, 120f);\r\n                var w1 = Mathf.Min(rect.width * 0.3f, 80f);\r\n                var w2 = rect.width - w0 - w1;\r\n                r0 = new Rect(rect.xMin, rect.yMin, w0, rect.height);\r\n                r1 = new Rect(r0.xMax, rect.yMin, w1, rect.height);\r\n                var r2 = new Rect(r1.xMax, rect.yMin, w2, rect.height);\r\n                \r\n                var resolveProp = property.FindPropertyRelative(PROP_RESOLVEBY);\r\n                var queryProp = property.FindPropertyRelative(PROP_QUERY);\r\n\r\n                var e0 = findProp.GetEnumValue<TriggerableTargetObject.FindCommand>();\r\n                EditorGUI.BeginChangeCheck();\r\n                e0 = (TriggerableTargetObject.FindCommand)EditorGUI.EnumPopup(r0, e0);\r\n                if (EditorGUI.EndChangeCheck())\r\n                {\r\n                    findProp.SetEnumValue(e0);\r\n                }\r\n                switch (e0)\r\n                {\r\n                    case TriggerableTargetObject.FindCommand.FindInScene:\r\n                    case TriggerableTargetObject.FindCommand.FindEntityInScene:\r\n                        configProp.boolValue = false;\r\n                        targetProp.objectReferenceValue = null;\r\n                        break;\r\n                }\r\n\r\n                var e1 = resolveProp.GetEnumValue<TriggerableTargetObject.ResolveByCommand>();\r\n                EditorGUI.BeginChangeCheck();\r\n                e1 = (TriggerableTargetObject.ResolveByCommand)EditorGUI.EnumPopup(r1, e1);\r\n                if (EditorGUI.EndChangeCheck())\r\n                    resolveProp.SetEnumValue(e1);\r\n\r\n                switch(e1)\r\n                {\r\n                    case TriggerableTargetObject.ResolveByCommand.Nothing:\r\n                        {\r\n                            var cache = SPGUI.Disable();\r\n                            EditorGUI.TextField(r2, string.Empty);\r\n                            queryProp.stringValue = string.Empty;\r\n                            cache.Reset();\r\n                        }\r\n                        break;\r\n                    case TriggerableTargetObject.ResolveByCommand.WithTag:\r\n                        {\r\n                            queryProp.stringValue = EditorGUI.TagField(r2, queryProp.stringValue);\r\n                        }\r\n                        break;\r\n                    case TriggerableTargetObject.ResolveByCommand.WithName:\r\n                        {\r\n                            queryProp.stringValue = EditorGUI.TextField(r2, queryProp.stringValue);\r\n                        }\r\n                        break;\r\n                    case TriggerableTargetObject.ResolveByCommand.WithType:\r\n                        {\r\n                            var tp = TypeUtil.FindType(queryProp.stringValue);\r\n                            if (!TypeUtil.IsType(tp, typeof(UnityEngine.Object))) tp = null;\r\n                            tp = SPEditorGUI.TypeDropDown(r2, GUIContent.none, typeof(UnityEngine.Object), tp);\r\n                            queryProp.stringValue = (tp != null) ? tp.FullName : null;\r\n                        }\r\n                        break;\r\n                }\r\n\r\n            }\r\n\r\n            EditorGUI.EndProperty();\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Utils\r\n\r\n        private void UpdateTargetFromSource(SerializedProperty property, TargetSource esrc)\r\n        {\r\n            switch(esrc)\r\n            {\r\n                case TargetSource.Arg:\r\n                    {\r\n                        property.objectReferenceValue = null;\r\n                    }\r\n                    break;\r\n                case TargetSource.Self:\r\n                    {\r\n                        UnityEngine.Object obj = property.serializedObject.targetObject;\r\n                        if (this.TargetType != null)\r\n                            obj = ObjUtil.GetAsFromSource(this.TargetType, obj) as UnityEngine.Object;\r\n                        property.objectReferenceValue = obj;\r\n                    }\r\n                    break;\r\n                case TargetSource.Root:\r\n                    {\r\n                        UnityEngine.Object obj = property.serializedObject.targetObject;\r\n                        var go = GameObjectUtil.GetGameObjectFromSource(obj);\r\n                        if (go != null)\r\n                            obj = go.FindRoot();\r\n\r\n                        if (this.TargetType != null)\r\n                            obj = ObjUtil.GetAsFromSource(this.TargetType, obj) as UnityEngine.Object;\r\n                        property.objectReferenceValue = obj;\r\n                    }\r\n                    break;\r\n                case TargetSource.Config:\r\n                    {\r\n                        if (this.DefaultFromSelf && property.objectReferenceValue == null)\r\n                        {\r\n                            UnityEngine.Object obj = property.serializedObject.targetObject;\r\n                            if (this.TargetType != null)\r\n                            {\r\n                                obj = ObjUtil.GetAsFromSource(this.TargetType, obj) as UnityEngine.Object;\r\n                            }\r\n                            property.objectReferenceValue = obj;\r\n                        }\r\n                    }\r\n                    break;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Utils\r\n\r\n        public static void ResetTriggerableTargetObjectTarget(SerializedProperty prop)\r\n        {\r\n            if (prop == null) return;\r\n\r\n            try\r\n            {\r\n                prop.FindPropertyRelative(PROP_CONFIGURED).boolValue = true;\r\n                prop.FindPropertyRelative(PROP_TARGET).objectReferenceValue = null;\r\n                prop.FindPropertyRelative(PROP_FIND).SetEnumValue(TriggerableTargetObject.FindCommand.Direct);\r\n                prop.FindPropertyRelative(PROP_RESOLVEBY).SetEnumValue(TriggerableTargetObject.ResolveByCommand.Nothing);\r\n                prop.FindPropertyRelative(PROP_QUERY).stringValue = string.Empty;\r\n            }\r\n            catch\r\n            {\r\n\r\n            }\r\n        }\r\n\r\n        public static System.Type GetTargetType(SerializedProperty prop)\r\n        {\r\n            var field = EditorHelper.GetFieldOfProperty(prop);\r\n            var attrib = field != null ? field.GetCustomAttributes(typeof(TriggerableTargetObject.ConfigAttribute), false).FirstOrDefault() as TriggerableTargetObject.ConfigAttribute : null;\r\n            if (attrib != null && attrib.TargetType != null) return attrib.TargetType;\r\n\r\n            var targ = EditorHelper.GetTargetObjectOfProperty(prop) as TriggerableTargetObject;\r\n            return targ != null ? targ.GetTargetType() : typeof(UnityEngine.Object);\r\n        }\r\n\r\n        public static object GetTarget(SerializedProperty prop, System.Type tp, object triggerArg = null)\r\n        {\r\n            var targ = EditorHelper.GetTargetObjectOfProperty(prop) as TriggerableTargetObject;\r\n            return targ != null ? targ.GetTarget(tp, triggerArg) : null;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/i_EnableInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [CustomEditor(typeof(i_Enable))]\r\n    public class i_EnableInspector : SPEditor\r\n    {\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            if(this.serializedObject.isEditingMultipleObjects)\r\n            {\r\n                base.OnSPInspectorGUI();\r\n                return;\r\n            }\r\n\r\n            this.serializedObject.Update();\r\n\r\n            var obj = this.serializedObject.targetObject as i_Enable;\r\n            if (obj == null) return;\r\n\r\n            string lbl;\r\n            switch(obj.Mode)\r\n            {\r\n                case i_Enable.EnableMode.TriggerArg:\r\n                    lbl = \"Resolve from Arg\";\r\n                    break;\r\n                case i_Enable.EnableMode.Enable:\r\n                    lbl = \"ENABLE\";\r\n                    break;\r\n                case i_Enable.EnableMode.Disable:\r\n                    lbl = \"DISABLE\";\r\n                    break;\r\n                case i_Enable.EnableMode.Toggle:\r\n                    lbl = \"TOGGLE\";\r\n                    break;\r\n                default:\r\n                    lbl = \"ENABLE\";\r\n                    break;\r\n            }\r\n\r\n            EditorGUILayout.HelpBox(lbl, MessageType.None);\r\n\r\n            this.DrawDefaultInspector();\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/i_PlayAudioInspector.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Scenario;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Scenario\n{\n\n    [CustomEditor(typeof(i_PlayAudio), true)]\n    public class i_PlayAudioInspector : SPEditor\n    {\n\n        public const string PROP_TARGET = \"_targetAudioSource\";\n        public const string PROP_SETTINGSMASK = \"_settingsMask\";\n        public const string PROP_SETTINGS = \"_settings\";\n        public const string PROP_INTERRUPT = \"_interrupt\";\n        public const string PROP_DELAY = \"_delay\";\n\n        private static string[] PROPS_ANIMSETTINGS = new string[] { \"clip\", \"volume\", \"loop\" };\n\n        protected override void OnSPInspectorGUI()\n        {\n            this.serializedObject.Update();\n\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\n            this.DrawPropertyField(EditorHelper.PROP_ORDER);\n            this.DrawPropertyField(EditorHelper.PROP_ACTIVATEON);\n            this.DrawPropertyField(PROP_TARGET);\n            this.DrawAnimSettings();\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, EditorHelper.PROP_ORDER, EditorHelper.PROP_ACTIVATEON, PROP_TARGET, PROP_SETTINGSMASK, PROP_SETTINGS);\n\n            this.serializedObject.ApplyModifiedProperties();\n        }\n\n\n        private void DrawAnimSettings()\n        {\n            var propMask = this.serializedObject.FindProperty(PROP_SETTINGSMASK);\n            var propSettings = this.serializedObject.FindProperty(PROP_SETTINGS);\n\n            int mask = propMask.intValue;\n            propSettings.isExpanded = EditorGUILayout.Foldout(propSettings.isExpanded, mask != 0 ? \"Custom Settings : Active\" : \"Custom Settings\");\n\n            EditorGUI.BeginChangeCheck();\n            for (int i = 0; i < PROPS_ANIMSETTINGS.Length; i++)\n            {\n                int m = 1 << i;\n                bool active = (mask & m) != 0;\n                if (!propSettings.isExpanded && !active) continue;\n\n                var propSet = propSettings.FindPropertyRelative(PROPS_ANIMSETTINGS[i]);\n                EditorGUILayout.BeginHorizontal();\n                if (EditorGUILayout.Toggle(active, GUILayout.MaxWidth(20f)))\n                {\n                    mask |= m;\n                    EditorGUILayout.PropertyField(propSet);\n                }\n                else\n                {\n                    mask &= ~m;\n                    EditorGUILayout.PrefixLabel(EditorHelper.TempContent(propSet.displayName, propSet.tooltip));\n                }\n\n                EditorGUILayout.EndHorizontal();\n            }\n            if (EditorGUI.EndChangeCheck())\n                propMask.intValue = mask;\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/i_SetValueInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [CustomEditor(typeof(i_SetValue))]\r\n    public class i_SetValueInspector : SPEditor\r\n    {\r\n\r\n        private VariantReferencePropertyDrawer _variantDrawer = new VariantReferencePropertyDrawer();\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawDefaultInspectorExcept(\"_target\", \"_memberName\", \"_value\", \"_mode\");\r\n            this.DrawPropertyField(\"_target\"); //uses the SelectableComponent PropertyDrawer\r\n\r\n            var targProp = this.serializedObject.FindProperty(\"_target\");\r\n            var memberProp = this.serializedObject.FindProperty(\"_memberName\");\r\n            var valueProp = this.serializedObject.FindProperty(\"_value\");\r\n            var modeProp = this.serializedObject.FindProperty(\"_mode\");\r\n\r\n            //SELECT MEMBER\r\n            System.Reflection.MemberInfo selectedMember;\r\n            memberProp.stringValue = SPEditorGUILayout.ReflectedRecursingPropertyField(EditorHelper.TempContent(\"Property\", \"The property on the target to set.\"),\r\n                                                                              targProp.objectReferenceValue,\r\n                                                                              memberProp.stringValue,\r\n                                                                              com.spacepuppy.Dynamic.DynamicMemberAccess.ReadWrite,\r\n                                                                              out selectedMember);\r\n            this.serializedObject.ApplyModifiedProperties();\r\n\r\n\r\n            //MEMBER VALUE TO SET TO\r\n            if (selectedMember != null)\r\n            {\r\n                var propType = com.spacepuppy.Dynamic.DynamicUtil.GetInputType(selectedMember);\r\n                var emode = modeProp.GetEnumValue<i_SetValue.SetMode>();\r\n                if (emode == i_SetValue.SetMode.Toggle)\r\n                {\r\n                    //EditorGUILayout.LabelField(EditorHelper.TempContent(valueProp.displayName), EditorHelper.TempContent(propType.Name));\r\n                    var evtp = VariantReference.GetVariantType(propType);\r\n                    var cache = SPGUI.Disable();\r\n                    EditorGUILayout.EnumPopup(EditorHelper.TempContent(valueProp.displayName), evtp);\r\n                    cache.Reset();\r\n                }\r\n                else\r\n                {\r\n                    if (DynamicUtil.TypeIsVariantSupported(propType))\r\n                    {\r\n                        //draw the default variant as the method accepts anything\r\n                        _variantDrawer.RestrictVariantType = false;\r\n                        _variantDrawer.ForcedObjectType = null;\r\n                        var label = EditorHelper.TempContent(\"Value\", \"The value to set to.\");\r\n                        _variantDrawer.OnGUI(EditorGUILayout.GetControlRect(true, _variantDrawer.GetPropertyHeight(valueProp, label)), valueProp, label);\r\n                    }\r\n                    else\r\n                    {\r\n                        _variantDrawer.RestrictVariantType = true;\r\n                        _variantDrawer.TypeRestrictedTo = propType;\r\n                        _variantDrawer.ForcedObjectType = (TypeUtil.IsType(propType, typeof(UnityEngine.Object))) ? propType : null;\r\n                        var label = EditorHelper.TempContent(\"Value\", \"The value to set to.\");\r\n                        _variantDrawer.OnGUI(EditorGUILayout.GetControlRect(true, _variantDrawer.GetPropertyHeight(valueProp, label)), valueProp, label);\r\n                    }\r\n                }\r\n\r\n                if (com.spacepuppy.Dynamic.Evaluator.WillArithmeticallyCompute(propType))\r\n                {\r\n                    EditorGUILayout.PropertyField(modeProp);\r\n                }\r\n                else\r\n                {\r\n                    //modeProp.SetEnumValue(i_SetValue.SetMode.Set);\r\n                    EditorGUI.BeginChangeCheck();\r\n                    emode = (i_SetValue.SetMode)SPEditorGUILayout.EnumPopupExcluding(EditorHelper.TempContent(modeProp.displayName), emode, i_SetValue.SetMode.Decrement, i_SetValue.SetMode.Increment);\r\n                    if (EditorGUI.EndChangeCheck())\r\n                        modeProp.SetEnumValue(emode);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                modeProp.SetEnumValue(i_SetValue.SetMode.Set);\r\n            }\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n        /*\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawDefaultInspectorExcept(\"_target\", \"_memberName\", \"_value\", \"_mode\");\r\n            this.DrawPropertyField(\"_target\"); //uses the SelectableComponent PropertyDrawer\r\n\r\n            var targProp = this.serializedObject.FindProperty(\"_target\");\r\n            var memberProp = this.serializedObject.FindProperty(\"_memberName\");\r\n            var valueProp = this.serializedObject.FindProperty(\"_value\");\r\n            var modeProp = this.serializedObject.FindProperty(\"_mode\");\r\n\r\n            //SELECT MEMBER\r\n            System.Reflection.MemberInfo selectedMember;\r\n            memberProp.stringValue = SPEditorGUILayout.ReflectedPropertyField(EditorHelper.TempContent(\"Property\", \"The property on the target to set.\"), \r\n                                                                              targProp.objectReferenceValue, \r\n                                                                              memberProp.stringValue, \r\n                                                                              com.spacepuppy.Dynamic.DynamicMemberAccess.ReadWrite,\r\n                                                                              out selectedMember);\r\n            this.serializedObject.ApplyModifiedProperties();\r\n\r\n\r\n            //MEMBER VALUE TO SET TO\r\n            if(selectedMember != null)\r\n            {\r\n                var propType = com.spacepuppy.Dynamic.DynamicUtil.GetReturnType(selectedMember);\r\n                var emode = modeProp.GetEnumValue<i_SetValue.SetMode>();\r\n                if(emode == i_SetValue.SetMode.Toggle)\r\n                {\r\n                    //EditorGUILayout.LabelField(EditorHelper.TempContent(valueProp.displayName), EditorHelper.TempContent(propType.Name));\r\n                    var evtp = VariantReference.GetVariantType(propType);\r\n                    var cache = SPGUI.Disable();\r\n                    EditorGUILayout.EnumPopup(EditorHelper.TempContent(valueProp.displayName), evtp);\r\n                    cache.Reset();\r\n                }\r\n                else\r\n                {\r\n                    if (com.spacepuppy.Dynamic.DynamicUtil.TypeIsVariantSupported(propType))\r\n                    {\r\n                        //draw the default variant as the method accepts anything\r\n                        _variantDrawer.RestrictVariantType = false;\r\n                        _variantDrawer.ForcedObjectType = null;\r\n                        _variantDrawer.OnGUI(EditorGUILayout.GetControlRect(), valueProp, EditorHelper.TempContent(\"Value\", \"The value to set to.\"));\r\n                    }\r\n                    else\r\n                    {\r\n                        _variantDrawer.RestrictVariantType = true;\r\n                        _variantDrawer.TypeRestrictedTo = propType;\r\n                        _variantDrawer.ForcedObjectType = propType;\r\n                        _variantDrawer.OnGUI(EditorGUILayout.GetControlRect(), valueProp, EditorHelper.TempContent(\"Value\", \"The value to set to.\"));\r\n                    }\r\n                }\r\n\r\n                if (com.spacepuppy.Dynamic.Evaluator.WillArithmeticallyCompute(propType))\r\n                {\r\n                    EditorGUILayout.PropertyField(modeProp);\r\n                }\r\n                else\r\n                {\r\n                    //modeProp.SetEnumValue(i_SetValue.SetMode.Set);\r\n                    EditorGUI.BeginChangeCheck();\r\n                    emode = (i_SetValue.SetMode)SPEditorGUILayout.EnumPopupExcluding(EditorHelper.TempContent(modeProp.displayName), emode, i_SetValue.SetMode.Decrement, i_SetValue.SetMode.Increment);\r\n                    if (EditorGUI.EndChangeCheck())\r\n                        modeProp.SetEnumValue(emode);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                modeProp.SetEnumValue(i_SetValue.SetMode.Set);\r\n            }\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n        */\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/i_SetValueOnEntityInspector.cs",
    "content": "﻿#pragma warning disable 0618 // ignore obsolete since this is the editor for said obsolete type\r\nusing UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [CustomEditor(typeof(i_SetValueOnEntity))]\r\n    public class i_SetValueOnEntityInspector : SPEditor\r\n    {\r\n\r\n        private VariantReferencePropertyDrawer _variantDrawer = new VariantReferencePropertyDrawer();\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawDefaultInspectorExcept(\"_searchEntity\", \"_componentType\", \"_memberName\", \"_value\", \"_mode\");\r\n            this.DrawPropertyField(\"_searchEntity\");\r\n            this.DrawPropertyField(\"_componentType\"); //uses the TypeReference PropertyDrawer\r\n\r\n            var compTypeProp = this.serializedObject.FindProperty(\"_componentType\");\r\n            var memberProp = this.serializedObject.FindProperty(\"_memberName\");\r\n            var valueProp = this.serializedObject.FindProperty(\"_value\");\r\n            var modeProp = this.serializedObject.FindProperty(\"_mode\");\r\n\r\n\r\n            //SELECT MEMBER\r\n            System.Reflection.MemberInfo selectedMember;\r\n            memberProp.stringValue = SPEditorGUILayout.ReflectedPropertyField(EditorHelper.TempContent(\"Property\", \"The property on the target to set.\"),\r\n                                                                              TypeReferencePropertyDrawer.GetTypeFromTypeReference(compTypeProp),\r\n                                                                              memberProp.stringValue,\r\n                                                                              out selectedMember);\r\n            this.serializedObject.ApplyModifiedProperties();\r\n\r\n\r\n            //MEMBER VALUE TO SET TO\r\n            if (selectedMember != null)\r\n            {\r\n                var propType = DynamicUtil.GetInputType(selectedMember);\r\n                var emode = modeProp.GetEnumValue<i_SetValue.SetMode>();\r\n                if (emode == i_SetValue.SetMode.Toggle)\r\n                {\r\n                    //EditorGUILayout.LabelField(EditorHelper.TempContent(valueProp.displayName), EditorHelper.TempContent(propType.Name));\r\n                    var evtp = VariantReference.GetVariantType(propType);\r\n                    var cache = SPGUI.Disable();\r\n                    EditorGUILayout.EnumPopup(EditorHelper.TempContent(\"Value\"), evtp);\r\n                    cache.Reset();\r\n                }\r\n                else\r\n                {\r\n                    if (DynamicUtil.TypeIsVariantSupported(propType))\r\n                    {\r\n                        //draw the default variant as the method accepts anything\r\n                        _variantDrawer.RestrictVariantType = false;\r\n                        _variantDrawer.ForcedObjectType = null;\r\n                        var label = EditorHelper.TempContent(\"Value\", \"The value to set to.\");\r\n                        _variantDrawer.OnGUI(EditorGUILayout.GetControlRect(true, _variantDrawer.GetPropertyHeight(valueProp, label)), valueProp, label);\r\n                    }\r\n                    else\r\n                    {\r\n                        _variantDrawer.RestrictVariantType = true;\r\n                        _variantDrawer.TypeRestrictedTo = propType;\r\n                        _variantDrawer.ForcedObjectType = (TypeUtil.IsType(propType, typeof(UnityEngine.Object))) ? propType : null;\r\n                        var label = EditorHelper.TempContent(\"Value\", \"The value to set to.\");\r\n                        _variantDrawer.OnGUI(EditorGUILayout.GetControlRect(true, _variantDrawer.GetPropertyHeight(valueProp, label)), valueProp, label);\r\n                    }\r\n                }\r\n\r\n                if (com.spacepuppy.Dynamic.Evaluator.WillArithmeticallyCompute(propType))\r\n                {\r\n                    EditorGUILayout.PropertyField(modeProp);\r\n                }\r\n                else\r\n                {\r\n                    //modeProp.SetEnumValue(i_SetValue.SetMode.Set);\r\n                    EditorGUI.BeginChangeCheck();\r\n                    emode = (i_SetValue.SetMode)SPEditorGUILayout.EnumPopupExcluding(EditorHelper.TempContent(modeProp.displayName), emode, i_SetValue.SetMode.Decrement, i_SetValue.SetMode.Increment);\r\n                    if (EditorGUI.EndChangeCheck())\r\n                        modeProp.SetEnumValue(emode);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                modeProp.SetEnumValue(i_SetValue.SetMode.Set);\r\n            }\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/i_SetValueOnTargetInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [CustomEditor(typeof(i_SetValueOnTarget))]\r\n    public class i_SetValueOnTargetInspector : SPEditor\r\n    {\r\n\r\n        private VariantReferencePropertyDrawer _variantDrawer = new VariantReferencePropertyDrawer();\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawDefaultInspectorExcept(\"_target\", \"_restrictedType\", \"_memberName\", \"_values\", \"_mode\");\r\n            this.DrawPropertyField(\"_target\"); //uses the SelectableComponent PropertyDrawer\r\n            this.DrawPropertyField(\"_restrictedType\");\r\n            this.serializedObject.ApplyModifiedProperties();\r\n\r\n            var targProp = this.serializedObject.FindProperty(\"_target\");\r\n            var restrictTypeProp = this.serializedObject.FindProperty(\"_restrictedType\");\r\n            var memberProp = this.serializedObject.FindProperty(\"_memberName\");\r\n            var valuesArrProp = this.serializedObject.FindProperty(\"_values\");\r\n            var modeProp = this.serializedObject.FindProperty(\"_mode\");\r\n\r\n            var targetRef = EditorHelper.GetTargetObjectOfProperty(targProp) as TriggerableTargetObject;\r\n            if (targetRef == null) return;\r\n\r\n            //SELECT MEMBER\r\n            System.Reflection.MemberInfo selectedMember = null;\r\n            var restrictType = TypeReferencePropertyDrawer.GetTypeFromTypeReference(restrictTypeProp);\r\n            \r\n            if (restrictType == null && !targetRef.TargetsTriggerArg && targetRef.Target != null &&\r\n                targetRef.Find == TriggerableTargetObject.FindCommand.Direct && targetRef.ResolveBy != TriggerableTargetObject.ResolveByCommand.WithType && \r\n                targetRef.Target.GetType() != restrictType)\r\n            {\r\n                memberProp.stringValue = SPEditorGUILayout.ReflectedPropertyField(EditorHelper.TempContent(\"Property\", \"The property on the target to set.\"),\r\n                                                                                  targetRef.Target,\r\n                                                                                  memberProp.stringValue,\r\n                                                                                  com.spacepuppy.Dynamic.DynamicMemberAccess.ReadWrite,\r\n                                                                                  out selectedMember,\r\n                                                                                  true);\r\n            }\r\n            else\r\n            {\r\n                if(restrictType == null)\r\n                {\r\n                    if (targetRef.ResolveBy == TriggerableTargetObject.ResolveByCommand.WithType) restrictType = TypeUtil.FindType(targetRef.ResolveByQuery);\r\n                    if (restrictType == null)\r\n                        restrictType = typeof(object);\r\n                    else\r\n                        TypeReferencePropertyDrawer.SetTypeToTypeReference(restrictTypeProp, restrictType);\r\n                }\r\n                memberProp.stringValue = SPEditorGUILayout.ReflectedPropertyField(EditorHelper.TempContent(\"Property\", \"The property on the target to set.\"),\r\n                                                                                  restrictType,\r\n                                                                                  memberProp.stringValue,\r\n                                                                                  out selectedMember,\r\n                                                                                  true);\r\n            }\r\n            this.serializedObject.ApplyModifiedProperties();\r\n\r\n\r\n            //MEMBER VALUE TO SET TO\r\n            if (selectedMember != null && selectedMember.MemberType == System.Reflection.MemberTypes.Method)\r\n            {\r\n                var methodInfo = selectedMember as System.Reflection.MethodInfo;\r\n                if (methodInfo == null) return;\r\n\r\n                var parameters = methodInfo.GetParameters();\r\n                valuesArrProp.arraySize = parameters.Length;\r\n\r\n                for(int i = 0; i < parameters.Length; i++)\r\n                {\r\n                    var p = parameters[i];\r\n                    var valueProp = valuesArrProp.GetArrayElementAtIndex(i);\r\n                    var propType = p.ParameterType;\r\n\r\n                    if (DynamicUtil.TypeIsVariantSupported(propType))\r\n                    {\r\n                        //draw the default variant as the method accepts anything\r\n                        _variantDrawer.RestrictVariantType = false;\r\n                        _variantDrawer.ForcedObjectType = null;\r\n                        var label = EditorHelper.TempContent(\"Parameter \" + i.ToString(), \"The value to set to.\");\r\n                        _variantDrawer.OnGUI(EditorGUILayout.GetControlRect(true, _variantDrawer.GetPropertyHeight(valueProp, label)), valueProp, label);\r\n                    }\r\n                    else\r\n                    {\r\n                        _variantDrawer.RestrictVariantType = true;\r\n                        _variantDrawer.TypeRestrictedTo = propType;\r\n                        _variantDrawer.ForcedObjectType = (TypeUtil.IsType(propType, typeof(UnityEngine.Object))) ? propType : null;\r\n                        var label = EditorHelper.TempContent(\"Parameter \" + i.ToString(), \"The value to set to.\");\r\n                        _variantDrawer.OnGUI(EditorGUILayout.GetControlRect(true, _variantDrawer.GetPropertyHeight(valueProp, label)), valueProp, label);\r\n                    }\r\n                }\r\n\r\n                modeProp.SetEnumValue(i_SetValueOnTarget.SetMode.Set);\r\n            }\r\n            else if (selectedMember != null)\r\n            {\r\n                var propType = com.spacepuppy.Dynamic.DynamicUtil.GetInputType(selectedMember);\r\n                var emode = modeProp.GetEnumValue<i_SetValueOnTarget.SetMode>();\r\n                if (emode == i_SetValueOnTarget.SetMode.Toggle)\r\n                {\r\n                    //EditorGUILayout.LabelField(EditorHelper.TempContent(valueProp.displayName), EditorHelper.TempContent(propType.Name));\r\n                    valuesArrProp.arraySize = 0;\r\n                    var evtp = VariantReference.GetVariantType(propType);\r\n                    var cache = SPGUI.Disable();\r\n                    EditorGUILayout.EnumPopup(EditorHelper.TempContent(\"Value\"), evtp);\r\n                    cache.Reset();\r\n                }\r\n                else\r\n                {\r\n                    valuesArrProp.arraySize = 1;\r\n                    var valueProp = valuesArrProp.GetArrayElementAtIndex(0);\r\n                    if (DynamicUtil.TypeIsVariantSupported(propType))\r\n                    {\r\n                        //draw the default variant as the method accepts anything\r\n                        _variantDrawer.RestrictVariantType = false;\r\n                        _variantDrawer.ForcedObjectType = null;\r\n                        var label = EditorHelper.TempContent(\"Value\", \"The value to set to.\");\r\n                        _variantDrawer.OnGUI(EditorGUILayout.GetControlRect(true, _variantDrawer.GetPropertyHeight(valueProp, label)), valueProp, label);\r\n                    }\r\n                    else\r\n                    {\r\n                        _variantDrawer.RestrictVariantType = true;\r\n                        _variantDrawer.TypeRestrictedTo = propType;\r\n                        _variantDrawer.ForcedObjectType = (TypeUtil.IsType(propType, typeof(UnityEngine.Object))) ? propType : null;\r\n                        var label = EditorHelper.TempContent(\"Value\", \"The value to set to.\");\r\n                        _variantDrawer.OnGUI(EditorGUILayout.GetControlRect(true, _variantDrawer.GetPropertyHeight(valueProp, label)), valueProp, label);\r\n                    }\r\n                }\r\n\r\n                if (com.spacepuppy.Dynamic.Evaluator.WillArithmeticallyCompute(propType))\r\n                {\r\n                    EditorGUILayout.PropertyField(modeProp);\r\n                }\r\n                else\r\n                {\r\n                    //modeProp.SetEnumValue(i_SetValueOnTarget.SetMode.Set);\r\n                    EditorGUI.BeginChangeCheck();\r\n                    emode = (i_SetValueOnTarget.SetMode)SPEditorGUILayout.EnumPopupExcluding(EditorHelper.TempContent(modeProp.displayName), emode, i_SetValueOnTarget.SetMode.Decrement, i_SetValueOnTarget.SetMode.Increment);\r\n                    if (EditorGUI.EndChangeCheck())\r\n                        modeProp.SetEnumValue(emode);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                modeProp.SetEnumValue(i_SetValueOnTarget.SetMode.Set);\r\n            }\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/i_SetValueOnTriggerArgInspector.cs",
    "content": "﻿#pragma warning disable 0618 // ignore obsolete since this is the editor for said obsolete type\r\nusing UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [CustomEditor(typeof(i_SetValueOnTriggerArg))]\r\n    public class i_SetValueOnTriggerArgInspector : SPEditor\r\n    {\r\n\r\n        private VariantReferencePropertyDrawer _variantDrawer = new VariantReferencePropertyDrawer();\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawDefaultInspectorExcept(\"_searchEntity\", \"_componentType\", \"_memberName\", \"_value\", \"_mode\");\r\n            this.DrawPropertyField(\"_searchEntity\");\r\n            this.DrawPropertyField(\"_componentType\"); //uses the TypeReference PropertyDrawer\r\n\r\n            var compTypeProp = this.serializedObject.FindProperty(\"_componentType\");\r\n            var memberProp = this.serializedObject.FindProperty(\"_memberName\");\r\n            var valueProp = this.serializedObject.FindProperty(\"_value\");\r\n            var modeProp = this.serializedObject.FindProperty(\"_mode\");\r\n\r\n\r\n            //SELECT MEMBER\r\n            System.Reflection.MemberInfo selectedMember;\r\n            memberProp.stringValue = SPEditorGUILayout.ReflectedPropertyField(EditorHelper.TempContent(\"Property\", \"The property on the target to set.\"),\r\n                                                                              TypeReferencePropertyDrawer.GetTypeFromTypeReference(compTypeProp),\r\n                                                                              memberProp.stringValue,\r\n                                                                              out selectedMember);\r\n            this.serializedObject.ApplyModifiedProperties();\r\n\r\n\r\n            //MEMBER VALUE TO SET TO\r\n            if (selectedMember != null)\r\n            {\r\n                var propType = com.spacepuppy.Dynamic.DynamicUtil.GetInputType(selectedMember);\r\n                var emode = modeProp.GetEnumValue<i_SetValue.SetMode>();\r\n                if (emode == i_SetValue.SetMode.Toggle)\r\n                {\r\n                    //EditorGUILayout.LabelField(EditorHelper.TempContent(valueProp.displayName), EditorHelper.TempContent(propType.Name));\r\n                    var evtp = VariantReference.GetVariantType(propType);\r\n                    var cache = SPGUI.Disable();\r\n                    EditorGUILayout.EnumPopup(EditorHelper.TempContent(valueProp.displayName), evtp);\r\n                    cache.Reset();\r\n                }\r\n                else\r\n                {\r\n                    if (DynamicUtil.TypeIsVariantSupported(propType))\r\n                    {\r\n                        //draw the default variant as the method accepts anything\r\n                        _variantDrawer.RestrictVariantType = false;\r\n                        _variantDrawer.ForcedObjectType = null;\r\n                        _variantDrawer.OnGUI(EditorGUILayout.GetControlRect(), valueProp, EditorHelper.TempContent(\"Value\", \"The value to set to.\"));\r\n                    }\r\n                    else\r\n                    {\r\n                        _variantDrawer.RestrictVariantType = true;\r\n                        _variantDrawer.TypeRestrictedTo = propType;\r\n                        _variantDrawer.ForcedObjectType = (TypeUtil.IsType(propType, typeof(Component))) ? propType : null;\r\n                        _variantDrawer.OnGUI(EditorGUILayout.GetControlRect(), valueProp, EditorHelper.TempContent(\"Value\", \"The value to set to.\"));\r\n                    }\r\n                }\r\n\r\n                if (com.spacepuppy.Dynamic.Evaluator.WillArithmeticallyCompute(propType))\r\n                {\r\n                    EditorGUILayout.PropertyField(modeProp);\r\n                }\r\n                else\r\n                {\r\n                    //modeProp.SetEnumValue(i_SetValue.SetMode.Set);\r\n                    EditorGUI.BeginChangeCheck();\r\n                    emode = (i_SetValue.SetMode)SPEditorGUILayout.EnumPopupExcluding(EditorHelper.TempContent(modeProp.displayName), emode, i_SetValue.SetMode.Decrement, i_SetValue.SetMode.Increment);\r\n                    if (EditorGUI.EndChangeCheck())\r\n                        modeProp.SetEnumValue(emode);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                modeProp.SetEnumValue(i_SetValue.SetMode.Set);\r\n            }\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/i_StartTetherJointInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [CustomEditor(typeof(i_StartTetherJoint))]\r\n    public class i_StartTetherJointInspector : SPEditor\r\n    {\r\n\r\n        public const string PROP_TARGET = \"_target\";\r\n        public const string PROP_LINKTARGET = \"_linkTarget\";\r\n        public const string PROP_UPDATEMODE = \"_updateMode\";\r\n        public const string PROP_CONSTRAINT = \"_constraint\";\r\n        public const string PROP_DOPOSDAMPING = \"_doPositionDamping\";\r\n        public const string PROP_POSDAMPING = \"_positionDampingStyle\";\r\n        public const string PROP_POSDAMPINGSTR = \"_positionDampingStrength\";\r\n        public const string PROP_DOROTDAMPING = \"_doRotationDamping\";\r\n        public const string PROP_ROTDAMPING = \"_rotationDampingStyle\";\r\n        public const string PROP_ROTDAMPINGSTR = \"_rotationDampingStrength\";\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n            this.DrawPropertyField(EditorHelper.PROP_ORDER);\r\n            this.DrawPropertyField(EditorHelper.PROP_ACTIVATEON);\r\n            this.DrawPropertyField(PROP_TARGET);\r\n            this.DrawPropertyField(PROP_LINKTARGET);\r\n            this.DrawPropertyField(PROP_UPDATEMODE);\r\n            this.DrawPropertyField(PROP_CONSTRAINT);\r\n\r\n            SerializedProperty prop;\r\n            Rect r;\r\n\r\n            prop = this.serializedObject.FindProperty(PROP_DOPOSDAMPING);\r\n            r = EditorGUILayout.GetControlRect();\r\n            prop.isExpanded = EditorGUI.Foldout(new Rect(r.xMin, r.yMin, EditorGUIUtility.labelWidth, r.height), prop.isExpanded, \"Ease Position\");\r\n            r = new Rect(r.xMin + EditorGUIUtility.labelWidth, r.yMin, r.width - EditorGUIUtility.labelWidth, r.height);\r\n            prop.boolValue = GUI.Toggle(r, prop.boolValue, GUIContent.none);\r\n            if (prop.isExpanded)\r\n            {\r\n                EditorGUI.indentLevel++;\r\n                this.DrawPropertyField(PROP_POSDAMPING);\r\n                this.DrawPropertyField(PROP_POSDAMPINGSTR);\r\n                EditorGUI.indentLevel--;\r\n            }\r\n\r\n            prop = this.serializedObject.FindProperty(PROP_DOROTDAMPING);\r\n            r = EditorGUILayout.GetControlRect();\r\n            prop.isExpanded = EditorGUI.Foldout(new Rect(r.xMin, r.yMin, EditorGUIUtility.labelWidth, r.height), prop.isExpanded, \"Ease Rotation\");\r\n            r = new Rect(r.xMin + EditorGUIUtility.labelWidth, r.yMin, r.width - EditorGUIUtility.labelWidth, r.height);\r\n            prop.boolValue = GUI.Toggle(r, prop.boolValue, GUIContent.none);\r\n            if (prop.isExpanded)\r\n            {\r\n                EditorGUI.indentLevel++;\r\n                this.DrawPropertyField(PROP_ROTDAMPING);\r\n                this.DrawPropertyField(PROP_ROTDAMPINGSTR);\r\n                EditorGUI.indentLevel--;\r\n            }\r\n\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, EditorHelper.PROP_ORDER, EditorHelper.PROP_ACTIVATEON,\r\n                                            PROP_TARGET, PROP_LINKTARGET, PROP_UPDATEMODE, PROP_CONSTRAINT, PROP_DOPOSDAMPING, PROP_POSDAMPING, PROP_POSDAMPINGSTR, PROP_DOROTDAMPING, PROP_ROTDAMPING, PROP_ROTDAMPINGSTR);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/i_TriggerOnEnumStateInspector.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Scenario;\nusing com.spacepuppy.Utils;\n\nusing com.spacepuppyeditor.Base;\n\nnamespace com.spacepuppyeditor.Scenario\n{\n\n    [CustomEditor(typeof(i_TriggerOnEnumState), true)]\n    public class i_TriggerOnEnumStateInspector : SPEditor\n    {\n        \n        public const string PROP_TARGET = \"_target\";\n        public const string PROP_CONDITIONS = \"_conditions\";\n        public const string PROP_DEFAULTCONDITION = \"_defaultCondition\";\n        public const string PROP_PASSALONG = \"_passAlongTriggerArg\";\n\n        private const string PROP_CONDITIONBLOCK_VALUE = \"_value\";\n        private const string PROP_CONDITIONBLOCK_FLAGS = \"_enumFlags\";\n        private const string PROP_CONDITIONBLOCK_TRIGGER = \"_trigger\";\n\n        protected override void OnSPInspectorGUI()\n        {\n            this.serializedObject.Update();\n\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\n            this.DrawPropertyField(EditorHelper.PROP_ORDER);\n            this.DrawPropertyField(EditorHelper.PROP_ACTIVATEON);\n            this.DrawPropertyField(PROP_TARGET);\n\n            this.DrawConditionsBlock();\n\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, EditorHelper.PROP_ORDER, EditorHelper.PROP_ACTIVATEON, PROP_TARGET, PROP_CONDITIONS, PROP_DEFAULTCONDITION);\n\n            this.serializedObject.ApplyModifiedProperties();\n        }\n\n        protected void DrawConditionsBlock()\n        {\n            EditorGUILayout.BeginVertical(\"Box\");\n            \n            VariantReference vref = EditorHelper.GetTargetObjectOfProperty(this.serializedObject.FindProperty(PROP_TARGET)) as VariantReference;\n            System.Type enumType = vref != null ? vref.GetPropertyReturnType() : null;\n            if (enumType != null && !enumType.IsEnum) enumType = null;\n\n            //draw conditions blocks\n            var conditionsArrayProp = this.serializedObject.FindProperty(PROP_CONDITIONS);\n\n            for (int i = 0; i < conditionsArrayProp.arraySize; i++)\n            {\n                var conditionBlockProp = conditionsArrayProp.GetArrayElementAtIndex(i);\n                var valueProp = conditionBlockProp.FindPropertyRelative(PROP_CONDITIONBLOCK_VALUE);\n                var flagsProp = conditionBlockProp.FindPropertyRelative(PROP_CONDITIONBLOCK_FLAGS);\n                \n                EditorGUILayout.LabelField((enumType != null) ? \"Case \" + ConvertUtil.ToEnumOfType(enumType, valueProp.intValue).ToString() + \":\": \"Case \" + valueProp.intValue.ToString() +\":\", EditorStyles.boldLabel);\n\n                EditorGUILayout.BeginHorizontal();\n                EditorGUILayout.PrefixLabel(\"Value\");\n\n                if(enumType == null)\n                {\n                    valueProp.intValue = EditorGUILayout.IntField(valueProp.intValue);\n                }\n                else\n                {\n                    switch ((i_TriggerOnEnumState.EnumFlagTestModes)flagsProp.intValue)\n                    {\n                        case i_TriggerOnEnumState.EnumFlagTestModes.NoFlag:\n                            {\n                                valueProp.intValue = ConvertUtil.ToInt(EditorGUILayout.EnumPopup(ConvertUtil.ToEnumOfType(enumType, valueProp.intValue)));\n                            }\n                            break;\n                        default:\n                            {\n                                //valueProp.intValue = ConvertUtil.ToInt(EditorGUILayout.EnumFlagsField(ConvertUtil.ToEnumOfType(enumType, valueProp.intValue)));\n                                valueProp.intValue = SPEditorGUILayout.EnumFlagField(enumType, valueProp.intValue);\n                            }\n                            break;\n                    }\n                }\n                \n                flagsProp.intValue = ConvertUtil.ToInt(EditorGUILayout.EnumPopup((i_TriggerOnEnumState.EnumFlagTestModes)flagsProp.intValue));\n                EditorGUILayout.EndHorizontal();\n\n                var triggerProp = conditionBlockProp.FindPropertyRelative(PROP_CONDITIONBLOCK_TRIGGER);\n                SPEditorGUILayout.PropertyField(triggerProp);\n\n                EditorGUILayout.Space();\n            }\n\n            //draw else\n            EditorGUILayout.LabelField(\"Default Case:\", EditorStyles.boldLabel);\n            SPEditorGUILayout.PropertyField(this.serializedObject.FindProperty(PROP_DEFAULTCONDITION));\n\n            EditorGUILayout.Space();\n\n            //draw add buttons\n            var fullRect = EditorGUILayout.GetControlRect();\n            var leftRect = new Rect(fullRect.xMin, fullRect.yMin, fullRect.width / 2f, fullRect.height);\n            var rightRect = new Rect(fullRect.xMin + leftRect.width, fullRect.yMin, fullRect.width / 2f, fullRect.height);\n            if (GUI.Button(leftRect, \"Add Condition\"))\n            {\n                conditionsArrayProp.arraySize++;\n            }\n            if (GUI.Button(rightRect, \"Remove Condition\"))\n            {\n                conditionsArrayProp.arraySize--;\n            }\n\n            EditorGUILayout.EndVertical();\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/i_TriggerOnEvalInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [CustomEditor(typeof(i_TriggerOnEval), true)]\r\n    public class i_TriggerOnEvalInspector : SPEditor\r\n    {\r\n\r\n        private VariantReferencePropertyDrawer _variantDrawer = new VariantReferencePropertyDrawer();\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n            this.DrawPropertyField(EditorHelper.PROP_ORDER);\r\n            this.DrawPropertyField(EditorHelper.PROP_ACTIVATEON);\r\n\r\n\r\n            EditorGUILayout.BeginVertical(\"Box\");\r\n            var conditionsArrayProp = this.serializedObject.FindProperty(\"_conditions\");\r\n\r\n            for (int i = 0; i < conditionsArrayProp.arraySize; i++)\r\n            {\r\n                EditorGUILayout.LabelField(string.Format(\"Condition {0}\", i));\r\n                var conditionBlockProp = conditionsArrayProp.GetArrayElementAtIndex(i);\r\n                var conditionProp = conditionBlockProp.FindPropertyRelative(\"_condition\");\r\n\r\n                var r = EditorGUILayout.GetControlRect(false, _variantDrawer.GetPropertyHeight(conditionProp, GUIContent.none));\r\n                _variantDrawer.OnGUI(r, conditionProp, GUIContent.none);\r\n\r\n                var triggerProp = conditionBlockProp.FindPropertyRelative(\"_trigger\");\r\n                SPEditorGUILayout.PropertyField(triggerProp);\r\n            }\r\n\r\n            var fullRect = EditorGUILayout.GetControlRect();\r\n            var leftRect = new Rect(fullRect.xMin, fullRect.yMin, fullRect.width / 2f, fullRect.height);\r\n            var rightRect = new Rect(fullRect.xMin + leftRect.width, fullRect.yMin, fullRect.width / 2f, fullRect.height);\r\n            if (GUI.Button(leftRect, \"Add Condition\"))\r\n            {\r\n                conditionsArrayProp.arraySize++;\r\n            }\r\n            if (GUI.Button(rightRect, \"Remove Condition\"))\r\n            {\r\n                conditionsArrayProp.arraySize--;\r\n            }\r\n\r\n            EditorGUILayout.EndVertical();\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, EditorHelper.PROP_ORDER, EditorHelper.PROP_ACTIVATEON, \"_conditions\");\r\n\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/i_TriggerOnIfThenInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [CustomEditor(typeof(i_TriggerOnIfThen), true)]\r\n    public class i_TriggerOnIfThenInspector : SPEditor\r\n    {\r\n        public const string PROP_CONDITIONS = \"_conditions\";\r\n        public const string PROP_ELSECONDITION = \"_elseCondition\";\r\n        private const string PROP_CONDITIONBLOCK_CONDITION = \"_condition\";\r\n        private const string PROP_CONDITIONBLOCK_TRIGGER = \"_trigger\";\r\n\r\n        private VariantReferencePropertyDrawer _variantDrawer = new VariantReferencePropertyDrawer();\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n            this.DrawPropertyField(EditorHelper.PROP_ORDER);\r\n            this.DrawPropertyField(EditorHelper.PROP_ACTIVATEON);\r\n\r\n\r\n            EditorGUILayout.BeginVertical(\"Box\");\r\n\r\n            //draw conditions blocks\r\n            var conditionsArrayProp = this.serializedObject.FindProperty(PROP_CONDITIONS);\r\n            if (conditionsArrayProp.arraySize == 0) conditionsArrayProp.arraySize = 1;\r\n\r\n            for (int i = 0; i < conditionsArrayProp.arraySize; i++)\r\n            {\r\n                EditorGUILayout.LabelField((i == 0) ? \"IF\" : \"ELSE IF\");\r\n                var conditionBlockProp = conditionsArrayProp.GetArrayElementAtIndex(i);\r\n                var conditionProp = conditionBlockProp.FindPropertyRelative(PROP_CONDITIONBLOCK_CONDITION);\r\n\r\n                var r = EditorGUILayout.GetControlRect(false, _variantDrawer.GetPropertyHeight(conditionProp, GUIContent.none));\r\n                _variantDrawer.OnGUI(r, conditionProp, GUIContent.none);\r\n\r\n                var triggerProp = conditionBlockProp.FindPropertyRelative(PROP_CONDITIONBLOCK_TRIGGER);\r\n                SPEditorGUILayout.PropertyField(triggerProp);\r\n            }\r\n\r\n            //draw else\r\n            EditorGUILayout.LabelField(\"ELSE\");\r\n            SPEditorGUILayout.PropertyField(this.serializedObject.FindProperty(PROP_ELSECONDITION));\r\n\r\n            //draw add buttons\r\n            var fullRect = EditorGUILayout.GetControlRect();\r\n            var leftRect = new Rect(fullRect.xMin, fullRect.yMin, fullRect.width / 2f, fullRect.height);\r\n            var rightRect = new Rect(fullRect.xMin + leftRect.width, fullRect.yMin, fullRect.width / 2f, fullRect.height);\r\n            if (GUI.Button(leftRect, \"Add Condition\"))\r\n            {\r\n                conditionsArrayProp.arraySize++;\r\n            }\r\n            if (GUI.Button(rightRect, \"Remove Condition\"))\r\n            {\r\n                conditionsArrayProp.arraySize--;\r\n            }\r\n\r\n            EditorGUILayout.EndVertical();\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, EditorHelper.PROP_ORDER, EditorHelper.PROP_ACTIVATEON, PROP_CONDITIONS, PROP_ELSECONDITION);\r\n\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/i_TriggerRandomEliminationInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [CustomEditor(typeof(i_TriggerRandomElimination), true)]\r\n    public class i_TriggerRandomEliminationInspector : SPEditor\r\n    {\r\n\r\n        public const string PROP_ORDER = EditorHelper.PROP_ORDER;\r\n        public const string PROP_ACTIVATEON = EditorHelper.PROP_ACTIVATEON;\r\n        public const string PROP_TARGETS = \"_targets\";\r\n\r\n        private TriggerPropertyDrawer _targetsDrawer = new TriggerPropertyDrawer()\r\n        {\r\n            DrawWeight = true\r\n        };\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n            _targetsDrawer.OnDrawCustomizedEntryLabel = CustomizeLabel;\r\n        }\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n            this.DrawPropertyField(PROP_ORDER);\r\n            this.DrawPropertyField(PROP_ACTIVATEON);\r\n\r\n            var targetsProp = this.serializedObject.FindProperty(PROP_TARGETS);\r\n            var label = EditorHelper.TempContent(targetsProp.displayName);\r\n            var area = EditorGUILayout.GetControlRect(false, _targetsDrawer.GetPropertyHeight(targetsProp, label));\r\n            _targetsDrawer.OnGUI(area, targetsProp, label);\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_ORDER, PROP_ACTIVATEON, PROP_TARGETS);\r\n\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n        private void CustomizeLabel(Rect area, SerializedProperty property, int index)\r\n        {\r\n            var targ = this.serializedObject.targetObject as i_TriggerRandomElimination;\r\n\r\n            if (!Application.isPlaying ||\r\n                this.serializedObject.isEditingMultipleObjects ||\r\n                targ == null)\r\n            {\r\n                TriggerPropertyDrawer.DrawDefaultListElementLabel(area, property, index);\r\n            }\r\n            else\r\n            {\r\n                if (targ.TargetHasBeenUsed(index))\r\n                {\r\n                    var r0 = new Rect(area.xMin, area.yMin, Mathf.Min(36f, area.width), EditorGUIUtility.singleLineHeight);\r\n                    var r1 = new Rect(r0.xMax, area.yMin, Mathf.Max(0f, area.width - r0.width), EditorGUIUtility.singleLineHeight);\r\n                    EditorGUI.LabelField(r0, index.ToString(\"X 00:\"));\r\n                    TriggerTargetPropertyDrawer.DrawTriggerActivationTypeDropdown(r1, property, false);\r\n                }\r\n                else\r\n                {\r\n                    TriggerPropertyDrawer.DrawDefaultListElementLabel(area, property, index);\r\n                }\r\n            }\r\n\r\n\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/i_TriggerSequenceInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [CustomEditor(typeof(i_TriggerSequence))]\r\n    public class i_TriggerSequenceInspector : SPEditor\r\n    {\r\n\r\n        private const string PROP_CURRENTINDEX = \"_currentIndex\";\r\n        private const string PROP_TRIGGER = \"_trigger\";\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            if(this.serializedObject.isEditingMultipleObjects || !(this.serializedObject.targetObject is i_TriggerSequence))\r\n            {\r\n                this.DrawDefaultInspector();\r\n                return;\r\n            }\r\n\r\n            this.serializedObject.Update();\r\n            this.DrawDefaultInspectorExcept(PROP_CURRENTINDEX);\r\n\r\n            var seq = this.serializedObject.targetObject as i_TriggerSequence;\r\n            var prop = this.serializedObject.FindProperty(PROP_CURRENTINDEX);\r\n            EditorGUI.BeginChangeCheck();\r\n            int i = EditorGUILayout.IntField(\"Current Index\", prop.intValue);\r\n            if(EditorGUI.EndChangeCheck())\r\n            {\r\n                prop.intValue = Mathf.Clamp(i, 0, seq.TriggerSequence.Count - 1);\r\n            }\r\n\r\n            Rect rect;\r\n            rect = ITriggerableMechanismAddonDrawer.GetActivateButtonControlRect();\r\n            if (GUI.Button(rect, \"Reset Index\"))\r\n            {\r\n                prop.intValue = 0;\r\n            }\r\n            rect = ITriggerableMechanismAddonDrawer.GetActivateButtonControlRect();\r\n            if (GUI.Button(rect, \"Move Ahead Index\"))\r\n            {\r\n                prop.intValue = Mathf.Clamp(i + 1, 0, seq.TriggerSequence.Count - 1);\r\n            }\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/i_TweenStateInspector.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Scenario;\nusing com.spacepuppy.Tween;\n\nnamespace com.spacepuppyeditor.Scenario\n{\n\n    [CustomEditor(typeof(i_TweenState))]\n    public class i_TweenStateInspector : SPEditor\n    {\n\n        public const string PROP_TARGET = \"_target\";\n        public const string PROP_SOURCE = \"_source\";\n        public const string PROP_SOURCEALT = \"_sourceAlt\";\n        public const string PROP_ANIMMODE = \"_mode\";\n        public const string PROP_EASE = \"_ease\";\n        public const string PROP_DURATION = \"_duration\";\n        public const string PROP_TWEENTOKEN = \"_tweenToken\";\n\n        protected override void OnSPInspectorGUI()\n        {\n            this.serializedObject.Update();\n\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\n            this.DrawPropertyField(EditorHelper.PROP_ORDER);\n            this.DrawPropertyField(EditorHelper.PROP_ACTIVATEON);\n\n            this.DrawPropertyField(PROP_TARGET);\n            \n            var propSourceAlt = this.serializedObject.FindProperty(PROP_ANIMMODE);\n            switch(propSourceAlt.GetEnumValue<TweenHash.AnimMode>())\n            {\n                case TweenHash.AnimMode.AnimCurve:\n                case TweenHash.AnimMode.Curve:\n                    propSourceAlt.SetEnumValue(TweenHash.AnimMode.To);\n                    this.DrawPropertyField(PROP_SOURCE, \"Values\", false);\n                    TriggerableTargetObjectPropertyDrawer.ResetTriggerableTargetObjectTarget(this.serializedObject.FindProperty(PROP_SOURCEALT));\n                    break;\n                case TweenHash.AnimMode.To:\n                case TweenHash.AnimMode.From:\n                case TweenHash.AnimMode.By:\n                    this.DrawPropertyField(PROP_SOURCE, \"Values\", false);\n                    TriggerableTargetObjectPropertyDrawer.ResetTriggerableTargetObjectTarget(this.serializedObject.FindProperty(PROP_SOURCEALT));\n                    break;\n                case TweenHash.AnimMode.FromTo:\n                case TweenHash.AnimMode.RedirectTo:\n                    this.DrawPropertyField(PROP_SOURCE, \"Start\", false);\n                    this.DrawPropertyField(PROP_SOURCEALT, \"End\", false);\n                    break;\n            }\n            \n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, EditorHelper.PROP_ORDER, EditorHelper.PROP_ACTIVATEON, PROP_TARGET, PROP_SOURCE, PROP_SOURCEALT);\n\n            this.serializedObject.ApplyModifiedProperties();\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/i_TweenValueInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Tween;\r\nusing com.spacepuppy.Tween.Accessors;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [CustomEditor(typeof(i_TweenValue))]\r\n    public class i_TweenValueInspector : SPEditor\r\n    {\r\n        public const string PROP_TIMESUPPLIER = \"_timeSupplier\";\r\n        public const string PROP_TARGET = \"_target\";\r\n        public const string PROP_TWEENDATA = \"_data\";\r\n        public const string PROP_ONCOMPLETE = \"_onComplete\";\r\n        public const string PROP_TWEENTOKEN = \"_tweenToken\";\r\n\r\n        private const string PROP_DATA_MODE = \"Mode\";\r\n        private const string PROP_DATA_MEMBER = \"MemberName\";\r\n        private const string PROP_DATA_EASE = \"Ease\";\r\n        private const string PROP_DATA_VALUES = \"ValueS\";\r\n        private const string PROP_DATA_VALUEE = \"ValueE\";\r\n        private const string PROP_DATA_DUR = \"Duration\";\r\n        private const string PROP_DATA_OPTION = \"Option\";\r\n\r\n\r\n        private SPReorderableList _dataList;\r\n        private SerializedProperty _targetProp;\r\n        private VariantReferencePropertyDrawer _variantDrawer = new VariantReferencePropertyDrawer();\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _dataList = new SPReorderableList(this.serializedObject, this.serializedObject.FindProperty(PROP_TWEENDATA));\r\n            _dataList.drawHeaderCallback = _dataList_DrawHeader;\r\n            _dataList.drawElementCallback = _dataList_DrawElement;\r\n            _dataList.elementHeight = EditorGUIUtility.singleLineHeight * 7f + 7f;\r\n            \r\n        }\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            _targetProp = this.serializedObject.FindProperty(PROP_TARGET);\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n            this.DrawPropertyField(EditorHelper.PROP_ORDER);\r\n            this.DrawPropertyField(EditorHelper.PROP_ACTIVATEON);\r\n            this.DrawPropertyField(PROP_TIMESUPPLIER);\r\n            SPEditorGUILayout.PropertyField(_targetProp);\r\n            this.DrawPropertyField(PROP_TWEENTOKEN);\r\n            _dataList.DoLayoutList();\r\n            this.DrawPropertyField(PROP_ONCOMPLETE);\r\n\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, EditorHelper.PROP_ORDER, EditorHelper.PROP_ACTIVATEON, PROP_TARGET, PROP_TIMESUPPLIER, PROP_TWEENDATA, PROP_ONCOMPLETE, PROP_TWEENTOKEN);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n\r\n\r\n        #region ReorderableList Handlers\r\n\r\n        private void _dataList_DrawHeader(Rect area)\r\n        {\r\n            EditorGUI.LabelField(area, \"Tween Data\");\r\n        }\r\n\r\n        private void _dataList_DrawElement(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            Rect position;\r\n            var el = _dataList.serializedProperty.GetArrayElementAtIndex(index);\r\n\r\n            position = CalcNextRect(ref area);\r\n            SPEditorGUI.PropertyField(position, el.FindPropertyRelative(PROP_DATA_MODE));\r\n\r\n            //TODO - member\r\n            position = CalcNextRect(ref area);\r\n            var memberProp = el.FindPropertyRelative(PROP_DATA_MEMBER);\r\n            System.Type propType;\r\n            memberProp.stringValue = i_TweenValueInspector.ReflectedPropertyAndCustomTweenAccessorField(position,\r\n                                                                                                        EditorHelper.TempContent(\"Property\", \"The property on the target to set.\"),\r\n                                                                                                        _targetProp.objectReferenceValue,\r\n                                                                                                        memberProp.stringValue,\r\n                                                                                                        com.spacepuppy.Dynamic.DynamicMemberAccess.ReadWrite,\r\n                                                                                                        out propType);\r\n\r\n            position = CalcNextRect(ref area);\r\n            SPEditorGUI.PropertyField(position, el.FindPropertyRelative(PROP_DATA_EASE));\r\n            \r\n            position = CalcNextRect(ref area);\r\n            this.DrawOption(position, ref propType, el.FindPropertyRelative(PROP_DATA_OPTION));\r\n            \r\n            position = CalcNextRect(ref area);\r\n            SPEditorGUI.PropertyField(position, el.FindPropertyRelative(PROP_DATA_DUR));\r\n\r\n            if(propType != null)\r\n            {\r\n                switch (el.FindPropertyRelative(PROP_DATA_MODE).GetEnumValue<TweenHash.AnimMode>())\r\n                {\r\n                    case TweenHash.AnimMode.To:\r\n                        {\r\n                            position = CalcNextRect(ref area);\r\n                            this.DrawVariant(position, EditorHelper.TempContent(\"To Value\"), propType, el.FindPropertyRelative(PROP_DATA_VALUES));\r\n\r\n                            position = CalcNextRect(ref area);\r\n                        }\r\n                        break;\r\n                    case TweenHash.AnimMode.From:\r\n                        {\r\n                            position = CalcNextRect(ref area);\r\n                            this.DrawVariant(position, EditorHelper.TempContent(\"From Value\"), propType, el.FindPropertyRelative(PROP_DATA_VALUES));\r\n                        }\r\n                        break;\r\n                    case TweenHash.AnimMode.By:\r\n                        {\r\n                            position = CalcNextRect(ref area);\r\n                            this.DrawVariant(position, EditorHelper.TempContent(\"By Value\"), propType, el.FindPropertyRelative(PROP_DATA_VALUES));\r\n                        }\r\n                        break;\r\n                    case TweenHash.AnimMode.FromTo:\r\n                        {\r\n                            position = CalcNextRect(ref area);\r\n                            this.DrawVariant(position, EditorHelper.TempContent(\"Start Value\"), propType, el.FindPropertyRelative(PROP_DATA_VALUES));\r\n\r\n                            position = CalcNextRect(ref area);\r\n                            this.DrawVariant(position, EditorHelper.TempContent(\"End Value\"), propType, el.FindPropertyRelative(PROP_DATA_VALUEE));\r\n                        }\r\n                        break;\r\n                    case TweenHash.AnimMode.RedirectTo:\r\n                        {\r\n                            position = CalcNextRect(ref area);\r\n                            this.DrawVariant(position, EditorHelper.TempContent(\"Start Value\"), propType, el.FindPropertyRelative(PROP_DATA_VALUES));\r\n\r\n                            position = CalcNextRect(ref area);\r\n                            this.DrawVariant(position, EditorHelper.TempContent(\"End Value\"), propType, el.FindPropertyRelative(PROP_DATA_VALUEE));\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n\r\n\r\n        }\r\n\r\n        private void DrawVariant(Rect position, GUIContent label, System.Type propType, SerializedProperty valueProp)\r\n        {\r\n            if (com.spacepuppy.Dynamic.DynamicUtil.TypeIsVariantSupported(propType))\r\n            {\r\n                //draw the default variant as the method accepts anything\r\n                _variantDrawer.RestrictVariantType = false;\r\n                _variantDrawer.ForcedObjectType = null;\r\n                _variantDrawer.OnGUI(position, valueProp, label);\r\n            }\r\n            else\r\n            {\r\n                _variantDrawer.RestrictVariantType = true;\r\n                _variantDrawer.TypeRestrictedTo = propType;\r\n                _variantDrawer.ForcedObjectType = (TypeUtil.IsType(propType, typeof(Component))) ? propType : null;\r\n                _variantDrawer.OnGUI(position, valueProp, label);\r\n            }\r\n        }\r\n\r\n\r\n        private static Rect CalcNextRect(ref Rect area)\r\n        {\r\n            var pos = new Rect(area.xMin, area.yMin + 1f, area.width, EditorGUIUtility.singleLineHeight);\r\n            area = new Rect(pos.xMin, pos.yMax, area.width, area.height - EditorGUIUtility.singleLineHeight + 1f);\r\n            return pos;\r\n        }\r\n\r\n        private void DrawOption(Rect position, ref System.Type propType, SerializedProperty optionProp)\r\n        {\r\n            if(propType == typeof(Vector2) || propType == typeof(Vector3) || propType == typeof(Vector4) || propType == typeof(Color))\r\n            {\r\n                bool value = ConvertUtil.ToBool(optionProp.intValue);\r\n                value = EditorGUI.Toggle(position, \"Option (Use Slerp)\", value);\r\n                optionProp.intValue = value ? 1 : 0;\r\n            }\r\n            else if(propType == typeof(Quaternion))\r\n            {\r\n                QuaternionTweenOption value = QuaternionTweenOption.Spherical;\r\n                if (System.Enum.IsDefined(typeof(QuaternionTweenOption), optionProp.intValue))\r\n                    value = (QuaternionTweenOption)optionProp.intValue;\r\n                \r\n                value = (QuaternionTweenOption)EditorGUI.EnumPopup(position, \"Option\", value);\r\n                optionProp.intValue = (int)value;\r\n                if (value == QuaternionTweenOption.Long)\r\n                    propType = typeof(Vector3);\r\n            }\r\n            else\r\n            {\r\n                EditorGUI.LabelField(position, \"Option\", \"(no option available)\");\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Custom Reflected PropertyField\r\n\r\n        public static string ReflectedPropertyAndCustomTweenAccessorField(Rect position, GUIContent label, object targObj, string selectedMemberName, DynamicMemberAccess access, out System.Type propType)\r\n        {\r\n            if (targObj != null)\r\n            {\r\n                var members = DynamicUtil.GetEasilySerializedMembers(targObj, System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property, access).ToArray();\r\n                var accessors = CustomTweenMemberAccessorFactory.GetCustomAccessorIds(targObj.GetType(), (d) => VariantReference.AcceptableType(d.MemberType));\r\n                System.Array.Sort(accessors);\r\n\r\n                using (var entries = TempCollection.GetList<GUIContent>(members.Length))\r\n                {\r\n                    int index = -1;\r\n                    for (int i = 0; i < members.Length; i++)\r\n                    {\r\n                        var m = members[i];\r\n                        if ((DynamicUtil.GetMemberAccessLevel(m) & DynamicMemberAccess.Write) != 0)\r\n                            entries.Add(EditorHelper.TempContent(string.Format(\"{0} ({1}) -> {2}\", m.Name, DynamicUtil.GetReturnType(m).Name, DynamicUtil.GetValueWithMember(m, targObj))));\r\n                        else\r\n                            entries.Add(EditorHelper.TempContent(string.Format(\"{0} (readonly - {1}) -> {2}\", m.Name, DynamicUtil.GetReturnType(m).Name, DynamicUtil.GetValueWithMember(m, targObj))));\r\n\r\n                        if (index < 0 && m.Name == selectedMemberName)\r\n                        {\r\n                            //index = i;\r\n                            index = entries.Count - 1;\r\n                        }\r\n                    }\r\n\r\n                    for(int i = 0; i < accessors.Length; i++)\r\n                    {\r\n                        entries.Add(EditorHelper.TempContent(accessors[i]));\r\n                        if(index < 0 && accessors[i] == selectedMemberName)\r\n                        {\r\n                            index = entries.Count - 1;\r\n                        }\r\n                    }\r\n\r\n                    \r\n                    index = EditorGUI.Popup(position, label, index, entries.ToArray());\r\n                    //selectedMember = (index >= 0) ? members[index] : null;\r\n                    //return (selectedMember != null) ? selectedMember.Name : null;\r\n\r\n                    if(index < 0)\r\n                    {\r\n                        propType = null;\r\n                        return null;\r\n                    }\r\n                    else if (index < members.Length)\r\n                    {\r\n                        propType = DynamicUtil.GetReturnType(members[index]);\r\n                        return members[index].Name;\r\n                    }\r\n                    else\r\n                    {\r\n                        var nm = accessors[index - members.Length];\r\n                        /*\r\n                        ITweenMemberAccessor acc;\r\n                        if (CustomTweenMemberAccessorFactory.TryGetMemberAccessor(targObj, nm, out acc))\r\n                        {\r\n                            propType = acc.GetMemberType();\r\n                            if (VariantReference.AcceptableType(propType))\r\n                            {\r\n                                return nm;\r\n                            }\r\n                        }\r\n                        */\r\n                        CustomTweenMemberAccessorFactory.CustomAccessorData info;\r\n                        if(CustomTweenMemberAccessorFactory.TryGetMemberAccessorInfo(targObj, nm, out info))\r\n                        {\r\n                            propType = info.MemberType;\r\n                            if(VariantReference.AcceptableType(propType))\r\n                            {\r\n                                return nm;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    propType = null;\r\n                    return null;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                propType = null;\r\n                EditorGUI.Popup(position, label, -1, new GUIContent[0]);\r\n                return null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/t_OnEventTriggerInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.EventSystems;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [CustomEditor(typeof(t_OnEventTrigger), true)]\r\n    public class t_OnEventTriggerInspector : SPEditor\r\n    {\r\n\r\n        public const string PROP_TRIGGERS = \"_triggers\";\r\n        private const string PROP_EVENTID = \"EventID\";\r\n\r\n        private TriggerPropertyDrawer _drawer;\r\n        \r\n        private List<EventTriggerType> _toAdd = new List<EventTriggerType>();\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _drawer = new TriggerPropertyDrawer();\r\n        }\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n\r\n            _toAdd.Clear();\r\n            _toAdd.AddRange(System.Enum.GetValues(typeof(EventTriggerType)).Cast<EventTriggerType>());\r\n\r\n            var triggersProp = this.serializedObject.FindProperty(PROP_TRIGGERS);\r\n            for (int i = 0; i < triggersProp.arraySize; i++)\r\n            {\r\n                var prop = triggersProp.GetArrayElementAtIndex(i);\r\n                var eventId = prop.FindPropertyRelative(PROP_EVENTID).GetEnumValue<EventTriggerType>();\r\n                var label = EditorHelper.TempContent(eventId.ToString());\r\n                var h = _drawer.GetPropertyHeight(prop, label);\r\n                var rect = EditorGUILayout.GetControlRect(true, h);\r\n                _drawer.OnGUI(rect, prop, label);\r\n                _toAdd.Remove(eventId);\r\n            }\r\n\r\n            var btnHeight = EditorGUIUtility.singleLineHeight * 1.5f;\r\n            var btnVerPadding = EditorGUIUtility.singleLineHeight / 2f;\r\n            var btnRect = EditorGUILayout.GetControlRect(false, btnVerPadding + btnVerPadding + btnHeight);\r\n            var btnWidth = Mathf.Min(btnRect.width, 200f);\r\n            var btnHorPadding = Mathf.Max(0f, (btnRect.width - btnWidth) / 2f);\r\n            btnRect = new Rect(btnRect.xMin + btnHorPadding, btnRect.yMin + btnVerPadding, btnWidth, btnHeight);\r\n            if(GUI.Button(btnRect, \"Add New Event Type\"))\r\n            {\r\n                var labels = (from e in _toAdd select e.ToString()).ToArray();\r\n\r\n                var menu = new GenericMenu();\r\n                foreach(var e in _toAdd)\r\n                {\r\n                    menu.AddItem(EditorHelper.TempContent(e.ToString()), false, () =>\r\n                    {\r\n                        triggersProp.arraySize++;\r\n                        var el = triggersProp.GetArrayElementAtIndex(triggersProp.arraySize - 1);\r\n                        el.FindPropertyRelative(PROP_EVENTID).SetEnumValue(e);\r\n                        el.FindPropertyRelative(TriggerPropertyDrawer.PROP_TARGETS).arraySize = 0;\r\n                        triggersProp.serializedObject.ApplyModifiedProperties();\r\n                    });\r\n                }\r\n                menu.ShowAsContext();\r\n            }\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_TRIGGERS);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/t_OnNotificationTriggerInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Scenario;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [CustomEditor(typeof(t_OnNotificationTrigger), true)]\r\n    public class t_OnNotificationTriggerInspector : SPEditor\r\n    {\r\n\r\n        public const string PROP_NOTIFTYPE = \"_notificationType\";\r\n        public const string PROP_USEGLOBAL = \"_useGlobal\";\r\n        public const string PROP_TARGET = \"_targetGameObject\";\r\n\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n\r\n\r\n            \r\n            var cache = SPGUI.DisableIfPlaying();\r\n\r\n            this.DrawPropertyField(PROP_NOTIFTYPE);\r\n\r\n            var useGlobalProp = this.serializedObject.FindProperty(PROP_USEGLOBAL);\r\n            var targetProp = this.serializedObject.FindProperty(PROP_TARGET);\r\n\r\n            SPEditorGUILayout.PropertyField(useGlobalProp);\r\n            if(useGlobalProp.boolValue)\r\n            {\r\n                targetProp.objectReferenceValue = null;\r\n            }\r\n            else\r\n            {\r\n                SPEditorGUILayout.PropertyField(targetProp);\r\n            }\r\n\r\n            cache.Reset();\r\n\r\n\r\n\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_NOTIFTYPE, PROP_USEGLOBAL, PROP_TARGET);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenario/t_StateMachineInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [CustomEditor(typeof(t_StateMachine), true)]\r\n    public class t_StateMachineInspector : SPEditor\r\n    {\r\n\r\n        private const string PROP_STATES = \"_states\";\r\n        private const string PROP_STATENAME = \"_name\";\r\n        private const string PROP_INITIALSTATE = \"_initialState\";\r\n        private const string PROP_NOTIFYONSTART = \"_notifyFirstStateOnStart\";\r\n\r\n        private ReorderableArrayPropertyDrawer _arrayDrawer = new ReorderableArrayPropertyDrawer()\r\n        {\r\n            DrawElementAtBottom = true,\r\n            ChildPropertyAsLabel = PROP_STATENAME\r\n        };\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _arrayDrawer.ElementAdded += OnStateAdded;\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            _arrayDrawer.ElementAdded -= OnStateAdded;\r\n        }\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n\r\n            var statesProp = this.serializedObject.FindProperty(PROP_STATES);\r\n            var label = EditorHelper.TempContent(\"States\");\r\n            var r = EditorGUILayout.GetControlRect(true, _arrayDrawer.GetPropertyHeight(statesProp, label));\r\n            _arrayDrawer.OnGUI(r, statesProp, label);\r\n\r\n            string[] states = new string[statesProp.arraySize];\r\n            for (int i = 0; i < statesProp.arraySize; i++)\r\n            {\r\n                states[i] = statesProp.GetArrayElementAtIndex(i).FindPropertyRelative(PROP_STATENAME).stringValue;\r\n            }\r\n\r\n            //notify on state\r\n            this.DrawPropertyField(PROP_NOTIFYONSTART);\r\n\r\n            //initial state\r\n            var initialStateProp = this.serializedObject.FindProperty(PROP_INITIALSTATE);\r\n            initialStateProp.intValue = EditorGUILayout.Popup(\"Initial State\", initialStateProp.intValue, states);\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_STATES, PROP_INITIALSTATE, PROP_NOTIFYONSTART);\r\n\r\n            if (Application.isPlaying)\r\n            {\r\n                var obj = this.serializedObject.targetObject as t_StateMachine;\r\n                if (obj != null)\r\n                    EditorGUILayout.LabelField(\"Current State\", (obj.Current != null) ? obj.Current.Name : string.Empty);\r\n            }\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n\r\n        private void OnStateAdded(object sender, System.EventArgs e)\r\n        {\r\n            var drawer = sender as ReorderableArrayPropertyDrawer;\r\n            if (drawer == null || drawer.CurrentReorderableList == null) return;\r\n\r\n            var lst = drawer.CurrentReorderableList;\r\n            var stateProp = lst.serializedProperty.GetArrayElementAtIndex(lst.index);\r\n            stateProp.FindPropertyRelative(PROP_STATENAME).stringValue = \"State \" + lst.serializedProperty.arraySize.ToString();\r\n        }\r\n\r\n\r\n    }\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Scenes/SceneRefPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Scenes;\nusing com.spacepuppy.Utils;\n\nusing com.spacepuppyeditor.Internal;\n\nnamespace com.spacepuppyeditor.Scenes\n{\n\n    [CustomPropertyDrawer(typeof(SceneRef))]\n    public class SceneRefPropertyDrawer : PropertyDrawer\n    {\n\n        public const string PROP_SCENEASSET = \"_sceneAsset\";\n        public const string PROP_SCENENAME = \"_sceneName\";\n\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n        {\n            return EditorGUIUtility.singleLineHeight;\n        }\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            EditorGUI.BeginProperty(position, label, property);\n            var totalPos = position;\n            position = EditorGUI.PrefixLabel(position, label);\n\n            var assetProp = property.FindPropertyRelative(PROP_SCENEASSET);\n            var nameProp = property.FindPropertyRelative(PROP_SCENENAME);\n\n            const float TOGGLE_WIDTH = 30f;\n            Rect rObjField = new Rect(position.xMin, position.yMin, Mathf.Max(position.width - TOGGLE_WIDTH, 0f), EditorGUIUtility.singleLineHeight);\n            if (assetProp.objectReferenceValue != null)\n            {\n                EditorGUI.BeginChangeCheck();\n                assetProp.objectReferenceValue = EditorGUI.ObjectField(rObjField, GUIContent.none, assetProp.objectReferenceValue, typeof(SceneAsset), false);\n                if (EditorGUI.EndChangeCheck())\n                {\n                    var scene = assetProp.objectReferenceValue as SceneAsset;\n                    nameProp.stringValue = (scene != null) ? scene.name : string.Empty;\n                }\n            }\n            else\n            {\n                var rText = new Rect(rObjField.xMin, rObjField.yMin, Mathf.Max(rObjField.width - EditorHelper.OBJFIELD_DOT_WIDTH, 0f), rObjField.height);\n                var rDot = new Rect(rText.xMax, rObjField.yMin, Mathf.Min(rObjField.width - rText.width, EditorHelper.OBJFIELD_DOT_WIDTH), rObjField.height);\n                EditorGUI.BeginChangeCheck();\n                assetProp.objectReferenceValue = EditorGUI.ObjectField(rDot, GUIContent.none, assetProp.objectReferenceValue, typeof(SceneAsset), false);\n                nameProp.stringValue = EditorGUI.TextField(rText, nameProp.stringValue);\n\n\n                var ev = Event.current;\n                switch (ev.type)\n                {\n                    case EventType.DragUpdated:\n                    case EventType.DragPerform:\n                        if (totalPos.Contains(ev.mousePosition))\n                        {\n                            var scene = DragAndDrop.objectReferences.FirstOrDefault((o) => o is SceneAsset) as SceneAsset;\n                            DragAndDrop.visualMode = scene != null ? DragAndDropVisualMode.Link : DragAndDropVisualMode.Rejected;\n\n                            if (scene != null && ev.type == EventType.DragPerform)\n                            {\n                                assetProp.objectReferenceValue = scene;\n                                nameProp.stringValue = scene.name;\n                            }\n                        }\n                        break;\n                }\n            }\n\n            var rBtn = new Rect(rObjField.xMax, position.yMin, Mathf.Min(TOGGLE_WIDTH, position.width - rObjField.width), EditorGUIUtility.singleLineHeight);\n            if(GUI.Button(rBtn, \"X\"))\n            {\n                assetProp.objectReferenceValue = null;\n                nameProp.stringValue = string.Empty;\n            }\n            \n            EditorGUI.EndProperty();\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/ScriptableObjectHelper.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.IO;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor\r\n{\r\n    public static class ScriptableObjectHelper\r\n    {\r\n\r\n        /// <summary>\r\n        //\tThis makes it easy to create, name and place unique new ScriptableObject asset files.\r\n        /// </summary>\r\n        public static T CreateAsset<T>(UnityEngine.Object relativeTo, string name = null) where T : ScriptableObject\r\n        {\r\n            string path = AssetDatabase.GetAssetPath(relativeTo);\r\n            if (string.IsNullOrEmpty(path))\r\n            {\r\n                path = \"Assets\";\r\n            }\r\n            else if (!string.IsNullOrEmpty(Path.GetExtension(path)))\r\n            {\r\n                path = path.Replace(Path.GetFileName(path), \"\");\r\n            }\r\n            if (!path.EndsWith(\"/\")) path += \"/\";\r\n\r\n            if (name == null) name = \"New \" + typeof(T).Name;\r\n\r\n            return CreateAsset<T>(path + name + \".asset\");\r\n        }\r\n\r\n        /// <summary>\r\n        //\tThis makes it easy to create, name and place unique new ScriptableObject asset files.\r\n        /// </summary>\r\n        public static T CreateAsset<T>(string path) where T : ScriptableObject\r\n        {\r\n            if (StringUtil.IsNullOrWhitespace(path)) throw new System.ArgumentException(\"Path must not be null or whitespace.\", \"path\");\r\n            //make sure folder exists\r\n            CreateFolderIfNotExist(System.IO.Path.GetDirectoryName(path));\r\n            path = AssetDatabase.GenerateUniqueAssetPath(path);\r\n\r\n            T asset = ScriptableObject.CreateInstance<T>();\r\n            AssetDatabase.CreateAsset(asset, path);\r\n\r\n            AssetDatabase.SaveAssets();\r\n            EditorUtility.FocusProjectWindow();\r\n            Selection.activeObject = asset;\r\n\r\n            return asset;\r\n        }\r\n\r\n        /// <summary>\r\n        //\tThis makes it easy to create, name and place unique new ScriptableObject asset files.\r\n        /// </summary>\r\n        public static ScriptableObject CreateAsset(System.Type tp, string path)\r\n        {\r\n            if (StringUtil.IsNullOrWhitespace(path)) throw new System.ArgumentException(\"Path must not be null or whitespace.\", \"path\");\r\n            //make sure folder exists\r\n            CreateFolderIfNotExist(System.IO.Path.GetDirectoryName(path));\r\n            path = AssetDatabase.GenerateUniqueAssetPath(path);\r\n\r\n            var asset = ScriptableObject.CreateInstance(tp);\r\n            AssetDatabase.CreateAsset(asset, path);\r\n\r\n            AssetDatabase.SaveAssets();\r\n            EditorUtility.FocusProjectWindow();\r\n            Selection.activeObject = asset;\r\n\r\n            return asset;\r\n        }\r\n\r\n        public static bool FolderExists(string path)\r\n        {\r\n            if (string.IsNullOrEmpty(path)) return true;\r\n            return Directory.Exists(Application.dataPath + \"/\" + path.EnsureNotStartWith(\"Assets\").EnsureNotStartWith(\"/\"));\r\n        }\r\n\r\n        public static void CreateFolderIfNotExist(string folder)\r\n        {\r\n            if (string.IsNullOrEmpty(folder)) return;\r\n            if (!FolderExists(folder))\r\n            {\r\n                AssetDatabase.CreateFolder(Path.GetDirectoryName(folder), Path.GetFileName(folder));\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Shaders/DefaultShader.shader",
    "content": "﻿Shader \"SPEditor/DefaultShader\"\r\n{\r\n\tSubShader {\r\n\t\tPass {\r\n\t\t\tBindChannels{\r\n\t\t\t\tBind \"Color\", color\r\n\t\t\t}\r\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha\r\n\t\t\tZWrite Off\r\n\t\t\tCull Off\r\n\t\t\tFog { Mode Off }\r\n\t\t\tColor(1, 1, 1, 1)\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Shaders/DefaultShader.shader.meta",
    "content": "fileFormatVersion: 2\nguid: 74100f29a6376b840b08443c31390238\ntimeCreated: 1456266554\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "SpacepuppyBaseEditor/Shaders/LineShader.shader",
    "content": "﻿Shader \"SPEditor/LineShader\"\n{\n\tSubShader {\n\t\tPass {\n\t\t\tBindChannels {\n\t\t\t\tBind \"Color\", color\n\t\t\t}\n\t\t\tBlend SrcAlpha OneMinusSrcAlpha\n\t\t\tZWrite Off\n\t\t\tCull Off\n\t\t\tFog { Mode Off }\n\t\t}\n\t}\n}"
  },
  {
    "path": "SpacepuppyBaseEditor/Shaders/LineShader.shader.meta",
    "content": "fileFormatVersion: 2\nguid: b866cfca3124ac24db28c589ed538231\ntimeCreated: 1456266573\nlicenseType: Free\nShaderImporter:\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "SpacepuppyBaseEditor/SpacepuppyBaseEditor.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{A0466EE3-9582-4C0D-965D-E2D2F9006971}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>com.spacepuppyeditor</RootNamespace>\r\n    <AssemblyName>SpacepuppyUnityFrameworkEditor</AssemblyName>\r\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile>\r\n    </TargetFrameworkProfile>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>TRACE;DEBUG;SP_LIB</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE;SP_LIB</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"UnityEditor, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEditor.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"UnityEngine, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"UnityEngine.UI, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEngine.UI.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"AssetHelper.cs\" />\r\n    <Compile Include=\"Base\\AdvancedInputManagerWindow.cs\" />\r\n    <Compile Include=\"Base\\Commands\\FindReferencesToObjectMenu.cs\" />\r\n    <Compile Include=\"Base\\Commands\\ScreenshotUtil.cs\" />\r\n    <Compile Include=\"Base\\Commands\\ScreenshotRecorderWindow.cs\" />\r\n    <Compile Include=\"Base\\Commands\\SPCreateRagdollWizard.cs\" />\r\n    <Compile Include=\"Base\\ComponentHeaderDrawers\\ForceRootTagHeaderDrawer.cs\" />\r\n    <Compile Include=\"Base\\ComponentHeaderDrawers\\RequireColliderHeaderDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\AnimationCurveConstraintPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\ConstraintPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\DefaultOrConfiguredAttributePropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\DisplayFlatPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\EnumPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Modifiers\\DisplayIfPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\EnumInCustomOrderPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\FixedPercentDecimalPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\FixedPercentLongPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\FixedPercentPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\GameLoopEntryInspector.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\InputIDPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\ProxyPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\ShortUidPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\TetherJointInspector.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\VariableStoreInspector.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\VariantMemberPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\VectorInspectorPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\VersionInfoPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\WeightedValueCollectionPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Modifiers\\DisableIfModifier.cs\" />\r\n    <Compile Include=\"Base\\Modifiers\\FindInSelfModifier.cs\" />\r\n    <Compile Include=\"Base\\Modifiers\\ForceFromSelfModifier.cs\" />\r\n    <Compile Include=\"Base\\Modifiers\\ReadOnlyModifier.cs\" />\r\n    <Compile Include=\"BulkBuildSettings.cs\" />\r\n    <Compile Include=\"Components\\TypeRestrictionPropertyDrawer.cs\" />\r\n    <Compile Include=\"ExecutionOrderHelper.cs\" />\r\n    <Compile Include=\"Internal\\HackPropertyDrawers.cs\" />\r\n    <Compile Include=\"Project\\SerializableInterfaceRefPropertyDrawer.cs\" />\r\n    <Compile Include=\"Scenario\\EventTriggerEvaluatorInspector.cs\" />\r\n    <Compile Include=\"Scenario\\i_PlayAudioInspector.cs\" />\r\n    <Compile Include=\"Scenario\\i_TriggerOnEnumStateInspector.cs\" />\r\n    <Compile Include=\"SpacepuppySettings.cs\" />\r\n    <Compile Include=\"BuildSettings.cs\" />\r\n    <Compile Include=\"Cameras\\CameraControllerInspector.cs\" />\r\n    <Compile Include=\"Cameras\\CameraMovementControllerInspector.cs\" />\r\n    <Compile Include=\"Cameras\\MultiCameraControllerInspector.cs\" />\r\n    <Compile Include=\"Components\\SelectableObjectPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\SPEntityInspector.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\SPTimePropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\SPTimePeriodPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\TimeUnitsSelectorPropertyDrawer.cs\" />\r\n    <Compile Include=\"Collections\\DictionaryPropertyDrawer.cs\" />\r\n    <Compile Include=\"EditorCoroutine.cs\" />\r\n    <Compile Include=\"EditorHierarchyAlternateContextMenuEvents.cs\" />\r\n    <Compile Include=\"Geom\\CubicBezierCurveEditorWindow.cs\" />\r\n    <Compile Include=\"Geom\\CubicBezierCurvePropertyDrawer.cs\" />\r\n    <Compile Include=\"Geom\\PlanarSurfaceComponentEditor.cs\" />\r\n    <Compile Include=\"Geom\\TransformAltContextMenu.cs\" />\r\n    <Compile Include=\"Hooks\\CollisionSignalSourcePropertyDrawer.cs\" />\r\n    <Compile Include=\"IArrayHandlingPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\SpacepuppySettingsWindow.cs\" />\r\n    <Compile Include=\"Base\\Commands\\ComponentSearchWindow.cs\" />\r\n    <Compile Include=\"Base\\Commands\\TransformCopyMenu.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\ComparisonOperatorPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\DisplayNestedPropertyPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\EnumPopupExcludingPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\MaxRangePropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\MinRangePropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\RadicalCoroutineManagerInspector.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\SingletonProxyInspector.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\UnitVectorPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\VariantCollectionPropertyDrawer.cs\" />\r\n    <Compile Include=\"ComponentHeaderDrawer.cs\" />\r\n    <Compile Include=\"Base\\ComponentHeaderDrawers\\RequireComponentInEntityHeaderDrawer.cs\" />\r\n    <Compile Include=\"Base\\ComponentHeaderDrawers\\RequireLayerHeaderDrawer.cs\" />\r\n    <Compile Include=\"Base\\ComponentHeaderDrawers\\RequireLikeComponentHeaderDrawer.cs\" />\r\n    <Compile Include=\"Base\\ComponentHeaderDrawers\\UniqueToEntityHeaderDrawer.cs\" />\r\n    <Compile Include=\"Base\\Decorators\\InfoboxDecorator.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\DiscreteFloatPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\GameObjectNotificationDispatcherInspector.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\OneOrManyPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\ReorderableArrayPropertyDrawer.cs\" />\r\n    <Compile Include=\"Components\\IComponentChoiceSelector.cs\" />\r\n    <Compile Include=\"Components\\SelectableComponentPropertyDrawer.cs\" />\r\n    <Compile Include=\"EditorHierarchyDrawerEvents.cs\" />\r\n    <Compile Include=\"HierarchyDrawer.cs\" />\r\n    <Compile Include=\"IconHelper.cs\" />\r\n    <Compile Include=\"InputSettings.cs\" />\r\n    <Compile Include=\"Internal\\CachedReorderableList.cs\" />\r\n    <Compile Include=\"Internal\\DefaultPropertyHandler.cs\" />\r\n    <Compile Include=\"Internal\\GUIViewProxy.cs\" />\r\n    <Compile Include=\"Internal\\PropertyHandlerValidationUtility.cs\" />\r\n    <Compile Include=\"Internal\\MultiPropertyAttributePropertyHandler.cs\" />\r\n    <Compile Include=\"Base\\Modifiers\\InsertButtonModifier.cs\" />\r\n    <Compile Include=\"EditorHelper.cs\" />\r\n    <Compile Include=\"EditorProjectPrefs.cs\" />\r\n    <Compile Include=\"EditorSceneEvents.cs\" />\r\n    <Compile Include=\"HandlesHelper.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\AdvancedAnimationInspector.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\EnumFlagsPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\EulerRotationInspectorPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\GenericMaskPropertyDrawer.cs\" />\r\n    <Compile Include=\"Geom\\IntervalInspector.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\MultiTagInspector.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\SingletonInspector.cs\" />\r\n    <Compile Include=\"Project\\ResourceLinkPropertyDrawer.cs\" />\r\n    <Compile Include=\"Project\\ResourceLinkTablePropertyDrawer.cs\" />\r\n    <Compile Include=\"Scenes\\SceneRefPropertyDrawer.cs\" />\r\n    <Compile Include=\"Project\\TagDataInspector.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\TagMaskInspector.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\TagSelectorPropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\TypeReferencePropertyDrawer.cs\" />\r\n    <Compile Include=\"Base\\Inspectors\\VariantReferencePropertyDrawer.cs\" />\r\n    <Compile Include=\"Internal\\InternalTypeUtil.cs\" />\r\n    <Compile Include=\"Internal\\IPropertyHandler.cs\" />\r\n    <Compile Include=\"Internal\\PropertyDrawerActivator.cs\" />\r\n    <Compile Include=\"Internal\\PropertyHandlerCache.cs\" />\r\n    <Compile Include=\"Internal\\ScriptAttributeUtility.cs\" />\r\n    <Compile Include=\"Internal\\StandardPropertyHandler.cs\" />\r\n    <Compile Include=\"Internal\\UnityInternalPropertyHandler.cs\" />\r\n    <Compile Include=\"MaterialHelper.cs\" />\r\n    <Compile Include=\"Base\\Modifiers\\DefaultFromSelfModifier.cs\" />\r\n    <Compile Include=\"Base\\Modifiers\\DisableOnPlayModifier.cs\" />\r\n    <Compile Include=\"Base\\Modifiers\\OnChangedInEditorModifier.cs\" />\r\n    <Compile Include=\"Base\\Modifiers\\PropertyModifier.cs\" />\r\n    <Compile Include=\"PrefabHelper.cs\" />\r\n    <Compile Include=\"Project\\AssetBundlePackageInspector.cs\" />\r\n    <Compile Include=\"Project\\CustomTimeLayersDataInspector.cs\" />\r\n    <Compile Include=\"Project\\ResourcePackageInspector.cs\" />\r\n    <Compile Include=\"Project\\WeightedTextDocumentInspector.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"Render\\MaterialPropertyReferencePropertyDrawer.cs\" />\r\n    <Compile Include=\"Render\\MaterialSourceInspector.cs\" />\r\n    <Compile Include=\"Render\\MaterialTransitionPropertyDrawer.cs\" />\r\n    <Compile Include=\"Render\\RenderSettingsProxyInpsector.cs\" />\r\n    <Compile Include=\"ReorderableListHelper.cs\" />\r\n    <Compile Include=\"Scenario\\ITriggerableMechanismAddonDrawer.cs\" />\r\n    <Compile Include=\"Scenario\\i_EnableInspector.cs\" />\r\n    <Compile Include=\"Scenario\\i_SetValueInspector.cs\" />\r\n    <Compile Include=\"Scenario\\i_SetValueOnEntityInspector.cs\" />\r\n    <Compile Include=\"Scenario\\i_SetValueOnTargetInspector.cs\" />\r\n    <Compile Include=\"Scenario\\i_SetValueOnTriggerArgInspector.cs\" />\r\n    <Compile Include=\"Scenario\\i_StartTetherJointInspector.cs\" />\r\n    <Compile Include=\"Scenario\\i_TriggerOnEvalInspector.cs\" />\r\n    <Compile Include=\"Scenario\\i_TriggerOnIfThenInspector.cs\" />\r\n    <Compile Include=\"Scenario\\i_TriggerRandomEliminationInspector.cs\" />\r\n    <Compile Include=\"Scenario\\i_TriggerSequenceInspector.cs\" />\r\n    <Compile Include=\"Scenario\\i_TweenStateInspector.cs\" />\r\n    <Compile Include=\"Scenario\\i_TweenValueInspector.cs\" />\r\n    <Compile Include=\"Scenario\\ObservableTargetDataPropertyDrawer.cs\" />\r\n    <Compile Include=\"Scenario\\TriggerableTargetObjectPropertyDrawer.cs\" />\r\n    <Compile Include=\"Scenario\\TriggerComponentInspector.cs\" />\r\n    <Compile Include=\"Scenario\\TriggerPropertyDrawer.cs\" />\r\n    <Compile Include=\"Scenario\\TriggerTargetPropertyDrawer.cs\" />\r\n    <Compile Include=\"Scenario\\t_OnEventTriggerInspector.cs\" />\r\n    <Compile Include=\"Scenario\\t_OnNotificationTriggerInspector.cs\" />\r\n    <Compile Include=\"Scenario\\t_StateMachineInspector.cs\" />\r\n    <Compile Include=\"ScriptableObjectHelper.cs\" />\r\n    <Compile Include=\"SPEditor.cs\" />\r\n    <Compile Include=\"SPEditorAddonDrawer.cs\" />\r\n    <Compile Include=\"SPEditorGUI.cs\" />\r\n    <Compile Include=\"SPEditorGUILayout.cs\" />\r\n    <Compile Include=\"SPEditorStyles.cs\" />\r\n    <Compile Include=\"SPGUI.cs\" />\r\n    <Compile Include=\"SPMenu.cs\" />\r\n    <Compile Include=\"Base\\TypeSelectionDropDownWindow.cs\" />\r\n    <Compile Include=\"Tween\\SPTweenInspector.cs\" />\r\n    <Compile Include=\"Project\\TextRefPropertyDrawer.cs\" />\r\n    <Compile Include=\"Utils\\Diminish\\DiminishingWeightOverDurationPropertyDrawer.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\r\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\r\n      <Name>SpacepuppyBase</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Shaders\\DefaultShader.shader\" />\r\n    <None Include=\"Shaders\\DefaultShader.shader.meta\" />\r\n    <None Include=\"Shaders\\LineShader.shader\" />\r\n    <None Include=\"Shaders\\LineShader.shader.meta\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PreBuildEvent>\r\n    </PreBuildEvent>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <PostBuildEvent>mkdir $(ProjectDir)..\\Builds\\FullLibrary\\Editor\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.dll\" \"$(ProjectDir)..\\Builds\\FullLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.pdb\" \"$(ProjectDir)..\\Builds\\FullLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.pdb\"\r\nmkdir $(ProjectDir)..\\Builds\\BaseLibrary\\Editor\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.dll\" \"$(ProjectDir)..\\Builds\\BaseLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.pdb\" \"$(ProjectDir)..\\Builds\\BaseLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.pdb\"\r\nmkdir $(ProjectDir)..\\Builds\\FullLibrary\\Editor\\Shaders\\\r\nxcopy /Y /S \"$(ProjectDir)Shaders\" \"$(ProjectDir)\\..\\Builds\\FullLibrary\\Editor\\Shaders\\\"\r\nmkdir $(ProjectDir)..\\Builds\\BaseLibrary\\Editor\\Shaders\\\r\nxcopy /Y /S \"$(ProjectDir)Shaders\" \"$(ProjectDir)\\..\\Builds\\BaseLibrary\\Editor\\Shaders\\\"</PostBuildEvent>\r\n  </PropertyGroup>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "SpacepuppyBaseEditor/SpacepuppySettings.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppyeditor\n{\n\n    public static class SpacepuppySettings\n    {\n\n        private const string SETTING_STORESETTINGSLOCAL = \"Spacepuppy.StoreSettingsLocal\";\n\n        private const string SETTING_SPEDITOR_ISDEFAULT_ACTIVE = \"UseSPEditor.IsDefault.Active\";\n        private const string SETTING_ADVANCEDANIMINSPECTOR_ACTIVE = \"AdvancedAnimationInspector.Active\";\n        private const string SETTING_HIERARCHYDRAWER_ACTIVE = \"EditorHierarchyEvents.Active\";\n        private const string SETTING_HIEARCHYALTERNATECONTEXTMENU_ACTIVE = \"EditorHierarchyAlternateContextMenu.Active\";\n        private const string SETTING_SIGNALIVALIDATERECEIVER_ACTIVE = \"SignalValidateReceiver.Active\";\n\n        private const string SETTING_MODELIMPORT_USE = \"ModelImportManager.UseSpacepuppyModelImportSettings\";\n        private const string SETTING_MODELIMPORT_SETMATERIALSEARCH = \"ModelImportManager.SetMaterialSearch\";\n        private const string SETTING_MODELIMPORT_MATERIALSEARCH = \"ModelImportManager.MaterialSearch\";\n        private const string SETTING_MODELIMPORT_SETANIMSETTINGS = \"ModelImportManager.SetAnimationSettings\";\n        private const string SETTING_MODELIMPORT_ANIMRIGTYPE = \"ModelImportManager.AnimRigType\";\n\n        \n        public static bool StoreSettingsLocal\n        {\n            get\n            {\n                return EditorProjectPrefs.Local.GetBool(SETTING_STORESETTINGSLOCAL, false);\n            }\n            set\n            {\n                EditorProjectPrefs.Local.SetBool(SETTING_STORESETTINGSLOCAL, value);\n            }\n        }\n\n        /*\n         * EDITOR SETTINGS\n         */\n\n        public static bool UseSPEditorAsDefaultEditor\n        {\n            get\n            {\n                if (StoreSettingsLocal)\n                    return EditorProjectPrefs.Local.GetBool(SETTING_SPEDITOR_ISDEFAULT_ACTIVE, true);\n                else\n                    return EditorProjectPrefs.Group.GetBool(SETTING_SPEDITOR_ISDEFAULT_ACTIVE, true);\n            }\n            set\n            {\n                if(StoreSettingsLocal)\n                    EditorProjectPrefs.Local.SetBool(SETTING_SPEDITOR_ISDEFAULT_ACTIVE, value);\n                else\n                    EditorProjectPrefs.Group.SetBool(SETTING_SPEDITOR_ISDEFAULT_ACTIVE, value);\n            }\n        }\n\n        public static bool UseAdvancedAnimationInspector\n        {\n            get\n            {\n                if (StoreSettingsLocal)\n                    return EditorProjectPrefs.Local.GetBool(SETTING_ADVANCEDANIMINSPECTOR_ACTIVE, true);\n                else\n                    return EditorProjectPrefs.Group.GetBool(SETTING_ADVANCEDANIMINSPECTOR_ACTIVE, true);\n            }\n            set\n            {\n                if (StoreSettingsLocal)\n                    EditorProjectPrefs.Local.SetBool(SETTING_ADVANCEDANIMINSPECTOR_ACTIVE, value);\n                else\n                    EditorProjectPrefs.Group.SetBool(SETTING_ADVANCEDANIMINSPECTOR_ACTIVE, value);\n            }\n        }\n\n        public static bool UseHierarchDrawer\n        {\n            get\n            {\n                if (StoreSettingsLocal)\n                    return EditorProjectPrefs.Local.GetBool(SETTING_HIERARCHYDRAWER_ACTIVE, true);\n                else\n                    return EditorProjectPrefs.Group.GetBool(SETTING_HIERARCHYDRAWER_ACTIVE, true);\n            }\n            set\n            {\n                if (StoreSettingsLocal)\n                    EditorProjectPrefs.Local.SetBool(SETTING_HIERARCHYDRAWER_ACTIVE, value);\n                else\n                    EditorProjectPrefs.Group.SetBool(SETTING_HIERARCHYDRAWER_ACTIVE, value);\n            }\n        }\n\n        public static bool UseHierarchyAlternateContextMenu\n        {\n            get\n            {\n                if (StoreSettingsLocal)\n                    return EditorProjectPrefs.Local.GetBool(SETTING_HIEARCHYALTERNATECONTEXTMENU_ACTIVE, true);\n                else\n                    return EditorProjectPrefs.Group.GetBool(SETTING_HIEARCHYALTERNATECONTEXTMENU_ACTIVE, true);\n            }\n            set\n            {\n                if (StoreSettingsLocal)\n                    EditorProjectPrefs.Local.SetBool(SETTING_HIEARCHYALTERNATECONTEXTMENU_ACTIVE, value);\n                else\n                    EditorProjectPrefs.Group.SetBool(SETTING_HIEARCHYALTERNATECONTEXTMENU_ACTIVE, value);\n            }\n        }\n\n        public static bool SignalValidateReceiver\n        {\n            get\n            {\n                if (StoreSettingsLocal)\n                    return EditorProjectPrefs.Local.GetBool(SETTING_SIGNALIVALIDATERECEIVER_ACTIVE, true);\n                else\n                    return EditorProjectPrefs.Group.GetBool(SETTING_SIGNALIVALIDATERECEIVER_ACTIVE, true);\n            }\n            set\n            {\n                if (StoreSettingsLocal)\n                    EditorProjectPrefs.Local.SetBool(SETTING_SIGNALIVALIDATERECEIVER_ACTIVE, value);\n                else\n                    EditorProjectPrefs.Group.SetBool(SETTING_SIGNALIVALIDATERECEIVER_ACTIVE, value);\n            }\n        }\n\n        /*\n         * MODELIMPORT SETTINGS\n         */\n\n        //Material Import Settings\n\n        public static bool SetMaterialSearchOnImport\n        {\n            get\n            {\n                if (StoreSettingsLocal)\n                    return EditorProjectPrefs.Local.GetBool(SETTING_MODELIMPORT_SETMATERIALSEARCH, true);\n                else\n                    return EditorProjectPrefs.Group.GetBool(SETTING_MODELIMPORT_SETMATERIALSEARCH, true);\n            }\n            set\n            {\n                if (StoreSettingsLocal)\n                    EditorProjectPrefs.Local.SetBool(SETTING_MODELIMPORT_SETMATERIALSEARCH, value);\n                else\n                    EditorProjectPrefs.Group.SetBool(SETTING_MODELIMPORT_SETMATERIALSEARCH, value);\n            }\n        }\n\n        public static ModelImporterMaterialSearch MaterialSearch\n        {\n            get\n            {\n                if (StoreSettingsLocal)\n                    return EditorProjectPrefs.Local.GetEnum(SETTING_MODELIMPORT_MATERIALSEARCH, ModelImporterMaterialSearch.Everywhere);\n                else\n                    return (ModelImporterMaterialSearch)EditorProjectPrefs.Group.GetInt(SETTING_MODELIMPORT_MATERIALSEARCH, (int)ModelImporterMaterialSearch.Everywhere);\n            }\n            set\n            {\n                if (StoreSettingsLocal)\n                    EditorProjectPrefs.Local.SetEnum(SETTING_MODELIMPORT_MATERIALSEARCH, value);\n                else\n                    EditorProjectPrefs.Group.SetInt(SETTING_MODELIMPORT_MATERIALSEARCH, (int)value);\n            }\n        }\n\n        //Animation Import Settings\n\n        public static bool SetAnimationSettingsOnImport\n        {\n            get\n            {\n                if (StoreSettingsLocal)\n                    return EditorProjectPrefs.Local.GetBool(SETTING_MODELIMPORT_SETANIMSETTINGS, true);\n                else\n                    return EditorProjectPrefs.Group.GetBool(SETTING_MODELIMPORT_SETANIMSETTINGS, true);\n            }\n            set\n            {\n                if (StoreSettingsLocal)\n                    EditorProjectPrefs.Local.SetBool(SETTING_MODELIMPORT_SETANIMSETTINGS, value);\n                else\n                    EditorProjectPrefs.Group.SetBool(SETTING_MODELIMPORT_SETANIMSETTINGS, value);\n            }\n        }\n\n        public static ModelImporterAnimationType ImportAnimRigType\n        {\n            get\n            {\n                if (StoreSettingsLocal)\n                    return EditorProjectPrefs.Local.GetEnum(SETTING_MODELIMPORT_ANIMRIGTYPE, ModelImporterAnimationType.Legacy);\n                else\n                    return (ModelImporterAnimationType)EditorProjectPrefs.Group.GetInt(SETTING_MODELIMPORT_ANIMRIGTYPE, (int)ModelImporterAnimationType.Legacy);\n            }\n            set\n            {\n                if (StoreSettingsLocal)\n                    EditorProjectPrefs.Local.SetEnum(SETTING_MODELIMPORT_ANIMRIGTYPE, value);\n                else\n                    EditorProjectPrefs.Group.SetInt(SETTING_MODELIMPORT_ANIMRIGTYPE, (int)value);\n            }\n        }\n        \n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Tween/SPTweenInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Tween;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\n\r\nnamespace com.spacepuppyeditor.Tween\r\n{\r\n\r\n    [CustomEditor(typeof(SPTween))]\r\n    public class SPTweenInspector : SPEditor\r\n    {\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.DrawDefaultInspector();\r\n\r\n            var obj = this.target as SPTween;\r\n            if(obj != null && Application.isPlaying)\r\n            {\r\n                EditorGUILayout.HelpBox(\"Active Tweens: \" + obj.RunningTweenCount.ToString(), MessageType.Info);\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyBaseEditor/Utils/Diminish/DiminishingWeightOverDurationPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Utils.Diminish;\r\n\r\nusing com.spacepuppyeditor.Base;\r\n\r\nnamespace com.spacepuppyeditor.Utils.Diminish\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(DiminishingWeightOverDuration))]\r\n    public class DiminishingWeightOverDurationPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public const string PROP_WEIGHT = \"_weight\";\r\n        public const string PROP_MAXCOUNT = \"_maxCount._value\";\r\n        public const string PROP_DIMINISHRATE = \"_diminishRate\";\r\n        public const string PROP_DIMINISHPERIOD = \"_diminishPeriodDuration\";\r\n\r\n        public bool DrawFoldout = true;\r\n\r\n        private float[] _line1 = new float[1];\r\n        private float[] _line2 = new float[3];\r\n        private GUIContent[] _line1Labels = new GUIContent[] {new GUIContent(\"Weight\")};\r\n        private GUIContent[] _line2Labels = new GUIContent[] { new GUIContent(\"Max Count\"), new GUIContent(\"Dimin Rate\"), new GUIContent(\"Dimin Period\") };\r\n\r\n\r\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\r\n        {\r\n            //return property.isExpanded ? EditorGUIUtility.singleLineHeight * 3f : EditorGUIUtility.singleLineHeight;\r\n            return (!this.DrawFoldout || property.isExpanded) ? EditorGUIUtility.singleLineHeight * 2f : EditorGUIUtility.singleLineHeight;\r\n        }\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            //EditorGUI.BeginProperty(position, label, property);\r\n            //if(property.isExpanded)\r\n            //{\r\n            //    var r1 = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n            //    var r2 = new Rect(position.xMin, r1.yMax, position.width, EditorGUIUtility.singleLineHeight);\r\n            //    var r3 = new Rect(position.xMin, r2.yMax, position.width, EditorGUIUtility.singleLineHeight);\r\n\r\n            //    property.isExpanded = EditorGUI.Foldout(r1, property.isExpanded, GUIContent.none);\r\n            //    SPEditorGUI.DefaultPropertyField(r1, property.FindPropertyRelative(PROP_WEIGHT), label);\r\n            //    EditorGUI.indentLevel++;\r\n            //    SPEditorGUI.DefaultPropertyField(r2, property.FindPropertyRelative(PROP_DIMINISHRATE), EditorHelper.TempContent(\"Diminish Rate\"));\r\n            //    SPEditorGUI.DefaultPropertyField(r3, property.FindPropertyRelative(PROP_DIMINISHPERIOD), EditorHelper.TempContent(\"Diminish Period Duration\"));\r\n            //    EditorGUI.indentLevel--;\r\n            //}\r\n            //else\r\n            //{\r\n            //    property.isExpanded = EditorGUI.Foldout(position, property.isExpanded, GUIContent.none);\r\n            //    SPEditorGUI.DefaultPropertyField(position, property.FindPropertyRelative(PROP_WEIGHT), label);\r\n            //}\r\n            //EditorGUI.EndProperty();\r\n\r\n\r\n            if(!this.DrawFoldout || property.isExpanded)\r\n            {\r\n                const float LINE2_MARGIN = 20f;\r\n                var r1 = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);\r\n                var r2 = new Rect(position.xMin + LINE2_MARGIN, r1.yMax, Mathf.Max(position.width - LINE2_MARGIN, 0f), EditorGUIUtility.singleLineHeight);\r\n\r\n                if(this.DrawFoldout) property.isExpanded = SPEditorGUI.PrefixFoldoutLabel(r1, property.isExpanded, GUIContent.none);\r\n\r\n                var weightProp = property.FindPropertyRelative(PROP_WEIGHT);\r\n\r\n                _line1[0] = weightProp.floatValue;\r\n\r\n                EditorGUI.BeginChangeCheck();\r\n                SPEditorGUI.MultiFloatField(r1, label, _line1Labels, _line1, 50f);\r\n                if (EditorGUI.EndChangeCheck())\r\n                    weightProp.floatValue = _line1[0];\r\n\r\n                var maxCountProp = property.FindPropertyRelative(PROP_MAXCOUNT);\r\n                var rateProp = property.FindPropertyRelative(PROP_DIMINISHRATE);\r\n                var periodProp = property.FindPropertyRelative(PROP_DIMINISHPERIOD);\r\n\r\n                _line2[0] = maxCountProp.floatValue;\r\n                _line2[1] = rateProp.floatValue;\r\n                _line2[2] = periodProp.floatValue;\r\n\r\n                EditorGUI.BeginChangeCheck();\r\n                SPEditorGUI.DelayedMultiFloatField(r2, _line2Labels, _line2, 80f);\r\n                if(EditorGUI.EndChangeCheck())\r\n                {\r\n                    maxCountProp.floatValue = DiscreteFloatPropertyDrawer.NormalizeValue(maxCountProp.floatValue, _line2[0]);\r\n                    rateProp.floatValue = _line2[1];\r\n                    periodProp.floatValue = _line2[2];\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (this.DrawFoldout) property.isExpanded = SPEditorGUI.PrefixFoldoutLabel(position, property.isExpanded, GUIContent.none);\r\n\r\n                var weightProp = property.FindPropertyRelative(PROP_WEIGHT);\r\n                _line1[0] = weightProp.floatValue;\r\n                SPEditorGUI.MultiFloatField(position, label, _line1Labels, _line1, 50f);\r\n                \r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyExtended/ClassicTimers/GameTimer.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing com.spacepuppy.Collections;\n\nnamespace com.spacepuppy.ClassicTimers\n{\n\n    public class GameTimer : Timer\n    {\n\n        #region Events\n\n        public event System.Action<GameTimer> TimerCount;\n        public event System.Action<GameTimer> TimerComplete;\n\n        #endregion\n\n        #region Fields\n\n        private float _delay;\n        private int _repeatCount;\n\n        private float _currentTime;\n        private int _currentCount;\n\n        //if true, when the timer completes it will attempt to clean the timer pool of gypsy timers\n        private bool _isGypsy;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public GameTimer()\n        {\n            \n        }\n\n        /// <summary>\n        /// Create a timer with a delay in seconds and a certain repeat count. A repeat count of 0 continues forever.\n        /// </summary>\n        /// <param name=\"delay\"></param>\n        /// <param name=\"repeatCount\"></param>\n        public GameTimer(float delay, int repeatCount)\n        {\n            _delay = delay;\n            _repeatCount = repeatCount;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public float CurrentTime\n        {\n            get { return _currentTime; }\n        }\n\n        public int CurrentCount\n        {\n            get { return _currentCount; }\n        }\n\n        public float Delay\n        {\n            get { return _delay; }\n            set { _delay = value; }\n        }\n\n        /// <summary>\n        /// Number of times the interval should repeat before completing. Negative values repeat forever.\n        /// </summary>\n        public int RepeatCount\n        {\n            get { return _repeatCount; }\n            set { _repeatCount = value; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public override void Start()\n        {\n            if (_repeatCount > 0 && _currentCount >= _repeatCount) return;\n\n            base.Start();\n        }\n\n        public void Start(float delay, int repeatCount)\n        {\n            this.Delay = delay;\n            this.RepeatCount = repeatCount;\n\n            this.Start();\n        }\n\n        public void Complete()\n        {\n            _currentCount = _repeatCount;\n            _currentTime = 0;\n\n            if (this.TimerCount != null) this.TimerCount(this);\n            if (this.TimerComplete != null) this.TimerComplete(this);\n\n            this.Stop();\n        }\n\n        public void Reset()\n        {\n            this.Stop();\n\n            _currentCount = 0;\n            _currentTime = 0;\n        }\n\n        protected override void UpdateTimer(float dt)\n        {\n            if (!this.IsRunning) return;\n\n            _currentTime += dt;\n\n            while (_currentTime > _delay)\n            {\n                _currentTime -= _delay;\n                _currentCount++;\n\n                if (this.TimerCount != null) this.TimerCount(this);\n\n                if (_repeatCount >= 0 && _currentCount > _repeatCount)\n                {\n                    //manually stop, don't call stop\n                    this.IsRunning = false;\n                    if (this.TimerComplete != null) this.TimerComplete(this);\n\n                    //manually remove timer after calling TimerComplete event\n                    //this way if it's a gypsy timer it doesn't get cleaned before the event is fired\n                    Timer.RemoveReference(this);\n                    if (_isGypsy)\n                    {\n                        this.Dispose();\n                    }\n                    return;\n                }\n            }\n        }\n\n        #endregion\n\n        #region IDisposable Interface\n\n        protected override void Dispose(bool disposing)\n        {\n            base.Dispose();\n\n            if(disposing && _isGypsy)\n            {\n                _timerPool.Release(this);\n            }\n        }\n\n        #endregion\n\n        #region Static Interface\n\n        /// <summary>\n        /// these timers are used as gypsy timers, said timers only exist for a short period of time and are in a \n        /// state of constant play (they should not ever be stopped). When they finish playing they're returned to \n        /// the pool for future use. They're pooled for quick propogation.\n        /// </summary>\n        private static ObjectCachePool<GameTimer> _timerPool = new ObjectCachePool<GameTimer>(-1,\n        () =>\n        {\n            var t = new GameTimer();\n            t._isGypsy = true;\n            return t;\n        },\n        (t) =>\n        {\n            t._delay = 0;\n            t._repeatCount = 0;\n            t._currentTime = 0;\n            t._currentCount = 0;\n            t.TimerComplete = null;\n            t.TimerCount = null;\n            t.IsRunning = false;\n            t.IsDisposed = false;\n        });\n\n        /// <summary>\n        /// quickly generates a timer for a specific duration, when accessing the count event do NOT attempt to store \n        /// a reference to the timer as it is a pooled asset and can quickly change to an unstable state.\n        /// </summary>\n        /// <param name=\"delay\">Duration in seconds.</param>\n        /// <param name=\"complete\">Delegate fired when the timer completes.</param>\n        /// <param name=\"count\">Delegate fired when the time ticks.</param>\n        public static void CreateGypsyTimer(float delay, System.Action<GameTimer> complete, System.Action<GameTimer> count)\n        {\n            var t = _timerPool.GetInstance();\n            t.Delay = delay;\n            t.RepeatCount = 0;\n\n            if (complete == null) throw new System.ArgumentNullException(\"complete\", \"complete event handler must be non-null\");\n\n            t.TimerComplete += complete;\n            if (count != null) t.TimerCount += count;\n\n            t.Start();\n        }\n\n        public static void CreateGypsyTimer(float delay, System.Action<GameTimer> complete)\n        {\n            CreateGypsyTimer(delay, complete, null);\n        }\n\n        #endregion\n\n    }\n\n}"
  },
  {
    "path": "SpacepuppyExtended/ClassicTimers/RandomSwitch.cs",
    "content": "﻿using UnityEngine;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.ClassicTimers\n{\n\n    /// <summary>\n    /// Switch that swaps its 'Allow' property between true and false over random durations.\n    /// </summary>\n    public class RandomSwitch : Timer\n    {\n\n        #region Fields\n\n        private float _t;\n        private float _cap;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public RandomSwitch()\n        {\n\n        }\n\n        public RandomSwitch(float offMin, float offMax, float onMin, float onMax)\n        {\n            this.SetRanges(offMin, offMax, onMin, onMax);\n        }\n\n        #endregion\n\n        #region Properties\n\n        public bool Allow\n        {\n            get { return _t < 0; }\n        }\n\n        public float OffMinDuration { get; private set; }\n        public float OffMaxDuration { get; private set; }\n\n        public float OnMinDuration { get; private set; }\n        public float OnMaxDuration { get; private set; }\n\n        #endregion\n\n        #region Methods\n\n        public void SetRanges(float offMin, float offMax, float onMin, float onMax)\n        {\n            this.OffMinDuration = offMin;\n            this.OffMaxDuration = offMax;\n            this.OnMinDuration = onMin;\n            this.OnMaxDuration = onMax;\n\n            this.Reset();\n        }\n\n        public void Reset()\n        {\n            this.Stop();\n\n            _t = 0;\n            _cap = RandomUtil.Standard.Range(OffMaxDuration, OffMinDuration);\n        }\n\n        protected override void UpdateTimer(float dt)\n        {\n            if (!this.IsRunning) return;\n            if (_cap <= 0) return;\n\n            _t += dt;\n            while (_t > _cap)\n            {\n                _t -= _cap;\n                _t -= Random.Range(OnMinDuration, OnMinDuration);\n                _cap = Random.Range(OffMinDuration, OffMaxDuration);\n            }\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/ClassicTimers/Timer.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing com.spacepuppy.Collections;\n\n\nnamespace com.spacepuppy.ClassicTimers\n{\n\n    public abstract class Timer : System.IDisposable\n    {\n\n        #region Properties\n\n        public bool IsRunning\n        {\n            get;\n            protected set;\n        }\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public Timer()\n        {\n            IsRunning = false;\n        }\n\n        #endregion\n\n        #region Methods\n\n        public virtual void Start()\n        {\n            this.IsRunning = true;\n            Timer.AddReference(this);\n        }\n\n        public virtual void Stop()\n        {\n            this.IsRunning = false;\n            Timer.RemoveReference(this);\n        }\n\n        protected abstract void UpdateTimer(float dt);\n\n        #endregion\n\n        #region IDisposable Members\n\n        public bool IsDisposed\n        {\n            get;\n            protected set;\n        }\n\n        public void Dispose()\n        {\n            Dispose(true);\n\n            //System.GC.SuppressFinalize(this);\n\n            IsDisposed = true;\n        }\n\n        protected virtual void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                Timer.RemoveReference(this);\n            }\n        }\n\n        #endregion\n\n        #region Static Timer Entry\n\n        private static WeakList<Timer> _runningTimers = new WeakList<Timer>();\n\n        static Timer()\n        {\n            GameLoopEntry.OnUpdate += (s, e) => Update();\n        }\n\n        private static void Update()\n        {\n            float dt = Time.deltaTime;\n            if (_runningTimers.Count > 0)\n            {\n                _runningTimers.Clean();\n\n                foreach (var timer in _runningTimers)\n                {\n                    if (timer != null && timer.IsRunning) timer.UpdateTimer(dt);\n                }\n            }\n        }\n\n        protected static void AddReference(Timer timer)\n        {\n            _runningTimers.Add(timer);\n        }\n\n        protected static void RemoveReference(Timer timer)\n        {\n            _runningTimers.Remove(timer);\n        }\n\n        #endregion\n\n        #region DECONSTRUCTOR\n\n        ~Timer()\n        {\n            try\n            {\n                Timer.RemoveReference(this);\n            }\n            catch\n            {\n                //do nothing if we failed...\n            }\n        }\n\n        #endregion\n\n    }\n\n}"
  },
  {
    "path": "SpacepuppyExtended/ClassicTimers/TimerSwitch.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy.ClassicTimers\n{\n\n    /// <summary>\n    /// Turns on for a set amount of time before turning off again. Has programmable delay to turning on.\n    /// </summary>\n    public class TimerSwitch : Timer\n    {\n\n        #region Events\n\n        public event System.EventHandler SwitchedOn;\n        private void OnSwitchedOn(System.EventArgs e)\n        {\n            if (SwitchedOn != null) SwitchedOn(this, e);\n        }\n\n        public event System.EventHandler Complete;\n        private void OnComplete(System.EventArgs e)\n        {\n            if (Complete != null) Complete(this, e);\n        }\n\n        #endregion\n\n        #region Fields\n\n        private float _t = float.NegativeInfinity;\n\n        private float _delay;\n        private float _dur;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public TimerSwitch()\n            : this(0, 0)\n        {\n\n        }\n\n        public TimerSwitch(float dur)\n            : this(dur, 0)\n        {\n            \n        }\n\n        public TimerSwitch(float dur, float delay)\n        {\n            _delay = delay;\n            _dur = dur;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public bool Allow\n        {\n            get { return (_t > 0 && _t < _dur); }\n        }\n\n        public bool AutoReset { get; set; }\n\n        public float Duration {\n            get { return _dur; }\n            set { _dur = value; }\n        }\n\n        public float Delay {\n            get { return _delay; }\n            set { _delay = value; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public void Reset()\n        {\n            this.Stop();\n            _t = float.NegativeInfinity;\n        }\n\n        public override void Start()\n        {\n            _t = -_delay;\n\n            base.Start();\n        }\n\n        public void Start(float dur)\n        {\n            this.Start(dur, 0.0f);\n        }\n\n        public void Start(float dur, float delay)\n        {\n            _delay = delay;\n            _dur = dur;\n\n            this.Start();\n        }\n\n        protected override void UpdateTimer(float dt)\n        {\n            if (!this.IsRunning) return;\n\n            if (_t < 0 && _t + dt > 0)\n            {\n                this.OnSwitchedOn(System.EventArgs.Empty);\n            }\n\n            _t += dt;\n\n            if (_t > _dur)\n            {\n                this.Stop();\n                this.OnComplete(System.EventArgs.Empty);\n\n                if (this.AutoReset) this.Reset();\n            }\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Collections/DuplicateKeyAddAction.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Collections\n{\n    public enum DuplicateKeyAddAction\n    {\n        Replace = 0,\n        Nothing = 1,\n        Exception = 2\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Collections/KeyedCollection.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.Collections\n{\n    /// <summary>\n    /// A collection that acts like a self-keyed unique-value dictionary. When adding values you add just the value, and its key is generated.\n    /// </summary>\n    public class KeyedCollection<TKey, TValue> : ICollection<TValue>\n    {\n\n        public delegate TKey KeyCalculator(TValue value);\n\n        #region Fields\n\n        private KeyCalculator _calc;\n        private DuplicateKeyAddAction _addAction;\n\n        private Dictionary<TKey, TValue> _dict;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public KeyedCollection(KeyCalculator calc)\n        {\n            if (calc == null) throw new ArgumentNullException(\"calc\");\n            _dict = new Dictionary<TKey, TValue>();\n            _calc = calc;\n            _addAction = DuplicateKeyAddAction.Replace;\n        }\n\n        public KeyedCollection(KeyCalculator calc, DuplicateKeyAddAction addAction)\n        {\n            if (calc == null) throw new ArgumentNullException(\"calc\");\n            _dict = new Dictionary<TKey, TValue>();\n            _calc = calc;\n            _addAction = addAction;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public TValue this[TKey key]\n        {\n            get\n            {\n                if (_dict.ContainsKey(key))\n                    return _dict[key];\n                else\n                    return default(TValue);\n            }\n        }\n\n        public DuplicateKeyAddAction AddAction { get { return _addAction; } }\n\n        public ICollection<TKey> Keys { get { return _dict.Keys; } }\n\n        #endregion\n\n        #region Methods\n\n        public TValue[] ToArray()\n        {\n            return _dict.Values.ToArray();\n        }\n\n        public void AddRange(IEnumerable<TValue> collection)\n        {\n            if (collection == null) return;\n            foreach (var v in collection)\n            {\n                this.Add(v);\n            }\n        }\n\n        public bool ContainsKey(TKey key)\n        {\n            return _dict.ContainsKey(key);\n        }\n\n        #endregion\n\n        #region ICollection\n\n        public void Add(TValue item)\n        {\n            if (_dict.Values.Contains(item)) return;\n\n            var key = _calc(item);\n            if (_dict.ContainsKey(key))\n            {\n                switch (_addAction)\n                {\n                    case DuplicateKeyAddAction.Replace:\n                        _dict[key] = item;\n                        break;\n                    case DuplicateKeyAddAction.Nothing:\n                        //do nothing\n                        break;\n                    case DuplicateKeyAddAction.Exception:\n                        throw new DuplicateKeyException();\n                }\n            }\n            else\n            {\n                _dict.Add(key, item);\n            }\n        }\n\n        public void Clear()\n        {\n            _dict.Clear();\n        }\n\n        public bool Contains(TValue item)\n        {\n            return _dict.Values.Contains(item);\n        }\n\n        public void CopyTo(TValue[] array, int arrayIndex)\n        {\n            _dict.Values.CopyTo(array, arrayIndex);\n        }\n\n        public int Count\n        {\n            get { return _dict.Count; }\n        }\n\n        public bool IsReadOnly\n        {\n            get { return false; }\n        }\n\n        public bool Remove(TValue item)\n        {\n            var key = _calc(item);\n            return _dict.Remove(key);\n        }\n\n        public Enumerator GetEnumerator()\n        {\n            return new Enumerator(this);\n        }\n\n        IEnumerator<TValue> IEnumerable<TValue>.GetEnumerator()\n        {\n            return new Enumerator(this);\n        }\n\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n        {\n            return new Enumerator(this);\n        }\n\n        #endregion\n\n        #region Special Types\n\n        public struct Enumerator : IEnumerator<TValue>\n        {\n\n            private KeyedCollection<TKey, TValue> _coll;\n            private Dictionary<TKey, TValue>.Enumerator _e;\n\n            public Enumerator(KeyedCollection<TKey, TValue> coll)\n            {\n                if (coll == null) throw new System.ArgumentNullException(\"coll\");\n                _coll = coll;\n                _e = coll._dict.GetEnumerator();\n            }\n\n            public TValue Current\n            {\n                get { return _e.Current.Value; }\n            }\n\n            object System.Collections.IEnumerator.Current\n            {\n                get { return _e.Current.Value; }\n            }\n\n            public bool MoveNext()\n            {\n                return _e.MoveNext();\n            }\n\n            void System.Collections.IEnumerator.Reset()\n            {\n                _e = _coll._dict.GetEnumerator();\n            }\n\n            public void Dispose()\n            {\n                _e.Dispose();\n            }\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Collections/LiveSPComponentCollection.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Collections\n{\n    public class LiveSPComponentCollection<T> : ICollection<T> where T : SPComponent\n    {\n\n        #region Hook\n\n        private event System.Action _onUpdate;\n        public event System.Action OnUpdate\n        {\n            add\n            {\n                _onUpdate += value;\n                if(_onUpdate != null && _routine == null && !object.ReferenceEquals(_currentMaster, null))\n                {\n                    _routine = _currentMaster.StartRadicalCoroutine(this.UpdateRoutine(), RadicalCoroutineDisableMode.CancelOnDisable);\n                }\n            }\n            remove\n            {\n                _onUpdate -= value;\n                if(_onUpdate == null && _routine != null)\n                {\n                    _routine.Cancel();\n                    _routine = null;\n                }\n            }\n        }\n\n        #endregion\n\n        #region Methods\n\n        private List<T> _components = new List<T>();\n        private List<T> _liveComponents = new List<T>();\n        private T _currentMaster;\n        private RadicalCoroutine _routine;\n\n        private float _updateInterval;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public LiveSPComponentCollection()\n        {\n\n        }\n\n        public LiveSPComponentCollection(float updateInterval)\n        {\n            _updateInterval = updateInterval;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public float UpdateInterval\n        {\n            get { return _updateInterval; }\n            set { _updateInterval = value; }\n        }\n\n        public int LiveCount\n        {\n            get { return _liveComponents.Count; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public bool IsAlive(T item)\n        {\n            return _liveComponents.Contains(item);\n        }\n\n        public T GetLiveObject(int index)\n        {\n            if (index < 0 || index >= _liveComponents.Count) throw new System.IndexOutOfRangeException();\n\n            return _liveComponents[index];\n        }\n\n        public T PopOldest()\n        {\n            if (_liveComponents.Count == 0) throw new InvalidOperationException(\"Live objects is empty.\");\n            var item = _liveComponents[0];\n            this.Remove(item);\n            return item;\n        }\n\n        public T[] PopOldest(int count)\n        {\n            if (count > _liveComponents.Count) throw new InvalidOperationException(\"Count is greater than number of live objects.\");\n\n            T[] arr = new T[count];\n            for(int i = 0; i < count; i++)\n            {\n                arr[i] = _liveComponents[0];\n                _components.Remove(arr[i]);\n                _liveComponents.RemoveAt(0);\n            }\n\n            if (arr.Contains(_currentMaster))\n            {\n                if (_routine != null)\n                {\n                    _routine.Cancel();\n                    _routine = null;\n                }\n\n                if (_liveComponents.Count > 0)\n                {\n                    _currentMaster = _liveComponents[0];\n                    if (_onUpdate != null)\n                    {\n                        _routine = _currentMaster.StartRadicalCoroutine(this.UpdateRoutine(), RadicalCoroutineDisableMode.CancelOnDisable);\n                    }\n                }\n                else\n                {\n                    _currentMaster = null;\n                }\n            }\n\n            return arr;\n        }\n\n        public T PopYoungest()\n        {\n            if (_liveComponents.Count == 0) throw new InvalidOperationException(\"Live objects is empty.\");\n            var item = _liveComponents[_liveComponents.Count - 1];\n            this.Remove(item);\n            return item;\n        }\n\n        public T[] PopYoungest(int count)\n        {\n            if (count > _liveComponents.Count) throw new InvalidOperationException(\"Count is greater than number of live objects.\");\n\n            T[] arr = new T[count];\n            for (int i = 0; i < count; i++)\n            {\n                arr[i] = _liveComponents[_liveComponents.Count - 1];\n                _components.Remove(arr[i]);\n                _liveComponents.RemoveAt(_liveComponents.Count - 1);\n            }\n\n            if(arr.Contains(_currentMaster))\n            {\n                if (_routine != null)\n                {\n                    _routine.Cancel();\n                    _routine = null;\n                }\n\n                if (_liveComponents.Count > 0)\n                {\n                    _currentMaster = _liveComponents[0];\n                    if (_onUpdate != null)\n                    {\n                        _routine = _currentMaster.StartRadicalCoroutine(this.UpdateRoutine(), RadicalCoroutineDisableMode.CancelOnDisable);\n                    }\n                }\n                else\n                {\n                    _currentMaster = null;\n                }\n            }\n\n            return arr;\n        }\n\n        #endregion\n\n        #region Event Handlers\n\n        private void OnComponentEnabled(object sender, System.EventArgs e)\n        {\n            var item = sender as T;\n            if (item == null) return;\n            if (_liveComponents.Contains(item)) return;\n\n            _liveComponents.Add(item);\n            if (_liveComponents.Count == 1)\n            {\n                _currentMaster = _liveComponents[0];\n                if (_onUpdate != null) _routine = _currentMaster.StartRadicalCoroutine(this.UpdateRoutine(), RadicalCoroutineDisableMode.CancelOnDisable);\n            }\n        }\n\n        private void OnComponentDisabled(object sender, System.EventArgs e)\n        {\n            var item = sender as T;\n            if (item == null) return;\n\n            _liveComponents.Remove(item);\n            if(item == _currentMaster)\n            {\n                if (_routine != null)\n                {\n                    _routine.Cancel();\n                    _routine = null;\n                }\n\n                if (_liveComponents.Count > 0)\n                {\n                    _currentMaster = _liveComponents[0];\n                    if (_onUpdate != null)\n                    {\n                        _routine = _currentMaster.StartRadicalCoroutine(this.UpdateRoutine(), RadicalCoroutineDisableMode.CancelOnDisable);\n                    }\n                }\n                else\n                {\n                    _currentMaster = null;\n                }\n            }\n        }\n\n        private void OnComponentDestroyed(object sender, System.EventArgs e)\n        {\n            var item = sender as T;\n            if (item == null) return;\n\n            _components.Remove(item);\n            _liveComponents.Remove(item);\n            if (item == _currentMaster)\n            {\n                if (_routine != null)\n                {\n                    _routine.Cancel();\n                    _routine = null;\n                }\n\n                if (_liveComponents.Count > 0)\n                {\n                    _currentMaster = _liveComponents[0];\n                    if (_onUpdate != null)\n                    {\n                        _routine = _currentMaster.StartRadicalCoroutine(this.UpdateRoutine(), RadicalCoroutineDisableMode.CancelOnDisable);\n                    }\n                }\n                else\n                {\n                    _currentMaster = null;\n                }\n            }\n        }\n\n        private System.Collections.IEnumerator UpdateRoutine()\n        {\n            yield return null;\n\n            while(true)\n            {\n                if (_onUpdate != null) _onUpdate();\n\n                if (_updateInterval > 0f)\n                {\n                    yield return WaitForDuration.Seconds(_updateInterval);\n                }\n                else\n                {\n                    yield return null;\n                }\n            }\n        }\n\n        #endregion\n\n        #region ICollection Interface\n\n        public int Count\n        {\n            get { return _components.Count; }\n        }\n\n        bool ICollection<T>.IsReadOnly\n        {\n            get { return false; }\n        }\n\n        public void Add(T item)\n        {\n            if (item == null) throw new System.ArgumentNullException(\"item\");\n            if (_components.Contains(item)) return;\n\n            _components.Add(item);\n            if(item.isActiveAndEnabled)\n            {\n                _liveComponents.Add(item);\n                if (_liveComponents.Count == 1)\n                {\n                    _currentMaster = _liveComponents[0];\n                    if(_onUpdate != null) _routine = _currentMaster.StartRadicalCoroutine(this.UpdateRoutine(), RadicalCoroutineDisableMode.CancelOnDisable);\n                }\n            }\n        }\n\n        public bool Remove(T item)\n        {\n            if (object.ReferenceEquals(item, null)) return false;\n\n            if (_components.Remove(item))\n            {\n                _liveComponents.Remove(item);\n                item.OnEnabled -= this.OnComponentEnabled;\n                item.OnDisabled -= this.OnComponentDisabled;\n                item.ComponentDestroyed -= this.OnComponentDestroyed;\n\n                if (item == _currentMaster)\n                {\n                    if (_routine != null)\n                    {\n                        _routine.Cancel();\n                        _routine = null;\n                    }\n\n                    if(_liveComponents.Count > 0)\n                    {\n                        _currentMaster = _liveComponents[0];\n                        if (_onUpdate != null)\n                        {\n                            _routine = _currentMaster.StartRadicalCoroutine(this.UpdateRoutine(), RadicalCoroutineDisableMode.CancelOnDisable);\n                        }\n                    }\n                    else\n                    {\n                        _currentMaster = null;\n                    }\n                }\n                return true;\n            }\n\n            return false;\n        }\n\n        public void Clear()\n        {\n            foreach(var item in _liveComponents)\n            {\n                item.OnEnabled -= this.OnComponentEnabled;\n                item.OnDisabled -= this.OnComponentDisabled;\n                item.ComponentDestroyed -= this.OnComponentDestroyed;\n            }\n\n            if(_routine != null)\n            {\n                _routine.Cancel();\n                _routine = null;\n            }\n\n            _components.Clear();\n            _liveComponents.Clear();\n        }\n\n        public bool Contains(T item)\n        {\n            return _components.Contains(item);\n        }\n\n        public void CopyTo(T[] array, int arrayIndex)\n        {\n            _components.CopyTo(array, arrayIndex);\n        }\n\n        #endregion\n\n        #region IEnumerable Interface\n\n        public System.Collections.IEnumerator GetEnumerator()\n        {\n            return _components.GetEnumerator();\n        }\n\n        IEnumerator<T> IEnumerable<T>.GetEnumerator()\n        {\n            return _components.GetEnumerator();\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Collections/SignalCollectionEventArgs.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Collections\n{\n    public delegate void SignalCollectionEventHandler(object sender, SignalCollectionEventArgs e);\n\n    public class SignalCollectionEventArgs : EventArgs\n    {\n\n        private object _object;\n\n        public SignalCollectionEventArgs(object obj)\n        {\n            _object = obj;\n        }\n\n        public object Value { get { return _object; } }\n\n    }\n\n    public interface ISignalingCollection : System.Collections.ICollection\n    {\n\n        event EventHandler Clearing;\n        event EventHandler Cleared;\n\n        event SignalCollectionEventHandler Added;\n        event SignalCollectionEventHandler Removed;\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Collections/SignalingCollection.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Collections\n{\n    public class SignalingCollection<T> : IList<T>, ISignalingCollection\n    {\n\n        #region Events\n\n        public event EventHandler Clearing;\n        public event EventHandler Cleared;\n\n        public event SignalCollectionEventHandler Added;\n        public event SignalCollectionEventHandler Removed;\n\n        protected virtual void OnClearing(EventArgs e)\n        {\n            if (Clearing != null) this.Clearing(this, e);\n        }\n\n        protected virtual void OnCleared(EventArgs e)\n        {\n            if (Cleared != null) this.Cleared(this, e);\n        }\n\n        protected virtual void OnAdded(SignalCollectionEventArgs e)\n        {\n            if (Added != null) this.Added(this, e);\n        }\n\n        protected virtual void OnRemoved(SignalCollectionEventArgs e)\n        {\n            if (Removed != null) this.Removed(this, e);\n        }\n\n        #endregion\n\n        #region Fields\n\n        private List<T> _lst;\n        private IEqualityComparer<T> _comparer;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public SignalingCollection()\n        {\n            _lst = new List<T>();\n            _comparer = null;\n        }\n\n        public SignalingCollection(int capacity)\n        {\n            _lst = new List<T>(capacity);\n            _comparer = null;\n        }\n\n        public SignalingCollection(IEnumerable<T> collection)\n        {\n            _lst = new List<T>(collection);\n            _comparer = null;\n        }\n\n        public SignalingCollection(IEqualityComparer<T> comparer)\n        {\n            _lst = new List<T>();\n            _comparer = comparer;\n        }\n\n        public SignalingCollection(int capacity, IEqualityComparer<T> comparer)\n        {\n            _lst = new List<T>(capacity);\n            _comparer = comparer;\n        }\n\n        public SignalingCollection(IEnumerable<T> collection, IEqualityComparer<T> comparer)\n        {\n            _lst = new List<T>(collection);\n            _comparer = comparer;\n        }\n\n        #endregion\n\n        #region IList Interface\n\n        public int IndexOf(T item)\n        {\n            if (_comparer == null)\n            {\n                return _lst.IndexOf(item);\n            }\n            else\n            {\n                for (int i = 0; i < _lst.Count; i++)\n                {\n                    if (_comparer.Equals(_lst[i], item)) return i;\n                }\n            }\n\n            return -1;\n        }\n\n        public void Insert(int index, T item)\n        {\n            _lst.Insert(index, item);\n            this.OnAdded(new SignalCollectionEventArgs(item));\n        }\n\n        public void RemoveAt(int index)\n        {\n            if (index < 0 || index >= _lst.Count) throw new IndexOutOfRangeException();\n\n            var item = _lst[index];\n            _lst.RemoveAt(index);\n            this.OnRemoved(new SignalCollectionEventArgs(item));\n        }\n\n        public T this[int index]\n        {\n            get\n            {\n                if (index < 0 || index >= _lst.Count) throw new IndexOutOfRangeException();\n                return _lst[index];\n            }\n            set\n            {\n                if (index < 0 || index >= _lst.Count) throw new IndexOutOfRangeException();\n                var item = _lst[index];\n                if (_comparer == null)\n                {\n                    if (Object.Equals(item, value)) return;\n                }\n                else\n                {\n                    if (_comparer.Equals(item, value)) return;\n                }\n\n                _lst[index] = value;\n                this.OnRemoved(new SignalCollectionEventArgs(item));\n                this.OnAdded(new SignalCollectionEventArgs(value));\n            }\n        }\n\n        #endregion\n\n        #region ICollection<T> Interface\n\n        public void Add(T item)\n        {\n            _lst.Add(item);\n            this.OnAdded(new SignalCollectionEventArgs(item));\n        }\n\n        public void Clear()\n        {\n            this.OnClearing(EventArgs.Empty);\n            _lst.Clear();\n            this.OnCleared(EventArgs.Empty);\n        }\n\n        public bool Contains(T item)\n        {\n            if (_comparer == null)\n            {\n                return _lst.Contains(item);\n            }\n            else\n            {\n                foreach (var obj in _lst)\n                {\n                    if (_comparer.Equals(obj, item)) return true;\n                }\n            }\n\n            return false;\n        }\n\n        public void CopyTo(T[] array, int arrayIndex)\n        {\n            _lst.CopyTo(array, arrayIndex);\n        }\n\n        public int Count\n        {\n            get { return _lst.Count; }\n        }\n\n        bool ICollection<T>.IsReadOnly\n        {\n            get { return false; }\n        }\n\n        public bool Remove(T item)\n        {\n            if (_comparer == null)\n            {\n                if (_lst.Remove(item))\n                {\n                    this.OnRemoved(new SignalCollectionEventArgs(item));\n                    return true;\n                }\n            }\n            else\n            {\n                var index = this.IndexOf(item);\n                if (index >= 0)\n                {\n                    this.RemoveAt(index);\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        #endregion\n\n        #region ICollection Interface\n\n        void System.Collections.ICollection.CopyTo(Array array, int index)\n        {\n            if (array is T[])\n            {\n                this.CopyTo(array as T[], index);\n            }\n            else\n            {\n                throw new ArrayTypeMismatchException();\n            }\n        }\n\n        bool System.Collections.ICollection.IsSynchronized\n        {\n            get { return false; }\n        }\n\n        object System.Collections.ICollection.SyncRoot\n        {\n            get { return _lst; }\n        }\n\n        #endregion\n\n        #region IEnumerable Interface\n\n        public IEnumerator<T> GetEnumerator()\n        {\n            return _lst.GetEnumerator();\n        }\n\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n        {\n            return _lst.GetEnumerator();\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Collections/TaggedCollection.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Collections\n{\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <typeparam name=\"TKey\"></typeparam>\n    /// <typeparam name=\"TValue\"></typeparam>\n    public class TaggedCollection<TKey, TValue> : IEnumerable<TValue>, System.Collections.ICollection\n    {\n\n        #region Fields\n\n        private Dictionary<TKey, TValue> _dict = new Dictionary<TKey, TValue>();\n        private ITagValidator<TKey, TValue> _validator;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public TaggedCollection(ITagValidator<TKey, TValue> validator)\n        {\n            if (validator == null) throw new ArgumentNullException(\"validator\");\n            _validator = validator;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public TValue this[int index]\n        {\n            get\n            {\n                if (index < 0 || index >= _dict.Count) throw new System.IndexOutOfRangeException();\n                var key = _dict.Keys.Take(index + 1).Last();\n                return _dict[key];\n            }\n            set\n            {\n                if (index < 0 || index >= _dict.Count) throw new System.IndexOutOfRangeException();\n                var key = _dict.Keys.Take(index + 1).Last();\n                if (!_validator.Validate(key, value)) throw new TaggedCollectionValidationException();\n\n                this[key] = value;\n            }\n        }\n\n        public TValue this[TKey key]\n        {\n            get\n            {\n                return _dict[key];\n            }\n            set\n            {\n                var item = _dict[key];\n                if (Object.Equals(item, value)) return; //it's already part of it\n\n                _dict[key] = value;\n            }\n        }\n\n        public int Count\n        {\n            get { return _dict.Count; }\n        }\n\n        public IEnumerable<TKey> Tags { get { return _dict.Keys; } }\n\n        #endregion\n\n        #region Methods\n\n        public void Add(TValue value)\n        {\n            var tag = _validator.GetTag(value);\n            _dict[tag] = value;\n        }\n\n        public bool ContainsTag(TKey tag)\n        {\n            return _dict.ContainsKey(tag);\n        }\n\n        public bool ContainsValue(TValue value)\n        {\n            return _dict.Values.Contains(value);\n        }\n\n        public void Clear()\n        {\n            _dict.Clear();\n        }\n\n        public bool Remove(TKey tag)\n        {\n            return _dict.Remove(tag);\n        }\n\n        public bool TryGetValue(TKey key, out TValue value)\n        {\n            return _dict.TryGetValue(key, out value);\n        }\n\n        #endregion\n\n        #region IEnumerable Interface\n\n        //TODO - implement propert Enumerator, remember dict.Values allocates mem in mono... ugh\n\n        public IEnumerator<TValue> GetEnumerator()\n        {\n            return _dict.Values.GetEnumerator();\n        }\n\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n        {\n            return _dict.Values.GetEnumerator();\n        }\n\n        #endregion\n\n        #region ICollection Interface\n\n        void System.Collections.ICollection.CopyTo(Array array, int index)\n        {\n            if (array is TValue[])\n            {\n                _dict.Values.CopyTo(array as TValue[], index);\n            }\n            else\n            {\n                throw new System.ArrayTypeMismatchException();\n            }\n        }\n\n        bool System.Collections.ICollection.IsSynchronized\n        {\n            get { return (_dict as System.Collections.ICollection).IsSynchronized; }\n        }\n\n        object System.Collections.ICollection.SyncRoot\n        {\n            get { return (_dict as System.Collections.ICollection).SyncRoot; }\n        }\n\n        #endregion\n\n    }\n\n    public interface ITagValidator<TKey, TValue>\n    {\n\n        bool Validate(TKey tag, TValue value);\n        TKey GetTag(TValue value);\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Collections/TaggedCollectionValidationException.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.Collections\n{\n    public class TaggedCollectionValidationException : System.Exception\n    {\n        private const string MSG = \"Tag and Value failed to match in validation.\";\n\n        public TaggedCollectionValidationException()\n            : base(MSG)\n        {\n\n        }\n\n        public TaggedCollectionValidationException(System.Exception innerException)\n            : base(MSG, innerException)\n        {\n\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Geom/ColliderOverlapResolver.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Geom\n{\n\n    public class ColliderOverlapResolver : SPComponent\n    {\n\n        #region Fields\n\n        private List<ColliderOverlapResult> _currentTests = new List<ColliderOverlapResult>();\n        private System.Func<Collider, bool> _validColliderTest;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        #endregion\n\n        #region Properties\n\n        public System.Func<Collider, bool> ValidColliderTest\n        {\n            get { return _validColliderTest; }\n            set { _validColliderTest = value; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public ColliderOverlapResult GatherColliders(float duration = 0f)\n        {\n            if (!this.gameObject.activeSelf) this.gameObject.SetActive(true);\n            if (!this.enabled) this.enabled = true;\n\n            var result = new ColliderOverlapResult();\n            this.StartCoroutine(this.WaitToGatherColliders(duration, result));\n            return result;\n        }\n\n        private System.Collections.IEnumerator WaitToGatherColliders(float duration, ColliderOverlapResult result)\n        {\n            _currentTests.Add(result);\n\n            var rb = this.GetComponent<Rigidbody>();\n            if (rb != null)\n            {\n                rb.WakeUp();\n            }\n\n            yield return new WaitForSeconds(duration);\n\n            _currentTests.Remove(result);\n            if (_currentTests.Count == 0)\n            {\n                this.enabled = false;\n            }\n\n            result.Internal_Set();\n        }\n\n        #endregion\n\n        #region OnTriggerEnter Message\n\n        private void OnTriggerEnter(Collider c)\n        {\n            if (_currentTests.Count == 0) return;\n            if (_validColliderTest != null && !_validColliderTest(c)) return;\n\n            foreach(var r in _currentTests)\n            {\n                r.Internal_AddCollider(c);\n            }\n        }\n\n        private void OnTriggerStay(Collider c)\n        {\n            if (_currentTests.Count == 0) return;\n            if (_validColliderTest != null && !_validColliderTest(c)) return;\n\n            foreach (var r in _currentTests)\n            {\n                r.Internal_AddCollider(c);\n            }\n        }\n\n        #endregion\n\n\n        #region Factory Methods\n\n        public static ColliderOverlapResult GatherColliders(GameObject go, float duration = 0f)\n        {\n            if (go == null) throw new System.ArgumentNullException(\"go\");\n\n            var c = go.AddOrGetComponent<ColliderOverlapResolver>();\n            return c.GatherColliders(duration);\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Geom/ColliderOverlapResult.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Geom\n{\n\n    public class ColliderOverlapResult : RadicalYieldInstruction\n    {\n\n        #region Fields\n\n        private List<Collider> _colliders = new List<Collider>();\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public ColliderOverlapResult()\n        {\n\n        }\n\n        #endregion\n\n        #region Properties\n\n        #endregion\n\n        #region Methods\n\n        public Collider[] GetColliders()\n        {\n            for (int i = 0; i < _colliders.Count; i++)\n            {\n                if(_colliders[i] == null)\n                {\n                    _colliders.RemoveAt(i);\n                    i--;\n                }\n            }\n            return _colliders.ToArray();\n        }\n\n        internal void Internal_AddCollider(Collider c)\n        {\n            if (_colliders.Contains(c)) return;\n\n            _colliders.Add(c);\n        }\n\n        internal void Internal_RemoveCollider(Collider c)\n        {\n            _colliders.Remove(c);\n        }\n\n        internal void Internal_Set()\n        {\n            this.SetSignal();\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Geom/Frustum.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy.Geom\n{\n    public class Frustum : IGeom\n    {\n\n        #region Fields\n\n        private const int LEFT = 0;\n        private const int RIGHT = 1;\n        private const int BOTTOM = 2;\n        private const int TOP = 3;\n        private const int NEAR = 4;\n        private const int FAR = 5;\n\n        public const int NEAR_UL = 0;\n        public const int NEAR_UR = 1;\n        public const int NEAR_LR = 2;\n        public const int NEAR_LL = 3;\n        public const int FAR_UL = 4;\n        public const int FAR_UR = 5;\n        public const int FAR_LR = 6;\n        public const int FAR_LL = 7;\n\n        private Matrix4x4 _mat;\n        private Plane[] _planes;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public Frustum(Matrix4x4 mat)\n        {\n            this.SetFromMatrix(mat);\n        }\n\n        public Frustum(Vector3 pos, Quaternion rot, float near, float far, float fov, float aspect)\n        {\n            this.SetFromPerspective(pos, rot, near, far, fov, aspect);\n        }\n\n        #endregion\n\n        #region Properties\n\n        public Matrix4x4 Matrix\n        {\n            get { return _mat; }\n        }\n\n        public Plane Bottom\n        {\n            get { return _planes[BOTTOM]; }\n        }\n\n        public Plane Far\n        {\n            get { return _planes[FAR]; }\n        }\n\n        public Plane Left\n        {\n            get { return _planes[LEFT]; }\n        }\n\n        public Plane Near\n        {\n            get { return _planes[NEAR]; }\n        }\n\n        public Plane Right\n        {\n            get { return _planes[RIGHT]; }\n        }\n\n        public Plane Top\n        {\n            get { return _planes[TOP]; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public void SetFromMatrix(Matrix4x4 m)\n        {\n            _mat = m;\n            _planes = GeometryUtility.CalculateFrustumPlanes(_mat);\n        }\n\n        public void SetFromPerspective(Vector3 pos, Quaternion rot, float near, float far, float fov, float aspect)\n        {\n            var m = Matrix4x4.Perspective(fov, aspect, near, far) * Matrix4x4.TRS(pos, rot, Vector3.one);\n            this.SetFromMatrix(m);\n        }\n\n        public Vector3[] GetCorners()\n        {\n            Vector3[] arr = new Vector3[8];\n\n            arr[NEAR_UL] = GeomUtil.IntersectionOfPlanes(this.Near, this.Left, this.Top);\n            arr[NEAR_UR] = GeomUtil.IntersectionOfPlanes(this.Near, this.Right, this.Top);\n            arr[NEAR_LR] = GeomUtil.IntersectionOfPlanes(this.Near, this.Right, this.Bottom);\n            arr[NEAR_LL] = GeomUtil.IntersectionOfPlanes(this.Near, this.Left, this.Bottom);\n\n            arr[FAR_UL] = GeomUtil.IntersectionOfPlanes(this.Far, this.Left, this.Top);\n            arr[FAR_UR] = GeomUtil.IntersectionOfPlanes(this.Far, this.Right, this.Top);\n            arr[FAR_LR] = GeomUtil.IntersectionOfPlanes(this.Far, this.Right, this.Bottom);\n            arr[FAR_LL] = GeomUtil.IntersectionOfPlanes(this.Far, this.Left, this.Bottom);\n\n            return arr;\n        }\n\n        #endregion\n\n        #region IGeom Methods\n\n        public void Move(Vector3 mv)\n        {\n            throw new System.NotImplementedException();\n        }\n\n        public void RotateAroundPoint(Vector3 point, Quaternion rot)\n        {\n            throw new System.NotImplementedException();\n        }\n\n        public AxisInterval Project(Vector3 axis)\n        {\n            //TODO\n            return new AxisInterval();\n        }\n\n        public Bounds GetBounds()\n        {\n            var pnts = this.GetCorners();\n\n            Vector3 max = new Vector3();\n            max.x = Mathf.Max(pnts[0].x, pnts[1].x, pnts[2].x, pnts[3].x, pnts[4].x, pnts[5].x, pnts[6].x, pnts[7].x);\n            max.y = Mathf.Max(pnts[0].y, pnts[1].y, pnts[2].y, pnts[3].y, pnts[4].y, pnts[5].y, pnts[6].y, pnts[7].y);\n            max.z = Mathf.Max(pnts[0].z, pnts[1].z, pnts[2].z, pnts[3].z, pnts[4].z, pnts[5].z, pnts[6].z, pnts[7].z);\n\n            Vector3 min = new Vector3();\n            min.x = Mathf.Min(pnts[0].x, pnts[1].x, pnts[2].x, pnts[3].x, pnts[4].x, pnts[5].x, pnts[6].x, pnts[7].x);\n            min.y = Mathf.Min(pnts[0].y, pnts[1].y, pnts[2].y, pnts[3].y, pnts[4].y, pnts[5].y, pnts[6].y, pnts[7].y);\n            min.z = Mathf.Min(pnts[0].z, pnts[1].z, pnts[2].z, pnts[3].z, pnts[4].z, pnts[5].z, pnts[6].z, pnts[7].z);\n\n            var bounds = new Bounds();\n            bounds.SetMinMax(min, max);\n            return bounds;\n        }\n\n        public Sphere GetBoundingSphere()\n        {\n            var pnts = this.GetCorners();\n\n            Vector3 max = new Vector3();\n            max.x = Mathf.Max(pnts[0].x, pnts[1].x, pnts[2].x, pnts[3].x, pnts[4].x, pnts[5].x, pnts[6].x, pnts[7].x);\n            max.y = Mathf.Max(pnts[0].y, pnts[1].y, pnts[2].y, pnts[3].y, pnts[4].y, pnts[5].y, pnts[6].y, pnts[7].y);\n            max.z = Mathf.Max(pnts[0].z, pnts[1].z, pnts[2].z, pnts[3].z, pnts[4].z, pnts[5].z, pnts[6].z, pnts[7].z);\n\n            Vector3 min = new Vector3();\n            min.x = Mathf.Min(pnts[0].x, pnts[1].x, pnts[2].x, pnts[3].x, pnts[4].x, pnts[5].x, pnts[6].x, pnts[7].x);\n            min.y = Mathf.Min(pnts[0].y, pnts[1].y, pnts[2].y, pnts[3].y, pnts[4].y, pnts[5].y, pnts[6].y, pnts[7].y);\n            min.z = Mathf.Min(pnts[0].z, pnts[1].z, pnts[2].z, pnts[3].z, pnts[4].z, pnts[5].z, pnts[6].z, pnts[7].z);\n\n            var c = min + (max - min) / 2.0f;\n            float r = (max - c).magnitude;\n            return new Sphere(c, r);\n        }\n\n        public IEnumerable<Vector3> GetAxes()\n        {\n            //TODO\n            return System.Linq.Enumerable.Empty<Vector3>();\n        }\n\n        public bool Contains(Vector3 pos)\n        {\n            return GeometryUtility.TestPlanesAABB(_planes, new Bounds(pos, Vector3.zero));\n        }\n\n        /*\n        public IEnumerable<RaycastInfo> GetRays(float detail)\n        {\n            if (this.Near.distance == this.Far.distance) yield break;\n\n            var pnts = this.GetCorners();\n\n            float nearx = Vector3.Distance(pnts[NEAR_UL], pnts[NEAR_UR]);\n            float neary = Vector3.Distance(pnts[NEAR_UL], pnts[NEAR_LL]);\n            float farx = Vector3.Distance(pnts[FAR_UL], pnts[FAR_UR]);\n            float fary = Vector3.Distance(pnts[FAR_UL], pnts[FAR_LL]);\n            Vector3 dirx = (pnts[FAR_UR] - pnts[FAR_UL]).normalized;\n            Vector3 diry = (pnts[FAR_UL] - pnts[FAR_LL]).normalized;\n\n            int xp = Mathf.CeilToInt(nearx / detail);\n            int yp = Mathf.CeilToInt(neary / detail);\n\n            float nearxdt = nearx / (float)xp;\n            float nearydt = neary / (float)yp;\n            float farxdt = farx / (float)xp;\n            float farydt = fary / (float)yp;\n\n            int cnt = xp * yp;\n            for (int i = 0; i < cnt; i++)\n            {\n                int ix = i % xp;\n                int iy = i / yp;\n\n                Vector3 s = pnts[NEAR_LL] + (dirx * ix * nearxdt) + (diry * iy * nearydt);\n                Vector3 e = pnts[FAR_LL] + (dirx * ix * farxdt) + (diry * iy * farydt);\n                Vector3 v = e - s;\n                yield return new RaycastInfo(s, v.normalized, v.magnitude);\n            }\n        }\n\n         */\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Geom/LineSegment.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Geom\n{\n    public struct LineSegment : IGeom, IPhysicsGeom\n    {\n\n        private Vector3 _start;\n        private Vector3 _end;\n\n        public LineSegment(Vector3 s, Vector3 e)\n        {\n            _start = s;\n            _end = e;\n        }\n\n        public Vector3 Start\n        {\n            get { return _start; }\n            set { _start = value; }\n        }\n\n        public Vector3 End\n        {\n            get { return _end; }\n            set { _end = value; }\n        }\n\n        public float Length\n        {\n            get { return Vector3.Distance(_start, _end); }\n        }\n\n        public Vector3 Direction\n        {\n            get { return (_end - _start).normalized; }\n        }\n\n        public Line Line\n        {\n            get { return new Line(_start, this.Direction); }\n        }\n\n        #region IGeom Interface\n\n        public void Move(Vector3 mv)\n        {\n            _start += mv;\n            _end += mv;\n        }\n\n        public void RotateAroundPoint(Vector3 point, Quaternion rot)\n        {\n            _start = point + rot * (_start - point);\n            _end = point + rot * (_end - point);\n        }\n\n        public AxisInterval Project(Vector3 axis)\n        {\n            var a = Vector3.Dot(_start, axis);\n            var b = Vector3.Dot(_end, axis);\n            return new AxisInterval(axis, a, b);\n        }\n\n        public Bounds GetBounds()\n        {\n            var bounds = new Bounds();\n            bounds.SetMinMax(_start, _end);\n            return bounds;\n        }\n\n        public Sphere GetBoundingSphere()\n        {\n            var c = _start + (_end - _start) / 2.0f;\n            var r = (_end - c).magnitude;\n            return new Sphere(c, r);\n        }\n\n        public IEnumerable<Vector3> GetAxes()\n        {\n            //TODO\n            return System.Linq.Enumerable.Empty<Vector3>();\n        }\n\n        public bool Contains(Vector3 pos)\n        {\n            const float EPSILON = 0.0001f;\n\n            var to = pos - _start;\n            var tlen = to.magnitude;\n            if (tlen < EPSILON) return true; //start and pos are so close they're nearly the same point\n\n            var dir = _end - _start;\n            var dlen = dir.magnitude;\n            var d = Vector3.Dot(to, dir / dlen);\n            if (d < 0) return false;\n\n            //if d < dlen it's shorter then dir\n            //if the (d/tlen) almost equals 1.0f, then dir and to are nearly equal\n            return (d < dlen) && (Mathf.Abs((d / tlen) - 1.0f) < EPSILON);\n        }\n\n        #endregion\n\n        #region IPhysicsGeom Interface\n\n        public bool TestOverlap(int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            return Physics.Linecast(_start, _end, layerMask, query);\n        }\n\n        public int Overlap(ICollection<Collider> results, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            return PhysicsUtil.OverlapLine(_start, _end, results, layerMask, query);\n        }\n\n        public bool Cast(Vector3 direction, out RaycastHit hitinfo, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            throw new System.NotImplementedException();\n        }\n\n        public int CastAll(Vector3 direction, ICollection<RaycastHit> results, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            throw new System.NotImplementedException();\n        }\n\n\n        /*\n        public System.Collections.Generic.IEnumerable<RaycastInfo> GetRays(float detail)\n        {\n            var dir = _end - _start;\n            yield return new RaycastInfo(_start, dir.normalized, dir.magnitude);\n        }\n\n        public System.Collections.Generic.IEnumerable<RaycastInfo> GetRays(Vector3 dir, float detail)\n        {\n            yield return new RaycastInfo(_start, dir, 0);\n\n            var v = _end - _start;\n            var len = v.magnitude;\n            v.Normalize();\n\n            int vp = Mathf.CeilToInt(len / detail);\n            float vd = len / (float)vp;\n\n            for (int i = 1; i <= vp; i++)\n            {\n                float s = vd * i;\n                yield return new RaycastInfo(_start + v * s, dir, 0);\n            }\n        }\n\n        public System.Collections.Generic.IEnumerable<RaycastInfo> GetRays(Vector3 dir, float dist, float detail)\n        {\n            yield return new RaycastInfo(_start, dir, dist);\n\n            var v = _end - _start;\n            var len = v.magnitude;\n            v.Normalize();\n\n            int vp = Mathf.CeilToInt(len / detail);\n            float vd = len / (float)vp;\n\n            for (int i = 1; i <= vp; i++)\n            {\n                float s = vd * i;\n                yield return new RaycastInfo(_start + v * s, dir, dist);\n            }\n        }\n         */\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Geom/RadialRing.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.Geom\n{\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <programmernotes>\n    /// It should be noted that this ring, or any circle for that matter, in 3 space. Is a circle on a surface of a plane. \n    /// The plane is defined by the same center and axis of the circle.\n    /// \n    /// The standard formula for a plane is:\n    /// Ax + By + Cz = D\n    /// \n    /// The 'reduced' version of the standard formula will make the normal (A,B,C) and the distance from the origin on that vector is D.\n    /// \n    /// From the center and normal, the reduced standard formula can be calculated as:\n    /// \n    /// n.x * x + n.y * y + n.z * z = Dot(c, n)\n    /// </programmernotes>\n    public struct RadialRing : IPhysicsGeom\n    {\n\n        #region Fields\n\n        public const int DEFAULT_DETAIL = 36;\n\n        private Vector3 _center;\n        private Vector3 _axis;\n        private float _radius;\n        private float _thickness;\n        private byte _detail;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public RadialRing(Vector3 cent, Vector3 axis, float rad, float thick, byte detail)\n        {\n            _center = cent;\n            _axis = axis.normalized;\n            _radius = rad;\n            _thickness = thick;\n            _detail = detail;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public Vector3 Center\n        {\n            get { return _center; }\n            set { _center = value; }\n        }\n\n        public Vector3 Axis\n        {\n            get { return _axis; }\n            set { _axis = value.normalized; }\n        }\n\n        public float Radius\n        {\n            get { return _radius; }\n            set { _radius = value; }\n        }\n\n        public float Thickness\n        {\n            get { return _thickness; }\n            set { _thickness = value; }\n        }\n\n        public byte Detail\n        {\n            get { return _detail; }\n            set { _detail = value; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public bool TestOverlap(Vector3 primeRadial, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            if (Vector3.Dot(primeRadial, _axis) != 0)\n            {\n                primeRadial -= Vector3.Cross(_axis, Vector3.Cross(primeRadial, _axis));\n            }\n            primeRadial.Normalize();\n\n            var da = 360f / _detail;\n            Vector3 va;\n            Vector3 vb = _center + primeRadial * _radius;\n            for (int i = 1; i <= _detail; i++)\n            {\n                va = vb;\n                vb = _center + Quaternion.AngleAxis(da * i, _axis) * primeRadial * _radius;\n\n                var dir = vb - va;\n                var dis = dir.magnitude;\n                if (_thickness == 0f)\n                {\n                    if (Physics.Raycast(new Ray(va, dir), dis, layerMask, query)) return true;\n                }\n                else\n                {\n                    if (Physics.SphereCast(new Ray(va, dir), _thickness, dis, layerMask, query)) return true;\n                }\n            }\n\n            return false;\n        }\n\n        public int Overlap(Vector3 primeRadial, ICollection<Collider> results, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            if (results == null) throw new System.ArgumentNullException(\"results\");\n\n            if (Vector3.Dot(primeRadial, _axis) != 0)\n            {\n                primeRadial -= Vector3.Cross(_axis, Vector3.Cross(primeRadial, _axis));\n            }\n            primeRadial.Normalize();\n\n            int cnt = results.Count;\n            using (var tmp = com.spacepuppy.Collections.TempCollection.GetSet<Collider>())\n            {\n                var da = 360f / _detail;\n                Vector3 va;\n                Vector3 vb = _center + primeRadial * _radius;\n                for (int i = 1; i <= _detail; i++)\n                {\n                    va = vb;\n                    vb = _center + Quaternion.AngleAxis(da * i, _axis) * primeRadial * _radius;\n\n                    var dir = vb - va;\n                    var dis = dir.magnitude;\n\n                    if (_thickness == 0f)\n                    {\n                        foreach (var h in Physics.RaycastAll(new Ray(va, dir), dis, layerMask, query))\n                        {\n                            if (!tmp.Contains(h.collider))\n                            {\n                                results.Add(h.collider);\n                                tmp.Add(h.collider);\n                            }\n                        }\n                    }\n                    else\n                    {\n                        foreach (var h in Physics.SphereCastAll(new Ray(va, dir), _thickness, dis, layerMask, query))\n                        {\n                            if (!tmp.Contains(h.collider))\n                            {\n                                results.Add(h.collider);\n                                tmp.Add(h.collider);\n                            }\n                        }\n                    }\n                }\n            }\n            return results.Count - cnt;\n        }\n\n        public bool RadialCast(Vector3 primeRadial, out RaycastHit hitinfo, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            if (Vector3.Dot(primeRadial, _axis) != 0)\n            {\n                primeRadial -= Vector3.Cross(_axis, Vector3.Cross(primeRadial, _axis));\n            }\n            primeRadial.Normalize();\n\n            var da = 360f / _detail;\n            Vector3 va;\n            Vector3 vb = primeRadial * _radius;\n            for (int i = 1; i <= _detail; i++)\n            {\n                va = vb;\n                vb = _center + Quaternion.AngleAxis(da * i, _axis) * primeRadial * _radius;\n\n                var dir = vb - va;\n                var dis = dir.magnitude;\n                if (_thickness == 0f)\n                {\n                    if (Physics.Raycast(new Ray(va, dir), out hitinfo, dis, layerMask, query)) return true;\n                }\n                else\n                {\n                    if (Physics.SphereCast(new Ray(va, dir), _thickness, out hitinfo, dis, layerMask, query)) return true;\n                }\n            }\n\n            hitinfo = new RaycastHit();\n            return false;\n        }\n\n        public bool Cast(Vector3 primeRadial, Vector3 direction, out RaycastHit hitinfo, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            if (Vector3.Dot(primeRadial, _axis) != 0)\n            {\n                primeRadial -= Vector3.Cross(_axis, Vector3.Cross(primeRadial, _axis));\n            }\n            primeRadial.Normalize();\n\n            var da = 360f / _detail;\n            for (int i = 0; i < _detail; i++)\n            {\n                var v = _center + Quaternion.AngleAxis(da * i, _axis) * primeRadial * _radius;\n\n                if (_thickness == 0f)\n                {\n                    if (Physics.Raycast(new Ray(v, direction), out hitinfo, distance, layerMask, query)) return true;\n                }\n                else\n                {\n                    if (Physics.SphereCast(new Ray(v, direction), _thickness, out hitinfo, distance, layerMask, query)) return true;\n                }\n            }\n\n            hitinfo = new RaycastHit();\n            return false;\n        }\n\n        public int CastAll(Vector3 primeRadial, Vector3 direction, ICollection<RaycastHit> results, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            if (results == null) throw new System.ArgumentNullException(\"results\");\n\n            if (Vector3.Dot(primeRadial, _axis) != 0)\n            {\n                primeRadial -= Vector3.Cross(_axis, Vector3.Cross(primeRadial, _axis));\n            }\n            primeRadial.Normalize();\n\n            int cnt = results.Count;\n            var da = 360f / _detail;\n            for (int i = 0; i < _detail; i++)\n            {\n                var v = _center + Quaternion.AngleAxis(da * i, _axis) * primeRadial * _radius;\n\n                if (_thickness == 0f)\n                {\n                    foreach (var h in Physics.RaycastAll(new Ray(v, direction), distance, layerMask, query))\n                    {\n                        results.Add(h);\n                    }\n                }\n                else\n                {\n                    foreach (var h in Physics.SphereCastAll(new Ray(v, direction), _thickness, distance, layerMask, query))\n                    {\n                        results.Add(h);\n                    }\n                }\n            }\n\n            return results.Count - cnt;\n        }\n\n        #endregion\n\n        #region IGeom Interface\n\n        public void Move(Vector3 mv)\n        {\n            _center += mv;\n        }\n\n        public void RotateAroundPoint(Vector3 point, Quaternion rot)\n        {\n            _center = point + rot * (_center - point);\n            _axis = rot * _axis;\n        }\n\n        public AxisInterval Project(Vector3 axis)\n        {\n            throw new System.NotImplementedException();\n        }\n\n        public Bounds GetBounds()\n        {\n            throw new System.NotImplementedException();\n        }\n\n        public Sphere GetBoundingSphere()\n        {\n            return new Sphere(_center, _radius + _thickness);\n        }\n\n        public bool Contains(Vector3 pos)\n        {\n            var d = Vector3.Distance(_center, pos);\n            return d >= _radius - _thickness && d <= _radius + _thickness;\n        }\n\n        public IEnumerable<Vector3> GetAxes()\n        {\n            //TODO\n            return System.Linq.Enumerable.Empty<Vector3>();\n        }\n\n        #endregion\n\n        #region IPhysicsGeom Interface\n\n        public bool TestOverlap(int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            return TestOverlap((_axis == Vector3.up) ? Vector3.right : Vector3.up, layerMask, query);\n        }\n\n        public int Overlap(ICollection<Collider> results, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            return Overlap((_axis == Vector3.up) ? Vector3.right : Vector3.up, results, layerMask, query);\n        }\n\n        public bool Cast(Vector3 direction, out RaycastHit hitinfo, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            return Cast((_axis == Vector3.up) ? Vector3.right : Vector3.up, direction, out hitinfo, distance, layerMask, query);\n        }\n\n        public int CastAll(Vector3 direction, ICollection<RaycastHit> results, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            return CastAll((_axis == Vector3.up) ? Vector3.right : Vector3.up, direction, results, distance, layerMask, query);\n        }\n\n        #endregion\n\n\n\n        public IEnumerable<RaycastInfo> GetSegmentRays(Vector3 primeRadial)\n        {\n            if (Vector3.Dot(primeRadial, _axis) != 0)\n            {\n                primeRadial -= Vector3.Cross(_axis, Vector3.Cross(primeRadial, _axis));\n            }\n            primeRadial.Normalize();\n\n            var da = 360f / _detail;\n            Vector3 va;\n            Vector3 vb = _center + primeRadial * _radius;\n            for (int i = 1; i <= _detail; i++)\n            {\n                va = vb;\n                vb = _center + Quaternion.AngleAxis(da * i, _axis) * primeRadial * _radius;\n\n                var dir = vb - va;\n                var dis = dir.magnitude;\n                yield return new RaycastInfo(va, dir, dis);\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Geom/SightGeom.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy.Geom\n{\n    [System.Serializable]\n    public class SightGeom : IGeom, IPhysicsGeom\n    {\n\n        public enum SightType\n        {\n            Cone = 0,\n            Frustum = 1\n        }\n\n        #region Fields\n\n        private Transform _targ;\n        private IGeom _geom;\n\n        public SightType Type;\n        public Vector3 EyeOffset = Vector3.zero;\n        public float SeeDistance = 1.0f;\n        public float SeeFOV = 60.0f;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public SightGeom()\n        {\n        }\n\n        public SightGeom(Transform targ)\n        {\n            this.Init(targ);\n        }\n\n        public void Init(Transform targ)\n        {\n            _targ = targ;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public Transform Target { get { return _targ; } }\n\n        public Vector3 Origin\n        {\n            get\n            {\n                return _targ.position + (_targ.rotation * EyeOffset);\n            }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public void Invalidate()\n        {\n            _geom = null;\n        }\n\n        public void UpdateGeom()\n        {\n            switch (Type)\n            {\n                case SightType.Cone:\n                    _geom = new ViewCone(this.Origin, _targ.forward, SeeDistance, SeeFOV);\n                    break;\n                case SightType.Frustum:\n                    _geom = new Frustum(this.Origin, _targ.rotation, 0.0f, SeeDistance, SeeFOV, 1.0f);\n                    break;\n\n            }\n        }\n\n        #endregion\n\n        #region IGeom Interface\n\n        public void Move(Vector3 mv)\n        {\n            _geom.Move(mv);\n        }\n\n        public void RotateAroundPoint(Vector3 point, Quaternion rot)\n        {\n            _geom.RotateAroundPoint(point, rot);\n        }\n\n        public AxisInterval Project(Vector3 axis)\n        {\n            if (_geom == null)\n            {\n                this.UpdateGeom();\n                if (_geom == null) return AxisInterval.NoHit(axis);\n            }\n\n            return _geom.Project(axis);\n        }\n\n        public Bounds GetBounds()\n        {\n            if (_geom == null)\n            {\n                this.UpdateGeom();\n                if (_geom == null) return new Bounds();\n            }\n\n            return _geom.GetBounds();\n        }\n\n        public Sphere GetBoundingSphere()\n        {\n            if (_geom == null)\n            {\n                this.UpdateGeom();\n                if (_geom == null) return new Sphere();\n            }\n\n            return _geom.GetBoundingSphere();\n        }\n\n        public IEnumerable<Vector3> GetAxes()\n        {\n            if(_geom == null)\n            {\n                this.UpdateGeom();\n                if (_geom == null) return System.Linq.Enumerable.Empty<Vector3>();\n            }\n            return _geom.GetAxes();\n        }\n\n        public bool Contains(Vector3 pos)\n        {\n            if (_geom == null)\n            {\n                this.UpdateGeom();\n                if (_geom == null) return false;\n            }\n\n            return _geom.Contains(pos);\n        }\n\n        #endregion\n\n        #region IPhysicsGeom Interface\n\n        public bool TestOverlap(int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            if (_geom == null)\n            {\n                this.UpdateGeom();\n                if (_geom == null) return false;\n            }\n            if (!(_geom is IPhysicsGeom)) return false;\n\n            return (_geom as IPhysicsGeom).TestOverlap(layerMask, query);\n        }\n\n        public int Overlap(ICollection<Collider> results, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            if (_geom == null)\n            {\n                this.UpdateGeom();\n                if (_geom == null) return 0;\n            }\n            if (!(_geom is IPhysicsGeom)) return 0;\n            return (_geom as IPhysicsGeom).Overlap(results, layerMask, query);\n        }\n\n        public bool Cast(Vector3 direction, out RaycastHit hitinfo, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            if (_geom == null)\n            {\n                this.UpdateGeom();\n                if (_geom == null)\n                {\n                    hitinfo = new RaycastHit();\n                    return false;\n                }\n            }\n            if (!(_geom is IPhysicsGeom))\n            {\n                hitinfo = new RaycastHit();\n                return false;\n            }\n\n            return (_geom as IPhysicsGeom).Cast(direction, out hitinfo, distance, layerMask, query);\n        }\n\n        public int CastAll(Vector3 direction, ICollection<RaycastHit> results, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            if (_geom == null)\n            {\n                this.UpdateGeom();\n                if (_geom == null) return 0;\n            }\n            if (!(_geom is IPhysicsGeom)) return 0;\n\n            return (_geom as IPhysicsGeom).CastAll(direction, results, distance, layerMask, query);\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Geom/ViewCone.cs",
    "content": "using UnityEngine;\nusing System.Collections.Generic;\n\nusing MathUtil = com.spacepuppy.Utils.MathUtil;\n\nnamespace com.spacepuppy.Geom\n{\n    public class ViewCone : IGeom, IPhysicsGeom\n    {\n\n        #region Fields\n\n        private Vector3 _loc;\n        private Vector3 _dir;\n        private float _dist;\n        private float _fov;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public ViewCone(Vector3 loc, Vector3 dir, float dist, float fov)\n        {\n            _loc = loc;\n            _dir = dir.normalized;\n            _dist = dist;\n            _fov = fov;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public Vector3 Location\n        {\n            get { return _loc; }\n            set { _loc = value; }\n        }\n\n        public Vector3 Direction\n        {\n            get { return _dir; }\n            set { _dir = value.normalized; }\n        }\n\n        public float Distance\n        {\n            get { return _dist; }\n            set { _dist = value; }\n        }\n\n        public float FOV\n        {\n            get { return _fov; }\n            set { _fov = value; }\n        }\n\n        public float FarRadius\n        {\n            get { return Mathf.Tan(MathUtil.RAD_TO_DEG * _fov / 2.0f) * _dist; }\n        }\n\n        #endregion\n\n        #region IGeom Interface\n\n        public void Move(Vector3 mv)\n        {\n            _loc += mv;\n        }\n\n        public void RotateAroundPoint(Vector3 point, Quaternion rot)\n        {\n            _loc = point + rot * (_loc - point);\n            _dir = rot * _dir;\n        }\n\n        public AxisInterval Project(Vector3 axis)\n        {\n            //TODO\n            return new AxisInterval();\n        }\n\n        public Bounds GetBounds()\n        {\n            var x = Project(Vector3.right);\n            var y = Project(Vector3.up);\n            var z = Project(Vector3.forward);\n\n            var c = ((x.Axis * (x.Max + x.Min) / 2.0f) + (y.Axis * (y.Max + y.Min) / 2.0f) + (z.Axis * (z.Max + z.Min) / 2.0f)) / 3.0f;\n            var s = new Vector3(x.Length / 2.0f, y.Length / 2.0f, z.Length / 2.0f);\n\n            return new Bounds(c, s);\n        }\n\n        public Sphere GetBoundingSphere()\n        {\n\t\t\tVector3 up = (Mathf.Abs(Vector3.Dot(_dir, Vector3.right)) - 1.0f < GeomUtil.DOT_EPSILON) ? Vector3.up : Vector3.Cross(_dir, Vector3.right);\n\t\t\tVector3 floc = _loc + _dir * _dist;\n\t\t\t\n\t\t\tfloat theta = (_fov * Mathf.PI / 180.0f) / 2.0f;\n\t\t\tfloat h = _dist / Mathf.Cos(theta);\n\t\t\tfloat l = h * Mathf.Sin(theta);\n\t\t\t\n            Vector3 a = _loc;\n\t\t\tVector3 b = floc + up * l;\n\t\t\tVector3 c = floc - up * l;\n\t\t\t\n\t\t\tVector3 cent = GeomUtil.CircumCenter(a,b,c);\n\t\t\tfloat r = (a - cent).magnitude;\n\t\t\treturn new Sphere(cent, r);\n        }\n\n        public IEnumerable<Vector3> GetAxes()\n        {\n            //TODO\n            return System.Linq.Enumerable.Empty<Vector3>();\n        }\n\n        public bool Contains(Vector3 pos)\n        {\n            var dir = pos - _loc;\n            float dp = Vector3.Dot(Direction, dir);\n            return (dp <= _dist && Mathf.Acos(dp / dir.magnitude) * MathUtil.RAD_TO_DEG < FOV / 2.0f);\n        }\n\n        #endregion\n\n        #region IPhysicsGeom Interface\n\n        public bool TestOverlap(int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            throw new System.NotImplementedException();\n        }\n\n        public int Overlap(ICollection<Collider> results, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            throw new System.NotImplementedException();\n        }\n\n        public bool Cast(Vector3 direction, out RaycastHit hitinfo, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            throw new System.NotImplementedException();\n        }\n\n        public int CastAll(Vector3 direction, ICollection<RaycastHit> results, float distance, int layerMask, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            throw new System.NotImplementedException();\n        }\n\n        private IEnumerable<RaycastInfo> GetRays(float detail)\n        {\n            if (_dist == 0) yield break;\n\n            yield return new RaycastInfo(_loc, _dir, _dist);\n\n            float farRad = this.FarRadius;\n            Vector3 right = (_dir == Vector3.forward) ? Vector3.right : Vector3.Cross(_dir, Vector3.forward);\n\n            int rp = Mathf.CeilToInt(farRad / detail); //amount of radial moves\n            float rd = farRad / (float)rp; //adjusted detail for the radial move\n\n            for (int i = 1; i <= rp; i++)\n            {\n                float r = i * rd;//current shell radius\n                float c = Mathf.PI * 2.0f * r; //current shell circumference\n\n                int cp = Mathf.CeilToInt(c / detail); //amount of circular moves\n                float cd = c / (float)cp; //adjusted detail for the circular moves\n                float ad = 360.0f / (float)cd;\n\n                Vector3 v = (_dir * _dist) + (right * rd * i);\n                for (int j = 0; j < cp; j++)\n                {\n                    Vector3 ray = Quaternion.AngleAxis(j * ad, _dir) * v;\n                    yield return new RaycastInfo(_loc, ray.normalized, ray.magnitude);\n                }\n            }\n        }\n\n        #endregion\n\n    }\n\n}"
  },
  {
    "path": "SpacepuppyExtended/Hooks/CharacterControllerCollisionNotification.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy.Hooks\n{\n    public abstract class CharacterControllerCollisionNotification : Notification\n    {\n\n        private CharacterController _controller;\n        private Collider _collider;\n\n        public CharacterControllerCollisionNotification(CharacterController controller, Collider collider)\n        {\n            _controller = controller;\n            _collider = collider;\n        }\n\n        public CharacterController Controller { get { return _controller; } }\n        public Collider Collider { get { return _collider; } }\n\n    }\n\n    public class CharacterControllerCollisionEnterNotification : CharacterControllerCollisionNotification\n    {\n\n        public CharacterControllerCollisionEnterNotification(CharacterController controller, Collider collider)\n            : base(controller, collider)\n        {\n\n        }\n\n    }\n\n    public class CharacterControllerCollisionStayNotification : CharacterControllerCollisionNotification\n    {\n\n        public CharacterControllerCollisionStayNotification(CharacterController controller, Collider collider)\n            : base(controller, collider)\n        {\n\n        }\n\n    }\n\n    public class CharacterControllerCollisionExitNotification : CharacterControllerCollisionNotification\n    {\n\n        public CharacterControllerCollisionExitNotification(CharacterController controller, Collider collider)\n            : base(controller, collider)\n        {\n\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Hooks/CharacterControllerCollisionNotifier.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Hooks\n{\n\n    [AddComponentMenu(\"SpacePuppy/Hooks/CharacterController Collision Notifier\")]\n    public class CharacterControllerCollisionNotifier : SPNotifyingComponent\n    {\n\n        public bool ManuallySet = false;\n        public bool UseFixedUpdate = false;\n\n        public bool NotifyThisRoot = true;\n\n        public bool NotifyOther = false;\n        public bool NotifyOtherRoot = false;\n\n        private CharacterController _controller;\n        private HashSet<Collider> _stayedColliders = new HashSet<Collider>();\n        private HashSet<Collider> _enteredColliders = new HashSet<Collider>();\n\n        protected override void Awake()\n        {\n \t         base.Awake();\n\n            _controller = this.GetComponent<CharacterController>();\n        }\n\n        void Update()\n        {\n            if (ManuallySet || UseFixedUpdate) return;\n\n            this.Resolve();\n        }\n\n        void FixedUpdate()\n        {\n            if (ManuallySet || !UseFixedUpdate) return;\n\n            this.Resolve();\n        }\n\n        public void Resolve()\n        {\n            //TODO - reimplement this so that we have all the hit information\n            var entered = _enteredColliders.Except(_stayedColliders).ToArray();\n            var stayed = _stayedColliders.Intersect(_enteredColliders).ToArray();\n            var exited = _stayedColliders.Except(_enteredColliders).ToArray();\n\n            foreach (var c in entered)\n            {\n                _stayedColliders.Add(c);\n\n                var n = new CharacterControllerCollisionEnterNotification(_controller, c);\n                Notification.PostNotification<CharacterControllerCollisionEnterNotification>(this, n, this.NotifyThisRoot);\n                if (this.NotifyOther) Notification.PostNotification<CharacterControllerCollisionEnterNotification>(c.gameObject, n, this.NotifyOtherRoot);\n            }\n\n            foreach (var c in stayed)\n            {\n                var n = new CharacterControllerCollisionStayNotification(_controller, c);\n                Notification.PostNotification<CharacterControllerCollisionStayNotification>(this, n, this.NotifyThisRoot);\n                if (this.NotifyOther) Notification.PostNotification<CharacterControllerCollisionStayNotification>(c.gameObject, n, this.NotifyOtherRoot);\n            }\n\n            foreach (var c in exited)\n            {\n                _stayedColliders.Remove(c);\n\n                var n = new CharacterControllerCollisionExitNotification(_controller, c);\n                Notification.PostNotification<CharacterControllerCollisionExitNotification>(this, n, this.NotifyThisRoot);\n                if (this.NotifyOther) Notification.PostNotification<CharacterControllerCollisionExitNotification>(c.gameObject, n, this.NotifyOtherRoot);\n            }\n\n            _enteredColliders.Clear();\n        }\n\n        void OnControllerColliderHit(ControllerColliderHit hit)\n        {\n            _enteredColliders.Add(hit.collider);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Hooks/ControllerColliderHitNotification.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy.Hooks\n{\n    public class ControllerColliderHitNotification : Notification\n    {\n\n        private ControllerColliderHit _hit;\n\n        public ControllerColliderHitNotification(ControllerColliderHit hit)\n        {\n            _hit = hit;\n        }\n\n        public ControllerColliderHit Hit { get { return _hit; } }\n        public CharacterController Controller { get { return _hit.controller; } }\n        public Collider Collider { get { return _hit.collider; } }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Hooks/ControllerColliderHitNotifier.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Hooks\n{\n\n    [AddComponentMenu(\"SpacePuppy/Hooks/CharacterControllerHit Notifier\")]\n    public class ControllerColliderHitNotifier : SPNotifyingComponent\n    {\n\n        public bool NotifyThisRoot = true;\n\n        public bool NotifyOther = false;\n        public bool NotifyOtherRoot = false;\n\n        protected override void Awake()\n        {\n            base.Awake();\n        }\n\n        void OnControllerColliderHit(ControllerColliderHit hit)\n        {\n            if (!(this as Component).IsEnabled()) return;\n\n            var n = new ControllerColliderHitNotification(hit);\n            Notification.PostNotification<ControllerColliderHitNotification>(this, n, this.NotifyThisRoot);\n            if (this.NotifyOther)\n            {\n                Notification.PostNotification<ControllerColliderHitNotification>(hit.gameObject, n, this.NotifyOtherRoot);\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Hooks/TriggerNotification.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy.Hooks\n{\n    public abstract class TriggerNotification : Notification\n    {\n\n        private Collider _hitbox;\n        private Collider _other;\n\n        public TriggerNotification(Collider hitbox, Collider other)\n        {\n            _hitbox = hitbox;\n            _other = other;\n        }\n\n        public Collider HitBox { get { return _hitbox; } }\n        public Collider Other { get { return _other; } }\n\n    }\n\n    public class TriggerEnterNotification : TriggerNotification\n    {\n        public TriggerEnterNotification(Collider hitbox, Collider other)\n            : base(hitbox, other)\n        {\n\n        }\n    }\n\n    public class TriggerStayNotification : TriggerNotification\n    {\n        public TriggerStayNotification(Collider hitbox, Collider other)\n            : base(hitbox, other)\n        {\n\n        }\n    }\n\n    public class TriggerExitNotification : TriggerNotification\n    {\n        public TriggerExitNotification(Collider hitbox, Collider other)\n            : base(hitbox, other)\n        {\n\n        }\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Hooks/TriggerNotifier.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy.Hooks\n{\n\n    [AddComponentMenu(\"SpacePuppy/Hooks/Trigger Notifier\")]\n    public class TriggerNotifier : SPNotifyingComponent\n    {\n\n        public bool NotifyRoot = true;\n\n        void OnTriggerEnter(Collider c)\n        {\n            Notification.PostNotification<TriggerEnterNotification>(this, new TriggerEnterNotification(this.GetComponent<Collider>(), c), this.NotifyRoot);\n        }\n\n        void OnTriggerExit(Collider c)\n        {\n            Notification.PostNotification<TriggerExitNotification>(this, new TriggerExitNotification(this.GetComponent<Collider>(), c), this.NotifyRoot);\n        }\n\n    }\n\n    [AddComponentMenu(\"SpacePuppy/Hooks/Trigger Stay Notifier\")]\n    public class TriggerStayNotifier : TriggerNotifier\n    {\n\n        void OnTriggerStay(Collider c)\n        {\n            Notification.PostNotification<TriggerStayNotification>(this, new TriggerStayNotification(this.GetComponent<Collider>(), c), this.NotifyRoot);\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"SpacepuppyExtended\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"SpacepuppyExtended\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"27ef83e7-e6a8-4f71-8dc4-9d4f74d0e8e1\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "SpacepuppyExtended/SpacepuppyExtended.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{776AA1DA-15E2-4D90-97B5-330C6F1CB442}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>com.spacepuppy</RootNamespace>\n    <AssemblyName>SpacepuppyUnityFramework.Extended</AssemblyName>\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile>\n    </TargetFrameworkProfile>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n    <CodeAnalysisRuleSet />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n    <CodeAnalysisRuleSet />\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"UnityEngine, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <SpecificVersion>False</SpecificVersion>\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"ClassicTimers\\GameTimer.cs\" />\n    <Compile Include=\"ClassicTimers\\RandomSwitch.cs\" />\n    <Compile Include=\"ClassicTimers\\Timer.cs\" />\n    <Compile Include=\"ClassicTimers\\TimerSwitch.cs\" />\n    <Compile Include=\"Collections\\DuplicateKeyAddAction.cs\" />\n    <Compile Include=\"Collections\\KeyedCollection.cs\" />\n    <Compile Include=\"Collections\\LiveSPComponentCollection.cs\" />\n    <Compile Include=\"Collections\\SignalCollectionEventArgs.cs\" />\n    <Compile Include=\"Collections\\SignalingCollection.cs\" />\n    <Compile Include=\"Collections\\TaggedCollection.cs\" />\n    <Compile Include=\"Collections\\TaggedCollectionValidationException.cs\" />\n    <Compile Include=\"Geom\\ColliderOverlapResult.cs\" />\n    <Compile Include=\"Geom\\Frustum.cs\" />\n    <Compile Include=\"Geom\\LineSegment.cs\" />\n    <Compile Include=\"Geom\\ColliderOverlapResolver.cs\" />\n    <Compile Include=\"Geom\\RadialRing.cs\" />\n    <Compile Include=\"Geom\\SightGeom.cs\" />\n    <Compile Include=\"Geom\\ViewCone.cs\" />\n    <Compile Include=\"Hooks\\CharacterControllerCollisionNotification.cs\" />\n    <Compile Include=\"Hooks\\CharacterControllerCollisionNotifier.cs\" />\n    <Compile Include=\"Hooks\\ControllerColliderHitNotification.cs\" />\n    <Compile Include=\"Hooks\\ControllerColliderHitNotifier.cs\" />\n    <Compile Include=\"Hooks\\TriggerNotification.cs\" />\n    <Compile Include=\"Hooks\\TriggerNotifier.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"TandemCoroutine.cs\" />\n    <Compile Include=\"Utils\\DblMathUtil.cs\" />\n    <Compile Include=\"Utils\\DebugUtils\\InGameFlyCam.cs\" />\n    <Compile Include=\"Utils\\GizmosHelper.cs\" />\n    <Compile Include=\"Utils\\Json.cs\" />\n    <Compile Include=\"Utils\\PiWalker.cs\" />\n    <Compile Include=\"Widgets\\MirrorTransform.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\n      <Name>SpacepuppyBase</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <PropertyGroup>\n    <PostBuildEvent>\n    </PostBuildEvent>\n  </PropertyGroup>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "SpacepuppyExtended/TandemCoroutine.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections;\n\nusing com.spacepuppy.Dynamic;\n\nnamespace com.spacepuppy\n{\n    public class TandemCoroutine : RadicalYieldInstruction\n    {\n\n        #region Fields\n\n        private CancellableCoroutine _updateRoutine;\n        private CancellableCoroutine _fixedUpdateRoutine;\n\n        private FiberCollection _fibers = new FiberCollection();\n        private Fiber[] iteratorFibers = new Fiber[0];\n\n        private WaitForEndOfFrame _cachedWaitForEndOfFrame = new WaitForEndOfFrame();\n        private WaitForFixedUpdate _cachedWaitForFixedUpdate = new WaitForFixedUpdate();\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public TandemCoroutine()\n        {\n            \n        }\n\n        public TandemCoroutine(params IEnumerator[] routines)\n        {\n            foreach(var r in routines)\n            {\n                _fibers.Add(r);\n            }\n        }\n\n        #endregion\n\n        #region Properties\n\n        public FiberCollection Fibers { get { return _fibers; } }\n\n        #endregion\n\n        #region Methods\n\n        public void Start(MonoBehaviour behaviour)\n        {\n            if (_updateRoutine != null) throw new System.InvalidOperationException(\"Failed to start RadicalCoroutine. The Coroutine is already being processed.\");\n            if (behaviour == null) throw new System.ArgumentNullException(\"behaviour\");\n\n            _updateRoutine = new CancellableCoroutine(this.Update());\n            _fixedUpdateRoutine = new CancellableCoroutine(this.FixedUpdate().GetEnumerator());\n\n            iteratorFibers = new Fiber[_fibers.Count];\n\n            behaviour.StartCoroutine(_updateRoutine);\n            behaviour.StartCoroutine(_fixedUpdateRoutine);\n        }\n\n        public void Stop()\n        {\n            if(_updateRoutine != null)\n            {\n                _updateRoutine.Cancel();\n                _fixedUpdateRoutine.Cancel();\n            }\n\n            _updateRoutine = null;\n            _fixedUpdateRoutine = null;\n        }\n\n        #endregion\n\n        #region Update Methods\n\n        private IEnumerator Update()\n        {\n            int len;\n            while (true)\n            {\n                if (iteratorFibers.Length < _fibers.Count)\n                {\n                    System.Array.Resize(ref iteratorFibers, _fibers.Count);\n                }\n                _fibers.CopyTo(iteratorFibers, 0);\n                len = _fibers.Count;\n                for (int i = 0; i < len; i++)\n                {\n                    if (!iteratorFibers[i].Tick(UpdateState.Update)) _fibers.Remove(iteratorFibers[i]);\n                    iteratorFibers[i] = null;\n                }\n                if (iteratorFibers.Length < _fibers.Count)\n                {\n                    System.Array.Resize(ref iteratorFibers, _fibers.Count);\n                }\n\n                yield return _cachedWaitForEndOfFrame;\n\n                if (iteratorFibers.Length < _fibers.Count)\n                {\n                    System.Array.Resize(ref iteratorFibers, _fibers.Count);\n                }\n                _fibers.CopyTo(iteratorFibers, 0);\n                len = _fibers.Count;\n                for (int i = 0; i < len; i++)\n                {\n                    if (!iteratorFibers[i].Tick(UpdateState.EndOfFrame)) _fibers.Remove(iteratorFibers[i]);\n                    iteratorFibers[i] = null;\n                }\n                if (iteratorFibers.Length < _fibers.Count)\n                {\n                    System.Array.Resize(ref iteratorFibers, _fibers.Count);\n                }\n\n                if (_fibers.Count == 0) this.SetSignal();\n                yield return null;\n            }\n        }\n\n        private IEnumerable FixedUpdate()\n        {\n            int len;\n            while (true)\n            {\n                _fibers.CopyTo(iteratorFibers, 0);\n                len = _fibers.Count;\n                for (int i = 0; i < len; i++)\n                {\n                    if (!iteratorFibers[i].Tick(UpdateState.FixedUpdate)) _fibers.Remove(iteratorFibers[i]);\n                    iteratorFibers[i] = null;\n                }\n                if (iteratorFibers.Length < _fibers.Count)\n                {\n                    System.Array.Resize(ref iteratorFibers, _fibers.Count);\n                }\n\n                yield return _cachedWaitForFixedUpdate;\n            }\n        }\n\n        #endregion\n\n        #region Special Types\n\n        private class CancellableCoroutine : IEnumerator\n        {\n            private IEnumerator _enum;\n\n            public CancellableCoroutine(IEnumerator e)\n            {\n                _enum = e;\n            }\n\n            public void Cancel()\n            {\n                _enum = null;\n            }\n\n            object IEnumerator.Current\n            {\n                get { return _enum.Current; }\n            }\n\n            bool IEnumerator.MoveNext()\n            {\n                if (_enum == null) return false;\n                return _enum.MoveNext();\n            }\n\n            void IEnumerator.Reset()\n            {\n                throw new System.NotSupportedException();\n            }\n        }\n\n        internal enum UpdateState\n        {\n            Update = 0,\n            EndOfFrame = 1,\n            FixedUpdate = 2\n        }\n\n        public sealed class Fiber\n        {\n\n            private IEnumerator _routine;\n\n            private bool _waitForEndOfFrame;\n            private bool _waitForFixedUpdate;\n            private float _waitForSeconds;\n            private object _waitForObject;\n\n            internal Fiber(IEnumerator e)\n            {\n                _routine = new RadicalCoroutine(e);\n            }\n\n            internal bool Tick(UpdateState state)\n            {\n                //tick derivative first\n                if(_waitForObject != null)\n                {\n                    if (_waitForObject is AsyncOperation)\n                    {\n                        if ((_waitForObject as AsyncOperation).isDone)\n                        {\n                            _waitForObject = null;\n                        }\n                        else\n                        {\n                            return true;\n                        }\n                    }\n                    else if (_waitForObject is WWW)\n                    {\n                        if ((_waitForObject as WWW).isDone)\n                        {\n                            _waitForObject = null;\n                        }\n                        else\n                        {\n                            return true;\n                        }\n                    }\n                    else\n                    {\n                        _waitForObject = null;\n                    }\n                }\n\n                //check state\n                switch(state)\n                {\n                    case UpdateState.Update:\n                        if(_waitForSeconds > 0f)\n                        {\n                            _waitForSeconds -= Time.deltaTime;\n                            return true;\n                        }\n                        if (_waitForFixedUpdate) return true; //waiting for a fixedupdate, don't tick\n                        break;\n                    case UpdateState.EndOfFrame:\n                        if (!_waitForEndOfFrame) return true; //not waiting for end of frame\n                         _waitForEndOfFrame = false;\n                        break;\n                    case UpdateState.FixedUpdate:\n                        if (!_waitForFixedUpdate) return true; //not waiting for fixed update\n                        _waitForFixedUpdate = false;\n                        break;\n                }\n\n                //get current\n                object c;\n                if(_routine != null && _routine.MoveNext())\n                {\n                    c = _routine.Current;\n                }\n                else\n                {\n                    return false;\n                }\n\n                if (c == null)\n                {\n                    //do nothing, no need to test all others if null\n                }\n                else if (c is WaitForSeconds)\n                {\n                    _waitForSeconds = (float)DynamicUtil.GetValue(c, \"m_Seconds\");\n                }\n                else if (c is WaitForEndOfFrame)\n                {\n                    _waitForEndOfFrame = true;\n                }\n                else if (c is WaitForFixedUpdate)\n                {\n                    _waitForFixedUpdate = true;\n                }\n                else if (c is AsyncOperation)\n                {\n                    _waitForObject = c;\n                }\n                else if (c is Coroutine)\n                {\n                    throw new System.NotSupportedException(\"TandemCoroutine does not support its routines to yield a Coroutine. Try yielding a RadicalCoroutine instead.\");\n                }\n                else if (c is WWW)\n                {\n                    _waitForObject = c;\n                }\n\n                return true;\n            }\n\n        }\n\n        public sealed class FiberCollection : System.Collections.Generic.IList<Fiber>\n        {\n\n            private System.Collections.Generic.List<Fiber> _lst = new System.Collections.Generic.List<Fiber>();\n\n            #region Other Methods\n\n            public Fiber Add(IEnumerator routine)\n            {\n                var f = new Fiber(routine);\n                _lst.Add(f);\n                return f;\n            }\n\n            public Fiber Insert(int index, IEnumerator routine)\n            {\n                var f = new Fiber(routine);\n                _lst.Insert(index, f);\n                return f;\n            }\n\n            public void Swap(Fiber a, Fiber b)\n            {\n                var i = _lst.IndexOf(a);\n                var j = _lst.IndexOf(b);\n                if (i < 0 || j < 0) return;\n\n                _lst[j] = a;\n                _lst[i] = b;\n            }\n\n            public void SwapAt(int i, int j)\n            {\n                if (i == j) return;\n                if (i < 0 || j < 0 || i >= _lst.Count || j >= _lst.Count) return;\n\n                var t = _lst[j];\n                _lst[j] = _lst[i];\n                _lst[i] = t;\n            }\n\n            #endregion\n\n            #region IList Interface\n\n            public Fiber this[int index]\n            {\n                get\n                {\n                    return _lst[index];\n                }\n                set\n                {\n                    _lst[index] = value;\n                }\n            }\n\n            public int Count\n            {\n                get { return _lst.Count; }\n            }\n\n            bool System.Collections.Generic.ICollection<Fiber>.IsReadOnly\n            {\n                get { return false; }\n            }\n\n            void System.Collections.Generic.ICollection<Fiber>.Add(Fiber item)\n            {\n                _lst.Add(item);\n            }\n\n            public void Clear()\n            {\n                _lst.Clear();\n            }\n\n            public bool Contains(Fiber item)\n            {\n                return _lst.Contains(item);\n            }\n\n            public void CopyTo(Fiber[] array, int arrayIndex)\n            {\n                _lst.CopyTo(array, arrayIndex);\n            }\n\n            public int IndexOf(Fiber item)\n            {\n                return _lst.IndexOf(item);\n            }\n\n            void System.Collections.Generic.IList<Fiber>.Insert(int index, Fiber item)\n            {\n                _lst.Insert(index, item);\n            }\n\n            public void RemoveAt(int index)\n            {\n                _lst.RemoveAt(index);\n            }\n\n            public bool Remove(Fiber item)\n            {\n                return _lst.Remove(item);\n            }\n\n            public IEnumerator GetEnumerator()\n            {\n                return _lst.GetEnumerator();\n            }\n\n            System.Collections.Generic.IEnumerator<Fiber> System.Collections.Generic.IEnumerable<Fiber>.GetEnumerator()\n            {\n                return _lst.GetEnumerator();\n            }\n\n            #endregion\n\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Utils/DblMathUtil.cs",
    "content": "using System;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy.Utils\n{\n\t/// <summary>\n\t/// A port of the LoDMath static member class written in AS3 under the MIT license agreement.\n\t/// \n\t/// A collection of math functions that can be very useful for many things.\n\t/// \n\t/// \n\t/// As per the license agrrement of the lodGameBox license agreement\n\t/// \n\t/// Copyright (c) 2009 Dylan Engelman\n\t///\n\t///Permission is hereby granted, free of charge, to any person obtaining a copy\n\t///of this software and associated documentation files (the \"Software\"), to deal\n\t///in the Software without restriction, including without limitation the rights\n\t///to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\t///copies of the Software, and to permit persons to whom the Software is\n\t///furnished to do so, subject to the following conditions:\n\t///\n\t///The above copyright notice and this permission notice shall be included in\n\t///all copies or substantial portions of the Software.\n\t///\n\t///THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\t///IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\t///FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\t///AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\t///LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\t///OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\t///THE SOFTWARE.\n\t/// \n\t/// http://code.google.com/p/lodgamebox/source/browse/trunk/com/lordofduct/util/LoDMath.as\n\t/// </summary>\n\t/// <remarks>\n\t/// \n\t/// </remarks>\n\tpublic static class DblMathUtil\n    {\n\n        #region \"Public ReadOnly Properties\"\n        // Number pi\n        public const double PI = 3.14159265358979;\n        // PI / 2 OR 90 deg\n        public const double PI_2 = 1.5707963267949;\n        // PI / 4 OR 45 deg\n        public const double PI_4 = 0.785398163397448;\n        // PI / 8 OR 22.5 deg\n        public const double PI_8 = 0.392699081698724;\n        // PI / 16 OR 11.25 deg\n        public const double PI_16 = 0.196349540849362;\n        // 2 * PI OR 180 deg\n        public const double TWO_PI = 6.28318530717959;\n        // 3 * PI_2 OR 270 deg\n        public const double THREE_PI_2 = 4.71238898038469;\n        // Number e\n        public const double E = 2.71828182845905;\n        // ln(10)\n        public const double LN10 = 2.30258509299405;\n        // ln(2)\n        public const double LN2 = 0.693147180559945;\n        // logB10(e)\n        public const double LOG10E = 0.434294481903252;\n        // logB2(e)\n        public const double LOG2E = 1.44269504088896;\n        // sqrt( 1 / 2 )\n        public const double SQRT1_2 = 0.707106781186548;\n        // sqrt( 2 )\n        public const double SQRT2 = 1.4142135623731;\n        // PI / 180\n        public const double DEG_TO_RAD = 0.0174532925199433;\n        //  180.0 / PI\n        public const double RAD_TO_DEG = 57.2957795130823;\n\n        // 2^16\n        public const int B_16 = 65536;\n        // 2^31\n        public const long B_31 = 2147483648L;\n        // 2^32\n        public const long B_32 = 4294967296L;\n        // 2^48\n        public const long B_48 = 281474976710656L;\n        // 2^53 !!NOTE!! largest accurate double floating point whole value\n        public const long B_53 = 9007199254740992L;\n        // 2^63\n        public const ulong B_63 = 9223372036854775808;\n        //18446744073709551615 or 2^64 - 1 or ULong.MaxValue...\n        public const ulong B_64_m1 = ulong.MaxValue;\n\n        //  1.0/3.0\n        public const double ONE_THIRD = 0.333333333333333;\n        //  2.0/3.0\n        public const double TWO_THIRDS = 0.666666666666667;\n        //  1.0/6.0\n        public const double ONE_SIXTH = 0.166666666666667;\n\n        // COS( PI / 3 )\n        public const double COS_PI_3 = 0.866025403784439;\n        //  SIN( 2*PI/3 )\n        public const double SIN_2PI_3 = 0.03654595;\n\n        // 4*(Math.sqrt(2)-1)/3.0\n        public const double CIRCLE_ALPHA = 0.552284749830793;\n\n        public const bool ONN = true;\n\n        public const bool OFF = false;\n        // round integer epsilon\n        public const double SHORT_EPSILON = 0.1;\n        // percentage epsilon\n        public const double PERC_EPSILON = 0.001;\n        // single float average epsilon\n        public const double EPSILON = 0.0001;\n        // arbitrary 8 digit epsilon\n        public const double LONG_EPSILON = 1E-08;\n\n        public static readonly double MACHINE_EPSILON = DblMathUtil.ComputeMachineEpsilon();\n\n        public static double ComputeMachineEpsilon()\n        {\n            double fourThirds = 4.0 / 3.0;\n            double third = fourThirds - 1.0;\n            double one = third + third + third;\n            return Math.Abs(1.0 - one);\n        }\n        #endregion\n\n        #region \"Public Shared Methods\"\n\n        /// <summary>\n        /// Calculates the integral part of a float\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static double Truncate(double value)\n        {\n            return Math.Truncate(value);\n        }\n\n        /// <summary>\n        /// Shears off the fractional part of a float.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static double Shear(double value)\n        {\n            return value % 1;\n        }\n\n        /// <summary>\n        /// Returns if the value is in between or equal to max and min\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"max\"></param>\n        /// <param name=\"min\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static bool InRange(double value, double max, double min)\n        {\n            return (value >= min && value <= max);\n        }\n\n        public static bool InRange(double value, double max)\n        {\n            return InRange(value, max, 0);\n        }\n\n        #region \"series\"\n        /// <summary>\n        /// Sums a series of numeric values passed as a param array...\n        /// \n        /// MathUtil.Summation(1,2,3,4) == 10\n        /// </summary>\n        /// <param name=\"arr\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static double Summation(params double[] arr)\n        {\n            double result = 0;\n\n            foreach (double value in arr)\n            {\n                result += value;\n            }\n\n            return result;\n        }\n\n        public static double Summation(double[] arr, int startIndex, int endIndex)\n        {\n            double result = 0;\n\n            for (int i = startIndex; i <= Math.Min(endIndex, arr.Length - 1); i++)\n            {\n                result += arr[i];\n            }\n\n            return result;\n        }\n\n        public static double Summation(double[] arr, int startIndex)\n        {\n            return Summation(arr, startIndex, int.MaxValue);\n        }\n\n        /// <summary>\n        /// Multiplies a series of numeric values passed as a param array...\n        /// \n        /// MathUtil.ProductSeries(2,3,4) == 24\n        /// </summary>\n        /// <param name=\"arr\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static double ProductSeries(params double[] arr)\n        {\n            if (arr == null || arr.Length == 0)\n                return double.NaN;\n\n            double result = 1;\n\n            foreach (double value in arr)\n            {\n                result *= value;\n            }\n\n            return result;\n        }\n        #endregion\n\n        #region \"Value interpolating and warping\"\n        /// <summary>\n        /// The average of an array of values\n        /// </summary>\n        /// <param name=\"values\">An array of values</param>\n        /// <returns>the average</returns>\n        /// <remarks></remarks>\n        public static double Average(params double[] values)\n        {\n            double avg = 0;\n\n            foreach (double value in values)\n            {\n                avg += value;\n            }\n\n            return avg / values.Length;\n        }\n\n        /// <summary>\n        /// a one dimensional linear interpolation of a value.\n        /// </summary>\n        /// <param name=\"a\">from value</param>\n        /// <param name=\"b\">to value</param>\n        /// <param name=\"weight\">lerp value</param>\n        /// <returns>the value lerped from a to b</returns>\n        /// <remarks></remarks>\n        public static double Interpolate(double a, double b, double weight)\n        {\n            return (b - a) * weight + a;\n        }\n\n        /// <summary>\n        /// The percentage a value is from min to max\n        /// \n        /// eg:\n        /// 8 of 10 out of 0->10 would be 0.8f\n        /// \n        /// Good for calculating the lerp weight\n        /// </summary>\n        /// <param name=\"value\">The value to text</param>\n        /// <param name=\"max\">The max value</param>\n        /// <param name=\"min\">The min value</param>\n        /// <returns>The percentage value is from min</returns>\n        /// <remarks></remarks>\n        public static double PercentageMinMax(double value, double max, double min)\n        {\n            value -= min;\n            max -= min;\n\n            if (max == 0)\n            {\n                return 0;\n            }\n            else\n            {\n                return value / max;\n            }\n        }\n\t\tpublic static double PercentageMinMax(double value, double max)\n        {\n            return PercentageMinMax(value, max, 0);\n        }\n\n        /// <summary>\n        /// The percentage a value is from max to min\n        /// \n        /// eg:\n        /// 8 of 10 out of 0->10 would be 0.2f\n        /// \n        /// Good for calculating a discount\n        /// </summary>\n        /// <param name=\"value\">The value to text</param>\n        /// <param name=\"max\">The max value</param>\n        /// <param name=\"min\">The min value</param>\n        /// <returns>The percentage value is from max</returns>\n        /// <remarks></remarks>\n        public static double PercentageOffMinMax(double value, double max, double min)\n        {\n            value -= max;\n            min -= max;\n\n            if (min == 0)\n            {\n                return 0;\n            }\n            else\n            {\n                return value / min;\n            }\n        }\n\t\tpublic static double PercentageOffMinMax(double value, double max)\n        {\n            return PercentageOffMinMax(value, max);\n        }\n\n        /// <summary>\n        /// Return the minimum value of several values\n        /// </summary>\n        /// <param name=\"args\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static double Min(params double[] args)\n        {\n            if (args.Length == 0)\n                return double.NaN;\n            double value = args[0];\n\n            for (int i = 0; i <= args.Length - 1; i++)\n            {\n                if (args[i] < value)\n                    value = args[i];\n            }\n\n            return value;\n        }\n\n        /// <summary>\n        /// Return the maximum of several values\n        /// </summary>\n        /// <param name=\"args\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static double Max(params double[] args)\n        {\n            if (args.Length == 0)\n                return double.NaN;\n            double value = args[0];\n\n            for (int i = 1; i <= args.Length - 1; i++)\n            {\n                if (args[i] > value)\n                    value = args[i];\n            }\n\n            return value;\n        }\n\n        /// <summary>\n        /// Wraps a value around some significant range.\n        /// \n        /// Similar to modulo, but works in a unary direction over any range (including negative values).\n        /// \n        /// ex:\n        /// Wrap(8,6,2) == 4\n        /// Wrap(4,2,0) == 0\n        /// Wrap(4,2,-2) == -2\n        /// </summary>\n        /// <param name=\"value\">value to wrap</param>\n        /// <param name=\"max\">max in range</param>\n        /// <param name=\"min\">min in range</param>\n        /// <returns>A value wrapped around min to max</returns>\n        /// <remarks></remarks>\n        public static double Wrap(double value, double max, double min)\n        {\n            value -= min;\n            max -= min;\n            if (max == 0)\n                return min;\n\n            value = value % max;\n            value += min;\n            while (value < min)\n            {\n                value += max;\n            }\n\n            return value;\n\n        }\n\t\tpublic static double Wrap(double value, double max)\n        {\n            return Wrap(value, max, 0);\n        }\n\n        /// <summary>\n        /// Arithmetic version of Wrap... unsure of which is more efficient.\n        /// \n        /// Here for demo purposes\n        /// </summary>\n        /// <param name=\"value\">value to wrap</param>\n        /// <param name=\"max\">max in range</param>\n        /// <param name=\"min\">min in range</param>\n        /// <returns>A value wrapped around min to max</returns>\n        /// <remarks></remarks>\n        public static double ArithWrap(double value, double max, double min)\n        {\n            max -= min;\n            if (max == 0)\n                return min;\n\n            return value - max * Math.Floor((value - min) / max);\n        }\n\t\tpublic static double ArithWrap(double value, double max)\n        {\n            return ArithWrap(value, max, 0);\n        }\n\n        /// <summary>\n        /// Clamp a value into a range.\n        /// \n        /// If input is LT min, min returned\n        /// If input is GT max, max returned\n        /// else input returned\n        /// </summary>\n        /// <param name=\"input\">value to clamp</param>\n        /// <param name=\"max\">max in range</param>\n        /// <param name=\"min\">min in range</param>\n        /// <returns>calmped value</returns>\n        /// <remarks></remarks>\n        public static double Clamp(double input, double max, double min)\n        {\n            return Math.Max(min, Math.Min(max, input));\n        }\n\t\t\n\t\tpublic static double Clamp(double input, double max)\n        {\n            return Math.Max(0, Math.Min(max, input));\n        }\n\n        /// <summary>\n        /// Ensures a value is within some range. If it doesn't fall in that range than some default value is returned.\n        /// </summary>\n        /// <param name=\"input\">value to clamp</param>\n        /// <param name=\"max\">max in range</param>\n        /// <param name=\"min\">min in range</param>\n        /// <param name=\"defaultValue\">default value if not in range</param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static double ClampOrDefault(double input, double max, double min, double defaultValue)\n        {\n            return input < min || input > max ? defaultValue : input;\n        }\n\n        /// <summary>\n        /// roundTo some place comparative to a 'base', default is 10 for decimal place\n        /// \n        /// 'place' is represented by the power applied to 'base' to get that place\n        /// </summary>\n        /// <param name=\"value\">the value to round</param>\n        /// <param name=\"place\">the place to round to</param>\n        /// <param name=\"base\">the base to round in... default is 10 for decimal</param>\n        /// <returns>The value rounded</returns>\n        /// <remarks>e.g.\n        /// \n        /// 2000/7 ~= 285.714285714285714285714 ~= (bin)100011101.1011011011011011\n        /// \n        /// roundTo(2000/7,-3) == 0\n        /// roundTo(2000/7,-2) == 300\n        /// roundTo(2000/7,-1) == 290\n        /// roundTo(2000/7,0) == 286\n        /// roundTo(2000/7,1) == 285.7\n        /// roundTo(2000/7,2) == 285.71\n        /// roundTo(2000/7,3) == 285.714\n        /// roundTo(2000/7,4) == 285.7143\n        /// roundTo(2000/7,5) == 285.71429\n        /// \n        /// roundTo(2000/7,-3,2)  == 288       -- 100100000\n        /// roundTo(2000/7,-2,2)  == 284       -- 100011100\n        /// roundTo(2000/7,-1,2)  == 286       -- 100011110\n        /// roundTo(2000/7,0,2)  == 286       -- 100011110\n        /// roundTo(2000/7,1,2) == 285.5     -- 100011101.1\n        /// roundTo(2000/7,2,2) == 285.75    -- 100011101.11\n        /// roundTo(2000/7,3,2) == 285.75    -- 100011101.11\n        /// roundTo(2000/7,4,2) == 285.6875  -- 100011101.1011\n        /// roundTo(2000/7,5,2) == 285.71875 -- 100011101.10111\n        /// \n        /// note what occurs when we round to the 3rd space (8ths place), 100100000, this is to be assumed \n        /// because we are rounding 100011.1011011011011011 which rounds up.</remarks>\n        public static double RoundTo(double value, int place, uint @base)\n        {\n            if (place == 0)\n            {\n                //'if zero no reason going through the math hoops\n                return Math.Round(value);\n            }\n            else if (@base == 10 && place > 0 && place <= 15)\n            {\n                //'Math.Round has a rounding to decimal spaces that is very efficient\n                //'only useful for base 10 if places are from 1 to 15\n                return Math.Round(value, place);\n            }\n            else\n            {\n                double p = Math.Pow(@base, place);\n                return Math.Round(value * p) / p;\n            }\n        }\n\n        public static double RoundTo(double value, int place)\n        {\n            return RoundTo(value, place, 10);\n        }\n\n        public static double RoundTo(double value)\n        {\n            return RoundTo(value, 0, 10);\n        }\n\n        /// <summary>\n        /// FloorTo some place comparative to a 'base', default is 10 for decimal place\n        /// \n        /// 'place' is represented by the power applied to 'base' to get that place\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"place\"></param>\n        /// <param name=\"base\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static double FloorTo(double value, int place, uint @base)\n        {\n            if (place == 0)\n            {\n                //'if zero no reason going through the math hoops\n                return Math.Floor(value);\n            }\n            else\n            {\n                double p = Math.Pow(@base, place);\n                return Math.Floor(value * p) / p;\n            }\n        }\n\n        public static double FloorTo(double value, int place)\n        {\n            return FloorTo(value, place, 10);\n        }\n\n        public static double FloorTo(double value)\n        {\n            return FloorTo(value, 0, 10);\n        }\n\n        /// <summary>\n        /// CeilTo some place comparative to a 'base', default is 10 for decimal place\n        /// \n        /// 'place' is represented by the power applied to 'base' to get that place\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"place\"></param>\n        /// <param name=\"base\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static double CeilTo(double value, int place, uint @base)\n        {\n            if (place == 0)\n            {\n                //'if zero no reason going through the math hoops\n                return Math.Ceiling(value);\n            }\n            else\n            {\n                double p = Math.Pow(@base, place);\n                return Math.Ceiling(value * p) / p;\n            }\n        }\n\n        public static double CeilTo(double value, int place)\n        {\n            return CeilTo(value, place, 10);\n        }\n\n        public static double CeilTo(double value)\n        {\n            return CeilTo(value, 0, 10);\n        }\n        #endregion\n\n        #region \"Simple fuzzy arithmetic\"\n\n        /// <summary>\n        /// Test if Double is kind of equal to some other value by some epsilon.\n        /// \n        /// Due to float error, two values may be considered similar... but the computer considers them different. \n        /// By using some epsilon (degree of error) once can test if the two values are similar.\n        /// </summary>\n        /// <param name=\"a\"></param>\n        /// <param name=\"b\"></param>\n        /// <param name=\"epsilon\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static bool FuzzyEqual(double a, double b, double epsilon)\n        {\n            return Math.Abs(a - b) < epsilon;\n        }\n\n        public static bool FuzzyEqual(double a, double b)\n        {\n            return FuzzyEqual(a, b, EPSILON);\n        }\n\n        /// <summary>\n        /// Test if Double is greater than some other value by some degree of error in epsilon.\n        /// \n        /// Due to float error, two values may be considered similar... but the computer considers them different. \n        /// By using some epsilon (degree of error) once can test if the two values are similar.\n        /// </summary>\n        /// <param name=\"a\"></param>\n        /// <param name=\"b\"></param>\n        /// <param name=\"epsilon\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static bool FuzzyLessThan(double a, double b, double epsilon)\n        {\n            return a < b + epsilon;\n        }\n\n        public static bool FuzzyLessThan(double a, double b)\n        {\n            return FuzzyLessThan(a, b, EPSILON);\n        }\n\n        /// <summary>\n        /// Test if Double is less than some other value by some degree of error in epsilon.\n        /// \n        /// Due to float error, two values may be considered similar... but the computer considers them different. \n        /// By using some epsilon (degree of error) once can test if the two values are similar.\n        /// </summary>\n        /// <param name=\"a\"></param>\n        /// <param name=\"b\"></param>\n        /// <param name=\"epsilon\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static bool FuzzyGreaterThan(double a, double b, double epsilon)\n        {\n            return a > b - epsilon;\n        }\n\n        public static bool FuzzyGreaterThan(double a, double b)\n        {\n            return FuzzyGreaterThan(a, b, EPSILON);\n        }\n\n        /// <summary>\n        /// Test if a value is near some target value, if with in some range of 'epsilon', the target is returned.\n        /// \n        /// eg:\n        /// Slam(1.52,2,0.1) == 1.52\n        /// Slam(1.62,2,0.1) == 1.62\n        /// Slam(1.72,2,0.1) == 1.72\n        /// Slam(1.82,2,0.1) == 1.82\n        /// Slam(1.92,2,0.1) == 2\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"target\"></param>\n        /// <param name=\"epsilon\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static double Slam(double value, double target, double epsilon)\n        {\n            if (Math.Abs(value - target) < epsilon)\n            {\n                return target;\n            }\n            else\n            {\n                return value;\n            }\n        }\n\n        public static double Slam(double value, double target)\n        {\n            return Slam(value, target, EPSILON);\n        }\n        #endregion\n\n        #region \"Angular Math\"\n        /// <summary>\n        /// convert radians to degrees\n        /// </summary>\n        /// <param name=\"angle\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static double RadiansToDegrees(double angle)\n        {\n            return angle * RAD_TO_DEG;\n        }\n\n        /// <summary>\n        /// convert degrees to radians\n        /// </summary>\n        /// <param name=\"angle\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static double DegreesToRadians(double angle)\n        {\n            return angle * DEG_TO_RAD;\n        }\n\n        /// <summary>\n        /// Find the angle of a segment from (x1, y1) -> (x2, y2 )\n        /// </summary>\n        /// <param name=\"x1\"></param>\n        /// <param name=\"y1\"></param>\n        /// <param name=\"x2\"></param>\n        /// <param name=\"y2\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static double AngleBetween(double x1, double y1, double x2, double y2)\n        {\n            return Math.Atan2(y2 - y1, x2 - x1);\n        }\n\n        /// <summary>\n        /// set an angle with in the bounds of -PI to PI\n        /// </summary>\n        /// <param name=\"angle\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static double NormalizeAngle(double angle, bool useRadians)\n        {\n            double rd = (useRadians ? PI : 180);\n            return Wrap(angle, rd, -rd);\n        }\n\n        public static double NormalizeAngle(double angle)\n        {\n            return NormalizeAngle(angle, true);\n        }\n\n        /// <summary>\n        /// closest angle between two angles from a1 to a2\n        /// absolute value the return for exact angle\n        /// </summary>\n        /// <param name=\"a1\"></param>\n        /// <param name=\"a2\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static double NearestAngleBetween(double a1, double a2, bool useRadians)\n        {\n            double rd_2 = (useRadians ? PI_2 : 90);\n            double two_rd = (useRadians ? TWO_PI : 360);\n\n            a1 = NormalizeAngle(a1);\n            a2 = NormalizeAngle(a2);\n\n            if (a1 < -rd_2 & a2 > rd_2)\n                a1 += two_rd;\n            if (a2 < -rd_2 & a1 > rd_2)\n                a2 += two_rd;\n\n            return a2 - a1;\n        }\n\n        public static double NearestAngleBetween(double a1, double a2)\n        {\n            return NearestAngleBetween(a1, a2, true);\n        }\n\n        /// <summary>\n        /// Returns a value for dependant that is a value that is the shortest angle between dep and ind from ind.\n        /// \n        /// \n        /// for instance if dep=-170 degrees and ind=170 degrees then 190 degrees will be returned as an alternative to -170 degrees\n        /// note: angle is passed in radians, this written example is in degrees for ease of reading\n        /// </summary>\n        /// <param name=\"dep\"></param>\n        /// <param name=\"ind\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static double ShortenAngleToAnother(double dep, double ind, bool useRadians)\n        {\n            return ind + NearestAngleBetween(ind, dep, useRadians);\n        }\n\n        public static double ShortenAngleToAnother(double dep, double ind)\n        {\n            return ShortenAngleToAnother(dep, ind, true);\n        }\n\n        /// <summary>\n        /// Returns a value for dependant that is the shortest angle counter-clockwise from ind.\n        /// \n        /// for instance if dep=-170 degrees, and ind=10 degrees, then 200 degrees will be returned as an alternative to -160. The shortest \n        /// path from 10 to -160 moving counter-clockwise is 190 degrees away.\n        /// </summary>\n        /// <param name=\"dep\"></param>\n        /// <param name=\"ind\"></param>\n        /// <param name=\"useRadians\"></param>\n        /// <returns></returns>\n        public static double NormalizeAngleToAnother(double dep, double ind, bool useRadians)\n        {\n            if (useRadians)\n            {\n                if (dep < ind)\n                {\n                    while (dep < ind) dep += DblMathUtil.TWO_PI;\n                }\n                else if (dep - ind > DblMathUtil.TWO_PI)\n                {\n                    while (dep - ind > DblMathUtil.TWO_PI) dep -= DblMathUtil.TWO_PI;\n                }\n            }\n            else\n            {\n                if (dep < ind)\n                {\n                    while (dep < ind) dep += 360d;\n                }\n                else if (dep - ind > 360d)\n                {\n                    while (dep - ind > MathUtil.TWO_PI) dep -= 360d;\n                }\n            }\n            return dep;\n        }\n\n        /// <summary>\n        /// interpolate across the shortest arc between two angles\n        /// </summary>\n        /// <param name=\"a1\"></param>\n        /// <param name=\"a2\"></param>\n        /// <param name=\"weight\"></param>\n        /// <returns></returns>\n        /// <remarks></remarks>\n        public static double InterpolateAngle(double a1, double a2, double weight, bool useRadians)\n        {\n            a1 = NormalizeAngle(a1, useRadians);\n            a2 = ShortenAngleToAnother(a2, a1, useRadians);\n\n            return Interpolate(a1, a2, weight);\n        }\n\n        public static double InterpolateAngle(double a1, double a2, double weight)\n        {\n            return InterpolateAngle(a1, a2, weight, true);\n        }\n        #endregion\n\n        #region \"Advanced Math\"\n        /// <summary>\n        /// Compute the logarithm of any value of any base\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"base\"></param>\n        /// <returns></returns>\n        /// <remarks>\n        /// a logarithm is the exponent that some constant (base) would have to be raised to \n        /// to be equal to value.\n        /// \n        /// i.e.\n        /// 4 ^ x = 16\n        /// can be rewritten as to solve for x\n        /// logB4(16) = x\n        /// which with this function would be \n        /// LoDMath.logBaseOf(16,4)\n        /// \n        /// which would return 2, because 4^2 = 16\n        /// </remarks>\n        public static double LogBaseOf(double value, double @base)\n        {\n            return Math.Log(value) / Math.Log(@base);\n        }\n        #endregion\n\n\n\n        #region Geometric Calculations\n\n        public static double ApproxCircumOfEllipse(double a, double b)\n        {\n            return PI * Math.Sqrt((a * a + b * b) / 2);\n        }\n\n        #endregion\n\n        #endregion\n    }\n}\n\n"
  },
  {
    "path": "SpacepuppyExtended/Utils/DebugUtils/InGameFlyCam.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Utils.DebugUtils\n{\n    public class InGameFlyCam : SPComponent\n    {\n\n        public Transform Camera;\n\n        public float CameraSensitivity = 5.0f;\n        public float StartSpeed = 5.0f;\n        public float TopSpeed = 25.0f;\n        public float AccelerationRate = 1.0f;\n\n        private Vector3 _lastMousePos;\n        private bool _activelyMoving;\n        private float _activelyMovingStartTime;\n\n        protected override void Awake()\n        {\n            base.Awake();\n\n            if (Camera == null) this.Camera = this.transform;\n        }\n\n        protected override void Start()\n        {\n            base.Start();\n\n            _lastMousePos = Input.mousePosition;\n        }\n\n        void Update()\n        {\n            if (this.Camera != null)\n            {\n                //rotate\n                if (Input.GetMouseButton(1))\n                {\n                    var dp = Input.mousePosition - _lastMousePos;\n                    var e = new Vector3(-dp.y, dp.x, 0f);\n                    //this.Camera.transform.rotation *= Quaternion.Euler(e * 3.0f * Speed * Time.deltaTime);\n\n                    this.Camera.eulerAngles += e * this.CameraSensitivity * Time.deltaTime;\n                }\n\n                //move\n                var mv = Vector3.zero;\n                if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))\n                    mv += Vector3.forward;\n\n                if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))\n                    mv += Vector3.back;\n\n                if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))\n                    mv += Vector3.right;\n\n                if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))\n                    mv += Vector3.left;\n\n                if (Input.GetKey(KeyCode.E))\n                    mv += Vector3.up;\n\n                if (Input.GetKey(KeyCode.Q))\n                    mv += Vector3.down;\n\n                if (mv != Vector3.zero)\n                {\n                    if (!_activelyMoving)\n                    {\n                        _activelyMoving = true;\n                        _activelyMovingStartTime = Time.unscaledTime;\n                    }\n\n                    var spd = this.StartSpeed;\n                    spd += Mathf.Pow(Time.unscaledTime - _activelyMovingStartTime, 2.0f) * this.AccelerationRate;\n                    spd = Mathf.Min(spd, this.TopSpeed);\n                    this.Camera.position += this.Camera.rotation * mv * spd * Time.deltaTime;\n                }\n                else\n                {\n                    _activelyMoving = false;\n                }\n            }\n\n\n            _lastMousePos = Input.mousePosition;\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Utils/GizmosHelper.cs",
    "content": "﻿#pragma warning disable 0618 // ignore obsolete material\nusing UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.Utils\n{\n    public static class GizmosHelper\n    {\n\n        #region Internal\n\n        private static Material _gizmoWireMaterial;\n        internal static Material gizmoWireMaterial\n        {\n            get\n            {\n                if (_gizmoWireMaterial == null)\n                {\n                    _gizmoWireMaterial = new Material(\"Shader \\\"SPEditor/DefaultShader\\\"{   SubShader   {      Pass      {         BindChannels { Bind \\\"Color\\\", color }         Blend SrcAlpha OneMinusSrcAlpha         ZWrite Off Cull Off Fog { Mode Off }         Color(1, 1, 1, 1)      }   }}\");\n                    _gizmoWireMaterial.hideFlags = HideFlags.HideAndDontSave;\n                    _gizmoWireMaterial.shader.hideFlags = HideFlags.HideAndDontSave;\n                }\n                return _gizmoWireMaterial;\n            }\n        }\n\n        internal static void SetDiscSectionPoints(Vector3[] dest, int count, Vector3 center, Vector3 normal, Vector3 from, float angle, float radius)\n        {\n            from.Normalize();\n            Quaternion quaternion = Quaternion.AngleAxis(angle / (float)(count - 1), normal);\n            Vector3 vector3 = from * radius;\n            for (int index = 0; index < count; ++index)\n            {\n                dest[index] = center + vector3;\n                vector3 = quaternion * vector3;\n            }\n        }\n\n        #endregion\n\n\n\n\n        public static void DrawArrow(Vector3 start, Vector3 end, float headSize, int detail = 4)\n        {\n            Gizmos.DrawLine(start, end);\n\n            var n = Vector3.Normalize(start - end) * headSize;\n            var da = 360f / (float)detail;\n            for (int i = 0; i < detail; i++)\n            {\n                var v = (VectorUtil.NearSameAxis(n, Vector3.up)) ? Vector3.Cross(n, Vector3.up) : Vector3.Cross(n, Vector3.right);\n\n                var q = Quaternion.AngleAxis(da * i, n) * Quaternion.FromToRotation(n, n + v * 0.25f);\n                Gizmos.DrawLine(end, end + q * n);\n            }\n        }\n\n        public static void DrawSolidArc(Vector3 center, Vector3 normal, Vector3 from, float angle, float radius)\n        {\n            if (Event.current.type != EventType.Repaint) return;\n\n            Vector3[] dest = new Vector3[60];\n            GizmosHelper.SetDiscSectionPoints(dest, 60, center, normal, from, angle, radius);\n            //Shader.SetGlobalColor(\"_HandleColor\", Gizmos.color * new Color(1f, 1f, 1f, 0.5f));\n            //Shader.SetGlobalFloat(\"_HandleSize\", 1f);\n            GizmosHelper.gizmoWireMaterial.SetPass(0);\n            GL.PushMatrix();\n            GL.MultMatrix(Gizmos.matrix);\n            GL.Begin(4);\n            for (int index = 1; index < dest.Length; ++index)\n            {\n                GL.Color(Gizmos.color);\n                GL.Vertex(center);\n                GL.Vertex(dest[index - 1]);\n                GL.Vertex(dest[index]);\n                GL.Vertex(center);\n                GL.Vertex(dest[index]);\n                GL.Vertex(dest[index - 1]);\n            }\n            GL.End();\n            GL.PopMatrix();\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Utils/Json.cs",
    "content": "﻿/*\n * Copyright (c) 2012 Calvin Rien\n *\n * Based on the JSON parser by Patrick van Bergen\n * http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html\n *\n * Simplified it so that it doesn't throw exceptions\n * and can be used in Unity iPhone with maximum code stripping.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Text;\n\nnamespace com.spacepuppy.Utils\n{\n    // Example usage:\n    //\n    //  using UnityEngine;\n    //  using System.Collections;\n    //  using System.Collections.Generic;\n    //  using MiniJSON;\n    //\n    //  public class MiniJSONTest : MonoBehaviour {\n    //      void Start () {\n    //          var jsonString = \"{ \\\"array\\\": [1.44,2,3], \" +\n    //                          \"\\\"object\\\": {\\\"key1\\\":\\\"value1\\\", \\\"key2\\\":256}, \" +\n    //                          \"\\\"string\\\": \\\"The quick brown fox \\\\\\\"jumps\\\\\\\" over the lazy dog \\\", \" +\n    //                          \"\\\"unicode\\\": \\\"\\\\u3041 Men\\u00fa sesi\\u00f3n\\\", \" +\n    //                          \"\\\"int\\\": 65536, \" +\n    //                          \"\\\"float\\\": 3.1415926, \" +\n    //                          \"\\\"bool\\\": true, \" +\n    //                          \"\\\"null\\\": null }\";\n    //\n    //          var dict = Json.Deserialize(jsonString) as Dictionary<string,object>;\n    //\n    //          Debug.Log(\"deserialized: \" + dict.GetType());\n    //          Debug.Log(\"dict['array'][0]: \" + ((List<object>) dict[\"array\"])[0]);\n    //          Debug.Log(\"dict['string']: \" + (string) dict[\"string\"]);\n    //          Debug.Log(\"dict['float']: \" + (double) dict[\"float\"]); // floats come out as doubles\n    //          Debug.Log(\"dict['int']: \" + (long) dict[\"int\"]); // ints come out as longs\n    //          Debug.Log(\"dict['unicode']: \" + (string) dict[\"unicode\"]);\n    //\n    //          var str = Json.Serialize(dict);\n    //\n    //          Debug.Log(\"serialized: \" + str);\n    //      }\n    //  }\n\n    /// <summary>\n    /// This class encodes and decodes JSON strings.\n    /// Spec. details, see http://www.json.org/\n    ///\n    /// JSON uses Arrays and Objects. These correspond here to the datatypes IList and IDictionary.\n    /// All numbers are parsed to doubles.\n    /// </summary>\n    public static class Json\n    {\n        /// <summary>\n        /// Parses the string json into a value\n        /// </summary>\n        /// <param name=\"json\">A JSON string.</param>\n        /// <returns>An List&lt;object&gt;, a Dictionary&lt;string, object&gt;, a double, an integer,a string, null, true, or false</returns>\n        public static object Deserialize(string json)\n        {\n            // save the string for debug information\n            if (json == null)\n            {\n                return null;\n            }\n\n            return Parser.Parse(json);\n        }\n\n        sealed class Parser : IDisposable\n        {\n            const string WHITE_SPACE = \" \\t\\n\\r\";\n            const string WORD_BREAK = \" \\t\\n\\r{}[],:\\\"\";\n\n            enum TOKEN\n            {\n                NONE,\n                CURLY_OPEN,\n                CURLY_CLOSE,\n                SQUARED_OPEN,\n                SQUARED_CLOSE,\n                COLON,\n                COMMA,\n                STRING,\n                NUMBER,\n                TRUE,\n                FALSE,\n                NULL\n            };\n\n            StringReader json;\n\n            Parser(string jsonString)\n            {\n                json = new StringReader(jsonString);\n            }\n\n            public static object Parse(string jsonString)\n            {\n                using (var instance = new Parser(jsonString))\n                {\n                    return instance.ParseValue();\n                }\n            }\n\n            public void Dispose()\n            {\n                json.Dispose();\n                json = null;\n            }\n\n            Dictionary<string, object> ParseObject()\n            {\n                Dictionary<string, object> table = new Dictionary<string, object>();\n\n                // ditch opening brace\n                json.Read();\n\n                // {\n                while (true)\n                {\n                    switch (NextToken)\n                    {\n                        case TOKEN.NONE:\n                            return null;\n                        case TOKEN.COMMA:\n                            continue;\n                        case TOKEN.CURLY_CLOSE:\n                            return table;\n                        default:\n                            // name\n                            string name = ParseString();\n                            if (name == null)\n                            {\n                                return null;\n                            }\n\n                            // :\n                            if (NextToken != TOKEN.COLON)\n                            {\n                                return null;\n                            }\n                            // ditch the colon\n                            json.Read();\n\n                            // value\n                            table[name] = ParseValue();\n                            break;\n                    }\n                }\n            }\n\n            List<object> ParseArray()\n            {\n                List<object> array = new List<object>();\n\n                // ditch opening bracket\n                json.Read();\n\n                // [\n                var parsing = true;\n                while (parsing)\n                {\n                    TOKEN nextToken = NextToken;\n\n                    switch (nextToken)\n                    {\n                        case TOKEN.NONE:\n                            return null;\n                        case TOKEN.COMMA:\n                            continue;\n                        case TOKEN.SQUARED_CLOSE:\n                            parsing = false;\n                            break;\n                        default:\n                            object value = ParseByToken(nextToken);\n\n                            array.Add(value);\n                            break;\n                    }\n                }\n\n                return array;\n            }\n\n            object ParseValue()\n            {\n                TOKEN nextToken = NextToken;\n                return ParseByToken(nextToken);\n            }\n\n            object ParseByToken(TOKEN token)\n            {\n                switch (token)\n                {\n                    case TOKEN.STRING:\n                        return ParseString();\n                    case TOKEN.NUMBER:\n                        return ParseNumber();\n                    case TOKEN.CURLY_OPEN:\n                        return ParseObject();\n                    case TOKEN.SQUARED_OPEN:\n                        return ParseArray();\n                    case TOKEN.TRUE:\n                        return true;\n                    case TOKEN.FALSE:\n                        return false;\n                    case TOKEN.NULL:\n                        return null;\n                    default:\n                        return null;\n                }\n            }\n\n            string ParseString()\n            {\n                StringBuilder s = new StringBuilder();\n                char c;\n\n                // ditch opening quote\n                json.Read();\n\n                bool parsing = true;\n                while (parsing)\n                {\n\n                    if (json.Peek() == -1)\n                    {\n                        parsing = false;\n                        break;\n                    }\n\n                    c = NextChar;\n                    switch (c)\n                    {\n                        case '\"':\n                            parsing = false;\n                            break;\n                        case '\\\\':\n                            if (json.Peek() == -1)\n                            {\n                                parsing = false;\n                                break;\n                            }\n\n                            c = NextChar;\n                            switch (c)\n                            {\n                                case '\"':\n                                case '\\\\':\n                                case '/':\n                                    s.Append(c);\n                                    break;\n                                case 'b':\n                                    s.Append('\\b');\n                                    break;\n                                case 'f':\n                                    s.Append('\\f');\n                                    break;\n                                case 'n':\n                                    s.Append('\\n');\n                                    break;\n                                case 'r':\n                                    s.Append('\\r');\n                                    break;\n                                case 't':\n                                    s.Append('\\t');\n                                    break;\n                                case 'u':\n                                    var hex = new StringBuilder();\n\n                                    for (int i = 0; i < 4; i++)\n                                    {\n                                        hex.Append(NextChar);\n                                    }\n\n                                    s.Append((char)Convert.ToInt32(hex.ToString(), 16));\n                                    break;\n                            }\n                            break;\n                        default:\n                            s.Append(c);\n                            break;\n                    }\n                }\n\n                return s.ToString();\n            }\n\n            object ParseNumber()\n            {\n                string number = NextWord;\n\n                if (number.IndexOf('.') == -1)\n                {\n                    long parsedInt;\n                    Int64.TryParse(number, out parsedInt);\n                    return parsedInt;\n                }\n\n                double parsedDouble;\n                Double.TryParse(number, out parsedDouble);\n                return parsedDouble;\n            }\n\n            void EatWhitespace()\n            {\n                while (WHITE_SPACE.IndexOf(PeekChar) != -1)\n                {\n                    json.Read();\n\n                    if (json.Peek() == -1)\n                    {\n                        break;\n                    }\n                }\n            }\n\n            char PeekChar\n            {\n                get\n                {\n                    return Convert.ToChar(json.Peek());\n                }\n            }\n\n            char NextChar\n            {\n                get\n                {\n                    return Convert.ToChar(json.Read());\n                }\n            }\n\n            string NextWord\n            {\n                get\n                {\n                    StringBuilder word = new StringBuilder();\n\n                    while (WORD_BREAK.IndexOf(PeekChar) == -1)\n                    {\n                        word.Append(NextChar);\n\n                        if (json.Peek() == -1)\n                        {\n                            break;\n                        }\n                    }\n\n                    return word.ToString();\n                }\n            }\n\n            TOKEN NextToken\n            {\n                get\n                {\n                    EatWhitespace();\n\n                    if (json.Peek() == -1)\n                    {\n                        return TOKEN.NONE;\n                    }\n\n                    char c = PeekChar;\n                    switch (c)\n                    {\n                        case '{':\n                            return TOKEN.CURLY_OPEN;\n                        case '}':\n                            json.Read();\n                            return TOKEN.CURLY_CLOSE;\n                        case '[':\n                            return TOKEN.SQUARED_OPEN;\n                        case ']':\n                            json.Read();\n                            return TOKEN.SQUARED_CLOSE;\n                        case ',':\n                            json.Read();\n                            return TOKEN.COMMA;\n                        case '\"':\n                            return TOKEN.STRING;\n                        case ':':\n                            return TOKEN.COLON;\n                        case '0':\n                        case '1':\n                        case '2':\n                        case '3':\n                        case '4':\n                        case '5':\n                        case '6':\n                        case '7':\n                        case '8':\n                        case '9':\n                        case '-':\n                            return TOKEN.NUMBER;\n                    }\n\n                    string word = NextWord;\n\n                    switch (word)\n                    {\n                        case \"false\":\n                            return TOKEN.FALSE;\n                        case \"true\":\n                            return TOKEN.TRUE;\n                        case \"null\":\n                            return TOKEN.NULL;\n                    }\n\n                    return TOKEN.NONE;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Converts a IDictionary / IList object or a simple type (string, int, etc.) into a JSON string\n        /// </summary>\n        /// <param name=\"json\">A Dictionary&lt;string, object&gt; / List&lt;object&gt;</param>\n        /// <returns>A JSON encoded string, or null if object 'json' is not serializable</returns>\n        public static string Serialize(object obj)\n        {\n            return Serializer.Serialize(obj);\n        }\n\n        sealed class Serializer\n        {\n            StringBuilder builder;\n\n            Serializer()\n            {\n                builder = new StringBuilder();\n            }\n\n            public static string Serialize(object obj)\n            {\n                var instance = new Serializer();\n\n                instance.SerializeValue(obj);\n\n                return instance.builder.ToString();\n            }\n\n            void SerializeValue(object value)\n            {\n                IList asList;\n                IDictionary asDict;\n                string asStr;\n\n                if (value == null)\n                {\n                    builder.Append(\"null\");\n                }\n                else if ((asStr = value as string) != null)\n                {\n                    SerializeString(asStr);\n                }\n                else if (value is bool)\n                {\n                    builder.Append(value.ToString().ToLower());\n                }\n                else if ((asList = value as IList) != null)\n                {\n                    SerializeArray(asList);\n                }\n                else if ((asDict = value as IDictionary) != null)\n                {\n                    SerializeObject(asDict);\n                }\n                else if (value is char)\n                {\n                    SerializeString(value.ToString());\n                }\n                else\n                {\n                    SerializeOther(value);\n                }\n            }\n\n            void SerializeObject(IDictionary obj)\n            {\n                bool first = true;\n\n                builder.Append('{');\n\n                foreach (object e in obj.Keys)\n                {\n                    if (!first)\n                    {\n                        builder.Append(',');\n                    }\n\n                    SerializeString(e.ToString());\n                    builder.Append(':');\n\n                    SerializeValue(obj[e]);\n\n                    first = false;\n                }\n\n                builder.Append('}');\n            }\n\n            void SerializeArray(IList anArray)\n            {\n                builder.Append('[');\n\n                bool first = true;\n\n                foreach (object obj in anArray)\n                {\n                    if (!first)\n                    {\n                        builder.Append(',');\n                    }\n\n                    SerializeValue(obj);\n\n                    first = false;\n                }\n\n                builder.Append(']');\n            }\n\n            void SerializeString(string str)\n            {\n                builder.Append('\\\"');\n\n                char[] charArray = str.ToCharArray();\n                foreach (var c in charArray)\n                {\n                    switch (c)\n                    {\n                        case '\"':\n                            builder.Append(\"\\\\\\\"\");\n                            break;\n                        case '\\\\':\n                            builder.Append(\"\\\\\\\\\");\n                            break;\n                        case '\\b':\n                            builder.Append(\"\\\\b\");\n                            break;\n                        case '\\f':\n                            builder.Append(\"\\\\f\");\n                            break;\n                        case '\\n':\n                            builder.Append(\"\\\\n\");\n                            break;\n                        case '\\r':\n                            builder.Append(\"\\\\r\");\n                            break;\n                        case '\\t':\n                            builder.Append(\"\\\\t\");\n                            break;\n                        default:\n                            int codepoint = Convert.ToInt32(c);\n                            if ((codepoint >= 32) && (codepoint <= 126))\n                            {\n                                builder.Append(c);\n                            }\n                            else\n                            {\n                                builder.Append(\"\\\\u\" + Convert.ToString(codepoint, 16).PadLeft(4, '0'));\n                            }\n                            break;\n                    }\n                }\n\n                builder.Append('\\\"');\n            }\n\n            void SerializeOther(object value)\n            {\n                if (value is float\n                    || value is int\n                    || value is uint\n                    || value is long\n                    || value is double\n                    || value is sbyte\n                    || value is byte\n                    || value is short\n                    || value is ushort\n                    || value is ulong\n                    || value is decimal)\n                {\n                    builder.Append(value.ToString());\n                }\n                else\n                {\n                    SerializeString(value.ToString());\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "SpacepuppyExtended/Utils/PiWalker.cs",
    "content": "﻿using System;\nusing System.Text;\n\nnamespace com.spacepuppy.Utils\n{\n    public class PiWalker\n    {\n\n        #region static fields\n\n        // 10,008 digits of pi\n        const string piString = \"3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420198938095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590099465764078951269468398352595709825822620522489407726719478268482601476990902640136394437455305068203496252451749399651431429809190659250937221696461515709858387410597885959772975498930161753928468138268683868942774155991855925245953959431049972524680845987273644695848653836736222626099124608051243884390451244136549762780797715691435997700129616089441694868555848406353422072225828488648158456028506016842739452267467678895252138522549954666727823986456596116354886230577456498035593634568174324112515076069479451096596094025228879710893145669136867228748940560101503308617928680920874760917824938589009714909675985261365549781893129784821682998948722658804857564014270477555132379641451523746234364542858444795265867821051141354735739523113427166102135969536231442952484937187110145765403590279934403742007310578539062198387447808478489683321445713868751943506430218453191048481005370614680674919278191197939952061419663428754440643745123718192179998391015919561814675142691239748940907186494231961567945208095146550225231603881930142093762137855956638937787083039069792077346722182562599661501421503068038447734549202605414665925201497442850732518666002132434088190710486331734649651453905796268561005508106658796998163574736384052571459102897064140110971206280439039759515677157700420337869936007230558763176359421873125147120532928191826186125867321579198414848829164470609575270695722091756711672291098169091528017350671274858322287183520935396572512108357915136988209144421006751033467110314126711136990865851639831501970165151168517143765761835155650884909989859982387345528331635507647918535893226185489632132933089857064204675259070915481416549859461637180270981994309924488957571282890592323326097299712084433573265489382391193259746366730583604142813883032038249037589852437441702913276561809377344403070746921120191302033038019762110110044929321516084244485963766983895228684783123552658213144957685726243344189303968642624341077322697802807318915441101044682325271620105265227211166039666557309254711055785376346682065310989652691862056476931257058635662018558100729360659876486117910453348850346113657686753249441668039626579787718556084552965412665408530614344431858676975145661406800700237877659134401712749470420562230538994561314071127000407854733269939081454664645880797270826683063432858785698305235808933065757406795457163775254202114955761581400250126228594130216471550979259230990796547376125517656751357517829666454779174501129961489030463994713296210734043751895735961458901938971311179042978285647503203198691514028708085990480109412147221317947647772622414254854540332157185306142288137585043063321751829798662237172159160771669254748738986654949450114654062843366393790039769265672146385306736096571209180763832716641627488880078692560290228472104031721186082041900042296617119637792133757511495950156604963186294726547364252308177036751590673502350728354056704038674351362222477158915049530984448933309634087807693259939780541934144737744184263129860809988868741326047215695162396586457302163159819319516735381297416772947867242292465436680098067692823828068996400482435403701416314965897940924323789690706977942236250822168895738379862300159377647165122893578601588161755782973523344604281512627203734314653197777416031990665541876397929334419521541341899485444734567383162499341913181480927777103863877343177207545654532207770921201905166096280490926360197598828161332316663652861932668633606273567630354477628035045077723554710585954870279081435624014517180624643626794561275318134078330336254232783944975382437205835311477119926063813346776879695970309833913077109870408591337464144282277263465947047458784778720192771528073176790770715721344473060570073349243693113835049316312840425121925651798069411352801314701304781643788518529092854520116583934196562134914341595625865865570552690496520985803385072242648293972858478316305777756068887644624824685792603953527734803048029005876075825104747091643961362676044925627420420832085661190625454337213153595845068772460290161876679524061634252257719542916299193064553779914037340432875262888963995879475729174642635745525407909145135711136941091193932519107602082520261879853188770584297259167781314969900901921169717372784768472686084900337702424291651300500516832336435038951702989392233451722013812806965011784408745196012122859937162313017114448464090389064495444006198690754851602632750529834918740786680881833851022833450850486082503930213321971551843063545500766828294930413776552793975175461395398468339363830474611996653858153842056853386218672523340283087112328278921250771262946322956398989893582116745627010218356462201349671518819097303811980049734072396103685406643193950979019069963955245300545058068550195673022921913933918568034490398205955100226353536192041994745538593810234395544959778377902374216172711172364343543947822181852862408514006660443325888569867054315470696574745855033232334210730154594051655379068662733379958511562578432298827372319898757141595781119635833005940873068121602876496286744604774649159950549737425626901049037781986835938146574126804925648798556145372347867330390468838343634655379498641927056387293174872332083760112302991136793862708943879936201629515413371424892830722012690147546684765357616477379467520049075715552781965362132392640616013635815590742202020318727760527721900556148425551879253034351398442532234157623361064250639049750086562710953591946589751413103482276930624743536325691607815478181152843667957061108615331504452127473924544945423682886061340841486377670096120715124914043027253860764823634143346235189757664521641376796903149501910857598442391986291642193994907236234646844117394032659184044378051333894525742399508296591228508555821572503107125701266830240292952522011872676756220415420516184163484756516999811614101002996078386909291603028840026910414079288621507842451670908700069928212066041837180653556725253256753286129104248776182582976515795984703562226293486003415872298053498965022629174878820273420922224533985626476691490556284250391275771028402799806636582548892648802545661017296702664076559042909945681506526530537182941270336931378517860904070866711496558343434769338578171138645587367812301458768712660348913909562009939361031029161615288138437909904231747336394804575931493140529763475748119356709110137751721008031559024853090669203767192203322909433467685142214477379393751703443661991040337511173547191855046449026365512816228824462575916333039107225383742182140883508657391771509682887478265699599574490661758344137522397096834080053559849175417381883999446974867626551658276584835884531427756879002909517028352971634456212964043523117600665101241200659755851276178583829204197484423608007193045761893234922927965019875187212726750798125547095890455635792122103334669749923563025494780249011419521238281530911407907386025152274299581807247162591668545133312394804947079119153267343028244186041426363954800044800267049624820179289647669758318327131425170296923488962766844032326092752496035799646925650493681836090032380929345958897069536534940603402166544375589004563288225054525564056448246515187547119621844396582533754388569094113031509526179378002974120766514793942590298969594699556576121865619673378623625612521632086286922210327488921865436480229678070576561514463204692790682120738837781423356282360896320806822246801224826117718589638140918390367367222088832151375560037279839400415297002878307667094447456013455641725437090697939612257142989467154357846878861444581231459357198492252847160504922124247014121478057345510500801908699603302763478708108175450119307141223390866393833952942578690507643100638351983438934159613185434754649556978103829309716465143840700707360411237359984345225161050702705623526601276484830840761183013052793205427462865403603674532865105706587488225698157936789766974220575059683440869735020141020672358502007245225632651341055924019027421624843914035998953539459094407046912091409387001264560016237428802109276457931065792295524988727584610126483699989225695968815920560010165525637567856672279661988578279\";\n        static byte[] byteSequence = Encoding.ASCII.GetBytes(piString);\n\n        private static PiWalker _global;\n        public static PiWalker Global\n        {\n            get\n            {\n                if (_global == null) _global = new PiWalker();\n                return _global;\n            }\n        }\n\n        #endregion\n\n        #region Fields\n\n        private int _seed;\n        private int _precision;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public PiWalker()\n        {\n            _seed = 0;\n            _precision = 9;\n        }\n\n        public PiWalker(uint seed)\n        {\n            _precision = 9;\n            this.Seed = seed;\n        }\n\n        public PiWalker(uint seed, int precision)\n        {\n            this.Precision = precision;\n            this.Seed = seed;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public uint Seed\n        {\n            get { return (uint)_seed; }\n            set\n            {\n                _seed = (int)value % (byteSequence.Length - _precision);\n            }\n        }\n\n        public int Precision\n        {\n            get { return _precision; }\n            set\n            {\n                _precision = UnityEngine.Mathf.Clamp(value, 1, 9);\n                _seed = _seed % (byteSequence.Length - _precision);\n            }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public int Next()\n        {\n            int randomInt = 0;\n\n            for (int i = 0; i < _precision; i++)\n            {\n                randomInt += (int)(byteSequence[i + _seed] - 48) * (int)Math.Pow(10, _precision - i - 1);\n            }\n\n            _seed = randomInt % (byteSequence.Length - _precision); //set seed to next value so next value is a new value\n            return _seed;\n        }\n\n        public double NextDouble()\n        {\n            return (double)this.Next() / Math.Pow(10, _precision);\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtended/Widgets/MirrorTransform.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nusing com.spacepuppy.Geom;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Widgets\n{\n    public class MirrorTransform : SPComponent\n    {\n\n        #region Fields\n\n        [Tooltip(\"GameObject we should mirror.\")]\n        public Transform TargetTransform;\n\n        public bool MirrorPosition = true;\n        public bool MirrorRotation = true;\n        public bool MirrorScale = false;\n\n        #endregion\n\n        #region Game Messages\n\n        void LateUpdate()\n        {\n            if (TargetTransform == null) return;\n\n            var t = Trans.GetGlobal(this.TargetTransform);\n            if (!MirrorPosition) t.Position = this.transform.position;\n            if (!MirrorRotation) t.Rotation = this.transform.rotation;\n            t.SetToGlobal(this.transform, MirrorScale);\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtendedEditor/Base/Commands/CollisionParser.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Base\n{\n\n    public class CollisionParser : SPEditor\n    {\n\n        public const string MENU_NAME = SPMenu.MENU_NAME_ROOT + \"/Parse Collision\";\n        public const int MENU_PRIORITY = SPMenu.MENU_PRIORITY_GROUP2;\n\n        [MenuItem(MENU_NAME, priority = MENU_PRIORITY)]\n        private static void DoParseCollision()\n        {\n            if (Selection.activeGameObject == null) return;\n\n            //get known layers\n            string[] layers = new string[32];\n            for (int i = 0; i < 32; i++)\n            {\n                layers[i] = LayerMask.LayerToName(i);\n            }\n\n            //do work\n            var go = Selection.activeGameObject;\n            foreach (var child in go.GetAllChildrenAndSelf())\n            {\n                var arr = StringUtil.SplitFixedLength(child.name, \".\", 3);\n                if (string.Equals(arr[0], \"collision\", System.StringComparison.OrdinalIgnoreCase) ||\n                    string.Equals(arr[0], \"trigger\", System.StringComparison.OrdinalIgnoreCase))\n                {\n                    var bTrigger = string.Equals(arr[0], \"trigger\", System.StringComparison.OrdinalIgnoreCase);\n                    //remove old collider\n                    if (child.HasComponent<Collider>()) child.RemoveComponents<Collider>();\n\n                    //set collider\n                    if (string.IsNullOrEmpty(arr[1])) arr[1] = \"box\"; //default to box\n                    else arr[1] = arr[1].ToLower();\n\n                    MeshFilter filter = child.GetComponent<MeshFilter>();\n                    switch (arr[1])\n                    {\n                        case \"mesh\":\n                            var meshCollider = child.AddComponent<MeshCollider>();\n                            meshCollider.isTrigger = bTrigger;\n                            if (filter != null)\n                            {\n                                meshCollider.sharedMesh = child.GetComponent<MeshFilter>().sharedMesh;\n                            }\n                            break;\n                        case \"box\":\n                            var boxCollider = child.AddComponent<BoxCollider>();\n                            boxCollider.isTrigger = bTrigger;\n                            if (filter != null && filter.sharedMesh != null)\n                            {\n                                var bounds = filter.sharedMesh.bounds;\n                                boxCollider.center = bounds.center;\n                                boxCollider.size = bounds.size;\n                            }\n\n                            break;\n                        case \"sphere\":\n                            var sphereCollider = child.AddComponent<SphereCollider>();\n                            sphereCollider.isTrigger = bTrigger;\n                            if (filter != null && filter.sharedMesh != null)\n                            {\n                                var bounds = com.spacepuppy.Geom.Sphere.FromMesh(filter.sharedMesh, spacepuppy.Geom.BoundingSphereAlgorithm.FromBounds);\n                                sphereCollider.center = bounds.Center;\n                                sphereCollider.radius = bounds.Radius;\n                            }\n                            break;\n                        case \"capsule\":\n                            var capCollider = child.AddComponent<CapsuleCollider>();\n                            capCollider.isTrigger = bTrigger;\n                            if (filter != null && filter.sharedMesh != null)\n                            {\n                                var bounds = filter.sharedMesh.bounds;\n                                capCollider.center = bounds.center;\n                                capCollider.height = bounds.size.y;\n                                capCollider.radius = Mathf.Max(bounds.extents.x, bounds.extents.z);\n                            }\n                            break;\n                    }\n\n                    //set layer\n                    if (!string.IsNullOrEmpty(arr[2]))\n                    {\n                        for (int i = 0; i < layers.Length; i++)\n                        {\n                            if (string.Equals(arr[2], layers[i], System.StringComparison.OrdinalIgnoreCase))\n                            {\n                                child.gameObject.layer = i;\n                                break;\n                            }\n                        }\n                    }\n\n                    if (child.HasComponent<Renderer>()) child.GetComponent<Renderer>().enabled = false;\n                }\n            }\n        }\n\n\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyExtendedEditor/Base/Commands/CreateGameObjectIn.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Base\n{\n\n    public static class CreateGameObjectIn\n    {\n\n        #region Create Empty Child\n\n        /*\n        [MenuItem(\"GameObject/Create Empty Child\", priority = 0)]\n        static void CreateGameObjectAsChild()\n        {\n            var go = new GameObject(\"GameObject\");\n            go.transform.parent = Selection.activeTransform;\n            go.transform.ZeroOut(false);\n        }\n\n        [MenuItem(\"GameObject/Create Empty Child\", true)]\n        static bool ValidateCreateGameObjectAsChild()\n        {\n            return Selection.activeTransform != null;\n        }\n         */\n\n        [MenuItem(\"CONTEXT/Transform/Create Empty Child\")]\n        static void CreateGameObjectAsChild_Transform(MenuCommand cmnd)\n        {\n            var tr = cmnd.context as Transform;\n            var go = new GameObject(\"GameObject\");\n            go.transform.parent = tr;\n            go.transform.ZeroOut(false);\n        }\n\n\n\n        [MenuItem(\"GameObject/Create Other Child/Cube\", priority = 0)]\n        static void CreateCubeAsChild()\n        {\n            var go = PrimitiveUtil.CreatePrimitive(PrimitiveType.Cube);\n            go.transform.parent = Selection.activeTransform;\n            go.transform.ZeroOut(false);\n        }\n\n        [MenuItem(\"GameObject/Create Other Child/Sphere\", priority = 0)]\n        static void CreateSphereAsChild()\n        {\n            var go = PrimitiveUtil.CreatePrimitive(PrimitiveType.Sphere);\n            go.transform.parent = Selection.activeTransform;\n            go.transform.ZeroOut(false);\n        }\n\n        [MenuItem(\"GameObject/Create Other Child/Capsule\", priority = 0)]\n        static void CreateCapsuleAsChild()\n        {\n            var go = PrimitiveUtil.CreatePrimitive(PrimitiveType.Capsule);\n            go.transform.parent = Selection.activeTransform;\n            go.transform.ZeroOut(false);\n        }\n\n        [MenuItem(\"GameObject/Create Other Child/Cylinder\", priority = 0)]\n        static void CreateCylinderAsChild()\n        {\n            var go = PrimitiveUtil.CreatePrimitive(PrimitiveType.Cylinder);\n            go.transform.parent = Selection.activeTransform;\n            go.transform.ZeroOut(false);\n        }\n\n        [MenuItem(\"GameObject/Create Other Child/Plane\", priority = 0)]\n        static void CreatePlaneAsChild()\n        {\n            var go = PrimitiveUtil.CreatePrimitive(PrimitiveType.Plane);\n            go.transform.parent = Selection.activeTransform;\n            go.transform.ZeroOut(false);\n        }\n\n        [MenuItem(\"GameObject/Create Other Child/Quad\", priority = 0)]\n        static void CreateQuadAsChild()\n        {\n            var go = PrimitiveUtil.CreatePrimitive(PrimitiveType.Quad);\n            go.transform.parent = Selection.activeTransform;\n            go.transform.ZeroOut(false);\n        }\n\n\n\n\n\n        [MenuItem(\"GameObject/Create Other Child/Cube Trigger\", priority = 20)]\n        static void CreateCubeTriggerAsChild()\n        {\n            var go = PrimitiveUtil.CreatePrimitive(PrimitiveType.Cube, true, true);\n            go.GetComponent<Collider>().isTrigger = true;\n            go.transform.parent = Selection.activeTransform;\n            go.transform.ZeroOut(false);\n        }\n\n        [MenuItem(\"GameObject/Create Other Child/Sphere Trigger\", priority = 20)]\n        static void CreateSphereTriggerAsChild()\n        {\n            var go = PrimitiveUtil.CreatePrimitive(PrimitiveType.Sphere, true, true);\n            go.transform.parent = Selection.activeTransform;\n            go.transform.ZeroOut(false);\n        }\n\n        [MenuItem(\"GameObject/Create Other Child/Capsule Trigger\", priority = 20)]\n        static void CreateCapsuleTriggerAsChild()\n        {\n            var go = PrimitiveUtil.CreatePrimitive(PrimitiveType.Capsule, true, true);\n            go.transform.parent = Selection.activeTransform;\n            go.transform.ZeroOut(false);\n        }\n\n        [MenuItem(\"GameObject/Create Other Child/Cylinder Trigger\", priority = 20)]\n        static void CreateCylinderTriggerAsChild()\n        {\n            var go = PrimitiveUtil.CreatePrimitive(PrimitiveType.Cylinder, true, true);\n            go.transform.parent = Selection.activeTransform;\n            go.transform.ZeroOut(false);\n        }\n\n        [MenuItem(\"GameObject/Create Other Child/Plane Trigger\", priority = 20)]\n        static void CreatePlaneTriggerAsChild()\n        {\n            var go = PrimitiveUtil.CreatePrimitive(PrimitiveType.Plane, true, true);\n            go.transform.parent = Selection.activeTransform;\n            go.transform.ZeroOut(false);\n        }\n\n        [MenuItem(\"GameObject/Create Other Child/Quad Trigger\", priority = 20)]\n        static void CreateQuadTriggerAsChild()\n        {\n            var go = PrimitiveUtil.CreatePrimitive(PrimitiveType.Quad, true, true);\n            go.transform.parent = Selection.activeTransform;\n            go.transform.ZeroOut(false);\n        }\n\n        #endregion\n\n        #region Create Empty As Parent\n\n        [MenuItem(\"GameObject/Create Empty As Parent\", priority = 0)]\n        static void CreateGameObjectAsParent()\n        {\n            var go = new GameObject(\"GameObject\");\n            go.transform.parent = Selection.activeTransform.parent;\n            go.transform.ZeroOut(false);\n\n            go.transform.position = Selection.activeTransform.position;\n            Selection.activeTransform.parent = go.transform;\n            //Selection.activeTransform.ZeroOut(false);\n        }\n\n        [MenuItem(\"GameObject/Create Empty As Parent\", true)]\n        static bool ValidateCreateGameObjectAsParent()\n        {\n            return Selection.activeTransform != null;\n        }\n\n        [MenuItem(\"CONTEXT/Transform/Create GameObject As Parent\")]\n        static void CreateGameObjectAsParent_Transform(MenuCommand cmnd)\n        {\n            var tr = cmnd.context as Transform;\n\n            var go = new GameObject(\"GameObject\");\n\n            go.transform.position = tr.position;\n            go.transform.parent = Selection.activeTransform.parent;\n            go.transform.ZeroOut(false);\n\n            go.transform.position = tr.position;\n            tr.parent = go.transform;\n            //tr.ZeroOut(false);\n        }\n\n        #endregion\n\n        #region Create Empty At\n\n        [MenuItem(\"GameObject/Create Empty At\", priority = 0)]\n        static void CreateGameObjectAt()\n        {\n            var go = new GameObject(\"GameObject\");\n            go.transform.parent = Selection.activeTransform.parent;\n            go.transform.ZeroOut(false);\n            go.transform.position = Selection.activeTransform.position;\n        }\n\n        [MenuItem(\"GameObject/Create Empty At\", true)]\n        static bool ValidateCreateGameObjectAt()\n        {\n            return Selection.activeTransform != null;\n        }\n\n        [MenuItem(\"CONTEXT/Transform/Create GameObject At\")]\n        static void CreateGameObjectAt_Transform(MenuCommand cmnd)\n        {\n            var tr = cmnd.context as Transform;\n            var go = new GameObject(\"GameObject\");\n            go.transform.parent = tr.parent;\n            go.transform.ZeroOut(false);\n            go.transform.position = tr.position;\n        }\n\n        #endregion\n\n    }\n\n}"
  },
  {
    "path": "SpacepuppyExtendedEditor/Base/Commands/EditorObjExporter.cs",
    "content": "/*\nBased on ObjExporter.cs, this \"wrapper\" lets you export to .OBJ directly from the editor menu.\n \nThis should be put in your \"Editor\"-folder. Use by selecting the objects you want to export, and select\nthe appropriate menu item from \"Custom->Export\". Exported models are put in a folder called\n\"ExportedObj\" in the root of your Unity-project. Textures should also be copied and placed in the\nsame folder.\nN.B. there may be a bug so if the custom option doesn't come up refer to this thread http://answers.unity3d.com/questions/317951/how-to-use-editorobjexporter-obj-saving-script-fro.html */\n \nusing UnityEngine;\nusing UnityEditor;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Text;\nusing System;\n\nusing com.spacepuppy;\n\nnamespace com.spacepuppyeditor.Base\n{\n\n    struct ObjMaterial\n    {\n        public string name;\n        public string textureName;\n    }\n\n    public class EditorObjExporter : ScriptableObject\n    {\n\n        public const string MENU_NAME_MODELS_EXPORT = SPMenu.MENU_NAME_MODELS + \"/Export\";\n        public const int MENU_PRIORITY_MODELS_EXPORT = SPMenu.MENU_PRIORITY_MODELS;\n\n        #region Menu Entries\n\n        [MenuItem(MENU_NAME_MODELS_EXPORT + \"/Export all MeshFilters in selection to separate OBJs\", priority = MENU_PRIORITY_MODELS_EXPORT)]\n        static void ExportSelectionToSeparate()\n        {\n            if (!CreateTargetFolder())\n                return;\n\n            Transform[] selection = Selection.GetTransforms(SelectionMode.Editable | SelectionMode.ExcludePrefab);\n\n            if (selection.Length == 0)\n            {\n                EditorUtility.DisplayDialog(\"No source object selected!\", \"Please select one or more target objects\", \"\");\n                return;\n            }\n\n            int exportedObjects = 0;\n\n            for (int i = 0; i < selection.Length; i++)\n            {\n                Component[] meshfilter = selection[i].GetComponentsInChildren(typeof(MeshFilter));\n\n                for (int m = 0; m < meshfilter.Length; m++)\n                {\n                    exportedObjects++;\n                    MeshToFile((MeshFilter)meshfilter[m], targetFolder, selection[i].name + \"_\" + i + \"_\" + m);\n                }\n            }\n\n            if (exportedObjects > 0)\n                EditorUtility.DisplayDialog(\"Objects exported\", \"Exported \" + exportedObjects + \" objects\", \"\");\n            else\n                EditorUtility.DisplayDialog(\"Objects not exported\", \"Make sure at least some of your selected objects have mesh filters!\", \"\");\n        }\n\n        [MenuItem(MENU_NAME_MODELS_EXPORT + \"/Export whole selection to single OBJ\", priority = MENU_PRIORITY_MODELS_EXPORT)]\n        static void ExportWholeSelectionToSingle()\n        {\n            if (!CreateTargetFolder())\n                return;\n\n\n            Transform[] selection = Selection.GetTransforms(SelectionMode.Editable | SelectionMode.ExcludePrefab);\n\n            if (selection.Length == 0)\n            {\n                EditorUtility.DisplayDialog(\"No source object selected!\", \"Please select one or more target objects\", \"\");\n                return;\n            }\n\n            int exportedObjects = 0;\n\n            ArrayList mfList = new ArrayList();\n\n            for (int i = 0; i < selection.Length; i++)\n            {\n                Component[] meshfilter = selection[i].GetComponentsInChildren(typeof(MeshFilter));\n\n                for (int m = 0; m < meshfilter.Length; m++)\n                {\n                    exportedObjects++;\n                    mfList.Add(meshfilter[m]);\n                }\n            }\n\n            if (exportedObjects > 0)\n            {\n                MeshFilter[] mf = new MeshFilter[mfList.Count];\n\n                for (int i = 0; i < mfList.Count; i++)\n                {\n                    mf[i] = (MeshFilter)mfList[i];\n                }\n\n                //string filename = EditorApplication.currentScene + \"_\" + exportedObjects;\n                string filename = UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene().name;\n\n                int stripIndex = filename.LastIndexOf('/');//FIXME: Should be Path.PathSeparator\n\n                if (stripIndex >= 0)\n                    filename = filename.Substring(stripIndex + 1).Trim();\n\n                MeshesToFile(mf, targetFolder, filename);\n\n\n                EditorUtility.DisplayDialog(\"Objects exported\", \"Exported \" + exportedObjects + \" objects to \" + filename, \"\");\n            }\n            else\n                EditorUtility.DisplayDialog(\"Objects not exported\", \"Make sure at least some of your selected objects have mesh filters!\", \"\");\n        }\n\n        [MenuItem(MENU_NAME_MODELS_EXPORT + \"/Export each selected to single OBJ\", priority = MENU_PRIORITY_MODELS_EXPORT)]\n        static void ExportEachSelectionToSingle()\n        {\n            if (!CreateTargetFolder())\n                return;\n\n            Transform[] selection = Selection.GetTransforms(SelectionMode.Editable | SelectionMode.ExcludePrefab);\n\n            if (selection.Length == 0)\n            {\n                EditorUtility.DisplayDialog(\"No source object selected!\", \"Please select one or more target objects\", \"\");\n                return;\n            }\n\n            int exportedObjects = 0;\n\n\n            for (int i = 0; i < selection.Length; i++)\n            {\n                Component[] meshfilter = selection[i].GetComponentsInChildren(typeof(MeshFilter));\n\n                MeshFilter[] mf = new MeshFilter[meshfilter.Length];\n\n                for (int m = 0; m < meshfilter.Length; m++)\n                {\n                    exportedObjects++;\n                    mf[m] = (MeshFilter)meshfilter[m];\n                }\n\n                MeshesToFile(mf, targetFolder, selection[i].name + \"_\" + i);\n            }\n\n            if (exportedObjects > 0)\n            {\n                EditorUtility.DisplayDialog(\"Objects exported\", \"Exported \" + exportedObjects + \" objects\", \"\");\n            }\n            else\n                EditorUtility.DisplayDialog(\"Objects not exported\", \"Make sure at least some of your selected objects have mesh filters!\", \"\");\n        }\n\n        #endregion\n\n        private static int vertexOffset = 0;\n        private static int normalOffset = 0;\n        private static int uvOffset = 0;\n\n\n        //User should probably be able to change this. It is currently left as an excercise for\n        //the reader.\n        private static string targetFolder = \"ExportedObj\";\n\n\n        private static string MeshToString(MeshFilter mf, Dictionary<string, ObjMaterial> materialList)\n        {\n            Mesh m = mf.sharedMesh;\n            Material[] mats = mf.GetComponent<Renderer>().sharedMaterials;\n\n            StringBuilder sb = new StringBuilder();\n\n            sb.Append(\"g \").Append(mf.name).Append(\"\\n\");\n            foreach (Vector3 lv in m.vertices)\n            {\n                Vector3 wv = mf.transform.TransformPoint(lv);\n\n                //This is sort of ugly - inverting x-component since we're in\n                //a different coordinate system than \"everyone\" is \"used to\".\n                sb.Append(string.Format(\"v {0} {1} {2}\\n\", -wv.x, wv.y, wv.z));\n            }\n            sb.Append(\"\\n\");\n\n            foreach (Vector3 lv in m.normals)\n            {\n                Vector3 wv = mf.transform.TransformDirection(lv);\n\n                sb.Append(string.Format(\"vn {0} {1} {2}\\n\", -wv.x, wv.y, wv.z));\n            }\n            sb.Append(\"\\n\");\n\n            foreach (Vector3 v in m.uv)\n            {\n                sb.Append(string.Format(\"vt {0} {1}\\n\", v.x, v.y));\n            }\n\n            for (int material = 0; material < m.subMeshCount; material++)\n            {\n                sb.Append(\"\\n\");\n                sb.Append(\"usemtl \").Append(mats[material].name).Append(\"\\n\");\n                sb.Append(\"usemap \").Append(mats[material].name).Append(\"\\n\");\n\n                //See if this material is already in the materiallist.\n                try\n                {\n                    ObjMaterial objMaterial = new ObjMaterial();\n\n                    objMaterial.name = mats[material].name;\n\n                    if (mats[material].mainTexture)\n                        objMaterial.textureName = AssetDatabase.GetAssetPath(mats[material].mainTexture); //EditorUtility.GetAssetPath(mats[material].mainTexture);\n                    else\n                        objMaterial.textureName = null;\n\n                    materialList.Add(objMaterial.name, objMaterial);\n                }\n                catch (ArgumentException)\n                {\n                    //Already in the dictionary\n                }\n\n\n                int[] triangles = m.GetTriangles(material);\n                for (int i = 0; i < triangles.Length; i += 3)\n                {\n                    //Because we inverted the x-component, we also needed to alter the triangle winding.\n                    sb.Append(string.Format(\"f {1}/{1}/{1} {0}/{0}/{0} {2}/{2}/{2}\\n\",\n                        triangles[i] + 1 + vertexOffset, triangles[i + 1] + 1 + normalOffset, triangles[i + 2] + 1 + uvOffset));\n                }\n            }\n\n            vertexOffset += m.vertices.Length;\n            normalOffset += m.normals.Length;\n            uvOffset += m.uv.Length;\n\n            return sb.ToString();\n        }\n\n        private static void Clear()\n        {\n            vertexOffset = 0;\n            normalOffset = 0;\n            uvOffset = 0;\n        }\n\n        private static Dictionary<string, ObjMaterial> PrepareFileWrite()\n        {\n            Clear();\n\n            return new Dictionary<string, ObjMaterial>();\n        }\n\n        private static void MaterialsToFile(Dictionary<string, ObjMaterial> materialList, string folder, string filename)\n        {\n            using (StreamWriter sw = new StreamWriter(folder + \"/\" + filename + \".mtl\"))\n            {\n                foreach (KeyValuePair<string, ObjMaterial> kvp in materialList)\n                {\n                    sw.Write(\"\\n\");\n                    sw.Write(\"newmtl {0}\\n\", kvp.Key);\n                    sw.Write(\"Ka  0.6 0.6 0.6\\n\");\n                    sw.Write(\"Kd  0.6 0.6 0.6\\n\");\n                    sw.Write(\"Ks  0.9 0.9 0.9\\n\");\n                    sw.Write(\"d  1.0\\n\");\n                    sw.Write(\"Ns  0.0\\n\");\n                    sw.Write(\"illum 2\\n\");\n\n                    if (kvp.Value.textureName != null)\n                    {\n                        string destinationFile = kvp.Value.textureName;\n\n\n                        int stripIndex = destinationFile.LastIndexOf('/');//FIXME: Should be Path.PathSeparator;\n\n                        if (stripIndex >= 0)\n                            destinationFile = destinationFile.Substring(stripIndex + 1).Trim();\n\n\n                        string relativeFile = destinationFile;\n\n                        destinationFile = folder + \"/\" + destinationFile;\n\n                        Debug.Log(\"Copying texture from \" + kvp.Value.textureName + \" to \" + destinationFile);\n\n                        try\n                        {\n                            //Copy the source file\n                            File.Copy(kvp.Value.textureName, destinationFile);\n                        }\n                        catch\n                        {\n\n                        }\n\n\n                        sw.Write(\"map_Kd {0}\", relativeFile);\n                    }\n\n                    sw.Write(\"\\n\\n\\n\");\n                }\n            }\n        }\n\n        private static void MeshToFile(MeshFilter mf, string folder, string filename)\n        {\n            Dictionary<string, ObjMaterial> materialList = PrepareFileWrite();\n\n            using (StreamWriter sw = new StreamWriter(folder + \"/\" + filename + \".obj\"))\n            {\n                sw.Write(\"mtllib ./\" + filename + \".mtl\\n\");\n\n                sw.Write(MeshToString(mf, materialList));\n            }\n\n            MaterialsToFile(materialList, folder, filename);\n        }\n\n        private static void MeshesToFile(MeshFilter[] mf, string folder, string filename)\n        {\n            Dictionary<string, ObjMaterial> materialList = PrepareFileWrite();\n\n            using (StreamWriter sw = new StreamWriter(folder + \"/\" + filename + \".obj\"))\n            {\n                sw.Write(\"mtllib ./\" + filename + \".mtl\\n\");\n\n                for (int i = 0; i < mf.Length; i++)\n                {\n                    sw.Write(MeshToString(mf[i], materialList));\n                }\n            }\n\n            MaterialsToFile(materialList, folder, filename);\n        }\n\n        private static bool CreateTargetFolder()\n        {\n            try\n            {\n                System.IO.Directory.CreateDirectory(targetFolder);\n            }\n            catch\n            {\n                EditorUtility.DisplayDialog(\"Error!\", \"Failed to create target folder!\", \"\");\n                return false;\n            }\n\n            return true;\n        }\n\n\n\n    }\n\n}"
  },
  {
    "path": "SpacepuppyExtendedEditor/Base/Commands/ModelImportManager.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppyeditor.Base\n{\n    \n    public class ModelImportSettingsProcessor : AssetPostprocessor\n    {\n\n        private void OnPreprocessModel()\n        {\n            ModelImporter modelImporter = assetImporter as ModelImporter;\n            if (modelImporter == null) return;\n            if (System.IO.File.Exists(AssetDatabase.GetTextMetaFilePathFromAssetPath(modelImporter.assetPath))) return;\n\n            if (SpacepuppySettings.SetMaterialSearchOnImport)\n            {\n                modelImporter.materialSearch = SpacepuppySettings.MaterialSearch;\n            }\n\n            if (!SpacepuppySettings.SetAnimationSettingsOnImport)\n            {\n                modelImporter.animationType = SpacepuppySettings.ImportAnimRigType;\n            }\n        }\n        \n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyExtendedEditor/Base/Commands/ScanAndUpdateGuidForComponents.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.IO;\n\nusing com.spacepuppy.Utils;\nusing com.spacepuppyeditor;\n\nnamespace com.spacepuppyeditor.Commands\n{\n    class ScanAndUpdateGuidForComponents : EditorWindow\n    {\n\n\n        #region Menu\n\n        [MenuItem(SPMenu.MENU_NAME_TOOLS + \"/Scan and Update Guid for Components\", priority = SPMenu.MENU_PRIORITY_TOOLS)]\n        static void CreateRigWizard()\n        {\n            var wizard = EditorWindow.GetWindow<ScanAndUpdateGuidForComponents>(true, \"Scane Component Guid Move\", true);\n        }\n\n        #endregion\n\n\n\n        #region Fields\n\n        private System.Type _typeToReplace;\n        private System.Type _typeToReplaceWith;\n\n        #endregion\n\n        #region Methods\n\n        private void OnGUI()\n        {\n            _typeToReplace = SPEditorGUILayout.TypeDropDown(EditorHelper.TempContent(\"Type to Replace\"), typeof(MonoBehaviour), _typeToReplace);\n            _typeToReplaceWith = SPEditorGUILayout.TypeDropDown(EditorHelper.TempContent(\"New Type\"), typeof(MonoBehaviour), _typeToReplaceWith);\n\n            if (GUILayout.Button(\"Scan\"))\n            {\n                this.DoScan();\n            }\n        }\n\n        private void DoScan()\n        {\n            if (_typeToReplace == _typeToReplaceWith) return;\n            if (_typeToReplace == null) return;\n            if (_typeToReplaceWith == null) return;\n\n            //get guids\n            MonoScript script1;\n            MonoScript script2;\n            if (!GetMonoScripts(_typeToReplace, _typeToReplaceWith, out script1, out script2)) return;\n\n            var spath1 = AssetDatabase.GetAssetPath(script1);\n            var spath2 = AssetDatabase.GetAssetPath(script2);\n            var sMetaPath1 = spath1 + \".meta\";\n            var sMetaPath2 = spath2 + \".meta\";\n\n            string sguid1;\n            string sguid2;\n            if (!this.GetGUIDs(sMetaPath1, sMetaPath2, out sguid1, out sguid2)) return;\n\n            string fileid1 = (spath1.EndsWith(\".dll\", System.StringComparison.OrdinalIgnoreCase)) ? FileIDUtil.Compute(_typeToReplace).ToString() : \"11500000\";\n            string fileid2 = (spath2.EndsWith(\".dll\", System.StringComparison.OrdinalIgnoreCase)) ? FileIDUtil.Compute(_typeToReplaceWith).ToString() : \"11500000\";\n\n            const string MATCH_PATTERN = \"{{fileID: {0}, guid: {1}, type: 3}}\";\n            foreach (var sfile in Directory.GetFiles(Application.dataPath, \"*.unity\", SearchOption.AllDirectories))\n            {\n                var pattern = string.Format(MATCH_PATTERN, fileid1, sguid1);\n                string contents;\n                using (var tr = new StreamReader(sfile))\n                {\n                    contents = tr.ReadToEnd();\n                }\n\n                if (contents.Contains(pattern))\n                {\n                    contents = contents.Replace(pattern, string.Format(MATCH_PATTERN, fileid2, sguid2));\n                    using (var tw = new StreamWriter(sfile, false))\n                    {\n                        tw.Write(contents);\n                        Debug.Log(sfile);\n                    }\n                }\n            }\n            foreach (var sfile in Directory.GetFiles(Application.dataPath, \"*.prefab\", SearchOption.AllDirectories))\n            {\n                var pattern = string.Format(MATCH_PATTERN, fileid1, sguid1);\n                string contents;\n                using (var tr = new StreamReader(sfile))\n                {\n                    contents = tr.ReadToEnd();\n                }\n\n                if (contents.Contains(pattern))\n                {\n                    contents = contents.Replace(pattern, string.Format(MATCH_PATTERN, fileid2, sguid2));\n                    using (var tw = new StreamWriter(sfile, false))\n                    {\n                        tw.Write(contents);\n                        Debug.Log(sfile);\n                    }\n                }\n            }\n        }\n\n        private bool GetMonoScripts(System.Type type1, System.Type type2, out MonoScript script1, out MonoScript script2)\n        {\n            script1 = null;\n            script2 = null;\n\n            var go = new GameObject(\"temp\");\n            var c1 = go.AddComponent(type1) as MonoBehaviour;\n            var c2 = go.AddComponent(type2) as MonoBehaviour;\n            if (c1 == null || c2 == null)\n            {\n                GameObject.DestroyImmediate(go);\n                return false;\n            }\n\n            script1 = MonoScript.FromMonoBehaviour(c1);\n            script2 = MonoScript.FromMonoBehaviour(c2);\n\n            GameObject.DestroyImmediate(go);\n\n            return true;\n        }\n\n        private bool GetGUIDs(string sMetaPath1, string sMetaPath2, out string sguid1, out string sguid2)\n        {\n            sguid1 = null;\n            sguid2 = null;\n\n            try\n            {\n                //var yaml = new YamlStream();\n                //var idGUID = new YamlScalarNode(\"guid\");\n\n                //using (var tr = new StreamReader(EditorHelper.GetFullPathForAssetPath(sMetaPath1)))\n                //{\n                //    yaml.Load(tr);\n                //    var mapping = (YamlMappingNode)yaml.Documents[0].RootNode;\n                //    sguid1 = (mapping.Children[idGUID] as YamlScalarNode).Value;\n                //}\n                //using (var tr = new StreamReader(EditorHelper.GetFullPathForAssetPath(sMetaPath2)))\n                //{\n                //    yaml.Load(tr);\n                //    var mapping = (YamlMappingNode)yaml.Documents[0].RootNode;\n                //    sguid2 = (mapping.Children[idGUID] as YamlScalarNode).Value;\n                //}\n\n                var rx = new System.Text.RegularExpressions.Regex(@\"\\s*guid:\\s*(?<id>[a-zA-Z0-9]+?)\\s*$\");\n                string line;\n                using (var tr = new StreamReader(EditorHelper.GetFullPathForAssetPath(sMetaPath1)))\n                {\n                    while(!tr.EndOfStream)\n                    {\n                        line = tr.ReadLine();\n                        var match = rx.Match(line);\n                        if (match.Success)\n                        {\n                            sguid1 = match.Groups[\"id\"].Value;\n                            break;\n                        }\n                    }\n                }\n                using (var tr = new StreamReader(EditorHelper.GetFullPathForAssetPath(sMetaPath2)))\n                {\n                    while (!tr.EndOfStream)\n                    {\n                        line = tr.ReadLine();\n                        var match = rx.Match(line);\n                        if (match.Success)\n                        {\n                            sguid2 = match.Groups[\"id\"].Value;\n                            break;\n                        }\n                    }\n                }\n                return true;\n            }\n            catch\n            {\n                return false;\n            }\n        }\n\n        #endregion\n\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtendedEditor/Base/Commands/SearchByLayer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Base\n{\n    public class SearchByLayer : EditorWindow\n    {\n\n        public const string MENU_NAME = SPMenu.MENU_NAME_ROOT + \"/Search By Layer\";\n        public const int MENU_PRIORITY = SPMenu.MENU_PRIORITY_GROUP2;\n\n\n        static LayerMask layerMask;\n        static Vector2 scrollValue = Vector2.zero;\n        static GameObject[] searchResult;\n\n        [MenuItem(MENU_NAME, priority=MENU_PRIORITY)]\n        static void OpenTagSearcher()\n        {\n            EditorWindow.GetWindow<SearchByLayer>();\n\n            UpdateSearchResults();\n        }\n\n        void OnGUI()\n        {\n            var oldLayerMask = layerMask;\n            layerMask = SPEditorGUILayout.LayerMaskField(\"Layers\", layerMask);\n\n            if (layerMask != oldLayerMask)\n            {\n                UpdateSearchResults();\n            }\n\n            scrollValue = EditorGUILayout.BeginScrollView(scrollValue);\n\n            if (searchResult != null)\n            {\n                foreach (GameObject obj in searchResult)\n                {\n                    if (obj != null)\n                    {\n                        if (GUILayout.Button(obj.name,GUIStyle.none))\n                        {\n                            Selection.activeObject = obj;\n                            EditorGUIUtility.PingObject(obj);\n                        }\n                    }\n                    else\n                    {\n                        UpdateSearchResults();\n                        break;\n                    }\n                }\n\n            }\n\n            EditorGUILayout.EndScrollView();\n        }\n\n\n        private static void UpdateSearchResults()\n        {\n            searchResult = (from g in Object.FindObjectsOfType<GameObject>() where g.IntersectsLayerMask(layerMask) select g).ToArray();\n            Selection.objects = searchResult;\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtendedEditor/Base/Commands/SearchByTag.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Collections;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Base\n{\n\n    public class SearchByTag : EditorWindow\n    {\n\n        public const string MENU_NAME = SPMenu.MENU_NAME_ROOT + \"/Search By Tag\";\n        public const int MENU_PRIORITY = SPMenu.MENU_PRIORITY_GROUP2;\n\n\n        static string tagValue = \"\";\n        static Vector2 scrollValue = Vector2.zero;\n        static GameObject[] searchResult;\n\n        [MenuItem(MENU_NAME, priority = MENU_PRIORITY)]\n        static void OpenTagSearcher()\n        {\n            EditorWindow.GetWindow<SearchByTag>();\n\n            searchResult = FindGameObjectsWithMultiTagSlow(tagValue).ToArray(); //GameObject.FindGameObjectsWithTag(tagValue);\n            Selection.objects = searchResult;\n        }\n\n        void OnGUI()\n        {\n            var oldTagValue = tagValue;\n            tagValue = EditorGUILayout.TagField(tagValue);\n\n            if (tagValue != oldTagValue)\n            {\n                searchResult = FindGameObjectsWithMultiTagSlow(tagValue).ToArray(); //GameObject.FindGameObjectsWithTag(tagValue);\n                Selection.objects = searchResult;\n            }\n\n            scrollValue = EditorGUILayout.BeginScrollView(scrollValue);\n\n            if (searchResult != null)\n            {\n                foreach (GameObject obj in searchResult)\n                {\n                    if (obj != null)\n                    {\n                        if (GUILayout.Button(obj.name,GUIStyle.none))\n                        {\n                            Selection.activeObject = obj;\n                            EditorGUIUtility.PingObject(obj);\n                        }\n                    }\n                    else\n                    {\n                        searchResult = FindGameObjectsWithMultiTagSlow(tagValue).ToArray(); //GameObject.FindGameObjectsWithTag(tagValue);\n                        Selection.objects = searchResult;\n                        break;\n                    }\n                }\n\n            }\n\n            EditorGUILayout.EndScrollView();\n        }\n\n\n\n        public static GameObject[] FindGameObjectsWithMultiTagSlow(string tag)\n        {\n            if (tag == SPConstants.TAG_MULTITAG)\n            {\n                return GameObject.FindGameObjectsWithTag(SPConstants.TAG_MULTITAG);\n            }\n            else\n            {\n                using (var tmp = TempList<GameObject>.GetList())\n                {\n                    foreach (var go in GameObject.FindGameObjectsWithTag(tag)) tmp.Add(go);\n\n                    foreach (var m in GameObject.FindObjectsOfType<MultiTag>())\n                    {\n                        if (m.HasTag(tag)) tmp.Add(m.gameObject);\n                    }\n\n                    return tmp.ToArray();\n                }\n            }\n        }\n\n    }\n\n}"
  },
  {
    "path": "SpacepuppyExtendedEditor/Base/Commands/ToggleEditorOnlyVisibility.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppyeditor.Base\n{\n\n    public class ToggleEditorOnlyVisibility : SPEditor\n    {\n\n        public const string MENU_NAME = SPMenu.MENU_NAME_ROOT + \"/Toggle EditorOnly Visible\";\n        public const int MENU_PRIORITY = SPMenu.MENU_PRIORITY_GROUP2;\n\n\n\n        private static bool _active = true;\n\n        [MenuItem(MENU_NAME, priority = MENU_PRIORITY)]\n        static void Init()\n        {\n            _active = !_active;\n\n            foreach (GameObject obj in GameObjectUtil.FindGameObjectsWithMultiTag(com.spacepuppy.SPConstants.TAG_EDITORONLY))\n            {\n                var rb = obj.GetComponent<Renderer>();\n                if (rb != null) rb.enabled = _active;\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "SpacepuppyExtendedEditor/Base/Inspectors/ConfigurableForcePropertyDrawer.cs",
    "content": "﻿using UnityEngine;\nusing UnityEditor;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy;\n\nnamespace com.spacepuppyeditor.Base\n{\n\n    [CustomPropertyDrawer(typeof(ConfigurableForce))]\n    public class ConfigurableForcePropertyDrawer : PropertyDrawer\n    {\n\n        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n        {\n            return EditorGUI.GetPropertyHeight(property, label, property.isExpanded);\n        }\n\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n        {\n            if(property.isExpanded)\n            {\n                EditorGUI.PropertyField(position, property, label, true);\n            }\n            else\n            {\n                var dirProp = property.FindPropertyRelative(\"_direction\");\n                var strProp = property.FindPropertyRelative(\"_strength\");\n                var modeProp = property.FindPropertyRelative(\"_forceMode\");\n                //var content = string.Format(\"[Dir:{0}, Str:{1:0.00}, Mode:{2}]\", (ConfigurableForce.ForceDirection)dirProp.enumValueIndex, strProp.floatValue, (ForceMode)modeProp.enumValueIndex);\n                var content = string.Format(\"[Dir:{0}, Str:{1:0.00}, Mode:{2}]\", dirProp.GetEnumValue<ConfigurableForce.ForceDirection>(), strProp.floatValue, modeProp.GetEnumValue<ForceMode>());\n\n                var r1 = new Rect(position.xMin, position.yMin, EditorGUIUtility.labelWidth, EditorGUIUtility.singleLineHeight);\n                var r2 = new Rect(r1.xMax, r1.yMin, position.width - r1.width, r1.height);\n                property.isExpanded = EditorGUI.Foldout(r1, property.isExpanded, label, true);\n                EditorGUI.LabelField(r2, content);\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtendedEditor/FileIDUtil.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Collections.Generic;\nusing System.Security.Cryptography;\n\nnamespace com.spacepuppyeditor\n{\n    public static class FileIDUtil\n    {\n        public static int Compute(Type t)\n        {\n            string toBeHashed = \"s\\0\\0\\0\" + t.Namespace + t.Name;\n\n            using (HashAlgorithm hash = new MD4())\n            {\n                byte[] hashed = hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(toBeHashed));\n\n                int result = 0;\n\n                for (int i = 3; i >= 0; --i)\n                {\n                    result <<= 8;\n                    result |= hashed[i];\n                }\n\n                return result;\n            }\n        }\n\n\n\n        #region Special Types\n\n        // Taken from http://www.superstarcoders.com/blogs/posts/md4-hash-algorithm-in-c-sharp.aspx\n        // Probably not the best implementation of MD4, but it works.\n        private class MD4 : HashAlgorithm\n        {\n            private uint _a;\n            private uint _b;\n            private uint _c;\n            private uint _d;\n            private uint[] _x;\n            private int _bytesProcessed;\n\n            public MD4()\n            {\n                _x = new uint[16];\n\n                Initialize();\n            }\n\n            public override void Initialize()\n            {\n                _a = 0x67452301;\n                _b = 0xefcdab89;\n                _c = 0x98badcfe;\n                _d = 0x10325476;\n\n                _bytesProcessed = 0;\n            }\n\n            protected override void HashCore(byte[] array, int offset, int length)\n            {\n                ProcessMessage(Bytes(array, offset, length));\n            }\n\n            protected override byte[] HashFinal()\n            {\n                try\n                {\n                    ProcessMessage(Padding());\n\n                    return new[] { _a, _b, _c, _d }.SelectMany(word => Bytes(word)).ToArray();\n                }\n                finally\n                {\n                    Initialize();\n                }\n            }\n\n            private void ProcessMessage(IEnumerable<byte> bytes)\n            {\n                foreach (byte b in bytes)\n                {\n                    int c = _bytesProcessed & 63;\n                    int i = c >> 2;\n                    int s = (c & 3) << 3;\n\n                    _x[i] = (_x[i] & ~((uint)255 << s)) | ((uint)b << s);\n\n                    if (c == 63)\n                    {\n                        Process16WordBlock();\n                    }\n\n                    _bytesProcessed++;\n                }\n            }\n\n            private static IEnumerable<byte> Bytes(byte[] bytes, int offset, int length)\n            {\n                for (int i = offset; i < length; i++)\n                {\n                    yield return bytes[i];\n                }\n            }\n\n            private IEnumerable<byte> Bytes(uint word)\n            {\n                yield return (byte)(word & 255);\n                yield return (byte)((word >> 8) & 255);\n                yield return (byte)((word >> 16) & 255);\n                yield return (byte)((word >> 24) & 255);\n            }\n\n            private IEnumerable<byte> Repeat(byte value, int count)\n            {\n                for (int i = 0; i < count; i++)\n                {\n                    yield return value;\n                }\n            }\n\n            private IEnumerable<byte> Padding()\n            {\n                return Repeat(128, 1)\n                   .Concat(Repeat(0, ((_bytesProcessed + 8) & 0x7fffffc0) + 55 - _bytesProcessed))\n                   .Concat(Bytes((uint)_bytesProcessed << 3))\n                   .Concat(Repeat(0, 4));\n            }\n\n            private void Process16WordBlock()\n            {\n                uint aa = _a;\n                uint bb = _b;\n                uint cc = _c;\n                uint dd = _d;\n\n                foreach (int k in new[] { 0, 4, 8, 12 })\n                {\n                    aa = Round1Operation(aa, bb, cc, dd, _x[k], 3);\n                    dd = Round1Operation(dd, aa, bb, cc, _x[k + 1], 7);\n                    cc = Round1Operation(cc, dd, aa, bb, _x[k + 2], 11);\n                    bb = Round1Operation(bb, cc, dd, aa, _x[k + 3], 19);\n                }\n\n                foreach (int k in new[] { 0, 1, 2, 3 })\n                {\n                    aa = Round2Operation(aa, bb, cc, dd, _x[k], 3);\n                    dd = Round2Operation(dd, aa, bb, cc, _x[k + 4], 5);\n                    cc = Round2Operation(cc, dd, aa, bb, _x[k + 8], 9);\n                    bb = Round2Operation(bb, cc, dd, aa, _x[k + 12], 13);\n                }\n\n                foreach (int k in new[] { 0, 2, 1, 3 })\n                {\n                    aa = Round3Operation(aa, bb, cc, dd, _x[k], 3);\n                    dd = Round3Operation(dd, aa, bb, cc, _x[k + 8], 9);\n                    cc = Round3Operation(cc, dd, aa, bb, _x[k + 4], 11);\n                    bb = Round3Operation(bb, cc, dd, aa, _x[k + 12], 15);\n                }\n\n                unchecked\n                {\n                    _a += aa;\n                    _b += bb;\n                    _c += cc;\n                    _d += dd;\n                }\n            }\n\n            private static uint ROL(uint value, int numberOfBits)\n            {\n                return (value << numberOfBits) | (value >> (32 - numberOfBits));\n            }\n\n            private static uint Round1Operation(uint a, uint b, uint c, uint d, uint xk, int s)\n            {\n                unchecked\n                {\n                    return ROL(a + ((b & c) | (~b & d)) + xk, s);\n                }\n            }\n\n            private static uint Round2Operation(uint a, uint b, uint c, uint d, uint xk, int s)\n            {\n                unchecked\n                {\n                    return ROL(a + ((b & c) | (b & d) | (c & d)) + xk + 0x5a827999, s);\n                }\n            }\n\n            private static uint Round3Operation(uint a, uint b, uint c, uint d, uint xk, int s)\n            {\n                unchecked\n                {\n                    return ROL(a + (b ^ c ^ d) + xk + 0x6ed9eba1, s);\n                }\n            }\n        }\n\n        #endregion\n\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyExtendedEditor/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"SpacepuppyExtendedEditor\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"SpacepuppyExtendedEditor\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"ea28ae62-8807-4955-ab1b-3a4d8284f1d1\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "SpacepuppyExtendedEditor/SpacepuppyExtendedEditor.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{5A96AB58-0FCE-4016-9C12-782BF5C8D1E9}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>com.spacepuppyeditor</RootNamespace>\n    <AssemblyName>SpacepuppyUnityFrameworkEditor.Extended</AssemblyName>\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile>\n    </TargetFrameworkProfile>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n    <CodeAnalysisRuleSet />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n    <CodeAnalysisRuleSet />\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"UnityEditor, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <SpecificVersion>False</SpecificVersion>\n      <HintPath>..\\Resources\\UnityEditor.dll</HintPath>\n    </Reference>\n    <Reference Include=\"UnityEngine, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <SpecificVersion>False</SpecificVersion>\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Base\\Commands\\CollisionParser.cs\" />\n    <Compile Include=\"Base\\Commands\\CreateGameObjectIn.cs\" />\n    <Compile Include=\"Base\\Commands\\EditorObjExporter.cs\" />\n    <Compile Include=\"Base\\Commands\\ModelImportManager.cs\" />\n    <Compile Include=\"Base\\Commands\\ScanAndUpdateGuidForComponents.cs\" />\n    <Compile Include=\"Base\\Commands\\SearchByLayer.cs\" />\n    <Compile Include=\"Base\\Commands\\SearchByTag.cs\" />\n    <Compile Include=\"Base\\Commands\\ToggleEditorOnlyVisibility.cs\" />\n    <Compile Include=\"Base\\Inspectors\\ConfigurableForcePropertyDrawer.cs\" />\n    <Compile Include=\"FileIDUtil.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\SpacepuppyBaseEditor\\SpacepuppyBaseEditor.csproj\">\n      <Project>{a0466ee3-9582-4c0d-965d-e2d2f9006971}</Project>\n      <Name>SpacepuppyBaseEditor</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\n      <Name>SpacepuppyBase</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\SpacepuppyExtended\\SpacepuppyExtended.csproj\">\n      <Project>{776aa1da-15e2-4d90-97b5-330c6f1cb442}</Project>\n      <Name>SpacepuppyExtended</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <PropertyGroup>\n    <PostBuildEvent>\n    </PostBuildEvent>\n  </PropertyGroup>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "SpacepuppyInput/GameInputManager.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.SPInput;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    public interface IInputManager : IService, IEnumerable<IInputDevice>\r\n    {\r\n        int Count { get; }\r\n        IInputDevice this[string id] { get; set; }\r\n        IInputDevice Main { get; }\r\n\r\n        IInputDevice GetDevice(string id);\r\n        T GetDevice<T>(string id) where T : IInputDevice;\r\n        \r\n    }\r\n    \r\n    public class GameInputManager : ServiceComponent<IInputManager>, IInputManager\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private Dictionary<string, IInputDevice> _dict = new Dictionary<string, IInputDevice>();\r\n        private IInputDevice _default_main;\r\n        private IInputDevice _override_main;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public GameInputManager()\r\n        {\r\n            \r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region Messages\r\n\r\n        private void FixedUpdate()\r\n        {\r\n            var e = _dict.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if (e.Current.Value.Active) e.Current.Value.FixedUpdate();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Call once per frame\r\n        /// </summary>\r\n        private void Update()\r\n        {\r\n            var e = _dict.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                if (e.Current.Value.Active) e.Current.Value.Update();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IGameInputManager Interface\r\n\r\n        public int Count { get { return _dict.Count; } }\r\n\r\n        public IInputDevice this[string id]\r\n        {\r\n            get\r\n            {\r\n                return this.GetDevice(id);\r\n            }\r\n            set\r\n            {\r\n                this.Add(id, value);\r\n            }\r\n        }\r\n\r\n        public IInputDevice Main\r\n        {\r\n            get\r\n            {\r\n                if (_override_main != null) return _override_main;\r\n                if (_default_main == null)\r\n                {\r\n                    var e = _dict.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        _default_main = e.Current.Value;\r\n                    }\r\n                }\r\n                return _default_main;\r\n            }\r\n            set\r\n            {\r\n                _override_main = value;\r\n            }\r\n        }\r\n\r\n        public IInputDevice GetDevice(string id)\r\n        {\r\n            if (!_dict.ContainsKey(id)) throw new System.Collections.Generic.KeyNotFoundException();\r\n            return _dict[id];\r\n        }\r\n\r\n        public T GetDevice<T>(string id) where T : IInputDevice\r\n        {\r\n            if (!_dict.ContainsKey(id)) throw new System.Collections.Generic.KeyNotFoundException();\r\n            return (T)_dict[id];\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Collection Interface\r\n\r\n        public void Add(string id, IInputDevice dev)\r\n        {\r\n            if (this.Contains(dev) && !(_dict.ContainsKey(id) && _dict[id] == dev)) throw new System.ArgumentException(\"Manager already contains input device for other player.\");\r\n\r\n            if (_dict.Count == 0) _default_main = dev;\r\n            _dict[id] = dev;\r\n        }\r\n\r\n        public bool Remove(string id)\r\n        {\r\n            if(_default_main != null)\r\n            {\r\n                IInputDevice device;\r\n                if(_dict.TryGetValue(id, out device) && device == _default_main)\r\n                {\r\n                    if(_dict.Remove(id))\r\n                    {\r\n                        _default_main = null;\r\n                        return true;\r\n                    }\r\n                    else\r\n                    {\r\n                        return false;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    return _dict.Remove(id);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return _dict.Remove(id);\r\n            }\r\n        }\r\n\r\n        public bool Contains(string id)\r\n        {\r\n            return _dict.ContainsKey(id);\r\n        }\r\n\r\n        public bool Contains(IInputDevice dev)\r\n        {\r\n            return (_dict.Values as ICollection<IInputDevice>).Contains(dev);\r\n        }\r\n\r\n        public string GetId(IInputDevice dev)\r\n        {\r\n            foreach (var pair in _dict)\r\n            {\r\n                if (pair.Value == dev) return pair.Key;\r\n            }\r\n\r\n            throw new System.ArgumentException(\"Unknown input device.\");\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        //TODO - implement propert Enumerator, remember dict.Values allocates mem in mono... ugh\r\n\r\n        public IEnumerator<IInputDevice> GetEnumerator()\r\n        {\r\n            return _dict.Values.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _dict.Values.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyInput/GameInputManager.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 38a9e162141a14444b21d306ce87c2c3\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: -31999\n  icon: {instanceID: 0}\n  userData: \n"
  },
  {
    "path": "SpacepuppyInput/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"SpacepuppyInput\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"SpacepuppyInput\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"522dd10e-2e92-4010-b6ca-b9ce91cbe273\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/AnalogButtonSimulator.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput\n{\n\n    [System.Serializable()]\n    public class AnalogButtonSimulator\n    {\n\n        [Range(0f, 1f)]\n        [SerializeField()]\n        public float DeadZone = 0.8f;\n        [System.NonSerialized()]\n        private ButtonState _currentState = ButtonState.None;\n\n        public ButtonState Button { get { return _currentState; } }\n\n        public void Update(float impact)\n        {\n            if (impact > this.DeadZone)\n            {\n                switch (_currentState)\n                {\n                    case ButtonState.None:\n                    case ButtonState.Released:\n                        _currentState = ButtonState.Down;\n                        break;\n                    case ButtonState.Down:\n                    case ButtonState.Held:\n                        _currentState = ButtonState.Held;\n                        break;\n                }\n            }\n            else\n            {\n                switch (_currentState)\n                {\n                    case ButtonState.None:\n                    case ButtonState.Released:\n                        _currentState = ButtonState.None;\n                        break;\n                    case ButtonState.Down:\n                    case ButtonState.Held:\n                        _currentState = ButtonState.Released;\n                        break;\n                }\n            }\n        }\n\n        public void Reset()\n        {\n            _currentState = ButtonState.None;\n        }\n    }\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/ComboInputSignature.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.SPInput\n{\n\n    public class ComboInputSignature : BaseInputSignature, IInputSignature\n    {\n\n        #region Fields\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public ComboInputSignature(string id)\n            :base(id)\n        {\n            this.Precedence = float.PositiveInfinity;\n        }\n        \n        #endregion\n\n        #region Methods\n\n        #endregion\n\n        #region IInputSignature Interface\n\n        public override void Update()\n        {\n\n\n\n        }\n\n        public override void Reset()\n        {\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/CompositeInputSignature.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput\n{\n\n    public class CompositeDualAxleInputSignature : IDualAxleInputSignature\n    {\n\n        #region Fields\n\n        private string _id;\n        private IAxleInputSignature _horizontal;\n        private IAxleInputSignature _vertical;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public CompositeDualAxleInputSignature(string id, IAxleInputSignature horizontal, IAxleInputSignature vertical)\n        {\n            _id = id;\n            _horizontal = horizontal;\n            _vertical = vertical;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public IAxleInputSignature Horizontal\n        {\n            get { return _horizontal; }\n            set { _horizontal = value; }\n        }\n\n        public IAxleInputSignature Vertical\n        {\n            get { return _vertical; }\n            set { _vertical = value; }\n        }\n\n        #endregion\n\n        #region IDualAxleInputSignature Interface\n\n        public string Id\n        {\n            get { return _id; }\n        }\n\n        public Vector2 CurrentState\n        {\n            get\n            {\n                var v = new Vector2((_horizontal != null) ? _horizontal.CurrentState : 0f,\n                                   (_vertical != null) ? _vertical.CurrentState : 0f);\n                return InputUtil.CutoffDualAxis(v, this.DeadZone, this.Cutoff, this.RadialDeadZone, this.RadialCutoff);\n            }\n        }\n\n        public float Precedence\n        {\n            get;\n            set;\n        }\n\n        public float DeadZone\n        {\n            get;\n            set;\n        }\n\n        public DeadZoneCutoff Cutoff\n        {\n            get;\n            set;\n        }\n\n        public float RadialDeadZone\n        {\n            get;\n            set;\n        }\n\n        public DeadZoneCutoff RadialCutoff\n        {\n            get;\n            set;\n        }\n\n        public void Update()\n        {\n            if (_horizontal != null) _horizontal.Update();\n            if (_vertical != null) _vertical.Update();\n        }\n\n        public void FixedUpdate()\n        {\n            if (_horizontal != null) _horizontal.FixedUpdate();\n            if (_vertical != null) _vertical.FixedUpdate();\n        }\n\n        public void Reset()\n        {\n            if (_horizontal != null) _horizontal.Reset();\n            if (_vertical != null) _vertical.Reset();\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/DelegatedInputSignature.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.SPInput\n{\n\n    public delegate bool ButtonDelegate();\n    public delegate float AxisDelegate();\n\n    public class DelegatedButtonInputSignature : BaseInputSignature, IButtonInputSignature\n    {\n\n        #region Fields\n\n        private ButtonDelegate _delegate;\n        private ButtonState _current;\n        private ButtonState _currentFixed;\n        private float _lastDown;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public DelegatedButtonInputSignature(string id, ButtonDelegate del)\n            : base(id)\n        {\n            _delegate = del;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public ButtonDelegate Delegate\n        {\n            get { return _delegate; }\n            set { _delegate = value; }\n        }\n\n        #endregion\n\n        #region IButtonInputSignature Interface\n\n        public ButtonState CurrentState\n        {\n            get\n            {\n                if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n                {\n                    return _currentFixed;\n                }\n                else\n                {\n                    return _current;\n                }\n            }\n        }\n\n        public ButtonState GetCurrentState(bool getFixedState)\n        {\n            return (getFixedState) ? _currentFixed : _current;\n        }\n\n        public void Consume()\n        {\n            if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n            {\n                _currentFixed = InputUtil.ConsumeButtonState(_currentFixed);\n            }\n            else\n            {\n                _current = InputUtil.ConsumeButtonState(_current);\n            }\n        }\n        \n        public float LastDownTime\n        {\n            get { return _lastDown; }\n        }\n\n        #endregion\n\n        #region IInputSignature Interfacce\n\n        public override void Update()\n        {\n            //determine based on history\n            _current = InputUtil.GetNextButtonState(_current, _delegate != null ? _delegate() : false);\n            if (_current == ButtonState.Down)\n                _lastDown = Time.realtimeSinceStartup;\n        }\n\n        public override void FixedUpdate()\n        {\n            //determine based on history\n            _currentFixed = InputUtil.GetNextButtonState(_currentFixed, _delegate != null ? _delegate() : false);\n        }\n\n        public override void Reset()\n        {\n            _current = ButtonState.None;\n            _currentFixed = ButtonState.None;\n            _lastDown = 0f;\n        }\n\n        #endregion\n\n    }\n\n    public class DelegatedAxleInputSignature : BaseInputSignature, IAxleInputSignature\n    {\n\n        #region Fields\n\n        private AxisDelegate _delegate;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public DelegatedAxleInputSignature(string id, AxisDelegate del)\n            : base(id)\n        {\n            _delegate = del;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public AxisDelegate Delegate\n        {\n            get { return _delegate; }\n            set { _delegate = value; }\n        }\n\n        public DeadZoneCutoff Cutoff\n        {\n            get;\n            set;\n        }\n\n        public bool Invert\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IAxleInputSignature Interface\n\n        public float CurrentState\n        {\n            get\n            {\n                //return _current;\n\n                var v = _delegate != null ? _delegate() : 0f;\n                if (this.Invert) v *= -1;\n                return InputUtil.CutoffAxis(v, this.DeadZone, this.Cutoff);\n            }\n        }\n\n        public float DeadZone\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IInputSignature Interfacce\n\n        public override void Update()\n        {\n\n        }\n\n        public override void Reset()\n        {\n        }\n\n        #endregion\n\n    }\n\n    /// <summary>\n    /// Dual mode input signature. It allows for axes to act like a button. It behaves exactly as a DelegatedAxleInputSignature, \n    /// but will return appropriate values when treated as a button. Very useful if you have dual inputs for the same \n    /// action that should act like buttons. For instance both pressing up on left stick, or pressing A to jump.\n    /// </summary>\n    public class DelegatedAxleButtonInputSignature : DelegatedAxleInputSignature, IButtonInputSignature\n    {\n\n        #region Fields\n\n        private ButtonState _current;\n        private ButtonState _currentFixed;\n        private float _lastDown;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public DelegatedAxleButtonInputSignature(string id, AxisDelegate del, AxleValueConsideration consideration = AxleValueConsideration.Positive, float axisButtnDeadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE)\n            : base(id, del)\n        {\n            this.AxisButtonDeadZone = axisButtnDeadZone;\n            this.Consideration = consideration;\n        }\n\n        #endregion\n\n        #region Properties\n\n        /// <summary>\n        /// If input is treated as a axis-button, where is the dead-zone of the button. As opposed to the axes' DeadZone.\n        /// </summary>\n        public float AxisButtonDeadZone\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// How should we consider the value returned for the axis.\n        /// </summary>\n        public AxleValueConsideration Consideration\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IButtonInputSignature Interface\n\n        public new ButtonState CurrentState\n        {\n            get\n            {\n                if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n                {\n                    return _currentFixed;\n                }\n                else\n                {\n                    return _current;\n                }\n            }\n        }\n\n        public ButtonState GetCurrentState(bool getFixedState)\n        {\n            return (getFixedState) ? _currentFixed : _current;\n        }\n\n        public void Consume()\n        {\n            if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n            {\n                _currentFixed = InputUtil.ConsumeButtonState(_currentFixed);\n            }\n            else\n            {\n                _current = InputUtil.ConsumeButtonState(_current);\n            }\n        }\n\n        public float LastDownTime\n        {\n            get { return _lastDown; }\n        }\n\n        #endregion\n\n        #region IInputSignature Interfacce\n\n        public override void Update()\n        {\n            base.Update();\n\n            float v = base.CurrentState;\n            switch (this.Consideration)\n            {\n                case AxleValueConsideration.Positive:\n                    _current = InputUtil.GetNextButtonState(_current, v >= this.AxisButtonDeadZone);\n                    break;\n                case AxleValueConsideration.Negative:\n                    _current = InputUtil.GetNextButtonState(_current, v <= -this.AxisButtonDeadZone);\n                    break;\n                case AxleValueConsideration.Absolute:\n                    //_current = InputUtil.GetNextButtonState(_current, Input.GetButton(this.UnityInputId) || Mathf.Abs(Input.GetAxis(this.UnityInputId)) >= this.AxisButtonDeadZone);\n                    _current = InputUtil.GetNextButtonState(_current, v >= this.AxisButtonDeadZone);\n                    break;\n            }\n\n            if (_current == ButtonState.Down)\n                _lastDown = Time.realtimeSinceStartup;\n        }\n\n        public override void FixedUpdate()\n        {\n            base.FixedUpdate();\n\n            float v = base.CurrentState;\n            switch (this.Consideration)\n            {\n                case AxleValueConsideration.Positive:\n                    //_currentFixed = InputUtil.GetNextButtonState(_currentFixed, Input.GetButton(this.UnityInputId) || Input.GetAxis(this.UnityInputId) >= this.AxisButtonDeadZone);\n                    _currentFixed = InputUtil.GetNextButtonState(_currentFixed, v >= this.AxisButtonDeadZone);\n                    break;\n                case AxleValueConsideration.Negative:\n                    //_currentFixed = InputUtil.GetNextButtonState(_currentFixed, Input.GetButton(this.UnityInputId) || Input.GetAxis(this.UnityInputId) <= -this.AxisButtonDeadZone);\n                    _currentFixed = InputUtil.GetNextButtonState(_currentFixed, v <= -this.AxisButtonDeadZone);\n                    break;\n                case AxleValueConsideration.Absolute:\n                    //_currentFixed = InputUtil.GetNextButtonState(_currentFixed, Input.GetButton(this.UnityInputId) || Mathf.Abs(Input.GetAxis(this.UnityInputId)) >= this.AxisButtonDeadZone);\n                    _currentFixed = InputUtil.GetNextButtonState(_currentFixed, v >= this.AxisButtonDeadZone);\n                    break;\n            }\n        }\n\n        public override void Reset()\n        {\n            base.Reset();\n\n            _current = ButtonState.None;\n            _currentFixed = ButtonState.None;\n            _lastDown = 0f;\n        }\n\n        #endregion\n\n    }\n\n    public class DelegatedDualAxleInputSignature : BaseInputSignature, IDualAxleInputSignature\n    {\n\n        #region Fields\n\n        private AxisDelegate _horizontal;\n        private AxisDelegate _vertical;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public DelegatedDualAxleInputSignature(string id, AxisDelegate hor, AxisDelegate ver)\n            : base(id)\n        {\n            _horizontal = hor;\n            _vertical = ver;\n        }\n\n        #endregion\n\n        #region Properties\n        \n        public AxisDelegate HorizontalDelegate\n        {\n            get { return _horizontal; }\n            set { _horizontal = value; }\n        }\n\n        public AxisDelegate VerticalDelegate\n        {\n            get { return _vertical; }\n            set { _vertical = value; }\n        }\n\n        public DeadZoneCutoff Cutoff\n        {\n            get;\n            set;\n        }\n\n        public float RadialDeadZone\n        {\n            get;\n            set;\n        }\n\n        public DeadZoneCutoff RadialCutoff\n        {\n            get;\n            set;\n        }\n\n        public bool InvertX\n        {\n            get;\n            set;\n        }\n\n        public bool InvertY\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IDualAxleInputSignature Interface\n\n        public Vector2 CurrentState\n        {\n            get\n            {\n                //return _current;\n                Vector2 v = new Vector2(_horizontal != null ? _horizontal() : 0f,\n                                        _vertical != null ? _vertical() : 0f);\n                if (this.InvertX) v.x = -v.x;\n                if (this.InvertY) v.y = -v.y;\n                return InputUtil.CutoffDualAxis(v, this.DeadZone, this.Cutoff, this.RadialDeadZone, this.RadialCutoff);\n            }\n        }\n\n        public float DeadZone\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IInputSignature Interface\n\n        public override void Update()\n        {\n\n        }\n\n        public override void Reset()\n        {\n        }\n\n        #endregion\n\n    }\n\n    /// <summary>\n    /// Dual mode input signature. It allows for dual axes to act like a button. It behaves exactly as a DelegateDualAxleInputSignature, \n    /// but will return ButtonStates based on the magnitude from center. Very useful if you want to know if the user popped their dual axes. \n    /// </summary>\n    public class DelegatedDualAxleButtonInputSignature : DelegatedDualAxleInputSignature, IButtonInputSignature\n    {\n\n        #region Fields\n\n        private ButtonState _current;\n        private ButtonState _currentFixed;\n        private float _lastDown;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public DelegatedDualAxleButtonInputSignature(string id, AxisDelegate hor, AxisDelegate ver, float axisButtnDeadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE)\n            : base(id, hor, ver)\n        {\n            this.AxisButtonDeadZone = axisButtnDeadZone;\n        }\n\n        #endregion\n\n        #region Properties\n\n        /// <summary>\n        /// If input is treated as a axis-button, where is the dead-zone of the button. As opposed to the axes' DeadZone.\n        /// </summary>\n        public float AxisButtonDeadZone\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IButtonInputSignature Interface\n\n        public new ButtonState CurrentState\n        {\n            get\n            {\n                if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n                {\n                    return _currentFixed;\n                }\n                else\n                {\n                    return _current;\n                }\n            }\n        }\n\n        public ButtonState GetCurrentState(bool getFixedState)\n        {\n            return (getFixedState) ? _currentFixed : _current;\n        }\n\n        public void Consume()\n        {\n            if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n            {\n                _currentFixed = InputUtil.ConsumeButtonState(_currentFixed);\n            }\n            else\n            {\n                _current = InputUtil.ConsumeButtonState(_current);\n            }\n        }\n\n        public float LastDownTime\n        {\n            get { return _lastDown; }\n        }\n\n        #endregion\n\n        #region IInputSignature Interfacce\n\n        public override void Update()\n        {\n            base.Update();\n\n            float v = base.CurrentState.sqrMagnitude;\n            float dz = this.AxisButtonDeadZone;\n            _current = InputUtil.GetNextButtonState(_current, v >= (dz * dz));\n\n            if (_current == ButtonState.Down)\n                _lastDown = Time.realtimeSinceStartup;\n        }\n\n        public override void FixedUpdate()\n        {\n            base.FixedUpdate();\n\n            float v = base.CurrentState.sqrMagnitude;\n            float dz = this.AxisButtonDeadZone;\n            _currentFixed = InputUtil.GetNextButtonState(_currentFixed, v >= (dz * dz));\n        }\n\n        public override void Reset()\n        {\n            base.Reset();\n\n            _current = ButtonState.None;\n            _currentFixed = ButtonState.None;\n            _lastDown = 0f;\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Enums.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput\n{\n\n    public enum InputDeviceType\n    {\n        Unknown = -1,\n        KBM = 0,\n        Joystick = 1\n    }\n    \n    public enum Joystick : sbyte\n    {\n        None = -1,\n        All = 0,\n        Joy1 = 1,\n        Joy2 = 2,\n        Joy3 = 3,\n        Joy4 = 4,\n        Joy5 = 5,\n        Joy6 = 6,\n        Joy7 = 7,\n        Joy8 = 8,\n        Joy9 = 9,\n        Joy10 = 10,\n        Joy11 = 11\n    }\n\n    public enum AxleValueConsideration : byte\n    {\n        Positive = 0,\n        Negative = 1,\n        Absolute = 2\n    }\n\n    /// <summary>\n    /// Represents the current state of a button.\n    /// </summary>\n    public enum ButtonState : sbyte\n    {\n        None = 0,\n        Down = 1,\n        Held = 2,\n        Released = -1\n    }\n    \n    /// <summary>\n    /// Represents a button press over some duration of time. Returned by 'GetButtonPress'.\n    /// </summary>\n    public enum ButtonPress\n    {\n        /// <summary>\n        /// Button was pressed and released after the defined time.\n        /// </summary>\n        Released = -2,\n        /// <summary>\n        /// Button was pressed and released before the defined time.\n        /// </summary>\n        Tapped = -1,\n        /// <summary>\n        /// Button is not active.\n        /// </summary>\n        None = 0,\n        /// <summary>\n        /// Button just became active.\n        /// </summary>\n        Down = 1,\n        /// <summary>\n        /// Button is down but the duration has yet to pass.\n        /// </summary>\n        Holding = 2,\n        /// <summary>\n        /// Button is down and the duration has passed.\n        /// </summary>\n        Held = 3\n    }\n\n    public enum DeadZoneCutoff\n    {\n        Scaled = 0,\n        Shear = 1\n    }\n\n    public enum MergedAxlePrecedence\n    {\n\n        FirstActive = 0,\n        LastActive = 1,\n        Largest = 2,\n        Smallest = 3\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/EventSystems/SPInputModule.cs",
    "content": "﻿using UnityEngine;\nusing UnityEngine.EventSystems;\nusing System.Collections;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Utils;\nusing com.spacepuppy.SPInput.Unity;\n\nnamespace com.spacepuppy.SPInput.EventSystems\n{\n\n    public class SPInputModule : StandaloneInputModule\n    {\n\n        protected override void Awake()\n        {\n            base.Awake();\n\n            this.m_InputOverride = this.AddOrGetComponent<SPBaseInput>().Init(this);\n        }\n\n\n        private static AxisDelegate _defaultHorizontal = () => SPInputDirect.GetAxisRaw(SPInputId.Axis1);\n        private static AxisDelegate _defaultVertical = () => SPInputDirect.GetAxisRaw(SPInputId.Axis2);\n        private static ButtonDelegate _defaultSubmit = () => SPInputDirect.GetButtonDown(SPInputId.Button0);\n        private static ButtonDelegate _defaultCancel = () => SPInputDirect.GetButtonDown(SPInputId.Button1);\n        private static AxisDelegate _horizontal = _defaultHorizontal;\n        private static AxisDelegate _vertical = _defaultVertical;\n        private static ButtonDelegate _submit = _defaultSubmit;\n        private static ButtonDelegate _cancel = _defaultCancel;\n\n        public static AxisDelegate HorizontalCallback\n        {\n            get { return _horizontal; }\n            set { _horizontal = value; }\n        }\n\n        public static AxisDelegate VerticalCallback\n        {\n            get { return _vertical; }\n            set { _vertical = value; }\n        }\n\n        public static ButtonDelegate SubmitCallback\n        {\n            get { return _submit; }\n            set { _submit = value; }\n        }\n\n        public static ButtonDelegate CancelCallback\n        {\n            get { return _cancel; }\n            set { _cancel = value; }\n        }\n\n        public static AxisDelegate DefaultHorizontalCallback\n        {\n            get { return _defaultHorizontal; }\n        }\n\n        public static AxisDelegate DefaultVerticalCallback\n        {\n            get { return _defaultVertical; }\n        }\n\n        public static ButtonDelegate DefaultSubmitCallback\n        {\n            get { return _defaultSubmit; }\n        }\n\n        public static ButtonDelegate DefaultCancelCallback\n        {\n            get { return _defaultCancel; }\n        }\n\n\n\n        public class SPBaseInput : BaseInput\n        {\n\n            private StandaloneInputModule _module;\n\n            internal SPBaseInput Init(StandaloneInputModule module)\n            {\n                _module = module;\n                return this;\n            }\n\n            public override float GetAxisRaw(string axisName)\n            {\n                var service = Services.Get<IInputManager>();\n                if (service != null && service.Main != null)\n                {\n                    var device = service.Main;\n                    if (device.Contains(axisName))\n                        return device.GetAxleState(axisName);\n                }\n\n                if (_module != null)\n                {\n                    if (axisName == _module.horizontalAxis)\n                    {\n                        if (_horizontal != null) return _horizontal();\n                    }\n                    else if (axisName == _module.verticalAxis)\n                    {\n                        if (_vertical != null) return _vertical();\n                    }\n                    else if (axisName == _module.submitButton)\n                    {\n                        if (_submit != null) return _submit() ? 1f : 0f;\n                    }\n                    else if (axisName == _module.cancelButton)\n                    {\n                        if (_cancel != null) return _cancel() ? 1f : 0f;\n                    }\n                }\n\n                return base.GetAxisRaw(axisName);\n            }\n\n            public override bool GetButtonDown(string buttonName)\n            {\n                var service = Services.Get<IInputManager>();\n                if (service != null && service.Main != null)\n                {\n                    var device = service.Main;\n                    if (device.Contains(buttonName))\n                        return device.GetButtonState(buttonName) == SPInput.ButtonState.Down;\n                }\n\n                if (_module != null)\n                {\n                    if (buttonName == _module.horizontalAxis)\n                    {\n                        if (_horizontal != null) return false;\n                    }\n                    else if (buttonName == _module.verticalAxis)\n                    {\n                        if (_vertical != null) return false;\n                    }\n                    else if (buttonName == _module.submitButton)\n                    {\n                        if (_submit != null) return _submit();\n                    }\n                    else if (buttonName == _module.cancelButton)\n                    {\n                        if (_cancel != null) return _cancel();\n                    }\n                }\n\n                return base.GetButtonDown(buttonName);\n            }\n\n        }\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/GenericInputDevice.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nusing com.spacepuppy.Collections;\n\nnamespace com.spacepuppy.SPInput\n{\n    public class GenericInputDevice : IInputDevice\n    {\n\n        #region Fields\n\n        private string _id;\n        private bool _active = true;\n        private IInputSignatureCollection _signatures;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public GenericInputDevice(string id)\n        {\n            _id = id;\n            _signatures = new InputSignatureCollection();\n        }\n\n        public GenericInputDevice(string id, IInputSignatureCollection coll)\n        {\n            _id = id;\n            _signatures = coll ?? new InputSignatureCollection();\n        }\n\n        #endregion\n\n        #region Properties\n\n        public IInputSignatureCollection InputSignatures { get { return _signatures; } }\n\n        #endregion\n\n        #region IInputSignature Interface\n\n        public string Id\n        {\n            get { return _id; }\n        }\n\n        public int Hash\n        {\n            get { return _id.GetHashCode(); }\n        }\n\n        float IInputSignature.Precedence\n        {\n            get\n            {\n                return 0f;\n            }\n            set\n            {\n                throw new System.NotImplementedException();\n            }\n        }\n        \n        public virtual void Update()\n        {\n            //_signatures.Sort();\n\n            var e = _signatures.GetEnumerator();\n            while (e.MoveNext())\n            {\n                e.Current.Update();\n            }\n        }\n\n        public virtual void FixedUpdate()\n        {\n            //_signatures.Sort();\n\n            var e = _signatures.GetEnumerator();\n            while (e.MoveNext())\n            {\n                e.Current.FixedUpdate();\n            }\n        }\n\n        public virtual void Reset()\n        {\n            var e = _signatures.GetEnumerator();\n            while (e.MoveNext())\n            {\n                e.Current.Reset();\n            }\n        }\n\n        #endregion\n\n        #region IPlayerInputDevice Interface\n\n        public bool Active\n        {\n            get { return _active; }\n            set { _active = value; }\n        }\n\n        public bool AnyInputActivated\n        {\n            get\n            {\n                var e = _signatures.GetEnumerator();\n                while (e.MoveNext())\n                {\n                    if (e.Current.GetInputIsActivated()) return true;\n                }\n                return false;\n            }\n        }\n\n        public bool Contains(string id)\n        {\n            return _signatures.Contains(id);\n        }\n\n        IInputSignature IInputDevice.GetSignature(string id)\n        {\n            return _signatures.GetSignature(id);\n        }\n\n        public ButtonState GetButtonState(string id, bool consume = false)\n        {\n            if (!_active) return ButtonState.None;\n\n            var sig = _signatures.GetSignature(id);\n            if (sig is IButtonInputSignature)\n            {\n                var result = (sig as IButtonInputSignature).CurrentState;\n                if (consume) (sig as IButtonInputSignature).Consume();\n                return result;\n            }\n            else if (sig is IAxleInputSignature)\n                return (sig as IAxleInputSignature).CurrentState > InputUtil.DEFAULT_AXLEBTNDEADZONE ? ButtonState.Held : ButtonState.None;\n            else if (sig is IDualAxleInputSignature)\n                return (sig as IDualAxleInputSignature).CurrentState.sqrMagnitude > InputUtil.DEFAULT_AXLEBTNDEADZONE * InputUtil.DEFAULT_AXLEBTNDEADZONE ? ButtonState.Held : ButtonState.None;\n            else\n                return ButtonState.None;\n        }\n        \n        public float GetAxleState(string id)\n        {\n            if (!_active) return 0f;\n\n            var sig = _signatures.GetSignature(id);\n            if (sig is IAxleInputSignature)\n                return (sig as IAxleInputSignature).CurrentState;\n            else if (sig is IDualAxleInputSignature)\n                return (sig as IDualAxleInputSignature).CurrentState.x;\n            else if (sig is IButtonInputSignature)\n                return (sig as IButtonInputSignature).CurrentState > ButtonState.None ? 1f : 0f;\n            else\n                return 0f;\n        }\n        \n        public Vector2 GetDualAxleState(string id)\n        {\n            if (!_active) return Vector2.zero;\n\n            var sig = _signatures.GetSignature(id);\n            if (sig is IDualAxleInputSignature)\n                return (sig as IDualAxleInputSignature).CurrentState;\n            else if (sig is IAxleInputSignature)\n                return new Vector2((sig as IAxleInputSignature).CurrentState, 0f);\n            else if (sig is IButtonInputSignature)\n                return new Vector2((sig as IButtonInputSignature).CurrentState > ButtonState.None ? 1f : 0f, 0f);\n            else\n                return Vector2.zero;\n        }\n        \n        public Vector2 GetCursorState(string id)\n        {\n            if (!_active) return Vector2.zero;\n\n            var sig = _signatures.GetSignature(id);\n            if (!(sig is ICursorInputSignature)) return Vector2.zero;\n\n            return (sig as ICursorInputSignature).CurrentState;\n        }\n        \n        #endregion\n\n        #region HashCodeOverride\n\n        public override int GetHashCode()\n        {\n            return this.Hash;\n        }\n\n        #endregion\n        \n    }\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/IInputDevice.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nusing com.spacepuppy.Collections;\n\nnamespace com.spacepuppy.SPInput\n{\n\n    public interface IInputDevice : IInputSignature\n    {\n\n        bool Active { get; set; }\n\n        bool AnyInputActivated { get; }\n\n        bool Contains(string id);\n\n        IInputSignature GetSignature(string id);\n\n        ButtonState GetButtonState(string id, bool consume = false);\n        \n        float GetAxleState(string id);\n\n        Vector2 GetDualAxleState(string id);\n\n        Vector2 GetCursorState(string id);\n\n    }\n\n    public interface IInputSignatureCollection : ICollection<IInputSignature>\n    {\n        bool Contains(string id);\n        IInputSignature GetSignature(string id);\n        bool Remove(string id);\n        void Sort();\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/IInputSignature.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy.SPInput\n{\n\n    public interface IInputSignature\n    {\n\n        string Id { get; }\n        float Precedence { get; set; }\n        \n        /// <summary>\n        /// Only called by the IPlayerInputDevice on Update, if called independent of IPlayerInputDevice, state of the input signature will be inaccurate.\n        /// </summary>\n        void Update();\n\n        /// <summary>\n        /// Only called by the IPlayerInputDevice on FixedUpdate, if called independent of IPlayerInputDevice, state of the input signature will be inaccurate.\n        /// </summary>\n        void FixedUpdate();\n\n        /// <summary>\n        /// Resets the state of the input.\n        /// </summary>\n        void Reset();\n\n    }\n\n    public interface IButtonInputSignature : IInputSignature\n    {\n        ButtonState CurrentState { get; }\n\n        ButtonState GetCurrentState(bool getFixedState);\n\n        /// <summary>\n        /// Consumes any 'Down' or 'Released' ButtonState so no other object can react to it by converting 'Down' to 'Held' and 'Released' to 'None'.\n        /// </summary>\n        void Consume();\n\n        /// <summary>\n        /// Last time 'Down' was signaled (as realTimeSinceStartup)\n        /// </summary>\n        float LastDownTime { get; }\n        \n    }\n\n    public interface IAxleInputSignature : IInputSignature\n    {\n        float CurrentState { get; }\n\n        float DeadZone { get; set; }\n        DeadZoneCutoff Cutoff { get; set; }\n\n    }\n\n    public interface IDualAxleInputSignature : IInputSignature\n    {\n        Vector2 CurrentState { get; }\n\n        float DeadZone { get; set; }\n        DeadZoneCutoff Cutoff { get; set; }\n        float RadialDeadZone { get; set; }\n        DeadZoneCutoff RadialCutoff { get; set; }\n\n    }\n\n    public interface ICursorInputSignature : IInputSignature\n    {\n        Vector2 CurrentState { get; }\n    }\n\n    public abstract class BaseInputSignature : IInputSignature\n    {\n        \n        #region Fields\n\n        private string _id;\n\n        #endregion\n        \n        #region CONSTRUCTOR\n\n        public BaseInputSignature(string id)\n        {\n            _id = id;\n        }\n        \n        #endregion\n\n        #region IInputSignature Interfacce\n\n        public string Id { get { return _id; } }\n        \n        public float Precedence { get; set; }\n        \n        public abstract void Update();\n\n        public virtual void FixedUpdate()\n        {\n\n        }\n\n        public abstract void Reset();\n\n        #endregion\n        \n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/IMappedInputDevice.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy.SPInput\n{\n\n    public interface IMappedInputDevice<T> : IInputDevice where T : struct, System.IConvertible\n    {\n\n        IInputSignature GetSignature(T id);\n\n        ButtonState GetButtonState(T btn, bool consume = false);\n        float GetAxleState(T axis);\n        Vector2 GetDualAxleState(T axis);\n        Vector2 GetCursorState(T mapping);\n\n    }\n    \n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/ISequence.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nusing com.spacepuppy.Collections;\n\nnamespace com.spacepuppy.SPInput\n{\n\n    /// <summary>\n    /// Represents a sequence that can be registered with the GameInputManager.\n    /// </summary>\n    public interface ISequence\n    {\n\n        /// <summary>\n        /// Called by the GameInputManager when the sequence is first registered.\n        /// </summary>\n        void OnStart();\n\n        /// <summary>\n        /// Sequence polling Update\n        /// </summary>\n        /// <returns>Returns true when sequence is complete</returns>\n        bool Update();\n\n    }\n\n\n    public class SequenceManager\n    {\n\n        #region Fields\n\n        private HashSet<ISequence> _sequences = new HashSet<ISequence>();\n        private HashSet<ISequence> _fixedSequences = new HashSet<ISequence>();\n\n        #endregion\n\n        #region Methods\n\n        public void RegisterSequence(ISequence sequence, bool useFixedUpdate = false)\n        {\n            bool b = (useFixedUpdate) ? _fixedSequences.Add(sequence) : _sequences.Add(sequence);\n            if (b) sequence.OnStart();\n        }\n\n        public void Update()\n        {\n            if (_sequences.Count > 0)\n            {\n                using (var set = TempCollection.GetSet<ISequence>())\n                {\n                    var e2 = _sequences.GetEnumerator();\n                    while (e2.MoveNext())\n                    {\n                        if (e2.Current.Update()) set.Add(e2.Current);\n                    }\n\n                    if (set.Count > 0)\n                    {\n                        e2 = set.GetEnumerator();\n                        while (e2.MoveNext())\n                        {\n                            _sequences.Remove(e2.Current);\n                        }\n                    }\n                }\n            }\n        }\n\n        public void FixedUpdate()\n        {\n            if (_fixedSequences.Count > 0)\n            {\n                using (var set = TempCollection.GetSet<ISequence>())\n                {\n                    var e2 = _fixedSequences.GetEnumerator();\n                    while (e2.MoveNext())\n                    {\n                        if (e2.Current.Update()) set.Add(e2.Current);\n                    }\n\n                    if (set.Count > 0)\n                    {\n                        e2 = set.GetEnumerator();\n                        while (e2.MoveNext())\n                        {\n                            _fixedSequences.Remove(e2.Current);\n                        }\n                    }\n                }\n            }\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/InputSignatureCollection.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy.SPInput\n{\n\n    public class InputSignatureCollection : IInputSignatureCollection\n    {\n\n        #region Fields\n\n        private Dictionary<string, IInputSignature> _table = new Dictionary<string, IInputSignature>();\n        private List<IInputSignature> _sortedList = new List<IInputSignature>();\n\n        #endregion\n\n        #region Methods\n        \n        public Enumerator GetEnumerator()\n        {\n            return new Enumerator(this);\n        }\n\n        #endregion\n\n        #region IInputSignatureCollection Interface\n\n        public virtual IInputSignature GetSignature(string id)\n        {\n            IInputSignature result;\n            if (_table.TryGetValue(id, out result) && result != null && result.Id == id)\n            {\n                return result;\n            }\n            return null;\n        }\n\n        public virtual bool Contains(string id)\n        {\n            IInputSignature result;\n            if (_table.TryGetValue(id, out result) && result != null && result.Id == id)\n            {\n                return true;\n            }\n            return false;\n        }\n\n        public virtual bool Remove(string id)\n        {\n            IInputSignature sig;\n            if(_table.TryGetValue(id, out sig) && _table.Remove(id))\n            {\n                _sortedList.Remove(sig);\n                return true;\n            }\n\n            return false;\n        }\n\n        public void Sort()\n        {\n            _sortedList.Sort(SortOnPrecedence);\n        }\n\n        #endregion\n\n        #region ICollection Interface\n\n        public int Count\n        {\n            get { return _table.Count; }\n        }\n\n        public void Add(IInputSignature item)\n        {\n            if (item == null) throw new System.ArgumentNullException(\"item\");\n            if (_table.ContainsKey(item.Id)) throw new System.ArgumentException(\"A signature already exists with this Id and/or Hash.\", \"item\");\n\n            var e = _table.GetEnumerator();\n            while (e.MoveNext())\n            {\n                if (e.Current.Value.Id == item.Id)\n                {\n                    throw new System.ArgumentException(\"A signature already exists with this Id and/or Hash.\", \"item\");\n                }\n            }\n\n            _table[item.Id] = item;\n            _sortedList.Add(item);\n        }\n\n        public void Clear()\n        {\n            _table.Clear();\n            _sortedList.Clear();\n        }\n\n        public bool Contains(IInputSignature item)\n        {\n            return _sortedList.Contains(item);\n        }\n\n        public void CopyTo(IInputSignature[] array, int arrayIndex)\n        {\n            _sortedList.CopyTo(array, arrayIndex);\n        }\n\n        bool ICollection<IInputSignature>.IsReadOnly\n        {\n            get { return false; }\n        }\n\n        public bool Remove(IInputSignature item)\n        {\n            var e = _table.GetEnumerator();\n            while (e.MoveNext())\n            {\n                if (e.Current.Value == item)\n                {\n                    if (_table.Remove(e.Current.Key))\n                    {\n                        _sortedList.Remove(item);\n                        return true;\n                    }\n                    else\n                        return false;\n                }\n            }\n\n            return false;\n        }\n\n        IEnumerator<IInputSignature> IEnumerable<IInputSignature>.GetEnumerator()\n        {\n            return this.GetEnumerator();\n        }\n\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n        {\n            return this.GetEnumerator();\n        }\n\n        #endregion\n\n        #region Special Types\n\n        public struct Enumerator : IEnumerator<IInputSignature>\n        {\n\n            private List<IInputSignature>.Enumerator _e;\n\n            public Enumerator(InputSignatureCollection coll)\n            {\n                if (coll == null) throw new System.ArgumentNullException(\"coll\");\n                _e = coll._sortedList.GetEnumerator();\n            }\n\n            public IInputSignature Current\n            {\n                get { return _e.Current; }\n            }\n\n            object System.Collections.IEnumerator.Current\n            {\n                get { return _e.Current; }\n            }\n\n            public bool MoveNext()\n            {\n                return _e.MoveNext();\n            }\n\n            void System.Collections.IEnumerator.Reset()\n            {\n                (_e as System.Collections.IEnumerator).Reset();\n            }\n\n            public void Dispose()\n            {\n                _e.Dispose();\n            }\n        }\n\n        #endregion\n\n        #region Sort Methods\n\n        private static System.Comparison<IInputSignature> _sortOnPrecedence;\n        private static System.Comparison<IInputSignature> SortOnPrecedence\n        {\n            get\n            {\n                if (_sortOnPrecedence == null)\n                {\n                    _sortOnPrecedence = (a, b) =>\n                    {\n                        if (a.Precedence > b.Precedence)\n                            return 1;\n                        if (a.Precedence < b.Precedence)\n                            return -1;\n                        else\n                            return 0;\n                    };\n                }\n                return _sortOnPrecedence;\n            }\n        }\n\n        #endregion\n\n    }\n    \n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/InputUtil.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.SPInput\n{\n    public static class InputUtil\n    {\n\n        public const float DEFAULT_AXLEBTNDEADZONE = 0.707f;\n\n        public static float CutoffAxis(float value, float deadzone, DeadZoneCutoff cutoff)\n        {\n            if (deadzone < 0f) deadzone = 0f;\n\n            //no larger than 1\n            if (Mathf.Abs(value) > 1f) return Mathf.Sign(value);\n\n            switch (cutoff)\n            {\n                case DeadZoneCutoff.Scaled:\n                    if (Mathf.Abs(value) < deadzone) return 0f;\n                    return Mathf.Sign(value) * (Mathf.Abs(value) - deadzone) / (1f - deadzone);\n                case DeadZoneCutoff.Shear:\n                    return (Mathf.Abs(value) < deadzone) ? 0f : value;\n                default:\n                    return value;\n            }\n        }\n\n        public static Vector2 CutoffDualAxis(Vector2 value, float axleDeadzone, DeadZoneCutoff axleCutoff, float radialDeadzone, DeadZoneCutoff radialCutoff)\n        {\n            if (axleDeadzone < 0f) axleDeadzone = 0f;\n            if (radialDeadzone < 0f) radialDeadzone = 0f;\n\n            if (axleDeadzone > 0f)\n            {\n                value.x = CutoffAxis(value.x, axleDeadzone, axleCutoff);\n                value.y = CutoffAxis(value.y, axleDeadzone, axleCutoff);\n            }\n\n            //no larger than 1\n            if (value.sqrMagnitude > 1f) return value.normalized;\n\n            if (radialDeadzone > 0f)\n            {\n                switch (radialCutoff)\n                {\n                    case DeadZoneCutoff.Scaled:\n                        if (value.sqrMagnitude < radialDeadzone * radialDeadzone) return Vector2.zero;\n                        value = value.normalized * (value.magnitude - radialDeadzone) / (1f - radialDeadzone);\n                        break;\n                    case DeadZoneCutoff.Shear:\n                        if (value.sqrMagnitude < radialDeadzone * radialDeadzone) value = Vector2.zero;\n                        break;\n                }\n            }\n\n            return value;\n        }\n\n\n        public static ButtonState ConsumeButtonState(ButtonState current)\n        {\n            switch (current)\n            {\n                case ButtonState.Released:\n                case ButtonState.None:\n                    return ButtonState.None;\n                case ButtonState.Down:\n                case ButtonState.Held:\n                    return ButtonState.Held;\n                default:\n                    return ButtonState.None;\n            }\n        }\n\n        public static ButtonState GetNextButtonState(ButtonState current, bool isButtonActive)\n        {\n            if (isButtonActive)\n            {\n                switch (current)\n                {\n                    case ButtonState.None:\n                    case ButtonState.Released:\n                        return ButtonState.Down;\n                    case ButtonState.Down:\n                    case ButtonState.Held:\n                        return ButtonState.Held;\n                }\n            }\n            else\n            {\n                switch (current)\n                {\n                    case ButtonState.None:\n                    case ButtonState.Released:\n                        return ButtonState.None;\n                    case ButtonState.Down:\n                    case ButtonState.Held:\n                        return ButtonState.Released;\n                }\n            }\n\n            return ButtonState.None;\n        }\n\n        public static ButtonState GetNextFixedButtonStateFromCurrent(ButtonState currentFixedState, ButtonState current)\n        {\n            switch (currentFixedState)\n            {\n                case ButtonState.Released:\n                    return ButtonState.None;\n                case ButtonState.None:\n                    if (current > ButtonState.None)\n                        return ButtonState.Down;\n                    else\n                        return ButtonState.None;\n                case ButtonState.Down:\n                case ButtonState.Held:\n                    if (current > ButtonState.None)\n                        return ButtonState.Held;\n                    else\n                        return ButtonState.Released;\n                default:\n                    return ButtonState.None;\n            }\n        }\n\n\n        public static ButtonPress GetButtonPress(this IInputDevice device, string id, float duration)\n        {\n            if (device == null) return ButtonPress.None;\n\n            var sig = device.GetSignature(id) as IButtonInputSignature;\n            if (sig == null) return ButtonPress.None;\n\n            switch(sig.CurrentState)\n            {\n                case ButtonState.Released:\n                    return (Time.realtimeSinceStartup - sig.LastDownTime) <= duration ? ButtonPress.Tapped : ButtonPress.Released;\n                case ButtonState.None:\n                    return ButtonPress.None;\n                case ButtonState.Down:\n                    return ButtonPress.Down;\n                case ButtonState.Held:\n                    return (Time.realtimeSinceStartup - sig.LastDownTime) <= duration ? ButtonPress.Holding : ButtonPress.Held;\n                default:\n                    return ButtonPress.None;\n            }\n        }\n\n        public static ButtonPress GetButtonPress<T>(this IMappedInputDevice<T> device, T id, float duration) where T : struct, System.IConvertible\n        {\n            if (device == null) return ButtonPress.None;\n\n            var sig = device.GetSignature(id) as IButtonInputSignature;\n            if (sig == null) return ButtonPress.None;\n\n            switch (sig.CurrentState)\n            {\n                case ButtonState.Released:\n                    return (Time.realtimeSinceStartup - sig.LastDownTime) <= duration ? ButtonPress.Tapped : ButtonPress.Released;\n                case ButtonState.None:\n                    return ButtonPress.None;\n                case ButtonState.Down:\n                    return ButtonPress.Down;\n                case ButtonState.Held:\n                    return (Time.realtimeSinceStartup - sig.LastDownTime) <= duration ? ButtonPress.Holding : ButtonPress.Held;\n                default:\n                    return ButtonPress.None;\n            }\n        }\n\n        public static bool GetInputIsActivated(this IInputSignature sig)\n        {\n            if (sig == null) return false;\n\n            if (sig is IButtonInputSignature)\n                return (sig as IButtonInputSignature).CurrentState != ButtonState.None;\n            else if (sig is IAxleInputSignature)\n                return (sig as IAxleInputSignature).CurrentState > 0f;\n            else if (sig is IDualAxleInputSignature)\n                return (sig as IDualAxleInputSignature).CurrentState.sqrMagnitude > 0.0001f;\n            else if (sig is IInputDevice)\n                return (sig as IInputDevice).AnyInputActivated;\n\n            return false;\n        }\n\n\n\n        public static bool TestCursorOver(Camera cursorCamera, Vector2 cursorPos, out Collider collider, float maxDistance = float.PositiveInfinity, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            collider = null;\n            if (cursorCamera == null) return false;\n\n            var ray = cursorCamera.ScreenPointToRay(cursorPos);\n            RaycastHit hit;\n            if (Physics.Raycast(ray, out hit, maxDistance, layerMask, query))\n            {\n                collider = hit.collider;\n                return true;\n            }\n\n            return false;\n        }\n\n        public static bool TestCursorOverEntity(Camera cursorCamera, Vector2 cursorPos, out SPEntity entity, float maxDistance = float.PositiveInfinity, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)\n        {\n            Collider c;\n            if(TestCursorOver(cursorCamera, cursorPos, out c, maxDistance, layerMask, query))\n            {\n                entity = SPEntity.Pool.GetFromSource(c);\n                return !object.ReferenceEquals(entity, null);\n            }\n            else\n            {\n                entity = null;\n                return false;\n            }\n        }\n\n        public static bool TestCursorOverEntity<T>(Camera cursorCamera, Vector2 cursorPos, out T hitTarget, float maxDistance = float.PositiveInfinity, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal) where T : class\n        {\n            Collider c;\n            if (TestCursorOver(cursorCamera, cursorPos, out c, maxDistance, layerMask, query))\n            {\n                hitTarget = com.spacepuppy.Utils.ComponentUtil.FindComponent<T>(c);\n                return !object.ReferenceEquals(hitTarget, null);\n            }\n            else\n            {\n                hitTarget = null;\n                return false;\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Legacy/EventfulUnityInputDevice.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System;\n\nnamespace com.spacepuppy.SPInput.Legacy\n{\n\n    public class EventfulUnityInputDevice : IInputDevice, IUpdateable\n    {\n\n        public const string INPUT_ID = \"sp.internal.evu.device\";\n\n        #region Singleton Interface\n\n        private static EventfulUnityInputDevice _device;\n        public static EventfulUnityInputDevice GetDevice()\n        {\n            if (_device != null) return _device;\n            \n            _device = new EventfulUnityInputDevice();\n            GameLoopEntry.UpdatePump.Add(_device);\n            return _device;\n        }\n\n        /* OLD\n        private static EventfulUnityInputDevice _device;\n        private static IGameInputManager _inputManager;\n        public static EventfulUnityInputDevice GetDevice()\n        {\n            if (_device != null) return _device;\n            \n            if (_inputManager == null)\n            {\n                _inputManager = Services.Get<IGameInputManager>();\n                if(_inputManager != null)\n                {\n                    _inputManager.ServiceUnregistered += (s, e) =>\n                    {\n                        _inputManager = null;\n                        _device = null;\n                    };\n                }\n                else\n                {\n                    return null;\n                }\n            }\n\n            _device = new EventfulUnityInputDevice();\n            _inputManager.Add(INPUT_ID, _device);\n            return _device;\n        }\n        */\n\n        #endregion\n\n        #region Fields\n\n        private Dictionary<string, System.Action<string>> _buttonPressTable = new Dictionary<string, Action<string>>();\n        private bool _inUpdate;\n        private System.Action _lateRegister;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        private EventfulUnityInputDevice()\n        {\n            //only one allowed\n        }\n\n        #endregion\n\n        #region Methods\n\n        public void RegisterButtonPress(string id, System.Action<string> callback)\n        {\n            if (id == null) throw new System.ArgumentNullException(\"id\");\n            if (callback == null) return;\n\n            System.Action<string> d;\n            if(_buttonPressTable.TryGetValue(id, out d))\n            {\n                callback = d + callback;\n            }\n\n            if(_inUpdate)\n            {\n                _lateRegister += () =>\n                {\n                    _buttonPressTable[id] = callback;\n                    this.Active = true;\n                };\n            }\n            else\n            {\n                _buttonPressTable[id] = callback;\n                this.Active = true;\n            }\n        }\n\n        public void UnregisterButtonPress(string id, System.Action<string> callback)\n        {\n            if (id == null) throw new System.ArgumentNullException(\"id\");\n            if (callback == null) return;\n\n            if(_inUpdate)\n            {\n                _lateRegister += () =>\n                {\n                    this.UnregisterButtonPress(id, callback);\n                };\n            }\n            else\n            {\n                System.Action<string> d;\n                if (_buttonPressTable.TryGetValue(id, out d))\n                {\n                    d -= callback;\n                    if (d == null)\n                    {\n                        _buttonPressTable.Remove(id);\n                        if (_buttonPressTable.Count == 0)\n                            this.Active = false;\n                    }\n                    else\n                    {\n                        _buttonPressTable[id] = callback;\n                    }\n                }\n            }\n        }\n\n        public void Update()\n        {\n            _inUpdate = true;\n            var e = _buttonPressTable.GetEnumerator();\n            while (e.MoveNext())\n            {\n                if (Input.GetButtonDown(e.Current.Key)) e.Current.Value(e.Current.Key);\n            }\n            _inUpdate = false;\n\n            if (_lateRegister != null)\n            {\n                var a = _lateRegister;\n                _lateRegister = null;\n                a();\n            }\n        }\n\n        #endregion\n\n        #region IPlayerInputDevice Interface\n\n        public string Id\n        {\n            get\n            {\n                return INPUT_ID;\n            }\n        }\n\n        public bool Active\n        {\n            get;\n            set;\n        }\n\n        public int Hash\n        {\n            get\n            {\n                return INPUT_ID.GetHashCode();\n            }\n        }\n\n        public float Precedence\n        {\n            get\n            {\n                return 0f;\n            }\n            set\n            {\n                throw new System.NotImplementedException();\n            }\n        }\n\n        public bool AnyInputActivated\n        {\n            get\n            {\n                return Input.anyKey;\n            }\n        }\n\n        void IInputSignature.FixedUpdate()\n        {\n        }\n        void IInputSignature.Reset()\n        {\n        }\n\n        public bool Contains(string id)\n        {\n            return false;\n        }\n\n        IInputSignature IInputDevice.GetSignature(string id)\n        {\n            return null;\n        }\n        \n        public float GetAxleState(string id)\n        {\n            return Input.GetAxis(id);\n        }\n        \n        public ButtonState GetButtonState(string id)\n        {\n            if (Input.GetButtonDown(id))\n                return ButtonState.Down;\n            else if (Input.GetButtonUp(id))\n                return ButtonState.Released;\n            else if (Input.GetButton(id))\n                return ButtonState.Held;\n            else\n                return ButtonState.None;\n        }\n\n        /// <summary>\n        /// Get ButtonState of Unity's Input manager. Does not support 'consume'.\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <param name=\"consume\"></param>\n        /// <returns></returns>\n        ButtonState IInputDevice.GetButtonState(string id, bool consume)\n        {\n            return this.GetButtonState(id);\n        }\n\n        public Vector2 GetCursorState(string id)\n        {\n            return Vector2.zero;\n        }\n        \n        public Vector2 GetDualAxleState(string id)\n        {\n            return Vector2.zero;\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Legacy/UnityInputSignatures.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System;\n\nnamespace com.spacepuppy.SPInput.Legacy\n{\n\n    public class ButtonInputSignature : BaseInputSignature, IButtonInputSignature\n    {\n\n        #region Fields\n\n        private ButtonState _current;\n        private ButtonState _currentFixed;\n        private float _lastDown;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public ButtonInputSignature(string id, string unityInputId)\n            : base(id)\n        {\n            this.UnityInputId = unityInputId;\n        }\n        \n        #endregion\n\n        #region Properties\n\n        public string UnityInputId\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IButtonInputSignature Interface\n\n        public ButtonState CurrentState\n        {\n            get\n            {\n                if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n                {\n                    return _currentFixed;\n                }\n                else\n                {\n                    return _current;\n                }\n            }\n        }\n\n        public ButtonState GetCurrentState(bool getFixedState)\n        {\n            return (getFixedState) ? _currentFixed : _current;\n        }\n\n        public void Consume()\n        {\n            if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n            {\n                _currentFixed = InputUtil.ConsumeButtonState(_currentFixed);\n            }\n            else\n            {\n                _current = InputUtil.ConsumeButtonState(_current);\n            }\n        }\n\n        public float LastDownTime\n        {\n            get { return _lastDown; }\n        }\n\n        #endregion\n\n        #region IInputSignature Interfacce\n        \n        public override void Update()\n        {\n            //determine based on history\n            _current = InputUtil.GetNextButtonState(_current, Input.GetButton(this.UnityInputId));\n            if (_current == ButtonState.Down)\n                _lastDown = Time.realtimeSinceStartup;\n        }\n\n        public override void FixedUpdate()\n        {\n            //determine based on history\n            _currentFixed = InputUtil.GetNextButtonState(_currentFixed, Input.GetButton(this.UnityInputId));\n        }\n\n        public override void Reset()\n        {\n            _current = ButtonState.None;\n            _currentFixed = ButtonState.None;\n            _lastDown = 0f;\n        }\n\n        #endregion\n\n    }\n\n    public class AxleInputSignature : BaseInputSignature, IAxleInputSignature\n    {\n\n        #region Fields\n\n        //private float _current;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public AxleInputSignature(string id, string unityInputId)\n            : base(id)\n        {\n            this.UnityInputId = unityInputId;\n        }\n        \n        #endregion\n\n        #region Properties\n\n        public string UnityInputId\n        {\n            get;\n            set;\n        }\n\n        public DeadZoneCutoff Cutoff\n        {\n            get;\n            set;\n        }\n\n        public bool Invert\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IAxleInputSignature Interface\n\n        public float CurrentState\n        {\n            get\n            {\n                //return _current;\n\n                var v = Input.GetAxis(this.UnityInputId);\n                if (this.Invert) v *= -1;\n                return InputUtil.CutoffAxis(v, this.DeadZone, this.Cutoff);\n            }\n        }\n\n        public float DeadZone\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IInputSignature Interfacce\n        \n        public override void Update()\n        {\n            /*\n            var v = Input.GetAxis(this.UnityInputId);\n            if (this.Invert) v *= -1;\n            _current = InputUtil.CutoffAxis(v, this.DeadZone, this.Cutoff);\n            */\n        }\n\n        public override void Reset()\n        {\n        }\n\n        #endregion\n\n    }\n\n    /// <summary>\n    /// Dual mode input signature. It allows for axes to act like a button. It behaves exactly as an AxleInputSignature, \n    /// but will return appropriate values when treated as a button. Very useful if you have dual inputs for the same \n    /// action that should act like buttons. For instance both pressing up on left stick, or pressing A to jump.\n    /// </summary>\n    public class AxleButtonInputSignature : AxleInputSignature, IButtonInputSignature\n    {\n\n        #region Fields\n\n        private ButtonState _current;\n        private ButtonState _currentFixed;\n        private float _lastDown;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public AxleButtonInputSignature(string id, string unityInputId, AxleValueConsideration consideration = AxleValueConsideration.Positive, float axisButtnDeadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE)\n            : base(id, unityInputId)\n        {\n            this.AxisButtonDeadZone = axisButtnDeadZone;\n            this.Consideration = consideration;\n        }\n\n        #endregion\n\n        #region Properties\n\n        /// <summary>\n        /// If input is treated as a axis-button, where is the dead-zone of the button. As opposed to the axes' DeadZone.\n        /// </summary>\n        public float AxisButtonDeadZone\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// How should we consider the value returned for the axis.\n        /// </summary>\n        public AxleValueConsideration Consideration\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IButtonInputSignature Interface\n\n        public new ButtonState CurrentState\n        {\n            get\n            {\n                if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n                {\n                    return _currentFixed;\n                }\n                else\n                {\n                    return _current;\n                }\n            }\n        }\n\n        public ButtonState GetCurrentState(bool getFixedState)\n        {\n            return (getFixedState) ? _currentFixed : _current;\n        }\n\n        public void Consume()\n        {\n            if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n            {\n                _currentFixed = InputUtil.ConsumeButtonState(_currentFixed);\n            }\n            else\n            {\n                _current = InputUtil.ConsumeButtonState(_current);\n            }\n        }\n\n        public float LastDownTime\n        {\n            get { return _lastDown; }\n        }\n\n        #endregion\n\n        #region IInputSignature Interfacce\n\n        public override void Update()\n        {\n            base.Update();\n            ////determine based on history\n            //_current = InputUtil.GetNextButtonState(_current, Input.GetButton(this.UnityInputId) || Input.GetAxis(this.UnityInputId) >= this.AxisButtonDeadZone);\n\n            switch (this.Consideration)\n            {\n                case AxleValueConsideration.Positive:\n                    _current = InputUtil.GetNextButtonState(_current, Input.GetAxis(this.UnityInputId) >= this.AxisButtonDeadZone);\n                    break;\n                case AxleValueConsideration.Negative:\n                    _current = InputUtil.GetNextButtonState(_current, Input.GetAxis(this.UnityInputId) <= -this.AxisButtonDeadZone);\n                    break;\n                case AxleValueConsideration.Absolute:\n                    //_current = InputUtil.GetNextButtonState(_current, Input.GetButton(this.UnityInputId) || Mathf.Abs(Input.GetAxis(this.UnityInputId)) >= this.AxisButtonDeadZone);\n                    _current = InputUtil.GetNextButtonState(_current, Mathf.Abs(Input.GetAxis(this.UnityInputId)) >= this.AxisButtonDeadZone);\n                    break;\n            }\n\n            if (_current == ButtonState.Down)\n                _lastDown = Time.realtimeSinceStartup;\n        }\n\n        public override void FixedUpdate()\n        {\n            base.FixedUpdate();\n            //_currentFixed = InputUtil.GetNextButtonState(_currentFixed, Input.GetButton(this.UnityInputId) || Input.GetAxis(this.UnityInputId) >= this.AxisButtonDeadZone);\n\n            switch (this.Consideration)\n            {\n                case AxleValueConsideration.Positive:\n                    //_currentFixed = InputUtil.GetNextButtonState(_currentFixed, Input.GetButton(this.UnityInputId) || Input.GetAxis(this.UnityInputId) >= this.AxisButtonDeadZone);\n                    _currentFixed = InputUtil.GetNextButtonState(_currentFixed, Input.GetAxis(this.UnityInputId) >= this.AxisButtonDeadZone);\n                    break;\n                case AxleValueConsideration.Negative:\n                    //_currentFixed = InputUtil.GetNextButtonState(_currentFixed, Input.GetButton(this.UnityInputId) || Input.GetAxis(this.UnityInputId) <= -this.AxisButtonDeadZone);\n                    _currentFixed = InputUtil.GetNextButtonState(_currentFixed, Input.GetAxis(this.UnityInputId) <= -this.AxisButtonDeadZone);\n                    break;\n                case AxleValueConsideration.Absolute:\n                    //_currentFixed = InputUtil.GetNextButtonState(_currentFixed, Input.GetButton(this.UnityInputId) || Mathf.Abs(Input.GetAxis(this.UnityInputId)) >= this.AxisButtonDeadZone);\n                    _currentFixed = InputUtil.GetNextButtonState(_currentFixed, Mathf.Abs(Input.GetAxis(this.UnityInputId)) >= this.AxisButtonDeadZone);\n                    break;\n            }\n        }\n\n        public override void Reset()\n        {\n            base.Reset();\n\n            _current = ButtonState.None;\n            _currentFixed = ButtonState.None;\n            _lastDown = 0f;\n        }\n\n        #endregion\n\n    }\n\n    public class DualAxleInputSignature : BaseInputSignature, IDualAxleInputSignature\n    {\n\n        #region Fields\n\n        private string _xAxisId;\n        private string _yAxisId;\n\n        //private Vector2 _current;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public DualAxleInputSignature(string id, string xAxisId, string yAxisId)\n            : base(id)\n        {\n            _xAxisId = xAxisId;\n            _yAxisId = yAxisId;\n        }\n        \n        #endregion\n\n        #region Properties\n\n        public string XAxisId\n        {\n            get { return _xAxisId; }\n            set { _xAxisId = value; }\n        }\n\n        public string YAxisId\n        {\n            get { return _yAxisId; }\n            set { _yAxisId = value; }\n        }\n\n        public DeadZoneCutoff Cutoff\n        {\n            get;\n            set;\n        }\n\n        public float RadialDeadZone\n        {\n            get;\n            set;\n        }\n\n        public DeadZoneCutoff RadialCutoff\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// If you accept keyboard/button input as opposed to analogue input, the values that come out are not radial in nature. \n        /// This will ensure that the button/keyboard inputs acts similar to a joystick.\n        /// </summary>\n        public bool RadialNormalizeButtonInput\n        {\n            get;\n            set;\n        }\n\n        public bool InvertX\n        {\n            get;\n            set;\n        }\n        \n        public bool InvertY\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IDualAxleInputSignature Interface\n\n        public Vector2 CurrentState\n        {\n            get\n            {\n                //return _current;\n                Vector2 v = new Vector2(Input.GetAxis(_xAxisId), Input.GetAxis(_yAxisId));\n                if (this.InvertX) v.x = -v.x;\n                if (this.InvertY) v.y = -v.y;\n                if (this.RadialNormalizeButtonInput && (Input.GetButton(_xAxisId) || Input.GetButton(_yAxisId)))\n                {\n                    if (v.sqrMagnitude > 1f) v.Normalize();\n                }\n                return InputUtil.CutoffDualAxis(v, this.DeadZone, this.Cutoff, this.RadialDeadZone, this.RadialCutoff);\n            }\n        }\n\n        public float DeadZone\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IInputSignature Interface\n        \n        public override void Update()\n        {\n            /*\n            Vector2 v = new Vector2(Input.GetAxis(_xAxisId), Input.GetAxis(_yAxisId));\n            if (this.RadialNormalizeButtonInput && (Input.GetButton(_xAxisId) || Input.GetButton(_yAxisId)))\n            {\n                if (v.sqrMagnitude > 1f) v.Normalize();\n            }\n            _current = InputUtil.CutoffDualAxis(v, this.DeadZone, this.Cutoff, this.RadialDeadZone, this.RadialCutoff);\n            */\n        }\n\n        public override void Reset()\n        {\n        }\n\n        #endregion\n\n    }\n\n    /// <summary>\n    /// Dual mode input signature. It allows for dual axes to act like a button. It behaves exactly as a DelegateDualAxleInputSignature, \n    /// but will return ButtonStates based on the magnitude from center. Very useful if you want to know if the user popped their dual axes. \n    /// </summary>\n    public class DualAxleButtonInputSignature : DualAxleInputSignature, IButtonInputSignature\n    {\n\n        #region Fields\n\n        private ButtonState _current;\n        private ButtonState _currentFixed;\n        private float _lastDown;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public DualAxleButtonInputSignature(string id, string xAxisId, string yAxisId, float axisButtnDeadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE)\n            : base(id, xAxisId, yAxisId)\n        {\n            this.AxisButtonDeadZone = axisButtnDeadZone;\n        }\n\n        #endregion\n\n        #region Properties\n\n        /// <summary>\n        /// If input is treated as a axis-button, where is the dead-zone of the button. As opposed to the axes' DeadZone.\n        /// </summary>\n        public float AxisButtonDeadZone\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IButtonInputSignature Interface\n\n        public new ButtonState CurrentState\n        {\n            get\n            {\n                if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n                {\n                    return _currentFixed;\n                }\n                else\n                {\n                    return _current;\n                }\n            }\n        }\n\n        public ButtonState GetCurrentState(bool getFixedState)\n        {\n            return (getFixedState) ? _currentFixed : _current;\n        }\n\n        public void Consume()\n        {\n            if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n            {\n                _currentFixed = InputUtil.ConsumeButtonState(_currentFixed);\n            }\n            else\n            {\n                _current = InputUtil.ConsumeButtonState(_current);\n            }\n        }\n\n        public float LastDownTime\n        {\n            get { return _lastDown; }\n        }\n\n        #endregion\n\n        #region IInputSignature Interfacce\n\n        public override void Update()\n        {\n            base.Update();\n\n            float v = base.CurrentState.sqrMagnitude;\n            float dz = this.AxisButtonDeadZone;\n            _current = InputUtil.GetNextButtonState(_current, v >= (dz * dz));\n\n            if (_current == ButtonState.Down)\n                _lastDown = Time.realtimeSinceStartup;\n        }\n\n        public override void FixedUpdate()\n        {\n            base.FixedUpdate();\n\n            float v = base.CurrentState.sqrMagnitude;\n            float dz = this.AxisButtonDeadZone;\n            _currentFixed = InputUtil.GetNextButtonState(_currentFixed, v >= (dz * dz));\n        }\n\n        public override void Reset()\n        {\n            base.Reset();\n\n            _current = ButtonState.None;\n            _currentFixed = ButtonState.None;\n            _lastDown = 0f;\n        }\n\n        #endregion\n\n    }\n\n    public class MouseCursorInputSignature : BaseInputSignature, ICursorInputSignature\n    {\n\n\n        public MouseCursorInputSignature(string id)\n            : base(id)\n        {\n\n        }\n        \n\n\n\n        public Vector2 CurrentState\n        {\n            get\n            {\n                return Input.mousePosition;\n            }\n        }\n        \n        public override void Update()\n        {\n            //do nothing\n        }\n\n        public override void Reset()\n        {\n        }\n\n    }\n\n    public class MouseClickInputSignature : BaseInputSignature, IButtonInputSignature\n    {\n\n        #region Fields\n\n        private ButtonState _current;\n        private ButtonState _currentFixed;\n        private float _lastDown;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public MouseClickInputSignature(string id, int mouseButton)\n            : base(id)\n        {\n            this.MouseButton = mouseButton;\n        }\n        \n        #endregion\n\n        #region Properties\n\n        public int MouseButton\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IButtonInputSignature Interface\n\n        public ButtonState CurrentState\n        {\n            get\n            {\n                if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n                {\n                    return _currentFixed;\n                }\n                else\n                {\n                    return _current;\n                }\n            }\n        }\n\n        public ButtonState GetCurrentState(bool getFixedState)\n        {\n            return (getFixedState) ? _currentFixed : _current;\n        }\n\n        public void Consume()\n        {\n            if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n            {\n                _currentFixed = InputUtil.ConsumeButtonState(_currentFixed);\n            }\n            else\n            {\n                _current = InputUtil.ConsumeButtonState(_current);\n            }\n        }\n\n        public float LastDownTime\n        {\n            get { return _lastDown; }\n        }\n\n        #endregion\n\n        #region IInputSignature Interfacce\n\n        public bool Active\n        {\n            get\n            {\n                return this.CurrentState > ButtonState.None;\n            }\n        }\n\n        public override void Update()\n        {\n            //determine based on history\n            _current = InputUtil.GetNextButtonState(_current, Input.GetMouseButton(this.MouseButton));\n\n            if (_current == ButtonState.Down)\n                _lastDown = Time.realtimeSinceStartup;\n        }\n\n        public override void FixedUpdate()\n        {\n            //determine based on history\n            _currentFixed = InputUtil.GetNextButtonState(_currentFixed, Input.GetMouseButton(this.MouseButton));\n        }\n\n        public override void Reset()\n        {\n            _current = ButtonState.None;\n            _currentFixed = ButtonState.None;\n            _lastDown = 0f;\n        }\n\n        #endregion\n\n    }\n\n    public class KeyboardButtonInputSignature : BaseInputSignature, IButtonInputSignature\n    {\n\n        #region Fields\n\n        private ButtonState _current;\n        private ButtonState _currentFixed;\n        private float _lastDown;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public KeyboardButtonInputSignature(string id, KeyCode key)\n            : base(id)\n        {\n            this.Key = key;\n        }\n        \n        #endregion\n\n        #region Properties\n\n        public KeyCode Key\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IButtonInputSignature Interface\n\n        public ButtonState CurrentState\n        {\n            get\n            {\n                if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n                {\n                    return _currentFixed;\n                }\n                else\n                {\n                    return _current;\n                }\n            }\n        }\n\n        public ButtonState GetCurrentState(bool getFixedState)\n        {\n            return (getFixedState) ? _currentFixed : _current;\n        }\n\n        public void Consume()\n        {\n            if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n            {\n                _currentFixed = InputUtil.ConsumeButtonState(_currentFixed);\n            }\n            else\n            {\n                _current = InputUtil.ConsumeButtonState(_current);\n            }\n        }\n\n        public float LastDownTime\n        {\n            get { return _lastDown; }\n        }\n\n        #endregion\n\n        #region IInputSignature Interfacce\n\n        public override void Update()\n        {\n            ////use classic way of determining\n            //if (Input.GetKeyDown(this.Key))\n            //    _current = ButtonState.Down;\n            //else if (Input.GetKeyUp(this.Key))\n            //    _current = ButtonState.Released;\n            //else if (Input.GetKey(this.Key))\n            //    _current = ButtonState.Held;\n            //else\n            //    _current = ButtonState.None;\n\n\n            //determine based on history\n            _current = InputUtil.GetNextButtonState(_current, Input.GetKey(this.Key));\n\n            if (_current == ButtonState.Down)\n                _lastDown = Time.realtimeSinceStartup;\n        }\n\n        public override void FixedUpdate()\n        {\n            _currentFixed = InputUtil.GetNextButtonState(_currentFixed, Input.GetKey(this.Key));\n        }\n\n        public override void Reset()\n        {\n            _current = ButtonState.None;\n            _currentFixed = ButtonState.None;\n            _lastDown = 0f;\n        }\n\n        #endregion\n\n    }\n\n    public class KeyboardAxleInputSignature : BaseInputSignature, IAxleInputSignature\n    {\n\n        #region Fields\n        \n        //private float _state;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public KeyboardAxleInputSignature(string id, KeyCode positiveKey, KeyCode negativeKey)\n            : base(id)\n        {\n            this.PositiveKey = positiveKey;\n            this.NegativeKey = negativeKey;\n        }\n        \n        #endregion\n\n        #region Properties\n\n        public KeyCode PositiveKey\n        {\n            get;\n            set;\n        }\n\n        public KeyCode NegativeKey\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IAxleInputSignature Interface\n\n        public float CurrentState\n        {\n            get\n            {\n                //return _state;\n\n                if (this.DeadZone > 1f) return 0f;\n\n                if (Input.GetKey(this.PositiveKey))\n                    return Input.GetKey(this.NegativeKey) ? 0f : 1f;\n                else if (Input.GetKey(this.NegativeKey))\n                    return -1f;\n                else\n                    return 0f;\n            }\n        }\n\n        public float DeadZone\n        {\n            get;\n            set;\n        }\n\n        public DeadZoneCutoff Cutoff\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IInputSignature Interfacce\n\n        public override void Update()\n        {\n            /*\n            if (Input.GetKey(this.PositiveKey))\n                _state = Input.GetKey(this.NegativeKey) ? 0f : 1f;\n            else if (Input.GetKey(this.NegativeKey))\n                _state = -1f;\n            else\n                _state = 0f;\n\n            if (this.DeadZone > 1f) _state = 0f;\n            */\n        }\n\n        public override void FixedUpdate()\n        {\n            /*\n            if (Input.GetKey(this.PositiveKey))\n                _state = Input.GetKey(this.NegativeKey) ? 0f : 1f;\n            else if (Input.GetKey(this.NegativeKey))\n                _state = -1f;\n            else\n                _state = 0f;\n\n            if (this.DeadZone > 1f) _state = 0f;\n            */\n        }\n\n        public override void Reset()\n        {\n        }\n\n        #endregion\n\n    }\n\n    public class KeyboardDualAxleInputSignature : BaseInputSignature, IDualAxleInputSignature\n    {\n\n        #region Fields\n\n        //private Vector2 _state;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public KeyboardDualAxleInputSignature(string id, KeyCode horizontalPositiveKey, KeyCode horizontalNegativeKey, KeyCode verticalPositiveKey, KeyCode verticalNegativeKey)\n            : base(id)\n        {\n            this.HorizontalPositiveKey = horizontalPositiveKey;\n            this.HorizontalNegativeKey = horizontalNegativeKey;\n            this.VerticalPositiveKey = verticalPositiveKey;\n            this.VerticalNegativeKey = verticalNegativeKey;\n        }\n        \n        #endregion\n\n        #region Properties\n\n        public KeyCode HorizontalPositiveKey\n        {\n            get;\n            set;\n        }\n\n        public KeyCode HorizontalNegativeKey\n        {\n            get;\n            set;\n        }\n\n        public KeyCode VerticalPositiveKey\n        {\n            get;\n            set;\n        }\n\n        public KeyCode VerticalNegativeKey\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IDualAxleInputSignature Interface\n\n        public Vector2 CurrentState\n        {\n            get\n            {\n                //return _state;\n\n                Vector2 result = Vector2.zero;\n                if (Input.GetKey(this.HorizontalPositiveKey))\n                    result.x = Input.GetKey(this.HorizontalNegativeKey) ? 0f : 1f;\n                else if (Input.GetKey(this.HorizontalNegativeKey))\n                    result.x = -1f;\n                else\n                    result.x = 0f;\n\n                if (Input.GetKey(this.VerticalPositiveKey))\n                    result.y = Input.GetKey(this.VerticalNegativeKey) ? 0f : 1f;\n                else if (Input.GetKey(this.VerticalNegativeKey))\n                    result.y = -1f;\n                else\n                    result.y = 0f;\n\n                return InputUtil.CutoffDualAxis(result, this.DeadZone, this.Cutoff, this.RadialDeadZone, this.RadialCutoff);\n            }\n        }\n\n        public float DeadZone\n        {\n            get;\n            set;\n        }\n\n        public DeadZoneCutoff Cutoff\n        {\n            get;\n            set;\n        }\n\n        public float RadialDeadZone\n        {\n            get;\n            set;\n        }\n\n        public DeadZoneCutoff RadialCutoff\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IInputSignature Interfacce\n\n        public override void Update()\n        {\n            /*\n            if (Input.GetKey(this.HorizontalPositiveKey))\n                _state.x = Input.GetKey(this.HorizontalNegativeKey) ? 0f : 1f;\n            else if (Input.GetKey(this.HorizontalNegativeKey))\n                _state.x = -1f;\n            else\n                _state.x = 0f;\n\n            if (Input.GetKey(this.VerticalPositiveKey))\n                _state.y = Input.GetKey(this.VerticalNegativeKey) ? 0f : 1f;\n            else if (Input.GetKey(this.VerticalNegativeKey))\n                _state.y = -1f;\n            else\n                _state.y = 0f;\n\n            _state = InputUtil.CutoffDualAxis(_state, this.DeadZone, this.Cutoff, this.RadialDeadZone, this.RadialCutoff);\n            */\n        }\n\n        public override void FixedUpdate()\n        {\n            /*\n            if (Input.GetKey(this.HorizontalPositiveKey))\n                _state.x = Input.GetKey(this.HorizontalNegativeKey) ? 0f : 1f;\n            else if (Input.GetKey(this.HorizontalNegativeKey))\n                _state.x = -1f;\n            else\n                _state.x = 0f;\n\n            if (Input.GetKey(this.VerticalPositiveKey))\n                _state.y = Input.GetKey(this.VerticalNegativeKey) ? 0f : 1f;\n            else if (Input.GetKey(this.VerticalNegativeKey))\n                _state.y = -1f;\n            else\n                _state.y = 0f;\n\n            _state = InputUtil.CutoffDualAxis(_state, this.DeadZone, this.Cutoff, this.RadialDeadZone, this.RadialCutoff);\n            */\n        }\n\n        public override void Reset()\n        {\n        }\n\n        #endregion\n\n    }\n\n    public class EmulatedAxleInputSignature : BaseInputSignature, IAxleInputSignature\n    {\n\n        #region Fields\n\n        //private float _state;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public EmulatedAxleInputSignature(string id, string positiveBtn, string negativeBtn)\n            : base(id)\n        {\n            this.PositiveButton = positiveBtn;\n            this.NegativeButton = negativeBtn;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public string PositiveButton\n        {\n            get;\n            set;\n        }\n\n        public string NegativeButton\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IAxleInputSignature Interface\n\n        public float CurrentState\n        {\n            get\n            {\n                //return _state;\n\n                if (this.DeadZone > 1f) return 0f;\n                \n                if (this.PositiveButton != null && Input.GetButton(this.PositiveButton))\n                     return (this.NegativeButton != null && Input.GetButton(this.NegativeButton)) ? 0f : 1f;\n                else if (this.NegativeButton != null && Input.GetButton(this.NegativeButton))\n                    return -1f;\n                else\n                    return 0f;\n            }\n        }\n\n        public float DeadZone\n        {\n            get;\n            set;\n        }\n\n        public DeadZoneCutoff Cutoff\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IInputSignature Interfacce\n\n        public override void Update()\n        {\n            /*\n            if (Input.GetButton(this.PositiveButton))\n                _state = Input.GetButton(this.NegativeButton) ? 0f : 1f;\n            else if (Input.GetButton(this.NegativeButton))\n                _state = -1f;\n            else\n                _state = 0f;\n\n            if (this.DeadZone > 1f) _state = 0f;\n            */\n        }\n\n        public override void FixedUpdate()\n        {\n            /*\n            if (Input.GetButton(this.PositiveButton))\n                _state = Input.GetButton(this.NegativeButton) ? 0f : 1f;\n            else if (Input.GetButton(this.NegativeButton))\n                _state = -1f;\n            else\n                _state = 0f;\n\n            if (this.DeadZone > 1f) _state = 0f;\n            */\n        }\n\n        public override void Reset()\n        {\n        }\n\n        #endregion\n\n    }\n\n    public class EmulatedDualAxleInputSignature : BaseInputSignature, IDualAxleInputSignature\n    {\n\n        #region Fields\n\n        //private Vector2 _state;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public EmulatedDualAxleInputSignature(string id, string horizontalPositiveBtn, string horizontalNegativeBtn, string verticalPositiveBtn, string verticalNegativeBtn)\n            : base(id)\n        {\n            this.HorizontalPositiveButton = horizontalPositiveBtn;\n            this.HorizontalNegativeButton = horizontalNegativeBtn;\n            this.VerticalPositiveButton = verticalPositiveBtn;\n            this.VerticalNegativeButton = verticalNegativeBtn;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public string HorizontalPositiveButton\n        {\n            get;\n            set;\n        }\n\n        public string HorizontalNegativeButton\n        {\n            get;\n            set;\n        }\n\n        public string VerticalPositiveButton\n        {\n            get;\n            set;\n        }\n\n        public string VerticalNegativeButton\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IDualAxleInputSignature Interface\n\n        public Vector2 CurrentState\n        {\n            get\n            {\n                //return _state;\n                Vector2 result = Vector2.zero;\n                if (this.HorizontalPositiveButton != null && Input.GetButton(this.HorizontalPositiveButton))\n                    result.x = (this.HorizontalNegativeButton != null && Input.GetButton(this.HorizontalNegativeButton)) ? 0f : 1f;\n                else if (this.HorizontalNegativeButton != null && Input.GetButton(this.HorizontalNegativeButton))\n                    result.x = -1f;\n                else\n                    result.x = 0f;\n\n                if (this.VerticalPositiveButton != null && Input.GetButton(this.VerticalPositiveButton))\n                    result.y = (this.VerticalNegativeButton != null && Input.GetButton(this.VerticalNegativeButton)) ? 0f : 1f;\n                else if (this.VerticalNegativeButton != null && Input.GetButton(this.VerticalNegativeButton))\n                    result.y = -1f;\n                else\n                    result.y = 0f;\n\n                return InputUtil.CutoffDualAxis(result, this.DeadZone, this.Cutoff, this.RadialDeadZone, this.RadialCutoff);\n            }\n        }\n\n        public float DeadZone\n        {\n            get;\n            set;\n        }\n\n        public DeadZoneCutoff Cutoff\n        {\n            get;\n            set;\n        }\n\n        public float RadialDeadZone\n        {\n            get;\n            set;\n        }\n\n        public DeadZoneCutoff RadialCutoff\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region IInputSignature Interfacce\n\n        public override void Update()\n        {\n            /*\n            if (Input.GetButton(this.HorizontalPositiveButton))\n                _state.x = Input.GetButton(this.HorizontalNegativeButton) ? 0f : 1f;\n            else if (Input.GetButton(this.HorizontalNegativeButton))\n                _state.x = -1f;\n            else\n                _state.x = 0f;\n\n            if (Input.GetButton(this.VerticalPositiveButton))\n                _state.y = Input.GetButton(this.VerticalNegativeButton) ? 0f : 1f;\n            else if (Input.GetButton(this.VerticalNegativeButton))\n                _state.y = -1f;\n            else\n                _state.y = 0f;\n\n            _state = InputUtil.CutoffDualAxis(_state, this.DeadZone, this.Cutoff, this.RadialDeadZone, this.RadialCutoff);\n            */\n        }\n\n        public override void FixedUpdate()\n        {\n            /*\n            if (Input.GetButton(this.HorizontalPositiveButton))\n                _state.x = Input.GetButton(this.HorizontalNegativeButton) ? 0f : 1f;\n            else if (Input.GetButton(this.HorizontalNegativeButton))\n                _state.x = -1f;\n            else\n                _state.x = 0f;\n\n            if (Input.GetButton(this.VerticalPositiveButton))\n                _state.y = Input.GetButton(this.VerticalNegativeButton) ? 0f : 1f;\n            else if (Input.GetButton(this.VerticalNegativeButton))\n                _state.y = -1f;\n            else\n                _state.y = 0f;\n\n            _state = InputUtil.CutoffDualAxis(_state, this.DeadZone, this.Cutoff, this.RadialDeadZone, this.RadialCutoff);\n            */\n        }\n\n        public override void Reset()\n        {\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/MappedInputDevice.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing UnityEngine;\n\nnamespace com.spacepuppy.SPInput\n{\n\n    /// <summary>\n    /// InputDevice based on a mapping value instead of a hash. This mapping value should usually be an enum, you can also use an int/long/etc if you want.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public class MappedInputDevice<T> : IMappedInputDevice<T> where T : struct, System.IConvertible\n    {\n\n        #region Fields\n\n        private string _id;\n        private bool _active = true;\n        private MappedInputSignatureCollection<T> _signatures;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public MappedInputDevice(string id)\n        {\n            _id = id;\n            _signatures = new MappedInputSignatureCollection<T>();\n        }\n\n        public MappedInputDevice(string id, MappedInputSignatureCollection<T> sig)\n        {\n            _id = id;\n            _signatures = sig ?? new MappedInputSignatureCollection<T>();\n        }\n\n        public MappedInputDevice(string id, IEqualityComparer<T> comparer)\n        {\n            _id = id;\n            _signatures = new MappedInputSignatureCollection<T>(comparer);\n        }\n\n        #endregion\n\n        #region Properties\n\n        public MappedInputSignatureCollection<T> InputSignatures { get { return _signatures; } }\n\n        #endregion\n\n        #region IInputSignature Interface\n\n        public string Id\n        {\n            get { return _id; }\n        }\n\n        public int Hash\n        {\n            get { return _id.GetHashCode(); }\n        }\n\n        float IInputSignature.Precedence\n        {\n            get\n            {\n                return 0f;\n            }\n            set\n            {\n                throw new System.NotImplementedException();\n            }\n        }\n        \n        public virtual void Update()\n        {\n            var e = _signatures.GetEnumerator();\n            while (e.MoveNext())\n            {\n                e.Current.Update();\n            }\n        }\n        \n        public virtual void FixedUpdate()\n        {\n            var e = _signatures.GetEnumerator();\n            while (e.MoveNext())\n            {\n                e.Current.FixedUpdate();\n            }\n        }\n\n        public virtual void Reset()\n        {\n            var e = _signatures.GetEnumerator();\n            while (e.MoveNext())\n            {\n                e.Current.Reset();\n            }\n        }\n\n        #endregion\n\n        #region IInputDevice Interface\n\n        public bool Active\n        {\n            get { return _active; }\n            set { _active = value; }\n        }\n\n        public bool AnyInputActivated\n        {\n            get\n            {\n                var e = _signatures.GetEnumerator();\n                while(e.MoveNext())\n                {\n                    if (e.Current.GetInputIsActivated()) return true;\n                }\n                return false;\n            }\n        }\n\n        public bool Contains(string id)\n        {\n            return _signatures.Contains(id);\n        }\n\n        IInputSignature IInputDevice.GetSignature(string id)\n        {\n            return _signatures.GetSignature(id);\n        }\n\n        public ButtonState GetButtonState(string id, bool consume = false)\n        {\n            if (!_active) return ButtonState.None;\n\n            var sig = _signatures.GetSignature(id);\n            if (sig is IButtonInputSignature)\n            {\n                var result = (sig as IButtonInputSignature).CurrentState;\n                if (consume) (sig as IButtonInputSignature).Consume();\n                return result;\n            }\n            else if (sig is IAxleInputSignature)\n                return (sig as IAxleInputSignature).CurrentState > InputUtil.DEFAULT_AXLEBTNDEADZONE ? ButtonState.Held : ButtonState.None;\n            else if (sig is IDualAxleInputSignature)\n                return (sig as IDualAxleInputSignature).CurrentState.sqrMagnitude > InputUtil.DEFAULT_AXLEBTNDEADZONE * InputUtil.DEFAULT_AXLEBTNDEADZONE ? ButtonState.Held : ButtonState.None;\n            else\n                return ButtonState.None;\n        }\n        \n        public float GetAxleState(string id)\n        {\n            if (!_active) return 0f;\n\n            var sig = _signatures.GetSignature(id);\n            if (sig is IAxleInputSignature)\n                return (sig as IAxleInputSignature).CurrentState;\n            else if (sig is IDualAxleInputSignature)\n                return (sig as IDualAxleInputSignature).CurrentState.x;\n            else if (sig is IButtonInputSignature)\n                return (sig as IButtonInputSignature).CurrentState > ButtonState.None ? 1f : 0f;\n            else\n                return 0f;\n        }\n\n        public Vector2 GetDualAxleState(string id)\n        {\n            if (!_active) return Vector2.zero;\n\n            var sig = _signatures.GetSignature(id);\n            if (sig is IDualAxleInputSignature)\n                return (sig as IDualAxleInputSignature).CurrentState;\n            else if (sig is IAxleInputSignature)\n                return new Vector2((sig as IAxleInputSignature).CurrentState, 0f);\n            else if (sig is IButtonInputSignature)\n                return new Vector2((sig as IButtonInputSignature).CurrentState > ButtonState.None ? 1f : 0f, 0f);\n            else\n                return Vector2.zero;\n        }\n        \n        public Vector2 GetCursorState(string id)\n        {\n            if (!_active) return Vector2.zero;\n\n            var sig = _signatures.GetSignature(id);\n            if (!(sig is ICursorInputSignature)) return Vector2.zero;\n\n            return (sig as ICursorInputSignature).CurrentState;\n        }\n        \n        #endregion\n\n        #region IMappedInputDevice Interface\n\n        IInputSignature IMappedInputDevice<T>.GetSignature(T mapping)\n        {\n            return _signatures.GetSignature(mapping);\n        }\n\n        public ButtonState GetButtonState(T mapping, bool consume = false)\n        {\n            if (!_active) return ButtonState.None;\n\n            var sig = _signatures.GetSignature(mapping);\n            if (sig is IButtonInputSignature)\n            {\n                var result = (sig as IButtonInputSignature).CurrentState;\n                if (consume) (sig as IButtonInputSignature).Consume();\n                return result;\n            }\n            else if (sig is IAxleInputSignature)\n                return (sig as IAxleInputSignature).CurrentState > InputUtil.DEFAULT_AXLEBTNDEADZONE ? ButtonState.Held : ButtonState.None;\n            else if (sig is IDualAxleInputSignature)\n                return (sig as IDualAxleInputSignature).CurrentState.sqrMagnitude > InputUtil.DEFAULT_AXLEBTNDEADZONE * InputUtil.DEFAULT_AXLEBTNDEADZONE ? ButtonState.Held : ButtonState.None;\n            else\n                return ButtonState.None;\n        }\n        \n        public float GetAxleState(T mapping)\n        {\n            if (!_active) return 0f;\n\n            var sig = _signatures.GetSignature(mapping);\n            if (sig is IAxleInputSignature)\n                return (sig as IAxleInputSignature).CurrentState;\n            else if (sig is IDualAxleInputSignature)\n                return (sig as IDualAxleInputSignature).CurrentState.x;\n            else if (sig is IButtonInputSignature)\n                return (sig as IButtonInputSignature).CurrentState > ButtonState.None ? 1f : 0f;\n            else\n                return 0f;\n        }\n\n        public Vector2 GetDualAxleState(T mapping)\n        {\n            if (!_active) return Vector2.zero;\n\n            var sig = _signatures.GetSignature(mapping);\n            if (sig is IDualAxleInputSignature)\n                return (sig as IDualAxleInputSignature).CurrentState;\n            else if (sig is IAxleInputSignature)\n                return new Vector2((sig as IAxleInputSignature).CurrentState, 0f);\n            else if (sig is IButtonInputSignature)\n                return new Vector2((sig as IButtonInputSignature).CurrentState > ButtonState.None ? 1f : 0f, 0f);\n            else\n                return Vector2.zero;\n        }\n\n        public Vector2 GetCursorState(T mapping)\n        {\n            if (!_active) return Vector2.zero;\n\n            var sig = _signatures.GetSignature(mapping);\n            if (sig == null) return Vector2.zero;\n            if (!(sig is ICursorInputSignature)) return Vector2.zero;\n\n            return (sig as ICursorInputSignature).CurrentState;\n        }\n\n        #endregion\n\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/MappedInputSignatureCollection.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy.SPInput\n{\n\n    /// <summary>\n    /// Store a group of IInputSignatures based on a mapping value instead of a hash. This mapping value should usually be an enum, you can also use an int/long/etc if you want.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public class MappedInputSignatureCollection<T> :  IInputSignatureCollection where T : struct, System.IConvertible\n    {\n\n        #region Fields\n\n        private Dictionary<T, IInputSignature> _table;\n        private List<IInputSignature> _sortedList = new List<IInputSignature>();\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public MappedInputSignatureCollection()\n        {\n            _table = new Dictionary<T, IInputSignature>();\n        }\n\n        public MappedInputSignatureCollection(IEqualityComparer<T> comparer)\n        {\n            _table = new Dictionary<T, IInputSignature>(comparer);\n        }\n\n        #endregion\n\n        #region Properties\n\n        public IEqualityComparer<T> Comparer\n        {\n            get { return _table.Comparer; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public void Add(T mapping, IInputSignature item)\n        {\n            if (item == null) throw new System.ArgumentNullException(\"item\");\n            if (_table.ContainsKey(mapping)) throw new System.ArgumentException(\"A signature already exists with this mapping.\", \"item\");\n            \n            _table[mapping] = item;\n            _sortedList.Add(item);\n        }\n\n        public bool Remove(T mapping)\n        {\n            IInputSignature sig;\n            if(_table.TryGetValue(mapping, out sig))\n            {\n                _table.Remove(mapping);\n                _sortedList.Remove(sig);\n                return true;\n            }\n\n            return false;\n        }\n\n        public IInputSignature GetSignature(T mapping)\n        {\n            IInputSignature result;\n            if (_table.TryGetValue(mapping, out result) && result != null)\n            {\n                return result;\n            }\n            return null;\n        }\n\n        public bool Contains(T mapping)\n        {\n            return _table.ContainsKey(mapping);\n        }\n\n        public Enumerator GetEnumerator()\n        {\n            return new Enumerator(this);\n        }\n\n        #endregion\n\n        #region IInputSignatureCollection Interface\n\n        public virtual IInputSignature GetSignature(string id)\n        {\n            var e = _table.GetEnumerator();\n            while (e.MoveNext())\n            {\n                if (e.Current.Value.Id == id) return e.Current.Value;\n            }\n            return null;\n        }\n\n        public virtual bool Contains(string id)\n        {\n            var e = _table.GetEnumerator();\n            while (e.MoveNext())\n            {\n                if (e.Current.Value.Id == id) return true;\n            }\n            return false;\n        }\n\n        public virtual bool Remove(string id)\n        {\n            var e = _table.GetEnumerator();\n            while (e.MoveNext())\n            {\n                if (e.Current.Value.Id == id)\n                {\n                    _table.Remove(e.Current.Key);\n                    _sortedList.Remove(e.Current.Value);\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        public void Sort()\n        {\n            _sortedList.Sort(SortOnPrecedence);\n        }\n\n        #endregion\n\n        #region ICollection Interface\n\n        public int Count\n        {\n            get { return _table.Count; }\n        }\n\n        void ICollection<IInputSignature>.Add(IInputSignature item)\n        {\n            throw new System.NotSupportedException();\n        }\n\n        public void Clear()\n        {\n            _table.Clear();\n            _sortedList.Clear();\n        }\n\n        public bool Contains(IInputSignature item)\n        {\n            return _sortedList.Contains(item);\n        }\n\n        public void CopyTo(IInputSignature[] array, int arrayIndex)\n        {\n            _sortedList.CopyTo(array, arrayIndex);\n        }\n\n        bool ICollection<IInputSignature>.IsReadOnly\n        {\n            get { return false; }\n        }\n\n        public bool Remove(IInputSignature item)\n        {\n            var e = _table.GetEnumerator();\n            while (e.MoveNext())\n            {\n                if (e.Current.Value == item)\n                {\n                    if (_table.Remove(e.Current.Key))\n                    {\n                        _sortedList.Remove(item);\n                        return true;\n                    }\n                    else\n                        return false;\n                }\n            }\n\n            return false;\n        }\n\n        IEnumerator<IInputSignature> IEnumerable<IInputSignature>.GetEnumerator()\n        {\n            return this.GetEnumerator();\n        }\n\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n        {\n            return this.GetEnumerator();\n        }\n\n        #endregion\n\n        #region Special Types\n\n        public struct Enumerator : IEnumerator<IInputSignature>\n        {\n\n            private List<IInputSignature>.Enumerator _e;\n\n            public Enumerator(MappedInputSignatureCollection<T> coll)\n            {\n                if (coll == null) throw new System.ArgumentNullException(\"coll\");\n                _e = coll._sortedList.GetEnumerator();\n            }\n\n            public IInputSignature Current\n            {\n                get { return _e.Current; }\n            }\n\n            object System.Collections.IEnumerator.Current\n            {\n                get { return _e.Current; }\n            }\n\n            public bool MoveNext()\n            {\n                return _e.MoveNext();\n            }\n\n            void System.Collections.IEnumerator.Reset()\n            {\n                (_e as System.Collections.IEnumerator).Reset();\n            }\n\n            public void Dispose()\n            {\n                _e.Dispose();\n            }\n        }\n\n        #endregion\n\n        #region Sort Methods\n\n        private static System.Comparison<IInputSignature> _sortOnPrecedence;\n        private static System.Comparison<IInputSignature> SortOnPrecedence\n        {\n            get\n            {\n                if (_sortOnPrecedence == null)\n                {\n                    _sortOnPrecedence = (a, b) =>\n                    {\n                        if (a.Precedence > b.Precedence)\n                            return 1;\n                        if (a.Precedence < b.Precedence)\n                            return -1;\n                        else\n                            return 0;\n                    };\n                }\n                return _sortOnPrecedence;\n            }\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/MergedInputSignature.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Collections;\n\nnamespace com.spacepuppy.SPInput\n{\n\n    /// <summary>\n    /// This allows multiple input signatures to register for a single input id. So say 2 buttons can perform the same action. \n    /// The order of precedence is in the order of the signatures in the list.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public abstract class MergedInputSignature<T> : BaseInputSignature where T : IInputSignature\n    {\n\n        #region Fields\n\n        private UniqueList<T> _signatures = new UniqueList<T>();\n\n        #endregion\n\n        #region CONSTRUCTOR\n        \n        public MergedInputSignature(string id)\n            : base(id)\n        {\n        }\n        \n        #endregion\n\n        #region Properties\n\n        public IList<T> Signatures { get { return _signatures; } }\n\n        #endregion\n\n        #region Methods\n\n        public override void Update()\n        {\n            for(int i = 0; i < _signatures.Count; i++)\n            {\n                _signatures[i].Update();\n            }\n        }\n\n        public override void FixedUpdate()\n        {\n            base.FixedUpdate();\n\n            for(int i = 0; i < _signatures.Count; i++)\n            {\n                _signatures[i].FixedUpdate();\n            }\n        }\n\n        public override void Reset()\n        {\n            for (int i = 0; i < _signatures.Count; i++)\n            {\n                _signatures[i].Reset();\n            }\n        }\n\n        #endregion\n\n    }\n\n    public class MergedButtonInputSignature : MergedInputSignature<IButtonInputSignature>, IButtonInputSignature\n    {\n\n        private ButtonState _current;\n        private ButtonState _currentFixed;\n        private float _lastDown;\n\n        #region CONSTRUCTOR\n\n        public MergedButtonInputSignature(string id)\n            : base(id)\n        {\n        }\n\n        public MergedButtonInputSignature(string id, IButtonInputSignature a, IButtonInputSignature b)\n            : base(id)\n        {\n            this.Signatures.Add(a);\n            this.Signatures.Add(b);\n        }\n\n        #endregion\n\n        public ButtonState CurrentState\n        {\n            get\n            {\n                if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n                {\n                    return _currentFixed;\n                }\n                else\n                {\n                    return _current;\n                }\n            }\n        }\n\n        public ButtonState GetCurrentState(bool getFixedState)\n        {\n            return (getFixedState) ? _currentFixed : _current;\n        }\n\n        public void Consume()\n        {\n            if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n            {\n                _currentFixed = InputUtil.ConsumeButtonState(_currentFixed);\n            }\n            else\n            {\n                _current = InputUtil.ConsumeButtonState(_current);\n            }\n        }\n\n        public float LastDownTime\n        {\n            get { return _lastDown; }\n        }\n\n        public override void Update()\n        {\n            base.Update();\n\n            bool down = false;\n            for(int i = 0; i < this.Signatures.Count; i++)\n            {\n                if(this.Signatures[i].GetCurrentState(false) >= ButtonState.Down)\n                {\n                    down = true;\n                    break;\n                }\n            }\n            _current = InputUtil.GetNextButtonState(_current, down);\n\n            if (_current == ButtonState.Down)\n                _lastDown = Time.realtimeSinceStartup;\n        }\n\n        public override void FixedUpdate()\n        {\n            base.FixedUpdate();\n\n            bool down = false;\n            for (int i = 0; i < this.Signatures.Count; i++)\n            {\n                if (this.Signatures[i].GetCurrentState(true) >= ButtonState.Down)\n                {\n                    down = true;\n                    break;\n                }\n            }\n            _currentFixed = InputUtil.GetNextButtonState(_currentFixed, down);\n        }\n\n        public override void Reset()\n        {\n            base.Reset();\n\n            _current = ButtonState.None;\n            _currentFixed = ButtonState.None;\n            _lastDown = 0f;\n        }\n\n    }\n\n    public class MergedAxleInputSignature : MergedInputSignature<IAxleInputSignature>, IAxleInputSignature\n    {\n\n        private MergedAxlePrecedence _axlePrecedence;\n        \n        #region CONSTRUCTOR\n        \n        public MergedAxleInputSignature(string id)\n            : base(id)\n        {\n        }\n\n        public MergedAxleInputSignature(string id, IAxleInputSignature a, IAxleInputSignature b)\n            : base(id)\n        {\n            this.Signatures.Add(a);\n            this.Signatures.Add(b);\n        }\n\n        #endregion\n\n        public float DeadZone\n        {\n            get;\n            set;\n        }\n\n        public DeadZoneCutoff Cutoff\n        {\n            get;\n            set;\n        }\n\n        public MergedAxlePrecedence AxlePrecedence\n        {\n            get { return _axlePrecedence; }\n            set { _axlePrecedence = value; }\n        }\n\n        public float CurrentState\n        {\n            get\n            {\n                float result = 0f;\n                switch(_axlePrecedence)\n                {\n                    case MergedAxlePrecedence.FirstActive:\n                        for (int i = 0; i < this.Signatures.Count; i++)\n                        {\n                            if (this.Signatures[i].CurrentState > 0f) result = this.Signatures[i].CurrentState;\n                        }\n                        break;\n                    case MergedAxlePrecedence.LastActive:\n                        for (int i = this.Signatures.Count - 1; i >= 0; i--)\n                        {\n                            if (this.Signatures[i].CurrentState > 0f) result = this.Signatures[i].CurrentState;\n                        }\n                        break;\n                    case MergedAxlePrecedence.Largest:\n                        if (this.Signatures.Count > 0)\n                        {\n                            result = 0f;\n                            for (int i = 0; i < this.Signatures.Count; i++)\n                            {\n                                if (this.Signatures[i].CurrentState > result) result = this.Signatures[i].CurrentState;\n                            }\n                        }\n                        break;\n                    case MergedAxlePrecedence.Smallest:\n                        if(this.Signatures.Count > 0)\n                        {\n                            result = this.Signatures[0].CurrentState;\n                            for (int i = 1; i < this.Signatures.Count; i++)\n                            {\n                                if (this.Signatures[i].CurrentState < result) result = this.Signatures[i].CurrentState;\n                            }\n                        }\n                        break;\n                }\n\n                return InputUtil.CutoffAxis(result, this.DeadZone, this.Cutoff);\n            }\n        }\n    }\n\n    public class MergedDualAxleInputSignature : MergedInputSignature<IDualAxleInputSignature>, IDualAxleInputSignature\n    {\n        \n        private MergedAxlePrecedence _axlePrecedence;\n        \n        #region CONSTRUCTOR\n        \n        public MergedDualAxleInputSignature(string id)\n            : base(id)\n        {\n        }\n\n        public MergedDualAxleInputSignature(string id, IDualAxleInputSignature a, IDualAxleInputSignature b)\n            : base(id)\n        {\n            this.Signatures.Add(a);\n            this.Signatures.Add(b);\n        }\n\n        #endregion\n\n        public float DeadZone\n        {\n            get;\n            set;\n        }\n\n        public DeadZoneCutoff Cutoff\n        {\n            get;\n            set;\n        }\n\n        public float RadialDeadZone\n        {\n            get;\n            set;\n        }\n\n        public DeadZoneCutoff RadialCutoff\n        {\n            get;\n            set;\n        }\n\n        public MergedAxlePrecedence AxlePrecedence\n        {\n            get { return _axlePrecedence; }\n            set { _axlePrecedence = value; }\n        }\n\n        public Vector2 CurrentState\n        {\n            get\n            {\n                const float EPSILON = 0.0001f;\n                Vector2 result = Vector2.zero;\n                switch (_axlePrecedence)\n                {\n                    case MergedAxlePrecedence.FirstActive:\n                        for (int i = 0; i < this.Signatures.Count; i++)\n                        {\n                            if (this.Signatures[i].CurrentState.sqrMagnitude > EPSILON) result = this.Signatures[i].CurrentState;\n                        }\n                        break;\n                    case MergedAxlePrecedence.LastActive:\n                        for (int i = this.Signatures.Count - 1; i >= 0; i--)\n                        {\n                            if (this.Signatures[i].CurrentState.sqrMagnitude > EPSILON) result = this.Signatures[i].CurrentState;\n                        }\n                        break;\n                    case MergedAxlePrecedence.Largest:\n                        if (this.Signatures.Count > 0)\n                        {\n                            float mag = 0f;\n                            for (int i = 0; i < this.Signatures.Count; i++)\n                            {\n                                if (this.Signatures[i].CurrentState.sqrMagnitude > mag)\n                                {\n                                    result = this.Signatures[i].CurrentState;\n                                    mag = result.sqrMagnitude;\n                                }\n                            }\n                        }\n                        break;\n                    case MergedAxlePrecedence.Smallest:\n                        if (this.Signatures.Count > 0)\n                        {\n                            result = this.Signatures[0].CurrentState;\n                            float mag = 0f;\n                            for (int i = 1; i < this.Signatures.Count; i++)\n                            {\n                                if (this.Signatures[i].CurrentState.sqrMagnitude < result.sqrMagnitude)\n                                {\n                                    result = this.Signatures[i].CurrentState;\n                                    mag = result.sqrMagnitude;\n                                }\n                            }\n                        }\n                        break;\n                }\n\n                return InputUtil.CutoffDualAxis(result, this.DeadZone, this.Cutoff, this.RadialDeadZone, this.RadialCutoff);\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/RepeatingButtonInputSignature.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.SPInput\n{\n\n    /// <summary>\n    /// Creates a button signature that repeats the 'Down' signal as it is held.\n    /// \n    /// Note, only works for Update and not FixedUpdate.\n    /// </summary>\n    public class RepeatingButtonInputSignature : BaseInputSignature, IButtonInputSignature\n    {\n\n        #region Fields\n\n        private ButtonDelegate _button;\n        private float _firstRepeatDelay;\n        private float _repeatDelay;\n        private float _repeatLerp;\n        private float _maxRepeat;\n\n        private ButtonState _current;\n        private ButtonState _currentFixed;\n        private float _lastDown;\n\n        private float _delay;\n        private int _repeatCount;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public RepeatingButtonInputSignature(string id)\n            : base(id)\n        {\n        }\n\n        public RepeatingButtonInputSignature(string id, ButtonDelegate btn, float repeatDelay)\n            : base(id)\n        {\n            _button = btn;\n            this.FirstRepeatDelay = repeatDelay;\n            this.RepeatDelay = repeatDelay;\n            this.RepeatLerp = 0f;\n            this.MaxRepeat = repeatDelay;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public ButtonDelegate ButtonDelegate\n        {\n            get { return _button; }\n            set { _button = value; }\n        }\n\n        /// <summary>\n        /// How long to wait before the first repeat should occur.\n        /// </summary>\n        public float FirstRepeatDelay\n        {\n            get { return _firstRepeatDelay; }\n            set { _firstRepeatDelay = Mathf.Max(0f, value); }\n        }\n\n        /// <summary>\n        /// How long to wait between each repeat after the first.\n        /// </summary>\n        public float RepeatDelay\n        {\n            get { return _repeatDelay; }\n            set { _repeatDelay = Mathf.Max(0f, value); }\n        }\n\n        /// <summary>\n        /// Set to a value &gt 0 to have the RepeatRate scale over time.\n        /// </summary>\n        public float RepeatLerp\n        {\n            get { return _repeatLerp; }\n            set { _repeatLerp = Mathf.Clamp01(value); }\n        }\n\n        /// <summary>\n        /// The value that RepeatRate scales towards over time if RepeatLerp is &gt 0.\n        /// </summary>\n        public float MaxRepeat\n        {\n            get { return _maxRepeat; }\n            set { _maxRepeat = Mathf.Max(0f, value); }\n        }\n\n        /// <summary>\n        /// Number of times the Down signal has repeated since last official down.\n        /// </summary>\n        public int CurrentRepeatCount\n        {\n            get { return _repeatCount; }\n        }\n\n        #endregion\n\n        #region IButtonInputSignature Interface\n\n        public ButtonState CurrentState\n        {\n            get\n            {\n                if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n                {\n                    return _currentFixed;\n                }\n                else\n                {\n                    return _current;\n                }\n            }\n        }\n\n        public ButtonState GetCurrentState(bool getFixedState)\n        {\n            return (getFixedState) ? _currentFixed : _current;\n        }\n\n        public void Consume()\n        {\n            if (GameLoopEntry.CurrentSequence == UpdateSequence.FixedUpdate)\n            {\n                _currentFixed = InputUtil.ConsumeButtonState(_currentFixed);\n            }\n            else\n            {\n                _current = InputUtil.ConsumeButtonState(_current);\n            }\n        }\n\n        public float LastDownTime\n        {\n            get { return _lastDown; }\n        }\n\n        #endregion\n\n        #region IInputSignature Interfacce\n\n        public override void Update()\n        {\n            //determine based on history\n            _current = InputUtil.GetNextButtonState(_current, _button != null ? _button() : false);\n            if (_current == ButtonState.Down)\n            {\n                _lastDown = Time.realtimeSinceStartup;\n                _delay = _firstRepeatDelay;\n                _repeatCount = 0;\n            }\n            else if (_current == ButtonState.Held && Time.realtimeSinceStartup - _lastDown > _repeatDelay)\n            {\n                _current = ButtonState.Down;\n                _lastDown = Time.realtimeSinceStartup;\n                if (_repeatCount == 0)\n                    _delay = _repeatDelay;\n                else\n                    _delay = Mathf.Lerp(_delay, _maxRepeat, _repeatLerp);\n                _repeatCount++;\n            }\n        }\n\n        public override void FixedUpdate()\n        {\n            //determine based on history\n            _currentFixed = InputUtil.GetNextButtonState(_current, _button != null ? _button() : false);\n        }\n\n        public override void Reset()\n        {\n            _current = ButtonState.None;\n            _currentFixed = ButtonState.None;\n            _lastDown = 0f;\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Sequences/ButtonTap.cs",
    "content": "﻿using UnityEngine;\n\nnamespace com.spacepuppy.SPInput.Sequences\n{\n    public class ButtonTap : ISequence\n    {\n\n        #region Fields\n\n        private IButtonInputSignature _button;\n        private float _tapBufferDur;\n        private int _tapCount;\n        private float _nextTapBufferDur;\n        private System.Action _callback;\n\n        private bool _lastWasDown;\n        private float _t;\n        private int _currentCount;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public ButtonTap(IButtonInputSignature button, float tapBufferDur, System.Action callback)\n        {\n            _button = button;\n            _tapBufferDur = tapBufferDur;\n            _tapCount = 1;\n            _nextTapBufferDur = 0f;\n            _callback = callback;\n        }\n\n        public ButtonTap(IButtonInputSignature button, float tapBufferDur, int tapCount, float nextTapBufferDur, System.Action callback)\n        {\n            _button = button;\n            _tapBufferDur = tapBufferDur;\n            _tapCount = tapCount;\n            _nextTapBufferDur = nextTapBufferDur;\n            _callback = callback;\n        }\n\n        #endregion\n\n        #region ISequence Interface\n\n        public void OnStart()\n        {\n            _lastWasDown = (_button != null && _button.CurrentState > ButtonState.None);\n            _t = 0f;\n            _currentCount = 0;\n        }\n\n        public bool Update()\n        {\n            if (_button == null) return true;\n            if (_t >= _tapBufferDur) return true;\n\n            if(_lastWasDown)\n            {\n                if (_button.CurrentState <= ButtonState.None)\n                {\n                    _lastWasDown = false;\n                    _currentCount++;\n                    if (_currentCount >= _tapCount)\n                    {\n                        if (_callback != null) _callback();\n                        return true;\n                    }\n                    else\n                    {\n                        _t = 0f;\n                        return false;\n                    }\n                }\n            }\n            else\n            {\n                if (_currentCount > 0 && _t >= _nextTapBufferDur) return true;\n                \n                if (_button.CurrentState > ButtonState.None)\n                {\n                    _lastWasDown = true;\n                    _t = 0f;\n                    return false;\n                }\n            }\n\n            _t += Time.unscaledDeltaTime;\n            return false;\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Sequences/CursorMove.cs",
    "content": "﻿using UnityEngine;\n\nnamespace com.spacepuppy.SPInput.Sequences\n{\n    public class CursorMove : ISequence\n    {\n\n        #region Fields\n\n        private ICursorInputSignature _cursor;\n        private float _dist;\n        private System.Action _callback;\n\n        private Vector2 _startPos;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public CursorMove(ICursorInputSignature cursor, float dist, System.Action callback)\n        {\n            _cursor = cursor;\n            _dist = dist;\n            _callback = callback;\n        }\n        \n        #endregion\n\n        #region ISequence Interface\n\n        public void OnStart()\n        {\n            if(_cursor != null)\n            {\n                _startPos = _cursor.CurrentState;\n            }\n        }\n\n        public bool Update()\n        {\n            if (_cursor == null) return true;\n\n            if((_cursor.CurrentState - _startPos).sqrMagnitude >= _dist * _dist)\n            {\n                if (_callback != null) _callback();\n                return true;\n            }\n\n            return false;\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Sequences/FirstSuccessfulSequence.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy.SPInput.Sequences\n{\n    public class FirstSuccessfulSequence : ISequence\n    {\n\n        #region Fields\n\n        private List<ISequence> _sequences = new List<ISequence>();\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public FirstSuccessfulSequence(params ISequence[] sequences)\n        {\n            _sequences.AddRange(sequences);\n        }\n\n        public FirstSuccessfulSequence(IEnumerable<ISequence> sequences)\n        {\n            _sequences.AddRange(sequences);\n        }\n\n        #endregion\n\n        #region Properties\n\n        public List<ISequence> Sequences { get { return _sequences; } }\n\n        #endregion\n\n        #region Methods\n\n        #endregion\n\n        #region ISequence Interface\n\n        public void OnStart()\n        {\n            for(int i = 0; i < _sequences.Count; i++)\n            {\n                _sequences[i].OnStart();\n            }\n        }\n\n        public bool Update()\n        {\n            if (_sequences.Count == 0) return true;\n\n            for(int i = 0; i < _sequences.Count; i++)\n            {\n                if (_sequences[i].Update()) return true;\n            }\n\n            return false;\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/ConfigurableInputProfile.cs",
    "content": "﻿#pragma warning disable 1066 // default parameter values ignored\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity\n{\n\n    public class ConfigurableInputProfile<TInputId> : IConfigurableInputProfile<TInputId> where TInputId : struct, System.IConvertible\n    {\n\n        #region Fields\n\n        private IInputProfile<TInputId> _innerProfile;\n        private Dictionary<TInputId, InputToken> _customTable = new Dictionary<TInputId, InputToken>();\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public ConfigurableInputProfile()\n        {\n\n        }\n\n        public ConfigurableInputProfile(IInputProfile<TInputId> innerProfile)\n        {\n            _innerProfile = innerProfile;\n        }\n\n        #endregion\n\n        #region Properties\n\n        /// <summary>\n        /// An ID field that can be used for identification purposes.\n        /// </summary>\n        public string Id\n        {\n            get;\n            set;\n        }\n\n        public IInputProfile<TInputId> InnerProfile\n        {\n            get { return _innerProfile; }\n            set { _innerProfile = value; }\n        }\n\n        public bool ContainsCustomLayout\n        {\n            get { return _customTable.Count > 0; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public void ApplyToToken(InputLayoutToken<TInputId> token)\n        {\n            var e = _customTable.GetEnumerator();\n            while (e.MoveNext())\n            {\n                token.Inputs.Add(new InputLayoutToken<TInputId>.InputTokenKeyValuePair()\n                {\n                    InputId = e.Current.Key,\n                    InputToken = e.Current.Value\n                });\n            }\n        }\n\n        public void LoadFromToken(InputLayoutToken<TInputId> token)\n        {\n            _customTable.Clear();\n            if (token == null || token.Inputs == null) return;\n\n            var e = token.Inputs.GetEnumerator();\n            while (e.MoveNext())\n            {\n                _customTable[e.Current.InputId] = e.Current.InputToken;\n            }\n        }\n\n        #endregion\n\n        #region IConfigurableInputProfile Interface\n\n        public bool Contains(TInputId id)\n        {\n            return _customTable.ContainsKey(id) || (_innerProfile != null && _innerProfile.Contains(id));\n        }\n\n        public InputToken GetMapping(TInputId id)\n        {\n            InputToken token;\n            if (_customTable.TryGetValue(id, out token)) return token;\n\n            if (_innerProfile != null) return _innerProfile.GetMapping(id);\n\n            return InputToken.Unknown;\n        }\n\n        public void Reset()\n        {\n            _customTable.Clear();\n        }\n\n        public void SetAxisMapping(TInputId id, InputToken token)\n        {\n            _customTable[id] = token;\n        }\n\n        public void SetButtonMapping(TInputId id, InputToken token)\n        {\n            _customTable[id] = token;\n        }\n\n        bool IInputProfile<TInputId>.TryPollAxis(out TInputId axis, out float value, Joystick joystick = Joystick.All, float deadZone = 0.707F)\n        {\n            //TODO - should we poll the custom inputs? No?\n            if (_innerProfile != null)\n            {\n                return _innerProfile.TryPollAxis(out axis, out value, joystick, deadZone);\n            }\n            else\n            {\n                axis = default(TInputId);\n                value = 0f;\n                return false;\n            }\n        }\n\n        bool IInputProfile<TInputId>.TryPollButton(out TInputId button, ButtonState state = ButtonState.Down, Joystick joystick = Joystick.All)\n        {\n            //TODO - should we poll the custom inputs? No?\n            if (_innerProfile != null)\n            {\n                return _innerProfile.TryPollButton(out button, state, joystick);\n            }\n            else\n            {\n                button = default(TInputId);\n                return false;\n            }\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Enums.cs",
    "content": "﻿#pragma warning disable 0618 // deprecated enum entry\nusing UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.SPInput.Unity\n{\n\n    public enum SPInputId : byte\n    {\n        Unknown = 0,\n        Axis1 = 1,\n        Axis2 = 2,\n        Axis3 = 3,\n        Axis4 = 4,\n        Axis5 = 5,\n        Axis6 = 6,\n        Axis7 = 7,\n        Axis8 = 8,\n        Axis9 = 9,\n        Axis10 = 10,\n        Axis11 = 11,\n        Axis12 = 12,\n        Axis13 = 13,\n        Axis14 = 14,\n        Axis15 = 15,\n        Axis16 = 16,\n        Axis17 = 17,\n        Axis18 = 18,\n        Axis19 = 19,\n        Axis20 = 20,\n        Axis21 = 21,\n        Axis22 = 22,\n        Axis23 = 23,\n        Axis24 = 24,\n        Axis25 = 25,\n        Axis26 = 26,\n        Axis27 = 27,\n        Axis28 = 28,\n        MouseAxis1 = 29,\n        MouseAxis2 = 30,\n        MouseAxis3 = 31,\n        Button0 = 32,\n        Button1 = 33,\n        Button2 = 34,\n        Button3 = 35,\n        Button4 = 36,\n        Button5 = 37,\n        Button6 = 38,\n        Button7 = 39,\n        Button8 = 40,\n        Button9 = 41,\n        Button10 = 42,\n        Button11 = 43,\n        Button12 = 44,\n        Button13 = 45,\n        Button14 = 46,\n        Button15 = 47,\n        Button16 = 48,\n        Button17 = 49,\n        Button18 = 50,\n        Button19 = 51,\n        MouseButton0 = 52,\n        MouseButton1 = 53,\n        MouseButton2 = 54,\n        MouseButton3 = 55,\n        MouseButton4 = 56,\n        MouseButton5 = 57,\n        MouseButton6 = 58\n    }\n\n    public enum SPMouseId\n    {\n        MouseX = SPInputId.MouseAxis1,\n        MouseY = SPInputId.MouseAxis2,\n        MouseScroll = SPInputId.MouseAxis3,\n        MouseButton0 = SPInputId.MouseButton0,\n        MouseButton1 = SPInputId.MouseButton1,\n        MouseButton2 = SPInputId.MouseButton2,\n        MouseButton3 = SPInputId.MouseButton3,\n        MouseButton4 = SPInputId.MouseButton4,\n        MouseButton5 = SPInputId.MouseButton5,\n        MouseButton6 = SPInputId.MouseButton6\n    }\n\n    public enum InputType\n    {\n        Unknown,\n        Joystick,\n        Keyboard,\n        Custom\n    }\n\n    [System.Flags]\n    public enum KeyCodeType\n    {\n        All = 7,\n        None = 0,\n        Keyboard = 1,\n        MouseButton = 2,\n        KeyboardAndMouse = 3,\n        JoystickButton = 4\n    }\n\n    public enum InputMode\n    {\n        Axis,\n        Trigger,\n        LongTrigger,\n        Button,\n        AxleButton\n    }\n\n    [System.Flags()]\n    public enum TargetPlatform : int\n    {\n        All = -1,\n        Unknown = 0,\n        Windows = 1,\n        MacOSX = 2,\n        Linux = 4,\n        IPhone = 8,\n        Android = 16,\n        WindowsStoreApp = 32,\n        Blackberry = 64,\n        WebGL = 128,\n        PS3 = 256,\n        PS4 = 512,\n        PSP = 1024,\n        Xbox360 = 2048,\n        XboxOne = 4096,\n        WiiU = 8192,\n        Switch = 16384,\n        SamsungTV = 32768,\n        tvOS = 65536,\n        Tizen = 131072\n    }\n\n    public static class TargetPlatformUtil\n    {\n\n        public static TargetPlatform ToTargetPlatform(this RuntimePlatform platform)\n        {\n            switch(platform)\n            {\n                case RuntimePlatform.OSXEditor:\n                case RuntimePlatform.OSXPlayer:\n                    return TargetPlatform.MacOSX;\n                case RuntimePlatform.WindowsPlayer:\n                    return TargetPlatform.Windows;\n                //case RuntimePlatform.OSXWebPlayer:\n                //case RuntimePlatform.OSXDashboardPlayer:\n                //    return TargetPlatform.MacOSX;\n                //case RuntimePlatform.WindowsWebPlayer:\n                case RuntimePlatform.WindowsEditor:\n                    return TargetPlatform.Windows;\n                case RuntimePlatform.IPhonePlayer:\n                    return TargetPlatform.IPhone;\n                case RuntimePlatform.PS3:\n                    return TargetPlatform.PS3;\n                case RuntimePlatform.XBOX360:\n                    return TargetPlatform.Xbox360;\n                case RuntimePlatform.Android:\n                    return TargetPlatform.Android;\n                case RuntimePlatform.LinuxPlayer:\n                case RuntimePlatform.LinuxEditor:\n                    return TargetPlatform.Linux;\n                case RuntimePlatform.WebGLPlayer:\n                    return TargetPlatform.WebGL;\n                case RuntimePlatform.WSAPlayerX86:\n                case RuntimePlatform.WSAPlayerX64:\n                case RuntimePlatform.WSAPlayerARM:\n                    return TargetPlatform.WindowsStoreApp;\n                case RuntimePlatform.BlackBerryPlayer:\n                    return TargetPlatform.Blackberry;\n                case RuntimePlatform.TizenPlayer:\n                    return TargetPlatform.Tizen;\n                case RuntimePlatform.PSP2:\n                    return TargetPlatform.PSP;\n                case RuntimePlatform.PS4:\n                    return TargetPlatform.PS4;\n                case RuntimePlatform.PSM:\n                    return TargetPlatform.Unknown; //need to add Playstation Mobile...\n                case RuntimePlatform.XboxOne:\n                    return TargetPlatform.XboxOne;\n                case RuntimePlatform.SamsungTVPlayer:\n                    return TargetPlatform.SamsungTV;\n                case RuntimePlatform.WiiU:\n                    return TargetPlatform.WiiU;\n                case RuntimePlatform.tvOS:\n                    return TargetPlatform.tvOS;\n                case RuntimePlatform.Switch:\n                    return TargetPlatform.Switch;\n                default:\n                    return TargetPlatform.Unknown;\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/IInputProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity\n{\n\n    public interface IInputProfile<TInputId> where TInputId : struct, System.IConvertible\n    {\n\n        bool TryPollButton(out TInputId button, ButtonState state = ButtonState.Down, Joystick joystick = Joystick.All);\n\n        bool TryPollAxis(out TInputId axis, out float value, Joystick joystick = Joystick.All, float deadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE);\n\n        bool Contains(TInputId id);\n        InputToken GetMapping(TInputId id);\n\n    }\n\n    public interface IConfigurableInputProfile<TInputId> : IInputProfile<TInputId> where TInputId : struct, System.IConvertible\n    {\n        void SetButtonMapping(TInputId id, InputToken token);\n        void SetAxisMapping(TInputId id, InputToken token);\n        void Reset();\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/InputLayoutToken.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity\n{\n\n    [System.Serializable]\n    public class InputLayoutToken<TInputId> where TInputId : struct, System.IConvertible\n    {\n\n        public string Id;\n        [UnityEngine.SerializeField]\n        private List<InputTokenKeyValuePair> _inputs = new List<InputTokenKeyValuePair>();\n\n        public List<InputTokenKeyValuePair> Inputs\n        {\n            get { return _inputs; }\n        }\n\n        [System.Serializable]\n        public struct InputTokenKeyValuePair\n        {\n            public TInputId InputId;\n            public InputToken InputToken;\n\n            public InputTokenKeyValuePair(TInputId id, InputToken token)\n            {\n                this.InputId = id;\n                this.InputToken = token;\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/InputProfileDescriptionAttributes.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity\n{\n\n\n    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]\n    public class InputProfileDescriptionAttribute : System.Attribute\n    {\n        public string DisplayName;\n        public TargetPlatform Platform;\n        public string Description;\n\n        public InputProfileDescriptionAttribute(string displayName, TargetPlatform platform)\n        {\n            this.DisplayName = displayName;\n            this.Platform = platform;\n        }\n\n    }\n\n    [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)]\n    public class InputProfileJoystickNameAttribute : System.Attribute\n    {\n        public string JoystickName;\n\n        public InputProfileJoystickNameAttribute(string joystickName)\n        {\n            this.JoystickName = joystickName;\n        }\n\n    }\n    \n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/InputProfileLookupTable.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.SPInput.Unity\n{\n\n    public class InputProfileLookupTable<T, TInputId> \n           : ICollection<InputProfileLookupTable<T, TInputId>.InputProfileLookupEntry>,\n           ISPDisposable\n           where T : class, IInputProfile<TInputId> \n           where TInputId : struct, System.IConvertible \n    {\n\n        #region Fields\n\n        private List<InputProfileLookupEntry> _table = new List<InputProfileLookupEntry>();\n\n        #endregion\n\n        #region Methods\n\n        /// <summary>\n        /// Loads all profiles of type (T) into the list with their appropriate descriptions.\n        /// \n        /// Load clears the table before loading. Make sure you only add custom entries AFTER calling Load.\n        /// </summary>\n        public void Load(bool includeIfNoDescription = false, bool includeIfNotThisPlatform = false)\n        {\n            _table.Clear();\n\n            var currentPlatform = UnityEngine.Application.platform.ToTargetPlatform();\n\n            foreach(var tp in com.spacepuppy.Utils.TypeUtil.GetTypesAssignableFrom(typeof(T)))\n            {\n                if (tp.IsAbstract || tp.IsInterface || tp.GetConstructor(Type.EmptyTypes) == null) continue;\n\n                var description = tp.GetCustomAttributes(typeof(InputProfileDescriptionAttribute), false).FirstOrDefault() as InputProfileDescriptionAttribute;\n                if (!includeIfNoDescription && description == null) continue; //if no description was attached, skip\n                if (!includeIfNotThisPlatform && (description.Platform & currentPlatform) == 0) continue; //If we don't match the expected platform, skip\n\n                var entry = new InputProfileLookupEntry()\n                {\n                    ProfileType = tp,\n                    Platform = description != null ? description.Platform : TargetPlatform.Unknown,\n                    DisplayName = description != null ? description.DisplayName ?? string.Empty : string.Empty,\n                    Description = description != null ? description.Description ?? string.Empty : string.Empty\n                };\n                \n                var joysticks = tp.GetCustomAttributes(typeof(InputProfileJoystickNameAttribute), false) as InputProfileJoystickNameAttribute[];\n                if(joysticks != null && joysticks.Length > 0)\n                {\n                    entry.JoystickNames = (from a in joysticks where !string.IsNullOrEmpty(a.JoystickName) select a.JoystickName).ToArray();\n                }\n                else\n                {\n                    entry.JoystickNames = com.spacepuppy.Utils.ArrayUtil.Empty<string>();\n                }\n\n                _table.Add(entry);\n            }\n        }\n\n        public InputProfileLookupEntry Find(System.Predicate<InputProfileLookupEntry> predicate)\n        {\n            if (predicate == null) throw new System.ArgumentNullException(\"predicate\");\n\n            var e = _table.GetEnumerator();\n            while (e.MoveNext())\n            {\n                if (predicate(e.Current)) return e.Current;\n            }\n\n            return default(InputProfileLookupEntry);\n        }\n\n        public InputProfileLookupEntry Find(string joystickName)\n        {\n            var e = _table.GetEnumerator();\n            while(e.MoveNext())\n            {\n                if (Array.IndexOf(e.Current.JoystickNames, joystickName) >= 0) return e.Current;\n            }\n\n            return default(InputProfileLookupEntry);\n        }\n\n        public T Create(string joystickName)\n        {\n            return this.Find(joystickName).CreateProfile();\n        }\n\n        #endregion\n\n        #region ICollection Interface\n\n        public int Count { get { return _table.Count; } }\n\n        public bool IsReadOnly { get { return false; } }\n\n        public void Add(InputProfileLookupEntry item)\n        {\n            if (item.JoystickNames == null) item.JoystickNames = com.spacepuppy.Utils.ArrayUtil.Empty<string>();\n            _table.Add(item);\n        }\n\n        public bool Contains(InputProfileLookupEntry item)\n        {\n            if (item.JoystickNames == null) item.JoystickNames = com.spacepuppy.Utils.ArrayUtil.Empty<string>();\n            return _table.Contains(item);\n        }\n\n        public void CopyTo(InputProfileLookupEntry[] array, int arrayIndex)\n        {\n            _table.CopyTo(array, arrayIndex);\n        }\n\n        public bool Remove(InputProfileLookupEntry item)\n        {\n            if (item.JoystickNames == null) item.JoystickNames = com.spacepuppy.Utils.ArrayUtil.Empty<string>();\n            return _table.Remove(item);\n        }\n\n        public void Clear()\n        {\n            _table.Clear();\n        }\n\n        #endregion\n\n        #region IEnumerable Interface\n\n        public Enumerator GetEnumerator()\n        {\n            return new Enumerator(this);\n        }\n\n        IEnumerator<InputProfileLookupEntry> IEnumerable<InputProfileLookupEntry>.GetEnumerator()\n        {\n            return this.GetEnumerator();\n        }\n\n        IEnumerator IEnumerable.GetEnumerator()\n        {\n            return this.GetEnumerator();\n        }\n\n        #endregion\n\n        #region IDisposable Interface\n\n        private bool _isDisposed;\n\n        public bool IsDisposed\n        {\n            get { return _isDisposed; }\n        }\n\n        /// <summary>\n        /// Unloads all profiles and forces GC to purge them out. This should be called after a lengthy input creation process. \n        /// Otherwise the garbage created here in may be collected further down the line and impact framerate.\n        /// </summary>\n        public void Dispose()\n        {\n            _isDisposed = true;\n            _table.Clear();\n            _table = null;\n            //force collect all those loaded profiles\n            GC.Collect();\n        }\n\n        #endregion\n\n        #region Special Types\n\n        public struct InputProfileLookupEntry\n        {\n            public Type ProfileType;\n            public TargetPlatform Platform;\n            public string DisplayName;\n            public string Description;\n            public string[] JoystickNames;\n\n            /// <summary>\n            /// The constructor of the profile type exists and has 0-parameters.\n            /// </summary>\n            public bool ValidConstructor\n            {\n                get { return ProfileType != null && !ProfileType.IsAbstract && !ProfileType.IsInterface && ProfileType.GetConstructor(Type.EmptyTypes) != null; }\n            }\n\n            public T CreateProfile()\n            {\n                if(this.ValidConstructor)\n                {\n                    return Activator.CreateInstance(ProfileType) as T;\n                }\n\n                return null;\n            }\n        }\n\n        public struct Enumerator : IEnumerator<InputProfileLookupEntry>\n        {\n\n            private List<InputProfileLookupEntry>.Enumerator _e;\n\n            public Enumerator(InputProfileLookupTable<T, TInputId> table)\n            {\n                if (table == null) throw new System.ArgumentNullException(\"table\");\n\n                _e = table._table.GetEnumerator();\n            }\n\n            public InputProfileLookupEntry Current\n            {\n                get { return _e.Current; }\n            }\n\n            object IEnumerator.Current\n            {\n                get { return _e.Current; }\n            }\n\n            public bool MoveNext()\n            {\n                return _e.MoveNext();\n            }\n\n            void IEnumerator.Reset()\n            {\n                (_e as IEnumerator).Reset();\n            }\n\n            public void Dispose()\n            {\n                _e.Dispose();\n            }\n\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/InputToken.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.SPInput.Unity\n{\n\n    [System.Serializable]\n    public struct InputToken\n    {\n\n        public InputType Type;\n        public InputMode Mode;\n        public int Value;\n        public int AltValue;\n        public float DeadZone;\n        [System.NonSerialized]\n        private System.Delegate _axisDelegate;\n        [System.NonSerialized]\n        private System.Delegate _buttonDelegate;\n\n        public AxisDelegateFactory CreateAxisDelegateFactory()\n        {\n            switch (this.Type)\n            {\n                case InputType.Unknown:\n                    return null;\n                case InputType.Joystick:\n                    {\n                        switch (this.Mode)\n                        {\n                            case InputMode.Axis:\n                                {\n                                    if (float.IsNaN(this.DeadZone))\n                                        return SPInputFactory.CreateAxisDelegateFactory((SPInputId)this.Value, (SPInputId)this.AltValue);\n                                    else\n                                        return SPInputFactory.CreateAxisDelegateFactory((SPInputId)this.Value, this.AltValue != 0);\n                                }\n                            case InputMode.Trigger:\n                                return SPInputFactory.CreateTriggerDelegateFactory((SPInputId)this.Value, (AxleValueConsideration)this.AltValue);\n                            case InputMode.LongTrigger:\n                                return SPInputFactory.CreateLongTriggerDelegateFactory((SPInputId)this.Value);\n                            case InputMode.Button:\n                                return SPInputFactory.CreateTriggerDelegateFactory((SPInputId)this.Value);\n                            case InputMode.AxleButton:\n                                {\n                                    var axis = (SPInputId)this.Value;\n                                    var consid = (AxleValueConsideration)this.AltValue;\n                                    var dead = this.DeadZone;\n                                    return (j) => SPInputFactory.CreateTriggerDelegate(SPInputFactory.CreateAxleButtonDelegate(axis, consid, j, dead));\n                                }\n\n                        }\n                    }\n                    break;\n                case InputType.Keyboard:\n                    {\n                        switch (this.Mode)\n                        {\n                            case InputMode.Axis:\n                                return SPInputFactory.CreateAxisDelegateFactory((KeyCode)this.Value, (KeyCode)this.AltValue);\n                            case InputMode.Trigger:\n                            case InputMode.LongTrigger:\n                            case InputMode.Button:\n                            case InputMode.AxleButton:\n                                return SPInputFactory.CreateTriggerDelegateFactory((KeyCode)this.Value);\n                        }\n                    }\n                    break;\n                case InputType.Custom:\n                    {\n                        if (_axisDelegate is AxisDelegateFactory)\n                        {\n                            return (_axisDelegate as AxisDelegateFactory);\n                        }\n                        else if (_axisDelegate is AxisDelegate)\n                        {\n                            var d = _axisDelegate as AxisDelegate;\n                            return (j) => d;\n                        }\n                        else if (_buttonDelegate is ButtonDelegateFactory)\n                        {\n                            var d = _buttonDelegate as ButtonDelegateFactory;\n                            return (j) => SPInputFactory.CreateTriggerDelegate(d(j));\n                        }\n                        else if (_buttonDelegate is ButtonDelegate)\n                        {\n                            var d = _buttonDelegate as ButtonDelegate;\n                            return (j) => SPInputFactory.CreateTriggerDelegate(d);\n                        }\n                        else\n                        {\n                            return null;\n                        }\n                    }\n            }\n            return null;\n        }\n\n        public ButtonDelegateFactory CreateButtonDelegateFactory(Joystick joystick = Joystick.All)\n        {\n            switch (this.Type)\n            {\n                case InputType.Unknown:\n                    return null;\n                case InputType.Joystick:\n                    {\n                        switch (this.Mode)\n                        {\n                            case InputMode.Axis:\n                                return SPInputFactory.CreateAxleButtonDelegateFactory((SPInputId)this.Value, AxleValueConsideration.Absolute);\n                            case InputMode.Trigger:\n                                return SPInputFactory.CreateAxleButtonDelegateFactory((SPInputId)this.Value, (AxleValueConsideration)this.AltValue);\n                            case InputMode.LongTrigger:\n                                var id = (SPInputId)this.Value;\n                                return (j) => SPInputFactory.CreateAxleButtonDelegate(SPInputFactory.CreateLongTriggerDelegate(id, j), AxleValueConsideration.Positive);\n                            case InputMode.Button:\n                                return SPInputFactory.CreateButtonDelegateFactory((SPInputId)this.Value);\n                            case InputMode.AxleButton:\n                                return SPInputFactory.CreateAxleButtonDelegateFactory((SPInputId)this.Value, (AxleValueConsideration)this.AltValue, this.DeadZone);\n                        }\n                    }\n                    break;\n                case InputType.Keyboard:\n                    {\n                        switch (this.Mode)\n                        {\n                            case InputMode.Axis:\n                                {\n                                    KeyCode p = (KeyCode)Value;\n                                    KeyCode n = (KeyCode)AltValue;\n                                    return (j) => () => Input.GetKey(p) || Input.GetKey(n);\n                                }\n                            case InputMode.Trigger:\n                            case InputMode.LongTrigger:\n                            case InputMode.Button:\n                            case InputMode.AxleButton:\n                                return SPInputFactory.CreateButtonDelegateFactory((KeyCode)this.Value);\n                        }\n                    }\n                    break;\n                case InputType.Custom:\n                    {\n                        if (_buttonDelegate is ButtonDelegateFactory)\n                        {\n                            var d = _buttonDelegate as ButtonDelegateFactory;\n                            return d;\n                        }\n                        else if (_buttonDelegate is ButtonDelegate)\n                        {\n                            var d = _buttonDelegate as ButtonDelegate;\n                            return (j) => d;\n                        }\n                        else if (_axisDelegate is AxisDelegateFactory)\n                        {\n                            var d = _axisDelegate as AxisDelegateFactory;\n                            return (j) => SPInputFactory.CreateAxleButtonDelegate(d(j), AxleValueConsideration.Absolute);\n                        }\n                        else if (_axisDelegate is AxisDelegate)\n                        {\n                            var d = _axisDelegate as AxisDelegate;\n                            return (j) => SPInputFactory.CreateAxleButtonDelegate(d, AxleValueConsideration.Absolute);\n                        }\n                        else\n                        {\n                            return null;\n                        }\n                    }\n            }\n            return null;\n        }\n\n        public AxisDelegate CreateAxisDelegate(Joystick joystick = Joystick.All)\n        {\n            switch(this.Type)\n            {\n                case InputType.Unknown:\n                    return null;\n                case InputType.Joystick:\n                    {\n                        switch(this.Mode)\n                        {\n                            case InputMode.Axis:\n                                {\n                                    if (float.IsNaN(this.DeadZone))\n                                        return SPInputFactory.CreateAxisDelegate((SPInputId)this.Value, (SPInputId)this.AltValue, joystick);\n                                    else\n                                        return SPInputFactory.CreateAxisDelegate((SPInputId)this.Value, joystick, this.AltValue != 0);\n                                }\n                            case InputMode.Trigger:\n                                return SPInputFactory.CreateTriggerDelegate((SPInputId)this.Value, joystick, (AxleValueConsideration)this.AltValue);\n                            case InputMode.LongTrigger:\n                                return SPInputFactory.CreateLongTriggerDelegate((SPInputId)this.Value, joystick);\n                            case InputMode.Button:\n                                return SPInputFactory.CreateTriggerDelegate(SPInputFactory.CreateButtonDelegate((SPInputId)this.Value, joystick));\n                            case InputMode.AxleButton:\n                                return SPInputFactory.CreateTriggerDelegate(SPInputFactory.CreateAxleButtonDelegate((SPInputId)this.Value, (AxleValueConsideration)this.AltValue, joystick, this.DeadZone));\n\n                        }\n                    }\n                    break;\n                case InputType.Keyboard:\n                    {\n                        switch (this.Mode)\n                        {\n                            case InputMode.Axis:\n                                return SPInputFactory.CreateAxisDelegate((KeyCode)this.Value, (KeyCode)this.AltValue);\n                            case InputMode.Trigger:\n                            case InputMode.LongTrigger:\n                            case InputMode.Button:\n                            case InputMode.AxleButton:\n                                return SPInputFactory.CreateTriggerDelegate((KeyCode)this.Value);\n                        }\n                    }\n                    break;\n                case InputType.Custom:\n                    {\n                        if(_axisDelegate is AxisDelegateFactory)\n                        {\n                            return (_axisDelegate as AxisDelegateFactory)(joystick);\n                        }\n                        else if (_axisDelegate is AxisDelegate)\n                        {\n                            return _axisDelegate as AxisDelegate;\n                        }\n                        else if(_buttonDelegate is ButtonDelegateFactory)\n                        {\n                            return SPInputFactory.CreateTriggerDelegate((_buttonDelegate as ButtonDelegateFactory)(joystick));\n                        }\n                        else if (_buttonDelegate is ButtonDelegate)\n                        {\n                            return SPInputFactory.CreateTriggerDelegate(_buttonDelegate as ButtonDelegate);\n                        }\n                        else\n                        {\n                            return null;\n                        }\n                    }\n            }\n            return null;\n        }\n\n        public ButtonDelegate CreateButtonDelegate(Joystick joystick = Joystick.All)\n        {\n            switch (this.Type)\n            {\n                case InputType.Unknown:\n                    return null;\n                case InputType.Joystick:\n                    {\n                        switch (this.Mode)\n                        {\n                            case InputMode.Axis:\n                                return SPInputFactory.CreateAxleButtonDelegate((SPInputId)this.Value, AxleValueConsideration.Absolute, joystick);\n                            case InputMode.Trigger:\n                                return SPInputFactory.CreateAxleButtonDelegate((SPInputId)this.Value, (AxleValueConsideration)this.AltValue, joystick);\n                            case InputMode.LongTrigger:\n                                return SPInputFactory.CreateAxleButtonDelegate(SPInputFactory.CreateLongTriggerDelegate((SPInputId)this.Value, joystick), AxleValueConsideration.Positive);\n                            case InputMode.Button:\n                                return SPInputFactory.CreateButtonDelegate((SPInputId)this.Value, joystick);\n                            case InputMode.AxleButton:\n                                return SPInputFactory.CreateAxleButtonDelegate((SPInputId)this.Value, (AxleValueConsideration)this.AltValue, joystick, this.DeadZone);\n                        }\n                    }\n                    break;\n                case InputType.Keyboard:\n                    {\n                        switch (this.Mode)\n                        {\n                            case InputMode.Axis:\n                                {\n                                    KeyCode p = (KeyCode)Value;\n                                    KeyCode n = (KeyCode)AltValue;\n                                    return () => Input.GetKey(p) || Input.GetKey(n);\n                                }\n                            case InputMode.Trigger:\n                            case InputMode.LongTrigger:\n                            case InputMode.Button:\n                            case InputMode.AxleButton:\n                                return SPInputFactory.CreateButtonDelegate((KeyCode)this.Value);\n                        }\n                    }\n                    break;\n                case InputType.Custom:\n                    {\n                        if (_buttonDelegate is ButtonDelegateFactory)\n                        {\n                            return (_buttonDelegate as ButtonDelegateFactory)(joystick);\n                        }\n                        else if (_buttonDelegate is ButtonDelegate)\n                        {\n                            return _buttonDelegate as ButtonDelegate;\n                        }\n                        else if (_axisDelegate is AxisDelegateFactory)\n                        {\n                            return SPInputFactory.CreateAxleButtonDelegate((_axisDelegate as AxisDelegateFactory)(joystick), AxleValueConsideration.Absolute);\n                        }\n                        else if(_axisDelegate is AxisDelegate)\n                        {\n                            return SPInputFactory.CreateAxleButtonDelegate(_axisDelegate as AxisDelegate, AxleValueConsideration.Absolute);\n                        }\n                        else\n                        {\n                            return null;\n                        }\n                    }\n            }\n            return null;\n        }\n        \n        public float PollAxis(Joystick joystick = Joystick.All)\n        {\n            switch (this.Type)\n            {\n                case InputType.Unknown:\n                    return 0f;\n                case InputType.Joystick:\n                    {\n                        switch (this.Mode)\n                        {\n                            case InputMode.Axis:\n                                {\n                                    if (float.IsNaN(this.DeadZone))\n                                    {\n                                        var d = SPInputFactory.CreateAxisDelegate((SPInputId)this.Value, (SPInputId)this.AltValue, joystick);\n                                        return d != null ? d() : 0f;\n                                    }\n                                    else\n                                    {\n                                        //return SPInputFactory.CreateAxisDelegate((SPInputId)this.Value, joystick, this.AltValue != 0);\n                                        float v = SPInputDirect.GetAxis((SPInputId)this.Value, joystick);\n                                        if (this.AltValue != 0) v = -v;\n                                        return v;\n                                    }\n                                }\n                            case InputMode.Trigger:\n                                {\n                                    var d = SPInputFactory.CreateTriggerDelegate((SPInputId)this.Value, joystick, (AxleValueConsideration)this.AltValue);\n                                    return d != null ? d() : 0f;\n                                }\n                            case InputMode.LongTrigger:\n                                {\n                                    var d = SPInputFactory.CreateLongTriggerDelegate((SPInputId)this.Value, joystick);\n                                    return d != null ? d() : 0f;\n                                }\n                            case InputMode.Button:\n                                //return SPInputFactory.CreateTriggerDelegate(SPInputFactory.CreateButtonDelegate((SPInputId)this.Value, joystick));\n                                return SPInputDirect.GetButton((SPInputId)this.Value, joystick) ? 1f : 0f;\n                            case InputMode.AxleButton:\n                                {\n                                    var d = SPInputFactory.CreateTriggerDelegate(SPInputFactory.CreateAxleButtonDelegate((SPInputId)this.Value, (AxleValueConsideration)this.AltValue, joystick, this.DeadZone));\n                                    return d != null ? d() : 0f;\n                                }\n\n                        }\n                    }\n                    break;\n                case InputType.Keyboard:\n                    {\n                        switch (this.Mode)\n                        {\n                            case InputMode.Axis:\n                                {\n                                    //return SPInputFactory.CreateAxisDelegate((KeyCode)this.Value, (KeyCode)this.AltValue);\n                                    if (Input.GetKey((KeyCode)this.Value))\n                                        return 1f;\n                                    else if (Input.GetKey((KeyCode)this.AltValue))\n                                        return -1f;\n                                    else\n                                        return 0f;\n                                }\n                            case InputMode.Trigger:\n                            case InputMode.LongTrigger:\n                            case InputMode.Button:\n                            case InputMode.AxleButton:\n                                //return SPInputFactory.CreateTriggerDelegate((KeyCode)this.Value);\n                                return Input.GetKey((KeyCode)this.Value) ? 1f : 0f;\n                        }\n                    }\n                    break;\n                case InputType.Custom:\n                    {\n                        if (_axisDelegate is AxisDelegateFactory)\n                        {\n                            var d = (_axisDelegate as AxisDelegateFactory)(joystick);\n                            return d != null ? d() : 0f;\n                        }\n                        else if (_axisDelegate is AxisDelegate)\n                        {\n                            var d = _axisDelegate as AxisDelegate;\n                            return d != null ? d() : 0f;\n                        }\n                        else if (_buttonDelegate is ButtonDelegateFactory)\n                        {\n                            var d = SPInputFactory.CreateTriggerDelegate((_buttonDelegate as ButtonDelegateFactory)(joystick));\n                            return d != null ? d() : 0f;\n                        }\n                        else if (_buttonDelegate is ButtonDelegate)\n                        {\n                            var d = SPInputFactory.CreateTriggerDelegate(_buttonDelegate as ButtonDelegate);\n                            return d != null ? d() : 0f;\n                        }\n                        else\n                        {\n                            return 0f;\n                        }\n                    }\n            }\n            return 0f;\n        }\n\n        public bool PollButton(ButtonState state = ButtonState.Down, Joystick joystick = Joystick.All)\n        {\n            switch (this.Type)\n            {\n                case InputType.Unknown:\n                    return false;\n                case InputType.Joystick:\n                    {\n                        switch (this.Mode)\n                        {\n                            case InputMode.Axis:\n                                {\n                                    var d = SPInputFactory.CreateAxleButtonDelegate((SPInputId)this.Value, AxleValueConsideration.Absolute, joystick);\n                                    return d != null ? d() : false;\n                                }\n                            case InputMode.Trigger:\n                                {\n                                    var d = SPInputFactory.CreateAxleButtonDelegate((SPInputId)this.Value, (AxleValueConsideration)this.AltValue, joystick);\n                                    return d != null ? d() : false;\n                                }\n                            case InputMode.LongTrigger:\n                                {\n                                    var d = SPInputFactory.CreateAxleButtonDelegate(SPInputFactory.CreateLongTriggerDelegate((SPInputId)this.Value, joystick), AxleValueConsideration.Positive);\n                                    return d != null ? d() : false;\n                                }\n                            case InputMode.Button:\n                                return SPInputDirect.GetButton((SPInputId)this.Value, state, joystick);\n                            case InputMode.AxleButton:\n                                {\n                                    var d = SPInputFactory.CreateAxleButtonDelegate((SPInputId)this.Value, (AxleValueConsideration)this.AltValue, joystick, this.DeadZone);\n                                    return d != null ? d() : false;\n                                }\n                        }\n                    }\n                    break;\n                case InputType.Keyboard:\n                    {\n                        switch (this.Mode)\n                        {\n                            case InputMode.Axis:\n                                {\n                                    KeyCode p = (KeyCode)Value;\n                                    KeyCode n = (KeyCode)AltValue;\n                                    //return () => Input.GetKey(p) || Input.GetKey(n);\n                                    return SPInputDirect.GetKey(p, state) || SPInputDirect.GetKey(n, state);\n                                }\n                            case InputMode.Trigger:\n                            case InputMode.LongTrigger:\n                            case InputMode.Button:\n                            case InputMode.AxleButton:\n                                return SPInputDirect.GetKey((KeyCode)this.Value, state);\n                        }\n                    }\n                    break;\n                case InputType.Custom:\n                    {\n                        if (_buttonDelegate is ButtonDelegateFactory)\n                        {\n                            var d = (_buttonDelegate as ButtonDelegateFactory)(joystick);\n                            return d != null ? d() : false;\n                        }\n                        else if (_buttonDelegate is ButtonDelegate)\n                        {\n                            var d = _buttonDelegate as ButtonDelegate;\n                            return d != null ? d() : false;\n                        }\n                        else if (_axisDelegate is AxisDelegateFactory)\n                        {\n                            var d = SPInputFactory.CreateAxleButtonDelegate((_axisDelegate as AxisDelegateFactory)(joystick), AxleValueConsideration.Absolute);\n                            return d != null ? d() : false;\n                        }\n                        else if (_axisDelegate is AxisDelegate)\n                        {\n                            var d = SPInputFactory.CreateAxleButtonDelegate(_axisDelegate as AxisDelegate, AxleValueConsideration.Absolute);\n                            return d != null ? d() : false;\n                        }\n                        else\n                        {\n                            return false;\n                        }\n                    }\n            }\n            return false;\n        }\n\n\n\n\n        public static InputToken CreateButton(SPInputId button)\n        {\n            return new InputToken()\n            {\n                Type = InputType.Joystick,\n                Mode = InputMode.Button,\n                Value = (int)button\n            };\n        }\n\n        public static InputToken CreateButton(KeyCode key)\n        {\n            return new InputToken()\n            {\n                Type = InputType.Keyboard,\n                Mode = InputMode.Button,\n                Value = (int)key\n            };\n        }\n\n        public static InputToken CreateAxleButton(SPInputId axis, AxleValueConsideration consideration = AxleValueConsideration.Positive, float deadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE)\n        {\n            return new InputToken()\n            {\n                Type = InputType.Joystick,\n                Mode = InputMode.AxleButton,\n                Value = (int)axis,\n                AltValue = (int)consideration,\n                DeadZone = deadZone\n            };\n        }\n\n        public static InputToken CreateTrigger(SPInputId axis, AxleValueConsideration consideration = AxleValueConsideration.Positive)\n        {\n            return new InputToken()\n            {\n                Type = InputType.Joystick,\n                Mode = InputMode.Trigger,\n                Value = (int)axis,\n                AltValue = (int)consideration\n            };\n        }\n\n        public static InputToken CreateTrigger(KeyCode key)\n        {\n            return new InputToken()\n            {\n                Type = InputType.Keyboard,\n                Mode = InputMode.Trigger,\n                Value = (int)key\n            };\n        }\n\n        public static InputToken CreateLongTrigger(SPInputId axis)\n        {\n            return new InputToken()\n            {\n                Type = InputType.Joystick,\n                Mode = InputMode.LongTrigger,\n                Value = (int)axis\n            };\n        }\n\n        public static InputToken CreateAxis(SPInputId axis, bool invert = false)\n        {\n            return new InputToken()\n            {\n                Type = InputType.Joystick,\n                Mode = InputMode.Axis,\n                Value = (int)axis,\n                AltValue = invert ? 1 : 0\n            };\n        }\n\n        public static InputToken CreateEmulatedAxis(KeyCode positive, KeyCode negative)\n        {\n            return new InputToken()\n            {\n                Type = InputType.Keyboard,\n                Mode = InputMode.Axis,\n                Value = (int)positive,\n                AltValue = (int)negative\n            };\n        }\n\n        public static InputToken CreateEmulatedAxis(SPInputId positiveButton, SPInputId negativeButton)\n        {\n            return new InputToken()\n            {\n                Type = InputType.Joystick,\n                Mode = InputMode.Axis,\n                Value = (int)positiveButton,\n                AltValue = (int)negativeButton\n            };\n        }\n\n        public static InputToken CreateCustom(AxisDelegateFactory del)\n        {\n            return new InputToken()\n            {\n                Type = InputType.Custom,\n                _axisDelegate = del\n            };\n        }\n\n        public static InputToken CreateCustom(ButtonDelegateFactory del)\n        {\n            return new InputToken()\n            {\n                Type = InputType.Custom,\n                _buttonDelegate = del\n            };\n        }\n\n        public static InputToken CreateCustom(AxisDelegate del)\n        {\n            return new InputToken()\n            {\n                Type = InputType.Custom,\n                _axisDelegate = del\n            };\n        }\n\n        public static InputToken CreateCustom(ButtonDelegate del)\n        {\n            return new InputToken()\n            {\n                Type = InputType.Custom,\n                _buttonDelegate = del\n            };\n        }\n\n        public static InputToken CreateCustom(AxisDelegateFactory axisDel, ButtonDelegateFactory buttonDel)\n        {\n            return new InputToken()\n            {\n                Type = InputType.Custom,\n                _axisDelegate = axisDel,\n                _buttonDelegate = buttonDel\n            };\n        }\n        \n        public static InputToken CreateCustom(AxisDelegate axisDel, ButtonDelegate buttonDel)\n        {\n            return new InputToken()\n            {\n                Type = InputType.Custom,\n                _axisDelegate = axisDel,\n                _buttonDelegate = buttonDel\n            };\n        }\n        \n        public static InputToken Unknown\n        {\n            get\n            {\n                return new InputToken()\n                {\n                    Type = InputType.Unknown\n                };\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/KeyboardProfile.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.SPInput.Unity\n{\n\n    public class KeyboardProfile<TInputId> : IConfigurableInputProfile<TInputId> where TInputId : struct, System.IConvertible\n    {\n\n        #region Fields\n\n        private Dictionary<TInputId, InputToken> _axisTable = new Dictionary<TInputId, InputToken>();\n        private Dictionary<TInputId, InputToken> _buttonTable = new Dictionary<TInputId, InputToken>();\n\n        #endregion\n\n        #region Properties\n\n        public Dictionary<TInputId, InputToken>.KeyCollection Axes\n        {\n            get { return _axisTable.Keys; }\n        }\n\n        public Dictionary<TInputId, InputToken>.KeyCollection Buttons\n        {\n            get { return _buttonTable.Keys; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public void RegisterAxis(TInputId axis, KeyCode positive, KeyCode negative)\n        {\n            _axisTable[axis] = InputToken.CreateEmulatedAxis(positive, negative);\n            _buttonTable.Remove(axis);\n        }\n\n        public void RegisterMouseAxis(TInputId axis, SPMouseId spaxis)\n        {\n            _axisTable[axis] = InputToken.CreateAxis(spaxis.ToSPInputId());\n            _buttonTable.Remove(axis);\n        }\n\n        public void RegisterAxis(TInputId axis, InputToken token)\n        {\n            _axisTable[axis] = token;\n            _buttonTable.Remove(axis);\n        }\n\n        public void RegisterButton(TInputId button, KeyCode key)\n        {\n            _buttonTable[button] = InputToken.CreateButton(key);\n            _axisTable.Remove(button);\n        }\n\n        public void RegisterMouseButton(TInputId button, SPMouseId spbtn)\n        {\n            _buttonTable[button] = InputToken.CreateButton(spbtn.ToSPInputId());\n            _axisTable.Remove(button);\n        }\n\n        public void RegisterButton(TInputId button, InputToken token)\n        {\n            _buttonTable[button] = token;\n            _axisTable.Remove(button);\n        }\n\n        public InputToken GetAxisMapping(TInputId axis)\n        {\n            InputToken result;\n            if (_axisTable.TryGetValue(axis, out result))\n                return result;\n\n            return InputToken.Unknown;\n        }\n\n        public InputToken GetButtonMapping(TInputId button)\n        {\n            InputToken result;\n            if (_buttonTable.TryGetValue(button, out result))\n                return result;\n\n            return InputToken.Unknown;\n        }\n\n        public bool TryGetAxisMapping(TInputId axis, out InputToken map)\n        {\n            return _axisTable.TryGetValue(axis, out map);\n        }\n\n        public bool TryGetButtonMapping(TInputId button, out InputToken map)\n        {\n            return _buttonTable.TryGetValue(button, out map);\n        }\n\n        public bool Contains(TInputId id)\n        {\n            return _axisTable.ContainsKey(id) || _buttonTable.ContainsKey(id);\n        }\n\n        public bool Remove(TInputId id)\n        {\n            return _axisTable.Remove(id) | _buttonTable.Remove(id);\n        }\n\n        public void Clear()\n        {\n            _axisTable.Clear();\n            _buttonTable.Clear();\n        }\n\n        #endregion\n\n        #region IInputProfile Interface\n\n        public bool TryPollButton(out TInputId button, ButtonState state = ButtonState.Down, Joystick joystick = Joystick.All)\n        {\n            InputToken map;\n\n            var e = _buttonTable.Keys.GetEnumerator();\n            while (e.MoveNext())\n            {\n                if (TryGetButtonMapping(e.Current, out map))\n                {\n                    if(map.PollButton(state, joystick))\n                    {\n                        button = e.Current;\n                        return true;\n                    }\n                }\n            }\n\n            button = default(TInputId);\n            return false;\n        }\n\n        public bool TryPollAxis(out TInputId axis, out float value, Joystick joystick = Joystick.All, float deadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE)\n        {\n            InputToken map;\n\n            var e = _axisTable.Keys.GetEnumerator();\n            while (e.MoveNext())\n            {\n                if (TryGetAxisMapping(e.Current, out map))\n                {\n                    float v = map.PollAxis(joystick);\n                    if(Mathf.Abs(v) > deadZone)\n                    {\n                        axis = e.Current;\n                        value = v;\n                        return true;\n                    }\n                }\n            }\n\n            axis = default(TInputId);\n            value = 0f;\n            return false;\n        }\n\n        public InputToken GetMapping(TInputId id)\n        {\n            InputToken result;\n            if (_axisTable.TryGetValue(id, out result)) return result;\n            if (_buttonTable.TryGetValue(id, out result)) return result;\n\n            return InputToken.Unknown;\n        }\n\n        void IConfigurableInputProfile<TInputId>.SetAxisMapping(TInputId id, InputToken token)\n        {\n            this.RegisterAxis(id, token);\n        }\n\n        void IConfigurableInputProfile<TInputId>.SetButtonMapping(TInputId id, InputToken token)\n        {\n            this.RegisterButton(id, token);\n        }\n\n        void IConfigurableInputProfile<TInputId>.Reset()\n        {\n            this.Clear();\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/PollAxisSignatureRoutine.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.SPInput.Unity\n{\n\n    /// <summary>\n    /// Use this to poll for an InputSignature defined by the user. You start by creating this object, starting it and waiting for it to complete. \n    /// It can also be used as a yield instruction to wait for its completion.<para/>\n    /// Behaviour of this routine:<para/>\n    /// 1) The system expects the player to press in the 'up' direction to register an axis. If they press down it interprets this as wanting inverted controls. <para/>\n    /// 2) Use the PollAsTrigger property to control registering only positive presses for triggers. <para/>\n    /// 3) If PollButtons or PollKeyboard is set true, it will register the first button press as the positive value, and the second as the negative. \n    /// Unless PollAsTrigger is true, in which case it immediately registers as a trigger axis on first button press.\n    /// </summary>\n    /// <typeparam name=\"TButton\"></typeparam>\n    /// <typeparam name=\"TAxis\"></typeparam>\n    public class PollingAxisSignatureRoutine : IRadicalWaitHandle\n    {\n\n        public const float DEFAULT_ButtonPressMonitorDuration = 5f;\n\n        public delegate bool PollingCallback(PollingAxisSignatureRoutine targ, out InputToken token);\n\n        private enum State\n        {\n            Unknown,\n            Running,\n            Cancelled,\n            Complete\n        }\n\n        #region Fields\n\n        private State _state;\n        private RadicalCoroutine _routine;\n\n        private System.Action<PollingAxisSignatureRoutine> _onComplete;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public PollingAxisSignatureRoutine()\n        {\n            this.PollButtons = false;\n            this.PollKeyboard = false;\n            this.PollFromStandardSPInputs = true;\n            this.PollJoyAxes = true;\n            this.PollMouseAxes = false;\n            this.Joystick = Joystick.All;\n            this.AxisConsideration = AxleValueConsideration.Absolute;\n            this.AxisPollingDeadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE;\n            this.ButtonPollingState = ButtonState.Down;\n            this.ButtonPressMonitorDuration = 5.0f;\n            this.CancelKey = UnityEngine.KeyCode.Escape;\n        }\n\n        #endregion\n\n        #region Properties\n\n        /// <summary>\n        /// The resulting InputToken that can be used to create an input signature.\n        /// </summary>\n        public InputToken InputResult\n        {\n            get;\n            set;\n        }\n        \n        /// <summary>\n        /// Joystick # to poll for. <param/>\n        /// Default: <see cref=\"Joystick.All\"/>\n        /// </summary>\n        public Joystick Joystick\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// Should we poll all the standard inputs defined by SPInputDirect. \n        /// If no profiles are defined and this is false, than no gamepads will be polled for. <para/>\n        /// Default: True\n        /// </summary>\n        public bool PollFromStandardSPInputs\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// Should we poll button presses. <para/>\n        /// Default: False\n        /// </summary>\n        public bool PollButtons\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// Should we poll key presses. <para/>\n        /// Default: False\n        /// </summary>\n        public bool PollKeyboard\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// Should we poll for joystick axis tilts. <para/>\n        /// Default: True\n        /// </summary>\n        public bool PollJoyAxes\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// Should we poll for mouse axis movement. <param/>\n        /// Default: False\n        /// </summary>\n        public bool PollMouseAxes\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// When polling an axis what directions should be considered. <param/>\n        /// Default: <see cref=\"AxleValueConsideration.Absolute\"/>\n        /// </summary>\n        public AxleValueConsideration AxisConsideration\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// When polling an axis what is considered the 'not pressed' dead zone. <para/>\n        /// Default: <see cref=\"InputUtil.DEFAULT_AXLEBTNDEADZONE\"/>\n        /// </summary>\n        public float AxisPollingDeadZone\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// When polling a button, what state should we check for.\n        /// Default: <see cref=\"ButtonState.Down\"/>\n        /// </summary>\n        public ButtonState ButtonPollingState\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// If monitoring for button/key presses to emulate an axis this is how long in seconds one should wait before giving up on waiting for the second button press.<para/>\n        /// Note - If AxisConsideration is Positive/Negative, it'll register on the first button press.\n        /// Default: <see cref=\"PollingAxisSignatureRoutine.DEFAULT_ButtonPressMonitorDuration\"/>\n        /// </summary>\n        public float ButtonPressMonitorDuration\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// When polling for the axis, consider it as a trigger. In this case it only registers when the value is positive. This can be used to deal with 2 key issues.<para/>\n        /// 1) When monitoring for 0->1 presses for triggers, this will allow you to ignore negative presses by monitoring only Positive. <para/>\n        /// 2) For strange input devices that register -1 for depressed (PS4 controller on some platforms), this allows you to \n        /// ignore that depressed state by setting it to only monitor Positive. <para/>\n        /// Default: True\n        /// </summary>\n        public bool PollAsTrigger\n        {\n            get;\n            set;\n        }\n        \n        /// <summary>\n        /// A key the user can press to cancel out of the polling. <para/>\n        /// Default: <see cref=\"UnityEngine.KeyCode.Escape\"/>\n        /// </summary>\n        public UnityEngine.KeyCode CancelKey\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// A custom button press that can be used to register a cancel instead of the CancelKey. \n        /// Useful for allowing a gamepad button press to cancel with. <para/>\n        /// Default: Null\n        /// </summary>\n        public ButtonDelegate CancelDelegate\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// Set this to allow to poll for some custom inputs.\n        /// </summary>\n        public PollingCallback CustomPollingCallback\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region Methods\n\n        public void Start(float delay = 0f)\n        {\n            if (_routine != null)\n            {\n                if (_routine.Finished)\n                {\n                    _routine = null;\n                    _state = State.Unknown;\n                }\n                else\n                {\n                    //already running\n                    return;\n                }\n            }\n\n            _state = State.Running;\n            this.InputResult = InputToken.Unknown;\n            _routine = GameLoopEntry.Hook.StartRadicalCoroutine(this.WorkRoutine(delay));\n        }\n\n        public void Cancel()\n        {\n            if (_routine != null)\n            {\n                _routine.Cancel();\n                _routine = null;\n            }\n\n            _state = State.Cancelled;\n            this.InputResult = InputToken.Unknown;\n            this.SignalOnComplete();\n        }\n\n        public IAxleInputSignature CreateInputSignature(string id)\n        {\n            return new DelegatedAxleInputSignature(id, this.InputResult.CreateAxisDelegate(this.Joystick));\n        }\n\n        private void SignalOnComplete()\n        {\n            if (_onComplete != null)\n            {\n                var d = _onComplete;\n                _onComplete = null;\n                d(this);\n            }\n        }\n\n        private System.Collections.IEnumerator WorkRoutine(float delay)\n        {\n            yield return WaitForDuration.Seconds(delay, SPTime.Real);\n\n            SPInputId positiveBtn = SPInputId.Unknown;\n            UnityEngine.KeyCode positiveKey = UnityEngine.KeyCode.None;\n            float t = float.NegativeInfinity;\n\n            while (_state == State.Running)\n            {\n                if (UnityEngine.Input.GetKeyDown(this.CancelKey))\n                {\n                    this.Cancel();\n                    yield break;\n                }\n                if (this.CancelDelegate != null && this.CancelDelegate())\n                {\n                    this.Cancel();\n                    yield break;\n                }\n                \n                if(this.CustomPollingCallback != null)\n                {\n                    InputToken token;\n                    if(this.CustomPollingCallback(this, out token))\n                    {\n                        this.InputResult = token;\n                        goto Complete;\n                    }\n                }\n\n                if (this.PollFromStandardSPInputs)\n                {\n                    if (this.PollJoyAxes || this.PollMouseAxes)\n                    {\n                        SPInputId axis;\n                        float value;\n                        if (SPInputDirect.TryPollAxis(out axis, out value, this.Joystick, this.PollMouseAxes, this.AxisPollingDeadZone) && TestConsideration(value, this.AxisConsideration, this.AxisPollingDeadZone))\n                        {\n                            if ((this.PollJoyAxes && axis.IsJoyAxis()) || (this.PollMouseAxes && axis.IsMouseAxis()))\n                            {\n                                if (this.PollAsTrigger)\n                                {\n                                    this.InputResult = InputToken.CreateTrigger(axis);\n                                }\n                                else\n                                {\n                                    this.InputResult = InputToken.CreateAxis(axis, value < 0f);\n                                }\n                                goto Complete;\n                            }\n                        }\n                    }\n\n                    if (this.PollButtons)\n                    {\n                        SPInputId btn;\n                        if (SPInputDirect.TryPollButton(out btn, this.ButtonPollingState, this.Joystick))\n                        {\n                            if (this.PollAsTrigger)\n                            {\n                                this.InputResult = InputToken.CreateTrigger(btn, AxleValueConsideration.Positive);\n                                goto Complete;\n                            }\n                            if (positiveBtn != SPInputId.Unknown)\n                            {\n                                this.InputResult = InputToken.CreateEmulatedAxis(positiveBtn, btn);\n                                goto Complete;\n                            }\n                            else\n                            {\n                                positiveKey = UnityEngine.KeyCode.None;\n                                positiveBtn = btn;\n                                t = UnityEngine.Time.realtimeSinceStartup;\n                                goto Restart;\n                            }\n                        }\n                    }\n                }\n\n                if (this.PollKeyboard)\n                {\n                    UnityEngine.KeyCode key;\n                    if (SPInputDirect.TryPollKey(out key, this.ButtonPollingState))\n                    {\n                        if (this.PollAsTrigger)\n                        {\n                            this.InputResult = InputToken.CreateTrigger(key);\n                            goto Complete;\n                        }\n                        if (positiveKey != UnityEngine.KeyCode.None)\n                        {\n                            this.InputResult = InputToken.CreateEmulatedAxis(positiveKey, key);\n                            goto Complete;\n                        }\n                        else\n                        {\n                            positiveBtn = SPInputId.Unknown;\n                            positiveKey = key;\n                            t = UnityEngine.Time.realtimeSinceStartup;\n                            goto Restart;\n                        }\n                    }\n                }\n\n                Restart:\n                yield return null;\n\n                if (UnityEngine.Time.realtimeSinceStartup - t > this.ButtonPressMonitorDuration)\n                {\n                    positiveBtn = SPInputId.Unknown;\n                    positiveKey = UnityEngine.KeyCode.None;\n                }\n            }\n\n            Complete:\n            _state = State.Complete;\n            _routine = null;\n            this.SignalOnComplete();\n        }\n\n        #endregion\n\n        #region IRadicalWaitHandle Interface\n\n        public bool Cancelled\n        {\n            get { return _state == State.Cancelled; }\n        }\n\n        public bool IsComplete\n        {\n            get { return _state >= State.Cancelled; }\n        }\n\n        public void OnComplete(System.Action<PollingAxisSignatureRoutine> callback)\n        {\n            _onComplete += callback;\n        }\n\n        void IRadicalWaitHandle.OnComplete(Action<IRadicalWaitHandle> callback)\n        {\n            if (callback == null) return;\n            _onComplete += (o) => callback(o);\n        }\n\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\n        {\n            if (_state == State.Running)\n            {\n                yieldObject = _routine;\n                return true;\n            }\n            else\n            {\n                yieldObject = null;\n                return false;\n            }\n        }\n\n        #endregion\n\n        #region Static Utils\n\n        private static bool TestConsideration(float value, AxleValueConsideration consideration, float deadZone)\n        {\n            switch (consideration)\n            {\n                case AxleValueConsideration.Positive:\n                    return value > deadZone;\n                case AxleValueConsideration.Negative:\n                    return value < -deadZone;\n                case AxleValueConsideration.Absolute:\n                    return Math.Abs(value) > deadZone;\n                default:\n                    return false;\n            }\n        }\n\n\n        /// <summary>\n        /// Create a custom polling callback that polls an array of IInputProfiles. \n        /// This can be useful for input devices that act strange, yet the profile fixes that behaviour.\n        /// For example the PS4 controller's L2/R2 buttons are weird and return -1 when depressed, but its profile fixes it.\n        /// </summary>\n        /// <typeparam name=\"TButton\"></typeparam>\n        /// <typeparam name=\"TAxis\"></typeparam>\n        /// <param name=\"profiles\"></param>\n        /// <returns></returns>\n        public static PollingCallback CreateProfileAxisPollingCallback<TInputId>(params IInputProfile<TInputId>[] profiles) where TInputId : struct, System.IConvertible\n        {\n            if (profiles == null || profiles.Length == 0) return null;\n\n            return (PollingAxisSignatureRoutine targ, out InputToken token) =>\n            {\n                if (targ.PollJoyAxes)\n                {\n                    foreach (var p in profiles)\n                    {\n                        TInputId axis;\n                        float value;\n                        if (p.TryPollAxis(out axis, out value, targ.Joystick, targ.AxisPollingDeadZone))\n                        {\n                            token = p.GetMapping(axis);\n                            if(value < 0f && token.Mode == InputMode.Axis)\n                            {\n                                token.AltValue = (token.AltValue == 0) ? 1 : 0;\n                            }\n                            return true;\n                        }\n                    }\n                }\n\n                if (targ.PollButtons && targ.PollAsTrigger)\n                {\n                    foreach (var p in profiles)\n                    {\n                        TInputId btn;\n                        if (p.TryPollButton(out btn, ButtonState.Released, targ.Joystick))\n                        {\n                            token = p.GetMapping(btn);\n                            return true;\n                        }\n                    }\n                }\n\n                token = InputToken.Unknown;\n                return false;\n            };\n        }\n        \n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/PollButtonSignatureRoutine.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.SPInput.Unity\n{\n\n    /// <summary>\n    /// Use this to poll for an InputSignature defined by the user. You start by creating this object, starting it and waiting for it to complete. \n    /// It can also be used as a yield instruction to wait for its completion.<para/>\n    /// </summary>\n    /// <typeparam name=\"TButton\"></typeparam>\n    /// <typeparam name=\"TAxis\"></typeparam>\n    public class PollingButtonSignatureRoutine : IRadicalWaitHandle\n    {\n\n        public delegate bool PollingCallback(PollingButtonSignatureRoutine targ, out InputToken token);\n\n        private enum State\n        {\n            Unknown,\n            Running,\n            Cancelled,\n            Complete\n        }\n\n        #region Fields\n\n        private State _state;\n        private RadicalCoroutine _routine;\n\n        private System.Action<PollingButtonSignatureRoutine> _onComplete;\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        public PollingButtonSignatureRoutine()\n        {\n            this.PollButtons = true;\n            this.PollKeyboard = true;\n            this.PollFromStandardSPInputs = true;\n            this.PollJoyAxes = false;\n            this.PollMouseAxes = false;\n            this.Joystick = Joystick.All;\n            this.AxisConsideration = AxleValueConsideration.Positive;\n            this.AxisPollingDeadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE;\n            this.ButtonPollingState = ButtonState.Down;\n            this.CancelKey = UnityEngine.KeyCode.Escape;\n        }\n\n        #endregion\n\n        #region Properties\n\n        /// <summary>\n        /// The resulting InputToken that can be used to create an input signature.\n        /// </summary>\n        public InputToken InputResult\n        {\n            get;\n            set;\n        }\n        \n        /// <summary>\n        /// Joystick # to poll for. <param/>\n        /// Default: <see cref=\"Joystick.All\"/>\n        /// </summary>\n        public Joystick Joystick\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// Should we poll all the standard inputs defined by SPInputDirect. \n        /// If no profiles are defined and this is false, than no gamepads will be polled for. <para/>\n        /// Default: True\n        /// </summary>\n        public bool PollFromStandardSPInputs\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// Should we poll button presses. <para/>\n        /// Default: True\n        /// </summary>\n        public bool PollButtons\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// Should we poll key presses. <param/>\n        /// Default: True\n        /// </summary>\n        public bool PollKeyboard\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// Should we poll for joystick axis tilts. <para/>\n        /// Default: False\n        /// </summary>\n        public bool PollJoyAxes\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// Should we poll for mouse axis movement. <param/>\n        /// Default: False\n        /// </summary>\n        public bool PollMouseAxes\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// When polling an axis what directions should be considered. <param/>\n        /// Default: <see cref=\"AxleValueConsideration.Positive\"/>\n        /// </summary>\n        public AxleValueConsideration AxisConsideration\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// When polling an axis what is considered the 'not pressed' dead zone. <param/>\n        /// Default: <see cref=\"InputUtil.DEFAULT_AXLEBTNDEADZONE\"/>\n        /// </summary>\n        public float AxisPollingDeadZone\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// When polling a button, what state should we check for.\n        /// Default: <see cref=\"ButtonState.Down\"/>\n        /// </summary>\n        public ButtonState ButtonPollingState\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// A key the user can press to cancel out of the polling. <param/>\n        /// Default: <see cref=\"UnityEngine.KeyCode.Escape\"/>\n        /// </summary>\n        public UnityEngine.KeyCode CancelKey\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// A custom button press that can be used to register a cancel instead of the CancelKey. \n        /// Useful for allowing a gamepad button press to cancel with.<param/>\n        /// Default: Null\n        /// </summary>\n        public ButtonDelegate CancelDelegate\n        {\n            get;\n            set;\n        }\n\n        /// <summary>\n        /// Set this to allow to poll for some custom inputs to register buttons.\n        /// </summary>\n        public PollingCallback CustomPollingCallback\n        {\n            get;\n            set;\n        }\n\n        #endregion\n\n        #region Methods\n\n        public void Start(float delay = 0f)\n        {\n            if (_routine != null)\n            {\n                if (_routine.Finished)\n                {\n                    _routine = null;\n                    _state = State.Unknown;\n                }\n                else\n                {\n                    //already running\n                    return;\n                }\n            }\n\n            _state = State.Running;\n            this.InputResult = InputToken.Unknown;\n            _routine = GameLoopEntry.Hook.StartRadicalCoroutine(this.WorkRoutine(delay));\n        }\n\n        public void Cancel()\n        {\n            if (_routine != null)\n            {\n                _routine.Cancel();\n                _routine = null;\n            }\n\n            this.InputResult = InputToken.Unknown;\n            _state = State.Cancelled;\n            this.SignalOnComplete();\n        }\n\n        public IInputSignature CreateInputSignature(string id)\n        {\n            return new DelegatedButtonInputSignature(id, this.InputResult.CreateButtonDelegate(this.Joystick));\n        }\n\n        private void SignalOnComplete()\n        {\n            if (_onComplete != null)\n            {\n                var d = _onComplete;\n                _onComplete = null;\n                d(this);\n            }\n        }\n\n        private System.Collections.IEnumerator WorkRoutine(float delay)\n        {\n            yield return WaitForDuration.Seconds(delay, SPTime.Real);\n\n            while (_state == State.Running)\n            {\n                if (UnityEngine.Input.GetKeyDown(this.CancelKey))\n                {\n                    this.Cancel();\n                    yield break;\n                }\n                if (this.CancelDelegate != null && this.CancelDelegate())\n                {\n                    this.Cancel();\n                    yield break;\n                }\n                \n                if (this.CustomPollingCallback != null)\n                {\n                    InputToken t;\n                    if (this.CustomPollingCallback(this, out t))\n                    {\n                        this.InputResult = t;\n                        goto Complete;\n                    }\n                }\n\n                if (this.PollFromStandardSPInputs)\n                {\n                    if (this.PollButtons)\n                    {\n                        SPInputId btn;\n                        if (SPInputDirect.TryPollButton(out btn, this.ButtonPollingState, this.Joystick))\n                        {\n                            this.InputResult = InputToken.CreateButton(btn);\n                            goto Complete;\n                        }\n                    }\n\n                    if (this.PollJoyAxes || this.PollMouseAxes)\n                    {\n                        SPInputId axis;\n                        float value;\n                        if (SPInputDirect.TryPollAxis(out axis, out value, this.Joystick, this.PollMouseAxes, this.AxisPollingDeadZone) && TestConsideration(value, this.AxisConsideration, this.AxisPollingDeadZone))\n                        {\n                            if ((this.PollJoyAxes && axis.IsJoyAxis()) || (this.PollMouseAxes && axis.IsMouseAxis()))\n                            {\n                                this.InputResult = InputToken.CreateAxleButton(axis, this.AxisConsideration, this.AxisPollingDeadZone);\n                                goto Complete;\n                            }\n                        }\n                    }\n                }\n\n                if (this.PollKeyboard)\n                {\n                    UnityEngine.KeyCode key;\n                    if (SPInputDirect.TryPollKey(out key, this.ButtonPollingState))\n                    {\n                        this.InputResult = InputToken.CreateButton(key);\n                        goto Complete;\n                    }\n                }\n\n                yield return null;\n            }\n\n            Complete:\n            _state = State.Complete;\n            _routine = null;\n            this.SignalOnComplete();\n        }\n\n        #endregion\n\n        #region IRadicalWaitHandle Interface\n\n        public bool Cancelled\n        {\n            get { return _state == State.Cancelled; }\n        }\n\n        public bool IsComplete\n        {\n            get { return _state >= State.Cancelled; }\n        }\n\n        public void OnComplete(System.Action<PollingButtonSignatureRoutine> callback)\n        {\n            _onComplete += callback;\n        }\n\n        void IRadicalWaitHandle.OnComplete(Action<IRadicalWaitHandle> callback)\n        {\n            if (callback == null) return;\n            _onComplete += (o) => callback(o);\n        }\n\n        bool IRadicalYieldInstruction.Tick(out object yieldObject)\n        {\n            if (_state == State.Running)\n            {\n                yieldObject = _routine;\n                return true;\n            }\n            else\n            {\n                yieldObject = null;\n                return false;\n            }\n        }\n\n        #endregion\n\n        #region Static Utils\n\n        private static bool TestConsideration(float value, AxleValueConsideration consideration, float deadZone)\n        {\n            switch (consideration)\n            {\n                case AxleValueConsideration.Positive:\n                    return value > deadZone;\n                case AxleValueConsideration.Negative:\n                    return value < -deadZone;\n                case AxleValueConsideration.Absolute:\n                    return Math.Abs(value) > deadZone;\n                default:\n                    return false;\n            }\n        }\n\n        /// <summary>\n        /// Create a custom polling callback that polls an array of IInputProfiles. \n        /// This can be useful for input devices that act strange, yet the profile fixes that behaviour.\n        /// For example the PS4 controller's L2/R2 buttons are weird and return -1 when depressed, but its profile fixes it.\n        /// </summary>\n        /// <typeparam name=\"TButton\"></typeparam>\n        /// <typeparam name=\"TAxis\"></typeparam>\n        /// <param name=\"profiles\"></param>\n        /// <returns></returns>\n        public static PollingCallback CreateProfilePollingCallback<TInputId>(params IInputProfile<TInputId>[] profiles) where TInputId : struct, System.IConvertible\n        {\n            if (profiles == null || profiles.Length == 0) return null;\n\n            return (PollingButtonSignatureRoutine targ, out InputToken token) =>\n            {\n                if (targ.PollButtons || targ.PollJoyAxes)\n                {\n                    foreach (var p in profiles)\n                    {\n                        if (targ.PollButtons)\n                        {\n                            TInputId btn;\n                            if (p.TryPollButton(out btn, ButtonState.Released, targ.Joystick))\n                            {\n                                token = p.GetMapping(btn);\n                                return true;\n                            }\n                        }\n\n                        if (targ.PollJoyAxes)\n                        {\n                            TInputId axis;\n                            float value;\n                            if (p.TryPollAxis(out axis, out value, targ.Joystick, targ.AxisPollingDeadZone))\n                            {\n                                token = p.GetMapping(axis);\n                                return true;\n                            }\n                        }\n                    }\n                }\n\n                token = InputToken.Unknown;\n                return false;\n            };\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/SPInputDirect.cs",
    "content": "﻿using System;\nusing UnityEngine;\nusing System.Collections.Generic;\n\nnamespace com.spacepuppy.SPInput.Unity\n{\n\n    public static class SPInputDirect\n    {\n\n        #region Fields\n\n        private const int ID_AXISLOW = (int)SPInputId.Axis1;\n        private const int ID_AXISMID = (int)SPInputId.Axis28;\n        private const int ID_AXISHIGH = (int)SPInputId.MouseAxis3;\n        private const int ID_BUTTONLOW = (int)SPInputId.Button0;\n        private const int ID_BUTTONHIGH = (int)SPInputId.MouseButton6;\n\n        private static Dictionary<int, string> _inputIdToName;\n        private static UnityEngine.KeyCode[] _allKeyCodes;\n\n        #endregion\n\n        #region SPInputId Extension Methods\n\n        public static bool IsJoyAxis(this SPInputId id)\n        {\n            return id >= SPInputId.Axis1 && id <= SPInputId.Axis28;\n        }\n\n        public static bool IsMouseAxis(this SPInputId id)\n        {\n            return id >= SPInputId.MouseAxis1 && id <= SPInputId.MouseAxis3;\n        }\n\n        public static bool IsAxis(this SPInputId id)\n        {\n            return id >= SPInputId.Axis1 && id <= SPInputId.MouseAxis3;\n        }\n\n        public static bool IsJoyButton(this SPInputId id)\n        {\n            return id >= SPInputId.Button0 && id <= SPInputId.Button19;\n        }\n\n        public static bool IsMouseButton(this SPInputId id)\n        {\n            return id >= SPInputId.MouseButton0 && id <= SPInputId.MouseButton6;\n        }\n\n        public static bool IsButton(this SPInputId id)\n        {\n            return id >= SPInputId.Button0 && id <= SPInputId.MouseButton6;\n        }\n\n        public static SPInputId ToSPInputId(this SPMouseId id)\n        {\n            return (SPInputId)id;\n        }\n\n        #endregion\n\n        #region Standard Input Testing\n\n        public static bool GetButton(SPInputId button, Joystick joystick = Joystick.All)\n        {\n            return UnityEngine.Input.GetButton(GetInputName(button, joystick));\n        }\n\n        public static bool GetButton(SPInputId button, ButtonState state, Joystick joystick = Joystick.All)\n        {\n            switch(state)\n            {\n                case ButtonState.None:\n                    return !UnityEngine.Input.GetButton(GetInputName(button, joystick));\n                case ButtonState.Down:\n                    return UnityEngine.Input.GetButtonDown(GetInputName(button, joystick));\n                case ButtonState.Held:\n                    return UnityEngine.Input.GetButton(GetInputName(button, joystick));\n                case ButtonState.Released:\n                    return UnityEngine.Input.GetButtonUp(GetInputName(button, joystick));\n                default:\n                    return false;\n            }\n        }\n\n        public static bool GetButtonDown(SPInputId button, Joystick joystick = Joystick.All)\n        {\n            return UnityEngine.Input.GetButtonDown(GetInputName(button, joystick));\n        }\n\n        public static bool GetButtonUp(SPInputId button, Joystick joystick = Joystick.All)\n        {\n            return UnityEngine.Input.GetButtonUp(GetInputName(button, joystick));\n        }\n\n        public static float GetAxis(SPInputId axis, Joystick joystick = Joystick.All)\n        {\n            return UnityEngine.Input.GetAxis(GetInputName(axis, joystick));\n        }\n\n        public static float GetAxisRaw(SPInputId axis, Joystick joystick = Joystick.All)\n        {\n            return UnityEngine.Input.GetAxisRaw(GetInputName(axis, joystick));\n        }\n\n        public static bool GetKey(KeyCode key, ButtonState state)\n        {\n            switch (state)\n            {\n                case ButtonState.None:\n                    return !UnityEngine.Input.GetKey(key);\n                case ButtonState.Down:\n                    return UnityEngine.Input.GetKeyDown(key);\n                case ButtonState.Held:\n                    return UnityEngine.Input.GetKey(key);\n                case ButtonState.Released:\n                    return UnityEngine.Input.GetKeyUp(key);\n                default:\n                    return false;\n            }\n        }\n\n        /// <summary>\n        /// Returns if any key of a specific type is pressed.\n        /// This can be sort of slow if testing anything other than 'All'/'None' since it must loop all keys.\n        /// </summary>\n        /// <param name=\"etp\"></param>\n        /// <returns></returns>\n        public static bool GetAnyKey(KeyCodeType etp)\n        {\n            if (!Input.anyKey) return false;\n\n            const int MOUSE_LOW = (int)KeyCode.Mouse0;\n            const int MOUSE_HIGH = (int)KeyCode.Mouse6;\n            const int JOY_LOW = (int)KeyCode.JoystickButton0;\n            const int JOY_HIGH = (int)KeyCode.JoystickButton19;\n            \n            switch((int)etp & 7)\n            {\n                case 0:\n                    return false;\n                case 1: //keyboard only\n                    {\n                        if (_allKeyCodes == null) _allKeyCodes = System.Enum.GetValues(typeof(UnityEngine.KeyCode)) as UnityEngine.KeyCode[];\n\n                        for (int i = 0; i < _allKeyCodes.Length; i++)\n                        {\n                            if ((int)_allKeyCodes[i] >= MOUSE_LOW) break;\n\n                            if (Input.GetKey(_allKeyCodes[i])) return true;\n                        }\n\n                        return false;\n                    }\n                case 2: //mouse only\n                    {\n                        for(int i = MOUSE_LOW; i <= MOUSE_HIGH; i++)\n                        {\n                            if (Input.GetKey((KeyCode)i)) return true;\n                        }\n\n                        return false;\n                    }\n                case 3: // k/m\n                    {\n                        if (_allKeyCodes == null) _allKeyCodes = System.Enum.GetValues(typeof(UnityEngine.KeyCode)) as UnityEngine.KeyCode[];\n\n                        for (int i = 0; i < _allKeyCodes.Length; i++)\n                        {\n                            if ((int)_allKeyCodes[i] > MOUSE_HIGH) break;\n\n                            if (Input.GetKey(_allKeyCodes[i])) return true;\n                        }\n\n                        return false;\n                    }\n                case 4: //joystick only\n                    {\n                        for (int i = JOY_LOW; i <= JOY_HIGH; i++)\n                        {\n                            if (Input.GetKey((KeyCode)i)) return true;\n                        }\n\n                        return false;\n                    }\n                case 5: //keyboard & joystick\n                    {\n                        if (_allKeyCodes == null) _allKeyCodes = System.Enum.GetValues(typeof(UnityEngine.KeyCode)) as UnityEngine.KeyCode[];\n\n                        for (int i = 0; i < _allKeyCodes.Length; i++)\n                        {\n                            if ((int)_allKeyCodes[i] >= MOUSE_LOW || (int)_allKeyCodes[i] <= MOUSE_HIGH) continue;\n\n                            if (Input.GetKey(_allKeyCodes[i])) return true;\n                        }\n\n                        return false;\n                    }\n                case 6: //joystick & mouse\n                    {\n                        for (int i = MOUSE_LOW; i <= MOUSE_HIGH; i++)\n                        {\n                            if (Input.GetKey((KeyCode)i)) return true;\n                        }\n\n                        for (int i = JOY_LOW; i <= JOY_HIGH; i++)\n                        {\n                            if (Input.GetKey((KeyCode)i)) return true;\n                        }\n\n                        return false;\n                    }\n                default:\n                    return Input.anyKey;\n            }\n        }\n        \n        #endregion\n\n        #region Polling\n\n        public static SPInputId PollButton(ButtonState state = ButtonState.Down, Joystick joystick = Joystick.All)\n        {\n            if (joystick != Joystick.None)\n            {\n                for (int i = ID_BUTTONLOW; i <= ID_BUTTONHIGH; i++)\n                {\n                    switch(state)\n                    {\n                        case ButtonState.None:\n                            if (!UnityEngine.Input.GetButton(GetInputName((SPInputId)i, joystick)))\n                            {\n                                return (SPInputId)i;\n                            }\n                            break;\n                        case ButtonState.Down:\n                            if (UnityEngine.Input.GetButtonDown(GetInputName((SPInputId)i, joystick)))\n                            {\n                                return (SPInputId)i;\n                            }\n                            break;\n                        case ButtonState.Held:\n                            if (UnityEngine.Input.GetButton(GetInputName((SPInputId)i, joystick)))\n                            {\n                                return (SPInputId)i;\n                            }\n                            break;\n                        case ButtonState.Released:\n                            if (UnityEngine.Input.GetButtonUp(GetInputName((SPInputId)i, joystick)))\n                            {\n                                return (SPInputId)i;\n                            }\n                            break;\n                    }\n                }\n            }\n            return SPInputId.Unknown;\n        }\n\n        public static bool TryPollButton(out SPInputId button, ButtonState state = ButtonState.Down, Joystick joystick = Joystick.All)\n        {\n            if (joystick != Joystick.None)\n            {\n                for (int i = ID_BUTTONLOW; i <= ID_BUTTONHIGH; i++)\n                {\n                    switch (state)\n                    {\n                        case ButtonState.None:\n                            if (!UnityEngine.Input.GetButton(GetInputName((SPInputId)i, joystick)))\n                            {\n                                button = (SPInputId)i;\n                                return true;\n                            }\n                            break;\n                        case ButtonState.Down:\n                            if (UnityEngine.Input.GetButtonDown(GetInputName((SPInputId)i, joystick)))\n                            {\n                                button = (SPInputId)i;\n                                return true;\n                            }\n                            break;\n                        case ButtonState.Held:\n                            if (UnityEngine.Input.GetButton(GetInputName((SPInputId)i, joystick)))\n                            {\n                                button = (SPInputId)i;\n                                return true;\n                            }\n                            break;\n                        case ButtonState.Released:\n                            if (UnityEngine.Input.GetButtonUp(GetInputName((SPInputId)i, joystick)))\n                            {\n                                button = (SPInputId)i;\n                                return true;\n                            }\n                            break;\n                    }\n                }\n            }\n            button = SPInputId.Unknown;\n            return false;\n        }\n\n        public static SPInputId[] PollAllButtons(ButtonState state = ButtonState.Down, Joystick joystick = Joystick.All)\n        {\n            if (joystick != Joystick.None)\n            {\n                using (var lst = com.spacepuppy.Collections.TempCollection.GetList<SPInputId>())\n                {\n                    for (int i = ID_BUTTONLOW; i <= ID_BUTTONHIGH; i++)\n                    {\n                        switch (state)\n                        {\n                            case ButtonState.None:\n                                if (!UnityEngine.Input.GetButton(GetInputName((SPInputId)i, joystick)))\n                                {\n                                    lst.Add((SPInputId)i);\n                                }\n                                break;\n                            case ButtonState.Down:\n                                if (UnityEngine.Input.GetButtonDown(GetInputName((SPInputId)i, joystick)))\n                                {\n                                    lst.Add((SPInputId)i);\n                                }\n                                break;\n                            case ButtonState.Held:\n                                if (UnityEngine.Input.GetButton(GetInputName((SPInputId)i, joystick)))\n                                {\n                                    lst.Add((SPInputId)i);\n                                }\n                                break;\n                            case ButtonState.Released:\n                                if (UnityEngine.Input.GetButtonUp(GetInputName((SPInputId)i, joystick)))\n                                {\n                                    lst.Add((SPInputId)i);\n                                }\n                                break;\n                        }\n                    }\n                    \n                    return lst.Count > 0 ? lst.ToArray() : com.spacepuppy.Utils.ArrayUtil.Empty<SPInputId>();\n                }\n            }\n\n            return com.spacepuppy.Utils.ArrayUtil.Empty<SPInputId>();\n        }\n\n        public static SPInputId PollAxis(Joystick joystick = Joystick.All, bool pollMouse = false, float deadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE)\n        {\n            if (joystick != Joystick.None)\n            {\n                int high = pollMouse ? ID_AXISHIGH : ID_AXISMID;\n                for (int i = ID_AXISLOW; i <= high; i++)\n                {\n                    float v = Input.GetAxis(GetInputName((SPInputId)i, joystick));\n                    if (Mathf.Abs(v) > deadZone)\n                    {\n                        return (SPInputId)i;\n                    }\n                }\n            }\n            return SPInputId.Unknown;\n        }\n\n        public static bool TryPollAxis(out SPInputId axis, Joystick joystick = Joystick.All, bool pollMouse = false, float deadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE)\n        {\n            if (joystick != Joystick.None)\n            {\n                int high = pollMouse ? ID_AXISHIGH : ID_AXISMID;\n                for (int i = ID_AXISLOW; i <= high; i++)\n                {\n                    float v = Input.GetAxis(GetInputName((SPInputId)i, joystick));\n                    if (Mathf.Abs(v) > deadZone)\n                    {\n                        axis = (SPInputId)i;\n                        return true;\n                    }\n                }\n            }\n            axis = SPInputId.Unknown;\n            return false;\n        }\n\n        public static bool TryPollAxis(out SPInputId axis, out float value, Joystick joystick = Joystick.All, bool pollMouse = false, float deadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE)\n        {\n            if (joystick != Joystick.None)\n            {\n                int high = pollMouse ? ID_AXISHIGH : ID_AXISMID;\n                for (int i = ID_AXISLOW; i <= high; i++)\n                {\n                    float v = Input.GetAxis(GetInputName((SPInputId)i, joystick));\n                    if (Mathf.Abs(v) > deadZone)\n                    {\n                        axis = (SPInputId)i;\n                        value = v;\n                        return true;\n                    }\n                }\n            }\n            axis = SPInputId.Unknown;\n            value = 0f;\n            return false;\n        }\n\n        public static SPInputId[] PollAllAxes(Joystick joystick = Joystick.All, bool pollMouse = false)\n        {\n            if (joystick != Joystick.None)\n            {\n                using (var lst = com.spacepuppy.Collections.TempCollection.GetList<SPInputId>())\n                {\n                    int high = pollMouse ? ID_AXISHIGH : ID_AXISMID;\n                    for (int i = ID_AXISLOW; i < high; i++)\n                    {\n                        if (Mathf.Abs(UnityEngine.Input.GetAxis(GetInputName((SPInputId)i, joystick))) > 0.5f)\n                        {\n                            lst.Add((SPInputId)i);\n                        }\n                    }\n\n                    return lst.Count > 0 ? lst.ToArray() : com.spacepuppy.Utils.ArrayUtil.Empty<SPInputId>();\n                }\n            }\n\n            return com.spacepuppy.Utils.ArrayUtil.Empty<SPInputId>();\n        }\n\n        public static UnityEngine.KeyCode PollKey(ButtonState state = ButtonState.Down)\n        {\n            if (_allKeyCodes == null) _allKeyCodes = System.Enum.GetValues(typeof(UnityEngine.KeyCode)) as UnityEngine.KeyCode[];\n\n            for (int i = 0; i < _allKeyCodes.Length; i++)\n            {\n                switch (state)\n                {\n                    case ButtonState.None:\n                        if (!UnityEngine.Input.GetKey(_allKeyCodes[i]))\n                        {\n                            return _allKeyCodes[i];\n                        }\n                        break;\n                    case ButtonState.Down:\n                        if (UnityEngine.Input.GetKeyDown(_allKeyCodes[i]))\n                        {\n                            return _allKeyCodes[i];\n                        }\n                        break;\n                    case ButtonState.Held:\n                        if (UnityEngine.Input.GetKey(_allKeyCodes[i]))\n                        {\n                            return _allKeyCodes[i];\n                        }\n                        break;\n                    case ButtonState.Released:\n                        if (UnityEngine.Input.GetKeyUp(_allKeyCodes[i]))\n                        {\n                            return _allKeyCodes[i];\n                        }\n                        break;\n                }\n            }\n            return UnityEngine.KeyCode.None;\n        }\n\n        public static bool TryPollKey(out UnityEngine.KeyCode key, ButtonState state = ButtonState.Down)\n        {\n            if (_allKeyCodes == null) _allKeyCodes = System.Enum.GetValues(typeof(UnityEngine.KeyCode)) as UnityEngine.KeyCode[];\n\n            key = KeyCode.None;\n            for (int i = 0; i < _allKeyCodes.Length; i++)\n            {\n                switch (state)\n                {\n                    case ButtonState.None:\n                        if (!UnityEngine.Input.GetKey(_allKeyCodes[i]))\n                        {\n                            key = _allKeyCodes[i];\n                            return true;\n                        }\n                        break;\n                    case ButtonState.Down:\n                        if (UnityEngine.Input.GetKeyDown(_allKeyCodes[i]))\n                        {\n                            key = _allKeyCodes[i];\n                            return true;\n                        }\n                        break;\n                    case ButtonState.Held:\n                        if (UnityEngine.Input.GetKey(_allKeyCodes[i]))\n                        {\n                            key = _allKeyCodes[i];\n                            return true;\n                        }\n                        break;\n                    case ButtonState.Released:\n                        if (UnityEngine.Input.GetKeyUp(_allKeyCodes[i]))\n                        {\n                            key = _allKeyCodes[i];\n                            return true;\n                        }\n                        break;\n                }\n            }\n            return false;\n        }\n\n        public static KeyCode[] PollAllKeys(ButtonState state = ButtonState.Down)\n        {\n            if (_allKeyCodes == null) _allKeyCodes = System.Enum.GetValues(typeof(UnityEngine.KeyCode)) as UnityEngine.KeyCode[];\n\n            using (var lst = com.spacepuppy.Collections.TempCollection.GetList<KeyCode>())\n            {\n                for (int i = 0; i < _allKeyCodes.Length; i++)\n                {\n                    switch (state)\n                    {\n                        case ButtonState.None:\n                            if (!UnityEngine.Input.GetKey(_allKeyCodes[i]))\n                            {\n                                lst.Add(_allKeyCodes[i]);\n                            }\n                            break;\n                        case ButtonState.Down:\n                            if (UnityEngine.Input.GetKeyDown(_allKeyCodes[i]))\n                            {\n                                lst.Add(_allKeyCodes[i]);\n                            }\n                            break;\n                        case ButtonState.Held:\n                            if (UnityEngine.Input.GetKey(_allKeyCodes[i]))\n                            {\n                                lst.Add(_allKeyCodes[i]);\n                            }\n                            break;\n                        case ButtonState.Released:\n                            if (UnityEngine.Input.GetKeyUp(_allKeyCodes[i]))\n                            {\n                                lst.Add(_allKeyCodes[i]);\n                            }\n                            break;\n                    }\n                }\n\n                return lst.Count > 0 ? lst.ToArray() : com.spacepuppy.Utils.ArrayUtil.Empty<KeyCode>();\n            }\n        }\n\n        #endregion\n\n\n        #region ID Lookup\n\n        public static string GetInputName(SPInputId id, Joystick joystick = Joystick.All)\n        {\n            if (id == SPInputId.Unknown) return null;\n\n            if (_inputIdToName == null) _inputIdToName = new Dictionary<int, string>();\n            int hash = (int)joystick | ((int)id << 4);\n            string sname;\n            if (_inputIdToName.TryGetValue(hash, out sname))\n                return sname;\n            \n            if (joystick == Joystick.All)\n            {\n                if(id.IsJoyAxis())\n                    sname = string.Format(\"JoyAll-Axis{0:00}\", (int)id);\n                else if(id.IsMouseAxis())\n                    sname = string.Format(\"MouseAxis{0:0}\", (int)id - (int)SPInputId.MouseAxis1 + 1);\n                else if (id.IsJoyButton())\n                    sname = string.Format(\"JoyAll-Button{0:00}\", (int)id - (int)SPInputId.Button0);\n                else if(id.IsMouseButton())\n                    sname = string.Format(\"MouseButton{0:0}\", (int)id - (int)SPInputId.MouseButton0);\n            }\n            else\n            {\n                if (id.IsJoyAxis())\n                    sname = string.Format(\"Joy{0:0}-Axis{1:00}\", (int)joystick, (int)id);\n                else if (id.IsMouseAxis())\n                    sname = string.Format(\"MouseAxis{0:0}\", (int)id - (int)SPInputId.MouseAxis1 + 1);\n                else if (id.IsJoyButton())\n                    sname = string.Format(\"Joy{0:0}-Button{1:00}\", (int)joystick, (int)id - (int)SPInputId.Button0);\n                else if (id.IsMouseButton())\n                    sname = string.Format(\"MouseButton{0:0}\", (int)id - (int)SPInputId.MouseButton0);\n            }\n\n            _inputIdToName[hash] = sname;\n            return sname;\n        }\n        \n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/SPInputFactory.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing com.spacepuppy.Collections;\n\nnamespace com.spacepuppy.SPInput.Unity\n{\n\n    public delegate ButtonDelegate ButtonDelegateFactory(Joystick joystick);\n    public delegate AxisDelegate AxisDelegateFactory(Joystick joystick);\n\n    public static class SPInputFactory\n    {\n\n        #region Delegate Factory\n\n        /*\n         * Buttons\n         */\n\n        public static ButtonDelegate CreateButtonDelegate(SPInputId button, Joystick joystick = Joystick.All)\n        {\n            var inputId = SPInputDirect.GetInputName(button, joystick);\n            if (button.IsButton())\n                return () => UnityEngine.Input.GetButton(inputId);\n            else\n                return () => UnityEngine.Input.GetAxisRaw(inputId) > InputUtil.DEFAULT_AXLEBTNDEADZONE;\n        }\n\n        public static ButtonDelegate CreateButtonDelegate(UnityEngine.KeyCode key)\n        {\n            return () => UnityEngine.Input.GetKey(key);\n        }\n\n        public static ButtonDelegate CreateButtonDelegate(SPMouseId id)\n        {\n            return CreateButtonDelegate(id.ToSPInputId());\n        }\n\n        public static ButtonDelegate CreateAxleButtonDelegate(SPInputId axis, AxleValueConsideration consideration, Joystick joystick = Joystick.All, float axleButtonDeadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE)\n        {\n            var inputId = SPInputDirect.GetInputName(axis, joystick);\n            if(axis.IsAxis())\n            {\n                switch (consideration)\n                {\n                    case AxleValueConsideration.Positive:\n                        return () => UnityEngine.Input.GetAxisRaw(inputId) > axleButtonDeadZone;\n                    case AxleValueConsideration.Negative:\n                        return () => UnityEngine.Input.GetAxisRaw(inputId) < -axleButtonDeadZone;\n                    case AxleValueConsideration.Absolute:\n                        return () => Math.Abs(UnityEngine.Input.GetAxisRaw(inputId)) > axleButtonDeadZone;\n                    default:\n                        return null;\n                }\n            }\n            else\n                return () => UnityEngine.Input.GetButton(inputId);\n        }\n\n        public static ButtonDelegate CreateAxleButtonDelegate(AxisDelegate axis, AxleValueConsideration consideration, float axleButtonDeadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE)\n        {\n            if (axis == null) return null;\n\n            switch (consideration)\n            {\n                case AxleValueConsideration.Positive:\n                    return () => axis() > axleButtonDeadZone;\n                case AxleValueConsideration.Negative:\n                    return () => axis() < -axleButtonDeadZone;\n                case AxleValueConsideration.Absolute:\n                    return () => Math.Abs(axis()) > axleButtonDeadZone;\n                default:\n                    return null;\n            }\n        }\n\n        /*\n         * Axes\n         */\n\n        public static AxisDelegate CreateAxisDelegate(SPInputId axis, Joystick joystick = Joystick.All, bool invert = false)\n        {\n            var inputId = SPInputDirect.GetInputName(axis, joystick);\n            if(axis.IsAxis())\n            {\n                if (invert)\n                    return () => -UnityEngine.Input.GetAxisRaw(inputId);\n                else\n                    return () => UnityEngine.Input.GetAxisRaw(inputId);\n            }\n            else\n            {\n                if (invert)\n                    return () => UnityEngine.Input.GetButton(inputId) ? -1f : 0f;\n                else\n                    return () => UnityEngine.Input.GetButton(inputId) ? 1f : 0f;\n            }\n        }\n\n        public static AxisDelegate CreateAxisDelegate(SPInputId positive, SPInputId negative, Joystick joystick = Joystick.All)\n        {\n            return CreateAxisDelegate(CreateButtonDelegate(positive, joystick), CreateButtonDelegate(negative, joystick));\n        }\n\n        public static AxisDelegate CreateAxisDelegate(UnityEngine.KeyCode positive, UnityEngine.KeyCode negative)\n        {\n            if (positive != UnityEngine.KeyCode.None && negative != UnityEngine.KeyCode.None)\n            {\n                return () =>\n                {\n                    if (UnityEngine.Input.GetKey(positive))\n                        return (UnityEngine.Input.GetKey(negative)) ? 0f : 1f;\n                    else if (UnityEngine.Input.GetKey(negative))\n                        return -1f;\n                    else\n                        return 0f;\n                };\n            }\n            else if (positive != UnityEngine.KeyCode.None)\n            {\n                return () => UnityEngine.Input.GetKey(positive) ? 1f : 0f;\n            }\n            else if (negative != UnityEngine.KeyCode.None)\n            {\n                return () => UnityEngine.Input.GetKey(negative) ? -1f : 0f;\n            }\n            else\n                return null;\n        }\n\n        public static AxisDelegate CreateAxisDelegate(SPMouseId id, bool invert = false)\n        {\n            return CreateAxisDelegate(id.ToSPInputId(), Joystick.All, invert);\n        }\n\n        public static AxisDelegate CreateAxisDelegate(ButtonDelegate positive, ButtonDelegate negative)\n        {\n            if (positive != null && negative != null)\n            {\n                return () =>\n                {\n                    if (positive())\n                        return negative() ? 0f : 1f;\n                    else if (negative())\n                        return -1f;\n                    else\n                        return 0f;\n                };\n            }\n            else if (positive != null)\n            {\n                return () => positive() ? 1f : 0f;\n            }\n            else if (negative != null)\n            {\n                return () => positive() ? -1f : 0f;\n            }\n            else\n                return null;\n        }\n\n        /*\n         * Triggers\n         */\n        \n        public static AxisDelegate CreateTriggerDelegate(SPInputId axis, Joystick joystick = Joystick.All, AxleValueConsideration axisConsideration = AxleValueConsideration.Positive)\n        {\n            var inputId = SPInputDirect.GetInputName(axis, joystick);\n            if(axis.IsAxis())\n            {\n                switch (axisConsideration)\n                {\n                    case AxleValueConsideration.Positive:\n                        return () => UnityEngine.Mathf.Clamp01(UnityEngine.Input.GetAxisRaw(inputId));\n                    case AxleValueConsideration.Negative:\n                        return () => -UnityEngine.Mathf.Clamp(UnityEngine.Input.GetAxisRaw(inputId), -1f, 0f);\n                    case AxleValueConsideration.Absolute:\n                        return () => Math.Abs(UnityEngine.Input.GetAxisRaw(inputId));\n                    default:\n                        return null;\n                }\n            }\n            else\n            {\n                return () => UnityEngine.Input.GetButton(inputId) ? 1f : 0f;\n            }\n        }\n\n        public static AxisDelegate CreateTriggerDelegate(UnityEngine.KeyCode key)\n        {\n            return () => UnityEngine.Input.GetKey(key) ? 1f : 0f;\n        }\n\n        public static AxisDelegate CreateTriggerDelegate(ButtonDelegate del)\n        {\n            if (del == null) return null;\n            return () => del() ? 1f : 0f;\n        }\n\n        public static AxisDelegate CreateTriggerDelegate(AxisDelegate del, AxleValueConsideration axisConsideration = AxleValueConsideration.Positive)\n        {\n            if (del == null) return null;\n            switch (axisConsideration)\n            {\n                case AxleValueConsideration.Positive:\n                    return () => UnityEngine.Mathf.Clamp01(del());\n                case AxleValueConsideration.Negative:\n                    return () => -UnityEngine.Mathf.Clamp(del(), -1f, 0f);\n                case AxleValueConsideration.Absolute:\n                    return () => Math.Abs(del());\n                default:\n                    return null;\n            }\n        }\n\n        /*\n         * Long Trigers\n         */\n\n        /// <summary>\n        /// Some controller's triggers register -1 as inactive, and 1 as active. This creates a TriggerDelegate that normalizes this value to 0->1.\n        /// </summary>\n        /// <param name=\"axis\"></param>\n        /// <param name=\"joystick\"></param>\n        /// <returns></returns>\n        public static AxisDelegate CreateLongTriggerDelegate(SPInputId axis, Joystick joystick = Joystick.All)\n        {\n            var inputId = SPInputDirect.GetInputName(axis, joystick);\n            if (axis.IsAxis())\n            {\n                return () => (UnityEngine.Input.GetAxisRaw(inputId) + 1f) / 2f;\n            }\n            else\n            {\n                return () => UnityEngine.Input.GetButton(inputId) ? 1f : 0f;\n            }\n        }\n        \n        /*\n         * Delegate factories\n         */\n\n        public static ButtonDelegateFactory CreateButtonDelegateFactory(SPInputId button)\n        {\n            return (j) =>\n            {\n                return CreateButtonDelegate(button, j);\n            };\n        }\n\n        public static ButtonDelegateFactory CreateButtonDelegateFactory(UnityEngine.KeyCode key)\n        {\n            return (j) =>\n            {\n                return CreateButtonDelegate(key);\n            };\n        }\n\n        public static ButtonDelegateFactory CreateButtonDelegateFactory(SPMouseId id)\n        {\n            var spid = id.ToSPInputId();\n            return (j) =>\n            {\n                return CreateButtonDelegate(spid, j);\n            };\n        }\n\n        public static ButtonDelegateFactory CreateAxleButtonDelegateFactory(SPInputId axis, AxleValueConsideration consideration, float axleButtonDeadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE)\n        {\n            return (j) =>\n            {\n                return CreateAxleButtonDelegate(axis, consideration, j, axleButtonDeadZone);\n            };\n        }\n\n        public static AxisDelegateFactory CreateAxisDelegateFactory(SPInputId axis, bool invert = false)\n        {\n            return (j) =>\n            {\n                return CreateAxisDelegate(axis, j, invert);\n            };\n        }\n\n        public static AxisDelegateFactory CreateAxisDelegateFactory(SPInputId positive, SPInputId negative)\n        {\n            return (j) =>\n            {\n                return CreateAxisDelegate(positive, negative, j);\n            };\n        }\n\n        public static AxisDelegateFactory CreateAxisDelegateFactory(UnityEngine.KeyCode positive, UnityEngine.KeyCode negative)\n        {\n            return (j) =>\n            {\n                return CreateAxisDelegate(positive, negative);\n            };\n        }\n\n        public static AxisDelegateFactory CreateAxisDelegateFactory(SPMouseId id, bool invert = false)\n        {\n            return CreateAxisDelegateFactory(id.ToSPInputId(), invert);\n        }\n\n\n\n        public static AxisDelegateFactory CreateTriggerDelegateFactory(SPInputId axis, AxleValueConsideration axisConsideration = AxleValueConsideration.Positive)\n        {\n            return (j) => CreateTriggerDelegate(axis, j, axisConsideration);\n        }\n\n        public static AxisDelegateFactory CreateTriggerDelegateFactory(UnityEngine.KeyCode key)\n        {\n            return (j) => CreateTriggerDelegate(key);\n        }\n\n        /// <summary>\n        /// The PS4 Controller L2/R2 triggers on some platforms registers -1 when depressed, and 1 when pressed. This creates a factory that normalizes those values to 0->1\n        /// </summary>\n        /// <param name=\"axis\"></param>\n        /// <param name=\"invert\"></param>\n        /// <returns></returns>\n        public static AxisDelegateFactory CreateLongTriggerDelegateFactory(SPInputId axis)\n        {\n            return (j) => CreateLongTriggerDelegate(axis, j);\n        }\n\n\n        \n        /*\n         * Merge\n         */\n\n        public static AxisDelegate Merge(this AxisDelegate d1, AxisDelegate d2)\n        {\n            if (d1 == null) return d2;\n            if (d2 == null) return d1;\n            return () => UnityEngine.Mathf.Clamp(d1() + d2(), -1f, 1f);\n        }\n\n        public static AxisDelegate Merge(params AxisDelegate[] arr)\n        {\n            if (arr == null || arr.Length == 0) return null;\n            if (arr.Length == 1) return arr[0];\n            if (arr.Length == 2) return arr[0].Merge(arr[1]);\n\n            return () =>\n            {\n                float v = 0;\n                for (int i = 0; i < arr.Length; i++)\n                {\n                    if (arr[i] != null) v += arr[i]();\n                }\n                return UnityEngine.Mathf.Clamp(v, -1f, 1f);\n            };\n        }\n\n        public static ButtonDelegate Merge(this ButtonDelegate d1, ButtonDelegate d2)\n        {\n            if (d1 == null) return d2;\n            if (d2 == null) return d1;\n            return () => d1() || d2();\n        }\n\n        public static ButtonDelegate Merge(params ButtonDelegate[] arr)\n        {\n            if (arr == null || arr.Length == 0) return null;\n            if (arr.Length == 1) return arr[0];\n            if (arr.Length == 2) return arr[0].Merge(arr[1]);\n\n            return () =>\n            {\n                for (int i = 0; i < arr.Length; i++)\n                {\n                    if (arr[i] != null && arr[i]()) return true;\n                }\n                return false;\n            };\n        }\n\n        public static InputToken MergeAsAxis(this InputToken t1, InputToken t2)\n        {\n            return InputToken.CreateCustom((j) => t1.CreateAxisDelegate(j).Merge(t2.CreateAxisDelegate(j)));\n        }\n\n        public static InputToken MergeAsButton(this InputToken t1, InputToken t2)\n        {\n            return InputToken.CreateCustom((j) => t1.CreateButtonDelegate(j).Merge(t2.CreateButtonDelegate(j)));\n        }\n\n        #endregion\n\n        #region Signature Factory Extension Methods\n\n        //extension\n\n        public static ButtonDelegate CreateButtonDelegate<TInputId>(this IInputProfile<TInputId> profile, TInputId button, Joystick joystick = Joystick.All)\n            where TInputId : struct, System.IConvertible\n        {\n            return profile.GetMapping(button).CreateButtonDelegate(joystick);\n        }\n\n        public static AxisDelegate CreateAxisDelegate<TInputId>(this IInputProfile<TInputId> profile, TInputId axis, Joystick joystick = Joystick.All)\n            where TInputId : struct, System.IConvertible\n        {\n            return profile.GetMapping(axis).CreateAxisDelegate(joystick);\n        }\n\n        public static IButtonInputSignature CreateButtonSignature<TInputId>(this IInputProfile<TInputId> profile, string id, TInputId button, Joystick joystick = Joystick.All)\n            where TInputId : struct, System.IConvertible\n        {\n            return new DelegatedButtonInputSignature(id, profile.GetMapping(button).CreateButtonDelegate(joystick));\n        }\n\n        public static IButtonInputSignature CreateAxleButtonSignature<TInputId>(this IInputProfile<TInputId> profile, string id, TInputId axis, AxleValueConsideration consideration = AxleValueConsideration.Positive, Joystick joystick = Joystick.All, float axleButtonDeadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE)\n            where TInputId : struct, System.IConvertible\n        {\n            if (profile == null) return null;\n\n            return new DelegatedAxleButtonInputSignature(id, profile.GetMapping(axis).CreateAxisDelegate(joystick), consideration, axleButtonDeadZone);\n        }\n\n        public static IAxleInputSignature CreateAxisSignature<TInputId>(this IInputProfile<TInputId> profile, string id, TInputId axis, Joystick joystick = Joystick.All)\n            where TInputId : struct, System.IConvertible\n        {\n            return new DelegatedAxleInputSignature(id, profile.GetMapping(axis).CreateAxisDelegate(joystick));\n        }\n\n        public static IDualAxleInputSignature CreateDualAxisSignature<TInputId>(this IInputProfile<TInputId> profile, string id, TInputId axisX, TInputId axisY, Joystick joystick = Joystick.All)\n            where TInputId : struct, System.IConvertible\n        {\n            return new DelegatedDualAxleInputSignature(id, profile.GetMapping(axisX).CreateAxisDelegate(joystick), profile.GetMapping(axisY).CreateAxisDelegate(joystick));\n        }\n\n\n        //group\n\n        public static AxisDelegate CreateAxisDelegate<TInputId>(this IEnumerable<IInputProfile<TInputId>> profiles, TInputId axis, Joystick joystick = Joystick.All, Comparison<IInputProfile<TInputId>> comparison = null)\n            where TInputId : struct, System.IConvertible\n        {\n            using (var lst = TempCollection.GetList<IInputProfile<TInputId>>(from p in profiles where p != null select p))\n            {\n                if (comparison != null) lst.Sort(comparison);\n\n                if (lst.Count == 0)\n                    return null;\n                if (lst.Count == 1)\n                    return lst[0].GetMapping(axis).CreateAxisDelegate(joystick);\n                if (lst.Count == 2)\n                {\n                    return lst[0].GetMapping(axis).CreateAxisDelegate(joystick).Merge(\n                           lst[1].GetMapping(axis).CreateAxisDelegate(joystick));\n                }\n\n                var arr = (from p in lst select p.GetMapping(axis).CreateAxisDelegate(joystick)).ToArray();\n                return Merge(arr);\n            }\n        }\n\n        public static ButtonDelegate CreateButtonDelegate<TInputId>(this IEnumerable<IInputProfile<TInputId>> profiles, TInputId button, Joystick joystick = Joystick.All, Comparison<IInputProfile<TInputId>> comparison = null)\n            where TInputId : struct, System.IConvertible\n        {\n            using (var lst = TempCollection.GetList<IInputProfile<TInputId>>(from p in profiles where p != null select p))\n            {\n                if (comparison != null) lst.Sort(comparison);\n\n                if (lst.Count == 0)\n                    return null;\n                if (lst.Count == 1)\n                    return lst[0].GetMapping(button).CreateButtonDelegate(joystick);\n                if (lst.Count == 2)\n                {\n                    return lst[0].GetMapping(button).CreateButtonDelegate(joystick).Merge(\n                           lst[1].GetMapping(button).CreateButtonDelegate(joystick));\n                }\n\n                var arr = (from p in lst select p.GetMapping(button).CreateButtonDelegate(joystick)).ToArray();\n                return Merge(arr);\n            }\n        }\n\n        public static ButtonDelegate CreateAxleButtonDelegate<TInputId>(this IEnumerable<IInputProfile<TInputId>> profiles, \n                                                                        TInputId axis, AxleValueConsideration consideration = AxleValueConsideration.Positive, \n                                                                        Joystick joystick = Joystick.All, Comparison<IInputProfile<TInputId>> comparison = null,\n                                                                        float axleButtonDeadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE)\n            where TInputId : struct, System.IConvertible\n        {\n            using (var lst = TempCollection.GetList<IInputProfile<TInputId>>(from p in profiles where p != null select p))\n            {\n                if (comparison != null) lst.Sort(comparison);\n\n                if (lst.Count == 0)\n                    return null;\n                if (lst.Count == 1)\n                    return CreateAxleButtonDelegate(lst[0].GetMapping(axis).CreateAxisDelegate(joystick), consideration, axleButtonDeadZone);\n                if (lst.Count == 2)\n                {\n                    return CreateAxleButtonDelegate(lst[0].GetMapping(axis).CreateAxisDelegate(joystick), consideration, axleButtonDeadZone).Merge(\n                           CreateAxleButtonDelegate(lst[1].GetMapping(axis).CreateAxisDelegate(joystick), consideration, axleButtonDeadZone));\n                }\n\n                var arr = (from p in lst select CreateAxleButtonDelegate(p.GetMapping(axis).CreateAxisDelegate(joystick), consideration, axleButtonDeadZone)).ToArray();\n                return Merge(arr);\n            }\n        }\n        \n        public static IButtonInputSignature CreateButtonSignature<TInputId>(this IEnumerable<IInputProfile<TInputId>> profiles, string id, TInputId button, Joystick joystick = Joystick.All, Comparison<IInputProfile<TInputId>> comparison = null)\n            where TInputId : struct, System.IConvertible\n        {\n            return new DelegatedButtonInputSignature(id, CreateButtonDelegate(profiles, button, joystick, comparison));\n        }\n\n        public static IButtonInputSignature CreateAxleButtonSignature<TInputId>(this IEnumerable<IInputProfile<TInputId>> profiles, string id, \n                                                                                TInputId axis, AxleValueConsideration consideration = AxleValueConsideration.Positive, \n                                                                                Joystick joystick = Joystick.All, Comparison<IInputProfile<TInputId>> comparison = null, \n                                                                                float axleButtonDeadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE)\n            where TInputId : struct, System.IConvertible\n        {\n            return new DelegatedAxleButtonInputSignature(id, CreateAxisDelegate(profiles, axis, joystick, comparison), consideration, axleButtonDeadZone);\n        }\n\n        public static IAxleInputSignature CreateAxisSignature<TInputId>(this IEnumerable<IInputProfile<TInputId>> profiles, string id, TInputId axis, Joystick joystick = Joystick.All, Comparison<IInputProfile<TInputId>> comparison = null)\n            where TInputId : struct, System.IConvertible\n        {\n            return new DelegatedAxleInputSignature(id, CreateAxisDelegate(profiles, axis, joystick, comparison));\n        }\n\n        public static IDualAxleInputSignature CreateDualAxisSignature<TInputId>(this IEnumerable<IInputProfile<TInputId>> profiles, string id, TInputId axisX, TInputId axisY, Joystick joystick = Joystick.All, Comparison<IInputProfile<TInputId>> comparison = null)\n            where TInputId : struct, System.IConvertible\n        {\n            return new DelegatedDualAxleInputSignature(id, CreateAxisDelegate(profiles, axisX, joystick, comparison), CreateAxisDelegate(profiles, axisY, joystick, comparison));\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/HamaBlockForceWinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Hama Black Force Controller\", TargetPlatform.Windows, Description = \"Hama Black Force Controller (Windows)\")]\n    [InputProfileJoystickName(\"Generic   USB  Joystick  \")]\n    public class HamaBlockForceWinProfile : XboxInputProfile\n    {\n\n        public HamaBlockForceWinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis6);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis7);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Button6);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Button7);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button2); //3\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1); //2\n            this.RegisterButton(XboxInputId.X, SPInputId.Button3); //4\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button0); //1\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button11);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis7, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis7, AxleValueConsideration.Negative);\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/LogitechF310LinuxProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Logitech F310 Controller\", TargetPlatform.Linux, Description = \"Logitech F310 Controller (Linux)\")]\n    [InputProfileJoystickName(\"Logitech Gamepad F310\")]\n    public class LogitechF310LinuxProfile : XboxInputProfile\n    {\n\n        public LogitechF310LinuxProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis7);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis8, true);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis3);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis6);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button10);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis7, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis7, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis8, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis8, AxleValueConsideration.Positive);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/LogitechF310MacProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Logitech F310 Controller\", TargetPlatform.MacOSX, Description = \"Logitech F310 Controller (MacOSX)\")]\n    [InputProfileJoystickName(\"Logitech Logitech Dual Action\")]\n    public class LogitechF310MacProfile : XboxInputProfile\n    {\n\n        public LogitechF310MacProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Button6);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Button7);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button11);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Negative);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/LogitechF310WinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Logitech F310 Controller\", TargetPlatform.Windows, Description = \"Logitech F310 Controller (Windows)\")]\n    [InputProfileJoystickName(\"Logitech Dual Action\")]\n    public class LogitechF310WinProfile : XboxInputProfile\n    {\n\n        public LogitechF310WinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Button6);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Button7);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button11);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Negative);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/LogitechF510LinuxProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Logitech F510 Controller\", TargetPlatform.Linux, Description = \"Logitech F510 Controller (Linux)\")]\n    [InputProfileJoystickName(\"Logitech Gamepad F510\")]\n    public class LogitechF510LinuxProfile : XboxInputProfile\n    {\n\n        public LogitechF510LinuxProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis7);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis8, true);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis3);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis6);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button10);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis7, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis7, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis8, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis8, AxleValueConsideration.Positive);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/LogitechF510WinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Logitech F510 Controller\", TargetPlatform.Windows, Description = \"Logitech F510 Controller (Windows)\")]\n    [InputProfileJoystickName(\"Controller (Rumble Gamepad F510)\")]\n    public class LogitechF510WinProfile : XboxInputProfile\n    {\n\n        public LogitechF510WinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis6);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis7);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis3, AxleValueConsideration.Positive);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis3, AxleValueConsideration.Negative);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button9);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis7, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis7, AxleValueConsideration.Negative);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/LogitechF710LinuxProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Logitech F710 Controller\", TargetPlatform.Linux, Description = \"Logitech F710 Controller (Linux)\")]\n    [InputProfileJoystickName(\"Logitech Gamepad F710\")]\n    public class LogitechF710LinuxProfile : XboxInputProfile\n    {\n\n        public LogitechF710LinuxProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis7);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis8, true);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis3);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis6);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1); \n            this.RegisterButton(XboxInputId.X, SPInputId.Button2); \n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3); \n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button10);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis7, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis7, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis8, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis8, AxleValueConsideration.Positive);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/LogitechF710MacProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Logitech F710 Controller\", TargetPlatform.MacOSX, Description = \"Logitech F710 Controller (MacOSX)\")]\n    [InputProfileJoystickName(\"Logitech Logitech Cordless RumblePad 2\")]\n    public class LogitechF710MacProfile : XboxInputProfile\n    {\n\n        public LogitechF710MacProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6, true);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Button6);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Button7);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button1); \n            this.RegisterButton(XboxInputId.B, SPInputId.Button2); \n            this.RegisterButton(XboxInputId.X, SPInputId.Button0); \n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3); \n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button11);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Positive);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/LogitechF710WinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Logitech F710 Controller\", TargetPlatform.Windows, Description = \"Logitech F710 Controller (Windows)\")]\n    [InputProfileJoystickName(\"Logitech Cordless RumblePad 2\")]\n    public class LogitechF710WinProfile : XboxInputProfile\n    {\n\n        public LogitechF710WinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Button6);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Button7);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button1); \n            this.RegisterButton(XboxInputId.B, SPInputId.Button2); \n            this.RegisterButton(XboxInputId.X, SPInputId.Button0); \n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3); \n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button11);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Negative);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/LogitechRumblePad2MacProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Logitech RumblePad 2 Controller\", TargetPlatform.MacOSX, Description = \"Logitech RumblePad 2 Controller (MacOSX)\")]\n    [InputProfileJoystickName(\"Logitech Logitech RumblePad 2 USB\")]\n    public class LogitechRumblePad2MacProfile : XboxInputProfile\n    {\n\n        public LogitechRumblePad2MacProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6, true);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Button6);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Button7);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button1); //2\n            this.RegisterButton(XboxInputId.B, SPInputId.Button2); //3\n            this.RegisterButton(XboxInputId.X, SPInputId.Button0); //1\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3); //4\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            //this.RegisterButton(XboxInputId.Back, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button11);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button12);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Positive);\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/LogitechRumblePad2WinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n    \n    [InputProfileDescription(\"Logitech RumblePad 2 Controller\", TargetPlatform.Windows, Description = \"Logitech RumblePad 2 Controller (Windows)\")]\n    [InputProfileJoystickName(\"Logitech Rumblepad 2 USB\")]\n    public class LogitechRumblePad2WinProfile : XboxInputProfile\n    {\n\n        public LogitechRumblePad2WinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6, true);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Button6);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Button7);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button1); //2\n            this.RegisterButton(XboxInputId.B, SPInputId.Button2); //3\n            this.RegisterButton(XboxInputId.X, SPInputId.Button0); //1\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3); //4\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button11);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button12);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Positive);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/LogitechWingManWinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Logitech WingMan Controller\", TargetPlatform.Windows, Description = \"Logitech WingMan Controller (Windows)\")]\n    [InputProfileJoystickName(\"WingMan Cordless Gamepad\")]\n    public class LogitechWingManWinProfile : XboxInputProfile\n    {\n\n        public LogitechWingManWinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis6);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis7);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Button10);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Button11);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button8);\n            //this.RegisterButton(XboxInputId.Back, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button9);\n            //this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button8);\n            //this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button9);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis7, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis7, AxleValueConsideration.Negative);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/MaxFireBlaze5WinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"MOGA Pro Controller\", TargetPlatform.Windows, Description = \"MOGA Pro Controller (Windows)\")]\n    [InputProfileJoystickName(\"Android Controller Gen-2(ACC)\")]\n    public class MaxFireBlaze5WinProfile : XboxInputProfile\n    {\n\n        public MaxFireBlaze5WinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis6);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis7);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis9);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis10);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button9);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis7, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis7, AxleValueConsideration.Negative);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/MogaProLinuxProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"MOGA Pro Controller\", TargetPlatform.Linux, Description = \"MOGA Pro Controller (Linux)\")]\n    [InputProfileJoystickName(\"Moga Pro HID\")]\n    public class MogaProLinuxProfile : XboxInputProfile\n    {\n\n        public MogaProLinuxProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis7);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis8, true);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis6);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis5);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            //this.RegisterButton(XboxInputId.Back, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button8);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis7, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis7, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis8, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis8, AxleValueConsideration.Positive);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/MogaProMacProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"MOGA Pro Controller\", TargetPlatform.MacOSX, Description = \"MOGA Pro Controller (MacOSX)\")]\n    [InputProfileJoystickName(\"Unknown Moga Pro HID\")]\n    public class MogaProMacProfile : XboxInputProfile\n    {\n\n        public MogaProMacProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6, true);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis10, AxleValueConsideration.Positive);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis10, AxleValueConsideration.Negative);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button9);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Positive);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/MogaProWinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"MOGA Pro Controller\", TargetPlatform.Windows, Description = \"MOGA Pro Controller (Windows)\")]\n    [InputProfileJoystickName(\"Android Controller Gen-2(ACC)\")]\n    public class MogaProWinProfile : XboxInputProfile\n    {\n\n        public MogaProWinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis10, AxleValueConsideration.Positive);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis10, AxleValueConsideration.Negative);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button9);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Negative);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/NatecGenesisP44WinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Natec Genesis P44 Controller\", TargetPlatform.Windows, Description = \"Natec Genesis P44 Controller (Windows)\")]\n    [InputProfileJoystickName(\"EX10 GAMEPAD\")]\n    public class NatecGenesisP44WinProfile : XboxInputProfile\n    {\n\n        public NatecGenesisP44WinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Button6);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Button7);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button1); //X\n            this.RegisterButton(XboxInputId.B, SPInputId.Button2); //O\n            this.RegisterButton(XboxInputId.X, SPInputId.Button0); //Sqr\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3); //Tri\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4); //L1\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5); //R1\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button8); //select\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button9); //start\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button11);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Negative);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/NvidiaShieldAndroidProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Nvidia Shield Controller\", TargetPlatform.Windows, Description = \"Nvidia Shield Controller (Android)\")]\n    [InputProfileJoystickName(\"nvidia_Corporation nvidia_joypad\")]\n    [InputProfileJoystickName(\"NVIDIA Corporation NVIDIA Controller\")]\n    public class NvidiaShieldAndroidProfile : XboxInputProfile\n    {\n\n        public NvidiaShieldAndroidProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6, true);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis7);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis8);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            //this.RegisterButton(XboxInputId.Back, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button9);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Positive);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/NvidiaShieldWinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Nvidia Shield Controller\", TargetPlatform.Windows, Description = \"Nvidia Shield Controller (Windows)\")]\n    [InputProfileJoystickName(\"NVIDIA Controller\")]\n    public class NvidiaShieldWinProfile : XboxInputProfile\n    {\n\n        public NvidiaShieldWinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis7);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis8);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button2);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Negative);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/OuyaLinuxProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Ouya Controller\", TargetPlatform.Linux, Description = \"Ouya Controller (Linux)\")]\n    [InputProfileJoystickName(\"OUYA Game Controller\")]\n    public class OuyaLinuxProfile : XboxInputProfile\n    {\n\n        public OuyaLinuxProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Button11, SPInputId.Button10);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Button8, SPInputId.Button9);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis3);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis6);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0); //O\n            this.RegisterButton(XboxInputId.B, SPInputId.Button3); //A\n            this.RegisterButton(XboxInputId.X, SPInputId.Button1); //U\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button2); //Y\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4); //L1\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5); //R1\n            //this.RegisterButton(XboxInputId.Back, SPInputId.Button8); //none\n            this.RegisterButton(XboxInputId.Start, SPInputId.MouseButton0); //touchpad tap\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.DPadRight, SPInputId.Button11);\n            this.RegisterButton(XboxInputId.DPadLeft, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.DPadUp, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.DPadDown, SPInputId.Button9);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/OuyaWinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Ouya Controller\", TargetPlatform.Windows, Description = \"Ouya Controller (Windows)\")]\n    [InputProfileJoystickName(\"OUYA Game Controller\")]\n    public class OuyaWinProfile : XboxInputProfile\n    {\n\n        public OuyaWinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Button11, SPInputId.Button10);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Button8, SPInputId.Button9);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis3);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis6);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0); //O\n            this.RegisterButton(XboxInputId.B, SPInputId.Button3); //A\n            this.RegisterButton(XboxInputId.X, SPInputId.Button1); //U\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button2); //Y\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4); //L1\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5); //R1\n            //this.RegisterButton(XboxInputId.Back, SPInputId.Button8); //none\n            this.RegisterButton(XboxInputId.Start, SPInputId.MouseButton0); //touchpad tap\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.DPadRight, SPInputId.Button11);\n            this.RegisterButton(XboxInputId.DPadLeft, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.DPadUp, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.DPadDown, SPInputId.Button9);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/PS2WinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"PS2 Controller\", TargetPlatform.Windows, Description = \"PS2 Controller (Windows)\")]\n    [InputProfileJoystickName(\"Twin USB Joystick\")]\n    public class PS2WinProfile : XboxInputProfile\n    {\n\n        public PS2WinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis3, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Button4);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Button5);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button2); //X\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1); //O\n            this.RegisterButton(XboxInputId.X, SPInputId.Button3); //Sqr\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button0); //Tri\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button6); //L1\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button7); //R1\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button8); //Share\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button9); //Options\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button11);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Negative);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/PS3AndroidProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"PS3 Controller\", TargetPlatform.Android, Description = \"PS3 Controller (Android)\")]\n    [InputProfileJoystickName(XboxInputProfile.GENERIC_PS3)]\n    [InputProfileJoystickName(\"PLAYSTATION(R)3 Controller\")]\n    [InputProfileJoystickName(\"SHENGHIC 2009/0708ZXW-V1Inc. PLAYSTATION(R)3Conteroller\")]\n    [InputProfileJoystickName(\"Sony PLAYSTATION(R)3 Controller\")]\n    public class PS3AndroidProfile : XboxInputProfile\n    {\n\n        public PS3AndroidProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6, true);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Button7);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Button8);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button2); //X\n            this.RegisterButton(XboxInputId.B, SPInputId.Button3); //O\n            this.RegisterButton(XboxInputId.X, SPInputId.Button0); //Sqr\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button1); //Tri\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4); //L1\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5); //R1\n            //this.RegisterButton(XboxInputId.Back, SPInputId.Button8); //Share\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button10); //Options\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button9);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Positive);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/PS3LinuxProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"PS3 Controller\", TargetPlatform.Linux, Description = \"PS3 Controller (Linux)\")]\n    [InputProfileJoystickName(XboxInputProfile.GENERIC_PS3)]\n    [InputProfileJoystickName(\"Sony PLAYSTATION(R)3 Controller\")]\n    [InputProfileJoystickName(\"SHENGHIC 2009/0708ZXW-V1Inc. PLAYSTATION(R)3Conteroller\")]\n    public class PS3LinuxProfile : XboxInputProfile\n    {\n\n        public PS3LinuxProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Button5, SPInputId.Button7);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Button4, SPInputId.Button6);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Button8);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Button9);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button14); //X\n            this.RegisterButton(XboxInputId.B, SPInputId.Button13); //O\n            this.RegisterButton(XboxInputId.X, SPInputId.Button15); //Sqr\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button12); //Tri\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button10); //L1\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button11); //R1\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button0); //Share - no idea why, but sources say that select/start are the same button id\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button3); //Options\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.DPadRight, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.DPadLeft, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.DPadUp, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.DPadDown, SPInputId.Button6);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/PS3MacProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"PS3 Controller\", TargetPlatform.MacOSX, Description = \"PS3 Controller (MacOSX)\")]\n    [InputProfileJoystickName(XboxInputProfile.GENERIC_PS3)]\n    [InputProfileJoystickName(\"Sony PLAYSTATION(R)3 Controller\")]\n    [InputProfileJoystickName(\"SHENGHIC 2009/0708ZXW-V1Inc. PLAYSTATION(R)3Conteroller\")]\n    public class PS3MacProfile : XboxInputProfile\n    {\n\n        public PS3MacProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Button5, SPInputId.Button7);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Button4, SPInputId.Button6);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Button8);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Button9);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button14); //X\n            this.RegisterButton(XboxInputId.B, SPInputId.Button13); //O\n            this.RegisterButton(XboxInputId.X, SPInputId.Button15); //Sqr\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button12); //Tri\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button10); //L1\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button11); //R1\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button0); //Share - no idea why, but sources say that select/start are the same button id\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button3); //Options\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.DPadRight, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.DPadLeft, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.DPadUp, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.DPadDown, SPInputId.Button6);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/PS3ShenghicWinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    /// <remarks>\n    /// This layout is seen to be a member of other libraries like InControl. Including layout 'just-in-case'.\n    /// </remarks>\n    [InputProfileDescription(\"Shenghic PS3 Controller\", TargetPlatform.Windows, Description = \"Shenghic PS3 Controller (Windows)\")]\n    [InputProfileJoystickName(\"PLAYSTATION(R)3Conteroller\")]\n    public class PS3ShenghicWinProfile : XboxInputProfile\n    {\n        \n        public PS3ShenghicWinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Button5, SPInputId.Button7);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Button4, SPInputId.Button6);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Button8);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Button9);\n            \n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button14); //X\n            this.RegisterButton(XboxInputId.B, SPInputId.Button13); //O\n            this.RegisterButton(XboxInputId.X, SPInputId.Button15); //Sqr\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button12); //Tri\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button10); //L1\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button11); //R1\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button3); //Share - no idea why, but sources say that select/start are the same button id\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button3); //Options\n            //this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button9);\n            //this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.DPadRight, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.DPadLeft, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.DPadUp, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.DPadDown, SPInputId.Button6);\n        }\n        \n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/PS3WinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"PS3 Controller\", TargetPlatform.Windows, Description = \"PS3 Controller (Windows)\")]\n    [InputProfileJoystickName(XboxInputProfile.GENERIC_PS3)]\n    [InputProfileJoystickName(\"MotioninJoy Virtual Game Controller\")]\n    public class PS3WinProfile : XboxInputProfile\n    {\n\n        public PS3WinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis6, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis9);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis10);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Button6);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Button7);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button2); //X\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1); //O\n            this.RegisterButton(XboxInputId.X, SPInputId.Button3); //Sqr\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button0); //Tri\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4); //L1\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5); //R1\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button8); //Share\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button11); //Options\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button10);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis9, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis9, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis10, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis10, AxleValueConsideration.Negative);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/PS4AndroidProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"PS4 Controller\", TargetPlatform.Android, Description = \"PS4 Controller (Android)\")]\n    [InputProfileJoystickName(XboxInputProfile.GENERIC_PS4)]\n    [InputProfileJoystickName(\"Sony Computer Entertainment Wireless Controller\")]\n    public class PS4AndroidProfile : XboxInputProfile\n    {\n\n        public PS4AndroidProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis14);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis15, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6, true);\n            this.RegisterTrigger(XboxInputId.LTrigger, InputToken.CreateLongTrigger(SPInputId.Axis3));\n            this.RegisterTrigger(XboxInputId.RTrigger, InputToken.CreateLongTrigger(SPInputId.Axis4));\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button1); //X\n            this.RegisterButton(XboxInputId.B, SPInputId.Button13); //O\n            this.RegisterButton(XboxInputId.X, SPInputId.Button0); //Sqr\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button2); //Tri\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button3); //L1\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button14); //R1\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button7); //Share\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button6); //Options\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button11);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button10);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Positive);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/PS4ConsoleProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    /// <remarks>\n    /// TODO - need to test this on a proper PS4 using my InputMapTester program.\n    /// </remarks>\n    [InputProfileDescription(\"PS4 Controller\", TargetPlatform.PS4, Description = \"PS4 Controller (PS4)\")]\n    [InputProfileJoystickName(XboxInputProfile.GENERIC_PS4)]\n    [InputProfileJoystickName(\"controller\")]\n    public class PS4ConsoleProfile : XboxInputProfile\n    {\n\n        public PS4ConsoleProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis6);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis7);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis8); //TODO - need to test\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis3, AxleValueConsideration.Negative); //TODO - need to test\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0); //X\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1); //O\n            this.RegisterButton(XboxInputId.X, SPInputId.Button2); //Sqr\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3); //Tri\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4); //L1\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5); //R1\n            //this.RegisterButton(XboxInputId.Back, SPInputId.Button6); //Share - Share is used by the PS4 itself and is not accessible\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button7); //Options\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button9);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis7, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis7, AxleValueConsideration.Negative);\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/PS4LinuxProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    /// <summary>\n    /// InputName: \"PS4 Controller\"\n    /// InputName (per InControl): \"Sony Computer Entertainment Wireless Controller\"\n    /// </summary>\n    [InputProfileDescription(\"PS4 Controller\", TargetPlatform.Linux, Description = \"PS4 Controller (Linux)\")]\n    [InputProfileJoystickName(XboxInputProfile.GENERIC_PS4)]\n    [InputProfileJoystickName(\"Sony Computer Entertainment Wireless Controller\")]\n    public class PS4LinuxProfile : XboxInputProfile\n    {\n\n        public PS4LinuxProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis7);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis8, true);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis3);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis6);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0); //X\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1); //O\n            this.RegisterButton(XboxInputId.X, SPInputId.Button2); //Sqr\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3); //Tri\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4); //L1\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5); //R1\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button6); //Share\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button7); //Options\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button10);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis7, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis7, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis8, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis8, AxleValueConsideration.Positive);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/PS4MacOSBTProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    /// <summary>\n    /// InputName: \"Unknown Wireless Controller\"\n    /// </summary>\n    [InputProfileDescription(\"PS4 Controller\", TargetPlatform.MacOSX, Description = \"PS4 Controller Bluetooth (MacOSX)\")]\n    [InputProfileJoystickName(XboxInputProfile.GENERIC_PS4)]\n    [InputProfileJoystickName(\"Unknown Wireless Controller\")]\n    public class PS4MacOSBTProfile : XboxInputProfile\n    {\n\n        public PS4MacOSBTProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis7);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis8, true);\n            this.RegisterTrigger(XboxInputId.LTrigger, InputToken.CreateLongTrigger(SPInputId.Axis5));\n            this.RegisterTrigger(XboxInputId.RTrigger, InputToken.CreateLongTrigger(SPInputId.Axis6));\n            //this.RegisterAxis(XboxInputId.LTrigger, SPInputId.Button6, SPInputId.Unknown);\n            //this.RegisterAxis(XboxInputId.RTrigger, SPInputId.Button7, SPInputId.Unknown);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button1); //X\n            this.RegisterButton(XboxInputId.B, SPInputId.Button2); //O\n            this.RegisterButton(XboxInputId.X, SPInputId.Button0); //Sqr\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3); //Tri\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4); //L1\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5); //R1\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button8); //Share\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button9); //Options\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button11);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis7, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis7, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis8, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis8, AxleValueConsideration.Positive);\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/PS4MacOSUSBProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    /// <summary>\n    /// InputName: \"Sony Computer Entertainment Wireless Controller\"\n    /// </summary>\n    [InputProfileDescription(\"PS4 Controller\", TargetPlatform.MacOSX, Description = \"PS4 Controller USB (MacOSX)\")]\n    [InputProfileJoystickName(XboxInputProfile.GENERIC_PS4)]\n    [InputProfileJoystickName(\"Sony Computer Entertainment Wireless Controller\")]\n    public class PS4MacOSUSBProfile : XboxInputProfile\n    {\n\n        public PS4MacOSUSBProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis7);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis8, true);\n            this.RegisterTrigger(XboxInputId.LTrigger, InputToken.CreateLongTrigger(SPInputId.Axis5));\n            this.RegisterTrigger(XboxInputId.RTrigger, InputToken.CreateLongTrigger(SPInputId.Axis6));\n            //this.RegisterAxis(XboxInputId.LTrigger, SPInputId.Button6, SPInputId.Unknown);\n            //this.RegisterAxis(XboxInputId.RTrigger, SPInputId.Button7, SPInputId.Unknown);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button1); //X\n            this.RegisterButton(XboxInputId.B, SPInputId.Button2); //O\n            this.RegisterButton(XboxInputId.X, SPInputId.Button0); //Sqr\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3); //Tri\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4); //L1\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5); //R1\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button8); //Share\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button9); //Options\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button11);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis7, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis7, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis8, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis8, AxleValueConsideration.Positive);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/PS4WinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    /// <summary>\n    /// InputName: \"Wireless Controller\"\n    /// </summary>\n    [InputProfileDescription(\"PS4 Controller\", TargetPlatform.Windows, Description = \"PS4 Controller (Windows)\")]\n    [InputProfileJoystickName(XboxInputProfile.GENERIC_PS4)]\n    [InputProfileJoystickName(\"Wireless Controller\")]\n    public class PS4WinProfile : XboxInputProfile\n    {\n\n        public PS4WinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis6, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis7);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis8);\n            this.RegisterTrigger(XboxInputId.LTrigger, InputToken.CreateLongTrigger(SPInputId.Axis4));\n            this.RegisterTrigger(XboxInputId.RTrigger, InputToken.CreateLongTrigger(SPInputId.Axis5));\n            //this.RegisterAxis(XboxInputId.LTrigger, SPInputId.Button6, SPInputId.Unknown);\n            //this.RegisterAxis(XboxInputId.RTrigger, SPInputId.Button7, SPInputId.Unknown);\n\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button1); //X\n            this.RegisterButton(XboxInputId.B, SPInputId.Button2); //O\n            this.RegisterButton(XboxInputId.X, SPInputId.Button0); //Sqr\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3); //Tri\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4); //L1\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5); //R1\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button8); //Share\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button9); //Options\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button11);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis7, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis7, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis8, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis8, AxleValueConsideration.Negative);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/SpeedlinkStrikeMacProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Speedlink Strike Controller\", TargetPlatform.MacOSX, Description = \"Speedlink Strike Controller (MacOSX)\")]\n    [InputProfileJoystickName(\"DragonRise Inc.   Generic   USB  Joystick  \")]\n    class SpeedlinkStrikeMacProfile : XboxInputProfile\n    {\n\n        public SpeedlinkStrikeMacProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis6);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis7, true);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Button6);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Button7);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button11);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Positive);\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/SpeedlinkStrikeWinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Speedlink Strike Controller\", TargetPlatform.Windows, Description = \"Speedlink Strike Controller (Windows)\")]\n    [InputProfileJoystickName(\"SPEEDLINK STRIKE Gamepad\")]\n    public class SpeedlinkStrikeWinProfile : XboxInputProfile\n    {\n\n        public SpeedlinkStrikeWinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6, true);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Button6);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Button7);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button11);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Positive);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/SteelSeriesFreeLinuxProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Steel Series Free\", TargetPlatform.Linux, Description = \"Steel Series Free (Linux)\")]\n    [InputProfileJoystickName(\"Zeemote: SteelSeries FREE\")]\n    public class SteelSeriesFreeLinuxProfile : XboxInputProfile\n    {\n\n        public SteelSeriesFreeLinuxProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis10, AxleValueConsideration.Positive); //doesn't necessarily work on linux\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis10, AxleValueConsideration.Negative); //doesn't necessarily work on linux\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button12);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button11);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button8); //doesn't necessarily work on linux\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button9); //doesn't necessarily work on linux\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Negative);\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/SteelSeriesFreeMacProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Steel Series Free\", TargetPlatform.MacOSX, Description = \"Steel Series Free (OSX)\")]\n    [InputProfileJoystickName(\"Unknown Zeemote: SteelSeries FREE\")]\n    public class SteelSeriesFreeMacProfile : XboxInputProfile\n    {\n\n        public SteelSeriesFreeMacProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis10, AxleValueConsideration.Positive);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis10, AxleValueConsideration.Negative);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button12);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button11);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button9);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Negative);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/SteelSeriesFreeWinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n    \n    [InputProfileDescription(\"Steel Series Free\", TargetPlatform.Windows, Description = \"Steel Series Free (Windows)\")]\n    [InputProfileJoystickName(\"GamePad\")]\n    public class SteelSeriesFreeWinProfile : XboxInputProfile\n    {\n\n        public SteelSeriesFreeWinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis10, AxleValueConsideration.Positive);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis10, AxleValueConsideration.Negative);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button12);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button11);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button9);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Negative);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/ValveStreamingWinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Valve Streaming Gamepad\", TargetPlatform.Windows, Description = \"Valve Streaming Gamepad (Windows)\")]\n    [InputProfileJoystickName(\"Controller (Valve Streaming Gamepad)\")]\n    public class ValveStreamingWinProfile : XboxInputProfile\n    {\n\n        public ValveStreamingWinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis6);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis7);\n            //this.RegisterAxis(XboxInputId.LTrigger, SPInputId.Axis9);\n            //this.RegisterAxis(XboxInputId.RTrigger, SPInputId.Axis10);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis3, AxleValueConsideration.Positive);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis3, AxleValueConsideration.Negative);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button9);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis7, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis7, AxleValueConsideration.Negative);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/Xbox360AndroidProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Xbox 360 Controller\", TargetPlatform.Android, Description = \"Xbox 360 Controller (Windows)\")]\n    [InputProfileJoystickName(XboxInputProfile.GENERIC_XBOX360)]\n    [InputProfileJoystickName(\"Microsoft X-Box 360 pad\")]\n    public class Xbox360AndroidProfile : XboxInputProfile\n    {\n\n        public Xbox360AndroidProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis6, true);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis7);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis8);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button11);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button9);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis5, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis5, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis6, AxleValueConsideration.Positive);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/Xbox360LinuxProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    /// <summary>\n    /// InputName: \"XInput Controller\"\n    /// InputName (per InControl): \"Microsoft X-Box 360 pad\", \"Generic X-Box pad\"\n    /// </summary>\n    [InputProfileDescription(\"Xbox 360 Controller\", TargetPlatform.Linux, Description = \"Xbox 360 Controller (Linux)\")]\n    [InputProfileJoystickName(XboxInputProfile.GENERIC_XBOX360)]\n    [InputProfileJoystickName(\"Microsoft X-Box 360 pad\")]\n    [InputProfileJoystickName(\"Generic X-Box pad\")]\n    public class Xbox360LinuxProfile : XboxInputProfile\n    {\n\n        public Xbox360LinuxProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis7);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis8, true);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis3);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis6);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.DPadRight, SPInputId.Button12);\n            this.RegisterButton(XboxInputId.DPadLeft, SPInputId.Button11);\n            this.RegisterButton(XboxInputId.DPadUp, SPInputId.Button13);\n            this.RegisterButton(XboxInputId.DPadDown, SPInputId.Button14);\n            /*\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis7);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis8);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis3);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis6);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.DPadRight, SPInputId.Button15);\n            this.RegisterButton(XboxInputId.DPadLeft, SPInputId.Button16);\n            this.RegisterButton(XboxInputId.DPadUp, SPInputId.Button13);\n            this.RegisterButton(XboxInputId.DPadDown, SPInputId.Button14);\n            */\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/Xbox360LinuxProfile_X.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    /// <summary>\n    /// InputName: \"XInput Controller\"\n    /// InputName (per InControl): \"Microsoft X-Box 360 pad\", \"Generic X-Box pad\"\n    /// </summary>\n    [InputProfileDescription(\"Xbox 360 Controller XInput\", TargetPlatform.Linux, Description = \"Xbox 360 Controller (Linux) - identified as an XInput controller\")]\n    [InputProfileJoystickName(\"XInput Controller\")]\n    public class Xbox360LinuxProfile_X : XboxInputProfile\n    {\n\n        public Xbox360LinuxProfile_X()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis7);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis8);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis3);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis6);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button10);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis7, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis7, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis8, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis8, AxleValueConsideration.Positive);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/Xbox360MacOSProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    /// <summary>\n    /// InputName: \"UNIDENTIFIED CONTROLLER\"\n    /// InputName (per InControl): \"Microsoft Wireless 360 Controller\", \"\\u00A9Microsoft Corporation Controller\", \"\\u00A9Microsoft Corporation Xbox Original Wired Controller\"\n    /// InputName (similar, per InControl): \"Mad Catz, Inc. Mad Catz FPS Pro GamePad\"\n    /// </summary>\n    [InputProfileDescription(\"Xbox 360 Controller\", TargetPlatform.MacOSX, Description = \"Xbox 360 Controller (MacOSX)\")]\n    [InputProfileJoystickName(XboxInputProfile.GENERIC_XBOX360)]\n    [InputProfileJoystickName(\"\")]\n    [InputProfileJoystickName(\"Microsoft Wireless 360 Controller\")]\n    [InputProfileJoystickName(\"Mad Catz, Inc. Mad Catz FPS Pro GamePad\")]\n    [InputProfileJoystickName(\"\\u00A9Microsoft Corporation Controller\")]\n    [InputProfileJoystickName(\"\\u00A9Microsoft Corporation Xbox Original Wired Controller\")]\n    public class Xbox360MacOSProfile : XboxInputProfile\n    {\n\n        public Xbox360MacOSProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Button8, SPInputId.Button7);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Button5, SPInputId.Button6);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis5);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis6);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button16);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button17);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button18);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button19);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button13);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button14);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button11);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button12);\n            this.RegisterButton(XboxInputId.DPadRight, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.DPadLeft, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.DPadUp, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.DPadDown, SPInputId.Button6);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/Xbox360WinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    /// <summary>\n    /// InputName: \"Controller (Xbox 360 For Windows)\"\n    /// InputName (per InControl): \"XBOX 360 For Windows (Controller)\", \"Controller (Xbox 360 Wireless Receiver for Windows)\", \"Controller (Gamepad for Xbox 360)\"\n    /// InputName (similar, per InControl): \"Controller (Afterglow Gamepad for Xbox 360)\", \"Controller (Batarang wired controller (XBOX))\", \"Controller (Infinity Controller 360)\", \"Controller (Mad Catz FPS Pro GamePad)\", \n    ///           \"Controller (MadCatz Call of Duty GamePad)\", \"Controller (MadCatz GamePad)\", \"Controller (MLG GamePad for Xbox 360)\", \"Controller (Razer Sabertooth Elite)\", \"Controller (Rock Candy Gamepad for Xbox 360)\", \n    ///           \"Controller (XEOX Gamepad)\"\n    /// </summary>\n    [InputProfileDescription(\"Xbox 360 Controller\", TargetPlatform.Windows, Description = \"Xbox 360 Controller (Windows)\")]\n    [InputProfileJoystickName(XboxInputProfile.GENERIC_XBOX360)]\n    [InputProfileJoystickName(\"Controller (Xbox 360 For Windows)\")]\n    [InputProfileJoystickName(\"XBOX 360 For Windows (Controller)\")]\n    [InputProfileJoystickName(\"Controller (Xbox 360 Wireless Receiver for Windows)\")]\n    [InputProfileJoystickName(\"Controller (Gamepad for Xbox 360)\")]\n    [InputProfileJoystickName(\"Controller (Afterglow Gamepad for Xbox 360)\")]\n    [InputProfileJoystickName(\"Controller (Batarang wired controller (XBOX))\")]\n    [InputProfileJoystickName(\"Controller (Infinity Controller 360)\")]\n    [InputProfileJoystickName(\"Controller (Mad Catz FPS Pro GamePad)\")]\n    [InputProfileJoystickName(\"Controller (MadCatz Call of Duty GamePad)\")]\n    [InputProfileJoystickName(\"Controller (MadCatz GamePad)\")]\n    [InputProfileJoystickName(\"Controller (MLG GamePad for Xbox 360)\")]\n    [InputProfileJoystickName(\"Controller (Razer Sabertooth Elite)\")]\n    [InputProfileJoystickName(\"Controller (Rock Candy Gamepad for Xbox 360)\")]\n    [InputProfileJoystickName(\"Controller (XEOX Gamepad)\")]\n    public class Xbox360WinProfile : XboxInputProfile\n    {\n\n        public Xbox360WinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis6);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis7);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis9);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis10);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button9);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis7, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis7, AxleValueConsideration.Negative);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/XboxOneConsoleProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Xbox One Controller\", TargetPlatform.XboxOne, Description = \"Xbox One Controller (Xbox One)\")]\n    [InputProfileJoystickName(XboxInputProfile.GENERIC_XBOXONE)]\n    [InputProfileJoystickName(\"Windows.Xbox.Input.Gamepad\")]\n    public class XboxOneConsoleProfile : XboxInputProfile\n    {\n\n        public XboxOneConsoleProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis6);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis7);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis3, AxleValueConsideration.Positive);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis3, AxleValueConsideration.Negative);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button9);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis7, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis7, AxleValueConsideration.Negative);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/XboxOneMacProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Xbox One Controller\", TargetPlatform.MacOSX, Description = \"Xbox One Controller (OSX)\")]\n    [InputProfileJoystickName(XboxInputProfile.GENERIC_XBOXONE)]\n    [InputProfileJoystickName(\"Microsoft Xbox One Wired Controller\")]\n    public class XboxOneMacProfile : XboxInputProfile\n    {\n\n        public XboxOneMacProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis3);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis4, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Button8, SPInputId.Button7);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Button5, SPInputId.Button6);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis5);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis6);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button16);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button17);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button18);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button19);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button13);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button14);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button10);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button9);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button11);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button12);\n            this.RegisterButton(XboxInputId.DPadRight, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.DPadLeft, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.DPadUp, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.DPadDown, SPInputId.Button6);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/Profiles/XboxOneWinProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox.Profiles\n{\n\n    [InputProfileDescription(\"Xbox One Controller\", TargetPlatform.Windows, Description = \"Xbox One Controller (Windows)\")]\n    [InputProfileJoystickName(XboxInputProfile.GENERIC_XBOXONE)]\n    [InputProfileJoystickName(\"Controller (XBOX One For Windows)\")]\n    [InputProfileJoystickName(\"Controller (Xbox One For Windows)\")]\n    public class XboxOneWinProfile : XboxInputProfile\n    {\n\n        public XboxOneWinProfile()\n        {\n            this.RegisterAxis(XboxInputId.LStickX, SPInputId.Axis1);\n            this.RegisterAxis(XboxInputId.LStickY, SPInputId.Axis2, true);\n            this.RegisterAxis(XboxInputId.RStickX, SPInputId.Axis4);\n            this.RegisterAxis(XboxInputId.RStickY, SPInputId.Axis5, true);\n            this.RegisterAxis(XboxInputId.DPadX, SPInputId.Axis6);\n            this.RegisterAxis(XboxInputId.DPadY, SPInputId.Axis7);\n            this.RegisterTrigger(XboxInputId.LTrigger, SPInputId.Axis9);\n            this.RegisterTrigger(XboxInputId.RTrigger, SPInputId.Axis10);\n\n            this.RegisterButton(XboxInputId.A, SPInputId.Button0);\n            this.RegisterButton(XboxInputId.B, SPInputId.Button1);\n            this.RegisterButton(XboxInputId.X, SPInputId.Button2);\n            this.RegisterButton(XboxInputId.Y, SPInputId.Button3);\n            this.RegisterButton(XboxInputId.LB, SPInputId.Button4);\n            this.RegisterButton(XboxInputId.RB, SPInputId.Button5);\n            this.RegisterButton(XboxInputId.Back, SPInputId.Button6);\n            this.RegisterButton(XboxInputId.Start, SPInputId.Button7);\n            this.RegisterButton(XboxInputId.LStickPress, SPInputId.Button8);\n            this.RegisterButton(XboxInputId.RStickPress, SPInputId.Button9);\n            this.RegisterAxleButton(XboxInputId.DPadRight, SPInputId.Axis6, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadLeft, SPInputId.Axis6, AxleValueConsideration.Negative);\n            this.RegisterAxleButton(XboxInputId.DPadUp, SPInputId.Axis7, AxleValueConsideration.Positive);\n            this.RegisterAxleButton(XboxInputId.DPadDown, SPInputId.Axis7, AxleValueConsideration.Negative);\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/README.md",
    "content": "﻿# com.spacepuppy.SPInput.Unity.Xbox\n\nSPInput includes a profile mapping based on a naming system similar to that of the Xbox 360 GamePad. So the profiles here-in are described in the context of Xbox input names."
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/XboxControllerEnums.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox\n{\n\n    public enum XboxInputId\n    {\n        LStickX,\n        LStickY,\n        RStickX,\n        RStickY,\n        DPadX,\n        DPadY,\n        LTrigger,\n        RTrigger,\n        A,\n        B,\n        X,\n        Y,\n        LB,\n        RB,\n        Start,\n        Back,\n        LStickPress,\n        RStickPress,\n        DPadUp,\n        DPadRight,\n        DPadDown,\n        DPadLeft\n    }\n    \n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/XboxInputImps.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox\n{\n\n    public interface IXboxInputProfile : IConfigurableInputProfile<XboxInputId>\n    {\n\n    }\n\n    public class XboxInputKeyboardProfile : KeyboardProfile<XboxInputId>, IXboxInputProfile\n    {\n\n    }\n\n    public class XboxInputProfileLookupTable : InputProfileLookupTable<IXboxInputProfile, XboxInputId>\n    {\n    }\n\n    public class ConfigurableXboxInputProfile : ConfigurableInputProfile<XboxInputId>, IXboxInputProfile\n    {\n\n        public ConfigurableXboxInputProfile()\n        {\n\n        }\n\n        public ConfigurableXboxInputProfile(IInputProfile<XboxInputId> innerProfile) : base(innerProfile)\n        {\n\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/SPInput/Unity/Xbox/XboxInputProfile.cs",
    "content": "﻿using UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace com.spacepuppy.SPInput.Unity.Xbox\n{\n\n    public abstract class XboxInputProfile : IXboxInputProfile\n    {\n\n        public const string GENERIC_XBOX360 = \"Xbox 360 Controller\";\n        public const string GENERIC_XBOXONE = \"Xbox One Controller\";\n        public const string GENERIC_PS3 = \"PS3 Controller\";\n        public const string GENERIC_PS4 = \"PS4 Controller\";\n\n        #region Fields\n\n        private Dictionary<XboxInputId, InputToken> _axisTable = new Dictionary<XboxInputId, InputToken>();\n        private Dictionary<XboxInputId, InputToken> _buttonTable = new Dictionary<XboxInputId, InputToken>();\n\n        #endregion\n\n        #region Properties\n\n        public Dictionary<XboxInputId, InputToken>.KeyCollection Axes\n        {\n            get { return _axisTable.Keys; }\n        }\n\n        public Dictionary<XboxInputId, InputToken>.KeyCollection Buttons\n        {\n            get { return _buttonTable.Keys; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public void RegisterAxis(XboxInputId axis, InputToken token)\n        {\n            _axisTable[axis] = token;\n            _buttonTable.Remove(axis);\n        }\n\n        public void RegisterAxis(XboxInputId axis, AxisDelegateFactory del)\n        {\n            _axisTable[axis] = InputToken.CreateCustom(del);\n            _buttonTable.Remove(axis);\n        }\n\n        public void RegisterAxis(XboxInputId axis, SPInputId spaxis, bool invert = false)\n        {\n            _axisTable[axis] = InputToken.CreateAxis(spaxis, invert);\n            _buttonTable.Remove(axis);\n        }\n\n        public void RegisterAxis(XboxInputId axis, SPInputId positive, SPInputId negative)\n        {\n            _axisTable[axis] = InputToken.CreateEmulatedAxis(positive, negative);\n            _buttonTable.Remove(axis);\n        }\n\n        public void RegisterButton(XboxInputId button, InputToken token)\n        {\n            _buttonTable[button] = token;\n            _axisTable.Remove(button);\n        }\n\n        public void RegisterButton(XboxInputId button, ButtonDelegateFactory del)\n        {\n            _buttonTable[button] = InputToken.CreateCustom(del);\n            _axisTable.Remove(button);\n        }\n\n        public void RegisterButton(XboxInputId button, SPInputId spbtn)\n        {\n            _buttonTable[button] = InputToken.CreateButton(spbtn);\n            _axisTable.Remove(button);\n        }\n\n        public void RegisterAxleButton(XboxInputId button, SPInputId axis, AxleValueConsideration consideration, float axleButtonDeadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE)\n        {\n            _buttonTable[button] = InputToken.CreateAxleButton(axis, consideration, axleButtonDeadZone);\n            _axisTable.Remove(button);\n        }\n\n        public void RegisterTrigger(XboxInputId trigger, SPInputId axis, AxleValueConsideration consideration = AxleValueConsideration.Positive)\n        {\n            _axisTable[trigger] = InputToken.CreateTrigger(axis, consideration);\n            _buttonTable.Remove(trigger);\n        }\n\n        public void RegisterTrigger(XboxInputId trigger, InputToken token)\n        {\n            _axisTable[trigger] = token;\n            _buttonTable.Remove(trigger);\n        }\n\n\n\n        public InputToken GetAxisMapping(XboxInputId axis)\n        {\n            InputToken result;\n            if (_axisTable.TryGetValue(axis, out result))\n                return result;\n\n            return InputToken.Unknown;\n        }\n\n        public InputToken GetButtonMapping(XboxInputId button)\n        {\n            InputToken result;\n            if (_buttonTable.TryGetValue(button, out result))\n                return result;\n\n            return InputToken.Unknown;\n        }\n\n        public bool TryGetAxisMapping(XboxInputId axis, out InputToken map)\n        {\n            return _axisTable.TryGetValue(axis, out map);\n        }\n\n        public bool TryGetButtonMapping(XboxInputId button, out InputToken map)\n        {\n            return _buttonTable.TryGetValue(button, out map);\n        }\n\n        public bool Contains(XboxInputId id)\n        {\n            return _axisTable.ContainsKey(id) || _buttonTable.ContainsKey(id);\n        }\n\n        public bool Remove(XboxInputId id)\n        {\n            return _axisTable.Remove(id) | _buttonTable.Remove(id);\n        }\n\n        public void Clear()\n        {\n            _axisTable.Clear();\n            _buttonTable.Clear();\n        }\n\n        #endregion\n\n        #region IInputSignatureFactory Interface\n\n        public bool TryPollButton(out XboxInputId button, ButtonState state = ButtonState.Down, Joystick joystick = Joystick.All)\n        {\n            InputToken map;\n\n            var e = _buttonTable.Keys.GetEnumerator();\n            while (e.MoveNext())\n            {\n                if (TryGetButtonMapping(e.Current, out map))\n                {\n                    if (map.PollButton(state, joystick))\n                    {\n                        button = e.Current;\n                        return true;\n                    }\n                }\n            }\n\n            button = default(XboxInputId);\n            return false;\n        }\n\n        public bool TryPollAxis(out XboxInputId axis, out float value, Joystick joystick = Joystick.All, float deadZone = InputUtil.DEFAULT_AXLEBTNDEADZONE)\n        {\n            InputToken map;\n\n            var e = _axisTable.Keys.GetEnumerator();\n            while (e.MoveNext())\n            {\n                if (TryGetAxisMapping(e.Current, out map))\n                {\n                    float v = map.PollAxis(joystick);\n                    if (Mathf.Abs(v) > deadZone)\n                    {\n                        axis = e.Current;\n                        value = v;\n                        return true;\n                    }\n                }\n            }\n\n            axis = default(XboxInputId);\n            value = 0f;\n            return false;\n        }\n\n        public InputToken GetMapping(XboxInputId id)\n        {\n            InputToken result;\n            if (_axisTable.TryGetValue(id, out result)) return result;\n            if (_buttonTable.TryGetValue(id, out result)) return result;\n\n            return InputToken.Unknown;\n        }\n\n        void IConfigurableInputProfile<XboxInputId>.SetAxisMapping(XboxInputId id, InputToken token)\n        {\n            this.RegisterAxis(id, token);\n        }\n\n        void IConfigurableInputProfile<XboxInputId>.SetButtonMapping(XboxInputId id, InputToken token)\n        {\n            this.RegisterButton(id, token);\n        }\n\n        void IConfigurableInputProfile<XboxInputId>.Reset()\n        {\n            this.Clear();\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/Scenario/t_OnAnyInput.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\nusing UnityEngine;\nusing System.Collections.Generic;\n\nusing com.spacepuppy;\nusing com.spacepuppy.Scenario;\nusing com.spacepuppy.SPInput;\n\n\nnamespace com.spacepuppy.Scenario\n{\n\n    [Infobox(\"Use this sparingly as it polls all inputs every frame and can be expensive.\")]\n    public class t_OnAnyInput : SPComponent, IObservableTrigger\n    {\n\n        [System.Flags]\n        public enum TrackingOptions\n        {\n            All = -1,\n            None = 0,\n            TrackUnityKeyboard = 1,\n            TrackMouseScroll = 2,\n            TrackMousePosition = 4,\n            TrackSPInputs = 8\n        }\n\n        #region Fields\n\n        [SerializeField]\n        [EnumFlags]\n        private TrackingOptions _options = TrackingOptions.All;\n\n        [SerializeField]\n        private Trigger _onInput;\n\n        private Vector3 _lastMouse;\n\n        #endregion\n\n        #region Properties\n\n        public TrackingOptions Options\n        {\n            get { return _options; }\n            set { _options = value; }\n        }\n\n        public Trigger OnInput\n        {\n            get { return _onInput; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        protected override void OnEnable()\n        {\n            base.OnEnable();\n\n            _lastMouse = Input.mousePosition;\n        }\n\n        // Update is called once per frame\n        void Update()\n        {\n            var mpos = _lastMouse;\n            _lastMouse = Input.mousePosition;\n\n            if (((_options & TrackingOptions.TrackUnityKeyboard) != 0 && Input.anyKeyDown) ||\n                ((_options & TrackingOptions.TrackMouseScroll) != 0 && Input.mouseScrollDelta.sqrMagnitude > 0.0001f) ||\n                ((_options & TrackingOptions.TrackMousePosition) != 0 && (mpos - _lastMouse).sqrMagnitude > 0.0001f))\n            {\n                _onInput.ActivateTrigger(this, null);\n                return;\n            }\n\n            if ((_options & TrackingOptions.TrackSPInputs) != 0)\n            {\n                var inputManager = Services.Get<IInputManager>();\n                foreach (var dev in inputManager)\n                {\n                    if (dev.AnyInputActivated)\n                    {\n                        _onInput.ActivateTrigger(this, null);\n                        return;\n                    }\n                }\n            }\n        }\n\n        #endregion\n\n        #region IObservableTrigger Interface\n\n        Trigger[] IObservableTrigger.GetTriggers()\n        {\n            return new Trigger[] { _onInput };\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/Scenario/t_OnKey.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\nusing UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing com.spacepuppy.SPInput;\n\nnamespace com.spacepuppy.Scenario\n{\n\n    public class t_OnKey : SPComponent, IObservableTrigger\n    {\n        \n        #region Fields\n\n        [SerializeField]\n        [ReorderableArray]\n        private List<KeyInfo> _keys;\n\n        #endregion\n\n        #region Properties\n\n        public List<KeyInfo> Keys\n        {\n            get\n            {\n                return _keys;\n            }\n        }\n\n        #endregion\n\n        #region Methods\n\n        private void Update()\n        {\n            foreach(var key in _keys)\n            {\n                if (key == null) continue;\n\n                switch(key.State)\n                {\n                    case ButtonState.Released:\n                        if(Input.GetKeyUp(key.Key))\n                        {\n                            key.OnKey.ActivateTrigger(this, null);\n                        }\n                        break;\n                    case ButtonState.None:\n                        if (!Input.GetKey(key.Key) && !Input.GetKeyUp(key.Key))\n                        {\n                            key.OnKey.ActivateTrigger(this, null);\n                        }\n                        break;\n                    case ButtonState.Down:\n                        if(Input.GetKeyDown(key.Key))\n                        {\n                            key.OnKey.ActivateTrigger(this, null);\n                        }\n                        break;\n                    case ButtonState.Held:\n                        if (Input.GetKey(key.Key) && !Input.GetKeyDown(key.Key))\n                        {\n                            key.OnKey.ActivateTrigger(this, null);\n                        }\n                        break;\n                }\n            }\n        }\n\n        #endregion\n\n        #region IObservableTrigger Interface\n\n        Trigger[] IObservableTrigger.GetTriggers()\n        {\n            return (from k in _keys where k != null select k.OnKey).ToArray();\n        }\n\n        #endregion\n\n        #region Special Types\n\n        [System.Serializable]\n        public class KeyInfo\n        {\n            public KeyCode Key = KeyCode.Return;\n            public ButtonState State = ButtonState.Down;\n            [SerializeField]\n            [SPEvent.Config(AlwaysExpanded = true)]\n            private Trigger _onKey = new Trigger();\n\n            public Trigger OnKey\n            {\n                get { return _onKey; }\n            }\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppyInput/Scenario/t_OnSimpleButtonPress.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.SPInput;\r\n\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public sealed class t_OnSimpleButtonPress : TriggerComponent\r\n    {\r\n\r\n        #region Fields\r\n        \r\n        [SerializeField]\r\n        [DisableOnPlay]\r\n        [InputID]\r\n        private string _inputId;\r\n\r\n        //[System.NonSerialized()]\r\n        //private System.Action<string> _callback;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        /*\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            if(_callback == null)\r\n            {\r\n                _callback = (id) =>\r\n                {\r\n                    this.ActivateTrigger();\r\n                };\r\n            }\r\n\r\n            if (_inputId != null)\r\n            {\r\n                var device = EventfulUnityInputDevice.GetDevice();\r\n                device.RegisterButtonPress(_inputId, _callback);\r\n            }\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            if(_callback != null && _inputId != null)\r\n            {\r\n                var device = EventfulUnityInputDevice.GetDevice();\r\n                if(device != null) device.UnregisterButtonPress(_inputId, _callback);\r\n            }\r\n        }\r\n        */\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public string InputId\r\n        {\r\n            get\r\n            {\r\n                return _inputId;\r\n            }\r\n            set\r\n            {\r\n                //if (_inputId == value) return;\r\n                //if(this.enabled && _callback != null)\r\n                //{\r\n                //    var device = EventfulUnityInputDevice.GetDevice();\r\n                //    device.UnregisterButtonPress(_inputId, _callback);\r\n                //    if(value != null) device.RegisterButtonPress(value, _callback);\r\n                //}\r\n\r\n                _inputId = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void Update()\r\n        {\r\n            var service = Services.Get<IInputManager>();\r\n            var input = service != null ? service.Main : null;\r\n            if(input != null)\r\n            {\r\n                if(input.GetButtonState(_inputId) == ButtonState.Down)\r\n                {\r\n                    this.ActivateTrigger(null);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if(Input.GetButtonDown(_inputId))\r\n                {\r\n                    this.ActivateTrigger(null);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyInput/SpacepuppyInput.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{83C642E8-2A84-4815-8F58-487D341021B3}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>com.spacepuppy</RootNamespace>\r\n    <AssemblyName>SpacepuppyUnityFramework.Input</AssemblyName>\r\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile>\r\n    </TargetFrameworkProfile>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"UnityEngine, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"UnityEngine.UI\">\r\n      <HintPath>..\\Resources\\UnityEngine.UI.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"GameInputManager.cs\" />\r\n    <Compile Include=\"Scenario\\t_OnAnyInput.cs\" />\r\n    <Compile Include=\"Scenario\\t_OnKey.cs\" />\r\n    <Compile Include=\"Scenario\\t_OnSimpleButtonPress.cs\" />\r\n    <Compile Include=\"SPInput\\CompositeInputSignature.cs\" />\r\n    <Compile Include=\"SPInput\\DelegatedInputSignature.cs\" />\r\n    <Compile Include=\"SPInput\\Enums.cs\" />\r\n    <Compile Include=\"SPInput\\MergedInputSignature.cs\" />\r\n    <Compile Include=\"SPInput\\IInputDevice.cs\" />\r\n    <Compile Include=\"SPInput\\AnalogButtonSimulator.cs\" />\r\n    <Compile Include=\"SPInput\\ComboInputSignature.cs\" />\r\n    <Compile Include=\"SPInput\\IInputSignature.cs\" />\r\n    <Compile Include=\"SPInput\\IMappedInputDevice.cs\" />\r\n    <Compile Include=\"SPInput\\InputSignatureCollection.cs\" />\r\n    <Compile Include=\"SPInput\\InputUtil.cs\" />\r\n    <Compile Include=\"SPInput\\GenericInputDevice.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"SPInput\\ISequence.cs\" />\r\n    <Compile Include=\"SPInput\\MappedInputDevice.cs\" />\r\n    <Compile Include=\"SPInput\\MappedInputSignatureCollection.cs\" />\r\n    <Compile Include=\"SPInput\\RepeatingButtonInputSignature.cs\" />\r\n    <Compile Include=\"SPInput\\Sequences\\ButtonTap.cs\" />\r\n    <Compile Include=\"SPInput\\Sequences\\CursorMove.cs\" />\r\n    <Compile Include=\"SPInput\\Sequences\\FirstSuccessfulSequence.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\InputLayoutToken.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\ConfigurableInputProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Enums.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\IInputProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\InputProfileLookupTable.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\InputToken.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\KeyboardProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\PollAxisSignatureRoutine.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\PollButtonSignatureRoutine.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\SPInputDirect.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\SPInputFactory.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\InputProfileDescriptionAttributes.cs\" />\r\n    <Compile Include=\"SPInput\\EventSystems\\SPInputModule.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\HamaBlockForceWinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\LogitechF310LinuxProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\LogitechF310MacProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\LogitechF310WinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\LogitechF510LinuxProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\LogitechF510WinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\LogitechF710LinuxProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\LogitechF710MacProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\LogitechF710WinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\LogitechRumblePad2MacProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\LogitechRumblePad2WinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\LogitechWingManWinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\MaxFireBlaze5WinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\MogaProLinuxProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\MogaProMacProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\MogaProWinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\NatecGenesisP44WinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\OuyaWinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\NvidiaShieldAndroidProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\NvidiaShieldWinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\OuyaLinuxProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\PS2WinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\PS3AndroidProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\PS3LinuxProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\PS3MacProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\PS3ShenghicWinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\PS3WinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\PS4AndroidProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\PS4ConsoleProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\PS4LinuxProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\PS4MacOSBTProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\PS4MacOSUSBProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\PS4WinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\SpeedlinkStrikeMacProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\SpeedlinkStrikeWinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\SteelSeriesFreeLinuxProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\SteelSeriesFreeMacProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\SteelSeriesFreeWinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\ValveStreamingWinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\Xbox360AndroidProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\Xbox360LinuxProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\Xbox360LinuxProfile_X.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\Xbox360MacOSProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\Xbox360WinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\XboxOneConsoleProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\XboxOneMacProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\Profiles\\XboxOneWinProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\XboxInputProfile.cs\" />\r\n    <Compile Include=\"SPInput\\Legacy\\EventfulUnityInputDevice.cs\" />\r\n    <Compile Include=\"SPInput\\Legacy\\UnityInputSignatures.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\XboxControllerEnums.cs\" />\r\n    <Compile Include=\"SPInput\\Unity\\Xbox\\XboxInputImps.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\r\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\r\n      <Name>SpacepuppyBase</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <ItemGroup />\r\n  <ItemGroup>\r\n    <None Include=\"SPInput\\Unity\\Xbox\\README.md\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>mkdir $(ProjectDir)..\\Builds\\FullLibrary\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.Input.dll\" \"$(ProjectDir)..\\Builds\\FullLibrary\\SpacepuppyUnityFramework.Input.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.Input.pdb\" \"$(ProjectDir)..\\Builds\\FullLibrary\\SpacepuppyUnityFramework.Input.pdb\"</PostBuildEvent>\r\n  </PropertyGroup>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "SpacepuppyInputEditor/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"SpacepuppyInputEditor\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"SpacepuppyInputEditor\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"720e40e5-9c49-455f-a557-d7621ed3bdc8\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "SpacepuppyInputEditor/Scenario/t_OnSimpleButtonPressInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Scenario;\r\n\r\nnamespace com.spacepuppyeditor.Scenario\r\n{\r\n\r\n    [System.Obsolete(\"Obselete Inspector, now uses the InputIDAttribute instead.\")]\r\n    //[CustomEditor(typeof(t_OnSimpleButtonPress))]\r\n    public class t_OnSimpleButtonPressInspector : SPEditor\r\n    {\r\n\r\n        public const string PROP_INPUTID = \"_inputId\";\r\n\r\n        private string[] _inputIds;\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _inputIds = InputSettings.GetGlobalInputIds();\r\n        }\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n\r\n            var prop = this.serializedObject.FindProperty(PROP_INPUTID);\r\n            int i = System.Array.IndexOf(_inputIds, prop.stringValue);\r\n            i = UnityEditor.EditorGUILayout.Popup(\"Input ID\", i, _inputIds);\r\n            prop.stringValue = (i >= 0) ? _inputIds[i] : string.Empty;\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_INPUTID);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyInputEditor/SpacepuppyInputEditor.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{9F3566EC-4F0B-48FB-9B9F-EDA3774F55CE}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>com.spacepuppyeditor</RootNamespace>\r\n    <AssemblyName>SpacepuppyUnityFrameworkEditor.Input</AssemblyName>\r\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile>\r\n    </TargetFrameworkProfile>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"UnityEditor, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEditor.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"UnityEngine, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"Scenario\\t_OnSimpleButtonPressInspector.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\SpacepuppyBaseEditor\\SpacepuppyBaseEditor.csproj\">\r\n      <Project>{a0466ee3-9582-4c0d-965d-e2d2f9006971}</Project>\r\n      <Name>SpacepuppyBaseEditor</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\r\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\r\n      <Name>SpacepuppyBase</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppyInput\\SpacepuppyInput.csproj\">\r\n      <Project>{83c642e8-2a84-4815-8f58-487d341021b3}</Project>\r\n      <Name>SpacepuppyInput</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>mkdir $(ProjectDir)..\\Builds\\FullLibrary\\Editor\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.Input.dll\" \"$(ProjectDir)..\\Builds\\FullLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.Input.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.Input.pdb\" \"$(ProjectDir)..\\Builds\\FullLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.Input.pdb\"</PostBuildEvent>\r\n  </PropertyGroup>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "SpacepuppyMovement/ArmatureRig.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// Represents the skeletal rig of an entity. This should be attached to the parent of the root bone of the skeleton. This is the same GameObject \r\n    /// on which the Animator/Animation should be set as well. Animator only for sake standards, but Animation HAS to be here anyways for the animations \r\n    /// to even work. Make sure also that the root of the entity is tagged as root, as this will be critical to finding the 'MovementController' when \r\n    /// ragdolling.\r\n    /// </summary>\r\n    [AddComponentMenu(\"SpacePuppy/Armature Rig\")]\r\n    public class ArmatureRig : SPEntityComponent, IIgnorableCollision\r\n    {\r\n\r\n        #region Fields\r\n\r\n        public bool LoadJointListOnStart = true;\r\n        public bool SetJointsKinematicOnLoad = true;\r\n        public bool SetCollidersDisabledOnLoad = true;\r\n\r\n        [SerializeField()]\r\n        private Rigidbody[] _joints = new Rigidbody[] { };\r\n\r\n        private bool _ragdolled;\r\n        private MovementController _cachedController;\r\n        private MovementController.IGameObjectMover _cachedMover;\r\n        private RadicalCoroutine _falseJointCoroutine;\r\n        private bool _mecanimEnabledCache;\r\n        private bool _animatorEnabledCache;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Start()\r\n        {\r\n            if (this.LoadJointListOnStart) this.ReloadJointList();\r\n            if (this.SetJointsKinematicOnLoad) this.SetJointsKinematic(true);\r\n            if (this.SetCollidersDisabledOnLoad) this.SetCollidersEnabled(false);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public Rigidbody RootJoint { get { return _joints.FirstOrDefault(); } }\r\n\r\n        public int JointCount { get {return (_joints != null) ? _joints.Length : 0; } }\r\n\r\n        public IEnumerable<Rigidbody> Joints { get { return _joints; } }\r\n\r\n        public bool Ragdolled { get { return _ragdolled; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public Rigidbody GetJoint(int i)\r\n        {\r\n            return _joints[i];\r\n        }\r\n\r\n        public void SetJoints(IEnumerable<Rigidbody> joints)\r\n        {\r\n            if (joints == null) _joints = new Rigidbody[] { };\r\n            _joints = (from j in joints where j != null select j).Distinct().ToArray();\r\n        }\r\n\r\n        public void ReloadJointList()\r\n        {\r\n            var lst = new List<Rigidbody>();\r\n            foreach (var t in this.GetAllChildrenAndSelf())\r\n            {\r\n                var rb = t.GetComponent<Rigidbody>();\r\n                if (rb != null && t.HasComponent<CharacterJoint>())\r\n                {\r\n                    lst.Add(rb);\r\n                }\r\n            }\r\n\r\n            foreach (var go in lst)\r\n            {\r\n                var j = go.GetComponent<CharacterJoint>();\r\n                var other = j.connectedBody;\r\n                if (!lst.Contains(other))\r\n                {\r\n                    lst.Insert(0, other);\r\n                    break;\r\n                }\r\n            }\r\n\r\n            _joints = lst.ToArray();\r\n        }\r\n\r\n        public void Ragdoll(bool movementControllerAbsent = false)\r\n        {\r\n            if (_ragdolled) return;\r\n\r\n            _cachedController = null;\r\n            if(!movementControllerAbsent) _cachedController = this.FindComponent<MovementController>();\r\n            if (_cachedController != null)\r\n            {\r\n                var ragdollMover = new MovementController.RagdollBodyMover();\r\n                _cachedMover = _cachedController.SwapMover(ragdollMover);\r\n            }\r\n            else\r\n            {\r\n                this.SetJointsKinematic(false);\r\n                this.SetCollidersEnabled(true);\r\n                _falseJointCoroutine = this.StartRadicalCoroutine(this.FalseRootJointUpdate(), RadicalCoroutineDisableMode.Pauses);\r\n            }\r\n\r\n            var mecanim = this.GetComponent<Animator>();\r\n            if (mecanim != null)\r\n            {\r\n                _mecanimEnabledCache = mecanim.enabled;\r\n                mecanim.enabled = false;\r\n            }\r\n\r\n            var anim = this.GetComponent<Animation>();\r\n            if (anim != null)\r\n            {\r\n                _animatorEnabledCache = anim.enabled;\r\n                anim.Stop();\r\n                anim.enabled = false;\r\n            }\r\n\r\n\r\n            _ragdolled = true;\r\n        }\r\n\r\n        public void UndoRagdoll()\r\n        {\r\n            if (!_ragdolled) return;\r\n\r\n            if (_cachedController != null)\r\n            {\r\n                _cachedController.ChangeMover(_cachedMover);\r\n            }\r\n            else\r\n            {\r\n                this.SetJointsKinematic(true);\r\n                this.SetCollidersEnabled(false);\r\n                if (_falseJointCoroutine != null) _falseJointCoroutine.Cancel();\r\n            }\r\n\r\n            var mecanim = this.GetComponent<Animator>();\r\n            if (mecanim != null) mecanim.enabled = _mecanimEnabledCache;\r\n\r\n            var anim = this.GetComponent<Animator>();\r\n            if (anim != null) anim.enabled = _animatorEnabledCache;\r\n\r\n            _cachedController = null;\r\n            _cachedMover = null;\r\n            _falseJointCoroutine = null;\r\n            _mecanimEnabledCache = false;\r\n            _animatorEnabledCache = false;\r\n\r\n            _ragdolled = false;\r\n        }\r\n\r\n        public void SetJointsKinematic(bool bIsKinematic)\r\n        {\r\n            if (_joints != null)\r\n            {\r\n                foreach (var j in _joints)\r\n                {\r\n                    j.isKinematic = bIsKinematic;\r\n                }\r\n            }\r\n        }\r\n\r\n        public void SetCollidersEnabled(bool bEnabled)\r\n        {\r\n            if (_joints != null)\r\n            {\r\n                foreach (var j in _joints)\r\n                {\r\n                    var coll = j.GetComponent<Collider>();\r\n                    if (coll != null) coll.enabled = bEnabled;\r\n                }\r\n            }\r\n        }\r\n\r\n        public void SetJointsLayer(int layer)\r\n        {\r\n            if (_joints != null)\r\n            {\r\n                foreach (var j in _joints)\r\n                {\r\n                    j.gameObject.layer = layer;\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n\r\n        public float CalculateMass()\r\n        {\r\n            if (_joints == null || _joints.Length == 0) return 0;\r\n            //return (from j in _joints where j != null select j.mass).Sum();\r\n\r\n            float m = 0f;\r\n            foreach(var j in _joints)\r\n            {\r\n                m += j.mass;\r\n            }\r\n            return m;\r\n        }\r\n\r\n        public com.spacepuppy.Geom.Sphere CalculateBoundingSphere(bool bIncludeTriggers = false)\r\n        {\r\n            if (this.RootJoint == null) return new com.spacepuppy.Geom.Sphere(this.transform.position, 0f);\r\n\r\n            var sphere = new com.spacepuppy.Geom.Sphere(this.RootJoint.worldCenterOfMass, 0f);\r\n            if (bIncludeTriggers)\r\n            {\r\n                foreach (var coll in this.RootJoint.GetChildComponents<Collider>())\r\n                {\r\n                    sphere.Encapsulate(com.spacepuppy.Geom.Sphere.FromCollider(coll));\r\n                }\r\n            }\r\n            else\r\n            {\r\n                foreach (var coll in from c in this.RootJoint.GetChildComponents<Collider>() where !c.isTrigger select c)\r\n                {\r\n                    sphere.Encapsulate(com.spacepuppy.Geom.Sphere.FromCollider(coll));\r\n                }\r\n            }\r\n\r\n            return sphere;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Routines\r\n\r\n        private System.Collections.IEnumerable FalseRootJointUpdate()\r\n        {\r\n            while(true)\r\n            {\r\n                yield return null;\r\n                if (!_ragdolled) yield break;\r\n\r\n                if (this.RootJoint != null && this.RootJoint.transform != this.entityRoot.transform)\r\n                {\r\n                    var pos = this.RootJoint.transform.position;\r\n                    this.entityRoot.transform.position = pos;\r\n                    this.RootJoint.transform.position = pos;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IIgnorableCollision Interface\r\n\r\n        public void IgnoreCollision(Collider collider, bool ignore)\r\n        {\r\n            if (_joints == null || _joints.Length == 0) return;\r\n            if (collider == null || !collider.enabled) return;\r\n\r\n            Collider jc;\r\n            foreach (var j in _joints)\r\n            {\r\n                jc = j.GetComponent<Collider>();\r\n                if (jc.IsActiveAndEnabled()) Physics.IgnoreCollision(collider, jc, ignore);\r\n            }\r\n        }\r\n\r\n        public void IgnoreCollision(IIgnorableCollision coll, bool ignore)\r\n        {\r\n            if (_joints == null || _joints.Length == 0) return;\r\n            if (coll == null) return;\r\n\r\n            Collider jc;\r\n            foreach (var j in _joints)\r\n            {\r\n                jc = j.GetComponent<Collider>();\r\n                if (jc.IsActiveAndEnabled()) coll.IgnoreCollision(jc, ignore);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyMovement/Movement/DumbMovementStyle.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Movement;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Movement\r\n{\r\n\r\n    /// <summary>\r\n    /// Represents a MovementStyle that operates regardless of if a MovementMotor is present or not, or even a MovementController. \r\n    /// Most MovementStyles rely on the MovementMotor state machine to manage when it is enabled or not, and a MovementController \r\n    /// to handle appropriately calculate translation on the call to 'Move'.\r\n    /// \r\n    /// Some MovementStyles though may only need\r\n    /// </summary>\r\n    public abstract class DumbMovementStyle : SPEntityComponent, IMovementStyle, IIgnorableCollision\r\n    {\r\n\r\n        public enum UpdateMode\r\n        {\r\n            Inactive = 0,\r\n            Motor = 1,\r\n            MovementControllerOnly = 2,\r\n            CharacterController = 3,\r\n            DumbRigidbody = 4,\r\n            DumbTransformOnly = 5\r\n        }\r\n        \r\n        protected virtual void OnHitSomething(Collider c)\r\n        {\r\n        }\r\n        protected virtual void OnHitSomething(Collision c)\r\n        {\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private bool _activateOnStart;\r\n\r\n        [System.NonSerialized()]\r\n        private UpdateMode _mode;\r\n\r\n        [System.NonSerialized()]\r\n        private MovementMotor _motor;\r\n        [System.NonSerialized()]\r\n        private MovementController _controller;\r\n        [System.NonSerialized()]\r\n        private CharacterController _charController;\r\n        [System.NonSerialized()]\r\n        private Rigidbody _rigidbody;\r\n\r\n        [System.NonSerialized()]\r\n        private RadicalCoroutine _routine;\r\n\r\n        [System.NonSerialized()]\r\n        private Vector3 _lastPos;\r\n        [System.NonSerialized()]\r\n        private Vector3 _dumbVel;\r\n\r\n\r\n        [System.NonSerialized()]\r\n        private bool _activeStatus;\r\n        [System.NonSerialized()]\r\n        private bool _paused;\r\n        [System.NonSerialized]\r\n        private bool _rigidbodyKinematicCache;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            this.DetermineUpdateMode();\r\n        }\r\n\r\n        protected override void OnStartOrEnable()\r\n        {\r\n            base.OnStartOrEnable();\r\n            \r\n            if (_activateOnStart && _mode > UpdateMode.Motor)\r\n            {\r\n                this.MakeActiveStyle();\r\n            }\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            if (GameLoopEntry.ApplicationClosing) return;\r\n\r\n            if (_activeStatus)\r\n            {\r\n                this.DeactivateStyle();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool ActivateOnStart\r\n        {\r\n            get { return _activateOnStart; }\r\n            set { _activateOnStart = value; }\r\n        }\r\n\r\n        public MovementMotor Motor { get { return _motor; } }\r\n\r\n        public MovementController Controller { get { return _controller; } }\r\n\r\n        public CharacterController CharacterController { get { return _charController; } }\r\n\r\n        public Rigidbody Rigidbody { get { return _rigidbody; } }\r\n\r\n        public UpdateMode Mode { get { return _mode; } }\r\n\r\n        public bool PrefersFixedUpdate\r\n        {\r\n            get\r\n            {\r\n                switch(_mode)\r\n                {\r\n                    case UpdateMode.Motor:\r\n                    case UpdateMode.MovementControllerOnly:\r\n                        return _controller.Mover.PrefersFixedUpdate;\r\n                    case UpdateMode.CharacterController:\r\n                        return false;\r\n                    case UpdateMode.DumbRigidbody:\r\n                        return true;\r\n                    case UpdateMode.DumbTransformOnly:\r\n                    default:\r\n                        return false;\r\n                }\r\n            }\r\n        }\r\n\r\n        public Vector3 Position\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case UpdateMode.Motor:\r\n                    case UpdateMode.MovementControllerOnly:\r\n                        return _controller.transform.position;\r\n                    case UpdateMode.CharacterController:\r\n                        return _charController.transform.position;\r\n                    case UpdateMode.DumbRigidbody:\r\n                        return _rigidbody.position;\r\n                    case UpdateMode.DumbTransformOnly:\r\n                    default:\r\n                        return this.entityRoot.transform.position;\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch(_mode)\r\n                {\r\n                    case UpdateMode.Motor:\r\n                    case UpdateMode.MovementControllerOnly:\r\n                        _controller.transform.position = value;\r\n                        break;\r\n                    case UpdateMode.CharacterController:\r\n                        _charController.transform.position = value;\r\n                        break;\r\n                    case UpdateMode.DumbRigidbody:\r\n                        _rigidbody.position = value;\r\n                        break;\r\n                    case UpdateMode.DumbTransformOnly:\r\n                    default:\r\n                        this.entityRoot.transform.position = value;\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n        public Vector3 Velocity\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case UpdateMode.Motor:\r\n                    case UpdateMode.MovementControllerOnly:\r\n                        return _controller.Velocity;\r\n                    case UpdateMode.CharacterController:\r\n                        return _charController.velocity;\r\n                    case UpdateMode.DumbRigidbody:\r\n                        if (_rigidbody.isKinematic)\r\n                            return _dumbVel;\r\n                        else\r\n                            return _rigidbody.velocity;\r\n                    case UpdateMode.DumbTransformOnly:\r\n                        return _dumbVel;\r\n                    default:\r\n                        return Vector3.zero;\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch(_mode)\r\n                {\r\n                    case UpdateMode.Motor:\r\n                    case UpdateMode.MovementControllerOnly:\r\n                        _controller.Velocity = value;\r\n                        break;\r\n                    case UpdateMode.CharacterController:\r\n                        //do nothing\r\n                        break;\r\n                    case UpdateMode.DumbRigidbody:\r\n                        if (_rigidbody.isKinematic)\r\n                            _dumbVel = value;\r\n                        else\r\n                            _rigidbody.velocity = value;\r\n                        break;\r\n                    case UpdateMode.DumbTransformOnly:\r\n                        _dumbVel = value;\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool Paused\r\n        {\r\n            get { return _paused; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void MakeActiveStyle(bool stackState = false)\r\n        {\r\n            if (!this.isActiveAndEnabled) return;\r\n\r\n            if (_mode == UpdateMode.Motor)\r\n            {\r\n                if (stackState)\r\n                    _motor.States.StackState(this);\r\n                else\r\n                    _motor.States.ChangeState(this);\r\n            }\r\n            else\r\n            {\r\n                _activeStatus = true;\r\n                if (_routine == null || _routine.Finished)\r\n                    _routine = this.StartRadicalCoroutine(this.SelfUpdateRoutine(), RadicalCoroutineDisableMode.Pauses);\r\n                else if (_routine.OperatingState == RadicalCoroutineOperatingState.Inactive)\r\n                    _routine.Start(this, RadicalCoroutineDisableMode.Pauses);\r\n            }\r\n        }\r\n\r\n        public void DeactivateStyle(MovementMotor.ReleaseMode mode = MovementMotor.ReleaseMode.PopAllOrDefault, float precedence = 0f)\r\n        {\r\n            if (!_activeStatus) return;\r\n\r\n            if (_mode == UpdateMode.Motor)\r\n            {\r\n                _motor.States.ReleaseCurrentState(mode, precedence);\r\n            }\r\n            else\r\n            {\r\n                if (_routine != null)\r\n                {\r\n                    _routine.Stop();\r\n                }\r\n                if (_paused) this.Pause(false);\r\n                this.OnDeactivate(null, ActivationReason.Standard);\r\n                _activeStatus = false;\r\n            }\r\n            _mode = UpdateMode.Inactive;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Puts the movement style into a state that it no longer moves the entity, if there is a non-kinematic rigidbody to the component, it is set to kinematic. \r\n        /// This will only work if this style is currently active, and will automatically be unpaused on deactivate.\r\n        /// </summary>\r\n        public void Pause(bool pause)\r\n        {\r\n            if (pause)\r\n            {\r\n                if (!_paused)\r\n                {\r\n                    if (!this.IsActiveStyle) return;\r\n\r\n                    switch (_mode)\r\n                    {\r\n                        case UpdateMode.Inactive:\r\n                            //do nothing\r\n                            break;\r\n                        case UpdateMode.Motor:\r\n                        case UpdateMode.MovementControllerOnly:\r\n                            _paused = true;\r\n                            //_controller.Pause(true);\r\n                            break;\r\n                        case UpdateMode.CharacterController:\r\n                            //do nothing\r\n                            break;\r\n                        case UpdateMode.DumbRigidbody:\r\n                            if (!_rigidbody.isKinematic)\r\n                            {\r\n                                _paused = true;\r\n                                _rigidbodyKinematicCache = _rigidbody.isKinematic;\r\n                                _rigidbody.isKinematic = true;\r\n                            }\r\n                            break;\r\n                        case UpdateMode.DumbTransformOnly:\r\n                            //do nothing\r\n                            break;\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (_paused)\r\n                {\r\n                    _paused = false;\r\n                    switch (_mode)\r\n                    {\r\n                        case UpdateMode.Inactive:\r\n                            //do nothing\r\n                            break;\r\n                        case UpdateMode.Motor:\r\n                        case UpdateMode.MovementControllerOnly:\r\n                            //_controller.Pause(false);\r\n                            break;\r\n                        case UpdateMode.CharacterController:\r\n                            //do nothing\r\n                            break;\r\n                        case UpdateMode.DumbRigidbody:\r\n                            _rigidbody.isKinematic = _rigidbodyKinematicCache;\r\n                            break;\r\n                        case UpdateMode.DumbTransformOnly:\r\n                            //do nothing\r\n                            break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        \r\n        protected UpdateMode DetermineUpdateMode()\r\n        {\r\n            _motor = this.GetComponent<MovementMotor>();\r\n            _controller = this.entityRoot.GetComponent<MovementController>();\r\n            _charController = this.entityRoot.GetComponent<CharacterController>();\r\n            _rigidbody = this.entityRoot.GetComponent<Rigidbody>();\r\n\r\n            if (_motor != null)\r\n            {\r\n                _mode = UpdateMode.Motor;\r\n            }\r\n            else if (_controller != null)\r\n            {\r\n                _mode = UpdateMode.MovementControllerOnly;\r\n            }\r\n            else if(_charController != null)\r\n            {\r\n                _mode = UpdateMode.CharacterController;\r\n            }\r\n            else if (_rigidbody != null)\r\n            {\r\n                _mode = UpdateMode.DumbRigidbody;\r\n            }\r\n            else\r\n            {\r\n                _mode = UpdateMode.DumbTransformOnly;\r\n            }\r\n\r\n            return _mode;\r\n        }\r\n\r\n        private System.Collections.IEnumerator SelfUpdateRoutine()\r\n        {\r\n            var fixedYieldInstruct = new WaitForFixedUpdate();\r\n            this.OnActivate(null, ActivationReason.Standard);\r\n\r\n        Loop:\r\n            switch (_mode)\r\n            {\r\n                case UpdateMode.MovementControllerOnly:\r\n                    try\r\n                    {\r\n                        _controller.OnBeforeUpdate();\r\n\r\n                        this.UpdateMovement();\r\n\r\n                        this.OnUpdateMovementComplete();\r\n                    }\r\n                    catch (System.Exception ex)\r\n                    {\r\n                        Debug.LogException(ex, this);\r\n                    }\r\n                    finally\r\n                    {\r\n                        _controller.OnUpdateComplete();\r\n                    }\r\n                    yield return (_controller.Mover.PrefersFixedUpdate) ? fixedYieldInstruct : null;\r\n                    break;\r\n\r\n                case UpdateMode.DumbRigidbody:\r\n                    if (_rigidbody.isKinematic)\r\n                    {\r\n                        yield return fixedYieldInstruct;\r\n                        _lastPos = _rigidbody.position;\r\n                        this.UpdateMovement();\r\n                        _dumbVel = (_rigidbody.position - _lastPos) / Time.deltaTime;\r\n                        this.OnUpdateMovementComplete();\r\n                    }\r\n                    else\r\n                    {\r\n                        yield return fixedYieldInstruct;\r\n                        this.UpdateMovement();\r\n                        this.OnUpdateMovementComplete();\r\n                    }\r\n                    break;\r\n\r\n                case UpdateMode.DumbTransformOnly:\r\n                    _lastPos = this.entityRoot.transform.position;\r\n                    this.UpdateMovement();\r\n                    _dumbVel = (this.entityRoot.transform.position - _lastPos) / Time.deltaTime;\r\n                    this.OnUpdateMovementComplete();\r\n                    yield return null;\r\n                    break;\r\n            }\r\n\r\n            goto Loop;\r\n        }\r\n\r\n        protected abstract void UpdateMovement();\r\n\r\n        protected virtual void OnUpdateMovementComplete()\r\n        {\r\n\r\n        }\r\n\r\n        protected virtual void OnActivate(IMovementStyle lastStyle, ActivationReason reason)\r\n        {\r\n\r\n        }\r\n\r\n        protected virtual void OnDeactivate(IMovementStyle nextStyle, ActivationReason reason)\r\n        {\r\n\r\n        }\r\n\r\n        protected virtual void OnPurgedFromStack()\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region IMovementStyle Interface\r\n\r\n        void IMovementStyle.OnActivate(IMovementStyle lastStyle, ActivationReason reason)\r\n        {\r\n            if (_mode == UpdateMode.Inactive) this.DetermineUpdateMode();\r\n            _activeStatus = true;\r\n            this.OnActivate(lastStyle, reason);\r\n        }\r\n\r\n        void IMovementStyle.OnDeactivate(IMovementStyle nextStyle, ActivationReason reason)\r\n        {\r\n            if (_paused) this.Pause(false);\r\n            this.OnDeactivate(nextStyle, reason);\r\n            _activeStatus = false;\r\n        }\r\n\r\n        void IMovementStyle.OnPurgedFromStack()\r\n        {\r\n            this.OnPurgedFromStack();\r\n        }\r\n\r\n        void IMovementStyle.UpdateMovement()\r\n        {\r\n            this.UpdateMovement();\r\n        }\r\n\r\n        void IMovementStyle.OnUpdateMovementComplete()\r\n        {\r\n            this.OnUpdateMovementComplete();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Movement Interface\r\n\r\n        public bool IsActiveStyle { get { return _activeStatus; } }\r\n\r\n        public void Move(Vector3 mv)\r\n        {\r\n            if (_paused) return;\r\n\r\n            switch (this.Mode)\r\n            {\r\n                case UpdateMode.Motor:\r\n                    _motor.Controller.Move(mv);\r\n                    break;\r\n\r\n                case UpdateMode.MovementControllerOnly:\r\n                    _controller.Move(mv);\r\n                    break;\r\n                case UpdateMode.CharacterController:\r\n                    if(_charController.Move(mv) != CollisionFlags.None)\r\n                    {\r\n                        this.OnHitSomething((Collider)null);\r\n                    }\r\n                    break;\r\n                case UpdateMode.DumbRigidbody:\r\n                    if (_rigidbody.isKinematic)\r\n                    {\r\n                        _rigidbody.MovePosition(_rigidbody.position + mv);\r\n                    }\r\n                    else\r\n                    {\r\n                        _rigidbody.velocity = mv / Time.deltaTime;\r\n                    }\r\n                    break;\r\n                case UpdateMode.DumbTransformOnly:\r\n                    this.entityRoot.transform.Translate(mv);\r\n\r\n                    break;\r\n            }\r\n        }\r\n\r\n        public void MovePosition(Vector3 pos)\r\n        {\r\n            if (_paused) return;\r\n\r\n            switch (this.Mode)\r\n            {\r\n                case UpdateMode.Motor:\r\n                    _motor.Controller.Move(pos - _motor.Controller.transform.position);\r\n                    break;\r\n\r\n                case UpdateMode.MovementControllerOnly:\r\n                    _controller.Move(pos - _controller.transform.position);\r\n                    break;\r\n                case UpdateMode.CharacterController:\r\n                    if (_charController.Move(pos - _charController.transform.position) != CollisionFlags.None)\r\n                    {\r\n                        this.OnHitSomething((Collider)null);\r\n                    }\r\n                    break;\r\n                case UpdateMode.DumbRigidbody:\r\n                    _rigidbody.MovePosition(pos);\r\n                    break;\r\n                case UpdateMode.DumbTransformOnly:\r\n                    this.entityRoot.transform.position = pos;\r\n\r\n                    break;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IIgnorableCollision Interface\r\n\r\n        public void IgnoreCollision(Collider coll, bool ignore)\r\n        {\r\n            switch(_mode)\r\n            {\r\n                case UpdateMode.Motor:\r\n                case UpdateMode.MovementControllerOnly:\r\n                    _controller.IgnoreCollision(coll, ignore);\r\n                    break;\r\n                case UpdateMode.CharacterController:\r\n                    Physics.IgnoreCollision(_charController, coll, ignore);\r\n                    break;\r\n                case UpdateMode.DumbRigidbody:\r\n                    IgnorableRigidbody.GetIgnorableCollision(_rigidbody).IgnoreCollision(coll, ignore);\r\n                    break;\r\n            }\r\n        }\r\n\r\n        public void IgnoreCollision(IIgnorableCollision coll, bool ignore)\r\n        {\r\n            switch (_mode)\r\n            {\r\n                case UpdateMode.Motor:\r\n                case UpdateMode.MovementControllerOnly:\r\n                    _controller.IgnoreCollision(coll, ignore);\r\n                    break;\r\n                case UpdateMode.CharacterController:\r\n                    coll.IgnoreCollision(_charController, ignore);\r\n                    break;\r\n                case UpdateMode.DumbRigidbody:\r\n                    IgnorableRigidbody.GetIgnorableCollision(_rigidbody).IgnoreCollision(coll, ignore);\r\n                    break;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n    /// <summary>\r\n    /// Represents a MovementStyle that operates regardless of if a MovementMotor is present or not, or even a MovementController. \r\n    /// Most MovementStyles rely on the MovementMotor state machine to manage when it is enabled or not, and a MovementController \r\n    /// to handle appropriately calculate translation on the call to 'Move'.\r\n    /// \r\n    /// Some MovementStyles though may only need\r\n    /// </summary>\r\n    internal abstract class DumbMovementStyle_Old : SPEntityComponent, IMovementStyle, IIgnorableCollision\r\n    {\r\n\r\n        public enum UpdateMode\r\n        {\r\n            Inactive = 0,\r\n            Motor = 1,\r\n            MovementControllerOnly = 2,\r\n            CharacterController = 3,\r\n            DumbRigidbody = 4,\r\n            DumbTransformOnly = 5\r\n        }\r\n\r\n        public class HitEventArgs : System.EventArgs\r\n        {\r\n            private Collider _collider;\r\n\r\n            public HitEventArgs(Collider collider)\r\n            {\r\n                _collider = collider;\r\n            }\r\n\r\n            public Collider Collider { get { return _collider; } }\r\n        }\r\n        public event System.EventHandler<HitEventArgs> HitSomething;\r\n        protected virtual void OnHitSomething(Collider c)\r\n        {\r\n            if (this.HitSomething != null) this.HitSomething(this, new HitEventArgs(c));\r\n        }\r\n        protected virtual void OnHitSomething(Collision c)\r\n        {\r\n            if (this.HitSomething != null) this.HitSomething(this, new HitEventArgs(c.collider));\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private bool _activateOnStart;\r\n\r\n        private UpdateMode _mode;\r\n\r\n        [System.NonSerialized()]\r\n        private MovementMotor _motor;\r\n        [System.NonSerialized()]\r\n        private MovementController _controller;\r\n        [System.NonSerialized()]\r\n        private CharacterController _charController;\r\n        [System.NonSerialized()]\r\n        private Rigidbody _rigidbody;\r\n\r\n        [System.NonSerialized()]\r\n        private RadicalCoroutine _routine;\r\n\r\n        [System.NonSerialized()]\r\n        private Vector3 _lastPos;\r\n        [System.NonSerialized()]\r\n        private Vector3 _dumbVel;\r\n\r\n\r\n        [System.NonSerialized()]\r\n        private bool _activeStatus;\r\n        [System.NonSerialized()]\r\n        private bool _paused;\r\n        [System.NonSerialized]\r\n        private bool _rigidbodyKinematicCache;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            this.DetermineUpdateMode();\r\n        }\r\n\r\n        protected override void OnStartOrEnable()\r\n        {\r\n            base.OnStartOrEnable();\r\n\r\n            if (_activateOnStart && _mode > UpdateMode.Motor)\r\n            {\r\n                this.MakeActiveStyle();\r\n            }\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            if (GameLoopEntry.ApplicationClosing) return;\r\n\r\n            if (_activeStatus)\r\n            {\r\n                this.DeactivateStyle();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool ActivateOnStart\r\n        {\r\n            get { return _activateOnStart; }\r\n            set { _activateOnStart = value; }\r\n        }\r\n\r\n        public MovementMotor Motor { get { return _motor; } }\r\n\r\n        public MovementController Controller { get { return _controller; } }\r\n\r\n        public CharacterController CharacterController { get { return _charController; } }\r\n\r\n        public Rigidbody Rigidbody { get { return _rigidbody; } }\r\n\r\n        public UpdateMode Mode { get { return _mode; } }\r\n\r\n        public bool PrefersFixedUpdate\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case UpdateMode.Motor:\r\n                    case UpdateMode.MovementControllerOnly:\r\n                        return _controller.Mover.PrefersFixedUpdate;\r\n                    case UpdateMode.CharacterController:\r\n                        return false;\r\n                    case UpdateMode.DumbRigidbody:\r\n                        return true;\r\n                    case UpdateMode.DumbTransformOnly:\r\n                    default:\r\n                        return false;\r\n                }\r\n            }\r\n        }\r\n\r\n        public Vector3 Position\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case UpdateMode.Motor:\r\n                    case UpdateMode.MovementControllerOnly:\r\n                        return _controller.transform.position;\r\n                    case UpdateMode.CharacterController:\r\n                        return _charController.transform.position;\r\n                    case UpdateMode.DumbRigidbody:\r\n                        return _rigidbody.position;\r\n                    case UpdateMode.DumbTransformOnly:\r\n                    default:\r\n                        return this.entityRoot.transform.position;\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case UpdateMode.Motor:\r\n                    case UpdateMode.MovementControllerOnly:\r\n                        _controller.transform.position = value;\r\n                        break;\r\n                    case UpdateMode.CharacterController:\r\n                        _charController.transform.position = value;\r\n                        break;\r\n                    case UpdateMode.DumbRigidbody:\r\n                        _rigidbody.position = value;\r\n                        break;\r\n                    case UpdateMode.DumbTransformOnly:\r\n                    default:\r\n                        this.entityRoot.transform.position = value;\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n        public Vector3 Velocity\r\n        {\r\n            get\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case UpdateMode.Motor:\r\n                    case UpdateMode.MovementControllerOnly:\r\n                        return _controller.Velocity;\r\n                    case UpdateMode.CharacterController:\r\n                        return _charController.velocity;\r\n                    case UpdateMode.DumbRigidbody:\r\n                        if (_rigidbody.isKinematic)\r\n                            return _dumbVel;\r\n                        else\r\n                            return _rigidbody.velocity;\r\n                    case UpdateMode.DumbTransformOnly:\r\n                        return _dumbVel;\r\n                    default:\r\n                        return Vector3.zero;\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch (_mode)\r\n                {\r\n                    case UpdateMode.Motor:\r\n                    case UpdateMode.MovementControllerOnly:\r\n                        _controller.Velocity = value;\r\n                        break;\r\n                    case UpdateMode.CharacterController:\r\n                        //do nothing\r\n                        break;\r\n                    case UpdateMode.DumbRigidbody:\r\n                        if (_rigidbody.isKinematic)\r\n                            _dumbVel = value;\r\n                        else\r\n                            _rigidbody.velocity = value;\r\n                        break;\r\n                    case UpdateMode.DumbTransformOnly:\r\n                        _dumbVel = value;\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool Paused\r\n        {\r\n            get { return _paused; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void MakeActiveStyle(bool stackState = false)\r\n        {\r\n            if (!this.isActiveAndEnabled) return;\r\n\r\n            if (_mode == UpdateMode.Motor)\r\n            {\r\n                if (stackState)\r\n                    _motor.States.StackState(this);\r\n                else\r\n                    _motor.States.ChangeState(this);\r\n            }\r\n            else\r\n            {\r\n                _activeStatus = true;\r\n                if (_routine == null || _routine.Finished)\r\n                    _routine = this.StartRadicalCoroutine(this.SelfUpdateRoutine(), RadicalCoroutineDisableMode.Pauses);\r\n                else if (_routine.OperatingState == RadicalCoroutineOperatingState.Inactive)\r\n                    _routine.Start(this, RadicalCoroutineDisableMode.Pauses);\r\n            }\r\n        }\r\n\r\n        public void DeactivateStyle(MovementMotor.ReleaseMode mode = MovementMotor.ReleaseMode.PopAllOrDefault, float precedence = 0f)\r\n        {\r\n            if (!_activeStatus) return;\r\n\r\n            if (_mode == UpdateMode.Motor)\r\n            {\r\n                _motor.States.ReleaseCurrentState(mode, precedence);\r\n            }\r\n            else\r\n            {\r\n                if (_routine != null)\r\n                {\r\n                    _routine.Stop();\r\n                }\r\n                if (_paused) this.Pause(false);\r\n                this.OnDeactivate(null, ActivationReason.Standard);\r\n                _activeStatus = false;\r\n            }\r\n            _mode = UpdateMode.Inactive;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Puts the movement style into a state that it no longer moves the entity, if there is a non-kinematic rigidbody to the component, it is set to kinematic. \r\n        /// This will only work if this style is currently active, and will automatically be unpaused on deactivate.\r\n        /// </summary>\r\n        public void Pause(bool pause)\r\n        {\r\n            if (pause)\r\n            {\r\n                if (!_paused)\r\n                {\r\n                    if (!this.IsActiveStyle) return;\r\n\r\n                    switch (_mode)\r\n                    {\r\n                        case UpdateMode.Inactive:\r\n                            //do nothing\r\n                            break;\r\n                        case UpdateMode.Motor:\r\n                        case UpdateMode.MovementControllerOnly:\r\n                            _paused = true;\r\n                            //_controller.Pause(true);\r\n                            break;\r\n                        case UpdateMode.CharacterController:\r\n                            //do nothing\r\n                            break;\r\n                        case UpdateMode.DumbRigidbody:\r\n                            if (!_rigidbody.isKinematic)\r\n                            {\r\n                                _paused = true;\r\n                                _rigidbodyKinematicCache = _rigidbody.isKinematic;\r\n                                _rigidbody.isKinematic = true;\r\n                            }\r\n                            break;\r\n                        case UpdateMode.DumbTransformOnly:\r\n                            //do nothing\r\n                            break;\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (_paused)\r\n                {\r\n                    _paused = false;\r\n                    switch (_mode)\r\n                    {\r\n                        case UpdateMode.Inactive:\r\n                            //do nothing\r\n                            break;\r\n                        case UpdateMode.Motor:\r\n                        case UpdateMode.MovementControllerOnly:\r\n                            //_controller.Pause(false);\r\n                            break;\r\n                        case UpdateMode.CharacterController:\r\n                            //do nothing\r\n                            break;\r\n                        case UpdateMode.DumbRigidbody:\r\n                            _rigidbody.isKinematic = _rigidbodyKinematicCache;\r\n                            break;\r\n                        case UpdateMode.DumbTransformOnly:\r\n                            //do nothing\r\n                            break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        protected UpdateMode DetermineUpdateMode()\r\n        {\r\n            if (_controller != null) _controller.MovementControllerHit -= this.OnControllerHitHandler;\r\n\r\n            _motor = this.GetComponent<MovementMotor>();\r\n            _controller = this.entityRoot.GetComponent<MovementController>();\r\n            _charController = this.entityRoot.GetComponent<CharacterController>();\r\n            _rigidbody = this.entityRoot.GetComponent<Rigidbody>();\r\n\r\n            if (_motor != null)\r\n            {\r\n                _mode = UpdateMode.Motor;\r\n                _controller.MovementControllerHit -= this.OnControllerHitHandler;\r\n                _controller.MovementControllerHit += this.OnControllerHitHandler;\r\n            }\r\n            else if (_controller != null)\r\n            {\r\n                _mode = UpdateMode.MovementControllerOnly;\r\n                _controller.MovementControllerHit -= this.OnControllerHitHandler;\r\n                _controller.MovementControllerHit += this.OnControllerHitHandler;\r\n            }\r\n            else if (_charController != null)\r\n            {\r\n                _mode = UpdateMode.CharacterController;\r\n            }\r\n            else if (_rigidbody != null)\r\n            {\r\n                _mode = UpdateMode.DumbRigidbody;\r\n            }\r\n            else\r\n            {\r\n                _mode = UpdateMode.DumbTransformOnly;\r\n            }\r\n\r\n            return _mode;\r\n        }\r\n\r\n        private System.Collections.IEnumerator SelfUpdateRoutine()\r\n        {\r\n            var fixedYieldInstruct = new WaitForFixedUpdate();\r\n            this.OnActivate(null, ActivationReason.Standard);\r\n\r\n            Loop:\r\n            switch (_mode)\r\n            {\r\n                case UpdateMode.MovementControllerOnly:\r\n                    try\r\n                    {\r\n                        _controller.OnBeforeUpdate();\r\n\r\n                        this.UpdateMovement();\r\n\r\n                        this.OnUpdateMovementComplete();\r\n                    }\r\n                    catch (System.Exception ex)\r\n                    {\r\n                        Debug.LogException(ex, this);\r\n                    }\r\n                    finally\r\n                    {\r\n                        _controller.OnUpdateComplete();\r\n                    }\r\n                    yield return (_controller.Mover.PrefersFixedUpdate) ? fixedYieldInstruct : null;\r\n                    break;\r\n\r\n                case UpdateMode.DumbRigidbody:\r\n                    if (_rigidbody.isKinematic)\r\n                    {\r\n                        yield return fixedYieldInstruct;\r\n                        _lastPos = _rigidbody.position;\r\n                        this.UpdateMovement();\r\n                        _dumbVel = (_rigidbody.position - _lastPos) / Time.deltaTime;\r\n                        this.OnUpdateMovementComplete();\r\n                    }\r\n                    else\r\n                    {\r\n                        yield return fixedYieldInstruct;\r\n                        this.UpdateMovement();\r\n                        this.OnUpdateMovementComplete();\r\n                    }\r\n                    break;\r\n\r\n                case UpdateMode.DumbTransformOnly:\r\n                    _lastPos = this.entityRoot.transform.position;\r\n                    this.UpdateMovement();\r\n                    _dumbVel = (this.entityRoot.transform.position - _lastPos) / Time.deltaTime;\r\n                    this.OnUpdateMovementComplete();\r\n                    yield return null;\r\n                    break;\r\n            }\r\n\r\n            goto Loop;\r\n        }\r\n\r\n        protected abstract void UpdateMovement();\r\n\r\n        protected virtual void OnUpdateMovementComplete()\r\n        {\r\n\r\n        }\r\n\r\n        protected virtual void OnActivate(IMovementStyle lastStyle, ActivationReason reason)\r\n        {\r\n\r\n        }\r\n\r\n        protected virtual void OnDeactivate(IMovementStyle nextStyle, ActivationReason reason)\r\n        {\r\n\r\n        }\r\n\r\n        protected virtual void OnPurgedFromStack()\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Event Handlers\r\n\r\n        private System.EventHandler<MovementController.MovementControllerHitEventArgs> _onControllerHitHandler;\r\n        private System.EventHandler<MovementController.MovementControllerHitEventArgs> OnControllerHitHandler\r\n        {\r\n            get\r\n            {\r\n                if (_onControllerHitHandler == null) _onControllerHitHandler = new System.EventHandler<MovementController.MovementControllerHitEventArgs>(this.OnControllerHit);\r\n                return _onControllerHitHandler;\r\n            }\r\n        }\r\n        private void OnControllerHit(object sender, MovementController.MovementControllerHitEventArgs e)\r\n        {\r\n            if (_activeStatus) return;\r\n\r\n            this.OnHitSomething(e.Collider);\r\n        }\r\n\r\n        private void OnCollisionEnter(Collision c)\r\n        {\r\n            if (!_activeStatus) return;\r\n            if (_mode != UpdateMode.DumbRigidbody) return;\r\n\r\n            this.OnHitSomething(c);\r\n        }\r\n\r\n        private void OnCollisionStay(Collision c)\r\n        {\r\n            if (!_activeStatus) return;\r\n            if (_mode != UpdateMode.DumbRigidbody) return;\r\n\r\n            this.OnHitSomething(c);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IMovementStyle Interface\r\n\r\n        void IMovementStyle.OnActivate(IMovementStyle lastStyle, ActivationReason reason)\r\n        {\r\n            if (_mode == UpdateMode.Inactive) this.DetermineUpdateMode();\r\n            _activeStatus = true;\r\n            this.OnActivate(lastStyle, reason);\r\n        }\r\n\r\n        void IMovementStyle.OnDeactivate(IMovementStyle nextStyle, ActivationReason reason)\r\n        {\r\n            if (_paused) this.Pause(false);\r\n            this.OnDeactivate(nextStyle, reason);\r\n            _activeStatus = false;\r\n            if (_controller != null) _controller.MovementControllerHit -= this.OnControllerHitHandler;\r\n        }\r\n\r\n        void IMovementStyle.OnPurgedFromStack()\r\n        {\r\n            this.OnPurgedFromStack();\r\n        }\r\n\r\n        void IMovementStyle.UpdateMovement()\r\n        {\r\n            this.UpdateMovement();\r\n        }\r\n\r\n        void IMovementStyle.OnUpdateMovementComplete()\r\n        {\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Movement Interface\r\n\r\n        public bool IsActiveStyle { get { return _activeStatus; } }\r\n\r\n        public void Move(Vector3 mv)\r\n        {\r\n            switch (this.Mode)\r\n            {\r\n                case UpdateMode.Motor:\r\n                    _motor.Controller.Move(mv);\r\n                    break;\r\n\r\n                case UpdateMode.MovementControllerOnly:\r\n                    _controller.Move(mv);\r\n                    break;\r\n                case UpdateMode.CharacterController:\r\n                    if (_charController.Move(mv) != CollisionFlags.None)\r\n                    {\r\n                        this.OnHitSomething((Collider)null);\r\n                    }\r\n                    break;\r\n                case UpdateMode.DumbRigidbody:\r\n                    if (_rigidbody.isKinematic)\r\n                    {\r\n                        _rigidbody.MovePosition(_rigidbody.position + mv);\r\n                    }\r\n                    else\r\n                    {\r\n                        _rigidbody.velocity = mv / Time.deltaTime;\r\n                    }\r\n                    break;\r\n                case UpdateMode.DumbTransformOnly:\r\n                    this.entityRoot.transform.Translate(mv);\r\n\r\n                    break;\r\n            }\r\n        }\r\n\r\n        public void MovePosition(Vector3 pos)\r\n        {\r\n            switch (this.Mode)\r\n            {\r\n                case UpdateMode.Motor:\r\n                    _motor.Controller.Move(pos - _motor.Controller.transform.position);\r\n                    break;\r\n\r\n                case UpdateMode.MovementControllerOnly:\r\n                    _controller.Move(pos - _controller.transform.position);\r\n                    break;\r\n                case UpdateMode.CharacterController:\r\n                    if (_charController.Move(pos - _charController.transform.position) != CollisionFlags.None)\r\n                    {\r\n                        this.OnHitSomething((Collider)null);\r\n                    }\r\n                    break;\r\n                case UpdateMode.DumbRigidbody:\r\n                    _rigidbody.MovePosition(pos);\r\n                    break;\r\n                case UpdateMode.DumbTransformOnly:\r\n                    this.entityRoot.transform.position = pos;\r\n\r\n                    break;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IIgnorableCollision Interface\r\n\r\n        public void IgnoreCollision(Collider coll, bool ignore)\r\n        {\r\n            switch (_mode)\r\n            {\r\n                case UpdateMode.Motor:\r\n                case UpdateMode.MovementControllerOnly:\r\n                    _controller.IgnoreCollision(coll, ignore);\r\n                    break;\r\n                case UpdateMode.CharacterController:\r\n                    Physics.IgnoreCollision(_charController, coll, ignore);\r\n                    break;\r\n                case UpdateMode.DumbRigidbody:\r\n                    IgnorableRigidbody.GetIgnorableCollision(_rigidbody).IgnoreCollision(coll, ignore);\r\n                    break;\r\n            }\r\n        }\r\n\r\n        public void IgnoreCollision(IIgnorableCollision coll, bool ignore)\r\n        {\r\n            switch (_mode)\r\n            {\r\n                case UpdateMode.Motor:\r\n                case UpdateMode.MovementControllerOnly:\r\n                    _controller.IgnoreCollision(coll, ignore);\r\n                    break;\r\n                case UpdateMode.CharacterController:\r\n                    coll.IgnoreCollision(_charController, ignore);\r\n                    break;\r\n                case UpdateMode.DumbRigidbody:\r\n                    IgnorableRigidbody.GetIgnorableCollision(_rigidbody).IgnoreCollision(coll, ignore);\r\n                    break;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyMovement/Movement/Enums.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Movement\r\n{\r\n\r\n    public enum ActivationReason\r\n    {\r\n        Standard,\r\n        Stacking,\r\n        MotorPaused\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyMovement/Movement/IMotorConstraint.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Movement\r\n{\r\n\r\n    public interface IMotorConstraint : IComponent\r\n    {\r\n\r\n        bool AutoConstrain { get; set; }\r\n\r\n        void ConstrainSelf();\r\n\r\n    }\r\n\r\n    public interface IMotor2DSurfaceConstraint : IMotorConstraint\r\n    {\r\n\r\n        Vector3 SurfaceNormal { get; }\r\n\r\n        Vector2 ProjectVectorTo2D(Vector3 v);\r\n        Vector3 ProjectVectorTo3D(Vector2 v);\r\n        Vector2 ProjectPosition2D(Vector3 v);\r\n        Vector3 ProjectPosition3D(Vector2 v);\r\n\r\n    }\r\n\r\n    public abstract class AbstractMotor2DSurfaceConstraint : SPComponent, IMotor2DSurfaceConstraint\r\n    {\r\n\r\n        [SerializeField()]\r\n        private bool _autoConstrain = true;\r\n        [DefaultFromSelf()]\r\n        [SerializeField()]\r\n        private MovementMotor _motor;\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            if (_motor == null)\r\n            {\r\n                _motor = this.GetComponent<MovementMotor>();\r\n            }\r\n        }\r\n\r\n        public MovementMotor Motor { get { return _motor; } }\r\n\r\n        public bool AutoConstrain\r\n        {\r\n            get { return _autoConstrain; }\r\n            set { _autoConstrain = value; }\r\n        }\r\n\r\n        public abstract Vector3 SurfaceNormal { get; }\r\n        \r\n        public abstract void ConstrainSelf();\r\n\r\n        public abstract Vector2 ProjectVectorTo2D(Vector3 v);\r\n\r\n        public abstract Vector3 ProjectVectorTo3D(Vector2 v);\r\n\r\n        public abstract Vector2 ProjectPosition2D(Vector3 v);\r\n\r\n        public abstract Vector3 ProjectPosition3D(Vector2 v);\r\n\r\n        #region Game Messages\r\n\r\n        void Update()\r\n        {\r\n            if (!AutoConstrain) return;\r\n\r\n            this.ConstrainSelf();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyMovement/Movement/IMovementStyle.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Movement\r\n{\r\n    public interface IMovementStyle : IComponent\r\n    {\r\n        \r\n        /// <summary>\r\n        /// Called when the style becomes the currently active state.\r\n        /// </summary>\r\n        /// <param name=\"stateIsStacking\">True if this state is being stacked.</param>\r\n        void OnActivate(IMovementStyle lastStyle, ActivationReason reason);\r\n        /// <summary>\r\n        /// Called when the style is leaving being the currently active state.\r\n        /// </summary>\r\n        /// <param name=\"stateIsStacking\">True if the next state is going to stack.</param>\r\n        void OnDeactivate(IMovementStyle nextStyle, ActivationReason reason);\r\n        /// <summary>\r\n        /// Called if the stack is dumped out with out popping through the entries. This allows a MovementStyle that goes \r\n        /// into a dormant state if another state is stacked ontop of it, to clean its dormant state up if the stack is \r\n        /// dumped completely by either a call to ChangeState or PopAllStates.\r\n        /// </summary>\r\n        void OnPurgedFromStack();\r\n        void UpdateMovement();\r\n        void OnUpdateMovementComplete();\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyMovement/Movement/IMover.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Movement\r\n{\r\n    public interface IMover\r\n    {\r\n\r\n        bool InMotion { get; }\r\n        Vector3 Velocity { get; }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyMovement/Movement/InjectedMovementStyle.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Movement\r\n{\r\n    public class InjectedMovementStyle : SPComponent, IMovementStyle\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private System.Action _updateMovementCallback;\r\n        private RadicalCoroutine _routine;\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void Purge()\r\n        {\r\n            if (_routine != null) _routine.Cancel();\r\n\r\n            _updateMovementCallback = null;\r\n            _routine = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IMovementStyle Interface\r\n\r\n        public void OnActivate(IMovementStyle lastStyle, ActivationReason reason)\r\n        {\r\n\r\n        }\r\n\r\n        public void OnDeactivate(IMovementStyle nextStyle, ActivationReason reason)\r\n        {\r\n            if(reason == ActivationReason.Standard)\r\n            {\r\n                Object.Destroy(this);\r\n            }\r\n        }\r\n\r\n        public void OnPurgedFromStack()\r\n        {\r\n            Object.Destroy(this);\r\n        }\r\n\r\n        public void UpdateMovement()\r\n        {\r\n            if(_updateMovementCallback != null)\r\n            {\r\n                _updateMovementCallback();\r\n            }\r\n            else if(_routine != null)\r\n            {\r\n                _routine.ManualTick(this);\r\n            }\r\n        }\r\n\r\n        public void OnUpdateMovementComplete()\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Factory\r\n\r\n        public static InjectedMovementStyle InjectMovement(MovementMotor motor, System.Action updateCallback, float precedence = 0)\r\n        {\r\n            if (motor == null) throw new System.ArgumentNullException(\"motor\");\r\n            if (updateCallback == null) throw new System.ArgumentNullException(\"updateCallback\");\r\n\r\n            var style = motor.AddComponent<InjectedMovementStyle>();\r\n            style.Purge();\r\n            style._updateMovementCallback = updateCallback;\r\n            motor.States.ChangeState(style, precedence);\r\n            return style;\r\n        }\r\n\r\n        public static InjectedMovementStyle InjectMovement(MovementMotor motor, System.Func<System.Collections.IEnumerator> routine, float precedence = 0)\r\n        {\r\n            if (motor == null) throw new System.ArgumentNullException(\"motor\");\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            var style = motor.AddComponent<InjectedMovementStyle>();\r\n            style.Purge();\r\n            style._routine = new RadicalCoroutine(routine());\r\n            motor.States.ChangeState(style, precedence);\r\n            return style;\r\n        }\r\n\r\n        public static InjectedMovementStyle InjectMovement(MovementMotor motor, System.Collections.IEnumerable routine, float precedence = 0)\r\n        {\r\n            if (motor == null) throw new System.ArgumentNullException(\"motor\");\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            var style = motor.AddComponent<InjectedMovementStyle>();\r\n            style.Purge();\r\n            style._routine = new RadicalCoroutine(routine.GetEnumerator());\r\n            motor.States.ChangeState(style, precedence);\r\n            return style;\r\n        }\r\n\r\n        public static InjectedMovementStyle StackInjectMovement(MovementMotor motor, System.Action updateCallback, float precedence = 0)\r\n        {\r\n            if (motor == null) throw new System.ArgumentNullException(\"motor\");\r\n            if (updateCallback == null) throw new System.ArgumentNullException(\"updateCallback\");\r\n\r\n            var style = motor.AddComponent<InjectedMovementStyle>();\r\n            style.Purge();\r\n            style._updateMovementCallback = updateCallback;\r\n            motor.States.StackState(style, precedence);\r\n            return style;\r\n        }\r\n\r\n        public static InjectedMovementStyle StackInjectMovement(MovementMotor motor, System.Func<System.Collections.IEnumerator> routine, float precedence = 0)\r\n        {\r\n            if (motor == null) throw new System.ArgumentNullException(\"motor\");\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            var style = motor.AddComponent<InjectedMovementStyle>();\r\n            style.Purge();\r\n            style._routine = new RadicalCoroutine(routine());\r\n            motor.States.StackState(style, precedence);\r\n            return style;\r\n        }\r\n\r\n        public static InjectedMovementStyle StackInjectMovement(MovementMotor motor, System.Collections.IEnumerable routine, float precedence = 0)\r\n        {\r\n            if (motor == null) throw new System.ArgumentNullException(\"motor\");\r\n            if (routine == null) throw new System.ArgumentNullException(\"routine\");\r\n\r\n            var style = motor.AddComponent<InjectedMovementStyle>();\r\n            style.Purge();\r\n            style._routine = new RadicalCoroutine(routine.GetEnumerator());\r\n            motor.States.StackState(style, precedence);\r\n            return style;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyMovement/Movement/MotorEvents.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Movement\r\n{\r\n\r\n    public delegate void StyleChangedEventHandler(object sender, StyleChangedEventArgs e);\r\n\r\n    public class StyleChangedEventArgs : System.EventArgs\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private IMovementStyle _oldStyle;\r\n        private IMovementStyle _newStyle;\r\n        private bool _currentStateIsStacking;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public StyleChangedEventArgs(IMovementStyle oldStyle, IMovementStyle newStyle, bool currentStateIsStacking)\r\n        {\r\n            _oldStyle = oldStyle;\r\n            _newStyle = newStyle;\r\n            _currentStateIsStacking = currentStateIsStacking;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IMovementStyle LastMovementStyle { get { return _oldStyle; } }\r\n        public IMovementStyle CurrentMovementStyle { get { return _newStyle; } }\r\n        public bool CurrentStyleIsStacking { get { return _currentStateIsStacking; } }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyMovement/Movement/MovementMotor.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.StateMachine;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Movement\r\n{\r\n\r\n    [UniqueToEntity(IgnoreInactive = true)]\r\n    [RequireComponentInEntity(typeof(MovementController))]\r\n    public class MovementMotor : SPComponent, IMover\r\n    {\r\n\r\n        #region Events\r\n\r\n        public event System.EventHandler BeforeUpdateMovement;\r\n        public event System.EventHandler UpdateMovementComplete;\r\n        public event StyleChangedEventHandler StyleChanged;\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        [DefaultFromSelf(Relativity = EntityRelativity.Entity)]\r\n        [SerializeField()]\r\n        [Tooltip(\"The controller that this motor handles.\")]\r\n        private MovementController _controller;\r\n        [System.NonSerialized()]\r\n        private MovementStyleStateMachine _stateMachine;\r\n\r\n        [SerializeField()]\r\n        private Component _defaultMovementStyle;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            _stateMachine = new MovementStyleStateMachine(this);\r\n\r\n            if (_controller == null) _controller = this.FindComponent<MovementController>();\r\n            if (_controller == null) throw new System.InvalidOperationException(\"MovementMotor requires an attach MovementController.\");\r\n        }\r\n        \r\n        protected override void OnStartOrEnable()\r\n        {\r\n            base.OnStartOrEnable();\r\n\r\n            if (_defaultMovementStyle != null && _stateMachine.Current == null && _stateMachine.Contains(_defaultMovementStyle))\r\n            {\r\n                _stateMachine.ChangeState(_defaultMovementStyle as IMovementStyle);\r\n            }\r\n            else if(_stateMachine.Current != null)\r\n            {\r\n                _stateMachine.Current.OnActivate(null, ActivationReason.MotorPaused);\r\n            }\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            if(_stateMachine.Current != null)\r\n            {\r\n                _stateMachine.Current.OnDeactivate(null, ActivationReason.MotorPaused);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public virtual bool UseFixedUpdate { get { return (_controller.Mover != null) ? _controller.Mover.PrefersFixedUpdate : false; } }\r\n\r\n        public MovementController Controller { get { return _controller; } }\r\n\r\n        public MovementStyleStateMachine States { get { return _stateMachine; } }\r\n\r\n        public IMovementStyle DefaultMovementStyle\r\n        {\r\n            get { return _defaultMovementStyle as IMovementStyle; }\r\n            set\r\n            {\r\n                if(value != null)\r\n                {\r\n                    if (_stateMachine != null)\r\n                    {\r\n                        if (!_stateMachine.Contains(value)) throw new System.ArgumentException(\"Default Movement Style must be a style already attached to the motor's GameObject.\");\r\n                    }\r\n                    else\r\n                    {\r\n                        if (this.gameObject != value.gameObject) throw new System.ArgumentException(\"Default Movement Style must be a style already attached to the motor's GameObject.\");\r\n                    }\r\n                }\r\n                _defaultMovementStyle = value as Component;\r\n            }\r\n        }\r\n\r\n        public bool InUpdateSequence\r\n        {\r\n            get\r\n            {\r\n                return _controller != null && _controller.InUpdateSequence;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Game Messages\r\n\r\n        protected void Update()\r\n        {\r\n            if (this.UseFixedUpdate) return;\r\n\r\n            this.ProcessMovement();\r\n        }\r\n\r\n        protected void FixedUpdate()\r\n        {\r\n            if (!this.UseFixedUpdate) return;\r\n\r\n            this.ProcessMovement();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Movement Processing\r\n\r\n        protected void ProcessMovement()\r\n        {\r\n            if (_controller == null) return;\r\n\r\n            try\r\n            {\r\n                _controller.OnBeforeUpdate();\r\n\r\n                OnBeforeUpdateMovement();\r\n\r\n                _stateMachine.DoChange(); //if BeforeUpdate called for a change, or something before this update loop, lets do that change\r\n\r\n                this.OnUpdateMovement();\r\n\r\n                //once movements are done, call complete\r\n                this.OnUpdateMovementComplete();\r\n            }\r\n            catch (System.Exception ex)\r\n            {\r\n                Debug.LogException(ex, this);\r\n            }\r\n            finally\r\n            {\r\n                _stateMachine.DoChange(); //a final check for a change\r\n\r\n                _controller.OnUpdateComplete();\r\n            }\r\n        }\r\n\r\n        protected virtual void OnBeforeUpdateMovement()\r\n        {\r\n            if (this.BeforeUpdateMovement != null) this.BeforeUpdateMovement(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        protected virtual void OnUpdateMovement()\r\n        {\r\n            if (_stateMachine.Current != null)\r\n            {\r\n                _stateMachine.Current.UpdateMovement();\r\n            }\r\n        }\r\n\r\n        protected virtual void OnUpdateMovementComplete()\r\n        {\r\n            if (_stateMachine.Current != null)\r\n            {\r\n                _stateMachine.Current.OnUpdateMovementComplete();\r\n            }\r\n\r\n            if (this.UpdateMovementComplete != null) this.UpdateMovementComplete(this, System.EventArgs.Empty);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IMover Interface\r\n\r\n        public bool InMotion\r\n        {\r\n            get { return _controller.InMotion; }\r\n        }\r\n        \r\n        Vector3 IMover.Velocity\r\n        {\r\n            get { return _controller.Velocity; }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region EditorOnly\r\n\r\n        public void SetMovementControllerInEditor(MovementController controller)\r\n        {\r\n            if(Application.isEditor)\r\n            {\r\n                _controller = controller;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Special Types\r\n\r\n        public enum ReleaseMode\r\n        {\r\n            Pop = 1,\r\n            PopAll = 2,\r\n            Default = 3,\r\n            Null = 1 << 31,\r\n            PopOrDefault = 4,\r\n            PopAllOrDefault = 5,\r\n            PopOrNull = Pop | Null,\r\n            PopAllOrNull = PopAll | Null\r\n        }\r\n\r\n        public class MovementStyleStateMachine : ITypedStateMachine<IMovementStyle>, ITypedStateStack<IMovementStyle>\r\n        {\r\n\r\n            #region Fields\r\n\r\n            private MovementMotor _owner;\r\n            private ComponentStateSupplier<IMovementStyle> _stateSupplier;\r\n            private IMovementStyle _current;\r\n\r\n            private System.Action _changeStyleDelayed;\r\n            private float _changeStyleDelayedPrecedence;\r\n            private OrderedDelegate<System.Action> _stackStyleDelayed = new OrderedDelegate<System.Action>();\r\n\r\n            private Deque<IMovementStyle> _styleStack;\r\n            private bool _stackingState = false;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            internal MovementStyleStateMachine(MovementMotor owner)\r\n            {\r\n                _owner = owner;\r\n                _stateSupplier = new ComponentStateSupplier<IMovementStyle>(_owner.gameObject);\r\n                _changeStyleDelayed = null;\r\n                _changeStyleDelayedPrecedence = float.NegativeInfinity;\r\n                _stackStyleDelayed.Clear();\r\n                _styleStack = new Deque<IMovementStyle>();\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Properties\r\n\r\n            /// <summary>\r\n            /// The current state ignoring any stacked states that may be on top of it. This is the state that would be returned to if you popped all the states.\r\n            /// </summary>\r\n            public IMovementStyle CurrentUnstacked\r\n            {\r\n                get\r\n                {\r\n                    if (_styleStack.Count > 0)\r\n                        return _styleStack[0];\r\n                    else\r\n                        return _current;\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Methods\r\n\r\n            internal void DoChange()\r\n            {\r\n                if (_changeStyleDelayed != null)\r\n                {\r\n                    _changeStyleDelayed();\r\n                    _changeStyleDelayed = null;\r\n                    _changeStyleDelayedPrecedence = float.NegativeInfinity;\r\n                }\r\n\r\n                if(_stackStyleDelayed.HasEntries)\r\n                {\r\n                    _stackStyleDelayed.Invoke();\r\n                    _stackStyleDelayed.Clear();\r\n                }\r\n            }\r\n\r\n            public IMovementStyle ReleaseCurrentState(ReleaseMode mode, float precedence = 0f)\r\n            {\r\n                switch(mode)\r\n                {\r\n                    case ReleaseMode.Pop:\r\n                        if (_styleStack.Count > 0)\r\n                            return this.PopState(precedence);\r\n                        else\r\n                            return _current;\r\n                    case ReleaseMode.PopAll:\r\n                        if (_styleStack.Count > 0)\r\n                            return this.PopAllStates(precedence);\r\n                        else\r\n                            return _current;\r\n                    case ReleaseMode.Default:\r\n                        return this.ChangeState(_owner._defaultMovementStyle as IMovementStyle, precedence);\r\n                    case ReleaseMode.Null:\r\n                        this.ChangeStateToNull(precedence);\r\n                        return null;\r\n                    case ReleaseMode.PopOrDefault:\r\n                        if (_styleStack.Count > 0)\r\n                            return this.PopState(precedence);\r\n                        else\r\n                            return this.ChangeState(_owner._defaultMovementStyle as IMovementStyle, precedence);\r\n                    case ReleaseMode.PopAllOrDefault:\r\n                        if (_styleStack.Count > 0)\r\n                            return this.PopAllStates(precedence);\r\n                        else\r\n                            return this.ChangeState(_owner._defaultMovementStyle as IMovementStyle, precedence);\r\n                    case ReleaseMode.PopOrNull:\r\n                        if (_styleStack.Count > 0)\r\n                            return this.PopState(precedence);\r\n                        else\r\n                        {\r\n                            this.ChangeStateToNull(precedence);\r\n                            return null;\r\n                        }\r\n                    case ReleaseMode.PopAllOrNull:\r\n                        if (_styleStack.Count > 0)\r\n                            return this.PopAllStates(precedence);\r\n                        else\r\n                        {\r\n                            this.ChangeStateToNull(precedence);\r\n                            return null;\r\n                        }\r\n\r\n                }\r\n\r\n                throw new System.ArgumentException(\"ReleaseMode was of an indeterminate configuration.\");\r\n            }\r\n\r\n            public void ChangeStateToNull(float precedence = 0f)\r\n            {\r\n                this.ChangeState((IMovementStyle)null, precedence);\r\n            }\r\n\r\n            public void PurgeStackedState(IMovementStyle style)\r\n            {\r\n                if (object.ReferenceEquals(style, null)) throw new System.ArgumentNullException(\"style\");\r\n\r\n                if (_styleStack.Count > 0)\r\n                {\r\n                    if (object.ReferenceEquals(_current, style))\r\n                    {\r\n                        this.PopState();\r\n                    }\r\n                    else\r\n                    {\r\n                        int index = _styleStack.IndexOf(style);\r\n                        if (index > 0)\r\n                        {\r\n                            _styleStack.RemoveAt(index);\r\n                            style.OnPurgedFromStack();\r\n                        }\r\n                    }\r\n                }\r\n                else if (object.ReferenceEquals(_current, style))\r\n                {\r\n                    this.ChangeStateToNull(float.NegativeInfinity);\r\n                }\r\n            }\r\n\r\n            public void ChangeCurrentUnstackedState(IMovementStyle style)\r\n            {\r\n                if(_styleStack.Count > 0)\r\n                {\r\n                    var oldStyle = _styleStack[0];\r\n                    if (oldStyle == style) return;\r\n\r\n                    _styleStack[0] = style;\r\n                    if (oldStyle != null) oldStyle.OnPurgedFromStack();\r\n                }\r\n                else\r\n                {\r\n                    this.ChangeState(style);\r\n                }\r\n            }\r\n\r\n\r\n            private void ChangeState_Imp(IMovementStyle style, float precedence, bool dumpStack)\r\n            {\r\n                if (_owner.InUpdateSequence)\r\n                {\r\n                    //test if we should replace the last ChangeStyle call... test if null so that one can ChangeStyle with a NegativeInfinity precendance\r\n                    if (precedence >= _changeStyleDelayedPrecedence || _changeStyleDelayed == null)\r\n                    {\r\n                        _changeStyleDelayedPrecedence = precedence;\r\n                        _changeStyleDelayed = delegate()\r\n                        {\r\n                            if(dumpStack)\r\n                            {\r\n                                var e = _styleStack.GetEnumerator();\r\n                                while(e.MoveNext())\r\n                                {\r\n                                    if (e.Current != null & e.Current != style) e.Current.OnPurgedFromStack();\r\n                                }\r\n                                _styleStack.Clear();\r\n                            }\r\n\r\n                            this.SwapStateOut(style);\r\n                        };\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (dumpStack)\r\n                    {\r\n                        var e = _styleStack.GetEnumerator();\r\n                        while(e.MoveNext())\r\n                        {\r\n                            if (e.Current != null && e.Current != style) e.Current.OnPurgedFromStack();\r\n                        }\r\n                        _styleStack.Clear();\r\n                    }\r\n\r\n                    this.SwapStateOut(style);\r\n                }\r\n            }\r\n\r\n            private void SwapStateOut(IMovementStyle style)\r\n            {\r\n                if (object.Equals(style, _current)) return;\r\n\r\n                var oldState = _current;\r\n                _current = style;\r\n\r\n                if (oldState != null) oldState.OnDeactivate(style, _stackingState ? ActivationReason.Stacking : ActivationReason.Standard);\r\n                if (style != null) style.OnActivate(oldState, _stackingState ? ActivationReason.Stacking : ActivationReason.Standard);\r\n\r\n                if (this.StateChanged != null) this.StateChanged(this, new StateChangedEventArgs<IMovementStyle>(oldState, style));\r\n                if (_owner.StyleChanged != null) _owner.StyleChanged(_owner, new StyleChangedEventArgs(oldState, style, _stackingState));\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IStateStack Interface\r\n\r\n            public IEnumerable<IMovementStyle> CurrentStack { get { return _styleStack; } }\r\n\r\n            IMovementStyle IStateStack<IMovementStyle>.StackState(IMovementStyle state)\r\n            {\r\n                return this.StackState(state, 0f);\r\n            }\r\n\r\n            public IMovementStyle StackState(IMovementStyle style, float precedence = 0)\r\n            {\r\n                if (!object.ReferenceEquals(style, null) && !_stateSupplier.Contains(style)) throw new System.ArgumentException(\"MovementStyle '\" + style.GetType().Name + \"' is not a member of the state machine.\", \"style\");\r\n\r\n                if (_owner.InUpdateSequence)\r\n                {\r\n                    //test if we should replace the last ChangeStyle call... test if null so that one can ChangeStyle with a NegativeInfinity precendance\r\n                    if (precedence >= _changeStyleDelayedPrecedence || _changeStyleDelayed == null)\r\n                    {\r\n                        //_changeStyleDelayedPrecedence = precedence;\r\n                        //_changeStyleDelayed = delegate()\r\n                        //{\r\n                        //    _styleStack.Push(_stateMachine.Current);\r\n                        //    _stateMachine.ChangeState(style);\r\n                        //};\r\n\r\n                        _stackStyleDelayed.Add(delegate()\r\n                        {\r\n                            if (this.Current == style) return;\r\n                            _styleStack.Push(this.Current);\r\n                            _stackingState = true;\r\n                            this.ChangeState_Imp(style, precedence, false);\r\n                            _stackingState = false;\r\n                        }, precedence);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (this.Current == style) return style;\r\n                    _styleStack.Push(this.Current);\r\n                    _stackingState = true;\r\n                    this.ChangeState_Imp(style, precedence, false);\r\n                    _stackingState = false;\r\n                }\r\n\r\n                return style;\r\n            }\r\n\r\n            TSub ITypedStateStack<IMovementStyle>.StackState<TSub>()\r\n            {\r\n                return this.StackState<TSub>();\r\n            }\r\n\r\n            public T StackState<T>(float precedence = 0) where T : class, IMovementStyle\r\n            {\r\n                var style = _stateSupplier.GetState<T>();\r\n                if (style == null) throw new System.ArgumentException(\"MovementStyle '\" + typeof(T).Name + \"' is not a member of the state machine.\", \"style\");\r\n                return this.StackState(style, precedence) as T;\r\n            }\r\n\r\n            IMovementStyle ITypedStateStack<IMovementStyle>.StackState(System.Type tp)\r\n            {\r\n                return this.StackState(tp, 0f);\r\n            }\r\n\r\n            public IMovementStyle StackState(System.Type tp, float precedence = 0)\r\n            {\r\n                if (!TypeUtil.IsType(tp, typeof(IMovementStyle))) throw new TypeArgumentMismatchException(tp, typeof(IMovementStyle), \"tp\");\r\n\r\n                var style = _stateSupplier.GetState(tp);\r\n                if (style == null) throw new System.ArgumentException(\"MovementStyle '\" + tp.Name + \"' is not a member of the state machine.\", \"style\");\r\n                return this.StackState(style, precedence);\r\n            }\r\n\r\n            IMovementStyle IStateStack<IMovementStyle>.PopState()\r\n            {\r\n                return this.PopState(0f);\r\n            }\r\n\r\n            public IMovementStyle PopState(float precedence = 0f)\r\n            {\r\n                if (_styleStack.Count > 0)\r\n                {\r\n                    var style = _styleStack.Pop();\r\n                    while (_styleStack.Count > 0 && !ReferenceEquals(style, null) && (style.IsDestroyed() || !_stateSupplier.Contains(style)))\r\n                    {\r\n                        style = _styleStack.Pop();\r\n                    }\r\n                    if (!ReferenceEquals(style, null) && (style.IsDestroyed() || !_stateSupplier.Contains(style)))\r\n                    {\r\n                        style = null;\r\n                    }\r\n                    this.ChangeState_Imp(style, precedence, false);\r\n                    return style;\r\n                }\r\n                else\r\n                {\r\n                    return null;\r\n                }\r\n            }\r\n\r\n            IMovementStyle IStateStack<IMovementStyle>.PopAllStates()\r\n            {\r\n                return this.PopAllStates(0f);\r\n            }\r\n\r\n            public IMovementStyle PopAllStates(float precedence = 0f)\r\n            {\r\n                if (_styleStack.Count > 0)\r\n                {\r\n                    var style = _styleStack.Unshift(); //get the 0 entry, removing it from the deque\r\n                    if (!ReferenceEquals(style, null) && (style.IsDestroyed() || !_stateSupplier.Contains(style)))\r\n                    {\r\n                        style = null;\r\n                    }\r\n                    this.ChangeState_Imp(style, precedence, true);\r\n                    return style;\r\n                }\r\n                else\r\n                {\r\n                    return null;\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IStateMachine Interface\r\n\r\n            public event StateChangedEventHandler<IMovementStyle> StateChanged;\r\n\r\n            public IMovementStyle Current\r\n            {\r\n                get { return _current; }\r\n            }\r\n\r\n            public bool Contains(IMovementStyle state)\r\n            {\r\n                return _stateSupplier.Contains(state);\r\n            }\r\n\r\n            IMovementStyle IStateMachine<IMovementStyle>.ChangeState(IMovementStyle state)\r\n            {\r\n                return this.ChangeState(state, 0f);\r\n            }\r\n\r\n            public IMovementStyle ChangeState(IMovementStyle style, float precedence = 0)\r\n            {\r\n                if (!object.ReferenceEquals(style, null) && !_stateSupplier.Contains(style)) throw new System.ArgumentException(\"MovementStyle '\" + style.GetType().Name + \"' is not a member of the state machine.\", \"style\");\r\n\r\n                this.ChangeState_Imp(style, precedence, true);\r\n                return style;\r\n            }\r\n\r\n            public void GetStates(ICollection<IMovementStyle> coll)\r\n            {\r\n                _stateSupplier.GetStates(coll);\r\n            }\r\n\r\n            public void Foreach(System.Action<IMovementStyle> callback)\r\n            {\r\n                _stateSupplier.Foreach(callback);\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region ITypedStateMachine Interface\r\n\r\n            public bool Contains<T>() where T : class, IMovementStyle\r\n            {\r\n                return _stateSupplier.Contains<T>();\r\n            }\r\n\r\n            public bool Contains(System.Type tp)\r\n            {\r\n                return _stateSupplier.Contains(tp);\r\n            }\r\n\r\n            public T GetState<T>() where T : class, IMovementStyle\r\n            {\r\n                return _stateSupplier.GetState<T>();\r\n            }\r\n\r\n            public IMovementStyle GetState(System.Type tp)\r\n            {\r\n                return _stateSupplier.GetState(tp);\r\n            }\r\n\r\n            TSub ITypedStateMachine<IMovementStyle>.ChangeState<TSub>()\r\n            {\r\n                return this.ChangeState<TSub>(0f);\r\n            }\r\n\r\n            public T ChangeState<T>(float precedence = 0) where T : class, IMovementStyle\r\n            {\r\n                var style = _stateSupplier.GetState<T>();\r\n                if (style == null) throw new System.ArgumentException(\"MovementStyle '\" + typeof(T).Name + \"' is not a member of the state machine.\", \"style\");\r\n                this.ChangeState_Imp(style, precedence, true);\r\n                return style;\r\n            }\r\n\r\n            IMovementStyle ITypedStateMachine<IMovementStyle>.ChangeState(System.Type tp)\r\n            {\r\n                return this.ChangeState(tp, 0f);\r\n            }\r\n\r\n            public IMovementStyle ChangeState(System.Type tp, float precedence = 0)\r\n            {\r\n                if (tp != null && !TypeUtil.IsType(tp, typeof(IMovementStyle))) throw new TypeArgumentMismatchException(tp, typeof(IMovementStyle), \"tp\");\r\n\r\n                var style = _stateSupplier.GetState(tp);\r\n                if (style == null) throw new System.ArgumentException(\"MovementStyle '\" + tp.Name + \"' is not a member of the state machine.\", \"style\");\r\n                this.ChangeState_Imp(style, precedence, true);\r\n                return style;\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IEnumerable Interface\r\n\r\n            public IEnumerator<IMovementStyle> GetEnumerator()\r\n            {\r\n                return _stateSupplier.GetEnumerator();\r\n            }\r\n\r\n            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n            {\r\n                return _stateSupplier.GetEnumerator();\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyMovement/Movement/MovementMotor2D.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.Movement\r\n{\r\n    public class MovementMotor2D : MovementMotor //, ISerializationCallbackReceiver\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [System.NonSerialized]\r\n        private IPlanarSurface _surface;\r\n        [SerializeField]\r\n        [Tooltip(\"Leave blank to default to XY plane on z=0\")]\r\n        [TypeRestriction(typeof(IPlanarSurface))]\r\n        [OnChangedInEditor(\"ValidateSurfaceData\", OnlyAtRuntime =true)]\r\n        private UnityEngine.Object _surfaceData;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            this.ValidateSurfaceData();\r\n        }\r\n\r\n        private void ValidateSurfaceData()\r\n        {\r\n            _surface = _surfaceData as IPlanarSurface;\r\n            if (_surface == null)\r\n                _surface = XYPlanarSurface.Default;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IPlanarSurface Surface\r\n        {\r\n            get { return _surface; }\r\n            set\r\n            {\r\n                _surface = value ?? XYPlanarSurface.Default;\r\n                _surfaceData = _surface as UnityEngine.Object;\r\n            }\r\n        }\r\n\r\n        public Vector2 Position\r\n        {\r\n            get { return _surface.ProjectPosition2D(this.Controller.transform.position); }\r\n        }\r\n\r\n        public Vector2 Velocity\r\n        {\r\n            get { return _surface.ProjectVectorTo2D(this.Controller.transform.position, this.Controller.Velocity); }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Move(Vector2 mv)\r\n        {\r\n            this.Controller.Move(_surface.ProjectVectorTo3D(this.Controller.transform.position, mv));\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyMovement/Movement/WaitForBeforeUpdateMovement.cs",
    "content": "﻿\r\nnamespace com.spacepuppy.Movement\r\n{\r\n    public class WaitForBeforeUpdateMovement : ImmediatelyResumingYieldInstruction, IResettingYieldInstruction\r\n    {\r\n\r\n        private MovementMotor _motor;\r\n\r\n        public WaitForBeforeUpdateMovement(MovementMotor motor)\r\n        {\r\n            if (motor == null) throw new System.ArgumentNullException(\"motor\");\r\n            _motor = motor;\r\n        }\r\n\r\n        #region Methods\r\n\r\n        protected void Reset()\r\n        {\r\n            this.ResetSignal();\r\n            _motor.BeforeUpdateMovement -= this.OnBeforeUpdateMovement;\r\n            _motor.BeforeUpdateMovement += this.OnBeforeUpdateMovement;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Handlers\r\n\r\n        private void OnBeforeUpdateMovement(object sender, System.EventArgs e)\r\n        {\r\n            _motor.BeforeUpdateMovement -= this.OnBeforeUpdateMovement;\r\n\r\n            this.SetSignal();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IResettingYieldInstruction Interface\r\n\r\n        void IResettingYieldInstruction.Reset()\r\n        {\r\n            this.Reset();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyMovement/Movement/XYPlaneConstraint.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Movement\r\n{\r\n    public class XYPlaneConstraint : AbstractMotor2DSurfaceConstraint\r\n    {\r\n\r\n        #region IMotorConstraint Interface\r\n\r\n        public override void ConstrainSelf()\r\n        {\r\n            if (this.Motor != null)\r\n            {\r\n                var pos = this.Motor.Controller.transform.position;\r\n                pos.z = 0;\r\n                this.Motor.Controller.transform.position = pos;\r\n            }\r\n            else\r\n            {\r\n                var pos = this.Motor.Controller.transform.position;\r\n                pos.z = 0;\r\n                this.Motor.Controller.transform.position = pos;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region I2DMotorConstraint Interface\r\n\r\n        public override Vector3 SurfaceNormal\r\n        {\r\n            get { return new Vector3(0f, 0f, -1f); }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts a 3d vector to closest 2d vector on 2D gameplay surface\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <returns></returns>\r\n        public override Vector2 ProjectVectorTo2D(Vector3 v)\r\n        {\r\n            //currently, that is just a plane in the x/y of the world and z = 0\r\n            return new Vector2(v.x, v.y);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts a 2d vector from the gameplay surface to the 3d world\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <returns></returns>\r\n        public override Vector3 ProjectVectorTo3D(Vector2 v)\r\n        {\r\n            //currently, that is just a plane in the x/y of the world and z = 0\r\n            return new Vector3(v.x, v.y, 0f);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts a 3d position to closest 2d position on the 2d gameplay surface\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <returns></returns>\r\n        public override Vector2 ProjectPosition2D(Vector3 v)\r\n        {\r\n            //currently, that is just a plane in the x/y of the world and z = 0\r\n            return new Vector2(v.x, v.y);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts a 2d position from the gameplay surface to the 3d world\r\n        /// </summary>\r\n        /// <param name=\"v\"></param>\r\n        /// <returns></returns>\r\n        public override Vector3 ProjectPosition3D(Vector2 v)\r\n        {\r\n            //currently, that is just a plane in the x/y of the world and z = 0\r\n            return new Vector3(v.x, v.y, 0);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyMovement/MovementController.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Hooks;\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Movement;\r\nusing com.spacepuppy.Utils;\r\nusing com.spacepuppy.Serialization;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n\r\n    /// <summary>\r\n    /// A custom controller similar to CharacterController that supports multiple physics techniques for collision testing, while keeping a constant interface to the controller no matter the mode. \r\n    /// Moving this controller requires 3 steps as opposed to just one with CharacterController. CharacterController only allows 1 move per Update cycle, and is Update dependent for its state. \r\n    /// This on the other hand allows you to control when the state opens for move, is moved, and closes again. You should call 'OnBeforeUpdate' to ready the controller for this update, then perform all \r\n    /// calls to 'Move', then call 'OnUpdateComplete' to close up that frame's session. If a call to 'Move' is made outside of this session, then it is cached to be applied the next time 'OnBeforeUpdate' \r\n    /// is called.\r\n    /// </summary>\r\n    [AddComponentMenu(\"SpacePuppy/Motors/Movement Controller\")]\r\n    public class MovementController : SPComponent, IIgnorableCollision, IForceReceiver, IMover, ISerializationCallbackReceiver\r\n    {\r\n\r\n        #region Events\r\n\r\n        private System.EventHandler<MovementControllerHitEventArgs> _movementControllerHit;\r\n        public event System.EventHandler<MovementControllerHitEventArgs> MovementControllerHit\r\n        {\r\n            add\r\n            {\r\n                if(_movementControllerHit == null)\r\n                {\r\n                    _movementControllerHit = value;\r\n                    if (_mover != null) _mover.OnHasHitListenersChanged();\r\n                }\r\n                else\r\n                {\r\n                    _movementControllerHit += value;\r\n                }\r\n            }\r\n            remove\r\n            {\r\n                if (_movementControllerHit == null) return;\r\n                _movementControllerHit -= value;\r\n                if(_movementControllerHit == null)\r\n                {\r\n                    if (_mover != null) _mover.OnHasHitListenersChanged();\r\n                }\r\n            }\r\n        }\r\n\r\n        //protected event System.Action<ControllerColliderHit> OnCharacterControllerHit;\r\n\r\n        //protected delegate void OnCollisionHandler(Collision c, bool bStayed);\r\n        //protected event OnCollisionHandler OnCollision;\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private bool _resetVelocityOnNoMove = false;\r\n\r\n        [System.NonSerialized()]\r\n        private bool _bMoveCalled = false;\r\n\r\n        [System.NonSerialized()]\r\n        private IGameObjectMover _mover;\r\n        [System.NonSerialized()]\r\n        private System.Action _updateCache;\r\n        [System.NonSerialized()]\r\n        private bool _bInUpdateSequence;\r\n\r\n        [System.NonSerialized()]\r\n        private Vector3 _lastPos;\r\n        [System.NonSerialized()]\r\n        private Vector3 _lastVel;\r\n\r\n        //[SerializeField()]\r\n        //private byte[] _moverSerializedValue;\r\n        [SerializeField()]\r\n        private UnityData _moverData;\r\n\r\n        [System.NonSerialized()]\r\n        private IGameObjectMover _pausedMover;\r\n\r\n        [System.NonSerialized()]\r\n        private Transform _transform;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n            //this.ChangeMoverType(_moverType);\r\n\r\n            _transform = this.GetComponent<Transform>();\r\n            _lastPos = _transform.position;\r\n            _mover.Reinit(this);\r\n        }\r\n\r\n        protected virtual void OnSpawn()\r\n        {\r\n            _lastPos = this.transform.position;\r\n            _mover.Reinit(this);\r\n            if (this.enabled) _mover.OnEnable();\r\n        }\r\n\r\n        protected override void OnStartOrEnable()\r\n        {\r\n            base.OnStartOrEnable();\r\n\r\n            _lastVel = Vector3.zero;\r\n            if (_mover != null) _mover.OnEnable();\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            if (_mover != null) _mover.OnDisable();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISerializationNotificationCallback Interface\r\n\r\n        public void OnAfterDeserialize()\r\n        {\r\n            try\r\n            {\r\n                _mover = _moverData.Deserialize() as IGameObjectMover;\r\n            }\r\n            catch (System.Exception ex)\r\n            {\r\n                Debug.LogException(ex, this);\r\n                _mover = null;\r\n            }\r\n            _moverData.Clear();\r\n        }\r\n\r\n        public void OnBeforeSerialize()\r\n        {\r\n            if (_moverData == null) _moverData = new UnityData();\r\n            try\r\n            {\r\n                _moverData.Serialize(_mover);\r\n            }\r\n            catch (System.Exception ex)\r\n            {\r\n                Debug.LogException(ex, this);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public new Transform transform\r\n        {\r\n            get\r\n            { \r\n                if(object.ReferenceEquals(_transform, null)) _transform = this.GetComponent<Transform>();\r\n                return _transform;\r\n            }\r\n        }\r\n\r\n        public IGameObjectMover Mover { get { return _mover; } }\r\n\r\n        //public bool IsRigidbodyMoverType { get { return _moverType == GameObjectMoverType.SimulatedRigidbody || _moverType == GameObjectMoverType.DirectRigidbody; } }\r\n\r\n        public bool InUpdateSequence { get { return _bInUpdateSequence; } }\r\n\r\n        public bool IsPaused\r\n        {\r\n            get { return _mover is PausedMover; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// If InUpdateSequence is true, this will return true if move was called yet this update sequence.\r\n        /// </summary>\r\n        public bool MoveCalled { get { return _bMoveCalled; } }\r\n\r\n        public bool HasHitListeners { get { return _movementControllerHit != null; } }\r\n\r\n\r\n        public float Mass { get { return _mover.Mass; } set { _mover.Mass = value; } }\r\n\r\n        public float StepOffset { get { return _mover.StepOffset; } set { _mover.StepOffset = value; } }\r\n\r\n        public float SkinWidth { get { return _mover.SkinWidth; } set { _mover.SkinWidth = value; } }\r\n\r\n        public bool CollisionEnabled { get { return _mover.CollisionEnabled; } set { _mover.CollisionEnabled = value; } }\r\n\r\n        public Vector3 Velocity { get { return _mover.Velocity; } set { _mover.Velocity = value; } }\r\n\r\n\r\n\r\n        public Vector3 LastPosition { get { return _lastPos; } }\r\n\r\n        public Vector3 LastVelocity { get { return _lastVel; } }\r\n\r\n        public bool ResetVelocityOnNoMove { get { return _resetVelocityOnNoMove; } set { _resetVelocityOnNoMove = value; } }\r\n\r\n        #endregion\r\n\r\n        #region Public Methods\r\n\r\n        public void ChangeMover(IGameObjectMover mover)\r\n        {\r\n            if (mover == null) throw new System.ArgumentNullException(\"mover\");\r\n            if (mover == _mover) return;\r\n\r\n            if (_mover != null)\r\n            {\r\n                //destroy old mover\r\n                _mover.Dispose();\r\n                _mover = null;\r\n            }\r\n\r\n            _mover = mover;\r\n            _mover.Reinit(this);\r\n            if (this.enabled && Application.isPlaying) _mover.OnEnable();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Sets the current mover to the new object and returns the mover being replaced. Later that old mover can be swapped back in to allow for temporary changing of mode.\r\n        /// </summary>\r\n        /// <param name=\"mover\"></param>\r\n        /// <returns></returns>\r\n        public IGameObjectMover SwapMover(IGameObjectMover mover)\r\n        {\r\n            if (mover == null) throw new System.ArgumentNullException(\"mover\");\r\n            if (mover == _mover) return _mover;\r\n\r\n            var oldMover = _mover;\r\n            if (oldMover != null) oldMover.OnDisable();\r\n\r\n            _mover = mover;\r\n            _mover.Reinit(this);\r\n            if (this.enabled && Application.isPlaying) _mover.OnEnable();\r\n\r\n            return oldMover;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Puts the MovementController into a special IGameObjectMover state, this state will allow returning back to the previous state \r\n        /// at any time. If the controller uses a rigidbody, it stores the state of that rigidbody.\r\n        /// </summary>\r\n        /// <param name=\"pause\"></param>\r\n        public void Pause(bool pause)\r\n        {\r\n            if(pause)\r\n            {\r\n                if(!(_mover is PausedMover))\r\n                {\r\n                    if (!(_pausedMover is PausedMover)) _pausedMover = new PausedMover();\r\n                    _pausedMover = this.SwapMover(_pausedMover);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if(_mover is PausedMover)\r\n                {\r\n                    _pausedMover = this.SwapMover(_pausedMover);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void OnBeforeUpdate()\r\n        {\r\n            if (!this.enabled) return;\r\n            if (_bInUpdateSequence) throw new System.InvalidOperationException(\"MovementController->OnBeforeUpdate must be called only once per frame.\");\r\n            _bInUpdateSequence = true;\r\n\r\n            try\r\n            {\r\n                _mover.OnBeforeUpdate();\r\n            }\r\n            catch(System.Exception ex)\r\n            {\r\n                //Debug.LogException(ex);\r\n                throw new System.InvalidOperationException(\"Current Mover failed to operate OnBeforeUpdate correctly.\", ex);\r\n            }\r\n            finally\r\n            {\r\n                //set last pos and last vel, note this happens AFTER OnBeforeUpdate of the mover, \r\n                //this is because the physical reactions of last move didn't complete until now\r\n                _lastPos = this.transform.position;\r\n                _lastVel = _mover.Velocity;\r\n\r\n                if (_updateCache != null)\r\n                {\r\n                    _updateCache();\r\n                    _updateCache = null;\r\n                }\r\n            }\r\n        }\r\n\r\n        public void OnUpdateComplete()\r\n        {\r\n            if (!this.enabled) return;\r\n            if (!_bInUpdateSequence) throw new System.InvalidOperationException(\"MovementController->OnUpdateComplete must be called only once per frame.\");\r\n\r\n            try\r\n            {\r\n                _mover.OnUpdateComplete();\r\n            }\r\n            catch(System.Exception ex)\r\n            {\r\n                //Debug.LogException(ex);\r\n                throw new System.InvalidOperationException(\"Current Mover failed to operate OnUpdateComplete correctly.\", ex);\r\n            }\r\n            finally\r\n            {\r\n                if (_resetVelocityOnNoMove && !_bMoveCalled)\r\n                {\r\n                    _mover.Velocity = Vector3.zero;\r\n                }\r\n                _bMoveCalled = false;\r\n\r\n                _bInUpdateSequence = false;\r\n            }\r\n\r\n        }\r\n\r\n        public void SignalHit(MovementControllerHitEventArgs e)\r\n        {\r\n            var ev = _movementControllerHit;\r\n            if (ev != null) ev(this, e);\r\n        }\r\n\r\n\r\n\r\n\r\n        /// <summary>\r\n        /// Moves the character by some delta.\r\n        /// </summary>\r\n        /// <param name=\"mv\"></param>\r\n        public void Move(Vector3 mv)\r\n        {\r\n            if (!this.enabled) return;\r\n            if (_bInUpdateSequence)\r\n            {\r\n                _bMoveCalled = true;\r\n                _mover.Move(mv);\r\n            }\r\n            else\r\n            {\r\n                //mono seems to create garbage even if the anonymous delegate is in an if/else, so moved to own function\r\n                this.SetMoveCache(mv);\r\n            }\r\n        }\r\n        private void SetMoveCache(Vector3 mv)\r\n        {\r\n            _updateCache += () =>\r\n            {\r\n                _bMoveCalled = true;\r\n                _mover.Move(mv);\r\n            };\r\n        }\r\n\r\n\r\n        /// <summary>\r\n        /// Moves the character by some delta, but does not effect the velocity. This is useful for things like moving platforms.\r\n        /// </summary>\r\n        /// <param name=\"mv\"></param>\r\n        public void AtypicalMove(Vector3 mv)\r\n        {\r\n            if (!this.enabled) return;\r\n            if (_bInUpdateSequence)\r\n            {\r\n                _mover.AtypicalMove(mv);\r\n            }\r\n            else\r\n            {\r\n                _updateCache += () =>\r\n                {\r\n                    _mover.AtypicalMove(mv);\r\n                };\r\n            }\r\n        }\r\n\r\n        public void MovePosition(Vector3 pos)\r\n        {\r\n            this.Move(pos - this.transform.position);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Move controller to a specific location with no collision.\r\n        /// </summary>\r\n        /// <param name=\"pos\"></param>\r\n        public void TeleportTo(Vector3 pos)\r\n        {\r\n            if (!this.enabled) return;\r\n            if (_bInUpdateSequence)\r\n            {\r\n                this.transform.position = pos;\r\n            }\r\n            else\r\n            {\r\n                _updateCache += () =>\r\n                {\r\n                    this.transform.position = pos;\r\n                };\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Move controller to a specific location with no collision.\r\n        /// </summary>\r\n        /// <param name=\"pos\"></param>\r\n        /// <param name=\"bSetVelocityByChangeInPosition\">If true velocity is updated to match the total change. If done, this should only be called ONCE per update cycle.</param>\r\n        public void TeleportTo(Vector3 pos, bool bSetVelocityByChangeInPosition)\r\n        {\r\n            if (!this.enabled) return;\r\n            if (_bInUpdateSequence)\r\n            {\r\n                if (bSetVelocityByChangeInPosition)\r\n                {\r\n                    _mover.Velocity = (pos - this.transform.position) / Time.deltaTime;\r\n                }\r\n                this.transform.position = pos;\r\n            }\r\n            else\r\n            {\r\n                _updateCache += () =>\r\n                {\r\n                    if (bSetVelocityByChangeInPosition)\r\n                    {\r\n                        _mover.Velocity = (pos - this.transform.position) / Time.deltaTime;\r\n                    }\r\n                    this.transform.position = pos;\r\n                };\r\n            }\r\n        }\r\n\r\n        public void AddForce(Vector3 f, ForceMode mode)\r\n        {\r\n            if (!this.enabled) return;\r\n            if (_bInUpdateSequence)\r\n            {\r\n                _bMoveCalled = true;\r\n                _mover.AddForce(f, mode);\r\n            }\r\n            else\r\n            {\r\n                _updateCache += () =>\r\n                {\r\n                    _bMoveCalled = true;\r\n                    _mover.AddForce(f, mode);\r\n                };\r\n            }\r\n        }\r\n\r\n        public void AddForceAtPosition(Vector3 f, Vector3 pos, ForceMode mode)\r\n        {\r\n            if (!this.enabled) return;\r\n            if (_bInUpdateSequence)\r\n            {\r\n                _bMoveCalled = true;\r\n                _mover.AddForceAtPosition(f, pos, mode);\r\n            }\r\n            else\r\n            {\r\n                _updateCache += () =>\r\n                {\r\n                    _bMoveCalled = true;\r\n                    _mover.AddForceAtPosition(f, pos, mode);\r\n                };\r\n            }\r\n        }\r\n\r\n        public void AddExplosionForce(float explosionForce, Vector3 explosionCenter, float explosionRadius, float upwardsModifier = 0f, ForceMode mode = ForceMode.Force)\r\n        {\r\n            if (!this.enabled) return;\r\n\r\n            var geom = _mover.GetGeom(true);\r\n            var v = geom.Center - explosionCenter;\r\n            var force = v.normalized * Mathf.Clamp01(v.magnitude / explosionRadius) * explosionForce;\r\n            //TODO - apply upwards modifier\r\n\r\n            this.AddForce(force, mode);\r\n        }\r\n\r\n        public Capsule GetGeom(bool ignoreSkin)\r\n        {\r\n            return _mover.GetGeom(ignoreSkin);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Messages\r\n\r\n        /*\r\n         \r\n        protected void OnControllerColliderHit(ControllerColliderHit hit)\r\n        {\r\n            if (this.OnCharacterControllerHit != null) this.OnCharacterControllerHit(hit);\r\n        }\r\n\r\n        protected void OnCollisionEnter(Collision c)\r\n        {\r\n            if (this.OnCollision != null) this.OnCollision(c, false);\r\n        }\r\n\r\n        protected void OnCollisionStay(Collision c)\r\n        {\r\n            if (this.OnCollision != null) this.OnCollision(c, true);\r\n        }\r\n         \r\n         */\r\n\r\n        #endregion\r\n\r\n        #region IIgnorableCollision Interface\r\n\r\n        public void IgnoreCollision(Collider coll, bool ignore)\r\n        {\r\n            if (_mover != null) _mover.IgnoreCollision(coll, ignore);\r\n        }\r\n\r\n        public void IgnoreCollision(IIgnorableCollision coll, bool ignore)\r\n        {\r\n            if (_mover != null) _mover.IgnoreCollision(coll, ignore);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IMover Interface\r\n\r\n        public bool InMotion\r\n        {\r\n            get { return this.Velocity.sqrMagnitude > 0.00001f; }\r\n        }\r\n\r\n        //Velocity implicitly implemented\r\n\r\n        #endregion\r\n\r\n        #region Special Mover Types\r\n\r\n        public interface IGameObjectMover : IIgnorableCollision, System.IDisposable\r\n        {\r\n\r\n            bool PrefersFixedUpdate { get; }\r\n\r\n            float Mass { get; set; }\r\n            float StepOffset { get; set; }\r\n            float SkinWidth { get; set; }\r\n            bool CollisionEnabled { get; set; }\r\n            Vector3 Velocity { get; set; }\r\n\r\n            void Reinit(MovementController controller);\r\n            void OnEnable();\r\n            void OnDisable();\r\n            void OnHasHitListenersChanged();\r\n\r\n            /// <summary>\r\n            /// Occurs before any Moves for this frame are called, and before the LastPosition and LastVelocity are set. This is useful for resolving anything that deals with \r\n            /// the FixedUpdate loop and Rigidbodies, since the actual effects caused by moving a rigidbody aren't accessible until after the fact.\r\n            /// </summary>\r\n            void OnBeforeUpdate();\r\n            /// <summary>\r\n            /// Occurs after all Moves for this frame have been called.\r\n            /// </summary>\r\n            void OnUpdateComplete();\r\n\r\n            Capsule GetGeom(bool ignoreSkin);\r\n\r\n            void Move(Vector3 mv);\r\n            void AtypicalMove(Vector3 mv);\r\n            void AddForce(Vector3 f, ForceMode mode);\r\n            void AddForceAtPosition(Vector3 f, Vector3 pos, ForceMode mode);\r\n\r\n        }\r\n\r\n        /// <summary>\r\n        /// This operates directly on a CharacterController and acts pretty much like a CharacterController with some added featues (AddForce, AddForceAt, Can be called more than once per update and remain accurate).\r\n        /// </summary>\r\n        [System.Serializable()]\r\n        public class CharacterControllerMover : IGameObjectMover\r\n        {\r\n\r\n            #region Fields\r\n\r\n            [System.NonSerialized()]\r\n            private MovementController _owner;\r\n            [System.NonSerialized()]\r\n            private CharacterController _controller;\r\n            [System.NonSerialized()]\r\n            private ControllerColliderHitEventHooks _hooks;\r\n\r\n            [SerializeField()]\r\n            private float _mass = 1.0f;\r\n            [SerializeField()]\r\n            private float _skinWidth;\r\n\r\n            [System.NonSerialized()]\r\n            private Vector3 _vel;\r\n            [System.NonSerialized()]\r\n            private Vector3 _talliedVel;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            public CharacterControllerMover()\r\n            {\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IGameObjectMover Interface\r\n\r\n            public bool PrefersFixedUpdate { get { return false; } }\r\n\r\n            public float Mass { get { return _mass; } set { _mass = value; } }\r\n            public float StepOffset\r\n            {\r\n                get { return (_controller != null) ? _controller.stepOffset : 0f; }\r\n                set { if (_controller != null) _controller.stepOffset = value; }\r\n            }\r\n            public float SkinWidth { get { return _skinWidth; } set { _skinWidth = value; } }\r\n            public bool CollisionEnabled { get { return _controller.detectCollisions; } set { _controller.detectCollisions = value; } }\r\n            public Vector3 Velocity\r\n            {\r\n                get { return _vel; }\r\n                set\r\n                {\r\n                    _vel = value;\r\n                    _talliedVel = _vel;\r\n                }\r\n            }\r\n\r\n            public void Reinit(MovementController controller)\r\n            {\r\n                if (Object.Equals(controller, null)) throw new System.ArgumentNullException(\"controller\");\r\n                _owner = controller;\r\n\r\n                if (!_owner.HasComponent<CharacterController>()) throw new System.InvalidOperationException(\"MovementController requires CharacterController component to operate in CharacterController mode.\");\r\n\r\n                _controller = _owner.GetComponent<CharacterController>();\r\n                _vel = Vector3.zero;\r\n            }\r\n\r\n            public void OnEnable()\r\n            {\r\n                _controller.enabled = true;\r\n\r\n                this.OnHasHitListenersChanged();\r\n            }\r\n\r\n            public void OnDisable()\r\n            {\r\n                _controller.enabled = false;\r\n\r\n                if(!object.ReferenceEquals(_hooks, null))\r\n                {\r\n                    ObjUtil.SmartDestroy(_hooks);\r\n                    _hooks = null;\r\n                }\r\n            }\r\n\r\n            public void OnHasHitListenersChanged()\r\n            {\r\n                if (object.ReferenceEquals(_owner, null)) return;\r\n                if (_owner._movementControllerHit != null && object.ReferenceEquals(_hooks, null))\r\n                {\r\n                    _hooks = _controller.AddComponent<ControllerColliderHitEventHooks>();\r\n                    _hooks.ControllerColliderHit += this.OnCharacterControllerHit;\r\n                }\r\n                else if(_owner._movementControllerHit == null && !object.ReferenceEquals(_hooks, null))\r\n                {\r\n                    ObjUtil.SmartDestroy(_hooks);\r\n                    _hooks = null;\r\n                }\r\n            }\r\n\r\n            public void OnBeforeUpdate()\r\n            {\r\n                _talliedVel = Vector3.zero;\r\n            }\r\n\r\n            public void OnUpdateComplete()\r\n            {\r\n\r\n            }\r\n\r\n            public Capsule GetGeom(bool ignoreSkin)\r\n            {\r\n                var cap = Capsule.FromCollider(_controller);\r\n                if (!ignoreSkin) cap.Radius += _skinWidth;\r\n                return cap;\r\n            }\r\n\r\n            public void Move(Vector3 mv)\r\n            {\r\n                if (_controller.detectCollisions)\r\n                {\r\n                    _controller.Move(mv);\r\n                    //update velocity\r\n                    _talliedVel += _controller.velocity;\r\n                    _vel = _talliedVel;\r\n                }\r\n                else\r\n                {\r\n                    _owner.transform.position += mv;\r\n                    //update velocity\r\n                    _talliedVel += mv / Time.deltaTime;\r\n                    _vel = _talliedVel;\r\n                }\r\n            }\r\n\r\n            public void AtypicalMove(Vector3 mv)\r\n            {\r\n                if (_controller.detectCollisions)\r\n                {\r\n                    _controller.Move(mv);\r\n                }\r\n                else\r\n                {\r\n                    _owner.transform.position += mv;\r\n                }\r\n            }\r\n\r\n            public void AddForce(Vector3 f, ForceMode mode)\r\n            {\r\n                switch (mode)\r\n                {\r\n                    case ForceMode.Force:\r\n                        //force = mass*distance/time^2\r\n                        //distance = force * time^2 / mass\r\n                        this.Move(f * Time.deltaTime * Time.deltaTime / _mass);\r\n                        break;\r\n                    case ForceMode.Acceleration:\r\n                        //acceleration = distance/time^2\r\n                        //distance = acceleration * time^2\r\n                        this.Move(f * (Time.deltaTime * Time.deltaTime));\r\n                        break;\r\n                    case ForceMode.Impulse:\r\n                        //impulse = mass*distance/time\r\n                        //distance = impulse * time / mass\r\n                        this.Move(f * Time.deltaTime / _mass);\r\n                        break;\r\n                    case ForceMode.VelocityChange:\r\n                        //velocity = distance/time\r\n                        //distance = velocity * time\r\n                        this.Move(f * Time.deltaTime);\r\n                        break;\r\n                }\r\n            }\r\n\r\n            public void AddForceAtPosition(Vector3 f, Vector3 pos, ForceMode mode)\r\n            {\r\n                this.AddForce(f, mode);\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Event Handlers\r\n\r\n            private void OnCharacterControllerHit(object sender, ControllerColliderHit hit)\r\n            {\r\n                if(_owner.HasHitListeners)\r\n                {\r\n                    var ev = MovementControllerHitEventArgs.GetTemp(_owner, hit);\r\n                    _owner.SignalHit(ev);\r\n                    MovementControllerHitEventArgs.ReleaseTemp(ev);\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IIGnorableCollision Interface\r\n\r\n            public void IgnoreCollision(Collider coll, bool ignore)\r\n            {\r\n                if (_controller != null && _controller.enabled) Physics.IgnoreCollision(_controller, coll, ignore);\r\n            }\r\n\r\n            public void IgnoreCollision(IIgnorableCollision coll, bool ignore)\r\n            {\r\n                if (_controller != null && coll != null) coll.IgnoreCollision(_controller, ignore);\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Disposable Interface\r\n\r\n            private bool _isDisposed = false;\r\n\r\n            void System.IDisposable.Dispose()\r\n            {\r\n                if (!_isDisposed)\r\n                {\r\n                    //if (_owner != null)\r\n                    //{\r\n                    //    _owner.OnCharacterControllerHit -= this.OnCharacterControllerHit;\r\n                    //}\r\n                    if(_hooks != null)\r\n                    {\r\n                        _hooks.ControllerColliderHit -= this.OnCharacterControllerHit;\r\n                    }\r\n\r\n                    _owner = null;\r\n                    _controller = null;\r\n                    _isDisposed = true;\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        /// <summary>\r\n        /// This is a rigidbody mover that attempts to simulate CharacterController like functionality.\r\n        /// </summary>\r\n        [System.Serializable()]\r\n        public class SimulatedRigidbodyMover : IGameObjectMover\r\n        {\r\n\r\n            #region Fields\r\n\r\n            [System.NonSerialized()]\r\n            private MovementController _owner;\r\n            [System.NonSerialized()]\r\n            private Rigidbody _rigidbody;\r\n            [System.NonSerialized()]\r\n            private Collider _coll;\r\n            [System.NonSerialized()]\r\n            private MovementControllerCollisionHook _hooks;\r\n\r\n            [SerializeField()]\r\n            private bool _bPrefersFixedUpdate = true;\r\n\r\n            [SerializeField()]\r\n            private float _stepOffset;\r\n            [SerializeField()]\r\n            private float _skinWidth;\r\n\r\n            [System.NonSerialized()]\r\n            private Vector3 _vel;\r\n\r\n            //[System.NonSerialized()]\r\n            //private System.Action _moves;\r\n            [System.NonSerialized()]\r\n            private bool _moveCalledLastFrame;\r\n            [System.NonSerialized()]\r\n            private Vector3 _talliedMove;\r\n            [System.NonSerialized()]\r\n            private float _lastDt;\r\n\r\n            [System.NonSerialized()]\r\n            private Vector3 _fullTalliedMove;\r\n\r\n            //enabled cache\r\n            [System.NonSerialized()]\r\n            private bool _cacheIsKinematic;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            public SimulatedRigidbodyMover()\r\n            {\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IGameObjectMover Interface\r\n\r\n            //public bool PrefersFixedUpdate { get { return (_rigidbody != null) ? !_rigidbody.isKinematic : false; } }\r\n            public bool PrefersFixedUpdate { get { return _bPrefersFixedUpdate; } set { _bPrefersFixedUpdate = value; } }\r\n\r\n            public float Mass\r\n            {\r\n                get { return (_rigidbody != null) ? _rigidbody.mass : 0f; }\r\n                set { if(_rigidbody != null) _rigidbody.mass = value; }\r\n            }\r\n            public float StepOffset { get { return _stepOffset; } set { _stepOffset = value; } }\r\n            public float SkinWidth { get { return _skinWidth; } set { _skinWidth = value; } }\r\n            public bool CollisionEnabled\r\n            {\r\n                get\r\n                {\r\n                    return (_coll != null) ? _coll.enabled : false;\r\n                }\r\n                set\r\n                {\r\n                    if (_coll != null) _coll.enabled = value;\r\n                }\r\n            }\r\n            public Vector3 Velocity\r\n            {\r\n                get { return _vel; }\r\n                set { _vel = value; }\r\n            }\r\n\r\n            public void Reinit(MovementController controller)\r\n            {\r\n                if (Object.Equals(controller, null)) throw new System.ArgumentNullException(\"controller\");\r\n                _owner = controller;\r\n\r\n                var rb = _owner.GetComponent<Rigidbody>();\r\n                if (rb == null) throw new System.InvalidOperationException(\"MovementController requires Rigidbody component to operate in Rigidbody mode.\");\r\n                //if (!_owner.HasComponent<SphereCollider>() && !_owner.HasComponent<CapsuleCollider>()) throw new System.InvalidOperationException(\"MovementController on '\" + _owner.gameObject.name + \"' requires a supported Sphere or Capsule Collider component to operate in Rigidbody mode.\");\r\n\r\n                _rigidbody = rb;\r\n                _coll = _owner.GetComponent<Collider>();\r\n                _vel = Vector3.zero;\r\n            }\r\n\r\n            public void OnEnable()\r\n            {\r\n                _cacheIsKinematic = _rigidbody.isKinematic;\r\n                _rigidbody.isKinematic = false;\r\n\r\n                if (_owner.HasHitListeners) this.RegisterCollisionHooks();\r\n            }\r\n\r\n            public void OnDisable()\r\n            {\r\n                _rigidbody.isKinematic = _cacheIsKinematic;\r\n\r\n                this.UnregisterCollisionHooks();\r\n            }\r\n\r\n            public void OnHasHitListenersChanged()\r\n            {\r\n                if (_owner != null && _owner.HasHitListeners)\r\n                    this.RegisterCollisionHooks();\r\n                else\r\n                    this.UnregisterCollisionHooks();\r\n            }\r\n\r\n            public void OnBeforeUpdate()\r\n            {\r\n                if (_moveCalledLastFrame)\r\n                {\r\n                    _moveCalledLastFrame = false;\r\n\r\n                    //we calculate velocity of LAST move in this move\r\n                    if (_lastDt != 0f)\r\n                    {\r\n                        var actualMove = (_owner.transform.position - _owner.LastPosition);\r\n                        \r\n                        actualMove -= (_fullTalliedMove - _talliedMove);\r\n\r\n                        //_vel = actualMove / _lastDt;\r\n\r\n                        //var n = actualMove.normalized;\r\n                        //_vel = n * MathUtil.Average(actualMove.magnitude, Vector3.Dot(_talliedMove, n)) / _lastDt;\r\n\r\n                        var n = _talliedMove.normalized;\r\n                        _vel = n * Mathf.Max(Vector3.Dot(actualMove, n), 0f) / _lastDt;\r\n                    }\r\n                }\r\n\r\n                _fullTalliedMove = Vector3.zero;\r\n                _talliedMove = Vector3.zero;\r\n            }\r\n\r\n            public void OnUpdateComplete()\r\n            {\r\n                //if (_moves != null)\r\n                //{\r\n                //    _moves();\r\n                //    _moveCalledLastFrame = true;\r\n                //    _moves = null;\r\n                //}\r\n\r\n                if(_fullTalliedMove != Vector3.zero)\r\n                {\r\n                    _rigidbody.MovePosition(_rigidbody.position + _fullTalliedMove);\r\n                }\r\n\r\n                _lastDt = Time.deltaTime;\r\n\r\n                //zero out rigidbody velocity, as this should ONLY use MovePosition\r\n                if(!_rigidbody.isKinematic)\r\n                {\r\n                    _rigidbody.velocity = Vector3.zero;\r\n                    _rigidbody.angularVelocity = Vector3.zero;\r\n                }\r\n            }\r\n\r\n            public Capsule GetGeom(bool ignoreSkin)\r\n            {\r\n                if (_coll == null)\r\n                {\r\n                    var p = _owner.transform.position;\r\n                    if (ignoreSkin)\r\n                        return new Capsule(p, p, 0f);\r\n                    else\r\n                        return new Capsule(p, p, _skinWidth);\r\n                }\r\n                else\r\n                {\r\n                    var c = Capsule.FromCollider(_coll);\r\n                    if (ignoreSkin) c.Radius -= _skinWidth;\r\n                    return c;\r\n                }\r\n            }\r\n\r\n            public void Move(Vector3 mv)\r\n            {\r\n                //_moves += () =>\r\n                //{\r\n                //    _rigidbody.MovePosition(_rigidbody.position + mv);\r\n\r\n                //    _talliedMove += mv;\r\n                //    _vel = _talliedMove / Time.deltaTime;\r\n                //};\r\n\r\n                _fullTalliedMove += mv;\r\n                _talliedMove += mv;\r\n                _vel = _talliedMove / Time.deltaTime;\r\n            }\r\n\r\n            public void AtypicalMove(Vector3 mv)\r\n            {\r\n                //_moves += () =>\r\n                //{\r\n                //    _rigidbody.MovePosition(_rigidbody.position + mv);\r\n                //};\r\n\r\n                _fullTalliedMove += mv;\r\n            }\r\n\r\n            public void AddForce(Vector3 f, ForceMode mode)\r\n            {\r\n                switch (mode)\r\n                {\r\n                    case ForceMode.Force:\r\n                        //force = mass*distance/time^2\r\n                        //distance = force * time^2 / mass\r\n                        this.Move(f * Time.deltaTime * Time.deltaTime / this.Mass);\r\n                        break;\r\n                    case ForceMode.Acceleration:\r\n                        //acceleration = distance/time^2\r\n                        //distance = acceleration * time^2\r\n                        this.Move(f * (Time.deltaTime * Time.deltaTime));\r\n                        break;\r\n                    case ForceMode.Impulse:\r\n                        //impulse = mass*distance/time\r\n                        //distance = impulse * time / mass\r\n                        this.Move(f * Time.deltaTime / this.Mass);\r\n                        break;\r\n                    case ForceMode.VelocityChange:\r\n                        //velocity = distance/time\r\n                        //distance = velocity * time\r\n                        this.Move(f * Time.deltaTime);\r\n                        break;\r\n                }\r\n            }\r\n\r\n            public void AddForceAtPosition(Vector3 f, Vector3 pos, ForceMode mode)\r\n            {\r\n                this.AddForce(f, mode);\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Event Handlers\r\n\r\n            private void RegisterCollisionHooks()\r\n            {\r\n                if (!object.ReferenceEquals(_hooks, null)) return;\r\n\r\n                _hooks = _owner.AddOrGetComponent<MovementControllerCollisionHook>();\r\n                var callback = new OnCollisionCallback(this.OnCollision);\r\n                _hooks.OnEnter -= callback;\r\n                _hooks.OnStay -= callback;\r\n                _hooks.OnExit -= callback;\r\n\r\n                _hooks.OnEnter += callback;\r\n                _hooks.OnStay += callback;\r\n                _hooks.OnExit += callback;\r\n            }\r\n\r\n            private void UnregisterCollisionHooks()\r\n            {\r\n                if (_hooks != null)\r\n                {\r\n                    var callback = new OnCollisionCallback(this.OnCollision);\r\n                    _hooks.OnEnter -= callback;\r\n                    _hooks.OnStay -= callback;\r\n                    _hooks.OnExit -= callback;\r\n                    _hooks = null;\r\n                }\r\n            }\r\n\r\n            private void OnCollision(object sender, Collision c)\r\n            {\r\n                if(_owner.HasHitListeners)\r\n                {\r\n                    var ev = MovementControllerHitEventArgs.GetTemp(_owner, c);\r\n                    _owner.SignalHit(ev);\r\n                    MovementControllerHitEventArgs.ReleaseTemp(ev);\r\n                }\r\n                else\r\n                {\r\n                    this.UnregisterCollisionHooks();\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IIGnorableCollision Interface\r\n\r\n            public void IgnoreCollision(Collider coll, bool ignore)\r\n            {\r\n                if (_coll != null && _coll.enabled) Physics.IgnoreCollision(_coll, coll, ignore);\r\n            }\r\n\r\n            public void IgnoreCollision(IIgnorableCollision coll, bool ignore)\r\n            {\r\n                if (_coll != null && coll != null) coll.IgnoreCollision(_coll, ignore);\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Disposable Interface\r\n\r\n            private bool _isDisposed = false;\r\n\r\n            void System.IDisposable.Dispose()\r\n            {\r\n                if (!_isDisposed)\r\n                {\r\n                    if(_hooks != null)\r\n                    {\r\n                        _hooks.OnEnter -= this.OnCollision;\r\n                        _hooks.OnExit -= this.OnCollision;\r\n                    }\r\n                    \r\n                    _owner = null;\r\n                    _coll = null;\r\n                    _hooks = null;\r\n                    _isDisposed = true;\r\n                }\r\n            }\r\n\r\n            #endregion\r\n            \r\n        }\r\n\r\n\r\n        /// <summary>\r\n        /// This is a rigidbody controller that manipulates the velocity directly.\r\n        /// </summary>\r\n        [System.Serializable()]\r\n        public class DirectRigidBodyMover : IGameObjectMover\r\n        {\r\n\r\n            #region Fields\r\n\r\n            [System.NonSerialized()]\r\n            private MovementController _owner;\r\n            [System.NonSerialized()]\r\n            private Rigidbody _rigidbody;\r\n            [System.NonSerialized()]\r\n            private Collider _coll;\r\n            [System.NonSerialized()]\r\n            private MovementControllerCollisionHook _hooks;\r\n\r\n            [SerializeField()]\r\n            private float _stepOffset;\r\n            [SerializeField()]\r\n            private float _skinWidth;\r\n            [SerializeField()]\r\n            private bool _freeMovement;\r\n\r\n            [System.NonSerialized()]\r\n            private Vector3 _talliedMove;\r\n            [System.NonSerialized()]\r\n            private Vector3 _lastVel;\r\n\r\n\r\n            //enabled cache\r\n            [System.NonSerialized()]\r\n            private bool _cacheIsKinematic;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            public DirectRigidBodyMover()\r\n            {\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Properties\r\n\r\n            public bool FreeMovement\r\n            {\r\n                get { return _freeMovement; }\r\n                set { _freeMovement = value; }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IGameObjectMover Interface\r\n\r\n            public bool PrefersFixedUpdate { get { return true; } }\r\n\r\n            public float Mass\r\n            {\r\n                get { return (_rigidbody != null) ? _rigidbody.mass : 0f; }\r\n                set { if (_rigidbody != null) _rigidbody.mass = value; }\r\n            }\r\n            public float StepOffset { get { return _stepOffset; } set { _stepOffset = value; } }\r\n            public float SkinWidth { get { return _skinWidth; } set { _skinWidth = value; } }\r\n            public bool CollisionEnabled\r\n            {\r\n                get\r\n                { \r\n                    return (_coll != null) ? _coll.enabled : false;\r\n                } \r\n                set\r\n                { \r\n                    if(_coll != null) _coll.enabled = value;\r\n                }\r\n            }\r\n            public Vector3 Velocity\r\n            {\r\n                get { return _rigidbody.velocity; }\r\n                set\r\n                {\r\n                    _rigidbody.velocity = value;\r\n                    _talliedMove = value;\r\n                }\r\n            }\r\n\r\n            public void Reinit(MovementController controller)\r\n            {\r\n                if (Object.Equals(controller, null)) throw new System.ArgumentNullException(\"controller\");\r\n                _owner = controller;\r\n\r\n                var rb = _owner.GetComponent<Rigidbody>();\r\n                if (rb == null) throw new System.InvalidOperationException(\"MovementController requires Rigidbody component to operate in Rigidbody mode.\");\r\n                //if (!_owner.HasComponent<SphereCollider>() && !_owner.HasComponent<CapsuleCollider>()) throw new System.InvalidOperationException(\"MovementController requires a supported Sphere or Capsule Collider component to operate in Rigidbody mode.\");\r\n\r\n                _rigidbody = rb;\r\n                _coll = _owner.GetComponent<Collider>();\r\n            }\r\n\r\n            public void OnEnable()\r\n            {\r\n                _cacheIsKinematic = _rigidbody.isKinematic;\r\n                _rigidbody.isKinematic = false;\r\n\r\n                _lastVel = _rigidbody.velocity;\r\n\r\n                if (_owner.HasHitListeners) this.RegisterCollisionHooks();\r\n            }\r\n\r\n            public void OnDisable()\r\n            {\r\n                _rigidbody.isKinematic = _cacheIsKinematic;\r\n\r\n                this.UnregisterCollisionHooks();\r\n            }\r\n\r\n            public void OnHasHitListenersChanged()\r\n            {\r\n                if (_owner != null && _owner.HasHitListeners)\r\n                    this.RegisterCollisionHooks();\r\n                else\r\n                    this.UnregisterCollisionHooks();\r\n            }\r\n\r\n            public void OnBeforeUpdate()\r\n            {\r\n                _talliedMove = Vector3.zero;\r\n            }\r\n\r\n            public void OnUpdateComplete()\r\n            {\r\n                if(_freeMovement)\r\n                {\r\n                    _lastVel = _rigidbody.velocity;\r\n                }\r\n                else\r\n                {\r\n                    if (!_owner.MoveCalled)\r\n                    {\r\n                        _rigidbody.velocity = _lastVel;\r\n                    }\r\n                    else\r\n                    {\r\n                        _lastVel = _rigidbody.velocity;\r\n                    }\r\n                }\r\n            }\r\n\r\n            public Capsule GetGeom(bool ignoreSkin)\r\n            {\r\n                if (_coll == null)\r\n                {\r\n                    var p = _owner.transform.position;\r\n                    if (ignoreSkin)\r\n                        return new Capsule(p, p, 0f);\r\n                    else\r\n                        return new Capsule(p, p, _skinWidth);\r\n                }\r\n                else\r\n                {\r\n                    var c = Capsule.FromCollider(_coll);\r\n                    if (ignoreSkin) c.Radius -= _skinWidth;\r\n                    return c;\r\n                }\r\n            }\r\n\r\n            public void Move(Vector3 mv)\r\n            {\r\n                _talliedMove += mv;\r\n\r\n                Vector3 v = _talliedMove / Time.deltaTime;\r\n                //v -= _owner.LastVelocity; //remove the old velocity so it's setting to, not adding to\r\n                //_rigidbody.AddForce(v, ForceMode.VelocityChange);\r\n                _rigidbody.velocity = v;\r\n            }\r\n\r\n            public void AtypicalMove(Vector3 mv)\r\n            {\r\n                //_rigidbody.MovePosition(_rigidbody.position + mv);\r\n                _owner.transform.position += mv; //for some reason moveposition doesn't work with moving platforms\r\n            }\r\n\r\n            public void AddForce(Vector3 f, ForceMode mode)\r\n            {\r\n                _rigidbody.AddForce(f, mode);\r\n            }\r\n\r\n            public void AddForceAtPosition(Vector3 f, Vector3 pos, ForceMode mode)\r\n            {\r\n                _rigidbody.AddForceAtPosition(f, pos, mode);\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Event Handlers\r\n\r\n            private void RegisterCollisionHooks()\r\n            {\r\n                if (!object.ReferenceEquals(_hooks, null)) return;\r\n\r\n                _hooks = _owner.AddOrGetComponent<MovementControllerCollisionHook>();\r\n                var callback = new OnCollisionCallback(this.OnCollision);\r\n                _hooks.OnEnter -= callback;\r\n                _hooks.OnStay -= callback;\r\n                _hooks.OnExit -= callback;\r\n\r\n                _hooks.OnEnter += callback;\r\n                _hooks.OnStay += callback;\r\n                _hooks.OnExit += callback;\r\n            }\r\n\r\n            private void UnregisterCollisionHooks()\r\n            {\r\n                if (_hooks != null)\r\n                {\r\n                    var callback = new OnCollisionCallback(this.OnCollision);\r\n                    _hooks.OnEnter -= callback;\r\n                    _hooks.OnStay -= callback;\r\n                    _hooks.OnExit -= callback;\r\n                    _hooks = null;\r\n                }\r\n            }\r\n\r\n            private void OnCollision(object sender, Collision c)\r\n            {\r\n                if(_owner.HasHitListeners)\r\n                {\r\n                    var ev = MovementControllerHitEventArgs.GetTemp(_owner, c);\r\n                    _owner.SignalHit(ev);\r\n                    MovementControllerHitEventArgs.ReleaseTemp(ev);\r\n                }\r\n                else\r\n                {\r\n                    this.UnregisterCollisionHooks();\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IIGnorableCollision Interface\r\n\r\n            public void IgnoreCollision(Collider coll, bool ignore)\r\n            {\r\n                if (_coll != null && _coll.enabled) Physics.IgnoreCollision(_coll, coll, ignore);\r\n            }\r\n\r\n            public void IgnoreCollision(IIgnorableCollision coll, bool ignore)\r\n            {\r\n                if (_coll != null && coll != null) coll.IgnoreCollision(_coll, ignore);\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Disposable Interface\r\n\r\n            private bool _isDisposed = false;\r\n\r\n            void System.IDisposable.Dispose()\r\n            {\r\n                if (!_isDisposed)\r\n                {\r\n                    if (_hooks != null)\r\n                    {\r\n                        _hooks.OnEnter -= this.OnCollision;\r\n                        _hooks.OnExit -= this.OnCollision;\r\n                    }\r\n                    \r\n                    _owner = null;\r\n                    _coll = null;\r\n                    _hooks = null;\r\n                    _isDisposed = true;\r\n                }\r\n            }\r\n\r\n            #endregion\r\n            \r\n        }\r\n\r\n        [System.Serializable()]\r\n        public class RagdollBodyMover : IGameObjectMover\r\n        {\r\n\r\n            #region Fields\r\n\r\n            [System.NonSerialized()]\r\n            private MovementController _owner;\r\n            [System.NonSerialized()]\r\n            private ArmatureRig _armature;\r\n\r\n            [System.NonSerialized()]\r\n            private float _mass;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            public RagdollBodyMover()\r\n            {\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IGameObjectMover Interface\r\n\r\n            public bool PrefersFixedUpdate { get { return true; } }\r\n\r\n            public float Mass { get { return _mass; } set { } }\r\n\r\n            public float StepOffset { get { return 0f; } set { } }\r\n\r\n            public float SkinWidth { get { return 0f; } set { } }\r\n\r\n            public bool CollisionEnabled\r\n            {\r\n                get\r\n                {\r\n                    return (_armature != null && _armature.RootJoint != null) ? !_armature.RootJoint.isKinematic : false;\r\n                }\r\n                set\r\n                {\r\n                    if (_armature != null)\r\n                    {\r\n                        _armature.SetCollidersEnabled(value);\r\n                    }\r\n                }\r\n            }\r\n\r\n            public Vector3 Velocity\r\n            {\r\n                get\r\n                {\r\n                    return (_armature != null && _armature.RootJoint != null) ? _armature.RootJoint.velocity : Vector3.zero;\r\n                }\r\n                set\r\n                {\r\n                    if (_armature != null)\r\n                    {\r\n                        for(int i = 0; i < _armature.JointCount; i++)\r\n                        {\r\n                            _armature.GetJoint(i).velocity = value;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n\r\n\r\n            public void Reinit(MovementController controller)\r\n            {\r\n                if (Object.Equals(controller, null)) throw new System.ArgumentNullException(\"controller\");\r\n                _owner = controller;\r\n\r\n                _armature = _owner.FindComponent<ArmatureRig>();\r\n                if (_armature == null) throw new System.InvalidOperationException(\"MovementController requires an ArmatureRig to operate in Ragdoll mode.\");\r\n\r\n                _mass = _armature.CalculateMass();\r\n            }\r\n\r\n            public void OnEnable()\r\n            {\r\n                _armature.SetJointsKinematic(false);\r\n                _armature.SetCollidersEnabled(true);\r\n            }\r\n\r\n            public void OnDisable()\r\n            {\r\n            }\r\n\r\n            public void OnHasHitListenersChanged()\r\n            {\r\n                //do nothing\r\n            }\r\n\r\n            public void OnBeforeUpdate()\r\n            {\r\n            }\r\n\r\n            public void OnUpdateComplete()\r\n            {\r\n                if (_armature.RootJoint != null && _armature.RootJoint.transform != _owner.transform)\r\n                {\r\n                    var pos = _armature.RootJoint.transform.position;\r\n                    _owner.transform.position = pos;\r\n                    _armature.RootJoint.transform.position = pos;\r\n                }\r\n            }\r\n\r\n            public Capsule GetGeom(bool ignoreSkin)\r\n            {\r\n                var s = _armature.CalculateBoundingSphere();\r\n                return new Capsule(s.Center, s.Center, s.Radius);\r\n            }\r\n\r\n            public void Move(Vector3 mv)\r\n            {\r\n                //if (_armature.RootJoint != null)\r\n                //{\r\n                //    var v = mv / GameTime.DeltaTime;\r\n                //    _armature.RootJoint.AddForce(v, ForceMode.VelocityChange);\r\n\r\n\r\n                //    var v = mv / GameTime.DeltaTime;\r\n                //    var m = v.magnitude;\r\n                //    var n = v / m;\r\n                //    var d = Vector3.Dot(_armature.RootJoint.velocity, n);\r\n                //    if (d > m)\r\n                //    {\r\n                //        _armature.RootJoint.velocity -= n * (d - m);\r\n                //    }\r\n                //}\r\n\r\n\r\n                var v = mv / Time.deltaTime;\r\n                var m = v.magnitude;\r\n                var n = v / m;\r\n                for (int i = 0; i < _armature.JointCount; i++)\r\n                {\r\n                    var j = _armature.GetJoint(i);\r\n                    j.AddForce(v, ForceMode.VelocityChange);\r\n\r\n                    var d = Vector3.Dot(j.velocity, n);\r\n                    if (d > m)\r\n                    {\r\n                        j.velocity -= n * (d - m);\r\n                    }\r\n                }\r\n            }\r\n\r\n            public void AtypicalMove(Vector3 mv)\r\n            {\r\n                for (int i = 0; i < _armature.JointCount; i++)\r\n                {\r\n                    var j = _armature.GetJoint(i);\r\n                    j.MovePosition(j.position + mv);\r\n                }\r\n            }\r\n\r\n            public void AddForce(Vector3 f, ForceMode mode)\r\n            {\r\n                for (int i = 0; i < _armature.JointCount; i++)\r\n                {\r\n                    _armature.GetJoint(i).AddForce(f, mode);\r\n                }\r\n            }\r\n\r\n            public void AddForceAtPosition(Vector3 f, Vector3 pos, ForceMode mode)\r\n            {\r\n                for (int i = 0; i < _armature.JointCount; i++)\r\n                {\r\n                    _armature.GetJoint(i).AddForceAtPosition(f, pos, mode);\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IIGnorableCollision Interface\r\n\r\n            public void IgnoreCollision(Collider coll, bool ignore)\r\n            {\r\n                _armature.IgnoreCollision(coll, ignore);\r\n            }\r\n\r\n            public void IgnoreCollision(IIgnorableCollision coll, bool ignore)\r\n            {\r\n                //this is only safe because ArmatureRig safely deals with the IIgnorableCollision and does call back into the passed in IIgnorableCollision\r\n                if (_armature != null && coll != null) _armature.IgnoreCollision(coll, ignore);\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IDisposable Interface\r\n\r\n            public void Dispose()\r\n            {\r\n                _owner = null;\r\n                _armature = null;\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        [System.Serializable()]\r\n        public class DumbMover : IGameObjectMover\r\n        {\r\n\r\n            #region Fields\r\n\r\n            [System.NonSerialized()]\r\n            private MovementController _controller;\r\n            [System.NonSerialized()]\r\n            private Vector3 _talliedMv;\r\n            [System.NonSerialized()]\r\n            private Vector3 _vel;\r\n\r\n            #endregion\r\n\r\n\r\n            #region IGameObjectMover Interface\r\n\r\n            public bool PrefersFixedUpdate\r\n            {\r\n                get { return false; }\r\n            }\r\n\r\n            public float Mass\r\n            {\r\n                get\r\n                {\r\n                    return 0f;\r\n                }\r\n                set\r\n                {\r\n                }\r\n            }\r\n\r\n            public float StepOffset\r\n            {\r\n                get\r\n                {\r\n                    return 0f;\r\n                }\r\n                set\r\n                {\r\n                }\r\n            }\r\n\r\n            public float SkinWidth\r\n            {\r\n                get\r\n                {\r\n                    return 0f;\r\n                }\r\n                set\r\n                {\r\n                }\r\n            }\r\n\r\n            public bool CollisionEnabled\r\n            {\r\n                get\r\n                {\r\n                    return true;\r\n                }\r\n                set\r\n                {\r\n                }\r\n            }\r\n\r\n            public Vector3 Velocity\r\n            {\r\n                get\r\n                {\r\n                    return _vel;\r\n                }\r\n                set\r\n                {\r\n                    _vel = value;\r\n                }\r\n            }\r\n\r\n            public void Reinit(MovementController controller)\r\n            {\r\n                _controller = controller;\r\n                _vel = Vector2.zero;\r\n            }\r\n\r\n            public void OnEnable()\r\n            {\r\n                _vel = Vector2.zero;\r\n            }\r\n\r\n            public void OnDisable()\r\n            {\r\n                _vel = Vector2.zero;\r\n            }\r\n\r\n            public void OnHasHitListenersChanged()\r\n            {\r\n                //do nothing\r\n            }\r\n\r\n            public void OnBeforeUpdate()\r\n            {\r\n            }\r\n\r\n            public void OnUpdateComplete()\r\n            {\r\n                _vel = _talliedMv / Time.deltaTime;\r\n                _talliedMv = Vector3.zero;\r\n            }\r\n\r\n            public Capsule GetGeom(bool ignoreSkin)\r\n            {\r\n                return new Capsule(_controller.transform.position, _controller.transform.position, 0f);\r\n            }\r\n\r\n            public void Move(Vector3 mv)\r\n            {\r\n                _controller.transform.Translate(mv);\r\n                _talliedMv += mv;\r\n                _vel = _talliedMv / Time.deltaTime;\r\n            }\r\n\r\n            public void AtypicalMove(Vector3 mv)\r\n            {\r\n                _controller.transform.Translate(mv);\r\n            }\r\n\r\n            public void AddForce(Vector3 f, ForceMode mode)\r\n            {\r\n                switch (mode)\r\n                {\r\n                    case ForceMode.Force:\r\n                        //force = mass*distance/time^2\r\n                        //distance = force * time^2 / mass\r\n                        this.Move(f * Time.deltaTime * Time.deltaTime / this.Mass);\r\n                        break;\r\n                    case ForceMode.Acceleration:\r\n                        //acceleration = distance/time^2\r\n                        //distance = acceleration * time^2\r\n                        this.Move(f * (Time.deltaTime * Time.deltaTime));\r\n                        break;\r\n                    case ForceMode.Impulse:\r\n                        //impulse = mass*distance/time\r\n                        //distance = impulse * time / mass\r\n                        this.Move(f * Time.deltaTime / this.Mass);\r\n                        break;\r\n                    case ForceMode.VelocityChange:\r\n                        //velocity = distance/time\r\n                        //distance = velocity * time\r\n                        this.Move(f * Time.deltaTime);\r\n                        break;\r\n                }\r\n            }\r\n\r\n            public void AddForceAtPosition(Vector3 f, Vector3 pos, ForceMode mode)\r\n            {\r\n                this.AddForce(f, mode);\r\n            }\r\n\r\n            public void IgnoreCollision(Collider coll, bool ignore)\r\n            {\r\n            }\r\n\r\n            public void IgnoreCollision(IIgnorableCollision coll, bool ignore)\r\n            {\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                _controller = null;\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n\r\n        [System.Serializable()]\r\n        public class PausedMover : IGameObjectMover\r\n        {\r\n\r\n            [System.NonSerialized()]\r\n            private MovementController _owner;\r\n            [System.NonSerialized()]\r\n            private Vector3 _cachedVelocity;\r\n            [System.NonSerialized()]\r\n            private bool _cachedKinematic;\r\n\r\n            public bool PrefersFixedUpdate\r\n            {\r\n                get { return false; }\r\n            }\r\n\r\n            public float Mass\r\n            {\r\n                get\r\n                {\r\n                    return 0;\r\n                }\r\n                set\r\n                {\r\n                }\r\n            }\r\n\r\n            public float StepOffset\r\n            {\r\n                get\r\n                {\r\n                    return 0f;\r\n                }\r\n                set\r\n                {\r\n                }\r\n            }\r\n\r\n            public float SkinWidth\r\n            {\r\n                get\r\n                {\r\n                    return 0f;\r\n                }\r\n                set\r\n                {\r\n                }\r\n            }\r\n\r\n            public bool CollisionEnabled\r\n            {\r\n                get\r\n                {\r\n                    return false;\r\n                }\r\n                set\r\n                {\r\n                }\r\n            }\r\n\r\n            public Vector3 Velocity\r\n            {\r\n                get\r\n                {\r\n                    return Vector3.zero;\r\n                }\r\n                set\r\n                {\r\n                }\r\n            }\r\n\r\n            public void Reinit(MovementController controller)\r\n            {\r\n                _owner = controller;\r\n            }\r\n\r\n            public void OnEnable()\r\n            {\r\n                var rb = _owner.GetComponent<Rigidbody>();\r\n                if(rb != null)\r\n                {\r\n                    _cachedVelocity = rb.velocity;\r\n                    _cachedKinematic = rb.isKinematic;\r\n                    if(!rb.isKinematic) rb.velocity = Vector3.zero;\r\n                    rb.isKinematic = true;\r\n                }\r\n            }\r\n\r\n            public void OnDisable()\r\n            {\r\n                var rb = _owner.GetComponent<Rigidbody>();\r\n                if (rb != null)\r\n                {\r\n                    rb.isKinematic = _cachedKinematic;\r\n                    if (!rb.isKinematic) rb.velocity = _cachedVelocity;\r\n                }\r\n            }\r\n\r\n            public void OnHasHitListenersChanged()\r\n            {\r\n                //do nothing\r\n            }\r\n\r\n            public void OnBeforeUpdate()\r\n            {\r\n            }\r\n\r\n            public void OnUpdateComplete()\r\n            {\r\n            }\r\n\r\n            public Capsule GetGeom(bool ignoreSkin)\r\n            {\r\n                var p = _owner.transform.position;\r\n                return new Capsule(p, p, 0f);\r\n            }\r\n\r\n            public void Move(Vector3 mv)\r\n            {\r\n            }\r\n\r\n            public void AtypicalMove(Vector3 mv)\r\n            {\r\n            }\r\n\r\n            public void AddForce(Vector3 f, ForceMode mode)\r\n            {\r\n            }\r\n\r\n            public void AddForceAtPosition(Vector3 f, Vector3 pos, ForceMode mode)\r\n            {\r\n            }\r\n\r\n            public void IgnoreCollision(Collider coll, bool ignore)\r\n            {\r\n            }\r\n\r\n            public void IgnoreCollision(IIgnorableCollision coll, bool ignore)\r\n            {\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                this.OnDisable();\r\n            }\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n\r\n        private sealed class MovementControllerCollisionHook : MonoBehaviour\r\n        {\r\n            private OnCollisionCallback _onEnter;\r\n            private OnCollisionCallback _onExit;\r\n            private OnCollisionCallback _onStay;\r\n\r\n\r\n            public event OnCollisionCallback OnEnter\r\n            {\r\n                add\r\n                {\r\n                    _onEnter += value;\r\n                    if (!this.enabled) this.enabled = true;\r\n                }\r\n                remove\r\n                {\r\n                    _onEnter -= value;\r\n                    if (_onEnter == null && _onExit == null) this.enabled = false;\r\n                }\r\n            }\r\n            public event OnCollisionCallback OnExit\r\n            {\r\n                add\r\n                {\r\n                    _onExit += value;\r\n                    if (!this.enabled) this.enabled = true;\r\n                }\r\n                remove\r\n                {\r\n                    _onExit -= value;\r\n                    if (_onEnter == null && _onExit == null) this.enabled = false;\r\n                }\r\n            }\r\n\r\n            public event OnCollisionCallback OnStay\r\n            {\r\n                add\r\n                {\r\n                    _onStay += value;\r\n                    if (!this.enabled) this.enabled = true;\r\n                }\r\n                remove\r\n                {\r\n                    _onStay -= value;\r\n                    if (_onStay == null) this.enabled = false;\r\n                }\r\n            }\r\n\r\n            private void OnCollisionEnter(Collision collision)\r\n            {\r\n                if (!this.isActiveAndEnabled) return;\r\n\r\n                if (_onEnter != null) _onEnter(this.gameObject, collision);\r\n            }\r\n\r\n            private void OnCollisionStay(Collision collision)\r\n            {\r\n                if (!this.isActiveAndEnabled) return;\r\n\r\n                if (_onStay != null) _onStay(this.gameObject, collision);\r\n            }\r\n\r\n            private void OnCollisionExit(Collision collision)\r\n            {\r\n                if (!this.isActiveAndEnabled) return;\r\n\r\n                if (_onExit != null) _onExit(this.gameObject, collision);\r\n            }\r\n\r\n            private void OnDestroy()\r\n            {\r\n                _onEnter = null;\r\n                _onExit = null;\r\n                _onStay = null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region Event Arg Types\r\n\r\n        /// <summary>\r\n        /// These event args are intended to be temporary, do not persist these args once the event has completed.\r\n        /// </summary>\r\n        public class MovementControllerHitEventArgs : System.EventArgs\r\n        {\r\n\r\n            #region Fields\r\n\r\n            private MovementController _controller;\r\n            private Collider _collider;\r\n            private object _data;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            private MovementControllerHitEventArgs()\r\n            {\r\n\r\n            }\r\n\r\n            public MovementControllerHitEventArgs(MovementController controller, Collision collision)\r\n            {\r\n                _controller = controller;\r\n                _collider = collision.collider;\r\n                _data = collision;\r\n            }\r\n\r\n            public MovementControllerHitEventArgs(MovementController controller, ControllerColliderHit collision)\r\n            {\r\n                _controller = controller;\r\n                _collider = collision.collider;\r\n                _data = collision;\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Properties\r\n\r\n            public MovementController Controller { get { return _controller; } }\r\n            public Collider Collider { get { return _collider; } }\r\n\r\n            /// <summary>\r\n            /// The collision data, a Collision in the case of Rigidbody, ControllerColliderHit in the case of CharacterController.\r\n            /// </summary>\r\n            public object Data { get { return _data; } }\r\n\r\n            #endregion\r\n\r\n            #region Methods\r\n\r\n            public MovementControllerHitContact GetFirstContact()\r\n            {\r\n                if(_data is ControllerColliderHit)\r\n                {\r\n                    var hit = _data as ControllerColliderHit;\r\n                    return new MovementControllerHitContact(hit.normal, hit.point);\r\n                }\r\n                else if(_data is Collision)\r\n                {\r\n                    var coll = _data as Collision;\r\n                    var arr = coll.contacts;\r\n                    if (arr.Length > 0)\r\n                    {\r\n                        return new MovementControllerHitContact(arr[0].normal, arr[0].point);\r\n                    }\r\n                }\r\n\r\n                return default(MovementControllerHitContact);\r\n            }\r\n\r\n            public MovementControllerHitContact[] GetContacts()\r\n            {\r\n                if (_data is ControllerColliderHit)\r\n                {\r\n                    var hit = _data as ControllerColliderHit;\r\n                    return new MovementControllerHitContact[] { new MovementControllerHitContact(hit.normal, hit.point) };\r\n                }\r\n                else if(_data is Collision)\r\n                {\r\n                    var coll = _data as Collision;\r\n                    var arr = coll.contacts;\r\n                    if (arr.Length > 0)\r\n                    {\r\n                        using (var lst = TempCollection.GetList<MovementControllerHitContact>(arr.Length))\r\n                        {\r\n                            foreach(var c in arr)\r\n                            {\r\n                                lst.Add(new MovementControllerHitContact(c.normal, c.point));\r\n                            }\r\n                            return lst.ToArray();\r\n                        }\r\n                    }\r\n                }\r\n\r\n                return ArrayUtil.Empty<MovementControllerHitContact>();\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Static Interface\r\n\r\n            private static MovementControllerHitEventArgs _ev;\r\n\r\n            public static MovementControllerHitEventArgs GetTemp(MovementController controller, Collision collision)\r\n            {\r\n                var ev = _ev;\r\n                if (ev == null) ev = new MovementControllerHitEventArgs();\r\n\r\n                ev._controller = controller;\r\n                ev._collider = collision.collider;\r\n                ev._data = collision;\r\n                return ev;\r\n            }\r\n\r\n            public static MovementControllerHitEventArgs GetTemp(MovementController controller, ControllerColliderHit collision)\r\n            {\r\n                var ev = _ev;\r\n                if (ev == null) ev = new MovementControllerHitEventArgs();\r\n\r\n                ev._controller = controller;\r\n                ev._collider = collision.collider;\r\n                ev._data = collision;\r\n                return ev;\r\n            }\r\n\r\n            public static void ReleaseTemp(MovementControllerHitEventArgs ev)\r\n            {\r\n                if(_ev == null)\r\n                {\r\n                    ev._controller = null;\r\n                    ev._collider = null;\r\n                    ev._data = null;\r\n                    _ev = ev;\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        public struct MovementControllerHitContact\r\n        {\r\n            public readonly Vector3 Normal;\r\n            public readonly Vector3 Point;\r\n\r\n            public MovementControllerHitContact(Vector3 n, Vector3 p)\r\n            {\r\n                this.Normal = n;\r\n                this.Point = p;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n\r\n\r\n        //EMULATE MOVER TYPE, STORED FOR POSSIBLE FUTURE IMP\r\n        /// <summary>\r\n        /// This attempts to emulate the way CharacterController operates by casting a capsule. Unlike CharacterController it attempts to be axis ambiguous, where as CC is locked to the +Y up axis.\r\n        /// </summary>\r\n        [System.Serializable()]\r\n        public class EmulatedCharacterControllerBodyMover : IGameObjectMover\r\n        {\r\n\r\n            #region Fields\r\n\r\n            [System.NonSerialized()]\r\n            private MovementController _owner;\r\n\r\n            [SerializeField()]\r\n            private float _mass = 1.0f;\r\n            [SerializeField()]\r\n            private float _stepOffset;\r\n            [SerializeField()]\r\n            private float _skinWidth;\r\n            [SerializeField()]\r\n            private Capsule _geom;\r\n\r\n            [System.NonSerialized()]\r\n            private bool _collisionEnabled;\r\n\r\n            [System.NonSerialized()]\r\n            private Vector3 _vel;\r\n\r\n            [System.NonSerialized()]\r\n            private bool _onSurface;\r\n            [System.NonSerialized()]\r\n            private Vector3 _currentSurfaceNormal;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n\r\n            public EmulatedCharacterControllerBodyMover()\r\n            {\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Properties\r\n\r\n            public Capsule Geom\r\n            {\r\n                get { return _geom; }\r\n                set { _geom = value; }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IGameObjectMover Interface\r\n\r\n            public bool PrefersFixedUpdate { get { return false; } }\r\n\r\n            public float Mass { get { return _mass; } set { _mass = value; } }\r\n            public float StepOffset { get { return _stepOffset; } set { _stepOffset = value; } }\r\n            public float SkinWidth { get { return _skinWidth; } set { _skinWidth = value; } }\r\n            public bool CollisionEnabled { get { return _collisionEnabled; } set { _collisionEnabled = value; } }\r\n            public Vector3 Velocity\r\n            {\r\n                get { return _vel; }\r\n                set { _vel = value; }\r\n            }\r\n\r\n            public void Reinit(MovementController controller)\r\n            {\r\n                if (Object.Equals(controller, null)) throw new System.ArgumentNullException(\"controller\");\r\n                _owner = controller;\r\n\r\n                _vel = Vector3.zero;\r\n            }\r\n\r\n            public void OnEnable()\r\n            {\r\n            }\r\n\r\n            public void OnDisable()\r\n            {\r\n            }\r\n\r\n            public void OnHasHitListenersChanged()\r\n            {\r\n\r\n            }\r\n\r\n            public void OnBeforeUpdate()\r\n            {\r\n\r\n            }\r\n\r\n            public void OnUpdateComplete()\r\n            {\r\n\r\n            }\r\n\r\n            public Capsule GetGeom(bool ignoreSkin)\r\n            {\r\n                Vector3 s = _owner.transform.TransformPoint(_geom.Start);\r\n                Vector3 e = _owner.transform.TransformPoint(_geom.End);\r\n                float r = VectorUtil.GetMaxScalar(_owner.transform.lossyScale) * ((ignoreSkin) ? _geom.Radius : _geom.Radius + _skinWidth);\r\n\r\n                return new Capsule(s, e, r);\r\n            }\r\n\r\n            public void Move(Vector3 mv)\r\n            {\r\n                //TODO - need to make this actually work, but is NOT important at this current moment in time, don't forget to include the 'CollisionEnabled' flag\r\n\r\n                var geom = this.GetGeom(true);\r\n                int mask = PhysicsUtil.CalculateLayerMaskAgainst(_owner.gameObject.layer);\r\n                RaycastHit hit;\r\n                //bool bStayedGrounded = false;\r\n\r\n                if (_onSurface)\r\n                {\r\n                    if (geom.Cast(-_currentSurfaceNormal, out hit, _skinWidth + 0.0001f, mask))\r\n                    {\r\n                        //update ground normal\r\n                        RaycastHit simpleHit;\r\n                        if (Physics.Raycast(hit.point + hit.normal, -hit.normal, out simpleHit, 1.01f, mask))\r\n                        {\r\n                            //bStayedGrounded = true;\r\n                            _currentSurfaceNormal = simpleHit.normal;\r\n\r\n                            var d = Vector3.Dot(mv, _currentSurfaceNormal);\r\n                            if (d > 0f) mv -= _currentSurfaceNormal * d;\r\n\r\n                            if (hit.distance < _skinWidth)\r\n                            {\r\n                                _owner.transform.position += hit.normal * (_skinWidth - hit.distance);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            _onSurface = false;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        _onSurface = false;\r\n                    }\r\n\r\n                }\r\n\r\n\r\n                if (mv != Vector3.zero)\r\n                {\r\n                    Vector3 dir = mv.normalized;\r\n                    float dist = mv.magnitude;\r\n                    \r\n                    if (geom.Cast(dir, out hit, dist, mask))\r\n                    {\r\n                        //if (!bStayedGrounded)\r\n                        //{\r\n                        //    _onSurface = true;\r\n                        //    //update ground normal\r\n                        //    RaycastHit simpleHit;\r\n                        //    if (Physics.Raycast(hit.point + hit.normal, -hit.normal, out simpleHit, 1.01f, mask))\r\n                        //    {\r\n                        //        _currentSurfaceNormal = simpleHit.normal;\r\n                        //    }\r\n                        //}\r\n\r\n                        //var d = hit.distance - _skinWidth;\r\n                        //_owner.transform.position += dir * (d - _skinWidth * 0.5f);\r\n\r\n                        var a = Vector3.Angle(hit.normal, dir) - 90f;\r\n                        if(a < _stepOffset)\r\n                        {\r\n                            var d = Mathf.Max(hit.distance - _skinWidth * 0.5f, 0f);\r\n                            var nmv = dir * d;\r\n                            var adjust = Vector3.RotateTowards(hit.normal, dir, MathUtil.PI_2, 0f);\r\n                            _owner.transform.position += nmv + adjust * (dist - d);\r\n                        }\r\n                        else\r\n                        {\r\n                            _owner.transform.position += dir * hit.distance;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        _owner.transform.position += mv;\r\n                    }\r\n                }\r\n\r\n                ////NOTE - temp code until above is fixed\r\n                //_owner.transform.position += mv;\r\n\r\n                //update velocity\r\n                _vel = (_owner.transform.position - _owner.LastPosition) / Time.deltaTime;\r\n            }\r\n\r\n            public void AtypicalMove(Vector3 mv)\r\n            {\r\n\r\n            }\r\n\r\n            public void AddForce(Vector3 f, ForceMode mode)\r\n            {\r\n                switch (mode)\r\n                {\r\n                    case ForceMode.Force:\r\n                        //force = mass*distance/time^2\r\n                        //distance = force * time^2 / mass\r\n                        this.Move(f * Time.deltaTime * Time.deltaTime / _mass);\r\n                        break;\r\n                    case ForceMode.Acceleration:\r\n                        //acceleration = distance/time^2\r\n                        //distance = acceleration * time^2\r\n                        this.Move(f * (Time.deltaTime * Time.deltaTime));\r\n                        break;\r\n                    case ForceMode.Impulse:\r\n                        //impulse = mass*distance/time\r\n                        //distance = impulse * time / mass\r\n                        this.Move(f * Time.deltaTime / _mass);\r\n                        break;\r\n                    case ForceMode.VelocityChange:\r\n                        //velocity = distance/time\r\n                        //distance = velocity * time\r\n                        this.Move(f * Time.deltaTime);\r\n                        break;\r\n                }\r\n            }\r\n\r\n            public void AddForceAtPosition(Vector3 f, Vector3 pos, ForceMode mode)\r\n            {\r\n                this.AddForce(f, mode);\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IIGnorableCollision Interface\r\n\r\n            public void IgnoreCollision(Collider coll, bool ignore)\r\n            {\r\n                //TODO - not sure how we'll be doing this ignore physics...\r\n            }\r\n\r\n            public void IgnoreCollision(IIgnorableCollision coll, bool ignore)\r\n            {\r\n                //do nothing, we don't actually have any colliders\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Disposable Interface\r\n\r\n            private bool _isDisposed = false;\r\n\r\n            void System.IDisposable.Dispose()\r\n            {\r\n                if (!_isDisposed)\r\n                {\r\n                    _owner = null;\r\n                    _isDisposed = true;\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n         \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyMovement/Pathfinding/PathingMovementStyle.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Movement;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Pathfinding\r\n{\r\n\r\n    [RequireComponent(typeof(MovementMotor))]\r\n    public class PathingMovementStyle : DumbMovementStyle, IPathFollower\r\n    {\r\n\r\n        public enum PathingStatus\r\n        {\r\n            Invalid = 0,\r\n            Pathing = 1,\r\n            Complete = 2\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private float _speed = 1.0f;\r\n        [SerializeField]\r\n        [MinRange(0f)]\r\n        private float _waypointTolerance = 0.1f;\r\n        [SerializeField]\r\n        [Tooltip(\"If motion is truly 3d set this true, otherwise motion is calculated on a plane with y-up.\")]\r\n        private bool _motion3D = false;\r\n        [SerializeField]\r\n        private SPTime _timeSupplier;\r\n        \r\n        [System.NonSerialized]\r\n        private IPath _currentPath;\r\n        [System.NonSerialized]\r\n        private int _currentNode;\r\n        [System.NonSerialized]\r\n        private bool _paused;\r\n\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float Speed\r\n        {\r\n            get { return _speed; }\r\n            set { _speed = value; }\r\n        }\r\n\r\n        public float WaypointTolerance\r\n        {\r\n            get { return _waypointTolerance; }\r\n            set { _waypointTolerance = System.Math.Max(0f, value); }\r\n        }\r\n\r\n        public bool Motion3D\r\n        {\r\n            get { return _motion3D; }\r\n            set { _motion3D = value; }\r\n        }\r\n\r\n        public SPTime TimeSupplier\r\n        {\r\n            get { return _timeSupplier; }\r\n            set { _timeSupplier = value; }\r\n        }\r\n\r\n        public PathingStatus Status\r\n        {\r\n            get\r\n            {\r\n                if (_currentPath == null)\r\n                    return PathingStatus.Invalid;\r\n                else if (_currentPath.Status == PathCalculateStatus.Partial || _currentNode < _currentPath.Waypoints.Count)\r\n                    return PathingStatus.Pathing;\r\n                else\r\n                    return PathingStatus.Complete;\r\n            }\r\n        }\r\n\r\n        public IPath Path\r\n        {\r\n            get { return _currentPath; }\r\n        }\r\n\r\n        public int CurrentNodeIndex\r\n        {\r\n            get { return _currentNode; }\r\n            set\r\n            {\r\n                _currentNode = Mathf.Clamp(value, 0, _currentPath != null ? _currentPath.Waypoints.Count : 0);\r\n            }\r\n        }\r\n\r\n        public bool PathIsPaused\r\n        {\r\n            get { return _paused; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Returns zero vector if no waypoint.\r\n        /// </summary>\r\n        public Vector3 GetCurrentWaypoint()\r\n        {\r\n            if (_currentPath == null) return Vector3.zero;\r\n            int cnt = _currentPath.Waypoints.Count;\r\n            if (cnt == 0) return Vector3.zero;\r\n            if (_currentNode >= cnt) return _currentPath.Waypoints[cnt - 1];\r\n            return _currentPath.Waypoints[_currentNode];\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IPathFollower Interface\r\n\r\n        public bool IsTraversing\r\n        {\r\n            get\r\n            {\r\n                return _currentPath != null && !VectorUtil.NearZeroVector(this.Velocity);\r\n            }\r\n        }\r\n\r\n        public virtual void SetPath(IPath path)\r\n        {\r\n            if (path == null) throw new System.ArgumentNullException(\"path\");\r\n\r\n            _currentPath = path;\r\n            _currentNode = 0;\r\n        }\r\n\r\n        public virtual void ResetPath()\r\n        {\r\n            _currentPath = null;\r\n            _paused = false;\r\n        }\r\n\r\n        public virtual void ResumePath()\r\n        {\r\n            _paused = false;\r\n        }\r\n\r\n        public virtual void StopPath()\r\n        {\r\n            _paused = true;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IMovementStyle Interface\r\n        \r\n        protected override void UpdateMovement()\r\n        {\r\n            if (_paused || _currentPath == null) return;\r\n        Start:\r\n            switch(this.Status)\r\n            {\r\n                case PathingStatus.Invalid:\r\n                case PathingStatus.Complete:\r\n                    break;\r\n                case PathingStatus.Pathing:\r\n                    {\r\n                        Vector3 target = _currentPath.Waypoints[_currentNode];\r\n                        Vector3 pos = this.Position;\r\n                        Vector3 dir = target - pos;\r\n                        if (!_motion3D) dir.y = 0f;\r\n                        float dist = dir.sqrMagnitude;\r\n                        if (dist <= _waypointTolerance * _waypointTolerance)\r\n                        {\r\n                            _currentNode++;\r\n                            goto Start;\r\n                        }\r\n                        dir.Normalize();\r\n\r\n                        Vector3 mv = dir * _speed * _timeSupplier.Delta;\r\n                        if (mv.sqrMagnitude > dist)\r\n                        {\r\n                            _currentNode++;\r\n                        }\r\n\r\n                        this.Move(mv);\r\n                    }\r\n                    break;\r\n            }\r\n        }\r\n\r\n        \r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyMovement/Pathfinding/Unity/UnityPathAgentMovementStyle.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.AI;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Movement;\r\n\r\nnamespace com.spacepuppy.Pathfinding.Unity\r\n{\r\n    public class UnityPathAgentMovementStyle : PathingMovementStyle, IPathAgent\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private int _areaMask = -1;\r\n\r\n        [System.NonSerialized]\r\n        private UnityFromToPath _path;\r\n\r\n        #endregion\r\n\r\n        #region IPathAgent Interface\r\n\r\n        public IPathFactory PathFactory\r\n        {\r\n            get { return UnityPathFactory.Default; }\r\n        }\r\n\r\n        public bool ValidPath(IPath path)\r\n        {\r\n            return (path is UnityPath);\r\n        }\r\n\r\n        public void CalculatePath(IPath path)\r\n        {\r\n            if (!(path is UnityPath)) throw new PathArgumentException();\r\n\r\n            (path as UnityPath).CalculatePath(_areaMask);\r\n        }\r\n        \r\n        public virtual void PathTo(Vector3 target)\r\n        {\r\n            if (_path == null) _path = new UnityFromToPath(Vector3.zero, Vector3.zero);\r\n\r\n            _path.Start = this.entityRoot.transform.position;\r\n            _path.Target = target;\r\n            this.CalculatePath(_path);\r\n            this.SetPath(_path);\r\n        }\r\n\r\n        public virtual void PathTo(IPath path)\r\n        {\r\n            if (!(path is UnityPath)) throw new PathArgumentException();\r\n            \r\n            this.CalculatePath(path);\r\n            this.SetPath(path);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyMovement/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"SpacepuppyMovement\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"SpacepuppyMovement\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"e47403a8-45f5-4665-9121-35f5ec7d0526\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "SpacepuppyMovement/Scenario/i_ApplyForce.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy;\r\n//using com.spacepuppy.Movement;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class i_ApplyForce : TriggerableMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"TargetObject\")]\r\n        [TriggerableTargetObject.Config(typeof(GameObject))]\r\n        private TriggerableTargetObject _target = new TriggerableTargetObject();\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Force\")]\r\n        private ConfigurableForce _force = new ConfigurableForce();\r\n        [SerializeField()]\r\n        private bool _targetEntireEntity = true;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public TriggerableTargetObject Target\r\n        {\r\n            get { return _target; }\r\n        }\r\n\r\n        public ConfigurableForce Force\r\n        {\r\n            get { return _force; }\r\n        }\r\n\r\n        public bool TargetEntireEntity\r\n        {\r\n            get { return _targetEntireEntity; }\r\n            set { _targetEntireEntity = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region TriggerableMechanism Interface\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            var targ = _target.GetTarget<GameObject>(arg);\r\n            if (targ == null) return false;\r\n            if (_targetEntireEntity) targ = GameObjectUtil.FindRoot(targ);\r\n\r\n\r\n            MovementController controller;\r\n            if (targ.GetComponentInChildren<MovementController>(out controller))\r\n            {\r\n                //controller.AddForce(this.Force.GetForce(this.transform), this.Force.ForceMode);\r\n                this.Force.ApplyForce(this.transform, controller);\r\n                return true;\r\n            }\r\n            Rigidbody body;\r\n            if (targ.GetComponentInChildren<Rigidbody>(out body))\r\n            {\r\n                this.Force.ApplyForce(this.transform, body);\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyMovement/Scenario/i_ChangeMovementStyle.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Movement;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n    public class i_ChangeMovementStyle : AutoTriggerableMechanism\r\n    {\r\n\r\n        public enum ChangeMode\r\n        {\r\n            Change,\r\n            Stack,\r\n            Pop,\r\n            PopAll,\r\n            Purge\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField]\r\n        private MovementMotor _motor;\r\n        [SerializeField]\r\n        [TypeRestriction(typeof(IMovementStyle))]\r\n        private Component _movementStyle;\r\n        [SerializeField]\r\n        private ChangeMode _mode;\r\n        [SerializeField]\r\n        private float _precedence;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public MovementMotor Motor\r\n        {\r\n            get { return _motor; }\r\n            set { _motor = value; }\r\n        }\r\n\r\n        public IMovementStyle MovementStyle\r\n        {\r\n            get { return _movementStyle as IMovementStyle; }\r\n            set { _movementStyle = value as Component; }\r\n        }\r\n\r\n        public ChangeMode Mode\r\n        {\r\n            get { return _mode; }\r\n            set { _mode = value; }\r\n        }\r\n\r\n        public float Precedence\r\n        {\r\n            get { return _precedence; }\r\n            set { _precedence = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n            if (_motor == null) return false;\r\n            \r\n            try\r\n            {\r\n                switch(_mode)\r\n                {\r\n                    case ChangeMode.Change:\r\n                        {\r\n                            var style = this.MovementStyle;\r\n                            if (style == null) return false;\r\n\r\n                            if (_motor.States.Contains(style))\r\n                            {\r\n                                _motor.States.ChangeState(style, _precedence);\r\n                                return true;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case ChangeMode.Stack:\r\n                        {\r\n                            var style = this.MovementStyle;\r\n                            if (style == null) return false;\r\n\r\n                            if (_motor.States.Contains(style))\r\n                            {\r\n                                _motor.States.StackState(style, _precedence);\r\n                                return true;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case ChangeMode.Pop:\r\n                        {\r\n                            _motor.States.PopState(_precedence);\r\n                            return true;\r\n                        }\r\n                    case ChangeMode.PopAll:\r\n                        {\r\n                            _motor.States.PopAllStates(_precedence);\r\n                            return true;\r\n                        }\r\n                    case ChangeMode.Purge:\r\n                        {\r\n                            var style = this.MovementStyle;\r\n                            if (style == null) return false;\r\n\r\n                            if (_motor.States.Contains(style))\r\n                            {\r\n                                _motor.States.PurgeStackedState(style);\r\n                                return true;\r\n                            }\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n            catch(System.Exception ex)\r\n            {\r\n                Debug.LogException(ex);\r\n            }\r\n\r\n            return false;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyMovement/SpacepuppyMovement.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{801BD252-CE5C-45EA-B4DD-F7C3C13E0432}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>com.spacepuppy</RootNamespace>\r\n    <AssemblyName>SpacepuppyUnityFramework.Movement</AssemblyName>\r\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile>\r\n    </TargetFrameworkProfile>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"UnityEngine, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"ArmatureRig.cs\" />\r\n    <Compile Include=\"MovementController.cs\" />\r\n    <Compile Include=\"Movement\\DumbMovementStyle.cs\" />\r\n    <Compile Include=\"Movement\\Enums.cs\" />\r\n    <Compile Include=\"Movement\\IMotorConstraint.cs\" />\r\n    <Compile Include=\"Movement\\IMovementStyle.cs\" />\r\n    <Compile Include=\"Movement\\IMover.cs\" />\r\n    <Compile Include=\"Movement\\InjectedMovementStyle.cs\" />\r\n    <Compile Include=\"Movement\\MotorEvents.cs\" />\r\n    <Compile Include=\"Movement\\MovementMotor.cs\" />\r\n    <Compile Include=\"Movement\\MovementMotor2D.cs\" />\r\n    <Compile Include=\"Movement\\WaitForBeforeUpdateMovement.cs\" />\r\n    <Compile Include=\"Movement\\XYPlaneConstraint.cs\" />\r\n    <Compile Include=\"Pathfinding\\PathingMovementStyle.cs\" />\r\n    <Compile Include=\"Pathfinding\\Unity\\UnityPathAgentMovementStyle.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"Scenario\\i_ApplyForce.cs\" />\r\n    <Compile Include=\"Scenario\\i_ChangeMovementStyle.cs\" />\r\n    <Compile Include=\"Tween\\Accessors\\MovementControllerMoveAccessor.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\r\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\r\n      <Name>SpacepuppyBase</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppySerialization\\SpacepuppySerialization.csproj\">\r\n      <Project>{5dcfc7a9-b2b5-4a08-beb8-b2ced2457391}</Project>\r\n      <Name>SpacepuppySerialization</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>mkdir $(ProjectDir)..\\Builds\\FullLibrary\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.Movement.dll\" \"$(ProjectDir)..\\Builds\\FullLibrary\\SpacepuppyUnityFramework.Movement.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.Movement.pdb\" \"$(ProjectDir)..\\Builds\\FullLibrary\\SpacepuppyUnityFramework.Movement.pdb\"</PostBuildEvent>\r\n  </PropertyGroup>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "SpacepuppyMovement/Tween/Accessors/MovementControllerMoveAccessor.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Tween.Accessors\r\n{\r\n\r\n    /// <summary>\r\n    /// Subverts MoveAccessor.\r\n    /// </summary>\r\n    [CustomTweenMemberAccessor(typeof(MovementController), typeof(Vector3), \"Move\")]\r\n    [CustomTweenMemberAccessor(typeof(MovementController), typeof(Vector3), \"*Move\")]\r\n    [CustomTweenMemberAccessor(typeof(Rigidbody), typeof(Vector3), \"*Move\", priority=1)]\r\n    [CustomTweenMemberAccessor(typeof(GameObject), typeof(Vector3), \"*Move\", priority = 1)]\r\n    [CustomTweenMemberAccessor(typeof(Transform), typeof(Vector3), \"*Move\", priority = 1)]\r\n    [CustomTweenMemberAccessor(typeof(IGameObjectSource), typeof(Vector3), \"*Move\", priority = 1)]\r\n    public class MovementControllerMoveAccessor : ITweenMemberAccessor\r\n    {\r\n        \r\n        #region Fields\r\n\r\n        private bool _atypicalMove;\r\n\r\n        #endregion\r\n        \r\n        #region Properties\r\n\r\n        public bool UseAtypicalMove\r\n        {\r\n            get { return _atypicalMove; }\r\n            set { _atypicalMove = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ImplicitCurve Interface\r\n\r\n        public System.Type GetMemberType()\r\n        {\r\n            return typeof(Vector3);\r\n        }\r\n\r\n        public System.Type Init(object target, string propName, string args)\r\n        {\r\n            _atypicalMove = ConvertUtil.ToBool(args);\r\n            return typeof(Vector3);\r\n        }\r\n\r\n        public object Get(object target)\r\n        {\r\n            var t = GameObjectUtil.GetTransformFromSource(target);\r\n            if(t != null)\r\n            {\r\n                return t.position;\r\n            }\r\n            return Vector3.zero;\r\n        }\r\n\r\n        public void Set(object targ, object valueObj)\r\n        {\r\n            var value = ConvertUtil.ToVector3(valueObj);\r\n\r\n            var controller = targ as MovementController;\r\n            if (controller != null && !controller.IsPaused)\r\n            {\r\n                var pos = controller.transform.position;\r\n                if (_atypicalMove)\r\n                    controller.AtypicalMove(value - pos);\r\n                else\r\n                    controller.Move(value - pos);\r\n            }\r\n            else if (targ is Rigidbody)\r\n            {\r\n                var rb = targ as Rigidbody;\r\n                rb.MovePosition(value - rb.position);\r\n            }\r\n            else\r\n            {\r\n                var trans = GameObjectUtil.GetTransformFromSource(targ);\r\n                if (trans == null) return;\r\n\r\n                controller = trans.GetComponent<MovementController>();\r\n                if (controller != null && !controller.IsPaused)\r\n                {\r\n                    var pos = trans.position;\r\n                    if (_atypicalMove)\r\n                        controller.AtypicalMove(value - pos);\r\n                    else\r\n                        controller.Move(value - pos);\r\n                    return;\r\n                }\r\n\r\n                var rb = trans.GetComponent<Rigidbody>();\r\n                if (rb != null && !rb.isKinematic)\r\n                {\r\n                    var dp = value - rb.position;\r\n                    rb.velocity = dp / Time.fixedDeltaTime;\r\n                    return;\r\n                }\r\n\r\n                //just update the position\r\n                trans.position = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyMovementEditor/Movement/ArmatureRigInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Movement\r\n{\r\n\r\n    [CustomEditor(typeof(ArmatureRig), true)]\r\n    public class ArmatureRigInspector : SPEditor\r\n    {\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n            var targ = this.target as ArmatureRig;\r\n\r\n            this.DrawDefaultInspectorExcept(\"Joints\");\r\n\r\n            var cache = SPGUI.Disable();\r\n            EditorGUILayout.FloatField(\"Mass\", targ.CalculateMass());\r\n            cache.Reset();\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            Rigidbody rootJoint = EditorGUILayout.ObjectField(\"Root Joint\", targ.RootJoint, typeof(Rigidbody), true) as Rigidbody;\r\n            if (EditorGUI.EndChangeCheck())\r\n            {\r\n                if (rootJoint != null)\r\n                {\r\n                    if (targ.JointCount == 0)\r\n                    {\r\n                        targ.SetJoints(new Rigidbody[] { rootJoint });\r\n                    }\r\n                    else\r\n                    {\r\n                        using (var lst = TempCollection.GetList<Rigidbody>(targ.Joints))\r\n                        {\r\n                            lst.Remove(rootJoint);\r\n                            lst.Insert(0, rootJoint);\r\n                            targ.SetJoints(lst);\r\n                        }\r\n                    }\r\n\r\n                    this.serializedObject.Update();\r\n                }\r\n            }\r\n\r\n            this.DrawPropertyField(\"Joints\", true);\r\n\r\n            //TODO - implement a button that allows removing and setting the bones of the rig\r\n\r\n            EditorGUILayout.Separator();\r\n\r\n            if (GUILayout.Button(\"Build Ragdoll Rig\"))\r\n            {\r\n                //EditorApplication.ExecuteMenuItem(\"GameObject/Create Other/Ragdoll...\");\r\n                com.spacepuppyeditor.Base.SPCreateRagdollWizard.StartWizard();\r\n            }\r\n\r\n            if (GUILayout.Button(\"Generate Joint List\"))\r\n            {\r\n                targ.ReloadJointList();\r\n                targ.LoadJointListOnStart = false;\r\n                this.serializedObject.Update();\r\n            }\r\n\r\n            bool bIsKinematic = false;\r\n            if (targ.Joints.Count() > 0) bIsKinematic = targ.Joints.First().isKinematic;\r\n            string msg = (bIsKinematic) ? \"Set Joints Not Kinematic\" : \"Set Joints Kinematic\";\r\n            if (GUILayout.Button(msg))\r\n            {\r\n                targ.SetJointsKinematic(!bIsKinematic);\r\n            }\r\n\r\n            if (GUILayout.Button(\"Try Clear Ragdoll Rig\"))\r\n            {\r\n                if (EditorUtility.DisplayDialog(\"WARNING!\", \"Are you sure you want to clear rig?\", \"Yes\", \"No\"))\r\n                {\r\n                    //foreach (var t in targ.GetAllChildrenAndSelf())\r\n                    //{\r\n                    //    if (t.HasComponent<CharacterJoint>())\r\n                    //    {\r\n                    //        DestroyImmediate(t.GetComponent<CharacterJoint>());\r\n                    //        DestroyImmediate(t.GetComponent<Collider>());\r\n                    //        DestroyImmediate(t.GetComponent<Rigidbody>());\r\n                    //    }\r\n                    //}\r\n                    targ.ReloadJointList();\r\n                    foreach(var j in targ.Joints)\r\n                    {\r\n                        if (j.HasComponent<CharacterJoint>()) DestroyImmediate(j.GetComponent<CharacterJoint>());\r\n                        DestroyImmediate(j.GetComponent<Collider>());\r\n                        DestroyImmediate(j);\r\n                    }\r\n                    targ.SetJoints(null);\r\n                    this.serializedObject.Update();\r\n                }\r\n            }\r\n\r\n            if (GUILayout.Button(\"Clear Defined Joints\"))\r\n            {\r\n                if (targ.Joints.Count() > 0)\r\n                {\r\n                    if (EditorUtility.DisplayDialog(\"WARNING!\", \"Are you sure you want to clear all defined joints?\", \"Yes\", \"No\"))\r\n                    {\r\n                        foreach (var j in targ.Joints)\r\n                        {\r\n                            var go = j.gameObject;\r\n                            DestroyImmediate(go.GetComponent<CharacterJoint>());\r\n                            DestroyImmediate(go.GetComponent<Collider>());\r\n                            DestroyImmediate(go.GetComponent<Rigidbody>());\r\n                        }\r\n                    }\r\n\r\n                    targ.SetJoints(null);\r\n                    this.serializedObject.Update();\r\n                }\r\n            }\r\n\r\n            if (Application.isPlaying)\r\n            {\r\n                GUILayout.Space(10);\r\n\r\n                if (!targ.Ragdolled)\r\n                {\r\n                    if (GUILayout.Button(\"Ragdoll...\"))\r\n                    {\r\n                        targ.Ragdoll();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (GUILayout.Button(\"Undo Ragdoll...\"))\r\n                    {\r\n                        targ.UndoRagdoll();\r\n                    }\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyMovementEditor/Movement/MovementControllerInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\n\r\nusing com.spacepuppy;\r\n\r\nnamespace com.spacepuppyeditor.Movement\r\n{\r\n\r\n    [CustomEditor(typeof(MovementController))]\r\n    public class MovementControllerInspector : SPEditor\r\n    {\r\n\r\n        public enum GameObjectMoverType\r\n        {\r\n            Unknown = -1,\r\n            CharacterController = 0,\r\n            SimulatedRigidbody = 1,\r\n            DirectRigidbody = 2,\r\n            DumbMover = 3,\r\n            Ragdoll = 4,\r\n            Emulated = 5\r\n        }\r\n\r\n        #region Properties\r\n\r\n        public new MovementController target { get { return base.target as MovementController; } }\r\n\r\n        #endregion\r\n\r\n        #region Inspector\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            //deal with regular serialized properties\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(\"_resetVelocityOnNoMove\", EditorHelper.TempContent(\"Reset Velocity On No Move\", \"By default, if move is not called in an update cycle, the velocity before hand is conserved. If this is true, then if move is not called we reset the velocity to zero. Note - adding force is considered moving, where as teleporting is not.\"), false);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n\r\n            //deal with the special movertype\r\n            this.DrawMoverType();\r\n\r\n            if (Application.isPlaying)\r\n            {\r\n                if (this.target.Mover != null)\r\n                {\r\n                    EditorGUILayout.HelpBox(\"Currently active mover type is '\" + this.target.Mover.GetType().Name + \"'.\", MessageType.Info);\r\n                }\r\n                else\r\n                {\r\n                    EditorGUILayout.HelpBox(\"Currently active mover type is null.\", MessageType.Info);\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n\r\n        private void DrawMoverType()\r\n        {\r\n            EditorGUI.BeginChangeCheck();\r\n\r\n            var targ = this.target as MovementController;\r\n            var oldTp = GetMoverType(targ.Mover);\r\n            var tp = (GameObjectMoverType)EditorGUILayout.EnumPopup(EditorHelper.TempContent(\"Mover Type\"), oldTp);\r\n            if (tp != oldTp)\r\n            {\r\n                GUI.changed = true;\r\n                if (tp == GameObjectMoverType.Unknown)\r\n                {\r\n                    //bad\r\n                }\r\n                else\r\n                {\r\n                    var mover = BuildMover(tp);\r\n                    if(targ.Mover != null)\r\n                    {\r\n                        mover.Mass = targ.Mover.Mass;\r\n                        mover.StepOffset = targ.Mover.StepOffset;\r\n                        mover.SkinWidth = targ.Mover.SkinWidth;\r\n                    }\r\n                    targ.ChangeMover(mover);\r\n                }\r\n            }\r\n\r\n            GUIContent label;\r\n            if (targ.Mover != null)\r\n            {\r\n                switch (tp)\r\n                {\r\n                    case GameObjectMoverType.CharacterController:\r\n                        {\r\n                            EditorGUILayout.LabelField(EditorHelper.TempContent(\"Prefers Fixed Update\"), new GUIContent(targ.Mover.PrefersFixedUpdate.ToString()));\r\n\r\n                            label = new GUIContent(\"Mass\", \"Since CharacterControllers don't have mass, this represents mass for when calculating AddForce for the motor.\");\r\n                            targ.Mover.Mass = EditorGUILayout.FloatField(label, targ.Mover.Mass);\r\n\r\n                            label = new GUIContent(\"Skin Width\", \"CharacterController 'skinWidth' property isn't directly accessible in code. This should be set to be at least the same as the CharacterController's skinWidth.\");\r\n                            targ.Mover.SkinWidth = EditorGUILayout.FloatField(label, targ.Mover.SkinWidth);\r\n                        }\r\n                        break;\r\n                    case GameObjectMoverType.SimulatedRigidbody:\r\n                        {\r\n                            (targ.Mover as MovementController.SimulatedRigidbodyMover).PrefersFixedUpdate = EditorGUILayout.Toggle(EditorHelper.TempContent(\"Prefers Fixed Update\"), targ.Mover.PrefersFixedUpdate);\r\n\r\n                            //label = new GUIContent(\"Mass\", \"CharacterControllers don't have mass by default, so this acts as the mass.\");\r\n                            //targ.Mover.Mass = EditorGUILayout.FloatField(label, targ.Mover.Mass);\r\n\r\n                            label = new GUIContent(\"Skin Width\", \"Since Rigidbodies don't have skin, this acts as the skinWidth used by various motors and resolvers.\");\r\n                            targ.Mover.SkinWidth = EditorGUILayout.FloatField(label, targ.Mover.SkinWidth);\r\n\r\n                            label = new GUIContent(\"Step Offset\", \"CharacterController 'stepOffset' property isn't directly accessible in code. This should be set to be at least the same as the CharacterController's stepOffset.\");\r\n                            targ.Mover.StepOffset = EditorGUILayout.FloatField(label, targ.Mover.StepOffset);\r\n                        }\r\n                        break;\r\n                    case GameObjectMoverType.DirectRigidbody:\r\n                        {\r\n                            label = new GUIContent(\"Prefers Fixed Update\");\r\n                            EditorGUILayout.LabelField(label, new GUIContent(targ.Mover.PrefersFixedUpdate.ToString()));\r\n\r\n                            //label = new GUIContent(\"Mass\", \"CharacterControllers don't have mass by default, so this acts as the mass.\");\r\n                            //targ.Mover.Mass = EditorGUILayout.FloatField(label, targ.Mover.Mass);\r\n\r\n                            label = new GUIContent(\"Skin Width\", \"Since Rigidbodies don't have skin, this acts as the skinWidth used by various motors and resolvers.\");\r\n                            targ.Mover.SkinWidth = EditorGUILayout.FloatField(label, targ.Mover.SkinWidth);\r\n\r\n                            label = new GUIContent(\"Step Offset\", \"CharacterController 'stepOffset' property isn't directly accessible in code. This should be set to be at least the same as the CharacterController's stepOffset.\");\r\n                            targ.Mover.StepOffset = EditorGUILayout.FloatField(label, targ.Mover.StepOffset);\r\n\r\n                            label = new GUIContent(\"Free Movement\", \"When FreeMovement is true, then Unity Physics takes over if Move isn't called. This is useful for things like debris.\");\r\n                            (targ.Mover as MovementController.DirectRigidBodyMover).FreeMovement = EditorGUILayout.Toggle(label, (targ.Mover as MovementController.DirectRigidBodyMover).FreeMovement);\r\n                        }\r\n                        break;\r\n                    case GameObjectMoverType.DumbMover:\r\n                        {\r\n                            label = new GUIContent(\"Prefers Fixed Update\");\r\n                            EditorGUILayout.LabelField(label, new GUIContent(targ.Mover.PrefersFixedUpdate.ToString()));\r\n                        }\r\n                        break;\r\n\r\n                    case GameObjectMoverType.Ragdoll:\r\n                        //nothing is drawn\r\n                        break;\r\n\r\n                    case GameObjectMoverType.Emulated:\r\n                        {\r\n                            var mover = targ.Mover as MovementController.EmulatedCharacterControllerBodyMover;\r\n\r\n                            label = new GUIContent(\"Mass\", \"CharacterControllers don't have mass by default, so this acts as the mass.\");\r\n                            mover.Mass = EditorGUILayout.FloatField(label, targ.Mover.Mass);\r\n\r\n                            label = new GUIContent(\"Skin Width\", \"Since Rigidbodies don't have skin, this acts as the skinWidth used by various motors and resolvers.\");\r\n                            mover.SkinWidth = EditorGUILayout.FloatField(label, targ.Mover.SkinWidth);\r\n\r\n                            label = new GUIContent(\"Step Offset\", \"CharacterController 'stepOffset' property isn't directly accessible in code. This should be set to be at least the same as the CharacterController's stepOffset.\");\r\n                            mover.StepOffset = EditorGUILayout.FloatField(label, targ.Mover.StepOffset);\r\n                            \r\n                            var geom = mover.Geom;\r\n                            var c = geom.Center;\r\n                            var r = geom.Radius;\r\n                            var h = geom.Height;\r\n\r\n                            c = EditorGUILayout.Vector3Field(EditorHelper.TempContent(\"Center\"), c);\r\n                            r = EditorGUILayout.FloatField(EditorHelper.TempContent(\"Radius\"), r);\r\n                            h = EditorGUILayout.FloatField(EditorHelper.TempContent(\"Height\"), h);\r\n                            mover.Geom = new spacepuppy.Geom.Capsule(c, Vector3.up, h, r);\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                EditorGUILayout.LabelField(\"ERROR: Failed to configure for selected MoverType.\");\r\n            }\r\n\r\n            if (EditorGUI.EndChangeCheck())\r\n                EditorUtility.SetDirty(targ);\r\n        }\r\n\r\n\r\n\r\n        private void DrawMoverType_Old()\r\n        {\r\n            var targ = this.target as MovementController;\r\n            var oldTp = GetMoverType(targ.Mover);\r\n            var tp = (GameObjectMoverType)EditorGUILayout.EnumPopup(EditorHelper.TempContent(\"Mover Type\"), oldTp);\r\n            if (tp != oldTp)\r\n            {\r\n                if (tp == GameObjectMoverType.Unknown)\r\n                {\r\n                    //bad\r\n                }\r\n                else\r\n                {\r\n                    targ.ChangeMover(BuildMover(tp));\r\n                }\r\n            }\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n\r\n            GUIContent label;\r\n            if (targ.Mover != null)\r\n            {\r\n                bool bSetDirty = false;\r\n                switch (tp)\r\n                {\r\n                    case GameObjectMoverType.CharacterController:\r\n                        label = new GUIContent(\"Prefers Fixed Update\");\r\n                        EditorGUILayout.LabelField(EditorHelper.TempContent(\"Prefers Fixed Update\"), new GUIContent(targ.Mover.PrefersFixedUpdate.ToString()));\r\n\r\n                        label = new GUIContent(\"Mass\", \"Since CharacterControllers don't have mass, this represents mass for when calculating AddForce for the motor.\");\r\n                        var ccMass = EditorGUILayout.FloatField(label, targ.Mover.Mass);\r\n                        if (ccMass != targ.Mover.Mass)\r\n                        {\r\n                            targ.Mover.Mass = ccMass;\r\n                            bSetDirty = true;\r\n                        }\r\n\r\n                        label = new GUIContent(\"Skin Width\", \"CharacterController 'skinWidth' property isn't directly accessible in code. This should be set to be at least the same as the CharacterController's skinWidth.\");\r\n                        var ccSkinWidth = EditorGUILayout.FloatField(label, targ.Mover.SkinWidth);\r\n                        if (ccSkinWidth != targ.Mover.SkinWidth)\r\n                        {\r\n                            targ.Mover.SkinWidth = ccSkinWidth;\r\n                            bSetDirty = true;\r\n                        }\r\n\r\n                        break;\r\n                    case GameObjectMoverType.SimulatedRigidbody:\r\n                        label = new GUIContent(\"Prefers Fixed Update\");\r\n                        (targ.Mover as MovementController.SimulatedRigidbodyMover).PrefersFixedUpdate = EditorGUILayout.Toggle(label, targ.Mover.PrefersFixedUpdate);\r\n\r\n                        //label = new GUIContent(\"Mass\", \"CharacterControllers don't have mass by default, so this acts as the mass.\");\r\n                        //targ.Mover.Mass = EditorGUILayout.FloatField(label, targ.Mover.Mass);\r\n\r\n                        label = new GUIContent(\"Skin Width\", \"Since Rigidbodies don't have skin, this acts as the skinWidth used by various motors and resolvers.\");\r\n                        var srSkinWidth = EditorGUILayout.FloatField(label, targ.Mover.SkinWidth);\r\n                        if (srSkinWidth != targ.Mover.SkinWidth)\r\n                        {\r\n                            targ.Mover.SkinWidth = srSkinWidth;\r\n                            bSetDirty = true;\r\n                        }\r\n\r\n                        label = new GUIContent(\"Step Offset\", \"CharacterController 'stepOffset' property isn't directly accessible in code. This should be set to be at least the same as the CharacterController's stepOffset.\");\r\n                        var srStepOffset = EditorGUILayout.FloatField(label, targ.Mover.StepOffset);\r\n                        if (srStepOffset != targ.Mover.StepOffset)\r\n                        {\r\n                            targ.Mover.StepOffset = srStepOffset;\r\n                            bSetDirty = true;\r\n                        }\r\n\r\n                        break;\r\n                    case GameObjectMoverType.DirectRigidbody:\r\n                        label = new GUIContent(\"Prefers Fixed Update\");\r\n                        EditorGUILayout.LabelField(label, new GUIContent(targ.Mover.PrefersFixedUpdate.ToString()));\r\n\r\n                        //label = new GUIContent(\"Mass\", \"CharacterControllers don't have mass by default, so this acts as the mass.\");\r\n                        //targ.Mover.Mass = EditorGUILayout.FloatField(label, targ.Mover.Mass);\r\n\r\n                        label = new GUIContent(\"Skin Width\", \"Since Rigidbodies don't have skin, this acts as the skinWidth used by various motors and resolvers.\");\r\n                        var drSkinWidth = EditorGUILayout.FloatField(label, targ.Mover.SkinWidth);\r\n                        if (drSkinWidth != targ.Mover.SkinWidth)\r\n                        {\r\n                            targ.Mover.SkinWidth = drSkinWidth;\r\n                            bSetDirty = true;\r\n                        }\r\n\r\n                        label = new GUIContent(\"Step Offset\", \"CharacterController 'stepOffset' property isn't directly accessible in code. This should be set to be at least the same as the CharacterController's stepOffset.\");\r\n                        var drStepOffset = EditorGUILayout.FloatField(label, targ.Mover.StepOffset);\r\n                        if (drStepOffset != targ.Mover.StepOffset)\r\n                        {\r\n                            targ.Mover.StepOffset = drStepOffset;\r\n                            bSetDirty = true;\r\n                        }\r\n\r\n                        label = new GUIContent(\"Free Movement\", \"When FreeMovement is true, then Unity Physics takes over if Move isn't called. This is useful for things like debris.\");\r\n                        var drFreeMove = EditorGUILayout.Toggle(label, (targ.Mover as MovementController.DirectRigidBodyMover).FreeMovement);\r\n                        if (drFreeMove != (targ.Mover as MovementController.DirectRigidBodyMover).FreeMovement)\r\n                        {\r\n                            (targ.Mover as MovementController.DirectRigidBodyMover).FreeMovement = drFreeMove;\r\n                            bSetDirty = true;\r\n                        }\r\n\r\n                        break;\r\n                    case GameObjectMoverType.DumbMover:\r\n                        label = new GUIContent(\"Prefers Fixed Update\");\r\n                        EditorGUILayout.LabelField(label, new GUIContent(targ.Mover.PrefersFixedUpdate.ToString()));\r\n\r\n                        break;\r\n\r\n                    case GameObjectMoverType.Ragdoll:\r\n                        //nothing is drawn\r\n                        break;\r\n                }\r\n\r\n                if (bSetDirty) EditorUtility.SetDirty(targ);\r\n            }\r\n            else\r\n            {\r\n                EditorGUILayout.LabelField(\"ERROR: Failed to configure for selected MoverType.\");\r\n            }\r\n\r\n            if (EditorGUI.EndChangeCheck())\r\n                EditorUtility.SetDirty(targ);\r\n        }\r\n\r\n\r\n        #endregion\r\n\r\n        #region Utils\r\n\r\n        public static GameObjectMoverType GetMoverType(MovementController.IGameObjectMover mover)\r\n        {\r\n            if (mover is MovementController.CharacterControllerMover)\r\n            {\r\n                return GameObjectMoverType.CharacterController;\r\n            }\r\n            else if (mover is MovementController.SimulatedRigidbodyMover)\r\n            {\r\n                return GameObjectMoverType.SimulatedRigidbody;\r\n            }\r\n            else if (mover is MovementController.DirectRigidBodyMover)\r\n            {\r\n                return GameObjectMoverType.DirectRigidbody;\r\n            }\r\n            else if (mover is MovementController.DumbMover)\r\n            {\r\n                return GameObjectMoverType.DumbMover;\r\n            }\r\n            else if (mover is MovementController.RagdollBodyMover)\r\n            {\r\n                return GameObjectMoverType.Ragdoll;\r\n            }\r\n            else if (mover is MovementController.EmulatedCharacterControllerBodyMover)\r\n            {\r\n                return GameObjectMoverType.Emulated;\r\n            }\r\n            else\r\n            {\r\n                return GameObjectMoverType.Unknown;\r\n            }\r\n        }\r\n\r\n        public static MovementController.IGameObjectMover BuildMover(GameObjectMoverType tp)\r\n        {\r\n            switch (tp)\r\n            {\r\n                case GameObjectMoverType.CharacterController:\r\n                    return new MovementController.CharacterControllerMover();\r\n                case GameObjectMoverType.SimulatedRigidbody:\r\n                    return new MovementController.SimulatedRigidbodyMover();\r\n                case GameObjectMoverType.DirectRigidbody:\r\n                    return new MovementController.DirectRigidBodyMover();\r\n                case GameObjectMoverType.DumbMover:\r\n                    return new MovementController.DumbMover();\r\n                case GameObjectMoverType.Ragdoll:\r\n                    return new MovementController.RagdollBodyMover();\r\n                case GameObjectMoverType.Emulated:\r\n                    return new MovementController.EmulatedCharacterControllerBodyMover();\r\n                default:\r\n                    throw new System.InvalidOperationException(\"Unknown GameObjectMoverType is an invalid selection.\");\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyMovementEditor/Movement/MovementMotorInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Movement;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Movement\r\n{\r\n\r\n    [CustomEditor(typeof(MovementMotor), true)]\r\n    public class MovementMotorInspector : SPEditor\r\n    {\r\n\r\n        #region Properties\r\n\r\n        public new MovementMotor target { get { return base.target as MovementMotor; } }\r\n\r\n        #endregion\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n            this.DrawDefaultInspectorExcept(\"_defaultMovementStyle\");\r\n            this.serializedObject.ApplyModifiedProperties();\r\n\r\n            var ids = new List<string>();\r\n            ids.Add(\"None\");\r\n            ids.AddRange(from c in this.target.GetComponents<IMovementStyle>() select c.GetType().Name);\r\n\r\n            int i = (target.DefaultMovementStyle != null) ? ids.IndexOf(target.DefaultMovementStyle.GetType().Name) : -1;\r\n            if (i < 0) i = 0;\r\n\r\n            EditorGUI.BeginChangeCheck();\r\n            i = EditorGUILayout.Popup(\"Default Movement Style\", i, ids.ToArray());\r\n            if (EditorGUI.EndChangeCheck())\r\n            {\r\n                if (i < 0) i = 0;\r\n\r\n                if (i == 0)\r\n                {\r\n                    target.DefaultMovementStyle = null;\r\n                }\r\n                else\r\n                {\r\n                    var id = ids[i];\r\n                    target.DefaultMovementStyle = (from c in this.target.GetComponents<IMovementStyle>() where c.GetType().Name == id select c).FirstOrDefault();\r\n                }\r\n\r\n                this.serializedObject.Update();\r\n            }\r\n\r\n\r\n\r\n\r\n\r\n\r\n            if(Application.isPlaying && this.target.States != null)\r\n            {\r\n                if(this.target.States.Current != null)\r\n                {\r\n                    EditorGUILayout.HelpBox(\"Currently active style is '\" + this.target.States.Current.GetType().Name + \"'.\", MessageType.Info);\r\n                }\r\n                else\r\n                {\r\n                    EditorGUILayout.HelpBox(\"Currently active style is null.\", MessageType.Info);\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n        public override bool RequiresConstantRepaint()\r\n        {\r\n            return Application.isPlaying;\r\n        }\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyMovementEditor/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"SpacepuppyMovementEditor\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"SpacepuppyMovementEditor\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"88562855-3e6f-45ff-8bd1-6fbf38a621d5\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "SpacepuppyMovementEditor/SpacepuppyMovementEditor.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{59748E9F-0D22-418A-9712-980DC053D5B5}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>com.spacepuppyeditor</RootNamespace>\r\n    <AssemblyName>SpacepuppyUnityFrameworkEditor.Movement</AssemblyName>\r\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile>\r\n    </TargetFrameworkProfile>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"UnityEditor, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEditor.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"UnityEngine, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Movement\\ArmatureRigInspector.cs\" />\r\n    <Compile Include=\"Movement\\MovementControllerInspector.cs\" />\r\n    <Compile Include=\"Movement\\MovementMotorInspector.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\SpacepuppyBaseEditor\\SpacepuppyBaseEditor.csproj\">\r\n      <Project>{a0466ee3-9582-4c0d-965d-e2d2f9006971}</Project>\r\n      <Name>SpacepuppyBaseEditor</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\r\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\r\n      <Name>SpacepuppyBase</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppyMovement\\SpacepuppyMovement.csproj\">\r\n      <Project>{801bd252-ce5c-45ea-b4dd-f7c3c13e0432}</Project>\r\n      <Name>SpacepuppyMovement</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>mkdir $(ProjectDir)..\\Builds\\FullLibrary\\Editor\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.Movement.dll\" \"$(ProjectDir)..\\Builds\\FullLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.Movement.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.Movement.pdb\" \"$(ProjectDir)..\\Builds\\FullLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.Movement.pdb\"</PostBuildEvent>\r\n  </PropertyGroup>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "SpacepuppySerialization/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"SpacepuppySerialization\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"SpacepuppySerialization\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"5dcfc7a9-b2b5-4a08-beb8-b2ced2457391\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/IPersistantUnityObject.cs",
    "content": "﻿\r\nusing System.Runtime.Serialization;\r\n\r\nusing com.spacepuppy.Project;\r\n\r\nnamespace com.spacepuppy.Serialization\r\n{\r\n\r\n    /// <summary>\r\n    /// Allows serializing UnityObjects in a persistant manner at runtime. \r\n    /// This can be used in game save files to serialize an entity that is based \r\n    /// on some prefab. \r\n    /// \r\n    /// Any script that needs to save persistant data will have the messages called \r\n    /// on it with a SerializationInfo to either store its state in, or to retrieve \r\n    /// its state from. \r\n    /// </summary>\r\n    public interface IPersistantUnityObject\r\n    {\r\n\r\n        void OnSerialize(SerializationInfo info, StreamingContext context);\r\n\r\n        void OnDeserialize(SerializationInfo info, StreamingContext context, IAssetBundle assetBundle);\r\n\r\n    }\r\n\r\n    public interface IPersistantAsset : IPersistantUnityObject\r\n    {\r\n\r\n        string AssetId { get; }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/Json/JsonException.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Serialization.Json\r\n{\r\n    public class JsonException : System.Exception\r\n    {\r\n\r\n        public JsonException(string msg) : base(msg)\r\n        {\r\n\r\n        }\r\n\r\n        public JsonException(string msg, System.Exception innerException) : base(msg, innerException)\r\n        {\r\n\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/Json/JsonFormatter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Reflection;\r\nusing System.Runtime.Serialization;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Serialization.Json\r\n{\r\n\r\n    /// <summary>\r\n    /// Serialize/Deserialize objects to json.\r\n    /// \r\n    /// This currently does not support ObjectManager and therefore does not do object matching for equal object references. Rather it works more like Unity's serialization library where all ref types are treated uniquelly.\r\n    /// \r\n    /// TODO: implement ObjectManager to allow object identity to be maintained.\r\n    /// </summary>\r\n    public class JsonFormatter : IFormatter\r\n    {\r\n\r\n        private const string ID_TYPE = \"@type\";\r\n\r\n        #region Fields\r\n\r\n        private JsonReader _reader;\r\n        private JsonWriter _writer;\r\n\r\n        private IFormatterConverter _converter;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public JsonFormatter()\r\n        {\r\n            this.Context = new StreamingContext(StreamingContextStates.All);\r\n        }\r\n\r\n        public JsonFormatter(ISurrogateSelector selector, StreamingContext context)\r\n        {\r\n            this.SurrogateSelector = selector;\r\n            this.Context = context;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IFormatterConverter Converter\r\n        {\r\n            get { return _converter; }\r\n            set\r\n            {\r\n                if (value == null) throw new ArgumentNullException(\"value\");\r\n                _converter = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IFormatter Interface\r\n\r\n        public SerializationBinder Binder\r\n        {\r\n            get;\r\n            set;\r\n        }\r\n\r\n        public StreamingContext Context\r\n        {\r\n            get;\r\n            set;\r\n        }\r\n\r\n        public ISurrogateSelector SurrogateSelector\r\n        {\r\n            get;\r\n            set;\r\n        }\r\n\r\n        public void Serialize(Stream serializationStream, object graph)\r\n        {\r\n            if (serializationStream == null) throw new System.ArgumentNullException(\"serializationStream\");\r\n            if (graph == null) throw new System.ArgumentNullException(\"graph\");\r\n\r\n            if (_writer == null) _writer = new JsonWriter();\r\n            if (this.Converter == null) this.Converter = new FormatterConverter();\r\n\r\n            var writer = new StreamWriter(serializationStream);\r\n\r\n            try\r\n            {\r\n                _writer.Init(writer);\r\n\r\n                this.WriteObject(graph);\r\n            }\r\n            catch (SerializationException ex)\r\n            {\r\n                throw ex;\r\n            }\r\n            catch (System.Exception ex)\r\n            {\r\n                throw new SerializationException(\"Object graph is malformed.\", ex);\r\n            }\r\n            finally\r\n            {\r\n                writer.Flush();\r\n                _writer.Clear();\r\n            }\r\n        }\r\n\r\n        private void WriteObject(object graph)\r\n        {\r\n            var tp = graph.GetType();\r\n\r\n            ISerializationSurrogate surrogate;\r\n            ISurrogateSelector selector;\r\n            if (this.SurrogateSelector != null && (surrogate = this.SurrogateSelector.GetSurrogate(tp, this.Context, out selector)) != null)\r\n            {\r\n                var si = new SerializationInfo(tp, this.Converter);\r\n                //if (tp.IsPrimitive)\r\n                //    surrogate.GetObjectData(graph, si, this.Context);\r\n                surrogate.GetObjectData(graph, si, this.Context);\r\n\r\n                this.WriteFromSerializationInfo(si);\r\n            }\r\n            else if(graph is ISerializable)\r\n            {\r\n                if(!tp.IsSerializable)\r\n                    throw new SerializationException(string.Format(\"{0} {1} is a non-serializable type.\", tp.FullName, tp.Assembly.FullName));\r\n\r\n                var si = new SerializationInfo(tp, this.Converter);\r\n                ((ISerializable)graph).GetObjectData(si, this.Context);\r\n\r\n                this.WriteFromSerializationInfo(si);\r\n            }\r\n            else\r\n            {\r\n                _writer.WriteStartObject();\r\n                _writer.WritePropertyName(ID_TYPE);\r\n                _writer.WriteValue(tp.FullName);\r\n\r\n                var members = FormatterServices.GetSerializableMembers(graph.GetType(), Context);\r\n                var objs = FormatterServices.GetObjectData(graph, members);\r\n\r\n                for (int i = 0; i < objs.Length; i++)\r\n                {\r\n                    _writer.WritePropertyName(members[i].Name);\r\n                    if (objs[i] == null)\r\n                    {\r\n                        _writer.WriteValue(null);\r\n                        continue;\r\n                    }\r\n                    else\r\n                    {\r\n                        this.WriteValue(objs[i]);\r\n                    }\r\n                }\r\n\r\n                _writer.WriteEndObject();\r\n            }\r\n        }\r\n\r\n        private void WriteValue(object value)\r\n        {\r\n            if (value == null)\r\n            {\r\n                _writer.WriteValue(null);\r\n                return;\r\n            }\r\n\r\n            switch (Type.GetTypeCode(value.GetType()))\r\n            {\r\n                case TypeCode.Empty:\r\n                case TypeCode.DBNull:\r\n                    _writer.WriteValue(null);\r\n                    break;\r\n                case TypeCode.Object:\r\n                    var tp = value.GetType();\r\n                    if (tp.IsArray)\r\n                    {\r\n                        _writer.WriteStartArray();\r\n                        _writer.WriteValue(tp.FullName);\r\n\r\n                        var arr = value as System.Collections.IList;\r\n                        for (int i = 0; i < arr.Count; i++)\r\n                        {\r\n                            this.WriteValue(arr[i]);\r\n                        }\r\n\r\n                        _writer.WriteEndArray();\r\n                    }\r\n                    else if(tp.IsGenericType && tp.GetGenericTypeDefinition() == typeof(List<>))\r\n                    {\r\n                        _writer.WriteStartArray();\r\n                        _writer.WriteValue(TypeUtil.GetElementTypeOfListType(tp).FullName + \"<>\");\r\n\r\n                        var arr = value as System.Collections.IList;\r\n                        for (int i = 0; i < arr.Count; i++)\r\n                        {\r\n                            this.WriteValue(arr[i]);\r\n                        }\r\n\r\n                        _writer.WriteEndArray();\r\n                    }\r\n                    else\r\n                    {\r\n                        this.WriteObject(value);\r\n                    }\r\n                    break;\r\n                case TypeCode.Boolean:\r\n                    _writer.WriteValue(Convert.ToBoolean(value));\r\n                    break;\r\n                case TypeCode.Char:\r\n                    _writer.WriteValue(Convert.ToString(value));\r\n                    break;\r\n                case TypeCode.SByte:\r\n                case TypeCode.Byte:\r\n                case TypeCode.Int16:\r\n                case TypeCode.UInt16:\r\n                case TypeCode.Int32:\r\n                    _writer.WriteValue(Convert.ToInt32(value));\r\n                    break;\r\n                case TypeCode.UInt32:\r\n                case TypeCode.Int64:\r\n                case TypeCode.UInt64:\r\n                case TypeCode.Single:\r\n                case TypeCode.Double:\r\n                    _writer.WriteValue(Convert.ToDouble(value));\r\n                    break;\r\n                case TypeCode.Decimal:\r\n                    _writer.WriteValue(Convert.ToDouble(value));\r\n                    break;\r\n                case TypeCode.DateTime:\r\n                    //TODO - add support\r\n                    break;\r\n                case TypeCode.String:\r\n                    _writer.WriteValue(Convert.ToString(value));\r\n                    break;\r\n            }\r\n        }\r\n\r\n        private void WriteFromSerializationInfo(SerializationInfo si)\r\n        {\r\n            _writer.WriteStartObject();\r\n            _writer.WritePropertyName(ID_TYPE);\r\n            _writer.WriteValue(si.FullTypeName);\r\n\r\n            var e = si.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                _writer.WritePropertyName(e.Name);\r\n                if(e.Value == null)\r\n                {\r\n                    _writer.WriteValue(null);\r\n                }\r\n                else\r\n                {\r\n                    this.WriteValue(e.Value);\r\n                }\r\n            }\r\n\r\n            _writer.WriteEndObject();\r\n        }\r\n\r\n\r\n\r\n\r\n        public object Deserialize(Stream serializationStream)\r\n        {\r\n            if (serializationStream == null) throw new System.ArgumentNullException(\"serializationStream\");\r\n\r\n            if (_reader == null) _reader = new JsonReader();\r\n            if (this.Converter == null) this.Converter = new FormatterConverter();\r\n\r\n            var reader = new StreamReader(serializationStream);\r\n\r\n            try\r\n            {\r\n                _reader.Init(reader);\r\n\r\n                if (!_reader.Read()) return null;\r\n                if (_reader.NodeType != JsonNodeType.Object) throw new SerializationException(\"Failed to deserialize due to malformed json: json must start with a json object.\");\r\n\r\n                return this.ReadObject();\r\n            }\r\n            finally\r\n            {\r\n                _reader.Clear();\r\n            }\r\n        }\r\n\r\n        private object ReadObject()\r\n        {\r\n            if (_reader.NodeType != JsonNodeType.Object) throw new SerializationException(\"Failed to deserialize due to malformed json.\");\r\n\r\n            _reader.Read();\r\n            if (_reader.NodeType != JsonNodeType.String || _reader.Name != ID_TYPE) throw new SerializationException(\"Failed to deserialize due to malformed json: objects must contain a @type property.\");\r\n\r\n            var tp = Type.GetType(_reader.Value as string);\r\n            if (tp == null) tp = TypeUtil.FindType(_reader.Value as string, true);\r\n            if (tp == null) throw new SerializationException(\"Failed to deserialize due to malformed json: objects must contain a @type property.\");\r\n\r\n            object result;\r\n            ISerializationSurrogate surrogate;\r\n            ISurrogateSelector selector;\r\n            if (this.SurrogateSelector != null && (surrogate = this.SurrogateSelector.GetSurrogate(tp, this.Context, out selector)) != null)\r\n            {\r\n                var si = this.ReadAsSerializationInfo(tp);\r\n                try\r\n                {\r\n                    result = surrogate.SetObjectData(FormatterServices.GetUninitializedObject(tp), si, this.Context, selector);\r\n                }\r\n                catch(System.Exception ex)\r\n                {\r\n                    throw new SerializationException(\"Failed to deserialize.\", ex);\r\n                }\r\n            }\r\n            else if(typeof(ISerializable).IsAssignableFrom(tp))\r\n            {\r\n                var si = this.ReadAsSerializationInfo(tp);\r\n                var constructor = GetSerializationConstructor(tp);\r\n                if (constructor == null) throw new SerializationException(\"Failed to deserialize due to ISerializable type '\" + tp.FullName + \"' not implementing the appropriate constructor.\");\r\n                try\r\n                {\r\n                    result = constructor.Invoke(new object[] { si, this.Context });\r\n                }\r\n                catch(System.Exception ex)\r\n                {\r\n                    throw new SerializationException(\"Failed to deserialize.\", ex);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var members = FormatterServices.GetSerializableMembers(tp, Context);\r\n                var data = new object[members.Length];\r\n\r\n                while (_reader.Read())\r\n                {\r\n                    switch (_reader.NodeType)\r\n                    {\r\n                        case JsonNodeType.None:\r\n                        case JsonNodeType.EndArray:\r\n                            throw new SerializationException(\"Failed to deserialize due to malformed json.\");\r\n                        case JsonNodeType.Object:\r\n                            {\r\n                                var nm = _reader.Name;\r\n                                int i = GetIndexOfMemberName(members, nm);\r\n                                if(i < 0)\r\n                                {\r\n                                    this.ReadPastObject();\r\n                                }\r\n                                else\r\n                                {\r\n                                    data[i] = this.ReadObject();\r\n                                }\r\n                            }\r\n                            break;\r\n                        case JsonNodeType.Array:\r\n                            {\r\n                                var nm = _reader.Name;\r\n                                int i = GetIndexOfMemberName(members, nm);\r\n                                if (i < 0)\r\n                                {\r\n                                    this.ReadPastArray();\r\n                                }\r\n                                else\r\n                                {\r\n                                    _reader.Read();\r\n                                    if (_reader.NodeType != JsonNodeType.String) throw new SerializationException(\"Failed to deserialize due to malformed json: array must begin with a @type string. (\" + nm + \")\");\r\n\r\n                                    System.Type arrayType = null;\r\n                                    try\r\n                                    {\r\n                                        var stp = _reader.Value as string;\r\n                                        //bool isArray = (stp != null && stp.EndsWith(\"[]\"));\r\n                                        //if (isArray) stp = stp.Substring(0, stp.Length - 2);\r\n                                        //arrayType = Type.GetType(stp);\r\n                                        //if (arrayType == null) arrayType = TypeUtil.FindType(stp, true);\r\n                                        //if (arrayType != null && isArray) arrayType = arrayType.MakeArrayType();\r\n                                        if(string.IsNullOrEmpty(stp))\r\n                                        {\r\n                                            arrayType = null;\r\n                                        }\r\n                                        else if(stp.EndsWith(\"[]\"))\r\n                                        {\r\n                                            stp = stp.Substring(0, stp.Length - 2);\r\n                                            arrayType = Type.GetType(stp);\r\n                                            if (arrayType == null) arrayType = TypeUtil.FindType(stp, true);\r\n                                            if (arrayType != null) arrayType = arrayType.MakeArrayType();\r\n                                        }\r\n                                        else if(stp.EndsWith(\"<>\"))\r\n                                        {\r\n                                            stp = stp.Substring(0, stp.Length - 2);\r\n                                            arrayType = Type.GetType(stp);\r\n                                            if (arrayType == null) arrayType = TypeUtil.FindType(stp, true);\r\n                                            if (arrayType != null) arrayType = typeof(List<>).MakeGenericType(arrayType);\r\n                                        }\r\n                                    }\r\n                                    catch (System.Exception)\r\n                                    {\r\n                                        throw new SerializationException(\"Failed to deserialize due to malformed json: array must begin with a @type string. (\" + nm + \")\");\r\n                                    }\r\n                                    if (arrayType == null) throw new SerializationException(\"Failed to deserialize due to malformed json: array must begin with a @type string. (\" + nm + \")\");\r\n\r\n                                    var innerType = arrayType.IsArray ? arrayType.GetElementType() : arrayType.GetGenericArguments()[0];\r\n                                    data[i] = this.ReadArray(nm, innerType, !arrayType.IsArray);\r\n                                }\r\n                            }\r\n                            break;\r\n                        case JsonNodeType.String:\r\n                        case JsonNodeType.Number:\r\n                        case JsonNodeType.Boolean:\r\n                        case JsonNodeType.Null:\r\n                            {\r\n                                int i = GetIndexOfMemberName(members, _reader.Name);\r\n                                if (i < 0)\r\n                                {\r\n                                    this.ReadPastObject();\r\n                                }\r\n                                else\r\n                                {\r\n                                    data[i] = ConvertJsonValueToType(_reader.Value, (members[i] as System.Reflection.FieldInfo).FieldType);\r\n                                }\r\n                            }\r\n                            break;\r\n                        case JsonNodeType.EndObject:\r\n                            goto Result;\r\n                    }\r\n                }\r\n\r\n                Result:\r\n                result = FormatterServices.GetUninitializedObject(tp);\r\n                FormatterServices.PopulateObjectMembers(result, members, data);\r\n            }\r\n\r\n            if (result is IDeserializationCallback) (result as IDeserializationCallback).OnDeserialization(this);\r\n            return result;\r\n        }\r\n\r\n        private SerializationInfo ReadAsSerializationInfo(System.Type tp)\r\n        {\r\n            var si = new SerializationInfo(tp, this.Converter);\r\n\r\n            while (_reader.Read())\r\n            {\r\n                switch (_reader.NodeType)\r\n                {\r\n                    case JsonNodeType.None:\r\n                    case JsonNodeType.EndArray:\r\n                        throw new SerializationException(\"Failed to deserialize due to malformed json.\");\r\n                    case JsonNodeType.Object:\r\n                        {\r\n                            var nm = _reader.Name;\r\n                            si.AddValue(nm, this.ReadObject());\r\n                        }\r\n                        break;\r\n                    case JsonNodeType.Array:\r\n                        {\r\n                            var nm = _reader.Name;\r\n\r\n                            _reader.Read();\r\n                            if (_reader.NodeType != JsonNodeType.String) throw new SerializationException(\"Failed to deserialize due to malformed json: array must begin with a @type string. (\" + nm + \")\");\r\n\r\n                            System.Type arrayType = null;\r\n                            try\r\n                            {\r\n                                var stp = _reader.Value as string;\r\n                                //bool isArray = (stp != null && stp.EndsWith(\"[]\"));\r\n                                //if (isArray) stp = stp.Substring(0, stp.Length - 2);\r\n                                //arrayType = Type.GetType(stp);\r\n                                //if (arrayType == null) arrayType = TypeUtil.FindType(stp, true);\r\n                                //if (arrayType != null && isArray) arrayType = arrayType.MakeArrayType();\r\n                                if (string.IsNullOrEmpty(stp))\r\n                                {\r\n                                    arrayType = null;\r\n                                }\r\n                                else if (stp.EndsWith(\"[]\"))\r\n                                {\r\n                                    stp = stp.Substring(0, stp.Length - 2);\r\n                                    arrayType = Type.GetType(stp);\r\n                                    if (arrayType == null) arrayType = TypeUtil.FindType(stp, true);\r\n                                    if (arrayType != null) arrayType = arrayType.MakeArrayType();\r\n                                }\r\n                                else if (stp.EndsWith(\"<>\"))\r\n                                {\r\n                                    stp = stp.Substring(0, stp.Length - 2);\r\n                                    arrayType = Type.GetType(stp);\r\n                                    if (arrayType == null) arrayType = TypeUtil.FindType(stp, true);\r\n                                    if (arrayType != null) arrayType = typeof(List<>).MakeGenericType(arrayType);\r\n                                }\r\n                            }\r\n                            catch (System.Exception)\r\n                            {\r\n                                throw new SerializationException(\"Failed to deserialize due to malformed json: array must begin with a @type string. (\" + nm + \")\");\r\n                            }\r\n                            if (arrayType == null) throw new SerializationException(\"Failed to deserialize due to malformed json: array must begin with a @type string. (\" + nm + \")\");\r\n\r\n                            var innerType = arrayType.IsArray ? arrayType.GetElementType() : arrayType.GetGenericArguments()[0];\r\n                            si.AddValue(nm, this.ReadArray(nm, innerType, !arrayType.IsArray));\r\n                        }\r\n                        break;\r\n                    case JsonNodeType.String:\r\n                    case JsonNodeType.Number:\r\n                    case JsonNodeType.Boolean:\r\n                    case JsonNodeType.Null:\r\n                        {\r\n                            si.AddValue(_reader.Name, _reader.Value);\r\n                        }\r\n                        break;\r\n                    case JsonNodeType.EndObject:\r\n                        goto Result;\r\n                }\r\n            }\r\n\r\n            Result:\r\n            return si;\r\n        }\r\n\r\n        private object ReadArray(string nm, System.Type innerType, bool keepAsList)\r\n        {\r\n            var ltp = typeof(List<>);\r\n            ltp = ltp.MakeGenericType(innerType);\r\n            var lst = Activator.CreateInstance(ltp) as System.Collections.IList;\r\n            if (lst == null) throw new SerializationException(\"Failed to deserialize due to malformed json.\");\r\n\r\n            while (_reader.Read())\r\n            {\r\n                switch (_reader.NodeType)\r\n                {\r\n                    case JsonNodeType.None:\r\n                    case JsonNodeType.EndObject:\r\n                        throw new SerializationException(\"Failed to deserialize due to malformed json.\");\r\n                    case JsonNodeType.Object:\r\n                        {\r\n                            lst.Add(ConvertJsonValueToType(this.ReadObject(), innerType));\r\n                        }\r\n                        break;\r\n                    case JsonNodeType.Array:\r\n                        {\r\n                            _reader.Read();\r\n                            if (_reader.NodeType != JsonNodeType.String) throw new SerializationException(\"Failed to deserialize due to malformed json: array must begin with a @type string. (\" + nm + \")\");\r\n\r\n                            System.Type arrayType = null;\r\n                            try\r\n                            {\r\n                                var stp = _reader.Value as string;\r\n                                //bool isArray = (stp != null && stp.EndsWith(\"[]\"));\r\n                                //if (isArray) stp = stp.Substring(0, stp.Length - 2);\r\n                                //arrayType = Type.GetType(stp);\r\n                                //if (arrayType == null) arrayType = TypeUtil.FindType(stp, true);\r\n                                //if (arrayType != null && isArray) arrayType = arrayType.MakeArrayType();\r\n                                if (string.IsNullOrEmpty(stp))\r\n                                {\r\n                                    arrayType = null;\r\n                                }\r\n                                else if (stp.EndsWith(\"[]\"))\r\n                                {\r\n                                    stp = stp.Substring(0, stp.Length - 2);\r\n                                    arrayType = Type.GetType(stp);\r\n                                    if (arrayType == null) arrayType = TypeUtil.FindType(stp, true);\r\n                                    if (arrayType != null) arrayType = arrayType.MakeArrayType();\r\n                                }\r\n                                else if (stp.EndsWith(\"<>\"))\r\n                                {\r\n                                    stp = stp.Substring(0, stp.Length - 2);\r\n                                    arrayType = Type.GetType(stp);\r\n                                    if (arrayType == null) arrayType = TypeUtil.FindType(stp, true);\r\n                                    if (arrayType != null) arrayType = typeof(List<>).MakeGenericType(arrayType);\r\n                                }\r\n                            }\r\n                            catch (System.Exception)\r\n                            {\r\n                                throw new SerializationException(\"Failed to deserialize due to malformed json: array must begin with a @type string. (\" + nm + \")\");\r\n                            }\r\n                            if (arrayType == null) throw new SerializationException(\"Failed to deserialize due to malformed json: array must begin with a @type string. (\" + nm + \")\");\r\n\r\n                            var nextInnerType = arrayType.IsArray ? arrayType.GetElementType() : arrayType.GetGenericArguments()[0];\r\n                            lst.Add(this.ReadArray(\"\", nextInnerType, !arrayType.IsArray));\r\n                        }\r\n                        break;\r\n                    case JsonNodeType.String:\r\n                    case JsonNodeType.Number:\r\n                    case JsonNodeType.Boolean:\r\n                    case JsonNodeType.Null:\r\n                        {\r\n                            var obj = ConvertJsonValueToType(_reader.Value, innerType);\r\n                            lst.Add(obj);\r\n                        }\r\n                        break;\r\n                    case JsonNodeType.EndArray:\r\n                        goto Result;\r\n                }\r\n            }\r\n\r\n            Result:\r\n            if (keepAsList)\r\n                return lst;\r\n            else\r\n            {\r\n                var arr = Array.CreateInstance(innerType, lst.Count);\r\n                lst.CopyTo(arr, 0);\r\n                return arr;\r\n            }\r\n        }\r\n\r\n        private void ReadPastObject()\r\n        {\r\n            int cnt = 1;\r\n\r\n            while (_reader.Read())\r\n            {\r\n                if (_reader.NodeType == JsonNodeType.Object)\r\n                    cnt++;\r\n                else if (_reader.NodeType == JsonNodeType.EndObject)\r\n                {\r\n                    cnt--;\r\n                    if (cnt == 0)\r\n                    {\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        private void ReadPastArray()\r\n        {\r\n            int cnt = 0;\r\n\r\n            while(_reader.Read())\r\n            {\r\n                if (_reader.NodeType == JsonNodeType.Array)\r\n                    cnt++;\r\n                else if(_reader.NodeType == JsonNodeType.EndArray)\r\n                {\r\n                    cnt--;\r\n                    if(cnt == 0)\r\n                    {\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Utils\r\n\r\n        private static int GetIndexOfMemberName(System.Reflection.MemberInfo[] members, string name)\r\n        {\r\n            for (int i = 0; i < members.Length; i++)\r\n            {\r\n                if (members[i] != null && members[i].Name == name) return i;\r\n            }\r\n            return -1;\r\n        }\r\n\r\n        private static object ConvertJsonValueToType(object value, System.Type tp)\r\n        {\r\n            if (value == null) return null;\r\n\r\n            switch (Type.GetTypeCode(tp))\r\n            {\r\n                case TypeCode.Empty:\r\n                case TypeCode.DBNull:\r\n                    return null;\r\n                case TypeCode.Object:\r\n                    {\r\n                        if (tp.IsAssignableFrom(value.GetType()))\r\n                            return value;\r\n                        else\r\n                            return null;\r\n                    }\r\n                case TypeCode.Boolean:\r\n                    return (value is bool) ? value : false;\r\n                case TypeCode.Char:\r\n                    return Convert.ToChar(value);\r\n                case TypeCode.SByte:\r\n                    return Convert.ToSByte(value);\r\n                case TypeCode.Byte:\r\n                    return Convert.ToByte(value);\r\n                case TypeCode.Int16:\r\n                    return Convert.ToInt16(value);\r\n                case TypeCode.UInt16:\r\n                    return Convert.ToUInt16(value);\r\n                case TypeCode.Int32:\r\n                    return Convert.ToInt32(value);\r\n                case TypeCode.UInt32:\r\n                    return Convert.ToUInt32(value);\r\n                case TypeCode.Int64:\r\n                    return Convert.ToInt64(value);\r\n                case TypeCode.UInt64:\r\n                    return Convert.ToUInt64(value);\r\n                case TypeCode.Single:\r\n                    return Convert.ToSingle(value);\r\n                case TypeCode.Double:\r\n                    return Convert.ToDouble(value);\r\n                case TypeCode.Decimal:\r\n                    return Convert.ToDecimal(value);\r\n                case TypeCode.DateTime:\r\n                    return Convert.ToDateTime(value);\r\n                case TypeCode.String:\r\n                    return Convert.ToString(value);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        private static System.Type[] _serConstParamTypes;\r\n        private static ConstructorInfo GetSerializationConstructor(System.Type tp)\r\n        {\r\n            if (_serConstParamTypes == null) _serConstParamTypes = new System.Type[] { typeof(SerializationInfo), typeof(StreamingContext) };\r\n            return tp.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, _serConstParamTypes, null);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/Json/JsonNodeType.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Serialization.Json\r\n{\r\n    public enum JsonNodeType\r\n    {\r\n        None,\r\n        Object,\r\n        Array,\r\n        String,\r\n        Number,\r\n        Boolean,\r\n        Null,\r\n        EndObject,\r\n        EndArray\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/Json/JsonReader.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Serialization.Json\r\n{\r\n\r\n    internal class JsonReader : System.IDisposable\r\n    {\r\n\r\n        private enum ObjectState : byte\r\n        {\r\n            None,\r\n            Object,\r\n            Array\r\n        }\r\n\r\n        #region Fields\r\n\r\n        private TextReader _reader;\r\n        private JsonNodeType _nodeType;\r\n\r\n        private string _name;\r\n        private object _value;\r\n\r\n        private Stack<ObjectState> _stack = new Stack<ObjectState>();\r\n        private bool _lastWasComma;\r\n        private StringBuilder _builder = new StringBuilder();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public JsonReader()\r\n        {\r\n\r\n        }\r\n\r\n        public JsonReader(string value)\r\n        {\r\n            this.Init(value);\r\n        }\r\n\r\n        public JsonReader(TextReader reader)\r\n        {\r\n            this.Init(reader);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public JsonNodeType NodeType\r\n        {\r\n            get { return _nodeType; }\r\n        }\r\n\r\n        public string Name\r\n        {\r\n            get { return _name; }\r\n        }\r\n\r\n        public object Value\r\n        {\r\n            get { return _value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Init(string value)\r\n        {\r\n            _reader = new StringReader(value);\r\n            _nodeType = JsonNodeType.None;\r\n            _name = string.Empty;\r\n            _value = null;\r\n            _stack.Clear();\r\n            _lastWasComma = false;\r\n            _builder.Length = 0;\r\n        }\r\n\r\n        public void Init(TextReader reader)\r\n        {\r\n            _reader = reader;\r\n            _nodeType = JsonNodeType.None;\r\n            _name = string.Empty;\r\n            _value = null;\r\n            _stack.Clear();\r\n            _lastWasComma = false;\r\n            _builder.Length = 0;\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _reader = null;\r\n            _nodeType = JsonNodeType.None;\r\n            _name = string.Empty;\r\n            _value = null;\r\n            _stack.Clear();\r\n            _lastWasComma = false;\r\n            _builder.Length = 0;\r\n        }\r\n\r\n\r\n\r\n\r\n        public bool Read()\r\n        {\r\n            _nodeType = JsonNodeType.None;\r\n            _name = string.Empty;\r\n            _value = null;\r\n            if (_reader == null) return false;\r\n\r\n            if (_stack.Count == 0)\r\n            {\r\n                if (this.PeekToNext() < 0)\r\n                {\r\n                    _reader = null;\r\n                    _nodeType = JsonNodeType.None;\r\n                    _lastWasComma = false;\r\n                    _builder.Length = 0;\r\n                    return false;\r\n                }\r\n                else\r\n                {\r\n                    _lastWasComma = true;\r\n                    return this.ReadNextEntry();\r\n                }\r\n            }\r\n            else if (_lastWasComma)\r\n            {\r\n                switch (_stack.Peek())\r\n                {\r\n                    case ObjectState.Object:\r\n                        return this.ReadNextPair();\r\n                    case ObjectState.Array:\r\n                        return this.ReadNextEntry();\r\n                    default:\r\n                        throw new System.InvalidOperationException(\"JsonReader entered an invalid state.\");\r\n                }\r\n            }\r\n            else\r\n            {\r\n                this.ReadEntryEnd();\r\n                return true;\r\n            }\r\n        }\r\n\r\n        private bool ReadNextEntry()\r\n        {\r\n            int i = this.PeekToNext();\r\n            if (i < 0) throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n            char c = (char)_reader.Read();\r\n\r\n            switch (c)\r\n            {\r\n                case '{':\r\n                    {\r\n                        _lastWasComma = true;\r\n                        _nodeType = JsonNodeType.Object;\r\n                        _stack.Push(ObjectState.Object);\r\n                        return true;\r\n                    }\r\n                case '[':\r\n                    {\r\n                        _lastWasComma = true;\r\n                        _nodeType = JsonNodeType.Array;\r\n                        _stack.Push(ObjectState.Array);\r\n                        return true;\r\n                    }\r\n                case '\"':\r\n                    {\r\n                        //string\r\n                        _value = this.ReadString(c);\r\n                        _nodeType = JsonNodeType.String;\r\n                        this.ValidateComma();\r\n                        return true;\r\n                    }\r\n                case '-':\r\n                case '0':\r\n                case '1':\r\n                case '2':\r\n                case '3':\r\n                case '4':\r\n                case '5':\r\n                case '6':\r\n                case '7':\r\n                case '8':\r\n                case '9':\r\n                    {\r\n                        _value = this.ReadNumber(c);\r\n                        _nodeType = JsonNodeType.Number;\r\n                        this.ValidateComma();\r\n                        return true;\r\n                    }\r\n                case 't':\r\n                case 'T':\r\n                case 'f':\r\n                case 'F':\r\n                    {\r\n                        //bool\r\n                        _value = this.ReadBool(c);\r\n                        _nodeType = JsonNodeType.Boolean;\r\n                        this.ValidateComma();\r\n                        return true;\r\n                    }\r\n                case 'n':\r\n                case 'N':\r\n                    {\r\n                        //null\r\n                        _value = this.ReadNull(c);\r\n                        _nodeType = JsonNodeType.Null;\r\n                        this.ValidateComma();\r\n                        return true;\r\n                    }\r\n                default:\r\n                    {\r\n                        throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n                    }\r\n            }\r\n        }\r\n\r\n        private bool ReadNextPair()\r\n        {\r\n            int i = this.PeekToNext();\r\n            if (i < 0) throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n            char c = (char)_reader.Read();\r\n\r\n            if (c != '\"') throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n            //read name\r\n            _name = this.ReadString(c);\r\n\r\n            i = this.PeekToNext();\r\n            if (i < 0) throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n            c = (char)_reader.Read();\r\n\r\n            if (c != ':') throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n            return this.ReadNextEntry();\r\n        }\r\n\r\n        private string ReadString(char c)\r\n        {\r\n            if (c != '\"') throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n            _builder.Length = 0;\r\n            while (true)\r\n            {\r\n                int i = _reader.Read();\r\n                if (i < 0) throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n                c = (char)i;\r\n                switch (c)\r\n                {\r\n                    case '\"':\r\n                        {\r\n                            var result = _builder.ToString();\r\n                            _builder.Length = 0;\r\n                            return result;\r\n                        }\r\n                    case '\\\\':\r\n                        {\r\n                            //escaped char\r\n                            i = _reader.Read();\r\n                            if (i < 0) throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n                            c = (char)i;\r\n                            switch (c)\r\n                            {\r\n                                case '\\\\':\r\n                                case '\"':\r\n                                case '/':\r\n                                    _builder.Append(c);\r\n                                    break;\r\n                                case 'b':\r\n                                    _builder.Append('\\b');\r\n                                    break;\r\n                                case 't':\r\n                                    _builder.Append('\\t');\r\n                                    break;\r\n                                case 'n':\r\n                                    _builder.Append('\\n');\r\n                                    break;\r\n                                case 'f':\r\n                                    _builder.Append('\\f');\r\n                                    break;\r\n                                case 'r':\r\n                                    _builder.Append('\\r');\r\n                                    break;\r\n                                case 'u':\r\n                                    int hex = 0;\r\n                                    for (int j = 0; j < 4; j++)\r\n                                    {\r\n                                        i = _reader.Read();\r\n                                        if (i < 0) throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n                                        c = (char)i;\r\n                                        if (char.IsNumber(c))\r\n                                            hex |= (i - 30);\r\n                                        else if (char.IsLetter(c))\r\n                                            hex |= ((int)char.ToUpper(c) - 31);\r\n                                        else\r\n                                            throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n                                        hex = hex << 4;\r\n                                    }\r\n                                    _builder.Append((char)hex);\r\n                                    break;\r\n                            }\r\n                        }\r\n                        break;\r\n                    default:\r\n                        {\r\n                            _builder.Append(c);\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n        private double ReadNumber(char c)\r\n        {\r\n            bool dotFound = false;\r\n            bool eFound = false;\r\n\r\n            _builder.Length = 0;\r\n            _builder.Append(c);\r\n            while (true)\r\n            {\r\n                switch ((char)_reader.Peek())\r\n                {\r\n                    case '0':\r\n                    case '1':\r\n                    case '2':\r\n                    case '3':\r\n                    case '4':\r\n                    case '5':\r\n                    case '6':\r\n                    case '7':\r\n                    case '8':\r\n                    case '9':\r\n                        c = (char)_reader.Read();\r\n                        _builder.Append(c);\r\n                        break;\r\n                    case '.':\r\n                        if (dotFound) throw new JsonException(\"Malformed numeric value.\");\r\n                        dotFound = true;\r\n                        c = (char)_reader.Read();\r\n                        _builder.Append(c);\r\n                        break;\r\n                    case 'e':\r\n                    case 'E':\r\n                        if (eFound) throw new JsonException(\"Malformed numeric value.\");\r\n                        eFound = true;\r\n                        dotFound = true;\r\n                        c = (char)_reader.Read();\r\n                        _builder.Append(char.ToLower(c));\r\n                        switch ((char)_reader.Peek())\r\n                        {\r\n                            case '+':\r\n                            case '-':\r\n                                c = (char)_reader.Read();\r\n                                _builder.Append(c);\r\n                                break;\r\n                        }\r\n                        break;\r\n                    case ',':\r\n                    case '}':\r\n                    case ']':\r\n                    case ' ':\r\n                    case '\\t':\r\n                    case '\\n':\r\n                    case '\\r':\r\n                        goto done;\r\n                    default:\r\n                        throw new JsonException(\"Malformed numeric value (\" + _builder.ToString() + (char)_reader.Peek() + \").\");\r\n                }\r\n            }\r\n\r\n            done:\r\n            double value;\r\n            if (double.TryParse(_builder.ToString(), out value))\r\n                return value;\r\n            else\r\n                return 0d;\r\n        }\r\n\r\n        private bool ReadBool(char c)\r\n        {\r\n            c = char.ToLower(c);\r\n            if (c == 't')\r\n            {\r\n                int i = _reader.Read();\r\n                if (i < 0) throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n                c = char.ToLower((char)i);\r\n                if (c != 'r') throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n                i = _reader.Read();\r\n                if (i < 0) throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n                c = char.ToLower((char)i);\r\n                if (c != 'u') throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n                i = _reader.Read();\r\n                if (i < 0) throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n                c = char.ToLower((char)i);\r\n                if (c != 'e') throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n                return true;\r\n            }\r\n            else if (c == 'f')\r\n            {\r\n                int i = _reader.Read();\r\n                if (i < 0) throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n                c = char.ToLower((char)i);\r\n                if (c != 'a') throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n                i = _reader.Read();\r\n                if (i < 0) throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n                c = char.ToLower((char)i);\r\n                if (c != 'l') throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n                i = _reader.Read();\r\n                if (i < 0) throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n                c = char.ToLower((char)i);\r\n                if (c != 's') throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n                i = _reader.Read();\r\n                if (i < 0) throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n                c = char.ToLower((char)i);\r\n                if (c != 'e') throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n            }\r\n        }\r\n\r\n        private object ReadNull(char c)\r\n        {\r\n            c = char.ToLower(c);\r\n            if (c != 'n') throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n            int i = _reader.Read();\r\n            if (i < 0) throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n            c = char.ToLower((char)i);\r\n            if (c != 'u') throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n            i = _reader.Read();\r\n            if (i < 0) throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n            c = char.ToLower((char)i);\r\n            if (c != 'l') throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n            i = _reader.Read();\r\n            if (i < 0) throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n            c = char.ToLower((char)i);\r\n            if (c != 'l') throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n            return null;\r\n        }\r\n\r\n\r\n\r\n\r\n        private void ReadEntryEnd()\r\n        {\r\n            char c;\r\n            while (true)\r\n            {\r\n                int i = _reader.Read();\r\n                if (i < 0) throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n\r\n                if (!char.IsWhiteSpace((char)i))\r\n                {\r\n                    c = (char)i;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            switch (c)\r\n            {\r\n                case '}':\r\n                    {\r\n                        if (_stack.Count == 0 || _stack.Peek() != ObjectState.Object)\r\n                        {\r\n                            throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n                        }\r\n                        _stack.Pop();\r\n\r\n                        _nodeType = JsonNodeType.EndObject;\r\n                        this.ValidateComma();\r\n                    }\r\n                    break;\r\n                case ']':\r\n                    {\r\n                        if (_stack.Count == 0 || _stack.Peek() != ObjectState.Array)\r\n                        {\r\n                            throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n                        }\r\n                        _stack.Pop();\r\n\r\n                        _nodeType = JsonNodeType.EndArray;\r\n                        this.ValidateComma();\r\n                    }\r\n                    break;\r\n                default:\r\n                    {\r\n                        throw new JsonException(\"Syntax error, failed to parse Json.\");\r\n                    }\r\n            }\r\n        }\r\n\r\n        private void ValidateComma()\r\n        {\r\n            const int CHAR_COMMA = (int)',';\r\n            if (this.PeekToNext() == CHAR_COMMA)\r\n            {\r\n                _reader.Read();\r\n                _lastWasComma = true;\r\n            }\r\n            else\r\n            {\r\n                _lastWasComma = false;\r\n            }\r\n        }\r\n\r\n\r\n        private int PeekToNext()\r\n        {\r\n            while (true)\r\n            {\r\n                int i = _reader.Peek();\r\n                if (i < 0) return i;\r\n\r\n                if (char.IsWhiteSpace((char)i))\r\n                {\r\n                    _reader.Read();\r\n                }\r\n                else\r\n                {\r\n                    return i;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region IDisposable Interface\r\n\r\n        public void Dispose()\r\n        {\r\n            _reader = null;\r\n            _nodeType = JsonNodeType.None;\r\n            _name = string.Empty;\r\n            _value = null;\r\n            _stack.Clear();\r\n            _lastWasComma = false;\r\n            _builder.Length = 0;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/Json/JsonWriter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Serialization.Json\r\n{\r\n\r\n    internal class JsonWriter : IDisposable\r\n    {\r\n\r\n        public enum ObjectState\r\n        {\r\n            None,\r\n            Object,\r\n            Array,\r\n            Property,\r\n            ObjectLineEnd,\r\n            ArrayLineEnd\r\n        }\r\n\r\n        #region Fields\r\n\r\n        private TextWriter _writer;\r\n\r\n        private Stack<ObjectState> _stack = new Stack<ObjectState>();\r\n        private int _indent = 0;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public JsonWriter()\r\n        {\r\n\r\n        }\r\n\r\n        public JsonWriter(TextWriter writer)\r\n        {\r\n            this.Init(writer);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ObjectState State\r\n        {\r\n            get\r\n            {\r\n                return (_stack.Count > 0) ? _stack.Peek() : ObjectState.None;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Init(TextWriter writer)\r\n        {\r\n            _writer = writer;\r\n            _stack.Clear();\r\n            _indent = 0;\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _writer = null;\r\n            _stack.Clear();\r\n            _indent = 0;\r\n        }\r\n\r\n\r\n        public void WriteStartObject()\r\n        {\r\n            if (_writer == null) throw new System.InvalidOperationException(\"Must initialize JsonWriter before writing.\");\r\n\r\n            switch (this.State)\r\n            {\r\n                case ObjectState.Object:\r\n                    throw new JsonException(\"Can not nest json object in json object.\");\r\n                case ObjectState.ObjectLineEnd:\r\n                    throw new JsonException(\"Objects must be written after a property or as a member of an array.\");\r\n                case ObjectState.ArrayLineEnd:\r\n                    _writer.Write(\",\\n\");\r\n                    this.AdjustForIndent();\r\n                    _stack.Pop();\r\n                    break;\r\n            }\r\n\r\n            _writer.Write(\"{\\n\");\r\n\r\n            _stack.Push(ObjectState.Object);\r\n            _indent++;\r\n            this.AdjustForIndent();\r\n        }\r\n\r\n        public void WriteEndObject()\r\n        {\r\n            if (_writer == null) throw new System.InvalidOperationException(\"Must initialize JsonWriter before writing.\");\r\n\r\n            switch (this.State)\r\n            {\r\n                case ObjectState.None:\r\n                case ObjectState.Array:\r\n                case ObjectState.ArrayLineEnd:\r\n                    throw new JsonException(\"Can not end object that has not been started.\");\r\n                case ObjectState.Property:\r\n                    throw new JsonException(\"Value expected to match a property.\");\r\n                case ObjectState.ObjectLineEnd:\r\n                    _writer.Write(\"\\n\");\r\n                    _indent--;\r\n                    this.AdjustForIndent();\r\n                    _stack.Pop();\r\n                    break;\r\n            }\r\n\r\n            _writer.Write(\"}\");\r\n            _stack.Pop();\r\n            if (this.State == ObjectState.Property) _stack.Pop();\r\n            this.ValidateLineEnd();\r\n        }\r\n\r\n        public void WriteStartArray()\r\n        {\r\n            if (_writer == null) throw new System.InvalidOperationException(\"Must initialize JsonWriter before writing.\");\r\n            switch (this.State)\r\n            {\r\n                case ObjectState.None:\r\n                case ObjectState.Object:\r\n                case ObjectState.ObjectLineEnd:\r\n                    throw new JsonException(\"Arrays must be written after a property or as a member of an array.\");\r\n                case ObjectState.Array:\r\n                case ObjectState.ArrayLineEnd:\r\n                    _writer.Write(\",\\n\");\r\n                    this.AdjustForIndent();\r\n                    _stack.Pop();\r\n                    break;\r\n            }\r\n\r\n            _writer.Write(\"[\\n\");\r\n\r\n            _stack.Push(ObjectState.Array);\r\n            _indent++;\r\n            this.AdjustForIndent();\r\n        }\r\n\r\n        public void WriteEndArray()\r\n        {\r\n            if (_writer == null) throw new System.InvalidOperationException(\"Must initialize JsonWriter before writing.\");\r\n\r\n            switch (this.State)\r\n            {\r\n                case ObjectState.None:\r\n                case ObjectState.Object:\r\n                case ObjectState.ObjectLineEnd:\r\n                    throw new JsonException(\"Can not end array that has not been started.\");\r\n                case ObjectState.Property:\r\n                    throw new JsonException(\"Value expected to match a property.\");\r\n                case ObjectState.ArrayLineEnd:\r\n                    _writer.Write(\"\\n\");\r\n                    _indent--;\r\n                    this.AdjustForIndent();\r\n                    _stack.Pop();\r\n                    break;\r\n            }\r\n\r\n            _writer.Write(\"]\");\r\n            _stack.Pop();\r\n            if (this.State == ObjectState.Property) _stack.Pop();\r\n            this.ValidateLineEnd();\r\n        }\r\n\r\n        public void WritePropertyName(string name, bool escape = false)\r\n        {\r\n            if (name == null) throw new System.ArgumentNullException(\"name\");\r\n            if (_writer == null) throw new System.InvalidOperationException(\"Must initialize JsonWriter before writing.\");\r\n\r\n            switch (this.State)\r\n            {\r\n                case ObjectState.None:\r\n                case ObjectState.Array:\r\n                case ObjectState.Property:\r\n                case ObjectState.ArrayLineEnd:\r\n                    throw new JsonException(\"Can not write a property name if no object was started.\");\r\n                case ObjectState.ObjectLineEnd:\r\n                    _writer.Write(\",\\n\");\r\n                    this.AdjustForIndent();\r\n                    _stack.Pop();\r\n                    break;\r\n            }\r\n\r\n            _writer.Write('\"');\r\n            if (escape)\r\n                _writer.Write(JsonEscape(name));\r\n            else\r\n                _writer.Write(name);\r\n            _writer.Write('\"');\r\n\r\n            _writer.Write(\" : \");\r\n\r\n            _stack.Push(ObjectState.Property);\r\n        }\r\n\r\n        public void WriteValue(string value)\r\n        {\r\n            if (_writer == null) throw new System.InvalidOperationException(\"Must initialize JsonWriter before writing.\");\r\n\r\n            switch (this.State)\r\n            {\r\n                case ObjectState.None:\r\n                case ObjectState.Object:\r\n                    throw new JsonException(\"Values must be written after a property or as a member of an array.\");\r\n                case ObjectState.Property:\r\n                    _stack.Pop();\r\n                    break;\r\n                case ObjectState.ObjectLineEnd:\r\n                case ObjectState.ArrayLineEnd:\r\n                    _writer.Write(\",\\n\");\r\n                    this.AdjustForIndent();\r\n                    _stack.Pop();\r\n                    break;\r\n            }\r\n\r\n            if (value == null)\r\n            {\r\n                _writer.Write(\"null\");\r\n            }\r\n            else\r\n            {\r\n                _writer.Write('\"');\r\n                _writer.Write(JsonEscape(value));\r\n                _writer.Write('\"');\r\n            }\r\n\r\n            this.ValidateLineEnd();\r\n        }\r\n\r\n        public void WriteValue(bool value)\r\n        {\r\n            if (_writer == null) throw new System.InvalidOperationException(\"Must initialize JsonWriter before writing.\");\r\n\r\n            switch (this.State)\r\n            {\r\n                case ObjectState.None:\r\n                case ObjectState.Object:\r\n                    throw new JsonException(\"Values must be written after a property or as a member of an array.\");\r\n                case ObjectState.Property:\r\n                    _stack.Pop();\r\n                    break;\r\n                case ObjectState.ObjectLineEnd:\r\n                case ObjectState.ArrayLineEnd:\r\n                    _writer.Write(\",\\n\");\r\n                    this.AdjustForIndent();\r\n                    _stack.Pop();\r\n                    break;\r\n            }\r\n\r\n            _writer.Write(value ? \"true\" : \"false\");\r\n\r\n            this.ValidateLineEnd();\r\n        }\r\n\r\n        public void WriteValue(int value)\r\n        {\r\n            if (_writer == null) throw new System.InvalidOperationException(\"Must initialize JsonWriter before writing.\");\r\n\r\n            switch (this.State)\r\n            {\r\n                case ObjectState.None:\r\n                case ObjectState.Object:\r\n                    throw new JsonException(\"Values must be written after a property or as a member of an array.\");\r\n                case ObjectState.Property:\r\n                    _stack.Pop();\r\n                    break;\r\n                case ObjectState.ObjectLineEnd:\r\n                case ObjectState.ArrayLineEnd:\r\n                    _writer.Write(\",\\n\");\r\n                    this.AdjustForIndent();\r\n                    _stack.Pop();\r\n                    break;\r\n            }\r\n\r\n            _writer.Write(value.ToString());\r\n\r\n            this.ValidateLineEnd();\r\n        }\r\n\r\n        public void WriteValue(float value)\r\n        {\r\n            if (_writer == null) throw new System.InvalidOperationException(\"Must initialize JsonWriter before writing.\");\r\n\r\n            switch (this.State)\r\n            {\r\n                case ObjectState.None:\r\n                case ObjectState.Object:\r\n                    throw new JsonException(\"Values must be written after a property or as a member of an array.\");\r\n                case ObjectState.Property:\r\n                    _stack.Pop();\r\n                    break;\r\n                case ObjectState.ObjectLineEnd:\r\n                case ObjectState.ArrayLineEnd:\r\n                    _writer.Write(\",\\n\");\r\n                    this.AdjustForIndent();\r\n                    _stack.Pop();\r\n                    break;\r\n            }\r\n            \r\n            if(float.IsNaN(value) || float.IsInfinity(value))\r\n            {\r\n                _writer.Write('\"');\r\n                _writer.Write(JsonEscape(value.ToString()));\r\n                _writer.Write('\"');\r\n            }\r\n            else\r\n            {\r\n                _writer.Write(value.ToString());\r\n            }\r\n\r\n            this.ValidateLineEnd();\r\n        }\r\n\r\n        public void WriteValue(double value)\r\n        {\r\n            if (_writer == null) throw new System.InvalidOperationException(\"Must initialize JsonWriter before writing.\");\r\n\r\n            switch (this.State)\r\n            {\r\n                case ObjectState.None:\r\n                case ObjectState.Object:\r\n                    throw new JsonException(\"Values must be written after a property or as a member of an array.\");\r\n                case ObjectState.Property:\r\n                    _stack.Pop();\r\n                    break;\r\n                case ObjectState.ObjectLineEnd:\r\n                case ObjectState.ArrayLineEnd:\r\n                    _writer.Write(\",\\n\");\r\n                    this.AdjustForIndent();\r\n                    _stack.Pop();\r\n                    break;\r\n            }\r\n\r\n            if (double.IsNaN(value) || double.IsInfinity(value))\r\n            {\r\n                _writer.Write('\"');\r\n                _writer.Write(JsonEscape(value.ToString()));\r\n                _writer.Write('\"');\r\n            }\r\n            else\r\n            {\r\n                _writer.Write(value.ToString());\r\n            }\r\n\r\n            this.ValidateLineEnd();\r\n        }\r\n        \r\n        public void WriteValue(object value)\r\n        {\r\n            if (_writer == null) throw new System.InvalidOperationException(\"Must initialize JsonWriter before writing.\");\r\n\r\n            if (value == null)\r\n            {\r\n                switch (this.State)\r\n                {\r\n                    case ObjectState.None:\r\n                    case ObjectState.Object:\r\n                        throw new JsonException(\"Values must be written after a property or as a member of an array.\");\r\n                    case ObjectState.Property:\r\n                        _stack.Pop();\r\n                        break;\r\n                    case ObjectState.ObjectLineEnd:\r\n                    case ObjectState.ArrayLineEnd:\r\n                        _writer.Write(\",\\n\");\r\n                        this.AdjustForIndent();\r\n                        _stack.Pop();\r\n                        break;\r\n                }\r\n\r\n                _writer.Write(\"null\");\r\n\r\n                this.ValidateLineEnd();\r\n            }\r\n            else if (value is string)\r\n                this.WriteValue(value as string);\r\n            else if (value is bool)\r\n                this.WriteValue((bool)value);\r\n            else if (IsNumericType(value))\r\n            {\r\n                if (value is int)\r\n                    this.WriteValue((int)value);\r\n                else if (value is float)\r\n                    this.WriteValue((float)value);\r\n                else if (value is double)\r\n                    this.WriteValue((double)value);\r\n                else\r\n                    this.WriteValue(System.Convert.ToDouble(value));\r\n            }\r\n            else\r\n            {\r\n                throw new JsonException(\"A value can not be of type \" + value.GetType().ToString());\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Utils\r\n\r\n        private void AdjustForIndent()\r\n        {\r\n            for (int i = 0; i < _indent; i++)\r\n            {\r\n                _writer.Write('\\t');\r\n            }\r\n        }\r\n\r\n        private void ValidateLineEnd()\r\n        {\r\n            switch (this.State)\r\n            {\r\n                case ObjectState.None:\r\n                    break;\r\n                case ObjectState.Object:\r\n                    _stack.Push(ObjectState.ObjectLineEnd);\r\n                    break;\r\n                case ObjectState.Array:\r\n                    _stack.Push(ObjectState.ArrayLineEnd);\r\n                    break;\r\n                default:\r\n                    throw new JsonException(\"Json order is malformed.\"); //this should never be reached\r\n            }\r\n        }\r\n\r\n        private static string JsonEscape(string s)\r\n        {\r\n            if (s == null || s.Length == 0)\r\n            {\r\n                return \"\";\r\n            }\r\n\r\n            char c = '\\0';\r\n            int i;\r\n            int len = s.Length;\r\n            StringBuilder sb = new StringBuilder(len + 4);\r\n            String t;\r\n\r\n            for (i = 0; i < len; i += 1)\r\n            {\r\n                c = s[i];\r\n                switch (c)\r\n                {\r\n                    case '\\\\':\r\n                    case '\"':\r\n                        sb.Append('\\\\');\r\n                        sb.Append(c);\r\n                        break;\r\n                    case '/':\r\n                        sb.Append('\\\\');\r\n                        sb.Append(c);\r\n                        break;\r\n                    case '\\b':\r\n                        sb.Append(\"\\\\b\");\r\n                        break;\r\n                    case '\\t':\r\n                        sb.Append(\"\\\\t\");\r\n                        break;\r\n                    case '\\n':\r\n                        sb.Append(\"\\\\n\");\r\n                        break;\r\n                    case '\\f':\r\n                        sb.Append(\"\\\\f\");\r\n                        break;\r\n                    case '\\r':\r\n                        sb.Append(\"\\\\r\");\r\n                        break;\r\n                    default:\r\n                        if (c < ' ')\r\n                        {\r\n                            t = \"000\" + String.Format(\"X\", c);\r\n                            sb.Append(\"\\\\u\" + t.Substring(t.Length - 4));\r\n                        }\r\n                        else\r\n                        {\r\n                            sb.Append(c);\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n            return sb.ToString();\r\n        }\r\n\r\n        private static bool IsNumericType(object o)\r\n        {\r\n            switch (Type.GetTypeCode(o.GetType()))\r\n            {\r\n                case TypeCode.Byte:\r\n                case TypeCode.SByte:\r\n                case TypeCode.UInt16:\r\n                case TypeCode.UInt32:\r\n                case TypeCode.UInt64:\r\n                case TypeCode.Int16:\r\n                case TypeCode.Int32:\r\n                case TypeCode.Int64:\r\n                case TypeCode.Decimal:\r\n                case TypeCode.Double:\r\n                case TypeCode.Single:\r\n                    return true;\r\n                default:\r\n                    return false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public void Dispose()\r\n        {\r\n            _writer = null;\r\n            _stack.Clear();\r\n            _indent = 0;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/Old/IUnityData.cs",
    "content": "﻿namespace com.spacepuppy.Serialization.Old\r\n{\r\n    public interface IUnityData\r\n    {\r\n\r\n        int Size { get; }\r\n\r\n        void Clear();\r\n        void SetData(System.IO.Stream data, UnityEngine.Object[] refs);\r\n        void GetData(System.IO.Stream data, out UnityEngine.Object[] refs);\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/Old/IUnitySerializable.cs",
    "content": "﻿namespace com.spacepuppy.Serialization.Old\r\n{\r\n\r\n    [System.Obsolete(\"No longer used.\")]\r\n    public interface IUnitySerializable\r\n    {\r\n\r\n        void GetObjectData(UnitySerializationInfo info);\r\n        void SetObjectData(UnitySerializationInfo info);\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/Old/UnityDataFormatter.cs",
    "content": "﻿using System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing System.Runtime.Serialization;\r\nusing System.Runtime.Serialization.Formatters.Binary;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\nusing System.IO;\r\n\r\nnamespace com.spacepuppy.Serialization.Old\r\n{\r\n\r\n    [System.Obsolete(\"No longer used.\")]\r\n    public sealed class UnityDataFormatter : IFormatter, System.IDisposable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private IFormatter _formatter;\r\n        private UnitySerializationSurrogate _surrogate;\r\n        private System.Type _pooledTypeKey;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public UnityDataFormatter()\r\n        {\r\n            _formatter = new BinaryFormatter();\r\n            _surrogate = new UnitySerializationSurrogate();\r\n\r\n            _formatter.SurrogateSelector = _surrogate;\r\n        }\r\n\r\n        public UnityDataFormatter(IFormatter formatter)\r\n        {\r\n            if (formatter == null) throw new System.ArgumentNullException(\"formatter\");\r\n\r\n            _formatter = formatter;\r\n            _surrogate = new UnitySerializationSurrogate();\r\n\r\n            _formatter.SurrogateSelector = _surrogate;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Serialization Interface\r\n\r\n        public void Serialize(IUnityData data, object obj)\r\n        {\r\n            if (data == null) throw new System.ArgumentNullException(\"data\");\r\n            if (obj == null) throw new System.ArgumentNullException(\"obj\");\r\n            if (obj is UnityEngine.Object) throw new System.ArgumentException(\"Can not serialize Unity Reference Objects directly.\", \"obj\");\r\n            var tp = obj.GetType();\r\n            if (!IsUnitySerializable(tp)) throw new System.ArgumentException(\"Type of object is not serializable.\");\r\n\r\n            if (obj != null)\r\n            {\r\n                _surrogate.StartSerialization();\r\n                using (var strm = new System.IO.MemoryStream())\r\n                {\r\n                    _formatter.Serialize(strm, obj);\r\n                    strm.Position = 0;\r\n\r\n                    //byte[] arr = new byte[strm.Length];\r\n                    //strm.Read(arr, 0, arr.Length);\r\n\r\n                    data.SetData(strm, _surrogate.StopSerialization());\r\n                }\r\n            }\r\n        }\r\n\r\n        public object Deserialize(IUnityData data)\r\n        {\r\n            if (data == null || data.Size == 0) return null;\r\n\r\n            using (var strm = new System.IO.MemoryStream())\r\n            {\r\n                UnityEngine.Object[] refs;\r\n                data.GetData(strm, out refs);\r\n\r\n                strm.Position = 0;\r\n                _surrogate.StartDeserialization(refs);\r\n                var result = _formatter.Deserialize(strm);\r\n                _surrogate.StopDeserialization();\r\n                return result;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IFormatter Interface\r\n\r\n        public ISurrogateSelector SurrogateSelector\r\n        {\r\n            get\r\n            {\r\n                throw new NotImplementedException();\r\n            }\r\n\r\n            set\r\n            {\r\n                throw new NotImplementedException();\r\n            }\r\n        }\r\n\r\n        public SerializationBinder Binder\r\n        {\r\n            get { return _formatter.Binder; }\r\n            set { _formatter.Binder = value; }\r\n        }\r\n\r\n        public StreamingContext Context\r\n        {\r\n            get { return _formatter.Context; }\r\n            set { _formatter.Context = value; }\r\n        }\r\n\r\n        public void Serialize(Stream strm, object graph)\r\n        {\r\n            _formatter.Serialize(strm, graph);\r\n        }\r\n\r\n        public object Deserialize(Stream strm)\r\n        {\r\n            strm.Position = 0;\r\n            _surrogate.StartDeserialization(Enumerable.Empty<UnityEngine.Object>());\r\n            var result = _formatter.Deserialize(strm);\r\n            _surrogate.StopDeserialization();\r\n            return result;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public void Dispose()\r\n        {\r\n            ObjectCachePool<UnityDataFormatter> pool;\r\n            if (_pooledTypeKey != null && _formatterPools.TryGetValue(_pooledTypeKey, out pool))\r\n            {\r\n                pool.Release(this);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Utils\r\n\r\n        public static bool IsUnitySerializable(System.Type tp, bool supportLists = true)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n\r\n            if (tp.IsListType(true))\r\n            {\r\n                //if (supportLists)\r\n                //{\r\n                //    return IsUnitySerializable(tp.GetElementTypeOfListType());\r\n                //}\r\n                //else\r\n                //{\r\n                //    return false;\r\n                //}\r\n                return supportLists;\r\n            }\r\n            if (tp.IsEnum) return true;\r\n            if (TypeUtil.IsType(tp, typeof(UnityEngine.Object))) return true;\r\n            if (System.Attribute.IsDefined(tp, typeof(System.SerializableAttribute), false)) return true;\r\n            if (tp.IsValueType && tp.Assembly.FullName.StartsWith(\"UnityEngine\"))\r\n            {\r\n                return TypeUtil.IsType(tp, typeof(UnityEngine.Vector2),\r\n                                          typeof(UnityEngine.Vector3),\r\n                                          typeof(UnityEngine.Vector4),\r\n                                          typeof(UnityEngine.Quaternion),\r\n                                          typeof(UnityEngine.Matrix4x4),\r\n                                          typeof(UnityEngine.Color),\r\n                                          typeof(UnityEngine.LayerMask));\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Factory\r\n\r\n        private static Dictionary<System.Type, ObjectCachePool<UnityDataFormatter>> _formatterPools;\r\n\r\n        public static UnityDataFormatter GetFormatter<T>() where T : IFormatter\r\n        {\r\n            if (_formatterPools == null) _formatterPools = new Dictionary<System.Type, ObjectCachePool<UnityDataFormatter>>();\r\n\r\n            var tp = typeof(T);\r\n            UnityDataFormatter formatter;\r\n            if(_formatterPools.ContainsKey(tp))\r\n            {\r\n                formatter = _formatterPools[tp].GetInstance();\r\n            }\r\n            else\r\n            {\r\n                var pool = new ObjectCachePool<UnityDataFormatter>(10, () =>\r\n                {\r\n                    var f = new UnityDataFormatter(System.Activator.CreateInstance<T>());\r\n                    f._pooledTypeKey = typeof(T);\r\n                    return f;\r\n                });\r\n                _formatterPools.Add(tp, pool);\r\n                formatter = pool.GetInstance();\r\n            }\r\n            \r\n            return formatter;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/Old/UnityDataScriptableObject.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Serialization.Old\r\n{\r\n\r\n    [System.Obsolete(\"No longer used.\")]\r\n    public class UnityDataScriptableObject : ScriptableObject, IUnityData\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private byte[] _data;\r\n\r\n        [SerializeField()]\r\n        private UnityEngine.Object[] _unityObjectReferences;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int Size\r\n        {\r\n            get\r\n            {\r\n                var dl = (_data != null) ? _data.Length : 0;\r\n                var rl = (_unityObjectReferences != null) ? _unityObjectReferences.Length : 0;\r\n                return dl + rl;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Clear()\r\n        {\r\n            _data = new byte[] { };\r\n            _unityObjectReferences = new UnityEngine.Object[] { };\r\n        }\r\n\r\n        void IUnityData.SetData(System.IO.Stream data, Object[] refs)\r\n        {\r\n            _data = data.ToByteArray();\r\n            _unityObjectReferences = refs ?? new UnityEngine.Object[] { };\r\n        }\r\n\r\n        void IUnityData.GetData(System.IO.Stream data, out Object[] refs)\r\n        {\r\n            data.Write(_data, 0, _data.Length);\r\n            refs = _unityObjectReferences;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/Old/UnitySerializationInfo.cs",
    "content": "﻿using System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing System.Runtime.Serialization;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Serialization.Old\r\n{\r\n\r\n    [System.Obsolete(\"No longer used.\")]\r\n    public sealed class UnitySerializationInfo\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private const string EXCEPTION_INVALIDSTATE_MSG = \"UnitySerializationInfo was not initialized properly and can not be accessed at this time.\";\r\n\r\n        private Stack<UnitySerializationContext> _contextStack = new Stack<UnitySerializationContext>();\r\n\r\n        private List<UnityEngine.Object> _unityObjectReferences = new List<UnityEngine.Object>();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        internal UnitySerializationInfo()\r\n        {\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool Ready { get { return _contextStack.Count > 0; } }\r\n\r\n        #endregion\r\n\r\n        #region Internal Interface\r\n\r\n        private SerializationInfo _currentInfo { get { return _contextStack.Peek().SerializationInfo; } }\r\n\r\n        internal List<UnityEngine.Object> UnityObjectReferences { get { return _unityObjectReferences; } }\r\n\r\n        internal void Reset()\r\n        {\r\n            _unityObjectReferences.Clear();\r\n        }\r\n\r\n        internal void Reset(IEnumerable<UnityEngine.Object> refs)\r\n        {\r\n            _unityObjectReferences.Clear();\r\n            if (refs != null) _unityObjectReferences.AddRange(refs);\r\n        }\r\n\r\n        internal void StartContext(SerializationInfo info, StreamingContext context)\r\n        {\r\n            if (info == null) throw new System.ArgumentNullException(\"info\");\r\n\r\n            _contextStack.Push(new UnitySerializationContext(info, context));\r\n        }\r\n\r\n        internal void EndContext()\r\n        {\r\n            _contextStack.Pop();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region AddValue Methods\r\n\r\n        public void AddUnityObjectReference(string name, UnityEngine.Object obj)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            if(_unityObjectReferences.Contains(obj))\r\n            {\r\n                _currentInfo.AddValue(name, _unityObjectReferences.IndexOf(obj));\r\n            }\r\n            else\r\n            {\r\n                int index = _unityObjectReferences.Count;\r\n                _unityObjectReferences.Add(obj);\r\n                _currentInfo.AddValue(name, index);\r\n            }\r\n        }\r\n\r\n        public void AddValue(string name, object value, System.Type tp)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n            if (value != null && !TypeUtil.IsType(value.GetType(), tp)) throw new TypeArgumentMismatchException(value.GetType(), tp, \"Value must be of the type specified.\", \"value\");\r\n\r\n            if (TypeUtil.IsType(tp, typeof(UnityEngine.Object)))\r\n            {\r\n                this.AddUnityObjectReference(name, value as UnityEngine.Object);\r\n            }\r\n            else if(typeof(DummyList).IsAssignableFrom(tp))\r\n            {\r\n                _currentInfo.AddValue(name, value, tp);\r\n            }\r\n            else if (tp.IsListType(true))\r\n            {\r\n                this.AddList(name, value as System.Collections.IList, tp.GetElementTypeOfListType(), tp.IsArray);\r\n            }\r\n            else\r\n            {\r\n                _currentInfo.AddValue(name, value, tp);\r\n            }\r\n        }\r\n\r\n        public void AddValue(string name, bool value)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            _currentInfo.AddValue(name, value);\r\n        }\r\n\r\n        public void AddValue(string name, byte value)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            _currentInfo.AddValue(name, value);\r\n        }\r\n\r\n        public void AddValue(string name, char value)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            _currentInfo.AddValue(name, value);\r\n        }\r\n\r\n        public void AddValue(string name, System.DateTime value)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            _currentInfo.AddValue(name, value);\r\n        }\r\n\r\n        public void AddValue(string name, decimal value)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            _currentInfo.AddValue(name, value);\r\n        }\r\n\r\n        public void AddValue(string name, double value)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            _currentInfo.AddValue(name, value);\r\n        }\r\n\r\n        public void AddValue(string name, System.Int16 value)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            _currentInfo.AddValue(name, value);\r\n        }\r\n\r\n        public void AddValue(string name, System.Int32 value)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            _currentInfo.AddValue(name, value);\r\n        }\r\n\r\n        public void AddValue(string name, System.Int64 value)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            _currentInfo.AddValue(name, value);\r\n        }\r\n\r\n        public void AddValue(string name, sbyte value)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            _currentInfo.AddValue(name, value);\r\n        }\r\n\r\n        public void AddValue(string name, float value)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            _currentInfo.AddValue(name, value);\r\n        }\r\n\r\n        public void AddValue(string name, string value)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            _currentInfo.AddValue(name, value);\r\n        }\r\n\r\n        public void AddValue(string name, System.UInt16 value)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            _currentInfo.AddValue(name, value);\r\n        }\r\n\r\n        public void AddValue(string name, System.UInt32 value)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            _currentInfo.AddValue(name, value);\r\n        }\r\n\r\n        public void AddValue(string name, System.UInt64 value)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            _currentInfo.AddValue(name, value);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region GetValue Methods\r\n\r\n        public UnityEngine.Object GetUnityObjectReference(string name)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            int index = _currentInfo.GetInt32(name);\r\n            if(index >= 0 && index < _unityObjectReferences.Count)\r\n            {\r\n                return _unityObjectReferences[index];\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public object GetValue(string name, System.Type tp)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            if(TypeUtil.IsType(tp, typeof(UnityEngine.Object)))\r\n            {\r\n                return this.GetUnityObjectReference(name);\r\n            }\r\n            else if(tp.IsListType(true))\r\n            {\r\n                var value = _currentInfo.GetValue(name, typeof(DummyList)) as DummyList;\r\n\r\n                if(value != null)\r\n                {\r\n                    return value.List;\r\n                }\r\n                else\r\n                {\r\n                    return null;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return _currentInfo.GetValue(name, tp);\r\n            }\r\n        }\r\n\r\n        public bool GetBoolean(string name)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            return _currentInfo.GetBoolean(name);\r\n        }\r\n\r\n        public byte GetByte(string name)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            return _currentInfo.GetByte(name);\r\n        }\r\n\r\n        public char GetChar(string name)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            return _currentInfo.GetChar(name);\r\n        }\r\n\r\n        public System.DateTime GetDateTime(string name)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            return _currentInfo.GetDateTime(name);\r\n        }\r\n\r\n        public decimal GetDecimal(string name)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            return _currentInfo.GetDecimal(name);\r\n        }\r\n\r\n        public double GetDouble(string name)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            return _currentInfo.GetDouble(name);\r\n        }\r\n\r\n        public System.Int16 GetInt16(string name)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            return _currentInfo.GetInt16(name);\r\n        }\r\n\r\n        public System.Int32 GetInt32(string name)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            return _currentInfo.GetInt32(name);\r\n        }\r\n\r\n        public System.Int64 GetInt64(string name)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            return _currentInfo.GetInt64(name);\r\n        }\r\n\r\n        public sbyte GetSByte(string name)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            return _currentInfo.GetSByte(name);\r\n        }\r\n\r\n        public float GetSingle(string name)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            return _currentInfo.GetSingle(name);\r\n        }\r\n\r\n        public string GetString(string name)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            return _currentInfo.GetString(name);\r\n        }\r\n\r\n        public System.UInt16 GetUInt16(string name)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            return _currentInfo.GetUInt16(name);\r\n        }\r\n\r\n        public System.UInt32 GetUInt32(string name)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            return _currentInfo.GetUInt32(name);\r\n        }\r\n\r\n        public System.UInt64 GetUInt64(string name)\r\n        {\r\n            if (!this.Ready) throw new System.InvalidOperationException(EXCEPTION_INVALIDSTATE_MSG);\r\n\r\n            return _currentInfo.GetUInt64(name);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region AddList Methods\r\n\r\n        public void AddList(string name, System.Collections.IList lst, System.Type elementType)\r\n        {\r\n            this.AddList(name, lst, elementType, false);\r\n        }\r\n\r\n        public void AddArray(string name, System.Array lst, System.Type elementType)\r\n        {\r\n            this.AddList(name, lst, elementType, true);\r\n        }\r\n\r\n        private void AddList(string name, System.Collections.IList lst, System.Type elementType, bool isArray)\r\n        {\r\n            var dummy = new DummyList(lst, elementType, isArray);\r\n            _currentInfo.AddValue(name, dummy, typeof(DummyList));\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region GetList Methods\r\n\r\n        public System.Collections.IList GetList(string name)\r\n        {\r\n            var dummy = _currentInfo.GetValue(name, typeof(DummyList)) as DummyList;\r\n            if(dummy != null)\r\n            {\r\n                return dummy.List;\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public System.Array GetArray(string name)\r\n        {\r\n            var dummy = _currentInfo.GetValue(name, typeof(DummyList)) as DummyList;\r\n            if (dummy != null)\r\n            {\r\n                return dummy.List as System.Array;\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Special Types\r\n\r\n        private struct UnitySerializationContext\r\n        {\r\n\r\n            public SerializationInfo SerializationInfo;\r\n            public StreamingContext StreamingContext;\r\n\r\n            public UnitySerializationContext(SerializationInfo info, StreamingContext context)\r\n            {\r\n                this.SerializationInfo = info;\r\n                this.StreamingContext = context;\r\n            }\r\n\r\n        }\r\n\r\n\r\n        [System.Serializable()]\r\n        private class DummyList : IUnitySerializable, ISerializable\r\n        {\r\n\r\n            [System.NonSerialized()]\r\n            private System.Collections.IList _lst;\r\n            [System.NonSerialized()]\r\n            private System.Type _elementType;\r\n            [System.NonSerialized()]\r\n            private bool _isArray;\r\n\r\n            public DummyList()\r\n            {\r\n\r\n            }\r\n\r\n            public DummyList(System.Collections.IList lst, System.Type elType, bool isArray)\r\n            {\r\n                _lst = lst;\r\n                _elementType = elType;\r\n                _isArray = isArray;\r\n            }\r\n\r\n            public System.Collections.IList List { get { return _lst; } }\r\n\r\n\r\n            #region IUnitySerializable Interface\r\n\r\n            public void GetObjectData(UnitySerializationInfo info)\r\n            {\r\n                int cnt = (_lst != null) ? _lst.Count : 0;\r\n                info.AddValue(\"count\", cnt);\r\n                info.AddValue(\"assembly\", _elementType.Assembly.GetName().Name);\r\n                info.AddValue(\"type\", _elementType.FullName);\r\n                info.AddValue(\"isArray\", _isArray);\r\n\r\n                for (int i = 0; i < cnt; i++)\r\n                {\r\n                    info.AddValue(\"element\" + i.ToString(), _lst[i], _elementType);\r\n                }\r\n            }\r\n\r\n            public void SetObjectData(UnitySerializationInfo info)\r\n            {\r\n                var cnt = info.GetInt32(\"count\");\r\n                _elementType = TypeUtil.ParseType(info.GetString(\"assembly\"), info.GetString(\"type\"));\r\n                _isArray = info.GetBoolean(\"isArray\");\r\n\r\n                if (_isArray)\r\n                {\r\n                    var arr = System.Array.CreateInstance(_elementType, cnt);\r\n                    for (int i = 0; i < cnt; i++)\r\n                    {\r\n                        arr.SetValue(info.GetValue(\"element\" + i.ToString(), _elementType), i);\r\n                    }\r\n                    _lst = arr as System.Collections.IList;\r\n                }\r\n                else\r\n                {\r\n                    var lstType = typeof(List<>);\r\n                    var genLstType = lstType.MakeGenericType(_elementType);\r\n                    var lst = System.Activator.CreateInstance(genLstType) as System.Collections.IList;\r\n                    for (int i = 0; i < cnt; i++)\r\n                    {\r\n                        lst.Add(info.GetValue(\"element\" + i.ToString(), _elementType));\r\n                    }\r\n                    _lst = lst;\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region ISerializable Interface\r\n\r\n            void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)\r\n            {\r\n                int cnt = (_lst != null) ? _lst.Count : 0;\r\n                info.AddValue(\"count\", cnt);\r\n                info.AddValue(\"assembly\", _elementType.Assembly.GetName().Name);\r\n                info.AddValue(\"type\", _elementType.FullName);\r\n                info.AddValue(\"isArray\", _isArray);\r\n\r\n                for (int i = 0; i < cnt; i++)\r\n                {\r\n                    info.AddValue(\"element\" + i.ToString(), _lst[i]);\r\n                }\r\n            }\r\n\r\n            protected DummyList(SerializationInfo info, StreamingContext context)\r\n            {\r\n                var cnt = info.GetInt32(\"count\");\r\n                _elementType = TypeUtil.ParseType(info.GetString(\"assembly\"), info.GetString(\"type\"));\r\n                _isArray = info.GetBoolean(\"isArray\");\r\n\r\n                if (_isArray)\r\n                {\r\n                    var arr = System.Array.CreateInstance(_elementType, cnt);\r\n                    for (int i = 0; i < cnt; i++)\r\n                    {\r\n                        arr.SetValue(info.GetValue(\"element\" + i.ToString(), _elementType), i);\r\n                    }\r\n                    _lst = arr as System.Collections.IList;\r\n                }\r\n                else\r\n                {\r\n                    var lstType = typeof(List<>);\r\n                    var genLstType = lstType.MakeGenericType(_elementType);\r\n                    var lst = System.Activator.CreateInstance(genLstType) as System.Collections.IList;\r\n                    for (int i = 0; i < cnt; i++)\r\n                    {\r\n                        lst.Add(info.GetValue(\"element\" + i.ToString(), _elementType));\r\n                    }\r\n                    _lst = lst;\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Static Utils\r\n\r\n        private static string CalculateDepthId(Stack<UnitySerializationContext> stack)\r\n        {\r\n            return string.Join(\"->\", (from c in stack.Reverse() select c.SerializationInfo.FullTypeName).ToArray());\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/Old/UnitySerializationSurrogate.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nusing System.Reflection;\r\nusing System.Runtime.Serialization;\r\n\r\nnamespace com.spacepuppy.Serialization.Old\r\n{\r\n\r\n    [System.Obsolete(\"No longer used.\")]\r\n    internal class UnitySerializationSurrogate : ISerializationSurrogate, ISurrogateSelector\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private UnitySerializationInfo _unitySerialInfo = new UnitySerializationInfo();\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        internal void StartSerialization()\r\n        {\r\n            _unitySerialInfo.Reset();\r\n        }\r\n\r\n        internal UnityEngine.Object[] StopSerialization()\r\n        {\r\n            var refs = _unitySerialInfo.UnityObjectReferences.ToArray();\r\n            _unitySerialInfo.Reset();\r\n            return refs;\r\n        }\r\n\r\n        internal void StartDeserialization(IEnumerable<UnityEngine.Object> refs)\r\n        {\r\n            _unitySerialInfo.Reset(refs);\r\n        }\r\n\r\n        internal void StopDeserialization()\r\n        {\r\n            _unitySerialInfo.Reset();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISerializationSurrogate Interface\r\n\r\n        public void GetObjectData(object obj, System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)\r\n        {\r\n            _unitySerialInfo.StartContext(info, context);\r\n\r\n            var tp = obj.GetType();\r\n            if (obj is IUnitySerializable)\r\n            {\r\n                (obj as IUnitySerializable).GetObjectData(_unitySerialInfo);\r\n            }\r\n            else\r\n            {\r\n                foreach(var fi in GetAllSerializableFields(tp))\r\n                {\r\n                    try\r\n                    {\r\n                        _unitySerialInfo.AddValue(fi.Name, fi.GetValue(obj), fi.FieldType);\r\n                    } catch (SerializationException ex)\r\n                    {\r\n                        UnityEngine.Debug.LogWarning(\"Spacepuppy Unity Serialization: \" + ex.Message);\r\n                    }\r\n                }\r\n            }\r\n            _unitySerialInfo.EndContext();\r\n        }\r\n\r\n        public object SetObjectData(object obj, System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context, System.Runtime.Serialization.ISurrogateSelector selector)\r\n        {\r\n            _unitySerialInfo.StartContext(info, context);\r\n\r\n            if (obj is IUnitySerializable)\r\n            {\r\n                (obj as IUnitySerializable).SetObjectData(_unitySerialInfo);\r\n            }\r\n            else\r\n            {\r\n                var tp = obj.GetType();\r\n                foreach (var fi in GetAllSerializableFields(tp))\r\n                {\r\n                    try\r\n                    {\r\n                        var value = _unitySerialInfo.GetValue(fi.Name, fi.FieldType);\r\n                        fi.SetValue(obj, value);\r\n                    }\r\n                    catch\r\n                    {\r\n                        //do nothing\r\n                    }\r\n                }\r\n            }\r\n            _unitySerialInfo.EndContext();\r\n\r\n            return obj;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISurrogateSelector Interface\r\n\r\n        void ISurrogateSelector.ChainSelector(ISurrogateSelector selector)\r\n        {\r\n        }\r\n\r\n        ISurrogateSelector ISurrogateSelector.GetNextSelector()\r\n        {\r\n            return null;\r\n        }\r\n\r\n        ISerializationSurrogate ISurrogateSelector.GetSurrogate(Type type, StreamingContext context, out ISurrogateSelector selector)\r\n        {\r\n            if (UnityDataFormatter.IsUnitySerializable(type))\r\n            {\r\n                selector = this;\r\n                return this;\r\n            }\r\n            else\r\n            {\r\n                selector = null;\r\n                return null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Utils\r\n\r\n        internal static IEnumerable<FieldInfo> GetAllSerializableFields(System.Type tp)\r\n        {\r\n            var nonSerializedAttrib = typeof(System.NonSerializedAttribute);\r\n            var serializedAttrib = typeof(UnityEngine.SerializeField);\r\n\r\n            while(tp != null)\r\n            {\r\n                foreach(var fi in tp.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly))\r\n                {\r\n                    if (UnityDataFormatter.IsUnitySerializable(fi.FieldType))\r\n                    {\r\n                        if (fi.IsPublic)\r\n                        {\r\n                            if (!System.Attribute.IsDefined(fi, nonSerializedAttrib)) yield return fi;\r\n                        }\r\n                        else\r\n                        {\r\n                            if (System.Attribute.IsDefined(fi, serializedAttrib)) yield return fi;\r\n                        }\r\n                    }\r\n                }\r\n                tp = tp.BaseType;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/PersistantAssetToken.cs",
    "content": "﻿using System;\r\nusing System.Runtime.Serialization;\r\n\r\nusing com.spacepuppy.Project;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Serialization\r\n{\r\n\r\n    [System.Serializable()]\r\n    public class PersistantAssetToken : IPersistantUnityObject\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [System.NonSerialized()]\r\n        protected IPersistantAsset _asset;\r\n\r\n        [System.NonSerialized()]\r\n        private SerializationInfo _info;\r\n        [System.NonSerialized()]\r\n        private StreamingContext _context;\r\n        [System.NonSerialized()]\r\n        private IAssetBundle _bundle;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public PersistantAssetToken(IPersistantAsset obj)\r\n        {\r\n            _asset = obj;\r\n        }\r\n\r\n        public PersistantAssetToken()\r\n        {\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        /// <summary>\r\n        /// The asset to serialize, this value will be null after deserialization. See 'Create' for after deserialization.\r\n        /// </summary>\r\n        public IPersistantAsset Asset\r\n        {\r\n            get { return _asset; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// Create just the root object from the asset, will still need to apply all serialized data to the object.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        protected object CreateRoot()\r\n        {\r\n            if (_bundle == null) return null;\r\n\r\n            var resourceId = _info.GetString(\"sp*id\");\r\n            var obj = _bundle.LoadAsset(resourceId);\r\n            if (obj == null) return null;\r\n\r\n            obj = UnityEngine.Object.Instantiate(obj);\r\n            var pobj = ObjUtil.GetAsFromSource<IPersistantAsset>(obj);\r\n            return (object)pobj ?? (object)obj;\r\n        }\r\n\r\n        protected void SetObjectData(object obj)\r\n        {\r\n            if (_bundle == null) return;\r\n\r\n            var pobj = ObjUtil.GetAsFromSource<IPersistantAsset>(obj);\r\n            if (pobj != null) pobj.OnDeserialize(_info, _context, _bundle);\r\n        }\r\n\r\n        /// <summary>\r\n        /// After deserializing the token, call this to get a copy of the UnityObject.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public object Create()\r\n        {\r\n            var obj = this.CreateRoot();\r\n            this.SetObjectData(obj);\r\n            return obj;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IPersistantUnityObject Interface\r\n\r\n        public void OnSerialize(SerializationInfo info, StreamingContext context)\r\n        {\r\n            if (_asset == null) return;\r\n            \r\n            info.AddValue(\"sp*id\", _asset.AssetId);\r\n            _asset.OnSerialize(info, context);\r\n        }\r\n\r\n        public void OnDeserialize(SerializationInfo info, StreamingContext context, IAssetBundle assetBundle)\r\n        {\r\n            _info = info;\r\n            _context = context;\r\n            _bundle = assetBundle;\r\n        }\r\n        \r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/PersistantUnityObjectSerializedProxy.cs",
    "content": "﻿\r\nusing System;\r\nusing System.Runtime.Serialization;\r\n\r\nusing com.spacepuppy.Project;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Serialization\r\n{\r\n\r\n    [System.Serializable()]\r\n    internal class PersistantUnityObjectSerializedProxy : IDeserializationCallback\r\n    {\r\n        \r\n        internal void OnSerialize(IPersistantAsset obj, SerializationInfo info, StreamingContext context)\r\n        {\r\n            if (obj == null) return;\r\n\r\n            info.AddValue(\"sp*id\", obj.AssetId);\r\n            obj.OnSerialize(info, context);\r\n        }\r\n        \r\n\r\n\r\n        public void OnDeserialize(SerializationInfo info, StreamingContext context, IAssetBundle assetBundle)\r\n        {\r\n            //if (assetBundle == null) return null;\r\n\r\n            //var resourceId = info.GetString(\"sp*id\");\r\n            //var obj = assetBundle.LoadAsset(resourceId);\r\n            //if (obj == null) return null;\r\n\r\n            //obj = UnityEngine.Object.Instantiate(obj);\r\n\r\n            //foreach (var pobj in ComponentUtil.GetComponentsFromSource<IPersistantUnityObjectToken>(obj))\r\n            //{\r\n            //    pobj.OnDeserialize(info, context, assetBundle);\r\n            //}\r\n\r\n            //return obj;\r\n\r\n            \r\n            _info = info;\r\n            _context = context;\r\n            _bundle = assetBundle;\r\n        }\r\n\r\n        \r\n        private SerializationInfo _info;\r\n        private StreamingContext _context;\r\n        private IAssetBundle _bundle;\r\n\r\n        void IDeserializationCallback.OnDeserialization(object sender)\r\n        {\r\n            if (_bundle == null) return;\r\n\r\n            var resourceId = _info.GetString(\"sp*id\");\r\n            var obj = _bundle.LoadAsset(resourceId);\r\n            if (obj == null) return;\r\n\r\n            obj = UnityEngine.Object.Instantiate(obj);\r\n\r\n            foreach (var pobj in ComponentUtil.GetComponentsFromSource<IPersistantAsset>(obj))\r\n            {\r\n                pobj.OnDeserialize(_info, _context, _bundle);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/PersistentGameObject.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing System.Runtime.Serialization;\r\n\r\nusing com.spacepuppy.Geom;\r\nusing com.spacepuppy.Project;\r\nusing com.spacepuppy.Utils;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.Serialization\r\n{\r\n    \r\n    public class PersistentGameObject : MonoBehaviour, IPersistantAsset\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"PrefabId\")]\r\n        private string _assetId;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public string AssetId\r\n        {\r\n            get { return _assetId; }\r\n            set { _assetId = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IPersistantUnityObject Interface\r\n\r\n        string IPersistantAsset.AssetId { get { return _assetId; } }\r\n\r\n        void IPersistantUnityObject.OnSerialize(SerializationInfo info, StreamingContext context)\r\n        {\r\n            info.AddValue(\"pos\", this.transform.position);\r\n            info.AddValue(\"rot\", this.transform.rotation);\r\n            info.AddValue(\"scale\", this.transform.localScale);\r\n            \r\n            var arr = this.GetComponentsInChildren<IPersistantUnityObject>();\r\n            if(arr.Length > 0)\r\n            {\r\n                var data = new ChildObjectData();\r\n                int cnt = 0;\r\n\r\n                for (int i = 0; i < arr.Length; i++)\r\n                {\r\n                    if (object.ReferenceEquals(this, arr[i])) continue;\r\n\r\n                    data.Path = GameObjectUtil.GetPathNameRelativeTo((arr[i] as Component).transform, this.transform);\r\n                    data.ComponentType = arr[i].GetType();\r\n                    data.Pobj = arr[i];\r\n                    info.AddValue(cnt.ToString(), data, typeof(ChildObjectData));\r\n                    cnt++;\r\n                }\r\n                info.AddValue(\"count\", cnt);\r\n            }\r\n        }\r\n\r\n        void IPersistantUnityObject.OnDeserialize(SerializationInfo info, StreamingContext context, IAssetBundle assetBundle)\r\n        {\r\n            this.transform.position = (Vector3)info.GetValue(\"pos\", typeof(Vector3));\r\n            this.transform.rotation = (Quaternion)info.GetValue(\"rot\", typeof(Quaternion));\r\n            this.transform.localScale = (Vector3)info.GetValue(\"scale\", typeof(Vector3));\r\n\r\n            int cnt = info.GetInt32(\"count\");\r\n            for(int i = 0; i < cnt; i++)\r\n            {\r\n                ChildObjectData data = (ChildObjectData)info.GetValue(i.ToString(), typeof(ChildObjectData));\r\n                if (data != null && data.ComponentType != null)\r\n                {\r\n                    IPersistantUnityObject pobj = ComponentUtil.GetComponentFromSource(data.ComponentType, (data.Path != null) ? this.transform.Find(data.Path) : this.transform) as IPersistantUnityObject;\r\n                    if (pobj != null)\r\n                    {\r\n                        pobj.OnDeserialize(data.DeserializeInfo, data.DeserializeContext, assetBundle);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        [System.Serializable()]\r\n        private class ChildObjectData : ISerializable\r\n        {\r\n\r\n            [System.NonSerialized()]\r\n            public string Path;\r\n            [System.NonSerialized()]\r\n            public System.Type ComponentType;\r\n\r\n            [System.NonSerialized()]\r\n            public IPersistantUnityObject Pobj;\r\n            [System.NonSerialized()]\r\n            public SerializationInfo DeserializeInfo;\r\n            [System.NonSerialized()]\r\n            public StreamingContext DeserializeContext;\r\n\r\n            public ChildObjectData()\r\n            {\r\n            }\r\n\r\n\r\n            public ChildObjectData(SerializationInfo info, StreamingContext context)\r\n            {\r\n                this.DeserializeInfo = info;\r\n                this.DeserializeContext = context;\r\n                this.Path = info.GetString(\"sp_p\");\r\n                this.ComponentType = info.GetValue(\"sp_t\", typeof(System.Type)) as System.Type;\r\n            }\r\n\r\n            public void GetObjectData(SerializationInfo info, StreamingContext context)\r\n            {\r\n                info.AddValue(\"sp_p\", this.Path);\r\n                info.AddValue(\"sp_t\", this.ComponentType, typeof(System.Type));\r\n                if (Pobj != null) Pobj.OnSerialize(info, context);\r\n            }\r\n            \r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/SPSerializationSurrogate.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nusing System.Runtime.Serialization;\r\n\r\nusing com.spacepuppy.Project;\r\n\r\nnamespace com.spacepuppy.Serialization\r\n{\r\n    internal class SPSerializationSurrogate : ISerializationSurrogate, ISurrogateSelector, IDisposable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private ISurrogateSelector _nextSelector;\r\n        \r\n        private IAssetBundle _assets;\r\n\r\n        private AutoPersistantAssetToken _proxy;\r\n\r\n        #endregion\r\n        \r\n        #region Properties\r\n\r\n        public IAssetBundle AssetBundle\r\n        {\r\n            get { return _assets; }\r\n            set { _assets = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISurrogateSelector Interface\r\n\r\n        public void ChainSelector(ISurrogateSelector selector)\r\n        {\r\n            _nextSelector = selector;\r\n        }\r\n\r\n        public ISurrogateSelector GetNextSelector()\r\n        {\r\n            return _nextSelector;\r\n        }\r\n\r\n        public ISerializationSurrogate GetSurrogate(Type type, StreamingContext context, out ISurrogateSelector selector)\r\n        {\r\n            if (SPSerializer.IsSpeciallySerialized(type))\r\n            {\r\n                selector = this;\r\n                return this;\r\n            }\r\n            else if(_nextSelector != null)\r\n            {\r\n                return _nextSelector.GetSurrogate(type, context, out selector);\r\n            }\r\n            else\r\n            {\r\n                selector = null;\r\n                return null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISerializationSurrogate Interface\r\n\r\n        public void GetObjectData(object obj, SerializationInfo info, StreamingContext context)\r\n        {\r\n            if(obj is IPersistantUnityObject)\r\n            {\r\n                if (obj is PersistantAssetToken)\r\n                {\r\n                    (obj as PersistantAssetToken).OnSerialize(info, context);\r\n                }\r\n                else if (obj is IPersistantAsset)\r\n                {\r\n                    if (_proxy == null)\r\n                        _proxy = new AutoPersistantAssetToken();\r\n\r\n                    info.SetType(typeof(AutoPersistantAssetToken));\r\n                    _proxy.SetObject(obj as IPersistantAsset);\r\n                    _proxy.OnSerialize(info, context);\r\n                    _proxy.SetObject(null);\r\n                }\r\n                else\r\n                {\r\n                    throw new SerializationException(\"IPersistantUnityObjects should be handled by an IPersistantAsset, not directly by the serializtion engine.\");\r\n                }\r\n            }\r\n            else\r\n            {\r\n                SimpleUnityStructureSurrogate.AddValue(obj, info, context);\r\n            }\r\n        }\r\n\r\n        public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)\r\n        {\r\n            if(obj is IPersistantUnityObject)\r\n            {\r\n                (obj as IPersistantUnityObject).OnDeserialize(info, context, _assets);\r\n                if (obj is AutoPersistantAssetToken)\r\n                    return (obj as AutoPersistantAssetToken).PreemptiveCreate();\r\n                return obj;\r\n            }\r\n            else\r\n            {\r\n                return SimpleUnityStructureSurrogate.GetValue(obj, info, context);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        void IDisposable.Dispose()\r\n        {\r\n            if (_proxy != null) _proxy.SetObject(null);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region Special Types\r\n        \r\n        /// <summary>\r\n        /// This is used internally to handle automatically creating an asset on deserialize, rather than requiring the user to call Create on the PersistantAssetToken. \r\n        /// This is used when someone has serialized a IPersistantAsset directly, rather than tokenizing it.\r\n        /// </summary>\r\n        [System.Serializable()]\r\n        private class AutoPersistantAssetToken : PersistantAssetToken, IDeserializationCallback\r\n        {\r\n\r\n\r\n            //serialize helper\r\n            public void SetObject(IPersistantAsset obj)\r\n            {\r\n                this._asset = obj;\r\n            }\r\n\r\n            //deserialize helper\r\n            private object _obj;\r\n            public object PreemptiveCreate()\r\n            {\r\n                _obj = this.CreateRoot();\r\n                return _obj;\r\n            }\r\n\r\n            #region IDeserializationCallback Interface\r\n\r\n            public void OnDeserialization(object sender)\r\n            {\r\n                this.SetObjectData(_obj);\r\n            }\r\n\r\n            #endregion\r\n            \r\n        }\r\n\r\n        /// <summary>\r\n        /// Serializable token that represents a UnityObject in SP Serialized data.\r\n        /// </summary>\r\n        [System.Serializable()]\r\n        private struct UnityObjectPointer\r\n        {\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/SPSerializer.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Runtime.Serialization;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Project;\r\n\r\nnamespace com.spacepuppy.Serialization\r\n{\r\n\r\n    public class SPSerializer : SurrogateSelector, IDisposable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private ISurrogateSelector _formattersSurrogateSelector;\r\n        private SPSerializationSurrogate _specialSurrogate = new SPSerializationSurrogate();\r\n        \r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public SPSerializer()\r\n        {\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IAssetBundle AssetBundle\r\n        {\r\n            get;\r\n            set;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Serialize(IFormatter formatter, Stream serializationStream, object graph)\r\n        {\r\n            if (formatter == null) throw new System.ArgumentNullException(\"formatter\");\r\n            if (serializationStream == null) throw new System.ArgumentNullException(\"serializationStream\");\r\n\r\n            _formattersSurrogateSelector = formatter.SurrogateSelector;\r\n            formatter.SurrogateSelector = this;\r\n            formatter.Serialize(serializationStream, graph);\r\n            formatter.SurrogateSelector = _formattersSurrogateSelector;\r\n        }\r\n        \r\n        public object Deserialize(IFormatter formatter, Stream serializationStream)\r\n        {\r\n            if (formatter == null) throw new System.ArgumentNullException(\"formatter\");\r\n            if (serializationStream == null) throw new System.ArgumentNullException(\"serializationStream\");\r\n\r\n            _formattersSurrogateSelector = formatter.SurrogateSelector;\r\n            formatter.SurrogateSelector = this;\r\n            var result = formatter.Deserialize(serializationStream);\r\n            formatter.SurrogateSelector = _formattersSurrogateSelector;\r\n\r\n            return result;\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region ISurrogateSelector Interface\r\n\r\n        public override ISerializationSurrogate GetSurrogate(Type type, StreamingContext context, out ISurrogateSelector selector)\r\n        {\r\n            ISerializationSurrogate surrogate = null;\r\n            selector = null;\r\n            if (_formattersSurrogateSelector != null)\r\n            {\r\n                surrogate = _formattersSurrogateSelector.GetSurrogate(type, context, out selector);\r\n            }\r\n            if(surrogate == null)\r\n            {\r\n                surrogate = base.GetSurrogate(type, context, out selector);\r\n            }\r\n            if (surrogate == null && SPSerializer.IsSpeciallySerialized(type))\r\n            {\r\n                selector = this;\r\n                surrogate = _specialSurrogate;\r\n            }\r\n\r\n            return surrogate;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public void Dispose()\r\n        {\r\n            _formattersSurrogateSelector = null;\r\n            this.AssetBundle = null;\r\n            _pool.Release(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Is Serialized By This Test\r\n        \r\n        public static bool IsSpeciallySerialized(System.Type tp)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n\r\n            if (typeof(IPersistantUnityObject).IsAssignableFrom(tp)) return true;\r\n\r\n            return SimpleUnityStructureSurrogate.IsSpeciallySerialized(tp);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Static Factory\r\n\r\n        private static ObjectCachePool<SPSerializer> _pool = new ObjectCachePool<SPSerializer>(10, () => new SPSerializer());\r\n        public static SPSerializer Create()\r\n        {\r\n            return _pool.GetInstance();\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/SerializationHelper.cs",
    "content": "﻿using System;\r\nusing System.IO;\r\nusing System.Runtime.Serialization;\r\n\r\nusing com.spacepuppy.Project;\r\n\r\nnamespace com.spacepuppy.Serialization\r\n{\r\n\r\n    [System.Obsolete(\"Use SPSerializer directly.\")]\r\n    public static class SerializationHelper\r\n    {\r\n\r\n        #region Formatter Factory\r\n\r\n        private static com.spacepuppy.Collections.ObjectCachePool<System.Runtime.Serialization.Formatters.Binary.BinaryFormatter> _simpleFormatters = new com.spacepuppy.Collections.ObjectCachePool<System.Runtime.Serialization.Formatters.Binary.BinaryFormatter>(10, () => {\r\n            var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();\r\n            formatter.Context = new StreamingContext(StreamingContextStates.All);\r\n            formatter.SurrogateSelector = new SimpleUnityStructureSurrogate();\r\n            return formatter;\r\n        });\r\n        \r\n        #endregion\r\n\r\n\r\n\r\n\r\n        public static void SimpleSerialize(Stream strm, object obj)\r\n        {\r\n            if (strm == null) throw new System.ArgumentNullException(\"strm\");\r\n\r\n            if (obj != null)\r\n            {\r\n                var formatter = _simpleFormatters.GetInstance();\r\n                try\r\n                {\r\n                    formatter.Serialize(strm, obj);\r\n                }\r\n                catch (System.Exception ex)\r\n                {\r\n                    throw ex;\r\n                }\r\n                finally\r\n                {\r\n                    _simpleFormatters.Release(formatter);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static object SimpleDeserialize(Stream strm)\r\n        {\r\n            if (strm == null) throw new System.ArgumentNullException(\"strm\");\r\n\r\n            var formatter = _simpleFormatters.GetInstance();\r\n            try\r\n            {\r\n                return formatter.Deserialize(strm);\r\n            }\r\n            catch (System.Exception ex)\r\n            {\r\n                throw ex;\r\n            }\r\n            finally\r\n            {\r\n                _simpleFormatters.Release(formatter);\r\n            }\r\n        }\r\n\r\n        public static void Serialize(Stream strm, object obj)\r\n        {\r\n            if (strm == null) throw new System.ArgumentNullException(\"strm\");\r\n\r\n            if (obj != null)\r\n            {\r\n                using (var serializer = SPSerializer.Create())\r\n                {\r\n                    var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();\r\n                    serializer.Serialize(formatter, strm, obj);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static object Deserialize(Stream strm)\r\n        {\r\n            if (strm == null) throw new System.ArgumentNullException(\"strm\");\r\n            \r\n            using (var serializer = SPSerializer.Create())\r\n            {\r\n                var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();\r\n                return serializer.Deserialize(formatter, strm);\r\n            }\r\n        }\r\n\r\n        public static void Serialize(Stream strm, object obj, IAssetBundle assetBundle)\r\n        {\r\n            if (strm == null) throw new System.ArgumentNullException(\"strm\");\r\n\r\n            if (obj != null)\r\n            {\r\n                using (var serializer = SPSerializer.Create())\r\n                {\r\n                    var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();\r\n                    serializer.AssetBundle = assetBundle;\r\n                    serializer.Serialize(formatter, strm, obj);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static object Deserialize(Stream strm, IAssetBundle assetBundle)\r\n        {\r\n            if (strm == null) throw new System.ArgumentNullException(\"strm\");\r\n\r\n            using (var serializer = SPSerializer.Create())\r\n            {\r\n                var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();\r\n                serializer.AssetBundle = assetBundle;\r\n                return serializer.Deserialize(formatter, strm);\r\n            }\r\n        }\r\n\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/SimpleUnityStructureSurrogate.cs",
    "content": "﻿using System;\r\n\r\nusing System.Runtime.Serialization;\r\n\r\nnamespace com.spacepuppy.Serialization\r\n{\r\n\r\n    public class SimpleUnityStructureSurrogate : ISerializationSurrogate, ISurrogateSelector\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private ISurrogateSelector _nextSelector;\r\n\r\n        #endregion\r\n\r\n        #region ISurrogateSelector Interface\r\n\r\n        public void ChainSelector(ISurrogateSelector selector)\r\n        {\r\n            if (selector == this) throw new System.ArgumentException(\"Cyclical SurrogateSelector\");\r\n\r\n            if (_nextSelector == null)\r\n                _nextSelector = selector;\r\n            else\r\n                _nextSelector.ChainSelector(selector);\r\n        }\r\n\r\n        public ISurrogateSelector GetNextSelector()\r\n        {\r\n            return _nextSelector;\r\n        }\r\n\r\n        public ISerializationSurrogate GetSurrogate(Type type, StreamingContext context, out ISurrogateSelector selector)\r\n        {\r\n            if(SimpleUnityStructureSurrogate.IsSpeciallySerialized(type))\r\n            {\r\n                selector = this;\r\n                return this;\r\n            }\r\n            else if (_nextSelector != null)\r\n            {\r\n                return _nextSelector.GetSurrogate(type, context, out selector);\r\n            }\r\n            else\r\n            {\r\n                selector = null;\r\n                return null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISerializationSurrogate Interface\r\n\r\n        public void GetObjectData(object obj, SerializationInfo info, StreamingContext context)\r\n        {\r\n            SimpleUnityStructureSurrogate.AddValue(obj, info, context);\r\n        }\r\n\r\n        public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)\r\n        {\r\n            return SimpleUnityStructureSurrogate.GetValue(obj, info, context);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Is Serialized By This Test\r\n\r\n        private static Type[] _specialTypes = new Type[]\r\n        {\r\n            typeof(UnityEngine.Vector2),\r\n            typeof(UnityEngine.Vector3),\r\n            typeof(UnityEngine.Vector4),\r\n            typeof(UnityEngine.Quaternion),\r\n            typeof(UnityEngine.Matrix4x4),\r\n            typeof(UnityEngine.Color),\r\n            typeof(UnityEngine.LayerMask)\r\n        };\r\n\r\n        public static bool IsSpeciallySerialized(System.Type tp)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n            \r\n            return Array.IndexOf(_specialTypes, tp) >= 0;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Add/Get Values\r\n\r\n        internal static bool AddValue(object obj, SerializationInfo info, StreamingContext context)\r\n        {\r\n            if (obj is UnityEngine.Vector2)\r\n            {\r\n                SimpleUnityStructureSurrogate.AddValue(info, (UnityEngine.Vector2)obj);\r\n                return true;\r\n            }\r\n            else if (obj is UnityEngine.Vector3)\r\n            {\r\n                SimpleUnityStructureSurrogate.AddValue(info, (UnityEngine.Vector3)obj);\r\n                return true;\r\n            }\r\n            else if (obj is UnityEngine.Vector4)\r\n            {\r\n                SimpleUnityStructureSurrogate.AddValue(info, (UnityEngine.Vector4)obj);\r\n                return true;\r\n            }\r\n            else if (obj is UnityEngine.Quaternion)\r\n            {\r\n                SimpleUnityStructureSurrogate.AddValue(info, (UnityEngine.Quaternion)obj);\r\n                return true;\r\n            }\r\n            else if (obj is UnityEngine.Color)\r\n            {\r\n                SimpleUnityStructureSurrogate.AddValue(info, (UnityEngine.Color)obj);\r\n                return true;\r\n            }\r\n            else if (obj is UnityEngine.LayerMask)\r\n            {\r\n                SimpleUnityStructureSurrogate.AddValue(info, (UnityEngine.LayerMask)obj);\r\n                return true;\r\n            }\r\n            else if (obj is UnityEngine.Matrix4x4)\r\n            {\r\n                SimpleUnityStructureSurrogate.AddValue(info, (UnityEngine.Matrix4x4)obj);\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        internal static object GetValue(object obj, SerializationInfo info, StreamingContext context)\r\n        {\r\n            if (obj is UnityEngine.Vector2)\r\n            {\r\n                return SimpleUnityStructureSurrogate.GetVector2(info);\r\n            }\r\n            else if (obj is UnityEngine.Vector3)\r\n            {\r\n                return SimpleUnityStructureSurrogate.GetVector3(info);\r\n            }\r\n            else if (obj is UnityEngine.Vector4)\r\n            {\r\n                return SimpleUnityStructureSurrogate.GetVector4(info);\r\n            }\r\n            else if (obj is UnityEngine.Quaternion)\r\n            {\r\n                return SimpleUnityStructureSurrogate.GetQuaternion(info);\r\n            }\r\n            else if (obj is UnityEngine.Color)\r\n            {\r\n                return SimpleUnityStructureSurrogate.GetColor(info);\r\n            }\r\n            else if (obj is UnityEngine.LayerMask)\r\n            {\r\n                return SimpleUnityStructureSurrogate.GetLayerMask(info);\r\n            }\r\n            else if (obj is UnityEngine.Matrix4x4)\r\n            {\r\n                return SimpleUnityStructureSurrogate.GetMatrix4x4(info);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n\r\n\r\n\r\n        public static void AddValue(SerializationInfo info, UnityEngine.Vector2 value)\r\n        {\r\n            if (info == null) throw new System.ArgumentNullException(\"info\");\r\n\r\n            info.AddValue(\"x\", value.x);\r\n            info.AddValue(\"y\", value.y);\r\n        }\r\n\r\n        public static void AddValue(SerializationInfo info, UnityEngine.Vector3 value)\r\n        {\r\n            if (info == null) throw new System.ArgumentNullException(\"info\");\r\n\r\n            info.AddValue(\"x\", value.x);\r\n            info.AddValue(\"y\", value.y);\r\n            info.AddValue(\"z\", value.z);\r\n        }\r\n\r\n        public static void AddValue(SerializationInfo info, UnityEngine.Vector4 value)\r\n        {\r\n            if (info == null) throw new System.ArgumentNullException(\"info\");\r\n\r\n            info.AddValue(\"x\", value.x);\r\n            info.AddValue(\"y\", value.y);\r\n            info.AddValue(\"z\", value.z);\r\n            info.AddValue(\"w\", value.w);\r\n        }\r\n\r\n        public static void AddValue(SerializationInfo info, UnityEngine.Quaternion value)\r\n        {\r\n            if (info == null) throw new System.ArgumentNullException(\"info\");\r\n\r\n            info.AddValue(\"x\", value.x);\r\n            info.AddValue(\"y\", value.y);\r\n            info.AddValue(\"z\", value.z);\r\n            info.AddValue(\"w\", value.w);\r\n        }\r\n\r\n        public static void AddValue(SerializationInfo info, UnityEngine.Color value)\r\n        {\r\n            if (info == null) throw new System.ArgumentNullException(\"info\");\r\n\r\n            info.AddValue(\"r\", value.r);\r\n            info.AddValue(\"g\", value.g);\r\n            info.AddValue(\"b\", value.b);\r\n            info.AddValue(\"a\", value.a);\r\n        }\r\n\r\n        public static void AddValue(SerializationInfo info, UnityEngine.LayerMask value)\r\n        {\r\n            if (info == null) throw new System.ArgumentNullException(\"info\");\r\n\r\n            info.AddValue(\"mask\", value.value);\r\n        }\r\n\r\n        public static void AddValue(SerializationInfo info, UnityEngine.Matrix4x4 value)\r\n        {\r\n            if (info == null) throw new System.ArgumentNullException(\"info\");\r\n\r\n            info.AddValue(\"m00\", value.m00);\r\n            info.AddValue(\"m01\", value.m01);\r\n            info.AddValue(\"m02\", value.m02);\r\n            info.AddValue(\"m03\", value.m03);\r\n            info.AddValue(\"m10\", value.m10);\r\n            info.AddValue(\"m11\", value.m11);\r\n            info.AddValue(\"m12\", value.m12);\r\n            info.AddValue(\"m13\", value.m13);\r\n            info.AddValue(\"m20\", value.m20);\r\n            info.AddValue(\"m21\", value.m21);\r\n            info.AddValue(\"m22\", value.m22);\r\n            info.AddValue(\"m23\", value.m23);\r\n            info.AddValue(\"m30\", value.m30);\r\n            info.AddValue(\"m31\", value.m31);\r\n            info.AddValue(\"m32\", value.m32);\r\n            info.AddValue(\"m33\", value.m33);\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n        public static UnityEngine.Vector2 GetVector2(SerializationInfo info)\r\n        {\r\n            return new UnityEngine.Vector2(info.GetSingle(\"x\"), info.GetSingle(\"y\"));\r\n        }\r\n\r\n        public static UnityEngine.Vector3 GetVector3(SerializationInfo info)\r\n        {\r\n            return new UnityEngine.Vector3(info.GetSingle(\"x\"), info.GetSingle(\"y\"), info.GetSingle(\"z\"));\r\n        }\r\n\r\n        public static UnityEngine.Vector4 GetVector4(SerializationInfo info)\r\n        {\r\n            return new UnityEngine.Vector4(info.GetSingle(\"x\"), info.GetSingle(\"y\"), info.GetSingle(\"z\"), info.GetSingle(\"w\"));\r\n        }\r\n\r\n        public static UnityEngine.Quaternion GetQuaternion(SerializationInfo info)\r\n        {\r\n            return new UnityEngine.Quaternion(info.GetSingle(\"x\"), info.GetSingle(\"y\"), info.GetSingle(\"z\"), info.GetSingle(\"w\"));\r\n        }\r\n\r\n        public static UnityEngine.Color GetColor(SerializationInfo info)\r\n        {\r\n            return new UnityEngine.Color(info.GetSingle(\"r\"), info.GetSingle(\"g\"), info.GetSingle(\"b\"), info.GetSingle(\"a\"));\r\n        }\r\n\r\n        public static UnityEngine.LayerMask GetLayerMask(SerializationInfo info)\r\n        {\r\n            var m = new UnityEngine.LayerMask();\r\n            m.value = info.GetInt32(\"mask\");\r\n            return m;\r\n        }\r\n\r\n        public static UnityEngine.Matrix4x4 GetMatrix4x4(SerializationInfo info)\r\n        {\r\n            var m = new UnityEngine.Matrix4x4();\r\n            m.m00 = info.GetSingle(\"00\");\r\n            m.m01 = info.GetSingle(\"01\");\r\n            m.m02 = info.GetSingle(\"02\");\r\n            m.m03 = info.GetSingle(\"03\");\r\n            m.m10 = info.GetSingle(\"10\");\r\n            m.m11 = info.GetSingle(\"11\");\r\n            m.m12 = info.GetSingle(\"12\");\r\n            m.m13 = info.GetSingle(\"13\");\r\n            m.m20 = info.GetSingle(\"20\");\r\n            m.m21 = info.GetSingle(\"21\");\r\n            m.m22 = info.GetSingle(\"22\");\r\n            m.m23 = info.GetSingle(\"23\");\r\n            m.m30 = info.GetSingle(\"30\");\r\n            m.m31 = info.GetSingle(\"31\");\r\n            m.m32 = info.GetSingle(\"32\");\r\n            m.m33 = info.GetSingle(\"33\");\r\n            return m;\r\n        }\r\n        \r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/UnityData.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Runtime.Serialization.Formatters.Binary;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Serialization\r\n{\r\n\r\n    /// <summary>\r\n    /// Allows serializing an object that doesn't conform to Unity's serialization requirements, but still has references to unity objects. \r\n    /// You'd serialize the object into this container, and deserialize it from this container during the ISerializationCallbackReceiver \r\n    /// callbacks.\r\n    /// \r\n    /// Lets say for instance you have some component that has different operating modes. Lets say these modes are defined by some interface \r\n    /// or base abstract class. Lets call this 'ICustomMode'. You have a field in the script file where you store the chosen operating mode. \r\n    /// But, when unity serializes your component, this field does not get included, because interfaces and abstract classes aren't serialized. \r\n    /// And if you have an object that inherits from the field's type, it will be deserialized as the class that the field is for.\r\n    /// \r\n    /// Instead, you have a field of type UnityData. This is a serializable class. Then you implement ISerializationCallbackReceiver and do the \r\n    /// following:\r\n    /// \r\n    /// <code>\r\n    /// [System.NonSerialized()]\r\n    /// private ICustomMode _mode;\r\n    /// [SerializeField()]\r\n    /// private UnityData _customData;\r\n    /// \r\n    /// void ISerializationCallbackReceiver.OnAfterDeserialize()\r\n    /// {\r\n    ///     _mode = SerializationHelper.BinaryDeserialize(_customData) as ICustomMode;\r\n    ///     _customData.Clear(); //clear the serialized data from memory so we don't have bloat\r\n    /// }\r\n    /// \r\n    /// void ISerializationCallbackReceiver.OnBeforeSerialize()\r\n    /// {\r\n    ///     if (_customData == null) _customData = new UnityData();\r\n    ///     SerializationHelper.BinarySerialize(_customData, _mode);\r\n    /// }\r\n    /// </code>\r\n    /// \r\n    /// Now, after serialization, the object will retain its state. \r\n    /// Do note the serializable object MUST meet .Net serialization standards.\r\n    /// </summary>\r\n    [System.Serializable()]\r\n    public class UnityData\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private byte[] _data;\r\n\r\n        [SerializeField()]\r\n        private UnityEngine.Object[] _unityObjectReferences;\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int Size\r\n        {\r\n            get\r\n            {\r\n                var dl = (_data != null) ? _data.Length : 0;\r\n                var rl = (_unityObjectReferences != null) ? _unityObjectReferences.Length : 0;\r\n                return dl + rl;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Clear()\r\n        {\r\n            _data = new byte[] { };\r\n            _unityObjectReferences = new UnityEngine.Object[] { };\r\n        }\r\n\r\n        internal void SetData(System.IO.Stream data, Object[] refs)\r\n        {\r\n            _data = data.ToByteArray();\r\n            _unityObjectReferences = refs ?? ArrayUtil.Empty<UnityEngine.Object>();\r\n        }\r\n\r\n        internal void GetData(System.IO.Stream data, out Object[] refs)\r\n        {\r\n            data.Write(_data, 0, _data.Length);\r\n            refs = _unityObjectReferences;\r\n        }\r\n\r\n\r\n\r\n        public void Serialize(object graph)\r\n        {\r\n            if(graph != null)\r\n            {\r\n                using (var formatter = UnityDataFormatter.Create())\r\n                {\r\n                    formatter.Serialize(this, graph);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                _data = ArrayUtil.Empty<byte>();\r\n                _unityObjectReferences = ArrayUtil.Empty<UnityEngine.Object>();\r\n            }\r\n        }\r\n\r\n        public object Deserialize()\r\n        {\r\n            if(_data != null && _data.Length > 0)\r\n            {\r\n                using (var formatter = UnityDataFormatter.Create())\r\n                {\r\n                    return formatter.Deserialize(this);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/Serialization/UnityDataFormatter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Runtime.Serialization;\r\nusing System.Runtime.Serialization.Formatters.Binary;\r\n\r\nusing com.spacepuppy.Collections;\r\n\r\nnamespace com.spacepuppy.Serialization\r\n{\r\n    internal class UnityDataFormatter : ISurrogateSelector, ISerializationSurrogate, IDisposable\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private BinaryFormatter _formatter = new BinaryFormatter();\r\n        private List<UnityEngine.Object> _unityObjects = new List<UnityEngine.Object>();\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Serialize(UnityData data, object graph)\r\n        {\r\n            if (data == null) throw new System.ArgumentNullException(\"data\");\r\n            \r\n            using (var strm = new MemoryStream())\r\n            {\r\n                this.StartSerialization();\r\n\r\n                _formatter.SurrogateSelector = this;\r\n                _formatter.Serialize(strm, graph);\r\n\r\n                strm.Position = 0;\r\n                this.EndSerialization(strm, data);\r\n            }\r\n        }\r\n\r\n        public object Deserialize(UnityData data)\r\n        {\r\n            if (data == null) throw new System.ArgumentNullException(\"data\");\r\n            \r\n            using (var strm = new MemoryStream())\r\n            {\r\n                UnityEngine.Object[] refs;\r\n                data.GetData(strm, out refs);\r\n                strm.Position = 0;\r\n\r\n                this.StartDeserialization(refs);\r\n\r\n                _formatter.SurrogateSelector = this;\r\n                var result = _formatter.Deserialize(strm);\r\n\r\n                this.EndDeserialization();\r\n\r\n                return result;\r\n            }\r\n        }\r\n\r\n\r\n\r\n\r\n\r\n        private void StartSerialization()\r\n        {\r\n            _unityObjects.Clear();\r\n        }\r\n\r\n        private void EndSerialization(System.IO.Stream strm, UnityData data)\r\n        {\r\n            if (data != null)\r\n            {\r\n                data.SetData(strm, _unityObjects.ToArray());\r\n            }\r\n            _unityObjects.Clear();\r\n        }\r\n\r\n        private void StartDeserialization(IEnumerable<UnityEngine.Object> refs)\r\n        {\r\n            _unityObjects.Clear();\r\n            _unityObjects.AddRange(refs);\r\n        }\r\n\r\n        private void EndDeserialization()\r\n        {\r\n            _unityObjects.Clear();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISurrogateSelector Interface\r\n\r\n        void ISurrogateSelector.ChainSelector(ISurrogateSelector selector)\r\n        {\r\n            throw new System.NotSupportedException();\r\n        }\r\n\r\n        ISurrogateSelector ISurrogateSelector.GetNextSelector()\r\n        {\r\n            return null;\r\n        }\r\n\r\n        ISerializationSurrogate ISurrogateSelector.GetSurrogate(Type type, StreamingContext context, out ISurrogateSelector selector)\r\n        {\r\n            if (typeof(UnityEngine.Object).IsAssignableFrom(type) || typeof(UnityObjectPointer).IsAssignableFrom(type))\r\n            {\r\n                selector = this;\r\n                return this;\r\n            }\r\n            else\r\n            {\r\n                selector = null;\r\n                return null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISerializationSurrogate Interface\r\n\r\n        void ISerializationSurrogate.GetObjectData(object obj, SerializationInfo info, StreamingContext context)\r\n        {\r\n            if (obj is UnityEngine.Object)\r\n            {\r\n                info.SetType(typeof(UnityObjectPointer));\r\n                info.AddValue(\"Index\", _unityObjects.Count);\r\n                _unityObjects.Add(obj as UnityEngine.Object);\r\n            }\r\n        }\r\n\r\n        object ISerializationSurrogate.SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)\r\n        {\r\n            if (obj is UnityObjectPointer)\r\n            {\r\n                int index = info.GetInt32(\"Index\");\r\n                if (index >= 0 && index < _unityObjects.Count) return _unityObjects[index];\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IDisposable Interface\r\n\r\n        public void Dispose()\r\n        {\r\n            _unityObjects.Clear();\r\n            _pool.Release(this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        /// <summary>\r\n        /// Serializable token that represents a UnityObject in SP Serialized data.\r\n        /// </summary>\r\n        [System.Serializable()]\r\n        private struct UnityObjectPointer\r\n        {\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Factory\r\n\r\n        private static ObjectCachePool<UnityDataFormatter> _pool = new ObjectCachePool<UnityDataFormatter>(10, () => new UnityDataFormatter());\r\n        public static UnityDataFormatter Create()\r\n        {\r\n            return _pool.GetInstance();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerialization/SpacepuppySerialization.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{5DCFC7A9-B2B5-4A08-BEB8-B2CED2457391}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>com.spacepuppy</RootNamespace>\r\n    <AssemblyName>SpacepuppyUnityFramework.Serialization</AssemblyName>\r\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"UnityEngine\">\r\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"Serialization\\IPersistantUnityObject.cs\" />\r\n    <Compile Include=\"Serialization\\Json\\JsonException.cs\" />\r\n    <Compile Include=\"Serialization\\Json\\JsonFormatter.cs\" />\r\n    <Compile Include=\"Serialization\\Json\\JsonNodeType.cs\" />\r\n    <Compile Include=\"Serialization\\Json\\JsonReader.cs\" />\r\n    <Compile Include=\"Serialization\\Json\\JsonWriter.cs\" />\r\n    <Compile Include=\"Serialization\\Old\\IUnityData.cs\" />\r\n    <Compile Include=\"Serialization\\Old\\IUnitySerializable.cs\" />\r\n    <Compile Include=\"Serialization\\Old\\UnityDataFormatter.cs\" />\r\n    <Compile Include=\"Serialization\\Old\\UnityDataScriptableObject.cs\" />\r\n    <Compile Include=\"Serialization\\Old\\UnitySerializationInfo.cs\" />\r\n    <Compile Include=\"Serialization\\Old\\UnitySerializationSurrogate.cs\" />\r\n    <Compile Include=\"Serialization\\PersistentGameObject.cs\" />\r\n    <Compile Include=\"Serialization\\PersistantAssetToken.cs\" />\r\n    <Compile Include=\"Serialization\\PersistantUnityObjectSerializedProxy.cs\" />\r\n    <Compile Include=\"Serialization\\SerializationHelper.cs\" />\r\n    <Compile Include=\"Serialization\\SimpleUnityStructureSurrogate.cs\" />\r\n    <Compile Include=\"Serialization\\SPSerializer.cs\" />\r\n    <Compile Include=\"Serialization\\SPSerializationSurrogate.cs\" />\r\n    <Compile Include=\"Serialization\\UnityData.cs\" />\r\n    <Compile Include=\"Serialization\\UnityDataFormatter.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\r\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\r\n      <Name>SpacepuppyBase</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <ItemGroup />\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>mkdir $(ProjectDir)..\\Builds\\FullLibrary\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.Serialization.dll\" \"$(ProjectDir)..\\Builds\\FullLibrary\\SpacepuppyUnityFramework.Serialization.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.Serialization.pdb\" \"$(ProjectDir)..\\Builds\\FullLibrary\\SpacepuppyUnityFramework.Serialization.pdb\"</PostBuildEvent>\r\n  </PropertyGroup>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "SpacepuppySerializationEditor/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"SpacepuppySerializationEditor\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"SpacepuppySerializationEditor\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"fbc641a8-9bf5-49d6-9806-1e349dcdd1ae\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "SpacepuppySerializationEditor/Serialization/PersistentGameObjectInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Serialization;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Serialization\r\n{\r\n    [CustomEditor(typeof(PersistentGameObject), true)]\r\n    public class PersistentGameObjectInspector : SPEditor\r\n    {\r\n\r\n        //public const string PROP_SAVE = \"_save\";\r\n        public const string PROP_ASSETID = \"_assetId\";\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n\r\n\r\n\r\n            var assetIdProp = this.serializedObject.FindProperty(PROP_ASSETID);\r\n            var go = GameObjectUtil.GetGameObjectFromSource(this.serializedObject.targetObject);\r\n            if (go != null)\r\n            {\r\n                switch (PrefabUtility.GetPrefabType(go))\r\n                {\r\n                    case PrefabType.None:\r\n                        SPEditorGUILayout.PropertyField(assetIdProp);\r\n                        break;\r\n                    case PrefabType.Prefab:\r\n                        {\r\n                            if(string.IsNullOrEmpty(assetIdProp.stringValue))\r\n                            {\r\n                                var path = AssetHelper.GetRelativeResourcePath(AssetDatabase.GetAssetPath(go));\r\n                                assetIdProp.stringValue = (string.IsNullOrEmpty(path)) ? go.name : path;\r\n                            }\r\n                            SPEditorGUILayout.PropertyField(assetIdProp);\r\n                            break;\r\n                        }\r\n                    case PrefabType.PrefabInstance:\r\n                        {\r\n                            if (string.IsNullOrEmpty(assetIdProp.stringValue))\r\n                            {\r\n                                go = PrefabUtility.GetCorrespondingObjectFromSource(go) as GameObject;\r\n                                if(go != null)\r\n                                {\r\n                                    var path = AssetHelper.GetRelativeResourcePath(AssetDatabase.GetAssetPath(go));\r\n                                    assetIdProp.stringValue = (string.IsNullOrEmpty(path)) ? go.name : path;\r\n                                }\r\n                            }\r\n                            SPEditorGUILayout.PropertyField(assetIdProp);\r\n                            break;\r\n                        }\r\n                    default:\r\n                        //do nothing\r\n                        break;\r\n                }\r\n            }\r\n\r\n\r\n\r\n            this.DrawDefaultInspectorExcept(EditorHelper.PROP_SCRIPT, PROP_ASSETID);\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySerializationEditor/SpacepuppySerializationEditor.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{FBC641A8-9BF5-49D6-9806-1E349DCDD1AE}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>com.spacepuppyeditor</RootNamespace>\r\n    <AssemblyName>SpacepuppyUnityFrameworkEditor.Serialization</AssemblyName>\r\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"UnityEditor\">\r\n      <HintPath>..\\Resources\\UnityEditor.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"UnityEngine\">\r\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"Serialization\\PersistentGameObjectInspector.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\SpacepuppyBaseEditor\\SpacepuppyBaseEditor.csproj\">\r\n      <Project>{a0466ee3-9582-4c0d-965d-e2d2f9006971}</Project>\r\n      <Name>SpacepuppyBaseEditor</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\r\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\r\n      <Name>SpacepuppyBase</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppySerialization\\SpacepuppySerialization.csproj\">\r\n      <Project>{5dcfc7a9-b2b5-4a08-beb8-b2ced2457391}</Project>\r\n      <Name>SpacepuppySerialization</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <ItemGroup />\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>mkdir $(ProjectDir)..\\Builds\\FullLibrary\\Editor\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.Serialization.dll\" \"$(ProjectDir)..\\Builds\\FullLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.Serialization.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.Serialization.pdb\" \"$(ProjectDir)..\\Builds\\FullLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.Serialization.pdb\"</PostBuildEvent>\r\n  </PropertyGroup>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "SpacepuppySpawn/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"SpacepuppySpawn\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"SpacepuppySpawn\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"a7795ef0-ff64-44d5-95e9-4b5ae8fb30ea\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "SpacepuppySpawn/SPSpawnConstants.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy\r\n{\r\n    public class SPSpawnConstants\r\n    {\r\n\r\n        //sent by SpawnPool on GameObject being spawned\r\n        public const string MSG_ONSPAWN = \"OnSpawn\";\r\n        public const string MSG_ONDESPAWN = \"OnDespawn\";\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawn/Scenario/i_PlayParticleEffect.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEngine.Serialization;\r\nusing System.Collections;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Spawn;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    public class i_PlayParticleEffect : TriggerableMechanism, ISpawner, IObservableTrigger\r\n    {\r\n\r\n        public const string TRG_ONFINISH = \"OnSpawned\";\r\n\r\n        #region Fields\r\n        \r\n        [SerializeField()]\r\n        private SelfTrackingSpawnerMechanism _spawnMechanism = new SelfTrackingSpawnerMechanism();\r\n\r\n        [SerializeField()]\r\n        [FormerlySerializedAs(\"EffectPrefab\")]\r\n        private ParticleSystem _effectPrefab;\r\n\r\n        [SerializeField()]\r\n        [TimeUnitsSelector()]\r\n        [Tooltip(\"Delete particle effect after a duration. Leave 0 to use the 'duration' of the particle effect.\")]\r\n        [FormerlySerializedAs(\"Duration\")]\r\n        private float _duration;\r\n\r\n        [SerializeField()]\r\n        private bool _spawnAsChild = true;\r\n\r\n        [SerializeField()]\r\n        private Trigger _onSpawnedObject = new Trigger(TRG_ONFINISH);\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            _spawnMechanism.Init(this);\r\n        }\r\n        \r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _spawnMechanism.Active = true;\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            _spawnMechanism.Active = false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ParticleSystem EffectsPrefab\r\n        {\r\n            get { return _effectPrefab; }\r\n            set { _effectPrefab = value; }\r\n        }\r\n\r\n        public float Duration\r\n        {\r\n            get { return _duration; }\r\n            set { _duration = value; }\r\n        }\r\n\r\n        public bool SpawnAsChild\r\n        {\r\n            get { return _spawnAsChild; }\r\n            set { _spawnAsChild = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISpawner Interface\r\n\r\n        public SelfTrackingSpawnerMechanism Mechanism { get { return _spawnMechanism; } }\r\n\r\n        public int TotalCount { get { return _spawnMechanism.TotalCount; } }\r\n\r\n        public int ActiveCount { get { return _spawnMechanism.ActiveCount; } }\r\n\r\n        public GameObject Spawn()\r\n        {\r\n            if (!this.enabled) return null;\r\n            if (_effectPrefab == null) return null;\r\n\r\n            var go = _spawnMechanism.Spawn(_effectPrefab.gameObject, this.transform.position, this.transform.rotation, (_spawnAsChild) ? this.transform : null);\r\n            if (go == null) return null;\r\n\r\n            var dur = (_duration > 0.00001f) ? _duration : _effectPrefab.main.duration;\r\n            if (!float.IsNaN(dur) && !float.IsInfinity(dur))\r\n            {\r\n                this.InvokeGuaranteed(() =>\r\n                {\r\n                    go.Kill();\r\n                }, dur, _effectPrefab.main.useUnscaledTime ? SPTime.Real : SPTime.Normal);\r\n            }\r\n\r\n            if (_onSpawnedObject != null && _onSpawnedObject.Count > 0)\r\n                _onSpawnedObject.ActivateTrigger(this, go);\r\n\r\n            return go;\r\n        }\r\n        \r\n        void ISpawner.Spawn()\r\n        {\r\n            this.Spawn();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITriggerableMechanism Interface\r\n\r\n        public override bool CanTrigger\r\n        {\r\n            get { return base.CanTrigger && _effectPrefab != null; }\r\n        }\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            return this.Spawn() != null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IObserverableTarget Interface\r\n        \r\n        Trigger[] IObservableTrigger.GetTriggers()\r\n        {\r\n            return new Trigger[] { _onSpawnedObject };\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region INotificationDispatcher Interface\r\n\r\n        [System.NonSerialized]\r\n        private NotificationDispatcher _observers;\r\n\r\n        protected virtual void OnDespawn()\r\n        {\r\n            if (_observers != null) _observers.PurgeHandlers();\r\n        }\r\n\r\n        public NotificationDispatcher Observers\r\n        {\r\n            get\r\n            {\r\n                if (_observers == null) _observers = new NotificationDispatcher(this);\r\n                return _observers;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppySpawn/Scenario/i_Spawn.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\n\nusing UnityEngine;\nusing System.Collections.Generic;\n\nusing com.spacepuppy.Spawn;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Scenario\n{\n\n    public class i_Spawn : AutoTriggerableMechanism, IObservableTrigger, ISpawner\n    {\n\n        public const string TRG_ONSPAWNED = \"OnSpawned\";\n\n        #region Fields\n\n        [SerializeField()]\n        [Tooltip(\"If left empty the default SpawnPool will be used instead.\")]\n        private SelfTrackingSpawnerMechanism _spawnMechanism = new SelfTrackingSpawnerMechanism();\n\n        [SerializeField]\n        [TypeRestriction(typeof(Transform), AllowProxy = true, HideTypeDropDown = true)]\n        private UnityEngine.Object _spawnedObjectParent;\n\n        [SerializeField()]\n        [WeightedValueCollection(\"Weight\", \"Prefab\")]\n        [Tooltip(\"Objects available for spawning. When spawn is called with no arguments a prefab is selected at random.\")]\n        private List<PrefabEntry> _prefabs;\n\n        [SerializeField()]\n        private OnSpawnEvent _onSpawnedObject = new OnSpawnEvent();\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        protected override void Awake()\n        {\n            base.Awake();\n\n            _spawnMechanism.Init(this);\n        }\n\n        protected override void OnEnable()\n        {\n            base.OnEnable();\n\n            _spawnMechanism.Active = true;\n        }\n\n        protected override void OnDisable()\n        {\n            base.OnDisable();\n\n            _spawnMechanism.Active = false;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public SpawnPool SpawnPool\n        {\n            get { return _spawnMechanism.SpawnPool; }\n            set { _spawnMechanism.SpawnPool = value; }\n        }\n\n        public List<PrefabEntry> Prefabs\n        {\n            get { return _prefabs; }\n        }\n\n        public OnSpawnEvent OnSpawnedObject\n        {\n            get { return _onSpawnedObject; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public GameObject Spawn()\n        {\n            if (!this.CanTrigger) return null;\n\n            if (_prefabs == null || _prefabs.Count == 0) return null;\n\n            if (_prefabs.Count == 1)\n            {\n                return this.Spawn(_prefabs[0].Prefab);\n            }\n            else\n            {\n                return this.Spawn(_prefabs.PickRandom((o) => o.Weight).Prefab);\n            }\n        }\n\n        public GameObject Spawn(int index)\n        {\n            if (!this.enabled) return null;\n\n            if (_prefabs == null || index < 0 || index >= _prefabs.Count) return null;\n            return this.Spawn(_prefabs[index].Prefab);\n        }\n\n        public GameObject Spawn(string name)\n        {\n            if (!this.enabled) return null;\n\n            if (_prefabs == null) return null;\n            for (int i = 0; i < _prefabs.Count; i++)\n            {\n                if (_prefabs[i].Prefab != null && _prefabs[i].Prefab.CompareName(name)) return this.Spawn(_prefabs[i].Prefab);\n            }\n            return null;\n        }\n\n        private GameObject Spawn(GameObject prefab)\n        {\n            if (prefab == null) return null;\n\n            //var pool = _spawnPool != null ? _spawnPool : SpawnPool.DefaultPool;\n            //var go = pool.Spawn(prefab, this.transform.position, this.transform.rotation, ObjUtil.GetAsFromSource<Transform>(_spawnedObjectParent, true));\n\n            var go = _spawnMechanism.Spawn(prefab, this.transform.position, this.transform.rotation, ObjUtil.GetAsFromSource<Transform>(_spawnedObjectParent, true));\n\n            if (_onSpawnedObject != null && _onSpawnedObject.Count > 0)\n                _onSpawnedObject.ActivateTrigger(this, go);\n\n            return go;\n        }\n\n        #endregion\n\n\n        #region ITriggerable Interface\n\n        public override bool CanTrigger\n        {\n            get { return base.CanTrigger && _prefabs != null && _prefabs.Count > 0; }\n        }\n\n        public override bool Trigger(object sender, object arg)\n        {\n            if (!this.CanTrigger) return false;\n\n            if (arg is string)\n            {\n                return this.Spawn(arg as string) != null;\n            }\n            else if (ConvertUtil.ValueIsNumericType(arg))\n            {\n                return this.Spawn(ConvertUtil.ToInt(arg)) != null;\n            }\n            else\n            {\n                return this.Spawn() != null;\n            }\n        }\n\n        #endregion\n\n        #region IObserverableTarget Interface\n\n        Trigger[] IObservableTrigger.GetTriggers()\n        {\n            return new Trigger[] { _onSpawnedObject };\n        }\n\n        #endregion\n\n        #region ISpawnPoint Interface\n\n        SelfTrackingSpawnerMechanism ISpawner.Mechanism { get { return _spawnMechanism; } }\n\n        int ISpawner.TotalCount { get { return _spawnMechanism.TotalCount; } }\n\n        int ISpawner.ActiveCount { get { return _spawnMechanism.ActiveCount; } }\n\n        void ISpawner.Spawn()\n        {\n            this.Spawn();\n        }\n        \n        #endregion\n\n        #region INotificationDispatcher Interface\n\n        [System.NonSerialized]\n        private NotificationDispatcher _observers;\n\n        protected virtual void OnDespawn()\n        {\n            if (_observers != null) _observers.PurgeHandlers();\n        }\n\n        public NotificationDispatcher Observers\n        {\n            get\n            {\n                if (_observers == null) _observers = new NotificationDispatcher(this);\n                return _observers;\n            }\n        }\n\n        #endregion\n\n        #region Special Types\n\n        [System.Serializable]\n        public class OnSpawnEvent : Trigger\n        {\n            public OnSpawnEvent() : base(TRG_ONSPAWNED)\n            {\n\n            }\n        }\n\n        [System.Serializable]\n        public struct PrefabEntry\n        {\n            public float Weight;\n            public GameObject Prefab;\n        }\n\n        #endregion\n\n    }\n\n}\n"
  },
  {
    "path": "SpacepuppySpawn/Scenario/t_OnSpawn.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Spawn;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Scenario\r\n{\r\n\r\n    [Infobox(\"The object spawned will be the object passed to the TriggerableMechanism (i_).\")]\r\n    [System.Obsolete(\"This is outdated, instead use the trigger available in the spawner itself.\")]\r\n    public class t_OnSpawn : TriggerComponent\r\n    {\r\n\r\n        #region Fields\r\n        \r\n        [DefaultFromSelf(Relativity = EntityRelativity.Entity)]\r\n        [DisableOnPlay()]\r\n        [Tooltip(\"The GameObject that has the SpawnPoint on it.\")]\r\n        [SerializeField()]\r\n        private GameObject _observedTarget;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            if (_observedTarget == null) _observedTarget = this.gameObject;\r\n        }\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            //this NEEDS to be OnEnable, OnSpawn notification may dispatch prior to Start if this is the first time the object is created.\r\n            base.OnEnable();\r\n\r\n            Notification.RegisterObserver<SpawnNotification>(_observedTarget, OnSpawnHandler);\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            Notification.RemoveObserver<SpawnNotification>(_observedTarget, OnSpawnHandler);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Handlers\r\n\r\n        protected virtual void OnSpawnHandler(object sender, SpawnNotification n)\r\n        {\r\n            this.ActivateTrigger(n.SpawnedObject);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawn/SpacepuppySpawn.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{EEE784AC-7F13-4386-A11C-922DEA4413EB}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>com.spacepuppy</RootNamespace>\r\n    <AssemblyName>SpacepuppyUnityFramework.Spawn</AssemblyName>\r\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile>\r\n    </TargetFrameworkProfile>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"UnityEngine, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"Scenario\\i_Spawn.cs\" />\r\n    <Compile Include=\"Spawn\\AbstractSpawner.cs\" />\r\n    <Compile Include=\"Spawn\\ISpawner.cs\" />\r\n    <Compile Include=\"Spawn\\ISpawnFactory.cs\" />\r\n    <Compile Include=\"Spawn\\ISpawnPointSelector.cs\" />\r\n    <Compile Include=\"Spawn\\i_AttachmentSpawnPoint.cs\" />\r\n    <Compile Include=\"Spawn\\ISpawnPointPrefabSelector.cs\" />\r\n    <Compile Include=\"Spawn\\ISpawnerModifier.cs\" />\r\n    <Compile Include=\"Spawn\\i_SpawnFromResources.cs\" />\r\n    <Compile Include=\"Spawn\\i_SpawnWeighted.cs\" />\r\n    <Compile Include=\"Spawn\\OrientOnSpawn.cs\" />\r\n    <Compile Include=\"Spawn\\ProxySpawnPoint.cs\" />\r\n    <Compile Include=\"Spawn\\ProxySpawnPointManager.cs\" />\r\n    <Compile Include=\"Spawn\\RestrictSpawnCount.cs\" />\r\n    <Compile Include=\"Scenario\\i_PlayParticleEffect.cs\" />\r\n    <Compile Include=\"Scenario\\t_OnSpawn.cs\" />\r\n    <Compile Include=\"Spawn\\SpawnedObjectController.cs\" />\r\n    <Compile Include=\"Spawn\\SelfTrackingSpawnerMechanism.cs\" />\r\n    <Compile Include=\"Spawn\\SpawnNotification.cs\" />\r\n    <Compile Include=\"Spawn\\i_Spawner.cs\" />\r\n    <Compile Include=\"Spawn\\SpawnPointHelper.cs\" />\r\n    <Compile Include=\"Spawn\\SpawnPool.cs\" />\r\n    <Compile Include=\"SPSpawnConstants.cs\" />\r\n    <Compile Include=\"Utils\\SpawnedObjectUtil.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\r\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\r\n      <Name>SpacepuppyBase</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>mkdir $(ProjectDir)..\\Builds\\FullLibrary\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.Spawn.dll\" \"$(ProjectDir)..\\Builds\\FullLibrary\\SpacepuppyUnityFramework.Spawn.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.Spawn.pdb\" \"$(ProjectDir)..\\Builds\\FullLibrary\\SpacepuppyUnityFramework.Spawn.pdb\"</PostBuildEvent>\r\n  </PropertyGroup>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "SpacepuppySpawn/Spawn/AbstractSpawner.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Spawn\r\n{\r\n\r\n    [System.Obsolete(\"DO NOT USE ANYMORE!\")]\r\n    public abstract class AbstractSpawner : SPNotifyingComponent, ISpawner, ITriggerableMechanism, IObservableTrigger\r\n    {\r\n\r\n        public const string TRG_ONFINISH = \"OnSpawned\";\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private int _order;\r\n\r\n        [SerializeField()]\r\n        private SelfTrackingSpawnerMechanism _spawnMechanism = new SelfTrackingSpawnerMechanism();\r\n\r\n        [SerializeField()]\r\n        [Tooltip(\"The object will be spawned as a child of the SpawnPoint GameObject.\")]\r\n        private bool _spawnAsChild = false;\r\n\r\n        [SerializeField()]\r\n        private Trigger _onSpawnedObject = new Trigger(TRG_ONFINISH);\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            _spawnMechanism.Init(this);\r\n        }\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _spawnMechanism.Active = true;\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            _spawnMechanism.Active = false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool UsesDefaultSpawnPool\r\n        {\r\n            get { return _spawnMechanism.UsesDefaultSpawnPool; }\r\n        }\r\n\r\n        public SpawnPool SpawnPool\r\n        {\r\n            get { return _spawnMechanism.SpawnPool; }\r\n            set\r\n            {\r\n                _spawnMechanism.SpawnPool = value;\r\n            }\r\n        }\r\n\r\n        public bool SpawnAsChild\r\n        {\r\n            get { return _spawnAsChild; }\r\n            set { _spawnAsChild = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public virtual GameObject Spawn()\r\n        {\r\n            if (!this.enabled) return null;\r\n\r\n            var prefabs = this.GetAvailablePrefabs();\r\n            var prefab = this.SelectPrefab(prefabs);\r\n            if (prefab == null) return null;\r\n            return this.Spawn(prefab);\r\n        }\r\n\r\n        protected GameObject Spawn(GameObject prefab, System.Action<GameObject> initializeProperties = null)\r\n        {\r\n            if (!this.enabled) return null;\r\n            if (prefab == null) return null;\r\n\r\n            Transform par = (_spawnAsChild) ? this.transform : null;\r\n            var pos = this.transform.position;\r\n            var rot = this.transform.rotation;\r\n            var spawnedObject = _spawnMechanism.Spawn(prefab, pos, rot, par, initializeProperties);\r\n\r\n            if (spawnedObject == null) return null;\r\n\r\n            if (_onSpawnedObject != null && _onSpawnedObject.Count > 0) _onSpawnedObject.ActivateTrigger(this, spawnedObject);\r\n            return spawnedObject;\r\n        }\r\n\r\n        protected GameObject SelectPrefab(GameObject[] prefabs)\r\n        {\r\n            if (!this.enabled) return null;\r\n\r\n            int index = SpawnPointHelper.SelectFromMultiple(this, prefabs.Length);\r\n            if (index < 0 || index >= prefabs.Length) return null;\r\n\r\n            return prefabs[index];\r\n        }\r\n\r\n        public GameObject[] GetActiveGameObjects()\r\n        {\r\n            return _spawnMechanism.GetActiveGameObjects();\r\n        }\r\n\r\n        public SpawnedObjectController[] GetActiveObjectControllers()\r\n        {\r\n            return _spawnMechanism.GetActiveObjectControllers();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Abstract Interface\r\n\r\n        public virtual bool SupportsSelectionModifier { get { return true; } }\r\n\r\n        protected abstract GameObject[] GetAvailablePrefabs();\r\n\r\n        #endregion\r\n\r\n        #region ISpawner Interface\r\n\r\n        public SelfTrackingSpawnerMechanism Mechanism { get { return _spawnMechanism; } }\r\n\r\n        public int ActiveCount { get { return _spawnMechanism.ActiveCount; } }\r\n\r\n        public int TotalCount { get { return _spawnMechanism.TotalCount; } }\r\n\r\n        void ISpawner.Spawn()\r\n        {\r\n            this.Spawn();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITriggerableMechanism Interface\r\n\r\n        public int Order\r\n        {\r\n            get { return _order; }\r\n        }\r\n\r\n        public virtual bool CanTrigger\r\n        {\r\n            get { return this.isActiveAndEnabled; }\r\n        }\r\n        \r\n        public void Trigger()\r\n        {\r\n            this.Trigger(null, null);\r\n        }\r\n\r\n        public abstract bool Trigger(object sender, object arg);\r\n\r\n        #endregion\r\n\r\n\r\n        #region IObserverableTarget Interface\r\n\r\n        Trigger[] IObservableTrigger.GetTriggers()\r\n        {\r\n            return new Trigger[] { _onSpawnedObject };\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawn/Spawn/ISpawnFactory.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Spawn\r\n{\r\n\r\n    /// <summary>\r\n    /// Generic contract defining an object as the factory that spawns objects. \r\n    /// This may be a SpawnPool, or some custom factory. \r\n    /// No methods are uncovered as this only demonstrates that it is a reference, and just that.\r\n    /// </summary>\r\n    public interface ISpawnFactory\r\n    {\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawn/Spawn/ISpawnPointPrefabSelector.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Spawn\r\n{\r\n    public interface ISpawnPointPrefabSelector : IComponent\r\n    {\r\n\r\n        GameObject SelectPrefab(GameObject[] prefabs);\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawn/Spawn/ISpawnPointSelector.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace com.spacepuppy.Spawn\r\n{\r\n\r\n    /// <summary>\r\n    /// Only supported by i_Spawner/Spawner\r\n    /// </summary>\r\n    public interface ISpawnPointSelector : IComponent\r\n    {\r\n\r\n        int Select(ISpawner spawnPoint, int optionCount);\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawn/Spawn/ISpawner.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Spawn\r\n{\r\n\r\n    /// <summary>\r\n    /// Implement by a spawner that can have modifiers attached to it.\r\n    /// \r\n    /// Make sure to implement spawning via the SelfTrackingSpawnerMechanism in the spawner.\r\n    /// </summary>\r\n    public interface ISpawner : IComponent, INotificationDispatcher\r\n    {\r\n\r\n        /// <summary>\r\n        /// The TrackingMechanism used for spawning entities.\r\n        /// </summary>\r\n        SelfTrackingSpawnerMechanism Mechanism { get; }\r\n\r\n        /// <summary>\r\n        /// Total number of entities, dead or alive, that have spawned since this Spawner started.\r\n        /// </summary>\r\n        int TotalCount { get; }\r\n\r\n        /// <summary>\r\n        /// Number of entities currently spawned and active.\r\n        /// </summary>\r\n        int ActiveCount { get; }\r\n        \r\n        /// <summary>\r\n        /// Spawn whatever this spawner spawns.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        void Spawn();\r\n\r\n        \r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawn/Spawn/ISpawnerModifier.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Spawn\r\n{\r\n    public interface ISpawnerModifier\r\n    {\r\n\r\n        #region Fields\r\n\r\n        /// <summary>\r\n        /// Order in which the spawn modifier is applied when others exist in tandem with it on a SpawnPoint.\r\n        /// </summary>\r\n        int order { get; }\r\n\r\n        void OnBeforeSpawnNotification(SpawnPointBeforeSpawnNotification n);\r\n        void OnSpawnedNotification(SpawnPointTriggeredNotification n);\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n\r\n    public class SpawnerModifierComparer : IComparer<ISpawnerModifier>\r\n    {\r\n\r\n        private static SpawnerModifierComparer _default;\r\n        public static SpawnerModifierComparer Default\r\n        {\r\n            get\r\n            {\r\n                if (_default == null)\r\n                    _default = new SpawnerModifierComparer();\r\n                return _default;\r\n            }\r\n        }\r\n\r\n        public int Compare(ISpawnerModifier x, ISpawnerModifier y)\r\n        {\r\n            if (x == null) return y == null ? 0 : -1;\r\n            if (y == null) return x == null ? 0 : 1;\r\n            return x.order.CompareTo(y.order);\r\n        }\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawn/Spawn/OrientOnSpawn.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Spawn\r\n{\r\n\r\n    [RequireComponent(typeof(i_Spawner))]\r\n    public class OrientOnSpawn : SPComponent, ISpawnerModifier\r\n    {\r\n\r\n        public enum TransformInheritance\r\n        {\r\n            None = 0,\r\n            Relative = 2,\r\n            Local = 3,\r\n            Global = 4,\r\n            Additive = 5\r\n        }\r\n\r\n        #region Fields\r\n\r\n        public int order;\r\n        [Infobox(\"'Relative' sets target transform relative to this in world space.\\n'Local' sets target transform directly in its local space.\\n'Global' sets target transform directly in world space.\\n'Additive' adds to the target transform in world space.\\n'None' does not effect the target transform.\")]\r\n        public TransformInheritance TranslationInheritance = TransformInheritance.Relative;\r\n        public Vector3 Translation = Vector3.zero;\r\n        public TransformInheritance RotationInheritance = TransformInheritance.Relative;\r\n        [EulerRotationInspector()]\r\n        public Quaternion Rotation = Quaternion.identity;\r\n        public TransformInheritance ScaleInheritance = TransformInheritance.None;\r\n        public Vector3 Scale = Vector3.zero;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            SpawnPointHelper.RegisterModifierWithSpawners(this.gameObject, this);\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            SpawnPointHelper.UnRegisterModifierWithSpawners(this.gameObject, this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISpawnerModifier Interface\r\n\r\n        int ISpawnerModifier.order\r\n        {\r\n            get { return this.order; }\r\n        }\r\n\r\n        void ISpawnerModifier.OnBeforeSpawnNotification(SpawnPointBeforeSpawnNotification n)\r\n        {\r\n\r\n        }\r\n\r\n        void ISpawnerModifier.OnSpawnedNotification(SpawnPointTriggeredNotification n)\r\n        {\r\n            var go = n.SpawnedObject;\r\n            switch (this.TranslationInheritance)\r\n            {\r\n                case TransformInheritance.Relative:\r\n                    go.transform.position = this.transform.TransformPoint(this.Translation);\r\n                    break;\r\n                case TransformInheritance.Local:\r\n                    go.transform.localPosition = this.Translation;\r\n                    break;\r\n                case TransformInheritance.Global:\r\n                    go.transform.position = this.Translation;\r\n                    break;\r\n                case TransformInheritance.Additive:\r\n                    go.transform.position += this.Translation;\r\n                    break;\r\n            }\r\n\r\n            switch (this.RotationInheritance)\r\n            {\r\n                case TransformInheritance.Relative:\r\n                    go.transform.rotation = this.transform.TransformRotation(this.Rotation);\r\n                    break;\r\n                case TransformInheritance.Local:\r\n                    go.transform.localRotation = this.Rotation;\r\n                    break;\r\n                case TransformInheritance.Global:\r\n                    go.transform.rotation = this.Rotation;\r\n                    break;\r\n                case TransformInheritance.Additive:\r\n                    go.transform.rotation *= this.Rotation;\r\n                    break;\r\n            }\r\n\r\n            switch (this.ScaleInheritance)\r\n            {\r\n                case TransformInheritance.Relative:\r\n                    go.transform.localScale = this.Scale;\r\n                    break;\r\n                case TransformInheritance.Local:\r\n                    go.transform.localScale = this.Scale;\r\n                    break;\r\n                case TransformInheritance.Global:\r\n                    go.transform.localScale = this.Scale;\r\n                    break;\r\n                case TransformInheritance.Additive:\r\n                    go.transform.localScale += this.Scale;\r\n                    break;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawn/Spawn/ProxySpawnPoint.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace com.spacepuppy.Spawn\r\n{\r\n\r\n    public class ProxySpawnPoint : SPNotifyingComponent\r\n    {\r\n\r\n        #region Fields\r\n\r\n        public bool FlagBusyOnSpawn = true;\r\n\r\n        [System.NonSerialized()]\r\n        private bool _busy;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool Busy { get { return _busy; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void ReleaseBusyStatus()\r\n        {\r\n            _busy = false;\r\n\r\n            Notification.PostNotification<OnReleaseBusyStatus>(this, new OnReleaseBusyStatus(this), false);\r\n        }\r\n\r\n        internal void PlaceOnSpawn(ISpawner spawnPoint, ISpawnFactory spawnPool, GameObject spawnedObject)\r\n        {\r\n            if (_busy) return;\r\n            if (this.FlagBusyOnSpawn) _busy = true;\r\n\r\n            spawnedObject.transform.position = this.transform.position;\r\n            spawnedObject.transform.rotation = this.transform.rotation;\r\n\r\n            var n = SpawnPointTriggeredNotification.Create(spawnPool, spawnedObject, spawnPoint);\r\n            Notification.PostNotification<SpawnPointTriggeredNotification>(this, n, false);\r\n            Notification.Release(n);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Notification Types\r\n\r\n        public class OnReleaseBusyStatus : Notification\r\n        {\r\n\r\n            private ProxySpawnPoint _spawnPoint;\r\n\r\n            public OnReleaseBusyStatus(ProxySpawnPoint spawnPoint)\r\n            {\r\n                _spawnPoint = spawnPoint;\r\n            }\r\n\r\n            public ProxySpawnPoint SpawnPoint { get { return _spawnPoint; } }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawn/Spawn/ProxySpawnPointManager.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Spawn\r\n{\r\n    public class ProxySpawnPointManager : SPComponent, ISpawnerModifier\r\n    {\r\n\r\n        #region Fields\r\n\r\n        public int order;\r\n        public bool BlockSpawnIfAllBusy = false;\r\n        public bool WaitToSpawnIfAllBusy = true;\r\n\r\n\r\n        [System.NonSerialized()]\r\n        private NotificationPool _onReleaseBusyStatusPool = new NotificationPool();\r\n        [System.NonSerialized()]\r\n        private Queue<SpawnPointTriggeredNotification> _delayedQueue = new Queue<SpawnPointTriggeredNotification>();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            _onReleaseBusyStatusPool.RegisterNotificationType<ProxySpawnPoint.OnReleaseBusyStatus>();\r\n            _onReleaseBusyStatusPool.OnNotification += this.OnReleaseBusyStatusHandler;\r\n        }\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            SpawnPointHelper.RegisterModifierWithSpawners(this.gameObject, this);\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            SpawnPointHelper.UnRegisterModifierWithSpawners(this.gameObject, this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public IEnumerable<ProxySpawnPoint> GetAllProxies()\r\n        {\r\n            return this.GetChildComponents<ProxySpawnPoint>();\r\n        }\r\n\r\n        private void OnReleaseBusyStatusHandler(object sender, Notification n)\r\n        {\r\n            var sn = n as ProxySpawnPoint.OnReleaseBusyStatus;\r\n            if (sn == null) return;\r\n\r\n            while (_delayedQueue.Peek() == null) _delayedQueue.Dequeue(); //clear out any that have died\r\n            if(_delayedQueue.Count > 0)\r\n            {\r\n                var delayedNotif = _delayedQueue.Dequeue();\r\n                delayedNotif.SpawnedObject.SetActive(true);\r\n                sn.SpawnPoint.PlaceOnSpawn(delayedNotif.SpawnPoint, delayedNotif.SpawnFactory, delayedNotif.SpawnedObject);\r\n            }\r\n\r\n            if(_delayedQueue.Count == 0)\r\n            {\r\n                _onReleaseBusyStatusPool.Clear();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISpawnerModifier Interface\r\n\r\n        int ISpawnerModifier.order\r\n        {\r\n            get { return this.order; }\r\n        }\r\n\r\n        void ISpawnerModifier.OnBeforeSpawnNotification(SpawnPointBeforeSpawnNotification n)\r\n        {\r\n            var nodes = this.GetAllProxies().ToArray();\r\n\r\n            if (nodes.Length == 0)\r\n            {\r\n                n.Cancelled = true;\r\n                Debug.LogWarning(\"ProxySpawnPointManager is configured improperly, you must add child nodes.\", this);\r\n                return;\r\n            }\r\n\r\n            if (this.BlockSpawnIfAllBusy)\r\n            {\r\n                if (!nodes.Any((p) => !p.Busy))\r\n                {\r\n                    n.Cancelled = true;\r\n                    return;\r\n                }\r\n            }\r\n        }\r\n\r\n        void ISpawnerModifier.OnSpawnedNotification(SpawnPointTriggeredNotification n)\r\n        {\r\n            if (this.WaitToSpawnIfAllBusy)\r\n            {\r\n                var nodes = this.GetAllProxies().ToArray();\r\n                var node = (from p in nodes where !p.Busy select p).PickRandom();\r\n                if (node != null)\r\n                {\r\n                    node.PlaceOnSpawn(n.SpawnPoint, n.SpawnFactory, n.SpawnedObject);\r\n                }\r\n                else\r\n                {\r\n                    n.SpawnedObject.SetActive(false);\r\n                    _delayedQueue.Enqueue(n);\r\n                    _onReleaseBusyStatusPool.AddRange(nodes);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var node = this.GetAllProxies().PickRandom();\r\n                if (node != null)\r\n                {\r\n                    node.PlaceOnSpawn(n.SpawnPoint, n.SpawnFactory, n.SpawnedObject);\r\n                }\r\n                else\r\n                {\r\n                    Debug.LogWarning(\"ProxySpawnPointManager is configured improperly, you must add child nodes.\", this);\r\n                }\r\n\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawn/Spawn/RestrictSpawnCount.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Spawn\r\n{\r\n    [RequireComponent(typeof(i_Spawner))]\r\n    public class RestrictSpawnCount : SPComponent, ISpawnerModifier, IObservableTrigger\r\n    {\r\n\r\n        public const string TRG_MAXACTIVECOUNTREACHED = \"OnMaxActiveCountReached\";\r\n        public const string TRG_MAXCOUNTREACHED = \"OnMaxCountReached\";\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"order\")]\r\n        private int _order;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"MaxCount\")]\r\n        [DiscreteFloat.NonNegative()]\r\n        private DiscreteFloat _maxCount = 1;\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"MaxActiveCount\")]\r\n        [DiscreteFloat.NonNegative()]\r\n        private DiscreteFloat _maxActiveCount = 1;\r\n\r\n        [SerializeField()]\r\n        private Trigger _onMaxActiveCountReached = new Trigger(TRG_MAXACTIVECOUNTREACHED);\r\n        [SerializeField()]\r\n        private Trigger _onMaxCountReached = new Trigger(TRG_MAXCOUNTREACHED);\r\n\r\n        [System.NonSerialized()]\r\n        private bool _maxActiveReachedTriggered = false;\r\n        [System.NonSerialized()]\r\n        private bool _maxCountReachedTriggered = false;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            SpawnPointHelper.RegisterModifierWithSpawners(this.gameObject, this);\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            SpawnPointHelper.UnRegisterModifierWithSpawners(this.gameObject, this);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int Order\r\n        {\r\n            get { return _order; }\r\n            set { _order = value; }\r\n        }\r\n\r\n        public DiscreteFloat MaxCount\r\n        {\r\n            get { return _maxCount; }\r\n            set { _maxCount = (value < 0f) ? DiscreteFloat.Zero : value; }\r\n        }\r\n\r\n        public DiscreteFloat MaxActivateCount\r\n        {\r\n            get { return _maxActiveCount; }\r\n            set { _maxActiveCount = (value < 0f) ? DiscreteFloat.Zero : value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISpawnerModifier Interface\r\n\r\n        int ISpawnerModifier.order\r\n        {\r\n            get { return _order; }\r\n        }\r\n\r\n        void ISpawnerModifier.OnBeforeSpawnNotification(SpawnPointBeforeSpawnNotification n)\r\n        {\r\n            if (!this.isActiveAndEnabled) return;\r\n\r\n            if (n.SpawnPoint.TotalCount >= this._maxCount)\r\n            {\r\n                n.Cancelled = true;\r\n            }\r\n            else if (n.SpawnPoint.ActiveCount >= this._maxActiveCount)\r\n            {\r\n                n.Cancelled = true;\r\n            }\r\n            else if(_maxActiveReachedTriggered)\r\n            {\r\n                _maxActiveReachedTriggered = false;\r\n            }\r\n        }\r\n\r\n        void ISpawnerModifier.OnSpawnedNotification(SpawnPointTriggeredNotification n)\r\n        {\r\n            if (!this.isActiveAndEnabled) return;\r\n\r\n            if (!_maxActiveReachedTriggered && n.SpawnPoint.ActiveCount == this._maxActiveCount)\r\n            {\r\n                _maxActiveReachedTriggered = true;\r\n                _onMaxActiveCountReached.ActivateTrigger(this, null);\r\n            }\r\n            if (!_maxCountReachedTriggered && n.SpawnPoint.TotalCount == this._maxCount)\r\n            {\r\n                _maxCountReachedTriggered = true;\r\n                _onMaxCountReached.ActivateTrigger(this, null);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IObservableTrigger Interface\r\n        \r\n        Trigger[] IObservableTrigger.GetTriggers()\r\n        {\r\n            return new Trigger[] { _onMaxActiveCountReached, _onMaxCountReached };\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawn/Spawn/SelfTrackingSpawnerMechanism.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Spawn\r\n{\r\n\r\n    [System.Serializable()]\r\n    public class SelfTrackingSpawnerMechanism\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [Tooltip(\"If left empty the default SpawnPool will be used instead.\")]\r\n        private SpawnPool _spawnPool;\r\n\r\n        [System.NonSerialized()]\r\n        private ISpawner _spawnPoint;\r\n        [System.NonSerialized()]\r\n        private bool _active;\r\n\r\n        [System.NonSerialized()]\r\n        private NotificationPool _spawnedObjects = new NotificationPool();\r\n\r\n        [System.NonSerialized()]\r\n        private int _totalCount;\r\n\r\n        [System.NonSerialized]\r\n        private BinaryHeap<ISpawnerModifier> _modifiers;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n        \r\n        public void Init(ISpawner owner, bool active = false)\r\n        {\r\n            if (!object.ReferenceEquals(_spawnPoint, null)) throw new System.InvalidOperationException(\"SpawnerMechanism has already been initialized.\");\r\n\r\n            _spawnedObjects.RegisterNotificationType<DeSpawnNotification>();\r\n            _spawnedObjects.RegisterNotificationType<SpawnPoolPurgedNotification>();\r\n\r\n            _spawnPoint = owner;\r\n            this.Active = active;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool UsesDefaultSpawnPool\r\n        {\r\n            get { return object.ReferenceEquals(_spawnPool, null) || object.ReferenceEquals(_spawnPool, SpawnPool.DefaultPool); }\r\n        }\r\n\r\n        public SpawnPool SpawnPool\r\n        {\r\n            get\r\n            {\r\n                if (_spawnPool == null) _spawnPool = SpawnPool.DefaultPool;\r\n                return _spawnPool;\r\n            }\r\n            set { _spawnPool = value; }\r\n        }\r\n\r\n        public int ActiveCount { get { return _spawnedObjects.Count; } }\r\n\r\n        public int TotalCount { get { return _totalCount; } }\r\n\r\n        public bool Active\r\n        {\r\n            get { return _active; }\r\n            set\r\n            {\r\n                if (_active == value) return;\r\n                _active = value;\r\n                if(_active)\r\n                {\r\n                    _spawnedObjects.OnNotification += this.OnSpawnedObjectNotification;\r\n                }\r\n                else\r\n                {\r\n                    _spawnedObjects.OnNotification -= this.OnSpawnedObjectNotification;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public GameObject Spawn(GameObject prefab, Vector3 pos, Quaternion rot, Transform par = null, System.Action<GameObject> initializeProperties = null)\r\n        {\r\n            var controller = this.SpawnAsController(prefab, pos, rot, par, initializeProperties);\r\n            return (controller != null) ? controller.gameObject : null;\r\n        }\r\n        \r\n        public SpawnedObjectController SpawnAsController(GameObject prefab, Vector3 pos, Quaternion rot, Transform par = null, System.Action<GameObject> initializeProperties = null)\r\n        {\r\n            if (_spawnPoint == null) throw new System.InvalidOperationException(\"SpawnerMechanism must be initialized before calling Spawn.\");\r\n            if (!_active) return null;\r\n            if (prefab == null) return null;\r\n\r\n            /*\r\n            using (var modifiers = TempCollection.GetList<ISpawnerModifier>())\r\n            {\r\n                SpawnPointHelper.GetSpawnModifiers(_spawnPoint, modifiers);\r\n\r\n                if(SpawnPointHelper.SignalOnBeforeSpawnNotification(_spawnPoint, prefab, modifiers))\r\n                {\r\n                    return null;\r\n                }\r\n\r\n                //perform actual spawn\r\n                var controller = this.SpawnPool.SpawnAsController(prefab, pos, rot, par, initializeProperties, _spawnPoint);\r\n                if (controller == null) return null;\r\n                _spawnedObjects.Add(controller);\r\n                _totalCount++;\r\n                //end actual spawn\r\n\r\n                SpawnPointHelper.SignalOnSpawnedNotification(_spawnPoint, this.SpawnPool, controller.gameObject, modifiers);\r\n\r\n                return controller;\r\n            }\r\n            */\r\n\r\n            //on before spawn\r\n            var beforeNotif = SpawnPointBeforeSpawnNotification.Create(_spawnPoint, prefab);\r\n            if (_modifiers != null && _modifiers.Count > 0)\r\n            {\r\n                var e = _modifiers.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    e.Current.OnBeforeSpawnNotification(beforeNotif);\r\n                }\r\n            }\r\n            Notification.PostNotification<SpawnPointBeforeSpawnNotification>(_spawnPoint, beforeNotif, false);\r\n            Notification.Release(beforeNotif);\r\n\r\n            if (beforeNotif.Cancelled)\r\n                return null;\r\n\r\n            //perform actual spawn\r\n            var controller = this.SpawnPool.SpawnAsController(prefab, pos, rot, par, initializeProperties, _spawnPoint);\r\n            if (controller == null) return null;\r\n            _spawnedObjects.Add(controller);\r\n            _totalCount++;\r\n            //end actual spawn\r\n\r\n            //on post spawn\r\n            var spawnNotif = SpawnPointTriggeredNotification.Create(this.SpawnPool, controller.gameObject, _spawnPoint);\r\n            if (_modifiers != null && _modifiers.Count > 0)\r\n            {\r\n                var e = _modifiers.GetEnumerator();\r\n                while (e.MoveNext())\r\n                {\r\n                    e.Current.OnSpawnedNotification(spawnNotif);\r\n                }\r\n            }\r\n            Notification.PostNotification<SpawnPointTriggeredNotification>(_spawnPoint, spawnNotif, false);\r\n            Notification.Release(spawnNotif);\r\n\r\n            return controller;\r\n        }\r\n\r\n        public GameObject[] GetActiveGameObjects()\r\n        {\r\n            return (from c in _spawnedObjects where c is SpawnedObjectController select (c as SpawnedObjectController).gameObject).ToArray();\r\n        }\r\n\r\n        public SpawnedObjectController[] GetActiveObjectControllers()\r\n        {\r\n            return (from c in _spawnedObjects where c is SpawnedObjectController select c as SpawnedObjectController).ToArray();\r\n        }\r\n\r\n\r\n        public void RegisterModifier(ISpawnerModifier modifier)\r\n        {\r\n            if (modifier == null) throw new System.ArgumentNullException(\"modifier\");\r\n            if(_modifiers == null)\r\n            {\r\n                _modifiers = new BinaryHeap<ISpawnerModifier>(SpawnerModifierComparer.Default);\r\n            }\r\n\r\n            if(!_modifiers.Contains(modifier))\r\n                _modifiers.Add(modifier);\r\n        }\r\n\r\n        public bool UnRegisterModifier(ISpawnerModifier modifier)\r\n        {\r\n            if (_modifiers == null) return false;\r\n            if (modifier == null) return false;\r\n\r\n            return _modifiers.Remove(modifier);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Notification handlers\r\n\r\n        private void OnSpawnedObjectNotification(object sender, Notification n)\r\n        {\r\n            if(n is DeSpawnNotification)\r\n            {\r\n                _spawnedObjects.Remove((n as DeSpawnNotification).Controller);\r\n            }\r\n            else if(n is SpawnPoolPurgedNotification)\r\n            {\r\n                _spawnedObjects.Remove((n as SpawnPoolPurgedNotification).Controller);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        public class ConfigAttribute : System.Attribute\r\n        {\r\n            private string _label;\r\n\r\n            public ConfigAttribute(string label)\r\n            {\r\n                _label = label;\r\n            }\r\n\r\n            public string Label { get { return _label; } }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawn/Spawn/SpawnNotification.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System;\r\n\r\nnamespace com.spacepuppy.Spawn\r\n{\r\n\r\n    public class SpawnNotification : Notification\r\n    {\r\n\r\n        #region Fields\r\n\r\n        protected ISpawnFactory _factory;\r\n        protected GameObject _spawnedObject;\r\n        protected ISpawner _spawnPoint;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public SpawnNotification(ISpawnFactory factory, GameObject spawnedObject)\r\n        {\r\n            if (factory == null) throw new System.ArgumentNullException(\"factory\");\r\n            if (spawnedObject == null) throw new System.ArgumentNullException(\"spawnedObject\");\r\n            _factory = factory;\r\n            _spawnedObject = spawnedObject;\r\n            _spawnPoint = null;\r\n        }\r\n\r\n        public SpawnNotification(ISpawnFactory factory, GameObject spawnedObject, ISpawner spawnPoint)\r\n        {\r\n            if (factory == null) throw new System.ArgumentNullException(\"factory\");\r\n            if (spawnedObject == null) throw new System.ArgumentNullException(\"spawnedObject\");\r\n            _factory = factory;\r\n            _spawnedObject = spawnedObject;\r\n            _spawnPoint = spawnPoint;\r\n        }\r\n\r\n        protected SpawnNotification()\r\n        {\r\n\r\n        }\r\n\r\n        public static SpawnNotification Create(ISpawnFactory factory, GameObject spawnedObject, ISpawner spawnPoint)\r\n        {\r\n            if (factory == null) throw new System.ArgumentNullException(\"factory\");\r\n            if (spawnedObject == null) throw new System.ArgumentNullException(\"spawnedObject\");\r\n\r\n            SpawnNotification n;\r\n            if(Notification.TryGetCache<SpawnNotification>(out n))\r\n            {\r\n                n._factory = factory;\r\n                n._spawnedObject = spawnedObject;\r\n                n._spawnPoint = spawnPoint;\r\n            }\r\n            else\r\n            {\r\n                n = new SpawnNotification(factory, spawnedObject, spawnPoint);\r\n            }\r\n            return n;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ISpawnFactory SpawnFactory { get { return _factory; } }\r\n\r\n        public GameObject SpawnedObject { get { return _spawnedObject; } }\r\n\r\n        /// <summary>\r\n        /// Possible spawnpoint that spawned this object, if one exists and was identitified.\r\n        /// </summary>\r\n        public ISpawner SpawnPoint { get { return _spawnPoint; } }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    public class SpawnPointTriggeredNotification : SpawnNotification\r\n    {\r\n        \r\n        public SpawnPointTriggeredNotification(ISpawnFactory factory, GameObject spawnedObject, ISpawner spawnPoint)\r\n            : base(factory, spawnedObject, spawnPoint)\r\n        {\r\n        }\r\n        \r\n        public new static SpawnPointTriggeredNotification Create(ISpawnFactory factory, GameObject spawnedObject, ISpawner spawnPoint)\r\n        {\r\n            if (factory == null) throw new System.ArgumentNullException(\"factory\");\r\n            if (spawnedObject == null) throw new System.ArgumentNullException(\"spawnedObject\");\r\n\r\n            SpawnPointTriggeredNotification n;\r\n            if(Notification.TryGetCache<SpawnPointTriggeredNotification>(out n))\r\n            {\r\n                n._factory = factory;\r\n                n._spawnedObject = spawnedObject;\r\n                n._spawnPoint = spawnPoint;\r\n            }\r\n            else\r\n            {\r\n                n = new SpawnPointTriggeredNotification(factory, spawnedObject, spawnPoint);\r\n            }\r\n            return n;\r\n        }\r\n\r\n    }\r\n\r\n    public class SpawnPointBeforeSpawnNotification : CancellableNotification\r\n    {\r\n\r\n        private ISpawner _spawnPoint;\r\n        private GameObject _prefab;\r\n\r\n        public SpawnPointBeforeSpawnNotification(ISpawner spawnPoint, GameObject prefab)\r\n        {\r\n            if (spawnPoint == null) throw new System.ArgumentNullException(\"spawnPoint\");\r\n            _spawnPoint = spawnPoint;\r\n            _prefab = prefab;\r\n        }\r\n\r\n        protected SpawnPointBeforeSpawnNotification()\r\n        {\r\n\r\n        }\r\n\r\n        public static SpawnPointBeforeSpawnNotification Create(ISpawner spawnPoint, GameObject prefab)\r\n        {\r\n            if (spawnPoint == null) throw new System.ArgumentNullException(\"spawnPoint\");\r\n\r\n            SpawnPointBeforeSpawnNotification n;\r\n            if (Notification.TryGetCache<SpawnPointBeforeSpawnNotification>(out n))\r\n            {\r\n                n._spawnPoint = spawnPoint;\r\n                n._prefab = prefab;\r\n            }\r\n            else\r\n            {\r\n                n = new SpawnPointBeforeSpawnNotification(spawnPoint, prefab);\r\n            }\r\n            return n;\r\n        }\r\n\r\n        public ISpawner SpawnPoint { get { return _spawnPoint; } }\r\n\r\n        /// <summary>\r\n        /// The prefab, if known. This may be null if the SpawnFactory hasn't determined the prefab.\r\n        /// </summary>\r\n        public GameObject Prefab { get { return _prefab; } }\r\n\r\n    }\r\n\r\n    public class DeSpawnNotification : Notification\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private SpawnedObjectController _controller;\r\n        private GameObject _spawnedObject;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public DeSpawnNotification(SpawnedObjectController controller)\r\n        {\r\n            if (controller == null) throw new System.ArgumentNullException(\"controller\");\r\n            _controller = controller;\r\n            _spawnedObject = controller.gameObject;\r\n        }\r\n\r\n        protected DeSpawnNotification()\r\n        {\r\n\r\n        }\r\n\r\n        public static DeSpawnNotification Create(SpawnedObjectController controller)\r\n        {\r\n            if (controller == null) throw new System.ArgumentNullException(\"controller\");\r\n\r\n            DeSpawnNotification n;\r\n            if (Notification.TryGetCache<DeSpawnNotification>(out n))\r\n            {\r\n                n._controller = controller;\r\n                n._spawnedObject = controller.gameObject;\r\n            }\r\n            else\r\n            {\r\n                n = new DeSpawnNotification(controller);\r\n            }\r\n            return n;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public SpawnedObjectController Controller { get { return _controller; } }\r\n\r\n        public GameObject SpawnedObject { get { return _spawnedObject; } }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    public class SpawnPoolPurgedNotification : Notification\r\n    {\r\n        #region Fields\r\n\r\n        private SpawnedObjectController _controller;\r\n        private GameObject _spawnedObject;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public SpawnPoolPurgedNotification(SpawnedObjectController controller)\r\n        {\r\n            if (controller == null) throw new System.ArgumentNullException(\"controller\");\r\n            _controller = controller;\r\n            _spawnedObject = controller.gameObject;\r\n        }\r\n        \r\n        public static SpawnPoolPurgedNotification Create(SpawnedObjectController controller)\r\n        {\r\n            if (controller == null) throw new System.ArgumentNullException(\"controller\");\r\n\r\n            SpawnPoolPurgedNotification n;\r\n            if (Notification.TryGetCache<SpawnPoolPurgedNotification>(out n))\r\n            {\r\n                n._controller = controller;\r\n                n._spawnedObject = controller.gameObject;\r\n            }\r\n            else\r\n            {\r\n                n = new SpawnPoolPurgedNotification(controller);\r\n            }\r\n            return n;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public SpawnedObjectController Controller { get { return _controller; } }\r\n\r\n        public GameObject SpawnedObject { get { return _spawnedObject; } }\r\n\r\n        #endregion\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawn/Spawn/SpawnPointHelper.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Spawn\r\n{\r\n    public static class SpawnPointHelper\r\n    {\r\n\r\n        public static int SelectFromMultiple(ISpawner spawnPoint, int optionCount, bool ignoreSelectionModifiers = false)\r\n        {\r\n            if (optionCount <= 0) return -1;\r\n            if (optionCount == 1) return 0;\r\n\r\n            if(!ignoreSelectionModifiers && spawnPoint != null && spawnPoint.component != null)\r\n            {\r\n                using (var lst = TempCollection.GetList<ISpawnPointSelector>())\r\n                {\r\n                    spawnPoint.component.GetComponents<ISpawnPointSelector>(lst);\r\n                    for(int i = 0; i < lst.Count; i++)\r\n                    {\r\n                        if(lst[i].enabled)\r\n                        {\r\n                            int index = lst[i].Select(spawnPoint, optionCount);\r\n                            if (index >= 0) return index;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            return RandomUtil.Standard.Range(optionCount);\r\n        }\r\n\r\n        /*\r\n        public static void GetSpawnModifiers(ISpawner spawnPoint, List<ISpawnerModifier> modifiers)\r\n        {\r\n            if (spawnPoint == null) throw new System.ArgumentNullException(\"spawnPoint\");\r\n\r\n            spawnPoint.component.GetComponents<ISpawnerModifier>(modifiers);\r\n            if(modifiers.Count > 0)\r\n                modifiers.Sort(SpawnPointHelper.ModiferSortMethod);\r\n        }\r\n\r\n        public static bool SignalOnBeforeSpawnNotification(ISpawner spawnPoint, GameObject prefab, IList<ISpawnerModifier> modifiers)\r\n        {\r\n            var beforeNotif = SpawnPointBeforeSpawnNotification.Create(spawnPoint, prefab);\r\n            \r\n            if (modifiers != null && modifiers.Count > 0)\r\n            {\r\n                for(int i = 0; i < modifiers.Count; i++)\r\n                {\r\n                    if(modifiers[i] != null) modifiers[i].OnBeforeSpawnNotification(beforeNotif);\r\n                }\r\n            }\r\n            Notification.PostNotification<SpawnPointBeforeSpawnNotification>(spawnPoint, beforeNotif, false);\r\n            Notification.Release(beforeNotif);\r\n\r\n            return beforeNotif.Cancelled;\r\n        }\r\n\r\n        public static void SignalOnSpawnedNotification(ISpawner spawnPoint, ISpawnFactory factory, GameObject spawnedObject, IList<ISpawnerModifier> modifiers)\r\n        {\r\n            var spawnNotif = SpawnPointTriggeredNotification.Create(factory, spawnedObject, spawnPoint);\r\n            if (modifiers != null && modifiers.Count > 0)\r\n            {\r\n                for (int i = 0; i < modifiers.Count; i++)\r\n                {\r\n                    if (modifiers[i] != null) modifiers[i].OnSpawnedNotification(spawnNotif);\r\n                }\r\n            }\r\n            Notification.PostNotification<SpawnPointTriggeredNotification>(spawnPoint, spawnNotif, false);\r\n            Notification.Release(spawnNotif);\r\n        }\r\n        */\r\n\r\n        public static void RegisterModifierWithSpawners(GameObject target, ISpawnerModifier modifier)\r\n        {\r\n            using (var lst = com.spacepuppy.Collections.TempCollection.GetList<ISpawner>())\r\n            {\r\n                target.GetComponents<ISpawner>(lst);\r\n                var e = lst.GetEnumerator();\r\n                while (e.MoveNext())\r\n                    e.Current.Mechanism.RegisterModifier(modifier);\r\n            }\r\n        }\r\n\r\n        public static void UnRegisterModifierWithSpawners(GameObject target, ISpawnerModifier modifier)\r\n        {\r\n            using (var lst = com.spacepuppy.Collections.TempCollection.GetList<ISpawner>())\r\n            {\r\n                target.GetComponents<ISpawner>(lst);\r\n                var e = lst.GetEnumerator();\r\n                while (e.MoveNext())\r\n                    e.Current.Mechanism.UnRegisterModifier(modifier);\r\n            }\r\n        }\r\n\r\n        #region Internal\r\n\r\n        private static System.Comparison<ISpawnerModifier> _modifierSort;\r\n        public static System.Comparison<ISpawnerModifier> ModiferSortMethod\r\n        {\r\n            get\r\n            {\r\n                if (_modifierSort == null)\r\n                {\r\n                    _modifierSort = (a, b) => a.order.CompareTo(b.order);\r\n                }\r\n                return _modifierSort;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawn/Spawn/SpawnPool.cs",
    "content": "using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Spawn\r\n{\r\n\r\n    [AddComponentMenu(\"SpacePuppy/Spawn/Spawn Pool\")]\r\n    public class SpawnPool : SPNotifyingComponent, ISpawnFactory, ISerializationCallbackReceiver\r\n    {\r\n\r\n        #region Static Multiton Interface\r\n\r\n        public const string DEFAULT_SPAWNPOOL_NAME = \"Spacepuppy.PrimarySpawnPool\";\r\n\r\n        private static SpawnPool _defaultPool;\r\n        public static readonly MultitonPool<SpawnPool> Pools = new MultitonPool<SpawnPool>();\r\n\r\n        public static SpawnPool DefaultPool\r\n        {\r\n            get\r\n            {\r\n                if (_defaultPool == null) CreatePrimaryPool();\r\n                return _defaultPool;\r\n            }\r\n        }\r\n        \r\n        public static SpawnPool Pool(string name)\r\n        {\r\n            if (_defaultPool != null && _defaultPool.CompareName(name)) return _defaultPool;\r\n\r\n            //TODO - should cache 'name' for access so this doesn't generate garbage\r\n            var e = Pools.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if (e.Current.CompareName(name)) return e.Current;\r\n            }\r\n            return null;\r\n        }\r\n        \r\n        public static void CreatePrimaryPool()\r\n        {\r\n            if (PrimaryPoolExists) return;\r\n\r\n            var go = new GameObject(DEFAULT_SPAWNPOOL_NAME);\r\n            _defaultPool = go.AddComponent<SpawnPool>();\r\n        }\r\n\r\n        public static bool PrimaryPoolExists\r\n        {\r\n            get\r\n            {\r\n                if (_defaultPool != null) return true;\r\n\r\n                _defaultPool = null;\r\n                if (Pools.Count > 0)\r\n                {\r\n                    SpawnPool point = null;\r\n                    var e = Pools.GetEnumerator();\r\n                    while(e.MoveNext())\r\n                    {\r\n                        if(e.Current.CompareName(DEFAULT_SPAWNPOOL_NAME))\r\n                        {\r\n                            point = e.Current;\r\n                            break;\r\n                        }\r\n                    }\r\n\r\n                    if (!object.ReferenceEquals(point, null))\r\n                    {\r\n                        _defaultPool = point;\r\n                        return true;\r\n                    }\r\n                }\r\n\r\n                return false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        [ReorderableArray(DrawElementAtBottom = true, ChildPropertyToDrawAsElementLabel = \"ItemName\", ChildPropertyToDrawAsElementEntry=\"_prefab\")]\r\n        private List<PrefabCacheOptions> _registeredPrefabs = new List<PrefabCacheOptions>();\r\n        [System.NonSerialized()]\r\n        private Dictionary<GameObject, PrefabCacheOptions> _prefabToCache = new Dictionary<GameObject, PrefabCacheOptions>(com.spacepuppy.Collections.ObjectInstanceIDEqualityComparer<GameObject>.Default);\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            Pools.AddReference(this);\r\n        }\r\n\r\n        protected override void Start()\r\n        {\r\n            base.Start();\r\n\r\n            var e = _registeredPrefabs.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                e.Current.Load();\r\n            }\r\n        }\r\n\r\n        protected override void OnDestroy()\r\n        {\r\n            base.OnDestroy();\r\n\r\n            Pools.RemoveReference(this);\r\n            if (Object.ReferenceEquals(this, _defaultPool))\r\n            {\r\n                _defaultPool = null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public int Count { get { return _registeredPrefabs.Count; } }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public PrefabCacheOptions Register(GameObject prefab, string sname, int cacheSize = 0, int resizeBuffer = 1, int limitAmount = 1)\r\n        {\r\n            if (object.ReferenceEquals(prefab, null)) throw new System.ArgumentNullException(\"prefab\");\r\n            if (_prefabToCache.ContainsKey(prefab)) throw new System.ArgumentException(\"Already manages prefab.\", \"prefab\");\r\n\r\n            var options = new PrefabCacheOptions(prefab)\r\n            {\r\n                ItemName = sname,\r\n                CacheSize = cacheSize,\r\n                ResizeBuffer = resizeBuffer,\r\n                LimitAmount = limitAmount\r\n            };\r\n            _registeredPrefabs.Add(options);\r\n            _prefabToCache[prefab] = options;\r\n            return options;\r\n        }\r\n\r\n\r\n        public GameObject Spawn(int index, Transform par = null, System.Action<GameObject> initializeProperties = null, ISpawner optionalSpawnPoint = null)\r\n        {\r\n            if (index < 0 || index >= _registeredPrefabs.Count) throw new System.IndexOutOfRangeException();\r\n\r\n            var cache = _registeredPrefabs[index];\r\n            var pos = (par != null) ? par.position : Vector3.zero;\r\n            var rot = (par != null) ? par.rotation : Quaternion.identity;\r\n            var obj = cache.Spawn(pos, rot, par, initializeProperties);\r\n            this.SignalSpawned(obj, optionalSpawnPoint);\r\n            return obj.gameObject;\r\n        }\r\n\r\n        public GameObject Spawn(int index, Vector3 position, Quaternion rotation, Transform par = null, System.Action<GameObject> initializeProperties = null, ISpawner optionalSpawnPoint = null)\r\n        {\r\n            if (index < 0 || index >= _registeredPrefabs.Count) throw new System.IndexOutOfRangeException();\r\n\r\n            var cache = _registeredPrefabs[index];\r\n            var obj = cache.Spawn(position, rotation, par, initializeProperties);\r\n            this.SignalSpawned(obj, optionalSpawnPoint);\r\n            return obj.gameObject;\r\n        }\r\n\r\n        public GameObject Spawn(string sname, Transform par = null, System.Action<GameObject> initializeProperties = null, ISpawner optionalSpawnPoint = null)\r\n        {\r\n            //var cache = (from o in _registeredPrefabs where o.ItemName == sname select o).FirstOrDefault();\r\n            PrefabCacheOptions cache = null;\r\n            var e = _registeredPrefabs.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if(e.Current.ItemName == sname)\r\n                {\r\n                    cache = e.Current;\r\n                    break;\r\n                }\r\n            }\r\n            if (cache == null) return null;\r\n\r\n            var pos = (par != null) ? par.position : Vector3.zero;\r\n            var rot = (par != null) ? par.rotation : Quaternion.identity;\r\n            var obj = cache.Spawn(pos, rot, par, initializeProperties);\r\n            this.SignalSpawned(obj, optionalSpawnPoint);\r\n            return obj.gameObject;\r\n        }\r\n\r\n        public GameObject Spawn(string sname, Vector3 position, Quaternion rotation, Transform par = null, System.Action<GameObject> initializeProperties = null, ISpawner optionalSpawnPoint = null)\r\n        {\r\n            //var cache = (from o in _registeredPrefabs where o.ItemName == sname select o).FirstOrDefault();\r\n            PrefabCacheOptions cache = null;\r\n            var e = _registeredPrefabs.GetEnumerator();\r\n            while (e.MoveNext())\r\n            {\r\n                if (e.Current.ItemName == sname)\r\n                {\r\n                    cache = e.Current;\r\n                    break;\r\n                }\r\n            }\r\n            if (cache == null) return null;\r\n\r\n            var obj = cache.Spawn(position, rotation, par, initializeProperties);\r\n            this.SignalSpawned(obj, optionalSpawnPoint);\r\n            return obj.gameObject;\r\n        }\r\n\r\n        public GameObject Spawn(GameObject prefab, Transform par = null, System.Action<GameObject> initializeProperties = null, ISpawner optionalSpawnPoint = null)\r\n        {\r\n            var controller = SpawnAsController(prefab, par, initializeProperties, optionalSpawnPoint);\r\n            return (controller != null) ? controller.gameObject : null;\r\n        }\r\n\r\n        public GameObject Spawn(GameObject prefab, Vector3 position, Quaternion rotation, Transform par = null, System.Action<GameObject> initializeProperties = null, ISpawner optionalSpawnPoint = null)\r\n        {\r\n            var controller = SpawnAsController(prefab, position, rotation, par, initializeProperties, optionalSpawnPoint);\r\n            return (controller != null) ? controller.gameObject : null;\r\n        }\r\n        \r\n        public T SpawnAsComponent<T>(T prefab, Transform par = null, System.Action<GameObject> initializeProperties = null, ISpawner optionalSpawnPoint = null) where T : class\r\n        {\r\n            var go = GameObjectUtil.GetGameObjectFromSource(prefab);\r\n            if (object.ReferenceEquals(go, null)) return null;\r\n\r\n            var controller = SpawnAsController(go, par, initializeProperties, optionalSpawnPoint);\r\n            if (controller == null) return null;\r\n\r\n            var result = controller.GetComponent<T>();\r\n            if(result == null)\r\n            {\r\n                this.Despawn(controller);\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                return result;\r\n            }\r\n        }\r\n        \r\n        public T SpawnAsComponent<T>(T prefab, Vector3 position, Quaternion rotation, Transform par = null, System.Action<GameObject> initializeProperties = null, ISpawner optionalSpawnPoint = null) where T : class\r\n        {\r\n            var go = GameObjectUtil.GetGameObjectFromSource(prefab);\r\n            if (object.ReferenceEquals(go, null)) return null;\r\n\r\n            var controller = SpawnAsController(go, position, rotation, par, initializeProperties, optionalSpawnPoint);\r\n            if (controller == null) return null;\r\n\r\n            var result = controller.GetComponent<T>();\r\n            if (result == null)\r\n            {\r\n                this.Despawn(controller);\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                return result;\r\n            }\r\n        }\r\n\r\n        public T SpawnAsComponent<T>(GameObject prefab, Transform par = null, System.Action<GameObject> initializeProperties = null, ISpawner optionalSpawnPoint = null) where T : class\r\n        {\r\n            if (object.ReferenceEquals(prefab, null)) return null;\r\n\r\n            var controller = SpawnAsController(prefab, par, initializeProperties, optionalSpawnPoint);\r\n            if (controller == null) return null;\r\n\r\n            var result = controller.GetComponent<T>();\r\n            if (result == null)\r\n            {\r\n                this.Despawn(controller);\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                return result;\r\n            }\r\n        }\r\n\r\n        public T SpawnAsComponent<T>(GameObject prefab, Vector3 position, Quaternion rotation, Transform par = null, System.Action<GameObject> initializeProperties = null, ISpawner optionalSpawnPoint = null) where T : class\r\n        {\r\n            if (object.ReferenceEquals(prefab, null)) return null;\r\n\r\n            var controller = SpawnAsController(prefab, position, rotation, par, initializeProperties, optionalSpawnPoint);\r\n            if (controller == null) return null;\r\n\r\n            var result = controller.GetComponent<T>();\r\n            if (result == null)\r\n            {\r\n                this.Despawn(controller);\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                return result;\r\n            }\r\n        }\r\n\r\n        public SpawnedObjectController SpawnAsController(GameObject prefab, Transform par = null, System.Action<GameObject> initializeProperties = null, ISpawner optionalSpawnPoint = null)\r\n        {\r\n            var cache = this.FindPrefabCache(prefab);\r\n            var pos = (par != null) ? par.position : Vector3.zero;\r\n            var rot = (par != null) ? par.rotation : Quaternion.identity;\r\n\r\n            if (cache != null)\r\n            {\r\n                var controller = cache.Spawn(pos, rot, par, initializeProperties);\r\n                this.SignalSpawned(controller, optionalSpawnPoint);\r\n                return controller;\r\n            }\r\n            else\r\n            {\r\n                var obj = PrefabUtil.Create(prefab, pos, rot, par);\r\n                if (obj != null)\r\n                {\r\n                    var controller = obj.AddOrGetComponent<SpawnedObjectController>();\r\n                    controller.Init(this, prefab);\r\n                    if (initializeProperties != null) initializeProperties(obj);\r\n                    controller.SetSpawned();\r\n                    this.SignalSpawned(controller, optionalSpawnPoint);\r\n                    return controller;\r\n                }\r\n                else\r\n                {\r\n                    return null;\r\n                }\r\n            }\r\n        }\r\n\r\n        public SpawnedObjectController SpawnAsController(GameObject prefab, Vector3 position, Quaternion rotation, Transform par = null, System.Action<GameObject> initializeProperties = null, ISpawner optionalSpawnPoint= null)\r\n        {\r\n            var cache = this.FindPrefabCache(prefab);\r\n            if (cache != null)\r\n            {\r\n                var controller = cache.Spawn(position, rotation, par, initializeProperties);\r\n                this.SignalSpawned(controller, optionalSpawnPoint);\r\n                return controller;\r\n            }\r\n            else\r\n            {\r\n                var obj = PrefabUtil.Create(prefab, position, rotation, par);\r\n                if (obj != null)\r\n                {\r\n                    var controller = obj.AddOrGetComponent<SpawnedObjectController>();\r\n                    controller.Init(this, prefab);\r\n                    if (initializeProperties != null) initializeProperties(obj);\r\n                    controller.SetSpawned();\r\n                    this.SignalSpawned(controller, optionalSpawnPoint);\r\n                    return controller;\r\n                }\r\n                else\r\n                {\r\n                    return null;\r\n                }\r\n            }\r\n        }\r\n        \r\n\r\n        /// <summary>\r\n        /// Return an object to the pool.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns>Returns true if the object was returned to the pool, false if destroyed.</returns>\r\n        internal bool Despawn(SpawnedObjectController obj)\r\n        {\r\n            if (Object.ReferenceEquals(obj, null)) throw new System.ArgumentNullException(\"obj\");\r\n\r\n            obj.BroadcastMessage(SPSpawnConstants.MSG_ONDESPAWN, SendMessageOptions.DontRequireReceiver);\r\n            var n = DeSpawnNotification.Create(obj);\r\n            Notification.PostNotification<DeSpawnNotification>(obj, n, false);\r\n            Notification.PostNotification<DeSpawnNotification>(this, n, false);\r\n            Notification.Release(n);\r\n\r\n            var e = _registeredPrefabs.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if(e.Current.Contains(obj))\r\n                {\r\n                    e.Current.Despawn(obj);\r\n                    return true;\r\n                }\r\n            }\r\n\r\n            //if we reached here, it's not managed by this pool... destroy\r\n            if (UnityEngine.Application.isPlaying)\r\n            {\r\n                UnityEngine.Object.Destroy(obj.gameObject);\r\n            }\r\n            else\r\n            {\r\n                UnityEngine.Object.DestroyImmediate(obj.gameObject);\r\n            }\r\n            return false;\r\n        }\r\n\r\n        /// <summary>\r\n        /// If a GameObject is being destroyed, this method will purge it from the SpawnPool.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        internal void Purge(SpawnedObjectController obj)\r\n        {\r\n            if (Object.ReferenceEquals(obj, null)) throw new System.ArgumentNullException(\"obj\");\r\n\r\n            var n = SpawnPoolPurgedNotification.Create(obj);\r\n            Notification.PostNotification<SpawnPoolPurgedNotification>(obj, n, false);\r\n            Notification.PostNotification<SpawnPoolPurgedNotification>(this, n, false);\r\n            Notification.Release(n);\r\n\r\n            var e = _registeredPrefabs.GetEnumerator();\r\n            while(e.MoveNext())\r\n            {\r\n                if(e.Current.Contains(obj))\r\n                {\r\n                    e.Current.Purge(obj);\r\n                    return;\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Match an object to its prefab if this pool manages the GameObject.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        private PrefabCacheOptions FindPrefabCache(GameObject obj)\r\n        {\r\n            //TODO - figure out the best way to match a gameobject to the cache pool.\r\n            //as it stands this depends on the prefab being a shared instance across all scripts... \r\n            //I am unsure if that's how unity works, and what the limitations are on that.\r\n            //consider creating a system of relating equal prefabs\r\n\r\n            //test if the object is the prefab in question\r\n            if (_prefabToCache.ContainsKey(obj)) return _prefabToCache[obj];\r\n\r\n            var controller = obj.FindComponent<SpawnedObjectController>();\r\n            if (controller != null && controller.Pool == this)\r\n            {\r\n                var e = _registeredPrefabs.GetEnumerator();\r\n                while(e.MoveNext())\r\n                {\r\n                    if (e.Current.Contains(controller)) return e.Current;\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        private void SignalSpawned(SpawnedObjectController obj, ISpawner spawnPoint)\r\n        {\r\n            if (obj == null) return;\r\n\r\n\r\n            var n = SpawnNotification.Create(this, obj.gameObject, spawnPoint);\r\n            obj.gameObject.BroadcastMessage(SPSpawnConstants.MSG_ONSPAWN, n, SendMessageOptions.DontRequireReceiver);\r\n            Notification.PostNotification(obj, n, false);\r\n            Notification.PostNotification(this, n, false);\r\n            Notification.Release(n);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISerializationCallbackReceiver Interface\r\n\r\n        void ISerializationCallbackReceiver.OnBeforeSerialize()\r\n        {\r\n            _registeredPrefabs.RemoveAll((c) => Object.ReferenceEquals(c, null));\r\n        }\r\n\r\n        void ISerializationCallbackReceiver.OnAfterDeserialize()\r\n        {\r\n            _prefabToCache.Clear();\r\n\r\n            _registeredPrefabs.RemoveAll((c) => Object.ReferenceEquals(c, null));\r\n\r\n            var e = _registeredPrefabs.GetEnumerator();\r\n            PrefabCacheOptions cache;\r\n            while(e.MoveNext())\r\n            {\r\n                cache = e.Current;\r\n                cache.Init(this);\r\n                if (!Object.ReferenceEquals(cache.Prefab, null)) _prefabToCache[cache.Prefab] = cache;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region Special Types\r\n\r\n        [System.Serializable()]\r\n        public class PrefabCacheOptions\r\n        {\r\n\r\n            public string ItemName;\r\n            [SerializeField]\r\n            [UnityEngine.Serialization.FormerlySerializedAs(\"Prefab\")]\r\n            private GameObject _prefab;\r\n\r\n            public int CacheSize = 0;\r\n            public int ResizeBuffer = 1;\r\n            public int LimitAmount = 1;\r\n\r\n            [System.NonSerialized()]\r\n            private SpawnPool _owner;\r\n            [System.NonSerialized()]\r\n            private HashSet<SpawnedObjectController> _instances;\r\n            [System.NonSerialized()]\r\n            private HashSet<SpawnedObjectController> _activeInstances;\r\n\r\n            protected PrefabCacheOptions()\r\n            {\r\n                _instances = new HashSet<SpawnedObjectController>(ObjectReferenceEqualityComparer<SpawnedObjectController>.Default);\r\n                _activeInstances = new HashSet<SpawnedObjectController>(ObjectReferenceEqualityComparer<SpawnedObjectController>.Default);\r\n            }\r\n\r\n            internal PrefabCacheOptions(GameObject prefab)\r\n            {\r\n                _prefab = prefab;\r\n                _instances = new HashSet<SpawnedObjectController>(ObjectReferenceEqualityComparer<SpawnedObjectController>.Default);\r\n                _activeInstances = new HashSet<SpawnedObjectController>(ObjectReferenceEqualityComparer<SpawnedObjectController>.Default);\r\n            }\r\n\r\n            public GameObject Prefab\r\n            {\r\n                get\r\n                {\r\n                    return _prefab;\r\n                }\r\n            }\r\n\r\n            public int Count\r\n            {\r\n                get { return _instances.Count + _activeInstances.Count; }\r\n            }\r\n\r\n            public bool Contains(SpawnedObjectController obj)\r\n            {\r\n                return _instances.Contains(obj) || _activeInstances.Contains(obj);\r\n            }\r\n\r\n            internal void Init(SpawnPool owner)\r\n            {\r\n                _owner = owner;\r\n            }\r\n\r\n            internal void Load()\r\n            {\r\n                if (_instances != null) return;\r\n\r\n                this.Clear();\r\n                if (_prefab == null) return;\r\n\r\n                for (int i = 0; i < CacheSize; i++)\r\n                {\r\n                    _instances.Add(this.CreateCacheInstance(i));\r\n                }\r\n            }\r\n\r\n            internal void Clear()\r\n            {\r\n                using(var lst = com.spacepuppy.Collections.TempCollection.GetList<SpawnedObjectController>(_instances))\r\n                {\r\n                    _instances.Clear();\r\n\r\n                    var e = lst.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        e.Current.DeInit();\r\n                        Object.Destroy(e.Current);\r\n                    }\r\n                }\r\n            }\r\n\r\n            /// <summary>\r\n            /// \r\n            /// </summary>\r\n            /// <param name=\"par\"></param>\r\n            /// <param name=\"initializeProperties\">A method that initializes properties on the gameobject before OnSpawned message is called.</param>\r\n            /// <returns></returns>\r\n            internal SpawnedObjectController Spawn(Vector3 pos, Quaternion rot, Transform par, System.Action<GameObject> initializeProperties)\r\n            {\r\n                if(_instances.Count == 0)\r\n                {\r\n                    int cnt = this.Count;\r\n                    int newSize = cnt + ResizeBuffer;\r\n                    if (LimitAmount > 0) newSize = Mathf.Min(newSize, LimitAmount);\r\n\r\n                    if (newSize > cnt)\r\n                    {\r\n                        for (int i = cnt; i < newSize; i++)\r\n                        {\r\n                            _instances.Add(CreateCacheInstance(i));\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        return null;\r\n                    }\r\n                }\r\n\r\n                //var cntrl = _instances[0];\r\n                //_instances.RemoveAt(0);\r\n                var cntrl = _instances.Pop();\r\n\r\n                _activeInstances.Add(cntrl);\r\n\r\n                par.AddChild(cntrl.transform);\r\n                cntrl.transform.position = pos;\r\n                cntrl.transform.rotation = rot;\r\n                if (initializeProperties != null) initializeProperties(cntrl.gameObject);\r\n                cntrl.SetSpawned();\r\n\r\n                return cntrl;\r\n            }\r\n\r\n            internal void Despawn(SpawnedObjectController obj)\r\n            {\r\n                if (!_activeInstances.Contains(obj)) return;\r\n\r\n                _activeInstances.Remove(obj);\r\n\r\n                obj.SetDespawned();\r\n                obj.transform.parent = _owner.transform;\r\n                obj.transform.localPosition = Vector3.zero;\r\n                obj.transform.rotation = Quaternion.identity;\r\n\r\n                _instances.Add(obj);\r\n            }\r\n\r\n            internal void Purge(SpawnedObjectController obj)\r\n            {\r\n                if(_activeInstances.Contains(obj))\r\n                {\r\n                    _activeInstances.Remove(obj);\r\n                }\r\n                if(_instances.Contains(obj))\r\n                {\r\n                    _instances.Remove(obj);\r\n                }\r\n            }\r\n\r\n\r\n\r\n\r\n            private SpawnedObjectController CreateCacheInstance(int index)\r\n            {\r\n                var obj = PrefabUtil.Create(this.Prefab, Vector3.zero, Quaternion.identity);\r\n                obj.name = this.ItemName + (index + 1).ToString(\"000\");\r\n                var cntrl = obj.AddComponent<SpawnedObjectController>();\r\n                cntrl.Init(_owner, this.Prefab, this.ItemName);\r\n\r\n                obj.transform.parent = _owner.transform;\r\n                obj.transform.localPosition = Vector3.zero;\r\n                obj.transform.rotation = Quaternion.identity;\r\n\r\n                //obj.DeactivateAll();\r\n                obj.SetActive(false);\r\n\r\n                return cntrl;\r\n            }\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n        #region Static Methods\r\n\r\n        public static void DeSpawn(GameObject go)\r\n        {\r\n            if (go == null) throw new System.ArgumentNullException(\"go\");\r\n\r\n            var c = go.GetComponent<SpawnedObjectController>();\r\n            if (c == null) return;\r\n\r\n            c.Kill();\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppySpawn/Spawn/SpawnedObjectController.cs",
    "content": "using UnityEngine;\r\nusing System.Collections;\r\n\r\nusing com.spacepuppy.Collections;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Spawn\r\n{\r\n\r\n    [AddComponentMenu(\"SpacePuppy/Spawn/Spawned Object\")]\r\n    public class SpawnedObjectController : SPNotifyingComponent, IKillableEntity\r\n    {\r\n\r\n        #region Fields\r\n\r\n        [System.NonSerialized()]\r\n        private SpawnPool _pool;\r\n        [System.NonSerialized]\r\n        private GameObject _prefab;\r\n        [System.NonSerialized()]\r\n        private string _sCacheName;\r\n\r\n        [System.NonSerialized()]\r\n        private bool _isSpawned;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        internal void Init(SpawnPool pool, GameObject prefab)\r\n        {\r\n            _pool = pool;\r\n            _prefab = prefab;\r\n            _sCacheName = null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Initialize with a reference to the pool that spawned this object. Include a cache name if this gameobject is cached, otherwise no cache name should be included.\r\n        /// </summary>\r\n        /// <param name=\"pool\"></param>\r\n        /// <param name=\"prefab\">prefab this was spawned from</param>\r\n        /// <param name=\"sCacheName\"></param>\r\n        internal void Init(SpawnPool pool, GameObject prefab, string sCacheName)\r\n        {\r\n            _pool = pool;\r\n            _prefab = prefab;\r\n            _sCacheName = sCacheName;\r\n        }\r\n\r\n        internal void DeInit()\r\n        {\r\n            _pool = null;\r\n            _prefab = null;\r\n            _sCacheName = null;\r\n        }\r\n\r\n        protected override void OnDestroy()\r\n        {\r\n            base.OnDestroy();\r\n\r\n            if(!GameLoopEntry.ApplicationClosing && _pool != null)\r\n            {\r\n                _pool.Purge(this);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool IsSpawned\r\n        {\r\n            get { return _isSpawned; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The pool that created this object.\r\n        /// </summary>\r\n        public SpawnPool Pool\r\n        {\r\n            get { return _pool; }\r\n        }\r\n\r\n        public GameObject Prefab\r\n        {\r\n            get { return _prefab; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// This object is a managed cached object, when killed it'll be returned to the pool.\r\n        /// </summary>\r\n        public bool IsCachedObject\r\n        {\r\n            get { return _sCacheName != null; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// This value will only be non-null if it is a managed cached object.\r\n        /// </summary>\r\n        public string CacheName\r\n        {\r\n            get { return _sCacheName; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        /// <summary>\r\n        /// This method ONLY called by SpawnPool\r\n        /// </summary>\r\n        internal void SetSpawned()\r\n        {\r\n            _isSpawned = true;\r\n            this.gameObject.SetActive(true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// This method ONLY called by SpawnPool\r\n        /// </summary>\r\n        internal void SetDespawned()\r\n        {\r\n            _isSpawned = false;\r\n            this.gameObject.SetActive(false);\r\n        }\r\n\r\n        public GameObject CloneObject(bool fromPrefab = false)\r\n        {\r\n            if(fromPrefab && _prefab != null)\r\n                return _pool.Spawn(_prefab, this.transform.position, this.transform.rotation);\r\n            else\r\n                return _pool.Spawn(this.gameObject, this.transform.position, this.transform.rotation);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IKillableEntity Interface\r\n\r\n        public bool IsDead\r\n        {\r\n            get { return !_isSpawned; }\r\n        }\r\n\r\n        public void Kill()\r\n        {\r\n            if(_pool.Despawn(this))\r\n            {\r\n                using (var lst = TempCollection.GetList<Transform>())\r\n                {\r\n                    GameObjectUtil.GetAllChildrenAndSelf(this.transform, lst);\r\n                    for(int i = 0; i < lst.Count; i++)\r\n                    {\r\n                        var rb = lst[i].GetComponent<Rigidbody>();\r\n                        if (rb != null && !rb.isKinematic)\r\n                        {\r\n                            rb.velocity = Vector3.zero;\r\n                            rb.angularVelocity = Vector3.zero;\r\n                        }\r\n\r\n                        var rb2 = lst[i].GetComponent<Rigidbody2D>();\r\n                        if (rb2 != null && !rb2.isKinematic)\r\n                        {\r\n                            rb2.velocity = Vector3.zero;\r\n                            rb2.angularVelocity = 0f;\r\n                        }\r\n\r\n                        //NOTE - this is handled by the components themselves\r\n                        //Notification.PurgeHandlers(lst[i].gameObject);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppySpawn/Spawn/i_AttachmentSpawnPoint.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Spawn\r\n{\r\n\r\n    [AddComponentMenu(\"SpacePuppy/Spawn/I_Attachment Spawn Point\")]\r\n    public class i_AttachmentSpawnPoint : TriggerableMechanism, ISpawner, IObservableTrigger\r\n    {\r\n\r\n        public const string TRG_ONFINISH = \"OnSpawned\";\r\n\r\n        public enum StartupEvent\r\n        {\r\n            Never = -2,\r\n            OnAwake = -1,\r\n            OnFirstEnable = 0,\r\n            OnEnable = 1,\r\n            OnStart = 2,\r\n            OnStartOrEnable = 3\r\n\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private SelfTrackingSpawnerMechanism _spawnMechanism = new SelfTrackingSpawnerMechanism();\r\n\r\n        [SerializeField()]\r\n        [OneOrMany()]\r\n        [Tooltip(\"Objects available for spawning.\")]\r\n        private GameObject[] _prefabs = new GameObject[] { };\r\n\r\n        [SerializeField()]\r\n        [Tooltip(\"When should the attachment be created.\\nOnAwake - this will occur no matter what, even if not enabled\\nOnFirstEnable - during the enable event, the first time it's called\\nOnEnable - any time the enable event occurs\\nOnStart - during the start event\\nOnStartOrEnable - during the start event, or any subsequent OnEnable event\")]\r\n        private StartupEvent _spawnOn;\r\n\r\n        [SerializeField()]\r\n        private Trigger _onSpawnedObject = new Trigger(TRG_ONFINISH);\r\n\r\n        [System.NonSerialized()]\r\n        private GameObject _spawnedAttachment;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            _spawnMechanism.Init(this);\r\n\r\n            if(_spawnOn == StartupEvent.OnAwake)\r\n            {\r\n                this.Spawn();\r\n            }\r\n        }\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _spawnMechanism.Active = true;\r\n            \r\n            switch(_spawnOn)\r\n            {\r\n                case StartupEvent.OnFirstEnable:\r\n                    if (!this.started)\r\n                    {\r\n                        this.Spawn();\r\n                    }\r\n                    break;\r\n                case StartupEvent.OnEnable:\r\n                    this.Spawn();\r\n                    break;\r\n                case StartupEvent.OnStartOrEnable:\r\n                    if(this.started)\r\n                    {\r\n                        this.Spawn();\r\n                    }\r\n                    break;\r\n            }\r\n\r\n        }\r\n\r\n        protected override void Start()\r\n        {\r\n            base.Start();\r\n\r\n            switch(_spawnOn)\r\n            {\r\n                case StartupEvent.OnStart:\r\n                case StartupEvent.OnStartOrEnable:\r\n                    this.Spawn();\r\n                    break;\r\n            }\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            _spawnMechanism.Active = false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public GameObject[] Prefabs\r\n        {\r\n            get { return _prefabs; }\r\n            set { _prefabs = value; }\r\n        }\r\n\r\n        public int PrefabCount\r\n        {\r\n            get { return (_prefabs != null) ? _prefabs.Length : 0; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISpawner Interface\r\n\r\n        public SelfTrackingSpawnerMechanism Mechanism { get { return _spawnMechanism; } }\r\n\r\n        public int TotalCount { get { return _spawnMechanism.TotalCount; } }\r\n\r\n        public int ActiveCount { get { return _spawnMechanism.ActiveCount; } }\r\n\r\n        public GameObject Spawn()\r\n        {\r\n            if (!this.enabled) return null;\r\n            if (_spawnedAttachment != null) this.Despawn();\r\n\r\n            int index = SpawnPointHelper.SelectFromMultiple(this, this.PrefabCount);\r\n            if (index < 0 || index >= this.PrefabCount) return null;\r\n\r\n            var prefab = _prefabs[index];\r\n            _spawnedAttachment = _spawnMechanism.Spawn(prefab, this.transform.position, this.transform.rotation, this.transform);\r\n\r\n            if (_onSpawnedObject != null && _onSpawnedObject.Count > 0)\r\n                _onSpawnedObject.ActivateTrigger(this, _spawnedAttachment);\r\n\r\n            return _spawnedAttachment;\r\n        }\r\n\r\n        void ISpawner.Spawn()\r\n        {\r\n            this.Spawn();\r\n        }\r\n\r\n        public void Despawn()\r\n        {\r\n            _spawnedAttachment.Kill();\r\n            _spawnedAttachment = null;\r\n        }\r\n\r\n        #endregion\r\n        \r\n        #region ITriggerable Interface\r\n\r\n        public override bool CanTrigger\r\n        {\r\n            get { return base.CanTrigger && _prefabs != null && _prefabs.Length > 0; }\r\n        }\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            return this.Spawn() != null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IObserverableTarget Interface\r\n\r\n        Trigger[] IObservableTrigger.GetTriggers()\r\n        {\r\n            return new Trigger[] { _onSpawnedObject };\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region INotificationDispatcher Interface\r\n\r\n        [System.NonSerialized]\r\n        private NotificationDispatcher _observers;\r\n\r\n        protected virtual void OnDespawn()\r\n        {\r\n            if (_observers != null) _observers.PurgeHandlers();\r\n        }\r\n\r\n        public NotificationDispatcher Observers\r\n        {\r\n            get\r\n            {\r\n                if (_observers == null) _observers = new NotificationDispatcher(this);\r\n                return _observers;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n    [System.Obsolete(\"Use i_AttachmentSpawnPoint instead.\")]\r\n    public class AttachmentSpawnPoint : i_AttachmentSpawnPoint\r\n    {\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppySpawn/Spawn/i_SpawnFromResources.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Project;\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Spawn\r\n{\r\n    public class i_SpawnFromResources : TriggerableMechanism, ISpawner, IObservableTrigger\r\n    {\r\n\r\n        public const string TRG_ONSPAWNED = \"OnSpawned\";\r\n\r\n        public const string TRIGGERARG_RANDOM = \"RANDOM\";\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private SelfTrackingSpawnerMechanism _spawnMechanism = new SelfTrackingSpawnerMechanism();\r\n\r\n        [SerializeField()]\r\n        [Tooltip(\"The object will be spawned as a child of the SpawnPoint GameObject.\")]\r\n        private bool _spawnAsChild = false;\r\n\r\n        [SerializeField()]\r\n        [OneOrMany()]\r\n        [ResourceLink.Config(typeof(GameObject))]\r\n        [Tooltip(\"Objects available for spawning. When spawn is called with no arguments a prefab is selected at random, unless a ISpawnSelector is available on the SpawnPoint.\")]\r\n        private ResourceLink[] _assets;\r\n\r\n        [SerializeField()]\r\n        private Trigger _onSpawnedObject = new Trigger(TRG_ONSPAWNED);\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            _spawnMechanism.Init(this);\r\n        }\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _spawnMechanism.Active = true;\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            _spawnMechanism.Active = false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public ResourceLink[] Assets\r\n        {\r\n            get { return _assets; }\r\n            set { _assets = value; }\r\n        }\r\n\r\n        public int AssetCount\r\n        {\r\n            get { return _assets != null ? _assets.Length : 0; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public GameObject Spawn(int index)\r\n        {\r\n            if (!this.enabled) return null;\r\n\r\n            if (_assets == null || index < 0 || index >= _assets.Length) return null;\r\n            return this.DoSpawn(_assets[index]);\r\n        }\r\n        \r\n        public GameObject[] GetActiveGameObjects()\r\n        {\r\n            return _spawnMechanism.GetActiveGameObjects();\r\n        }\r\n\r\n        public SpawnedObjectController[] GetActiveObjectControllers()\r\n        {\r\n            return _spawnMechanism.GetActiveObjectControllers();\r\n        }\r\n\r\n\r\n\r\n\r\n        private GameObject DoSpawn(ResourceLink link)\r\n        {\r\n            var prefab = link.GetResource<GameObject>();\r\n            if (prefab == null) return null;\r\n\r\n            var go = _spawnMechanism.Spawn(prefab, this.transform.position, this.transform.rotation, (_spawnAsChild) ? this.transform : null);\r\n\r\n            if (_onSpawnedObject != null && _onSpawnedObject.Count > 0)\r\n                _onSpawnedObject.ActivateTrigger(this, go);\r\n\r\n            return go;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n\r\n\r\n\r\n        #region ISpawner Interface\r\n\r\n        public SelfTrackingSpawnerMechanism Mechanism { get { return _spawnMechanism; } }\r\n\r\n        public int TotalCount { get { return _spawnMechanism.TotalCount; } }\r\n\r\n        public int ActiveCount { get { return _spawnMechanism.ActiveCount; } }\r\n\r\n        public GameObject Spawn()\r\n        {\r\n            if (!this.enabled) return null;\r\n            \r\n            int index = SpawnPointHelper.SelectFromMultiple(this, this.AssetCount);\r\n            if (index < 0 || index >= this.AssetCount) return null;\r\n\r\n            return this.DoSpawn(_assets[index]);\r\n        }\r\n\r\n        void ISpawner.Spawn()\r\n        {\r\n            this.Spawn();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITriggerable Interface\r\n\r\n        public override bool CanTrigger\r\n        {\r\n            get { return base.CanTrigger && _assets != null && _assets.Length > 0; }\r\n        }\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            if (arg is string && string.Equals(arg as string, TRIGGERARG_RANDOM, System.StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                return this.Spawn(Random.Range(0, this.AssetCount)) != null;\r\n            }\r\n            else if (ConvertUtil.ValueIsNumericType(arg))\r\n            {\r\n                return this.Spawn(ConvertUtil.ToInt(arg)) != null;\r\n            }\r\n            else\r\n            {\r\n                return this.Spawn() != null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IObserverableTarget Interface\r\n\r\n        Trigger[] IObservableTrigger.GetTriggers()\r\n        {\r\n            return new Trigger[] { _onSpawnedObject };\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region INotificationDispatcher Interface\r\n\r\n        [System.NonSerialized]\r\n        private NotificationDispatcher _observers;\r\n\r\n        protected virtual void OnDespawn()\r\n        {\r\n            if (_observers != null) _observers.PurgeHandlers();\r\n        }\r\n\r\n        public NotificationDispatcher Observers\r\n        {\r\n            get\r\n            {\r\n                if (_observers == null) _observers = new NotificationDispatcher(this);\r\n                return _observers;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawn/Spawn/i_SpawnWeighted.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\n\nusing UnityEngine;\nusing System.Collections.Generic;\n\nusing com.spacepuppy.Scenario;\nusing com.spacepuppy.Utils;\n\nnamespace com.spacepuppy.Spawn\n{\n    public class i_SpawnWeighted : AutoTriggerableMechanism, IObservableTrigger, ISpawner\n    {\n\n        public const string TRG_ONSPAWNED = \"OnSpawned\";\n\n        #region Fields\n\n        [SerializeField()]\n        private SelfTrackingSpawnerMechanism _spawnMechanism = new SelfTrackingSpawnerMechanism();\n\n        [SerializeField]\n        private Transform _spawnedObjectParent;\n\n        [SerializeField()]\n        [WeightedValueCollection(\"Weight\", \"Prefab\")]\n        [Tooltip(\"Objects available for spawning. When spawn is called with no arguments a prefab is selected at random.\")]\n        private List<PrefabEntry> _prefabs;\n\n        [SerializeField()]\n        private Trigger _onSpawnedObject = new Trigger();\n\n        #endregion\n\n        #region CONSTRUCTOR\n\n        protected override void Awake()\n        {\n            base.Awake();\n\n            _spawnMechanism.Init(this);\n        }\n\n        protected override void OnEnable()\n        {\n            base.OnEnable();\n\n            _spawnMechanism.Active = true;\n        }\n\n        protected override void OnDisable()\n        {\n            base.OnDisable();\n\n            _spawnMechanism.Active = false;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public SpawnPool SpawnPool\n        {\n            get { return _spawnMechanism.SpawnPool; }\n        }\n\n        public List<PrefabEntry> Prefabs\n        {\n            get { return _prefabs; }\n        }\n\n        public Trigger OnSpawnedObject\n        {\n            get { return _onSpawnedObject; }\n        }\n\n        #endregion\n\n        #region Methods\n\n        public GameObject Spawn()\n        {\n            if (!this.CanTrigger) return null;\n\n            if (_prefabs == null || _prefabs.Count == 0) return null;\n\n            if (_prefabs.Count == 1)\n            {\n                return this.Spawn(_prefabs[0].Prefab);\n            }\n            else\n            {\n                return this.Spawn(_prefabs.PickRandom((o) => o.Weight).Prefab);\n            }\n        }\n\n        public GameObject Spawn(int index)\n        {\n            if (!this.enabled) return null;\n\n            if (_prefabs == null || index < 0 || index >= _prefabs.Count) return null;\n            return this.Spawn(_prefabs[index].Prefab);\n        }\n\n        public GameObject Spawn(string name)\n        {\n            if (!this.enabled) return null;\n\n            if (_prefabs == null) return null;\n            for (int i = 0; i < _prefabs.Count; i++)\n            {\n                if (_prefabs[i].Prefab != null && _prefabs[i].Prefab.CompareName(name)) return this.Spawn(_prefabs[i].Prefab);\n            }\n            return null;\n        }\n\n        private GameObject Spawn(GameObject prefab)\n        {\n            if (prefab == null) return null;\n            \n            var go = _spawnMechanism.Spawn(prefab, this.transform.position, this.transform.rotation, _spawnedObjectParent);\n\n            if (_onSpawnedObject != null && _onSpawnedObject.Count > 0)\n                _onSpawnedObject.ActivateTrigger(this, go);\n\n            return go;\n        }\n\n        #endregion\n\n\n        #region ITriggerable Interface\n\n        public override bool CanTrigger\n        {\n            get { return base.CanTrigger && _prefabs != null && _prefabs.Count > 0; }\n        }\n\n        public override bool Trigger(object sender, object arg)\n        {\n            if (!this.CanTrigger) return false;\n\n            if (arg is string)\n            {\n                return this.Spawn(arg as string) != null;\n            }\n            else if (ConvertUtil.ValueIsNumericType(arg))\n            {\n                return this.Spawn(ConvertUtil.ToInt(arg)) != null;\n            }\n            else\n            {\n                return this.Spawn() != null;\n            }\n        }\n\n        #endregion\n\n        #region IObserverableTarget Interface\n\n        Trigger[] IObservableTrigger.GetTriggers()\n        {\n            return new Trigger[] { _onSpawnedObject };\n        }\n\n        #endregion\n\n        #region ISpawner Interface\n\n        public SelfTrackingSpawnerMechanism Mechanism { get { return _spawnMechanism; } }\n\n        public int TotalCount { get { return _spawnMechanism.TotalCount; } }\n\n        public int ActiveCount { get { return _spawnMechanism.ActiveCount; } }\n\n        void ISpawner.Spawn()\n        {\n            this.Spawn();\n        }\n\n        #endregion\n\n        #region INotificationDispatcher Interface\n\n        [System.NonSerialized]\n        private NotificationDispatcher _observers;\n\n        protected virtual void OnDespawn()\n        {\n            if (_observers != null) _observers.PurgeHandlers();\n        }\n\n        public NotificationDispatcher Observers\n        {\n            get\n            {\n                if (_observers == null) _observers = new NotificationDispatcher(this);\n                return _observers;\n            }\n        }\n\n        #endregion\n\n        #region Special Types\n\n        [System.Serializable]\n        public struct PrefabEntry\n        {\n            public float Weight;\n            public GameObject Prefab;\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "SpacepuppySpawn/Spawn/i_Spawner.cs",
    "content": "using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Spawn\r\n{\r\n\r\n    [AddComponentMenu(\"SpacePuppy/Spawn/I_Spawner\")]\r\n    public class i_Spawner : TriggerableMechanism, ISpawner, IObservableTrigger\r\n    {\r\n\r\n        public const string TRG_ONSPAWNED = \"OnSpawned\";\r\n\r\n        public const string TRIGGERARG_RANDOM = \"RANDOM\";\r\n\r\n        #region Fields\r\n\r\n        [SerializeField()]\r\n        private SelfTrackingSpawnerMechanism _spawnMechanism = new SelfTrackingSpawnerMechanism();\r\n\r\n        [SerializeField()]\r\n        [Tooltip(\"The object will be spawned as a child of the SpawnPoint GameObject.\")]\r\n        private bool _spawnAsChild = false;\r\n\r\n        [SerializeField()]\r\n        [ReorderableArray()]\r\n        [Tooltip(\"Objects available for spawning. When spawn is called with no arguments a prefab is selected at random, unless a ISpawnSelector is available on the SpawnPoint.\")]\r\n        private GameObject[] _prefabs;\r\n\r\n        [SerializeField()]\r\n        private Trigger _onSpawnedObject = new Trigger(TRG_ONSPAWNED);\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            _spawnMechanism.Init(this);\r\n        }\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _spawnMechanism.Active = true;\r\n        }\r\n\r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            _spawnMechanism.Active = false;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public GameObject[] Prefabs\r\n        {\r\n            get { return _prefabs; }\r\n            set { _prefabs = value; }\r\n        }\r\n\r\n        public int PrefabCount\r\n        {\r\n            get { return (_prefabs != null) ? _prefabs.Length : 0; }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public GameObject Spawn(int index)\r\n        {\r\n            if (!this.enabled) return null;\r\n\r\n            if (_prefabs == null || index < 0 || index >= _prefabs.Length) return null;\r\n            return this.Spawn(_prefabs[index]);\r\n        }\r\n\r\n        public GameObject Spawn(string name)\r\n        {\r\n            if (!this.enabled) return null;\r\n\r\n            if (_prefabs == null) return null;\r\n            for (int i = 0; i < _prefabs.Length; i++)\r\n            {\r\n                if (this.Prefabs[i].CompareName(name)) return this.Spawn(_prefabs[i]);\r\n            }\r\n            return null;\r\n        }\r\n\r\n        private GameObject Spawn(GameObject prefab)\r\n        {\r\n            var go = _spawnMechanism.Spawn(prefab, this.transform.position, this.transform.rotation, (_spawnAsChild) ? this.transform : null);\r\n\r\n            if (_onSpawnedObject != null && _onSpawnedObject.Count > 0)\r\n                _onSpawnedObject.ActivateTrigger(this, go);\r\n\r\n            return go;\r\n        }\r\n\r\n        public GameObject[] GetActiveGameObjects()\r\n        {\r\n            return _spawnMechanism.GetActiveGameObjects();\r\n        }\r\n\r\n        public SpawnedObjectController[] GetActiveObjectControllers()\r\n        {\r\n            return _spawnMechanism.GetActiveObjectControllers();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ISpawner Interface\r\n\r\n        public SelfTrackingSpawnerMechanism Mechanism { get { return _spawnMechanism; } }\r\n\r\n        public int TotalCount { get { return _spawnMechanism.TotalCount; } }\r\n\r\n        public int ActiveCount { get { return _spawnMechanism.ActiveCount; } }\r\n\r\n        public GameObject Spawn()\r\n        {\r\n            if (!this.enabled) return null;\r\n\r\n            int index = SpawnPointHelper.SelectFromMultiple(this, this.PrefabCount);\r\n            if (index < 0 || index >= this.PrefabCount) return null;\r\n            \r\n            return this.Spawn(_prefabs[index]);\r\n        }\r\n\r\n        void ISpawner.Spawn()\r\n        {\r\n            this.Spawn();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITriggerable Interface\r\n\r\n        public override bool CanTrigger\r\n        {\r\n            get { return base.CanTrigger && _prefabs != null && _prefabs.Length > 0; }\r\n        }\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if (!this.CanTrigger) return false;\r\n\r\n            if (arg is string)\r\n            {\r\n                switch ((arg as string).ToUpper())\r\n                {\r\n                    case TRIGGERARG_RANDOM:\r\n                        return this.Spawn(Random.Range(0, this.PrefabCount)) != null;\r\n                    default:\r\n                        return this.Spawn(arg as string) != null;\r\n                }\r\n            }\r\n            else if (ConvertUtil.ValueIsNumericType(arg))\r\n            {\r\n                return this.Spawn(ConvertUtil.ToInt(arg)) != null;\r\n            }\r\n            else\r\n            {\r\n                return this.Spawn() != null;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IObserverableTarget Interface\r\n\r\n        Trigger[] IObservableTrigger.GetTriggers()\r\n        {\r\n            return new Trigger[] { _onSpawnedObject };\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region INotificationDispatcher Interface\r\n\r\n        [System.NonSerialized]\r\n        private NotificationDispatcher _observers;\r\n        \r\n        protected virtual void OnDespawn()\r\n        {\r\n            if (_observers != null) _observers.PurgeHandlers();\r\n        }\r\n        \r\n        public NotificationDispatcher Observers\r\n        {\r\n            get\r\n            {\r\n                if (_observers == null) _observers = new NotificationDispatcher(this);\r\n                return _observers;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n\r\n    [System.Obsolete(\"Use i_Spawner instead.\")]\r\n    public class Spawner : i_Spawner\r\n    {\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppySpawn/Utils/SpawnedObjectUtil.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Spawn;\r\n\r\nnamespace com.spacepuppy.Utils\r\n{\r\n    public static class SpawnedObjectUtil\r\n    {\r\n\r\n        public static bool IsSpawnedObject(this GameObject obj)\r\n        {\r\n            //return obj.GetComponent<SpawnedObjectController>() != null;\r\n            return obj.HasComponent<SpawnedObjectController>();\r\n        }\r\n\r\n        public static bool InSpawnedEntity(this GameObject obj)\r\n        {\r\n            return obj.FindRoot().HasComponent<SpawnedObjectController>();\r\n        }\r\n        \r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawnEditor/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"SpacepuppySpawnEditor\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"SpacepuppySpawnEditor\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"d2501c9f-1dd3-4f8b-a23d-0d2a85ceeeeb\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "SpacepuppySpawnEditor/SpacepuppySpawnEditor.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{D647B0D7-464D-4F48-BCAB-F11C3864960D}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>com.spacepuppyeditor</RootNamespace>\r\n    <AssemblyName>SpacepuppyUnityFrameworkEditor.Spawn</AssemblyName>\r\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile>\r\n    </TargetFrameworkProfile>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"UnityEditor, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEditor.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"UnityEngine, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Spawn\\AbstractSpawnerInspector.cs\" />\r\n    <Compile Include=\"Spawn\\AddModifierToSpawnerAddOnDrawer.cs\" />\r\n    <Compile Include=\"Spawn\\Commands\\SpawnMenu.cs\" />\r\n    <Compile Include=\"Spawn\\ProxySpawnPointInspector.cs\" />\r\n    <Compile Include=\"Spawn\\ProxySpawnPointManagerInspector.cs\" />\r\n    <Compile Include=\"Spawn\\SelfTrackingSpawnerMechanismPropertyDrawer.cs\" />\r\n    <Compile Include=\"Spawn\\SpawnPointInspector.cs\" />\r\n    <Compile Include=\"Spawn\\SpawnPoolInspector.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\SpacepuppyBaseEditor\\SpacepuppyBaseEditor.csproj\">\r\n      <Project>{a0466ee3-9582-4c0d-965d-e2d2f9006971}</Project>\r\n      <Name>SpacepuppyBaseEditor</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\r\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\r\n      <Name>SpacepuppyBase</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppySpawn\\SpacepuppySpawn.csproj\">\r\n      <Project>{eee784ac-7f13-4386-a11c-922dea4413eb}</Project>\r\n      <Name>SpacepuppySpawn</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <ItemGroup />\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>mkdir $(ProjectDir)..\\Builds\\FullLibrary\\Editor\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.Spawn.dll\" \"$(ProjectDir)..\\Builds\\FullLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.Spawn.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.Spawn.pdb\" \"$(ProjectDir)..\\Builds\\FullLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.Spawn.pdb\"</PostBuildEvent>\r\n  </PropertyGroup>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "SpacepuppySpawnEditor/Spawn/AbstractSpawnerInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Spawn;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Spawn\r\n{\r\n\r\n    //[CustomEditor(typeof(AbstractSpawner), true)]\r\n    [System.Obsolete(\"AbstractSpawner is Obsolete, therefore, so is this.\")]\r\n    public class AbstractSpawnerInspector : SPEditor\r\n    {\r\n\r\n        public const string BASEPROP_ORDER = \"_order\";\r\n        public const string BASEPROP_SPAWNPOOL = \"_spawnPool\";\r\n        public const string BASEPROP_SPAWNASCHILD = \"_spawnAsChild\";\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawBaseProperties();\r\n            this.DrawOtherProperties();\r\n            this.DrawInformationBox();\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n\r\n        protected void DrawBaseProperties()\r\n        {\r\n            var targ = this.target as AbstractSpawner;\r\n\r\n            this.DrawPropertyField(EditorHelper.PROP_SCRIPT);\r\n            this.DrawPropertyField(BASEPROP_ORDER);\r\n\r\n            var label = new GUIContent(\"Spawn Pool\");\r\n            if (targ.UsesDefaultSpawnPool)\r\n            {\r\n                label.text += \" (default)\";\r\n            }\r\n            //this.DrawPropertyField(BASEPROP_SPAWNPOOL, label, false);\r\n            this.DrawPropertyField(BASEPROP_SPAWNASCHILD);\r\n        }\r\n\r\n        protected void DrawInformationBox()\r\n        {\r\n            var targ = this.target as AbstractSpawner;\r\n\r\n            //if (targ.SupportsSelectionModifier && targ.HasLikeComponent<ISpawnPointPrefabSelector>(true))\r\n            //{\r\n            //    var selector = (from c in targ.GetLikeComponents<ISpawnPointPrefabSelector>() where c.enabled select c).FirstOrDefault();\r\n            //    if (selector != null)\r\n            //    {\r\n            //        EditorGUILayout.HelpBox(\"This spawnpoint has an active ISpawnPointPrefabSelector of type '\" + selector.GetType().Name + \"'.\", MessageType.Info);\r\n            //    }\r\n            //}\r\n\r\n            if(Application.isPlaying)\r\n            {\r\n                EditorGUILayout.BeginVertical(\"Box\");\r\n\r\n                var style = new GUIStyle(GUI.skin.label);\r\n                style.alignment = TextAnchor.UpperCenter;\r\n                EditorGUILayout.LabelField(\"Information\", style);\r\n\r\n                EditorGUILayout.LabelField(\"Active Spawn Count:\", targ.ActiveCount.ToString());\r\n\r\n                if (targ.SupportsSelectionModifier && targ.HasComponent<ISpawnPointSelector>(true))\r\n                {\r\n                    EditorGUILayout.LabelField(\"Selectors:\");\r\n                    EditorGUI.indentLevel++;\r\n                    foreach (var s in targ.GetComponents<ISpawnPointSelector>())\r\n                    {\r\n                        EditorGUILayout.LabelField(s.GetType().Name);\r\n                    }\r\n                    EditorGUI.indentLevel--;\r\n                }\r\n\r\n                EditorGUILayout.EndVertical();\r\n            }\r\n        }\r\n\r\n        protected void DrawOtherProperties(params string[] ignore)\r\n        {\r\n            System.Array.Resize(ref ignore, ignore.Length + 4);\r\n            ignore[ignore.Length - 4] = EditorHelper.PROP_SCRIPT;\r\n            ignore[ignore.Length - 3] = BASEPROP_ORDER;\r\n            ignore[ignore.Length - 2] = BASEPROP_SPAWNPOOL;\r\n            ignore[ignore.Length - 1] = BASEPROP_SPAWNASCHILD;\r\n            this.DrawDefaultInspectorExcept(ignore);\r\n        }\r\n\r\n\r\n        public override bool RequiresConstantRepaint()\r\n        {\r\n            return Application.isPlaying;\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawnEditor/Spawn/AddModifierToSpawnerAddOnDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Spawn;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Base;\r\n\r\nnamespace com.spacepuppyeditor.Spawn\r\n{\r\n\r\n    [CustomAddonDrawer(typeof(ISpawner), displayAsFooter = true)]\r\n    public class AddModifierToSpawnerAddOnDrawer : SPEditorAddonDrawer\r\n    {\r\n\r\n        public override void OnInspectorGUI()\r\n        {\r\n            var rect = EditorGUILayout.GetControlRect(false, 35f);\r\n            rect = new Rect(rect.xMin + 10f, rect.yMin + 5f, rect.width - 20f, rect.height - 10f);\r\n            \r\n            if(GUI.Button(rect, \"Add Spawn Modifier\"))\r\n            {\r\n                TypeSelectionDropDownWindow.ShowAndCallbackOnSelect(rect, typeof(ISpawnerModifier), (tp) =>\r\n                {\r\n                    if(tp != null && TypeUtil.IsType(tp, typeof(Component)))\r\n                    {\r\n                        var go = GameObjectUtil.GetGameObjectFromSource(this.SerializedObject.targetObject);\r\n                        if (go != null) go.AddComponent(tp);\r\n                    }\r\n                }, false, false);\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawnEditor/Spawn/Commands/SpawnMenu.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Spawn;\r\n\r\nnamespace com.spacepuppyeditor.Spawn.Commands\r\n{\r\n    public static class SpawnMenu\r\n    {\r\n\r\n        [MenuItem(SPMenu.MENU_NAME_ROOT + \"/Create Default SpawnPool\", priority = SPMenu.MENU_PRIORITY_SINGLETON + 1)]\r\n        public static void CreateDefaultSpawnPool()\r\n        {\r\n            SpawnPool.CreatePrimaryPool();\r\n        }\r\n\r\n        [MenuItem(SPMenu.MENU_NAME_ROOT + \"/Create Default SpawnPool\", validate = true)]\r\n        public static bool CreateDefaultSpawnPool_Validate()\r\n        {\r\n            if (Application.isPlaying) return false;\r\n            return !SpawnPool.PrimaryPoolExists;\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawnEditor/Spawn/ProxySpawnPointInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Spawn;\r\n\r\nnamespace com.spacepuppyeditor.Spawn\r\n{\r\n\r\n    [CanEditMultipleObjects()]\r\n    [CustomEditor(typeof(ProxySpawnPoint))]\r\n    public class ProxySpawnPointInspector : SPEditor\r\n    {\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.DrawDefaultInspector();\r\n\r\n            if (!this.serializedObject.isEditingMultipleObjects && this.target is ProxySpawnPoint && (this.target as ProxySpawnPoint).Busy)\r\n            {\r\n                EditorGUILayout.HelpBox(\"SpawnPoint Is Busy.\", MessageType.Warning);\r\n            }\r\n\r\n        }\r\n\r\n        public override bool RequiresConstantRepaint()\r\n        {\r\n            return !this.serializedObject.isEditingMultipleObjects;\r\n        }\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawnEditor/Spawn/ProxySpawnPointManagerInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Spawn;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Spawn\r\n{\r\n\r\n    [CustomEditor(typeof(ProxySpawnPointManager))]\r\n    public class ProxySpawnPointManagerInspector : SPEditor\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private bool _expanded = false;\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.DrawDefaultInspector();\r\n\r\n            var targ = this.target as ProxySpawnPointManager;\r\n\r\n            _expanded = EditorGUILayout.Foldout(_expanded, \"Proxy Nodes\");\r\n            if (_expanded)\r\n            {\r\n                EditorGUI.indentLevel += 1;\r\n\r\n                foreach (var node in targ.GetAllProxies())\r\n                {\r\n                    const float btnwidth = 60f;\r\n                    var r = EditorGUILayout.GetControlRect();\r\n                    var r1 = new Rect(r.xMin, r.yMin, r.width - btnwidth, r.height);\r\n                    var r2 = new Rect(r.xMin + r.width - btnwidth, r.yMin, btnwidth, r.height);\r\n                    EditorGUI.LabelField(r1, node.name);\r\n                    if (GUI.Button(r2, \"Delete\"))\r\n                    {\r\n                        ObjUtil.SmartDestroy(node.gameObject);\r\n                    }\r\n                }\r\n                EditorGUI.indentLevel -= 1;\r\n            }\r\n\r\n            if (GUILayout.Button(\"Add Node\"))\r\n            {\r\n                var node = new GameObject(\"ProxySpawnPoint_\" + targ.GetAllProxies().Count().ToString(\"00\"));\r\n                node.AddComponent<ProxySpawnPoint>();\r\n                node.transform.parent = targ.transform;\r\n                node.transform.localPosition = Vector3.zero;\r\n                node.transform.localRotation = Quaternion.identity;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawnEditor/Spawn/SelfTrackingSpawnerMechanismPropertyDrawer.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy;\r\nusing com.spacepuppy.Spawn;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Spawn\r\n{\r\n\r\n    [CustomPropertyDrawer(typeof(SelfTrackingSpawnerMechanism))]\r\n    public class SelfTrackingSpawnerMechanismPropertyDrawer : PropertyDrawer\r\n    {\r\n\r\n        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\r\n        {\r\n            var spawnPoolProp = property.FindPropertyRelative(\"_spawnPool\");\r\n            var attrib = this.fieldInfo.GetCustomAttributes(typeof(SelfTrackingSpawnerMechanism.ConfigAttribute), false).FirstOrDefault() as SelfTrackingSpawnerMechanism.ConfigAttribute;\r\n            \r\n            const string TOOLTIP = \"If left empty the default SpawnPool will be used instead.\";\r\n            string slbl;\r\n            if (attrib != null)\r\n                slbl = attrib.Label;\r\n            else if (spawnPoolProp.objectReferenceValue == null)\r\n                slbl = \"Spawn Pool (default)\";\r\n            else\r\n                slbl = \"Spawn Pool\";\r\n\r\n            spawnPoolProp.objectReferenceValue = EditorGUI.ObjectField(position, EditorHelper.TempContent(slbl, TOOLTIP), spawnPoolProp.objectReferenceValue, typeof(SpawnPool), true);\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawnEditor/Spawn/SpawnPointInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Spawn;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Spawn\r\n{\r\n\r\n    //[CustomEditor(typeof(i_Spawner), true)]\r\n    [System.Obsolete(\"i_Spawner no longer inherits from AbstractSpawnPoint, so this implementation of its inspector is no longer necessary.\")]\r\n    public class SpawnPointInspector : AbstractSpawnerInspector\r\n    {\r\n\r\n        #region Fields\r\n\r\n        SPReorderableList _lst;\r\n\r\n        #endregion\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _lst = new SPReorderableList(this.serializedObject, this.serializedObject.FindProperty(\"_prefabs\"), true, true, true, true);\r\n            _lst.drawHeaderCallback = this._prefabList_DrawHeader;\r\n            _lst.drawElementCallback = this._prefabList_DrawElement;\r\n            _lst.onAddCallback = this._prefabList_OnAdded;\r\n        }\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawBaseProperties();\r\n\r\n\r\n            _lst.DoLayoutList();\r\n            this.DrawOtherProperties(\"_prefabs\");\r\n\r\n\r\n            this.DrawInformationBox();\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n\r\n        #region Anim ReorderableList Handlers\r\n\r\n        private void _prefabList_DrawHeader(Rect area)\r\n        {\r\n            EditorGUI.LabelField(area, \"Prefabs\");\r\n        }\r\n\r\n        private void _prefabList_DrawElement(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            var element = _lst.serializedProperty.GetArrayElementAtIndex(index);\r\n\r\n            //EditorGUI.PropertyField(area, element, false);\r\n            element.objectReferenceValue = EditorGUI.ObjectField(area, element.objectReferenceValue, typeof(GameObject), false);\r\n\r\n            if (GUI.enabled) ReorderableListHelper.DrawDraggableElementDeleteContextMenu(_lst, area, index, isActive, isFocused);\r\n        }\r\n\r\n        private void _prefabList_OnAdded(ReorderableList lst)\r\n        {\r\n            lst.serializedProperty.arraySize++;\r\n            lst.index = lst.serializedProperty.arraySize - 1;\r\n\r\n            var prefabProp = lst.serializedProperty.GetArrayElementAtIndex(lst.index);\r\n            prefabProp.objectReferenceValue = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppySpawnEditor/Spawn/SpawnPoolInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections;\r\n\r\nusing com.spacepuppy.Spawn;\r\n\r\nnamespace com.spacepuppyeditor.Spawn\r\n{\r\n\r\n    [CustomEditor(typeof(SpawnPool))]\r\n    public class SpawnPoolInspector : SPEditor\r\n    {\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "SpacepuppyUnityFramework.Open.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 2013\r\nVisualStudioVersion = 12.0.30723.0\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppyBase\", \"SpacepuppyBase\\SpacepuppyBase.csproj\", \"{4B8E57AC-F3B2-4DFD-BA0B-20F6BE3B17C9}\"\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppyBaseEditor\", \"SpacepuppyBaseEditor\\SpacepuppyBaseEditor.csproj\", \"{A0466EE3-9582-4C0D-965D-E2D2F9006971}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Any CPU = Debug|Any CPU\r\n\t\tRelease|Any CPU = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{4B8E57AC-F3B2-4DFD-BA0B-20F6BE3B17C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{4B8E57AC-F3B2-4DFD-BA0B-20F6BE3B17C9}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{4B8E57AC-F3B2-4DFD-BA0B-20F6BE3B17C9}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{4B8E57AC-F3B2-4DFD-BA0B-20F6BE3B17C9}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{A0466EE3-9582-4C0D-965D-E2D2F9006971}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{A0466EE3-9582-4C0D-965D-E2D2F9006971}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{A0466EE3-9582-4C0D-965D-E2D2F9006971}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{A0466EE3-9582-4C0D-965D-E2D2F9006971}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{776AA1DA-15E2-4D90-97B5-330C6F1CB442}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{776AA1DA-15E2-4D90-97B5-330C6F1CB442}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{776AA1DA-15E2-4D90-97B5-330C6F1CB442}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{776AA1DA-15E2-4D90-97B5-330C6F1CB442}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{5A96AB58-0FCE-4016-9C12-782BF5C8D1E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{5A96AB58-0FCE-4016-9C12-782BF5C8D1E9}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{5A96AB58-0FCE-4016-9C12-782BF5C8D1E9}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{5A96AB58-0FCE-4016-9C12-782BF5C8D1E9}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "SpacepuppyUnityFramework.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25420.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppyBase\", \"SpacepuppyBase\\SpacepuppyBase.csproj\", \"{4B8E57AC-F3B2-4DFD-BA0B-20F6BE3B17C9}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppyBaseEditor\", \"SpacepuppyBaseEditor\\SpacepuppyBaseEditor.csproj\", \"{A0466EE3-9582-4C0D-965D-E2D2F9006971}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppyExtended\", \"SpacepuppyExtended\\SpacepuppyExtended.csproj\", \"{776AA1DA-15E2-4D90-97B5-330C6F1CB442}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppyExtendedEditor\", \"SpacepuppyExtendedEditor\\SpacepuppyExtendedEditor.csproj\", \"{5A96AB58-0FCE-4016-9C12-782BF5C8D1E9}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppyAI\", \"SpacepuppyAI\\SpacepuppyAI.csproj\", \"{65A3DF9E-1099-40D7-ACF3-4A3989026A3D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppyAIEditor\", \"SpacepuppyAIEditor\\SpacepuppyAIEditor.csproj\", \"{03D1E04B-9D37-4F26-9C77-4E54ADC24722}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppyAnim\", \"SpacepuppyAnim\\SpacepuppyAnim.csproj\", \"{48C79480-359D-4215-9EDE-3D4E9D8190B3}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppySpawn\", \"SpacepuppySpawn\\SpacepuppySpawn.csproj\", \"{EEE784AC-7F13-4386-A11C-922DEA4413EB}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppyMovement\", \"SpacepuppyMovement\\SpacepuppyMovement.csproj\", \"{801BD252-CE5C-45EA-B4DD-F7C3C13E0432}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppyAnimEditor\", \"SpacepuppyAnimEditor\\SpacepuppyAnimEditor.csproj\", \"{EC2096FE-8D75-483B-A6D9-10B9AB1F3819}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppyMovementEditor\", \"SpacepuppyMovementEditor\\SpacepuppyMovementEditor.csproj\", \"{59748E9F-0D22-418A-9712-980DC053D5B5}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppySpawnEditor\", \"SpacepuppySpawnEditor\\SpacepuppySpawnEditor.csproj\", \"{D647B0D7-464D-4F48-BCAB-F11C3864960D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppyInput\", \"SpacepuppyInput\\SpacepuppyInput.csproj\", \"{83C642E8-2A84-4815-8F58-487D341021B3}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppyInputEditor\", \"SpacepuppyInputEditor\\SpacepuppyInputEditor.csproj\", \"{9F3566EC-4F0B-48FB-9B9F-EDA3774F55CE}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppyWaypoints\", \"SpacepuppyWaypoints\\SpacepuppyWaypoints.csproj\", \"{C54EA45A-9019-4E35-93E1-CEF07674040F}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppyWaypointsEditor\", \"SpacepuppyWaypointsEditor\\SpacepuppyWaypointsEditor.csproj\", \"{2E6906C5-FD11-447A-84CB-2149A524D753}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppySerialization\", \"SpacepuppySerialization\\SpacepuppySerialization.csproj\", \"{5DCFC7A9-B2B5-4A08-BEB8-B2CED2457391}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppySerializationEditor\", \"SpacepuppySerializationEditor\\SpacepuppySerializationEditor.csproj\", \"{FBC641A8-9BF5-49D6-9806-1E349DCDD1AE}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppyAIBehaviourTree\", \"SpacepuppyAIBehaviourTree\\SpacepuppyAIBehaviourTree.csproj\", \"{B9807EBA-396E-4379-800F-65CBA0C47BD9}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SpacepuppyAIBehaviourTreeEditor\", \"SpacepuppyAIBehaviourTreeEditor\\SpacepuppyAIBehaviourTreeEditor.csproj\", \"{67A86BE8-190B-4D68-A080-683DF9D4CF09}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{4B8E57AC-F3B2-4DFD-BA0B-20F6BE3B17C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4B8E57AC-F3B2-4DFD-BA0B-20F6BE3B17C9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4B8E57AC-F3B2-4DFD-BA0B-20F6BE3B17C9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4B8E57AC-F3B2-4DFD-BA0B-20F6BE3B17C9}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A0466EE3-9582-4C0D-965D-E2D2F9006971}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A0466EE3-9582-4C0D-965D-E2D2F9006971}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A0466EE3-9582-4C0D-965D-E2D2F9006971}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A0466EE3-9582-4C0D-965D-E2D2F9006971}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{776AA1DA-15E2-4D90-97B5-330C6F1CB442}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{776AA1DA-15E2-4D90-97B5-330C6F1CB442}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{776AA1DA-15E2-4D90-97B5-330C6F1CB442}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{776AA1DA-15E2-4D90-97B5-330C6F1CB442}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{5A96AB58-0FCE-4016-9C12-782BF5C8D1E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5A96AB58-0FCE-4016-9C12-782BF5C8D1E9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5A96AB58-0FCE-4016-9C12-782BF5C8D1E9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5A96AB58-0FCE-4016-9C12-782BF5C8D1E9}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{65A3DF9E-1099-40D7-ACF3-4A3989026A3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{65A3DF9E-1099-40D7-ACF3-4A3989026A3D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{65A3DF9E-1099-40D7-ACF3-4A3989026A3D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{65A3DF9E-1099-40D7-ACF3-4A3989026A3D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{03D1E04B-9D37-4F26-9C77-4E54ADC24722}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{03D1E04B-9D37-4F26-9C77-4E54ADC24722}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{03D1E04B-9D37-4F26-9C77-4E54ADC24722}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{03D1E04B-9D37-4F26-9C77-4E54ADC24722}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{48C79480-359D-4215-9EDE-3D4E9D8190B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{48C79480-359D-4215-9EDE-3D4E9D8190B3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{48C79480-359D-4215-9EDE-3D4E9D8190B3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{48C79480-359D-4215-9EDE-3D4E9D8190B3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{EEE784AC-7F13-4386-A11C-922DEA4413EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{EEE784AC-7F13-4386-A11C-922DEA4413EB}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{EEE784AC-7F13-4386-A11C-922DEA4413EB}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{EEE784AC-7F13-4386-A11C-922DEA4413EB}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{801BD252-CE5C-45EA-B4DD-F7C3C13E0432}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{801BD252-CE5C-45EA-B4DD-F7C3C13E0432}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{801BD252-CE5C-45EA-B4DD-F7C3C13E0432}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{801BD252-CE5C-45EA-B4DD-F7C3C13E0432}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{EC2096FE-8D75-483B-A6D9-10B9AB1F3819}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{EC2096FE-8D75-483B-A6D9-10B9AB1F3819}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{EC2096FE-8D75-483B-A6D9-10B9AB1F3819}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{EC2096FE-8D75-483B-A6D9-10B9AB1F3819}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{59748E9F-0D22-418A-9712-980DC053D5B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{59748E9F-0D22-418A-9712-980DC053D5B5}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{59748E9F-0D22-418A-9712-980DC053D5B5}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{59748E9F-0D22-418A-9712-980DC053D5B5}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D647B0D7-464D-4F48-BCAB-F11C3864960D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D647B0D7-464D-4F48-BCAB-F11C3864960D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D647B0D7-464D-4F48-BCAB-F11C3864960D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D647B0D7-464D-4F48-BCAB-F11C3864960D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{83C642E8-2A84-4815-8F58-487D341021B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{83C642E8-2A84-4815-8F58-487D341021B3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{83C642E8-2A84-4815-8F58-487D341021B3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{83C642E8-2A84-4815-8F58-487D341021B3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{9F3566EC-4F0B-48FB-9B9F-EDA3774F55CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9F3566EC-4F0B-48FB-9B9F-EDA3774F55CE}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{9F3566EC-4F0B-48FB-9B9F-EDA3774F55CE}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9F3566EC-4F0B-48FB-9B9F-EDA3774F55CE}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C54EA45A-9019-4E35-93E1-CEF07674040F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C54EA45A-9019-4E35-93E1-CEF07674040F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C54EA45A-9019-4E35-93E1-CEF07674040F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C54EA45A-9019-4E35-93E1-CEF07674040F}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2E6906C5-FD11-447A-84CB-2149A524D753}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2E6906C5-FD11-447A-84CB-2149A524D753}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2E6906C5-FD11-447A-84CB-2149A524D753}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2E6906C5-FD11-447A-84CB-2149A524D753}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{5DCFC7A9-B2B5-4A08-BEB8-B2CED2457391}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5DCFC7A9-B2B5-4A08-BEB8-B2CED2457391}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5DCFC7A9-B2B5-4A08-BEB8-B2CED2457391}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5DCFC7A9-B2B5-4A08-BEB8-B2CED2457391}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{FBC641A8-9BF5-49D6-9806-1E349DCDD1AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{FBC641A8-9BF5-49D6-9806-1E349DCDD1AE}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{FBC641A8-9BF5-49D6-9806-1E349DCDD1AE}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{FBC641A8-9BF5-49D6-9806-1E349DCDD1AE}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B9807EBA-396E-4379-800F-65CBA0C47BD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B9807EBA-396E-4379-800F-65CBA0C47BD9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B9807EBA-396E-4379-800F-65CBA0C47BD9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B9807EBA-396E-4379-800F-65CBA0C47BD9}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{67A86BE8-190B-4D68-A080-683DF9D4CF09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{67A86BE8-190B-4D68-A080-683DF9D4CF09}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{67A86BE8-190B-4D68-A080-683DF9D4CF09}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{67A86BE8-190B-4D68-A080-683DF9D4CF09}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "SpacepuppyWaypoints/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"SpacepuppyWaypoints\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"SpacepuppyWaypoints\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"3efa6134-9063-4b90-8b74-06e411dde83c\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "SpacepuppyWaypoints/SpacepuppyWaypoints.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{C54EA45A-9019-4E35-93E1-CEF07674040F}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>com.spacepuppy</RootNamespace>\r\n    <AssemblyName>SpacepuppyUnityFramework.Waypoints</AssemblyName>\r\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile>\r\n    </TargetFrameworkProfile>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"UnityEngine, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"Waypoints\\BezierSplinePath.cs\" />\r\n    <Compile Include=\"Waypoints\\BezierChainPath.cs\" />\r\n    <Compile Include=\"Waypoints\\CardinalSplinePath.cs\" />\r\n    <Compile Include=\"Waypoints\\CurveConstantSpeedTable.cs\" />\r\n    <Compile Include=\"Waypoints\\IWaypoint.cs\" />\r\n    <Compile Include=\"Waypoints\\IWaypointPath.cs\" />\r\n    <Compile Include=\"Waypoints\\i_MoveOnPath.cs\" />\r\n    <Compile Include=\"Waypoints\\LinearPath.cs\" />\r\n    <Compile Include=\"Waypoints\\SplinePath.cs\" />\r\n    <Compile Include=\"Waypoints\\Waypoint.cs\" />\r\n    <Compile Include=\"Waypoints\\WaypointPathComponent.cs\" />\r\n    <Compile Include=\"Waypoints\\WaypointPathTweenCurve.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\r\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\r\n      <Name>SpacepuppyBase</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>mkdir $(ProjectDir)..\\Builds\\FullLibrary\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.Waypoints.dll\" \"$(ProjectDir)..\\Builds\\FullLibrary\\SpacepuppyUnityFramework.Waypoints.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFramework.Waypoints.pdb\" \"$(ProjectDir)..\\Builds\\FullLibrary\\SpacepuppyUnityFramework.Waypoints.pdb\"</PostBuildEvent>\r\n  </PropertyGroup>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "SpacepuppyWaypoints/Waypoints/BezierChainPath.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Waypoints\r\n{\r\n\r\n    /// <summary>\r\n    /// Acts like a composite of multiple bezier curves. Where one curve ends, the next starts.\r\n    /// The path will travel through control points.\r\n    /// </summary>\r\n    public class BezierChainPath : IConfigurableIndexedWaypointPath\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private bool _isClosed;\r\n        private List<IWaypoint> _waypoints = new List<IWaypoint>();\r\n\r\n        private Vector3[] _points; //null if dirty\r\n        private float[] _lengths;\r\n        private float _totalArcLength = float.NaN;\r\n\r\n        #endregion\r\n        \r\n        #region CONSTRUCTOR\r\n\r\n        public BezierChainPath()\r\n        {\r\n\r\n        }\r\n\r\n        public BezierChainPath(IEnumerable<IWaypoint> waypoints)\r\n        {\r\n            _waypoints.AddRange(waypoints);\r\n            this.Clean_Imp();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void Clean_Imp()\r\n        {\r\n            if (_waypoints.Count == 0)\r\n            {\r\n                _points = new Vector3[] { };\r\n                _totalArcLength = float.NaN;\r\n            }\r\n            else if (_waypoints.Count == 1)\r\n            {\r\n                _points = new Vector3[] { _waypoints[0].Position };\r\n                _totalArcLength = 0f;\r\n            }\r\n            else\r\n            {\r\n                _totalArcLength = 0f;\r\n\r\n                //get points\r\n                int cnt = _waypoints.Count;\r\n                if (_isClosed) cnt++;\r\n                _points = new Vector3[(cnt - 1) * 3 + 1];\r\n                _points[0] = _waypoints[0].Position;\r\n                for (int i = 1; i < cnt; i++)\r\n                {\r\n                    var w1 = _waypoints[i % _waypoints.Count]; //if we're closed, this will result in the first entry\r\n                    var w2 = _waypoints[i - 1];\r\n                    var v = (w1.Position - w2.Position);\r\n                    var s = v.magnitude / 2.0f; //distance of the control point\r\n\r\n                    float s1 = (w1 is IWeightedWaypoint) ? (w1 as IWeightedWaypoint).Strength : 0f;\r\n                    float s2 = (w2 is IWeightedWaypoint) ? (w2 as IWeightedWaypoint).Strength : 0f;\r\n                    int j = (i - 1) * 3 + 1;\r\n                    _points[j] = w2.Position + (w2.Heading * s1 * s);\r\n                    _points[j + 1] = w1.Position - (w1.Heading * s2 * s);\r\n                    _points[j + 2] = w1.Position;\r\n                }\r\n\r\n                //calculate lengths\r\n                _lengths = new float[cnt];\r\n                for (int i = 0; i < _lengths.Length - 1; i++)\r\n                {\r\n                    int j = i * 3;\r\n                    var p0 = _points[j];\r\n                    var p1 = _points[j + 1];\r\n                    var p2 = _points[j + 2];\r\n                    var p3 = _points[j + 3];\r\n\r\n                    //approximation is sum of all 3 legs, and the coord from p0 to p3, all divided by 2.\r\n                    float t = (p1 - p0).magnitude + (p2 - p1).magnitude + (p3 - p2).magnitude * (p3 - p0).magnitude;\r\n                    _lengths[i] = t / 2.0f;\r\n                }\r\n\r\n                _totalArcLength = 0f;\r\n                foreach (var l in _lengths) _totalArcLength += l;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IIndexedWaypointPath Interface\r\n\r\n        public int Count\r\n        {\r\n            get { return _waypoints.Count; }\r\n        }\r\n\r\n        public bool IsClosed\r\n        {\r\n            get { return _isClosed; }\r\n            set\r\n            {\r\n                if (_isClosed == value) return;\r\n                _isClosed = value;\r\n                _points = null;\r\n            }\r\n        }\r\n\r\n        public IWaypoint ControlPoint(int index)\r\n        {\r\n            return _waypoints[index];\r\n        }\r\n\r\n        public int IndexOf(IWaypoint waypoint)\r\n        {\r\n            return _waypoints.IndexOf(waypoint);\r\n        }\r\n\r\n        public float GetArcLength()\r\n        {\r\n            if (_points == null) this.Clean_Imp();\r\n            return _totalArcLength;\r\n        }\r\n\r\n        public Vector3 GetPositionAt(float t)\r\n        {\r\n            if (_points == null) this.Clean_Imp();\r\n            if (_waypoints.Count == 0) return VectorUtil.NaNVector3;\r\n            if (_waypoints.Count == 1) return _waypoints[0].Position;\r\n            if (_waypoints.Count == 2) return this.GetPositionAfter(0, t);\r\n\r\n\r\n            float len = _lengths[0];\r\n            float tot = len;\r\n            int i = 0;\r\n            while (tot / _totalArcLength < t && i < _lengths.Length)\r\n            {\r\n                i++;\r\n                len = _lengths[i];\r\n                tot += len;\r\n            }\r\n\r\n            float lt = (tot - len) / _totalArcLength;\r\n            float ht = tot / _totalArcLength;\r\n            float dt = com.spacepuppy.Utils.MathUtil.PercentageMinMax(t, ht, lt);\r\n            return this.GetPositionAfter(i, dt);\r\n        }\r\n\r\n        public Waypoint GetWaypointAt(float t)\r\n        {\r\n            if (_points == null) this.Clean_Imp();\r\n            if (_waypoints.Count == 0) return Waypoint.Invalid;\r\n            if (_waypoints.Count == 1) return new Waypoint(_waypoints[0]);\r\n            if (_waypoints.Count == 2) return this.GetWaypointAfter(0, t);\r\n\r\n\r\n            float len = _lengths[0];\r\n            float tot = len;\r\n            int i = 0;\r\n            while (tot / _totalArcLength < t && i < _lengths.Length)\r\n            {\r\n                i++;\r\n                len = _lengths[i];\r\n                tot += len;\r\n            }\r\n\r\n            float lt = (tot - len) / _totalArcLength;\r\n            float ht = tot / _totalArcLength;\r\n            float dt = com.spacepuppy.Utils.MathUtil.PercentageMinMax(t, ht, lt);\r\n            return this.GetWaypointAfter(i, dt);\r\n        }\r\n\r\n        public Vector3 GetPositionAfter(int index, float t)\r\n        {\r\n            if (index < 0 || index >= _waypoints.Count) throw new System.IndexOutOfRangeException();\r\n            if (_points == null) this.Clean_Imp();\r\n            if (_waypoints.Count == 0) return VectorUtil.NaNVector3;\r\n            if (_waypoints.Count == 1) return _waypoints[0].Position;\r\n            if (!_isClosed && index == _waypoints.Count - 1) return _waypoints[index].Position;\r\n\r\n            t = Mathf.Clamp01(t);\r\n            var ft = 1 - t;\r\n\r\n            var i = index * 3;\r\n            var p0 = _points[i];\r\n            var p1 = _points[i + 1];\r\n            var p2 = _points[i + 2];\r\n            var p3 = _points[i + 3];\r\n\r\n            /*\r\n             C(t) = P0*(1-t)^3 + P1*3*t(1-t)^2 + 3*P2*t^2*(1-t) + P3*t^3\r\n\r\n             dC(t)/dt = T(t) =\r\n             -3*P0*(1 - t)^2 + \r\n             P1*(3*(1 - t)^2 - 6*(1 - t)*t) + \r\n             P2*(6*(1 - t)*t - 3*t^2) +\r\n             3*P3*t^2\r\n             */\r\n            var p = (ft * ft * ft) * p0 +\r\n                    3 * (ft * ft) * t * p1 +\r\n                    3 * (1 - t) * (t * t) * p2 +\r\n                    (t * t * t) * p3;\r\n            var tan = -3 * p0 * (ft * ft) +\r\n                      p1 * (3 * (ft * ft) - 6 * ft * t) +\r\n                      p2 * (6 * ft * t - 3 * (t * t)) +\r\n                      3 * p3 * (t * t);\r\n\r\n            return p;\r\n        }\r\n\r\n        public Waypoint GetWaypointAfter(int index, float t)\r\n        {\r\n            if (index < 0 || index >= _waypoints.Count) throw new System.IndexOutOfRangeException();\r\n            if (_points == null) this.Clean_Imp();\r\n            if (_waypoints.Count == 0) return Waypoint.Invalid;\r\n            if (_waypoints.Count == 1) return new Waypoint(_waypoints[0]);\r\n            if (!_isClosed && index == _waypoints.Count - 1) return new Waypoint(_waypoints[index]);\r\n\r\n            t = Mathf.Clamp01(t);\r\n            var ft = 1 - t;\r\n\r\n            var i = index * 3;\r\n            var p0 = _points[i];\r\n            var p1 = _points[i + 1];\r\n            var p2 = _points[i + 2];\r\n            var p3 = _points[i + 3];\r\n\r\n            /*\r\n             C(t) = P0*(1-t)^3 + P1*3*t(1-t)^2 + 3*P2*t^2*(1-t) + P3*t^3\r\n\r\n             dC(t)/dt = T(t) =\r\n             -3*P0*(1 - t)^2 + \r\n             P1*(3*(1 - t)^2 - 6*(1 - t)*t) + \r\n             P2*(6*(1 - t)*t - 3*t^2) +\r\n             3*P3*t^2\r\n             */\r\n            var p = (ft * ft * ft) * p0 +\r\n                    3 * (ft * ft) * t * p1 +\r\n                    3 * (1 - t) * (t * t) * p2 +\r\n                    (t * t * t) * p3;\r\n            var tan = -3 * p0 * (ft * ft) +\r\n                      p1 * (3 * (ft * ft) - 6 * ft * t) +\r\n                      p2 * (6 * ft * t - 3 * (t * t)) +\r\n                      3 * p3 * (t * t);\r\n\r\n            return new Waypoint(p, tan);\r\n        }\r\n\r\n        public int GetDetailedPositions(ICollection<Vector3> coll, float segmentLength)\r\n        {\r\n            if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n            int detail = Mathf.FloorToInt(this.GetArcLength() / segmentLength) + 1;\r\n            for (int i = 0; i <= detail; i++)\r\n            {\r\n                coll.Add(this.GetPositionAt((float)i / (float)detail));\r\n            }\r\n            return detail + 1;\r\n        }\r\n\r\n        public RelativePositionData GetRelativePositionData(float t)\r\n        {\r\n            var cnt = _waypoints.Count;\r\n            switch (cnt)\r\n            {\r\n                case 0:\r\n                    return new RelativePositionData(-1, 0f);\r\n                case 1:\r\n                    return new RelativePositionData(0, 0f);\r\n                case 2:\r\n                    return new RelativePositionData(0, t);\r\n                default:\r\n                    {\r\n                        if (_points == null) this.Clean_Imp();\r\n\r\n                        float len = _lengths[0];\r\n                        float tot = len;\r\n                        int i = 0;\r\n                        while (tot / _totalArcLength < t && i < _lengths.Length)\r\n                        {\r\n                            i++;\r\n                            len = _lengths[i];\r\n                            tot += len;\r\n                        }\r\n\r\n                        float lt = (tot - len) / _totalArcLength;\r\n                        float ht = tot / _totalArcLength;\r\n                        float dt = com.spacepuppy.Utils.MathUtil.PercentageMinMax(t, ht, lt);\r\n                        \r\n                        return new RelativePositionData(i, dt);\r\n                    }\r\n            }\r\n        }\r\n\r\n        public void Clean()\r\n        {\r\n            _points = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IConfigurableIndexedWaypointPath Interface\r\n\r\n        public void AddControlPoint(IWaypoint waypoint)\r\n        {\r\n            _waypoints.Add(waypoint);\r\n            _points = null;\r\n        }\r\n\r\n        public void InsertControlPoint(int index, IWaypoint waypoint)\r\n        {\r\n            _waypoints.Insert(index, waypoint);\r\n            _points = null;\r\n        }\r\n\r\n        public void ReplaceControlPoint(int index, IWaypoint waypoint)\r\n        {\r\n            _waypoints[index] = waypoint;\r\n            _points = null;\r\n        }\r\n\r\n        public void RemoveControlPointAt(int index)\r\n        {\r\n            _waypoints.RemoveAt(index);\r\n            _points = null;\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _waypoints.Clear();\r\n            _points = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public IEnumerator<IWaypoint> GetEnumerator()\r\n        {\r\n            return _waypoints.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _waypoints.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyWaypoints/Waypoints/BezierSplinePath.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Waypoints\r\n{\r\n\r\n    /// <summary>\r\n    /// Acts as a long bezier spline.\r\n    /// </summary>\r\n    public class BezierSplinePath : IConfigurableIndexedWaypointPath\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private bool _isClosed;\r\n        private List<IWaypoint> _waypoints = new List<IWaypoint>();\r\n\r\n        private Vector3[] _points;\r\n        private CurveConstantSpeedTable _speedTable = new CurveConstantSpeedTable();\r\n\r\n        #endregion\r\n        \r\n        #region CONSTRUCTOR\r\n\r\n        public BezierSplinePath()\r\n        {\r\n\r\n        }\r\n\r\n        public BezierSplinePath(IEnumerable<IWaypoint> waypoints)\r\n        {\r\n            _waypoints.AddRange(waypoints);\r\n            this.Clean_Imp();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void Clean_Imp()\r\n        {\r\n            if (_waypoints.Count == 0)\r\n            {\r\n                _speedTable.SetZero();\r\n            }\r\n            else if (_waypoints.Count == 1)\r\n            {\r\n                _speedTable.SetZero();\r\n            }\r\n            else\r\n            {\r\n                var arr = this.GetPointArray();\r\n                float estimatedLength = 0f;\r\n                for(int i = 1; i < arr.Length; i++)\r\n                {\r\n                    estimatedLength += (arr[i] - arr[i - 1]).magnitude;\r\n                }\r\n                int detail = Mathf.RoundToInt(estimatedLength / 0.1f);\r\n                \r\n                _speedTable.Clean(detail, this.GetRealPositionAt);\r\n            }\r\n        }\r\n\r\n        private Vector3[] GetPointArray()\r\n        {\r\n            int l = _waypoints.Count;\r\n            int cnt = l;\r\n            if (_isClosed) cnt++;\r\n            if (_points == null)\r\n                _points = new Vector3[cnt];\r\n            else if(_points.Length != cnt)\r\n                System.Array.Resize(ref _points, cnt);\r\n\r\n            for (int i = 0; i < l; i++ )\r\n            {\r\n                _points[i] = _waypoints[i].Position;\r\n            }\r\n            if(_isClosed)\r\n            {\r\n                _points[cnt - 1] = _waypoints[0].Position;\r\n            }\r\n\r\n            return _points;\r\n        }\r\n\r\n        private Vector3 GetRealPositionAt(float t)\r\n        {\r\n            var arr = this.GetPointArray();\r\n            var c = arr.Length;\r\n            while (c > 1)\r\n            {\r\n                for (int i = 1; i < c; i++)\r\n                {\r\n                    arr[i - 1] = Vector3.Lerp(arr[i - 1], arr[i], t);\r\n                }\r\n\r\n                c--;\r\n            }\r\n            return arr[0];\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IWaypointPath Interface\r\n\r\n        public bool IsClosed\r\n        {\r\n            get { return _isClosed; }\r\n            set\r\n            {\r\n                if (_isClosed == value) return;\r\n                _isClosed = value;\r\n                _speedTable.SetDirty();\r\n            }\r\n        }\r\n\r\n        public float GetArcLength()\r\n        {\r\n            if (_speedTable.IsDirty) this.Clean_Imp();\r\n            return _speedTable.TotalArcLength;\r\n        }\r\n\r\n        public Vector3 GetPositionAt(float t)\r\n        {\r\n            if (_waypoints.Count == 0) return Vector3.zero;\r\n            if (_waypoints.Count == 1) return _waypoints[0].Position;\r\n\r\n            if (_speedTable.IsDirty) this.Clean_Imp();\r\n            return this.GetRealPositionAt(_speedTable.GetConstPathPercFromTimePerc(t));\r\n        }\r\n\r\n        public Waypoint GetWaypointAt(float t)\r\n        {\r\n            if (_waypoints.Count == 0) return Waypoint.Invalid;\r\n            if (_waypoints.Count == 1) return new Waypoint(_waypoints[0]);\r\n\r\n            t = _speedTable.GetConstPathPercFromTimePerc(t);\r\n            var p1 = this.GetRealPositionAt(t);\r\n            var p2 = this.GetRealPositionAt(t + 0.01f);\r\n            return new Waypoint(p1, (p2 - p1));\r\n        }\r\n\r\n        public int GetDetailedPositions(ICollection<Vector3> coll, float segmentLength)\r\n        {\r\n            if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n            int detail = Mathf.FloorToInt(this.GetArcLength() / segmentLength) + 1;\r\n            for (int i = 0; i <= detail; i++)\r\n            {\r\n                coll.Add(this.GetPositionAt((float)i / (float)detail));\r\n            }\r\n            return detail + 1;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IIndexedWaypointPath Interface\r\n\r\n        public int Count\r\n        {\r\n            get { return _waypoints.Count; }\r\n        }\r\n\r\n        public IWaypoint ControlPoint(int index)\r\n        {\r\n            return _waypoints[index];\r\n        }\r\n\r\n        public int IndexOf(IWaypoint waypoint)\r\n        {\r\n            return _waypoints.IndexOf(waypoint);\r\n        }\r\n\r\n        public Vector3 GetPositionAfter(int index, float t)\r\n        {\r\n            if (index < 0 || index >= _waypoints.Count) throw new System.IndexOutOfRangeException();\r\n\r\n            float range = 1f / (_waypoints.Count - 1);\r\n            return this.GetPositionAt(index * range + t * range);\r\n        }\r\n\r\n        public Waypoint GetWaypointAfter(int index, float t)\r\n        {\r\n            if (index < 0 || index >= _waypoints.Count) throw new System.IndexOutOfRangeException();\r\n\r\n            float range = 1f / (_waypoints.Count - 1);\r\n            return this.GetWaypointAt(index * range + t * range);\r\n        }\r\n\r\n        public RelativePositionData GetRelativePositionData(float t)\r\n        {\r\n            int cnt = _waypoints.Count;\r\n            switch(cnt)\r\n            {\r\n                case 0:\r\n                    return new RelativePositionData(-1, 0f);\r\n                case 1:\r\n                    return new RelativePositionData(0, 0f);\r\n                case 2:\r\n                    return new RelativePositionData(0, t);\r\n                default:\r\n                    {\r\n                        float range = 1f / (_waypoints.Count - 1);\r\n                        int i = Mathf.Clamp(Mathf.FloorToInt(t / range), 0, _waypoints.Count - 1);\r\n                        float dt = (t - i * range) / range;\r\n                        return new RelativePositionData(i, dt);\r\n                    }\r\n            }\r\n        }\r\n\r\n        public void Clean()\r\n        {\r\n            _speedTable.SetDirty();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IConfigurableIndexedWaypointPath Interface\r\n\r\n        public void AddControlPoint(IWaypoint waypoint)\r\n        {\r\n            _waypoints.Add(waypoint);\r\n            _speedTable.SetDirty();\r\n        }\r\n\r\n        public void InsertControlPoint(int index, IWaypoint waypoint)\r\n        {\r\n            _waypoints.Insert(index, waypoint);\r\n            _speedTable.SetDirty();\r\n        }\r\n\r\n        public void ReplaceControlPoint(int index, IWaypoint waypoint)\r\n        {\r\n            _waypoints[index] = waypoint;\r\n            _speedTable.SetDirty();\r\n        }\r\n\r\n        public void RemoveControlPointAt(int index)\r\n        {\r\n            _waypoints.RemoveAt(index);\r\n            _speedTable.SetDirty();\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _waypoints.Clear();\r\n            _speedTable.SetDirty();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public IEnumerator<IWaypoint> GetEnumerator()\r\n        {\r\n            return _waypoints.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _waypoints.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyWaypoints/Waypoints/CardinalSplinePath.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Waypoints\r\n{\r\n\r\n    /// <summary>\r\n    /// Represents a catmull-rom cardinal spline.\r\n    /// </summary>\r\n    public class CardinalSplinePath : IConfigurableIndexedWaypointPath\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private const int SUBDIVISIONS_MULTIPLIER = 16;\r\n\r\n        private bool _isClosed;\r\n        private List<IWaypoint> _waypoints = new List<IWaypoint>();\r\n        private bool _useConstantSpeed = true;\r\n\r\n        private Vector3[] _points;\r\n        private CurveConstantSpeedTable _speedTable = new CurveConstantSpeedTable();\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public CardinalSplinePath()\r\n        {\r\n\r\n        }\r\n\r\n        public CardinalSplinePath(IEnumerable<IWaypoint> waypoints)\r\n        {\r\n            _waypoints.AddRange(waypoints);\r\n            this.Clean_Imp();\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public bool UseConstantSpeed\r\n        {\r\n            get { return _useConstantSpeed; }\r\n            set { _useConstantSpeed = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void Clean_Imp()\r\n        {\r\n            if (_waypoints.Count == 0)\r\n            {\r\n                _points = new Vector3[] { };\r\n                _speedTable.SetZero();\r\n                return;\r\n            }\r\n            else if (_waypoints.Count == 1)\r\n            {\r\n                _points = new Vector3[] { _waypoints[0].Position };\r\n                _speedTable.SetZero();\r\n                return;\r\n            }\r\n            else\r\n            {\r\n                //get points\r\n                _points = (_isClosed) ? new Vector3[_waypoints.Count + 3] : new Vector3[_waypoints.Count + 2];\r\n                for (int i = 0; i < _waypoints.Count; i++) _points[i + 1] = _waypoints[i].Position;\r\n                if (_isClosed)\r\n                {\r\n                    _points[0] = _waypoints[_waypoints.Count - 1].Position;\r\n                    _points[_points.Length - 2] = _points[1];\r\n                    _points[_points.Length - 1] = _points[2];\r\n                }\r\n                else\r\n                {\r\n                    _points[0] = _points[1];\r\n                    var lastPnt = _waypoints[_waypoints.Count - 1].Position;\r\n                    var diffV = lastPnt - _waypoints[_waypoints.Count - 2].Position;\r\n                    _points[_points.Length - 1] = lastPnt + diffV;\r\n                }\r\n\r\n                _speedTable.Clean(SUBDIVISIONS_MULTIPLIER * _points.Length, this.GetRealPositionAt);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns the position with out speed correction on the path of points. \r\n        /// This method does NOT validate itself, make sure the curve is clean before calling.\r\n        /// </summary>\r\n        /// <param name=\"t\"></param>\r\n        /// <returns></returns>\r\n        private Vector3 GetRealPositionAt(float t)\r\n        {\r\n            int numSections = _points.Length - 3;\r\n            int tSec = Mathf.FloorToInt(t * numSections);\r\n            int currPt = numSections - 1;\r\n            if (currPt > tSec) currPt = tSec;\r\n            float u = t * numSections - currPt;\r\n\r\n            Vector3 a = _points[currPt];\r\n            Vector3 b = _points[currPt + 1];\r\n            Vector3 c = _points[currPt + 2];\r\n            Vector3 d = _points[currPt + 3];\r\n            return 0.5f * (\r\n                    (-a + 3f * b - 3f * c + d) * (u * u * u)\r\n                    + (2f * a - 5f * b + 4f * c - d) * (u * u)\r\n                    + (-a + c) * u\r\n                    + 2f * b\r\n                    );\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IWaypointPath\r\n\r\n        public bool IsClosed\r\n        {\r\n            get { return _isClosed; }\r\n            set\r\n            {\r\n                if (value == _isClosed) return;\r\n                _isClosed = value;\r\n                _points = null;\r\n            }\r\n        }\r\n\r\n\r\n        public Vector3 GetPositionAt(float t)\r\n        {\r\n            if (_speedTable.IsDirty) this.Clean_Imp();\r\n            if (_points.Length < 2) return (_points.Length == 0) ? VectorUtil.NaNVector3 : _points[0];\r\n\r\n            if (_useConstantSpeed) t = _speedTable.GetConstPathPercFromTimePerc(t);\r\n\r\n            return GetRealPositionAt(t);\r\n        }\r\n\r\n        public Waypoint GetWaypointAt(float t)\r\n        {\r\n            if (_speedTable.IsDirty) this.Clean_Imp();\r\n            if (_points.Length < 2) return (_points.Length == 0) ? Waypoint.Invalid : new Waypoint(_points[0], Vector3.zero);\r\n\r\n            if (_useConstantSpeed) t = _speedTable.GetConstPathPercFromTimePerc(t);\r\n\r\n            var p1 = this.GetRealPositionAt(t);\r\n            var p2 = this.GetRealPositionAt(t + 0.01f); //TODO - figure out a more efficient way of calculating the tangent\r\n            return new Waypoint(p1, (p2 - p1).normalized);\r\n        }\r\n\r\n        public float GetArcLength()\r\n        {\r\n            if (_speedTable.IsDirty) this.Clean_Imp();\r\n            return _speedTable.TotalArcLength;\r\n        }\r\n\r\n        public int GetDetailedPositions(ICollection<Vector3> coll, float segmentLength)\r\n        {\r\n            if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n            int detail = Mathf.FloorToInt(this.GetArcLength() / segmentLength) + 1;\r\n            for (int i = 0; i <= detail; i++)\r\n            {\r\n                coll.Add(this.GetPositionAt((float)i / (float)detail));\r\n            }\r\n            return detail + 1;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IIndexedWaypointPath Interface\r\n\r\n        public int Count\r\n        {\r\n            get { return _waypoints.Count; }\r\n        }\r\n\r\n        public IWaypoint ControlPoint(int index)\r\n        {\r\n            return _waypoints[index];\r\n        }\r\n\r\n        public int IndexOf(IWaypoint waypoint)\r\n        {\r\n            return _waypoints.IndexOf(waypoint);\r\n        }\r\n\r\n        public Vector3 GetPositionAfter(int index, float t)\r\n        {\r\n            if (index < 0 || index >= _waypoints.Count) throw new System.IndexOutOfRangeException();\r\n            if (_speedTable.IsDirty) this.Clean_Imp();\r\n            if (_points.Length < 2) return (_points.Length == 0) ? VectorUtil.NaNVector3 : _points[0];\r\n\r\n            index++; //index at 0 is an ignored control point, index should be 1-base\r\n            int i = index * SUBDIVISIONS_MULTIPLIER;\r\n            int j = (index + 1) * SUBDIVISIONS_MULTIPLIER;\r\n            //float nt = _timesTable[i] + (_timesTable[j] - _timesTable[i]) * t;\r\n            float nt = _speedTable.GetTimeAtSubdivision(i) + (_speedTable.GetTimeAtSubdivision(j) - _speedTable.GetTimeAtSubdivision(i)) * t;\r\n            return this.GetRealPositionAt(nt);\r\n        }\r\n\r\n        public Waypoint GetWaypointAfter(int index, float t)\r\n        {\r\n            if (index < 0 || index >= _waypoints.Count) throw new System.IndexOutOfRangeException();\r\n            if (_speedTable.IsDirty) this.Clean_Imp();\r\n            if (_points.Length < 2) return (_points.Length == 0) ? Waypoint.Invalid : new Waypoint(_points[0], Vector3.zero);\r\n\r\n            index++; //index at 0 is an ignored control point, index should be 1-base\r\n            int i = index * SUBDIVISIONS_MULTIPLIER;\r\n            int j = (index + 1) * SUBDIVISIONS_MULTIPLIER;\r\n            //float nt = _timesTable[i] + (_timesTable[j] - _timesTable[i]) * t;\r\n            float nt = _speedTable.GetTimeAtSubdivision(i) + (_speedTable.GetTimeAtSubdivision(j) - _speedTable.GetTimeAtSubdivision(i)) * t;\r\n\r\n            var p1 = this.GetRealPositionAt(nt);\r\n            var p2 = this.GetRealPositionAt(nt + 0.01f); //TODO - figure out a more efficient way of calculating the tangent\r\n            return new Waypoint(p1, (p2 - p1).normalized);\r\n        }\r\n\r\n        public RelativePositionData GetRelativePositionData(float t)\r\n        {\r\n            int cnt = _waypoints.Count;\r\n            switch (cnt)\r\n            {\r\n                case 0:\r\n                    return new RelativePositionData(-1, 0f);\r\n                case 1:\r\n                    return new RelativePositionData(0, 0f);\r\n                case 2:\r\n                    return new RelativePositionData(0, t);\r\n                default:\r\n                    {\r\n                        if (_speedTable.IsDirty) this.Clean_Imp();\r\n\r\n                        if (_useConstantSpeed) t = _speedTable.GetConstPathPercFromTimePerc(t);\r\n\r\n                        t = Mathf.Clamp01(t);\r\n                        if (MathUtil.FuzzyEqual(t, 1f)) return new RelativePositionData(_waypoints.Count - 1, 0f);\r\n\r\n                        int index;\r\n                        float segmentTime;\r\n                        if(_isClosed)\r\n                        {\r\n                            index = Mathf.FloorToInt(cnt * t);\r\n                            segmentTime = 1f / cnt;\r\n                        }\r\n                        else\r\n                        {\r\n                            index = Mathf.FloorToInt((cnt - 1) * t);\r\n                            segmentTime = 1f / (cnt - 1);\r\n                        }\r\n                        float lt = index * segmentTime;\r\n                        float ht = (index + 1) * segmentTime;\r\n                        float dt = MathUtil.PercentageMinMax(t, ht, lt);\r\n                        \r\n                        return new RelativePositionData(index, dt);\r\n                    }\r\n            }\r\n        }\r\n\r\n        public void Clean()\r\n        {\r\n            _points = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IConfigurableIndexedWaypointPath Interface\r\n\r\n        public void AddControlPoint(IWaypoint waypoint)\r\n        {\r\n            _waypoints.Add(waypoint);\r\n            _points = null;\r\n        }\r\n\r\n        public void InsertControlPoint(int index, IWaypoint waypoint)\r\n        {\r\n            _waypoints.Insert(index, waypoint);\r\n            _points = null;\r\n        }\r\n\r\n        public void ReplaceControlPoint(int index, IWaypoint waypoint)\r\n        {\r\n            _waypoints[index] = waypoint;\r\n            _points = null;\r\n        }\r\n\r\n        public void RemoveControlPointAt(int index)\r\n        {\r\n            _waypoints.RemoveAt(index);\r\n            _points = null;\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _waypoints.Clear();\r\n            _points = null;\r\n        }\r\n\r\n        public void DrawGizmos(float segmentLength)\r\n        {\r\n            if (_waypoints.Count <= 1) return;\r\n\r\n            var length = this.GetArcLength();\r\n            int divisions = Mathf.FloorToInt(length / segmentLength) + 1;\r\n\r\n            for (int i = 0; i < divisions; i++)\r\n            {\r\n                float t1 = (float)i / (float)divisions;\r\n                float t2 = (float)(i + 1) / (float)divisions;\r\n\r\n                Gizmos.DrawLine(this.GetPositionAt(t1), this.GetPositionAt(t2));\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public IEnumerator<IWaypoint> GetEnumerator()\r\n        {\r\n            return _waypoints.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _waypoints.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyWaypoints/Waypoints/CurveConstantSpeedTable.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Waypoints\r\n{\r\n\r\n    /// <summary>\r\n    /// Normalizes t over spline so that its position appears to progress over the spline at a constant rate.\r\n    /// </summary>\r\n    internal class CurveConstantSpeedTable\r\n    {\r\n\r\n        #region Fields\r\n        \r\n        private float _totalArcLength = float.NaN;\r\n        private float[] _timesTable;\r\n        private float[] _lengthsTable;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float TotalArcLength\r\n        {\r\n            get { return _totalArcLength; }\r\n        }\r\n\r\n        public bool IsDirty\r\n        {\r\n            get { return float.IsNaN(_totalArcLength); }\r\n        }\r\n\r\n        public int SubdivisionCount\r\n        {\r\n            get { return (_timesTable != null) ? _timesTable.Length : 0; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void Clean(int subdivisions, System.Func<float, Vector3> getRealPositionAt)\r\n        {\r\n            _totalArcLength = 0f;\r\n            float incr = 1f / subdivisions;\r\n            _timesTable = new float[subdivisions];\r\n            _lengthsTable = new float[subdivisions];\r\n\r\n            var prevP = getRealPositionAt(0);\r\n            float perc;\r\n            Vector3 currP;\r\n            for (int i = 1; i <= subdivisions; ++i)\r\n            {\r\n                perc = incr * i;\r\n                currP = getRealPositionAt(perc);\r\n                _totalArcLength += Vector3.Distance(currP, prevP);\r\n                prevP = currP;\r\n                _timesTable[i - 1] = perc;\r\n                _lengthsTable[i - 1] = _totalArcLength;\r\n            }\r\n        }\r\n\r\n        public void SetDirty()\r\n        {\r\n            _totalArcLength = float.NaN;\r\n            _timesTable = null;\r\n            _lengthsTable = null;\r\n        }\r\n\r\n        public void SetZero()\r\n        {\r\n            _totalArcLength = 0f;\r\n            _timesTable = null;\r\n            _lengthsTable = null;\r\n        }\r\n\r\n        public float GetConstPathPercFromTimePerc(float t)\r\n        {\r\n            if (float.IsNaN(_totalArcLength) || _totalArcLength == 0f) return t;\r\n\r\n            //Apply constant speed\r\n            if (t > 0f && t < 1f)\r\n            {\r\n                float tLen = _totalArcLength * t;\r\n                float t0 = 0f, l0 = 0f, t1 = 0f, l1 = 0f;\r\n                int alen = _lengthsTable.Length;\r\n                for (int i = 0; i < alen; ++i)\r\n                {\r\n                    if (_lengthsTable[i] > tLen)\r\n                    {\r\n                        t1 = _timesTable[i];\r\n                        l1 = _lengthsTable[i];\r\n                        if (i > 0) l0 = _lengthsTable[i - 1];\r\n                        break;\r\n                    }\r\n                    t0 = _timesTable[i];\r\n                }\r\n                t = t0 + ((tLen - l0) / (l1 - l0)) * (t1 - t0);\r\n            }\r\n\r\n            if (t > 1f) t = 1f;\r\n            else if (t < 0f) t = 0f;\r\n            return t;\r\n        }\r\n\r\n        public float GetTimeAtSubdivision(int index)\r\n        {\r\n            if (_timesTable == null) return 0f;\r\n            return _timesTable[index];\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyWaypoints/Waypoints/IWaypoint.cs",
    "content": "﻿using UnityEngine;\r\n\r\nnamespace com.spacepuppy.Waypoints\r\n{\r\n\r\n    public interface IWaypoint\r\n    {\r\n\r\n        Vector3 Position { get; set; }\r\n        Vector3 Heading { get; set; }\r\n\r\n    }\r\n\r\n    public interface IWeightedWaypoint : IWaypoint\r\n    {\r\n        float Strength { get; set; }\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyWaypoints/Waypoints/IWaypointPath.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nnamespace com.spacepuppy.Waypoints\r\n{\r\n    public interface IWaypointPath\r\n    {\r\n\r\n        bool IsClosed { get; set; }\r\n\r\n        float GetArcLength();\r\n        Vector3 GetPositionAt(float t);\r\n        Waypoint GetWaypointAt(float t);\r\n\r\n        int GetDetailedPositions(ICollection<Vector3> coll, float segmentLength);\r\n    }\r\n\r\n    public interface IIndexedWaypointPath : IWaypointPath, IEnumerable<IWaypoint>\r\n    {\r\n\r\n        int Count { get; }\r\n        IWaypoint ControlPoint(int index);\r\n        int IndexOf(IWaypoint waypoint);\r\n        Vector3 GetPositionAfter(int index, float t);\r\n        Waypoint GetWaypointAfter(int index, float t);\r\n        /// <summary>\r\n        /// Returns data pertaining to the relative position between the 2 control points on either side of 't'.\r\n        /// </summary>\r\n        /// <param name=\"t\"></param>\r\n        /// <returns></returns>\r\n        RelativePositionData GetRelativePositionData(float t);\r\n\r\n\r\n        void Clean();\r\n\r\n    }\r\n\r\n    public struct RelativePositionData\r\n    {\r\n        public int Index;\r\n        public float TPrime;\r\n\r\n        public RelativePositionData(int index, float t)\r\n        {\r\n            this.Index = index;\r\n            this.TPrime = t;\r\n        }\r\n    }\r\n\r\n    public interface IConfigurableIndexedWaypointPath : IIndexedWaypointPath\r\n    {\r\n        void AddControlPoint(IWaypoint waypoint);\r\n        void InsertControlPoint(int index, IWaypoint waypoint);\r\n        void ReplaceControlPoint(int index, IWaypoint waypoint);\r\n        void RemoveControlPointAt(int index);\r\n        void Clear();\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyWaypoints/Waypoints/LinearPath.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Waypoints\r\n{\r\n    public class LinearPath : IConfigurableIndexedWaypointPath\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private bool _isClosed;\r\n        private List<IWaypoint> _waypoints = new List<IWaypoint>();\r\n\r\n        private Vector3[] _points; //null if dirty\r\n        private float[] _lengths;\r\n        private float _totalArcLength = float.NaN;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public LinearPath()\r\n        {\r\n\r\n        }\r\n\r\n        public LinearPath(IEnumerable<IWaypoint> waypoints)\r\n        {\r\n            _waypoints.AddRange(waypoints);\r\n            _points = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void Clean_Imp()\r\n        {\r\n            if (_waypoints.Count == 0)\r\n            {\r\n                _points = new Vector3[] { };\r\n                _totalArcLength = float.NaN;\r\n            }\r\n            else if (_waypoints.Count == 1)\r\n            {\r\n                _points = new Vector3[] { _waypoints[0].Position };\r\n                _totalArcLength = 0f;\r\n            }\r\n            else\r\n            {\r\n                _points = (_isClosed) ? new Vector3[_waypoints.Count + 1] : new Vector3[_waypoints.Count];\r\n                for (int i = 0; i < _waypoints.Count; i++) _points[i] = _waypoints[i].Position;\r\n                if (_isClosed) _points[_points.Length - 1] = _points[0];\r\n\r\n                _lengths = new float[_points.Length];\r\n                _totalArcLength = 0f;\r\n                for (int i = 1; i < _points.Length; i++)\r\n                {\r\n                    float l = Vector3.Distance(_points[i], _points[i - 1]);\r\n                    _lengths[i - 1] = l;\r\n                    _totalArcLength += l;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IWaypointPath Interface\r\n\r\n        public bool IsClosed\r\n        {\r\n            get { return _isClosed; }\r\n            set\r\n            {\r\n                if (_isClosed == value) return;\r\n                _isClosed = value;\r\n                _points = null;\r\n            }\r\n        }\r\n\r\n        public float GetArcLength()\r\n        {\r\n            if (_points == null) this.Clean_Imp();\r\n            return _totalArcLength;\r\n        }\r\n\r\n        public Vector3 GetPositionAt(float t)\r\n        {\r\n            if (_points == null) this.Clean_Imp();\r\n            if (_points.Length < 2) return (_points.Length == 0) ? VectorUtil.NaNVector3 : _points[0];\r\n\r\n            float len = _lengths[0];\r\n            float tot = len;\r\n            int i = 0;\r\n            while (tot / _totalArcLength < t && i < _lengths.Length)\r\n            {\r\n                i++;\r\n                len = _lengths[i];\r\n                tot += len;\r\n            }\r\n\r\n            float lt = (tot - len) / _totalArcLength;\r\n            float ht = tot / _totalArcLength;\r\n            float dt = com.spacepuppy.Utils.MathUtil.PercentageMinMax(t, ht, lt);\r\n            return this.GetPositionAfter(i, dt);\r\n        }\r\n\r\n        public Waypoint GetWaypointAt(float t)\r\n        {\r\n            if (_points == null) this.Clean_Imp();\r\n            if (_points.Length < 2) return (_points.Length == 0) ? Waypoint.Invalid : new Waypoint(_points[0], Vector3.zero);\r\n\r\n            float len = _lengths[0];\r\n            float tot = len;\r\n            int i = 0;\r\n            while (tot / _totalArcLength < t && i < _lengths.Length)\r\n            {\r\n                i++;\r\n                len = _lengths[i];\r\n                tot += len;\r\n            }\r\n\r\n            float lt = (tot - len) / _totalArcLength;\r\n            float ht = tot / _totalArcLength;\r\n            float dt = MathUtil.PercentageMinMax(t, ht, lt);\r\n            return this.GetWaypointAfter(i, dt);\r\n        }\r\n\r\n        public int GetDetailedPositions(ICollection<Vector3> coll, float segmentLength)\r\n        {\r\n            if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n            if (_points == null) this.Clean_Imp();\r\n            for(int i = 0; i < _points.Length; i++)\r\n            {\r\n                coll.Add(_points[i]);\r\n            }\r\n            return _points.Length;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IIndexedWaypointPath Interface\r\n\r\n        public int Count\r\n        {\r\n            get { return _waypoints.Count; }\r\n        }\r\n\r\n        public IWaypoint ControlPoint(int index)\r\n        {\r\n            return _waypoints[index];\r\n        }\r\n\r\n        public int IndexOf(IWaypoint waypoint)\r\n        {\r\n            return _waypoints.IndexOf(waypoint);\r\n        }\r\n\r\n        public Vector3 GetPositionAfter(int index, float t)\r\n        {\r\n            if (index < 0 || index >= _waypoints.Count) throw new System.IndexOutOfRangeException();\r\n            if (_points == null) this.Clean_Imp();\r\n            if (_points.Length < 2) return (_points.Length == 0) ? VectorUtil.NaNVector3 : _points[0];\r\n\r\n            if (index == _points.Length - 1)\r\n            {\r\n                var pa = _points[index - 1];\r\n                var pb = _points[index];\r\n                var v = pb - pa;\r\n                return pa + v * t;\r\n            }\r\n            else\r\n            {\r\n                return Vector3.Lerp(_points[index], _points[index + 1], t);\r\n            }\r\n        }\r\n\r\n        public Waypoint GetWaypointAfter(int index, float t)\r\n        {\r\n            if (index < 0 || index >= _waypoints.Count) throw new System.IndexOutOfRangeException();\r\n            if (_points == null) this.Clean_Imp();\r\n            if (_points.Length < 2) return (_points.Length == 0) ? Waypoint.Invalid : new Waypoint(_points[0], Vector3.zero);\r\n\r\n            if (index == _points.Length - 1)\r\n            {\r\n                var pa = _points[index - 1];\r\n                var pb = _points[index];\r\n                var v = pb - pa;\r\n                return new Waypoint(pa + v * t, v.normalized);\r\n            }\r\n            else\r\n            {\r\n                var pa = _points[index];\r\n                var pb = _points[index + 1];\r\n                var v = pb - pa;\r\n                return new Waypoint(pa + v * t, v.normalized);\r\n            }\r\n        }\r\n\r\n        public RelativePositionData GetRelativePositionData(float t)\r\n        {\r\n            var cnt = _waypoints.Count;\r\n            switch(cnt)\r\n            {\r\n                case 0:\r\n                    return new RelativePositionData(-1, 0f);\r\n                case 1:\r\n                    return new RelativePositionData(0, 0f);\r\n                case 2:\r\n                    return new RelativePositionData(0, t);\r\n                default:\r\n                    {\r\n                        if (_points == null) this.Clean_Imp();\r\n\r\n                        float len = _lengths[0];\r\n                        float tot = len;\r\n                        int i = 0;\r\n                        while (tot / _totalArcLength < t && i < _lengths.Length)\r\n                        {\r\n                            i++;\r\n                            len = _lengths[i];\r\n                            tot += len;\r\n                        }\r\n\r\n                        float lt = (tot - len) / _totalArcLength;\r\n                        float ht = tot / _totalArcLength;\r\n                        float dt = MathUtil.PercentageMinMax(t, ht, lt);\r\n                        \r\n                        return new RelativePositionData(i % cnt, dt);\r\n                    }\r\n            }\r\n        }\r\n\r\n        public void Clean()\r\n        {\r\n            _points = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IConfigurableIndexedWaypointPath Interface\r\n\r\n        public void AddControlPoint(IWaypoint waypoint)\r\n        {\r\n            _waypoints.Add(waypoint);\r\n            _points = null;\r\n        }\r\n\r\n        public void InsertControlPoint(int index, IWaypoint waypoint)\r\n        {\r\n            _waypoints.Insert(index, waypoint);\r\n            _points = null;\r\n        }\r\n\r\n        public void ReplaceControlPoint(int index, IWaypoint waypoint)\r\n        {\r\n            _waypoints[index] = waypoint;\r\n            _points = null;\r\n        }\r\n\r\n        public void RemoveControlPointAt(int index)\r\n        {\r\n            _waypoints.RemoveAt(index);\r\n            _points = null;\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            _waypoints.Clear();\r\n            _points = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public IEnumerator<IWaypoint> GetEnumerator()\r\n        {\r\n            return _waypoints.GetEnumerator();\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return _waypoints.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpacepuppyWaypoints/Waypoints/SplinePath.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Geom;\r\n\r\nnamespace com.spacepuppy.Waypoints\r\n{\r\n\r\n    public class SplinePath : IIndexedWaypointPath\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private I3dSpline _spline;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public SplinePath(I3dSpline spline)\r\n        {\r\n            _spline = spline;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IWaypointPath Interface\r\n\r\n        public int Count\r\n        {\r\n            get { return _spline.Count; }\r\n        }\r\n\r\n        public bool IsClosed\r\n        {\r\n            get { return false; }\r\n            set\r\n            {\r\n                throw new System.NotSupportedException();\r\n            }\r\n        }\r\n\r\n        public IWaypoint ControlPoint(int index)\r\n        {\r\n            return new Waypoint(_spline.ControlPoint(index), Vector3.zero);\r\n        }\r\n\r\n        public int IndexOf(IWaypoint waypoint)\r\n        {\r\n            return -1;\r\n        }\r\n\r\n        public float GetArcLength()\r\n        {\r\n            return _spline.GetArcLength();\r\n        }\r\n\r\n        public Vector3 GetPositionAt(float t)\r\n        {\r\n            return _spline.GetPosition(t);\r\n        }\r\n        public Waypoint GetWaypointAt(float t)\r\n        {\r\n            return new Waypoint(_spline.GetPosition(t), Vector3.zero);\r\n        }\r\n\r\n        public Vector3 GetPositionAfter(int index, float t)\r\n        {\r\n            return _spline.GetPositionAfter(index, t);\r\n        }\r\n        public Waypoint GetWaypointAfter(int index, float t)\r\n        {\r\n            return new Waypoint(_spline.GetPositionAfter(index, t), Vector3.zero);\r\n        }\r\n\r\n        public int GetDetailedPositions(ICollection<Vector3> coll, float segmentLength)\r\n        {\r\n            if (coll == null) throw new System.ArgumentNullException(\"coll\");\r\n            int detail = Mathf.FloorToInt(_spline.GetArcLength() / segmentLength) + 1;\r\n            for(int i = 0; i <= detail; i++)\r\n            {\r\n                coll.Add(_spline.GetPosition((float)i / (float)detail));\r\n            }\r\n            return detail + 1;\r\n        }\r\n\r\n        public RelativePositionData GetRelativePositionData(float t)\r\n        {\r\n            throw new System.NotImplementedException();\r\n        }\r\n\r\n        void IIndexedWaypointPath.Clean()\r\n        {\r\n            //do nothing\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IEnumerable Interface\r\n\r\n        public IEnumerator<IWaypoint> GetEnumerator()\r\n        {\r\n            for(int i = 0; i < _spline.Count; i++)\r\n            {\r\n                yield return new Waypoint(_spline.ControlPoint(i), Vector3.zero);\r\n            }\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return this.GetEnumerator();\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyWaypoints/Waypoints/Waypoint.cs",
    "content": "﻿using UnityEngine;\r\n\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Waypoints\r\n{\r\n\r\n    public struct Waypoint : IWaypoint\r\n    {\r\n        public Vector3 Position;\r\n        private Vector3 _heading;\r\n\r\n        public Waypoint(Vector3 p, Vector3 h)\r\n        {\r\n            Position = p;\r\n            _heading = h.normalized;\r\n        }\r\n\r\n        public Waypoint(IWaypoint waypoint)\r\n        {\r\n            this.Position = waypoint.Position;\r\n            _heading = waypoint.Heading.normalized;\r\n        }\r\n\r\n        #region IWaypoint Interface\r\n\r\n        public Vector3 Heading\r\n        {\r\n            get { return _heading; }\r\n            set { _heading = value.normalized; }\r\n        }\r\n\r\n        Vector3 IWaypoint.Position\r\n        {\r\n            get\r\n            {\r\n                return this.Position;\r\n            }\r\n            set\r\n            {\r\n                this.Position = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Operator Interface\r\n\r\n        public static bool Compare(IWaypoint a, IWaypoint b)\r\n        {\r\n            //return (a.Position == b.Position) && (a.Heading == b.Heading);\r\n            return VectorUtil.FuzzyEquals(a.Position, b.Position) && VectorUtil.FuzzyEquals(a.Heading, b.Heading);\r\n        }\r\n\r\n        public static bool Compare(Waypoint a, IWaypoint b)\r\n        {\r\n            //return (a.Position == b.Position) && (a._heading == b.Heading);\r\n            return VectorUtil.FuzzyEquals(a.Position, b.Position) && VectorUtil.FuzzyEquals(a.Heading, b.Heading);\r\n        }\r\n\r\n        public static bool Compare(IWaypoint a, Waypoint b)\r\n        {\r\n            //return (a.Position == b.Position) && (a.Heading == b._heading);\r\n            return VectorUtil.FuzzyEquals(a.Position, b.Position) && VectorUtil.FuzzyEquals(a.Heading, b.Heading);\r\n        }\r\n\r\n        #endregion\r\n\r\n        public static Waypoint Invalid { get { return new Waypoint(new Vector3(float.NaN, float.NaN, float.NaN), new Vector3(float.NaN, float.NaN, float.NaN)); } }\r\n\r\n    }\r\n\r\n    public struct WeightedWaypoint : IWeightedWaypoint\r\n    {\r\n        public Vector3 Position;\r\n        private Vector3 _heading;\r\n        public float Strength;\r\n\r\n        public WeightedWaypoint(Vector3 p, Vector3 h, float s)\r\n        {\r\n            Position = p;\r\n            _heading = h.normalized;\r\n            Strength = s;\r\n        }\r\n\r\n        public WeightedWaypoint(IWeightedWaypoint waypoint)\r\n        {\r\n            this.Position = waypoint.Position;\r\n            _heading = waypoint.Heading.normalized;\r\n            this.Strength = waypoint.Strength;\r\n        }\r\n\r\n        #region IWaypoint Interface\r\n\r\n        public Vector3 Heading\r\n        {\r\n            get { return _heading; }\r\n            set { _heading = value.normalized; }\r\n        }\r\n\r\n        Vector3 IWaypoint.Position\r\n        {\r\n            get\r\n            {\r\n                return this.Position;\r\n            }\r\n            set\r\n            {\r\n                this.Position = value;\r\n            }\r\n        }\r\n\r\n        float IWeightedWaypoint.Strength\r\n        {\r\n            get\r\n            {\r\n                return this.Strength;\r\n            }\r\n            set\r\n            {\r\n                this.Strength = value;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Operator Interface\r\n\r\n        public static bool Compare(IWeightedWaypoint a, IWeightedWaypoint b)\r\n        {\r\n            return (a.Position == b.Position) && (a.Heading == b.Heading) && (a.Strength == b.Strength);\r\n        }\r\n\r\n        public static bool Compare(WeightedWaypoint a, IWeightedWaypoint b)\r\n        {\r\n            return (a.Position == b.Position) && (a._heading == b.Heading) && (a.Strength == b.Strength);\r\n        }\r\n\r\n        public static bool Compare(IWeightedWaypoint a, WeightedWaypoint b)\r\n        {\r\n            return (a.Position == b.Position) && (a.Heading == b._heading) && (a.Strength == b.Strength);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyWaypoints/Waypoints/WaypointPathComponent.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Waypoints\r\n{\r\n\r\n    public class WaypointPathComponent : SPComponent\r\n    {\r\n\r\n        public enum PathType\r\n        {\r\n            Cardinal = 0,\r\n            Linear = 1,\r\n            BezierChain = 2,\r\n            BezierSpline = 3\r\n        }\r\n\r\n        #region Fields\r\n\r\n        [Tooltip(\"The algorithm used for determining the path through the waypoints. NOTE - BezierSpline doesn't pass through the points and shouldn't be used with large numbers of waypoints, especially if the points animated.\")]\r\n        [SerializeField()]\r\n        private PathType _pathType;\r\n        [SerializeField()]\r\n        [Tooltip(\"The curve makes a complete trip around to waypoint 0.\")]\r\n        private bool _closed;\r\n        [SerializeField()]\r\n        [Tooltip(\"When pathing on this path, use values relative to this transform instead of the global values.\")]\r\n        private Transform _transformRelativeTo;\r\n        [SerializeField()]\r\n        private TransformWaypoint[] _waypoints;\r\n\r\n        [Tooltip(\"If the waypoints move at runtime, and you'd like the WaypointPath to automatically update itself, flag this true.\")]\r\n        [SerializeField()]\r\n        private bool _waypointsAnimate;\r\n\r\n        [System.NonSerialized()]\r\n        private IConfigurableIndexedWaypointPath _path;\r\n        [System.NonSerialized()]\r\n        private RadicalCoroutine _autoCleanRoutine;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void Awake()\r\n        {\r\n            base.Awake();\r\n\r\n            for(int i = 0; i < _waypoints.Length; i++)\r\n            {\r\n                if(_waypoints[i] != null) _waypoints[i].Owner = this;\r\n            }\r\n            _path = GetPath(this, false);\r\n\r\n            if (_waypointsAnimate) _autoCleanRoutine = this.StartRadicalCoroutine(this.AutoCleanRoutine(), RadicalCoroutineDisableMode.Pauses);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public PathType Type\r\n        {\r\n            get { return _pathType; }\r\n            set\r\n            {\r\n                if (_pathType == value) return;\r\n                _pathType = value;\r\n                _path = null;\r\n            }\r\n        }\r\n\r\n        public bool Closed\r\n        {\r\n            get { return _closed; }\r\n            set\r\n            {\r\n                _closed = value;\r\n                if (_path != null) _path.IsClosed = _closed;\r\n            }\r\n        }\r\n\r\n        public bool WaypointsAnimate\r\n        {\r\n            get { return _waypointsAnimate; }\r\n            set\r\n            {\r\n                if (_waypointsAnimate == value) return;\r\n                _waypointsAnimate = value;\r\n                if(_waypointsAnimate && _autoCleanRoutine != null)\r\n                {\r\n                    _autoCleanRoutine = this.StartRadicalCoroutine(this.AutoCleanRoutine(), RadicalCoroutineDisableMode.Pauses);\r\n                }\r\n            }\r\n        }\r\n\r\n        public Transform TransformRelativeTo\r\n        {\r\n            get { return _transformRelativeTo; }\r\n            set { _transformRelativeTo = value; }\r\n        }\r\n\r\n        public IConfigurableIndexedWaypointPath Path\r\n        {\r\n            get { return _path; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n       \r\n        public IConfigurableIndexedWaypointPath GetPathClone()\r\n        {\r\n            return GetPath(this, true);\r\n        }\r\n\r\n        public void SetWaypoints(IEnumerable<Transform> waypoints)\r\n        {\r\n            _waypoints = (from t in waypoints select new TransformWaypoint(t)).ToArray();\r\n            this.Clean();\r\n        }\r\n\r\n        public void Clean()\r\n        {\r\n            if (_path != null)\r\n            {\r\n                _path.IsClosed = _closed;\r\n                _path.Clear();\r\n                foreach (var wp in _waypoints) _path.AddControlPoint(wp);\r\n            }\r\n        }\r\n\r\n        private System.Collections.IEnumerator AutoCleanRoutine()\r\n        {\r\n            yield return null;\r\n\r\n            while (_waypointsAnimate)\r\n            {\r\n                _path.IsClosed = _closed;\r\n                if (_waypoints.Length != _path.Count)\r\n                {\r\n                    //refill path\r\n                    _path.Clear();\r\n                    for(int i = 0; i < _waypoints.Length; i++)\r\n                    {\r\n                        _path.AddControlPoint(_waypoints[i]);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    bool needsCleaning = false;\r\n                    for (int i = 0; i < _waypoints.Length; i++)\r\n                    {\r\n                        if(!object.ReferenceEquals(_waypoints[i], _path.ControlPoint(i)))\r\n                        {\r\n                            _path.ReplaceControlPoint(i, _waypoints[i]);\r\n                        }\r\n                        else if (!needsCleaning && !Waypoint.Compare(_path.ControlPoint(i), _waypoints[i]))\r\n                        {\r\n                            needsCleaning = true;\r\n                        }\r\n                    }\r\n\r\n                    if(needsCleaning)\r\n                    {\r\n                        _path.Clean();\r\n                    }\r\n                }\r\n\r\n                yield return null;\r\n            }\r\n\r\n            _autoCleanRoutine = null;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Static Interface\r\n\r\n        public static IConfigurableIndexedWaypointPath GetPath(WaypointPathComponent c, bool cloneWaypoints)\r\n        {\r\n            IConfigurableIndexedWaypointPath path = null;\r\n            switch(c._pathType)\r\n            {\r\n                case PathType.Cardinal:\r\n                    path = new CardinalSplinePath();\r\n                    break;\r\n                case PathType.Linear:\r\n                    path = new LinearPath();\r\n                    break;\r\n                case PathType.BezierChain:\r\n                    path = new BezierChainPath();\r\n                    break;\r\n                case PathType.BezierSpline:\r\n                    path = new BezierSplinePath();\r\n                    break;\r\n            }\r\n            if(path != null)\r\n            {\r\n                path.IsClosed = c._closed;\r\n                if(c._waypoints != null)\r\n                {\r\n                    for (int i = 0; i < c._waypoints.Length; i++)\r\n                    {\r\n                        if(cloneWaypoints)\r\n                            path.AddControlPoint(new Waypoint(c._waypoints[i]));\r\n                        else\r\n                            path.AddControlPoint(c._waypoints[i]);\r\n                    }\r\n                }\r\n            }\r\n            return path;\r\n        }\r\n\r\n        public static IConfigurableIndexedWaypointPath GetPath(PathType type, IEnumerable<IWaypoint> waypoints, bool isClosed, bool cloneWaypoints)\r\n        {\r\n            IConfigurableIndexedWaypointPath path = null;\r\n            switch (type)\r\n            {\r\n                case PathType.Cardinal:\r\n                    path = new CardinalSplinePath();\r\n                    break;\r\n                case PathType.Linear:\r\n                    path = new LinearPath();\r\n                    break;\r\n                case PathType.BezierChain:\r\n                    path = new BezierChainPath();\r\n                    break;\r\n                case PathType.BezierSpline:\r\n                    path = new BezierSplinePath();\r\n                    break;\r\n            }\r\n            if (path != null)\r\n            {\r\n                path.IsClosed = isClosed;\r\n                foreach(var wp in waypoints)\r\n                {\r\n                    if(cloneWaypoints)\r\n                        path.AddControlPoint(new Waypoint(wp));\r\n                    else\r\n                        path.AddControlPoint(wp);\r\n                }\r\n            }\r\n            return path;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Special Types\r\n\r\n        [System.Serializable()]\r\n        private class TransformWaypoint : IWeightedWaypoint, IGameObjectSource\r\n        {\r\n\r\n            #region Fields\r\n\r\n            [SerializeField()]\r\n            private Transform _transform;\r\n\r\n            [System.NonSerialized()]\r\n            private WaypointPathComponent _owner;\r\n\r\n            #endregion\r\n\r\n            #region CONSTRUCTOR\r\n            \r\n            public TransformWaypoint(Transform t)\r\n            {\r\n                _transform = t;\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region Properties\r\n\r\n            public WaypointPathComponent Owner\r\n            {\r\n                get { return _owner; }\r\n                internal set { _owner = value; }\r\n            }\r\n\r\n            public Transform Transform\r\n            {\r\n                get { return _transform; }\r\n                set { _transform = value; }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IWaypoint Interface\r\n\r\n            public Vector3 Position\r\n            {\r\n                get\r\n                {\r\n                    if (_transform == null) return Vector3.zero;\r\n                    //return _transform.position;\r\n                    \r\n                    return (!object.ReferenceEquals(_owner, null) && _owner._transformRelativeTo != null) ? _transform.GetRelativePosition(_owner._transformRelativeTo) : _transform.position;\r\n                }\r\n                set\r\n                {\r\n                    if (_transform == null) return;\r\n                    //_transform.position = value;\r\n                    if (!object.ReferenceEquals(_owner, null) && _owner._transformRelativeTo != null)\r\n                        _transform.localPosition = value;\r\n                    else\r\n                        _transform.position = value;\r\n                }\r\n            }\r\n\r\n            public Vector3 Heading\r\n            {\r\n                get\r\n                {\r\n                    if (_transform == null) return Vector3.forward;\r\n                    //return _transform.forward;\r\n                    return (!object.ReferenceEquals(_owner, null) && _owner._transformRelativeTo != null) ? _transform.GetRelativeRotation(_owner._transformRelativeTo) * Vector3.forward : _transform.forward;\r\n                }\r\n                set\r\n                {\r\n                    if (_transform == null) return;\r\n                    //_transform.rotation = Quaternion.LookRotation(value);\r\n                    if (!object.ReferenceEquals(_owner, null) && _owner._transformRelativeTo != null)\r\n                        _transform.localRotation = Quaternion.LookRotation(value);\r\n                    else\r\n                        _transform.rotation = Quaternion.LookRotation(value);\r\n                }\r\n            }\r\n\r\n            public float Strength\r\n            {\r\n                get\r\n                {\r\n                    if (_transform == null) return 0f;\r\n                    return _transform.localScale.z;\r\n                }\r\n                set\r\n                {\r\n                    if (_transform == null) return;\r\n                    _transform.localScale = Vector3.one * value;\r\n                }\r\n            }\r\n\r\n            #endregion\r\n\r\n            #region IComponent Interface\r\n\r\n            GameObject IGameObjectSource.gameObject\r\n            {\r\n                get\r\n                {\r\n                    return (_transform != null) ? _transform.gameObject : null;\r\n                }\r\n            }\r\n\r\n            Transform IGameObjectSource.transform\r\n            {\r\n                get\r\n                {\r\n                    return _transform;\r\n                }\r\n            }\r\n\r\n\r\n            #endregion\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyWaypoints/Waypoints/WaypointPathTweenCurve.cs",
    "content": "﻿using UnityEngine;\r\nusing System.Collections.Generic;\r\n\r\nusing com.spacepuppy.Dynamic;\r\nusing com.spacepuppy.Tween;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppy.Waypoints\r\n{\r\n\r\n    /// <summary>\r\n    /// Used to translate a target Vector3 property of any object with name 'propName' along a IWaypointPath.\r\n    /// </summary>\r\n    public class WaypointPathTweenCurve : MemberCurve\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private IWaypointPath _path;\r\n        private float _redact;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected WaypointPathTweenCurve()\r\n        {\r\n            //REQUIRED - all MemberCurves need a zero-param constructor\r\n        }\r\n\r\n        public WaypointPathTweenCurve(string propName, float dur, IWaypointPath path)\r\n            : base(propName, dur)\r\n        {\r\n            _path = path;\r\n        }\r\n\r\n        public WaypointPathTweenCurve(string propName, Ease ease, float dur, IWaypointPath path)\r\n            : base(propName, ease, dur)\r\n        {\r\n            _path = path;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public IWaypointPath Path\r\n        {\r\n            get { return _path; }\r\n            set { _path = value; }\r\n        }\r\n\r\n        public float ArcLengthRedaction\r\n        {\r\n            get { return _redact; }\r\n            set { _redact = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region MemberCurve Interface\r\n\r\n        protected override void ReflectiveInit(System.Type memberType, object start, object end, object option)\r\n        {\r\n            //do nothing\r\n        }\r\n\r\n        protected override object GetValueAt(float dt, float t)\r\n        {\r\n            if (_path == null) return Vector3.zero;\r\n\r\n            t = this.Ease(t, 0f, 1f, this.Duration);\r\n            if (_redact != 0f)\r\n            {\r\n                float rt = _redact / _path.GetArcLength();\r\n                t -= rt;\r\n            }\r\n            return _path.GetPositionAt(t);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n\r\n    /// <summary>\r\n    /// Used to update a target across a WaypointPathComponent. This will update the Transform position and rotation, as well as attempt any modifier \r\n    /// property updates based on modifiers attached to the waypoint.\r\n    /// </summary>\r\n    public class AdvancedWaypointPathTweenCurve : TweenCurve\r\n    {\r\n        \r\n        public enum TranslationOptions\r\n        {\r\n            None = 0,\r\n            Position = 1,\r\n            LocalPosition = 2\r\n        }\r\n\r\n        public enum RotationOptions\r\n        {\r\n            None = 0,\r\n            Rotation = 1,\r\n            LocalRotation = 2,\r\n            Heading = 3,\r\n            LocalHeading = 4\r\n        }\r\n\r\n        #region Fields\r\n\r\n        private Ease _ease;\r\n        private float _dur;\r\n        private float _delay;\r\n\r\n        private WaypointPathComponent _path;\r\n\r\n        private TranslationOptions _updateTranslation;\r\n        private RotationOptions _updateRotation;\r\n        private Dictionary<System.Type, IStateModifier[]> _modifierTable;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        public AdvancedWaypointPathTweenCurve(float dur, WaypointPathComponent path)\r\n            : base()\r\n        {\r\n            _ease = EaseMethods.LinearEaseNone;\r\n            _dur = dur;\r\n            _delay = 0f;\r\n            _path = path;\r\n        }\r\n\r\n        public AdvancedWaypointPathTweenCurve(Ease ease, float dur, WaypointPathComponent path)\r\n            : base()\r\n        {\r\n            _ease = ease ?? EaseMethods.LinearEaseNone;\r\n            _dur = dur;\r\n            _path = path;\r\n            _delay = 0f;\r\n        }\r\n\r\n        public AdvancedWaypointPathTweenCurve(float dur, float delay, WaypointPathComponent path)\r\n            : base()\r\n        {\r\n            _ease = EaseMethods.LinearEaseNone;\r\n            _dur = dur;\r\n            _path = path;\r\n            _delay = delay;\r\n        }\r\n\r\n        public AdvancedWaypointPathTweenCurve(Ease ease, float dur, float delay, WaypointPathComponent path)\r\n            : base()\r\n        {\r\n            _ease = ease ?? EaseMethods.LinearEaseNone;\r\n            _dur = dur;\r\n            _path = path;\r\n            _delay = delay;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float Duration\r\n        {\r\n            get { return _dur; }\r\n            set { _dur = value; }\r\n        }\r\n\r\n        public float Delay\r\n        {\r\n            get { return _delay; }\r\n            set { _delay = value; }\r\n        }\r\n\r\n        public Ease Ease\r\n        {\r\n            get { return _ease; }\r\n            set { _ease = value ?? EaseMethods.LinearEaseNone; }\r\n        }\r\n\r\n        public WaypointPathComponent Path\r\n        {\r\n            get { return _path; }\r\n        }\r\n\r\n\r\n        public TranslationOptions UpdateTranslation\r\n        {\r\n            get { return _updateTranslation; }\r\n            set { _updateTranslation = value; }\r\n        }\r\n\r\n        public RotationOptions UpdateRotation\r\n        {\r\n            get { return _updateRotation; }\r\n            set { _updateRotation = value; }\r\n        }\r\n\r\n        public bool HasModifiers\r\n        {\r\n            get { return _modifierTable != null && _modifierTable.Count > 0; }\r\n        }\r\n        \r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        public void AddNodeModifierType<T>() where T : IStateModifier\r\n        {\r\n            if (_modifierTable == null)\r\n                _modifierTable = new Dictionary<System.Type, IStateModifier[]>();\r\n\r\n            var path = _path.Path;\r\n            int cnt = path.Count;\r\n            IStateModifier[] arr = new IStateModifier[cnt];\r\n            for (int i = 0; i < cnt; i++)\r\n            {\r\n                var p = GameObjectUtil.GetGameObjectFromSource(path.ControlPoint(i));\r\n                if (p != null) arr[i] = p.GetComponent<T>() as IStateModifier;\r\n            }\r\n\r\n            _modifierTable[typeof(T)] = arr;\r\n        }\r\n\r\n        public void AddNodeModifierType(System.Type tp)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n            if (!TypeUtil.IsType(tp, typeof(IStateModifier))) return; // throw new System.ArgumentException(\"Type must implement IModifier.\", \"tp\");\r\n\r\n            if (_modifierTable == null)\r\n                _modifierTable = new Dictionary<System.Type, IStateModifier[]>();\r\n\r\n            var path = _path.Path;\r\n            int cnt = path.Count;\r\n            IStateModifier[] arr = new IStateModifier[cnt];\r\n            for(int i = 0; i < cnt; i++)\r\n            {\r\n                var p = GameObjectUtil.GetGameObjectFromSource(path.ControlPoint(i));\r\n                if(p != null) arr[i] = p.GetComponent(tp) as IStateModifier;\r\n            }\r\n\r\n            _modifierTable[tp] = arr;\r\n        }\r\n\r\n        public bool RemoveNodeModifierType<T>() where T : IStateModifier\r\n        {\r\n            return _modifierTable.Remove(typeof(T));\r\n        }\r\n\r\n        public bool RemoveNodeModifierType(System.Type tp)\r\n        {\r\n            if (tp == null) throw new System.ArgumentNullException(\"tp\");\r\n            if (!TypeUtil.IsType(tp, typeof(IStateModifier))) return false; // throw new System.ArgumentException(\"Type must implement IStateModifier.\", \"tp\");\r\n            return _modifierTable.Remove(tp);\r\n        }\r\n\r\n        public bool ContainsNodeModifier<T>() where T : IStateModifier\r\n        {\r\n            return _modifierTable.ContainsKey(typeof(T));\r\n        }\r\n\r\n        public bool ContainsNodeModifier(System.Type tp)\r\n        {\r\n            return _modifierTable.ContainsKey(tp);\r\n        }\r\n\r\n        public void SetToTarget(object targ, float t)\r\n        {\r\n            this.LerpToTarget(targ, t, float.NaN);\r\n        }\r\n\r\n        public void LerpToTarget(object targ, float t, float lerpT)\r\n        {\r\n            if (_dur == 0f)\r\n                t = 1f;\r\n            else\r\n                t = t / _dur;\r\n\r\n            if (_updateTranslation > TranslationOptions.None || _updateRotation >= RotationOptions.Heading)\r\n            {\r\n                var trans = GameObjectUtil.GetTransformFromSource(targ);\r\n                if (trans != null)\r\n                {\r\n                    if (_updateRotation == RotationOptions.Heading)\r\n                    {\r\n                        var wp = _path.Path.GetWaypointAt(t);\r\n                        this.SetPosition(trans, wp.Position, float.NaN);\r\n                        this.SetRotation(trans, Quaternion.LookRotation(wp.Heading), lerpT);\r\n                    }\r\n                    else if (_updateTranslation > TranslationOptions.None)\r\n                    {\r\n                        this.SetPosition(trans, _path.Path.GetPositionAt(t), lerpT);\r\n                    }\r\n                }\r\n            }\r\n\r\n            bool useModifiers = (_modifierTable != null && _modifierTable.Count > 0);\r\n            if (useModifiers || _updateRotation == RotationOptions.Rotation || _updateRotation == RotationOptions.LocalRotation)\r\n            {\r\n                var data = _path.Path.GetRelativePositionData(t);\r\n\r\n                var cnt = _path.Path.Count;\r\n                int i = data.Index;\r\n                int j = (_path.Path.IsClosed) ? (i + 1) % cnt : i + 1;\r\n\r\n                if (_updateRotation == RotationOptions.Rotation || _updateRotation == RotationOptions.LocalRotation)\r\n                {\r\n                    var trans = GameObjectUtil.GetTransformFromSource(targ);\r\n                    if (trans != null)\r\n                    {\r\n                        var a = (i >= 0 && i < cnt) ? ComponentUtil.GetComponentFromSource<Transform>(_path.Path.ControlPoint(i)) : null;\r\n                        var b = (j >= 0 && j < cnt) ? ComponentUtil.GetComponentFromSource<Transform>(_path.Path.ControlPoint(j)) : null;\r\n\r\n                        if (a != null)\r\n                        {\r\n                            bool useRelative = _path.TransformRelativeTo != null;\r\n                            var r = (useRelative) ? a.GetRelativeRotation(_path.TransformRelativeTo) : a.rotation;\r\n                            if (b != null)\r\n                            {\r\n                                var rb = (useRelative) ? b.GetRelativeRotation(_path.TransformRelativeTo) : b.rotation;\r\n                                r = Quaternion.LerpUnclamped(r, rb, data.TPrime);\r\n                            }\r\n                            this.SetRotation(trans, r, lerpT);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (useModifiers)\r\n                {\r\n                    var e = _modifierTable.GetEnumerator();\r\n                    while (e.MoveNext())\r\n                    {\r\n                        var len = e.Current.Value.Length;\r\n                        var ma = (i >= 0 && i < len) ? e.Current.Value[i] : null;\r\n                        var mb = (j >= 0 && j < len) ? e.Current.Value[j] : null;\r\n\r\n                        if(float.IsNaN(lerpT))\r\n                        {\r\n                            if (ma != null)\r\n                            {\r\n                                if (mb != null)\r\n                                {\r\n                                    using (var state = StateToken.GetToken())\r\n                                    {\r\n                                        ma.CopyTo(state);\r\n                                        mb.LerpTo(state, data.TPrime);\r\n                                        ma.ModifyWith(targ, state);\r\n                                    }\r\n                                }\r\n                                else\r\n                                {\r\n                                    ma.Modify(targ);\r\n                                }\r\n                            }\r\n                            else if (mb != null)\r\n                            {\r\n                                mb.Modify(targ);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            using (var curState = StateToken.GetToken())\r\n                            using (var state = StateToken.GetToken())\r\n                            {\r\n                                IStateModifier m = null;\r\n                                if(ma != null)\r\n                                {\r\n                                    m = ma;\r\n                                    if(mb != null)\r\n                                    {\r\n                                        ma.CopyTo(state);\r\n                                        mb.LerpTo(state, data.TPrime);\r\n                                    }\r\n                                    else\r\n                                    {\r\n                                        ma.CopyTo(state);\r\n                                    }\r\n                                }\r\n                                else if(mb != null)\r\n                                {\r\n                                    m = mb;\r\n                                    mb.CopyTo(state);\r\n                                }\r\n\r\n                                if(m != null)\r\n                                {\r\n                                    state.CopyTo(curState);\r\n                                    curState.SyncFrom(targ);\r\n                                    curState.LerpTo(state, lerpT);\r\n                                    m.ModifyWith(state, curState);\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        private void SetPosition(Transform trans, Vector3 pos, float lerpT)\r\n        {\r\n            if(!float.IsNaN(lerpT))\r\n            {\r\n                switch (_updateTranslation)\r\n                {\r\n                    case TranslationOptions.Position:\r\n                        trans.position = Vector3.LerpUnclamped(trans.position, pos, lerpT);\r\n                        break;\r\n                    case TranslationOptions.LocalPosition:\r\n                        trans.localPosition = Vector3.LerpUnclamped(trans.localPosition, pos, lerpT);\r\n                        break;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                switch (_updateTranslation)\r\n                {\r\n                    case TranslationOptions.Position:\r\n                        trans.position = pos;\r\n                        break;\r\n                    case TranslationOptions.LocalPosition:\r\n                        trans.localPosition = pos;\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n        private void SetRotation(Transform trans, Quaternion rot, float lerpT)\r\n        {\r\n            if (!float.IsNaN(lerpT))\r\n            {\r\n                switch (_updateRotation)\r\n                {\r\n                    case RotationOptions.Rotation:\r\n                    case RotationOptions.Heading:\r\n                        trans.rotation = Quaternion.LerpUnclamped(trans.rotation, rot, lerpT);\r\n                        break;\r\n                    case RotationOptions.LocalRotation:\r\n                    case RotationOptions.LocalHeading:\r\n                        trans.localRotation = Quaternion.LerpUnclamped(trans.localRotation, rot, lerpT);\r\n                        break;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                switch (_updateRotation)\r\n                {\r\n                    case RotationOptions.Rotation:\r\n                    case RotationOptions.Heading:\r\n                        trans.rotation = rot;\r\n                        break;\r\n                    case RotationOptions.LocalRotation:\r\n                    case RotationOptions.LocalHeading:\r\n                        trans.localRotation = rot;\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region TweenCurve Interface\r\n\r\n        public override float TotalTime\r\n        {\r\n            get\r\n            {\r\n                return _dur + _delay;\r\n            }\r\n        }\r\n\r\n        public override void Update(object targ, float dt, float t)\r\n        {\r\n            if (_path == null || targ == null) return;\r\n\r\n            t -= _delay;\r\n            t = this.Ease(t, 0f, 1f, this.Duration) * this.Duration;\r\n\r\n            this.SetToTarget(targ, t);\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyWaypoints/Waypoints/i_MoveOnPath.cs",
    "content": "﻿#pragma warning disable 0649 // variable declared but not used.\r\n\r\nusing UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Scenario;\r\nusing com.spacepuppy.Tween;\r\n\r\nnamespace com.spacepuppy.Waypoints\r\n{\r\n\r\n    /// <summary>\r\n    /// TODO - remove obsolete deltaType\r\n    /// </summary>\r\n    public class i_MoveOnPath : AutoTriggerableMechanism, IObservableTrigger\r\n    {\r\n\r\n        public const string TRG_ONFINISH = \"OnFinish\";\r\n\r\n        #region Fields\r\n        \r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Speed\")]\r\n        [Tooltip(\"Speed as units per second.\")]\r\n        private float _speed = 1.0f;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Ease\")]\r\n        private EaseStyle _ease;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"WrapMode\")]\r\n        private TweenWrapMode _wrapMode = TweenWrapMode.Once;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"WrapCount\")]\r\n        [Tooltip(\"How many time should the tween wrap. If WrapMode is 'Once', this is ignored.\")]\r\n        [DiscreteFloat.NonNegative()]\r\n        private DiscreteFloat _wrapCount = DiscreteFloat.PositiveInfinity;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"UpdateType\")]\r\n        [Tooltip(\"Update should be used in most cases. FixedUpdate is useful if you need to animate physics. LateUpdate is useful for the camera.\")]\r\n        private UpdateSequence _updateType = UpdateSequence.Update;\r\n\r\n        [SerializeField()]\r\n        [Tooltip(\"What sort of delta time to use when updating. Normal should be used in most cases. Real is useful if gametime is every scaled and you want to ignore it. Smooth is for if you want the tween to be smooth over bad framerate.\")]\r\n        private SPTime _timeSupplier;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"Reverse\")]\r\n        [Tooltip(\"Should we move down the path in a backwards direction.\")]\r\n        private bool _reverse;\r\n\r\n        [SerializeField()]\r\n        private AdvancedWaypointPathTweenCurve.TranslationOptions _updateTranslation = AdvancedWaypointPathTweenCurve.TranslationOptions.Position;\r\n\r\n        [SerializeField()]\r\n        private AdvancedWaypointPathTweenCurve.RotationOptions _updateRotation;\r\n\r\n        [SerializeField()]\r\n        [ReorderableArray()]\r\n        [TypeReference.Config(typeof(com.spacepuppy.Dynamic.IStateModifier), allowAbstractClasses = false, allowInterfaces = false)]\r\n        [Tooltip(\"Modifier types to search nodes for to also update by.\")]\r\n        private TypeReference[] _updateModifierTypes;\r\n\r\n        [SerializeField()]\r\n        [UnityEngine.Serialization.FormerlySerializedAs(\"StopMovementOnDisable\")]\r\n        [Tooltip(\"If this component is disabled, will stop any active tweens it created while this value was true.\")]\r\n        private bool _stopMovementOnDisable;\r\n\r\n        [SerializeField()]\r\n        private WaypointPathComponent _path;\r\n\r\n        [SerializeField()]\r\n        [TriggerableTargetObject.Config(typeof(Transform))]\r\n        private TriggerableTargetObject _target = new TriggerableTargetObject();\r\n\r\n        [SerializeField()]\r\n        private Trigger _onFinish = new Trigger(TRG_ONFINISH);\r\n\r\n        [System.NonSerialized()]\r\n        private HashSet<Tweener> _activeTweens;\r\n\r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n        \r\n        protected override void OnDisable()\r\n        {\r\n            base.OnDisable();\r\n\r\n            if (this._stopMovementOnDisable && _activeTweens != null && _activeTweens.Count > 0)\r\n            {\r\n                var arr = _activeTweens.ToArray();\r\n                _activeTweens.Clear();\r\n                foreach (var tween in arr)\r\n                {\r\n                    tween.Stop();\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Properties\r\n\r\n        public float Speed\r\n        {\r\n            get { return _speed; }\r\n            set { _speed = value; }\r\n        }\r\n\r\n        public EaseStyle Ease\r\n        {\r\n            get { return _ease; }\r\n            set { _ease = value; }\r\n        }\r\n\r\n        public TweenWrapMode WrapMode\r\n        {\r\n            get { return _wrapMode; }\r\n            set { _wrapMode = value; }\r\n        }\r\n\r\n        public DiscreteFloat WrapCount\r\n        {\r\n            get { return _wrapCount; }\r\n            set { _wrapCount = (value < 0f) ? DiscreteFloat.Zero : value; }\r\n        }\r\n\r\n        public UpdateSequence UpdateType\r\n        {\r\n            get { return _updateType; }\r\n            set { _updateType = value; }\r\n        }\r\n\r\n        public ITimeSupplier TimeSupplier\r\n        {\r\n            get { return _timeSupplier.TimeSupplier; }\r\n            set { _timeSupplier.TimeSupplier = value; }\r\n        }\r\n\r\n        public bool Reverse\r\n        {\r\n            get { return _reverse; }\r\n            set { _reverse = value; }\r\n        }\r\n\r\n        public AdvancedWaypointPathTweenCurve.TranslationOptions UpdateTranslation\r\n        {\r\n            get { return _updateTranslation; }\r\n            set { _updateTranslation = value; }\r\n        }\r\n\r\n        public AdvancedWaypointPathTweenCurve.RotationOptions UpdateRotation\r\n        {\r\n            get { return _updateRotation; }\r\n            set { _updateRotation = value; }\r\n        }\r\n\r\n        public bool StopMovementOnDisable\r\n        {\r\n            get { return _stopMovementOnDisable; }\r\n            set { _stopMovementOnDisable = value; }\r\n        }\r\n\r\n        public TriggerableTargetObject Target\r\n        {\r\n            get { return _target; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        private void OnFinishHandler(object sender, System.EventArgs e)\r\n        {\r\n            _onFinish.ActivateTrigger(this, null);\r\n\r\n            var tween = sender as Tweener;\r\n            if (tween != null)\r\n            {\r\n                tween.OnFinish -= this.OnFinishHandler;\r\n                if(_activeTweens != null) _activeTweens.Remove(tween);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ITriggerable Interface\r\n\r\n        public override bool CanTrigger\r\n        {\r\n            get\r\n            {\r\n                return base.CanTrigger && _path != null && this._speed > 0f;\r\n            }\r\n        }\r\n\r\n        public override bool Trigger(object sender, object arg)\r\n        {\r\n            if(!this.CanTrigger) return false;\r\n\r\n            var targ = _target.GetTarget<Transform>(arg);\r\n            if(targ == null) return false;\r\n\r\n            //var curve = new WaypointPathTweenCurve(\"position\", EaseMethods.GetEase(this._ease), _path.Path.GetArcLength() / this._speed, _path.Path);\r\n            var curve = new AdvancedWaypointPathTweenCurve(EaseMethods.GetEase(this._ease), _path.Path.GetArcLength() / this._speed, _path)\r\n            {\r\n                UpdateTranslation = _updateTranslation,\r\n                UpdateRotation = _updateRotation\r\n            };\r\n            if (_updateModifierTypes != null && _updateModifierTypes.Length > 0)\r\n            {\r\n                for (int i = 0; i < _updateModifierTypes.Length; i++)\r\n                {\r\n                    var tp = _updateModifierTypes[i].Type;\r\n                    if (tp != null) curve.AddNodeModifierType(tp);\r\n                }\r\n            }\r\n\r\n            var tween = SPTween.Tween(targ)\r\n                               .UseCurve(curve)\r\n                               .Wrap(this._wrapMode, ((DiscreteFloat.IsInfinity(this._wrapCount)) ? 0 : Mathf.RoundToInt(this._wrapCount)))\r\n                               .Use(this._updateType)\r\n                               .Use(_timeSupplier.TimeSupplier)\r\n                               .Reverse(this._reverse)\r\n                               .OnFinish(this.OnFinishHandler)\r\n                               .Play(false);\r\n            if(this._stopMovementOnDisable)\r\n            {\r\n                if (_activeTweens == null) _activeTweens = new HashSet<Tweener>();\r\n                _activeTweens.Add(tween);\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region IObservableTrigger Interface\r\n\r\n        Trigger[] IObservableTrigger.GetTriggers()\r\n        {\r\n            return new Trigger[] { _onFinish };\r\n        }\r\n\r\n        #endregion\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyWaypointsEditor/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"SpacepuppyWaypointsEditor\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"SpacepuppyWaypointsEditor\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"7dd90aae-9465-40c4-9b93-bf7a4a0673c5\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "SpacepuppyWaypointsEditor/SpacepuppyWaypointsEditor.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{2E6906C5-FD11-447A-84CB-2149A524D753}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>com.spacepuppyeditor</RootNamespace>\r\n    <AssemblyName>SpacepuppyUnityFrameworkEditor.Waypoints</AssemblyName>\r\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile>\r\n    </TargetFrameworkProfile>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <CodeAnalysisRuleSet />\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"UnityEditor, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEditor.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"UnityEngine, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\Resources\\UnityEngine.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"Waypoints\\i_MoveOnPathInspector.cs\" />\r\n    <Compile Include=\"Waypoints\\WaypointPathComponentInspector.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\SpacepuppyBaseEditor\\SpacepuppyBaseEditor.csproj\">\r\n      <Project>{a0466ee3-9582-4c0d-965d-e2d2f9006971}</Project>\r\n      <Name>SpacepuppyBaseEditor</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppyBase\\SpacepuppyBase.csproj\">\r\n      <Project>{4b8e57ac-f3b2-4dfd-ba0b-20f6be3b17c9}</Project>\r\n      <Name>SpacepuppyBase</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\SpacepuppyWaypoints\\SpacepuppyWaypoints.csproj\">\r\n      <Project>{c54ea45a-9019-4e35-93e1-cef07674040f}</Project>\r\n      <Name>SpacepuppyWaypoints</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>mkdir $(ProjectDir)..\\Builds\\FullLibrary\\Editor\\\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.Waypoints.dll\" \"$(ProjectDir)..\\Builds\\FullLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.Waypoints.dll\"\r\ncopy /Y \"$(TargetDir)SpacepuppyUnityFrameworkEditor.Waypoints.pdb\" \"$(ProjectDir)..\\Builds\\FullLibrary\\Editor\\SpacepuppyUnityFrameworkEditor.Waypoints.pdb\"</PostBuildEvent>\r\n  </PropertyGroup>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "SpacepuppyWaypointsEditor/Waypoints/WaypointPathComponentInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing UnityEditorInternal;\r\nusing System.Collections.Generic;\r\nusing System.Text.RegularExpressions;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Waypoints;\r\nusing com.spacepuppy.Utils;\r\n\r\nusing com.spacepuppyeditor.Internal;\r\n\r\nnamespace com.spacepuppyeditor.Waypoints\r\n{\r\n\r\n    [CustomEditor(typeof(WaypointPathComponent))]\r\n    public class WaypointPathComponentInspector : SPEditor\r\n    {\r\n\r\n        #region Fields\r\n\r\n        private const float SEG_LENGTH = 0.2f;\r\n\r\n        private const string PROP_WAYPOINTS = \"_waypoints\";\r\n        private const string PROP_NODE_TRANSFORM = \"_transform\";\r\n        private const float ARG_BTN_WIDTH = 18f;\r\n\r\n        private WaypointPathComponent _targ;\r\n\r\n        private SerializedProperty _nodesProp;\r\n        private SPReorderableList _nodeList;\r\n        private GUIContent _argBtnLabel = new GUIContent(\"||\", \"Toggle allowing to manually configure which Transform is this waypoint.\");\r\n\r\n        private List<Transform> _lastNodeCache = new List<Transform>();\r\n        private IEnumerable<Transform> _currentNodes;\r\n        \r\n        #endregion\r\n\r\n        #region CONSTRUCTOR\r\n\r\n        protected override void OnEnable()\r\n        {\r\n            base.OnEnable();\r\n\r\n            _targ = this.target as WaypointPathComponent;\r\n\r\n            _nodesProp = this.serializedObject.FindProperty(PROP_WAYPOINTS);\r\n            _nodeList = new SPReorderableList(this.serializedObject, _nodesProp);\r\n            _nodeList.elementHeight = EditorGUIUtility.singleLineHeight;\r\n            _nodeList.drawHeaderCallback = _nodeList_DrawHeader;\r\n            _nodeList.drawElementCallback = _nodeList_DrawElement;\r\n            _nodeList.onAddCallback = _nodeList_OnAdded;\r\n\r\n            _currentNodes = this.GetCurrentNodes();\r\n            _lastNodeCache.Clear();\r\n            _lastNodeCache.AddRange(_currentNodes);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region Methods\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            this.DrawDefaultInspectorExcept(PROP_WAYPOINTS);\r\n\r\n            //clean nodes\r\n            for(int i = 0; i < _nodesProp.arraySize; i++)\r\n            {\r\n                if(_nodesProp.GetArrayElementAtIndex(i).FindPropertyRelative(PROP_NODE_TRANSFORM).objectReferenceValue == null)\r\n                {\r\n                    _nodesProp.DeleteArrayElementAtIndex(i);\r\n                    i--;\r\n                }\r\n            }\r\n            //_currentNodes = this.GetCurrentNodes();\r\n\r\n            if (_nodesProp.arraySize != _lastNodeCache.Count || !_lastNodeCache.SequenceEqual(_currentNodes))\r\n            {\r\n                //delete any nodes that are no longer in the collection\r\n                for (int i = 0; i < _lastNodeCache.Count; i++ )\r\n                {\r\n                    if(_lastNodeCache[i] != null && !_currentNodes.Contains(_lastNodeCache[i]) && _lastNodeCache[i].parent == _targ.transform)\r\n                    {\r\n                        ObjUtil.SmartDestroy(_lastNodeCache[i].gameObject);\r\n                    }\r\n                }\r\n\r\n                //update cache\r\n                _lastNodeCache.Clear();\r\n                _lastNodeCache.AddRange(_currentNodes);\r\n\r\n                //update names\r\n                var rx = new Regex(@\"^Node\\d+$\");\r\n                for(int i = 0; i < _lastNodeCache.Count; i++)\r\n                {\r\n                    var node = _lastNodeCache[i];\r\n                    var nm = \"Node\" + i.ToString(\"000\");\r\n                    if (node != null && node.parent == _targ.transform && node.name != nm && rx.IsMatch(node.name))\r\n                    {\r\n                        node.name = nm;\r\n                    }\r\n                }\r\n            }\r\n\r\n\r\n            _nodeList.DoLayoutList();\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n        private IEnumerable<Transform> GetCurrentNodes()\r\n        {\r\n            for(int i = 0; i < _nodesProp.arraySize; i++)\r\n            {\r\n                yield return _nodesProp.GetArrayElementAtIndex(i).FindPropertyRelative(PROP_NODE_TRANSFORM).objectReferenceValue as Transform;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region NodeList Handlers\r\n\r\n        private void _nodeList_DrawHeader(Rect area)\r\n        {\r\n            EditorGUI.LabelField(area, \"Waypoints\");\r\n        }\r\n\r\n        private void _nodeList_DrawElement(Rect area, int index, bool isActive, bool isFocused)\r\n        {\r\n            if (area.width < ARG_BTN_WIDTH)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var elementProp = _nodesProp.GetArrayElementAtIndex(index);\r\n            var transformProp = elementProp.FindPropertyRelative(PROP_NODE_TRANSFORM);\r\n            var btnRect = new Rect(area.xMax - ARG_BTN_WIDTH, area.yMin, ARG_BTN_WIDTH, area.height);\r\n            var propRect = new Rect(area.xMin, area.yMin, area.width - ARG_BTN_WIDTH, area.height);\r\n\r\n            if(transformProp.objectReferenceValue == null || elementProp.isExpanded)\r\n            {\r\n                EditorGUI.PropertyField(propRect, transformProp, GUIContent.none);\r\n            }\r\n            else\r\n            {\r\n                var t = transformProp.objectReferenceValue as Transform;\r\n                EditorGUI.LabelField(propRect, EditorHelper.TempContent(t.name), EditorHelper.TempContent(\"{ strength: \" + t.localScale.z.ToString(\"0.00\") + \" }\"));\r\n\r\n                if(ReorderableListHelper.IsClickingArea(area))\r\n                {\r\n                    EditorGUIUtility.PingObject(t);\r\n                }\r\n            }\r\n\r\n            if(GUI.Button(btnRect, _argBtnLabel))\r\n            {\r\n                elementProp.isExpanded = !elementProp.isExpanded;\r\n            }\r\n\r\n            if (GUI.enabled) ReorderableListHelper.DrawDraggableElementDeleteContextMenu(_nodeList, area, index, isActive, isFocused);\r\n        }\r\n\r\n        private void _nodeList_OnAdded(ReorderableList lst)\r\n        {\r\n            lst.serializedProperty.arraySize++;\r\n            lst.index = lst.serializedProperty.arraySize - 1;\r\n\r\n            var elementProp = lst.serializedProperty.GetArrayElementAtIndex(lst.index);\r\n            var transProp = elementProp.FindPropertyRelative(PROP_NODE_TRANSFORM);\r\n            var lastNode = (lst.index > 1) ? lst.serializedProperty.GetArrayElementAtIndex(lst.index - 1).FindPropertyRelative(PROP_NODE_TRANSFORM).objectReferenceValue as Transform : null;\r\n            \r\n            var go = new GameObject(\"Node\" + lst.index.ToString(\"000\"));\r\n            IconHelper.SetIconForObject(go, IconHelper.Icon.DiamondPurple);\r\n            go.transform.parent = _targ.transform;\r\n            if (lastNode != null)\r\n            {\r\n                go.transform.position = lastNode.position;\r\n                go.transform.rotation = lastNode.rotation;\r\n                go.transform.localScale = lastNode.localScale;\r\n            }\r\n            else\r\n            {\r\n                go.transform.localPosition = Vector3.zero;\r\n                go.transform.localRotation = Quaternion.LookRotation(Vector3.right);\r\n                go.transform.localScale = Vector3.one * 0.5f;\r\n            }\r\n            transProp.objectReferenceValue = go.transform;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        #region Gizmos\r\n\r\n        [DrawGizmo(GizmoType.InSelectionHierarchy | GizmoType.NotInSelectionHierarchy)]\r\n        private static void OnDrawGizmos(WaypointPathComponent c, GizmoType gizmoType)\r\n        {\r\n            if (gizmoType.HasFlag(GizmoType.NotInSelectionHierarchy) && !c.transform.IsParentOf(Selection.activeTransform)) return;\r\n\r\n            var path = WaypointPathComponent.GetPath(c, false);\r\n            if (path == null || path.Count == 0) return;\r\n            var matrix = (c.started && c.TransformRelativeTo != null) ? Matrix4x4.TRS(c.TransformRelativeTo.position, c.TransformRelativeTo.rotation, Vector3.one) : Matrix4x4.identity;\r\n\r\n            Gizmos.color = Color.red;\r\n            using (var pnts = com.spacepuppy.Collections.TempCollection.GetList<Vector3>())\r\n            {\r\n                path.GetDetailedPositions(pnts, SEG_LENGTH);\r\n                for(int i = 1; i < pnts.Count; i++)\r\n                {\r\n                    Gizmos.DrawLine(matrix.MultiplyPoint3x4(pnts[i - 1]), matrix.MultiplyPoint3x4(pnts[i]));\r\n                }\r\n            }\r\n\r\n            IWaypoint pnt;\r\n\r\n            Gizmos.color = Color.green;\r\n            pnt = path.ControlPoint(0);\r\n            Gizmos.DrawWireCube(matrix.MultiplyPoint3x4(pnt.Position), Vector3.one * 0.5f);\r\n\r\n            if (path.Count > 1)\r\n            {\r\n                Gizmos.color = Color.yellow;\r\n                for (int i = 1; i < path.Count - 1; i++)\r\n                {\r\n                    pnt = path.ControlPoint(i);\r\n                    Gizmos.DrawWireSphere(matrix.MultiplyPoint3x4(pnt.Position), 0.25f);\r\n                }\r\n\r\n                Gizmos.color = Color.red;\r\n                pnt = path.ControlPoint(path.Count - 1);\r\n                Gizmos.DrawWireCube(matrix.MultiplyPoint3x4(pnt.Position), Vector3.one * 0.5f);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpacepuppyWaypointsEditor/Waypoints/i_MoveOnPathInspector.cs",
    "content": "﻿using UnityEngine;\r\nusing UnityEditor;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nusing com.spacepuppy.Waypoints;\r\nusing com.spacepuppy.Utils;\r\n\r\nnamespace com.spacepuppyeditor.Waypoints\r\n{\r\n\r\n    [CustomEditor(typeof(i_MoveOnPath))]\r\n    public class i_MoveOnPathInspector : SPEditor\r\n    {\r\n\r\n        private const string PROP_MODIFIERS = \"_updateModifierTypes\";\r\n\r\n        protected override void OnSPInspectorGUI()\r\n        {\r\n            this.serializedObject.Update();\r\n\r\n            var iterator = serializedObject.GetIterator();\r\n            for (bool enterChildren = true; iterator.NextVisible(enterChildren); enterChildren = false)\r\n            {\r\n                if(iterator.name == PROP_MODIFIERS)\r\n                {\r\n                    this.DrawModifierTypes(iterator);\r\n                }\r\n                else\r\n                {\r\n                    SPEditorGUILayout.PropertyField(iterator, true);\r\n                }\r\n            }\r\n\r\n            this.serializedObject.ApplyModifiedProperties();\r\n        }\r\n\r\n\r\n\r\n        private void DrawModifierTypes(SerializedProperty prop)\r\n        {\r\n            //TODO - we want to include a drop down that only lists the IStateModifiers that actually exist on the nodes...\r\n\r\n            SPEditorGUILayout.PropertyField(prop, true);\r\n        }\r\n\r\n    }\r\n}\r\n"
  }
]